From 10e510f32f33e9c6d362335b3bb79810a38861fa Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Sat, 9 Feb 2013 15:00:40 +0300 Subject: [PATCH] Avoid changing identical backdrops when changing workspaces This patch also fixes a couple other minor bugs. --- settings/main.c | 33 ++++++++++++++++++++------------- src/xfce-backdrop.c | 34 ++++++++++++++++++++++++++++++++++ src/xfce-backdrop.h | 3 +++ src/xfce-desktop.c | 26 +++++++++++++++++++++++--- src/xfce-workspace.c | 2 +- 5 files changed, 81 insertions(+), 17 deletions(-) diff --git a/settings/main.c b/settings/main.c index 441bcdc..92e26a5 100644 --- a/settings/main.c +++ b/settings/main.c @@ -77,6 +77,7 @@ #define DESKTOP_ICONS_SHOW_FILESYSTEM "/desktop-icons/file-icons/show-filesystem" #define DESKTOP_ICONS_SHOW_REMOVABLE "/desktop-icons/file-icons/show-removable" +#define IMAGE_STLYE_SPANNING_SCREENS 6 typedef struct { @@ -480,6 +481,8 @@ xfdesktop_settings_generate_per_workspace_binding_string(AppearancePanel *panel, property); } + DBG("name %s", buf); + return buf; } @@ -740,6 +743,7 @@ xfdesktop_settings_background_tab_change_bindings(AppearancePanel *panel, buf = xfdesktop_settings_generate_per_workspace_binding_string(panel, "color1"); if(remove_binding) { xfconf_g_property_unbind(panel->color1_btn_id); + } else { panel->color1_btn_id = xfconf_g_property_bind_gdkcolor(channel, buf, G_OBJECT(panel->color1_btn), "color"); @@ -756,9 +760,6 @@ xfdesktop_settings_background_tab_change_bindings(AppearancePanel *panel, } g_free(buf); - cb_xfdesktop_combo_color_changed(GTK_COMBO_BOX(panel->color_style_combo), - panel); - /* Cycle timer options */ buf = xfdesktop_settings_generate_per_workspace_binding_string(panel, "backdrop-cycle-enable"); if(remove_binding) { @@ -792,8 +793,6 @@ xfdesktop_settings_background_tab_change_bindings(AppearancePanel *panel, } g_free(buf); - cb_xfdesktop_chk_cycle_backdrop_toggled(GTK_CHECK_BUTTON(panel->backdrop_cycle_chkbox), - panel); } static void @@ -856,10 +855,11 @@ cb_update_background_tab(WnckWindow *wnck_window, * in all other cases. * Remove the spanning screens option before we potentially add it again */ - gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(panel->image_style_combo), 6); + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(panel->image_style_combo), + IMAGE_STLYE_SPANNING_SCREENS); if(panel->monitor == 0 && gdk_screen_get_n_monitors(screen) > 1) { - gtk_combo_box_text_insert_text(GTK_COMBO_BOX_TEXT(panel->image_style_combo), - 6, _("Spanning screens")); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(panel->image_style_combo), + _("Spanning screens")); } } @@ -883,7 +883,8 @@ xfdesktop_settings_setup_image_iconview(AppearancePanel *panel) static void xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, XfconfChannel *channel, - GdkScreen *screen) + GdkScreen *screen, + gulong window_xid) { GtkWidget *appearance_container, *chk_custom_font_size, *spin_font_size, *w, *box, *spin_icon_size, @@ -944,7 +945,10 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, /* We have to force wnck to initialize */ wnck_screen = wnck_screen_get(panel->screen); wnck_screen_force_update(wnck_screen); - wnck_window = wnck_window_get(GDK_WINDOW_XID(gtk_widget_get_window(appearance_container))); + wnck_window = wnck_window_get(window_xid); + + if(wnck_window == NULL) + wnck_window = wnck_screen_get_active_window(wnck_screen); g_signal_connect(wnck_window, "geometry-changed", G_CALLBACK(cb_update_background_tab), panel); @@ -1094,6 +1098,7 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, "active"); setup_special_icon_list(main_gxml, channel); + cb_update_background_tab(wnck_window, panel); } static void @@ -1175,7 +1180,8 @@ main(int argc, char **argv) G_CALLBACK(xfdesktop_settings_response), NULL); gtk_window_present(GTK_WINDOW (dialog)); xfdesktop_settings_dialog_setup_tabs(gxml, channel, - gtk_widget_get_screen(dialog)); + gtk_widget_get_screen(dialog), + GDK_WINDOW_XID(gtk_widget_get_window(dialog))); /* To prevent the settings dialog to be saved in the session */ gdk_x11_set_sm_client_id("FAKE ID"); @@ -1188,14 +1194,15 @@ main(int argc, char **argv) gtk_widget_show(plug); g_signal_connect(G_OBJECT(plug), "delete-event", G_CALLBACK(gtk_main_quit), NULL); - xfdesktop_settings_dialog_setup_tabs(gxml, channel, - gtk_widget_get_screen(plug)); gdk_notify_startup_complete(); plug_child = GTK_WIDGET(gtk_builder_get_object(gxml, "alignment1")); gtk_widget_reparent(plug_child, plug); gtk_widget_show(plug_child); + xfdesktop_settings_dialog_setup_tabs(gxml, channel, + gtk_widget_get_screen(plug), + GDK_WINDOW_XID(gtk_widget_get_window(plug_child))); gtk_main(); } diff --git a/src/xfce-backdrop.c b/src/xfce-backdrop.c index 4b3a909..819c2c8 100644 --- a/src/xfce-backdrop.c +++ b/src/xfce-backdrop.c @@ -1009,3 +1009,37 @@ xfce_backdrop_get_pixbuf(XfceBackdrop *backdrop) return final_image; } + +/* returns TRUE if they have identical settings. */ +gboolean xfce_backdrop_compare_backdrops(XfceBackdrop *backdrop_a, + XfceBackdrop *backdrop_b) +{ + if(g_strcmp0(backdrop_a->priv->image_path, backdrop_b->priv->image_path) != 0) { + DBG("filename different"); + return FALSE; + } + + if(backdrop_a->priv->image_style != backdrop_b->priv->image_style) { + DBG("image_style different"); + return FALSE; + } + + if(backdrop_a->priv->color_style != backdrop_b->priv->color_style) { + DBG("color_style different"); + return FALSE; + } + + if(!gdk_color_equal(&backdrop_a->priv->color1, &backdrop_b->priv->color1) || + !gdk_color_equal(&backdrop_a->priv->color2, &backdrop_b->priv->color2)) { + DBG("colors different"); + return FALSE; + } + + if(backdrop_a->priv->cycle_backdrop != backdrop_b->priv->cycle_backdrop || + backdrop_a->priv->cycle_backdrop == TRUE) { + DBG("backdrop cycle different"); + return FALSE; + } + + return TRUE; +} diff --git a/src/xfce-backdrop.h b/src/xfce-backdrop.h index 6c013c3..fbb01a9 100644 --- a/src/xfce-backdrop.h +++ b/src/xfce-backdrop.h @@ -130,6 +130,9 @@ gboolean xfce_backdrop_get_random_order (XfceBackdrop *backdrop); GdkPixbuf *xfce_backdrop_get_pixbuf (XfceBackdrop *backdrop); +gboolean xfce_backdrop_compare_backdrops (XfceBackdrop *backdrop_a, + XfceBackdrop *backdrop_b); + G_END_DECLS #endif diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c index 95c30f6..6f19d4f 100644 --- a/src/xfce-desktop.c +++ b/src/xfce-desktop.c @@ -481,13 +481,33 @@ workspace_changed_cb(WnckScreen *wnck_screen, { XfceDesktop *desktop = XFCE_DESKTOP(user_data); WnckWorkspace *wnck_workspace = wnck_screen_get_active_workspace(wnck_screen); + gint current_workspace, new_workspace, i; + XfceBackdrop *current_backdrop, *new_backdrop; TRACE("entering"); - desktop->priv->current_workspace = wnck_workspace_get_number(wnck_workspace); + current_workspace = desktop->priv->current_workspace; + new_workspace = wnck_workspace_get_number(wnck_workspace); + desktop->priv->current_workspace = new_workspace; - /* fake a screen size changed, so the background is properly set */ - screen_size_changed_cb(desktop->priv->gscreen, user_data); + /* We want to compare the current workspace backdrops with the new one + * and see if we can avoid changing them if they are the same image/style */ + for(i = 0; i < xfce_desktop_get_n_monitors(desktop); i++) { + current_backdrop = xfce_workspace_get_backdrop(desktop->priv->workspaces[current_workspace], i); + new_backdrop = xfce_workspace_get_backdrop(desktop->priv->workspaces[new_workspace], i); + + if(!xfce_backdrop_compare_backdrops(current_backdrop, new_backdrop)) { + GdkRectangle rect; + + /* since we're trying to only update monitors that require it + * we'll need to set the backdrop to the monitor dimensions so + * it will update properly */ + gdk_screen_get_monitor_geometry(desktop->priv->gscreen, i, &rect); + xfce_backdrop_set_size(new_backdrop, rect.width, rect.height); + + backdrop_changed_cb(new_backdrop, user_data); + } + } } static void diff --git a/src/xfce-workspace.c b/src/xfce-workspace.c index ba9f327..da3a607 100644 --- a/src/xfce-workspace.c +++ b/src/xfce-workspace.c @@ -219,7 +219,7 @@ xfce_workspace_monitors_changed(XfceWorkspace *workspace, xfce_workspace_connect_backdrop_settings(workspace, workspace->priv->backdrops[i], i); - g_signal_connect(G_OBJECT(workspace->priv->backdrops[0]), + g_signal_connect(G_OBJECT(workspace->priv->backdrops[i]), "changed", G_CALLBACK(backdrop_changed_cb), workspace); g_signal_connect(G_OBJECT(workspace->priv->backdrops[i]), -- 1.7.10.4