From fffb863f372a71e3bd38df7a58721eeabc53f538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 3 Mar 2015 11:13:05 +0800 Subject: [PATCH] wayland: Sync surface actor state when changing main monitor In order to switch to the correct surface actor scale given the monitor the surface is on, without relying on the client committing a new state given some other side effect, sync the surface actor state when the main monitor associated with the corresponding window changed. https://bugzilla.gnome.org/show_bug.cgi?id=744933 --- src/compositor/meta-surface-actor-wayland.c | 17 ++++++++++++++ src/compositor/meta-surface-actor-wayland.h | 2 ++ src/core/window-private.h | 2 ++ src/core/window.c | 25 ++++++++++++++++----- src/wayland/window-wayland.c | 17 ++++++++++++++ src/x11/window-x11.c | 7 ++++++ 6 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/compositor/meta-surface-actor-wayland.c b/src/compositor/meta-surface-actor-wayland.c index 7957399d0..a70d8e108 100644 --- a/src/compositor/meta-surface-actor-wayland.c +++ b/src/compositor/meta-surface-actor-wayland.c @@ -175,6 +175,23 @@ meta_surface_actor_wayland_sync_state (MetaSurfaceActorWayland *self) } } +void +meta_surface_actor_wayland_sync_state_recursive (MetaSurfaceActorWayland *self) +{ + MetaWaylandSurface *surface = meta_surface_actor_wayland_get_surface (self); + GList *iter; + + meta_surface_actor_wayland_sync_state (self); + + for (iter = surface->subsurfaces; iter != NULL; iter = iter->next) + { + MetaWaylandSurface *subsurf = iter->data; + + meta_surface_actor_wayland_sync_state_recursive ( + META_SURFACE_ACTOR_WAYLAND (subsurf->surface_actor)); + } +} + static MetaWindow * meta_surface_actor_wayland_get_window (MetaSurfaceActor *actor) { diff --git a/src/compositor/meta-surface-actor-wayland.h b/src/compositor/meta-surface-actor-wayland.h index 8ef2b05cd..28fd43cab 100644 --- a/src/compositor/meta-surface-actor-wayland.h +++ b/src/compositor/meta-surface-actor-wayland.h @@ -65,6 +65,8 @@ double meta_surface_actor_wayland_get_scale (MetaSurfaceActorWayland *actor); void meta_surface_actor_wayland_sync_state (MetaSurfaceActorWayland *self); +void meta_surface_actor_wayland_sync_state_recursive (MetaSurfaceActorWayland *self); + G_END_DECLS #endif /* __META_SURFACE_ACTOR_WAYLAND_H__ */ diff --git a/src/core/window-private.h b/src/core/window-private.h index 1ae29fcc4..136635c0d 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -482,6 +482,8 @@ struct _MetaWindowClass gboolean (*update_icon) (MetaWindow *window, cairo_surface_t **icon, cairo_surface_t **mini_icon); + void (*main_monitor_changed) (MetaWindow *window, + const MetaMonitorInfo *old); }; /* These differ from window->has_foo_func in that they consider diff --git a/src/core/window.c b/src/core/window.c index b8245a34d..3e80dc8a1 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -761,6 +761,20 @@ meta_window_update_desc (MetaWindow *window) window->desc = g_strdup_printf ("0x%lx", window->xwindow); } +static void +meta_window_main_monitor_changed (MetaWindow *window, + const MetaMonitorInfo *old) +{ + META_WINDOW_GET_CLASS (window)->main_monitor_changed (window, old); + + if (old) + g_signal_emit_by_name (window->screen, "window-left-monitor", + old->number, window); + if (window->monitor) + g_signal_emit_by_name (window->screen, "window-entered-monitor", + window->monitor->number, window); +} + MetaWindow * _meta_window_shared_new (MetaDisplay *display, MetaScreen *screen, @@ -1128,7 +1142,7 @@ _meta_window_shared_new (MetaDisplay *display, meta_window_update_struts (window); } - g_signal_emit_by_name (window->screen, "window-entered-monitor", window->monitor->number, window); + meta_window_main_monitor_changed (window, NULL); /* Must add window to stack before doing move/resize, since the * window might have fullscreen size (i.e. should have been @@ -1369,9 +1383,10 @@ meta_window_unmanage (MetaWindow *window, if (window->monitor) { - g_signal_emit_by_name (window->screen, "window-left-monitor", - window->monitor->number, window); + const MetaMonitorInfo *old = window->monitor; + window->monitor = NULL; + meta_window_main_monitor_changed (window, old); } if (!window->override_redirect) @@ -3568,9 +3583,7 @@ meta_window_update_monitor (MetaWindow *window, window->screen->active_workspace != window->workspace) meta_window_change_workspace (window, window->screen->active_workspace); - if (old) - g_signal_emit_by_name (window->screen, "window-left-monitor", old->number, window); - g_signal_emit_by_name (window->screen, "window-entered-monitor", window->monitor->number, window); + meta_window_main_monitor_changed (window, old); /* If we're changing monitors, we need to update the has_maximize_func flag, * as the working area has changed. */ diff --git a/src/wayland/window-wayland.c b/src/wayland/window-wayland.c index b358a73a1..b7016b9cf 100644 --- a/src/wayland/window-wayland.c +++ b/src/wayland/window-wayland.c @@ -31,6 +31,7 @@ #include "boxes-private.h" #include "stack-tracker.h" #include "meta-wayland-surface.h" +#include "compositor/meta-surface-actor-wayland.h" struct _MetaWindowWayland { @@ -270,6 +271,21 @@ meta_window_wayland_move_resize_internal (MetaWindow *window, } } +static void +meta_window_wayland_main_monitor_changed (MetaWindow *window, + const MetaMonitorInfo *old) +{ + MetaWaylandSurface *surface = window->surface; + + if (surface) + { + MetaSurfaceActorWayland *actor = + META_SURFACE_ACTOR_WAYLAND (surface->surface_actor); + + meta_surface_actor_wayland_sync_state_recursive (actor); + } +} + static void appears_focused_changed (GObject *object, GParamSpec *pspec, @@ -308,6 +324,7 @@ meta_window_wayland_class_init (MetaWindowWaylandClass *klass) window_class->grab_op_began = meta_window_wayland_grab_op_began; window_class->grab_op_ended = meta_window_wayland_grab_op_ended; window_class->move_resize_internal = meta_window_wayland_move_resize_internal; + window_class->main_monitor_changed = meta_window_wayland_main_monitor_changed; } MetaWindow * diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index 5a741eb26..ec3656ec0 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -1470,6 +1470,12 @@ meta_window_x11_update_icon (MetaWindow *window, META_MINI_ICON_WIDTH, META_MINI_ICON_HEIGHT); } +static void +meta_window_x11_main_monitor_changed (MetaWindow *window, + const MetaMonitorInfo *old) +{ +} + static void meta_window_x11_class_init (MetaWindowX11Class *klass) { @@ -1488,6 +1494,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass) window_class->update_struts = meta_window_x11_update_struts; window_class->get_default_skip_hints = meta_window_x11_get_default_skip_hints; window_class->update_icon = meta_window_x11_update_icon; + window_class->main_monitor_changed = meta_window_x11_main_monitor_changed; } void