From 8beaa8b1d850eeb1bd8172bcf0d283a27aae4a63 Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Thu, 19 Jan 2012 21:08:51 +0300 Subject: [PATCH] Icon positions are saved/restored per resolution. Icon positions are now stored in seperate rc files per screen resolution so that when reverting from a lower screen resolution the icons aren't stuck at the upper-left. The old rc file is used as a fallback so that the migration is seemless. For bug 6149. --- src/xfdesktop-file-icon-manager.c | 38 +++++++++++++++++++++++++++--------- src/xfdesktop-file-icon-manager.h | 5 ++++ src/xfdesktop-icon-view.c | 16 +++++++++++++++ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c index d3ca2eb..1bfe3d1 100644 --- a/src/xfdesktop-file-icon-manager.c +++ b/src/xfdesktop-file-icon-manager.c @@ -400,8 +400,10 @@ __migrate_old_icon_positions(XfdesktopFileIconManager *fmanager) { gchar relpath[PATH_MAX], *old_file; - g_snprintf(relpath, PATH_MAX, "xfce4/desktop/icons.screen%d.rc", - gdk_screen_get_number(fmanager->priv->gscreen)); + g_snprintf(relpath, PATH_MAX, "xfce4/desktop/icons.screen%d-%dx%d.rc", + gdk_screen_get_number(fmanager->priv->gscreen), + gdk_screen_get_width(fmanager->priv->gscreen), + gdk_screen_get_height(fmanager->priv->gscreen)); old_file = xfce_resource_save_location(XFCE_RESOURCE_CACHE, relpath, FALSE); @@ -1721,8 +1723,10 @@ xfdesktop_file_icon_manager_save_icons(gpointer user_data) fmanager->priv->save_icons_id = 0; - g_snprintf(relpath, PATH_MAX, "xfce4/desktop/icons.screen%d.rc", - gdk_screen_get_number(fmanager->priv->gscreen)); + g_snprintf(relpath, PATH_MAX, "xfce4/desktop/icons.screen%d-%dx%d.rc", + gdk_screen_get_number(fmanager->priv->gscreen), + gdk_screen_get_width(fmanager->priv->gscreen), + gdk_screen_get_height(fmanager->priv->gscreen)); path = xfce_resource_save_location(XFCE_RESOURCE_CONFIG, relpath, TRUE); if(!path) return FALSE; @@ -1779,20 +1783,33 @@ xfdesktop_file_icon_position_changed(XfdesktopFileIcon *icon, /* ***** */ -static gboolean +gboolean xfdesktop_file_icon_manager_get_cached_icon_position(XfdesktopFileIconManager *fmanager, const gchar *name, gint16 *row, gint16 *col) { gchar relpath[PATH_MAX]; - XfceRc *rcfile; + gchar *filename = NULL; gboolean ret = FALSE; - g_snprintf(relpath, PATH_MAX, "xfce4/desktop/icons.screen%d.rc", - gdk_screen_get_number(fmanager->priv->gscreen)); - rcfile = xfce_rc_config_open(XFCE_RESOURCE_CONFIG, relpath, TRUE); - if(rcfile) { + g_snprintf(relpath, PATH_MAX, "xfce4/desktop/icons.screen%d-%dx%d.rc", + gdk_screen_get_number(fmanager->priv->gscreen), + gdk_screen_get_width(fmanager->priv->gscreen), + gdk_screen_get_height(fmanager->priv->gscreen)); + filename = xfce_resource_lookup(XFCE_RESOURCE_CONFIG, relpath); + + /* Check if we have to migrate from the old file format */ + if(filename == NULL) { + g_snprintf(relpath, PATH_MAX, "xfce4/desktop/icons.screen%d.rc", + gdk_screen_get_number(fmanager->priv->gscreen)); + filename = xfce_resource_lookup(XFCE_RESOURCE_CONFIG, relpath); + } + + if(filename != NULL) { + XfceRc *rcfile; + rcfile = xfce_rc_simple_open(filename, TRUE); + if(xfce_rc_has_group(rcfile, name)) { xfce_rc_set_group(rcfile, name); *row = xfce_rc_read_int_entry(rcfile, "row", -1); @@ -1801,6 +1818,7 @@ xfdesktop_file_icon_manager_get_cached_icon_position(XfdesktopFileIconManager *f ret = TRUE; } xfce_rc_close(rcfile); + g_free(filename); } return ret; diff --git a/src/xfdesktop-file-icon-manager.h b/src/xfdesktop-file-icon-manager.h index 703a6f4..e9e26e4 100644 --- a/src/xfdesktop-file-icon-manager.h +++ b/src/xfdesktop-file-icon-manager.h @@ -65,6 +65,11 @@ void xfdesktop_file_icon_manager_set_show_special_file(XfdesktopFileIconManager gboolean xfdesktop_file_icon_manager_get_show_special_file(XfdesktopFileIconManager *manager, XfdesktopSpecialFileIconType type); +gboolean xfdesktop_file_icon_manager_get_cached_icon_position( + XfdesktopFileIconManager *fmanager, + const gchar *name, + gint16 *row, + gint16 *col); G_END_DECLS #endif /* __XFDESKTOP_FILE_ICON_MANAGER_H__ */ diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c index 0736006..78cec13 100644 --- a/src/xfdesktop-icon-view.c +++ b/src/xfdesktop-icon-view.c @@ -47,6 +47,7 @@ #endif #include "xfdesktop-icon-view.h" +#include "xfdesktop-file-icon-manager.h" #include "xfdesktop-marshal.h" #include @@ -2780,6 +2781,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view, static void xfdesktop_grid_do_resize(XfdesktopIconView *icon_view) { + XfdesktopFileIconManager *fmanager; GList *l, *leftovers = NULL; /* move all icons into the pending_icons list */ @@ -2803,9 +2805,23 @@ xfdesktop_grid_do_resize(XfdesktopIconView *icon_view) DUMP_GRID_LAYOUT(icon_view); + fmanager = XFDESKTOP_FILE_ICON_MANAGER(icon_view->priv->manager); + /* add all icons back */ for(l = icon_view->priv->pending_icons; l; l = l->next) { + gint16 row, col; XfdesktopIcon *icon = XFDESKTOP_ICON(l->data); + + /* Try to get the cached position for the new resolution */ + if(xfdesktop_file_icon_manager_get_cached_icon_position( + fmanager, + xfdesktop_icon_peek_label(icon), + &row, + &col)) + { + xfdesktop_icon_set_position(icon, row, col); + } + if(xfdesktop_icon_view_icon_find_position(icon_view, icon)) xfdesktop_icon_view_add_item_internal(icon_view, icon); else -- 1.7.5.4