]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkmenutoolbutton.c
Deactivate the menu when the button becomes insensitive, and remove dead
[~andy/gtk] / gtk / gtkmenutoolbutton.c
index 6448d6e15400a0d0d96e089ad98c7961eb63362b..976ce3f39f118c2d8bd64c1c71c6108cee4883f4 100644 (file)
@@ -20,7 +20,6 @@
  */
 
 #include <config.h>
-#include "gtkalias.h"
 #include "gtkmenutoolbutton.h"
 #include "gtkintl.h"
 #include "gtktogglebutton.h"
@@ -29,6 +28,8 @@
 #include "gtkvbox.h"
 #include "gtkmenu.h"
 #include "gtkmain.h"
+#include "gtkprivate.h"
+#include "gtkalias.h"
 
 
 #define GTK_MENU_TOOL_BUTTON_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), GTK_TYPE_MENU_TOOL_BUTTON, GtkMenuToolButtonPrivate))
@@ -110,12 +111,10 @@ gtk_menu_tool_button_set_tooltip (GtkToolItem *tool_item,
 static void
 gtk_menu_tool_button_construct_contents (GtkMenuToolButton *button)
 {
-  GtkMenuToolButtonPrivate *priv;
+  GtkMenuToolButtonPrivate *priv = button->priv;
   GtkWidget *box;
   GtkOrientation orientation;
 
-  priv = GTK_MENU_TOOL_BUTTON_GET_PRIVATE (button);
-
   orientation = gtk_tool_item_get_orientation (GTK_TOOL_ITEM (button));
 
   if (orientation == GTK_ORIENTATION_HORIZONTAL)
@@ -161,6 +160,9 @@ gtk_menu_tool_button_construct_contents (GtkMenuToolButton *button)
   gtk_container_add (GTK_CONTAINER (button), priv->box);
   gtk_widget_show_all (priv->box);
 
+  gtk_button_set_relief (GTK_BUTTON (priv->arrow_button),
+                        gtk_tool_item_get_relief_style (GTK_TOOL_ITEM (button)));
+  
   gtk_widget_queue_resize (GTK_WIDGET (button));
 }
 
@@ -173,6 +175,19 @@ gtk_menu_tool_button_toolbar_reconfigured (GtkToolItem *toolitem)
   GTK_TOOL_ITEM_CLASS (parent_class)->toolbar_reconfigured (toolitem);
 }
 
+static void
+gtk_menu_tool_button_state_changed (GtkWidget    *widget,
+                                   GtkStateType  previous_state)
+{
+  GtkMenuToolButton *button = GTK_MENU_TOOL_BUTTON (widget);
+  GtkMenuToolButtonPrivate *priv = button->priv;
+
+  if (!GTK_WIDGET_IS_SENSITIVE (widget) && priv->menu)
+    {
+      gtk_menu_shell_deactivate (GTK_MENU_SHELL (priv->menu));
+    }
+}
+
 static void
 gtk_menu_tool_button_set_property (GObject      *object,
                                    guint         prop_id,
@@ -217,18 +232,21 @@ static void
 gtk_menu_tool_button_class_init (GtkMenuToolButtonClass *klass)
 {
   GObjectClass *object_class;
+  GtkWidgetClass *widget_class;
   GtkToolItemClass *toolitem_class;
   GtkToolButtonClass *toolbutton_class;
 
   parent_class = g_type_class_peek_parent (klass);
 
   object_class = (GObjectClass *)klass;
+  widget_class = (GtkWidgetClass *)klass;
   toolitem_class = (GtkToolItemClass *)klass;
   toolbutton_class = (GtkToolButtonClass *)klass;
 
   object_class->set_property = gtk_menu_tool_button_set_property;
   object_class->get_property = gtk_menu_tool_button_get_property;
   object_class->finalize = gtk_menu_tool_button_finalize;
+  widget_class->state_changed = gtk_menu_tool_button_state_changed;
   toolitem_class->set_tooltip = gtk_menu_tool_button_set_tooltip;
   toolitem_class->toolbar_reconfigured = gtk_menu_tool_button_toolbar_reconfigured;
 
@@ -247,52 +265,11 @@ gtk_menu_tool_button_class_init (GtkMenuToolButtonClass *klass)
                                                         P_("Menu"),
                                                         P_("The dropdown menu"),
                                                         GTK_TYPE_MENU,
-                                                        G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                        GTK_PARAM_READWRITE));
 
   g_type_class_add_private (object_class, sizeof (GtkMenuToolButtonPrivate));
 }
 
-static void
-button_state_changed_cb (GtkWidget         *widget,
-                         GtkStateType       previous_state,
-                         GtkMenuToolButton *button)
-{
-  GtkMenuToolButtonPrivate *priv;
-  GtkWidget *other;
-  GtkStateType state = GTK_WIDGET_STATE (widget);
-
-  priv = GTK_MENU_TOOL_BUTTON_GET_PRIVATE (button);
-
-  other = (widget == priv->arrow_button) ? priv->button : priv->arrow_button;
-
-  g_signal_handlers_block_by_func (other,
-                                   G_CALLBACK (button_state_changed_cb),
-                                   button);
-
-  if (state == GTK_STATE_PRELIGHT)
-    {
-      gtk_widget_set_state (other, state);
-    }
-  else if (state == GTK_STATE_NORMAL)
-    {
-      gtk_widget_set_state (other, state);
-    }
-  else if (state == GTK_STATE_ACTIVE ||
-           (state == GTK_STATE_INSENSITIVE && other == priv->arrow_button))
-    {
-      gtk_widget_set_state (other, GTK_STATE_NORMAL);
-    }
-
-  if (state == GTK_STATE_INSENSITIVE && other == priv->arrow_button && button->priv->menu)
-    {
-      gtk_menu_shell_deactivate (GTK_MENU_SHELL (button->priv->menu));
-    }
-
-  g_signal_handlers_unblock_by_func (other,
-                                     G_CALLBACK (button_state_changed_cb),
-                                     button);
-}
-
 static void
 menu_position_func (GtkMenu           *menu,
                     int               *x,
@@ -300,14 +277,12 @@ menu_position_func (GtkMenu           *menu,
                     gboolean          *push_in,
                     GtkMenuToolButton *button)
 {
-  GtkMenuToolButtonPrivate *priv;
+  GtkMenuToolButtonPrivate *priv = button->priv;
   GtkRequisition req;
   GtkRequisition menu_req;
   GtkOrientation orientation;
   GtkTextDirection direction;
 
-  priv = GTK_MENU_TOOL_BUTTON_GET_PRIVATE (button);
-
   gdk_window_get_origin (GTK_BUTTON (priv->arrow_button)->event_window, x, y);
   gtk_widget_size_request (priv->arrow_button, &req);
   gtk_widget_size_request (GTK_WIDGET (priv->menu), &menu_req);
@@ -339,9 +314,7 @@ static void
 popup_menu_under_arrow (GtkMenuToolButton *button,
                         GdkEventButton    *event)
 {
-  GtkMenuToolButtonPrivate *priv;
-
-  priv = GTK_MENU_TOOL_BUTTON_GET_PRIVATE (button);
+  GtkMenuToolButtonPrivate *priv = button->priv;
 
   g_signal_emit (button, signals[SHOW_MENU], 0);
 
@@ -359,9 +332,7 @@ static void
 arrow_button_toggled_cb (GtkToggleButton   *togglebutton,
                          GtkMenuToolButton *button)
 {
-  GtkMenuToolButtonPrivate *priv;
-
-  priv = GTK_MENU_TOOL_BUTTON_GET_PRIVATE (button);
+  GtkMenuToolButtonPrivate *priv = button->priv;
 
   if (!priv->menu)
     return;
@@ -381,10 +352,17 @@ arrow_button_button_press_event_cb (GtkWidget         *widget,
                                     GdkEventButton    *event,
                                     GtkMenuToolButton *button)
 {
-  popup_menu_under_arrow (button, event);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
+  if (event->button == 1)
+    {
+      popup_menu_under_arrow (button, event);
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
 
-  return TRUE;
+      return TRUE;
+    }
+  else
+    {
+      return FALSE;
+    }
 }
 
 static void
@@ -409,7 +387,6 @@ gtk_menu_tool_button_init (GtkMenuToolButton *button)
 
   arrow_button = gtk_toggle_button_new ();
   arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
-  gtk_button_set_relief (GTK_BUTTON (arrow_button), GTK_RELIEF_NONE);
   gtk_container_add (GTK_CONTAINER (arrow_button), arrow);
   gtk_box_pack_end (GTK_BOX (box), arrow_button,
                     FALSE, FALSE, 0);
@@ -426,10 +403,6 @@ gtk_menu_tool_button_init (GtkMenuToolButton *button)
   button->priv->arrow_button = arrow_button;
   button->priv->box = box;
 
-  g_signal_connect (real_button, "state_changed",
-                    G_CALLBACK (button_state_changed_cb), button);
-  g_signal_connect (arrow_button, "state_changed",
-                    G_CALLBACK (button_state_changed_cb), button);
   g_signal_connect (arrow_button, "toggled",
                     G_CALLBACK (arrow_button_toggled_cb), button);
   g_signal_connect (arrow_button, "button_press_event",
@@ -498,7 +471,7 @@ gtk_menu_tool_button_new_from_stock (const gchar *stock_id)
   g_return_val_if_fail (stock_id != NULL, NULL);
 
   button = g_object_new (GTK_TYPE_MENU_TOOL_BUTTON,
-                        "stock_id", stock_id,
+                        "stock-id", stock_id,
                         NULL);
 
   return GTK_TOOL_ITEM (button);
@@ -586,7 +559,7 @@ gtk_menu_tool_button_get_menu (GtkMenuToolButton *button)
 }
 
 /**
- * gtk_menu_tool_set_arrow_tooltip:
+ * gtk_menu_tool_button_set_arrow_tooltip:
  * @button: a #GtkMenuToolButton
  * @tooltips: the #GtkTooltips object to be used
  * @tip_text: text to be used as tooltip text for tool_item
@@ -609,3 +582,5 @@ gtk_menu_tool_button_set_arrow_tooltip (GtkMenuToolButton *button,
   gtk_tooltips_set_tip (tooltips, button->priv->arrow_button, tip_text, tip_private);
 }
 
+#define __GTK_MENU_TOOL_BUTTON_C__
+#include "gtkaliasdef.c"