[PATCH weston 5/6] xwm: fix transient positioning

Tiago Vignatti tiago.vignatti at intel.com
Mon Jun 4 10:01:47 PDT 2012


commit eaee7841 took out the configure positioning of windows. This patch
brings it back and addresses also logic for resizing and sub-menus, that was
not covered on that commit. I've tested on the following: firefox,
google-chrome, gtk3-demo's Menus widget.

Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
---
 src/xwayland/window-manager.c |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index 1e121ee..2d6b35a 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -386,6 +386,7 @@ weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *eve
 	xcb_configure_notify_event_t *configure_notify = 
 		(xcb_configure_notify_event_t *) event;
 	struct weston_wm_window *window;
+	int x, y;
 
 	window = hash_table_lookup(wm->window_hash, configure_notify->window);
 
@@ -394,6 +395,13 @@ weston_wm_handle_configure_notify(struct weston_wm *wm, xcb_generic_event_t *eve
 		configure_notify->window,
 		configure_notify->x, configure_notify->y,
 		configure_notify->width, configure_notify->height);
+
+	/* resize is not supposed to fall here */
+	if (configure_notify->window == window->id) {
+		weston_wm_window_get_child_position(window, &x, &y);
+		window->x = configure_notify->x - x;
+		window->y = configure_notify->y - y;
+	}
 }
 
 static void
@@ -1316,6 +1324,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;
 
 	if (!shell_interface->create_shell_surface)
 		return;
@@ -1332,9 +1341,16 @@ xserver_map_shell_surface(struct weston_wm *wm,
 	}
 
 	parent = hash_table_lookup(wm->window_hash, window->transient_for->id);
+
+	/* non-decorated and non-toplevel windows, e.g. sub-menus */
+	if (!parent->decorate && parent->override_redirect) {
+		x = parent->x + t->margin;
+		y = parent->y + t->margin;
+	}
+
 	shell_interface->set_transient(window->shsurf, parent->shsurf,
-				       window->x - parent->x + t->margin + t->width,
-				       window->y - parent->y + t->margin + t->titlebar_height,
+				       window->x + t->margin - x,
+				       window->y + t->margin - y,
 				       WL_SHELL_SURFACE_TRANSIENT_INACTIVE);
 }
 
-- 
1.7.9.5



More information about the wayland-devel mailing list