gdk: take into account scaling on wayland

The X11 part of the GDK backend takes into account the scaling factor of its
window when resizing the underlying X11 objects. We need to do the same for
Wayland.

https://bugzilla.gnome.org/show_bug.cgi?id=755245
This commit is contained in:
Lionel Landwerlin 2015-11-22 17:22:41 +00:00
parent a9b0715df1
commit 8c863573fc

View File

@ -122,21 +122,18 @@ clutter_stage_gdk_get_geometry (ClutterStageWindow *stage_window,
{ {
ClutterStageGdk *stage_gdk = CLUTTER_STAGE_GDK (stage_window); ClutterStageGdk *stage_gdk = CLUTTER_STAGE_GDK (stage_window);
if (!stage_gdk->foreign_window) geometry->x = geometry->y = 0;
if (stage_gdk->window != NULL)
{ {
if (stage_gdk->window != NULL) geometry->width = gdk_window_get_width (stage_gdk->window);
{ geometry->height = gdk_window_get_height (stage_gdk->window);
geometry->width = gdk_window_get_width (stage_gdk->window);
geometry->height = gdk_window_get_height (stage_gdk->window);
}
else
{
geometry->width = 640;
geometry->height = 480;
}
} }
else else
clutter_stage_window_parent_iface->get_geometry (stage_window, geometry); {
geometry->width = 800;
geometry->height = 600;
}
} }
static void static void
@ -166,8 +163,11 @@ clutter_stage_gdk_resize (ClutterStageWindow *stage_window,
gdk_window_resize (stage_gdk->window, width, height); gdk_window_resize (stage_gdk->window, width, height);
#if defined(GDK_WINDOWING_WAYLAND) #if defined(GDK_WINDOWING_WAYLAND)
else if (GDK_IS_WAYLAND_WINDOW (stage_gdk->window)) else if (GDK_IS_WAYLAND_WINDOW (stage_gdk->window))
cogl_wayland_onscreen_resize (CLUTTER_STAGE_COGL (stage_gdk)->onscreen, {
width, height, 0, 0); int scale = gdk_window_get_scale_factor (stage_gdk->window);
cogl_wayland_onscreen_resize (CLUTTER_STAGE_COGL (stage_gdk)->onscreen,
width * scale, height * scale, 0, 0);
}
#endif #endif
} }
@ -248,6 +248,9 @@ clutter_stage_gdk_wayland_surface (ClutterStageGdk *stage_gdk)
wl_surface_set_input_region (stage_gdk->clutter_surface, input_region); wl_surface_set_input_region (stage_gdk->clutter_surface, input_region);
wl_region_destroy (input_region); wl_region_destroy (input_region);
wl_surface_set_buffer_scale (stage_gdk->clutter_surface,
gdk_window_get_scale_factor (stage_gdk->window));
parent_surface = gdk_wayland_window_get_wl_surface (gdk_window_get_toplevel (stage_gdk->window)); parent_surface = gdk_wayland_window_get_wl_surface (gdk_window_get_toplevel (stage_gdk->window));
stage_gdk->subsurface = wl_subcompositor_get_subsurface (stage_gdk->subcompositor, stage_gdk->subsurface = wl_subcompositor_get_subsurface (stage_gdk->subcompositor,
stage_gdk->clutter_surface, stage_gdk->clutter_surface,
@ -270,8 +273,12 @@ _clutter_stage_gdk_notify_configure (ClutterStageGdk *stage_gdk,
{ {
if (x < 0 || y < 0 || width < 1 || height < 1) if (x < 0 || y < 0 || width < 1 || height < 1)
return; return;
if (stage_gdk->foreign_window) if (stage_gdk->foreign_window)
{ {
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_gdk);
int scale = gdk_window_get_scale_factor (stage_gdk->window);
#if defined(GDK_WINDOWING_WAYLAND) #if defined(GDK_WINDOWING_WAYLAND)
if (GDK_IS_WAYLAND_WINDOW (stage_gdk->window) && if (GDK_IS_WAYLAND_WINDOW (stage_gdk->window) &&
gdk_window_get_window_type (stage_gdk->window) == GDK_WINDOW_CHILD && gdk_window_get_window_type (stage_gdk->window) == GDK_WINDOW_CHILD &&
@ -279,21 +286,22 @@ _clutter_stage_gdk_notify_configure (ClutterStageGdk *stage_gdk,
{ {
gint rx, ry; gint rx, ry;
gdk_window_get_origin (stage_gdk->window, &rx, &ry); gdk_window_get_origin (stage_gdk->window, &rx, &ry);
/* TODO: we might need to apply the scale factor here. */
wl_subsurface_set_position (stage_gdk->subsurface, rx, ry); wl_subsurface_set_position (stage_gdk->subsurface, rx, ry);
wl_surface_set_buffer_scale (stage_gdk->clutter_surface, scale);
cogl_wayland_onscreen_resize (stage_cogl->onscreen,
width * scale, height * scale, 0, 0);
} }
else else
#endif #endif
#if defined(GDK_WINDOWING_X11) #if defined(GDK_WINDOWING_X11)
if (GDK_IS_X11_WINDOW (stage_gdk->window)) if (GDK_IS_X11_WINDOW (stage_gdk->window))
{ {
ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_gdk);
ClutterBackend *backend = CLUTTER_BACKEND (stage_cogl->backend); ClutterBackend *backend = CLUTTER_BACKEND (stage_cogl->backend);
int scale_factor = gdk_window_get_scale_factor (stage_gdk->window);
XConfigureEvent xevent = { ConfigureNotify }; XConfigureEvent xevent = { ConfigureNotify };
xevent.window = GDK_WINDOW_XID (stage_gdk->window); xevent.window = GDK_WINDOW_XID (stage_gdk->window);
xevent.width = width * scale_factor; xevent.width = width * scale;
xevent.height = height * scale_factor; xevent.height = height * scale;
/* Ensure cogl knows about the new size immediately, as we will /* Ensure cogl knows about the new size immediately, as we will
* draw before we get the ConfigureNotify response. */ * draw before we get the ConfigureNotify response. */
@ -319,6 +327,7 @@ clutter_stage_gdk_realize (ClutterStageWindow *stage_window)
gboolean cursor_visible; gboolean cursor_visible;
gboolean use_alpha; gboolean use_alpha;
gfloat width, height; gfloat width, height;
int scale;
if (backend->cogl_context == NULL) if (backend->cogl_context == NULL)
{ {
@ -423,8 +432,9 @@ clutter_stage_gdk_realize (ClutterStageWindow *stage_window)
g_object_set_data (G_OBJECT (stage_gdk->window), "clutter-stage-window", stage_gdk); g_object_set_data (G_OBJECT (stage_gdk->window), "clutter-stage-window", stage_gdk);
scale = gdk_window_get_scale_factor (stage_gdk->window);
stage_cogl->onscreen = cogl_onscreen_new (backend->cogl_context, stage_cogl->onscreen = cogl_onscreen_new (backend->cogl_context,
width, height); width * scale, height * scale);
#if defined(GDK_WINDOWING_X11) && defined(COGL_HAS_XLIB_SUPPORT) #if defined(GDK_WINDOWING_X11) && defined(COGL_HAS_XLIB_SUPPORT)
if (GDK_IS_X11_WINDOW (stage_gdk->window)) if (GDK_IS_X11_WINDOW (stage_gdk->window))