[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