inputs: { config, lib, pkgs, ... }: with lib; let cfg = config.de2u; in { options.de2u = { enable = mkEnableOption "Enable de2 user stuff"; tiling = mkOption { type = types.bool; default = true; description = "Enable tiling stuff"; }; touch = mkOption { type = types.bool; default = false; description = "Make usable for touchscreens"; }; }; config = mkIf cfg.enable { ezcolors.enable = lib.mkDefault true; ezfonts.enable = lib.mkDefault true; programs.firefox.enable = true; programs.kermit = { enable = lib.mkDefault true; settings = { key = lib.mkDefault "shift"; opacity = lib.mkDefault "1"; }; }; home.packages = with pkgs; [ gnomeExtensions.improved-workspace-indicator gnomeExtensions.vitals gnomeExtensions.clipboard-indicator gnomeExtensions.just-perfection gnomeExtensions.appindicator gnomeExtensions.unite-shell gnomeExtensions.gamemode gnomeExtensions.gsconnect gnomeExtensions.sound-output-device-chooser gnomeExtensions.bluetooth-quick-connect gnomeExtensions.forge ]; systemd.user.sessionVariables = { MOZ_ENABLE_WAYLAND = "1"; QT_WAYLAND_DISABLE_WINDOWDECORATION = lib.mkIf (cfg.tiling && !cfg.touch) "1"; }; xdg.configFile."gtk-4.0/gtk.css".text = '' /* UNITE windowDecorations */ @import url('${config.home.homeDirectory}/.nix-profile/share/gnome-shell/extensions/unite@hardpixel.eu/styles/gtk4/buttons-right/${ if (cfg.tiling && !cfg.touch) then "always" else "both" }.css'); /* windowDecorations UNITE */ ''; gtk.gtk3.extraCss = '' /* UNITE windowDecorations */ @import url('${config.home.homeDirectory}/.nix-profile/share/gnome-shell/extensions/unite@hardpixel.eu/styles/gtk3/buttons-right/${ if (cfg.tiling && !cfg.touch) then "always" else "both" }.css'); /* windowDecorations UNITE */ ''; home.activation.gtk3css-over-unite = { data = '' $DRY_RUN_CMD rm -f ~/.config/gtk-3.0/gtk.css $DRY_RUN_CMD rm -f ~/.config/gtk-4.0/gtk.css ''; before = ["checkLinkTargets"]; after = []; }; xdg.configFile."mimeapps.list".force = true; xdg.mimeApps = let browser = if config.programs.firefox.enable then ( if config.programs.firefox.package.pname == "firefox" then "firefox.desktop" else "librewolf.desktop" ) else "chromium-browser.desktop"; apps = { "text/plain" = "org.gnome.TextEditor.desktop"; "inode/directory" = "org.gnome.Nautilus.desktop"; "image/*" = "org.gnome.eog.desktop"; # and because mimeapps.list is DUMB "image/jpeg" = "org.gnome.eog.desktop"; "image/bmp" = "org.gnome.eog.desktop"; "image/gif" = "org.gnome.eog.desktop"; "image/jpg" = "org.gnome.eog.desktop"; "image/pjpeg" = "org.gnome.eog.desktop"; "image/png" = "org.gnome.eog.desktop"; "image/tiff" = "org.gnome.eog.desktop"; "image/x-bmp" = "org.gnome.eog.desktop"; "image/x-gray" = "org.gnome.eog.desktop"; "image/x-icb" = "org.gnome.eog.desktop"; "image/x-ico" = "org.gnome.eog.desktop"; "image/x-png" = "org.gnome.eog.desktop"; "image/x-portable-anymap" = "org.gnome.eog.desktop"; "image/x-portable-bitmap" = "org.gnome.eog.desktop"; "image/x-portable-graymap" = "org.gnome.eog.desktop"; "image/x-portable-pixmap" = "org.gnome.eog.desktop"; "image/x-xbitmap" = "org.gnome.eog.desktop"; "image/x-xpixmap" = "org.gnome.eog.desktop"; "image/x-pcx" = "org.gnome.eog.desktop"; "image/svg+xml" = "org.gnome.eog.desktop"; "image/svg+xml-compressed" = "org.gnome.eog.desktop"; "image/vnd.wap.wbmp" = "org.gnome.eog.desktop"; "image/x-icns" = "org.gnome.eog.desktop"; "video/*" = "org.gnome.Totem.desktop"; "text/html" = browser; "x-scheme-handler/http" = browser; "x-scheme-handler/https" = browser; "x-scheme-handler/about" = browser; "x-scheme-handler/mailto" = "org.gnome.Geary.desktop"; "application/zip" = "org.gnome.FileRoller.desktop"; "application/rar" = "org.gnome.FileRoller.desktop"; "application/7z" = "org.gnome.FileRoller.desktop"; "application/*tar" = "org.gnome.FileRoller.desktop"; "x-scheme-handler/sms" = "org.gnome.Shell.Extensions.GSConnect.desktop"; "x-scheme-handler/tel" = "org.gnome.Shell.Extensions.GSConnect.desktop"; }; in { enable = true; associations.added = apps; defaultApplications = apps; }; dconf.settings = with lib.hm.gvariant; { "org/gnome/shell/extensions/forge" = { stacked-tiling-mode-enabled = false; tabbed-tiling-mode-enabled = false; # I want this `true` but it screws up on multi-monitor setups window-gap-hidden-on-single = false; }; "org/gnome/shell/extensions/forge/keybindings" = { window-focus-down = ["j" "Down"]; window-focus-left = ["h" "Left"]; window-focus-right = ["l" "Right"]; window-focus-up = ["k" "Up"]; window-move-down = ["j" "Down"]; window-move-left = ["h" "Left"]; window-move-right = ["l" "Right"]; window-move-up = ["k" "Up"]; window-swap-down = ["j" "Down"]; window-swap-left = ["h" "Left"]; window-swap-right = ["l" "Right"]; window-swap-up = ["k" "Up"]; }; "org/gnome/desktop/interface" = { color-scheme = "prefer-dark"; enable-hot-corners = !cfg.tiling; show-battery-percentage = true; }; "org/gnome/shell/extensions/improved-workspace-indicator" = { panel-position = "left"; }; "org/gnome/shell/extensions/vitals" = { hide-zeros = true; show-battery = true; update-time = 10; }; "org/gnome/shell/extensions/appindicator" = { icon-opacity = 255; tray-pos = "center"; }; "org/gnome/shell/extensions/user-theme" = { name = if config.ezcolors.enable then "Generated" else "Default"; }; "org/gnome/shell/extensions/just-perfection" = { # activities-button = !cfg.tiling; # conflicts with unite? startup-status = 0; workspace-popup = false; window-picker-icon = false; animation = 3; dash = !cfg.tiling; double-super-to-appgrid = true; }; "org/gnome/shell" = { disable-user-extensions = false; disabled-extensions = [""]; enabled-extensions = [ "rrc@ogarcia.me" "native-window-placement@gnome-shell-extensions.gcampax.github.com" "user-theme@gnome-shell-extensions.gcampax.github.com" "improved-workspace-indicator@michaelaquilina.github.io" "Vitals@CoreCoding.com" "clipboard-indicator@tudmotu.com" "just-perfection-desktop@just-perfection" "appindicatorsupport@rgcjonas.gmail.com" "launch-new-instance@gnome-shell-extensions.gcampax.github.com" "unite@hardpixel.eu" "gamemode@christian.kellner.me" # "compiz-windows-effect@hermes83.github.com" "bluetooth-quick-connect@bjarosze.gmail.com" "gsconnect@andyholmes.github.io" # "desktop-cube@schneegans.github.com" "sound-output-device-chooser@kgshank.net" ] ++ (lib.optional cfg.tiling "forge@jmmaranan.com"); }; "org/gnome/desktop/peripherals/touchpad" = { natural-scroll = false; }; "org/gnome/mutter" = { edge-tiling = !cfg.tiling; dynamic-workspaces = !cfg.tiling; }; "org/gnome/shell/extensions/unite" = { hide-window-titlebars = if (cfg.tiling && !cfg.touch) then "always" else "both"; hide-activities-button = if (cfg.tiling || cfg.touch) then "never" else "always"; show-window-buttons = if cfg.tiling then "never" else "both"; notifications-position = "center"; restrict-to-primary-screen = false; show-legacy-tray = false; show-desktop-name = false; extend-left-box = false; hide-app-menu-icon = false; reduce-panel-spacing = false; hide-dropdown-arrows = true; }; "org/gnome/desktop/wm/preferences" = { focus-mode = if cfg.tiling then "sloppy" else "click"; resize-with-right-button = true; num-workspaces = 9; }; "org/gnome/maps" = { night-mode = true; transportation-type = "car"; }; "org/gnome/system/location" = { enabled = true; }; "org/gnome/desktop/wm/keybindings" = let workspaceAttrsList = lib.flatten (map (n: [ (lib.nameValuePair "move-to-workspace-${n}" ["${n}"]) (lib.nameValuePair "switch-to-workspace-${n}" ["${n}"]) ]) (map (n: toString n) (lib.range 1 9))); in lib.listToAttrs workspaceAttrsList // { minimize = ["comma"]; maximize = [""]; unmaximize = [""]; move-to-monitor-up = [""]; move-to-monitor-down = [""]; move-to-monitor-left = [""]; move-to-monitor-right = [""]; move-to-workspace-down = [""]; move-to-workspace-up = [""]; switch-to-workspace-down = ["Down" "j"]; switch-to-workspace-up = ["Up" "k"]; toggle-maximized = ["m"]; toggle-fullscreen = ["f"]; close = ["q"]; cycle-windows = [""]; panel-run-dialog = ["d"]; move-to-workspace-right = [""]; move-to-workspace-left = [""]; switch-to-workspace-right = [""]; switch-to-workspace-left = [""]; toggle-on-all-workspaces = ["a"]; # And deal with the remaining alt keys, screw alt keys cycle-windows-backward = [""]; activate-window-menu = [""]; cycle-panels = [""]; cycle-panels-backward = [""]; switch-panels = [""]; switch-panels-backward = [""]; switch-applications = ["Tab"]; switch-applications-backward = ["Tab"]; cycle-group = [""]; cycle-group-backward = [""]; switch-group = [""]; switch-group-backward = [""]; begin-resize = ["r"]; begin-move = [""]; }; "org/gnome/mutter/keybindings" = { toggle-tiled-left = [""]; toggle-tiled-right = [""]; }; "org/gnome/mutter/wayland/keybindings" = { restore-shortcuts = [""]; }; "org/gnome/shell/keybindings" = lib.listToAttrs (map (n: lib.nameValuePair "switch-to-application-${toString n}" [""]) (lib.range 1 9)) // { toggle-application-view = [""]; open-application-menu = [""]; toggle-message-tray = ["v"]; toggle-overview = [""]; }; "org/gnome/settings-daemon/plugins/media-keys" = { play = ["backslash"]; next = ["bracketright"]; previous = ["bracketleft"]; volume-down = ["minus"]; volume-up = ["equal"]; screensaver = ["Escape"]; home = [""]; email = ["e"]; www = ["b"]; rotate-video-lock-static = [""]; screenshot-clip = ["Print"]; custom-keybindings = ["/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/"]; }; "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = { binding = "t"; command = "kermit"; name = "Kermit terminal"; }; }; }; }