[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