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

Reply via email to