mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 19:00:08 +00:00
gdk/wayland/surface: Move more members to GdkWaylandToplevel
This commit is contained in:
parent
46d1d54f5a
commit
3679207e09
@ -102,7 +102,6 @@ struct _GdkWaylandSurface
|
||||
struct zxdg_toplevel_v6 *zxdg_toplevel_v6;
|
||||
struct zxdg_popup_v6 *zxdg_popup_v6;
|
||||
|
||||
struct gtk_surface1 *gtk_surface;
|
||||
struct wl_egl_window *egl_window;
|
||||
} display_server;
|
||||
|
||||
@ -122,17 +121,6 @@ struct _GdkWaylandSurface
|
||||
|
||||
char *title;
|
||||
|
||||
struct {
|
||||
gboolean was_set;
|
||||
|
||||
char *application_id;
|
||||
char *app_menu_path;
|
||||
char *menubar_path;
|
||||
char *window_object_path;
|
||||
char *application_object_path;
|
||||
char *unique_bus_name;
|
||||
} application;
|
||||
|
||||
GdkGeometry geometry_hints;
|
||||
GdkSurfaceHints geometry_mask;
|
||||
|
||||
@ -146,8 +134,6 @@ struct _GdkWaylandSurface
|
||||
int shadow_top;
|
||||
int shadow_bottom;
|
||||
|
||||
struct wl_output *initial_fullscreen_output;
|
||||
|
||||
cairo_region_t *opaque_region;
|
||||
gboolean opaque_region_dirty;
|
||||
|
||||
@ -163,14 +149,6 @@ struct _GdkWaylandSurface
|
||||
int saved_width;
|
||||
int saved_height;
|
||||
|
||||
struct {
|
||||
GdkToplevelLayout *layout;
|
||||
|
||||
int bounds_width;
|
||||
int bounds_height;
|
||||
gboolean has_bounds;
|
||||
} toplevel;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
int width;
|
||||
@ -189,11 +167,6 @@ struct _GdkWaylandSurface
|
||||
gboolean is_dirty;
|
||||
} pending;
|
||||
|
||||
struct {
|
||||
GdkToplevelState unset_flags;
|
||||
GdkToplevelState set_flags;
|
||||
} initial_state;
|
||||
|
||||
struct {
|
||||
struct {
|
||||
gboolean should_constrain;
|
||||
@ -228,6 +201,10 @@ struct _GdkWaylandToplevel
|
||||
{
|
||||
GdkWaylandSurface parent_instance;
|
||||
|
||||
struct {
|
||||
struct gtk_surface1 *gtk_surface;
|
||||
} display_server;
|
||||
|
||||
GdkWaylandToplevel *transient_for;
|
||||
|
||||
struct org_kde_kwin_server_decoration *server_decoration;
|
||||
@ -239,8 +216,31 @@ struct _GdkWaylandToplevel
|
||||
GDestroyNotify destroy_func;
|
||||
} exported;
|
||||
|
||||
struct {
|
||||
gboolean was_set;
|
||||
|
||||
char *application_id;
|
||||
char *app_menu_path;
|
||||
char *menubar_path;
|
||||
char *window_object_path;
|
||||
char *application_object_path;
|
||||
char *unique_bus_name;
|
||||
} application;
|
||||
|
||||
struct zwp_idle_inhibitor_v1 *idle_inhibitor;
|
||||
size_t idle_inhibitor_refcount;
|
||||
|
||||
struct wl_output *initial_fullscreen_output;
|
||||
|
||||
struct {
|
||||
GdkToplevelState unset_flags;
|
||||
GdkToplevelState set_flags;
|
||||
} initial_state;
|
||||
|
||||
GdkToplevelLayout *layout;
|
||||
int bounds_width;
|
||||
int bounds_height;
|
||||
gboolean has_bounds;
|
||||
};
|
||||
|
||||
typedef struct
|
||||
@ -337,13 +337,12 @@ static void update_popup_layout_state (GdkWaylandPopup *wayland_popup,
|
||||
|
||||
static gboolean gdk_wayland_toplevel_is_exported (GdkWaylandToplevel *wayland_toplevel);
|
||||
|
||||
static void configure_toplevel_geometry (GdkSurface *surface);
|
||||
static void configure_toplevel_geometry (GdkWaylandToplevel *wayland_toplevel);
|
||||
|
||||
static void
|
||||
gdk_wayland_surface_init (GdkWaylandSurface *impl)
|
||||
{
|
||||
impl->scale = 1;
|
||||
impl->initial_fullscreen_output = NULL;
|
||||
impl->saved_width = -1;
|
||||
impl->saved_height = -1;
|
||||
impl->shortcuts_inhibitors = g_hash_table_new (NULL, NULL);
|
||||
@ -690,9 +689,9 @@ gdk_wayland_surface_compute_size (GdkSurface *surface)
|
||||
|
||||
if (impl->next_layout.surface_geometry_dirty)
|
||||
{
|
||||
if (GDK_IS_TOPLEVEL (impl))
|
||||
configure_toplevel_geometry (surface);
|
||||
else if (GDK_IS_POPUP (impl))
|
||||
if (GDK_IS_WAYLAND_TOPLEVEL (impl))
|
||||
configure_toplevel_geometry (GDK_WAYLAND_TOPLEVEL (surface));
|
||||
else if (GDK_IS_WAYLAND_POPUP (impl))
|
||||
configure_popup_geometry (GDK_WAYLAND_POPUP (surface));
|
||||
else if (GDK_IS_DRAG_SURFACE (impl))
|
||||
configure_drag_surface_geometry (surface);
|
||||
@ -1031,13 +1030,6 @@ gdk_wayland_surface_finalize (GObject *object)
|
||||
|
||||
g_free (impl->title);
|
||||
|
||||
g_free (impl->application.application_id);
|
||||
g_free (impl->application.app_menu_path);
|
||||
g_free (impl->application.menubar_path);
|
||||
g_free (impl->application.window_object_path);
|
||||
g_free (impl->application.application_object_path);
|
||||
g_free (impl->application.unique_bus_name);
|
||||
|
||||
g_clear_pointer (&impl->opaque_region, cairo_region_destroy);
|
||||
g_clear_pointer (&impl->input_region, cairo_region_destroy);
|
||||
g_clear_pointer (&impl->shortcuts_inhibitors, g_hash_table_unref);
|
||||
@ -1398,9 +1390,10 @@ gdk_wayland_surface_create_surface (GdkSurface *surface)
|
||||
}
|
||||
|
||||
static void
|
||||
configure_toplevel_geometry (GdkSurface *surface)
|
||||
configure_toplevel_geometry (GdkWaylandToplevel *wayland_toplevel)
|
||||
{
|
||||
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
|
||||
GdkSurface *surface = GDK_SURFACE (wayland_toplevel);
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (wayland_toplevel);
|
||||
GdkDisplay *display = gdk_surface_get_display (surface);
|
||||
int bounds_width, bounds_height;
|
||||
GdkToplevelSize size;
|
||||
@ -1408,10 +1401,10 @@ configure_toplevel_geometry (GdkSurface *surface)
|
||||
GdkGeometry geometry;
|
||||
GdkSurfaceHints mask;
|
||||
|
||||
if (impl->toplevel.has_bounds)
|
||||
if (wayland_toplevel->has_bounds)
|
||||
{
|
||||
bounds_width = impl->toplevel.bounds_width;
|
||||
bounds_height = impl->toplevel.bounds_height;
|
||||
bounds_width = wayland_toplevel->bounds_width;
|
||||
bounds_height = wayland_toplevel->bounds_height;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1430,7 +1423,7 @@ configure_toplevel_geometry (GdkSurface *surface)
|
||||
g_warn_if_fail (size.width > 0);
|
||||
g_warn_if_fail (size.height > 0);
|
||||
|
||||
layout = impl->toplevel.layout;
|
||||
layout = wayland_toplevel->layout;
|
||||
if (gdk_toplevel_layout_get_resizable (layout))
|
||||
{
|
||||
geometry.min_width = size.min_width;
|
||||
@ -1443,40 +1436,40 @@ configure_toplevel_geometry (GdkSurface *surface)
|
||||
geometry.max_height = geometry.min_height = size.height;
|
||||
mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE;
|
||||
}
|
||||
gdk_wayland_surface_set_geometry_hints (impl, &geometry, mask);
|
||||
gdk_wayland_surface_set_geometry_hints (wayland_surface, &geometry, mask);
|
||||
|
||||
if (size.shadow.is_valid)
|
||||
{
|
||||
impl->shadow_left = size.shadow.left;
|
||||
impl->shadow_right = size.shadow.right;
|
||||
impl->shadow_top = size.shadow.top;
|
||||
impl->shadow_bottom = size.shadow.bottom;
|
||||
wayland_surface->shadow_left = size.shadow.left;
|
||||
wayland_surface->shadow_right = size.shadow.right;
|
||||
wayland_surface->shadow_top = size.shadow.top;
|
||||
wayland_surface->shadow_bottom = size.shadow.bottom;
|
||||
}
|
||||
|
||||
if (impl->next_layout.configured_width > 0 &&
|
||||
impl->next_layout.configured_height > 0)
|
||||
if (wayland_surface->next_layout.configured_width > 0 &&
|
||||
wayland_surface->next_layout.configured_height > 0)
|
||||
{
|
||||
int width, height;
|
||||
|
||||
width = impl->next_layout.configured_width +
|
||||
impl->shadow_left + impl->shadow_right;
|
||||
height = impl->next_layout.configured_height +
|
||||
impl->shadow_top + impl->shadow_bottom;
|
||||
width = wayland_surface->next_layout.configured_width +
|
||||
wayland_surface->shadow_left + wayland_surface->shadow_right;
|
||||
height = wayland_surface->next_layout.configured_height +
|
||||
wayland_surface->shadow_top + wayland_surface->shadow_bottom;
|
||||
|
||||
if (impl->next_layout.toplevel.should_constrain)
|
||||
if (wayland_surface->next_layout.toplevel.should_constrain)
|
||||
{
|
||||
gdk_surface_constrain_size (&impl->geometry_hints,
|
||||
impl->geometry_mask,
|
||||
gdk_surface_constrain_size (&wayland_surface->geometry_hints,
|
||||
wayland_surface->geometry_mask,
|
||||
width, height,
|
||||
&width, &height);
|
||||
}
|
||||
gdk_wayland_surface_update_size (surface, width, height, impl->scale);
|
||||
gdk_wayland_surface_update_size (surface, width, height, wayland_surface->scale);
|
||||
|
||||
if (!impl->next_layout.toplevel.size_is_fixed)
|
||||
if (!wayland_surface->next_layout.toplevel.size_is_fixed)
|
||||
{
|
||||
impl->next_layout.toplevel.should_constrain = FALSE;
|
||||
impl->next_layout.configured_width = 0;
|
||||
impl->next_layout.configured_height = 0;
|
||||
wayland_surface->next_layout.toplevel.should_constrain = FALSE;
|
||||
wayland_surface->next_layout.configured_width = 0;
|
||||
wayland_surface->next_layout.configured_height = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1488,7 +1481,7 @@ configure_toplevel_geometry (GdkSurface *surface)
|
||||
gdk_surface_constrain_size (&geometry, mask,
|
||||
width, height,
|
||||
&width, &height);
|
||||
gdk_wayland_surface_update_size (surface, width, height, impl->scale);
|
||||
gdk_wayland_surface_update_size (surface, width, height, wayland_surface->scale);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1497,19 +1490,18 @@ synthesize_initial_surface_state (GdkWaylandToplevel *wayland_toplevel,
|
||||
GdkToplevelState unset_flags,
|
||||
GdkToplevelState set_flags)
|
||||
{
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (wayland_toplevel);
|
||||
wayland_toplevel->initial_state.unset_flags |= unset_flags;
|
||||
wayland_toplevel->initial_state.set_flags &= ~unset_flags;
|
||||
|
||||
wayland_surface->initial_state.unset_flags |= unset_flags;
|
||||
wayland_surface->initial_state.set_flags &= ~unset_flags;
|
||||
|
||||
wayland_surface->initial_state.set_flags |= set_flags;
|
||||
wayland_surface->initial_state.unset_flags &= ~set_flags;
|
||||
wayland_toplevel->initial_state.set_flags |= set_flags;
|
||||
wayland_toplevel->initial_state.unset_flags &= ~set_flags;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_wayland_surface_configure_toplevel (GdkSurface *surface)
|
||||
gdk_wayland_surface_configure_toplevel (GdkWaylandToplevel *wayland_toplevel)
|
||||
{
|
||||
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
|
||||
GdkSurface *surface = GDK_SURFACE (wayland_toplevel);
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (wayland_toplevel);
|
||||
GdkWaylandDisplay *display_wayland =
|
||||
GDK_WAYLAND_DISPLAY (gdk_surface_get_display (surface));
|
||||
GdkToplevelState new_state;
|
||||
@ -1519,17 +1511,17 @@ gdk_wayland_surface_configure_toplevel (GdkSurface *surface)
|
||||
gboolean was_fixed_size;
|
||||
gboolean saved_size;
|
||||
|
||||
new_state = impl->pending.toplevel.state;
|
||||
impl->pending.toplevel.state = 0;
|
||||
new_state = wayland_surface->pending.toplevel.state;
|
||||
wayland_surface->pending.toplevel.state = 0;
|
||||
|
||||
is_resizing = impl->pending.toplevel.is_resizing;
|
||||
impl->pending.toplevel.is_resizing = FALSE;
|
||||
is_resizing = wayland_surface->pending.toplevel.is_resizing;
|
||||
wayland_surface->pending.toplevel.is_resizing = FALSE;
|
||||
|
||||
if (impl->pending.toplevel.has_bounds)
|
||||
if (wayland_surface->pending.toplevel.has_bounds)
|
||||
{
|
||||
impl->toplevel.bounds_width = impl->pending.toplevel.bounds_width;
|
||||
impl->toplevel.bounds_height = impl->pending.toplevel.bounds_height;
|
||||
impl->toplevel.has_bounds = TRUE;
|
||||
wayland_toplevel->bounds_width = wayland_surface->pending.toplevel.bounds_width;
|
||||
wayland_toplevel->bounds_height = wayland_surface->pending.toplevel.bounds_height;
|
||||
wayland_toplevel->has_bounds = TRUE;
|
||||
}
|
||||
|
||||
fixed_size =
|
||||
@ -1543,8 +1535,8 @@ gdk_wayland_surface_configure_toplevel (GdkSurface *surface)
|
||||
GDK_TOPLEVEL_STATE_FULLSCREEN |
|
||||
GDK_TOPLEVEL_STATE_TILED);
|
||||
|
||||
width = impl->pending.toplevel.width;
|
||||
height = impl->pending.toplevel.height;
|
||||
width = wayland_surface->pending.toplevel.width;
|
||||
height = wayland_surface->pending.toplevel.height;
|
||||
|
||||
saved_size = (width == 0 && height == 0);
|
||||
/* According to xdg_shell, an xdg_surface.configure with size 0x0
|
||||
@ -1557,41 +1549,41 @@ gdk_wayland_surface_configure_toplevel (GdkSurface *surface)
|
||||
*/
|
||||
if (saved_size && !fixed_size && was_fixed_size)
|
||||
{
|
||||
width = impl->saved_width;
|
||||
height = impl->saved_height;
|
||||
width = wayland_surface->saved_width;
|
||||
height = wayland_surface->saved_height;
|
||||
}
|
||||
|
||||
if (width > 0 && height > 0)
|
||||
{
|
||||
if (!saved_size)
|
||||
{
|
||||
impl->next_layout.toplevel.should_constrain = TRUE;
|
||||
wayland_surface->next_layout.toplevel.should_constrain = TRUE;
|
||||
|
||||
/* Save size for next time we get 0x0 */
|
||||
_gdk_wayland_surface_save_size (surface);
|
||||
}
|
||||
else if (is_resizing)
|
||||
{
|
||||
impl->next_layout.toplevel.should_constrain = TRUE;
|
||||
wayland_surface->next_layout.toplevel.should_constrain = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
impl->next_layout.toplevel.should_constrain = FALSE;
|
||||
wayland_surface->next_layout.toplevel.should_constrain = FALSE;
|
||||
}
|
||||
|
||||
impl->next_layout.toplevel.size_is_fixed = fixed_size;
|
||||
impl->next_layout.configured_width = width;
|
||||
impl->next_layout.configured_height = height;
|
||||
wayland_surface->next_layout.toplevel.size_is_fixed = fixed_size;
|
||||
wayland_surface->next_layout.configured_width = width;
|
||||
wayland_surface->next_layout.configured_height = height;
|
||||
}
|
||||
else
|
||||
{
|
||||
impl->next_layout.toplevel.should_constrain = FALSE;
|
||||
impl->next_layout.toplevel.size_is_fixed = FALSE;
|
||||
impl->next_layout.configured_width = 0;
|
||||
impl->next_layout.configured_height = 0;
|
||||
wayland_surface->next_layout.toplevel.should_constrain = FALSE;
|
||||
wayland_surface->next_layout.toplevel.size_is_fixed = FALSE;
|
||||
wayland_surface->next_layout.configured_width = 0;
|
||||
wayland_surface->next_layout.configured_height = 0;
|
||||
}
|
||||
|
||||
impl->next_layout.surface_geometry_dirty = TRUE;
|
||||
wayland_surface->next_layout.surface_geometry_dirty = TRUE;
|
||||
gdk_surface_request_layout (surface);
|
||||
|
||||
GDK_DISPLAY_DEBUG (gdk_surface_get_display (surface), EVENTS,
|
||||
@ -1607,12 +1599,12 @@ gdk_wayland_surface_configure_toplevel (GdkSurface *surface)
|
||||
switch (display_wayland->shell_variant)
|
||||
{
|
||||
case GDK_WAYLAND_SHELL_VARIANT_XDG_SHELL:
|
||||
xdg_surface_ack_configure (impl->display_server.xdg_surface,
|
||||
impl->pending.serial);
|
||||
xdg_surface_ack_configure (wayland_surface->display_server.xdg_surface,
|
||||
wayland_surface->pending.serial);
|
||||
break;
|
||||
case GDK_WAYLAND_SHELL_VARIANT_ZXDG_SHELL_V6:
|
||||
zxdg_surface_v6_ack_configure (impl->display_server.zxdg_surface_v6,
|
||||
impl->pending.serial);
|
||||
zxdg_surface_v6_ack_configure (wayland_surface->display_server.zxdg_surface_v6,
|
||||
wayland_surface->pending.serial);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
@ -1713,7 +1705,11 @@ gdk_wayland_surface_configure (GdkSurface *surface)
|
||||
gdk_wayland_surface_configure_popup (wayland_popup);
|
||||
}
|
||||
else if (is_realized_toplevel (impl))
|
||||
gdk_wayland_surface_configure_toplevel (surface);
|
||||
{
|
||||
g_assert (GDK_IS_WAYLAND_TOPLEVEL (surface));
|
||||
GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (surface);
|
||||
gdk_wayland_surface_configure_toplevel (wayland_toplevel);
|
||||
}
|
||||
else
|
||||
g_warn_if_reached ();
|
||||
|
||||
@ -2049,30 +2045,30 @@ gdk_wayland_surface_create_xdg_toplevel (GdkWaylandToplevel *wayland_toplevel)
|
||||
switch (display_wayland->shell_variant)
|
||||
{
|
||||
case GDK_WAYLAND_SHELL_VARIANT_XDG_SHELL:
|
||||
if (wayland_surface->initial_state.set_flags & GDK_TOPLEVEL_STATE_MAXIMIZED)
|
||||
if (wayland_toplevel->initial_state.set_flags & GDK_TOPLEVEL_STATE_MAXIMIZED)
|
||||
xdg_toplevel_set_maximized (wayland_surface->display_server.xdg_toplevel);
|
||||
if (wayland_surface->initial_state.set_flags & GDK_TOPLEVEL_STATE_MINIMIZED)
|
||||
if (wayland_toplevel->initial_state.set_flags & GDK_TOPLEVEL_STATE_MINIMIZED)
|
||||
xdg_toplevel_set_minimized (wayland_surface->display_server.xdg_toplevel);
|
||||
if (wayland_surface->initial_state.set_flags & GDK_TOPLEVEL_STATE_FULLSCREEN)
|
||||
if (wayland_toplevel->initial_state.set_flags & GDK_TOPLEVEL_STATE_FULLSCREEN)
|
||||
xdg_toplevel_set_fullscreen (wayland_surface->display_server.xdg_toplevel,
|
||||
wayland_surface->initial_fullscreen_output);
|
||||
wayland_toplevel->initial_fullscreen_output);
|
||||
break;
|
||||
case GDK_WAYLAND_SHELL_VARIANT_ZXDG_SHELL_V6:
|
||||
if (wayland_surface->initial_state.set_flags & GDK_TOPLEVEL_STATE_MAXIMIZED)
|
||||
if (wayland_toplevel->initial_state.set_flags & GDK_TOPLEVEL_STATE_MAXIMIZED)
|
||||
zxdg_toplevel_v6_set_maximized (wayland_surface->display_server.zxdg_toplevel_v6);
|
||||
if (wayland_surface->initial_state.set_flags & GDK_TOPLEVEL_STATE_MINIMIZED)
|
||||
if (wayland_toplevel->initial_state.set_flags & GDK_TOPLEVEL_STATE_MINIMIZED)
|
||||
zxdg_toplevel_v6_set_minimized (wayland_surface->display_server.zxdg_toplevel_v6);
|
||||
if (wayland_surface->initial_state.set_flags & GDK_TOPLEVEL_STATE_FULLSCREEN)
|
||||
if (wayland_toplevel->initial_state.set_flags & GDK_TOPLEVEL_STATE_FULLSCREEN)
|
||||
zxdg_toplevel_v6_set_fullscreen (wayland_surface->display_server.zxdg_toplevel_v6,
|
||||
wayland_surface->initial_fullscreen_output);
|
||||
wayland_toplevel->initial_fullscreen_output);
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
wayland_surface->initial_fullscreen_output = NULL;
|
||||
wayland_toplevel->initial_fullscreen_output = NULL;
|
||||
|
||||
app_id = wayland_surface->application.application_id;
|
||||
app_id = wayland_toplevel->application.application_id;
|
||||
if (app_id == NULL)
|
||||
app_id = g_get_prgname ();
|
||||
|
||||
@ -3052,15 +3048,22 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
|
||||
wayland_popup->state = POPUP_STATE_IDLE;
|
||||
}
|
||||
|
||||
if (impl->display_server.gtk_surface)
|
||||
if (GDK_IS_WAYLAND_TOPLEVEL (surface))
|
||||
{
|
||||
if (display_wayland->gtk_shell_version >=
|
||||
GTK_SURFACE1_RELEASE_SINCE_VERSION)
|
||||
gtk_surface1_release (impl->display_server.gtk_surface);
|
||||
else
|
||||
gtk_surface1_destroy (impl->display_server.gtk_surface);
|
||||
impl->display_server.gtk_surface = NULL;
|
||||
impl->application.was_set = FALSE;
|
||||
GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (surface);
|
||||
|
||||
if (wayland_toplevel->display_server.gtk_surface)
|
||||
{
|
||||
if (display_wayland->gtk_shell_version >=
|
||||
GTK_SURFACE1_RELEASE_SINCE_VERSION)
|
||||
gtk_surface1_release (wayland_toplevel->display_server.gtk_surface);
|
||||
else
|
||||
gtk_surface1_destroy (wayland_toplevel->display_server.gtk_surface);
|
||||
wayland_toplevel->display_server.gtk_surface = NULL;
|
||||
wayland_toplevel->application.was_set = FALSE;
|
||||
}
|
||||
|
||||
g_clear_pointer (&wayland_toplevel->layout, gdk_toplevel_layout_unref);
|
||||
}
|
||||
|
||||
wl_surface_destroy (impl->display_server.wl_surface);
|
||||
@ -3069,7 +3072,6 @@ gdk_wayland_surface_hide_surface (GdkSurface *surface)
|
||||
g_slist_free (impl->display_server.outputs);
|
||||
impl->display_server.outputs = NULL;
|
||||
|
||||
g_clear_pointer (&impl->toplevel.layout, gdk_toplevel_layout_unref);
|
||||
if (GDK_IS_WAYLAND_POPUP (surface))
|
||||
{
|
||||
GdkWaylandPopup *wayland_popup = GDK_WAYLAND_POPUP (surface);
|
||||
@ -3531,7 +3533,8 @@ gdk_wayland_toplevel_focus (GdkToplevel *toplevel,
|
||||
guint32 timestamp)
|
||||
{
|
||||
GdkSurface *surface = GDK_SURFACE (toplevel);
|
||||
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
|
||||
GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (toplevel);
|
||||
GdkDisplay *display = gdk_surface_get_display (surface);
|
||||
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
gchar *startup_id = NULL;
|
||||
@ -3575,14 +3578,14 @@ gdk_wayland_toplevel_focus (GdkToplevel *toplevel,
|
||||
|
||||
xdg_activation_v1_activate (display_wayland->xdg_activation,
|
||||
startup_id,
|
||||
impl->display_server.wl_surface);
|
||||
wayland_surface->display_server.wl_surface);
|
||||
}
|
||||
else if (impl->display_server.gtk_surface)
|
||||
else if (wayland_toplevel->display_server.gtk_surface)
|
||||
{
|
||||
if (timestamp != GDK_CURRENT_TIME)
|
||||
gtk_surface1_present (impl->display_server.gtk_surface, timestamp);
|
||||
gtk_surface1_present (wayland_toplevel->display_server.gtk_surface, timestamp);
|
||||
else if (startup_id && display_wayland->gtk_shell_version >= 3)
|
||||
gtk_surface1_request_focus (impl->display_server.gtk_surface,
|
||||
gtk_surface1_request_focus (wayland_toplevel->display_server.gtk_surface,
|
||||
startup_id);
|
||||
}
|
||||
|
||||
@ -3680,22 +3683,22 @@ gdk_wayland_toplevel_init_gtk_surface (GdkWaylandToplevel *wayland_toplevel)
|
||||
GdkWaylandDisplay *display =
|
||||
GDK_WAYLAND_DISPLAY (gdk_surface_get_display (GDK_SURFACE (wayland_toplevel)));
|
||||
|
||||
if (wayland_surface->display_server.gtk_surface != NULL)
|
||||
if (wayland_toplevel->display_server.gtk_surface != NULL)
|
||||
return;
|
||||
if (!is_realized_toplevel (wayland_surface))
|
||||
return;
|
||||
if (display->gtk_shell == NULL)
|
||||
return;
|
||||
|
||||
wayland_surface->display_server.gtk_surface =
|
||||
wayland_toplevel->display_server.gtk_surface =
|
||||
gtk_shell1_get_gtk_surface (display->gtk_shell,
|
||||
wayland_surface->display_server.wl_surface);
|
||||
wl_proxy_set_queue ((struct wl_proxy *) wayland_surface->display_server.gtk_surface,
|
||||
wl_proxy_set_queue ((struct wl_proxy *) wayland_toplevel->display_server.gtk_surface,
|
||||
wayland_surface->event_queue);
|
||||
gdk_wayland_surface_set_geometry_hints (wayland_surface,
|
||||
&wayland_surface->geometry_hints,
|
||||
wayland_surface->geometry_mask);
|
||||
gtk_surface1_add_listener (wayland_surface->display_server.gtk_surface,
|
||||
gtk_surface1_add_listener (wayland_toplevel->display_server.gtk_surface,
|
||||
>k_surface_listener,
|
||||
wayland_surface);
|
||||
}
|
||||
@ -3703,16 +3706,14 @@ gdk_wayland_toplevel_init_gtk_surface (GdkWaylandToplevel *wayland_toplevel)
|
||||
static void
|
||||
maybe_set_gtk_surface_modal (GdkWaylandToplevel *wayland_toplevel)
|
||||
{
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (wayland_toplevel);
|
||||
|
||||
gdk_wayland_toplevel_init_gtk_surface (wayland_toplevel);
|
||||
if (wayland_surface->display_server.gtk_surface == NULL)
|
||||
if (wayland_toplevel->display_server.gtk_surface == NULL)
|
||||
return;
|
||||
|
||||
if (GDK_SURFACE (wayland_toplevel)->modal_hint)
|
||||
gtk_surface1_set_modal (wayland_surface->display_server.gtk_surface);
|
||||
gtk_surface1_set_modal (wayland_toplevel->display_server.gtk_surface);
|
||||
else
|
||||
gtk_surface1_unset_modal (wayland_surface->display_server.gtk_surface);
|
||||
gtk_surface1_unset_modal (wayland_toplevel->display_server.gtk_surface);
|
||||
|
||||
}
|
||||
|
||||
@ -3924,7 +3925,7 @@ static void
|
||||
gdk_wayland_toplevel_maximize (GdkToplevel *toplevel)
|
||||
{
|
||||
GdkSurface *surface = GDK_SURFACE (toplevel);
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (toplevel);
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (surface);
|
||||
GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
|
||||
|
||||
if (GDK_SURFACE_DESTROYED (surface))
|
||||
@ -4023,7 +4024,7 @@ gdk_wayland_toplevel_fullscreen_on_monitor (GdkWaylandToplevel *wayland_toplevel
|
||||
else
|
||||
{
|
||||
synthesize_initial_surface_state (wayland_toplevel, 0, GDK_TOPLEVEL_STATE_FULLSCREEN);
|
||||
wayland_surface->initial_fullscreen_output = output;
|
||||
wayland_toplevel->initial_fullscreen_output = output;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4036,7 +4037,7 @@ gdk_wayland_toplevel_fullscreen (GdkWaylandToplevel *wayland_toplevel)
|
||||
if (GDK_SURFACE_DESTROYED (surface))
|
||||
return;
|
||||
|
||||
wayland_surface->initial_fullscreen_output = NULL;
|
||||
wayland_toplevel->initial_fullscreen_output = NULL;
|
||||
|
||||
_gdk_wayland_surface_save_size (surface);
|
||||
|
||||
@ -4074,7 +4075,7 @@ gdk_wayland_toplevel_unfullscreen (GdkWaylandToplevel *wayland_toplevel)
|
||||
if (GDK_SURFACE_DESTROYED (surface))
|
||||
return;
|
||||
|
||||
wayland_surface->initial_fullscreen_output = NULL;
|
||||
wayland_toplevel->initial_fullscreen_output = NULL;
|
||||
|
||||
if (is_realized_toplevel (wayland_surface))
|
||||
{
|
||||
@ -4351,8 +4352,8 @@ gdk_wayland_toplevel_titlebar_gesture (GdkToplevel *toplevel,
|
||||
GdkTitlebarGesture gesture)
|
||||
{
|
||||
GdkSurface *surface = GDK_SURFACE (toplevel);
|
||||
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
|
||||
struct gtk_surface1 *gtk_surface = impl->display_server.gtk_surface;
|
||||
GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
|
||||
struct gtk_surface1 *gtk_surface = wayland_toplevel->display_server.gtk_surface;
|
||||
enum gtk_surface1_gesture gtk_gesture;
|
||||
GdkSeat *seat;
|
||||
struct wl_seat *wl_seat;
|
||||
@ -4372,7 +4373,7 @@ gdk_wayland_toplevel_titlebar_gesture (GdkToplevel *toplevel,
|
||||
|
||||
serial = _gdk_wayland_seat_get_last_implicit_grab_serial (GDK_WAYLAND_SEAT (seat), NULL);
|
||||
|
||||
gtk_surface1_titlebar_gesture (impl->display_server.gtk_surface,
|
||||
gtk_surface1_titlebar_gesture (wayland_toplevel->display_server.gtk_surface,
|
||||
serial,
|
||||
wl_seat,
|
||||
gtk_gesture);
|
||||
@ -4383,9 +4384,8 @@ gdk_wayland_toplevel_titlebar_gesture (GdkToplevel *toplevel,
|
||||
static gboolean
|
||||
gdk_wayland_toplevel_supports_edge_constraints (GdkToplevel *toplevel)
|
||||
{
|
||||
GdkSurface *surface = GDK_SURFACE (toplevel);
|
||||
GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
|
||||
struct gtk_surface1 *gtk_surface = impl->display_server.gtk_surface;
|
||||
GdkWaylandToplevel *wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
|
||||
struct gtk_surface1 *gtk_surface = wayland_toplevel->display_server.gtk_surface;
|
||||
|
||||
if (!gtk_surface)
|
||||
return FALSE;
|
||||
@ -4482,37 +4482,35 @@ gdk_wayland_surface_ensure_wl_egl_window (GdkSurface *surface)
|
||||
struct gtk_surface1 *
|
||||
gdk_wayland_toplevel_get_gtk_surface (GdkWaylandToplevel *wayland_toplevel)
|
||||
{
|
||||
return GDK_WAYLAND_SURFACE (wayland_toplevel)->display_server.gtk_surface;
|
||||
return wayland_toplevel->display_server.gtk_surface;
|
||||
}
|
||||
|
||||
static void
|
||||
maybe_set_gtk_surface_dbus_properties (GdkWaylandToplevel *wayland_toplevel)
|
||||
{
|
||||
GdkWaylandSurface *wayland_surface = GDK_WAYLAND_SURFACE (wayland_toplevel);
|
||||
|
||||
if (wayland_surface->application.was_set)
|
||||
if (wayland_toplevel->application.was_set)
|
||||
return;
|
||||
|
||||
if (wayland_surface->application.application_id == NULL &&
|
||||
wayland_surface->application.app_menu_path == NULL &&
|
||||
wayland_surface->application.menubar_path == NULL &&
|
||||
wayland_surface->application.window_object_path == NULL &&
|
||||
wayland_surface->application.application_object_path == NULL &&
|
||||
wayland_surface->application.unique_bus_name == NULL)
|
||||
if (wayland_toplevel->application.application_id == NULL &&
|
||||
wayland_toplevel->application.app_menu_path == NULL &&
|
||||
wayland_toplevel->application.menubar_path == NULL &&
|
||||
wayland_toplevel->application.window_object_path == NULL &&
|
||||
wayland_toplevel->application.application_object_path == NULL &&
|
||||
wayland_toplevel->application.unique_bus_name == NULL)
|
||||
return;
|
||||
|
||||
gdk_wayland_toplevel_init_gtk_surface (wayland_toplevel);
|
||||
if (wayland_surface->display_server.gtk_surface == NULL)
|
||||
if (wayland_toplevel->display_server.gtk_surface == NULL)
|
||||
return;
|
||||
|
||||
gtk_surface1_set_dbus_properties (wayland_surface->display_server.gtk_surface,
|
||||
wayland_surface->application.application_id,
|
||||
wayland_surface->application.app_menu_path,
|
||||
wayland_surface->application.menubar_path,
|
||||
wayland_surface->application.window_object_path,
|
||||
wayland_surface->application.application_object_path,
|
||||
wayland_surface->application.unique_bus_name);
|
||||
wayland_surface->application.was_set = TRUE;
|
||||
gtk_surface1_set_dbus_properties (wayland_toplevel->display_server.gtk_surface,
|
||||
wayland_toplevel->application.application_id,
|
||||
wayland_toplevel->application.app_menu_path,
|
||||
wayland_toplevel->application.menubar_path,
|
||||
wayland_toplevel->application.window_object_path,
|
||||
wayland_toplevel->application.application_object_path,
|
||||
wayland_toplevel->application.unique_bus_name);
|
||||
wayland_toplevel->application.was_set = TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
@ -4524,21 +4522,21 @@ gdk_wayland_toplevel_set_dbus_properties (GdkToplevel *toplevel,
|
||||
const char *application_object_path,
|
||||
const char *unique_bus_name)
|
||||
{
|
||||
GdkWaylandSurface *wayland_surface;
|
||||
GdkWaylandToplevel *wayland_toplevel;
|
||||
|
||||
g_return_if_fail (GDK_IS_WAYLAND_TOPLEVEL (toplevel));
|
||||
|
||||
wayland_surface = GDK_WAYLAND_SURFACE (toplevel);
|
||||
wayland_toplevel = GDK_WAYLAND_TOPLEVEL (toplevel);
|
||||
|
||||
wayland_surface->application.application_id = g_strdup (application_id);
|
||||
wayland_surface->application.app_menu_path = g_strdup (app_menu_path);
|
||||
wayland_surface->application.menubar_path = g_strdup (menubar_path);
|
||||
wayland_surface->application.window_object_path = g_strdup (window_object_path);
|
||||
wayland_surface->application.application_object_path =
|
||||
wayland_toplevel->application.application_id = g_strdup (application_id);
|
||||
wayland_toplevel->application.app_menu_path = g_strdup (app_menu_path);
|
||||
wayland_toplevel->application.menubar_path = g_strdup (menubar_path);
|
||||
wayland_toplevel->application.window_object_path = g_strdup (window_object_path);
|
||||
wayland_toplevel->application.application_object_path =
|
||||
g_strdup (application_object_path);
|
||||
wayland_surface->application.unique_bus_name = g_strdup (unique_bus_name);
|
||||
wayland_toplevel->application.unique_bus_name = g_strdup (unique_bus_name);
|
||||
|
||||
maybe_set_gtk_surface_dbus_properties (GDK_WAYLAND_TOPLEVEL (toplevel));
|
||||
maybe_set_gtk_surface_dbus_properties (wayland_toplevel);
|
||||
}
|
||||
|
||||
void
|
||||
@ -4957,6 +4955,7 @@ gdk_wayland_popup_iface_init (GdkPopupInterface *iface)
|
||||
static void
|
||||
gdk_wayland_toplevel_init (GdkWaylandToplevel *toplevel)
|
||||
{
|
||||
toplevel->initial_fullscreen_output = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -5082,6 +5081,13 @@ gdk_wayland_toplevel_finalize (GObject *object)
|
||||
if (gdk_wayland_toplevel_is_exported (wayland_toplevel))
|
||||
gdk_wayland_toplevel_unexport_handle (GDK_TOPLEVEL (wayland_toplevel));
|
||||
|
||||
g_free (wayland_toplevel->application.application_id);
|
||||
g_free (wayland_toplevel->application.app_menu_path);
|
||||
g_free (wayland_toplevel->application.menubar_path);
|
||||
g_free (wayland_toplevel->application.window_object_path);
|
||||
g_free (wayland_toplevel->application.application_object_path);
|
||||
g_free (wayland_toplevel->application.unique_bus_name);
|
||||
|
||||
G_OBJECT_CLASS (gdk_wayland_toplevel_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
@ -5136,8 +5142,8 @@ gdk_wayland_toplevel_present (GdkToplevel *toplevel,
|
||||
pending_configure = TRUE;
|
||||
}
|
||||
|
||||
g_clear_pointer (&wayland_surface->toplevel.layout, gdk_toplevel_layout_unref);
|
||||
wayland_surface->toplevel.layout = gdk_toplevel_layout_copy (layout);
|
||||
g_clear_pointer (&wayland_toplevel->layout, gdk_toplevel_layout_unref);
|
||||
wayland_toplevel->layout = gdk_toplevel_layout_copy (layout);
|
||||
|
||||
gdk_wayland_surface_show (surface);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user