[Xfce4-commits] [panel-plugins/xfce4-xkb-plugin] 06/17: Refactor menus and remove deprecations

noreply at xfce.org noreply at xfce.org
Sat Jun 10 14:31:39 CEST 2017


This is an automated email from the git hooks/post-receive script.

n   i   n   e   t   l   s       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository panel-plugins/xfce4-xkb-plugin.

commit 862e0e0dd56541ce6622f372fb6ad71bf338b699
Author: Viktor Odintsev <zakhams at gmail.com>
Date:   Fri Mar 17 02:07:30 2017 +0300

    Refactor menus and remove deprecations
    
    Panel button's behavior was refactored.
    Removed deprecated GtkImageMenuItem usage.
---
 panel-plugin/xfce4-xkb-plugin.c | 79 ++++++++++-------------------------------
 panel-plugin/xkb-callbacks.c    | 57 ++++++++++++++++++++++-------
 panel-plugin/xkb-callbacks.h    |  6 +++-
 3 files changed, 69 insertions(+), 73 deletions(-)

diff --git a/panel-plugin/xfce4-xkb-plugin.c b/panel-plugin/xfce4-xkb-plugin.c
index 8f59431..7dd8556 100644
--- a/panel-plugin/xfce4-xkb-plugin.c
+++ b/panel-plugin/xfce4-xkb-plugin.c
@@ -96,9 +96,6 @@ static void
 xfce_xkb_construct (XfcePanelPlugin *plugin)
 {
     GtkWidget *configure_layouts;
-    GtkIconTheme *theme;
-    GtkWidget *image;
-    GdkPixbuf *pixbuf;
 
     t_xkb *xkb = xkb_new (plugin);
 
@@ -123,27 +120,12 @@ xfce_xkb_construct (XfcePanelPlugin *plugin)
     g_signal_connect (plugin, "about",
             G_CALLBACK (xfce_xkb_about), xkb);
 
-    configure_layouts =
-        gtk_image_menu_item_new_with_label (_("Keyboard settings"));
-
-    theme = gtk_icon_theme_get_for_screen (gdk_screen_get_default());
-    pixbuf = gtk_icon_theme_load_icon (theme, "preferences-desktop-keyboard",
-                                       GTK_ICON_SIZE_MENU, 0, NULL);
-    if (pixbuf != NULL)
-    {
-        image = gtk_image_new ();
-        gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);
-        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (configure_layouts),
-                                       image);
-        g_object_unref (pixbuf);
-    }
-
+    configure_layouts = gtk_menu_item_new_with_label (_("Keyboard settings"));
     gtk_widget_show (configure_layouts);
-    xfce_panel_plugin_menu_insert_item (plugin,
-                                        GTK_MENU_ITEM (configure_layouts));
+    xfce_panel_plugin_menu_insert_item (plugin, GTK_MENU_ITEM (configure_layouts));
 
     g_signal_connect (G_OBJECT (configure_layouts), "activate",
-                      G_CALLBACK (xfce_xkb_configure_layout), NULL);
+            G_CALLBACK (xfce_xkb_configure_layout), NULL);
 }
 
 static void
@@ -223,9 +205,12 @@ xkb_new (XfcePanelPlugin *plugin)
     g_object_unref (css_provider);
 
     gtk_widget_show (xkb->btn);
-    g_signal_connect (xkb->btn, "clicked", G_CALLBACK (xkb_plugin_button_clicked), xkb);
+    g_signal_connect (xkb->btn, "button-press-event",
+            G_CALLBACK (xkb_plugin_button_clicked), xkb);
+    g_signal_connect (xkb->btn, "button-release-event",
+            G_CALLBACK (xkb_plugin_button_clicked), xkb);
     g_signal_connect (xkb->btn, "scroll-event",
-                      G_CALLBACK (xkb_plugin_button_scrolled), NULL);
+            G_CALLBACK (xkb_plugin_button_scrolled), NULL);
 
     g_object_set (G_OBJECT (xkb->btn), "has-tooltip", TRUE, NULL);
     g_signal_connect (xkb->btn, "query-tooltip",
@@ -259,9 +244,9 @@ xkb_free (t_xkb *xkb)
 {
     xkb_config_finalize ();
 
+    xkb_destroy_popup_menu (xkb);
     gtk_widget_destroy (xkb->layout_image);
     gtk_widget_destroy (xkb->btn);
-    xkb_destroy_popup_menu (xkb);
 
     g_object_unref (G_OBJECT (xkb->config));
 
@@ -325,11 +310,10 @@ xkb_calculate_sizes (t_xkb *xkb, GtkOrientation orientation, gint panel_size)
 static void
 xkb_destroy_popup_menu (t_xkb *xkb)
 {
-    if (xkb->popup)
+    if (xkb->popup != NULL)
     {
-        gtk_widget_destroy (xkb->popup);
-        g_object_ref_sink (xkb->popup);
-        g_object_unref (xkb->popup);
+        gtk_menu_popdown (GTK_MENU (xkb->popup));
+        gtk_menu_detach (GTK_MENU (xkb->popup));
         xkb->popup = NULL;
     }
 }
@@ -338,10 +322,7 @@ static void
 xkb_populate_popup_menu (t_xkb *xkb)
 {
     gint i, group_count;
-    RsvgHandle *handle;
-    GdkPixbuf *pixbuf, *tmp;
-    gchar *imgfilename;
-    GtkWidget *image;
+    gchar *layout_string;
     GtkWidget *menu_item;
 
     if (G_UNLIKELY (xkb == NULL)) return;
@@ -352,43 +333,21 @@ xkb_populate_popup_menu (t_xkb *xkb)
     group_count = xkb_config_get_group_count ();
     for (i = 0; i < group_count; i++)
     {
-        gchar *layout_string;
-
-        imgfilename = xkb_util_get_flag_filename (xkb_config_get_group_name (i));
-        handle = rsvg_handle_new_from_file (imgfilename, NULL);
-        g_free (imgfilename);
-
-        if (handle)
-        {
-            tmp = rsvg_handle_get_pixbuf (handle);
-        }
-
         layout_string = xkb_config_get_pretty_layout_name (i);
 
-        menu_item = gtk_image_menu_item_new_with_label (layout_string);
+        menu_item = gtk_menu_item_new_with_label (layout_string);
 
         g_signal_connect (G_OBJECT (menu_item), "activate",
                 G_CALLBACK (xkb_plugin_set_group), GINT_TO_POINTER (i));
 
-        if (handle)
-        {
-            image = gtk_image_new ();
-            pixbuf = gdk_pixbuf_scale_simple (tmp, 15, 10, GDK_INTERP_BILINEAR);
-            gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);
-            gtk_widget_show (image);
-            g_object_unref (G_OBJECT (tmp));
-            g_object_unref (G_OBJECT (pixbuf));
-
-            gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image);
-
-            rsvg_handle_close (handle, NULL);
-            g_object_unref (handle);
-        }
-
         gtk_widget_show (menu_item);
-
         gtk_menu_shell_append (GTK_MENU_SHELL (xkb->popup), menu_item);
     }
+
+    g_signal_connect_swapped (GTK_MENU_SHELL (xkb->popup), "deactivate",
+            G_CALLBACK (xkb_plugin_popup_menu_deactivate), xkb);
+
+    gtk_menu_attach_to_widget (GTK_MENU (xkb->popup), xkb->btn, NULL);
 }
 
 static void
diff --git a/panel-plugin/xkb-callbacks.c b/panel-plugin/xkb-callbacks.c
index 13107de..9b892d5 100644
--- a/panel-plugin/xkb-callbacks.c
+++ b/panel-plugin/xkb-callbacks.c
@@ -28,7 +28,8 @@
 #include "xkb-util.h"
 
 static void xkb_plugin_popup_menu (GtkButton *btn,
-                                   gpointer data);
+                                   GdkEventButton *event,
+                                   t_xkb *xkb);
 
 void
 xkb_plugin_active_window_changed (WnckScreen *screen,
@@ -131,18 +132,33 @@ xkb_plugin_layout_image_draw (GtkWidget *widget,
     return FALSE;
 }
 
-void
+gboolean
 xkb_plugin_button_clicked (GtkButton *btn,
+                           GdkEventButton *event,
                            gpointer data)
 {
-    if (xkb_config_get_group_count () > 2)
-    {
-        xkb_plugin_popup_menu (btn, data);
-    }
-    else
+    t_xkb *xkb;
+    gboolean released, display_popup;
+
+    if (event->button == 1)
     {
-        xkb_config_next_group ();
+        xkb = data;
+        released = event->type == GDK_BUTTON_RELEASE;
+        display_popup = xkb_config_get_group_count () > 2;
+
+        if (display_popup && !released)
+        {
+            xkb_plugin_popup_menu (btn, event, data);
+            return TRUE;
+        }
+
+        if (!display_popup && released)
+        {
+            xkb_config_next_group ();
+            return FALSE;
+        }
     }
+    return FALSE;
 }
 
 gboolean
@@ -169,12 +185,29 @@ xkb_plugin_button_scrolled (GtkWidget *btn,
 
 static void
 xkb_plugin_popup_menu (GtkButton *btn,
-                       gpointer data)
+                       GdkEventButton *event,
+                       t_xkb *xkb)
+{
+    gtk_widget_set_state_flags (GTK_WIDGET (xkb->btn), GTK_STATE_FLAG_CHECKED, FALSE);
+#if GTK_CHECK_VERSION(3, 22, 0)
+    gtk_menu_popup_at_widget (GTK_MENU (xkb->popup), GTK_WIDGET (btn),
+            GDK_GRAVITY_NORTH_WEST, GDK_GRAVITY_NORTH_WEST, (GdkEvent *) event);
+#else
+    gtk_menu_popup (GTK_MENU (xkb->popup), NULL, NULL,
+            xfce_panel_plugin_position_menu, xkb->plugin,
+            0, event->time);
+#endif
+}
+
+void
+xkb_plugin_popup_menu_deactivate (gpointer data,
+                                  GtkMenuShell *menu_shell)
 {
     t_xkb *xkb = (t_xkb *) data;
-    gtk_menu_popup (GTK_MENU (xkb->popup),
-            NULL, NULL, NULL, NULL, 0,
-            gtk_get_current_event_time ());
+
+    g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
+
+    gtk_widget_unset_state_flags (GTK_WIDGET (xkb->btn), GTK_STATE_FLAG_CHECKED);
 }
 
 gboolean
diff --git a/panel-plugin/xkb-callbacks.h b/panel-plugin/xkb-callbacks.h
index 2aea893..8268a39 100644
--- a/panel-plugin/xkb-callbacks.h
+++ b/panel-plugin/xkb-callbacks.h
@@ -48,13 +48,17 @@ void            xkb_plugin_window_closed        (WnckScreen *screen,
                                  WnckWindow *window,
                                  t_xkb *xkb);
 
-void            xkb_plugin_button_clicked       (GtkButton *btn,
+gboolean        xkb_plugin_button_clicked       (GtkButton *btn,
+                                 GdkEventButton *event,
                                  gpointer data);
 
 gboolean        xkb_plugin_button_scrolled      (GtkWidget *btn,
                                  GdkEventScroll *event,
                                  gpointer data);
 
+void            xkb_plugin_popup_menu_deactivate   (gpointer data,
+                                 GtkMenuShell *menu_shell);
+
 gboolean        xkb_plugin_set_tooltip          (GtkWidget *widget,
                                  gint x,
                                  gint y,

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list