diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c index fcf97ae85..fcf3d2c16 100644 --- a/src/compositor/meta-window-actor.c +++ b/src/compositor/meta-window-actor.c @@ -375,16 +375,19 @@ init_surface_actor (MetaWindowActor *self) MetaWindowActorPrivate *priv = meta_window_actor_get_instance_private (self); MetaWindow *window = priv->window; - MetaSurfaceActor *surface_actor; + MetaSurfaceActor *surface_actor = NULL; if (!meta_is_wayland_compositor ()) - surface_actor = meta_surface_actor_x11_new (window); + { + surface_actor = meta_surface_actor_x11_new (window); + } #ifdef HAVE_WAYLAND - else if (window->surface) - surface_actor = meta_wayland_surface_get_actor (window->surface); -#endif else - surface_actor = NULL; + { + MetaWaylandSurface *surface = meta_window_get_wayland_surface (window); + surface_actor = surface ? meta_wayland_surface_get_actor (surface) : NULL; + } +#endif if (surface_actor) meta_window_actor_assign_surface_actor (self, surface_actor); diff --git a/src/core/display.c b/src/core/display.c index ce1335b84..906863911 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -1437,8 +1437,11 @@ meta_display_sync_wayland_input_focus (MetaDisplay *display) focus_window = NULL; else if (clutter_stage_get_grab_actor (CLUTTER_STAGE (stage))) focus_window = NULL; - else if (display->focus_window && display->focus_window->surface) +#ifdef HAVE_WAYLAND + else if (display->focus_window && + meta_window_get_wayland_surface (display->focus_window)) focus_window = display->focus_window; +#endif else meta_topic (META_DEBUG_FOCUS, "Focus change has no effect, because there is no matching wayland surface"); diff --git a/src/core/window-private.h b/src/core/window-private.h index 1abe94c13..6ee58f49d 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -170,7 +170,6 @@ struct _MetaWindow MetaLogicalMonitor *monitor; MetaWorkspace *workspace; MetaWindowClientType client_type; - MetaWaylandSurface *surface; Window xwindow; /* may be NULL! not all windows get decorated */ MetaFrame *frame; @@ -619,6 +618,10 @@ struct _MetaWindowClass MetaStackLayer (*calculate_layer) (MetaWindow *window); +#ifdef HAVE_WAYLAND + MetaWaylandSurface * (*get_wayland_surface) (MetaWindow *window); +#endif + void (* map) (MetaWindow *window); void (* unmap) (MetaWindow *window); }; @@ -722,6 +725,11 @@ gboolean meta_window_can_ping (MetaWindow *window); MetaStackLayer meta_window_calculate_layer (MetaWindow *window); +#ifdef HAVE_WAYLAND +META_EXPORT_TEST +MetaWaylandSurface * meta_window_get_wayland_surface (MetaWindow *window); +#endif + 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 bd4d36298..7faa3e95c 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -197,7 +197,6 @@ enum PROP_IS_ALIVE, PROP_DISPLAY, PROP_EFFECT, - PROP_SURFACE, PROP_XWINDOW, PROP_LAST, @@ -418,9 +417,6 @@ meta_window_get_property(GObject *object, case PROP_EFFECT: g_value_set_int (value, win->pending_compositor_effect); break; - case PROP_SURFACE: - g_value_set_pointer (value, win->surface); - break; case PROP_XWINDOW: g_value_set_ulong (value, win->xwindow); break; @@ -446,9 +442,6 @@ meta_window_set_property(GObject *object, case PROP_EFFECT: win->pending_compositor_effect = g_value_get_int (value); break; - case PROP_SURFACE: - win->surface = g_value_get_pointer (value); - break; case PROP_XWINDOW: win->xwindow = g_value_get_ulong (value); break; @@ -834,9 +827,12 @@ static gboolean client_window_should_be_mapped (MetaWindow *window) { #ifdef HAVE_WAYLAND - if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND && - !meta_wayland_surface_get_buffer (window->surface)) - return FALSE; + if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND) + { + MetaWaylandSurface *surface = meta_window_get_wayland_surface (window); + if (!meta_wayland_surface_get_buffer (surface)) + return FALSE; + } #endif return !window->shaded; @@ -1683,9 +1679,12 @@ meta_window_should_be_showing (MetaWindow *window) MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; #ifdef HAVE_WAYLAND - if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND && - !meta_wayland_surface_get_buffer (window->surface)) - return FALSE; + if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND) + { + MetaWaylandSurface *surface = meta_window_get_wayland_surface (window); + if (!meta_wayland_surface_get_buffer (surface)) + return FALSE; + } #endif /* Windows should be showing if they're located on the @@ -4503,7 +4502,10 @@ meta_window_transient_can_focus (MetaWindow *window) { #ifdef HAVE_WAYLAND if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND) - return meta_wayland_surface_get_buffer (window->surface) != NULL; + { + MetaWaylandSurface *surface = meta_window_get_wayland_surface (window); + return meta_wayland_surface_get_buffer (surface) != NULL; + } #endif return TRUE; @@ -8526,6 +8528,17 @@ meta_window_calculate_layer (MetaWindow *window) return META_WINDOW_GET_CLASS (window)->calculate_layer (window); } +#ifdef HAVE_WAYLAND +MetaWaylandSurface * +meta_window_get_wayland_surface (MetaWindow *window) +{ + MetaWindowClass *klass = META_WINDOW_GET_CLASS (window); + g_return_val_if_fail (klass->get_wayland_surface != NULL, NULL); + + return klass->get_wayland_surface (window); +} +#endif + /** * meta_window_get_id: * @window: a #MetaWindow diff --git a/src/tests/wayland-fullscreen-test.c b/src/tests/wayland-fullscreen-test.c index 6a7d5d71a..871b1431b 100644 --- a/src/tests/wayland-fullscreen-test.c +++ b/src/tests/wayland-fullscreen-test.c @@ -37,10 +37,10 @@ static MetaWindow *test_window = NULL; #define assert_wayland_surface_size(window, width, height) \ { \ - g_assert_cmpint (meta_wayland_surface_get_width (window->surface), \ + g_assert_cmpint (meta_wayland_surface_get_width (meta_window_get_wayland_surface (window)), \ ==, \ width); \ - g_assert_cmpint (meta_wayland_surface_get_height (window->surface), \ + g_assert_cmpint (meta_wayland_surface_get_height (meta_window_get_wayland_surface (window)), \ ==, \ height); \ } diff --git a/src/wayland/meta-wayland-client.c b/src/wayland/meta-wayland-client.c index 69c7b8333..2081d14a9 100644 --- a/src/wayland/meta-wayland-client.c +++ b/src/wayland/meta-wayland-client.c @@ -41,6 +41,7 @@ #include "meta/util.h" #include "wayland/meta-wayland-private.h" #include "wayland/meta-wayland-types.h" +#include "wayland/meta-window-wayland.h" struct _MetaWaylandClient { @@ -296,7 +297,7 @@ meta_wayland_client_owns_window (MetaWaylandClient *client, g_return_val_if_fail (client->subprocess != NULL, FALSE); g_return_val_if_fail (client->process_running, FALSE); - surface = window->surface; + surface = meta_window_get_wayland_surface (window); if (surface == NULL) return FALSE; diff --git a/src/wayland/meta-wayland-pointer-constraints.c b/src/wayland/meta-wayland-pointer-constraints.c index 965b95dda..6d42973af 100644 --- a/src/wayland/meta-wayland-pointer-constraints.c +++ b/src/wayland/meta-wayland-pointer-constraints.c @@ -574,7 +574,7 @@ meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat, static void meta_wayland_pointer_constraint_maybe_enable_for_window (MetaWindow *window) { - MetaWaylandSurface *surface = window->surface; + MetaWaylandSurface *surface = meta_window_get_wayland_surface (window); MetaWaylandSurfacePointerConstraintsData *surface_data; GList *l; diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c index 9d066b19c..4227d546b 100644 --- a/src/wayland/meta-wayland.c +++ b/src/wayland/meta-wayland.c @@ -143,8 +143,12 @@ void meta_wayland_compositor_set_input_focus (MetaWaylandCompositor *compositor, MetaWindow *window) { - MetaWaylandSurface *surface = window ? window->surface : NULL; + MetaWaylandSurface *surface; + if (window) + surface = meta_window_get_wayland_surface (window); + else + surface = NULL; meta_wayland_seat_set_input_focus (compositor->seat, surface); } diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c index 13c90303b..3be11de40 100644 --- a/src/wayland/meta-window-wayland.c +++ b/src/wayland/meta-window-wayland.c @@ -44,12 +44,25 @@ #include "wayland/meta-wayland-window-configuration.h" #include "wayland/meta-wayland-xdg-shell.h" +enum +{ + PROP_0, + + PROP_SURFACE, + + PROP_LAST +}; + +static GParamSpec *obj_props[PROP_LAST]; + struct _MetaWindowWayland { MetaWindow parent; int geometry_scale; + MetaWaylandSurface *surface; + GList *pending_configurations; gboolean has_pending_state_change; @@ -112,7 +125,7 @@ meta_window_wayland_manage (MetaWindow *window) 0); } - meta_wayland_surface_window_managed (window->surface, window); + meta_wayland_surface_window_managed (wl_window->surface, window); } static void @@ -131,20 +144,24 @@ static void meta_window_wayland_ping (MetaWindow *window, guint32 serial) { - meta_wayland_surface_ping (window->surface, serial); + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + + meta_wayland_surface_ping (wl_window->surface, serial); } static void meta_window_wayland_delete (MetaWindow *window, guint32 timestamp) { - meta_wayland_surface_delete (window->surface); + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + + meta_wayland_surface_delete (wl_window->surface); } static void meta_window_wayland_kill (MetaWindow *window) { - MetaWaylandSurface *surface = window->surface; + MetaWaylandSurface *surface = meta_window_get_wayland_surface (window); struct wl_resource *resource = surface->resource; /* Send the client an unrecoverable error to kill the client. */ @@ -170,9 +187,7 @@ static void meta_window_wayland_configure (MetaWindowWayland *wl_window, MetaWaylandWindowConfiguration *configuration) { - MetaWindow *window = META_WINDOW (wl_window); - - meta_wayland_surface_configure_notify (window->surface, configuration); + meta_wayland_surface_configure_notify (wl_window->surface, configuration); wl_window->pending_configurations = g_list_prepend (wl_window->pending_configurations, configuration); @@ -378,7 +393,7 @@ meta_window_wayland_move_resize_internal (MetaWindow *window, int bounds_width; int bounds_height; - if (!meta_wayland_surface_get_buffer (window->surface) && + if (!meta_wayland_surface_get_buffer (wl_window->surface) && !META_WINDOW_MAXIMIZED (window) && window->tile_mode == META_TILE_NONE && !meta_window_is_fullscreen (window)) @@ -489,6 +504,7 @@ meta_window_wayland_update_main_monitor (MetaWindow *window, MetaBackend *backend = meta_get_backend (); MetaMonitorManager *monitor_manager = meta_backend_get_monitor_manager (backend); + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); MetaWindow *toplevel_window; MetaLogicalMonitor *from; MetaLogicalMonitor *to; @@ -501,7 +517,7 @@ meta_window_wayland_update_main_monitor (MetaWindow *window, /* If the window is not a toplevel window (i.e. it's a popup window) just use * the monitor of the toplevel. */ - toplevel_window = meta_wayland_surface_get_toplevel_window (window->surface); + toplevel_window = meta_wayland_surface_get_toplevel_window (wl_window->surface); if (toplevel_window != window) { meta_window_update_monitor (toplevel_window, flags); @@ -622,7 +638,7 @@ meta_window_wayland_main_monitor_changed (MetaWindow *window, window, TRUE); - surface = window->surface; + surface = wl_window->surface; if (surface) { MetaWaylandActorSurface *actor_surface = @@ -638,7 +654,7 @@ meta_window_wayland_main_monitor_changed (MetaWindow *window, static pid_t meta_window_wayland_get_client_pid (MetaWindow *window) { - MetaWaylandSurface *surface = window->surface; + MetaWaylandSurface *surface = meta_window_get_wayland_surface (window); struct wl_resource *resource = surface->resource; pid_t pid; @@ -718,7 +734,8 @@ meta_window_wayland_can_ping (MetaWindow *window) static gboolean meta_window_wayland_is_stackable (MetaWindow *window) { - return meta_wayland_surface_get_buffer (window->surface) != NULL; + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + return meta_wayland_surface_get_buffer (wl_window->surface) != NULL; } static gboolean @@ -735,6 +752,14 @@ meta_window_wayland_is_focus_async (MetaWindow *window) return FALSE; } +static MetaWaylandSurface * +meta_window_wayland_get_wayland_surface (MetaWindow *window) +{ + MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); + + return wl_window->surface; +} + static MetaStackLayer meta_window_wayland_calculate_layer (MetaWindow *window) { @@ -793,6 +818,44 @@ meta_window_wayland_finalize (GObject *object) G_OBJECT_CLASS (meta_window_wayland_parent_class)->finalize (object); } +static void +meta_window_wayland_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MetaWindowWayland *window = META_WINDOW_WAYLAND (object); + + switch (prop_id) + { + case PROP_SURFACE: + g_value_set_object (value, window->surface); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +meta_window_wayland_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MetaWindowWayland *window = META_WINDOW_WAYLAND (object); + + switch (prop_id) + { + case PROP_SURFACE: + window->surface = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static void meta_window_wayland_class_init (MetaWindowWaylandClass *klass) { @@ -800,6 +863,8 @@ meta_window_wayland_class_init (MetaWindowWaylandClass *klass) MetaWindowClass *window_class = META_WINDOW_CLASS (klass); object_class->finalize = meta_window_wayland_finalize; + object_class->get_property = meta_window_wayland_get_property; + object_class->set_property = meta_window_wayland_set_property; object_class->constructed = meta_window_wayland_constructed; window_class->manage = meta_window_wayland_manage; @@ -824,6 +889,16 @@ meta_window_wayland_class_init (MetaWindowWaylandClass *klass) 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; + + obj_props[PROP_SURFACE] = + g_param_spec_object ("surface", + "Surface", + "The corresponding Wayland surface", + META_TYPE_WAYLAND_SURFACE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, PROP_LAST, obj_props); } MetaWindow * diff --git a/src/wayland/meta-window-xwayland.c b/src/wayland/meta-window-xwayland.c index 54ccc91fe..5dd179e94 100644 --- a/src/wayland/meta-window-xwayland.c +++ b/src/wayland/meta-window-xwayland.c @@ -27,12 +27,14 @@ #include "x11/xprops.h" #include "wayland/meta-window-xwayland.h" #include "wayland/meta-wayland.h" +#include "wayland/meta-wayland-surface.h" enum { PROP_0, PROP_XWAYLAND_MAY_GRAB_KEYBOARD, + PROP_SURFACE, PROP_LAST }; @@ -43,6 +45,8 @@ struct _MetaWindowXwayland { MetaWindowX11 parent; + MetaWaylandSurface *surface; + gboolean xwayland_may_grab_keyboard; int freeze_count; }; @@ -164,6 +168,14 @@ meta_window_xwayland_shortcuts_inhibited (MetaWindow *window, return meta_wayland_compositor_is_shortcuts_inhibited (compositor, source); } +static MetaWaylandSurface * +meta_window_xwayland_get_wayland_surface (MetaWindow *window) +{ + MetaWindowXwayland *xwayland_window = META_WINDOW_XWAYLAND (window); + + return xwayland_window->surface; +} + static void apply_allow_commits_x11_property (MetaWindowXwayland *xwayland_window, gboolean allow_commits) @@ -251,6 +263,9 @@ meta_window_xwayland_get_property (GObject *object, case PROP_XWAYLAND_MAY_GRAB_KEYBOARD: g_value_set_boolean (value, window->xwayland_may_grab_keyboard); break; + case PROP_SURFACE: + g_value_set_object (value, window->surface); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -270,6 +285,9 @@ meta_window_xwayland_set_property (GObject *object, case PROP_XWAYLAND_MAY_GRAB_KEYBOARD: window->xwayland_may_grab_keyboard = g_value_get_boolean (value); break; + case PROP_SURFACE: + window->surface = g_value_get_object (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -286,6 +304,7 @@ meta_window_xwayland_class_init (MetaWindowXwaylandClass *klass) window_class->adjust_fullscreen_monitor_rect = meta_window_xwayland_adjust_fullscreen_monitor_rect; window_class->force_restore_shortcuts = meta_window_xwayland_force_restore_shortcuts; window_class->shortcuts_inhibited = meta_window_xwayland_shortcuts_inhibited; + window_class->get_wayland_surface = meta_window_xwayland_get_wayland_surface; window_x11_class->freeze_commits = meta_window_xwayland_freeze_commits; window_x11_class->thaw_commits = meta_window_xwayland_thaw_commits; @@ -301,5 +320,19 @@ meta_window_xwayland_class_init (MetaWindowXwaylandClass *klass) FALSE, G_PARAM_READWRITE); + obj_props[PROP_SURFACE] = + g_param_spec_object ("surface", + "Surface", + "The corresponding Wayland surface", + META_TYPE_WAYLAND_SURFACE, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + g_object_class_install_properties (gobject_class, PROP_LAST, obj_props); } + +void +meta_window_xwayland_set_surface (MetaWindowXwayland *window, + MetaWaylandSurface *surface) +{ + window->surface = surface; +} diff --git a/src/wayland/meta-window-xwayland.h b/src/wayland/meta-window-xwayland.h index 5ea6041d4..5bec0cea8 100644 --- a/src/wayland/meta-window-xwayland.h +++ b/src/wayland/meta-window-xwayland.h @@ -29,6 +29,10 @@ G_BEGIN_DECLS G_DECLARE_FINAL_TYPE (MetaWindowXwayland, meta_window_xwayland, META, WINDOW_XWAYLAND, MetaWindowX11) + +void meta_window_xwayland_set_surface (MetaWindowXwayland *window, + MetaWaylandSurface *surface); + G_END_DECLS #endif diff --git a/src/wayland/meta-xwayland-dnd.c b/src/wayland/meta-xwayland-dnd.c index 7c6de409b..1a8d264b3 100644 --- a/src/wayland/meta-xwayland-dnd.c +++ b/src/wayland/meta-xwayland-dnd.c @@ -730,7 +730,7 @@ pick_drop_surface (MetaWaylandCompositor *compositor, focus_window = meta_workspace_get_default_focus_window_at_point (workspace, NULL, pos.x, pos.y); - return focus_window ? focus_window->surface : NULL; + return focus_window ? meta_window_get_wayland_surface (focus_window) : NULL; } static void diff --git a/src/wayland/meta-xwayland-surface.c b/src/wayland/meta-xwayland-surface.c index 54db84470..114f7d736 100644 --- a/src/wayland/meta-xwayland-surface.c +++ b/src/wayland/meta-xwayland-surface.c @@ -26,6 +26,7 @@ #include "compositor/meta-surface-actor-wayland.h" #include "compositor/meta-window-actor-private.h" #include "wayland/meta-wayland-actor-surface.h" +#include "wayland/meta-window-xwayland.h" #include "wayland/meta-xwayland-private.h" enum @@ -58,14 +59,15 @@ clear_window (MetaXwaylandSurface *xwayland_surface) MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (surface_role); MetaSurfaceActor *surface_actor; + MetaWindowXwayland *xwayland_window; if (!xwayland_surface->window) return; g_clear_signal_handler (&xwayland_surface->unmanaging_handler_id, xwayland_surface->window); - - xwayland_surface->window->surface = NULL; + xwayland_window = META_WINDOW_XWAYLAND (xwayland_surface->window); + meta_window_xwayland_set_surface (xwayland_window, NULL); xwayland_surface->window = NULL; surface_actor = meta_wayland_surface_get_actor (surface); @@ -90,6 +92,8 @@ meta_xwayland_surface_associate_with_window (MetaXwaylandSurface *xwayland_surfa META_WAYLAND_SURFACE_ROLE (xwayland_surface); MetaWaylandSurface *surface = meta_wayland_surface_role_get_surface (surface_role); + MetaWindowXwayland *xwayland_window = META_WINDOW_XWAYLAND (window); + MetaWaylandSurface *window_surface = meta_window_get_wayland_surface (window); MetaSurfaceActor *surface_actor; MetaWindowActor *window_actor; @@ -98,15 +102,15 @@ meta_xwayland_surface_associate_with_window (MetaXwaylandSurface *xwayland_surfa * decorating the window, then we need to detach the window from its old * surface. */ - if (window->surface) + if (window_surface) { MetaXwaylandSurface *other_xwayland_surface; - other_xwayland_surface = META_XWAYLAND_SURFACE (window->surface->role); + other_xwayland_surface = META_XWAYLAND_SURFACE (window_surface->role); clear_window (other_xwayland_surface); } - window->surface = surface; + meta_window_xwayland_set_surface (xwayland_window, surface); xwayland_surface->window = window; surface_actor = meta_wayland_surface_get_actor (surface);