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:
parent
a9b0715df1
commit
8c863573fc
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user