Not getting which mouse button is pressed on button-press-event



The state member in GdkEventButton for the button-press/release events contains flag bits that specify which mouse button is operated and also any keyboard shift/ctrl/alt modifier bits. I have tried button-press-event on several widget types, but in all cases the modifier bit GDK_BUTTON1_MASK or GDK_BUTTON2_MASK is not set on button-press. It is however set in the button-release-event.

If a mouse button is held down while pressing keys the state in GdkEventKey shows the correct GDK_BUTTON1_MASK or GDK_BUTTON2_MASK.

I need to know the mouse button pressed on button-press.

The program below shows this for a top window widget.


static gboolean buttonpresscallback ( GtkWidget * w,
                                      GdkEventButton * event,
                                      char * data )
   {
  printf ( " mousebuttonDOWN (x,y)=(%d,%d)state %x\n" ,
          (int)event->x , (int)event->y , event->state ) ;
   return false;
   }


static gboolean buttonreleasecallback ( GtkWidget * w,
                                        GdkEventButton * event,
                                        char * data )
   {
  printf ( " mousebuttonUP (x,y)=(%d,%d)state %x\n" ,
          (int)event->x , (int)event->y , event->state ) ;
   return false;
   }


static gboolean keypresscallback ( GtkWidget * w,
                                   GdkEventKey *event,
                                   char * data )
   {
  printf ( " key PRESS val=%x state=%x\n" , event->keyval , event->state ) ;
   return false;
   }


static gboolean keyreleasecallback ( GtkWidget *eventbox,
                                     GdkEventKey *event,
                                     char * data )
   {
  printf ( " key RELEASE val=%x state=%x\n" , event->keyval , event->state ) ;
   return false;
   }



int main ( int argc , char * argv[] )
   {
   gtk_init(&argc, &argv);

   GtkWidget * window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
   gtk_window_set_default_size(GTK_WINDOW(window), 250, 180);
   gtk_window_set_title(GTK_WINDOW(window), "Testing");

   gtk_widget_add_events (window , GDK_BUTTON_PRESS_MASK );
   g_signal_connect (window, "button-press-event",
                     G_CALLBACK (buttonpresscallback), NULL ) ;

   gtk_widget_add_events (window, GDK_BUTTON_RELEASE_MASK );
   g_signal_connect (window, "button-release-event",
                     G_CALLBACK (buttonreleasecallback), NULL ) ;

   gtk_widget_add_events (window, GDK_KEY_PRESS_MASK );
   g_signal_connect ( window, "key-press-event",
                      G_CALLBACK (keypresscallback), NULL ) ;

   gtk_widget_add_events (window, GDK_KEY_RELEASE_MASK );
   g_signal_connect ( window, "key-release-event",
                      G_CALLBACK (keyreleasecallback), NULL ) ;

   g_signal_connect(window, "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);

   gtk_widget_show_all(window);
   gtk_main();

   return 0;
   }


Am I doing something wrong?

I have a two-button mouse and observed that the right-mouse corresponds to GDK_BUTTON3_MASK, not GDK_BUTTON2_MASK that I expected. However, when I mistakenly pressed left and right button together I received the result GDK_BUTTON2 on button-release. Is this the way it is? What about bit mask and button correspondence for a 5-button mouse (if such animal exists in the real world)?



Get your preferred Email name!
Now you can @ymail.com and @rocketmail.com.

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]