xwm: use last focused window for guessing transient parent
authorTiago Vignatti <tiago.vignatti@intel.com>
Fri, 20 Jul 2012 20:09:55 +0000 (23:09 +0300)
committerKristian Høgsberg <krh@bitplanet.net>
Sun, 22 Jul 2012 18:35:25 +0000 (14:35 -0400)
On X the global absolute coordinates are sent in ConfigureNotify and transient
windows are mapped exactly on that position. On Wayland we don't have the
concept of global coordinates, and that's a problem for transient surfaces
without transient_for set because they rely on such hint for setting their
positioning.

So this solution is a workaround. It guesses a parent based on the last
focused window to determine the relative position of the transient surface.
This put transient windows of Chrome browser back to work.

Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
src/xwayland/window-manager.c
src/xwayland/xwayland.h

index 405244b..64290ec 100644 (file)
@@ -511,6 +511,8 @@ weston_wm_window_activate(struct wl_listener *listener, void *data)
        if (wm->focus_window)
                weston_wm_window_schedule_repaint(wm->focus_window);
        wm->focus_window = window;
+       if (window)
+               wm->focus_latest = window;
        if (wm->focus_window)
                weston_wm_window_schedule_repaint(wm->focus_window);
 }
@@ -1562,7 +1564,7 @@ xserver_map_shell_surface(struct weston_wm *wm,
                &wm->server->compositor->shell_interface;
        struct weston_wm_window *parent;
        struct theme *t = window->wm->theme;
-       int x = 0, y = 0;
+       int parent_id, x = 0, y = 0;
 
        if (!shell_interface->create_shell_surface)
                return;
@@ -1573,12 +1575,20 @@ xserver_map_shell_surface(struct weston_wm *wm,
                                                      &shell_client);
 
        /* ICCCM 4.1.1 */
-       if (!window->override_redirect || !window->transient_for) {
+       if (!window->override_redirect) {
                shell_interface->set_toplevel(window->shsurf);
                return;
        }
 
-       parent = hash_table_lookup(wm->window_hash, window->transient_for->id);
+       /* not all non-toplevel has transient_for set. So we need this
+        * workaround to guess a parent that will determine the relative
+        * position of the transient surface */
+       if (!window->transient_for)
+               parent_id = wm->focus_latest->id;
+       else
+               parent_id = window->transient_for->id;
+
+       parent = hash_table_lookup(wm->window_hash, parent_id);
 
        /* non-decorated and non-toplevel windows, e.g. sub-menus */
        if (!parent->decorate && parent->override_redirect) {
index 7e1ea45..23c6a77 100644 (file)
@@ -57,6 +57,7 @@ struct weston_wm {
        struct weston_xserver *server;
        xcb_window_t wm_window;
        struct weston_wm_window *focus_window;
+       struct weston_wm_window *focus_latest;
        struct theme *theme;
        xcb_cursor_t *cursors;
        int last_cursor;