MorgenWM liest seine Konfiguration aus $XDG_CONFIG_HOME/morgenwm/config.toml (üblicherweise ~/.config/morgenwm/config.toml). Referenzkonfigurationen befinden sich im Ordner example/:
Kopiere eine davon nach ~/.config/morgenwm/config.toml.
Alle Felder sind optional - fehlende Werte werden auf eingebaute Standardwerte zurückgesetzt.
Allgemeines Verhalten des Fenster-Managers.
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
| window_gap | int | 12 | Abstand zwischen Fenstern in Pixel |
| border_width | int | 2 | Fensterrahmenbreite in Pixel |
| workspace_count | int | 9 | Anzahl der Workspaces (max. 9) |
| overview_visible_count | int | 3 | Anzahl der Fenster in der Übersichtsansicht |
| keyboard_layout | string | "us" | XKB-Tastaturlayout (z.B. "de", "us", "fr") |
| autostart_delay | int | 0 | Wartezeit in Sekunden vor dem Ausführen der Autostart-Befehle |
| mod_key | string | "Mod4" | Haupt-Modifier: Mod1 = Alt, Mod4 = Super/Win |
| windows_visible | int | 2 | Standard-Sichtzahl für neue Frames; visible_inc/visible_dec ändern sie pro Frame |
| windows_visible_max | int | 4 | Maximalwert, bis zu dem visible_inc zyklisch erho0308hen kann (Zyklus 1..windows_visible_max) |
| wide_first_window | bool | true | Erstes Fenster im Frame nimmt volle Breite ein |
| frame_border_enabled | bool | true | Farbigen Rahmen um den fokussierten Frame anzeigen |
| xdg_autostart | bool | false | XDG-Autostart-Anwendungen automatisch starten |
| auto_remove_empty_frames | bool | true | Leere Frames entfernen, wenn das letzte Fenster geschlossen wird |
| scroll_scope | string | "output" | Geltungsbereich für scroll_left/scroll_right und die Fensterübersicht: "output" = nur der fokussierte Monitor, "workspace" = alle Fenster des aktiven Workspaces über alle Monitore hinweg |
| focus_follow_pointer | bool | false | Fokussiert das Fenster unter dem Mauszeiger beim Darüberfahren (Fokus folgt Maus) |
| per_output_workspaces | bool | false | Jeder Monitor bekommt seinen eigenen aktiven Workspace. Wenn true, schaltet Mod+1-9 und die IPC-Workspace-Aktionen nur den fokussierten Monitor um; wenn false (Standard), schalten alle Monitore gemeinsam um |
| animation_frames | int | 9 | Anzahl der Animationsframes für Übergänge |
| autostart_commands | String-Array | [] | Shell-Befehle, die beim Start ausgeführt werden (siehe unten) |
Eine Liste von Shell-Befehlen, die beim Start ausgeführt werden, definiert innerhalb von [general]:
[general] autostart_commands = [ "pipewire", "wbg -s /pfad/zum/hintergrundbild.jpg", "/home/benutzer/.local/bin/vibepanel", ]
Befehle werden der Reihe nach über /bin/sh -c gestartet. Sie laufen im Hintergrund (Fire-and-Forget) - MorgenWM wartet nicht auf ihre Beendigung.
Wenn xdg_autostart = true gesetzt ist, werden auch XDG-Autostart-Einträge aus /etc/xdg/autostart/ und ~/.config/autostart/ gestartet, sofern sie nicht bereits in autostart_commands aufgeführt sind.
Fenster- und Frame-Farben in RGBA (0-255).
| Schlüssel | Standard | Beschreibung |
|---|---|---|
| focused | { r = 96, g = 144, b = 255, a = 255 } | Rahmenfarbe für das fokussierte Fenster |
| unfocused | { r = 160, g = 160, b = 160, a = 255 } | Rahmenfarbe für nicht fokussierte Fenster |
| focused_frame_border | { r = 203, g = 212, b = 44, a = 128 } | Rahmenfarbe für den fokussierten Frame |
Beispiel:
[colors]
focused = { r = 96, g = 144, b = 255, a = 255 }
unfocused = { r = 160, g = 160, b = 160, a = 255 }
focused_frame_border = { r = 70, g = 254, b = 196, a = 80 }
Pointer-Belegungen ordnen Maustasten Aktionen zu. Jede Belegung hat eine Taste, Modifier und eine Aktion.
[[pointer_bindings]] button = "left" modifiers = ["Mod"] action = "move" [[pointer_bindings]] button = "right" modifiers = ["Mod"] action = "resize"
button kann left, right, middle, side oder extra sein. "Mod" wird zu dem Wert aufgelöst, der in [general] als mod_key gesetzt ist; andere gültige Modifier-Namen sind dieselben wie bei den Tastenbelegungen. Jede der unter `[[keybindings]]` aufgeführten Aktionen kann verwendet werden.
Die Standardbelegungen erhalten das klassische River-Verhalten: Mod + linke Maustaste ziehen verschiebt das Fenster, Mod + rechte Maustaste ziehen ändert die Größe.
Snap-to-Grid beim Ziehen. Ein verkacheltes Fenster wird beim Ziehen mit Mod + linke Taste für die Dauer des Ziehvorgangs aus dem Layout gehoben, sodass es dem Zeiger frei folgt, und beim Loslassen an der Stelle im Raster wieder eingerastet, über der sich der Zeiger befindet. Wird es über einem Panel oder außerhalb des nutzbaren Bereichs losgelassen, fällt es in den fokussierten Frame zurück. Ein bereits floatinges Fenster wird beim Ziehen nur verschoben und bleibt floating. Größenänderung eines verkachelten Fensters mit Mod + rechter Taste macht es floating (kein Zurückrasten).
Tastenbelegungen werden als Array von Tabellen definiert. Jede Belegung hat einen Schlüssel, Modifier und eine Aktion.
[[keybindings]] key = "Return" modifiers = ["Mod"] action = "spawn:foot"
"Mod" wird zu dem Wert aufgelöst, der in [general] als mod_key gesetzt ist. Andere gültige Modifier-Namen: Shift, Ctrl, Mod1 (Alt), Mod4 (Super).
| Aktion | Beschreibung |
|---|---|
| spawn:<Befehl> | Programm starten (z.B. spawn:firefox, spawn:foot) |
| close / kill | Fokussiertes Fenster schließen |
| exit / quit | MorgenWM beenden |
| toggle_fullscreen / fullscreen | Vollbild für das fokussierte Fenster umschalten |
| toggle_wide / wide | Breitmodus umschalten (fokussiertes Fenster nimmt volle Breite ein; wird gelöscht, wenn ein Geschwisterfenster im selben Frame fokussiert wird) |
| visible_inc / windows_visible_inc | Sichtbare Fenster pro Frame erho0308hen (zyklisch 1..windows_visible_max) |
| visible_dec / windows_visible_dec | Sichtbare Fenster pro Frame verringern (zyklisch 1..windows_visible_max) |
| toggle_floating | Floating für das fokussierte Fenster umschalten |
| float | Ein schwebendes Fenster wieder ins Tiling-Layout einrasten |
| toggle_sticky | Sticky umschalten (auf allen Workspaces sichtbar) |
| scroll_left / scroll_prev | Frame nach links scrollen |
| scroll_right / scroll_next | Frame nach rechts scrollen |
| focus_left / focus_prev | Fenster links fokussieren |
| focus_right / focus_next_win | Fenster rechts fokussieren |
| split_horizontal | Aktuellen Frame horizontal teilen |
| split_vertical | Aktuellen Frame vertikal teilen |
| remove_frame | Aktuellen Frame entfernen |
| cycle_window_forward | Zum nächsten Fenster im Frame wechseln |
| cycle_window_backward | Zum vorherigen Fenster im Frame wechseln |
| focus_frame_left | Frame links fokussieren |
| focus_frame_right | Frame rechts fokussieren |
| focus_frame_up | Frame darüber fokussieren |
| focus_frame_down | Frame darunter fokussieren |
| move_window_left | Fokussiertes Fenster in den linken Frame verschieben |
| move_window_right | Fokussiertes Fenster in den rechten Frame verschieben |
| move_window_up | Fokussiertes Fenster in den Frame darüber verschieben |
| move_window_down | Fokussiertes Fenster in den Frame darunter verschieben |
| resize_window_left | Frame vom linken Rand verkleinern |
| resize_window_right | Frame vom rechten Rand verkleinern |
| resize_window_up | Frame vom oberen Rand verkleinern |
| resize_window_down | Frame vom unteren Rand verkleinern |
| toggle_overview | Fensterübersicht umschalten |
| recent_window_next | Zum nächst-häufigsten Fenster wechseln |
| recent_window_prev | Zum vorher-häufigsten Fenster wechseln |
| workspace_N | Zu Workspace N wechseln (1-9) |
| move_to_workspace_N | Fokussiertes Fenster zu Workspace N verschieben (1-9) |
| move_to_output_N | Fokussiertes Fenster zu Output N verschieben (1-9), aktiver Workspace bleibt |
| move_to_output_left / move_to_output_right | Fokussiertes Fenster auf den angrenzenden Output verschieben (Mod+Shift+Left/Right) |
Konfiguriere Auflösung, Bildwiederholrate und Position pro Ausgang über wlr-randr. Erfordert wlr-randr. Verwende morgenwm_msg outputs, um Ausgangsnamen herauszufinden.
[[outputs]] name = "DP-1" width = 2560 height = 1440 refresh = 240.001 position_x = 0 position_y = 0 [[outputs]] name = "DP-2" width = 2560 height = 1440 refresh = 240.001 position_x = 2560 position_y = 0
| Schlüssel | Typ | Standard | Beschreibung |
|---|---|---|---|
| name | string | n/a | Ausgangs-Connector-Name (z.B. DP-1, HDMI-A-1) |
| width | int | n/a | Horizontale Auflösung in Pixel |
| height | int | n/a | Vertikale Auflösung in Pixel |
| refresh | float | n/a | Bildwiederholrate in Hz (exakter Wert, z.B. 240.001) |
| position_x | int | 0 | Horizontale Position im Layout (Pixel) |
| position_y | int | 0 | Vertikale Position im Layout (Pixel) |
Die Bildschirmmodi werden 2 Sekunden nach dem Start angewendet (ein festes sleep 2 gibt dem Compositor Zeit zum Initialisieren). Das refresh-Feld muss mit einem Modus übereinstimmen, den dein Monitor tatsächlich unterstützt
Verwende morgenwm validate, um zu prüfen, ob deine Konfigurationsdatei korrekt geparst wird, ohne den Compositor zu starten:
morgenwm validateExit-Codes: 0 = OK, 1 = Parse-Fehler, 2 = mit Warnungen geparst.
Der Befehl gibt eine Zusammenfassung der geparsten Werte aus und warnt vor verdächtigen Einstellungen (z.B. workspace_count außerhalb des Bereichs, leere Tastenbelegungs-Schlüssel, Ausgänge ohne Dimensionen).
Dies wird nach jeder Konfigurationsänderung empfohlen. MorgenWM fällt zur Laufzeit bei einem Parse-Fehler lautlos auf eingebaute Standardwerte zurück, sodass eine syntaktisch fehlerhafte Konfiguration scheinbar "funktioniert", während deine Einstellungen ignoriert werden.
| Variable | Beschreibung |
|---|---|
| MORGENWM_NO_IPC | Wenn gesetzt, wird der IPC-Server komplett deaktiviert |
| NIRI_SOCKET | Überschreibt den IPC-Socket-Pfad (wird automatisch von MorgenWM gesetzt) |
| XDG_RUNTIME_DIR | Wird verwendet, um den Standard-Socket-Pfad zu finden |
| XDG_CONFIG_HOME | Wird verwendet, um die Konfigurationsdatei zu finden |
| XKB_DEFAULT_LAYOUT | Wird automatisch aus keyboard_layout in der Konfiguration gesetzt |
| XDG_CURRENT_DESKTOP | Wird auf morgenwm gesetzt, falls nicht bereits vorhanden (beeinflusst XDG-Autostart-Filterung) |