[NixOS] Mein Wechsel von Hyprland zu MangoWC – Ein Logbuch

D.S.i.u.S.

Lt. Commander
Registriert
Feb. 2003
Beiträge
1.083
Ich habe gestern(20.12.25) Hyprland durch Mango Wayland compositor unter NixOS ersetzt und möchte meine Erfahrungen nach und nach bis Polishing mit euch teilen.

Warum der Wechsel? Ich wollte etwas Neues und Schlankes ausprobieren. Mango hat viele Layouts und Tags neben Workspaces System. Ich werde auch versuchen, eine einfache Quickshell Leiste als Ersatz für Waybar zu basteln.
tile
scroller (PaperWM-like)
monocle (Fullscreen focused)
grid
deck
center_tile
vertical_tile
right_tile
vertical_scroller
vertical_grid
vertical_deck
tgmix (Tile grid mix)

Checkliste, die ich bis Polishing abarbeiten muss
[x] Grundinstallation (NixOS-Modul)
[x] App Launcher (fuzzel)
[ ] Monitor-Konfiguration
[ ] Tastenbelegungen (Keybindings)
[ ] Tastatur und Maus
[x] Tastaturlayout
[ ] XDG Desktop Portals
[x] Fonts
[x] Polkit-Integration
[ ] Environment Variables
[x] Wallpaper-Manager
[ ] Workspace oder Tag Rules
[x] Autostart
[ ] Idle-Management
[ ] Clipboard-Manager
[ ] Statusleiste
[x] Notification Daemon
[ ] Volume Control
[x] Animations
[x] Overview Settings

Vorbereitung:
Aliases für alle Shells in configuration.nix. Aliases machen alles einfacher. Kann man auch in tty nutzen. Ein Beispiel: nrs ist kürzer als sudo nixos-rebuild switch --flake /etc/nixos#pc. Ich nutze ein mal in der Woche nfu && nrs && shutdown

Bash:
# Aliases für alle Shells
 environment.shellAliases = {
 nfu = "sudo sh -c 'cd /etc/nixos && nix flake update'";
 nrs = "sudo nixos-rebuild switch --flake /etc/nixos#pc";
 nco = "sudo nano /etc/nixos/configuration.nix";
};
1. Hyprland deaktivieren (oder auskommentieren)
In configuration.nix programs.hyprland.enable = true; durch programs.mangowc.enable = true; ersetzen.
Command in services.greetd von hyprland auf mango ändern.
Bash:
 services.greetd = {
    enable = true;
    settings = {
      default_session = {
        # command = "${pkgs.tuigreet}/bin/tuigreet --cmd ${pkgs.hyprland}/bin/Hyprland --remember";
        command = "${pkgs.tuigreet}/bin/tuigreet --cmd mango --remember";
        user = "greeter";
          };
    };
  };
# security.pam.services.hyprland.enableGnomeKeyring = true;
in configuration.nix auskommentiert

2. mango.nix Home Manager Datei erstellen und flake anpassen:
sudo nano /etc/nixos/mango.nix
Ich habe etwas von Hyprland übernohmen und muss nicht komplett von null anfangen.
Bash:
# /etc/nixos/flake.nix
{
  description = "NixOS configuration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    mango = {
      url = "github:DreamMaoMao/mango";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, chaotic, home-manager, mango, ... }: {
    nixosConfigurations = {
      pc = nixpkgs.lib.nixosSystem {
        system = "x86_64-linux";
        modules = [
          ./configuration.nix
          chaotic.nixosModules.default
          mango.nixosModules.mango
          home-manager.nixosModules.home-manager {
        home-manager.useGlobalPkgs = true;
        home-manager.useUserPackages = true;
        home-manager.users.rebellz = {
          imports = [
            ./mango.nix
            mango.hmModules.mango
         ];
            };
          }
        ];
      };
    };
  };
}
Bash:
{ config, pkgs, lib, ... }:
{
home.stateVersion = "24.05";

# VSCodium - Save as root Erweiterung
   programs.vscode.profiles.default.extensions = [
          pkgs.vscode-extensions.yy0931.save-as-root-in-remote-ssh
        ];
# Fastfetch        
 programs.fastfetch = {
   enable = true;                                  
    settings = {                                    
     modules = [
          "title"
          "separator"
          "os"
          "host"
          "kernel"
          "uptime"
          "packages"
          "wm"
          "shell"
          "terminal"
          "cpu"
          "gpu"
          "memory"
        #  "local_ip"
        #  "disk"
          "break"
          "colors"
          ];
          };
          };                                                           

   services.cliphist = {
          enable = true;
        };    

# MPV media Player
  programs.mpv = {
    enable = true;
    package = pkgs.mpv; 
    config = {
      vo = "gpu";
      hwdec = "auto";
      loop-file = "inf"; # Loop für Videos
    };
# MPV Scripts
    scripts = [
      pkgs.mpvScripts.thumbfast # High-performance on-the-fly thumbnailer for mpv
      pkgs.mpvScripts.uosc
    ];
  };

# GTK Cursors
  home.pointerCursor = {
   package = pkgs.bibata-cursors;
    name = "Bibata-Modern-Ice";
    size = 14;
 };
  
# GTK Icons + Theme
  gtk = {
    enable = true;
    theme = {
      name = "Orchis-Light";
      package = pkgs.orchis-theme;
    };
    iconTheme = {
      name = "Tela";
      package = pkgs.tela-icon-theme;
    };    
  };

# Desktop Ordner in Home ausblenden
  xdg.userDirs = {
    enable = true;
    createDirectories = false;     
    desktop = "$HOME";
    };

# Micro - Terminal-based editor
  programs.micro = {
    enable = true;    
  };

# Terminal
 programs.kitty = {
   enable = true;
    themeFile = "atelier-cave-dark";       
    settings = {
        font_family = "Fira Code";
        font_size = 12;
        enable_audio_bell = false;
        scrollback_lines = 10000;
        confirm_os_window_close = 0;  
    };
    };
# Wayland-Umgebungsvariablen 
  home.sessionVariables = {
  STEAM_USE_XWAYLAND = "1";
     # Session / Desktop Info
  XDG_CURRENT_DESKTOP = "mango"; # Helps some apps recognize the DE
  XDG_SESSION_DESKTOP = "mango"; # Indicates Wayland session
  XDG_SESSION_TYPE = "wayland"; # Indicates Wayland session

  # Wayland Fixes
  QT_QPA_PLATFORM = "wayland"; # For Qt apps
  MOZ_ENABLE_WAYLAND = "1";
  NIXOS_OZONE_WL = "1"; # Electron (Discord, VSCode, Slack …)
  GDK_BACKEND = "wayland"; # For GTK apps

  # Nvidia spezifisch
  WLR_NO_HARDWARE_CURSORS = "1";
  LIBVA_DRIVER_NAME = "nvidia";
  GBM_BACKEND = "nvidia-drm";
  WLR_RENDERER = "vulkan";
  __GLX_VENDOR_LIBRARY_NAME = "nvidia";
  __GL_VRR_ALLOWED = "1";      
  }; 

wayland.windowManager.mango = {
  enable = true;
  
  # MangoWC will die Config als Textblock ('' ... '')
  settings = ''
    adaptive_sync=0
    no_border_when_single=1
    borderpx=0
    gappih=0
    gappov=0
    gappoh=0

  # Syntax: monitorrule=name,mfact,nmaster,layout,transform,scale,x,y,width,height,refreshrate
  # HDMI-A-1: Der oberste Monitor (Nullpunkt)
  monitorrule=HDMI-A-1,0.5,1,tile,0,1,0,0,1920,1080,60
  monitorrule=HDMI-A-2,0.5,1,tile,0,1,0,0,1920,1080,60

  # DP-1: Der Hauptmonitor (darunter, bei y=1080)
  monitorrule=DP-1,0.5,1,monocle,0,1,0,1080,1920,1080,144
  monitorrule=DP-4,0.5,1,monocle,0,1,0,1080,1920,1080,144
  
    # Tastatur & Maus    
    input,*,accel_profile,flat
    input,*,pointer_speed,0.5
    xkb_rules_layout=de,de
    xkb_rules_options=caps:escape

   # Binds
    bind=SUPER,Return,spawn,kitty    
    bind=SUPER,Q,killclient
    bind=ALT,Tab,toggleoverview
    bind=SUPER,N,setlayout,tile
    bind=SUPER,M,setlayout,monocle
    bind=SUPER,K,reload_config             
    bind=SUPER,D,spawn,${pkgs.fuzzel}/bin/fuzzel
    bind=SUPER,F,togglefullscreen        
    bind=SUPER,B,spawn,${pkgs.firefox}/bin/firefox
    bind=SUPER,Escape,spawn,${pkgs.wleave}/bin/wleave
    bind=SUPER,code:104,spawn,codium

    # mousebinds (funktionieren nicht)
    # Move window with Super + Left Click
    mousebind=SUPER,btn_left,moveresize,curmove

    # Resize window with Super + Right Click
    mousebind=SUPER,btn_right,moveresize,curresize

    # Close window with Right Click in overview
    mousebind=NONE,btn_right,killclient,0

    # ALT + TAB Modus
    ov_tab_mode=1

    # Rules
    windowrule=monitor:DP-1,appid:firefox
    windowrule=monitor:DP-4,appid:firefox
    windowrule=tags:1,appid:firefox

    animations=0
    layer_animations=0

    exec = ~/.config/mango/autostart.sh
    
    # Clipboard (Fuzzel als Menü) ---FUNKTIONIERT NICHT---
    bind=SUPER,V,spawn,sh -c "${pkgs.cliphist}/bin/cliphist list | ${pkgs.fuzzel}/bin/fuzzel --dmenu | ${pkgs.cliphist}/bin/cliphist decode | ${pkgs.wl-clipboard}/bin/wl-copy"
  '';

  # Dinge, die beim Start geladen werden sollen
  autostart_sh = ''
    dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=wlroots  
    ${pkgs.firefox}/bin/firefox &    

    # SwayNC (Benachrichtigungs-Zentrum)
    ${pkgs.swaynotificationcenter}/bin/swaync &    
    
    # wallpaper
    ${pkgs.swaybg}/bin/swaybg -i /home/rebellz/Bilder/Wallpaper/wallpaper.png &
    
    # Polkit (Damit VSCodium speichern kann)
    ${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1 & 

    # Steam 
    ${pkgs.steam}/bin/steam -nochatui -nofriendsui -silent & 

    ${pkgs.wl-clipboard}/bin/wl-paste --watch cliphist store &

  '';
};

# Quickshell Aktivierung
programs.quickshell = {
  enable = true;  
  systemd.enable = true;
};
# Quickshell Config
xdg.configFile."quickshell/shell.qml".text = ''
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import Quickshell.Io
import Quickshell.Services.SystemTray

ShellRoot {
    id: root
    property var manualActiveWindow: null

    Component.onCompleted: {
        SystemTray.isService = true
    }

    /* ================= BAR CONTENT ================= */
    component BarContent : RowLayout {
        anchors.fill: parent
        spacing: 12

        Item { Layout.fillWidth: true }

        /* -------- 1. TASKBAR (Fensterliste) -------- */
        Row {
            spacing: 8
            Layout.alignment: Qt.AlignVCenter
            Repeater {
                model: ToplevelManager.toplevels
                delegate: Item {
                    width: 130; implicitHeight: 30
                    readonly property bool isActuallyActive: root.manualActiveWindow === modelData
                    
                    Rectangle {
                        anchors.fill: parent
                        color: isActuallyActive ? "#D2E3FD" : "#24283b"
                    }
                    Text {
                        anchors.centerIn: parent
                        text: modelData ? modelData.title.substring(0, 15) : ""
                        color: isActuallyActive ? "#24283b" : "#D2E3FD"
                        font.pixelSize: 14
                        elide: Text.ElideRight
                    }
                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            if (modelData) {
                                root.manualActiveWindow = modelData;
                                modelData.activate();
                            }
                        }
                    }
                }
            }
        }

        Item { width: 8 }

        /* -------- 2. TRAY / CLOCK -------- */
        Row {
            spacing: 12
            Layout.alignment: Qt.AlignVCenter
            
            Row {
                spacing: 8
                Repeater {
                    model: SystemTray.items
                    delegate: Item {
                        width: 22; implicitHeight: 22
                        id: trayIcon
                        Image {
                            anchors.fill: parent
                            source: modelData && modelData.icon ? modelData.icon : ""
                            fillMode: Image.PreserveAspectFit
                        }
                        MouseArea {
                            anchors.fill: parent
                            cursorShape: Qt.PointingHandCursor
                            hoverEnabled: true
                            acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
                            onClicked: mouse => {
                                if (!modelData) return;
                                if (mouse.button === Qt.LeftButton) modelData.activate();
                                else if (mouse.button === Qt.MiddleButton) {
                                    if (modelData.secondaryActivate) modelData.secondaryActivate();
                                }
                                else if (mouse.button === Qt.RightButton) modelData.contextMenu();
                            }
                            onWheel: wheel => {
                                if (wheel.angleDelta.y > 0) modelData.scroll(1, 0);
                                else if (wheel.angleDelta.y < 0) modelData.scroll(-1, 0);
                            }
                        }
                    }
                }
            }

            Text {
                text: "󰂚"; color: "#D2E3FD"; font.family: "Symbols Nerd Font"; font.pixelSize: 18
                MouseArea { anchors.fill: parent; onClicked: swayncProc.running = true }
            }

            Text {
                id: clock
                text: Qt.formatTime(new Date(), "HH:mm"); color: "#D2E3FD"
                font { family: "JetBrainsMono Nerd Font"; pixelSize: 14; bold: true }
                Timer { interval: 1000; running: true; repeat: true; onTriggered: clock.text = Qt.formatTime(new Date(), "HH:mm") }
            }
        }

        Item { Layout.fillWidth: true }
        Process { id: swayncProc; command: ["${pkgs.swaynotificationcenter}/bin/swaync-client", "-t"] }
    }

       /* ================= MONITOR 1 ================= */
    PanelWindow {
        id: win1
        screen: Quickshell.screens[0]
        anchors { left: true; right: true; bottom: true }
        implicitHeight: 30
        color: "#1a1b26"
        
        Component.onCompleted: {
            const ls = win1.WlrLayershell;
            ls["layer"] = 2;          // 2 = Top
            ls["exclusionMode"] = 1;  // 1 = Exclusive
            ls["exclusiveZone"] = 30;
        }

        BarContent {}
    }

    /* ================= MONITOR 2 ================= */
    PanelWindow {
        id: win2
        screen: Quickshell.screens.length > 1 ? Quickshell.screens[1] : null
        visible: Quickshell.screens.length > 1
        anchors { left: true; right: true; bottom: true }
        implicitHeight: 30
        color: "#1a1b26"

        Component.onCompleted: {
            if (win2.screen) {
                const ls = win2.WlrLayershell;
                ls["layer"] = 2;
                ls["exclusionMode"] = 1;
                ls["exclusiveZone"] = 30;
            }
        }

        BarContent {}
    }
}

'';

}
Bash:
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).
{ config, pkgs, ... }:
{
 imports =
 [ # Include the results of the hardware scan.
 ./hardware-configuration.nix
 ./syncthing.nix
 # ./nvidia-open-latest.nix
 ./thelounge.nix
 ./nvidia-open-beta.nix
 # ./nvidia-nvk.nix
 ];
 # Kernel
 boot.kernelPackages = pkgs.linuxPackages_cachyos-gcc;
 # Bootloader.
 boot.loader.systemd-boot.enable = true;
 boot.loader.efi.canTouchEfiVariables = true;
 # Begrenzung der Rollback-Einträge
 boot.loader.systemd-boot.configurationLimit = 10;
 networking.hostName = "nixos"; # Define your hostname.
 # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
 # Configure network proxy if necessary
 # networking.proxy.default = "http://user:password@proxy:port/";
 # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
# Disable NetworkManager, use systemd-networkd + resolved
networking.networkmanager.enable = false;
networking.useDHCP = false;
systemd.network.enable = true;
services.resolved.enable = true;
systemd.network.networks."10-enp15s0" = {
 matchConfig.Name = "enp15s0";
 networkConfig = {
 Address = "192.168.178.52/22"; # feste IPv4 mit Subnetz
 Gateway = "192.168.178.1"; # FritzBox
 DNS = [ "94.242.2.3" "2620:fe::fe" ]; # Bevorzugte DNS (v4 + v6)
 };
};
 # Set your time zone.
 time.timeZone = "Europe/Berlin";
 # Select internationalisation properties.
 i18n.defaultLocale = "de_DE.UTF-8";
 i18n.extraLocaleSettings = {
 LC_ADDRESS = "de_DE.UTF-8";
 LC_IDENTIFICATION = "de_DE.UTF-8";
 LC_MEASUREMENT = "de_DE.UTF-8";
 LC_MONETARY = "de_DE.UTF-8";
 LC_NAME = "de_DE.UTF-8";
 LC_NUMERIC = "de_DE.UTF-8";
 LC_PAPER = "de_DE.UTF-8";
 LC_TELEPHONE = "de_DE.UTF-8";
 LC_TIME = "de_DE.UTF-8";
 };
 # Enable OpenGL über NixOS-Option
 hardware.graphics = {
 enable = true;
 enable32Bit = true;
 };
 # Enable the X11 windowing system.
 services.xserver.enable = true;
 # Enable the Plasma 6
# services.displayManager.sddm.enable = true;
# services.displayManager.sddm.wayland.enable = true;
# services.desktopManager.plasma6.enable = false;
 services.greetd = {
 enable = true;
 settings = {
 default_session = {
 # command = "${pkgs.tuigreet}/bin/tuigreet --cmd ${pkgs.hyprland}/bin/Hyprland --remember";
 command = "${pkgs.tuigreet}/bin/tuigreet --cmd mango --remember";
 user = "greeter";
 };
 };
 };
 programs.mango.enable = true;
 # Aktiviere Hyprland mit seiner eigenen XWayland-Option
 # programs.hyprland = {
 # enable = true;
 # withUWSM = true;
 # xwayland.enable = true; # für legacy X11 Apps wie Firefox, Thunderbird etc.
 # };
 # Configure keymap in X11
 services.xserver.xkb.layout = "de";
 services.xserver.xkb.variant = "";
 # Configure console keymap
 console.keyMap = "de";
 # Enable CUPS to print documents & Brother Drucker Treiber
 services.printing.enable = true;
 services.printing.drivers = [
 pkgs.brlaser
 ];
 # Enable sound with pipewire.
 services.pulseaudio.enable = false;
 security.rtkit.enable = true;
 services.pipewire = {
 enable = true;
 alsa.enable = true;
 alsa.support32Bit = true;
 pulse.enable = true;
 # If you want to use JACK applications, uncomment this
 jack.enable = true;
 # use the example session manager (no others are packaged yet so this is enabled by default,
 # no need to redefine it in your config for now)
 #media-session.enable = true;
 };
 # Define a user account. Don't forget to set a password with ‘passwd’.
 users.users.rebellz = {
 isNormalUser = true;
 description = "rebellz";
 extraGroups = [ "wheel" ];
 };
 services.udisks2.enable = true;
 # Steam
 programs.steam.enable = true;
 # Garbage Collection
 nix.gc = {
 automatic = true;
 dates = "weekly";
 options = "--delete-older-than 7d";
 };
 nix.settings.auto-optimise-store = true;
 # Firefox.
 programs.firefox = {
 enable = true;
 languagePacks = [ "de" ];
 nativeMessagingHosts.packages = [ pkgs.firefoxpwa ];
 preferences = {
 "intl.locale.requested" = "de";
 "widget.use-xdg-desktop-portal.file-picker" = 1; # KDE file picker
 "browser.tabs.loadBookmarksInTabs" = true; # Lesezeichen in neuem Tab öffnen
 "full-screen-api.warning.delay" = -1; # Vollbildmodus Meldung deaktivieren Teil 1/2
 "full-screen-api.warning.timeout" = 0; # Vollbildmodus Meldung deaktivieren Teil 2/2
 "ui.tooltip.delay_ms" = 5000;
 "dom.private-attribution.submission.enabled" = false; # "datenschutzfreundliche" Werbe-Messungen
 "browser.cache.disk.enable" = false; # Cache abschalten
 "extensions.pocket.enabled" = false; # Pocket deaktivieren
 "dom.event.clipboardevents.enabled" = false; # Zwischenablage nicht überwachen
 "privacy.donottrackheader.enabled" = true; # Do Not Track aktivieren
 };
};
 # Thunderbird
 programs.thunderbird.enable = true;
 # OBS-Studio
 programs.obs-studio.enable = true;
 # Allow unfree packages
 nixpkgs.config.allowUnfree = true;
 nix.settings.experimental-features = [ "nix-command" "flakes" ];
 # List packages installed in system profile. To search, run:
 # $ nix search wget
 environment.systemPackages = with pkgs; [
 # The Nano editor is also installed by default.
 brave
 dconf
 eog
 ffmpeg-full
 ffmpegthumbnailer
 foot
 fuzzel
 gimp
 git
 grim
 grimblast
 gnome-calculator
 hyprpicker
 inkscape
 joplin-desktop
 keepassxc
 kitty-themes
 librecad
 libreoffice-fresh
 # lutris
 mangohud
 mission-center
 nautilus
 # onlyoffice-bin
 # opensnitch-ui
 pam_u2f
 pavucontrol
 polkit_gnome
 screen
 shotcut
 slurp
 swaybg # Wallpaper Setup
 swaynotificationcenter # Notification Daemon
 tuigreet
 unzip
 wl-clipboard
 wleave
 vivaldi
 vlc
 vscodium
 yt-dlp_git
 zim
 ];
 fonts.packages = with pkgs; [
 nerd-fonts.symbols-only
 nerd-fonts.jetbrains-mono
 noto-fonts
 noto-fonts-cjk-sans
 noto-fonts-color-emoji
 fira-code
 ];
 services.udev.packages = [ pkgs.yubikey-personalization ];
 security.pam.services = {
 sudo.u2fAuth = true;
 };
 # Some programs need SUID wrappers, can be configured further or are
 # started in user sessions.
 # programs.mtr.enable = true;
 # programs.gnupg.agent = {
 # enable = true;
 # enableSSHSupport = true;
 # };
 # List services that you want to enable:
 # Enable the OpenSSH daemon.
 # services.openssh.enable = true;
 # Open ports in the firewall.
 # networking.firewall.allowedTCPPorts = [ ... ];
 # networking.firewall.allowedUDPPorts = [ ... ];
 # Or disable the firewall altogether.
 # networking.firewall.enable = false;
 # OpenSnitch (Application Firewall; opensnitch-ui in environment.systemPackages)
 # services.opensnitch.enable = true;
 # services.passSecretService.enable = true;
 # KDE Connect
 programs.kdeconnect.enable = true;
 # Aliases für alle Shells
 environment.shellAliases = {
 nfu = "sudo sh -c 'cd /etc/nixos && nix flake update'";
 nrs = "sudo nixos-rebuild switch --flake /etc/nixos#pc";
 nco = "sudo micro /etc/nixos/configuration.nix";
};
 security.polkit.enable = true;
 services.gnome.gnome-keyring.enable = true;
 services.gvfs.enable = true;
 # security.pam.services.hyprland.enableGnomeKeyring = true;
 security.pam.services.login.enableGnomeKeyring = true;
 services.dbus.enable = true;
 programs.dconf.enable = true;
 # Daemon for power management
 # services.upower.enable = false;
 system.stateVersion = "24.05"; # Don't change it bro
}

Man soll die Datei mango.nix NICHT in configuration.nix unter imports einbinden!
mango.nix ist eine Home Manager Datei und nicht Teil von configuration.nix, die ausgelagert wird(wie z.B. thelounge.nix oder nvidia-open-latest.nix)

Erstes Booten nach der Vorbereitung
Erstes Einloggen war nicht möglich. Ich musste zuerst zu tty wechseln, um in configuration.nix unter greetd die command Zeile von mangowc auf mango zu ändern.
Strg + Alt + F2 --> Username Passwort --> sudo nano /etc/nixos/configuration.nix
Zweiter Versuch um auf Desktop zu kommen
Bin auf dem Desktop mit grauem Wallpaper und Mauscursor gelandet. Es gibt keine Tastenkürzel. SUPER + RETURN(kitty) und SUPER + D(fuzzel) funktionieren nicht.
PC mit Powertaste ausgemacht und dann eingeschaltet. Wieder zu tty gewechselt, um binds zu ändern
Dritter Versuch
Aller guten Dinge sind drei. Aufm Desktop sehe ich immer noch grauen Hintergrund und Mauszeiger, aber wenigstens kann ich jetzt kitty(Terminal) und fuzzel(App Launcher) öffnen.

Probleme, die ich als Erstes nach der Grundinstallation beheben soll:
Mango hat scroller layout von Anfang an (entweder anpassen oder ändern)
polkit funktioniert nicht (Speichern in codium ist nicht möglich) Lösung
Tastaturlayout ist auf englisch
Monitore sind gespiegelt
SUPER + Escape für wlogout funktioniert nicht Lösung
Animationen sind nicht deaktiviert
Clipboard(SUPER + V) funktioniert nicht
Screenshots erstellen funktioniert nicht
Aktive Fenster haben eine Umrandung in Orange
Youtube - Vollbild verlassen mit Klick unten rechts verschiebt Focus auf das Fenster rechts neben Browser, weil Mauszeiger in scroller layout nach dem Verlassen von Vollbild nicht mehr im Browserfenster ist, sondern im Fenster daneben. Vollbild verlassen mit Taste F funktioniert normal.

Was ich nach der Grundinstallation schon behoben habe:
  • Tastaturlayout auf DE umgestellt. Einfach unter settings in mango.nix die Zeile xkb_rules_layout=de,de hinzufügen.
  • Animationen deaktiviert. animations=0 und layer_animations=0
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Deinorius, Poink, Alexander2 und eine weitere Person
D.S.i.u.S. schrieb:
Wayland compositor
Ist aber auch maximal ungünstig ausgewählt der Name, war das womöglich absicht?

Die 1. April Version heißt dann Mango Orkus Edition :D

Aber jetzt mal ernsthaft. Ich habe erst neulich von dem Scroller Layout gehört, das ist schon relativ neu oder? Finde ich auf jeden Fall interessant das Konzept.
 
Scroller-Layout wie in Niri? Das gibt es eigentlich schon viel länger. Z. B. PaperWM gibt schon seit Jahren.

Und vor zwei Jahren habe ich auch mal Karousel für KDE ausprobiert. Die Umsetzung hat da leider aufgrund von Einschränkungen in kWin so seine Tücken, weswegen ich das nicht weiter verwendet habe. Angeblich sind die KDE-Entwickler dabei, die Tiling-Window-Fähigkeiten von kWin zu verbessern. Ich finde den Artikel jetzt aber leider nicht mehr.

@D.S.i.u.S.
Ich wünsche dir viel Erfolg! 😃
 
  • Gefällt mir
Reaktionen: Deinorius und Alexander2
@Alexander2
Wenn ich mich nicht täusche, hieß MangoWC vorher MaoMao.
Im Internet habe ich drei verschiedene Beispiele für flake gefunden. Die flake von "tony btw" soll man nicht verwenden. Bei mir war kein Rebuild damit möglich, weil in seiner flake überall mangowc statt mango steht.
Github Link ist https://github.com/DreamMaoMao/mangowc/
Es gibt auch MangoWC Webseite https://mangowc.vercel.app/docs

Ich werde jetzt Wiki von Github Seite verwenden, um mögliche Fehler auszuschließen.

Ist etwas durcheinander mit Namensgebung.
Mal ist es mango, Mal ist es MangoWC.
Deswegen hatte ich auch mangowc in greetd stehen gehabt und deshalb war erstes Einloggen nicht möglich. Muss ich überprüfen, ob Option programs.mangowc.enable = true; in configuration.nix richtig ist, weil wieder mit wc im Namen.
 
Zuletzt bearbeitet:
Update 22.12.2025
Autostart_sh

Die Sache mit autostart_sh in mango.nix war eine schwere Geburt. Ich habe auf MangoWC Github Webseite in hm-modules.nix Folgendes gefunden:
autostart_sh = mkOption {
description = "WARRNING: This is a shell script, but no need to add shebang";
type = types.lines;
default = "";
example = ''
waybar &
'';
};
Manuelles Hinzufügen von #!/bin/sh in autostart_sh war nicht nötig. Ohne shebang wurde Polkit und Wallpaper trotzdem nicht geladen. Erst nachdem ich exec = ~/.config/mango/autostart.sh in settings hinzugefügt habe, hat es funktioniert.
wlogout
Ich habe wlogout durch wleave(Wayland-native logout script written in GTK4) ersetzt. Wleave macht keine "Zicken" wie wlogout. Tastenkürzel SUPER + Escape funktioniert jetzt bestens. In settings steht: bind=SUPER,Escape,spawn,${pkgs.wleave}/bin/wleave
Polkit
Ich kann wieder in VScodium speichern und in denselben Anwendung Rebuild ausführen.
Für VScodium habe ich Tastenkürzel SUPER + Return(Numpad) bind=SUPER,code:104,spawn,codium
In Autostart_sh: ${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1 &
In configuration.nix stehen auch paar Zeilen zu polkit.
Wallpaper
In Autostart_sh habe ich eine Zeile für Wallpaper stehen ${pkgs.swaybg}/bin/swaybg -i /home/dsius/Bilder/Wallpaper/wallpaper.png &
Da ich selten Wallpaper wechsle und kaum Wallpaper sehe, weil ständig irgendwelche Fenster offen sind, ist das die optimale Lösung für mich. swaybg muss natürlich in environment.systemPackages = with pkgs; stehen.

Eine Sache gefällt mir in scroller Layout nicht. Wenn man mit Mauszeiger nach rechts geht, wird manchmal ein Fenster übersprungen.
Ich habe bereits eine leere Quickshell Leiste gebastelt. Ist bereits in mango.nix integriert. Habe ich "Spoiler: mango.nix" aktualisiert.
Muss ich jetzt zuerst die Sache mit Monitoren fixen und mango Layout richtig konfigurieren.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Alexander2
Finde gut, das du deine Änderungen weiter hier Postest. Jeder interessierte kann ja mit deinen Configdateien sogar das 1:1 dann bei sich installieren :D
Auch wenn ich es nicht machen werde :-)
 
Man soll nicht alles 1:1 übernehmen. Die Pfade, Hostname und Benutzername muss man ändern. Und auch Monitor Config kann anders sein. Mein sekundärer Monitor ist über primären Monitor. stateVersion in configuration.nix soll man auch nicht übernehmen, sondern die eigene behalten.

Ich habe auch networkmanager durch systemd.network + services.resolved ersetzt. Funktioniert bei mir besser mit theLounge. DNS habe ich da auch eingetragen. Das hat aber Auswirkungen auf andere Sachen. Bluetooth oder Wlan nutze ich am PC nicht.

Notiz an mich: "Binnen-I be gone" Browser Add-on deaktivieren, wenn man in Forum irgendwas einfügt.
Das Ding hat in Quickshell Config in "Spoiler: mango.nix" aus centerIn einfach so center gemacht. Wenn man es so mit center statt mit centerIn übernimmt, wird die Quickshell Leiste nicht funktionieren.
 
Zuletzt bearbeitet:
Mich würde interessieren, wie viele Fenster ihr so im Durchschnitt offen habt?
Ich hab 2 x 27 Zoll Monitore. Auf einem kann ich 4 Fenster ablegen Maximal? Und das mal 10 Workspaces (Theoretisch müssten ja mehr gehen? Wers braucht...). Man hat ja immer noch die Möglichkeit zu stacken bzw. die Fenster in Tabs zu ordnen.

Oder was ist die Idee hinter diesem Konzept?
Mit einem Workspace hat man ja gerade die Trennung, die man erreichen will? Man will doch nicht alles auf einmal in einem Arbeitsbereich haben? Da sucht/scrollt man sich doch dumm?
 
Ist doch bei vielen auch so, das du per Startmenü ebenso die Fenster als zu öffnendes angeboten bekommst. Also angenommen du hast Krita schon einmal auf, bist gerade an einer ganz anderen stelle, vielleicht mitm Browser beschäftig. Und nu nwillst du wieder zu krita. Da könnte reichen [meta] kri
und schon siehst du das Fenster als mögliches ziel. enter, zack da. Nichts mit Suchen.

Was auch oft vorkommt, das du bei mehreren Festgelegten Arbeitflächen einige oder gar alle Vorgesehen sind für bestimmte Arbeiten/Programme. Wenn du dir das eingerichtet hast, dann ist da auch fix per shortcut hingewechselt.
Oder per Tastendruck + Übersich öffnet sich + auswahl...

Also jetzt gerade habe ich 12 Fenster offen und ich mache nichts besonderes. grad nichtmal Spotify an.
 
Naja, ja. Nett.
Wenn man 4 Fenster offen hat, wird das auf einem Notebook echt eng. Dann kurz den Sichtbereich verschieben zu könne, ohne das man ein anderes Fenster aus dem Sichtbereich nehmen muss? Okay.

Wenn man nur ein Monitor zur Verfügung hat. Wie gesagt, auf wie viel Fenster kann man sich gleichzeitig konzentrieren, damit man davon profitiert?

@Alexander2
Ich glaube wirklich, es geht mehr darum, links und rechts noch mehr Space dazu zu gewinnen... aber ich zweifel eben so ein wenig an, das man dieses Multitasking beherrscht. Das ist doch eigentlich schon widerlegt? Der Mensch kann sich nicht auf mehrere Sachen gleichzeitig konzentrieren. Das ist doch nur ein schnelles abarbeiten einzelner Aufgaben.

Alexander2 schrieb:
Und nu nwillst du wieder zu krita. Da könnte reichen [meta] kri
Sicher. Oft hat man auch am Kopf, wo sich was befindet. Manche ordnen ihre Workspaces thematisch. Da ist Krita dann immer auf der 7.

---

Interessant ist es alle mal.
Aber ich hab zur Zeit eh nur eine Handvoll Fenster offen und arbeite an zwei offen 😁
 
Klar, nacheinander. Es kann aber ja auch oft genug vorkommen, das ein Programm beschäftig ist und was abarbeitet und du dann was anderes in der zeit nebenher machst.

Der Punkt ist ja nicht, das der Mensch nur eine Sache zur zeit machen kann...

Wenn man so anfängt zu argumentieren, warum sind wir dann über DOS hinausgekommen?
Oder auch einfach nur um nicht immer alles sofort schließen zu müssen, und auch vor allem um die minimierenfunktion nicht zu benutzen.

klar kannst du einfach mit nur einer Arbeitsfläche arbeiten und da alles Fenster Jonglieren. Aber es ist dann einfach anders, wenn du mehrere Arbeitsflächen hast und so die Fenster anders Organisieren kannst..

Vorallem auch, das mit dem Tiling du dich nicht um eine passable Platzierung kümmern muss.(mit der Maus)
 
In Hyprland hatte ich jedem Fenster "gesagt"(rules) in welchem Workspace die sich öffnen sollen. Der obere sekundäre Monitor war für IRC und Bild-im-Bild Fenster da. Durch Autostart waren bei mir 3 Fenster nach dem Einloggen da. Firefox in "1:Firefox", Nautilus in "2: Dateien" und Zim-Wiki in "3:Notizen". Andere Anwendungen habe ich nach Bedarf geöffnet. Mit SUPER + Alt + 1 bis 9 könnte ich Fenster in anderes Workspace verschieben und mit SUPER + 1-9 zu Workspace wechseln oder durch Klick in Waybar auf Workspace 1-9.

In Mango will ich es mit Tags und scroller Layout probieren. Vorteil von Scroller Layout ist, dass man nach Schließen von Dateien wieder in Nautilus landet und muss nicht manuell zu Workspace "2: Dateien" wechseln. Wenn man in Mango in linke untere Ecke geht, wechselt man Layout. Man kann auch festlegen, dass Monitor 1 tile ist und Monitor 2 scroller. Ist alles sehr flexibel.
 
Bei mir sind quasi immer mindestens 4 Fenster bzw. Programme offen, die auf drei Desktops verteilt sind.

→ WMs kümmern sich in erster Linie eigentlich nur darum, wie Fenster auf einem Desktop angeordnet werden bzw. wie der verfügbare Platz auf einem Desktop genutzt wird.
→ Virtuelle Desktops erlauben es, Fenster zusammen anzeigen zu lassen, die z. B. zum gleichen Sachverhalt gehören. Ich habe bspw. einen virtuellen Desktop nur für die Dateiverwaltung.
→ Physische Desktops bzw. mehrere Bildschirme erlauben es, einfach mehr Fenster gleichzeitig zu sehen.
→ Aktivitäten (bei KDE) erlauben es, virtuelle Desktops, Programme und Daten z. B. nach Nutzung zu kategorisieren. Denkbar ist hier z. B. eine Privat- und eine Arbeit-Aktivität. In der Privat-Aktivität finden sich dann Desktops für z. B. Surfen, Spiele, Musik und Video. Das Verzeichnis mit den eigenen Gedichten ist nur hier sichtbar. In der Arbeit-Aktivität finden sich Desktops für z. B. File Management, Terminals und Konferenzen. Das Verzeichnis mit den geschäftlichen Dateien ist nur hier sichtbar.

Das gibt es alles, weil User verschiedene Anforderungen haben.
 
@Alexander2
Wenn du dich also nur eine Aufgabe konzentrierst, wie viele Fenster kann man für diese Aufgabe offen haben? Ich seh Terminal Power-User, die x Metriken offen haben, an einem Monitor... oder vergleichbare Workflows. Alles darüber hinaus kann ich mir gerade nicht Vorstellen, worin der besondere Vorteil liegen soll.

D.S.i.u.S. schrieb:
Vorteil von Scroller Layout ist, dass man nach Schließen von Dateien wieder in Nautilus landet und muss nicht manuell zu Workspace "2: Dateien" wechseln

Hast du es schon mal mit einem Scratchpad versucht? Also einem verstecktem Workpace. Da kannst du dann den Nautilus je nach bedarf aufrufen. Sollte sich doch für diesen Usecase eignen?

Aber gut, besser haben als brauchen. 🙃
 
Update 25.12.2025
Overview Settings

Standardmäßig wird die Übersicht angezeigt, wenn der Cursor in die linke untere Ecke bewegt wird. Man kann auch Alt + Tab zuweisen.
bind=ALT,Tab,toggleoverview
Die Übersicht habe ich so eingestellt, dass nach Loslassen der Alt Taste man zu ausgewähltem Fenster wechselt.
Dazu muss man die Zeile ov_tab_mode=1 in settings hinzufügen. Ohne diese Zeile bleibt die Übersicht nach Loslassen der Taste bestehen.
Monitore
Ich kann jetzt beide Monitore nutzen, aber Anwendungen aus Autostart landen auf meinem oberen sekundären HDMI Monitor. Wahrscheinlich weil der obere Monitor Nullpunkt(0,0) hat.
Monitorrule nach output Name ist nicht zuverlässig. Mango scheint (noch) keine Identifikation via Seriennummer zu unterstützen. Bei mir ändern sich output Namen manchmal und das führt dazu, dass monitorrule nicht funktioniert. In wiki steht nur: "The output name (e.g., eDP-1, HDMI-A-1). Use wlr-randr to find these."
Ich muss jetzt Fallback windowrule und monitorrule für DP-4 und HDMI-A-2 einrichten.

# Syntax: monitorrule=name,mfact,nmaster,layout,transform,scale,x,y,width,height,refreshrate
# HDMI-A-1: Der oberste Monitor (Nullpunkt)
monitorrule=HDMI-A-1,0.5,1,tile,0,1,0,0,1920,1080,60
monitorrule=HDMI-A-2,0.5,1,tile,0,1,0,0,1920,1080,60 # Fallback

# DP-1: Der Hauptmonitor (darunter, bei y=1080)
monitorrule=DP-1,0.5,1,monocle,0,1,0,1080,1920,1080,144
monitorrule=DP-4,0.5,1,monocle,0,1,0,1080,1920,1080,144 # Fallback

Scroller Layout
Ich bin zum Entschluss gekommen, dass Scroller Layout keinen Sinn bei mehr als 3 Fenstern ergibt. Es ist nicht effizient. Ich wechsle mit SUPER + N und M zwischen tile und monocle Layout.
Nullpuktkoordinaten
Mauszeiger ist nach dem Einloggen immer auf dem sekundären Monitor mit Nullpunkt Koordinaten und befindet sich immer in der linken oberen Ecke.
Mouse Bindings
Funktionieren nicht und ich weiß nicht warum. Nicht alle.
Quickshell Leiste
Mit Quickshell Leiste als Waybar Ersatz komme ich nur langsam voran. Waybar konfigurieren ist einfacher.
Zwei Probleme habe ich noch:
1) MangoWC "sagt" der Leiste nicht, welches Fenster Fokus hat, damit die Quickshell Leiste aktives Fenster anders gestalten kann. Habe ich jetzt manuell, durch Klick auf jeweiligen Fenster eingerichtet.
2) Rechtsklick Kontextmenu auf Steam Icon in SystemTray funktioniert nicht.
Auf Github Seite steht "Excellent xwayland support.". Ich bekomme es aber nicht hin, dass mit Klick auf Steam icon in SystemTray ein KontextMenu erscheint.

Ich muss noch mit tags und rules spielen, um es für mich fertig einzurichten.
 
Zuletzt bearbeitet:
Update 28.12.2025
Ich werde MangoWC Projekt erstmal pausieren und Niri eine zweite Chance geben.
MangoWC fühlt sich eher nach beta an.
Negativ:
  • Adaptive_Sync verursacht Flimmern/Flackern aufm Desktop(NVIDIA GraKa).
  • MPV läuft nicht immer stabil. Man hat gelegentlich entweder Artefakte oder Freeze. thumbfast NVIDIA-Bug
  • Mauszeiger erscheint auf dem sekundären und nicht auf dem primären Monitor nach dem Einloggen.
  • Fenster schließen sich manchmal von alleine.
  • Monitor Config funktioniert nur mit output name (e.g., DP-1, HDMI-A-1) und nicht mit serial oder model. Bei mir ändern sich gelegentlich Output Namen und das hat starke Auswirkungen auf rules usw.
  • Für Änderungen muss man entweder MangoWC oder PC neu starten.
  • Probleme mit Quickshell Leiste(kann auch an meinen nicht vorhandenen Programmierkenntnissen liegen)
  • "# Close window with Right Click in overview" funktioniert nicht. mousebind=NONE,btn_right,killclient,0
  • Nach "Move window with Super + Left Click" bleibt Fenster für immer im Vordergrund(monocle Layout).
  • usw.
Positiv:
  • Leicht und schnell.
  • NixOS Update läuft schnell durch.
  • Viele Layouts und man kann hin und her zwischen Layouts schalten.
 
Zuletzt bearbeitet:
Alexander2 schrieb:
Ja gut Troll halt rum :-) :volllol::n8:
Ich würde es halt gerne verstehen.
Bislang hab ich noch kein Video zum Thema gefunden, welches mir das in irgendeiner weise das anschaulich zeigen konnte, was da passiert.
Der Vorteil von TWMs ist doch gerade das sich kein Fenster mehr "Verstecken" kann?! Ich muss mich also nicht durch 10 offene Fenster kämpfen bevor ich zur untersten Schicht gelange (und das Fenster, das man sucht, ist safe das letzte, das noch übrig ist). Wenn ich mir nun das Konzept eines Scrolling Layout anschaue, wird doch genau dieser Vorteil wieder aufgehoben?! wenn man irgendwie 10 Fenster oder Arbeitsflächen auf einem Workspace offen hat, Scrollt man sich doch dumm, bis man das Setup an Fenstern gefunden hat?
 
Das es für dich nichts ist ist ok, das ist aber nur die eine Seite der Münze.
Du schreibst nach meinem empfinden darüber, das du jedwede Berechtigung der Existenz absprichst nur weil es nichts für dich ist. Am ende ist das sogar egal, weil keiner darauf hören wird und die die einen Gefallen daran finden werden es eben nutzen.
(Nebenbei kommst du halt auch mit an den Haaren herbeigezogenen Argumenten, die jedwedes Multitasking im Grunde eine Existenzberechtigung absprechen. deswegen auch der Kommentar mit dem Trollen.)
Ergänzung ()

Und dann noch selbst die Sache, die deiner Argumentation entgegen spricht, ich habe diese Woche ein nettes Feature kennengelernt, selbst in der Linux Konsole, wenn du nur eine einzige vor dir hast, kannst du easy Peasy Multitasking machen.

[strg]+[Z]
um einen Prozess in den Hintergrund zu setzen, den kann man auch mit bg im Hintergrund weiterlaufen lassen, mit fg wieder in den vordergrund holen, jobs um zu schauen was alles an Prozessen schon im hintergrund ist oder da läuft und wenn man etwas in den Hintergrund geschoben hat ist ja das terminal direkt frei um etwas anderes anzufangen→ zu starten

Das ist das selbe Multitasking bloß eben sogar in der Konsole, in einem Einzelknen terminal. Klar, jetzt nicht verwechseln dasmit das per multiplen TTY sowieso Multitasking im Linux Terminal alltäglich ist.

Also das Argument man könne sich auch nur auf eines konzentrieren, (was technisch nicht falsch ist) bleibt damit immernoch sogar im Kontext von Terminal arbeiten nen totaler blender. Oder gaslighting, wie man es auch gerne nennt.)
 
Zuletzt bearbeitet:
Widerspruch ist der Weg zur Wahrheit. 😉
Ich finde eben spannend wie andere am PC arbeiten.
Wenn man die Oberfläche als Raum begreift: Workspaces sind Räume, der Bildschirm die Tapete. Gut. Okay. Aber: wie viele Fenster hat man offen? 100? Und nein, das ist kein versuch zu trollen. Ich hab mal einen Browser mit entsprechender Anzahl an Tabs gesehen. Aber das geht doch ab von der Leistung? Und gibt es tatsächlich jemand (und das war meine Frage, die ich eingangs gestellt hab), mit wie vielen Fenstern kann man im laufe des Tages arbeiten?
Ergänzung ()

Naja, ich beginne so langsam die Vorzüge zu durchblicken.
 
Zuletzt bearbeitet:
Zurück
Oben