Author: kelnos
Date: 2006-07-13 03:17:02 +0000 (Thu, 13 Jul 2006)
New Revision: 22432

Modified:
   xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
Log:
add to the desktop context menu (i.e. for the ~/Desktop folder):
* thunarx menu provider
* properties dialog
* settings dialog (launches mcs settings for the desktop)


Modified: xfdesktop/trunk/src/xfdesktop-file-icon-manager.c
===================================================================
--- xfdesktop/trunk/src/xfdesktop-file-icon-manager.c   2006-07-13 00:01:45 UTC 
(rev 22431)
+++ xfdesktop/trunk/src/xfdesktop-file-icon-manager.c   2006-07-13 03:17:02 UTC 
(rev 22432)
@@ -146,6 +146,7 @@
 #ifdef HAVE_THUNARX
     GList *thunarx_menu_providers;
     GList *thunarx_properties_providers;
+    XfdesktopFileIcon *desktop_icon;
 #endif
 };
 
@@ -998,12 +999,9 @@
 }
 
 static void
-xfdesktop_file_icon_menu_properties(GtkWidget *widget,
-                                    gpointer user_data)
+xfdesktop_file_icon_show_properties(XfdesktopFileIconManager *fmanager,
+                                    XfdesktopFileIcon *icon)
 {
-    XfdesktopFileIconManager *fmanager = 
XFDESKTOP_FILE_ICON_MANAGER(user_data);
-    XfdesktopFileIcon *icon;
-    GList *selected;
     GtkWidget *dlg, *table, *hbox, *lbl, *img, *spacer, *notebook, *vbox,
               *entry, *toplevel, *combo;
     gint row = 0, w, h;
@@ -1021,10 +1019,6 @@
         N_("None"), N_("Write only"), N_("Read only"), N_("Read & Write")
     };
     
-    selected = 
xfdesktop_icon_view_get_selected_items(fmanager->priv->icon_view);
-    g_return_if_fail(g_list_length(selected) == 1);
-    icon = XFDESKTOP_FILE_ICON(selected->data);
-    g_list_free(selected);
     toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
     
     info = xfdesktop_file_icon_peek_info(icon);
@@ -1468,7 +1462,30 @@
     gtk_widget_show(dlg);
 }
 
+static void
+xfdesktop_file_icon_menu_properties(GtkWidget *widget,
+                                    gpointer user_data)
+{
+    XfdesktopFileIconManager *fmanager = 
XFDESKTOP_FILE_ICON_MANAGER(user_data);
+    XfdesktopFileIcon *icon;
+    GList *selected;
+    
+    selected = 
xfdesktop_icon_view_get_selected_items(fmanager->priv->icon_view);
+    g_return_if_fail(g_list_length(selected) == 1);
+    icon = XFDESKTOP_FILE_ICON(selected->data);
+    g_list_free(selected);
+    
+    xfdesktop_file_icon_show_properties(fmanager, icon);
+}
 
+static void
+xfdesktop_file_icon_manager_desktop_properties(GtkWidget *widget,
+                                               gpointer user_data)
+{
+    XfdesktopFileIconManager *fmanager = 
XFDESKTOP_FILE_ICON_MANAGER(user_data);
+    xfdesktop_file_icon_show_properties(fmanager, 
fmanager->priv->desktop_icon);
+}
+
 static GtkWidget *
 xfdesktop_menu_item_from_mime_handler(XfdesktopFileIconManager *fmanager,
                                       XfdesktopFileIcon *icon,
@@ -1964,6 +1981,36 @@
 #endif
 
 static void
+xfdesktop_mcs_settings_launch(GtkWidget *w,
+                              gpointer user_data)
+{
+    XfdesktopFileIconManager *fmanager = 
XFDESKTOP_FILE_ICON_MANAGER(user_data);
+    gchar *display_name, *cmd;
+    gchar buf[PATH_MAX];
+    GError *error = NULL;
+    
+    display_name = gdk_screen_make_display_name(fmanager->priv->gscreen);
+    
+    cmd = g_find_program_in_path("xfce-setting-show");
+    if(!cmd)
+        cmd = g_strdup(BINDIR "/xfce-setting-show");
+    
+    g_snprintf(buf, PATH_MAX, "env DISPLAY=\"%s\" \"%s\" backdrop", 
display_name, cmd);
+    g_free(display_name);
+    g_free(cmd);
+    
+    if(!xfce_exec(buf, FALSE, TRUE, &error)) {
+        GtkWidget *toplevel = 
gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
+        gchar *primary = g_strdup_printf(_("Unable to launch \"%s\":"),
+                                         "xfce-setting-show");
+        xfce_message_dialog(GTK_WINDOW(toplevel), _("Launch Error"),
+                            GTK_STOCK_DIALOG_ERROR, primary, error->message,
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+        g_free(primary);
+    }
+}
+
+static void
 xfdesktop_file_icon_menu_popup(XfdesktopIcon *icon,
                                gpointer user_data)
 {
@@ -1980,6 +2027,9 @@
     ThunarVfsMimeInfo *minfo;
     ThunarVfsPath *templates_path;
     gchar *templates_path_str;
+#ifdef HAVE_THUNARX
+    GtkWidget *toplevel = 
gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
+#endif
     
     selected = 
xfdesktop_icon_view_get_selected_items(fmanager->priv->icon_view);
     g_return_if_fail(selected);
@@ -2157,7 +2207,6 @@
     if(!multi_sel && info && fmanager->priv->thunarx_menu_providers
        && (!volume || thunar_vfs_volume_is_mounted(volume)))
     {
-        GtkWidget *window = 
gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
         GList *menu_actions = NULL, *l;
         ThunarxMenuProvider *provider;
         
@@ -2166,7 +2215,7 @@
                 provider = THUNARX_MENU_PROVIDER(l->data);
                 menu_actions = g_list_concat(menu_actions,
                                              
thunarx_menu_provider_get_folder_actions(provider,
-                                                                               
       window,
+                                                                               
       toplevel,
                                                                                
       THUNARX_FILE_INFO(file_icon)));
             }
         } else {
@@ -2174,7 +2223,7 @@
                 provider = THUNARX_MENU_PROVIDER(l->data);
                 menu_actions = g_list_concat(menu_actions,
                                              
thunarx_menu_provider_get_file_actions(provider,
-                                                                               
     window,
+                                                                               
     toplevel,
                                                                                
     selected));
             }
         }
@@ -2227,31 +2276,19 @@
                              fmanager);
         }
     } else {
-        img = gtk_image_new_from_stock(GTK_STOCK_COPY, GTK_ICON_SIZE_MENU);
-        gtk_widget_show(img);
-        mi = gtk_image_menu_item_new_with_mnemonic(multi_sel ? _("_Copy Files")
-                                                             : _("_Copy 
File"));
-        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
+        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);
         
-        img = gtk_image_new_from_stock(GTK_STOCK_CUT, GTK_ICON_SIZE_MENU);
-        gtk_widget_show(img);
-        mi = gtk_image_menu_item_new_with_mnemonic(multi_sel ? _("Cu_t Files")
-                                                             : _("Cu_t File"));
-        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
+        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);
         g_signal_connect(G_OBJECT(mi), "activate",
                          G_CALLBACK(xfdesktop_file_icon_menu_cut), fmanager);
         
-        img = gtk_image_new_from_stock(GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU);
-        gtk_widget_show(img);
-        mi = gtk_image_menu_item_new_with_mnemonic(multi_sel ? _("_Delete 
Files")
-                                                             : _("_Delete 
File"));
-        gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(mi), img);
+        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);
         g_signal_connect_swapped(G_OBJECT(mi), "activate",
@@ -2403,20 +2440,57 @@
     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);
+    }
     
-    img = gtk_image_new_from_stock(GTK_STOCK_PASTE, GTK_ICON_SIZE_MENU);
+    mi = gtk_separator_menu_item_new();
+    gtk_widget_show(mi);
+    gtk_menu_shell_append(GTK_MENU_SHELL(menu2), 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(_("_Paste Files"));
+    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);
-    /* FIXME: implement */
-    gtk_widget_set_sensitive(mi, FALSE);
+    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());
     
@@ -3029,6 +3103,7 @@
     XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(manager);
 #ifdef HAVE_THUNARX
     ThunarxProviderFactory *thunarx_pfac;
+    ThunarVfsInfo *desktop_info;
 #endif
     
     g_return_val_if_fail(!fmanager->priv->inited, FALSE);
@@ -3099,6 +3174,12 @@
                                                 
THUNARX_TYPE_PROPERTY_PAGE_PROVIDER);
     
     g_object_unref(G_OBJECT(thunarx_pfac));
+    
+    /* keep around a dummy icon for the desktop folder for use with thunarx */
+    desktop_info = thunar_vfs_info_new_for_path(fmanager->priv->folder, NULL);
+    fmanager->priv->desktop_icon = xfdesktop_file_icon_new(desktop_info,
+                                                           
fmanager->priv->gscreen);
+    thunar_vfs_info_unref(desktop_info);
 #endif
     
     fmanager->priv->inited = TRUE;
@@ -3148,6 +3229,9 @@
     fmanager->priv->monitor = NULL;
     
 #ifdef HAVE_THUNARX
+    g_object_unref(G_OBJECT(fmanager->priv->desktop_icon));
+    fmanager->priv->desktop_icon = NULL;
+    
     g_list_foreach(fmanager->priv->thunarx_menu_providers,
                    (GFunc)g_object_unref, NULL);
     g_list_free(fmanager->priv->thunarx_menu_providers);

_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to