summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Schermer <nick@xfce.org>2013-08-02 22:00:38 +0200
committerFelipe Contreras <felipe.contreras@gmail.com>2013-10-09 16:30:39 -0500
commit27abc7057c1613c8e1ef395e59879deec8640212 (patch)
tree0fd8ab493b398e36c49e627c2956983d42bd822c
parent768ec57519b9a19b9a9ccd628ec44ce2e968c1e1 (diff)
Use new GarconGtkMenu.
-rw-r--r--configure.ac.in1
-rw-r--r--plugins/applicationsmenu/Makefile.am2
-rw-r--r--plugins/applicationsmenu/applicationsmenu.c493
3 files changed, 68 insertions, 428 deletions
diff --git a/configure.ac.in b/configure.ac.in
index 80d909e3..12e451a7 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -128,6 +128,7 @@ dnl *** Check for required packages ***
dnl ***********************************
XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.9.0])
XDT_CHECK_PACKAGE([GARCON], [garcon-1], [0.1.5])
+XDT_CHECK_PACKAGE([GARCON_GTK2], [garcon-gtk2-1], [0.3.0])
XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.9.0])
XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.9.0])
XDT_CHECK_PACKAGE([EXO], [exo-1], [0.7.2])
diff --git a/plugins/applicationsmenu/Makefile.am b/plugins/applicationsmenu/Makefile.am
index d0d94bff..5967919f 100644
--- a/plugins/applicationsmenu/Makefile.am
+++ b/plugins/applicationsmenu/Makefile.am
@@ -24,6 +24,7 @@ libapplicationsmenu_la_CFLAGS = \
$(LIBXFCE4UTIL_CFLAGS) \
$(LIBXFCE4UI_CFLAGS) \
$(GARCON_CFLAGS) \
+ $(GARCON_GTK2_CFLAGS) \
$(PLATFORM_CFLAGS)
libapplicationsmenu_la_LDFLAGS = \
@@ -41,6 +42,7 @@ libapplicationsmenu_la_LIBADD = \
$(LIBXFCE4UTIL_LIBS) \
$(LIBXFCE4UI_LIBS) \
$(GARCON_LIBS) \
+ $(GARCON_GTK2_LIBS) \
$(XFCONF_LIBS)
libapplicationsmenu_la_DEPENDENCIES = \
diff --git a/plugins/applicationsmenu/applicationsmenu.c b/plugins/applicationsmenu/applicationsmenu.c
index b86e4381..dc34e939 100644
--- a/plugins/applicationsmenu/applicationsmenu.c
+++ b/plugins/applicationsmenu/applicationsmenu.c
@@ -22,6 +22,7 @@
#include <exo/exo.h>
#include <garcon/garcon.h>
+#include <garcon-gtk/garcon-gtk.h>
#include <libxfce4ui/libxfce4ui.h>
#include <libxfce4util/libxfce4util.h>
#include <libxfce4panel/libxfce4panel.h>
@@ -56,9 +57,8 @@ struct _ApplicationsMenuPlugin
GtkWidget *label;
GtkWidget *menu;
- guint show_generic_names : 1;
- guint show_menu_icons : 1;
- guint show_tooltips : 1;
+ guint is_constructed : 1;
+
guint show_button_title : 1;
gchar *button_title;
gchar *button_icon;
@@ -83,10 +83,6 @@ enum
PROP_CUSTOM_MENU_FILE
};
-static const GtkTargetEntry dnd_target_list[] = {
- { "text/uri-list", 0, 0 }
-};
-
static void applications_menu_plugin_get_property (GObject *object,
@@ -107,10 +103,12 @@ static void applications_menu_plugin_configure_plugin (XfcePanelPlugin
static gboolean applications_menu_plugin_remote_event (XfcePanelPlugin *panel_plugin,
const gchar *name,
const GValue *value);
-static void applications_menu_plugin_menu_reload (ApplicationsMenuPlugin *plugin);
static gboolean applications_menu_plugin_menu (GtkWidget *button,
GdkEventButton *event,
ApplicationsMenuPlugin *plugin);
+static void applications_menu_plugin_menu_deactivate (GtkWidget *menu,
+ GtkWidget *button);
+static void applications_menu_plugin_set_garcon_menu (ApplicationsMenuPlugin *plugin);
@@ -119,10 +117,6 @@ XFCE_PANEL_DEFINE_PLUGIN (ApplicationsMenuPlugin, applications_menu_plugin)
-static GtkIconSize menu_icon_size = GTK_ICON_SIZE_INVALID;
-
-
-
static void
applications_menu_plugin_class_init (ApplicationsMenuPluginClass *klass)
{
@@ -145,7 +139,7 @@ applications_menu_plugin_class_init (ApplicationsMenuPluginClass *klass)
PROP_SHOW_GENERIC_NAMES,
g_param_spec_boolean ("show-generic-names",
NULL, NULL,
- TRUE,
+ FALSE,
EXO_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
@@ -195,12 +189,6 @@ applications_menu_plugin_class_init (ApplicationsMenuPluginClass *klass)
NULL, NULL,
NULL,
EXO_PARAM_READWRITE));
-
- menu_icon_size = gtk_icon_size_from_name ("panel-applications-menu");
- if (menu_icon_size == GTK_ICON_SIZE_INVALID)
- menu_icon_size = gtk_icon_size_register ("panel-applications-menu",
- DEFAULT_ICON_SIZE,
- DEFAULT_ICON_SIZE);
}
@@ -208,25 +196,8 @@ applications_menu_plugin_class_init (ApplicationsMenuPluginClass *klass)
static void
applications_menu_plugin_init (ApplicationsMenuPlugin *plugin)
{
- const gchar *desktop;
-
- plugin->show_menu_icons = TRUE;
- plugin->show_button_title = TRUE;
- plugin->custom_menu = FALSE;
-
- /* if the value is unset, fallback to XFCE, if the
- * value is empty, allow all applications in the menu */
- desktop = g_getenv ("XDG_CURRENT_DESKTOP");
- if (G_LIKELY (desktop == NULL))
- desktop = "XFCE";
- else if (*desktop == '\0')
- desktop = NULL;
-
- panel_debug (PANEL_DEBUG_APPLICATIONSMENU,
- "XDG_MENU_PREFIX is set to \"%s\", menu environment is \"%s\"",
- g_getenv ("XDG_MENU_PREFIX"), desktop);
-
- garcon_set_environment (desktop);
+ /* init garcon environment */
+ garcon_set_environment_xdg (GARCON_ENVIRONMENT_XFCE);
plugin->button = xfce_panel_create_toggle_button ();
xfce_panel_plugin_add_action_widget (XFCE_PANEL_PLUGIN (plugin), plugin->button);
@@ -249,6 +220,11 @@ applications_menu_plugin_init (ApplicationsMenuPlugin *plugin)
plugin->label = gtk_label_new (DEFAULT_TITLE);
gtk_box_pack_start (GTK_BOX (plugin->box), plugin->label, FALSE, FALSE, 0);
gtk_widget_show (plugin->label);
+
+ /* prepare the menu */
+ plugin->menu = garcon_gtk_menu_new (NULL);
+ g_signal_connect (G_OBJECT (plugin->menu), "selection-done",
+ G_CALLBACK (applications_menu_plugin_menu_deactivate), plugin->button);
}
@@ -264,15 +240,18 @@ applications_menu_plugin_get_property (GObject *object,
switch (prop_id)
{
case PROP_SHOW_GENERIC_NAMES:
- g_value_set_boolean (value, plugin->show_generic_names);
+ g_value_set_boolean (value,
+ garcon_gtk_menu_get_show_generic_names (GARCON_GTK_MENU (plugin->menu)));
break;
case PROP_SHOW_MENU_ICONS:
- g_value_set_boolean (value, plugin->show_menu_icons);
+ g_value_set_boolean (value,
+ garcon_gtk_menu_get_show_menu_icons (GARCON_GTK_MENU (plugin->menu)));
break;
case PROP_SHOW_TOOLTIPS:
- g_value_set_boolean (value, plugin->show_tooltips);
+ g_value_set_boolean (value,
+ garcon_gtk_menu_get_show_tooltips (GARCON_GTK_MENU (plugin->menu)));
break;
case PROP_SHOW_BUTTON_TITLE:
@@ -313,23 +292,22 @@ applications_menu_plugin_set_property (GObject *object,
{
ApplicationsMenuPlugin *plugin = XFCE_APPLICATIONS_MENU_PLUGIN (object);
gboolean force_a_resize = FALSE;
- gboolean reload_menu = FALSE;
switch (prop_id)
{
case PROP_SHOW_GENERIC_NAMES:
- plugin->show_generic_names = g_value_get_boolean (value);
- reload_menu = TRUE;
+ garcon_gtk_menu_set_show_generic_names (GARCON_GTK_MENU (plugin->menu),
+ g_value_get_boolean (value));
break;
case PROP_SHOW_MENU_ICONS:
- plugin->show_menu_icons = g_value_get_boolean (value);
- reload_menu = TRUE;
- break;
+ garcon_gtk_menu_set_show_menu_icons (GARCON_GTK_MENU (plugin->menu),
+ g_value_get_boolean (value));
+ break;
case PROP_SHOW_TOOLTIPS:
- plugin->show_tooltips = g_value_get_boolean (value);
- reload_menu = TRUE;
+ garcon_gtk_menu_set_show_tooltips (GARCON_GTK_MENU (plugin->menu),
+ g_value_get_boolean (value));
break;
case PROP_SHOW_BUTTON_TITLE:
@@ -367,13 +345,17 @@ applications_menu_plugin_set_property (GObject *object,
case PROP_CUSTOM_MENU:
plugin->custom_menu = g_value_get_boolean (value);
- reload_menu = TRUE;
+
+ if (plugin->is_constructed)
+ applications_menu_plugin_set_garcon_menu (plugin);
break;
case PROP_CUSTOM_MENU_FILE:
g_free (plugin->custom_menu_file);
plugin->custom_menu_file = g_value_dup_string (value);
- reload_menu = TRUE;
+
+ if (plugin->is_constructed)
+ applications_menu_plugin_set_garcon_menu (plugin);
break;
default:
@@ -386,9 +368,6 @@ applications_menu_plugin_set_property (GObject *object,
applications_menu_plugin_size_changed (XFCE_PANEL_PLUGIN (plugin),
xfce_panel_plugin_get_size (XFCE_PANEL_PLUGIN (plugin)));
}
-
- if (reload_menu)
- applications_menu_plugin_menu_reload (plugin);
}
@@ -417,7 +396,12 @@ applications_menu_plugin_construct (XfcePanelPlugin *panel_plugin)
xfce_panel_plugin_get_property_base (panel_plugin),
properties, FALSE);
+ /* make sure the menu is set */
+ applications_menu_plugin_set_garcon_menu (plugin);
+
gtk_widget_show (plugin->button);
+
+ plugin->is_constructed = TRUE;
}
@@ -587,7 +571,7 @@ applications_menu_plugin_configure_plugin_edit (GtkWidget *button,
ApplicationsMenuPlugin *plugin)
{
GError *error = NULL;
- const gchar *command = "alacarte";
+ const gchar command[] = "alacarte";
panel_return_if_fail (XFCE_IS_APPLICATIONS_MENU_PLUGIN (plugin));
panel_return_if_fail (GTK_IS_WIDGET (button));
@@ -738,325 +722,41 @@ applications_menu_plugin_menu_deactivate (GtkWidget *menu,
static void
-applications_menu_plugin_append_quoted (GString *string,
- const gchar *unquoted)
+applications_menu_plugin_set_garcon_menu (ApplicationsMenuPlugin *plugin)
{
- gchar *quoted;
-
- quoted = g_shell_quote (unquoted);
- g_string_append (string, quoted);
- g_free (quoted);
-}
-
-
-
-static void
-applications_menu_plugin_menu_item_activate (GtkWidget *mi,
- GarconMenuItem *item)
-{
- GString *string;
- const gchar *command;
- const gchar *p;
- const gchar *tmp;
- gchar **argv;
- gboolean result = FALSE;
- gchar *uri;
- GError *error = NULL;
-
- panel_return_if_fail (GTK_IS_WIDGET (mi));
- panel_return_if_fail (GARCON_IS_MENU_ITEM (item));
-
- command = garcon_menu_item_get_command (item);
- if (exo_str_is_empty (command))
- return;
-
- string = g_string_sized_new (100);
-
- if (garcon_menu_item_requires_terminal (item))
- g_string_append (string, "exo-open --launch TerminalEmulator ");
-
- /* expand the field codes */
- for (p = command; *p != '\0'; ++p)
- {
- if (G_UNLIKELY (p[0] == '%' && p[1] != '\0'))
- {
- switch (*++p)
- {
- case 'f': case 'F':
- case 'u': case 'U':
- /* TODO for dnd, not a regression, xfdesktop never had this */
- break;
-
- case 'i':
- tmp = garcon_menu_item_get_icon_name (item);
- if (!exo_str_is_empty (tmp))
- {
- g_string_append (string, "--icon ");
- applications_menu_plugin_append_quoted (string, tmp);
- }
- break;
-
- case 'c':
- tmp = garcon_menu_item_get_name (item);
- if (!exo_str_is_empty (tmp))
- applications_menu_plugin_append_quoted (string, tmp);
- break;
-
- case 'k':
- uri = garcon_menu_item_get_uri (item);
- if (!exo_str_is_empty (uri))
- applications_menu_plugin_append_quoted (string, uri);
- g_free (uri);
- break;
-
- case '%':
- g_string_append_c (string, '%');
- break;
- }
- }
- else
- {
- g_string_append_c (string, *p);
- }
- }
-
- /* parse and spawn command */
- if (g_shell_parse_argv (string->str, NULL, &argv, &error))
- {
- result = xfce_spawn_on_screen (gtk_widget_get_screen (mi),
- garcon_menu_item_get_path (item),
- argv, NULL, G_SPAWN_SEARCH_PATH,
- garcon_menu_item_supports_startup_notification (item),
- gtk_get_current_event_time (),
- garcon_menu_item_get_icon_name (item),
- &error);
-
- g_strfreev (argv);
- }
-
- if (G_UNLIKELY (!result))
- {
- xfce_dialog_show_error (NULL, error, _("Failed to execute command \"%s\"."), command);
- g_error_free (error);
- }
-
- g_string_free (string, TRUE);
-}
-
-
-
-static void
-applications_menu_plugin_menu_item_drag_begin (GarconMenuItem *item,
- GdkDragContext *drag_context)
-{
- const gchar *icon_name;
-
- panel_return_if_fail (GARCON_IS_MENU_ITEM (item));
-
- icon_name = garcon_menu_item_get_icon_name (item);
- if (!exo_str_is_empty (icon_name))
- gtk_drag_set_icon_name (drag_context, icon_name, 0, 0);
-}
-
-
-
-static void
-applications_menu_plugin_menu_item_drag_data_get (GarconMenuItem *item,
- GdkDragContext *drag_context,
- GtkSelectionData *selection_data,
- guint info,
- guint drag_time)
-{
- gchar *uris[2] = { NULL, NULL };
-
- panel_return_if_fail (GARCON_IS_MENU_ITEM (item));
-
- uris[0] = garcon_menu_item_get_uri (item);
- if (G_LIKELY (uris[0] != NULL))
- {
- gtk_selection_data_set_uris (selection_data, uris);
- g_free (uris[0]);
- }
-}
-
-
+ GarconMenu *menu = NULL;
+ gchar *filename;
+ GFile *file;
-static void
-applications_menu_plugin_menu_item_drag_end (ApplicationsMenuPlugin *plugin)
-{
panel_return_if_fail (XFCE_IS_APPLICATIONS_MENU_PLUGIN (plugin));
- panel_return_if_fail (GTK_IS_TOGGLE_BUTTON (plugin->button));
- panel_return_if_fail (GTK_IS_MENU (plugin->menu));
+ panel_return_if_fail (GARCON_GTK_IS_MENU (plugin->menu));
- /* selection-done is never called, so handle that manually */
- applications_menu_plugin_menu_deactivate (plugin->menu, plugin->button);
-}
+ /* load the custom menu if set */
+ if (plugin->custom_menu
+ && plugin->custom_menu_file != NULL)
+ menu = garcon_menu_new_for_path (plugin->custom_menu_file);
+ /* use the applications menu, this also respects the
+ * XDG_MENU_PREFIX environment variable */
+ if (G_LIKELY (menu == NULL))
+ menu = garcon_menu_new_applications ();
+ /* set the menu */
+ garcon_gtk_menu_set_menu (GARCON_GTK_MENU (plugin->menu), menu);
-static void
-applications_menu_plugin_menu_reload (ApplicationsMenuPlugin *plugin)
-{
- panel_return_if_fail (XFCE_IS_APPLICATIONS_MENU_PLUGIN (plugin));
-
- if (plugin->menu != NULL)
+ /* debugging information */
+ if (0)
{
- panel_debug (PANEL_DEBUG_APPLICATIONSMENU,
- "destroy menu for reload");
-
- /* if the menu is opened, do not destroy it under the users'
- * cursor, else destroy the menu in an idle, to give garcon
- * time to finalize the events that triggered the reload */
- if (GTK_WIDGET_VISIBLE (plugin->menu))
- g_signal_connect (G_OBJECT (plugin->menu), "selection-done",
- G_CALLBACK (exo_gtk_object_destroy_later), NULL);
- else
- exo_gtk_object_destroy_later (GTK_OBJECT (plugin->menu));
- }
-}
-
-
-
-static gboolean
-applications_menu_plugin_menu_add (GtkWidget *gtk_menu,
- GtkWidget *button,
- GarconMenu *menu,
- ApplicationsMenuPlugin *plugin)
-{
- GList *elements, *li;
- GtkWidget *mi, *image;
- const gchar *name, *icon_name;
- const gchar *comment;
- GtkWidget *submenu;
- gboolean has_children = FALSE;
- gint size = DEFAULT_ICON_SIZE, w, h;
- const gchar *command;
- GarconMenuDirectory *directory;
-
- panel_return_val_if_fail (GTK_IS_MENU (gtk_menu), FALSE);
- panel_return_val_if_fail (GARCON_IS_MENU (menu), FALSE);
- panel_return_val_if_fail (XFCE_IS_APPLICATIONS_MENU_PLUGIN (plugin), FALSE);
- panel_return_val_if_fail (button == NULL || GTK_IS_TOGGLE_BUTTON (button), FALSE);
-
- if (gtk_icon_size_lookup (menu_icon_size, &w, &h))
- size = MIN (w, h);
+ file = garcon_menu_get_file (menu);
+ filename = g_file_get_parse_name (file);
+ g_object_unref (G_OBJECT (file));
- elements = garcon_menu_get_elements (menu);
- for (li = elements; li != NULL; li = li->next)
- {
- panel_return_val_if_fail (GARCON_IS_MENU_ELEMENT (li->data), FALSE);
- if (GARCON_IS_MENU_ITEM (li->data))
- {
- g_signal_connect_swapped (G_OBJECT (li->data), "changed",
- G_CALLBACK (applications_menu_plugin_menu_reload), plugin);
-
- if (!garcon_menu_element_get_visible (li->data))
- continue;
-
- name = NULL;
- if (plugin->show_generic_names)
- name = garcon_menu_item_get_generic_name (li->data);
- if (name == NULL)
- name = garcon_menu_item_get_name (li->data);
- if (G_UNLIKELY (name == NULL))
- continue;
-
- mi = gtk_image_menu_item_new_with_label (name);
- gtk_menu_shell_append (GTK_MENU_SHELL (gtk_menu), mi);
- g_signal_connect (G_OBJECT (mi), "activate",
- G_CALLBACK (applications_menu_plugin_menu_item_activate), li->data);
- gtk_widget_show (mi);
-
- if (plugin->show_tooltips)
- {
- comment = garcon_menu_item_get_comment (li->data);
- if (!exo_str_is_empty (comment))
- gtk_widget_set_tooltip_text (mi, comment);
- }
-
- /* dragging items from the menu to the panel */
- gtk_drag_source_set (mi, GDK_BUTTON1_MASK, dnd_target_list,
- G_N_ELEMENTS (dnd_target_list), GDK_ACTION_COPY);
- g_signal_connect_swapped (G_OBJECT (mi), "drag-begin",
- G_CALLBACK (applications_menu_plugin_menu_item_drag_begin), li->data);
- g_signal_connect_swapped (G_OBJECT (mi), "drag-data-get",
- G_CALLBACK (applications_menu_plugin_menu_item_drag_data_get), li->data);
- g_signal_connect_swapped (G_OBJECT (mi), "drag-end",
- G_CALLBACK (applications_menu_plugin_menu_item_drag_end), plugin);
-
- command = garcon_menu_item_get_command (li->data);
- if (G_UNLIKELY (exo_str_is_empty (command)))
- gtk_widget_set_sensitive (mi, FALSE);
-
- if (plugin->show_menu_icons)
- {
- icon_name = garcon_menu_item_get_icon_name (li->data);
- if (exo_str_is_empty (icon_name))
- icon_name = "applications-other";
-
- image = xfce_panel_image_new_from_source (icon_name);
- xfce_panel_image_set_size (XFCE_PANEL_IMAGE (image), size);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
- gtk_widget_show (image);
- }
-
- has_children = TRUE;
- }
- else if (GARCON_IS_MENU_SEPARATOR (li->data))
- {
- mi = gtk_separator_menu_item_new ();
- gtk_menu_shell_append (GTK_MENU_SHELL (gtk_menu), mi);
- gtk_widget_show (mi);
- }
- else if (GARCON_IS_MENU (li->data))
- {
- /* the element check for menu also copies the item list to
- * check if all the elements are visible, we do that with the
- * return value of this function, so avoid that and only check
- * the visibility of the menu directory */
- directory = garcon_menu_get_directory (li->data);
- if (directory != NULL
- && !garcon_menu_directory_get_visible (directory))
- continue;
-
- submenu = gtk_menu_new ();
- if (applications_menu_plugin_menu_add (submenu, button, li->data, plugin))
- {
- name = garcon_menu_element_get_name (li->data);
- mi = gtk_image_menu_item_new_with_label (name);
- gtk_menu_shell_append (GTK_MENU_SHELL (gtk_menu), mi);
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), submenu);
- g_signal_connect (G_OBJECT (submenu), "selection-done",
- G_CALLBACK (applications_menu_plugin_menu_deactivate), button);
- gtk_widget_show (mi);
-
- g_signal_connect_swapped (G_OBJECT (li->data), "directory-changed",
- G_CALLBACK (applications_menu_plugin_menu_reload), plugin);
-
- if (plugin->show_menu_icons)
- {
- icon_name = garcon_menu_element_get_icon_name (li->data);
- if (exo_str_is_empty (icon_name))
- icon_name = "applications-other";
-
- image = xfce_panel_image_new_from_source (icon_name);
- xfce_panel_image_set_size (XFCE_PANEL_IMAGE (image), size);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
- gtk_widget_show (image);
- }
-
- has_children = TRUE;
- }
- else
- {
- gtk_widget_destroy (submenu);
- }
- }
+ panel_debug (PANEL_DEBUG_APPLICATIONSMENU,
+ "menu from \"%s\"", filename);
+ g_free (filename);
}
- g_list_free (elements);
-
- return has_children;
+ g_object_unref (G_OBJECT (menu));
}
@@ -1066,16 +766,10 @@ applications_menu_plugin_menu (GtkWidget *button,
GdkEventButton *event,
ApplicationsMenuPlugin *plugin)
{
- GtkWidget *mi;
- GarconMenu *menu = NULL;
- GError *error = NULL;
- gchar *filename;
- GFile *file;
-
panel_return_val_if_fail (XFCE_IS_APPLICATIONS_MENU_PLUGIN (plugin), FALSE);
panel_return_val_if_fail (button == NULL || plugin->button == button, FALSE);
- if (event != NULL
+ if (event != NULL /* remove event */
&& !(event->button == 1
&& event->type == GDK_BUTTON_PRESS
&& !PANEL_HAS_FLAG (event->state, GDK_CONTROL_MASK)))
@@ -1084,64 +778,7 @@ applications_menu_plugin_menu (GtkWidget *button,
if (button != NULL)
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
- if (plugin->menu == NULL)
- {
- if (G_UNLIKELY (plugin->custom_menu
- && plugin->custom_menu_file != NULL))
- menu = garcon_menu_new_for_path (plugin->custom_menu_file);
-
- /* use the applications menu, this also respects the
- * XDG_MENU_PREFIX environment variable */
- if (G_LIKELY (menu == NULL))
- menu = garcon_menu_new_applications ();
-
- if (menu != NULL
- && garcon_menu_load (menu, NULL, &error))
- {
- plugin->menu = gtk_menu_new ();
- g_signal_connect (G_OBJECT (plugin->menu), "selection-done",
- G_CALLBACK (applications_menu_plugin_menu_deactivate), button);
- g_object_add_weak_pointer (G_OBJECT (plugin->menu), (gpointer) &plugin->menu);
-
- if (!applications_menu_plugin_menu_add (plugin->menu, button, menu, plugin))
- {
- mi = gtk_menu_item_new_with_label (_("No applications found"));
- gtk_menu_shell_append (GTK_MENU_SHELL (plugin->menu), mi);
- gtk_widget_set_sensitive (mi, FALSE);
- gtk_widget_show (mi);
- }
-
- /* watch the menu for changes */
- g_object_weak_ref (G_OBJECT (plugin->menu),
- (GWeakNotify) g_object_unref, menu);
- g_signal_connect_swapped (G_OBJECT (menu), "reload-required",
- G_CALLBACK (applications_menu_plugin_menu_reload), plugin);
-
- /* debugging information */
- file = garcon_menu_get_file (menu);
- filename = g_file_get_parse_name (file);
- g_object_unref (G_OBJECT (file));
-
- panel_debug (PANEL_DEBUG_APPLICATIONSMENU,
- "loading from %s", filename);
- g_free (filename);
- }
- else
- {
- xfce_dialog_show_error (NULL, error, _("Failed to load the applications menu"));
-
- if (button != NULL)
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
-
- if (G_LIKELY (error != NULL))
- g_error_free (error);
- if (G_LIKELY (menu != NULL))
- g_object_unref (G_OBJECT (menu));
-
- return FALSE;
- }
- }
-
+ /* show the menu */
gtk_menu_popup (GTK_MENU (plugin->menu), NULL, NULL,
button != NULL ? xfce_panel_plugin_position_menu : NULL,
plugin, 1,