sway: patch for popup menu flickers with Firefox
This commit is contained in:
parent
e904ed8170
commit
f07964a1b2
2 changed files with 135 additions and 1 deletions
133
srcpkgs/sway/patches/6046.patch
Normal file
133
srcpkgs/sway/patches/6046.patch
Normal file
|
@ -0,0 +1,133 @@
|
|||
Upstream: yes
|
||||
Source: https://github.com/swaywm/sway/pull/6046
|
||||
Reason: Popup menu flickers on Firefox
|
||||
(https://bugzilla.mozilla.org/show_bug.cgi?id=1696662)
|
||||
|
||||
From cf03185561e919f1c337f087194fec150425eef5 Mon Sep 17 00:00:00 2001
|
||||
From: Kenny Levinsen <kl@kl.wtf>
|
||||
Date: Fri, 19 Feb 2021 18:39:54 +0100
|
||||
Subject: [PATCH 1/3] view: Recursively check mapped of view_child tree
|
||||
|
||||
A subsurface may be set to mapped without its parent.
|
||||
---
|
||||
sway/tree/view.c | 14 ++++++++++++--
|
||||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/sway/tree/view.c b/sway/tree/view.c
|
||||
index ad79b2294..c8a4ea6b6 100644
|
||||
--- a/sway/tree/view.c
|
||||
+++ b/sway/tree/view.c
|
||||
@@ -982,8 +982,18 @@ static void view_child_subsurface_create(struct sway_view_child *child,
|
||||
view_child_damage(&subsurface->child, true);
|
||||
}
|
||||
|
||||
+static bool view_child_is_mapped(struct sway_view_child *child) {
|
||||
+ while (child) {
|
||||
+ if (!child->mapped) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ child = child->parent;
|
||||
+ }
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
static void view_child_damage(struct sway_view_child *child, bool whole) {
|
||||
- if (!child || !child->mapped || !child->view || !child->view->container) {
|
||||
+ if (!child || !view_child_is_mapped(child) || !child->view || !child->view->container) {
|
||||
return;
|
||||
}
|
||||
int sx, sy;
|
||||
@@ -1082,7 +1092,7 @@ void view_child_init(struct sway_view_child *child,
|
||||
}
|
||||
|
||||
void view_child_destroy(struct sway_view_child *child) {
|
||||
- if (child->mapped && child->view->container != NULL) {
|
||||
+ if (view_child_is_mapped(child) && child->view->container != NULL) {
|
||||
view_child_damage(child, true);
|
||||
}
|
||||
|
||||
|
||||
From e2ec65d0a32797edd0846758bc24cf685e2d19d5 Mon Sep 17 00:00:00 2001
|
||||
From: Kenny Levinsen <kl@kl.wtf>
|
||||
Date: Fri, 19 Feb 2021 18:41:04 +0100
|
||||
Subject: [PATCH 2/3] view: Mark subchildren as unmapped in view_child_destroy
|
||||
|
||||
The subchildren lose their parent association at this point, so they
|
||||
will not be able to see that the parent is unmapped.
|
||||
|
||||
Instead, just set the subchildren to be unmapped directly.
|
||||
---
|
||||
sway/tree/view.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/sway/tree/view.c b/sway/tree/view.c
|
||||
index c8a4ea6b6..978271c24 100644
|
||||
--- a/sway/tree/view.c
|
||||
+++ b/sway/tree/view.c
|
||||
@@ -1105,6 +1105,9 @@ void view_child_destroy(struct sway_view_child *child) {
|
||||
wl_list_for_each_safe(subchild, tmpchild, &child->children, link) {
|
||||
wl_list_remove(&subchild->link);
|
||||
subchild->parent = NULL;
|
||||
+ // The subchild lost its parent link, so it cannot see that the parent
|
||||
+ // is unmapped. Unmap it directly.
|
||||
+ subchild->mapped = false;
|
||||
}
|
||||
|
||||
wl_list_remove(&child->surface_commit.link);
|
||||
|
||||
From c06a926e0d89e952e5a3892b63f07d5b802b34ef Mon Sep 17 00:00:00 2001
|
||||
From: Kenny Levinsen <kl@kl.wtf>
|
||||
Date: Fri, 19 Feb 2021 18:33:20 +0100
|
||||
Subject: [PATCH 3/3] view: Set parent for view_child subsurfaces on init
|
||||
|
||||
view_child_init was calling view_init_subsurfaces, which did not set the
|
||||
parent attribute for the subchildren. This lead to the subchildren
|
||||
acting as standalone children. If the parent was an xdg_popup, this
|
||||
would make the subchild unaware of the popup position.
|
||||
|
||||
Introduce view_child_init_subsurfaces for view_child_init to use
|
||||
instead.
|
||||
|
||||
Closes: https://github.com/swaywm/sway/issues/6038
|
||||
---
|
||||
sway/tree/view.c | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/sway/tree/view.c b/sway/tree/view.c
|
||||
index 978271c24..8a2a8178d 100644
|
||||
--- a/sway/tree/view.c
|
||||
+++ b/sway/tree/view.c
|
||||
@@ -465,6 +465,9 @@ static void view_subsurface_create(struct sway_view *view,
|
||||
static void view_init_subsurfaces(struct sway_view *view,
|
||||
struct wlr_surface *surface);
|
||||
|
||||
+static void view_child_init_subsurfaces(struct sway_view_child *view_child,
|
||||
+ struct wlr_surface *surface);
|
||||
+
|
||||
static void view_handle_surface_new_subsurface(struct wl_listener *listener,
|
||||
void *data) {
|
||||
struct sway_view *view =
|
||||
@@ -1033,6 +1036,14 @@ static void view_init_subsurfaces(struct sway_view *view,
|
||||
}
|
||||
}
|
||||
|
||||
+static void view_child_init_subsurfaces(struct sway_view_child *view_child,
|
||||
+ struct wlr_surface *surface) {
|
||||
+ struct wlr_subsurface *subsurface;
|
||||
+ wl_list_for_each(subsurface, &surface->subsurfaces, parent_link) {
|
||||
+ view_child_subsurface_create(view_child, subsurface);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void view_child_handle_surface_map(struct wl_listener *listener,
|
||||
void *data) {
|
||||
struct sway_view_child *child =
|
||||
@@ -1088,7 +1099,7 @@ void view_child_init(struct sway_view_child *child,
|
||||
wlr_surface_send_enter(child->surface, workspace->output->wlr_output);
|
||||
}
|
||||
|
||||
- view_init_subsurfaces(child->view, surface);
|
||||
+ view_child_init_subsurfaces(child, surface);
|
||||
}
|
||||
|
||||
void view_child_destroy(struct sway_view_child *child) {
|
|
@ -1,7 +1,7 @@
|
|||
# Template file for 'sway'
|
||||
pkgname=sway
|
||||
version=1.5.1
|
||||
revision=1
|
||||
revision=2
|
||||
build_style=meson
|
||||
conf_files="/etc/sway/config"
|
||||
hostmakedepends="pkg-config wayland-devel scdoc git"
|
||||
|
@ -14,6 +14,7 @@ license="MIT"
|
|||
homepage="https://swaywm.org"
|
||||
distfiles="https://github.com/swaywm/${pkgname}/archive/${version}.tar.gz"
|
||||
checksum=095f983c9a5f80d761bc2fb19df8166839b9290124ccd47f3e74119a1335490f
|
||||
patch_args="-Np1"
|
||||
|
||||
post_patch() {
|
||||
vsed -e 's/werror=true/werror=false/g' -i meson.build
|
||||
|
|
Loading…
Reference in a new issue