Set GDK_WINDOW_STATE_TILED if any edge is tiled
This state flag is used in several places in GTK+, for example to ignore RESIZE_INC hints if tiled. Setting it is also necessary for backwards compatibility with applications that changed their behaviour when tiled, such as GNOME Terminal and its MATE fork. Signed-off-by: Simon McVittie <smcv@debian.org> https://bugzilla.gnome.org/show_bug.cgi?id=789357
This commit is contained in:
committed by
Georges Basile Stavracas Neto
parent
f2adaba237
commit
465ef50554
@ -2985,16 +2985,16 @@ gtk_surface_configure (void *data,
|
||||
|
||||
/* Since v2 */
|
||||
case GTK_SURFACE1_STATE_TILED_TOP:
|
||||
new_state |= GDK_WINDOW_STATE_TOP_TILED;
|
||||
new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_TOP_TILED);
|
||||
break;
|
||||
case GTK_SURFACE1_STATE_TILED_RIGHT:
|
||||
new_state |= GDK_WINDOW_STATE_RIGHT_TILED;
|
||||
new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_RIGHT_TILED);
|
||||
break;
|
||||
case GTK_SURFACE1_STATE_TILED_BOTTOM:
|
||||
new_state |= GDK_WINDOW_STATE_BOTTOM_TILED;
|
||||
new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_BOTTOM_TILED);
|
||||
break;
|
||||
case GTK_SURFACE1_STATE_TILED_LEFT:
|
||||
new_state |= GDK_WINDOW_STATE_LEFT_TILED;
|
||||
new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_LEFT_TILED);
|
||||
break;
|
||||
default:
|
||||
/* Unknown state */
|
||||
|
||||
@ -189,6 +189,11 @@ gdk_x11_display_event_translator_init (GdkEventTranslatorIface *iface)
|
||||
iface->translate_event = gdk_x11_display_translate_event;
|
||||
}
|
||||
|
||||
#define ANY_EDGE_TILED (GDK_WINDOW_STATE_LEFT_TILED | \
|
||||
GDK_WINDOW_STATE_RIGHT_TILED | \
|
||||
GDK_WINDOW_STATE_TOP_TILED | \
|
||||
GDK_WINDOW_STATE_BOTTOM_TILED)
|
||||
|
||||
static void
|
||||
do_edge_constraint_state_check (GdkWindow *window,
|
||||
GdkWindowState old_state,
|
||||
@ -205,8 +210,9 @@ do_edge_constraint_state_check (GdkWindow *window,
|
||||
edge_constraints = toplevel->edge_constraints;
|
||||
|
||||
/* If the WM doesn't support _GTK_EDGE_CONSTRAINTS, rely on the fallback
|
||||
* implementation. If it supports _GTK_EDGE_CONSTRAINTS, however, remove
|
||||
* the GDK_WINDOW_STATE_TILED flag explicitly.
|
||||
* implementation. If it supports _GTK_EDGE_CONSTRAINTS, arrange for
|
||||
* GDK_WINDOW_STATE_TILED to be set if any edge is tiled, and cleared
|
||||
* if no edge is tiled.
|
||||
*/
|
||||
if (!gdk_x11_screen_supports_net_wm_hint (screen,
|
||||
gdk_atom_intern_static_string ("_GTK_EDGE_CONSTRAINTS")))
|
||||
@ -229,8 +235,16 @@ do_edge_constraint_state_check (GdkWindow *window,
|
||||
else
|
||||
{
|
||||
if (old_state & GDK_WINDOW_STATE_TILED)
|
||||
{
|
||||
if (!(edge_constraints & ANY_EDGE_TILED))
|
||||
local_unset |= GDK_WINDOW_STATE_TILED;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (edge_constraints & ANY_EDGE_TILED)
|
||||
local_set |= GDK_WINDOW_STATE_TILED;
|
||||
}
|
||||
}
|
||||
|
||||
/* Top edge */
|
||||
if (old_state & GDK_WINDOW_STATE_TOP_TILED)
|
||||
|
||||
Reference in New Issue
Block a user