Re: pop up windows
Uli Schlachter <[email protected]> Fri, 14 Feb 2025 17:27:39 +0100
| Newsgroups | gmane.comp.freedesktop.xcb |
|---|---|
| Message-ID | <[email protected]> |
Am 14.02.25 um 11:14 schrieb Steven J Abner: > On Fri, Feb 14 2025 at 08:25:30 AM +0000, Uli Schlachter > <[email protected]> wrote: >> The demo opens a white window white window in i3 that... does nothing? > > Sorry, just click in content area of white window for pop up. click > anywhere outside of pop up to close pop up. Basically a left button > context menu with internal pop up content doing nothing. > When parent loses focus, first click won't create pop up, just focus. A > focused parent allows content pop up. Haven't tried title bar content > pop up. My guess its a denied service not by X but by a WM. Well... what this does is when I click on it is to print out: 8388608, SBIT_RELEASE_IGNORE set. 8388609, SBIT_FOCUS_CLICK set. 8388608, SBIT_FOCUS_CLICK reset. 8388608, SBIT_RELEASE_IGNORE reset. Looking at it with xtrace... Ah, well. Opening a white window ontop of a white window is a bit hard to notice. I made this a bit more noticable: > --- xpop.c.orig 2025-02-14 17:14:46.749846662 +0100 > +++ xpop.c 2025-02-14 17:15:09.565476109 +0100 > @@ -458,12 +458,13 @@ > xcb_window_t > ui_dropdown_create(PhxRectangle configure, xcb_window_t transient_for_window) { > > - uint32_t values[] = { true }; > + xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data; > + uint32_t values[] = { screen->black_pixel, true }; > xcb_window_t window = _window_create(configure); > if (window == 0) return 0; > > xcb_change_window_attributes(connection, window, > - XCB_CW_OVERRIDE_REDIRECT, values); > + XCB_CW_BACK_PIXEL | XCB_CW_OVERRIDE_REDIRECT, values); > > xcb_change_property(connection, XCB_PROP_MODE_REPLACE, window, > XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32, With that change, I can confirm that this actually behaves the way you say it behaves for me. I would expect that this kind of popup windows usually use a mouse grab, e.g. tracking the opening of the "File" menu on GVim actually.... uhm... actually uses the XInput extension for the grab: > 19.106 000:>:02d7: Event Generic(35) XInputExtension(131) ButtonPress(4) deviceid=0x02 time=0x005cbbda detail=0x00000001 root=0x00000480 event=0x00800003 child=0x00000000 root_x=29.000000 root_y=39.000000 event_x=29.000000 event_y=9.000000 sourceid=0x0007 flags=0x00000000 mods={base_mods=0x00000000 latched_mods=0x00000000 locked_mods=0x00000000 effective_mods=0x00000000}; group={base_group=0x00 latched_group=0x00 locked_group=0x00 effective_group=0x00}; buttons=0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000; valuators=0x00000004,0x00000000; axisvalues=0.00000000000; [...] > 19.108 000:<:02d9: 32: XInputExtension-Request(131,51): XIGrabDevice grab_window=0x00800003 time=0x00000000 cursor=0x00000000 device=2 grab_mode=Asynchronous(0x01) paired_device_mode=Asynchronous(0x01) owner_events=true(0x01) masks=0xf80001f0,0x00000001; [...] > 19.109 000:<:02db: 32: XInputExtension-Request(131,51): XIGrabDevice grab_window=0x00800003 time=0x00000000 cursor=0x00000000 device=3 grab_mode=Asynchronous(0x01) paired_device_mode=Asynchronous(0x01) owner_events=true(0x01) masks=0x000007fc,0x00000000; Since I guess you do not care about the differences between different input devices, you could just use a GrabPointer request for that. What does GrabPointer do? The short version is: You and no one else get all pointer events until UngrabPointer. The long version is in [1] and something like [2]. [2] is not actually saying directly what I want to link to. This is more about "a grab decides which window a button press is sent to" and the text in [2] talks about "no active pointer grab", thus allowing you to bypass this. Does that help? Cheers, Uli [1]: https://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html#requests:GrabPointer [2]: https://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.html#Events P.S.: And in case you wonder what xtrace is: No, not that thing from glibc with the same name. I mean e.g.: https://tracker.debian.org/pkg/xtrace -- "For saving the Earth.. and eating cheesecake!"