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 <[email protected]>
---
 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

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to