forked from AuroraMiddleware/gtk
window: Improve detection of edge constraint support
Instead of relying on special values of edge constraints, this patch adds an internal-only gdk_window_supports_edge_constraints() function that by default returns FALSE, and is implemented by GdkWindowWayland and GdkWindowX11. This way, we can properly detect server-side support for this feature and adapt accordingly. https://bugzilla.gnome.org/show_bug.cgi?id=783669
This commit is contained in:
parent
b1c4e9afef
commit
0bdaebef1e
@ -21,6 +21,8 @@ void gdk_gl_set_flags (GdkGLFlags flags);
|
||||
void gdk_window_freeze_toplevel_updates (GdkWindow *window);
|
||||
void gdk_window_thaw_toplevel_updates (GdkWindow *window);
|
||||
|
||||
gboolean gdk_window_supports_edge_constraints (GdkWindow *window);
|
||||
|
||||
GdkRenderingMode gdk_display_get_rendering_mode (GdkDisplay *display);
|
||||
void gdk_display_set_rendering_mode (GdkDisplay *display,
|
||||
GdkRenderingMode mode);
|
||||
|
@ -8234,3 +8234,19 @@ gdk_window_show_window_menu (GdkWindow *window,
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gdk_window_supports_edge_constraints (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplClass *impl_class;
|
||||
|
||||
g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
|
||||
g_return_val_if_fail (!GDK_WINDOW_DESTROYED (window), FALSE);
|
||||
|
||||
impl_class = GDK_WINDOW_IMPL_GET_CLASS (window->impl);
|
||||
|
||||
if (impl_class->supports_edge_constraints)
|
||||
return impl_class->supports_edge_constraints (window);
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -269,6 +269,7 @@ struct _GdkWindowImplClass
|
||||
gboolean attached,
|
||||
GdkGLContext *share,
|
||||
GError **error);
|
||||
gboolean (* supports_edge_constraints)(GdkWindow *window);
|
||||
};
|
||||
|
||||
/* Interface Functions */
|
||||
|
@ -3637,6 +3637,14 @@ gdk_wayland_window_show_window_menu (GdkWindow *window,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_wayland_window_supports_edge_constraints (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
|
||||
|
||||
return gtk_surface1_get_version (impl->display_server.gtk_surface) > GTK_SURFACE1_CONFIGURE_EDGES_SINCE_VERSION;
|
||||
}
|
||||
|
||||
static void
|
||||
_gdk_window_impl_wayland_class_init (GdkWindowImplWaylandClass *klass)
|
||||
{
|
||||
@ -3716,6 +3724,7 @@ _gdk_window_impl_wayland_class_init (GdkWindowImplWaylandClass *klass)
|
||||
impl_class->set_shadow_width = gdk_wayland_window_set_shadow_width;
|
||||
impl_class->show_window_menu = gdk_wayland_window_show_window_menu;
|
||||
impl_class->create_gl_context = gdk_wayland_window_create_gl_context;
|
||||
impl_class->supports_edge_constraints = gdk_wayland_window_supports_edge_constraints;
|
||||
|
||||
signals[COMMITTED] = g_signal_new ("committed",
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
|
@ -199,7 +199,6 @@ do_edge_constraint_state_check (GdkWindow *window,
|
||||
{
|
||||
GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
|
||||
GdkWindowState local_set, local_unset;
|
||||
GdkScreen *screen = GDK_WINDOW_SCREEN (window);
|
||||
guint edge_constraints;
|
||||
|
||||
local_set = *set;
|
||||
@ -210,8 +209,7 @@ do_edge_constraint_state_check (GdkWindow *window,
|
||||
* implementation. If it supports _GTK_EDGE_CONSTRAINTS, however, remove
|
||||
* the GDK_WINDOW_STATE_TILED flag explicitly.
|
||||
*/
|
||||
if (!gdk_x11_screen_supports_net_wm_hint (screen,
|
||||
gdk_atom_intern_static_string ("_GTK_EDGE_CONSTRAINTS")))
|
||||
if (!gdk_window_supports_edge_constraints (window))
|
||||
{
|
||||
/* FIXME: we rely on implementation details of mutter here:
|
||||
* mutter only tiles horizontally, and sets maxvert when it does
|
||||
|
@ -210,6 +210,13 @@ gdk_x11_window_get_unscaled_size (GdkWindow *window,
|
||||
*unscaled_height = impl->unscaled_height;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_x11_window_supports_edge_constraints (GdkWindow *window)
|
||||
{
|
||||
return gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
|
||||
gdk_atom_intern_static_string ("_GTK_EDGE_CONSTRAINTS"));
|
||||
}
|
||||
|
||||
static void
|
||||
set_sync_counter(Display *display,
|
||||
XSyncCounter counter,
|
||||
@ -5071,4 +5078,5 @@ gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
|
||||
impl_class->show_window_menu = gdk_x11_window_show_window_menu;
|
||||
impl_class->create_gl_context = gdk_x11_window_create_gl_context;
|
||||
impl_class->get_unscaled_size = gdk_x11_window_get_unscaled_size;
|
||||
impl_class->supports_edge_constraints = gdk_x11_window_supports_edge_constraints;
|
||||
}
|
||||
|
@ -1699,6 +1699,7 @@ edge_under_coordinates (GtkWindow *window,
|
||||
GtkStyleContext *context;
|
||||
gint handle_v, handle_h;
|
||||
GtkBorder border;
|
||||
gboolean supports_edge_constraints;
|
||||
|
||||
if (priv->type != GTK_WINDOW_TOPLEVEL ||
|
||||
!priv->client_decorated ||
|
||||
@ -1707,7 +1708,16 @@ edge_under_coordinates (GtkWindow *window,
|
||||
priv->maximized)
|
||||
return FALSE;
|
||||
|
||||
if (priv->tiled && !priv->edge_constraints)
|
||||
supports_edge_constraints = gdk_window_supports_edge_constraints (_gtk_widget_get_window (GTK_WIDGET (window)));
|
||||
|
||||
if (!supports_edge_constraints && priv->tiled)
|
||||
return FALSE;
|
||||
|
||||
if (supports_edge_constraints &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_TOP_RESIZABLE) &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_RIGHT_RESIZABLE) &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_BOTTOM_RESIZABLE) &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_LEFT_RESIZABLE))
|
||||
return FALSE;
|
||||
|
||||
_gtk_widget_get_allocation (GTK_WIDGET (window), &allocation);
|
||||
@ -1744,7 +1754,8 @@ edge_under_coordinates (GtkWindow *window,
|
||||
edge != GDK_WINDOW_EDGE_SOUTH_WEST)
|
||||
return FALSE;
|
||||
|
||||
if (!(priv->edge_constraints & GDK_WINDOW_STATE_LEFT_RESIZABLE))
|
||||
if (supports_edge_constraints &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_LEFT_RESIZABLE))
|
||||
return FALSE;
|
||||
}
|
||||
else if (x >= allocation.x + allocation.width - border.right - handle_h)
|
||||
@ -1754,7 +1765,8 @@ edge_under_coordinates (GtkWindow *window,
|
||||
edge != GDK_WINDOW_EDGE_SOUTH_EAST)
|
||||
return FALSE;
|
||||
|
||||
if (!(priv->edge_constraints & GDK_WINDOW_STATE_RIGHT_RESIZABLE))
|
||||
if (supports_edge_constraints &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_RIGHT_RESIZABLE))
|
||||
return FALSE;
|
||||
}
|
||||
else if (edge != GDK_WINDOW_EDGE_NORTH &&
|
||||
@ -1769,7 +1781,8 @@ edge_under_coordinates (GtkWindow *window,
|
||||
edge != GDK_WINDOW_EDGE_NORTH_EAST)
|
||||
return FALSE;
|
||||
|
||||
if (!(priv->edge_constraints & GDK_WINDOW_STATE_TOP_RESIZABLE))
|
||||
if (supports_edge_constraints &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_TOP_RESIZABLE))
|
||||
return FALSE;
|
||||
}
|
||||
else if (y > allocation.y + allocation.height - border.bottom - handle_v)
|
||||
@ -1779,7 +1792,8 @@ edge_under_coordinates (GtkWindow *window,
|
||||
edge != GDK_WINDOW_EDGE_SOUTH_EAST)
|
||||
return FALSE;
|
||||
|
||||
if (!(priv->edge_constraints & GDK_WINDOW_STATE_BOTTOM_RESIZABLE))
|
||||
if (supports_edge_constraints &&
|
||||
!(priv->edge_constraints & GDK_WINDOW_STATE_BOTTOM_RESIZABLE))
|
||||
return FALSE;
|
||||
}
|
||||
else if (edge != GDK_WINDOW_EDGE_WEST &&
|
||||
|
Loading…
Reference in New Issue
Block a user