[Xfce4-commits] <xfdesktop:eric/bugzilla-patches> Arrange icons on the desktop

Eric Koegel noreply at xfce.org
Sun Feb 19 21:34:07 CET 2012


Updating branch refs/heads/eric/bugzilla-patches
         to ddc632474a7b4522fd84c5bbb599bf53103dbc07 (commit)
       from c72329f0c4efa0b8cb062cf55e06026b23e1ac0a (commit)

commit ddc632474a7b4522fd84c5bbb599bf53103dbc07
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sat Feb 11 14:52:42 2012 +0300

    Arrange icons on the desktop
    
    This patch adds code to arrange the desktop icons. First,
    it sorts and adds all the special icons such as the trash, home
    folder, and any volumes. Next, it sorts and adds all the folder
    icons. Finally, it adds the regular file icons. It can be invoked
    by  a root menu option or via a command line --arrange so it can
    be used as a keyboard binding.
    The xfdesktop_icon_view_compare_icons function was written by
    Nick Schermer <nick at xfce.org>
    For bug 2833.

 common/xfdesktop-common.h         |    1 +
 src/main.c                        |   12 ++++-
 src/xfce-desktop.c                |   11 ++++
 src/xfce-desktop.h                |    2 +
 src/xfdesktop-file-icon-manager.c |   18 +++++++
 src/xfdesktop-icon-view.c         |  101 +++++++++++++++++++++++++++++++++++++
 src/xfdesktop-icon-view.h         |    2 +
 7 files changed, 146 insertions(+), 1 deletions(-)

diff --git a/common/xfdesktop-common.h b/common/xfdesktop-common.h
index 58a6f45..151487e 100644
--- a/common/xfdesktop-common.h
+++ b/common/xfdesktop-common.h
@@ -47,6 +47,7 @@
 #define RELOAD_MESSAGE     "reload"
 #define MENU_MESSAGE       "menu"
 #define WINDOWLIST_MESSAGE "windowlist"
+#define ARRANGE_MESSAGE    "arrange"
 #define QUIT_MESSAGE       "quit"
 
 /**
diff --git a/src/main.c b/src/main.c
index af11691..9de09db 100644
--- a/src/main.c
+++ b/src/main.c
@@ -189,6 +189,11 @@ client_message_received(GtkWidget *w, GdkEventClient *evt, gpointer user_data)
             xfce_desktop_popup_secondary_root_menu(XFCE_DESKTOP(w), 0,
                                                    GDK_CURRENT_TIME);
             return TRUE;
+#ifdef ENABLE_FILE_ICONS
+        } else if(!strcmp(ARRANGE_MESSAGE, evt->data.b)) {
+            xfce_desktop_arrange_icons(XFCE_DESKTOP(w));
+            return TRUE;
+#endif
         } else if(!strcmp(QUIT_MESSAGE, evt->data.b)) {
             xfce_sm_client_set_restart_style(sm_client,
                                              XFCE_SM_CLIENT_RESTART_NORMAL);
@@ -233,12 +238,15 @@ main(int argc, char **argv)
     GError *error = NULL;
     gboolean opt_version = FALSE, opt_reload = FALSE;
     gboolean opt_menu = FALSE, opt_windowlist = FALSE;
-    gboolean opt_quit = FALSE;
+    gboolean opt_arrange = FALSE, opt_quit = FALSE;
     const GOptionEntry main_entries[] = {
         { "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_version, N_("Display version information"), NULL },
         { "reload", 0, G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_reload, N_("Reload all settings, refresh image list"), NULL },
         { "menu", 0, G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_menu, N_("Pop up the menu (at the current mouse position)"), NULL },
         { "windowlist", 0, G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_windowlist, N_("Pop up the window list (at the current mouse position)"), NULL },
+#ifdef ENABLE_FILE_ICONS
+        { "arrange", 0, G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_arrange, N_("Automatically arrange all the icons on the desktop"), NULL },
+#endif
         { "quit", 0, G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &opt_quit, N_("Cause xfdesktop to quit"), NULL },
         { NULL, 0, 0, 0, NULL, NULL, NULL }
     };
@@ -303,6 +311,8 @@ main(int argc, char **argv)
         message = MENU_MESSAGE;
     else if(opt_windowlist)
         message = WINDOWLIST_MESSAGE;
+    else if(opt_arrange)
+        message = ARRANGE_MESSAGE;
     else if(opt_quit)
         message = QUIT_MESSAGE;
     
diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c
index da6f959..2fc51d0 100644
--- a/src/xfce-desktop.c
+++ b/src/xfce-desktop.c
@@ -1462,3 +1462,14 @@ xfce_desktop_refresh(XfceDesktop *desktop)
     xfce_desktop_setup_icon_view(desktop);
 #endif
 }
+
+void xfce_desktop_arrange_icons(XfceDesktop *desktop)
+{
+    g_return_if_fail(XFCE_IS_DESKTOP(desktop));
+
+#ifdef ENABLE_DESKTOP_ICONS
+    g_return_if_fail(XFDESKTOP_IS_ICON_VIEW(desktop->priv->icon_view));
+
+    xfdesktop_icon_view_sort_icons(XFDESKTOP_ICON_VIEW(desktop->priv->icon_view));
+#endif
+}
diff --git a/src/xfce-desktop.h b/src/xfce-desktop.h
index d3173ed..a9224af 100644
--- a/src/xfce-desktop.h
+++ b/src/xfce-desktop.h
@@ -116,6 +116,8 @@ void xfce_desktop_popup_secondary_root_menu(XfceDesktop *desktop,
 
 void xfce_desktop_refresh(XfceDesktop *desktop);
 
+void xfce_desktop_arrange_icons(XfceDesktop *desktop);
+
 G_END_DECLS
 
 #endif
diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index 2deb0a1..9e90df7 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -899,6 +899,14 @@ xfdesktop_file_icon_menu_paste(GtkWidget *widget,
 }
 
 static void
+xfdesktop_file_icon_menu_arrange_icons(GtkWidget *widget,
+                                       gpointer user_data)
+{
+    XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
+    xfdesktop_icon_view_sort_icons(fmanager->priv->icon_view);
+}
+
+static void
 xfdesktop_file_icon_menu_properties(GtkWidget *widget,
                                     gpointer user_data)
 {
@@ -1711,6 +1719,16 @@ xfdesktop_file_icon_manager_populate_context_menu(XfceDesktop *desktop,
         gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
         
         if(file_icon == fmanager->priv->desktop_icon) {
+            img = gtk_image_new_from_stock(GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_MENU);
+            gtk_widget_show(img);
+            mi = gtk_image_menu_item_new_with_mnemonic(_("_Arrange Desktop Icons"));
+            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_arrange_icons),
+                             fmanager);
+
             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..."));
diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c
index e37fd68..d21b160 100644
--- a/src/xfdesktop-icon-view.c
+++ b/src/xfdesktop-icon-view.c
@@ -50,6 +50,7 @@
 #include "xfdesktop-file-icon-manager.h"
 #include "xfdesktop-marshal.h"
 #include "xfce-desktop.h"
+#include "xfdesktop-volume-icon.h"
 
 #include <libwnck/libwnck.h>
 #include <libxfce4ui/libxfce4ui.h>
@@ -1503,6 +1504,106 @@ xfdesktop_icon_view_drag_data_received(GtkWidget *widget,
                                                    info, time_);
 }
 
+static gint
+xfdesktop_icon_view_compare_icons(gconstpointer *a,
+                                  gconstpointer *b)
+{
+    XfdesktopIcon *a_icon, *b_icon;
+    const gchar *a_str, *b_str;
+
+    a_icon = XFDESKTOP_ICON(a);
+    b_icon = XFDESKTOP_ICON(b);
+
+    a_str = xfdesktop_icon_peek_label(a_icon);
+    b_str = xfdesktop_icon_peek_label(b_icon);
+
+    if(a_str == NULL)
+        a_str = "";
+    if(b_str == NULL)
+        b_str = "";
+
+    return g_utf8_collate(a_str, b_str);
+}
+
+static void
+xfdesktop_icon_view_append_icons(XfdesktopIconView *icon_view,
+                                 GList *icon_list,
+                                 guint16 *row,
+                                 guint16 *col)
+{
+    GList *l = NULL;
+    for(l = icon_list; l; l = l->next) {
+
+        /* Find the next available spot for an icon */
+        do {
+            if(*row + 1 >= icon_view->priv->nrows) {
+                ++*col;
+                *row = 0;
+            } else {
+                ++*row;
+            }
+        } while(!xfdesktop_grid_is_free_position(icon_view, *row, *col));
+
+        /* set new position */
+        xfdesktop_icon_set_position(l->data, *row, *col);
+        xfdesktop_grid_unset_position_free(icon_view, l->data);
+
+        xfdesktop_icon_view_invalidate_icon(icon_view, l->data, TRUE);
+    }
+}
+
+void
+xfdesktop_icon_view_sort_icons(XfdesktopIconView *icon_view)
+{
+#ifdef ENABLE_FILE_ICONS
+    GList *l = NULL;
+    GList *special_icons = NULL;
+    GList *folder_icons = NULL;
+    GList *regular_icons = NULL;
+    guint16 row = 0;
+    guint16 col = -1; /* start at -1 because we'll increment it */
+
+    for(l = icon_view->priv->icons; l; l = l->next) {
+        guint16 old_row, old_col;
+
+        /* clear out old position */
+        xfdesktop_icon_view_invalidate_icon(icon_view, l->data, FALSE);
+
+        if(xfdesktop_icon_get_position(l->data, &old_row, &old_col))
+            xfdesktop_grid_set_position_free(icon_view, old_row, old_col);
+
+        /* Add it to the correct list */
+        if(XFDESKTOP_IS_SPECIAL_FILE_ICON(l->data) ||
+           XFDESKTOP_IS_VOLUME_ICON(l->data)) {
+            special_icons = g_list_insert_sorted(special_icons,
+                                                 l->data,
+                                                 (GCompareFunc)xfdesktop_icon_view_compare_icons);
+        } else if(XFDESKTOP_IS_FILE_ICON(l->data) &&
+                  g_file_query_file_type(xfdesktop_file_icon_peek_file(l->data),
+                                         G_FILE_QUERY_INFO_NONE,
+                                         NULL) == G_FILE_TYPE_DIRECTORY) {
+            folder_icons = g_list_insert_sorted(folder_icons,
+                                                 l->data,
+                                                 (GCompareFunc)xfdesktop_icon_view_compare_icons);
+        } else {
+            regular_icons = g_list_insert_sorted(regular_icons,
+                                                 l->data,
+                                                 (GCompareFunc)xfdesktop_icon_view_compare_icons);
+        }
+    }
+
+    /* Append the icons: special, folder, then regular */
+    xfdesktop_icon_view_append_icons(icon_view, special_icons, &row, &col);
+    xfdesktop_icon_view_append_icons(icon_view, folder_icons, &row, &col);
+    xfdesktop_icon_view_append_icons(icon_view, regular_icons, &row, &col);
+
+
+    g_list_free(special_icons);
+    g_list_free(folder_icons);
+    g_list_free(regular_icons);
+#endif
+}
+
 static void
 xfdesktop_icon_view_icon_theme_changed(GtkIconTheme *icon_theme,
                                        gpointer user_data)
diff --git a/src/xfdesktop-icon-view.h b/src/xfdesktop-icon-view.h
index 4961044..95bddd4 100644
--- a/src/xfdesktop-icon-view.h
+++ b/src/xfdesktop-icon-view.h
@@ -118,6 +118,8 @@ gdouble xfdesktop_icon_view_get_font_size(XfdesktopIconView *icon_view);
 
 GtkWidget *xfdesktop_icon_view_get_window_widget(XfdesktopIconView *icon_view);
 
+void xfdesktop_icon_view_sort_icons(XfdesktopIconView *icon_view);
+
 #if defined(DEBUG) && DEBUG > 0
 guint _xfdesktop_icon_view_n_items(XfdesktopIconView *icon_view);
 #endif


More information about the Xfce4-commits mailing list