summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLionel Landwerlin <llandwerlin@gmail.com>2015-11-22 17:22:41 +0000
committerLionel Landwerlin <llandwerlin@gmail.com>2015-11-22 21:45:55 +0000
commit8c863573fcd8bf40c5cf0f2cb29673636ad90d56 (patch)
treeeb400f52fd6aaebbb5bca7722e18f3eb345c603f
parenta9b0715df1bc455567981b98a281b750efe64f29 (diff)
downloadclutter-8c863573fcd8bf40c5cf0f2cb29673636ad90d56.tar.gz
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
-rw-r--r--clutter/gdk/clutter-stage-gdk.c50
1 files changed, 30 insertions, 20 deletions
diff --git a/clutter/gdk/clutter-stage-gdk.c b/clutter/gdk/clutter-stage-gdk.c
index 0620e4c13..a80cd3945 100644
--- a/clutter/gdk/clutter-stage-gdk.c
+++ b/clutter/gdk/clutter-stage-gdk.c
@@ -122,21 +122,18 @@ clutter_stage_gdk_get_geometry (ClutterStageWindow *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);
- }
- else
- {
- geometry->width = 640;
- geometry->height = 480;
- }
+ geometry->width = gdk_window_get_width (stage_gdk->window);
+ geometry->height = gdk_window_get_height (stage_gdk->window);
}
else
- clutter_stage_window_parent_iface->get_geometry (stage_window, geometry);
+ {
+ geometry->width = 800;
+ geometry->height = 600;
+ }
}
static void
@@ -166,8 +163,11 @@ clutter_stage_gdk_resize (ClutterStageWindow *stage_window,
gdk_window_resize (stage_gdk->window, width, height);
#if defined(GDK_WINDOWING_WAYLAND)
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
}
@@ -248,6 +248,9 @@ clutter_stage_gdk_wayland_surface (ClutterStageGdk *stage_gdk)
wl_surface_set_input_region (stage_gdk->clutter_surface, 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));
stage_gdk->subsurface = wl_subcompositor_get_subsurface (stage_gdk->subcompositor,
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)
return;
+
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 (GDK_IS_WAYLAND_WINDOW (stage_gdk->window) &&
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;
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_surface_set_buffer_scale (stage_gdk->clutter_surface, scale);
+ cogl_wayland_onscreen_resize (stage_cogl->onscreen,
+ width * scale, height * scale, 0, 0);
}
else
#endif
#if defined(GDK_WINDOWING_X11)
if (GDK_IS_X11_WINDOW (stage_gdk->window))
{
- ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_gdk);
ClutterBackend *backend = CLUTTER_BACKEND (stage_cogl->backend);
- int scale_factor = gdk_window_get_scale_factor (stage_gdk->window);
XConfigureEvent xevent = { ConfigureNotify };
xevent.window = GDK_WINDOW_XID (stage_gdk->window);
- xevent.width = width * scale_factor;
- xevent.height = height * scale_factor;
+ xevent.width = width * scale;
+ xevent.height = height * scale;
/* Ensure cogl knows about the new size immediately, as we will
* draw before we get the ConfigureNotify response. */
@@ -319,6 +327,7 @@ clutter_stage_gdk_realize (ClutterStageWindow *stage_window)
gboolean cursor_visible;
gboolean use_alpha;
gfloat width, height;
+ int scale;
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);
+ scale = gdk_window_get_scale_factor (stage_gdk->window);
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 (GDK_IS_X11_WINDOW (stage_gdk->window))