<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From upstream.

diff --git a/include/labwc.h b/include/labwc.h
index 98828a18..f9108700 100644
--- a/include/labwc.h
+++ b/include/labwc.h
@@ -21,7 +21,6 @@
 #include &lt;wlr/types/wlr_keyboard.h&gt;
 #include &lt;wlr/types/wlr_keyboard_group.h&gt;
 #include &lt;wlr/types/wlr_layer_shell_v1.h&gt;
-#include &lt;wlr/types/wlr_matrix.h&gt;
 #include &lt;wlr/types/wlr_output.h&gt;
 #include &lt;wlr/types/wlr_output_management_v1.h&gt;
 #include &lt;wlr/types/wlr_output_power_management_v1.h&gt;
diff --git a/include/view.h b/include/view.h
index 0ff42c85..dc309cdd 100644
--- a/include/view.h
+++ b/include/view.h
@@ -140,7 +140,7 @@ struct view_impl {
 	 * minimizing we don't destroy the foreign toplevel handle).
 	 */
 	void (*unmap)(struct view *view, bool client_request);
-	void (*maximize)(struct view *view, bool maximize);
+	void (*maximize)(struct view *view, enum view_axis maximized);
 	void (*minimize)(struct view *view, bool minimize);
 	struct view *(*get_root)(struct view *self);
 	void (*append_children)(struct view *self, struct wl_array *children);
diff --git a/include/xwayland.h b/include/xwayland.h
index ad6e6f02..31d923a1 100644
--- a/include/xwayland.h
+++ b/include/xwayland.h
@@ -59,9 +59,6 @@ struct xwayland_view {
 	struct view base;
 	struct wlr_xwayland_surface *xwayland_surface;
 
-	/* Used to detect stacking order updates */
-	int stacking_order;
-
 	/* Events unique to XWayland views */
 	struct wl_listener associate;
 	struct wl_listener dissociate;
@@ -85,8 +82,6 @@ void xwayland_unmanaged_create(struct server *server,
 void xwayland_view_create(struct server *server,
 	struct wlr_xwayland_surface *xsurface, bool mapped);
 
-void xwayland_adjust_stacking_order(struct server *server);
-
 struct wlr_xwayland_surface *xwayland_surface_from_view(struct view *view);
 
 void xwayland_server_init(struct server *server,
diff --git a/meson.build b/meson.build
index 6fe605d8..d8585029 100644
--- a/meson.build
+++ b/meson.build
@@ -50,9 +50,9 @@ endif
 add_project_arguments('-DLABWC_VERSION=@0@'.format(version), language: 'c')
 
 wlroots = dependency(
-  'wlroots-0.18',
+  'wlroots-0.19',
   default_options: ['default_library=static', 'examples=false'],
-  version: ['&gt;=0.18.1', '&lt;0.19.0'],
+  version: ['&gt;=0.19.0', '&lt;0.20.0'],
 )
 
 wlroots_has_xwayland = wlroots.get_variable('have_xwayland') == 'true'
diff --git a/src/buffer.c b/src/buffer.c
index 3e50264c..1badaf6e 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -49,6 +49,7 @@ data_buffer_destroy(struct wlr_buffer *wlr_buffer)
 	if (!buffer-&gt;surface_owns_data) {
 		free(buffer-&gt;data);
 	}
+	wlr_buffer_finish(wlr_buffer);
 	free(buffer);
 }
 
diff --git a/src/common/scene-helpers.c b/src/common/scene-helpers.c
index 9992afc7..c05a5226 100644
--- a/src/common/scene-helpers.c
+++ b/src/common/scene-helpers.c
@@ -48,32 +48,21 @@ lab_wlr_scene_get_prev_node(struct wlr_scene_node *node)
  */
 static void
 scene_output_damage(struct wlr_scene_output *scene_output,
-		const pixman_region32_t *region)
+		const pixman_region32_t *damage)
 {
-	if (!wlr_damage_ring_add(&amp;scene_output-&gt;damage_ring, region)) {
-		return;
-	}
-
 	struct wlr_output *output = scene_output-&gt;output;
-	enum wl_output_transform transform =
-		wlr_output_transform_invert(scene_output-&gt;output-&gt;transform);
-
-	int width = output-&gt;width;
-	int height = output-&gt;height;
-	if (transform &amp; WL_OUTPUT_TRANSFORM_90) {
-		width = output-&gt;height;
-		height = output-&gt;width;
-	}
 
-	pixman_region32_t frame_damage;
-	pixman_region32_init(&amp;frame_damage);
-	wlr_region_transform(&amp;frame_damage, region, transform, width, height);
+	pixman_region32_t clipped;
+	pixman_region32_init(&amp;clipped);
+	pixman_region32_intersect_rect(&amp;clipped, damage, 0, 0, output-&gt;width, output-&gt;height);
 
-	pixman_region32_union(&amp;scene_output-&gt;pending_commit_damage,
-		&amp;scene_output-&gt;pending_commit_damage, &amp;frame_damage);
-	pixman_region32_intersect_rect(&amp;scene_output-&gt;pending_commit_damage,
-		&amp;scene_output-&gt;pending_commit_damage, 0, 0, output-&gt;width, output-&gt;height);
-	pixman_region32_fini(&amp;frame_damage);
+	if (pixman_region32_not_empty(&amp;clipped)) {
+		wlr_damage_ring_add(&amp;scene_output-&gt;damage_ring, &amp;clipped);
+		pixman_region32_union(&amp;scene_output-&gt;WLR_PRIVATE.pending_commit_damage,
+			&amp;scene_output-&gt;WLR_PRIVATE.pending_commit_damage, &amp;clipped);
+	}
+
+	pixman_region32_fini(&amp;clipped);
 }
 
 /*
@@ -96,8 +85,10 @@ lab_wlr_scene_output_commit(struct wlr_scene_output *scene_output,
 	 * rendering on every output commit and overloads CPU.
 	 * We also need to verify the necessity of wants_magnification.
 	 */
-	if (!wlr_output-&gt;needs_frame &amp;&amp; !pixman_region32_not_empty(
-			&amp;scene_output-&gt;pending_commit_damage) &amp;&amp; !wants_magnification) {
+	if (!wlr_output-&gt;needs_frame
+			&amp;&amp; !pixman_region32_not_empty(
+				&amp;scene_output-&gt;WLR_PRIVATE.pending_commit_damage)
+			&amp;&amp; !wants_magnification) {
 		return true;
 	}
 
@@ -143,13 +134,6 @@ lab_wlr_scene_output_commit(struct wlr_scene_output *scene_output,
 		pixman_region32_init_rect(&amp;region,
 			additional_damage.x, additional_damage.y,
 			additional_damage.width, additional_damage.height);
-		/*
-		 * Region passed to scene_output_damage() should have the same
-		 * scale as the output buffer but have a different transform.
-		 */
-		wlr_region_transform(&amp;region, &amp;region, wlr_output-&gt;transform,
-			wlr_output-&gt;width, wlr_output-&gt;height);
-
 		scene_output_damage(scene_output, &amp;region);
 		pixman_region32_fini(&amp;region);
 	}
diff --git a/src/desktop.c b/src/desktop.c
index 45a6fc67..67ec8825 100644
--- a/src/desktop.c
+++ b/src/desktop.c
@@ -106,7 +106,7 @@ desktop_focus_view_or_surface(struct seat *seat, struct view *view,
 	} else {
 		struct wlr_xwayland_surface *xsurface =
 			wlr_xwayland_surface_try_from_wlr_surface(surface);
-		if (xsurface &amp;&amp; wlr_xwayland_or_surface_wants_focus(xsurface)) {
+		if (xsurface &amp;&amp; wlr_xwayland_surface_override_redirect_wants_focus(xsurface)) {
 			seat_focus_surface(seat, surface);
 		}
 #endif
diff --git a/src/input/cursor.c b/src/input/cursor.c
index ea4fe369..d97b93ab 100644
--- a/src/input/cursor.c
+++ b/src/input/cursor.c
@@ -463,10 +463,9 @@ process_cursor_motion_out_of_surface(struct server *server,
 		ly = view-&gt;current.y;
 		/* Take into account invisible xdg-shell CSD borders */
 		if (view-&gt;type == LAB_XDG_SHELL_VIEW) {
-			struct wlr_box geo;
-			wlr_xdg_surface_get_geometry(xdg_surface_from_view(view), &amp;geo);
-			lx -= geo.x;
-			ly -= geo.y;
+			struct wlr_xdg_surface *xdg_surface = xdg_surface_from_view(view);
+			lx -= xdg_surface-&gt;geometry.x;
+			ly -= xdg_surface-&gt;geometry.y;
 		}
 	} else if (node &amp;&amp; wlr_layer_surface_v1_try_from_wlr_surface(surface)) {
 		wlr_scene_node_coords(node, &amp;lx, &amp;ly);
diff --git a/src/input/ime.c b/src/input/ime.c
index 07b996ec..2a6c3b45 100644
--- a/src/input/ime.c
+++ b/src/input/ime.c
@@ -230,10 +230,8 @@ update_popup_position(struct input_method_popup *popup)
 
 		if (xdg_surface) {
 			/* Take into account invisible xdg-shell CSD borders */
-			struct wlr_box geo;
-			wlr_xdg_surface_get_geometry(xdg_surface, &amp;geo);
-			cursor_rect.x -= geo.x;
-			cursor_rect.y -= geo.y;
+			cursor_rect.x -= xdg_surface-&gt;geometry.x;
+			cursor_rect.y -= xdg_surface-&gt;geometry.y;
 		}
 	} else {
 		cursor_rect = (struct wlr_box){0};
diff --git a/src/input/tablet.c b/src/input/tablet.c
index acf1f01e..ea707308 100644
--- a/src/input/tablet.c
+++ b/src/input/tablet.c
@@ -169,7 +169,7 @@ tablet_get_coords(struct drawing_tablet *tablet, double *x, double *y, double *d
 	/* find the surface and return it if it accepts tablet events */
 	struct wlr_surface *surface = lab_wlr_surface_from_node(node);
 
-	if (surface &amp;&amp; !wlr_surface_accepts_tablet_v2(tablet-&gt;tablet_v2, surface)) {
+	if (surface &amp;&amp; !wlr_surface_accepts_tablet_v2(surface, tablet-&gt;tablet_v2)) {
 		return NULL;
 	}
 	return surface;
diff --git a/src/input/touch.c b/src/input/touch.c
index a8a9b9e1..740df726 100644
--- a/src/input/touch.c
+++ b/src/input/touch.c
@@ -50,7 +50,7 @@ touch_get_coords(struct seat *seat, struct wlr_touch *touch, double x, double y,
 	/* Find the surface and return it if it accepts touch events */
 	struct wlr_surface *surface = lab_wlr_surface_from_node(node);
 
-	if (surface &amp;&amp; !wlr_surface_accepts_touch(seat-&gt;seat, surface)) {
+	if (surface &amp;&amp; !wlr_surface_accepts_touch(surface, seat-&gt;seat)) {
 		surface = NULL;
 	}
 	return surface;
diff --git a/src/magnifier.c b/src/magnifier.c
index e1b3fcd9..0846e02a 100644
--- a/src/magnifier.c
+++ b/src/magnifier.c
@@ -237,7 +237,7 @@ static void
 enable_magnifier(struct server *server, bool enable)
 {
 	magnify_on = enable;
-	server-&gt;scene-&gt;direct_scanout = enable ? false
+	server-&gt;scene-&gt;WLR_PRIVATE.direct_scanout = enable ? false
 		: server-&gt;direct_scanout_enabled;
 }
 
diff --git a/src/server.c b/src/server.c
index 9e87655e..7adafb12 100644
--- a/src/server.c
+++ b/src/server.c
@@ -55,6 +55,7 @@
 #define LAB_WLR_FRACTIONAL_SCALE_V1_VERSION 1
 #define LAB_WLR_LINUX_DMABUF_VERSION 4
 #define EXT_FOREIGN_TOPLEVEL_LIST_VERSION 1
+#define LAB_WLR_PRESENTATION_TIME_VERSION 2
 
 static struct wlr_compositor *compositor;
 static struct wl_event_source *sighup_source;
@@ -549,7 +550,7 @@ server_init(struct server *server)
 		wlr_log(WLR_ERROR, "unable to create scene");
 		exit(EXIT_FAILURE);
 	}
-	server-&gt;direct_scanout_enabled = server-&gt;scene-&gt;direct_scanout;
+	server-&gt;direct_scanout_enabled = server-&gt;scene-&gt;WLR_PRIVATE.direct_scanout;
 
 	/*
 	 * The order in which the scene-trees below are created determines the
@@ -629,8 +630,9 @@ server_init(struct server *server)
 	kde_server_decoration_init(server);
 	xdg_server_decoration_init(server);
 
-	struct wlr_presentation *presentation =
-		wlr_presentation_create(server-&gt;wl_display, server-&gt;backend);
+	struct wlr_presentation *presentation = wlr_presentation_create(
+		server-&gt;wl_display, server-&gt;backend,
+		LAB_WLR_PRESENTATION_TIME_VERSION);
 	if (!presentation) {
 		wlr_log(WLR_ERROR, "unable to create presentation interface");
 		exit(EXIT_FAILURE);
diff --git a/src/view.c b/src/view.c
index 89743ecd..2b01cce8 100644
--- a/src/view.c
+++ b/src/view.c
@@ -552,7 +552,7 @@ view_update_outputs(struct view *view)
 	wl_list_for_each(output, &amp;view-&gt;server-&gt;outputs, link) {
 		if (output_is_usable(output) &amp;&amp; wlr_output_layout_intersects(
 				layout, output-&gt;wlr_output, &amp;view-&gt;current)) {
-			new_outputs |= (1ull &lt;&lt; output-&gt;scene_output-&gt;index);
+			new_outputs |= (1ull &lt;&lt; output-&gt;scene_output-&gt;WLR_PRIVATE.index);
 		}
 	}
 
@@ -569,7 +569,7 @@ view_on_output(struct view *view, struct output *output)
 	assert(view);
 	assert(output);
 	return output-&gt;scene_output
-			&amp;&amp; (view-&gt;outputs &amp; (1ull &lt;&lt; output-&gt;scene_output-&gt;index));
+			&amp;&amp; (view-&gt;outputs &amp; (1ull &lt;&lt; output-&gt;scene_output-&gt;WLR_PRIVATE.index));
 }
 
 void
@@ -1339,7 +1339,7 @@ static void
 set_maximized(struct view *view, enum view_axis maximized)
 {
 	if (view-&gt;impl-&gt;maximize) {
-		view-&gt;impl-&gt;maximize(view, (maximized == VIEW_AXIS_BOTH));
+		view-&gt;impl-&gt;maximize(view, maximized);
 	}
 
 	view-&gt;maximized = maximized;
@@ -2283,12 +2283,6 @@ view_move_to_front(struct view *view)
 		move_to_front(view);
 	}
 
-#if HAVE_XWAYLAND
-	if (view-&gt;type == LAB_XWAYLAND_VIEW) {
-		xwayland_adjust_stacking_order(view-&gt;server);
-	}
-#endif
-
 	cursor_update_focus(view-&gt;server);
 	desktop_update_top_layer_visibility(view-&gt;server);
 }
@@ -2303,12 +2297,6 @@ view_move_to_back(struct view *view)
 	for_each_subview(root, move_to_back);
 	move_to_back(root);
 
-#if HAVE_XWAYLAND
-	if (view-&gt;type == LAB_XWAYLAND_VIEW) {
-		xwayland_adjust_stacking_order(view-&gt;server);
-	}
-#endif
-
 	cursor_update_focus(view-&gt;server);
 	desktop_update_top_layer_visibility(view-&gt;server);
 }
@@ -2491,12 +2479,6 @@ view_set_shade(struct view *view, bool shaded)
 	view-&gt;shaded = shaded;
 	ssd_enable_shade(view-&gt;ssd, view-&gt;shaded);
 	wlr_scene_node_set_enabled(&amp;view-&gt;content_tree-&gt;node, !view-&gt;shaded);
-
-#if HAVE_XWAYLAND
-	if (view-&gt;type == LAB_XWAYLAND_VIEW) {
-		xwayland_adjust_stacking_order(view-&gt;server);
-	}
-#endif
 }
 
 void
diff --git a/src/workspaces.c b/src/workspaces.c
index 14ed51a9..23e86c41 100644
--- a/src/workspaces.c
+++ b/src/workspaces.c
@@ -395,10 +395,6 @@ workspaces_switch_to(struct workspace *target, bool update_focus)
 	/* And finally show the OSD */
 	_osd_show(server);
 
-#if HAVE_XWAYLAND
-	/* Ensure xwayland internal stacking order corresponds to the current workspace  */
-	xwayland_adjust_stacking_order(server);
-#endif
 	/*
 	 * Make sure we are not carrying around a
 	 * cursor image from the previous desktop
diff --git a/src/xdg.c b/src/xdg.c
index 5bb8fa17..cebc5e39 100644
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -149,8 +149,7 @@ handle_commit(struct wl_listener *listener, void *data)
 		return;
 	}
 
-	struct wlr_box size;
-	wlr_xdg_surface_get_geometry(xdg_surface, &amp;size);
+	struct wlr_box size = xdg_surface-&gt;geometry;
 	bool update_required = false;
 
 	/*
@@ -493,9 +492,10 @@ xdg_toplevel_view_close(struct view *view)
 }
 
 static void
-xdg_toplevel_view_maximize(struct view *view, bool maximized)
+xdg_toplevel_view_maximize(struct view *view, enum view_axis maximized)
 {
-	wlr_xdg_toplevel_set_maximized(xdg_toplevel_from_view(view), maximized);
+	wlr_xdg_toplevel_set_maximized(xdg_toplevel_from_view(view),
+		maximized == VIEW_AXIS_BOTH);
 }
 
 static void
@@ -726,10 +726,8 @@ xdg_toplevel_view_map(struct view *view)
 		 * dimensions remain zero until handle_commit().
 		 */
 		if (wlr_box_empty(&amp;view-&gt;pending)) {
-			struct wlr_box size;
-			wlr_xdg_surface_get_geometry(xdg_surface, &amp;size);
-			view-&gt;pending.width = size.width;
-			view-&gt;pending.height = size.height;
+			view-&gt;pending.width = xdg_surface-&gt;geometry.width;
+			view-&gt;pending.height = xdg_surface-&gt;geometry.height;
 		}
 
 		/*
diff --git a/src/xwayland-unmanaged.c b/src/xwayland-unmanaged.c
index 38d3c315..0a7880ca 100644
--- a/src/xwayland-unmanaged.c
+++ b/src/xwayland-unmanaged.c
@@ -46,7 +46,7 @@ handle_map(struct wl_listener *listener, void *data)
 
 	CONNECT_SIGNAL(xsurface, unmanaged, set_geometry);
 
-	if (wlr_xwayland_or_surface_wants_focus(xsurface)) {
+	if (wlr_xwayland_surface_override_redirect_wants_focus(xsurface)) {
 		seat_focus_surface(&amp;unmanaged-&gt;server-&gt;seat, xsurface-&gt;surface);
 	}
 
@@ -66,7 +66,7 @@ focus_next_surface(struct server *server, struct wlr_xwayland_surface *xsurface)
 	struct wl_list *list = &amp;server-&gt;unmanaged_surfaces;
 	wl_list_for_each_reverse(u, list, link) {
 		struct wlr_xwayland_surface *prev = u-&gt;xwayland_surface;
-		if (wlr_xwayland_or_surface_wants_focus(prev)) {
+		if (wlr_xwayland_surface_override_redirect_wants_focus(prev)) {
 			seat_focus_surface(&amp;server-&gt;seat, prev-&gt;surface);
 			return;
 		}
diff --git a/src/xwayland.c b/src/xwayland.c
index 36da5ec0..cbe86128 100644
--- a/src/xwayland.c
+++ b/src/xwayland.c
@@ -66,7 +66,7 @@ xwayland_view_wants_focus(struct view *view)
 	struct wlr_xwayland_surface *xsurface =
 		xwayland_surface_from_view(view);
 
-	switch (wlr_xwayland_icccm_input_model(xsurface)) {
+	switch (wlr_xwayland_surface_icccm_input_model(xsurface)) {
 	/*
 	 * Abbreviated from ICCCM section 4.1.7 (Input Focus):
 	 *
@@ -810,10 +810,10 @@ out:
 }
 
 static void
-xwayland_view_maximize(struct view *view, bool maximized)
+xwayland_view_maximize(struct view *view, enum view_axis maximized)
 {
 	wlr_xwayland_surface_set_maximized(xwayland_surface_from_view(view),
-		maximized);
+		maximized &amp; VIEW_AXIS_HORIZONTAL, maximized &amp; VIEW_AXIS_VERTICAL);
 }
 
 static void
@@ -932,9 +932,6 @@ xwayland_view_create(struct server *server,
 	view-&gt;type = LAB_XWAYLAND_VIEW;
 	view-&gt;impl = &amp;xwayland_view_impl;
 
-	/* Set to -1 so we always restack the view on map */
-	xwayland_view-&gt;stacking_order = -1;
-
 	/*
 	 * Set two-way view &lt;-&gt; xsurface association.  Usually the association
 	 * remains until the xsurface is destroyed (which also destroys the
@@ -1104,96 +1101,6 @@ xwayland_server_init(struct server *server, struct wlr_compositor *compositor)
 	}
 }
 
-enum xwayland_view_layer {
-	XWAYLAND_VIEW_HIDDEN,
-	XWAYLAND_VIEW_BOTTOM,
-	XWAYLAND_VIEW_NORMAL,
-	XWAYLAND_VIEW_TOP,
-};
-
-static enum xwayland_view_layer
-get_layer(struct view *view)
-{
-	if (view-&gt;workspace != view-&gt;server-&gt;workspaces.current) {
-		/*
-		 * Until we expose the workspaces to xwayland we need a way to
-		 * ensure that xwayland views on the current workspace are
-		 * always stacked above xwayland views on other workspaces.
-		 *
-		 * If we fail to do so, issues arise in scenarios where we
-		 * change the mouse focus but do not change the (xwayland)
-		 * stacking order.
-		 *
-		 * Reproducer:
-		 * - open at least two xwayland windows which allow scrolling
-		 *   (e.g. urxvt with 'man man')
-		 * - switch to another workspace, open another xwayland window
-		 *   which allows scrolling and maximize it
-		 * - switch back to the previous workspace with the two windows
-		 * - move the mouse to the xwayland window that does *not* have
-		 *   focus
-		 * - start scrolling
-		 * - all scroll events should end up on the maximized window on
-		 *   the other workspace
-		 */
-		return XWAYLAND_VIEW_HIDDEN;
-	} else if (view-&gt;shaded) {
-		/*
-		 * Ensure that we don't raise a shaded window to the front
-		 * which then steals mouse events.
-		 */
-		return XWAYLAND_VIEW_HIDDEN;
-	} else if (view_is_always_on_bottom(view)) {
-		return XWAYLAND_VIEW_BOTTOM;
-	} else if (view_is_always_on_top(view)) {
-		return XWAYLAND_VIEW_TOP;
-	} else {
-		return XWAYLAND_VIEW_NORMAL;
-	}
-}
-
-void
-xwayland_adjust_stacking_order(struct server *server)
-{
-	if (!server-&gt;xwayland) {
-		/* This happens when windows are unmapped on exit */
-		return;
-	}
-
-	int stacking_order = 0;
-	bool update = false;
-
-	/*
-	 * Iterate over the windows from bottom to top and notify their
-	 * stacking order to xwayland if we detect updates in it. Note
-	 * that server-&gt;views are sorted from top to bottom but doesn't
-	 * consider always-on-{top,bottom} windows.
-	 */
-	for (enum xwayland_view_layer layer = XWAYLAND_VIEW_HIDDEN;
-			layer &lt;= XWAYLAND_VIEW_TOP; layer++) {
-		struct view *view;
-		wl_list_for_each_reverse(view, &amp;server-&gt;views, link) {
-			if (view-&gt;type != LAB_XWAYLAND_VIEW
-					|| layer != get_layer(view)) {
-				continue;
-			}
-
-			struct xwayland_view *xwayland_view =
-				xwayland_view_from_view(view);
-
-			/* On detecting update, restack all the views above it */
-			update |= xwayland_view-&gt;stacking_order != stacking_order;
-			if (update) {
-				wlr_xwayland_surface_restack(
-					xwayland_view-&gt;xwayland_surface,
-					NULL, XCB_STACK_MODE_ABOVE);
-			}
-			xwayland_view-&gt;stacking_order = stacking_order;
-			stacking_order++;
-		}
-	}
-}
-
 void
 xwayland_reset_cursor(struct server *server)
 {
diff --git a/subprojects/wlroots.wrap b/subprojects/wlroots.wrap
index 838b2633..386f785f 100644
--- a/subprojects/wlroots.wrap
+++ b/subprojects/wlroots.wrap
@@ -1,7 +1,7 @@
 [wrap-git]
 url = https://gitlab.freedesktop.org/wlroots/wlroots.git
-revision = 0.18
+revision = 9b55737cf512ae5132b10633b83e099d46fa259f
 
 [provide]
-dependency_names = wlroots-0.18
-wlroots-0.18=wlroots
+dependency_names = wlroots-0.19
+wlroots-0.19=wlroots
</pre></body></html>