[Xfce4-commits] [xfce/xfdesktop] 16/34: Migrate to garcon-gtk for the menu

noreply at xfce.org noreply at xfce.org
Sun Apr 16 07:06:50 CEST 2017


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

eric pushed a commit to branch master
in repository xfce/xfdesktop.

commit 171025ea3e7aa3837da829538c44c48e36d8158b
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sat Jun 4 14:07:21 2016 +0300

    Migrate to garcon-gtk for the menu
    
    garcon-gtk can handle loading and display the application menu, so
    let's use it. This allows us to share code with the panel and other
    consumers of garcon.
---
 configure.ac.in               |  10 +
 po/POTFILES.in                |   2 -
 src/Makefile.am               |  15 +-
 src/menu.c                    | 136 +++++--------
 src/menu.h                    |   1 -
 src/xfce-desktop-menu.c       | 333 --------------------------------
 src/xfce-desktop-menu.h       |  41 ----
 src/xfdesktop-app-menu-item.c | 432 ------------------------------------------
 src/xfdesktop-app-menu-item.h |  47 -----
 src/xfdesktop-application.c   |   2 -
 10 files changed, 57 insertions(+), 962 deletions(-)

diff --git a/configure.ac.in b/configure.ac.in
index 6742878..328a8b6 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -172,6 +172,16 @@ echo "*** if you installed the new version of the package in a nonstandard"
 echo "*** prefix.  Desktop menu will be disabled."
 build_desktop_menu="no"
 ])
+    XDT_CHECK_PACKAGE([GARCON_GTK3], [garcon-gtk3-1],
+                      [garcon_minimum_version], [build_desktop_menu="yes"],
+                      [
+echo "*** Optional package garcon-gtk3-1 was either not found on your system"
+echo "*** or is too old.  Please install or upgrade to at least version"
+echo "*** garcon_minimum_version, or adjust the PKG_CONFIG_PATH environment variable"
+echo "*** if you installed the new version of the package in a nonstandard"
+echo "*** prefix.  Desktop menu will be disabled."
+build_desktop_menu="no"
+])
     if test "x$build_desktop_menu" = "xyes"; then
         AC_DEFINE([USE_DESKTOP_MENU], [1],
                   [Define if we should build the desktop menu module])
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 5410dea..fd5a520 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -12,8 +12,6 @@ src/menu.c
 src/windowlist.c
 src/xfce-backdrop.c
 src/xfce-desktop.c
-src/xfce-desktop-menu.c
-src/xfdesktop-app-menu-item.c
 src/xfdesktop-application.c
 src/xfdesktop-clipboard-manager.c
 src/xfdesktop-file-icon.c
diff --git a/src/Makefile.am b/src/Makefile.am
index ea336eb..b690e17 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -43,12 +43,6 @@ desktop_icon_sources = \
 	gtkcairoblur.c \
 	gtkcairoblurprivate.h
 
-desktop_menu_sources = \
-	xfce-desktop-menu.c \
-	xfce-desktop-menu.h \
-	xfdesktop-app-menu-item.c \
-	xfdesktop-app-menu-item.h
-
 desktop_file_icon_sources = \
 	xfdesktop-clipboard-manager.c \
 	xfdesktop-clipboard-manager.h \
@@ -114,13 +108,13 @@ xfdesktop_LDADD += \
 
 if BUILD_DESKTOP_MENU
 
-xfdesktop_SOURCES += $(desktop_menu_sources)
-
 xfdesktop_CFLAGS += \
-	$(GARCON_CFLAGS)
+	$(GARCON_CFLAGS) \
+	$(GARCON_GTK3_CFLAGS)
 
 xfdesktop_LDADD += \
-	$(GARCON_LIBS)
+	$(GARCON_LIBS) \
+	$(GARCON_GTK3_LIBS)
 
 endif
 
@@ -218,6 +212,5 @@ endif
 endif
 
 EXTRA_DIST = \
-	$(desktop_menu_sources) \
 	$(desktop_icon_sources) \
 	$(desktop_file_icon_sources)
diff --git a/src/menu.c b/src/menu.c
index bae8d6a..b33607d 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -35,37 +35,17 @@
 
 #include <libxfce4util/libxfce4util.h>
 
+#include "xfdesktop-common.h"
 #include "menu.h"
 #ifdef USE_DESKTOP_MENU
-#include "xfce-desktop-menu.h"
+#include <garcon/garcon.h>
+#include <garcon-gtk/garcon-gtk.h>
 #endif
 
 #ifdef USE_DESKTOP_MENU
-static XfceDesktopMenu *desktop_menu = NULL;
+static gboolean show_desktop_menu = TRUE;
 static gboolean show_desktop_menu_icons = TRUE;
-#endif
-
-#ifdef USE_DESKTOP_MENU
-static void
-_stop_menu_module(void) {
-    if(desktop_menu) {
-        xfce_desktop_menu_destroy(desktop_menu);
-        desktop_menu = NULL;
-    }
-}
-
-static gboolean
-_start_menu_module(void)
-{
-    desktop_menu = xfce_desktop_menu_new(TRUE);
-    if(desktop_menu) {
-        xfce_desktop_menu_set_show_icons(desktop_menu, show_desktop_menu_icons);
-        return TRUE;
-    } else {
-        g_warning("%s: Unable to initialise menu module. Right-click menu will be unavailable.\n", PACKAGE);
-        return FALSE;
-    }
-}
+static GarconMenu *garcon_menu = NULL;
 #endif
 
 #ifdef USE_DESKTOP_MENU
@@ -74,47 +54,40 @@ menu_populate(XfceDesktop *desktop,
               GtkMenuShell *menu,
               gpointer user_data)
 {
-    GtkWidget *desktop_menu_widget;
-    GList *menu_children;
-    
+    GtkWidget *mi, *img = NULL;
+    GtkIconTheme *itheme = gtk_icon_theme_get_default();
+    GtkWidget *desktop_menu = NULL;
+
     TRACE("ENTERING");
-    
-    if(!desktop_menu)
+
+    if(!show_desktop_menu)
         return;
+
+    if(garcon_menu == NULL) {
+        garcon_menu = garcon_menu_new_applications();
+    }
+    desktop_menu = garcon_gtk_menu_new (garcon_menu);
+
+    mi = gtk_separator_menu_item_new();
+    gtk_widget_show(mi);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
     
-    /* check to see if the menu is empty.  if not, add the desktop menu
-     * to a submenu */
-    menu_children = gtk_container_get_children(GTK_CONTAINER(menu));
-    if(menu_children) {
-        g_list_free(menu_children);
-        
-        desktop_menu_widget = xfce_desktop_menu_get_widget(desktop_menu);
-        if(desktop_menu_widget) {
-            GtkWidget *mi, *img = NULL;
-            GtkIconTheme *itheme = gtk_icon_theme_get_default();
-            
-            mi = gtk_separator_menu_item_new();
-            gtk_widget_show(mi);
-            gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-            
-            if(gtk_icon_theme_has_icon(itheme, "applications-other")) {
-                img = gtk_image_new_from_icon_name("applications-other",
-                                                   GTK_ICON_SIZE_MENU);
-                gtk_widget_show(img);
-            }
-            
-            mi = gtk_image_menu_item_new_with_mnemonic(_("_Applications"));
-            gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
-            gtk_widget_show(mi);
-            gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-            
-            gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), desktop_menu_widget);
-        }
-    } else {
-        /* just get the menu as a list of toplevel GtkMenuItems instead of
-         * a toplevel menu */
-        xfce_desktop_menu_populate_menu(desktop_menu, GTK_WIDGET(menu));
+    if(gtk_icon_theme_has_icon(itheme, "applications-other")) {
+        img = gtk_image_new_from_icon_name("applications-other",
+                                           GTK_ICON_SIZE_MENU);
+        gtk_widget_show(img);
     }
+    
+    mi = gtk_image_menu_item_new_with_mnemonic(_("_Applications"));
+    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
+    gtk_widget_show(mi);
+
+    XF_DEBUG("show desktop menu icons %s", show_desktop_menu_icons ? "TRUE" : "FALSE");
+    garcon_gtk_menu_set_show_menu_icons(GARCON_GTK_MENU(desktop_menu), show_desktop_menu_icons);
+
+    gtk_menu_item_set_submenu (GTK_MENU_ITEM(mi), desktop_menu);
+
+    gtk_menu_shell_append(menu, mi);
 }
 #endif /* USE_DESKTOP_MENU */
 
@@ -126,24 +99,13 @@ menu_settings_changed(XfconfChannel *channel,
                       gpointer user_data)
 {
     if(!strcmp(property, "/desktop-menu/show")) {
-        if(!G_VALUE_TYPE(value) || g_value_get_boolean(value)) {
-            if(!desktop_menu) {
-                _start_menu_module();
-                if(desktop_menu && !show_desktop_menu_icons)
-                    xfce_desktop_menu_set_show_icons(desktop_menu, FALSE);
-            }
-        } else {
-            if(desktop_menu)
-                _stop_menu_module();
-        }
+        show_desktop_menu = G_VALUE_TYPE(value)
+                            ? g_value_get_boolean(value)
+                            : TRUE;
     } else if(!strcmp(property, "/desktop-menu/show-icons")) {
         show_desktop_menu_icons = G_VALUE_TYPE(value)
                                   ? g_value_get_boolean(value)
                                   : TRUE;
-        if(desktop_menu) {
-            xfce_desktop_menu_set_show_icons(desktop_menu,
-                                             show_desktop_menu_icons);
-        }
     }
 }
 #endif
@@ -152,17 +114,17 @@ void
 menu_init(XfconfChannel *channel)
 {    
 #ifdef USE_DESKTOP_MENU
-    if(!channel
-       || xfconf_channel_get_bool(channel, "/desktop-menu/show", TRUE))
+    if(!channel || xfconf_channel_get_bool(channel, "/desktop-menu/show", TRUE))
     {
+        show_desktop_menu = TRUE;
         if(channel) {
             show_desktop_menu_icons = xfconf_channel_get_bool(channel,
                                                               "/desktop-menu/show-icons",
                                                               TRUE);
         }
-        _start_menu_module();
-    } else
-        _stop_menu_module();
+    } else {
+        show_desktop_menu = FALSE;
+    }
 
     if(channel) {
         g_signal_connect(G_OBJECT(channel), "property-changed",
@@ -182,18 +144,6 @@ menu_attach(XfceDesktop *desktop)
 }
 
 void
-menu_reload(void)
-{
-#ifdef USE_DESKTOP_MENU
-    if(desktop_menu)
-        xfce_desktop_menu_force_regen(desktop_menu);
-#endif
-}
-
-void
 menu_cleanup(void)
 {
-#ifdef USE_DESKTOP_MENU
-    _stop_menu_module();
-#endif
 }
diff --git a/src/menu.h b/src/menu.h
index 1963ab2..6fc50cf 100644
--- a/src/menu.h
+++ b/src/menu.h
@@ -33,7 +33,6 @@ G_BEGIN_DECLS
 
 void menu_init(XfconfChannel *channel);
 void menu_attach(XfceDesktop *desktop);
-void menu_reload(void);
 void menu_cleanup(void);
 
 G_END_DECLS
diff --git a/src/xfce-desktop-menu.c b/src/xfce-desktop-menu.c
deleted file mode 100644
index da0aa12..0000000
--- a/src/xfce-desktop-menu.c
+++ /dev/null
@@ -1,333 +0,0 @@
-/*  xfce4
- *
- *  Copyright (C) 2002-2003 Jasper Huijsmans (huysmans at users.sourceforge.net)
- *                     2003 Biju Chacko (botsie at users.sourceforge.net)
- *                     2004 Danny Milosavljevic <danny.milo at gmx.net>
- *                2004-2008 Brian Tarricone <bjt23 at cornell.edu>
- *                2009-2010 Jannis Pohlmann <jannis at xfce.org>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software Foundation,
- *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#endif
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#ifdef HAVE_TIME_H
-#include <time.h>
-#endif
-
-#ifdef HAVE_SIGNAL_H
-#include <signal.h>
-#endif
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifndef PATH_MAX
-#define PATH_MAX 4096
-#endif
-
-#include <gdk/gdkx.h>
-#include <gtk/gtk.h>
-#include <glib.h>
-
-#include <garcon/garcon.h>
-
-#include <libxfce4util/libxfce4util.h>
-#include <libxfce4ui/libxfce4ui.h>
-
-#include "xfce-desktop-menu.h"
-#include "xfdesktop-app-menu-item.h"
-
-struct _XfceDesktopMenu
-{
-    GarconMenu *garcon_menu;
-
-    gchar *filename;  /* file the menu is currently using */
-
-    gboolean use_menu_icons;  /* show menu icons? */
-
-    guint idle_id;  /* source id for idled generation */
-};
-
-
-static GtkIconTheme *_deskmenu_icon_theme = NULL;
-
-static gboolean _generate_menu_idled(gpointer data);
-static gboolean _generate_menu(XfceDesktopMenu *desktop_menu);
-static void desktop_menu_add_items(XfceDesktopMenu *desktop_menu,
-                                   GarconMenu *garcon_menu,
-                                   GtkWidget *menu);
-
-static void
-xfce_desktop_menu_reload(XfceDesktopMenu *desktop_menu)
-{
-    /* this fixes bugs 3615 and 4342.  if both the .desktop files
-     * and icon theme change very quickly after each other, we'll
-     * get a crash when the icon theme gets regenerated when calling
-     * gtk_icon_theme_lookup_icon(), which triggers a recursive regen.
-     * so we'll idle the regen, and make sure we don't enter it
-     * recursively.  same deal for _something_changed(). */
-    DBG("Schedule menu reload");
-    if(!desktop_menu->idle_id)
-        desktop_menu->idle_id = g_idle_add(_generate_menu_idled, desktop_menu);
-}
-
-/*
- * this is a bit of a kludge.  in order to support the cache and be a bit
- * faster, we either want to build a GtkMenu, or we want to just build
- * the GtkMenuItems and store them in a GList for later.  only one
- * of |menu| or |menu_items_return| should be non-NULL
- */
-static void
-desktop_menu_add_items(XfceDesktopMenu *desktop_menu,
-                       GarconMenu *garcon_menu,
-                       GtkWidget *menu)
-{
-    GList *items, *l;
-    GtkWidget *submenu, *mi, *img;
-    GarconMenu *garcon_submenu;
-    GarconMenuDirectory *garcon_directory;
-    GarconMenuItem *garcon_item;
-    const gchar *name, *icon_name;
-
-    g_return_if_fail(GTK_IS_MENU(menu));
-    g_return_if_fail(GARCON_IS_MENU(garcon_menu));
-
-    items = garcon_menu_get_elements(garcon_menu);
-    for(l = items; l; l = l->next) {
-        if(!garcon_menu_element_get_visible(l->data))
-            continue;
-
-        if(GARCON_IS_MENU(l->data)) {
-            GList *tmpl;
-            garcon_submenu = l->data;
-            garcon_directory = garcon_menu_get_directory(garcon_submenu);
-            icon_name = NULL;
-
-            submenu = gtk_menu_new();
-
-            if(garcon_directory) {
-                if(desktop_menu->use_menu_icons)
-                    icon_name = garcon_menu_directory_get_icon_name(garcon_directory);
-            }
-
-            name = garcon_menu_element_get_name(GARCON_MENU_ELEMENT(garcon_submenu));
-
-            mi = gtk_image_menu_item_new_with_label(name);
-            if(icon_name) {
-                img = gtk_image_new_from_icon_name(icon_name,
-                                                   GTK_ICON_SIZE_MENU);
-                gtk_widget_show(img);
-                gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
-            }
-            gtk_widget_show(mi);
-            gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), submenu);
-
-            gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-
-            desktop_menu_add_items(desktop_menu, garcon_submenu,
-                                   submenu);
-
-            /* we have to check emptiness down here instead of at the top of the
-             * loop because there may be further submenus that are empty */
-            if(!(tmpl = gtk_container_get_children(GTK_CONTAINER(submenu))))
-                gtk_widget_destroy(mi);
-            else
-                g_list_free(tmpl);
-        } else if(GARCON_IS_MENU_SEPARATOR(l->data)) {
-            mi = gtk_separator_menu_item_new();
-            gtk_widget_show(mi);
-
-            gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-        } else if(GARCON_IS_MENU_ITEM(l->data)) {
-            garcon_item = l->data;
-
-            mi = xfdesktop_app_menu_item_new(GARCON_MENU_ITEM(garcon_item));
-            gtk_widget_show(mi);
-
-            gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-        }
-    }
-    g_list_free(items);
-}
-
-static gboolean
-_generate_menu(XfceDesktopMenu *desktop_menu)
-{
-    GError *error = NULL;
-
-    DBG("Load menu");
-
-    if(!garcon_menu_load(desktop_menu->garcon_menu, NULL, &error)) {
-        g_warning("Unable to load menu: %s", error->message);
-        g_clear_error(&error);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-
-static gboolean
-_generate_menu_idled(gpointer data)
-{
-    XfceDesktopMenu *desktop_menu = data;
-
-    g_return_val_if_fail(data != NULL, FALSE);
-
-    _generate_menu(desktop_menu);
-    desktop_menu->idle_id = 0;
-
-    return FALSE;
-}
-
-XfceDesktopMenu *
-xfce_desktop_menu_new(gboolean deferred)
-{
-    XfceDesktopMenu *desktop_menu = g_new0(XfceDesktopMenu, 1);
-
-    garcon_set_environment("XFCE");
-
-    desktop_menu->use_menu_icons = TRUE;
-    desktop_menu->garcon_menu = garcon_menu_new_applications();
-    g_signal_connect_swapped(desktop_menu->garcon_menu, "reload-required",
-                             G_CALLBACK(xfce_desktop_menu_reload), desktop_menu);
-
-    if(deferred)
-        desktop_menu->idle_id = g_idle_add(_generate_menu_idled, desktop_menu);
-    else {
-        if(!_generate_menu(desktop_menu)) {
-            g_free(desktop_menu);
-            desktop_menu = NULL;
-        }
-    }
-
-    _deskmenu_icon_theme = gtk_icon_theme_get_default();
-    g_signal_connect_swapped(G_OBJECT(_deskmenu_icon_theme), "changed",
-                     G_CALLBACK(xfce_desktop_menu_reload), desktop_menu);
-
-    return desktop_menu;
-}
-
-void
-xfce_desktop_menu_populate_menu(XfceDesktopMenu *desktop_menu,
-                                GtkWidget *menu)
-{
-    g_return_if_fail(desktop_menu && menu);
-
-    if(!desktop_menu->garcon_menu) {
-        if(desktop_menu->idle_id) {
-            g_source_remove(desktop_menu->idle_id);
-            desktop_menu->idle_id = 0;
-        }
-        _generate_menu(desktop_menu);
-        if(!desktop_menu->garcon_menu)
-            return;
-    }
-
-    desktop_menu_add_items(desktop_menu, desktop_menu->garcon_menu,
-                           GTK_WIDGET(menu));
-}
-
-GtkWidget *
-xfce_desktop_menu_get_widget(XfceDesktopMenu *desktop_menu)
-{
-    GtkWidget *menu;
-
-    g_return_val_if_fail(desktop_menu != NULL, NULL);
-
-    menu = gtk_menu_new();
-
-    xfce_desktop_menu_populate_menu(desktop_menu, menu);
-
-    if(!desktop_menu->garcon_menu) {
-       gtk_widget_destroy(menu);
-       return NULL;
-    }
-
-    return menu;
-}
-
-void
-xfce_desktop_menu_force_regen(XfceDesktopMenu *desktop_menu)
-{
-    TRACE("dummy");
-    g_return_if_fail(desktop_menu != NULL);
-
-    if(desktop_menu->idle_id) {
-        g_source_remove(desktop_menu->idle_id);
-        desktop_menu->idle_id = 0;
-    }
-
-    _generate_menu(desktop_menu);
-}
-
-void
-xfce_desktop_menu_set_show_icons(XfceDesktopMenu *desktop_menu,
-                                 gboolean show_icons)
-{
-    g_return_if_fail(desktop_menu != NULL);
-
-    if(desktop_menu->use_menu_icons != show_icons) {
-        desktop_menu->use_menu_icons = show_icons;
-        xfdesktop_app_menu_item_set_show_icon(show_icons);
-        if(desktop_menu->idle_id) {
-            g_source_remove(desktop_menu->idle_id);
-            desktop_menu->idle_id = 0;
-        }
-        _generate_menu(desktop_menu);
-    }
-}
-
-void
-xfce_desktop_menu_destroy(XfceDesktopMenu *desktop_menu)
-{
-    g_return_if_fail(desktop_menu != NULL);
-    TRACE("menu destroyed");
-
-    if(desktop_menu->idle_id) {
-        g_source_remove(desktop_menu->idle_id);
-        desktop_menu->idle_id = 0;
-    }
-
-    g_signal_handlers_disconnect_by_func(_deskmenu_icon_theme,
-                                         G_CALLBACK(xfce_desktop_menu_reload),
-                                         desktop_menu);
-
-    if(desktop_menu->garcon_menu) {
-        g_signal_handlers_disconnect_by_func(desktop_menu->garcon_menu,
-            G_CALLBACK(xfce_desktop_menu_reload), desktop_menu);
-        g_object_unref(G_OBJECT(desktop_menu->garcon_menu));
-    }
-
-    g_free(desktop_menu);
-}
diff --git a/src/xfce-desktop-menu.h b/src/xfce-desktop-menu.h
deleted file mode 100644
index 62959e2..0000000
--- a/src/xfce-desktop-menu.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  xfdesktop - xfce4's desktop manager
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU Library General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software Foundation,
- *  Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
- */
-
-#ifndef _XFCE_DESKTOP_MENU_H_
-#define _XFCE_DESKTOP_MENU_H_
-
-#include "xfce-desktop.h"
-#include <xfconf/xfconf.h>
-
-G_BEGIN_DECLS
-
-typedef struct _XfceDesktopMenu XfceDesktopMenu;
-
-XfceDesktopMenu *xfce_desktop_menu_new(gboolean deferred);
-void xfce_desktop_menu_populate_menu(XfceDesktopMenu *desktop_menu,
-                                     GtkWidget *menu);
-GtkWidget *xfce_desktop_menu_get_widget(XfceDesktopMenu *desktop_menu);
-void xfce_desktop_menu_force_regen(XfceDesktopMenu *desktop_menu);
-void xfce_desktop_menu_set_show_icons(XfceDesktopMenu *desktop_menu,
-                                      gboolean show_icons);
-void xfce_desktop_menu_destroy(XfceDesktopMenu *desktop_menu);
-
-
-G_END_DECLS
-
-#endif
diff --git a/src/xfdesktop-app-menu-item.c b/src/xfdesktop-app-menu-item.c
deleted file mode 100644
index 101f54a..0000000
--- a/src/xfdesktop-app-menu-item.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * A GtkImageMenuItem subclass that handles menu items that are
- * intended to represent launchable applications.
- *
- * Copyright (c) 2004-2007,2009 Brian Tarricone <bjt23 at cornell.edu>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#include <gtk/gtk.h>
-
-#include <libxfce4util/libxfce4util.h>
-#include <libxfce4ui/libxfce4ui.h>
-#include <exo/exo.h>
-#include <xfconf/xfconf.h>
-
-#include "xfdesktop-app-menu-item.h"
-#include "xfdesktop-common.h"
-
-struct _XfdesktopAppMenuItem
-{
-    GtkImageMenuItem parent;
-
-    GarconMenuItem *item;
-
-    GtkWidget *accel_label;
-};
-
-typedef struct _XfdesktopAppMenuItemClass
-{
-    GtkImageMenuItemClass parent;
-} XfdesktopAppMenuItemClass;
-
-enum
-{
-    PROP_0,
-    PROP_ITEM
-};
-
-
-static void xfdesktop_app_menu_item_set_property(GObject *object,
-                                                 guint prop_id,
-                                                 const GValue *value,
-                                                 GParamSpec *pspec);
-static void xfdesktop_app_menu_item_get_property(GObject *object,
-                                                 guint prop_id,
-                                                 GValue *value,
-                                                 GParamSpec *pspec);
-static void xfdesktop_app_menu_item_finalize(GObject *object);
-
-static void xfdesktop_app_menu_item_changed(XfdesktopAppMenuItem *app_menu_item);
-
-static void xfdesktop_app_menu_item_activate(XfdesktopAppMenuItem *app_menu_item);
-
-
-G_DEFINE_TYPE(XfdesktopAppMenuItem, xfdesktop_app_menu_item, GTK_TYPE_IMAGE_MENU_ITEM)
-
-
-
-static gboolean global_show_icons = TRUE;
-
-
-
-static void
-xfdesktop_app_menu_item_class_init(XfdesktopAppMenuItemClass *klass)
-{
-    GObjectClass *gobject_class = (GObjectClass *)klass;
-
-    gobject_class->finalize = xfdesktop_app_menu_item_finalize;
-    gobject_class->set_property = xfdesktop_app_menu_item_set_property;
-    gobject_class->get_property = xfdesktop_app_menu_item_get_property;
-
-    g_object_class_install_property(gobject_class, PROP_ITEM,
-                                    g_param_spec_object("item", NULL, NULL,
-                                                        GARCON_TYPE_MENU_ITEM,
-                                                        G_PARAM_STATIC_STRINGS
-                                                        | G_PARAM_READWRITE
-                                                        | G_PARAM_CONSTRUCT_ONLY));
-}
-
-static void
-xfdesktop_app_menu_item_init(XfdesktopAppMenuItem *app_menu_item)
-{
-    g_signal_connect(G_OBJECT(app_menu_item), "activate",
-                     G_CALLBACK(xfdesktop_app_menu_item_activate), NULL);
-}
-
-static void
-xfdesktop_app_menu_item_set_property(GObject *object,
-                                     guint prop_id,
-                                     const GValue *value,
-                                     GParamSpec *pspec)
-{
-    XfdesktopAppMenuItem *app_menu_item = XFDESKTOP_APP_MENU_ITEM(object);
-
-    switch(prop_id) {
-        case PROP_ITEM:
-            if(app_menu_item->item) {
-                g_signal_handlers_disconnect_by_func(G_OBJECT(app_menu_item->item),
-                     G_CALLBACK(xfdesktop_app_menu_item_changed), app_menu_item);
-                g_object_unref(G_OBJECT(app_menu_item->item));
-            }
-            app_menu_item->item = g_value_dup_object(value);
-            g_signal_connect_swapped(G_OBJECT(app_menu_item->item), "changed",
-                                     G_CALLBACK(xfdesktop_app_menu_item_changed), app_menu_item);
-            xfdesktop_app_menu_item_changed(app_menu_item);
-            break;
-
-        default:
-            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-            break;
-    }
-}
-
-static void
-xfdesktop_app_menu_item_get_property(GObject *object,
-                                     guint prop_id,
-                                     GValue *value,
-                                     GParamSpec *pspec)
-{
-    XfdesktopAppMenuItem *app_menu_item = XFDESKTOP_APP_MENU_ITEM(object);
-
-    switch(prop_id) {
-        case PROP_ITEM:
-            g_value_set_object(value, app_menu_item->item);
-            break;
-
-        default:
-            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-            break;
-    }
-}
-
-static void
-xfdesktop_app_menu_item_finalize(GObject *object)
-{
-    XfdesktopAppMenuItem *app_menu_item = XFDESKTOP_APP_MENU_ITEM(object);
-
-    g_return_if_fail(app_menu_item != NULL);
-
-    if(app_menu_item->item) {
-        g_signal_handlers_disconnect_by_func(G_OBJECT(app_menu_item->item),
-                     G_CALLBACK(xfdesktop_app_menu_item_changed), app_menu_item);
-        g_object_unref(G_OBJECT(app_menu_item->item));
-    }
-
-    G_OBJECT_CLASS(xfdesktop_app_menu_item_parent_class)->finalize(object);
-}
-
-static void
-xfdesktop_app_menu_item_set_icon(XfdesktopAppMenuItem *app_menu_item)
-{
-    const gchar *icon_name;
-    gint w, h, size;
-    GdkPixbuf *pixbuf = NULL;
-    GtkWidget *image = NULL;
-    GtkIconTheme *icon_theme;
-    gchar *p, *name = NULL;
-    gchar *filename;
-
-    icon_name = garcon_menu_item_get_icon_name(app_menu_item->item);
-    icon_theme = gtk_icon_theme_get_default();
-
-    if(G_LIKELY(icon_name)) {
-        gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &w, &h);
-        size = MIN(w, h);
-
-        if(gtk_icon_theme_has_icon(icon_theme, icon_name))
-            image = gtk_image_new_from_icon_name(icon_name, GTK_ICON_SIZE_MENU);
-        else {
-            if(g_path_is_absolute(icon_name)) {
-                pixbuf = gdk_pixbuf_new_from_file_at_scale(icon_name, w, h, TRUE, NULL);
-            } else {
-                /* try to lookup names like application.png in the theme */
-                p = strrchr(icon_name, '.');
-                if(p) {
-                    name = g_strndup(icon_name, p - icon_name);
-                    pixbuf = gtk_icon_theme_load_icon(icon_theme, name, size, 0, NULL);
-                    g_free(name);
-                    name = NULL;
-                }
-
-                /* maybe they point to a file in the pixbufs folder */
-                if(G_UNLIKELY(pixbuf == NULL)) {
-                    filename = g_build_filename("pixmaps", icon_name, NULL);
-                    name = xfce_resource_lookup(XFCE_RESOURCE_DATA, filename);
-                    g_free(filename);
-                }
-
-                if(name) {
-                    pixbuf = gdk_pixbuf_new_from_file_at_scale(name, w, h, TRUE, NULL);
-                    g_free(name);
-                }
-            }
-
-            /* Turn the pixbuf into a gtk_image */
-            if(G_LIKELY(pixbuf)) {
-                /* scale the pixbuf down if it needs it */
-                GdkPixbuf *tmp = exo_gdk_pixbuf_scale_down(pixbuf, TRUE, w, h);
-                g_object_unref(pixbuf);
-                pixbuf = tmp;
-
-                image = gtk_image_new_from_pixbuf(pixbuf);
-                g_object_unref(G_OBJECT(pixbuf));
-            }
-        }
-    }
-
-    if(!GTK_IS_IMAGE(image))
-        image = gtk_image_new();
-
-    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(app_menu_item), image);
-}
-
-static void
-xfdesktop_app_menu_item_changed(XfdesktopAppMenuItem *app_menu_item)
-{
-    const gchar *label;
-
-    g_return_if_fail(XFCE_IS_APP_MENU_ITEM(app_menu_item));
-    g_return_if_fail(GARCON_IS_MENU_ITEM(app_menu_item->item));
-
-    if(global_show_icons)
-        xfdesktop_app_menu_item_set_icon(app_menu_item);
-
-    label = garcon_menu_item_get_name(app_menu_item->item);
-    if(G_UNLIKELY(label == NULL))
-        label = "";
-
-    gtk_menu_item_set_label(GTK_MENU_ITEM(app_menu_item), label);
-}
-
-static void
-xfdesktop_app_menu_item_append_quote(GString *string,
-                                     const gchar *unquoted)
-{
-  gchar *quoted;
-
-  quoted = g_shell_quote(unquoted);
-  g_string_append(string, quoted);
-  g_free(quoted);
-}
-
-static gchar *
-xfdesktop_app_menu_item_command(XfdesktopAppMenuItem *app_menu_item)
-{
-    GString *newstr;
-    const gchar *p;
-    const gchar *command;
-    const gchar *var;
-    gchar *uri, *filename;
-
-    command = garcon_menu_item_get_command(app_menu_item->item);
-    if(command == NULL)
-        return NULL;
-
-    newstr = g_string_sized_new(100);
-
-    for(p = command; *p; ++p) {
-        if('%' == *p) {
-            ++p;
-            switch(*p) {
-                /* we don't care about these since we aren't passing filenames */
-                case 'f':
-                case 'F':
-                case 'u':
-                case 'U':
-                /* these are all deprecated */
-                case 'd':
-                case 'D':
-                case 'n':
-                case 'N':
-                case 'v':
-                case 'm':
-                    break;
-
-                case 'i':
-                    var = garcon_menu_item_get_icon_name(app_menu_item->item);
-                    if(G_LIKELY(var)) {
-                        g_string_append(newstr, "--icon ");
-                        xfdesktop_app_menu_item_append_quote(newstr, var);
-                    }
-                    break;
-
-                case 'c':
-                    var = garcon_menu_item_get_name(app_menu_item->item);
-                    if(G_LIKELY(var))
-                        xfdesktop_app_menu_item_append_quote(newstr, var);
-                    break;
-
-                case 'k':
-                    uri = garcon_menu_item_get_uri(app_menu_item->item);
-                    if(G_LIKELY(uri)) {
-                        filename = g_filename_from_uri(uri, NULL, NULL);
-                        xfdesktop_app_menu_item_append_quote(newstr, filename);
-                        g_free(filename);
-                    }
-                    g_free(uri);
-                    break;
-
-                case '%':
-                    g_string_append_c(newstr, '%');
-                    break;
-
-                default:
-                    g_warning("Invalid field code in Exec line: %%%c", *p);
-                    break;
-            }
-        } else
-            g_string_append_c(newstr, *p);
-    }
-
-    return g_string_free(newstr, FALSE);
-}
-
-static gboolean
-xfdesktop_app_menu_item_edit_launcher(XfdesktopAppMenuItem *app_menu_item)
-{
-    GFile *file;
-    gchar *uri, *cmd;
-    GError *error = NULL;
-    gboolean ret = FALSE;
-
-    file = garcon_menu_item_get_file(app_menu_item->item);
-
-    if(file) {
-        uri = g_file_get_uri(file);
-        cmd = g_strdup_printf("exo-desktop-item-edit \"%s\"", uri);
-
-        if(!xfce_spawn_command_line_on_screen(NULL, cmd, FALSE, FALSE, &error)) {
-            xfce_message_dialog(NULL, _("Launch Error"),
-                                GTK_STOCK_DIALOG_ERROR,
-                                _("Unable to launch \"exo-desktop-item-edit\", which is required to create and edit launchers and links on the desktop."),
-                                error->message, GTK_STOCK_CLOSE,
-                                GTK_RESPONSE_ACCEPT, NULL);
-            g_clear_error(&error);
-        } else {
-            ret = TRUE;
-        }
-
-        g_free(uri);
-        g_free(cmd);
-        g_object_unref(file);
-    }
-
-    return ret;
-}
-
-static void
-xfdesktop_app_menu_item_activate(XfdesktopAppMenuItem *app_menu_item)
-{
-   XfconfChannel *channel;
-   gchar *command;
-   GdkEventButton *evt;
-   guint button;
-   gboolean right_click_edits;
-   GError *error = NULL;
-
-   TRACE("entering");
-
-   command = xfdesktop_app_menu_item_command(app_menu_item);
-   if(command == NULL)
-       return;
-
-   evt = (GdkEventButton *)gtk_get_current_event();
-
-   channel = xfconf_channel_get(XFDESKTOP_CHANNEL);
-   right_click_edits = xfconf_channel_get_bool(channel,
-                                               "/desktop-icons/right-click-edits-menu",
-                                               TRUE);
-
-   /* See if we're trying to edit the launcher */
-   if(evt && GDK_BUTTON_RELEASE == evt->type) {
-       button = evt->button;
-
-       /* right click can optionally edit launchers. Shift + left always will */
-       if((button == 3 && right_click_edits) || (button == 1 && (evt->state & GDK_SHIFT_MASK))) {
-            if(xfdesktop_app_menu_item_edit_launcher(app_menu_item)) {
-                gdk_event_free((GdkEvent*)evt);
-                return;
-            }
-       }
-   }
-
-   if(!xfce_spawn_command_line_on_screen(gtk_widget_get_screen(GTK_WIDGET(app_menu_item)),
-                                         command,
-                                         garcon_menu_item_requires_terminal(app_menu_item->item),
-                                         garcon_menu_item_supports_startup_notification(app_menu_item->item),
-                                         &error)) {
-        g_warning("XfdesktopAppMenuItem: unable to spawn %s: %s",
-                 command, error->message);
-        g_clear_error(&error);
-    }
-
-    gdk_event_free((GdkEvent*)evt);
-}
-
-GtkWidget *
-xfdesktop_app_menu_item_new(GarconMenuItem *item)
-{
-    g_return_val_if_fail(GARCON_IS_MENU_ITEM(item), NULL);
-
-    return g_object_new(XFDESKTOP_TYPE_APP_MENU_ITEM,
-                        "item", item, NULL);
-}
-
-
-void
-xfdesktop_app_menu_item_set_show_icon(gboolean show_icon)
-{
-    global_show_icons = show_icon;
-}
diff --git a/src/xfdesktop-app-menu-item.h b/src/xfdesktop-app-menu-item.h
deleted file mode 100644
index 67ae217..0000000
--- a/src/xfdesktop-app-menu-item.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * A GtkImageMenuItem subclass that handles menu items that are
- * intended to represent launchable applications.
- *
- * Copyright (c) 2004,2009 Brian Tarricone <bjt23 at cornell.edu>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
- */
-
-#ifndef __XFDESKTOP_APP_MENU_ITEM_H__
-#define __XFDESKTOP_APP_MENU_ITEM_H__
-
-#include <glib-object.h>
-#include <garcon/garcon.h>
-
-G_BEGIN_DECLS
-
-#define XFDESKTOP_TYPE_APP_MENU_ITEM             (xfdesktop_app_menu_item_get_type())
-#define XFDESKTOP_APP_MENU_ITEM(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), XFDESKTOP_TYPE_APP_MENU_ITEM, XfdesktopAppMenuItem))
-#define XFDESKTOP_APP_MENU_ITEM_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), XFDESKTOP_TYPE_APP_MENU_ITEM, XfdesktopAppMenuItemClass))
-#define XFCE_IS_APP_MENU_ITEM(obj)               (G_TYPE_CHECK_INSTANCE_TYPE((obj), XFDESKTOP_TYPE_APP_MENU_ITEM))
-#define XFCE_IS_APP_MENU_ITEM_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE((klass), XFDESKTOP_TYPE_APP_MENU_ITEM))
-#define XFDESKTOP_APP_MENU_ITEM_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), XFDESKTOP_TYPE_APP_MENU_ITEM, XfdesktopAppMenuItemClass))
-
-typedef struct _XfdesktopAppMenuItem       XfdesktopAppMenuItem;
-
-GType      xfdesktop_app_menu_item_get_type      (void) G_GNUC_CONST;
-
-GtkWidget *xfdesktop_app_menu_item_new           (GarconMenuItem *item);
-
-void       xfdesktop_app_menu_item_set_show_icon (gboolean        show_icon);
-
-G_END_DECLS
-
-#endif /* !def __XFDESKTOP_APP_MENU_ITEM_H__ */
diff --git a/src/xfdesktop-application.c b/src/xfdesktop-application.c
index 025cba0..226fca8 100644
--- a/src/xfdesktop-application.c
+++ b/src/xfdesktop-application.c
@@ -380,8 +380,6 @@ reload_idle_cb(gpointer data)
             xfce_desktop_refresh(XFCE_DESKTOP(app->desktops[i]), FALSE);
     }
 
-    menu_reload();
-
     g_application_release(G_APPLICATION(app));
 
     return FALSE;

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


More information about the Xfce4-commits mailing list