Updating branch refs/heads/eric/wallpaper-and-settings-improvements to f51d49ec663ae59c3c5c357eedd9c378a1fdfd13 (commit) from c4a10cc1524490d35a6afd7aa67cdd57c59729b8 (commit)
commit f51d49ec663ae59c3c5c357eedd9c378a1fdfd13 Author: Eric Koegel <eric.koe...@gmail.com> Date: Sun Mar 10 11:31:45 2013 +0300 Apply wallpaper to all workspaces option common/xfdesktop-common.h | 3 + settings/main.c | 83 +++++++++++-- .../xfdesktop-settings-appearance-frame-ui.glade | 15 +++ src/xfce-desktop.c | 132 ++++++++++++++++++-- 4 files changed, 214 insertions(+), 19 deletions(-) diff --git a/common/xfdesktop-common.h b/common/xfdesktop-common.h index 5334ba8..b34d7b5 100644 --- a/common/xfdesktop-common.h +++ b/common/xfdesktop-common.h @@ -49,6 +49,9 @@ #define ARRANGE_MESSAGE "arrange" #define QUIT_MESSAGE "quit" +#define SINGLE_WORKSPACE_MODE "/backdrop/single-workspace-mode" +#define SINGLE_WORKSPACE_NUMBER "/backdrop/single-workspace-number" + /** * File information namespaces queried for #GFileInfo objects. */ diff --git a/settings/main.c b/settings/main.c index f82bd7c..95ced14 100644 --- a/settings/main.c +++ b/settings/main.c @@ -96,6 +96,8 @@ typedef struct gchar *monitor_name; gulong image_list_loaded:1; + WnckWindow *wnck_window; + GtkWidget *frame_image_list; GtkWidget *image_iconview; GtkWidget *btn_folder; @@ -674,6 +676,35 @@ cb_image_selection_changed(GtkIconView *icon_view, g_free(buf); } +static gint +xfdesktop_settings_get_active_workspace(AppearancePanel *panel, + WnckWindow *wnck_window) +{ + WnckWorkspace *wnck_workspace; + gboolean single_workspace; + gint workspace_num, active_workspace; + + wnck_workspace = wnck_window_get_workspace(wnck_window); + + workspace_num = wnck_workspace_get_number(wnck_workspace); + + single_workspace = xfconf_channel_get_bool(panel->channel, + SINGLE_WORKSPACE_MODE, + TRUE); + + /* If we're in single_workspace mode we need to return the workspace that + * it was set to, otherwise return the current workspace */ + if(single_workspace) { + active_workspace = xfconf_channel_get_int(panel->channel, + SINGLE_WORKSPACE_NUMBER, + 0); + } else { + active_workspace = workspace_num; + } + + return active_workspace; +} + static void cb_xfdesktop_chk_custom_font_size_toggled(GtkCheckButton *button, gpointer user_data) @@ -1013,7 +1044,7 @@ cb_update_background_tab(WnckWindow *wnck_window, screen = gtk_widget_get_screen(panel->image_iconview); wnck_workspace = wnck_window_get_workspace(wnck_window); - workspace_num = wnck_workspace_get_number(wnck_workspace); + workspace_num = xfdesktop_settings_get_active_workspace(panel, wnck_window); screen_num = gdk_screen_get_number(screen); monitor_num = gdk_screen_get_monitor_at_window(screen, gtk_widget_get_window(panel->image_iconview)); @@ -1062,6 +1093,29 @@ cb_update_background_tab(WnckWindow *wnck_window, } static void +cb_xfdesktop_chk_apply_to_all(GtkCheckButton *button, + gpointer user_data) +{ + AppearancePanel *panel = user_data; + gboolean active; + active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + + TRACE("entering"); + + xfconf_channel_set_bool(panel->channel, + SINGLE_WORKSPACE_MODE, + active); + + if(active) { + xfconf_channel_set_int(panel->channel, + SINGLE_WORKSPACE_NUMBER, + panel->workspace); + } else { + cb_update_background_tab(panel->wnck_window, panel); + } +} + +static void xfdesktop_settings_setup_image_iconview(AppearancePanel *panel) { GtkIconView *iconview = GTK_ICON_VIEW(panel->image_iconview); @@ -1093,13 +1147,12 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, GtkWidget *appearance_container, *chk_custom_font_size, *spin_font_size, *w, *box, *spin_icon_size, *chk_show_thumbnails, *chk_single_click, *appearance_settings, - *bnt_exit; + *bnt_exit, *chk_apply_to_all; GtkBuilder *appearance_gxml; AppearancePanel *panel = g_new0(AppearancePanel, 1); GError *error = NULL; GtkFileFilter *filter; WnckScreen *wnck_screen; - WnckWindow *wnck_window = NULL; TRACE("entering"); @@ -1156,16 +1209,16 @@ 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(window_xid); + panel->wnck_window = wnck_window_get(window_xid); - if(wnck_window == NULL) - wnck_window = wnck_screen_get_active_window(wnck_screen); + if(panel->wnck_window == NULL) + panel->wnck_window = wnck_screen_get_active_window(wnck_screen); /* These callbacks are for updating the image_iconview when the window * moves to another monitor or workspace */ - g_signal_connect(wnck_window, "geometry-changed", + g_signal_connect(panel->wnck_window, "geometry-changed", G_CALLBACK(cb_update_background_tab), panel); - g_signal_connect(wnck_window, "workspace-changed", + g_signal_connect(panel->wnck_window, "workspace-changed", G_CALLBACK(cb_update_background_tab), panel); /* send invalid numbers so that the update_background_tab will update everything */ @@ -1236,6 +1289,18 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, gtk_combo_box_set_active(GTK_COMBO_BOX(panel->image_style_combo), 0); gtk_combo_box_set_active(GTK_COMBO_BOX(panel->color_style_combo), 0); + /* Use these settings for all workspaces checkbox */ + chk_apply_to_all = GTK_WIDGET(gtk_builder_get_object(appearance_gxml, + "chk_apply_to_all")); + + if(xfconf_channel_get_bool(channel, SINGLE_WORKSPACE_MODE, TRUE)) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_apply_to_all), TRUE); + } + + g_signal_connect(G_OBJECT(chk_apply_to_all), "toggled", + G_CALLBACK(cb_xfdesktop_chk_apply_to_all), + panel); + /* background cycle timer */ panel->backdrop_cycle_chkbox = GTK_WIDGET(gtk_builder_get_object(appearance_gxml, "chk_cycle_backdrop")); @@ -1318,7 +1383,7 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, "active"); setup_special_icon_list(main_gxml, channel); - cb_update_background_tab(wnck_window, panel); + cb_update_background_tab(panel->wnck_window, panel); } static void diff --git a/settings/xfdesktop-settings-appearance-frame-ui.glade b/settings/xfdesktop-settings-appearance-frame-ui.glade index ee8e334..b928932 100644 --- a/settings/xfdesktop-settings-appearance-frame-ui.glade +++ b/settings/xfdesktop-settings-appearance-frame-ui.glade @@ -215,6 +215,21 @@ <property name="expand">False</property> </packing> </child> + <child> + <object class="GtkCheckButton" id="chk_apply_to_all"> + <property name="visible">True</property> + <property name="sensitive">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">_Use these settings for all workspaces</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="pack-type">GTK_PACK_END</property> + </packing> + </child> </object> <packing> <property name="expand">False</property> diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c index 6e12456..11df13d 100644 --- a/src/xfce-desktop.c +++ b/src/xfce-desktop.c @@ -101,7 +101,10 @@ struct _XfceDesktopPriv gint nworkspaces; XfceWorkspace **workspaces; gint current_workspace; - + + gboolean single_workspace_mode; + gint single_workspace_num; + SessionLogoutFunc session_logout_func; #ifdef ENABLE_DESKTOP_ICONS @@ -130,6 +133,8 @@ enum PROP_ICON_FONT_SIZE, PROP_ICON_FONT_SIZE_SET, #endif + PROP_SINGLE_WORKSPACE_MODE, + PROP_SINGLE_WORKSPACE_NUMBER, }; @@ -156,6 +161,12 @@ static gboolean xfce_desktop_delete_event(GtkWidget *w, static void xfce_desktop_style_set(GtkWidget *w, GtkStyle *old_style); +static void xfce_desktop_set_single_workspace_mode(XfceDesktop *desktop, + gboolean single_workspace); +static void xfce_desktop_set_single_workspace_number(XfceDesktop *desktop, + gint workspace_num); + +static gboolean xfce_desktop_get_single_workspace_mode(XfceDesktop *desktop); static gint xfce_desktop_get_current_workspace(XfceDesktop *desktop); static guint signals[N_SIGNALS] = { 0, }; @@ -471,7 +482,7 @@ workspace_backdrop_changed_cb(XfceWorkspace *workspace, g_return_if_fail(XFCE_IS_WORKSPACE(workspace) && XFCE_IS_BACKDROP(backdrop)); - if(desktop->priv->current_workspace == xfce_workspace_get_workspace_num(workspace)) + if(xfce_desktop_get_current_workspace(desktop) == xfce_workspace_get_workspace_num(workspace)) backdrop_changed_cb(backdrop, user_data); } @@ -481,15 +492,17 @@ workspace_changed_cb(WnckScreen *wnck_screen, gpointer user_data) { 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"); current_workspace = desktop->priv->current_workspace; - new_workspace = wnck_workspace_get_number(wnck_workspace); - desktop->priv->current_workspace = new_workspace; + desktop->priv->current_workspace = xfce_desktop_get_current_workspace(desktop); + new_workspace = desktop->priv->current_workspace; + + DBG("current_workspace %d, new_workspace %d", + current_workspace, new_workspace); /* special case for the spanning screen option */ if(xfce_workspace_get_xinerama_stretch(desktop->priv->workspaces[new_workspace])) { @@ -711,6 +724,20 @@ xfce_desktop_class_init(XfceDesktopClass *klass) "icon font size set", FALSE, XFDESKTOP_PARAM_FLAGS)); + + g_object_class_install_property(gobject_class, PROP_SINGLE_WORKSPACE_MODE, + g_param_spec_boolean("single-workspace-mode", + "single-workspace-mode", + "single-workspace-mode", + TRUE, + XFDESKTOP_PARAM_FLAGS)); + + g_object_class_install_property(gobject_class, PROP_SINGLE_WORKSPACE_NUMBER, + g_param_spec_int("single-workspace-number", + "single-workspace-number", + "single-workspace-number", + 0, 31, 0, + XFDESKTOP_PARAM_FLAGS)); #endif #undef XFDESKTOP_PARAM_FLAGS } @@ -768,6 +795,16 @@ xfce_desktop_set_property(GObject *object, break; #endif + case PROP_SINGLE_WORKSPACE_MODE: + xfce_desktop_set_single_workspace_mode(desktop, + g_value_get_boolean(value)); + break; + + case PROP_SINGLE_WORKSPACE_NUMBER: + xfce_desktop_set_single_workspace_number(desktop, + g_value_get_int(value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -801,6 +838,14 @@ xfce_desktop_get_property(GObject *object, break; #endif + case PROP_SINGLE_WORKSPACE_MODE: + g_value_set_boolean(value, desktop->priv->single_workspace_mode); + break; + + case PROP_SINGLE_WORKSPACE_NUMBER: + g_value_set_int(value, desktop->priv->single_workspace_num); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -816,7 +861,6 @@ xfce_desktop_realize(GtkWidget *widget) Window xid; GdkWindow *groot; WnckScreen *wnck_screen; - WnckWorkspace *wnck_workspace; TRACE("entering"); @@ -866,9 +910,16 @@ xfce_desktop_realize(GtkWidget *widget) wnck_screen_force_update(wnck_screen); desktop->priv->wnck_screen = wnck_screen; + xfconf_g_property_bind(desktop->priv->channel, + SINGLE_WORKSPACE_MODE, G_TYPE_BOOLEAN, + G_OBJECT(desktop), "single-workspace-mode"); + + xfconf_g_property_bind(desktop->priv->channel, + SINGLE_WORKSPACE_NUMBER, G_TYPE_INT, + G_OBJECT(desktop), "single-workspace-number"); + /* Get the current workspace number */ - wnck_workspace = wnck_screen_get_active_workspace(wnck_screen); - desktop->priv->current_workspace = wnck_workspace_get_number(wnck_workspace); + desktop->priv->current_workspace = xfce_desktop_get_current_workspace(desktop); desktop->priv->nworkspaces = wnck_screen_get_workspace_count(wnck_screen); desktop->priv->workspaces = g_realloc(desktop->priv->workspaces, @@ -1113,12 +1164,37 @@ xfce_desktop_connect_settings(XfceDesktop *desktop) xfce_desktop_thaw_updates(desktop); } +static gboolean +xfce_desktop_get_single_workspace_mode(XfceDesktop *desktop) +{ + g_return_val_if_fail(XFCE_IS_DESKTOP(desktop), TRUE); + + return desktop->priv->single_workspace_mode; +} + static gint xfce_desktop_get_current_workspace(XfceDesktop *desktop) { + WnckWorkspace *wnck_workspace; + gint workspace_num, current_workspace; + g_return_val_if_fail(XFCE_IS_DESKTOP(desktop), -1); - return desktop->priv->current_workspace; + wnck_workspace = wnck_screen_get_active_workspace(desktop->priv->wnck_screen); + workspace_num = wnck_workspace_get_number(wnck_workspace); + + /* If we're in single_workspace mode we need to return the workspace that + * it was set to, otherwise return the current workspace */ + if(xfce_desktop_get_single_workspace_mode(desktop)) { + current_workspace = desktop->priv->single_workspace_num; + } else { + current_workspace = workspace_num; + } + + DBG("workspace_num %d, single_workspace_num %d, current_workspace %d", + workspace_num, desktop->priv->single_workspace_num, current_workspace); + + return current_workspace; } /* public api */ @@ -1279,6 +1355,42 @@ xfce_desktop_set_use_icon_font_size(XfceDesktop *desktop, #endif } +static void +xfce_desktop_set_single_workspace_mode(XfceDesktop *desktop, + gboolean single_workspace) +{ + g_return_if_fail(XFCE_IS_DESKTOP(desktop)); + + if(single_workspace == desktop->priv->single_workspace_mode) + return; + + desktop->priv->single_workspace_mode = single_workspace; + + DBG("single_workspace_mode now %s", single_workspace ? "TRUE" : "FALSE"); + + /* Fake a screen size changed to update the backdrop */ + screen_size_changed_cb(desktop->priv->gscreen, desktop); +} + +static void +xfce_desktop_set_single_workspace_number(XfceDesktop *desktop, + gint workspace_num) +{ + g_return_if_fail(XFCE_IS_DESKTOP(desktop)); + + if(workspace_num == desktop->priv->single_workspace_num) + return; + + DBG("single_workspace_num now %d", workspace_num); + + desktop->priv->single_workspace_num = workspace_num; + + if(xfce_desktop_get_single_workspace_mode(desktop)) { + /* Fake a screen size changed to update the backdrop */ + screen_size_changed_cb(desktop->priv->gscreen, desktop); + } +} + void xfce_desktop_set_session_logout_func(XfceDesktop *desktop, SessionLogoutFunc logout_func) @@ -1386,7 +1498,7 @@ xfce_desktop_refresh(XfceDesktop *desktop) if(!gtk_widget_get_realized(GTK_WIDGET(desktop))) return; - current_workspace = desktop->priv->current_workspace; + current_workspace = xfce_desktop_get_current_workspace(desktop); /* reload backgrounds */ for(i = 0; i < xfce_desktop_get_n_monitors(desktop); i++) { _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits