]> Pileus Git - ~andy/gtk/commitdiff
Bug 659406 - Abstract what triggers a context menu
authorMichael Natterer <mitch@lanedo.com>
Sun, 18 Sep 2011 22:32:52 +0000 (00:32 +0200)
committerMichael Natterer <mitch@gimp.org>
Mon, 26 Sep 2011 14:01:50 +0000 (16:01 +0200)
Add _gtk_button_event_triggers_context_menu() and use it instead
of checking for event->button == 3, so context menus are invoked
correctly on the Mac.

13 files changed:
gtk/gtkcolorsel.c
gtk/gtkentry.c
gtk/gtkfilechooserdefault.c
gtk/gtklabel.c
gtk/gtklinkbutton.c
gtk/gtkmain.c
gtk/gtkmountoperation.c
gtk/gtknotebook.c
gtk/gtkprivate.h
gtk/gtkrecentchooserdefault.c
gtk/gtkstatusicon.c
gtk/gtktextview.c
gtk/gtktoolbar.c

index a2ab2b42e48be0d2c4ca7721619e21ba5a53fb75..3b8f048d0845d0223ecf0c141e24981589045410 100644 (file)
@@ -1505,8 +1505,7 @@ palette_press (GtkWidget      *drawing_area,
 
   gtk_widget_grab_focus (drawing_area);
 
-  if (event->button == 3 &&
-      event->type == GDK_BUTTON_PRESS)
+  if (_gtk_button_event_triggers_context_menu (event))
     {
       do_popup (colorsel, drawing_area, event->time);
       return TRUE;
index 21c0ee22621011f2a799516de64c0f820f32cbbc..f9ad68ab3caa37a3f2fc13e33d29f86ba971aa1d 100644 (file)
@@ -3771,10 +3771,17 @@ gtk_entry_button_press (GtkWidget      *widget,
       gtk_widget_grab_focus (widget);
       priv->in_click = FALSE;
     }
-  
+
   tmp_pos = gtk_entry_find_position (entry, event->x + priv->scroll_offset);
-    
-  if (event->button == 1)
+
+  if (_gtk_button_event_triggers_context_menu (event))
+    {
+      gtk_entry_do_popup (entry, event);
+      priv->button = 0; /* Don't wait for release, since the menu will gtk_grab_add */
+
+      return TRUE;
+    }
+  else if (event->button == 1)
     {
       gboolean have_selection = gtk_editable_get_selection_bounds (editable, &sel_start, &sel_end);
       
@@ -3895,13 +3902,6 @@ gtk_entry_button_press (GtkWidget      *widget,
           gtk_widget_error_bell (widget);
         }
     }
-  else if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
-    {
-      gtk_entry_do_popup (entry, event);
-      priv->button = 0;        /* Don't wait for release, since the menu will gtk_grab_add */
-
-      return TRUE;
-    }
 
   return FALSE;
 }
index 07ed02c0d85ae510771b4520b26d17d64a740689..5ea074df301878a2b198dbf8c4853b46e469ec06 100644 (file)
@@ -3448,7 +3448,7 @@ shortcuts_button_press_event_cb (GtkWidget             *widget,
   if (in_press)
     return FALSE;
 
-  if (event->button != 3)
+  if (!_gtk_button_event_triggers_context_menu (event))
     return FALSE;
 
   in_press = TRUE;
@@ -4296,7 +4296,7 @@ list_button_press_event_cb (GtkWidget             *widget,
   if (in_press)
     return FALSE;
 
-  if (event->button != 3)
+  if (!_gtk_button_event_triggers_context_menu (event))
     return FALSE;
 
   in_press = TRUE;
index 70b513eab097faf3257b2a8d9d4959cc8a370d1a..00422a53476516015ca1dcce2a84c4bcbb797a62 100644 (file)
@@ -4715,16 +4715,16 @@ gtk_label_button_press (GtkWidget      *widget,
 
   if (info->active_link)
     {
-      if (event->button == 1)
+      if (_gtk_button_event_triggers_context_menu (event))
         {
           info->link_clicked = 1;
-          gtk_widget_queue_draw (widget);
+          gtk_label_do_popup (label, event);
+          return TRUE;
         }
-      else if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+      else if (event->button == 1)
         {
           info->link_clicked = 1;
-          gtk_label_do_popup (label, event);
-          return TRUE;
+          gtk_widget_queue_draw (widget);
         }
     }
 
@@ -4734,7 +4734,13 @@ gtk_label_button_press (GtkWidget      *widget,
   info->in_drag = FALSE;
   info->select_words = FALSE;
 
-  if (event->button == 1)
+  if (_gtk_button_event_triggers_context_menu (event))
+    {
+      gtk_label_do_popup (label, event);
+
+      return TRUE;
+    }
+  else if (event->button == 1)
     {
       if (!gtk_widget_has_focus (widget))
         {
@@ -4808,12 +4814,7 @@ gtk_label_button_press (GtkWidget      *widget,
 
       return TRUE;
     }
-  else if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
-    {
-      gtk_label_do_popup (label, event);
 
-      return TRUE;
-    }
   return FALSE;
 }
 
index bd2ca65d80bb018ae2693ce20bc1c08d6f043c1d..0fdcbeab25cf6856b4b91e782bc18c71d14fcac2 100644 (file)
@@ -63,6 +63,7 @@
 #include "gtkstock.h"
 #include "gtkshow.h"
 #include "gtktooltip.h"
+#include "gtkprivate.h"
 #include "gtkintl.h"
 
 #include "a11y/gtklinkbuttonaccessible.h"
@@ -521,7 +522,7 @@ gtk_link_button_button_press (GtkWidget      *widget,
   if (!gtk_widget_has_focus (widget))
     gtk_widget_grab_focus (widget);
 
-  if ((event->button == 3) && (event->type == GDK_BUTTON_PRESS))
+  if (_gtk_button_event_triggers_context_menu (event))
     {
       gtk_link_button_do_popup (GTK_LINK_BUTTON (widget), event);
       
index a0ca89dfb5e3c084fd15c9d01d3e16eaeba11448..e42f7303927d3303d266dfdd9b813465682846f5 100644 (file)
@@ -2643,3 +2643,23 @@ _gtk_boolean_handled_accumulator (GSignalInvocationHint *ihint,
 
   return continue_emission;
 }
+
+gboolean
+_gtk_button_event_triggers_context_menu (GdkEventButton *event)
+{
+  if (event->type == GDK_BUTTON_PRESS)
+    {
+      if (event->button == 3 &&
+          ! (event->state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)))
+        return TRUE;
+
+#ifdef GDK_WINDOWING_QUARTZ
+      if (event->button == 1 &&
+          ! (event->state & (GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) &&
+          (event->state & GDK_CONTROL_MASK))
+        return TRUE;
+#endif
+    }
+
+  return FALSE;
+}
index 2d022cc00e265fda88754876cc354c7a427e2389..dea21f54917053fc6245d0cfeb5f5d937df8f82e 100644 (file)
@@ -1167,8 +1167,7 @@ on_button_press_event_for_process_tree_view (GtkWidget      *widget,
 
   ret = FALSE;
 
-  /* Ignore double-clicks and triple-clicks */
-  if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+  if (_gtk_button_event_triggers_context_menu (event))
     {
       ret = do_popup_menu_for_process_tree_view (widget, event, op);
     }
index a518e9c7ca2e57aadef7cdd11debf4fff69a5795..afc51d35c994e9c43144a32a2671eb3c18df5cae 100644 (file)
@@ -2858,7 +2858,7 @@ gtk_notebook_button_press (GtkWidget      *widget,
   if (arrow)
     return gtk_notebook_arrow_button_press (notebook, arrow, event->button);
 
-  if (event->button == 3 && priv->menu)
+  if (priv->menu && _gtk_button_event_triggers_context_menu (event))
     {
       gtk_menu_popup (GTK_MENU (priv->menu), NULL, NULL,
                       NULL, NULL, 3, event->time);
index 00e9bbe9d20642deefbd5f104150af2b9679f370..57789584b215236693391c292e2f33993f7c0686 100644 (file)
@@ -101,6 +101,8 @@ void    _gtk_modules_init             (gint          *argc,
 void    _gtk_modules_settings_changed (GtkSettings   *settings,
                                        const gchar   *modules);
 
+gboolean _gtk_button_event_triggers_context_menu (GdkEventButton *event);
+
 G_END_DECLS
 
 #endif /* __GTK_PRIVATE_H__ */
index 20b66b5bd7c7c99178a1a8945dcb41487c574959..7adc1aebd6ae4dcd6e9d70e0e51cb685c8c8287c 100644 (file)
@@ -1904,8 +1904,8 @@ recent_view_button_press_cb (GtkWidget      *widget,
                             gpointer        user_data)
 {
   GtkRecentChooserDefault *impl = GTK_RECENT_CHOOSER_DEFAULT (user_data);
-  
-  if (event->button == 3)
+
+  if (_gtk_button_event_triggers_context_menu (event))
     {
       GtkTreePath *path;
       gboolean res;
index 8d5a0efbb2796b14b1c60d25aa157a8698f39375..27a2b144d97c7fa4cbb4b8ce53edab036d6d697c 100644 (file)
@@ -1810,14 +1810,14 @@ gtk_status_icon_button_press (GtkStatusIcon  *status_icon,
   if (handled)
     return TRUE;
 
-  if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
+  if (_gtk_button_event_triggers_context_menu (event))
     {
-      emit_activate_signal (status_icon);
+      emit_popup_menu_signal (status_icon, event->button, event->time);
       return TRUE;
     }
-  else if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+  else if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
     {
-      emit_popup_menu_signal (status_icon, event->button, event->time);
+      emit_activate_signal (status_icon);
       return TRUE;
     }
 
index 30859660faf6482393573964547eba69f171a36f..9b073345c4008a129884abfd3de917b8130b3ed0 100644 (file)
@@ -4545,7 +4545,12 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
     {
       gtk_text_view_reset_im_context (text_view);
 
-      if (event->button == 1)
+      if (_gtk_button_event_triggers_context_menu (event))
+        {
+         gtk_text_view_do_popup (text_view, event);
+         return TRUE;
+        }
+      else if (event->button == 1)
         {
           /* If we're in the selection, start a drag copy/move of the
            * selection; otherwise, start creating a new selection.
@@ -4593,11 +4598,6 @@ gtk_text_view_button_press_event (GtkWidget *widget, GdkEventButton *event)
                                           priv->editable);
           return TRUE;
         }
-      else if (event->button == 3)
-        {
-         gtk_text_view_do_popup (text_view, event);
-         return TRUE;
-        }
     }
   else if ((event->type == GDK_2BUTTON_PRESS ||
            event->type == GDK_3BUTTON_PRESS) &&
index 5692b60bd52ad8c0d96a527fa24863d4b56754ae..a8cb86d76ecd49ae3ba5a397434d71f90a6ab767 100644 (file)
@@ -2744,7 +2744,7 @@ gtk_toolbar_button_press (GtkWidget      *toolbar,
 {
   GtkWidget *window;
 
-  if (event->button == 3)
+  if (_gtk_button_event_triggers_context_menu (event))
     {
       gboolean return_value;