Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-1818GitHub issuePublicDecided· Out of scope

GDK_SCALE=2 + force_zero_scaling overflows XWayland/Java windows on auto-scaled 1080p

Reported by v-t-r-gg · filed Aug 15, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 days ago.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
AreaOutside the audited area· Decided by agents · verified
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

GDK_SCALE=2 + force_zero_scaling overflows XWayland/Java windows on auto-scaled 1080prevision 1 · captured 2026-09-28 21:29 UTC via poll

System details

Omarchy 4.0.0-1 (Quattro), Hyprland 0.56.2, Xwayland 24.1.13
Samsung Galaxy Book NP950QED, Intel i7-1260P, Iris Xe
eDP-1 1920x1080 @ 142 DPI (340×190 mm). Packaged scale = "auto" landed on 1.5, then later recomputed as 2 after Hyprland reloads.

What's wrong?

Packaged Quattro defaults put three scale layers in disagreement. This is a default-config bug, not an app-specific one. Native Wayland GTK/Qt is mostly fine.

Defaults involved

-- config/hypr/monitors.lua
local omarchy_gdk_scale = 2
local omarchy_monitor_scale = "auto"
hl.env("GDK_SCALE", tostring(omarchy_gdk_scale))
hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale })
-- default/hypr/envs.lua
xwayland = { force_zero_scaling = true }

On this 1080p HiDPI laptop:

LayerSize the client is told
Hyprland layoutLogical 1280×720 when auto is 1.5 (1920 / 1.5)
XWayland (force_zero_scaling)Physical 1920×1080, 1:1 pixels
Session envGDK_SCALE=2 for every child

X11 and Java AWT do not use the Wayland scale path. They see a 1920-wide X screen and honor GDK_SCALE=2 (and sometimes sun.java2d.uiScale).

Measured effect

  • A client whose 1× minimum width is 765 advertised WM_NORMAL_HINTS min width 1530 (765 × 2).
  • Extra in-window chrome (sidebar, inspector, plugin panel) adds more width.
  • The requested size exceeds 1920.
  • A tiling compositor will not shift the toplevel left the way Plasma does, so the extra pixels hang off the right edge of the panel.

Same class of clients: Swing/AWT IDEs and tools, GTK forced onto X11, Flatpaks that inherit the session env, some Wine helpers.

Auto scale is also unstable here. With scale = "auto" this panel flipped between 1.5 and 2 across Hyprland reloads (no omarchy hyprland monitor scaling in the audit log). omarchy-hyprland-monitor-scaling steps 1 → 1.25 → 1.6 → 2, so 1.5 is not a sticky preset. Pinning omarchy hyprland monitor scaling 1.5 made the desktop the right size again, but that command still persists GDK_SCALE as int(scale + 0.5) → 2, so the XWayland/Java overflow remains.

Steps to reproduce

  1. Quattro defaults: scale = "auto", force_zero_scaling = true, GDK_SCALE=2.
  2. 1080p laptop where auto is 1.5 (or pin 1.5).
  3. Launch any Java AWT or X11-only app.
  4. xprop → WM_NORMAL_HINTS minimum sizes are 2× the toolkit's 1× values.
  5. Open extra chrome that adds width.
  6. Compare with Plasma, or with GDK_SCALE=1 in that process only.

Expected

XWayland / Java clients size against the physical 1920×1080 X screen. Extra chrome lays out inside the panel.

Workaround

Override only the XWayland/Java process. Do not change global GDK_SCALE (Wayland GTK still wants it):

GDK_SCALE=1 GDK_DPI_SCALE=1 JAVA_TOOL_OPTIONS=-Dsun.java2d.uiScale=1 <command>

For Flatpaks: flatpak override --user with the same env vars.

Suggested default

Stop hardcoding GDK_SCALE=2 while monitor scale is "auto".

  1. Derive GDK_SCALE from the applied monitor scale, or
  2. Export GDK_SCALE only for Wayland GTK, and leave XWayland / Java at 1 when force_zero_scaling is on.

Related: #2824 (Java over-scaled), #758 (1080p GDK_SCALE=2 guide), #6911 (Quattro reset monitors.lua to GDK_SCALE=2).

The companion AWT-popup tiling issue (class-only rules stretch win0 tooltips over the whole client) is a separate default gap, with a patch in #7020.

View raw text
### System details

Omarchy 4.0.0-1 (Quattro), Hyprland 0.56.2, Xwayland 24.1.13  
Samsung Galaxy Book NP950QED, Intel i7-1260P, Iris Xe  
eDP-1 `1920x1080` @ 142 DPI (340×190 mm). Packaged `scale = "auto"` landed on **1.5**, then later recomputed as **2** after Hyprland reloads.

### What's wrong?

Packaged Quattro defaults put three scale layers in disagreement. This is a default-config bug, not an app-specific one. Native Wayland GTK/Qt is mostly fine.

**Defaults involved**

```lua
-- config/hypr/monitors.lua
local omarchy_gdk_scale = 2
local omarchy_monitor_scale = "auto"
hl.env("GDK_SCALE", tostring(omarchy_gdk_scale))
hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale })
```

```lua
-- default/hypr/envs.lua
xwayland = { force_zero_scaling = true }
```

On this 1080p HiDPI laptop:

| Layer | Size the client is told |
|---|---|
| Hyprland layout | Logical `1280×720` when auto is 1.5 (`1920 / 1.5`) |
| XWayland (`force_zero_scaling`) | Physical `1920×1080`, 1:1 pixels |
| Session env | `GDK_SCALE=2` for every child |

X11 and Java AWT do not use the Wayland scale path. They see a 1920-wide X screen **and** honor `GDK_SCALE=2` (and sometimes `sun.java2d.uiScale`).

**Measured effect**

- A client whose 1× minimum width is 765 advertised `WM_NORMAL_HINTS` min width **1530** (`765 × 2`).
- Extra in-window chrome (sidebar, inspector, plugin panel) adds more width.
- The requested size exceeds 1920.
- A tiling compositor will not shift the toplevel left the way Plasma does, so the extra pixels hang off the right edge of the panel.

Same class of clients: Swing/AWT IDEs and tools, GTK forced onto X11, Flatpaks that inherit the session env, some Wine helpers.

**Auto scale is also unstable here.** With `scale = "auto"` this panel flipped between 1.5 and 2 across Hyprland reloads (no `omarchy hyprland monitor scaling` in the audit log). `omarchy-hyprland-monitor-scaling` steps `1 → 1.25 → 1.6 → 2`, so 1.5 is not a sticky preset. Pinning `omarchy hyprland monitor scaling 1.5` made the desktop the right size again, but that command still persists `GDK_SCALE` as `int(scale + 0.5)` → **2**, so the XWayland/Java overflow remains.

### Steps to reproduce

1. Quattro defaults: `scale = "auto"`, `force_zero_scaling = true`, `GDK_SCALE=2`.
2. 1080p laptop where auto is 1.5 (or pin 1.5).
3. Launch any Java AWT or X11-only app.
4. `xprop` → `WM_NORMAL_HINTS` minimum sizes are 2× the toolkit's 1× values.
5. Open extra chrome that adds width.
6. Compare with Plasma, or with `GDK_SCALE=1` in that process only.

### Expected

XWayland / Java clients size against the physical 1920×1080 X screen. Extra chrome lays out inside the panel.

### Workaround

Override **only** the XWayland/Java process. Do not change global `GDK_SCALE` (Wayland GTK still wants it):

```bash
GDK_SCALE=1 GDK_DPI_SCALE=1 JAVA_TOOL_OPTIONS=-Dsun.java2d.uiScale=1 <command>
```

For Flatpaks: `flatpak override --user` with the same env vars.

### Suggested default

Stop hardcoding `GDK_SCALE=2` while monitor scale is `"auto"`.

1. Derive `GDK_SCALE` from the applied monitor scale, **or**
2. Export `GDK_SCALE` only for Wayland GTK, and leave XWayland / Java at 1 when `force_zero_scaling` is on.

Related: #2824 (Java over-scaled), #758 (1080p `GDK_SCALE=2` guide), #6911 (Quattro reset `monitors.lua` to `GDK_SCALE=2`).

The companion AWT-popup tiling issue (class-only rules stretch `win0` tooltips over the whole client) is a separate default gap, with a patch in #7020.

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

  • Related PRpr/8841· confirmed

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

  • Out of scopeDecided by agents · verified · 2026-10-09 04:13 UTC