diff --git a/common.nix b/common.nix index 836a15e..43dd72b 100644 --- a/common.nix +++ b/common.nix @@ -31,29 +31,29 @@ with builtins; home.sessionVariables.TZ = nixosConfig.time.timeZone; }; - #services.xserver = { - #enable = true; + services.xserver = { + enable = true; - #desktopManager = { - #xterm.enable = false; - #}; + desktopManager = { + xterm.enable = false; + }; - #displayManager = { - #defaultSession = "none+i3"; - #gdm.enable = true; - #}; + displayManager = { + defaultSession = "none+i3"; + gdm.enable = true; + }; - #windowManager.i3 = { - #enable = true; - #package = pkgs.i3-gaps; - #extraPackages = with pkgs; [ - ## gnome.gdm i3lock-fancy rofi rofimoji volumeicon feh xorg.xinput dunst - ## arandr lxappearance gruvbox-dark-gtk gruvbox-dark-icons-gtk - ## gruvterial-theme flameshot tesseract5 imagemagick xclip polybar kitty - ## xkeysnail gtk-engine-murrine playerctl xmacro - #]; - #}; - #}; + windowManager.i3 = { + enable = true; + package = pkgs.i3-gaps; + extraPackages = with pkgs; [ + gnome.gdm i3lock-fancy rofi rofimoji volumeicon feh xorg.xinput dunst + arandr lxappearance gruvbox-dark-gtk gruvbox-dark-icons-gtk + gruvterial-theme flameshot tesseract5 imagemagick xclip polybar kitty + xkeysnail gtk-engine-murrine playerctl xmacro + ]; + }; + }; programs.dconf.enable = true; qt5.platformTheme = "qt5ct"; diff --git a/modules/desktop.nix b/modules/desktop.nix index f006d03..42ece83 100644 --- a/modules/desktop.nix +++ b/modules/desktop.nix @@ -2,6 +2,7 @@ let cfg = config.jade.desktop; + # Screenshot scripts {{{ window-screenshot = pkgs.writeShellScriptBin "window-screenshot.sh" '' unset x y w h eval $(xwininfo -id $(xdotool getactivewindow) | @@ -12,19 +13,77 @@ let echo -n "''$x ''$y ''$w ''$h" flameshot gui --region "''${w}x''${h}+''${x}+''${y}" -c -p ~/Pictures/screenshots/ ''; + # }}} + # Desktop ctl {{{ + desktop-ctl = pkgs.writeShellScriptBin "desktop-ctl.sh" '' + items="lock screen;log out;toggle picom;shut down;reboot;update all" + + selection=$(echo $items | rofi -sep ";" -dmenu) + + case $selection in + "lock screen") + i3lock-fancy + ;; + "log out") + pkill i3 + ;; + "toggle picom") + pkill picom || picom --experimental-backend -b + ;; + "shut down") + shutdown now + ;; + "reboot") + systemctl reboot + ;; + esac + ''; + # }}} + # Macro scripts {{{ + em-record = pkgs.writeShellScriptBin "em-record.sh" '' + register=$(ls $HOME/xmacros | rofi -dmenu) + count=$(echo "2;5;10;20;50;100" | rofi -dmenu -sep ";" -l 5) + + for i in $(seq $count); do + echo $i + xmacroplay "$DISPLAY" < $HOME/xmacros/$register + done + register=$(ls $HOME/xmacros | rofi -dmenu) + + xmacrorec2 > $HOME/xmacros/$register + ''; + em-play = pkgs.writeShellScriptBin "em-play.sh" '' + register=$(ls $HOME/xmacros | rofi -dmenu) + + xmacroplay "$DISPLAY" < $HOME/xmacros/$register + ''; + em-play-loop = pkgs.writeShellScriptBin "em-play-loop.sh" '' + register=$(ls $HOME/xmacros | rofi -dmenu) + count=$(echo "2;5;10;20;50;100" | rofi -dmenu -sep ";" -l 5) + + for i in $(seq $count); do + echo $i + xmacroplay "$DISPLAY" < $HOME/xmacros/$register + done + ''; + # }}} in with lib; { options.jade.desktop = { enable = mkEnableOption "Enable the i3 setup"; + compositing = mkEnableOption "Enable compositing via picom"; }; config = mkIf cfg.enable { home-manager.users.jade = { pkgs, ... }: { home.packages = with pkgs; [ - gnome.gdm i3lock-fancy rofi rofimoji volumeicon feh xorg.xinput dunst + # external + i3lock-fancy rofi rofimoji volumeicon feh xorg.xinput dunst arandr lxappearance gruvbox-dark-gtk gruvbox-dark-icons-gtk gruvterial-theme flameshot tesseract5 imagemagick xclip polybar kitty xkeysnail gtk-engine-murrine playerctl xmacro - window-screenshot + # custom scripts + window-screenshot desktop-ctl em-record em-play em-play-loop ]; + # i3 {{{ xsession = { enable = true; windowManager.i3 = { @@ -32,17 +91,31 @@ in with lib; { package = pkgs.i3-gaps; config = { terminal = "kitty"; - modifier = "Mod4"; - gaps = { - inner = 15; - outer = 0; - smartGaps = true; + workspaceAutoBackAndForth = true; + # Startup {{{ + startup = [ + # Keyboard remapping + { command = "xhost +"; } + { command = "xkeysnail ${../other/xkeysnail.py}"; always = true; } + { command = "sleep 4 && setxkbmap -layout us -variant altgr-intl"; always = true; } + { command = "feh --bg-scale ${../other/wallpaper.jpg}"; always = true; notification = false; } + { command = "picom --experimental-backend"; } + ]; + # }}} + # Assigns {{{ + assigns = { + "1" = [ { class = "discord"; } { class = "nheko"; } ]; + "2" = [ { class = "librewolf"; } ]; }; + # }}} + # Keyboard shortcuts {{{ + modifier = "Mod4"; modes = { resize = with { - aaa = builtins.trace "foo" "bar"; - mod = builtins.trace config config.xsession.windowManager.i3.config.modifier; + # mod = builtins.break config.xsession.windowManager.i3.config.modifier; + mod = builtins.break "Mod4"; }; { + aaa = builtins.break "a"; "${mod}+h" = "resize shrink width 10 px or 10 ppt"; "${mod}+j" = "resize grow height 10 px or 10 ppt"; "${mod}+k" = "resize shrink height 10 px or 10 ppt"; @@ -54,8 +127,9 @@ in with lib; { }; }; keybindings = with { - mod = config.xsession.windowManager.i3.config.modifier; - }; { + #mod = config.xsession.windowManager.i3.config.modifier; + mod = "Mod4"; + }; lib.mkOptionDefault { # switch window focus "${mod}+h" = "focus left"; "${mod}+j" = "focus down"; @@ -76,12 +150,113 @@ in with lib; { # focus parents/children "${mod}+Shift+a" = "focus parent"; "${mod}+c" = "focus child"; - # custom script shit + # screenshot "${mod}+w" = "exec window-screenshot.sh"; + # rofi fuckery + "${mod}+d" = "exec --no-startup-id rofi -show drun"; + "${mod}+space" = "exec --no-startup-id -show window"; + "${mod}+i" = "exec --no-startup-id rofimoji -f alchemical_symbols emojis braille_patterns box_drawing chess_symbols emoticons geometric_shapes gothic greek_extended math mathematical_alphanumeric_symbols mathematical_operators miscellaneous_symbols miscellaneous_mathematical_symbols-a miscellaneous_mathematical_symbols-b miscellaneous_symbols_and_arrows miscellaneous_symbols_and_pictographs miscellaneous_technical modi modifier_tone_letters musical_symbols nerd_font number_forms shorthand_format_controls specials variation_selectors vertical_forms -a copy"; + "${mod}+Shift+e" = "exec --no-startup-id desktop-ctl.sh"; + # rofi calculator, https://github.com/barbuk/menu-qalc + # "${mod}+m" = "exec --no-startup-id =" + + # audio + "XF86AudioRaiseVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status"; + "XF86AudioLowerVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status"; + "XF86AudioMute" = "exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status"; + "XF86AudioMicMute" = "exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status"; + + "XF86AudioNext" = "exec playerctl next"; + "XF86AudioPrev" = "exec playerctl previous"; + "XF86AudioPause" = "exec playerctl pause"; + "XF86AudioPlay" = "exec playerctl play"; + "XF86AudioStop" = "exec playerctl stop"; + + # macros + "${mod}+q" = "exec em-record.sh"; + "${mod}+p" = "exec em-play.sh"; + "${mod}+Shift+p" = "exec em-play-loop.sh"; }; + # }}} + # Visuals {{{ + fonts = { + names = [ "Montserrat" ]; + style = "Regular"; + size = 9.0; + }; + gaps = { + inner = 15; + outer = 0; + smartGaps = true; + }; + colors = { + background = "#1d2021"; + focused = { background = "#282828"; border = "#504945"; childBorder = "#7c6f64"; indicator = "#504945"; text = "#ebdbb2"; }; + focusedInactive = { background = "#1d2021"; border = "#504945"; childBorder = "#665c54"; indicator = "#664c54"; text = "#d5c4a1"; }; + placeholder = { background = "#1d2021"; border = "#00ff00"; childBorder = "#504945"; indicator = "#504945"; text = "#928374"; }; + unfocused = { background = "#1d2021"; border = "#3c3836"; childBorder = "#504945"; indicator = "#504945"; text = "#bdae93"; }; + urgent = { background = "#9d0006"; border = "#cc241d"; childBorder = "#3c3836"; indicator = "#fb4943"; text = "#ebdbb2"; }; + }; + window = { + border = 2; + titlebar = false; + }; + # }}} }; }; }; + # }}} + # Compositing {{{ + services.picom = mkIf config.jade.desktop.compositing { + enable = true; + experimentalBackends = true; + backend = "glx"; + + shadow = true; + shadowOffsets = [ 25 15 ]; + shadowOpacity = 0.045; + shadowExclude = [ + "class_g = 'Conky'" + "class_g ?= 'Notify-osd'" + "class_g = 'Cairo-clock'" + "_GTK_FRAME_EXTENTS@:c" + "class_g != 'Rofi'" + ]; + + vSync = true; + opacityRules = [ + "90:class_g = 'kitty'" + "80:class_g = 'Signal'" + "80:class_g = 'Rofi'" + "80:class_g = 'discord'" + "80:class_g = 'Mailspring'" + "85:class_g = 'nheko'" + "75:class_g = 'obsidian'" + ]; + settings = { + # blur + #"detect-client-opacity = true;" + #"blur-method = \"gaussian\"" + #"blur-size = 30" + #"blur-deviation = 15" + #"blur-background-fixed = true" + "detect-client-opacity" = true; + "blur-method" = "gaussian"; + "blur-size" = 30; + "blur-deviation" = 15; + "blur-background-fixed" = true; + + # fading rofi + "fading" = true; + "fade-in-step" = 0.25; + "fade-out-step" = 0.2; + "fade-delta" = 20; + "fade-exclude" = [ "class_g != 'Rofi'" ]; + # use damage information + "use-damage" = true; + }; + }; + # }}} }; }; } diff --git a/modules/template.nix b/modules/template.nix new file mode 100644 index 0000000..3633753 --- /dev/null +++ b/modules/template.nix @@ -0,0 +1,10 @@ +{ config, lib, pkgs, ... }: + +let cfg = config.jade.NAME; +in with lib; { + options.jade.NAME = { + enable = mkEnableOption "Enable the module"; + }; + config = mkIf cfg.enable { + }; +} diff --git a/monosodium-glutamate-g/configuration.nix b/monosodium-glutamate-g/configuration.nix index bd0d8b3..c04cd9a 100644 --- a/monosodium-glutamate-g/configuration.nix +++ b/monosodium-glutamate-g/configuration.nix @@ -11,6 +11,7 @@ jade = { desktop.enable = true; + desktop.compositing = true; }; # monitor control diff --git a/monosodium-glutamate-g/flake.lock b/monosodium-glutamate-g/flake.lock index 504fd67..6489036 100644 --- a/monosodium-glutamate-g/flake.lock +++ b/monosodium-glutamate-g/flake.lock @@ -6,11 +6,11 @@ "utils": "utils" }, "locked": { - "lastModified": 1659878744, - "narHash": "sha256-81a9Mx5pDMBGN4WnVhcQVkW5mXNTZOt8DZOSI8bVKpU=", + "lastModified": 1660252108, + "narHash": "sha256-fpY8X+eJmClJyVnMQJ7bpsNgn/CxPE9+UkkJ0FRIKQ8=", "owner": "nix-community", "repo": "home-manager", - "rev": "f5e9879e74e6202e2dbb3628fad2d20eac0d8be4", + "rev": "324fedcf9f1c475e2f522d03af029528e65969bc", "type": "github" }, "original": { @@ -37,11 +37,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1659327012, - "narHash": "sha256-zpdsLCH+cdx/K89QtzADNwwEzU/iJ9YT8UCVp3veLWQ=", + "lastModified": 1660275424, + "narHash": "sha256-OVjapp+VIt3a/qQm5oSwNuoDbvIRbMk8tbbzWJb2zVc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a54fb7fc4ce8a2973097851eabfdb068a19d2211", + "rev": "d977d658816cb84d3a38065846e3f2d7e96dccb2", "type": "github" }, "original": { diff --git a/other/wallpaper.jpg b/other/wallpaper.jpg new file mode 100644 index 0000000..7aea640 Binary files /dev/null and b/other/wallpaper.jpg differ diff --git a/other/xkeysnail.py b/other/xkeysnail.py new file mode 100644 index 0000000..f74803b --- /dev/null +++ b/other/xkeysnail.py @@ -0,0 +1,148 @@ +import re +from xkeysnail.transform import * + +# define timeout for multipurpose_modmap +define_timeout(1) + +# [Global modemap] Change modifier keys as in xmodmap +# define_modmap({ + # Key.CAPSLOCK: Key.RIGHT_CTRL +# }) + +# [Conditional modmap] Change modifier keys in certain applications +define_conditional_modmap(lambda wm_class, device_name: device_name.startswith("Apple") | device_name.startswith("Susanne"), { + Key.Y: Key.Z, + Key.Z: Key.Y, + # Key.GRAVE: Key.BACKSLASH, + # Key.BACKSLASH: Key.GRAVE +}) + +# [Multipurpose modmap] Give a key two meanings. A normal key when pressed and +# released, and a modifier key when held down with another key. See Xcape, +# Carabiner and caps2esc for ideas and concept. + # To use this example, you can't remap capslock with define_modmap. + +# [Conditional multipurpose modmap] Multipurpose modmap in certain conditions, +# such as for a particular device. +define_conditional_multipurpose_modmap(lambda wm_class, device_name: device_name.startswith("Apple") | device_name.startswith("Susanne"), { + # Enter is enter when pressed and released. Control when held down. + Key.ENTER: [Key.ENTER, Key.RIGHT_CTRL], + # Capslock is escape when pressed and released. Control when held down. + Key.CAPSLOCK: [Key.ESC, Key.RIGHT_CTRL], +}) + +define_keymap(re.compile("Firefox|Google-chrome|LibreWolf|Chromium"), { + K("C-M-k"): K("C-TAB"), + K("C-M-j"): K("C-Shift-TAB"), +}, "Firefox and Chrome") + +#basic emacs +define_keymap(lambda wm_class: wm_class not in ("Emacs", "konsole", "cool-retro-term", "kitty", "jetbrains-webstorm", "jetbrains-clion", "jetbrains-pycharm", "jetbrains-dataspell", "jetbrains-idea", "Gimp-2.10", "obsidian", "gw2-64.exe"), { + # Cursor + K("C-b"): with_mark(K("left")), + K("C-f"): with_mark(K("right")), + K("C-p"): with_mark(K("up")), + K("C-n"): with_mark(K("down")), + K("C-h"): with_mark(K("backspace")), + # Forward/Backward word + K("M-b"): with_mark(K("C-left")), + K("M-f"): with_mark(K("C-right")), + # Beginning/End of line + K("C-a"): with_mark(K("home")), + K("C-e"): with_mark(K("end")), + # Escape + K("C-q"): escape_next_key, + # Delete + K("C-d"): [K("delete"), set_mark(False)], + K("M-d"): [K("C-delete"), set_mark(False)], +}, "Basic emacs keys etc") + + +define_keymap(lambda wm_class: wm_class not in ("discord", "jetbrains-webstorm", "jetbrains-clion", "jetbrains-pycharm", "jetbrains-dataspell", "jetbrains-idea", "nheko", "Signal", "gw2-64.exe"), { + # Kill line + K("C-k"): [K("Shift-end"), K("C-x"), set_mark(False)], +}) + +# other emacs like +define_keymap(lambda wm_class: wm_class not in ("Emacs", "URxvt", "konsole", "cool-retro-term", "discord", "jetbrains-webstorm", "jetbrains-clion", "jetbrains-pycharm", "jetbrains-dataspell", "jetbrains-idea", "Gimp-2.10", "obsidian", "nheko", "Signal"), { + # Beginning/End of file + K("M-Shift-comma"): with_mark(K("C-home")), + K("M-Shift-dot"): with_mark(K("C-end")), +}, "Emacs-like keys") + +define_keymap(lambda wm_class: wm_class not in ("Emacs", "konsole", "cool-retro-term", "jetbrains-webstorm", "jetbrains-clion", "jetbrains-pycharm", "jetbrains-dataspell", "jetbrains-idea", "gw2-64.exe"), { + K("C-j"): K("F6") +}) + +define_keymap(re.compile("nheko"), { + K("M-j"): K("C-down"), + K("M-k"): K("C-up"), +}) + +define_keymap(re.compile("Signal"), { + K("C-k"): K("C-t"), + K("M-k"): K("M-up"), + K("M-j"): K("M-down"), +}) + +# discord mappings +define_keymap(re.compile("discord"), {# {{{ + # Tabs + K("C-TAB"): K("C-page_down"), + K("C-Shift-TAB"): K("C-page_up"), + # Navigate servers + K("M-Shift-j"): K("C-M-down"), + K("M-Shift-k"): K("C-M-up"), + # Navigate channels + K("M-j"): K("M-down"), + K("M-k"): K("M-up"), + # Navigate history + K("C-M-j"): K("M-left"), + K("C-M-k"): K("M-right"), + # Navigate unread channels + K("C-M-p"): K("M-Shift-up"), + K("C-M-n"): K("M-Shift-down"), + # Search + K("M-f"): K("C-f"), + # toggle last server and dms + K("M-t"): K("C-M-right"), + # start drag and drop + K("M-Shift-d"): K("C-d"), + # Call controls + K("M-c"): { + # Mute + K("m"): K("C-Shift-m"), + # Deafen + K("d"): K("C-Shift-d"), + # accept call + K("a"): K("C-enter"), + # decline + K("q"): K("esc"), + # current call + K("c"): K("C-M-Shift-V"), + # cancel + K("C-g"): pass_through_key, + }, + # Chat controls + K("M-l"): { + # Open pins popup + K("p"): K("C-p"), + # emoji picker + K("e"): K("C-e"), + # gif picker + K("g"): K("C-g"), + # sticker picker + K("s"): K("C-s"), + # upload file + K("u"): K("C-Shift-u"), + # inbox + K("i"): K("C-i"), + # new group + K("n"): K("C-Shift-t"), + # Oldest unread/newest message + K("C-p"): K("Shift-page_up"), + K("C-n"): K("Shift-page_down"), + # cancel + K("C-g"): pass_through_key, + } +})# }}}