[PATCH xserver 3/4] xwayland: Attach and configure window only when asked by Wayland

Tiago Vignatti tiago.vignatti at intel.com
Wed Dec 19 11:32:29 PST 2012


Previously, windows were all positioned at (0, 0). Now, with this new
protocol, Wayland can forward the global position to X and map them correctly.

Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
---
 hw/xfree86/xwayland/xserver.xml        |   31 ++++++++++++++++
 hw/xfree86/xwayland/xwayland-input.c   |    8 +++--
 hw/xfree86/xwayland/xwayland-private.h |    3 ++
 hw/xfree86/xwayland/xwayland-window.c  |    7 +---
 hw/xfree86/xwayland/xwayland.c         |   61 +++++++++++++++++++++++++++++++-
 5 files changed, 100 insertions(+), 10 deletions(-)

diff --git a/hw/xfree86/xwayland/xserver.xml b/hw/xfree86/xwayland/xserver.xml
index 4f89bb1..a5dbebd 100644
--- a/hw/xfree86/xwayland/xserver.xml
+++ b/hw/xfree86/xwayland/xserver.xml
@@ -34,6 +34,29 @@
       </description>
       <arg name="fd" type="fd"/>
     </event>
+
+    <event name="map">
+      <description summary="notify X when window can be mapped">
+	Notify X that Window 'xid' is ready to be mapped. Effectively this
+	happens after compositor receiving wm_xwin.map from WM.
+      </description>
+
+      <arg name="xid" type="uint"/>
+    </event>
+
+    <event name="configure">
+      <description summary="notify X about new window configuration">
+	Worth to note that coordinates 'x' and 'y' are global.
+      </description>
+
+      <arg name="xid" type="uint"/>
+      <arg name="x" type="int"/>
+      <arg name="y" type="int"/>
+      <arg name="width" type="int"/>
+      <arg name="height" type="int"/>
+      <arg name="edges" type="uint"/>
+    </event>
+
   </interface>
 
   <interface name="wm" version="1">
@@ -81,6 +104,14 @@
     <description summary="">
     </description>
 
+    <request name="map">
+      <description summary="notify compositor when window can be mapped">
+	Notify compositor that the current window is ready to be mapped by X.
+	Effectively this happens after a MapNotify hits the window manager and
+	the compositor in principle would proceed notifying X via xserver.map.
+      </description>
+    </request>
+
     <request name="set_window">
       <description summary="specify window id, geometries and positioning">
 	Notifies the compositor about X Window id and its configuration
diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c
index c78db36..d9872c2 100644
--- a/hw/xfree86/xwayland/xwayland-input.c
+++ b/hw/xfree86/xwayland/xwayland-input.c
@@ -274,6 +274,7 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
 {
     struct xwl_seat *xwl_seat = data;
     DeviceIntPtr dev = xwl_seat->pointer;
+    int32_t dx, dy;
     int i;
     int sx = wl_fixed_to_int(sx_w);
     int sy = wl_fixed_to_int(sy_w);
@@ -284,7 +285,9 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
 
     xwl_seat->focus_window = wl_surface_get_user_data(surface);
 
-    (*pScreen->SetCursorPosition) (dev, pScreen, sx, sy, TRUE);
+    dx = xwl_seat->focus_window->window->drawable.x;
+    dy = xwl_seat->focus_window->window->drawable.y;
+    (*pScreen->SetCursorPosition) (dev, pScreen, sx + dx, sy + dy, TRUE);
 
     SetDeviceRedirectWindow(xwl_seat->pointer, xwl_seat->focus_window->window);
 
@@ -325,8 +328,7 @@ pointer_handle_motion(void *data, struct wl_pointer *pointer,
 		      uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w)
 {
     struct xwl_seat *xwl_seat = data;
-    struct xwl_screen *xwl_screen = xwl_seat->xwl_screen;
-    int32_t dx, dy, lx, ly;
+    int32_t dx, dy;
     int sx = wl_fixed_to_int(sx_w);
     int sy = wl_fixed_to_int(sy_w);
     ValuatorMask mask;
diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h
index 2716ebe..2ec8981 100644
--- a/hw/xfree86/xwayland/xwayland-private.h
+++ b/hw/xfree86/xwayland/xwayland-private.h
@@ -113,6 +113,9 @@ xwl_global_get(struct xwl_screen *xwl_screen, const char *interface);
 
 struct xwl_screen *xwl_screen_get(ScreenPtr screen);
 
+void
+xwl_window_attach(struct xwl_window *xwl_window, PixmapPtr pixmap);
+
 void xwayland_screen_preinit_output(struct xwl_screen *xwl_screen, ScrnInfoPtr scrninfo);
 
 int xwl_screen_init_cursor(struct xwl_screen *xwl_screen, ScreenPtr screen);
diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c
index 09ebb99..11d3416 100644
--- a/hw/xfree86/xwayland/xwayland-window.c
+++ b/hw/xfree86/xwayland/xwayland-window.c
@@ -59,7 +59,7 @@ static const struct wl_callback_listener free_pixmap_listener = {
 	free_pixmap,
 };
 
-static void
+void
 xwl_window_attach(struct xwl_window *xwl_window, PixmapPtr pixmap)
 {
     struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
@@ -193,12 +193,7 @@ xwl_realize_window(WindowPtr window)
 	return FALSE;
     }
 
-    if (xwl_screen->xorg_server)
-	xserver_set_window_surface(xwl_screen->xorg_server,
-			      xwl_window->surface, window->drawable.id);
-
     wl_surface_set_user_data(xwl_window->surface, xwl_window);
-    xwl_window_attach(xwl_window, (*screen->GetWindowPixmap)(window));
 
     dixSetPrivate(&window->devPrivates,
 		  &xwl_window_private_key, xwl_window);
diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c
index bf90826..a22ee58 100644
--- a/hw/xfree86/xwayland/xwayland.c
+++ b/hw/xfree86/xwayland/xwayland.c
@@ -68,9 +68,68 @@ xserver_listen_socket(void *data, struct xserver *xserver, int fd)
     ListenOnOpenFD(fd, TRUE);
 }
 
+static void
+xserver_handle_map(void *data, struct xserver *xserver, uint32_t id)
+{
+    struct xwl_screen *xwl_screen = data;
+    struct xwl_window *xwl_window, *wtmp;
+    ScreenPtr screen = xwl_screen->screen;
+    WindowPtr pWin;
+
+    xorg_list_for_each_entry_safe(xwl_window, wtmp,
+	                          &xwl_screen->window_list, link) {
+	pWin = xwl_window->window;
+	if (pWin->drawable.id == id) {
+	    xserver_set_window_surface(xwl_screen->xorg_server,
+	                               xwl_window->surface,
+	                               pWin->drawable.id);
+	    xwl_window_attach(xwl_window, (*screen->GetWindowPixmap)(pWin));
+	    return;
+	}
+    }
+}
+
+static void
+xserver_handle_configure(void *data, struct xserver *xserver, uint32_t id,
+			 int x, int y, int32_t width, int32_t height,
+			 uint32_t edges)
+{
+    struct xwl_screen *xwl_screen = data;
+    struct xwl_window *xwl_window, *wtmp;
+    WindowPtr pWin;
+    ClientPtr pClient;
+    int err;
+    uint32_t mask = CWX | CWY;
+    XID vlist[2];
+
+    /* TODO: width and height are unused at moment */
+    vlist[0] = x;
+    vlist[1] = y;
+
+    xorg_list_for_each_entry_safe(xwl_window, wtmp,
+	                          &xwl_screen->window_list, link) {
+	pWin = xwl_window->window;
+	if (pWin->drawable.id == id) {
+	    err =
+	    dixLookupClient(&pClient, pWin->drawable.id, serverClient,
+	                    DixUnknownAccess);
+	    if (err != Success) {
+		ErrorF("Failed to lookup window: 0x%x\n",
+		       (unsigned int) pWin->drawable.id);
+		return;
+	    }
+
+	    ConfigureWindow(pWin, mask, vlist, pClient);
+	    return;
+	}
+    }
+}
+
 static const struct xserver_listener xwl_server_listener = {
     xserver_client,
-    xserver_listen_socket
+    xserver_listen_socket,
+    xserver_handle_map,
+    xserver_handle_configure
 };
 
 static void
-- 
1.7.9.5



More information about the wayland-devel mailing list