diff --git a/src/core/window-private.h b/src/core/window-private.h index cf26b7f2e..f0bcc4d63 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -477,6 +477,7 @@ struct _MetaWindowClass MetaGrabOp op); void (*grab_op_ended) (MetaWindow *window, MetaGrabOp op); + void (*current_workspace_changed) (MetaWindow *window); void (*move_resize_internal) (MetaWindow *window, int gravity, MetaRectangle requested_rect, @@ -615,9 +616,7 @@ void meta_window_update_unfocused_button_grabs (MetaWindow *window); void meta_window_set_focused_internal (MetaWindow *window, gboolean focused); -void meta_window_set_current_workspace_hint (MetaWindow *window); - -unsigned long meta_window_get_net_wm_desktop (MetaWindow *window); +void meta_window_current_workspace_changed (MetaWindow *window); void meta_window_show_menu (MetaWindow *window); diff --git a/src/core/window.c b/src/core/window.c index cab199429..0e2427af9 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -205,6 +205,11 @@ meta_window_real_grab_op_ended (MetaWindow *window, window->shaken_loose = FALSE; } +static void +meta_window_real_current_workspace_changed (MetaWindow *window) +{ +} + static gboolean meta_window_real_update_struts (MetaWindow *window) { @@ -378,6 +383,7 @@ meta_window_class_init (MetaWindowClass *klass) klass->grab_op_began = meta_window_real_grab_op_began; klass->grab_op_ended = meta_window_real_grab_op_ended; + klass->current_workspace_changed = meta_window_real_current_workspace_changed; klass->update_struts = meta_window_real_update_struts; klass->get_default_skip_hints = meta_window_real_get_default_skip_hints; @@ -1130,7 +1136,7 @@ _meta_window_shared_new (MetaDisplay *display, } /* for the various on_all_workspaces = TRUE possible above */ - meta_window_set_current_workspace_hint (window); + meta_window_current_workspace_changed (window); meta_window_update_struts (window); } @@ -1502,7 +1508,7 @@ meta_window_update_on_all_workspaces (MetaWindow *window) tmp = tmp->next; } } - meta_window_set_current_workspace_hint (window); + meta_window_current_workspace_changed (window); } } @@ -4637,40 +4643,10 @@ meta_window_unstick (MetaWindow *window) &stick); } -unsigned long -meta_window_get_net_wm_desktop (MetaWindow *window) -{ - if (window->on_all_workspaces) - return 0xFFFFFFFF; - else - return meta_workspace_index (window->workspace); -} - void -meta_window_set_current_workspace_hint (MetaWindow *window) +meta_window_current_workspace_changed (MetaWindow *window) { - /* FIXME if on more than one workspace, we claim to be "sticky", - * the WM spec doesn't say what to do here. - */ - unsigned long data[1]; - - if (window->workspace == NULL) - { - /* this happens when unmanaging windows */ - return; - } - - data[0] = meta_window_get_net_wm_desktop (window); - - meta_verbose ("Setting _NET_WM_DESKTOP of %s to %lu\n", - window->desc, data[0]); - - meta_error_trap_push (window->display); - XChangeProperty (window->display->xdisplay, window->xwindow, - window->display->atom__NET_WM_DESKTOP, - XA_CARDINAL, - 32, PropModeReplace, (guchar*) data, 1); - meta_error_trap_pop (window->display); + META_WINDOW_GET_CLASS (window)->current_workspace_changed (window); } static gboolean diff --git a/src/core/workspace.c b/src/core/workspace.c index 80c38f832..419adb9ce 100644 --- a/src/core/workspace.c +++ b/src/core/workspace.c @@ -342,7 +342,7 @@ meta_workspace_add_window (MetaWorkspace *workspace, window->workspace = workspace; - meta_window_set_current_workspace_hint (window); + meta_window_current_workspace_changed (window); if (window->struts) { @@ -391,7 +391,7 @@ meta_workspace_remove_window (MetaWorkspace *workspace, g_assert (g_list_find (workspace->mru_list, window) == NULL); } - meta_window_set_current_workspace_hint (window); + meta_window_current_workspace_changed (window); if (window->struts) { @@ -718,7 +718,7 @@ meta_workspace_update_window_hints (MetaWorkspace *workspace) { MetaWindow *win = l->data; - meta_window_set_current_workspace_hint (win); + meta_window_current_workspace_changed (win); l = l->next; } diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index fd4efe350..85dcabad0 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -945,6 +945,42 @@ send_sync_request (MetaWindow *window) meta_window_updates_are_frozen (window)); } +static unsigned long +meta_window_get_net_wm_desktop (MetaWindow *window) +{ + if (window->on_all_workspaces) + return 0xFFFFFFFF; + else + return meta_workspace_index (window->workspace); +} + +static void +meta_window_x11_current_workspace_changed (MetaWindow *window) +{ + /* FIXME if on more than one workspace, we claim to be "sticky", + * the WM spec doesn't say what to do here. + */ + unsigned long data[1]; + + if (window->workspace == NULL) + { + /* this happens when unmanaging windows */ + return; + } + + data[0] = meta_window_get_net_wm_desktop (window); + + meta_verbose ("Setting _NET_WM_DESKTOP of %s to %lu\n", + window->desc, data[0]); + + meta_error_trap_push (window->display); + XChangeProperty (window->display->xdisplay, window->xwindow, + window->display->atom__NET_WM_DESKTOP, + XA_CARDINAL, + 32, PropModeReplace, (guchar*) data, 1); + meta_error_trap_pop (window->display); +} + static void meta_window_x11_move_resize_internal (MetaWindow *window, int gravity, @@ -1426,6 +1462,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass) window_class->focus = meta_window_x11_focus; window_class->grab_op_began = meta_window_x11_grab_op_began; window_class->grab_op_ended = meta_window_x11_grab_op_ended; + window_class->current_workspace_changed = meta_window_x11_current_workspace_changed; window_class->move_resize_internal = meta_window_x11_move_resize_internal; window_class->update_struts = meta_window_x11_update_struts; window_class->get_default_skip_hints = meta_window_x11_get_default_skip_hints;