diff --git a/src/core/window-private.h b/src/core/window-private.h index 492d247a5..f9b2aa024 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -612,9 +612,6 @@ struct _MetaWindowClass gboolean (*set_transient_for) (MetaWindow *window, MetaWindow *parent); - - void (* map) (MetaWindow *window); - void (* unmap) (MetaWindow *window); }; /* These differ from window->has_foo_func in that they consider diff --git a/src/core/window.c b/src/core/window.c index 395bbea1c..698da790e 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -221,6 +221,7 @@ enum PROP_DISPLAY, PROP_EFFECT, PROP_SUSPEND_STATE, + PROP_MAPPED, PROP_LAST, }; @@ -439,6 +440,9 @@ meta_window_get_property(GObject *object, case PROP_SUSPEND_STATE: g_value_set_enum (value, priv->suspend_state); break; + case PROP_MAPPED: + g_value_set_boolean (value, win->mapped); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -598,15 +602,17 @@ meta_window_class_init (MetaWindowClass *klass) META_COMP_EFFECT_NONE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); - /** - * MetaWindow::suspend-state: (skip) - */ obj_props[PROP_SUSPEND_STATE] = g_param_spec_enum ("suspend-state", NULL, NULL, META_TYPE_WINDOW_SUSPEND_STATE, META_WINDOW_SUSPEND_STATE_ACTIVE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + obj_props[PROP_MAPPED] = + g_param_spec_boolean ("mapped", NULL, NULL, + FALSE, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, PROP_LAST, obj_props); window_signals[WORKSPACE_CHANGED] = @@ -833,11 +839,7 @@ sync_client_window_mapped (MetaWindow *window) return; window->mapped = should_be_mapped; - - if (window->mapped) - META_WINDOW_GET_CLASS (window)->map (window); - else - META_WINDOW_GET_CLASS (window)->unmap (window); + g_object_notify_by_pspec (G_OBJECT (window), obj_props[PROP_MAPPED]); } static gboolean diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c index c92c2544c..c4b608148 100644 --- a/src/wayland/meta-window-wayland.c +++ b/src/wayland/meta-window-wayland.c @@ -816,16 +816,6 @@ meta_window_wayland_calculate_layer (MetaWindow *window) return meta_window_get_default_layer (window); } -static void -meta_window_wayland_map (MetaWindow *window) -{ -} - -static void -meta_window_wayland_unmap (MetaWindow *window) -{ -} - static void meta_window_wayland_constructed (GObject *object) { @@ -935,8 +925,6 @@ meta_window_wayland_class_init (MetaWindowWaylandClass *klass) window_class->can_ping = meta_window_wayland_can_ping; window_class->are_updates_frozen = meta_window_wayland_are_updates_frozen; window_class->calculate_layer = meta_window_wayland_calculate_layer; - window_class->map = meta_window_wayland_map; - window_class->unmap = meta_window_wayland_unmap; window_class->is_focus_async = meta_window_wayland_is_focus_async; window_class->get_wayland_surface = meta_window_wayland_get_wayland_surface; window_class->set_transient_for = meta_window_wayland_set_transient_for; diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c index ad4848aff..891bb68d6 100644 --- a/src/x11/window-x11.c +++ b/src/x11/window-x11.c @@ -1956,26 +1956,25 @@ meta_window_x11_impl_thaw_commits (MetaWindow *window) } static void -meta_window_x11_map (MetaWindow *window) +on_mapped_changed (MetaWindow *window) { MetaX11Display *x11_display = window->display->x11_display; - mtk_x11_error_trap_push (x11_display->xdisplay); - XMapWindow (x11_display->xdisplay, - meta_window_x11_get_xwindow (window)); - mtk_x11_error_trap_pop (x11_display->xdisplay); -} - -static void -meta_window_x11_unmap (MetaWindow *window) -{ - MetaX11Display *x11_display = window->display->x11_display; - - mtk_x11_error_trap_push (x11_display->xdisplay); - XUnmapWindow (x11_display->xdisplay, - meta_window_x11_get_xwindow (window)); - mtk_x11_error_trap_pop (x11_display->xdisplay); - window->unmaps_pending ++; + if (window->mapped) + { + mtk_x11_error_trap_push (x11_display->xdisplay); + XMapWindow (x11_display->xdisplay, + meta_window_x11_get_xwindow (window)); + mtk_x11_error_trap_pop (x11_display->xdisplay); + } + else + { + mtk_x11_error_trap_push (x11_display->xdisplay); + XUnmapWindow (x11_display->xdisplay, + meta_window_x11_get_xwindow (window)); + mtk_x11_error_trap_pop (x11_display->xdisplay); + window->unmaps_pending ++; + } } static gboolean @@ -2097,6 +2096,10 @@ meta_window_x11_constructed (GObject *object) G_CALLBACK (meta_window_x11_update_input_region), window); + g_signal_connect (window, "notify::mapped", + G_CALLBACK (on_mapped_changed), + NULL); + G_OBJECT_CLASS (meta_window_x11_parent_class)->constructed (object); } @@ -2194,8 +2197,6 @@ meta_window_x11_class_init (MetaWindowX11Class *klass) window_class->can_ping = meta_window_x11_can_ping; window_class->are_updates_frozen = meta_window_x11_are_updates_frozen; window_class->calculate_layer = meta_window_x11_calculate_layer; - window_class->map = meta_window_x11_map; - window_class->unmap = meta_window_x11_unmap; window_class->is_focus_async = meta_window_x11_is_focus_async; window_class->set_transient_for = meta_window_x11_set_transient_for;