diff options
author | Lionel Landwerlin <llandwerlin@gmail.com> | 2015-11-22 17:22:41 +0000 |
---|---|---|
committer | Lionel Landwerlin <llandwerlin@gmail.com> | 2015-11-22 21:45:55 +0000 |
commit | 8c863573fcd8bf40c5cf0f2cb29673636ad90d56 (patch) | |
tree | eb400f52fd6aaebbb5bca7722e18f3eb345c603f | |
parent | a9b0715df1bc455567981b98a281b750efe64f29 (diff) | |
download | clutter-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.c | 50 |
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)) |