GithubHelp home page GithubHelp logo

Comments (6)

Consolatis avatar Consolatis commented on September 26, 2024 1

This can be reproduced easily nested + waybar tooltips (I have an older waybar version here though, no clue if its also reproducible with a recent version, I assume yes).

Added some debug logging and the issue seems to be that we are calling wlr_xdg_popup_unconstrain_from_box() before the popup is ready. I'll debug a bit more.

00:00:06.200 [types/wlr_compositor.c:692] New wlr_surface 0xaaaaabd68760 (res 0xaaaaabd66460)
00:00:06.201 [types/xdg_shell/wlr_xdg_surface.c:388] new xdg_surface 0xaaaaabd68ba0 (res 0xaaaaabd68cc0)
00:00:06.201 [../src/layers.c:337] new layer popup
00:00:06.201 [../src/layers.c:272] creating layer popup
00:00:06.201 [../src/layers.c:289] wlr_xdg_popup_unconstrain_from_box - start
00:00:06.201 [types/xdg_shell/wlr_xdg_surface.c:169] A configure is scheduled for an uninitialized xdg_surface 0xaaaaabd68ba0
00:00:06.201 [../src/layers.c:291] wlr_xdg_popup_unconstrain_from_box - end

Edit:
wlr_xdg_popup_unconstrain_from_box() indeed schedules a configure. So this seems completely on us and waybar has likely nothing to do with it (other than highlighting this bug).

Edit 2:
This seems to solve it (basically delaying the unconstrain until after the initial commit):

unconstrain.diff
diff --git a/include/layers.h b/include/layers.h
index d64c434f..52583035 100644
--- a/include/layers.h
+++ b/include/layers.h
@@ -28,6 +28,7 @@ struct lab_layer_popup {
 	/* To simplify moving popup nodes from the bottom to the top layer */
 	struct wlr_box output_toplevel_sx_box;
 
+	struct wl_listener commit;
 	struct wl_listener destroy;
 	struct wl_listener new_popup;
 };
diff --git a/src/layers.c b/src/layers.c
index 79cffe94..20e9e683 100644
--- a/src/layers.c
+++ b/src/layers.c
@@ -260,14 +260,35 @@ popup_handle_destroy(struct wl_listener *listener, void *data)
 		wl_container_of(listener, popup, destroy);
 	wl_list_remove(&popup->destroy.link);
 	wl_list_remove(&popup->new_popup.link);
+
+	/* Usually already removed unless there was no commit at all */
+	if (popup->commit.notify) {
+		wl_list_remove(&popup->commit.link);
+	}
+
 	free(popup);
 }
 
+static void
+popup_handle_commit(struct wl_listener *listener, void *data)
+{
+	struct lab_layer_popup *popup =
+		wl_container_of(listener, popup, commit);
+
+	if (popup->wlr_popup->base->initial_commit) {
+		wlr_xdg_popup_unconstrain_from_box(popup->wlr_popup,
+			&popup->output_toplevel_sx_box);
+
+		/* Prevent getting called over and over again */
+		wl_list_remove(&popup->commit.link);
+		popup->commit.notify = NULL;
+	}
+}
+
 static void popup_handle_new_popup(struct wl_listener *listener, void *data);
 
 static struct lab_layer_popup *
-create_popup(struct wlr_xdg_popup *wlr_popup, struct wlr_scene_tree *parent,
-		struct wlr_box *output_toplevel_sx_box)
+create_popup(struct wlr_xdg_popup *wlr_popup, struct wlr_scene_tree *parent)
 {
 	struct lab_layer_popup *popup = znew(*popup);
 	popup->wlr_popup = wlr_popup;
@@ -282,10 +303,13 @@ create_popup(struct wlr_xdg_popup *wlr_popup, struct wlr_scene_tree *parent,
 
 	popup->destroy.notify = popup_handle_destroy;
 	wl_signal_add(&wlr_popup->base->events.destroy, &popup->destroy);
+
 	popup->new_popup.notify = popup_handle_new_popup;
 	wl_signal_add(&wlr_popup->base->events.new_popup, &popup->new_popup);
 
-	wlr_xdg_popup_unconstrain_from_box(wlr_popup, output_toplevel_sx_box);
+	popup->commit.notify = popup_handle_commit;
+	wl_signal_add(&wlr_popup->base->surface->events.commit, &popup->commit);
+
 	return popup;
 }
 
@@ -297,8 +321,7 @@ popup_handle_new_popup(struct wl_listener *listener, void *data)
 		wl_container_of(listener, lab_layer_popup, new_popup);
 	struct wlr_xdg_popup *wlr_popup = data;
 	struct lab_layer_popup *new_popup = create_popup(wlr_popup,
-		lab_layer_popup->scene_tree,
-		&lab_layer_popup->output_toplevel_sx_box);
+		lab_layer_popup->scene_tree);
 	new_popup->output_toplevel_sx_box =
 		lab_layer_popup->output_toplevel_sx_box;
 }
@@ -357,8 +380,7 @@ handle_new_popup(struct wl_listener *listener, void *data)
 		.width = output_box.width,
 		.height = output_box.height,
 	};
-	struct lab_layer_popup *popup = create_popup(wlr_popup,
-		surface->tree, &output_toplevel_sx_box);
+	struct lab_layer_popup *popup = create_popup(wlr_popup, surface->tree);
 	popup->output_toplevel_sx_box = output_toplevel_sx_box;
 
 	if (surface->layer_surface->current.layer

I am not really familiar with the popup positioning code but maybe this could give some ideas. Also not sure if the same should / must be done for src/xdg-popup.c.

from labwc.

Consolatis avatar Consolatis commented on September 26, 2024 1

I'm getting this error all the time while using chromium:

ss_2024_02_23_22_27_42

That indeed sounds like the same issue for xdg popups and could likely be solved the same way: by delaying popup_unconstrain() to the first commit rather than when creating the popup.

from labwc.

Consolatis avatar Consolatis commented on September 26, 2024 1

I added the fix for layershell clients like waybar and also for the usual popup case so Chromium should now also be fine.

Testing would be much appreciated so that we can include the fix in the next release.

from labwc.

Consolatis avatar Consolatis commented on September 26, 2024

I vaguely remember something about wlroots changing the xdg_surface event flow so that it now (with wlroots 0.17) triggers at an earlier state than it was with wlroots 0.16. Thus what *might* happen here is that we try to position the popup before it was properly initialized. If that is indeed the culprit we may need to listen to another signal before positioning the popup. I assume this change is listed in the breaking changes of wlroots 0.17 but I didn't verify.

from labwc.

johanmalm avatar johanmalm commented on September 26, 2024

I did have a quick look at this when OP first posted. Nefsen402 scene-graph branch of sway issued the same message with waybar (just fewer of them). Might be a wlroots thing we need to patch. Just haven't had a chance to look further yet.

from labwc.

charbelnicolas avatar charbelnicolas commented on September 26, 2024

I'm getting this error all the time while using chromium:

ss_2024_02_23_22_27_42

from labwc.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.