From 1059e173f4c0139e909c7d8b5d450f30c0adad0e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 6 Oct 2018 14:49:33 +1000 Subject: Only damage popups when popups have damage The previous behaviour was to damage the entire view, which would recurse into each popup. This patch makes it damage only the popup's surface, and respect the surface damage given by the client. This adds listeners to the popup's map and unmap events rather than doing the damage in the create and destroy functions. To get the popup's position relative to the view, a new child_impl function get_root_coords has been introduced, which traverses up the parents. --- sway/desktop/xdg_shell.c | 17 +++++++++++++++++ sway/desktop/xdg_shell_v6.c | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) (limited to 'sway/desktop') diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index a8b527a7..9036448b 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c @@ -20,6 +20,19 @@ static const struct sway_view_child_impl popup_impl; +static void popup_get_root_coords(struct sway_view_child *child, + int *root_sx, int *root_sy) { + struct sway_xdg_popup *popup = (struct sway_xdg_popup *)child; + struct wlr_xdg_surface *surface = popup->wlr_xdg_surface; + *root_sx = -surface->geometry.x; + *root_sy = -surface->geometry.y; + while (surface && surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { + *root_sx += surface->popup->geometry.x; + *root_sy += surface->popup->geometry.y; + surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent); + } +} + static void popup_destroy(struct sway_view_child *child) { if (!sway_assert(child->impl == &popup_impl, "Expected an xdg_shell popup")) { @@ -32,6 +45,7 @@ static void popup_destroy(struct sway_view_child *child) { } static const struct sway_view_child_impl popup_impl = { + .get_root_coords = popup_get_root_coords, .destroy = popup_destroy, }; @@ -85,6 +99,9 @@ static struct sway_xdg_popup *popup_create( wl_signal_add(&xdg_surface->events.destroy, &popup->destroy); popup->destroy.notify = popup_handle_destroy; + wl_signal_add(&xdg_surface->events.map, &popup->child.surface_map); + wl_signal_add(&xdg_surface->events.unmap, &popup->child.surface_unmap); + popup_unconstrain(popup); return popup; diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index a7838c0f..765a80b1 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c @@ -19,6 +19,19 @@ static const struct sway_view_child_impl popup_impl; +static void popup_get_root_coords(struct sway_view_child *child, + int *root_sx, int *root_sy) { + struct sway_xdg_popup_v6 *popup = (struct sway_xdg_popup_v6 *)child; + struct wlr_xdg_surface_v6 *surface = popup->wlr_xdg_surface_v6; + *root_sx = -surface->geometry.x; + *root_sy = -surface->geometry.y; + while (surface && surface->role == WLR_XDG_SURFACE_V6_ROLE_POPUP) { + *root_sx += surface->popup->geometry.x; + *root_sy += surface->popup->geometry.y; + surface = surface->popup->parent; + } +} + static void popup_destroy(struct sway_view_child *child) { if (!sway_assert(child->impl == &popup_impl, "Expected an xdg_shell_v6 popup")) { @@ -31,6 +44,7 @@ static void popup_destroy(struct sway_view_child *child) { } static const struct sway_view_child_impl popup_impl = { + .get_root_coords = popup_get_root_coords, .destroy = popup_destroy, }; @@ -84,6 +98,9 @@ static struct sway_xdg_popup_v6 *popup_create( wl_signal_add(&xdg_surface->events.destroy, &popup->destroy); popup->destroy.notify = popup_handle_destroy; + wl_signal_add(&xdg_surface->events.map, &popup->child.surface_map); + wl_signal_add(&xdg_surface->events.unmap, &popup->child.surface_unmap); + popup_unconstrain(popup); return popup; -- cgit v1.2.3 From 59ba528bd930e55263cbee03eb9dfb6bdee98caa Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 6 Oct 2018 17:29:23 +1000 Subject: Use wlr_xdg_popup_get_toplevel_coords --- sway/desktop/xdg_shell.c | 12 +++++------- sway/desktop/xdg_shell_v6.c | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) (limited to 'sway/desktop') diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c index 9036448b..2e2815c1 100644 --- a/sway/desktop/xdg_shell.c +++ b/sway/desktop/xdg_shell.c @@ -24,13 +24,11 @@ static void popup_get_root_coords(struct sway_view_child *child, int *root_sx, int *root_sy) { struct sway_xdg_popup *popup = (struct sway_xdg_popup *)child; struct wlr_xdg_surface *surface = popup->wlr_xdg_surface; - *root_sx = -surface->geometry.x; - *root_sy = -surface->geometry.y; - while (surface && surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { - *root_sx += surface->popup->geometry.x; - *root_sy += surface->popup->geometry.y; - surface = wlr_xdg_surface_from_wlr_surface(surface->popup->parent); - } + + wlr_xdg_popup_get_toplevel_coords(surface->popup, + -surface->geometry.x + surface->popup->geometry.x, + -surface->geometry.y + surface->popup->geometry.y, + root_sx, root_sy); } static void popup_destroy(struct sway_view_child *child) { diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c index 765a80b1..e61bd652 100644 --- a/sway/desktop/xdg_shell_v6.c +++ b/sway/desktop/xdg_shell_v6.c @@ -23,13 +23,11 @@ static void popup_get_root_coords(struct sway_view_child *child, int *root_sx, int *root_sy) { struct sway_xdg_popup_v6 *popup = (struct sway_xdg_popup_v6 *)child; struct wlr_xdg_surface_v6 *surface = popup->wlr_xdg_surface_v6; - *root_sx = -surface->geometry.x; - *root_sy = -surface->geometry.y; - while (surface && surface->role == WLR_XDG_SURFACE_V6_ROLE_POPUP) { - *root_sx += surface->popup->geometry.x; - *root_sy += surface->popup->geometry.y; - surface = surface->popup->parent; - } + + wlr_xdg_popup_v6_get_toplevel_coords(surface->popup, + -surface->geometry.x + surface->popup->geometry.x, + -surface->geometry.y + surface->popup->geometry.y, + root_sx, root_sy); } static void popup_destroy(struct sway_view_child *child) { -- cgit v1.2.3