Bonjour à tous.
Je souhaiterais me déplacer dans une application à partir des mouvements souris (un peu du style de TAB). Par exemple si je déplace le curseur de ma souris vers le haut (d'une certaine distance à définir) je donne le focus au bouton au dessus et inversement si je vais vers le bas avec la souris. Si je fais un clic gauche j'active le bouton qui a le focus et je me déplace dans un menu associé.... etc
J'ai vu qu'il existait les fonction gtk_widget_set_events () , gdk_window_get_pointer() ..... Mais j'arrive pas à placé le bit GDK_POINTER_MOTION_HINT_MASK pour pouvoir calculer la différence entre la position du curseur initiale et l'actuelle. Lorsque je regarde les propriétés de mon evènement le bit is_hint est toujours à 0.
// Main de l'application
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 gtk_set_locale (); gtk_init (&argc, &argv); pixmap_dir = g_build_filename (package_data_dir, PACKAGE, "pixmaps", NULL); add_pixmap_directory (pixmap_dir); g_free (pixmap_dir); /* * The following code was added by Glade to create one of each component * (except popup menus), just so that you see something after building * the project. Delete any components that you don't want shown initially. */ window1 = create_window1 (); gtk_widget_set_events (window1, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); g_signal_connect ((gpointer) window1, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show (window1); gtk_main ();
// Fichier gérant l'interface de l'application
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 GtkWidget* create_window1 (void) { GtkWidget *window1; GtkWidget *hbox1; GtkWidget *vbuttonbox1; GtkWidget *button1; GtkWidget *button2; GtkWidget *button3; GtkWidget *fixed1; GtkWidget *vbuttonbox2; GtkWidget *button4; GtkWidget *button5; GtkWidget *button6; window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window1), _("window1")); hbox1 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox1); gtk_container_add (GTK_CONTAINER (window1), hbox1); vbuttonbox1 = gtk_vbutton_box_new (); gtk_widget_show (vbuttonbox1); gtk_box_pack_start (GTK_BOX (hbox1), vbuttonbox1, TRUE, TRUE, 0); gtk_button_box_set_layout (GTK_BUTTON_BOX (vbuttonbox1), GTK_BUTTONBOX_SPREAD); button1 = gtk_button_new_with_mnemonic (_("button1")); gtk_widget_show (button1); gtk_container_add (GTK_CONTAINER (vbuttonbox1), button1); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); ...... g_signal_connect ((gpointer) window1, "motion_notify_event", G_CALLBACK (on_window1_motion_notify_event), NULL); g_signal_connect ((gpointer) window1, "motion_notify_event", G_CALLBACK (position_souris), NULL); g_signal_connect ((gpointer) button1, "clicked", G_CALLBACK (on_button_clicked), NULL); .....; return window1;
// Callback
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 gboolean position_souris (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) { gdouble x1, y1; gdouble x2, y2; /* Position dans la fenêtre */ if (event->is_hint) gdk_window_get_pointer (event->window, &(int)x1, &(int)y1, NULL); else { x1 = event->x; y1 = event->y; } /* Position dans l'écran */ if (event->is_hint) gdk_window_get_pointer ( gdk_screen_get_root_window(gdk_screen_get_default()), &(int)x2, &(int)y2, NULL); else { x2 = event->x_root; y2 = event->y_root; } /* Affichage */ g_printf("x:%d y:%d\t\tx:%d y:%d\n", x1, y1, x2, y2); return FALSE; }
Si quelqu'un peut m'indiquer une piste pour corriger cette erreur ou obtenir ce que je souhaite.
Le projet est en fait destiné dans un premier temps à etre utiliser avec une trackball c'est pourquoi je cherche à faciliter les déplacements dans l'application au maximum.
Par avance merci
Partager