È il classico programmino per cliccare programmaticamente su una certa finestra, un certo bottone a scelta dell' utente affinchè..accada qualcosa ;D
Problema : senza entrare troppo nei dettagli...il programmino ha una finestra principale con un bottone. Quando questo viene cliccato la finestra passa automaticamente in icona e appare una finestra popup trasparente che risponde al click dell' utente; in questo modo l'utente ha modo di scegliere dove cliccare, vedendo il desktop o la finestra aperta in primo piano, e poter cliccare ad esempio sulla "x" senza chiudere effettivamente la relativa finestra.
Al click corrisponde la chiusura della finestra trasparente e la massimizzazione della finestra principale del programmino.
Ci sono varie funzioni che permettono tutto ciò....il problema principale è che g_signal_connect() è una maledettissima funzione che permette il passaggio di un solo parametro alla funzione invocata, quindi per comodità ho dovuto creare una struct dedicata alle coordinate e ad altri piccoli dettagli del programmino.
La struct è dichiarata in main(), viene passata ad una funzione che a sua volta la passa ad un' altra ed infine da questa viene passata ad un' altra ancora.
Giunta all' ultima funzione, si comporta in modo anomalo : l'indirizzo che la struct ha in main() non corrisponde all' indirizzo che ha qui....e stranissimamente , dopo il click, i valori tornano normali.
Questa è la porzione di codice incriminata....è da un po' che ci sbatto la testa ma con scarsi risultati. che devo fare? >:(
Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <gtk\gtk.h>
typedef struct _coordinate
{
int x;
int y;
char *mouse_coords_text;
GtkWidget *mouse_coords_label;
}
Coordinate;
gboolean delete_event (GtkWidget *window, GdkEvent *event, gpointer data);
void deiconify_after ( GtkWidget *button, GtkWindow *window);
void movimento(GtkWidget *window, Coordinate *where);
void destroy(GtkWidget *window, gpointer data);
void dove (Coordinate *where);
void dove_clickare( Coordinate *where);
void via ( GtkButton *i, GtkWidget *window);
int main( int argc, char *argv[] )
{
Coordinate coords;
gtk_init(&argc, &argv);
char m_c_txt[] = " coord x coord ";
coords.mouse_coords_text = m_c_txt;
printf("\n\nIndirizzo di coords in main() : %x \n\n", &coords );
printf("\n\nValore di coord.mouse_coord_text in main() : %s \n\n" , coords.mouse_coords_text );
dove_clickare(&coords);
gtk_main();
return 0;
}
void destroy(GtkWidget *window, gpointer data)
{
gtk_main_quit();
}
gboolean delete_event (GtkWidget *window, GdkEvent *event, gpointer data)
{
return FALSE;
}
VERIFICA CHE LE VARIABILI DENTRO MAIN ESISTANO ANCHE DOPO L'INVOCAZIONE DI GTK_MAIN_QUIT
void dove_clickare( Coordinate *where)
{
printf("\n\n Indirizzo di where in dove_clickare() : %x \n\n", where);
printf("\n\n Valore di where->mouse.. in dove_clickare(): %s \n\n", where->mouse_coords_text);
GtkWidget *window;
GtkWidget *button;
window = gtk_window_new(GTK_WINDOW_POPUP);
gtk_window_set_opacity( GTK_WINDOW(window), 0.4 );
gtk_window_maximize( GTK_WINDOW(window) );
button = gtk_button_new();
gtk_container_add( GTK_CONTAINER(window), button );
gtk_widget_set_events(GTK_WIDGET(button), GDK_POINTER_MOTION_MASK );
gtk_widget_show_all( GTK_WIDGET(window) );
g_signal_connect( G_OBJECT(button), "motion-notify-event", G_CALLBACK(movimento), where );
g_signal_connect( G_OBJECT(button), "clicked", G_CALLBACK(movimento), where); // nel caso il puntatore non venga mai spostato, bisogna cmq caricarne le coordinate
g_signal_connect_after( G_OBJECT(button), "clicked", G_CALLBACK(via), window );
return;
}
void movimento(GtkWidget *window, Coordinate *where)
{
printf("\n\n Indirizzo di where in movimento() : %x \n\n", where);
printf("\n\n Valore di where->mouse.. in movimento(): %s \n\n", where->mouse_coords_text);
//dove(where);
//gtk_widget_set_tooltip_text( GTK_WIDGET(window), where->mouse_coords_text );
//gtk_label_set_text( where->mouse_coords_label , where->mouse_coords_text );
return;
}
void via ( GtkButton *button, GtkWidget *window) // Nasconde la finestra opaca e esce da gtk_main().
{ // Non necessita di rileggere le coordinate in quanto sono già lette da movimento().
gtk_main_quit();
printf("\n\n Esco da via() \n\n");
return;
}
void dove (Coordinate *where) // Ricava le coordinate del cursore e le salva sia come coordinate numeriche che testuali
{
printf("\n\n Indirizzo contenuto nel puntatore : %x \n\n", where->mouse_coords_text);
printf("Entro\n\n%s\n\n", where->mouse_coords_text );
printf("\n\n%s\n\n", where->mouse_coords_text );
return;
}

