Skip to content

xdg_popup.grab() and parent vs. commit ordering #1761

@YaLTeR

Description

@YaLTeR

Smithay calls the compositor's grab() handler right away, wherein the compositor is supposed to check xdg-popup's parent for validity:

The parent of a grabbing popup must either be an xdg_toplevel surface or another xdg_popup with an explicit grab.

However, Qt layer-shell seems to grab the popup right before assigning it a parent, breaking this logic:

[ 392910.890] {Default Queue}  -> xdg_wm_base#3.get_xdg_surface(new id xdg_surface#52, wl_surface#45)
[ 392910.986] {Default Queue}  -> xdg_surface#52.get_popup(new id xdg_popup#54, nil, xdg_positioner#53)
[ 392911.014] {Default Queue}  -> xdg_popup#54.grab(wl_seat#15, 168583)
[ 392911.030] {Default Queue}  -> zwlr_layer_surface_v1#43.get_popup(xdg_popup#54)
[ 392911.089] {Default Queue}  -> wl_surface#45.commit()

[ 392911.209] {Default Queue}  -> xdg_popup#54.reposition(xdg_positioner#55, 1)
[ 392911.934] {Default Queue} xdg_popup#54.configure(2121, 25, 173, 129)
[ 392911.947] {Default Queue} xdg_surface#52.configure(168585)
[ 392911.959] {Default Queue}  -> xdg_surface#52.ack_configure(168585)
[ 392911.999] {Default Queue} xdg_popup#54.repositioned(1)
[ 392912.012] {Default Queue} xdg_popup#54.configure(2121, 25, 173, 129)
[ 392912.023] {Default Queue} xdg_surface#52.configure(168586)
[ 392912.082] {Default Queue}  -> xdg_surface#52.ack_configure(168586)
[ 392912.119] {Default Queue}  -> xdg_surface#52.set_window_geometry(0, 0, 173, 129)
[ 392912.150] {Default Queue}  -> xdg_surface#52.set_window_geometry(0, 0, 173, 129)
[ 392913.165] {Default Queue}  -> wl_surface#45.commit()

Therefore, perhaps Smithay should delay calling the grab() handler until the commit?

Apparently, this ordering works fine in kwin. If not, then this would be a Qt bug instead. I'm not sure the protocol is clear on this.

cc @cmeissl @ids1024

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions