Comments (6)
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.
I'm getting this error all the time while using chromium:
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.
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.
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.
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.
I'm getting this error all the time while using chromium:
from labwc.
Related Issues (20)
- Mouse action not working on client when context Set to None HOT 5
- Disabling root menu HOT 1
- Hotplug event and output restore functionality doesn't seem to restore output's scale on Kanshi event HOT 2
- `zwlr_foreign_toplevel_handle_v1::output_enter` is not sent when xwayland surface is re-mapped HOT 2
- lab_wlr_scene_output_commit should update after wltoots 0.18 update HOT 2
- magnifier: Scale geometry of magnifier with output scale HOT 1
- magnifier: Repaint check for cursor position should be checked against cursor + half magnifier width HOT 1
- New labwc release: 0.8.0
- Wezterm's window cannot be resized in upper-left direction with `<resize drawContents="no">` HOT 3
- Exclusive zone not respected if lxqt-panel is less than 100% and not centered HOT 5
- latest commits on master break gtk2 applications conky but gtk3 still work HOT 20
- Change "FocusOuput" to be more in-line with "MoveToOutput" HOT 1
- `[../src/ssd/ssd.c:239] view width is smaller than its minimal value` when resizing `foot` window to minimal size HOT 1
- desk*.xbm (omnipresent) buttons cannot be styled/colorized HOT 5
- RFC: nomenclature for "Omnipresent" button and its theming HOT 3
- document new ssd buttons HOT 5
- Perhaps in the CI `scdoc` should be added.
- [Feature request] Allow pressing ESC to leave magnifier HOT 2
- [Question] Keeping my monitors off after inactivity HOT 18
- [Request] Add support for ~/Desktop icons HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from labwc.