[epiphany] ephy-page-menu: set a style class when our menu is visible



commit a24c1cee4db530a0a9b2a833e41d726497d642a0
Author: Xan Lopez <xan igalia com>
Date:   Tue Jan 17 00:23:12 2012 +0100

    ephy-page-menu: set a style class when our menu is visible
    
    To aid with styling.

 src/ephy-page-menu-action.c |   77 +++++++++++++++++++++++++++++-------------
 src/ephy-page-menu-action.h |   11 ++++--
 src/ephy-window-action.c    |    2 +-
 3 files changed, 61 insertions(+), 29 deletions(-)
---
diff --git a/src/ephy-page-menu-action.c b/src/ephy-page-menu-action.c
index da2f499..b97c6e2 100644
--- a/src/ephy-page-menu-action.c
+++ b/src/ephy-page-menu-action.c
@@ -23,6 +23,12 @@
 
 G_DEFINE_TYPE (EphyPageMenuAction, ephy_page_menu_action, EPHY_TYPE_WINDOW_ACTION);
 
+#define EPHY_PAGE_MENU_ACTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), EPHY_TYPE_PAGE_MENU_ACTION, EphyPageMenuActionPrivate))
+
+struct _EphyPageMenuActionPrivate {
+  GtkWidget *menu;
+};
+
 static void
 menu_position_func (GtkMenu           *menu,
                     int               *x,
@@ -55,40 +61,60 @@ menu_position_func (GtkMenu           *menu,
 }
 
 static void
-button_press_cb (GtkWidget *button, GdkEventButton *event, GtkAction *action)
+visible_cb (GtkWidget *menu, GParamSpec *pspec, gpointer user_data)
 {
-    GtkWidget *menu;
-    EphyWindow *window;
-    GtkUIManager *manager;
-    guint event_button = 1;
-    guint32 event_time = 0;
+  if (gtk_widget_get_visible (menu))
+    gtk_style_context_add_class (gtk_widget_get_style_context (menu),
+                                 "active-menu");
+  else
+    gtk_style_context_remove_class (gtk_widget_get_style_context (menu),
+                                    "active-menu");
+}
 
+static void
+button_press_cb (GtkWidget *button, GdkEventButton *event, EphyPageMenuAction *action)
+{
+  GtkWidget *menu;
+  EphyWindow *window;
+  GtkUIManager *manager;
+  guint event_button = 1;
+  guint32 event_time = 0;
+
+  if (!action->priv->menu) {
     window = ephy_window_action_get_window (EPHY_WINDOW_ACTION (action));
     manager = GTK_UI_MANAGER (ephy_window_get_ui_manager (window));
     menu = gtk_ui_manager_get_widget (manager, "/ui/PagePopup");
 
-    if (!button) {
-      GSList *l = gtk_action_get_proxies (action);
-      if (GTK_IS_BUTTON (l->data))
-        button = GTK_WIDGET (l->data);
-    }
+    g_signal_connect (menu, "notify::visible",
+                      G_CALLBACK (visible_cb), NULL);
+
+    action->priv->menu = menu;
+  }
+    
 
-    g_return_if_fail (GTK_IS_BUTTON (button));
+  if (!button) {
+    GSList *l = gtk_action_get_proxies (GTK_ACTION (action));
+    if (GTK_IS_BUTTON (l->data))
+      button = GTK_WIDGET (l->data);
+  }
 
-    if (event) {
-      event_button = event->button;
-      event_time = event->time;
-    }
+  g_return_if_fail (GTK_IS_BUTTON (button));
 
-    gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
-                    (GtkMenuPositionFunc)menu_position_func, button,
-                    event_button, event_time);
+  if (event) {
+    event_button = event->button;
+    event_time = event->time;
+  }
+
+  gtk_menu_popup (GTK_MENU (action->priv->menu),
+                  NULL, NULL,
+                  (GtkMenuPositionFunc)menu_position_func, button,
+                  event_button, event_time);
 }
 
 static void
 ephy_page_menu_action_activate (GtkAction *action)
 {
-  button_press_cb (NULL, NULL, action);
+  button_press_cb (NULL, NULL, EPHY_PAGE_MENU_ACTION (action));
 }
 
 static void
@@ -115,14 +141,17 @@ ephy_page_menu_action_disconnect_proxy (GtkAction *action,
 static void
 ephy_page_menu_action_class_init (EphyPageMenuActionClass *klass)
 {
-    GtkActionClass *action_class = GTK_ACTION_CLASS (klass);
+  GtkActionClass *action_class = GTK_ACTION_CLASS (klass);
+
+  action_class->activate = ephy_page_menu_action_activate;
+  action_class->connect_proxy = ephy_page_menu_action_connect_proxy;
+  action_class->disconnect_proxy = ephy_page_menu_action_disconnect_proxy;
 
-    action_class->activate = ephy_page_menu_action_activate;
-    action_class->connect_proxy = ephy_page_menu_action_connect_proxy;
-    action_class->disconnect_proxy = ephy_page_menu_action_disconnect_proxy;
+  g_type_class_add_private (klass, sizeof (EphyPageMenuActionPrivate));
 }
 
 static void
 ephy_page_menu_action_init (EphyPageMenuAction *self)
 {
+  self->priv = EPHY_PAGE_MENU_ACTION_GET_PRIVATE (self);
 }
diff --git a/src/ephy-page-menu-action.h b/src/ephy-page-menu-action.h
index c510f94..ca96d73 100644
--- a/src/ephy-page-menu-action.h
+++ b/src/ephy-page-menu-action.h
@@ -34,15 +34,18 @@ G_BEGIN_DECLS
 #define EPHY_IS_PAGE_MENU_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EPHY_TYPE_PAGE_MENU_ACTION))
 #define EPHY_PAGE_MENU_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EPHY_TYPE_PAGE_MENU_ACTION, EphyPageMenuActionClass))
 
-typedef struct _EphyPageMenuAction      EphyPageMenuAction;
-typedef struct _EphyPageMenuActionClass EphyPageMenuActionClass;
+typedef struct _EphyPageMenuAction        EphyPageMenuAction;
+typedef struct _EphyPageMenuActionClass   EphyPageMenuActionClass;
+typedef struct _EphyPageMenuActionPrivate EphyPageMenuActionPrivate;
 
 struct _EphyPageMenuActionClass {
-    EphyWindowActionClass parent_class;
+  EphyWindowActionClass parent_class;
 };
 
 struct _EphyPageMenuAction {
-    EphyWindowAction parent_instance;
+  EphyWindowAction parent_instance;
+
+  EphyPageMenuActionPrivate *priv;
 };
 
 GType ephy_page_menu_action_get_type (void) G_GNUC_CONST;
diff --git a/src/ephy-window-action.c b/src/ephy-window-action.c
index f04d7e5..22634ed 100644
--- a/src/ephy-window-action.c
+++ b/src/ephy-window-action.c
@@ -88,7 +88,7 @@ ephy_window_action_class_init (EphyWindowActionClass *class)
                                      PROP_WINDOW,
                                      g_param_spec_object ("window", NULL, NULL,
                                                           G_TYPE_OBJECT,
-                                                          G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+                                                          G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_CONSTRUCT));
     
     g_type_class_add_private (object_class, sizeof (EphyWindowActionPrivate));
 }



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