7730e12c9e
resolves: rhbz#1729925
92 lines
3.2 KiB
Diff
92 lines
3.2 KiB
Diff
From 63346c74393e1df4555f84367529802a67578ef6 Mon Sep 17 00:00:00 2001
|
|
From: Carlos Garnacho <carlosg@gnome.org>
|
|
Date: Mon, 7 Jan 2019 15:33:35 +0100
|
|
Subject: [PATCH xserver 15/15] xwayland: Handle the case of windows being
|
|
realized before redirection
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
If Xwayland gets to realize a window meant for composition before the
|
|
compositor redirected windows (i.e. redirect mode is not RedirectDrawManual
|
|
yet), the window would stay "invisible" as we wouldn't create a
|
|
wl_surface/wl_shell_surface for it at any later point.
|
|
|
|
This scenario may happen if the wayland compositor sets up a X11 socket
|
|
upfront, but waits to raise Xwayland until there are X11 clients. In this
|
|
case the first data on the socket is the client's, the compositor can hardly
|
|
beat that in order to redirect subwindows before the client realizes a
|
|
Window.
|
|
|
|
In order to jump across this hurdle, allow the late creation of a matching
|
|
(shell) surface for the WindowPtr on SetWindowPixmapProc, so it is ensured
|
|
to be created after the compositor set up redirection.
|
|
|
|
Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
|
|
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
|
|
Reviewed-by: Olivier Fourdan <ofourdan@redhat.com>
|
|
(cherry picked from commit 78cc8b6f9613fc71f6ecc7e8848d54364a250634)
|
|
---
|
|
hw/xwayland/xwayland.c | 25 +++++++++++++++++++++++++
|
|
hw/xwayland/xwayland.h | 1 +
|
|
2 files changed, 26 insertions(+)
|
|
|
|
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
|
|
index 9a4b52fa9..baa08d87b 100644
|
|
--- a/hw/xwayland/xwayland.c
|
|
+++ b/hw/xwayland/xwayland.c
|
|
@@ -699,6 +699,26 @@ xwl_save_screen(ScreenPtr pScreen, int on)
|
|
return TRUE;
|
|
}
|
|
|
|
+static void
|
|
+xwl_set_window_pixmap(WindowPtr window,
|
|
+ PixmapPtr pixmap)
|
|
+{
|
|
+ ScreenPtr screen = window->drawable.pScreen;
|
|
+ struct xwl_screen *xwl_screen;
|
|
+
|
|
+ xwl_screen = xwl_screen_get(screen);
|
|
+
|
|
+ screen->SetWindowPixmap = xwl_screen->SetWindowPixmap;
|
|
+ (*screen->SetWindowPixmap) (window, pixmap);
|
|
+ xwl_screen->SetWindowPixmap = screen->SetWindowPixmap;
|
|
+ screen->SetWindowPixmap = xwl_set_window_pixmap;
|
|
+
|
|
+ if (!RegionNotEmpty(&window->winSize))
|
|
+ return;
|
|
+
|
|
+ ensure_surface_for_window(window);
|
|
+}
|
|
+
|
|
static void
|
|
frame_callback(void *data,
|
|
struct wl_callback *callback,
|
|
@@ -1185,6 +1205,11 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
|
|
xwl_screen->CloseScreen = pScreen->CloseScreen;
|
|
pScreen->CloseScreen = xwl_close_screen;
|
|
|
|
+ if (xwl_screen->rootless) {
|
|
+ xwl_screen->SetWindowPixmap = pScreen->SetWindowPixmap;
|
|
+ pScreen->SetWindowPixmap = xwl_set_window_pixmap;
|
|
+ }
|
|
+
|
|
pScreen->CursorWarpedTo = xwl_cursor_warped_to;
|
|
pScreen->CursorConfinedTo = xwl_cursor_confined_to;
|
|
|
|
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
|
|
index dfa3b37c3..0854df456 100644
|
|
--- a/hw/xwayland/xwayland.h
|
|
+++ b/hw/xwayland/xwayland.h
|
|
@@ -133,6 +133,7 @@ struct xwl_screen {
|
|
UnrealizeWindowProcPtr UnrealizeWindow;
|
|
DestroyWindowProcPtr DestroyWindow;
|
|
XYToWindowProcPtr XYToWindow;
|
|
+ SetWindowPixmapProcPtr SetWindowPixmap;
|
|
|
|
struct xorg_list output_list;
|
|
struct xorg_list seat_list;
|
|
--
|
|
2.21.0
|
|
|