x11: Also change size & pos on child windows when scale changes

Any native windows need to also change size and position.
We don't change the size of any foreign windows since we
don't generally control these.
This commit is contained in:
Alexander Larsson
2013-06-28 10:23:54 +02:00
parent a0fb6c8360
commit 536a6676cb

View File

@@ -1889,34 +1889,71 @@ gdk_window_x11_move_resize (GdkWindow *window,
}
}
static void
set_scale_recursive (GdkWindow *window, int scale)
{
GdkWindow *child;
GList *l;
for (l = window->children; l; l = l->next)
{
child = l->data;
if (child->impl != window->impl)
_gdk_x11_window_set_window_scale (child, scale);
else
set_scale_recursive (child, scale);
}
}
void
_gdk_x11_window_set_window_scale (GdkWindow *window,
int scale)
{
GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (window->impl);
gboolean was_mapped;
GdkWindowImplX11 *impl;
GdkToplevelX11 *toplevel;
GdkWindowHints geom_mask;
was_mapped = GDK_WINDOW_IS_MAPPED (window);
if (was_mapped)
gdk_window_hide (window);
if (window->window_type == GDK_WINDOW_OFFSCREEN)
return;
impl = GDK_WINDOW_IMPL_X11 (window->impl);
impl->window_scale = scale;
toplevel = _gdk_x11_window_get_toplevel (window);
/* These are affected by window scale: */
geom_mask = toplevel->last_geometry_hints_mask &
(GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE | GDK_HINT_BASE_SIZE | GDK_HINT_RESIZE_INC);
if (geom_mask)
gdk_window_set_geometry_hints (window,
&toplevel->last_geometry_hints,
geom_mask);
XResizeWindow (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
window->width * impl->window_scale,
window->height * impl->window_scale);
if (was_mapped)
gdk_window_show (window);
if (toplevel && window->window_type != GDK_WINDOW_FOREIGN)
{
/* These are affected by window scale: */
geom_mask = toplevel->last_geometry_hints_mask &
(GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE | GDK_HINT_BASE_SIZE | GDK_HINT_RESIZE_INC);
if (geom_mask)
gdk_window_set_geometry_hints (window,
&toplevel->last_geometry_hints,
geom_mask);
}
if (window->window_type == GDK_WINDOW_FOREIGN)
XMoveWindow (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
(window->x + window->parent->abs_x) * impl->window_scale,
(window->y + window->parent->abs_y) * impl->window_scale);
else if (WINDOW_IS_TOPLEVEL(window))
XResizeWindow (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
window->width * impl->window_scale,
window->height * impl->window_scale);
else
XMoveResizeWindow (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
(window->x + window->parent->abs_x) * impl->window_scale,
(window->y + window->parent->abs_y) * impl->window_scale,
window->width * impl->window_scale,
window->height * impl->window_scale);
gdk_window_invalidate_rect (window, NULL, TRUE);
set_scale_recursive (window, scale);
}
static gboolean