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