Skip to content

Dock renders off-screen on multi-monitor with xrandr scaling transforms #144

@faux123

Description

@faux123

Description

After upgrading from plank-reloaded 0.11.161 to 0.11.164, the dock is positioned completely off-screen and invisible. The dock process runs, but the dock window's Y coordinate is placed far below the actual screen boundary.

Environment

  • OS: CachyOS Linux (Arch-based), Cinnamon desktop
  • Kernel: 6.19.0-2-cachyos
  • plank-reloaded: 0.11.164-1
  • GLib: 2.86.3
  • GTK+: 3.24.51
  • libwnck: 43.3
  • GPU: NVIDIA RTX 4090

Monitor Setup (xrandr scaling transforms)

Three monitors using xrandr --scale transforms for fractional scaling:

Monitor Physical Resolution Scale Logical Size Position
DP-4 (primary) 3840x2160 @ 144Hz 1.6x 6144x3456 0,0
DP-2 (rotated right) 1920x1080 @ 144Hz 2x 2160x3840 6144,0
DP-0 2560x1440 @ 144Hz 2x 5120x2880 8304,505

Total X screen size: 13424 x 3840

Symptoms

The dock window is positioned at y=5724 with height 502, placing it entirely below the screen boundary (total screen height is 3840). The journal shows repeated positioning failures:

[CRITICAL] [DockWindow:290] Retry #3 update_size_and_position() to force requested values!
[CRITICAL] [DockWindow:290] Retry #4 update_size_and_position() to force requested values!
...
[CRITICAL] [DockWindow:290] Retry #11 update_size_and_position() to force requested values!

The _NET_WM_STRUT and _NET_WM_STRUT_PARTIAL are both all zeros.

Root Cause

The struts fix in 0.11.162 (commit e4733a25 — "Fix struts using primary monitor dimensions instead of full screen size") changed positioning to use screen.get_height()/screen.get_width() instead of monitor.get_geometry(). The compute_struts() method multiplies values by the window scale factor (window.get_window().get_scale_factor()).

With xrandr scaling transforms, the X screen dimensions (13424x3840) are already in the scaled coordinate space, but get_scale_factor() returns 2 (GTK detects HiDPI). This double-counts the scaling, producing an off-screen Y position.

Workaround

Setting GDK_SCALE=2 as an environment variable before launching plank makes the dock render at the correct position:

# Without workaround: dock at y=5724 (off-screen)
# With GDK_SCALE=1:   dock at y=3589, height=251 (visible but half-size, not HiDPI)
# With GDK_SCALE=2:   dock at y=3338, height=502 (correct position and HiDPI size)

Previous Version

plank-reloaded 0.11.161 worked correctly with this same monitor configuration.

Related

Possibly related to #140 (maximized windows overlap dock on multi-monitor), which is caused by the same struts calculation change.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions