summaryrefslogtreecommitdiff
path: root/clutter/gdk/clutter-stage-gdk.c
diff options
context:
space:
mode:
Diffstat (limited to 'clutter/gdk/clutter-stage-gdk.c')
-rw-r--r--clutter/gdk/clutter-stage-gdk.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/clutter/gdk/clutter-stage-gdk.c b/clutter/gdk/clutter-stage-gdk.c
index 7152b11fb..2f2939b27 100644
--- a/clutter/gdk/clutter-stage-gdk.c
+++ b/clutter/gdk/clutter-stage-gdk.c
@@ -269,18 +269,44 @@ _clutter_stage_gdk_notify_configure (ClutterStageGdk *stage_gdk,
gint width,
gint height)
{
-#if defined(GDK_WINDOWING_WAYLAND)
if (x < 0 || y < 0 || width < 1 || height < 1)
return;
- if (stage_gdk->foreign_window &&
- gdk_window_get_window_type (stage_gdk->window) == GDK_WINDOW_CHILD &&
- stage_gdk->subsurface)
+ if (stage_gdk->foreign_window)
{
- gint rx, ry;
- gdk_window_get_origin (stage_gdk->window, &rx, &ry);
- wl_subsurface_set_position (stage_gdk->subsurface, rx, ry);
- }
+#if defined(GDK_WINDOWING_WAYLAND)
+ if (GDK_IS_WAYLAND_WINDOW (stage_gdk->window) &&
+ gdk_window_get_window_type (stage_gdk->window) == GDK_WINDOW_CHILD &&
+ stage_gdk->subsurface)
+ {
+ 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);
+ }
+ 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;
+
+ /* Ensure cogl knows about the new size immediately, as we will
+ * draw before we get the ConfigureNotify response. */
+ cogl_xlib_renderer_handle_event (backend->cogl_renderer, (XEvent *)&xevent);
+ }
+ else
+#endif
+ {
+ /* Currently we only support X11 and Wayland. */
+ g_assert_not_reached();
+ }
+ }
}
static gboolean