Skip to content

Qt Applications: clicking a QPrintDialog's Options button causes the window to flicker in a loop of resizes #9130

@dawsers

Description

@dawsers

Please fill out the following:

  • Sway Version:

    • Latest git version of sway and wlroots as of 2026-04-27 10:00
  • Description:

  1. When hitting "Options" in the QPrintDialog widget, the client sends a resize request as expected, because it needs to grow the dialog to fit all the extra information.
  2. In sway/desktop/xdg_shell.c:handle_commit(), sway sees a new size and calls wlr_xdg_toplevel _set_size(). This informs the toplevel there have been changes in geometry, and it schedules a wlr_xdg_surface configure call.
  3. The Qt Print Dialog keeps on spamming the server with alternating size resize requests in handle_commit(), and the process continues in a loop until the window loses focus and recovers it again. That causes the visible flicker almost every time.

This is the relevant part of the messages I got using WAYLAND_DEBUG=1:


Click Options

[ 146198.286]  -> wl_surface#42.frame(new id wl_callback#50)
[ 146198.320] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146198.340] {Default Queue}  -> wl_surface#42.attach(wl_buffer#54, 0, 0)
[ 146198.367] {Default Queue}  -> wl_surface#42.damage_buffer(186, 86, 254, 50)
[ 146198.391] {Default Queue}  -> wl_surface#42.damage_buffer(22, 326, 192, 50)
[ 146198.415] {Default Queue}  -> wl_surface#42.damage_buffer(304, 326, 160, 50)
[ 146198.438] {Default Queue}  -> wl_surface#42.commit()
[ 146206.438] {Display Queue} wl_display#1.delete_id(50)
[ 146206.507] wl_callback#50.done(318466)
[ 146273.804] {Default Queue} wl_pointer#27.button(480, 318533, 272, 0)
[ 146273.836] {Default Queue} wl_pointer#27.frame()
[ 146273.965] wl_buffer#54.release()
[ 146274.530]  -> wl_surface#42.frame(new id wl_callback#50)
[ 146274.561] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146274.578] {Default Queue}  -> wl_surface#42.attach(wl_buffer#54, 0, 0)
[ 146274.596] {Default Queue}  -> wl_surface#42.damage_buffer(22, 326, 192, 50)
[ 146274.618] {Default Queue}  -> wl_surface#42.commit()

Sets min size to (409, 383)

[ 146274.953] {Default Queue}  -> xdg_toplevel#48.set_min_size(409, 382)
[ 146274.977] {Default Queue}  -> xdg_toplevel#48.set_max_size(0, 0)
[ 146274.999] {Default Queue}  -> wp_viewport#44.set_destination(409, 382)
[ 146275.016] {Default Queue}  -> xdg_surface#40.set_window_geometry(0, 0, 409, 382)
[ 146275.034] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#52)
[ 146275.050] {Default Queue}  -> wl_region#52.add(0, 0, 409, 382)
[ 146275.065] {Default Queue}  -> wl_surface#42.set_opaque_region(wl_region#52)
[ 146275.080] {Default Queue}  -> wl_region#52.destroy()
[ 146275.815] {Default Queue}  -> wl_shm_pool#45.destroy()
[ 146275.847]  -> wl_buffer#41.destroy()
[ 146275.931] {Default Queue}  -> wl_shm_pool#53.destroy()
[ 146275.951]  -> wl_buffer#54.destroy()
[ 146276.034] {Default Queue}  -> wl_shm_pool#56.destroy()
[ 146276.056]  -> wl_buffer#57.destroy()
[ 146276.119] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#55, fd 25, 2499808)
[ 146276.146] {Default Queue}  -> wl_shm_pool#55.create_buffer(new id wl_buffer#51, 0, 818, 764, 3272, 1)
[ 146276.880] discarded [unknown]#54.[event 0](0 fd, 8 byte)
[ 146276.905] {Display Queue} wl_display#1.delete_id(52)
[ 146276.914] {Display Queue} wl_display#1.delete_id(50)
[ 146276.945] wl_callback#50.done(318536)
[ 146285.814]  -> wl_surface#42.frame(new id wl_callback#50)
[ 146285.839] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146285.862] {Default Queue}  -> wl_surface#42.attach(wl_buffer#51, 0, 0)
[ 146285.886] {Default Queue}  -> wl_surface#42.damage_buffer(0, 0, 818, 764)
[ 146285.903] {Default Queue}  -> wl_surface#42.commit()
[ 146286.085] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#52, fd 26, 2499808)
[ 146286.118] {Default Queue}  -> wl_shm_pool#52.create_buffer(new id wl_buffer#58, 0, 818, 764, 3272, 1)
[ 146291.372] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146291.415] {Default Queue}  -> wl_surface#42.attach(wl_buffer#58, 0, 0)
[ 146291.441] {Default Queue}  -> wl_surface#42.damage_buffer(22, 326, 774, 354)
[ 146291.465] {Default Queue}  -> wl_surface#42.commit()

Now it tries to resize to (423, 405)

[ 146291.616] {Default Queue}  -> xdg_toplevel#48.set_min_size(423, 405)
[ 146291.644] {Default Queue}  -> xdg_toplevel#48.set_max_size(0, 0)
[ 146291.666] {Default Queue}  -> wp_viewport#44.set_destination(423, 405)
[ 146291.683] {Default Queue}  -> xdg_surface#40.set_window_geometry(0, 0, 423, 405)
[ 146291.700] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#59)
[ 146291.716] {Default Queue}  -> wl_region#59.add(0, 0, 423, 405)
[ 146291.732] {Default Queue}  -> wl_surface#42.set_opaque_region(wl_region#59)
[ 146291.747] {Default Queue}  -> wl_region#59.destroy()
[ 146291.806] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#60, fd 26, 2499808)
[ 146291.830] {Default Queue}  -> wl_shm_pool#60.create_buffer(new id wl_buffer#61, 0, 818, 764, 3272, 1)
[ 146292.245] {Default Queue}  -> wl_shm_pool#55.destroy()
[ 146292.277]  -> wl_buffer#51.destroy()
[ 146292.473] {Default Queue}  -> wl_shm_pool#52.destroy()
[ 146292.496]  -> wl_buffer#58.destroy()
[ 146292.515] {Default Queue}  -> wl_shm_pool#60.destroy()
[ 146292.530]  -> wl_buffer#61.destroy()
[ 146292.568] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#62, fd 26, 2741040)
[ 146292.594] {Default Queue}  -> wl_shm_pool#62.create_buffer(new id wl_buffer#63, 0, 846, 810, 3384, 1)
[ 146292.972] discarded [unknown]#51.[event 0](0 fd, 8 byte)
[ 146292.979] discarded [unknown]#58.[event 0](0 fd, 8 byte)
[ 146293.009] {Display Queue} wl_display#1.delete_id(45)
[ 146293.032] {Display Queue} wl_display#1.delete_id(41)
[ 146293.039] {Display Queue} wl_display#1.delete_id(53)
[ 146293.076] {Display Queue} wl_display#1.delete_id(54)
[ 146293.109] {Display Queue} wl_display#1.delete_id(56)
[ 146293.141] {Display Queue} wl_display#1.delete_id(57)
[ 146300.364] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146300.387] {Default Queue}  -> wl_surface#42.attach(wl_buffer#63, 0, 0)
[ 146300.413] {Default Queue}  -> wl_surface#42.damage_buffer(0, 0, 846, 810)
[ 146300.434] {Default Queue}  -> wl_surface#42.commit()

But the configure is again for (409, 382)
...and the loop goes on and on

[ 146300.499] {Default Queue} xdg_toplevel#48.configure(409, 382, array[4])
[ 146300.523] {Default Queue} xdg_surface#40.configure(481)
[ 146300.603] {Default Queue}  -> xdg_surface#40.ack_configure(481)
[ 146300.635] {Default Queue}  -> wp_viewport#44.set_destination(409, 382)
[ 146300.651] {Default Queue}  -> xdg_surface#40.set_window_geometry(0, 0, 409, 382)
[ 146300.669] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#57)
[ 146300.685] {Default Queue}  -> wl_region#57.add(0, 0, 409, 382)
[ 146300.700] {Default Queue}  -> wl_surface#42.set_opaque_region(wl_region#57)
[ 146300.715] {Default Queue}  -> wl_region#57.destroy()
[ 146300.778] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#56, fd 26, 2741040)
[ 146300.804] {Default Queue}  -> wl_shm_pool#56.create_buffer(new id wl_buffer#54, 0, 846, 810, 3384, 1)
[ 146301.250] {Default Queue}  -> wl_shm_pool#62.destroy()
[ 146301.278]  -> wl_buffer#63.destroy()
[ 146301.296] {Default Queue}  -> wl_shm_pool#56.destroy()
[ 146301.310]  -> wl_buffer#54.destroy()
[ 146301.350] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#53, fd 27, 2499808)
[ 146301.374] {Default Queue}  -> wl_shm_pool#53.create_buffer(new id wl_buffer#41, 0, 818, 764, 3272, 1)
[ 146301.692] discarded [unknown]#63.[event 0](0 fd, 8 byte)
[ 146301.723] {Display Queue} wl_display#1.delete_id(59)
[ 146301.734] {Display Queue} wl_display#1.delete_id(55)
[ 146301.768] {Display Queue} wl_display#1.delete_id(51)
[ 146301.805] {Display Queue} wl_display#1.delete_id(52)
[ 146301.838] {Display Queue} wl_display#1.delete_id(58)
[ 146301.869] {Display Queue} wl_display#1.delete_id(60)
[ 146301.900] {Display Queue} wl_display#1.delete_id(61)
[ 146306.324] {Display Queue} wl_display#1.delete_id(57)
[ 146306.442] {Display Queue} wl_display#1.delete_id(62)
[ 146306.475] {Display Queue} wl_display#1.delete_id(63)
[ 146306.506] {Display Queue} wl_display#1.delete_id(56)
[ 146306.553] {Display Queue} wl_display#1.delete_id(54)
[ 146306.587] {Display Queue} wl_display#1.delete_id(50)
[ 146306.620] wl_callback#50.done(318566)
[ 146308.031]  -> wl_surface#42.frame(new id wl_callback#50)
[ 146308.049] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146308.078] {Default Queue}  -> wl_surface#42.attach(wl_buffer#41, 0, 0)
[ 146308.099] {Default Queue}  -> wl_surface#42.damage_buffer(0, 0, 818, 764)
[ 146308.117] {Default Queue}  -> wl_surface#42.commit()
[ 146308.151] {Default Queue}  -> wl_surface#42.commit()
[ 146308.181] {Default Queue} xdg_toplevel#48.configure(423, 405, array[4])
[ 146308.201] {Default Queue} xdg_surface#40.configure(482)
[ 146308.279] {Default Queue}  -> xdg_surface#40.ack_configure(482)
[ 146308.318] {Default Queue}  -> wp_viewport#44.set_destination(423, 405)
[ 146308.335] {Default Queue}  -> xdg_surface#40.set_window_geometry(0, 0, 423, 405)
[ 146308.352] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#54)
[ 146308.368] {Default Queue}  -> wl_region#54.add(0, 0, 423, 405)
[ 146308.383] {Default Queue}  -> wl_surface#42.set_opaque_region(wl_region#54)
[ 146308.398] {Default Queue}  -> wl_region#54.destroy()
[ 146308.463] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#56, fd 26, 2499808)
[ 146308.489] {Default Queue}  -> wl_shm_pool#56.create_buffer(new id wl_buffer#63, 0, 818, 764, 3272, 1)
[ 146308.850] {Default Queue}  -> wl_shm_pool#53.destroy()
[ 146308.876]  -> wl_buffer#41.destroy()
[ 146308.896] {Default Queue}  -> wl_shm_pool#56.destroy()
[ 146308.912]  -> wl_buffer#63.destroy()
[ 146308.947] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#62, fd 27, 2741040)
[ 146308.972] {Default Queue}  -> wl_shm_pool#62.create_buffer(new id wl_buffer#57, 0, 846, 810, 3384, 1)
[ 146309.428] discarded [unknown]#41.[event 0](0 fd, 8 byte)
[ 146315.759] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146315.833] {Default Queue}  -> wl_surface#42.attach(wl_buffer#57, 0, 0)
[ 146315.855] {Default Queue}  -> wl_surface#42.damage_buffer(0, 0, 846, 810)
[ 146315.872] {Default Queue}  -> wl_surface#42.commit()
[ 146315.914] {Default Queue}  -> wl_surface#42.commit()
[ 146315.952] {Default Queue} xdg_toplevel#48.configure(409, 382, array[4])
[ 146315.974] {Default Queue} xdg_surface#40.configure(483)
[ 146316.052] {Default Queue}  -> xdg_surface#40.ack_configure(483)
[ 146316.079] {Default Queue}  -> wp_viewport#44.set_destination(409, 382)
[ 146316.096] {Default Queue}  -> xdg_surface#40.set_window_geometry(0, 0, 409, 382)
[ 146316.114] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#61)
[ 146316.130] {Default Queue}  -> wl_region#61.add(0, 0, 409, 382)
[ 146316.145] {Default Queue}  -> wl_surface#42.set_opaque_region(wl_region#61)
[ 146316.161] {Default Queue}  -> wl_region#61.destroy()
[ 146316.223] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#60, fd 26, 2741040)
[ 146316.250] {Default Queue}  -> wl_shm_pool#60.create_buffer(new id wl_buffer#58, 0, 846, 810, 3384, 1)
[ 146316.702] {Default Queue}  -> wl_shm_pool#62.destroy()
[ 146316.729]  -> wl_buffer#57.destroy()
[ 146316.746] {Default Queue}  -> wl_shm_pool#60.destroy()
[ 146316.759]  -> wl_buffer#58.destroy()
[ 146316.795] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#52, fd 27, 2499808)
[ 146316.817] {Default Queue}  -> wl_shm_pool#52.create_buffer(new id wl_buffer#51, 0, 818, 764, 3272, 1)
[ 146317.224] discarded [unknown]#57.[event 0](0 fd, 8 byte)
[ 146317.256] {Display Queue} wl_display#1.delete_id(54)
[ 146317.264] {Display Queue} wl_display#1.delete_id(53)
[ 146317.289] {Display Queue} wl_display#1.delete_id(41)
[ 146317.307] {Display Queue} wl_display#1.delete_id(56)
[ 146317.325] {Display Queue} wl_display#1.delete_id(63)
[ 146320.711] {Display Queue} wl_display#1.delete_id(61)
[ 146320.748] {Display Queue} wl_display#1.delete_id(62)
[ 146320.769] {Display Queue} wl_display#1.delete_id(57)
[ 146320.792] {Display Queue} wl_display#1.delete_id(60)
[ 146320.813] {Display Queue} wl_display#1.delete_id(58)
[ 146325.589] {Display Queue} wl_display#1.delete_id(50)
[ 146325.626] wl_callback#50.done(318585)
[ 146325.894]  -> wl_surface#42.frame(new id wl_callback#50)
[ 146325.910] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146325.931] {Default Queue}  -> wl_surface#42.attach(wl_buffer#51, 0, 0)
[ 146325.969] {Default Queue}  -> wl_surface#42.damage_buffer(0, 0, 818, 764)
[ 146326.002] {Default Queue}  -> wl_surface#42.commit()
[ 146326.051] {Default Queue}  -> wl_surface#42.commit()
[ 146326.098] {Default Queue} xdg_toplevel#48.configure(423, 405, array[4])
[ 146326.132] {Default Queue} xdg_surface#40.configure(484)
[ 146326.166] {Default Queue} wl_pointer#27.motion(318580, 46.12890625, 171.27343750)
[ 146326.205] {Default Queue} wl_pointer#27.frame()
[ 146326.304] {Default Queue}  -> xdg_surface#40.ack_configure(484)
[ 146326.349] {Default Queue}  -> wp_viewport#44.set_destination(423, 405)
[ 146326.385] {Default Queue}  -> xdg_surface#40.set_window_geometry(0, 0, 423, 405)
[ 146326.424] {Default Queue}  -> wl_compositor#5.create_region(new id wl_region#58)
[ 146326.456] {Default Queue}  -> wl_region#58.add(0, 0, 423, 405)
[ 146326.489] {Default Queue}  -> wl_surface#42.set_opaque_region(wl_region#58)
[ 146326.520] {Default Queue}  -> wl_region#58.destroy()
[ 146326.618] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#60, fd 26, 2499808)
[ 146326.670] {Default Queue}  -> wl_shm_pool#60.create_buffer(new id wl_buffer#57, 0, 818, 764, 3272, 1)
[ 146327.047] {Default Queue}  -> wl_shm_pool#52.destroy()
[ 146327.096]  -> wl_buffer#51.destroy()
[ 146327.133] {Default Queue}  -> wl_shm_pool#60.destroy()
[ 146327.165]  -> wl_buffer#57.destroy()
[ 146327.217] {Default Queue}  -> wl_shm#4.create_pool(new id wl_shm_pool#62, fd 27, 2741040)
[ 146327.267] {Default Queue}  -> wl_shm_pool#62.create_buffer(new id wl_buffer#61, 0, 846, 810, 3384, 1)
[ 146327.332] discarded [unknown]#51.[event 0](0 fd, 8 byte)
[ 146334.987] {Default Queue}  -> wl_surface#42.offset(0, 0)
[ 146335.063] {Default Queue}  -> wl_surface#42.attach(wl_buffer#61, 0, 0)
[ 146335.101] {Default Queue}  -> wl_surface#42.damage_buffer(0, 0, 846, 810)
[ 146335.136] {Default Queue}  -> wl_surface#42.commit()
[ 146335.191] {Default Queue}  -> wl_surface#42.commit()
[ 146335.272] {Default Queue} xdg_toplevel#48.configure(409, 382, array[4])
[ 146335.311] {Default Queue} xdg_surface#40.configure(485)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugNot working as intended

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions