diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 400e8bd..9aedaac 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,7 +33,8 @@ jobs: strategy: matrix: host: - - Satori + - Marisa + # - Satori steps: - uses: actions/checkout@v2.3.4 - uses: cachix/install-nix-action@v13 @@ -46,3 +47,24 @@ jobs: name: natto1784 authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' - run: nix build -L .#nixosConfigurations.${{ matrix.host }}.config.system.build.toplevel + home-manager: + name: build home-manager configurations + runs-on: ubuntu-latest + strategy: + matrix: + home: + - ottan + # - natto + steps: + - uses: actions/checkout@v2.3.4 + - uses: cachix/install-nix-action@v13 + with: + install_url: https://github.com/numtide/nix-flakes-installer/releases/download/nix-2.4pre20210429_d15a196/install + extra_nix_config: | + experimental-features = nix-command flakes + - uses: cachix/cachix-action@v10 + with: + name: natto1784 + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + - run: nix build -L .#hm-configs.${{ matrix.home }}.activationPackage + diff --git a/configs/emacs.el b/configs/emacs.el deleted file mode 100644 index d9d6199..0000000 --- a/configs/emacs.el +++ /dev/null @@ -1,45 +0,0 @@ -;;definitions -(defun install (a) (unless (package-installed-p a) (package-install a))) - - -;;settings -(global-display-line-numbers-mode 0) -(setq display-line-numbers-type 'relative) -(setq inhibit-startup-screen t) -(scroll-bar-mode 0) -(tool-bar-mode 0) -(menu-bar-mode 0) -;;(fringe-mode 0) -(set-face-attribute 'default nil :font "Fira Mono for Powerline" :height 120) -;;(set-face-background 'line-number-current-line nil :background t) - - -;;packages -(require 'package) -(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) -(package-initialize) - -(install 'use-package) -(setq use-package-always-ensure t) -(require 'use-package) - -;;install shit -(use-package elcord - :config - (elcord-mode 1)) -(use-package gruvbox-theme - :config - (load-theme 'gruvbox-dark-hard t)) -(use-package ivy - :bind (:map ivy-minibuffer-map - ("C-n" . ivy-next-line) - ("C-e" . ivy-previous-line) - ("C-i" . ivy-done)) - :config - (ivy-mode 1)) - -;;keybinds -;;ivy -;(define-key ivy-minibuffer-map (kbd "C-n") 'ivy-next-line) -;(define-key ivy-minibuffer-map (kbd "C-e") 'ivy-previous-line) -;(define-key ivy-minibuffer-map (kbd "C-i") 'ivy-done) diff --git a/flake.lock b/flake.lock index 20a6a22..9f30abe 100644 --- a/flake.lock +++ b/flake.lock @@ -19,21 +19,6 @@ "type": "github" } }, - "emacs": { - "locked": { - "lastModified": 1621045111, - "narHash": "sha256-W76OW/gjCJQRV49PC5++vHucI0w3LmxELfvbjX6xM7c=", - "owner": "nix-community", - "repo": "emacs-overlay", - "rev": "7639cddd28b8ac0c9b5427f5e13c775534170428", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "emacs-overlay", - "type": "github" - } - }, "flake-utils": { "locked": { "lastModified": 1600209923, @@ -117,7 +102,6 @@ "root": { "inputs": { "agenix": "agenix", - "emacs": "emacs", "home-manager": "home-manager", "nixpkgs": "nixpkgs_2", "nur": "nur", diff --git a/flake.nix b/flake.nix index 451bb96..8608d7b 100644 --- a/flake.nix +++ b/flake.nix @@ -11,27 +11,27 @@ inputs.nixpkgs.follows = "nixpkgs"; }; agenix.url = github:ryantm/agenix; - emacs = { - url = github:nix-community/emacs-overlay; - inputs.nixpkgs.follows = "nixpkgs"; - }; utils.url = github:numtide/flake-utils; }; outputs = inputs@{self, nixpkgs, ... }: - inputs.utils.lib.eachDefaultSystem (system: { - packages = import nixpkgs { - inherit system; - overlays = self.overlays ++ [ inputs.nur.overlay inputs.emacs.overlay ]; - config.allowUnfree = true; - }; - }) // - ( - { + inputs.utils.lib.eachDefaultSystem (system: + let overlays = [ (import ./overlays/overridesandshit.nix) (import ./overlays/packages.nix) ]; + in + { + packages = import nixpkgs { + inherit system; + overlays = overlays ++ [ inputs.nur.overlay ]; + config.allowUnfree = true; + config.allowBroken = true; + }; + }) // + ( + { hm-configs = { natto = inputs.home-manager.lib.homeManagerConfiguration { system = "x86_64-linux"; @@ -41,20 +41,47 @@ ]; nixpkgs.overlays = self.packages.x86_64-linux.overlays; nixpkgs.config.allowUnfree = true; + nixpkgs.config.allowBroken = true; }; homeDirectory = "/home/natto"; username = "natto"; }; + ottan = inputs.home-manager.lib.homeManagerConfiguration { + system = "aarch64-linux"; + configuration = { lib, ... }: { + imports = [ + ./home/ottan.nix + ]; + nixpkgs.overlays = self.packages.aarch64-linux.overlays; + }; + homeDirectory = "/home/ottan"; + username = "ottan"; + }; + }; - nixosConfigurations.Satori = nixpkgs.lib.nixosSystem { - system = "x86_64-linux"; - modules = [ - ./satori.nix - inputs.agenix.nixosModules.age - inputs.home-manager.nixosModules.home-manager - { nixpkgs.pkgs = self.packages.x86_64-linux; } - ]; + nixosConfigurations = { + Satori = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + ./satori.nix + inputs.agenix.nixosModules.age + inputs.home-manager.nixosModules.home-manager + { + nixpkgs.pkgs = self.packages.x86_64-linux; + } + ]; + }; + Marisa = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + modules = [ + ./marisa.nix + inputs.home-manager.nixosModules.home-manager + { + nixpkgs.pkgs = self.packages.aarch64-linux; + } + ]; + }; }; }); } diff --git a/home/config/emacs/gruvbox-el.patch b/home/config/emacs/gruvbox-el.patch new file mode 100644 index 0000000..65dcf1a --- /dev/null +++ b/home/config/emacs/gruvbox-el.patch @@ -0,0 +1,19 @@ +--- a/gruvbox.el 2021-05-17 21:19:07.731014155 +0530 ++++ b/gruvbox.el 2021-05-17 21:20:11.297990471 +0530 +@@ -162,11 +162,11 @@ + + + ;; line numbers +- (line-number (:foreground gruvbox-dark4 :background gruvbox-dark1)) +- (line-number-current-line (:foreground gruvbox-bright_orange :background gruvbox-dark2)) +- (linum (:foreground gruvbox-dark4 :background gruvbox-dark1)) +- (linum-highlight-face (:foreground gruvbox-bright_orange :background gruvbox-dark2)) +- (linum-relative-current-face (:foreground gruvbox-bright_orange :background gruvbox-dark2)) ++ (line-number (:foreground gruvbox-dark4 :background nil)) ++ (line-number-current-line (:foreground gruvbox-bright_orange :background gruvbox-dark1)) ++ (linum (:foreground gruvbox-dark4 :background nil)) ++ (linum-highlight-face (:foreground gruvbox-bright_orange :background gruvbox-dark1)) ++ (linum-relative-current-face (:foreground gruvbox-bright_orange :background gruvbox-dark1)) + + ;; Highlight indentation mode + (highlight-indentation-current-column-face (:background gruvbox-dark2)) diff --git a/home/config/emacs/init.el b/home/config/emacs/init.el new file mode 100644 index 0000000..8ccaaff --- /dev/null +++ b/home/config/emacs/init.el @@ -0,0 +1,45 @@ +;;settings +(setq display-line-numbers-type 'relative) +(setq inhibit-startup-screen t) +(set-face-attribute 'default nil :font "Fira Mono for Powerline" :height 120) + + + +;;add packages and shit +(require 'package) +(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) +(package-initialize) +(setq pkgs '(ivy gruvbox-theme elcord rainbow-delimiters)) +(while pkgs + (require (car pkgs)) + (setq pkgs (cdr pkgs))) + + +;;package config and modes +(global-hl-line-mode 1) +(scroll-bar-mode 0) +(tool-bar-mode 0) +(menu-bar-mode 0) +(fringe-mode 0) +(global-display-line-numbers-mode 1) +(load-theme 'gruvbox-dark-hard t) +(ivy-mode 1) +(elcord-mode 1) + + +;;keybinds +;ivy +(define-key ivy-minibuffer-map (kbd "C-n") 'ivy-next-line) +(define-key ivy-minibuffer-map (kbd "C-e") 'ivy-previous-line) +(define-key ivy-minibuffer-map (kbd "C-i") 'ivy-done) + + +;;hooks +;exclude line numbers +(setq exclude-ln '(term-mode-hook eshell-mode-hook shell-mode-hook)) +(while exclude-ln + (add-hook (car exclude-ln) (lambda () (display-line-numbers-mode 0))) + (setq exclude-ln (cdr exclude-ln))) + +;rainbow delims +(add-hook 'prog-mode-hook 'rainbow-delimiters-mode) diff --git a/home/config/nvim/init.vim b/home/config/nvim/init.vim index 2e2305d..c410fca 100644 --- a/home/config/nvim/init.vim +++ b/home/config/nvim/init.vim @@ -25,11 +25,13 @@ set autoindent set number set relativenumber set background=dark +syntax sync minlines=100 set showtabline=2 set noshowmode set nobackup set nowritebackup set updatetime=300 +set lazyredraw set timeoutlen=100 set formatoptions-=cro set clipboard=unnamedplus diff --git a/home/ottan.nix b/home/ottan.nix new file mode 100644 index 0000000..ff8256a --- /dev/null +++ b/home/ottan.nix @@ -0,0 +1,27 @@ +{config, pkgs, lib, ...}: +let + home = config.home.homeDirectory; +in +{ + imports = [ + ./stuff/programs/nvim.nix + ./stuff/programs/emacs.nix + ]; + home = { + packages = with pkgs; [ + pamixer + customscripts + curl + ]; + file = { + dwm-autostart = { + source = ./config/dwm/autostart.sh; + target = "${home}/.dwm/autostart.sh"; + }; + dwm-status = { + source = ./config/dwm/bruhstatus.sh; + target = "${home}/.dwm/bruhstatus.sh"; + }; + }; + }; +} diff --git a/home/secrets/fish_variables.age b/home/secrets/fish_variables.age index 4bb1902..b2aa3cd 100644 Binary files a/home/secrets/fish_variables.age and b/home/secrets/fish_variables.age differ diff --git a/home/stuff/programs.nix b/home/stuff/programs.nix index 3961821..48221c0 100644 --- a/home/stuff/programs.nix +++ b/home/stuff/programs.nix @@ -3,6 +3,7 @@ imports = [ ./programs/nvim.nix ./programs/ncmpcpp.nix + ./programs/emacs.nix ]; programs = { firefox = { @@ -31,8 +32,5 @@ save-position-on-quit = "yes"; }; }; - emacs = { - enable = true; - }; }; } diff --git a/home/stuff/programs/emacs.nix b/home/stuff/programs/emacs.nix new file mode 100644 index 0000000..6bc81fc --- /dev/null +++ b/home/stuff/programs/emacs.nix @@ -0,0 +1,21 @@ +{ pkgs, config, ... }: +{ + programs.emacs = { + enable = true; + extraPackages = epkgs: with epkgs; [ + elcord + gruvbox-theme + ivy + rainbow-delimiters + ]; + overrides = self: super: { + gruvbox-theme = self.melpaPackages.gruvbox-theme.overrideAttrs(_: { + patches = [ ../../config/emacs/gruvbox-el.patch ]; + }); + }; + }; + home.file.emacs = { + source = ../../config/emacs/init.el; + target = "${config.home.homeDirectory}/.emacs.d/init.el"; + }; +} diff --git a/home/stuff/programs/nvim.nix b/home/stuff/programs/nvim.nix index 19deaaa..02b9e9d 100644 --- a/home/stuff/programs/nvim.nix +++ b/home/stuff/programs/nvim.nix @@ -13,7 +13,7 @@ let let g:floaterm_width=0.8 let g:floaterm_height=0.8 let g:floaterm_wintitle=0 - let g:floaterm_shell="/usr/bin/env fish" + let g:floaterm_shell="/usr/bin/env zsh" ''; plugin = pkgs.vimPlugins.vim-floaterm; }; @@ -60,10 +60,10 @@ in { programs.neovim = { enable = true; - vimAlias = true; + vimAlias = false; viAlias = false; - # withNodeJs = true; - # withPython = true; + withNodeJs = false; + withPython = false; extraConfig = '' let g:gruvbox_italic=1 let g:gruvbox_contrast_dark="hard" @@ -75,7 +75,7 @@ in builtins.readFile ../../config/nvim/utils.vim; plugins = with plugs; [ auto-pairs - #nvim-colorizer + # nvim-colorizer floaterm vim-rooter nerdcommenter diff --git a/marisa.nix b/marisa.nix new file mode 100644 index 0000000..8dcc5a2 --- /dev/null +++ b/marisa.nix @@ -0,0 +1,13 @@ +{lib, config, ...}: +{ + imports = + [ + ./modules/xorg.nix + ./modules/pipewire.nix + ./marisa/pkgs.nix + ./marisa/networking.nix + ./marisa/stuff.nix + ./satori/hardware.nix + ]; + boot.loader.grub.enable = false; +} diff --git a/marisa/networking.nix b/marisa/networking.nix new file mode 100644 index 0000000..3af125c --- /dev/null +++ b/marisa/networking.nix @@ -0,0 +1,18 @@ +{config, ...}: +{ + networking = { + hostName = "Marisa"; + wireless.enable = true; + interfaces = { + wlan0 = { + useDHCP = false; + ipv4.addresses = [ { + prefixLength = 24; + address = "192.168.0.159"; + } ]; + }; + }; + defaultGateway = "192.168.0.1"; + nameservers = [ "1.1.1.1" "8.8.8.8" ]; + }; +} diff --git a/marisa/pkgs.nix b/marisa/pkgs.nix new file mode 100644 index 0000000..912adb0 --- /dev/null +++ b/marisa/pkgs.nix @@ -0,0 +1,42 @@ +{lib, config, pkgs, ...}: +{ + environment.systemPackages = with pkgs; [ + xclip + xorg.xkbcomp + p7zip + git + gnumake + neofetch + htop + feh + st + dwm + vim + wget + ]; + programs = { + zsh = { + enable = true; + promptInit = "PROMPT='%F{cyan}%~ %F{blue}>%f '\nRPROMPT='%F{cyan}%n%f@%F{red}%m'"; + histSize = 12000; + enableCompletion = true; + syntaxHighlighting.enable = true; + autosuggestions. enable = true; + ohMyZsh.enable = true; + }; + gnupg = { + agent = { + enableSSHSupport = true; + enable = true; + pinentryFlavor = "curses"; + }; + }; + }; + nix = { + package = pkgs.nixUnstable; + extraOptions = '' + experimental-features = nix-command ca-references flakes + ''; + trustedUsers = [ "root" "ottan" ]; + }; +} diff --git a/marisa/stuff.nix b/marisa/stuff.nix new file mode 100644 index 0000000..780369f --- /dev/null +++ b/marisa/stuff.nix @@ -0,0 +1,31 @@ +{config, pkgs, ...}: +{ + time.timeZone = "Asia/Kolkata"; + environment = { + sessionVariables = { + EDITOR = "vim"; + }; + }; + security = { + sudo.enable = false; + doas = { + enable = true; + extraRules = [ + { + users = [ "ottan" ]; + keepEnv = true; + persist = true; + } + ]; + }; + }; + fonts.fonts = with pkgs; [ + fira-mono + ]; + users.users.ottan = { + isNormalUser = true; + shell = pkgs.zsh; + home = "/home/ottan"; + extraGroups = [ "wheel" ]; + }; +} diff --git a/overlays/customscripts/src/mpdp b/overlays/customscripts/src/mpdp index 192f720..6dbf450 100644 --- a/overlays/customscripts/src/mpdp +++ b/overlays/customscripts/src/mpdp @@ -1,5 +1,5 @@ #!/usr/bin/env sh -systemctl start mpd.service --user -#systemctl start mpd.socket --user +#systemctl start mpd.service --user +systemctl start mpd.socket --user mpdas & mpd_discord_richpresence & diff --git a/overlays/overridesandshit.nix b/overlays/overridesandshit.nix index 43ffe1b..14bbb1c 100644 --- a/overlays/overridesandshit.nix +++ b/overlays/overridesandshit.nix @@ -2,7 +2,6 @@ final: prev: { dmenu = prev.dmenu.overrideAttrs (oldAttrs: rec { configFile = prev.writeText "config.def.h" (builtins.readFile ./dmenu/config.def.h); - postPatch = "${oldAttrs.postPatch}\n cp ${configFile} config.def.h"; }); ncmpcpp = prev.ncmpcpp.override { @@ -26,6 +25,8 @@ final: prev: { rev = "0cd1e394e6d07c5f605ae23070c40de9690bafb1"; sha256 = "sha256-EY5Amz16Drc4i0uEAYTPEHcGex0s3pzHDqfDp4Z5OGY="; }; + # patch = prev.writeText "st.patch" (builtins.readFile ./st.patch); + # patchPhase = "patch -t < ${patch}"; }); kbd = prev.kbd.overrideAttrs (oldAttrs: rec{ diff --git a/overlays/st.patch b/overlays/st.patch new file mode 100755 index 0000000..e23078d --- /dev/null +++ b/overlays/st.patch @@ -0,0 +1,1136 @@ +diff '--color=auto' -u a/config.def.h b/config.def.h +--- a/config.def.h 2021-05-18 08:15:14.270294000 +0530 ++++ b/config.def.h 2021-05-18 07:53:37.126991600 +0530 +@@ -3,9 +3,8 @@ + /* + * appearance + * +- * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +-static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; ++static char *font = "Fira Mono:style=Regular:pixelsize=16"; + static int borderpx = 2; + + /* +@@ -16,7 +15,7 @@ + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +-static char *shell = "/bin/sh"; ++static char *shell = "/usr/bin/env fish"; + char *utmp = NULL; + /* scroll program: to enable use a string like "scroll" */ + char *scroll = NULL; +@@ -95,42 +94,37 @@ + + /* Terminal colors (16 first used in escape sequence) */ + static const char *colorname[] = { +- /* 8 normal colors */ +- "black", +- "red3", +- "green3", +- "yellow3", +- "blue2", +- "magenta3", +- "cyan3", +- "gray90", +- +- /* 8 bright colors */ +- "gray50", +- "red", +- "green", +- "yellow", +- "#5c5cff", +- "magenta", +- "cyan", +- "white", +- +- [255] = 0, +- +- /* more colors can be added after 255 to use with DefaultXX */ +- "#cccccc", +- "#555555", +-}; +- + ++ [0] = "#1d2021", ++ [1] = "#cc241d", /* red */ ++ [2] = "#98971a", /* green */ ++ [3] = "#d79921", /* yellow */ ++ [4] = "#458588", /* blue */ ++ [5] = "#b16286", /* magenta */ ++ [6] = "#689d6a", /* cyan */ ++ [7] = "#a89984", /* white */ ++ ++ [8] = "#928374", /* black */ ++ [9] = "#fb4934", /* red */ ++ [10] = "#b8bb26", /* green */ ++ [11] = "#fabd2f", /* yellow */ ++ [12] = "#83a598", /* blue */ ++ [13] = "#d3869b", /* magenta */ ++ [14] = "#8ec07c", /* cyan */ ++ [15] = "#ebdbb2", /* white */ ++ ++ /* bg and fg */ ++ [256] = "#1d2021", ++ [257] = "#d5c4a1", ++}; + /* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +-unsigned int defaultfg = 7; +-unsigned int defaultbg = 0; +-static unsigned int defaultcs = 256; +-static unsigned int defaultrcs = 257; ++unsigned int defaultfg = 257; ++unsigned int defaultbg = 256; ++static unsigned int defaultcs = 257; ++static unsigned int defaultrcs = 256; + + /* + * Default shape of cursor +@@ -154,7 +148,6 @@ + static unsigned int mouseshape = XC_xterm; + static unsigned int mousefg = 7; + static unsigned int mousebg = 0; +- + /* + * Color used to display font attributes when fontconfig selected a font which + * doesn't match the ones requested. +@@ -173,32 +166,36 @@ + * Beware that overloading Button1 will disable the selection. + */ + static MouseShortcut mshortcuts[] = { +- /* mask button function argument release */ +- { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, +- { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, +- { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, +- { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, +- { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, ++ /* mask button function argument release */ ++ {XK_ANY_MOD, Button4, kscrollup, {.i = 1}}, ++ {XK_ANY_MOD, Button5, kscrolldown, {.i = 1}}, ++ {XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1}, ++ {ShiftMask, Button4, ttysend, {.s = "\033[5;2~"}}, ++ {XK_ANY_MOD, Button4, ttysend, {.s = "\031"}}, ++ {ShiftMask, Button5, ttysend, {.s = "\033[6;2~"}}, ++ {XK_ANY_MOD, Button5, ttysend, {.s = "\005"}}, + }; + + /* Internal keyboard shortcuts. */ + #define MODKEY Mod1Mask +-#define TERMMOD (ControlMask|ShiftMask) ++#define TERMMOD (ControlMask | ShiftMask) + + static Shortcut shortcuts[] = { +- /* mask keysym function argument */ +- { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, +- { ControlMask, XK_Print, toggleprinter, {.i = 0} }, +- { ShiftMask, XK_Print, printscreen, {.i = 0} }, +- { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, +- { TERMMOD, XK_Prior, zoom, {.f = +1} }, +- { TERMMOD, XK_Next, zoom, {.f = -1} }, +- { TERMMOD, XK_Home, zoomreset, {.f = 0} }, +- { TERMMOD, XK_C, clipcopy, {.i = 0} }, +- { TERMMOD, XK_V, clippaste, {.i = 0} }, +- { TERMMOD, XK_Y, selpaste, {.i = 0} }, +- { ShiftMask, XK_Insert, selpaste, {.i = 0} }, +- { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ /* mask keysym function argument */ ++ {XK_ANY_MOD, XK_Break, sendbreak, {.i = 0}}, ++ {ControlMask, XK_Print, toggleprinter, {.i = 0}}, ++ {ShiftMask, XK_Print, printscreen, {.i = 0}}, ++ {XK_ANY_MOD, XK_Print, printsel, {.i = 0}}, ++ {ShiftMask, XK_Prior, zoom, {.f = +1}}, ++ {ShiftMask, XK_Next, zoom, {.f = -1}}, ++ {TERMMOD, XK_Home, zoomreset, {.f = 0}}, ++ {TERMMOD, XK_C, clipcopy, {.i = 0}}, ++ {TERMMOD, XK_V, clippaste, {.i = 0}}, ++ {TERMMOD, XK_Y, selpaste, {.i = 0}}, ++ {ShiftMask, XK_Insert, selpaste, {.i = 0}}, ++ {TERMMOD, XK_Num_Lock, numlock, {.i = 0}}, ++ {XK_ANY_MOD, XK_Page_Up, kscrollup, {.i = -1}}, ++ {XK_ANY_MOD, XK_Page_Down, kscrolldown, {.i = -1}}, + }; + + /* +@@ -226,229 +223,229 @@ + * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) + * to be mapped below, add them to this array. + */ +-static KeySym mappedkeys[] = { -1 }; ++static KeySym mappedkeys[] = {-1}; + + /* + * State bits to ignore when matching key or button events. By default, + * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. + */ +-static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; ++static uint ignoremod = Mod2Mask | XK_SWITCH_MOD; + + /* + * This is the huge key array which defines all compatibility to the Linux + * world. Please decide about changes wisely. + */ + static Key key[] = { +- /* keysym mask string appkey appcursor */ +- { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, +- { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, +- { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, +- { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, +- { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, +- { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, +- { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, +- { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, +- { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, +- { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, +- { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, +- { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, +- { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, +- { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, +- { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, +- { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, +- { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, +- { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, +- { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, +- { XK_KP_End, ControlMask, "\033[J", -1, 0}, +- { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, +- { XK_KP_End, ShiftMask, "\033[K", -1, 0}, +- { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, +- { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, +- { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, +- { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, +- { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, +- { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, +- { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, +- { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, +- { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, +- { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, +- { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, +- { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, +- { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, +- { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, +- { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, +- { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, +- { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, +- { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, +- { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, +- { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, +- { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, +- { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, +- { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, +- { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, +- { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, +- { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, +- { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, +- { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, +- { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, +- { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, +- { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, +- { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, +- { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, +- { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, +- { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, +- { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, +- { XK_Up, ControlMask, "\033[1;5A", 0, 0}, +- { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, +- { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, +- { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, +- { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, +- { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, +- { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, +- { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, +- { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, +- { XK_Down, ControlMask, "\033[1;5B", 0, 0}, +- { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, +- { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, +- { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, +- { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, +- { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, +- { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, +- { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, +- { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, +- { XK_Left, ControlMask, "\033[1;5D", 0, 0}, +- { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, +- { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, +- { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, +- { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, +- { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, +- { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, +- { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, +- { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, +- { XK_Right, ControlMask, "\033[1;5C", 0, 0}, +- { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, +- { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, +- { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, +- { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, +- { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, +- { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, +- { XK_Return, Mod1Mask, "\033\r", 0, 0}, +- { XK_Return, XK_ANY_MOD, "\r", 0, 0}, +- { XK_Insert, ShiftMask, "\033[4l", -1, 0}, +- { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, +- { XK_Insert, ControlMask, "\033[L", -1, 0}, +- { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, +- { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, +- { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, +- { XK_Delete, ControlMask, "\033[M", -1, 0}, +- { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, +- { XK_Delete, ShiftMask, "\033[2K", -1, 0}, +- { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, +- { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, +- { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, +- { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, +- { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, +- { XK_Home, ShiftMask, "\033[2J", 0, -1}, +- { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, +- { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, +- { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, +- { XK_End, ControlMask, "\033[J", -1, 0}, +- { XK_End, ControlMask, "\033[1;5F", +1, 0}, +- { XK_End, ShiftMask, "\033[K", -1, 0}, +- { XK_End, ShiftMask, "\033[1;2F", +1, 0}, +- { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, +- { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, +- { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, +- { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, +- { XK_Next, ControlMask, "\033[6;5~", 0, 0}, +- { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, +- { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, +- { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, +- { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, +- { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, +- { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, +- { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, +- { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, +- { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, +- { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, +- { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, +- { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, +- { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, +- { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, +- { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, +- { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, +- { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, +- { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, +- { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, +- { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, +- { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, +- { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, +- { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, +- { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, +- { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, +- { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, +- { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, +- { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, +- { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, +- { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, +- { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, +- { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, +- { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, +- { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, +- { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, +- { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, +- { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, +- { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, +- { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, +- { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, +- { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, +- { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, +- { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, +- { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, +- { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, +- { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, +- { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, +- { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, +- { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, +- { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, +- { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, +- { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, +- { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, +- { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, +- { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, +- { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, +- { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, +- { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, +- { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, +- { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, +- { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, +- { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, +- { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, +- { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, +- { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, +- { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, +- { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, +- { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, +- { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, +- { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, +- { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, +- { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, +- { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, +- { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, +- { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, +- { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, +- { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, +- { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, +- { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, +- { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, +- { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, +- { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, +- { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, +- { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, +- { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, +- { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, +- { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, +- { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, ++ /* keysym mask string appkey appcursor */ ++ {XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, ++ {XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, ++ {XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, ++ {XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, ++ {XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, ++ {XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, ++ {XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, ++ {XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, ++ {XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, ++ {XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, ++ {XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, ++ {XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, ++ {XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, ++ {XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, ++ {XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, ++ {XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, ++ {XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, ++ {XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, ++ {XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, ++ {XK_KP_End, ControlMask, "\033[J", -1, 0}, ++ {XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, ++ {XK_KP_End, ShiftMask, "\033[K", -1, 0}, ++ {XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, ++ {XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, ++ {XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, ++ {XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, ++ {XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, ++ {XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, ++ {XK_KP_Insert, ControlMask, "\033[L", -1, 0}, ++ {XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, ++ {XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, ++ {XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, ++ {XK_KP_Delete, ControlMask, "\033[M", -1, 0}, ++ {XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, ++ {XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, ++ {XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, ++ {XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, ++ {XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, ++ {XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, ++ {XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, ++ {XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, ++ {XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, ++ {XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, ++ {XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, ++ {XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, ++ {XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, ++ {XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, ++ {XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, ++ {XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, ++ {XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, ++ {XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, ++ {XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, ++ {XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, ++ {XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, ++ {XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, ++ {XK_Up, ShiftMask, "\033[1;2A", 0, 0}, ++ {XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, ++ {XK_Up, ShiftMask | Mod1Mask, "\033[1;4A", 0, 0}, ++ {XK_Up, ControlMask, "\033[1;5A", 0, 0}, ++ {XK_Up, ShiftMask | ControlMask, "\033[1;6A", 0, 0}, ++ {XK_Up, ControlMask | Mod1Mask, "\033[1;7A", 0, 0}, ++ {XK_Up, ShiftMask | ControlMask | Mod1Mask, "\033[1;8A", 0, 0}, ++ {XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, ++ {XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, ++ {XK_Down, ShiftMask, "\033[1;2B", 0, 0}, ++ {XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, ++ {XK_Down, ShiftMask | Mod1Mask, "\033[1;4B", 0, 0}, ++ {XK_Down, ControlMask, "\033[1;5B", 0, 0}, ++ {XK_Down, ShiftMask | ControlMask, "\033[1;6B", 0, 0}, ++ {XK_Down, ControlMask | Mod1Mask, "\033[1;7B", 0, 0}, ++ {XK_Down, ShiftMask | ControlMask | Mod1Mask, "\033[1;8B", 0, 0}, ++ {XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, ++ {XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, ++ {XK_Left, ShiftMask, "\033[1;2D", 0, 0}, ++ {XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, ++ {XK_Left, ShiftMask | Mod1Mask, "\033[1;4D", 0, 0}, ++ {XK_Left, ControlMask, "\033[1;5D", 0, 0}, ++ {XK_Left, ShiftMask | ControlMask, "\033[1;6D", 0, 0}, ++ {XK_Left, ControlMask | Mod1Mask, "\033[1;7D", 0, 0}, ++ {XK_Left, ShiftMask | ControlMask | Mod1Mask, "\033[1;8D", 0, 0}, ++ {XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, ++ {XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, ++ {XK_Right, ShiftMask, "\033[1;2C", 0, 0}, ++ {XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, ++ {XK_Right, ShiftMask | Mod1Mask, "\033[1;4C", 0, 0}, ++ {XK_Right, ControlMask, "\033[1;5C", 0, 0}, ++ {XK_Right, ShiftMask | ControlMask, "\033[1;6C", 0, 0}, ++ {XK_Right, ControlMask | Mod1Mask, "\033[1;7C", 0, 0}, ++ {XK_Right, ShiftMask | ControlMask | Mod1Mask, "\033[1;8C", 0, 0}, ++ {XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, ++ {XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, ++ {XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, ++ {XK_Return, Mod1Mask, "\033\r", 0, 0}, ++ {XK_Return, XK_ANY_MOD, "\r", 0, 0}, ++ {XK_Insert, ShiftMask, "\033[4l", -1, 0}, ++ {XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, ++ {XK_Insert, ControlMask, "\033[L", -1, 0}, ++ {XK_Insert, ControlMask, "\033[2;5~", +1, 0}, ++ {XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, ++ {XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, ++ {XK_Delete, ControlMask, "\033[M", -1, 0}, ++ {XK_Delete, ControlMask, "\033[3;5~", +1, 0}, ++ {XK_Delete, ShiftMask, "\033[2K", -1, 0}, ++ {XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, ++ {XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, ++ {XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, ++ {XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, ++ {XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, ++ {XK_Home, ShiftMask, "\033[2J", 0, -1}, ++ {XK_Home, ShiftMask, "\033[1;2H", 0, +1}, ++ {XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, ++ {XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, ++ {XK_End, ControlMask, "\033[J", -1, 0}, ++ {XK_End, ControlMask, "\033[1;5F", +1, 0}, ++ {XK_End, ShiftMask, "\033[K", -1, 0}, ++ {XK_End, ShiftMask, "\033[1;2F", +1, 0}, ++ {XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, ++ {XK_Prior, ControlMask, "\033[5;5~", 0, 0}, ++ {XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, ++ {XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, ++ {XK_Next, ControlMask, "\033[6;5~", 0, 0}, ++ {XK_Next, ShiftMask, "\033[6;2~", 0, 0}, ++ {XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, ++ {XK_F1, XK_NO_MOD, "\033OP", 0, 0}, ++ {XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, ++ {XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, ++ {XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, ++ {XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, ++ {XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, ++ {XK_F2, XK_NO_MOD, "\033OQ", 0, 0}, ++ {XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, ++ {XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, ++ {XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, ++ {XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, ++ {XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, ++ {XK_F3, XK_NO_MOD, "\033OR", 0, 0}, ++ {XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, ++ {XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, ++ {XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, ++ {XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, ++ {XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, ++ {XK_F4, XK_NO_MOD, "\033OS", 0, 0}, ++ {XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, ++ {XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, ++ {XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, ++ {XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, ++ {XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, ++ {XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, ++ {XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, ++ {XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, ++ {XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, ++ {XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, ++ {XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, ++ {XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, ++ {XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, ++ {XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, ++ {XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, ++ {XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, ++ {XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, ++ {XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, ++ {XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, ++ {XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, ++ {XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, ++ {XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, ++ {XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, ++ {XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, ++ {XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, ++ {XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, ++ {XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, ++ {XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, ++ {XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, ++ {XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, ++ {XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, ++ {XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, ++ {XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, ++ {XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, ++ {XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, ++ {XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, ++ {XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, ++ {XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, ++ {XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, ++ {XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, ++ {XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, ++ {XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, ++ {XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, ++ {XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, ++ {XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, ++ {XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, ++ {XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, ++ {XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, ++ {XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, ++ {XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, ++ {XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, ++ {XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, ++ {XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, ++ {XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, ++ {XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, ++ {XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, ++ {XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, ++ {XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, ++ {XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, ++ {XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, ++ {XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, ++ {XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, ++ {XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, ++ {XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, ++ {XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, ++ {XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, ++ {XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, + }; + + /* +@@ -459,14 +456,13 @@ + * If no match is found, regular selection is used. + */ + static uint selmasks[] = { +- [SEL_RECTANGULAR] = Mod1Mask, ++ [SEL_RECTANGULAR] = Mod1Mask, + }; + + /* + * Printable characters in ASCII, used to estimate the advance width + * of single wide characters. + */ +-static char ascii_printable[] = +- " !\"#$%&'()*+,-./0123456789:;<=>?" +- "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" +- "`abcdefghijklmnopqrstuvwxyz{|}~"; ++static char ascii_printable[] = " !\"#$%&'()*+,-./0123456789:;<=>?" ++ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" ++ "`abcdefghijklmnopqrstuvwxyz{|}~"; +diff '--color=auto' -u a/st.c b/st.c +--- a/st.c 2021-05-18 08:15:14.274578800 +0530 ++++ b/st.c 2021-03-19 01:52:39.516045300 +0530 +@@ -35,6 +35,7 @@ + #define ESC_ARG_SIZ 16 + #define STR_BUF_SIZ ESC_BUF_SIZ + #define STR_ARG_SIZ ESC_ARG_SIZ ++#define HISTSIZE 2000 + + /* macros */ + #define IS_SET(flag) ((term.mode & (flag)) != 0) +@@ -42,6 +43,9 @@ + #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) + #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) + #define ISDELIM(u) (u && wcschr(worddelimiters, u)) ++#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ ++ term.scr + HISTSIZE + 1) % HISTSIZE] : \ ++ term.line[(y) - term.scr]) + + enum term_mode { + MODE_WRAP = 1 << 0, +@@ -115,6 +119,9 @@ + int col; /* nb col */ + Line *line; /* screen */ + Line *alt; /* alternate screen */ ++ Line hist[HISTSIZE]; /* history buffer */ ++ int histi; /* history index */ ++ int scr; /* scroll back */ + int *dirty; /* dirtyness of lines */ + TCursor c; /* cursor */ + int ocx; /* old cursor col */ +@@ -184,20 +191,20 @@ + static void tputtab(int); + static void tputc(Rune); + static void treset(void); +-static void tscrollup(int, int); +-static void tscrolldown(int, int); +-static void tsetattr(const int *, int); +-static void tsetchar(Rune, const Glyph *, int, int); ++static void tscrollup(int, int, int); ++static void tscrolldown(int, int, int); ++static void tsetattr(int *, int); ++static void tsetchar(Rune, Glyph *, int, int); + static void tsetdirt(int, int); + static void tsetscroll(int, int); + static void tswapscreen(void); +-static void tsetmode(int, int, const int *, int); ++static void tsetmode(int, int, int *, int); + static int twrite(const char *, int, int); + static void tfulldirt(void); + static void tcontrolcode(uchar ); + static void tdectest(char ); + static void tdefutf8(char); +-static int32_t tdefcolor(const int *, int *, int); ++static int32_t tdefcolor(int *, int *, int); + static void tdeftran(char); + static void tstrsequence(uchar); + +@@ -226,10 +233,10 @@ + static int cmdfd; + static pid_t pid; + +-static const uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; +-static const uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; +-static const Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; +-static const Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; ++static uchar utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; ++static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; ++static Rune utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; ++static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; + + ssize_t + xwrite(int fd, const char *s, size_t len) +@@ -269,14 +276,12 @@ + } + + char * +-xstrdup(const char *s) ++xstrdup(char *s) + { +- char *p; +- +- if ((p = strdup(s)) == NULL) ++ if ((s = strdup(s)) == NULL) + die("strdup: %s\n", strerror(errno)); + +- return p; ++ return s; + } + + size_t +@@ -416,10 +421,10 @@ + { + int i = term.col; + +- if (term.line[y][i - 1].mode & ATTR_WRAP) ++ if (TLINE(y)[i - 1].mode & ATTR_WRAP) + return i; + +- while (i > 0 && term.line[y][i - 1].u == ' ') ++ while (i > 0 && TLINE(y)[i - 1].u == ' ') + --i; + + return i; +@@ -520,7 +525,7 @@ + { + int newx, newy, xt, yt; + int delim, prevdelim; +- const Glyph *gp, *prevgp; ++ Glyph *gp, *prevgp; + + switch (sel.snap) { + case SNAP_WORD: +@@ -528,7 +533,7 @@ + * Snap around if the word wraps around at the end or + * beginning of a line. + */ +- prevgp = &term.line[*y][*x]; ++ prevgp = &TLINE(*y)[*x]; + prevdelim = ISDELIM(prevgp->u); + for (;;) { + newx = *x + direction; +@@ -543,14 +548,14 @@ + yt = *y, xt = *x; + else + yt = newy, xt = newx; +- if (!(term.line[yt][xt].mode & ATTR_WRAP)) ++ if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) + break; + } + + if (newx >= tlinelen(newy)) + break; + +- gp = &term.line[newy][newx]; ++ gp = &TLINE(newy)[newx]; + delim = ISDELIM(gp->u); + if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim + || (delim && gp->u != prevgp->u))) +@@ -571,14 +576,14 @@ + *x = (direction < 0) ? 0 : term.col - 1; + if (direction < 0) { + for (; *y > 0; *y += direction) { +- if (!(term.line[*y-1][term.col-1].mode ++ if (!(TLINE(*y-1)[term.col-1].mode + & ATTR_WRAP)) { + break; + } + } + } else if (direction > 0) { + for (; *y < term.row-1; *y += direction) { +- if (!(term.line[*y][term.col-1].mode ++ if (!(TLINE(*y)[term.col-1].mode + & ATTR_WRAP)) { + break; + } +@@ -593,7 +598,7 @@ + { + char *str, *ptr; + int y, bufsize, lastx, linelen; +- const Glyph *gp, *last; ++ Glyph *gp, *last; + + if (sel.ob.x == -1) + return NULL; +@@ -609,13 +614,13 @@ + } + + if (sel.type == SEL_RECTANGULAR) { +- gp = &term.line[y][sel.nb.x]; ++ gp = &TLINE(y)[sel.nb.x]; + lastx = sel.ne.x; + } else { +- gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; ++ gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; + lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; + } +- last = &term.line[y][MIN(lastx, linelen-1)]; ++ last = &TLINE(y)[MIN(lastx, linelen-1)]; + while (last >= gp && last->u == ' ') + --last; + +@@ -760,7 +765,7 @@ + } + + int +-ttynew(const char *line, char *cmd, const char *out, char **args) ++ttynew(char *line, char *cmd, char *out, char **args) + { + int m, s; + +@@ -850,6 +855,9 @@ + ttywrite(const char *s, size_t n, int may_echo) + { + const char *next; ++ Arg arg = (Arg) { .i = term.scr }; ++ ++ kscrolldown(&arg); + + if (may_echo && IS_SET(MODE_ECHO)) + twrite(s, n, 1); +@@ -1061,13 +1069,53 @@ + } + + void +-tscrolldown(int orig, int n) ++kscrolldown(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (n > term.scr) ++ n = term.scr; ++ ++ if (term.scr > 0) { ++ term.scr -= n; ++ selscroll(0, -n); ++ tfulldirt(); ++ } ++} ++ ++void ++kscrollup(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (term.scr <= HISTSIZE-n) { ++ term.scr += n; ++ selscroll(0, n); ++ tfulldirt(); ++ } ++} ++ ++void ++tscrolldown(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[term.bot]; ++ term.line[term.bot] = temp; ++ } ++ + tsetdirt(orig, term.bot-n); + tclearregion(0, term.bot-n+1, term.col-1, term.bot); + +@@ -1077,17 +1125,28 @@ + term.line[i-n] = temp; + } + +- selscroll(orig, n); ++ if (term.scr == 0) ++ selscroll(orig, n); + } + + void +-tscrollup(int orig, int n) ++tscrollup(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi + 1) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[orig]; ++ term.line[orig] = temp; ++ } ++ ++ if (term.scr > 0 && term.scr < HISTSIZE) ++ term.scr = MIN(term.scr + n, HISTSIZE-1); ++ + tclearregion(0, orig, term.col-1, orig+n-1); + tsetdirt(orig+n, term.bot); + +@@ -1097,7 +1156,8 @@ + term.line[i+n] = temp; + } + +- selscroll(orig, -n); ++ if (term.scr == 0) ++ selscroll(orig, -n); + } + + void +@@ -1126,7 +1186,7 @@ + int y = term.c.y; + + if (y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + y++; + } +@@ -1188,9 +1248,9 @@ + } + + void +-tsetchar(Rune u, const Glyph *attr, int x, int y) ++tsetchar(Rune u, Glyph *attr, int x, int y) + { +- static const char *vt100_0[62] = { /* 0x41 - 0x7e */ ++ static char *vt100_0[62] = { /* 0x41 - 0x7e */ + "↑", "↓", "→", "←", "█", "▚", "☃", /* A - G */ + 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ + 0, 0, 0, 0, 0, 0, 0, 0, /* P - W */ +@@ -1291,18 +1351,18 @@ + tinsertblankline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrolldown(term.c.y, n); ++ tscrolldown(term.c.y, n, 0); + } + + void + tdeleteline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrollup(term.c.y, n); ++ tscrollup(term.c.y, n, 0); + } + + int32_t +-tdefcolor(const int *attr, int *npar, int l) ++tdefcolor(int *attr, int *npar, int l) + { + int32_t idx = -1; + uint r, g, b; +@@ -1352,7 +1412,7 @@ + } + + void +-tsetattr(const int *attr, int l) ++tsetattr(int *attr, int l) + { + int i; + int32_t idx; +@@ -1470,9 +1530,9 @@ + } + + void +-tsetmode(int priv, int set, const int *args, int narg) ++tsetmode(int priv, int set, int *args, int narg) + { +- int alt; const int *lim; ++ int alt, *lim; + + for (lim = args + narg; args < lim; ++args) { + if (priv) { +@@ -1735,11 +1795,11 @@ + break; + case 'S': /* SU -- Scroll line up */ + DEFAULT(csiescseq.arg[0], 1); +- tscrollup(term.top, csiescseq.arg[0]); ++ tscrollup(term.top, csiescseq.arg[0], 0); + break; + case 'T': /* SD -- Scroll line down */ + DEFAULT(csiescseq.arg[0], 1); +- tscrolldown(term.top, csiescseq.arg[0]); ++ tscrolldown(term.top, csiescseq.arg[0], 0); + break; + case 'L': /* IL -- Insert blank lines */ + DEFAULT(csiescseq.arg[0], 1); +@@ -2022,7 +2082,7 @@ + tdumpline(int n) + { + char buf[UTF_SIZ]; +- const Glyph *bp, *end; ++ Glyph *bp, *end; + + bp = &term.line[n][0]; + end = &bp[MIN(tlinelen(n), term.col) - 1]; +@@ -2251,7 +2311,7 @@ + return 0; + case 'D': /* IND -- Linefeed */ + if (term.c.y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y+1); + } +@@ -2264,7 +2324,7 @@ + break; + case 'M': /* RI -- Reverse index */ + if (term.c.y == term.top) { +- tscrolldown(term.top, 1); ++ tscrolldown(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y-1); + } +@@ -2474,7 +2534,7 @@ + void + tresize(int col, int row) + { +- int i; ++ int i, j; + int minrow = MIN(row, term.row); + int mincol = MIN(col, term.col); + int *bp; +@@ -2511,6 +2571,14 @@ + term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); + term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + ++ for (i = 0; i < HISTSIZE; i++) { ++ term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); ++ for (j = mincol; j < col; j++) { ++ term.hist[i][j] = term.c.attr; ++ term.hist[i][j].u = ' '; ++ } ++ } ++ + /* resize each row to new width, zero-pad if needed */ + for (i = 0; i < minrow; i++) { + term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); +@@ -2569,7 +2637,7 @@ + continue; + + term.dirty[y] = 0; +- xdrawline(term.line[y], x1, y, x2); ++ xdrawline(TLINE(y), x1, y, x2); + } + } + +@@ -2590,8 +2658,9 @@ + cx--; + + drawregion(0, 0, term.col, term.row); +- xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], +- term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++ if (term.scr == 0) ++ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + term.ocx = cx; + term.ocy = term.c.y; + xfinishdraw(); +diff '--color=auto' -u a/st.h b/st.h +--- a/st.h 2021-05-18 08:15:14.275523400 +0530 ++++ b/st.h 2021-03-19 01:52:39.517474600 +0530 +@@ -81,6 +81,8 @@ + void redraw(void); + void draw(void); + ++void kscrolldown(const Arg *); ++void kscrollup(const Arg *); + void printscreen(const Arg *); + void printsel(const Arg *); + void sendbreak(const Arg *); +@@ -91,7 +93,7 @@ + void tresize(int, int); + void tsetdirtattr(int); + void ttyhangup(void); +-int ttynew(const char *, char *, const char *, char **); ++int ttynew(char *, char *, char *, char **); + size_t ttyread(void); + void ttyresize(int, int); + void ttywrite(const char *, size_t, int); +@@ -109,7 +111,7 @@ + + void *xmalloc(size_t); + void *xrealloc(void *, size_t); +-char *xstrdup(const char *); ++char *xstrdup(char *); + + /* config.h globals */ + extern char *utmp; +diff '--color=auto' -u a/x.c b/x.c +--- a/x.c 2021-05-18 08:15:14.281235100 +0530 ++++ b/x.c 2021-03-19 01:52:25.361188800 +0530 +@@ -156,7 +156,7 @@ + static void xhints(void); + static int xloadcolor(int, const char *, Color *); + static int xloadfont(Font *, FcPattern *); +-static void xloadfonts(const char *, double); ++static void xloadfonts(char *, double); + static void xunloadfont(Font *); + static void xunloadfonts(void); + static void xsetenv(void); +@@ -387,9 +387,7 @@ + button = 3; + } else { + button -= Button1; +- if (button >= 7) +- button += 128 - 7; +- else if (button >= 3) ++ if (button >= 3) + button += 64 - 3; + } + if (e->xbutton.type == ButtonPress) { +@@ -952,7 +950,7 @@ + } + + void +-xloadfonts(const char *fontstr, double fontsize) ++xloadfonts(char *fontstr, double fontsize) + { + FcPattern *pattern; + double fontval; +@@ -960,7 +958,7 @@ + if (fontstr[0] == '-') + pattern = XftXlfdParse(fontstr, False, False); + else +- pattern = FcNameParse((const FcChar8 *)fontstr); ++ pattern = FcNameParse((FcChar8 *)fontstr); + + if (!pattern) + die("can't open font %s\n", fontstr); diff --git a/satori.nix b/satori.nix index 608b39c..86d40e5 100644 --- a/satori.nix +++ b/satori.nix @@ -8,6 +8,7 @@ ./satori/pkgs.nix ./satori/networking.nix ./satori/boot.nix + ./satori/services.nix ./modules/nvidia-offload.nix ./modules/pipewire.nix ./modules/xorg.nix diff --git a/satori/boot.nix b/satori/boot.nix index ab99292..d22ee99 100644 --- a/satori/boot.nix +++ b/satori/boot.nix @@ -1,8 +1,6 @@ -{ config, lib, pkgs, modulesPath, ... }: +{lib, config, pkgs, ... }: { - imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; - boot = { kernelPackages = pkgs.linuxPackagesFor (pkgs.linux_zen.override { structuredExtraConfig = with lib.kernel; { diff --git a/satori/hardware.nix b/satori/hardware.nix index 1b2bee0..ac537df 100644 --- a/satori/hardware.nix +++ b/satori/hardware.nix @@ -9,7 +9,7 @@ fileSystems."/" = { device = "/dev/disk/by-uuid/4c02ddf5-d00e-4d84-856f-c327ae44d047"; fsType = "btrfs"; - options = ["compress-force=zstd:4"]; + options = ["compress-force=zstd:2"]; }; fileSystems."/boot/efi" = @@ -40,7 +40,7 @@ fileSystems."/mnt/LinuxGames" = { device = "/dev/sda5"; fsType = "btrfs"; - options = ["rw" "compress-force=zstd:4"]; + options = ["rw" "compress-force=zstd:2"]; }; swapDevices = [ {device = "/dev/nvme0n1p7";} ]; diff --git a/satori/networking.nix b/satori/networking.nix index ccf27d7..fcbca06 100644 --- a/satori/networking.nix +++ b/satori/networking.nix @@ -1,4 +1,4 @@ -{lib, config, ... }: +{config, ... }: { networking = { @@ -15,6 +15,6 @@ }; }; defaultGateway = "192.168.0.1"; - nameservers = [ "192.168.0.1" ]; + nameservers = [ "1.1.1.1" "8.8.8.8" ]; }; } diff --git a/satori/pkgs.nix b/satori/pkgs.nix index 33ddd86..0f130e4 100644 --- a/satori/pkgs.nix +++ b/satori/pkgs.nix @@ -28,6 +28,7 @@ dmenu st kbd + cachix ]; programs = { steam.enable = true; @@ -38,13 +39,23 @@ pinentryFlavor = "curses"; }; }; - fish.enable = true; + zsh = { + enable = true; + promptInit = "PROMPT='%F{cyan}%~ %F{blue}>%f '\nRPROMPT='%F{cyan}%n%f@%F{red}%m'"; + histSize = 12000; + enableCompletion = true; + syntaxHighlighting.enable = true; + autosuggestions. enable = true; + ohMyZsh.enable = true; + }; dconf.enable = true; + adb.enable = true; }; nix = { package = pkgs.nixUnstable; extraOptions = '' experimental-features = nix-command ca-references flakes ''; + trustedUsers = [ "root" "natto" ]; }; } diff --git a/satori/stuff/services.nix b/satori/services.nix similarity index 100% rename from satori/stuff/services.nix rename to satori/services.nix diff --git a/satori/stuff.nix b/satori/stuff.nix index a249ec9..116845d 100644 --- a/satori/stuff.nix +++ b/satori/stuff.nix @@ -1,10 +1,5 @@ -{lib, config, agenix, pkgs, ... }: +{config, agenix, pkgs, ... }: { - imports = [ - ./stuff/fonts.nix - ./stuff/users.nix - ./stuff/services.nix - ]; time.timeZone = "Asia/Kolkata"; environment = { sessionVariables = { @@ -30,8 +25,16 @@ automatic = false; dates = "20:15"; }; - nixpkgs.config = { - allowUnfree = true; - allowBroken = true; + fonts.fonts = with pkgs; [ + fira-mono + font-awesome + vistafonts + noto-fonts-cjk + ]; + users.users.natto = { + isNormalUser = true; + shell = pkgs.zsh; + home = "/home/natto"; + extraGroups = [ "wheel" "adbusers" ]; }; } diff --git a/satori/stuff/fonts.nix b/satori/stuff/fonts.nix deleted file mode 100644 index a79890f..0000000 --- a/satori/stuff/fonts.nix +++ /dev/null @@ -1,12 +0,0 @@ -{lib, config, pkgs, ... }: - -{ - fonts.fonts = with pkgs; [ - fira-mono - font-awesome-ttf - powerline-fonts - vistafonts - noto-fonts-cjk - noto-fonts-emoji - ]; -} diff --git a/satori/stuff/users.nix b/satori/stuff/users.nix deleted file mode 100644 index 4036d3b..0000000 --- a/satori/stuff/users.nix +++ /dev/null @@ -1,10 +0,0 @@ -{config, pkgs, ... }: - -{ - users.users.natto = { - isNormalUser = true; - shell = pkgs.fish; - home = "/home/natto"; - extraGroups = [ "wheel" "video" "audio" ]; - }; -}