Updating branch refs/heads/eric/bugzilla-patches to ddc632474a7b4522fd84c5bbb599bf53103dbc07 (commit) from c72329f0c4efa0b8cb062cf55e06026b23e1ac0a (commit)
commit ddc632474a7b4522fd84c5bbb599bf53103dbc07 Author: Eric Koegel <eric.koe...@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 <n...@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 _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits