Skip to content

feat(display): add display configuration management#2330

Open
maxinglo wants to merge 10 commits intonoctalia-dev:mainfrom
maxinglo:main
Open

feat(display): add display configuration management#2330
maxinglo wants to merge 10 commits intonoctalia-dev:mainfrom
maxinglo:main

Conversation

@maxinglo
Copy link
Copy Markdown

@maxinglo maxinglo commented Mar 27, 2026

Pull Request

Motivation

This PR adds a unified display configuration workflow to Noctalia so users can manage monitor topology and per-output settings directly from the Display panel, with safer recovery behavior.

It introduces:

  • A dedicated monitor management UI (MonitorSubTab) for layout drag/snap and per-output controls.
  • A new display service layer (DisplayService) to normalize topology state, queue apply commands, and handle confirm/revert.
  • Compositor backend integration for Hyprland and niri, with wlroots/readonly fallback behavior.
  • EDID read/parse/copy flow for monitor diagnostics.
  • New i18n strings in en.json and zh-CN.json.

Type of Change

Mark the relevant option with an "x".

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring

Testing

Describe how you tested your changes and mark the relevant items.

Current status: feature implemented; full cross-environment validation is still in progress.

  • Tested on niri
  • Tested on Hyprland
  • Tested on sway (with wlr-randr)
  • Tested with different bar positions and density settings
  • Tested at different interface scaling values
  • Tested with multiple monitors (if applicable)

Screenshots / Videos

Please replace placeholders with actual captures before review:

  • Monitor tab overview (Display -> Monitor)
image - Revert confirmation dialog countdown image

Checklist

  • Code follows project style guidelines
  • Self-reviewed my code
  • No new warnings or errors
  • Documentation or comments updated (if relevant)

Additional Notes

  • Main added files:
    • Services/Hardware/DisplayService.qml
    • Modules/Panels/Settings/Tabs/Display/MonitorSubTab.qml
  • Main integrated files:
    • Services/Compositor/CompositorService.qml
    • Services/Compositor/HyprlandService.qml
    • Services/Compositor/NiriService.qml
    • Modules/Panels/Settings/Tabs/Display/DisplayTab.qml
    • Assets/Translations/en.json
    • Assets/Translations/zh-CN.json
  • Safety behavior:
    • Confirmation window with timed auto-revert for applied topology changes.
    • Prevent disabling the last active output.
  • Follow-up suggested:
    • Complete compositor matrix testing (niri / Hyprland / sway) and attach screenshots/video before moving out of Draft.

@turannul
Copy link
Copy Markdown
Contributor

image

Except this one and missing translation keys. this is great so far.

I have a suggestion: About merging Brightness + Monitor tabs

@maxinglo
Copy link
Copy Markdown
Author

image Brightness settings are merged into monitor tab now.

@turannul
Copy link
Copy Markdown
Contributor

That was fast

@maxinglo
Copy link
Copy Markdown
Author

https://github.com/maxinglo/noctalia-shell/tree/persistence

Added persistence by writing to the compositor's config files to fix some compositor settings reverting to defaults on reboot. To be honest, the current approach feels a bit clunky, and I’m looking for a more elegant way to handle this. If you have any better ideas, please let me know.

@turannul
Copy link
Copy Markdown
Contributor

turannul commented Mar 28, 2026

https://github.com/maxinglo/noctalia-shell/tree/persistence

Added persistence by writing to the compositor's config files to fix some compositor settings reverting to defaults on reboot. To be honest, the current approach feels a bit clunky, and I’m looking for a more elegant way to handle this. If you have any better ideas, please let me know.

Before that there are a few syntax issue(s): 4

111: Unclosed bracket

Unterminated regex:

789: /VendorName\s+"([^"]+)"/i
804: /EDID(?:\s+Version)?\s*:?\s*([0-9]+.[0-9]+)/i
819: text.match(/Made\s+in:\s+week\s+([0-9]+)\s+of\s+([0-9]{4})/i);

@maxinglo
Copy link
Copy Markdown
Author

'name=$(basename "$dev" | cut -d"-" -f2-);'

I think this one is fine.

@turannul
Copy link
Copy Markdown
Contributor

turannul commented Mar 28, 2026

'name=$(basename "$dev" | cut -d"-" -f2-);'

I think this one is fine.

probably, its not the wrong one but vscode still shows unmatched/unclosed here
image

in order to simplify using roughly pattern like this one?
var script = [] return _joinShell(script)

@maxinglo
Copy link
Copy Markdown
Author

'name=$(basename "$dev" | cut -d"-" -f2-);'

I think this one is fine.

probably, its not the wrong one but vscode still shows unmatched/unclosed here image

in order to simplify using roughly pattern like this one? var script = [] return _joinShell(script)

image image image

I think it's the problem of that qml vscode plugin. And it will still shows unmatched/unclosed after rewrite.

@turannul
Copy link
Copy Markdown
Contributor

'name=$(basename "$dev" | cut -d"-" -f2-);'

I think this one is fine.

probably, its not the wrong one but vscode still shows unmatched/unclosed here image
in order to simplify using roughly pattern like this one? var script = [] return _joinShell(script)

image image image

I think it's the problem of that qml vscode plugin. And it will still shows unmatched/unclosed after rewrite.

Indeed vscode issue atleast could be, weird part is im not using QML lsp.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants