Author: kelnos
Date: 2007-10-20 21:30:46 +0000 (Sat, 20 Oct 2007)
New Revision: 26165
Modified:
xfdesktop/trunk/src/menu.c
xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
xfdesktop/trunk/src/xfdesktop-icon-view.c
xfdesktop/trunk/src/xfdesktop-icon.c
xfdesktop/trunk/src/xfdesktop-icon.h
xfdesktop/trunk/src/xfdesktop-special-file-icon.c
xfdesktop/trunk/src/xfdesktop-volume-icon.c
xfdesktop/trunk/src/xfdesktop-window-icon-manager.c
xfdesktop/trunk/src/xfdesktop-window-icon.c
Log:
redo menu system, part 2. the desktop context menus with file icons and
window icons is now a lot more usable. for both window icons and file icons,
when you right click on an icon, you get the icon's context menu, with
the xfce root menu in a submenu. for file icons, if you right click on
the desktop, you get the desktop's context menu (with 'create launcher' etc.)
with the xfce root menu as a submenu.
Modified: xfdesktop/trunk/src/menu.c
===================================================================
--- xfdesktop/trunk/src/menu.c 2007-10-20 20:36:24 UTC (rev 26164)
+++ xfdesktop/trunk/src/menu.c 2007-10-20 21:30:46 UTC (rev 26165)
@@ -81,6 +81,8 @@
GtkWidget *desktop_menu_widget;
GList *menu_children;
+ TRACE("ENTERING");
+
if(!desktop_menu)
return;
@@ -91,17 +93,25 @@
* to a submenu */
menu_children = gtk_container_get_children(GTK_CONTAINER(menu));
if(menu_children) {
- GtkWidget *mi;
-
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);
- mi = gtk_menu_item_new_with_label(_("Applications"));
+ if(gtk_icon_theme_has_icon(itheme, "applications-accessories")) {
+ img = gtk_image_new_from_icon_name("applications-accessories",
+ 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);
@@ -144,6 +154,7 @@
menu_attach(XfceDesktop *desktop)
{
#if USE_DESKTOP_MENU
+ DBG("attached default menu");
g_signal_connect_after(G_OBJECT(desktop), "populate-root-menu",
G_CALLBACK(menu_populate), NULL);
#endif
Modified: xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-file-icon-manager.c 2007-10-20 20:36:24 UTC
(rev 26164)
+++ xfdesktop/trunk/src/xfdesktop-file-icon-manager.c 2007-10-20 21:30:46 UTC
(rev 26165)
@@ -69,6 +69,7 @@
#include "xfdesktop-dbus-bindings-trash.h"
#include "xfdesktop-dbus-bindings-filemanager.h"
#include "xfdesktop-file-icon-manager.h"
+#include "xfce-desktop.h"
#include <libxfce4util/libxfce4util.h>
#include <libxfcegui4/libxfcegui4.h>
@@ -857,6 +858,24 @@
}
static void
+xfdesktop_file_icon_menu_open_desktop(GtkWidget *widget,
+ gpointer user_data)
+{
+ XfdesktopFileIconManager *fmanager =
XFDESKTOP_FILE_ICON_MANAGER(user_data);
+ XfdesktopFileIcon *icon = fmanager->priv->desktop_icon;
+ const ThunarVfsInfo *info;
+ GtkWidget *toplevel;
+
+ info = xfdesktop_file_icon_peek_info(icon);
+ g_return_if_fail(info);
+
+ toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
+
+ xfdesktop_file_utils_open_folder(info, fmanager->priv->gscreen,
+ GTK_WINDOW(toplevel));
+}
+
+static void
xfdesktop_file_icon_manager_display_chooser_error(XfdesktopFileIconManager
*fmanager)
{
GtkWidget *toplevel =
gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
@@ -1064,22 +1083,24 @@
}
static gboolean
-xfdesktop_file_icon_menu_deactivate_idled(gpointer user_data)
+xfdesktop_file_icon_menu_free_icon_list_idled(gpointer user_data)
{
- GList *icon_list = g_object_get_data(G_OBJECT(user_data),
- "--xfdesktop-icon-list");
+ GList *icon_list = user_data;
- gtk_widget_destroy(GTK_WIDGET(user_data));
+ g_list_foreach(icon_list, (GFunc)g_object_unref, NULL);
+ g_list_free(icon_list);
- if(icon_list) {
- g_list_foreach(icon_list, (GFunc)g_object_unref, NULL);
- g_list_free(icon_list);
- }
-
return FALSE;
}
static void
+xfdesktop_file_icon_menu_free_icon_list(GtkMenu *menu,
+ gpointer user_data)
+{
+ g_idle_add(xfdesktop_file_icon_menu_free_icon_list_idled, user_data);
+}
+
+static void
xfdesktop_file_icon_create_directory_error(ThunarVfsJob *job,
GError *error,
gpointer user_data)
@@ -1535,15 +1556,16 @@
}
static void
-xfdesktop_file_icon_menu_popup(XfdesktopIcon *icon,
- gpointer user_data)
+xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
+ GtkMenuShell *menu,
+ gpointer user_data)
{
- XfdesktopFileIcon *file_icon = XFDESKTOP_FILE_ICON(icon);
XfdesktopFileIconManager *fmanager =
XFDESKTOP_FILE_ICON_MANAGER(user_data);
- const ThunarVfsInfo *info = xfdesktop_file_icon_peek_info(file_icon);
- ThunarVfsMimeInfo *mime_info = info ? info->mime_info : NULL;
+ XfdesktopFileIcon *file_icon = NULL;
+ const ThunarVfsInfo *info = NULL;
+ ThunarVfsMimeInfo *mime_info = NULL;
GList *selected, *mime_apps, *l, *mime_actions = NULL;
- GtkWidget *menu, *mi, *img, *menu2, *menu3;
+ GtkWidget *mi, *img, *tmpl_menu;
gboolean multi_sel, have_templates = FALSE, got_custom_menu = FALSE;
gint w = 0, h = 0;
GdkPixbuf *pix;
@@ -1554,31 +1576,35 @@
GtkWidget *toplevel =
gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
#endif
+ TRACE("ENTERING");
+
selected =
xfdesktop_icon_view_get_selected_items(fmanager->priv->icon_view);
- g_return_if_fail(selected);
+ if(selected)
+ file_icon = selected->data;
+ else {
+ /* assume click on the desktop itself */
+ selected = g_list_append(selected, fmanager->priv->desktop_icon);
+ file_icon = fmanager->priv->desktop_icon;
+ }
+ info = xfdesktop_file_icon_peek_info(file_icon);
+ if(info)
+ mime_info = info->mime_info;
+
multi_sel = (g_list_length(selected) > 1);
gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &w, &h);
if(!multi_sel) {
- menu = xfdesktop_icon_get_popup_menu(XFDESKTOP_ICON(selected->data));
- if(menu)
- got_custom_menu = TRUE;
+ got_custom_menu =
xfdesktop_icon_populate_context_menu(XFDESKTOP_ICON(selected->data),
+
GTK_WIDGET(menu));
}
- if(!got_custom_menu)
- menu = gtk_menu_new();
-
- gtk_menu_set_screen(GTK_MENU(menu), fmanager->priv->gscreen);
- gtk_widget_show(menu);
-
- g_signal_connect_swapped(G_OBJECT(menu), "deactivate",
- G_CALLBACK(g_idle_add),
- xfdesktop_file_icon_menu_deactivate_idled);
-
/* make sure icons don't get destroyed while menu is open */
g_list_foreach(selected, (GFunc)g_object_ref, NULL);
g_object_set_data(G_OBJECT(menu), "--xfdesktop-icon-list", selected);
+ g_signal_connect(G_OBJECT(menu), "deactivate",
+ G_CALLBACK(xfdesktop_file_icon_menu_free_icon_list),
+ selected);
if(!got_custom_menu) {
if(multi_sel) {
@@ -1599,17 +1625,116 @@
if(info->type == THUNAR_VFS_FILE_TYPE_DIRECTORY) {
img = gtk_image_new_from_stock(GTK_STOCK_OPEN,
GTK_ICON_SIZE_MENU);
gtk_widget_show(img);
- mi = gtk_image_menu_item_new_with_mnemonic(_("_Open"));
+ if(file_icon == fmanager->priv->desktop_icon)
+ mi = gtk_image_menu_item_new_with_mnemonic(_("_Open in New
Window"));
+ else
+ mi = gtk_image_menu_item_new_with_mnemonic(_("_Open"));
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);
g_signal_connect(G_OBJECT(mi), "activate",
-
G_CALLBACK(xfdesktop_file_icon_menu_open_folder),
+ file_icon == fmanager->priv->desktop_icon
+ ?
G_CALLBACK(xfdesktop_file_icon_menu_open_desktop)
+ :
G_CALLBACK(xfdesktop_file_icon_menu_open_folder),
fmanager);
mi = gtk_separator_menu_item_new();
gtk_widget_show(mi);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+
+ if(file_icon == fmanager->priv->desktop_icon) {
+ mi = gtk_image_menu_item_new_with_mnemonic(_("Create
_Launcher..."));
+ minfo =
thunar_vfs_mime_database_get_info(thunar_mime_database,
+
"application/x-desktop");
+ if(minfo) {
+ const gchar *icon_name =
thunar_vfs_mime_info_lookup_icon_name(minfo,
+
gtk_icon_theme_get_default());
+ pix = xfce_themed_icon_load(icon_name, w);
+ if(pix) {
+ img = gtk_image_new_from_pixbuf(pix);
+ gtk_widget_show(img);
+ g_object_unref(G_OBJECT(pix));
+
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
+ }
+ }
+ g_object_set_data(G_OBJECT(mi), "xfdesktop-launcher-type",
"Application");
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ g_signal_connect(G_OBJECT(mi), "activate",
+
G_CALLBACK(xfdesktop_file_icon_menu_create_launcher),
+ fmanager);
+
+ mi = gtk_image_menu_item_new_with_mnemonic(_("Create _URL
Link..."));
+ pix = xfce_themed_icon_load("gnome-fs-bookmark", w);
+ if(!pix)
+ pix = xfce_themed_icon_load("emblem-favorite", w);
+ if(pix) {
+ img = gtk_image_new_from_pixbuf(pix);
+ gtk_widget_show(img);
+ g_object_unref(G_OBJECT(pix));
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi),
img);
+ }
+ g_object_set_data(G_OBJECT(mi), "xfdesktop-launcher-type",
"Link");
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ g_signal_connect(G_OBJECT(mi), "activate",
+
G_CALLBACK(xfdesktop_file_icon_menu_create_launcher),
+ fmanager);
+
+ mi = gtk_image_menu_item_new_with_mnemonic(_("Create
_Folder..."));
+ minfo =
thunar_vfs_mime_database_get_info(thunar_mime_database,
+
"inode/directory");
+ if(minfo) {
+ const gchar *icon_name =
thunar_vfs_mime_info_lookup_icon_name(minfo,
+
gtk_icon_theme_get_default());
+ pix = xfce_themed_icon_load(icon_name, w);
+ if(pix) {
+ img = gtk_image_new_from_pixbuf(pix);
+ gtk_widget_show(img);
+ g_object_unref(G_OBJECT(pix));
+
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);
+ g_signal_connect(G_OBJECT(mi), "activate",
+
G_CALLBACK(xfdesktop_file_icon_menu_create_folder),
+ fmanager);
+
+ mi = gtk_menu_item_new_with_mnemonic("Create From
_Template");
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+
+ tmpl_menu = gtk_menu_new();
+ gtk_widget_show(tmpl_menu);
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), tmpl_menu);
+
+ templates_path_str = g_build_filename(xfce_get_homedir(),
+ "Templates",
+ NULL);
+ templates_path = thunar_vfs_path_new(templates_path_str,
NULL);
+ g_free(templates_path_str);
+ if(templates_path) {
+ have_templates =
xfdesktop_file_icon_menu_fill_template_menu(tmpl_menu,
+
templates_path,
+
fmanager);
+ thunar_vfs_path_unref(templates_path);
+ }
+
+ img = gtk_image_new_from_stock(GTK_STOCK_NEW,
GTK_ICON_SIZE_MENU);
+ gtk_widget_show(img);
+ mi = gtk_image_menu_item_new_with_mnemonic(_("_Empty
File"));
+ gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi),
img);
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(tmpl_menu), mi);
+ g_signal_connect(G_OBJECT(mi), "activate",
+
G_CALLBACK(xfdesktop_file_icon_template_item_activated),
+ fmanager);
+
+ mi = gtk_separator_menu_item_new();
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ }
} else {
if(info->flags & THUNAR_VFS_FILE_FLAGS_EXECUTABLE) {
img = gtk_image_new_from_stock(GTK_STOCK_OPEN,
GTK_ICON_SIZE_MENU);
@@ -1681,7 +1806,7 @@
gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi),
mime_apps_menu);
} else
- mime_apps_menu = menu;
+ mime_apps_menu = (GtkWidget *)menu;
for(l = mime_apps->next; l; l = l->next) {
mime_handler = THUNAR_VFS_MIME_HANDLER(l->data);
@@ -1772,49 +1897,69 @@
}
#endif
- mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, NULL);
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
- g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_copy), fmanager);
-
- mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT, NULL);
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
- if(multi_sel || xfdesktop_file_icon_can_delete_file(file_icon)) {
- g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_cut),
- fmanager);
- } else
+ if(file_icon == fmanager->priv->desktop_icon) {
+ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, NULL);
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ /* FIXME: implement */
gtk_widget_set_sensitive(mi, FALSE);
-
- mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, NULL);
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
- if(multi_sel || xfdesktop_file_icon_can_delete_file(file_icon)) {
+ } else {
+ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY, NULL);
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_delete),
+ G_CALLBACK(xfdesktop_file_icon_menu_copy),
fmanager);
- } else
- gtk_widget_set_sensitive(mi, FALSE);
+
+ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT, NULL);
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ if(multi_sel || xfdesktop_file_icon_can_delete_file(file_icon)) {
+ g_signal_connect(G_OBJECT(mi), "activate",
+ G_CALLBACK(xfdesktop_file_icon_menu_cut),
+ fmanager);
+ } else
+ gtk_widget_set_sensitive(mi, FALSE);
+
+ mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, NULL);
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ if(multi_sel || xfdesktop_file_icon_can_delete_file(file_icon)) {
+ g_signal_connect(G_OBJECT(mi), "activate",
+ G_CALLBACK(xfdesktop_file_icon_menu_delete),
+ fmanager);
+ } else
+ gtk_widget_set_sensitive(mi, FALSE);
+
+ mi = gtk_separator_menu_item_new();
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+
+ mi = gtk_image_menu_item_new_with_mnemonic(_("_Rename..."));
+ gtk_widget_show(mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ if(!multi_sel && xfdesktop_file_icon_can_rename_file(file_icon)) {
+ g_signal_connect(G_OBJECT(mi), "activate",
+ G_CALLBACK(xfdesktop_file_icon_menu_rename),
+ fmanager);
+ } else
+ gtk_widget_set_sensitive(mi, FALSE);
+ }
mi = gtk_separator_menu_item_new();
gtk_widget_show(mi);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
- mi = gtk_image_menu_item_new_with_mnemonic(_("_Rename..."));
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
- if(!multi_sel && xfdesktop_file_icon_can_rename_file(file_icon)) {
+ if(file_icon == fmanager->priv->desktop_icon) {
+ img = gtk_image_new_from_stock(GTK_STOCK_PREFERENCES,
GTK_ICON_SIZE_MENU);
+ gtk_widget_show(img);
+ mi = gtk_image_menu_item_new_with_mnemonic(_("Desktop
_Settings..."));
+ 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);
g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_rename),
- fmanager);
- } else
- gtk_widget_set_sensitive(mi, FALSE);
-
- mi = gtk_separator_menu_item_new();
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ G_CALLBACK(xfdesktop_mcs_settings_launch),
fmanager);
+ }
img = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES,
GTK_ICON_SIZE_MENU);
gtk_widget_show(img);
@@ -1826,175 +1971,13 @@
gtk_widget_set_sensitive(mi, FALSE);
else {
g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_properties),
+ file_icon == fmanager->priv->desktop_icon
+ ?
G_CALLBACK(xfdesktop_file_icon_manager_desktop_properties)
+ : G_CALLBACK(xfdesktop_file_icon_menu_properties),
fmanager);
}
}
- mi = gtk_separator_menu_item_new();
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
-
- mi = gtk_image_menu_item_new_with_mnemonic(_("Des_ktop"));
- pix = xfce_themed_icon_load("user-desktop", w);
- if(!pix)
- pix = xfce_themed_icon_load("gnome-fs-desktop", w);
- if(!pix)
- pix = xfce_themed_icon_load("xfce4-backdrop", w);
- if(pix) {
- img = gtk_image_new_from_pixbuf(pix);
- gtk_widget_show(img);
- g_object_unref(G_OBJECT(pix));
- 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);
-
- menu2 = gtk_menu_new();
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), menu2);
- gtk_widget_show(menu2);
-
- mi = gtk_image_menu_item_new_with_mnemonic(_("Create _Launcher..."));
- minfo = thunar_vfs_mime_database_get_info(thunar_mime_database,
- "application/x-desktop");
- if(minfo) {
- const gchar *icon_name = thunar_vfs_mime_info_lookup_icon_name(minfo,
-
gtk_icon_theme_get_default());
- pix = xfce_themed_icon_load(icon_name, w);
- if(pix) {
- img = gtk_image_new_from_pixbuf(pix);
- gtk_widget_show(img);
- g_object_unref(G_OBJECT(pix));
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
- }
- }
- g_object_set_data(G_OBJECT(mi), "xfdesktop-launcher-type", "Application");
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
- g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_create_launcher),
- fmanager);
-
- mi = gtk_image_menu_item_new_with_mnemonic(_("Create _URL Link..."));
- pix = xfce_themed_icon_load("gnome-fs-bookmark", w);
- if(!pix)
- pix = xfce_themed_icon_load("emblem-favorite", w);
- if(pix) {
- img = gtk_image_new_from_pixbuf(pix);
- gtk_widget_show(img);
- g_object_unref(G_OBJECT(pix));
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
- }
- g_object_set_data(G_OBJECT(mi), "xfdesktop-launcher-type", "Link");
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
- g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_create_launcher),
- fmanager);
-
- mi = gtk_image_menu_item_new_with_mnemonic(_("Create _Folder..."));
- minfo = thunar_vfs_mime_database_get_info(thunar_mime_database,
- "inode/directory");
- if(minfo) {
- const gchar *icon_name = thunar_vfs_mime_info_lookup_icon_name(minfo,
-
gtk_icon_theme_get_default());
- pix = xfce_themed_icon_load(icon_name, w);
- if(pix) {
- img = gtk_image_new_from_pixbuf(pix);
- gtk_widget_show(img);
- g_object_unref(G_OBJECT(pix));
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
- }
- }
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
- g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_menu_create_folder),
- fmanager);
-
- mi = gtk_menu_item_new_with_mnemonic("Create From _Template");
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
-
- menu3 = gtk_menu_new();
- gtk_widget_show(menu3);
- gtk_menu_item_set_submenu(GTK_MENU_ITEM(mi), menu3);
-
- templates_path_str = g_build_filename(xfce_get_homedir(),
- "Templates",
- NULL);
- templates_path = thunar_vfs_path_new(templates_path_str, NULL);
- g_free(templates_path_str);
- if(templates_path) {
- have_templates = xfdesktop_file_icon_menu_fill_template_menu(menu3,
-
templates_path,
- fmanager);
- thunar_vfs_path_unref(templates_path);
- }
-
- img = gtk_image_new_from_stock(GTK_STOCK_NEW, GTK_ICON_SIZE_MENU);
- gtk_widget_show(img);
- mi = gtk_image_menu_item_new_with_mnemonic(_("_Empty File"));
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu3), mi);
- g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_file_icon_template_item_activated),
- fmanager);
-
- mi = gtk_separator_menu_item_new();
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
-
- mi = gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE, NULL);
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
- /* FIXME: implement */
- gtk_widget_set_sensitive(mi, FALSE);
-
- mi = gtk_separator_menu_item_new();
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
-
-#ifdef HAVE_THUNARX
- for(l = fmanager->priv->thunarx_menu_providers; l; l = l->next) {
- ThunarxMenuProvider *provider = THUNARX_MENU_PROVIDER(l->data);
- GList *menu_actions =
thunarx_menu_provider_get_folder_actions(provider,
-
toplevel,
-
THUNARX_FILE_INFO(fmanager->priv->desktop_icon));
- xfdesktop_menu_shell_append_action_list(GTK_MENU_SHELL(menu2),
- menu_actions);
- g_list_foreach(menu_actions, (GFunc)g_object_unref, NULL);
- g_list_free(menu_actions);
- }
-
- mi = gtk_separator_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
- gtk_widget_show(mi);
-#endif
-
- img = gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
- gtk_widget_show(img);
- mi = gtk_image_menu_item_new_with_mnemonic(_("Desktop _Settings..."));
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
- g_signal_connect(G_OBJECT(mi), "activate",
- G_CALLBACK(xfdesktop_mcs_settings_launch), fmanager);
-
- img = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU);
- gtk_widget_show(img);
- mi = gtk_image_menu_item_new_with_mnemonic(_("_Desktop Properties..."));
- gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
- gtk_widget_show(mi);
- gtk_menu_shell_append(GTK_MENU_SHELL(menu2), mi);
- g_signal_connect(G_OBJECT(mi), "activate",
-
G_CALLBACK(xfdesktop_file_icon_manager_desktop_properties),
- fmanager);
-
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0,
- gtk_get_current_event_time());
-
/* don't free |selected|. the menu deactivated handler does that */
}
@@ -2133,8 +2116,6 @@
g_signal_connect(G_OBJECT(icon), "position-changed",
G_CALLBACK(xfdesktop_file_icon_position_changed),
fmanager);
- g_signal_connect(G_OBJECT(icon), "menu-popup",
- G_CALLBACK(xfdesktop_file_icon_menu_popup), fmanager);
xfdesktop_icon_view_add_item(fmanager->priv->icon_view,
XFDESKTOP_ICON(icon));
}
@@ -2751,6 +2732,7 @@
XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(manager);
ThunarVfsInfo *desktop_info;
gint i;
+ GtkWidget *toplevel;
#ifdef HAVE_THUNARX
ThunarxProviderFactory *thunarx_pfac;
#endif
@@ -2759,6 +2741,11 @@
fmanager->priv->icon_view = icon_view;
+ toplevel = gtk_widget_get_toplevel(GTK_WIDGET(icon_view));
+ g_signal_connect(G_OBJECT(toplevel), "populate-root-menu",
+
G_CALLBACK(xfdesktop_file_icon_manager_populate_context_menu),
+ fmanager);
+
fmanager->priv->gscreen = gtk_widget_get_screen(GTK_WIDGET(icon_view));
/* FIXME: remove for 4.4.0 */
@@ -2851,6 +2838,7 @@
{
XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(manager);
gint i;
+ GtkWidget *toplevel;
g_return_if_fail(fmanager->priv->inited);
@@ -2888,6 +2876,11 @@
fmanager->priv->active_trash_calls = NULL;
}
+ toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
+ g_signal_handlers_disconnect_by_func(G_OBJECT(toplevel),
+
G_CALLBACK(xfdesktop_file_icon_manager_populate_context_menu),
+ fmanager);
+
if(fmanager->priv->save_icons_id) {
g_source_remove(fmanager->priv->save_icons_id);
fmanager->priv->save_icons_id = 0;
Modified: xfdesktop/trunk/src/xfdesktop-icon-view.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon-view.c 2007-10-20 20:36:24 UTC (rev
26164)
+++ xfdesktop/trunk/src/xfdesktop-icon-view.c 2007-10-20 21:30:46 UTC (rev
26165)
@@ -544,8 +544,9 @@
/* avoid repaint delay */
while(gtk_events_pending())
gtk_main_iteration();
- /* if we're a right click, emit signal on the icon */
- xfdesktop_icon_menu_popup(icon);
+ /* XfceDesktop will handle signalling the icon view manager
+ * to show the context menu */
+ return FALSE;
}
return TRUE;
Modified: xfdesktop/trunk/src/xfdesktop-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon.c 2007-10-20 20:36:24 UTC (rev
26164)
+++ xfdesktop/trunk/src/xfdesktop-icon.c 2007-10-20 21:30:46 UTC (rev
26165)
@@ -45,7 +45,6 @@
SIG_POS_CHANGED,
SIG_SELECTED,
SIG_ACTIVATED,
- SIG_MENU_POPUP,
SIG_N_SIGNALS,
};
@@ -108,15 +107,6 @@
NULL,
xfdesktop_marshal_BOOLEAN__VOID,
G_TYPE_BOOLEAN, 0);
-
- __signals[SIG_MENU_POPUP] = g_signal_new("menu-popup",
- XFDESKTOP_TYPE_ICON,
- G_SIGNAL_RUN_LAST,
-
G_STRUCT_OFFSET(XfdesktopIconClass,
- menu_popup),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
}
static void
@@ -269,19 +259,20 @@
}
/*< optional >*/
-GtkWidget *
-xfdesktop_icon_get_popup_menu(XfdesktopIcon *icon)
+gboolean
+xfdesktop_icon_populate_context_menu(XfdesktopIcon *icon,
+ GtkWidget *menu)
{
XfdesktopIconClass *klass;
- g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), NULL);
+ g_return_val_if_fail(XFDESKTOP_IS_ICON(icon), FALSE);
klass = XFDESKTOP_ICON_GET_CLASS(icon);
- if(!klass->get_popup_menu)
- return NULL;
+ if(!klass->populate_context_menu)
+ return FALSE;
- return klass->get_popup_menu(icon);
+ return klass->populate_context_menu(icon, menu);
}
GtkWidget *
@@ -333,10 +324,3 @@
return ret;
}
-
-void
-xfdesktop_icon_menu_popup(XfdesktopIcon *icon)
-{
- g_return_if_fail(XFDESKTOP_IS_ICON(icon));
- g_signal_emit(G_OBJECT(icon), __signals[SIG_MENU_POPUP], 0, NULL);
-}
Modified: xfdesktop/trunk/src/xfdesktop-icon.h
===================================================================
--- xfdesktop/trunk/src/xfdesktop-icon.h 2007-10-20 20:36:24 UTC (rev
26164)
+++ xfdesktop/trunk/src/xfdesktop-icon.h 2007-10-20 21:30:46 UTC (rev
26165)
@@ -61,7 +61,6 @@
* with return values are (for some unknown reason) not allowed to be
* G_SIGNAL_RUN_FIRST. go figure. */
gboolean (*activated)(XfdesktopIcon *icon);
- void (*menu_popup)(XfdesktopIcon *icon);
/*< virtual functions >*/
GdkPixbuf *(*peek_pixbuf)(XfdesktopIcon *icon, gint size);
@@ -74,12 +73,13 @@
G_CONST_RETURN gchar *(*peek_tooltip)(XfdesktopIcon *icon);
- GtkWidget *(*get_popup_menu)(XfdesktopIcon *icon);
+ gboolean (*populate_context_menu)(XfdesktopIcon *icon,
+ GtkWidget *menu);
};
GType xfdesktop_icon_get_type() G_GNUC_CONST;
-/* virtual function accessors */
+/* xfdesktop virtual function accessors */
GdkPixbuf *xfdesktop_icon_peek_pixbuf(XfdesktopIcon *icon,
gint size);
@@ -105,7 +105,8 @@
XfdesktopIcon *src_icon,
GdkDragAction action);
-GtkWidget *xfdesktop_icon_get_popup_menu(XfdesktopIcon *icon);
+gboolean xfdesktop_icon_populate_context_menu(XfdesktopIcon *icon,
+ GtkWidget *menu);
GtkWidget *xfdesktop_icon_peek_icon_view(XfdesktopIcon *icon);
@@ -117,7 +118,6 @@
void xfdesktop_icon_selected(XfdesktopIcon *icon);
gboolean xfdesktop_icon_activated(XfdesktopIcon *icon);
-void xfdesktop_icon_menu_popup(XfdesktopIcon *icon);
G_END_DECLS
Modified: xfdesktop/trunk/src/xfdesktop-special-file-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-special-file-icon.c 2007-10-20 20:36:24 UTC
(rev 26164)
+++ xfdesktop/trunk/src/xfdesktop-special-file-icon.c 2007-10-20 21:30:46 UTC
(rev 26165)
@@ -77,7 +77,8 @@
static gboolean xfdesktop_special_file_icon_do_drop_dest(XfdesktopIcon *icon,
XfdesktopIcon
*src_icon,
GdkDragAction action);
-static GtkWidget *xfdesktop_special_file_icon_get_popup_menu(XfdesktopIcon
*icon);
+static gboolean
xfdesktop_special_file_icon_populate_context_menu(XfdesktopIcon *icon,
+ GtkWidget
*menu);
static G_CONST_RETURN ThunarVfsInfo
*xfdesktop_special_file_icon_peek_info(XfdesktopFileIcon *icon);
@@ -122,7 +123,7 @@
icon_class->get_allowed_drag_actions =
xfdesktop_special_file_icon_get_allowed_drag_actions;
icon_class->get_allowed_drop_actions =
xfdesktop_special_file_icon_get_allowed_drop_actions;
icon_class->do_drop_dest = xfdesktop_special_file_icon_do_drop_dest;
- icon_class->get_popup_menu = xfdesktop_special_file_icon_get_popup_menu;
+ icon_class->populate_context_menu =
xfdesktop_special_file_icon_populate_context_menu;
file_icon_class->peek_info = xfdesktop_special_file_icon_peek_info;
file_icon_class->can_rename_file = (gboolean (*)(XfdesktopFileIcon
*))gtk_false;
@@ -608,17 +609,16 @@
}
}
-static GtkWidget *
-xfdesktop_special_file_icon_get_popup_menu(XfdesktopIcon *icon)
+static gboolean
+xfdesktop_special_file_icon_populate_context_menu(XfdesktopIcon *icon,
+ GtkWidget *menu)
{
XfdesktopSpecialFileIcon *special_file_icon =
XFDESKTOP_SPECIAL_FILE_ICON(icon);
- GtkWidget *menu, *mi, *img;
+ GtkWidget *mi, *img;
if(XFDESKTOP_SPECIAL_FILE_ICON_TRASH != special_file_icon->priv->type)
- return NULL;
+ return FALSE;
- menu = gtk_menu_new();
-
img = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
gtk_widget_show(img);
mi = gtk_image_menu_item_new_with_mnemonic(_("_Open"));
@@ -642,7 +642,7 @@
} else
gtk_widget_set_sensitive(mi, FALSE);
- return menu;
+ return TRUE;
}
Modified: xfdesktop/trunk/src/xfdesktop-volume-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-volume-icon.c 2007-10-20 20:36:24 UTC (rev
26164)
+++ xfdesktop/trunk/src/xfdesktop-volume-icon.c 2007-10-20 21:30:46 UTC (rev
26165)
@@ -70,7 +70,8 @@
static gboolean xfdesktop_volume_icon_do_drop_dest(XfdesktopIcon *icon,
XfdesktopIcon *src_icon,
GdkDragAction action);
-static GtkWidget *xfdesktop_volume_icon_get_popup_menu(XfdesktopIcon *icon);
+static gboolean xfdesktop_volume_icon_populate_context_menu(XfdesktopIcon
*icon,
+ GtkWidget *menu);
static G_CONST_RETURN ThunarVfsInfo
*xfdesktop_volume_icon_peek_info(XfdesktopFileIcon *icon);
static void xfdesktop_volume_icon_update_info(XfdesktopFileIcon *icon,
@@ -116,7 +117,7 @@
icon_class->get_allowed_drag_actions =
xfdesktop_volume_icon_get_allowed_drag_actions;
icon_class->get_allowed_drop_actions =
xfdesktop_volume_icon_get_allowed_drop_actions;
icon_class->do_drop_dest = xfdesktop_volume_icon_do_drop_dest;
- icon_class->get_popup_menu = xfdesktop_volume_icon_get_popup_menu;
+ icon_class->populate_context_menu =
xfdesktop_volume_icon_populate_context_menu;
icon_class->activated = xfdesktop_volume_icon_activated;
file_icon_class->peek_info = xfdesktop_volume_icon_peek_info;
@@ -529,15 +530,14 @@
xfdesktop_file_properties_dialog_show(NULL, icon, NULL);
}
-static GtkWidget *
-xfdesktop_volume_icon_get_popup_menu(XfdesktopIcon *icon)
+static gboolean
+xfdesktop_volume_icon_populate_context_menu(XfdesktopIcon *icon,
+ GtkWidget *menu)
{
XfdesktopVolumeIcon *volume_icon = XFDESKTOP_VOLUME_ICON(icon);
ThunarVfsVolume *volume = volume_icon->priv->volume;
- GtkWidget *menu, *mi, *img;
+ GtkWidget *mi, *img;
- menu = gtk_menu_new();
-
img = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
gtk_widget_show(img);
mi = gtk_image_menu_item_new_with_mnemonic(_("_Open"));
@@ -602,7 +602,7 @@
icon);
}
- return menu;
+ return TRUE;
}
Modified: xfdesktop/trunk/src/xfdesktop-window-icon-manager.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-window-icon-manager.c 2007-10-20 20:36:24 UTC
(rev 26164)
+++ xfdesktop/trunk/src/xfdesktop-window-icon-manager.c 2007-10-20 21:30:46 UTC
(rev 26165)
@@ -33,6 +33,7 @@
#include "xfdesktop-icon-view.h"
#include "xfdesktop-window-icon.h"
#include "xfdesktop-window-icon-manager.h"
+#include "xfce-desktop.h"
static void xfdesktop_window_icon_manager_set_property(GObject *object,
@@ -490,7 +491,22 @@
g_object_weak_ref(G_OBJECT(window), window_destroyed_cb, wmanager);
}
+static void
+xfdesktop_window_icon_manager_populate_context_menu(XfceDesktop *desktop,
+ GtkMenuShell *menu,
+ gpointer user_data)
+{
+ XfdesktopWindowIconManager *wmanager =
XFDESKTOP_WINDOW_ICON_MANAGER(user_data);
+ XfdesktopWindowIconWorkspace *wiws =
wmanager->priv->icon_workspaces[wmanager->priv->active_ws_num];
+
+ if(!wiws->selected_icon)
+ return;
+
+ xfdesktop_icon_populate_context_menu(XFDESKTOP_ICON(wiws->selected_icon),
+ GTK_WIDGET(menu));
+}
+
/* public api */
XfdesktopIconViewManager *
@@ -512,6 +528,7 @@
XfdesktopWindowIconManager *wmanager =
XFDESKTOP_WINDOW_ICON_MANAGER(manager);
GList *windows, *l;
gint i;
+ GtkWidget *toplevel;
wmanager->priv->icon_view = icon_view;
xfdesktop_icon_view_set_selection_mode(icon_view, GTK_SELECTION_SINGLE);
@@ -519,6 +536,11 @@
G_CALLBACK(xfdesktop_window_icon_manager_icon_selected_cb),
wmanager);
+ toplevel = gtk_widget_get_toplevel(GTK_WIDGET(icon_view));
+ g_signal_connect(G_OBJECT(toplevel), "populate-root-menu",
+
G_CALLBACK(xfdesktop_window_icon_manager_populate_context_menu),
+ wmanager);
+
netk_screen_force_update(wmanager->priv->netk_screen);
g_signal_connect(G_OBJECT(wmanager->priv->netk_screen),
"active-workspace-changed",
@@ -562,6 +584,7 @@
XfdesktopWindowIconManager *wmanager =
XFDESKTOP_WINDOW_ICON_MANAGER(manager);
gint i;
GList *windows, *l;
+ GtkWidget *toplevel;
g_signal_handlers_disconnect_by_func(G_OBJECT(wmanager->priv->netk_screen),
G_CALLBACK(workspace_changed_cb),
@@ -576,6 +599,11 @@
G_CALLBACK(workspace_destroyed_cb),
wmanager);
+ toplevel = gtk_widget_get_toplevel(GTK_WIDGET(wmanager->priv->icon_view));
+ g_signal_handlers_disconnect_by_func(G_OBJECT(toplevel),
+
G_CALLBACK(xfdesktop_window_icon_manager_populate_context_menu),
+ wmanager);
+
windows = netk_screen_get_windows(wmanager->priv->netk_screen);
for(l = windows; l; l = l->next) {
g_signal_handlers_disconnect_by_func(G_OBJECT(l->data),
Modified: xfdesktop/trunk/src/xfdesktop-window-icon.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-window-icon.c 2007-10-20 20:36:24 UTC (rev
26164)
+++ xfdesktop/trunk/src/xfdesktop-window-icon.c 2007-10-20 21:30:46 UTC (rev
26165)
@@ -49,7 +49,8 @@
static G_CONST_RETURN gchar *xfdesktop_window_icon_peek_label(XfdesktopIcon
*icon);
static gboolean xfdesktop_window_icon_activated(XfdesktopIcon *icon);
-static void xfdesktop_window_icon_menu_popup(XfdesktopIcon *icon);
+static gboolean xfdesktop_window_icon_populate_context_menu(XfdesktopIcon
*icon,
+ GtkWidget *menu);
static void xfdesktop_window_name_changed_cb(NetkWindow *window,
gpointer user_data);
@@ -73,7 +74,7 @@
icon_class->peek_pixbuf = xfdesktop_window_icon_peek_pixbuf;
icon_class->peek_label = xfdesktop_window_icon_peek_label;
icon_class->activated = xfdesktop_window_icon_activated;
- icon_class->menu_popup = xfdesktop_window_icon_menu_popup;
+ icon_class->populate_context_menu =
xfdesktop_window_icon_populate_context_menu;
}
static void
@@ -197,37 +198,29 @@
}
static gboolean
-xfdesktop_action_menu_destroy_idled(gpointer data)
+xfdesktop_window_icon_populate_context_menu(XfdesktopIcon *icon,
+ GtkWidget *menu)
{
- gtk_widget_destroy(GTK_WIDGET(data));
- return FALSE;
-}
-
-static void
-xfdesktop_action_menu_deactivate_cb(GtkMenu *menu,
- gpointer user_data)
-{
- g_idle_add(xfdesktop_action_menu_destroy_idled, menu);
-}
-
-static void
-xfdesktop_window_icon_menu_popup(XfdesktopIcon *icon)
-{
XfdesktopWindowIcon *window_icon = XFDESKTOP_WINDOW_ICON(icon);
- GtkWidget *menu =
netk_create_window_action_menu(window_icon->priv->window);
- NetkScreen *netk_screen;
- gint screen_num;
- GdkScreen *gscreen;
+ GtkWidget *amenu =
netk_create_window_action_menu(window_icon->priv->window);
+ GList *items, *l;
- netk_screen = netk_window_get_screen(window_icon->priv->window);
- screen_num = netk_screen_get_number(netk_screen);
- gscreen = gdk_display_get_screen(gdk_display_get_default(), screen_num);
- gtk_menu_set_screen(GTK_MENU(menu), gscreen);
- gtk_widget_show(menu);
- g_signal_connect(G_OBJECT(menu), "deactivate",
- G_CALLBACK(xfdesktop_action_menu_deactivate_cb), NULL);
- gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
- 3, gtk_get_current_event_time());
+ /* this is unfortunately slightly retarded */
+ items = gtk_container_get_children(GTK_CONTAINER(amenu));
+ for(l = items; l; l = l->next) {
+ GtkWidget *mi = l->data;
+ g_object_ref(G_OBJECT(mi));
+ gtk_container_remove(GTK_CONTAINER(amenu), mi);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
+ g_object_unref(G_OBJECT(mi));
+ }
+ g_list_free(items);
+ gtk_widget_destroy(amenu);
+
+ if(!items)
+ return FALSE;
+
+ return TRUE;
}
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits