From 324068732161ce274f126898585e1790b8c48897 Mon Sep 17 00:00:00 2001 From: get Date: Mon, 15 Apr 2024 13:18:01 +0200 Subject: [PATCH 01/50] Added hyprland wallpaper --- hosts/lars/dyonisos/configuration.nix | 1 + hosts/lars/hyprland.nix | 7 +++++++ hosts/lars/programs.nix | 1 + 3 files changed, 9 insertions(+) diff --git a/hosts/lars/dyonisos/configuration.nix b/hosts/lars/dyonisos/configuration.nix index e41888a..3142fa9 100644 --- a/hosts/lars/dyonisos/configuration.nix +++ b/hosts/lars/dyonisos/configuration.nix @@ -10,6 +10,7 @@ hyprland = { enable = true; monitor = [",preferred,auto,2"]; + wallpaper = "wallpaper/nix.png"; }; }; } diff --git a/hosts/lars/hyprland.nix b/hosts/lars/hyprland.nix index 41168ce..1299063 100644 --- a/hosts/lars/hyprland.nix +++ b/hosts/lars/hyprland.nix @@ -2,6 +2,7 @@ with lib; let username = config.modules.other.system.username; cfg = config.modules.hyprland; + gitPath = config.modules.other.system.gitPath; in { imports = [ ./waybar.nix @@ -20,6 +21,11 @@ in { default = {}; type = types.attrs; }; + wallpaper = mkOption { + description = "wallpaper relative from assets"; + default = ""; + type = types.str; + }; }; config = mkIf cfg.enable { @@ -84,6 +90,7 @@ in { exec-once = [ "waybar" + "swww init & swww img ${gitPath}/${cfg.wallpaper}" ]; bind = [ diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index ed7673c..a730582 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -57,6 +57,7 @@ in { xdg-utils # xdg-mime script webcord element-desktop + swww ]; }; } From ff55b2c3a2721e7545cb237a9e2022718583642d Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Tue, 16 Apr 2024 08:59:20 +0200 Subject: [PATCH 02/50] Wallpapers added --- hosts/lars/dyonisos/configuration.nix | 2 +- hosts/lars/kronos/configuration.nix | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/hosts/lars/dyonisos/configuration.nix b/hosts/lars/dyonisos/configuration.nix index 3142fa9..cf9ab76 100644 --- a/hosts/lars/dyonisos/configuration.nix +++ b/hosts/lars/dyonisos/configuration.nix @@ -10,7 +10,7 @@ hyprland = { enable = true; monitor = [",preferred,auto,2"]; - wallpaper = "wallpaper/nix.png"; + wallpaper = "wallpaper/wave.jpg"; }; }; } diff --git a/hosts/lars/kronos/configuration.nix b/hosts/lars/kronos/configuration.nix index 0d0af04..be46c8a 100644 --- a/hosts/lars/kronos/configuration.nix +++ b/hosts/lars/kronos/configuration.nix @@ -22,11 +22,12 @@ "DP-2,2560x1440@144,0x0,1" "DP-1,1920x1080@60,2560x0,1" ]; - extra = { - exec-once = [ - "hyprctl dispatch moveworkspacetomonitor 1 DP-2" - ]; - }; + extra = { + exec-once = [ + "hyprctl dispatch moveworkspacetomonitor 1 DP-2" + ]; + }; + wallpaper = "wallpaper/wave.jpg"; }; }; From e2c23e3897380f21562ffc1ac2636cec7576a2f7 Mon Sep 17 00:00:00 2001 From: get Date: Tue, 16 Apr 2024 11:33:53 +0200 Subject: [PATCH 03/50] Added keepassxc --- hosts/lars/programs.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index 35d5eee..f8395b6 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -56,8 +56,9 @@ in { xdg-utils # xdg-mime script webcord element-desktop - swww + swww toipe + keepassxc ]; }; } From 28415f157421de0a16446be74dd2af91517a0666 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Tue, 16 Apr 2024 11:40:38 +0200 Subject: [PATCH 04/50] Yazi alias added --- hosts/lars/default.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 6915250..345e8cb 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -34,7 +34,8 @@ profiling = false; extraAliases = { cls = "clear"; - Hyprland = "dbus-run-session Hyprland"; + Hyprland = "dbus-run-session Hyprland"; + y = "yazi"; }; ohmyzsh = { enable = true; From 62f42d668fc7ceb6a5fe93b459bdb113f8f2d30c Mon Sep 17 00:00:00 2001 From: larszauberer Date: Tue, 16 Apr 2024 12:28:49 +0200 Subject: [PATCH 05/50] ssh-agent --- hosts/lars/default.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 345e8cb..218cf09 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -113,6 +113,9 @@ twingate.enable = true; }; + # SSH AGENT + programs.ssh.startAgent = true; + system.stateVersion = "23.11"; nix.settings.experimental-features = ["nix-command" "flakes"]; } From 432fbed5d2b782003f589439b5693944d75a627d Mon Sep 17 00:00:00 2001 From: larszauberer Date: Tue, 16 Apr 2024 15:26:58 +0200 Subject: [PATCH 06/50] disable gnome keyring --- hosts/lars/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 218cf09..448437f 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -115,6 +115,7 @@ # SSH AGENT programs.ssh.startAgent = true; + services.gnome3.gnome-keyring.enable = false; system.stateVersion = "23.11"; nix.settings.experimental-features = ["nix-command" "flakes"]; From 82d76e178ebeb4f9a77b62691d2e05fdb2b6b422 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Tue, 16 Apr 2024 15:27:03 +0200 Subject: [PATCH 07/50] add bluetooth client --- hosts/lars/programs.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index f8395b6..e4b0fee 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -59,6 +59,7 @@ in { swww toipe keepassxc + bluetuith ]; }; } From 414dbadac830ca1b4e2b22a53f3c4cf8433d2400 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Tue, 16 Apr 2024 16:04:17 +0200 Subject: [PATCH 08/50] Bluetooth --- hosts/lars/dyonisos/profile.nix | 1 + hosts/lars/kronos/profile.nix | 1 + hosts/lars/programs.nix | 1 - options/common/bluetooth.nix | 19 +++++++++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 options/common/bluetooth.nix diff --git a/hosts/lars/dyonisos/profile.nix b/hosts/lars/dyonisos/profile.nix index d4fe1e8..33aae1b 100644 --- a/hosts/lars/dyonisos/profile.nix +++ b/hosts/lars/dyonisos/profile.nix @@ -5,5 +5,6 @@ _: { ../../../options/common/networking.nix ../../../options/common/pin-registry.nix ../../../options/common/preserve-system.nix + ../../../options/common/bluetooth.nix ]; } diff --git a/hosts/lars/kronos/profile.nix b/hosts/lars/kronos/profile.nix index 30407f5..e567018 100644 --- a/hosts/lars/kronos/profile.nix +++ b/hosts/lars/kronos/profile.nix @@ -6,5 +6,6 @@ _: { ../../../options/common/gpu/nvidia.nix ../../../options/common/pin-registry.nix ../../../options/common/preserve-system.nix + ../../../options/common/bluetooth.nix ]; } diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index e4b0fee..f8395b6 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -59,7 +59,6 @@ in { swww toipe keepassxc - bluetuith ]; }; } diff --git a/options/common/bluetooth.nix b/options/common/bluetooth.nix new file mode 100644 index 0000000..3d24814 --- /dev/null +++ b/options/common/bluetooth.nix @@ -0,0 +1,19 @@ +{ config, lib, pkgs, ... }: +let + username = config.modules.other.system.username; +in { + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + }; + + services.blueman.enable = true; + + # Bluetooth headset media control buttons + systemd.user.services.mpris-proxy = { + description = "Mpris proxy"; + after = [ "network.target" "sound.target" ]; + wantedBy = [ "default.target" ]; + serviceConfig.ExecStart = "${pkgs.bluez}/bin/mpris-proxy"; + }; +} From d962a99500c20dfd4602a6cdeb31a15d17d1aa46 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Tue, 16 Apr 2024 20:25:10 +0200 Subject: [PATCH 09/50] Vivaldi added --- hosts/lars/hyprland.nix | 1 + hosts/lars/programs.nix | 1 + 2 files changed, 2 insertions(+) diff --git a/hosts/lars/hyprland.nix b/hosts/lars/hyprland.nix index 1299063..d17ead0 100644 --- a/hosts/lars/hyprland.nix +++ b/hosts/lars/hyprland.nix @@ -107,6 +107,7 @@ in { "$mod, o, exec, obsidian --ozone-platform=wayland --enable-features=UseOzonePlatform --enable-features=WaylandWindowDecorations --enable-features=WebRTCPipeWireCpaturer --disable-gpu" "$mod SHIFT, D, exec, webcord --ozone-platform=wayland --enable-features=UseOzonePlatform --enable-features=WaylandWindowDecorations --enable-features=WebRTCPipeWireCpaturer --disable-gpu" "$mod SHIFT, L, exec, element-desktop --ozone-platform=wayland --enable-features=UseOzonePlatform --enable-features=WaylandWindowDecorations --enable-features=WebRTCPipeWireCpaturer --disable-gpu" + "$mod, v, exec, vivaldi --ozone-platform=wayland --enable-features=UseOzonePlatform --enable-features=WaylandWindowDecorations --enable-features=WebRTCPipeWireCpaturer --disable-gpu" # Monitor management "$mod SHIFT, k, movecurrentworkspacetomonitor, DP-2" diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index f8395b6..6198624 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -59,6 +59,7 @@ in { swww toipe keepassxc + vivaldi ]; }; } From 2f2166d66d0773f96ea9f54f191688017e5d3d15 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Wed, 17 Apr 2024 10:45:18 +0200 Subject: [PATCH 10/50] Try to fix screenshots --- hosts/lars/hyprland.nix | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hosts/lars/hyprland.nix b/hosts/lars/hyprland.nix index 1299063..5d80b16 100644 --- a/hosts/lars/hyprland.nix +++ b/hosts/lars/hyprland.nix @@ -120,7 +120,8 @@ in { "$mod, F, fullscreen" # Screenshot - "$mod SHIFT, s, exec, grim -g '$(slurp -d)' - | wl-copy" + "$mod SHIFT, s, exec, grim -g \"$(slurp -d)\" - | wl-copy" + ] ++ ( builtins.concatLists (builtins.genList ( @@ -136,6 +137,11 @@ in { ) 10) ); + # Mouse movement + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; } cfg.extra]; }; }; From be2f90589e8f0664210b24ad66ed092dd5b6ba63 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Wed, 17 Apr 2024 15:56:38 +0200 Subject: [PATCH 11/50] Added firefox extensions --- hosts/lars/default.nix | 8 +++++++ modules/gui/firefox.nix | 46 +++++++++++++++++++++-------------------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 448437f..39987bb 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -61,6 +61,14 @@ install_url = "https://addons.mozilla.org/firefox/downloads/file/4231522/new_tab_override-16.0.0.xpi"; installation_mode = "force_installed"; }; + "keepassxc-browser@keepassxc.org" = { + install_url = "https://addons.mozilla.org/firefox/downloads/file/4257616/keepassxc_browser-1.9.0.3.xpi"; + installation_mode = "force_installed"; + }; + "{7be2ba16-0f1e-4d93-9ebc-5164397477a9}" = { + install_url = "https://addons.mozilla.org/firefox/downloads/file/3756025/videospeed-0.6.3.3.xpi"; + installation_mode = "force_installed"; + }; }; }; diff --git a/modules/gui/firefox.nix b/modules/gui/firefox.nix index 07704ca..b948b0b 100644 --- a/modules/gui/firefox.nix +++ b/modules/gui/firefox.nix @@ -18,7 +18,7 @@ in { enable = true; policies = { - DisableTelemetry = true; + DisableTelemetry = true; DisableFirefoxStudies = true; EnableTrackingProtection = { Value= true; @@ -36,28 +36,30 @@ in { DisplayBookmarksToolbar = "never"; # alternatives: "always" or "newtab" DisplayMenuBar = "default-off"; # alternatives: "always", "never" or "default-on" SearchBar = "unified"; # alternative: "separate" - FirefoxSuggest = { - WebSuggestions = true; - ImproveSuggest = true; - Locked = true; - }; - SearchSuggestEnabled = true; - theme = { - colors = { - background-darker = "181825"; - background = "1e1e2e"; - foreground = "cdd6f4"; - }; - }; + FirefoxSuggest = { + WebSuggestions = true; + ImproveSuggest = true; + Locked = true; + }; + SearchSuggestEnabled = true; + theme = { + colors = { + background-darker = "181825"; + background = "1e1e2e"; + foreground = "cdd6f4"; + }; + }; - font = "Lexend"; - ExtensionSettings = lib.mkMerge [{ - "uBlock0@raymondhill.net" = { - install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; - installation_mode = "force_installed"; - }; - } cfg.extensions]; - }; + OfferToSaveLogins = false; + + font = "Lexend"; + ExtensionSettings = lib.mkMerge [{ + "uBlock0@raymondhill.net" = { + install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"; + installation_mode = "force_installed"; + }; + } cfg.extensions]; + }; }; }; }; From 7934ff1d6aaa29cbad3a2dcdadfd8f3f14f02fdf Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Wed, 17 Apr 2024 15:56:45 +0200 Subject: [PATCH 12/50] Added steam --- hosts/lars/hyprland.nix | 4 ++++ hosts/lars/kronos/configuration.nix | 5 +++++ modules/gui/default.nix | 1 + modules/gui/steam.nix | 22 ++++++++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 modules/gui/steam.nix diff --git a/hosts/lars/hyprland.nix b/hosts/lars/hyprland.nix index 63cfa79..5353ff2 100644 --- a/hosts/lars/hyprland.nix +++ b/hosts/lars/hyprland.nix @@ -120,6 +120,10 @@ in { "$mod, down, movefocus, d" "$mod, F, fullscreen" + # Special Workspaces + "$mod SHIFT, F, movetoworkspacesilent, special" + "$mod, s, togglespecialworkspace," + # Screenshot "$mod SHIFT, s, exec, grim -g \"$(slurp -d)\" - | wl-copy" diff --git a/hosts/lars/kronos/configuration.nix b/hosts/lars/kronos/configuration.nix index be46c8a..01cc83c 100644 --- a/hosts/lars/kronos/configuration.nix +++ b/hosts/lars/kronos/configuration.nix @@ -13,6 +13,11 @@ opacity = 0.8; blur = true; }; + + steam = { + enable = true; + gamescope = true; + }; }; hyprland = { diff --git a/modules/gui/default.nix b/modules/gui/default.nix index 95868e4..d950bdf 100644 --- a/modules/gui/default.nix +++ b/modules/gui/default.nix @@ -13,5 +13,6 @@ _: { ./WM ./alacritty.nix ./firefox.nix + ./steam.nix ]; } diff --git a/modules/gui/steam.nix b/modules/gui/steam.nix new file mode 100644 index 0000000..ca600f2 --- /dev/null +++ b/modules/gui/steam.nix @@ -0,0 +1,22 @@ + +{ config, lib, inputs, pkgs, ... }: +with lib; let + username = config.modules.other.system.username; + cfg = config.modules.programs.steam; +in { + options.modules.programs.steam = { + enable = mkEnableOption "steam"; + gamescope = mkEnableOption "gamescope"; + }; + + config = mkIf cfg.enable { + programs.steam = { + enable = true; + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + gamescopeSession.enable = mkIf cfg.gamescope true; + }; + home-manager.users.${username} = { + }; + }; +} From 4efb439aee7999a4f36ad7e4dead091a6f28e74d Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Wed, 17 Apr 2024 23:09:58 +0200 Subject: [PATCH 13/50] Autostart and some extra programs --- hosts/lars/hyprland.nix | 3 +++ hosts/lars/programs.nix | 2 ++ 2 files changed, 5 insertions(+) diff --git a/hosts/lars/hyprland.nix b/hosts/lars/hyprland.nix index 5353ff2..cd12319 100644 --- a/hosts/lars/hyprland.nix +++ b/hosts/lars/hyprland.nix @@ -91,6 +91,9 @@ in { exec-once = [ "waybar" "swww init & swww img ${gitPath}/${cfg.wallpaper}" + "keepassxc" + "nextcloud" + "element-desktop --ozone-platform=wayland --enable-features=UseOzonePlatform --enable-features=WaylandWindowDecorations --enable-features=WebRTCPipeWireCpaturer --disable-gpu" ]; bind = [ diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index 6198624..5e0dd5a 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -60,6 +60,8 @@ in { toipe keepassxc vivaldi + fzf + nix-index ]; }; } From 071543e747d422e56f54c9f935d4697d70332686 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Wed, 17 Apr 2024 23:10:24 +0200 Subject: [PATCH 14/50] Minecraft wayland patch try --- hosts/lars/kronos/programs.nix | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/hosts/lars/kronos/programs.nix b/hosts/lars/kronos/programs.nix index 631e805..8877ef2 100644 --- a/hosts/lars/kronos/programs.nix +++ b/hosts/lars/kronos/programs.nix @@ -1,6 +1,30 @@ -{ config, inputs, pkgs, ... }: +{ config, inputs, pkgs, lib, ... }: let username = config.modules.other.system.username; + + # Fetch the GLFW with Wayland patches for Minecraft + customGLFW = let + mcWaylandPatchRepo = pkgs.fetchFromGitHub { + owner = "Admicos"; + repo = "minecraft-wayland"; + rev = "370ce5b95e3ae9bc4618fb45113bc641fbb13867"; + sha256 = "sha256-RPRg6Gd7N8yyb305V607NTC1kUzvyKiWsh6QlfHW+JE="; + }; + mcWaylandPatches = map (name: "${mcWaylandPatchRepo}/${name}") + (lib.naturalSort (builtins.attrNames (lib.filterAttrs + (name: type: + type == "regular" && lib.hasSuffix ".patch" name) + (builtins.readDir mcWaylandPatchRepo)))); + in pkgs.glfw.overrideAttrs (previousAttrs: { + patches = previousAttrs.patches ++ mcWaylandPatches; + buildInputs = previousAttrs.buildInputs ++ [ pkgs.wayland ]; + }); + + # Minecraft launcher with the custom GLFW + minecraftPrismLauncher = pkgs.prismlauncher.override { + glfw = customGLFW; + }; + in { home-manager.users.${username} = { home.packages = let @@ -9,4 +33,9 @@ in { in with pkgs; [ ]; }; + + # System-wide installation of Minecraft PrismLauncher + environment.systemPackages = [ + minecraftPrismLauncher + ]; } From ef2be777a6c4677ab052f4a8c21b8960f8564e0c Mon Sep 17 00:00:00 2001 From: larszauberer Date: Thu, 18 Apr 2024 11:34:28 +0200 Subject: [PATCH 15/50] yubico key software --- hosts/lars/programs.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index 6198624..3f84294 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -60,6 +60,9 @@ in { toipe keepassxc vivaldi + yubikey-personalization-gui + yubikey-personalization + yubioath-flutter ]; }; } From 25bee590f956cf6ae42f6c5ed848e7ae0c632799 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Thu, 18 Apr 2024 15:15:01 +0200 Subject: [PATCH 16/50] Apps removed that are not necessarily needed --- hosts/lars/programs.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index 7f3b8ff..befc6b2 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -64,7 +64,6 @@ in { yubikey-personalization yubioath-flutter fzf - nix-index ]; }; } From ec2250c5191bb9f29fa7b524f03634fde39197d6 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Thu, 18 Apr 2024 19:11:31 +0200 Subject: [PATCH 17/50] added programs --- hosts/vali/mars/programs.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hosts/vali/mars/programs.nix b/hosts/vali/mars/programs.nix index 5c068f8..ce02283 100644 --- a/hosts/vali/mars/programs.nix +++ b/hosts/vali/mars/programs.nix @@ -26,6 +26,7 @@ in { ffmpeg_6-full flameshot foot + img2pdf gcc gdb gnumake @@ -47,6 +48,7 @@ in { pamixer pavucontrol pcmanfm + pdfarranger pfetch playerctl polkit From d5ce612a45d6663f747334989b38640d0c0def28 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Thu, 18 Apr 2024 19:29:57 +0200 Subject: [PATCH 18/50] Added tldr --- hosts/lars/programs.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index befc6b2..ac0add5 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -64,6 +64,7 @@ in { yubikey-personalization yubioath-flutter fzf + tldr ]; }; } From f3276499bf7b863724294c6431bd2c904b8315b9 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Thu, 18 Apr 2024 22:31:13 +0200 Subject: [PATCH 19/50] Try yubikey login --- hosts/lars/default.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 39987bb..74e0106 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -119,6 +119,12 @@ # services.flatpak.enable = true; services = { twingate.enable = true; + pcscd.enable = true; + # pam.yubico = { # login + # enable = true; + # mode = "challenge-response"; + # id = [ "18067815" ]; + # }; }; # SSH AGENT From 2465d9ca292f8ced5f03e3437bb40351534f1bf4 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Fri, 19 Apr 2024 08:22:24 +0200 Subject: [PATCH 20/50] removed vivaldi --- hosts/lars/programs.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index ac0add5..2d52b7f 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -59,7 +59,6 @@ in { swww toipe keepassxc - vivaldi yubikey-personalization-gui yubikey-personalization yubioath-flutter From 3e676dea9fa92b0d95bba380f36a47615b54e088 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Fri, 19 Apr 2024 08:30:39 +0200 Subject: [PATCH 21/50] Added yubikey auth --- hosts/lars/default.nix | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 74e0106..eda91a3 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -120,17 +120,20 @@ services = { twingate.enable = true; pcscd.enable = true; - # pam.yubico = { # login - # enable = true; - # mode = "challenge-response"; - # id = [ "18067815" ]; - # }; }; # SSH AGENT programs.ssh.startAgent = true; services.gnome3.gnome-keyring.enable = false; + # Security PAM with yubico key + security.pam.yubico = { + enable = true; + debug = false; + mode = "challenge-response"; + id = [ "26292316" ]; +}; + system.stateVersion = "23.11"; nix.settings.experimental-features = ["nix-command" "flakes"]; } From 69d25e5e70e30e7efa0116bf0e5df49546c0c999 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Fri, 19 Apr 2024 12:49:01 +0200 Subject: [PATCH 22/50] Added gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5214ca1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +./assets/* From 05ceab6418aecdaae71ccb0a430c151bd1027651 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sat, 20 Apr 2024 09:50:33 +0200 Subject: [PATCH 23/50] Added secondary yubikey --- hosts/lars/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index eda91a3..38b0b60 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -131,7 +131,7 @@ enable = true; debug = false; mode = "challenge-response"; - id = [ "26292316" ]; + id = [ "26292316" "28067815" ]; }; system.stateVersion = "23.11"; From f1e7cd8766c0ee1beee6b765d76eabc3c7f33655 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Sat, 20 Apr 2024 15:36:03 +0200 Subject: [PATCH 24/50] added xdg-desktop-portal --- hosts/vali/mars/configuration.nix | 4 +++- hosts/vali/mars/dwm/dwm.nix | 3 ++- hosts/vali/mars/dwm/st-0.9.2/config.h | 1 + hosts/vali/mars/dwm/st-0.9.2/st | Bin 96616 -> 96648 bytes hosts/vali/mars/dwm/st-0.9.2/x.o | Bin 75240 -> 75272 bytes hosts/vali/mars/programs.nix | 4 +++- 6 files changed, 9 insertions(+), 3 deletions(-) diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index 1b7816a..e13435a 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -23,6 +23,7 @@ security.sudo.package = pkgs.sudo.override { withInsults = true; }; security.polkit.enable = true; programs.kdeconnect.enable = true; + services.picom.enable = true; services.mpd = { enable = true; musicDirectory = "/home/vali/Nextcloud/Media/Music/"; @@ -53,6 +54,7 @@ btop.enable = true; mpv.enable = true; dwm.enable = true; + vivado.enable = true; schizofox.enable = true; #git = { # enable = true; @@ -84,7 +86,7 @@ size = 24; }; gtk = { - enable = true; + enable = false; package = pkgs.catppuccin-gtk; name = "Catppuccin-Mocha-Standard-Green-Dark"; variant = "mocha"; diff --git a/hosts/vali/mars/dwm/dwm.nix b/hosts/vali/mars/dwm/dwm.nix index 2cf92f3..8360022 100644 --- a/hosts/vali/mars/dwm/dwm.nix +++ b/hosts/vali/mars/dwm/dwm.nix @@ -21,10 +21,11 @@ in { nixpkgs.overlays = [ (final: prev: { dwm = prev.dwm.overrideAttrs (old: {src = ./dwm-6.5;}); + st = prev.st.overrideAttrs (old: {src = ./st-0.9.2;}); }) ]; environment.systemPackages = with pkgs; [ - (st.overrideAttrs (oldAttrs: rec { src = ./st-0.9.2; })) +# (st.overrideAttrs (oldAttrs: rec { src = ./st-0.9.2; })) (dmenu.overrideAttrs (oldAttrs: rec { src = ./dmenu-5.3; })) ]; diff --git a/hosts/vali/mars/dwm/st-0.9.2/config.h b/hosts/vali/mars/dwm/st-0.9.2/config.h index 8efb49a..2a6a93a 100644 --- a/hosts/vali/mars/dwm/st-0.9.2/config.h +++ b/hosts/vali/mars/dwm/st-0.9.2/config.h @@ -93,6 +93,7 @@ char *termname = "st-256color"; */ unsigned int tabspaces = 8; +float alpha = 0.8; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { /* 8 normal colors */ diff --git a/hosts/vali/mars/dwm/st-0.9.2/st b/hosts/vali/mars/dwm/st-0.9.2/st index c6ea80e0ab9acec5eea0b98b018d105036233ce8..a27a3e331758543f784aff2e1edfc514a5aaf618 100755 GIT binary patch delta 1824 zcmaFyiM8W1>jVuZj-riP5B(YEOy&uYXPmQHC*TkxU%qKSpuJJTRwmI-@_MIAbT6GY3p=0h7n4C;BsrOI~JY zU=U*9V`$ms0Ji5TBbZ{i3sNNc4=URm43T{Vm1PCFL7Y(>LK#3PI|$_mp`syF9)xOu zQ2o;z0~p06XL3L+Roo0QRv2O@!(xc4^$=&6oqBDj`%Cgqi}T zB$t4-N-`7_LLvziy&#vYgh=m!S}YU?ait_kj)8&U*z}1(pg@O8SHwc3XF;VmOg{*c zz6&;7f+52j)$ljdKL#<1GyVqK!6-0YF_=+YQkx6nN9K5lS=vyuOu^EOz7Q$~LS;j! z%IO<}8O0f!AiU`iYB7XbH(fAw;q8J@#~{@8=^sNG#U&qbgW^e& zp#m+ipFvdpfKWWs1H%}_8Ra3AF@!Rio*2z2&S(qa1wg38=?}vg#U*oiAR(8z2NH7q z(2%Q`E*K6D9k6-RAbJ);sC{5c@+eg6lf4kFvQVw3A=3AF7#IW?BpDcdArT0bWq1Xa zX8aDJSf(3BFp4t@gD8DQEf58ADOfNJ!b^luxe%&j`azI}1rXlm=^sJ7gAm@;>57qz z;*8HBygv|%dwL^CP!2-rLnw0y$aF(cB*{VI$_PTa zL#WW{6G3tr5MDKe>V{CWA=GjRbqGRThEUHT)Gr9dH@z{2QJhf;LRo+*NpAsAEJ|0F#$qVL8uN0^#Wqv(&>@0jQW!61Rx$--U{&$tQ^}qePJx4xa2;l^nxIW^bV+h z4^6)q%P7ux8e-%<2=yL9eS=U;(-Y$u#Toe^lsJUan?5m)QC!kkkbyyniHCu~0AeiE zR0hlG2SIvVA&O(clw=`DF#{jNG-yeb3sqe=T``_foUt9OYI{IDqaQnKVopIu;`X^| sjNROm|FN-c*C}G0!^Rje{bU8BIcG*Zr0|?JowJhBoblgu$4W+Z0DkjVv^7lj+O9{MxRn9LI(&p2bVPQW2X#wnBE2Z}RJ*~}g^L4a|}vyCmWspKc*i9asGojf*?nTGipI73kc-_p+X^4285~tQ<9w= z3=Dz{5)3_PzM4FJV*sN#<6N*R#+49i2ZTBbrX+81Kz!-v0r7`C)OC-hI|ed}Grk6^ zV*C%LB;`0k_6RUAT!1Ksh6sc1^o1bB=F9|TFS5`g%Cu?6C&W#H7n zz;J!~N09V0uxlh45(-gc{42x`uIY`zjN*){(*r@2K7{8Ep~4_kDwvWi=7QL>U@ycT zJ*Ycsz|xEpA=F$jCAk8sc+VDy;>A$K+aS`1q0;rq5NThi^a+UcWiAE=K_&?X249Gq zp|TA3!P1QHAr$xYiy@5Sj4}{P7eYBfs6a3!nZgY*hyyL?3L(-h+z>DQ*aLA!EYzZ2 zi1ZAoG^aa6x&SJ@7%a`W1wtJFQ<4{4M>m;*v!?pcE;=&;j)zEJfCUbu&(Y zP_rS_4hXe>`oeHVamJ$%-i_%OLA)mr-bV=a4?^)yH;iBuXOsg``i$lvN}MqOLPbNU zbTB2^#LK`S#KgytU;YYLTrI-N0^QJnEDSQR6~bi-&yaY;UY zh~k4gA&PfG6-z+kTL(fpf+<#ieg+1?$s3u38I!;QjHM8&6+%sgPzxc{9td?7LOp~~ zUmz66^o=p#+ySPHAUxOU4?%)H5MC67DuGZ<5b6;``~2yJv5fkRE2b}uWfYfO4=rPi zJt1CbhI(Pg^ot^n-DX;*!Qt>G-V>>6Oe7X?w74#&8IgJzX)LQCzYDs+a}pW_^fShQ{rI y@rt zEXmHpz#z!L%uvAq0W1)TL2&ZHnc|WPU|DX46H*XikXay>{^XA{#U;(4vNzCV9VRQz z5@&SZY&lDUhcz*$AR}>dz%q}`)0SmbGVYkpsKDsX*f9BGq2%-=1;%-dE2c9lGX7_r zF`ZF~v7Yh7^hOXhV>_cV<9|kwa#comCI-3bUaE{{oEft~wlgsJOz%`>G-vFXeo&QB F9RMUmJ177E delta 228 zcmeA;!}8)Z%LEO^jE$PBome>-7#J8QJNm5O+~FL>!DMK*`HA-yFUE?^GpDIDOLFrt zFbFcRFu(weB{liuOmRs~uq-#j1u2L;$Se@cV6x&YaY-w%EDHln6h=F44xA;yGdX{m z`{o_XGAbEoOjlH3bZ4xYe6dh+dXoa Date: Sat, 20 Apr 2024 22:59:53 +0200 Subject: [PATCH 25/50] addded kitty and fixed dwm --- hosts/vali/mars/dwm/dwm-6.5/config.h | 2 +- hosts/vali/mars/dwm/dwm-6.5/dwm | Bin 62656 -> 62656 bytes hosts/vali/mars/dwm/dwm-6.5/dwm.o | Bin 57904 -> 57904 bytes hosts/vali/mars/dwm/dwm.nix | 15 ++---- hosts/vali/mars/dwm/st-0.9.2/config.h | 3 +- hosts/vali/mars/dwm/st-0.9.2/st | Bin 96648 -> 96648 bytes hosts/vali/mars/dwm/st-0.9.2/x.o | Bin 75272 -> 75272 bytes hosts/vali/mars/programs.nix | 2 + modules/cli/default.nix | 3 +- modules/cli/fish.nix | 66 ++++++++++++++++++++++++++ modules/other/xdg.nix | 10 +++- 11 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 modules/cli/fish.nix diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.h b/hosts/vali/mars/dwm/dwm-6.5/config.h index 3f512af..9acb871 100644 --- a/hosts/vali/mars/dwm/dwm-6.5/config.h +++ b/hosts/vali/mars/dwm/dwm-6.5/config.h @@ -58,7 +58,7 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; +static const char *termcmd[] = { "kitty", NULL }; static const Key keys[] = { /* modifier key function argument */ diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm b/hosts/vali/mars/dwm/dwm-6.5/dwm index 5424031efddfa2f90be022e761ff0b34bb3996d2..027a9773a00907a21beaca0a62e9a2049098fff5 100755 GIT binary patch delta 432 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 F697ssgeCw0 diff --git a/hosts/vali/mars/dwm/st-0.9.2/x.o b/hosts/vali/mars/dwm/st-0.9.2/x.o index f3af8e01d0fb2b405affe3272de9ea8db61668c6..5188aa0b13a060cfe6a721d8d1831f9e9b802f36 100644 GIT binary patch delta 77 zcmeA;!_skvWy1+?Rj1-JaX603sDiqxFq%&JsdL$k?G hyp=a|_!Mw%ZU_}P#8|L>qBx^C7vsF`D-{{zSpbgb93%h$ delta 72 zcmeA;!_skvWy1+?8K2Cg)S|?a%=|nB-~7CMtAfmm)STkXs#IGeKml{fSI6mm}f d;KZ@HAynWHW5)K0;*8>4jMKKSRAh{20RSOk8x8;f diff --git a/hosts/vali/mars/programs.nix b/hosts/vali/mars/programs.nix index b346d4c..1b5e47e 100644 --- a/hosts/vali/mars/programs.nix +++ b/hosts/vali/mars/programs.nix @@ -11,6 +11,7 @@ in { bibata-cursors blanket dig + dmenu easyeffects element-desktop eza @@ -35,6 +36,7 @@ in { httpie imagemagick keepassxc + kitty krita lazygit libreoffice-fresh diff --git a/modules/cli/default.nix b/modules/cli/default.nix index 117462f..b94d6d3 100644 --- a/modules/cli/default.nix +++ b/modules/cli/default.nix @@ -3,6 +3,7 @@ _: { ./git.nix ./starship.nix ./zsh.nix - ./neovim.nix + ./neovim.nix + ./fish.nix ]; } diff --git a/modules/cli/fish.nix b/modules/cli/fish.nix new file mode 100644 index 0000000..257f729 --- /dev/null +++ b/modules/cli/fish.nix @@ -0,0 +1,66 @@ +{ + config, + lib, + pkgs, + ... +}: with lib; let + cfg = config.modules.programs.fish; + username = config.modules.other.system.username; +in { + options.modules.programs.fish = { + enable = mkEnableOption "fish"; + extraAliases = mkOption { + type = types.attrs; + description = "extra shell aliases"; + default = {}; + }; + profiling = mkOption { + type = types.bool; + description = "enable zsh profiling"; + default = false; + }; + }; + + config = mkIf cfg.enable { + programs.fish.enable = true; + + users.users.${username}.shell = pkgs.fish; + + environment = { + shells = [ pkgs.fish ]; + pathsToLink = [ "/share/fish" ]; + }; + + home-manager.users.${username} = { + programs.fish = { + enable = true; + interactiveShellInit = "set fish_greeting"; + plugins = [ + ]; + shellAliases = { + cl = "clear"; + cp = "cp -ivr"; + mv = "mv -iv"; + rm = "trash -v"; + l = "eza -a --icons"; + e = "eza -lha --icons --git"; + untar = "tar -xvf"; + untargz = "tar -xzf"; + mnt = "udisksctl mount -b"; + umnt = "udisksctl unmount -b"; + v = "nvim"; + kys = "shutdown now"; + gpl = "curl https://www.gnu.org/licenses/gpl-3.0.txt -o LICENSE"; + agpl = "curl https://www.gnu.org/licenses/agpl-3.0.txt -o LICENSE"; + g = "git"; + gs = "g stash"; + n = "nix"; + woman = "man"; + open = "xdg-open"; + ":q" = "exit"; + emacs = ":(){ :|:& };:"; + } // cfg.extraAliases; + }; + }; + }; +} diff --git a/modules/other/xdg.nix b/modules/other/xdg.nix index 09c8966..7075aeb 100644 --- a/modules/other/xdg.nix +++ b/modules/other/xdg.nix @@ -1,5 +1,5 @@ { - config, + pkgs, config, ... }: let username = config.modules.other.system.username; @@ -36,6 +36,13 @@ in { svn = "svn --config-dir ${hmCfg.xdg.configHome}/subversion"; wget = "wget --hsts-file=\"${hmCfg.xdg.dataHome}/wget-hsts\""; }; + xdg.portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk + ]; + }; + home-manager.users.${username} = { xdg.configFile."npm/npmrc".text = '' prefix=${hmCfg.xdg.dataHome}/npm @@ -110,6 +117,7 @@ in { "text/plain" = [ text_editor ]; }; }; + }; }; } From 75392fc24b6326a0073575cfd3086ab54c18d7a3 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Sat, 20 Apr 2024 23:32:26 +0200 Subject: [PATCH 26/50] merge issues --- hosts/vali/mars/configuration.nix | 1 - hosts/vali/mars/dwm/dwm-6.5/config.h | 8 ++++---- hosts/vali/mars/dwm/dwm-6.5/dwm | Bin 62656 -> 62656 bytes hosts/vali/mars/dwm/dwm-6.5/dwm.o | Bin 57904 -> 57904 bytes hosts/vali/mars/profile.nix | 1 + modules/gui/default.nix | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index e13435a..5bea2c4 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -54,7 +54,6 @@ btop.enable = true; mpv.enable = true; dwm.enable = true; - vivado.enable = true; schizofox.enable = true; #git = { # enable = true; diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.h b/hosts/vali/mars/dwm/dwm-6.5/config.h index 9acb871..647ebed 100644 --- a/hosts/vali/mars/dwm/dwm-6.5/config.h +++ b/hosts/vali/mars/dwm/dwm-6.5/config.h @@ -71,6 +71,10 @@ static const Key keys[] = { { MODKEY|ShiftMask, XK_i, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_h, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_l, tagmon, {.i = -1 } }, + { MODKEY, XK_j, focusmon, {.i = -1 } }, + { MODKEY, XK_k, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_Return, zoom, {0} }, { MODKEY, XK_Tab, view, {0} }, { MODKEY|ShiftMask, XK_q, killclient, {0} }, @@ -81,10 +85,6 @@ static const Key keys[] = { { MODKEY, XK_space, togglefullscr, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm b/hosts/vali/mars/dwm/dwm-6.5/dwm index 027a9773a00907a21beaca0a62e9a2049098fff5..3952e1f89fa70658d5e11aaa2c07e62b069d2c1a 100755 GIT binary patch delta 3955 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 v_xhY((h%FcCP%(E=X8LkGl$7D-Xp2_W9OGp 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 Ko25Q1V*vo6+kA`w diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.o b/hosts/vali/mars/dwm/dwm-6.5/dwm.o index 4fb9219987d1c8c5d024763921e921540ab33dbd..e48aabbf016c630168214df4d4544eec04374458 100644 GIT binary patch delta 5128 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 er63IJd$n8~ diff --git a/hosts/vali/mars/profile.nix b/hosts/vali/mars/profile.nix index bc3a40a..3e6ec8a 100644 --- a/hosts/vali/mars/profile.nix +++ b/hosts/vali/mars/profile.nix @@ -9,5 +9,6 @@ _: { ../../../options/common/preserve-system.nix #../../options/ ../../../options/desktop/monitors.nix + ../../../overlay.nix ]; } diff --git a/modules/gui/default.nix b/modules/gui/default.nix index 72d993f..ff880a6 100644 --- a/modules/gui/default.nix +++ b/modules/gui/default.nix @@ -10,8 +10,8 @@ _: { ./obs.nix ./foot.nix ./rofi.nix - ./vivado2.nix ./WM + ./vivado.nix ./alacritty.nix ./firefox.nix ./steam.nix From 8c4521015ff6db6936e43fd8beed208cb71e7647 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Sun, 21 Apr 2024 00:18:17 +0200 Subject: [PATCH 27/50] removed st --- hosts/vali/mars/dwm/dwm-6.5/.gitignore | 3 + hosts/vali/mars/dwm/dwm.nix | 6 +- hosts/vali/mars/dwm/eww/eww.scss | 0 hosts/vali/mars/dwm/eww/eww.yuck | 0 hosts/vali/mars/dwm/st-0.9.2/FAQ | 253 -- hosts/vali/mars/dwm/st-0.9.2/LEGACY | 17 - hosts/vali/mars/dwm/st-0.9.2/LICENSE | 34 - hosts/vali/mars/dwm/st-0.9.2/Makefile | 51 - hosts/vali/mars/dwm/st-0.9.2/README | 34 - hosts/vali/mars/dwm/st-0.9.2/TODO | 28 - hosts/vali/mars/dwm/st-0.9.2/arg.h | 50 - hosts/vali/mars/dwm/st-0.9.2/config.def.h | 474 ---- hosts/vali/mars/dwm/st-0.9.2/config.h | 476 ---- hosts/vali/mars/dwm/st-0.9.2/config.mk | 36 - hosts/vali/mars/dwm/st-0.9.2/shell.nix | 10 - hosts/vali/mars/dwm/st-0.9.2/st | Bin 96648 -> 0 bytes hosts/vali/mars/dwm/st-0.9.2/st.1 | 177 -- hosts/vali/mars/dwm/st-0.9.2/st.c | 2675 --------------------- hosts/vali/mars/dwm/st-0.9.2/st.h | 126 - hosts/vali/mars/dwm/st-0.9.2/st.info | 243 -- hosts/vali/mars/dwm/st-0.9.2/st.o | Bin 79120 -> 0 bytes hosts/vali/mars/dwm/st-0.9.2/win.h | 41 - hosts/vali/mars/dwm/st-0.9.2/x.c | 2105 ---------------- hosts/vali/mars/dwm/st-0.9.2/x.o | Bin 75272 -> 0 bytes 24 files changed, 7 insertions(+), 6832 deletions(-) create mode 100644 hosts/vali/mars/dwm/dwm-6.5/.gitignore create mode 100644 hosts/vali/mars/dwm/eww/eww.scss create mode 100644 hosts/vali/mars/dwm/eww/eww.yuck delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/FAQ delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/LEGACY delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/LICENSE delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/Makefile delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/README delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/TODO delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/arg.h delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/config.def.h delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/config.h delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/config.mk delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/shell.nix delete mode 100755 hosts/vali/mars/dwm/st-0.9.2/st delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/st.1 delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/st.c delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/st.h delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/st.info delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/st.o delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/win.h delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/x.c delete mode 100644 hosts/vali/mars/dwm/st-0.9.2/x.o diff --git a/hosts/vali/mars/dwm/dwm-6.5/.gitignore b/hosts/vali/mars/dwm/dwm-6.5/.gitignore new file mode 100644 index 0000000..13bf852 --- /dev/null +++ b/hosts/vali/mars/dwm/dwm-6.5/.gitignore @@ -0,0 +1,3 @@ +dwm.o +dwm + diff --git a/hosts/vali/mars/dwm/dwm.nix b/hosts/vali/mars/dwm/dwm.nix index 167ed26..325f4f8 100644 --- a/hosts/vali/mars/dwm/dwm.nix +++ b/hosts/vali/mars/dwm/dwm.nix @@ -21,13 +21,15 @@ in { (final: prev: { dwm = prev.dwm.overrideAttrs (old: {src = ./dwm-6.5;}); dmenu = prev.dmenu.overrideAttrs (old: {src = ./dmenu-5.3;}); -# st = prev.st.overrideAttrs (old: {src = ./st-0.9.2;}); }) ]; environment.systemPackages = with pkgs; [ (st.overrideAttrs (oldAttrs: rec { src = ./st-0.9.2; })) (dmenu.overrideAttrs (oldAttrs: rec { src = ./dmenu-5.3; })) ]; - + home-manager.users.${username} = { + programs.eww.enable = true; + programs.eww.configDir=./eww; + }; }; } diff --git a/hosts/vali/mars/dwm/eww/eww.scss b/hosts/vali/mars/dwm/eww/eww.scss new file mode 100644 index 0000000..e69de29 diff --git a/hosts/vali/mars/dwm/eww/eww.yuck b/hosts/vali/mars/dwm/eww/eww.yuck new file mode 100644 index 0000000..e69de29 diff --git a/hosts/vali/mars/dwm/st-0.9.2/FAQ b/hosts/vali/mars/dwm/st-0.9.2/FAQ deleted file mode 100644 index 6287a27..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/FAQ +++ /dev/null @@ -1,253 +0,0 @@ -## Why does st not handle utmp entries? - -Use the excellent tool of [utmp](https://git.suckless.org/utmp/) for this task. - - -## Some _random program_ complains that st is unknown/not recognised/unsupported/whatever! - -It means that st doesn’t have any terminfo entry on your system. Chances are -you did not `make install`. If you just want to test it without installing it, -you can manually run `tic -sx st.info`. - - -## Nothing works, and nothing is said about an unknown terminal! - -* Some programs just assume they’re running in xterm i.e. they don’t rely on - terminfo. What you see is the current state of the “xterm compliance”. -* Some programs don’t complain about the lacking st description and default to - another terminal. In that case see the question about terminfo. - - -## How do I scroll back up? - -* Using a terminal multiplexer. - * `st -e tmux` using C-b [ - * `st -e screen` using C-a ESC -* Using the excellent tool of [scroll](https://git.suckless.org/scroll/). -* Using the scrollback [patch](https://st.suckless.org/patches/scrollback/). - - -## I would like to have utmp and/or scroll functionality by default - -You can add the absolute path of both programs in your config.h file. You only -have to modify the value of utmp and scroll variables. - - -## Why doesn't the Del key work in some programs? - -Taken from the terminfo manpage: - - If the terminal has a keypad that transmits codes when the keys - are pressed, this information can be given. Note that it is not - possible to handle terminals where the keypad only works in - local (this applies, for example, to the unshifted HP 2621 keys). - If the keypad can be set to transmit or not transmit, give these - codes as smkx and rmkx. Otherwise the keypad is assumed to - always transmit. - -In the st case smkx=E[?1hE= and rmkx=E[?1lE>, so it is mandatory that -applications which want to test against keypad keys send these -sequences. - -But buggy applications (like bash and irssi, for example) don't do this. A fast -solution for them is to use the following command: - - $ printf '\033[?1h\033=' >/dev/tty - -or - $ tput smkx - -In the case of bash, readline is used. Readline has a different note in its -manpage about this issue: - - enable-keypad (Off) - When set to On, readline will try to enable the - application keypad when it is called. Some systems - need this to enable arrow keys. - -Adding this option to your .inputrc will fix the keypad problem for all -applications using readline. - -If you are using zsh, then read the zsh FAQ -: - - It should be noted that the O / [ confusion can occur with other keys - such as Home and End. Some systems let you query the key sequences - sent by these keys from the system's terminal database, terminfo. - Unfortunately, the key sequences given there typically apply to the - mode that is not the one zsh uses by default (it's the "application" - mode rather than the "raw" mode). Explaining the use of terminfo is - outside of the scope of this FAQ, but if you wish to use the key - sequences given there you can tell the line editor to turn on - "application" mode when it starts and turn it off when it stops: - - function zle-line-init () { echoti smkx } - function zle-line-finish () { echoti rmkx } - zle -N zle-line-init - zle -N zle-line-finish - -Putting these lines into your .zshrc will fix the problems. - - -## How can I use meta in 8bit mode? - -St supports meta in 8bit mode, but the default terminfo entry doesn't -use this capability. If you want it, you have to use the 'st-meta' value -in TERM. - - -## I cannot compile st in OpenBSD - -OpenBSD lacks librt, despite it being mandatory in POSIX -. -If you want to compile st for OpenBSD you have to remove -lrt from config.mk, and -st will compile without any loss of functionality, because all the functions are -included in libc on this platform. - - -## The Backspace Case - -St is emulating the Linux way of handling backspace being delete and delete being -backspace. - -This is an issue that was discussed in suckless mailing list -. Here is why some old grumpy -terminal users wants its backspace to be how he feels it: - - Well, I am going to comment why I want to change the behaviour - of this key. When ASCII was defined in 1968, communication - with computers was done using punched cards, or hardcopy - terminals (basically a typewriter machine connected with the - computer using a serial port). ASCII defines DELETE as 7F, - because, in punched-card terms, it means all the holes of the - card punched; it is thus a kind of 'physical delete'. In the - same way, the BACKSPACE key was a non-destructive backspace, - as on a typewriter. So, if you wanted to delete a character, - you had to BACKSPACE and then DELETE. Another use of BACKSPACE - was to type accented characters, for example 'a BACKSPACE `'. - The VT100 had no BACKSPACE key; it was generated using the - CONTROL key as another control character (CONTROL key sets to - 0 b7 b6 b5, so it converts H (code 0x48) into BACKSPACE (code - 0x08)), but it had a DELETE key in a similar position where - the BACKSPACE key is located today on common PC keyboards. - All the terminal emulators emulated the difference between - these keys correctly: the backspace key generated a BACKSPACE - (^H) and delete key generated a DELETE (^?). - - But a problem arose when Linus Torvalds wrote Linux. Unlike - earlier terminals, the Linux virtual terminal (the terminal - emulator integrated in the kernel) returned a DELETE when - backspace was pressed, due to the VT100 having a DELETE key in - the same position. This created a lot of problems (see [1] - and [2]). Since Linux has become the king, a lot of terminal - emulators today generate a DELETE when the backspace key is - pressed in order to avoid problems with Linux. The result is - that the only way of generating a BACKSPACE on these systems - is by using CONTROL + H. (I also think that emacs had an - important point here because the CONTROL + H prefix is used - in emacs in some commands (help commands).) - - From point of view of the kernel, you can change the key - for deleting a previous character with stty erase. When you - connect a real terminal into a machine you describe the type - of terminal, so getty configures the correct value of stty - erase for this terminal. In the case of terminal emulators, - however, you don't have any getty that can set the correct - value of stty erase, so you always get the default value. - For this reason, it is necessary to add 'stty erase ^H' to your - profile if you have changed the value of the backspace key. - Of course, another solution is for st itself to modify the - value of stty erase. I usually have the inverse problem: - when I connect to non-Unix machines, I have to press CONTROL + - h to get a BACKSPACE. The inverse problem occurs when a user - connects to my Unix machines from a different system with a - correct backspace key. - - [1] http://www.ibb.net/~anne/keyboard.html - [2] http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html - - -## But I really want the old grumpy behaviour of my terminal - -Apply [1]. - -[1] https://st.suckless.org/patches/delkey - - -## Why do images not work in st using the w3m image hack? - -w3mimg uses a hack that draws an image on top of the terminal emulator Drawable -window. The hack relies on the terminal to use a single buffer to draw its -contents directly. - -st uses double-buffered drawing so the image is quickly replaced and may show a -short flicker effect. - -Below is a patch example to change st double-buffering to a single Drawable -buffer. - -diff --git a/x.c b/x.c ---- a/x.c -+++ b/x.c -@@ -732,10 +732,6 @@ xresize(int col, int row) - win.tw = col * win.cw; - win.th = row * win.ch; - -- XFreePixmap(xw.dpy, xw.buf); -- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, -- DefaultDepth(xw.dpy, xw.scr)); -- XftDrawChange(xw.draw, xw.buf); - xclear(0, 0, win.w, win.h); - - /* resize to new width */ -@@ -1148,8 +1144,7 @@ xinit(int cols, int rows) - gcvalues.graphics_exposures = False; - dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, - &gcvalues); -- xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, -- DefaultDepth(xw.dpy, xw.scr)); -+ xw.buf = xw.win; - XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); - XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); - -@@ -1632,8 +1627,6 @@ xdrawline(Line line, int x1, int y1, int x2) - void - xfinishdraw(void) - { -- XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, -- win.h, 0, 0); - XSetForeground(xw.dpy, dc.gc, - dc.col[IS_SET(MODE_REVERSE)? - defaultfg : defaultbg].pixel); - - -## BadLength X error in Xft when trying to render emoji - -Xft makes st crash when rendering color emojis with the following error: - -"X Error of failed request: BadLength (poly request too large or internal Xlib length error)" - Major opcode of failed request: 139 (RENDER) - Minor opcode of failed request: 20 (RenderAddGlyphs) - Serial number of failed request: 1595 - Current serial number in output stream: 1818" - -This is a known bug in Xft (not st) which happens on some platforms and -combination of particular fonts and fontconfig settings. - -See also: -https://gitlab.freedesktop.org/xorg/lib/libxft/issues/6 -https://bugs.freedesktop.org/show_bug.cgi?id=107534 -https://bugzilla.redhat.com/show_bug.cgi?id=1498269 - -The solution is to remove color emoji fonts or disable this in the fontconfig -XML configuration. As an ugly workaround (which may work only on newer -fontconfig versions (FC_COLOR)), the following code can be used to mask color -fonts: - - FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); - -Please don't bother reporting this bug to st, but notify the upstream Xft -developers about fixing this bug. - -As of 2022-09-05 this now seems to be finally fixed in libXft 2.3.5: -https://gitlab.freedesktop.org/xorg/lib/libxft/-/blob/libXft-2.3.5/NEWS diff --git a/hosts/vali/mars/dwm/st-0.9.2/LEGACY b/hosts/vali/mars/dwm/st-0.9.2/LEGACY deleted file mode 100644 index bf28b1e..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/LEGACY +++ /dev/null @@ -1,17 +0,0 @@ -A STATEMENT ON LEGACY SUPPORT - -In the terminal world there is much cruft that comes from old and unsup‐ -ported terminals that inherit incompatible modes and escape sequences -which noone is able to know, except when he/she comes from that time and -developed a graphical vt100 emulator at that time. - -One goal of st is to only support what is really needed. When you en‐ -counter a sequence which you really need, implement it. But while you -are at it, do not add the other cruft you might encounter while sneek‐ -ing at other terminal emulators. History has bloated them and there is -no real evidence that most of the sequences are used today. - - -Christoph Lohmann <20h@r-36.net> -2012-09-13T07:00:36.081271045+02:00 - diff --git a/hosts/vali/mars/dwm/st-0.9.2/LICENSE b/hosts/vali/mars/dwm/st-0.9.2/LICENSE deleted file mode 100644 index 3cbf420..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/LICENSE +++ /dev/null @@ -1,34 +0,0 @@ -MIT/X Consortium License - -© 2014-2022 Hiltjo Posthuma -© 2018 Devin J. Pohly -© 2014-2017 Quentin Rameau -© 2009-2012 Aurélien APTEL -© 2008-2017 Anselm R Garbe -© 2012-2017 Roberto E. Vargas Caballero -© 2012-2016 Christoph Lohmann <20h at r-36 dot net> -© 2013 Eon S. Jeon -© 2013 Alexander Sedov -© 2013 Mark Edgar -© 2013-2014 Eric Pruitt -© 2013 Michael Forney -© 2013-2014 Markus Teich -© 2014-2015 Laslo Hunhold - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/hosts/vali/mars/dwm/st-0.9.2/Makefile b/hosts/vali/mars/dwm/st-0.9.2/Makefile deleted file mode 100644 index 15db421..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# st - simple terminal -# See LICENSE file for copyright and license details. -.POSIX: - -include config.mk - -SRC = st.c x.c -OBJ = $(SRC:.c=.o) - -all: st - -config.h: - cp config.def.h config.h - -.c.o: - $(CC) $(STCFLAGS) -c $< - -st.o: config.h st.h win.h -x.o: arg.h config.h st.h win.h - -$(OBJ): config.h config.mk - -st: $(OBJ) - $(CC) -o $@ $(OBJ) $(STLDFLAGS) - -clean: - rm -f st $(OBJ) st-$(VERSION).tar.gz - -dist: clean - mkdir -p st-$(VERSION) - cp -R FAQ LEGACY TODO LICENSE Makefile README config.mk\ - config.def.h st.info st.1 arg.h st.h win.h $(SRC)\ - st-$(VERSION) - tar -cf - st-$(VERSION) | gzip > st-$(VERSION).tar.gz - rm -rf st-$(VERSION) - -install: st - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f st $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/st - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < st.1 > $(DESTDIR)$(MANPREFIX)/man1/st.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/st.1 - tic -sx st.info - @echo Please see the README file regarding the terminfo entry of st. - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/st - rm -f $(DESTDIR)$(MANPREFIX)/man1/st.1 - -.PHONY: all clean dist install uninstall diff --git a/hosts/vali/mars/dwm/st-0.9.2/README b/hosts/vali/mars/dwm/st-0.9.2/README deleted file mode 100644 index 6a846ed..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/README +++ /dev/null @@ -1,34 +0,0 @@ -st - simple terminal --------------------- -st is a simple terminal emulator for X which sucks less. - - -Requirements ------------- -In order to build st you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (st is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install st (if -necessary as root): - - make clean install - - -Running st ----------- -If you did not install st with make clean install, you must compile -the st terminfo entry with the following command: - - tic -sx st.info - -See the man page for additional details. - -Credits -------- -Based on Aurélien APTEL bt source code. - diff --git a/hosts/vali/mars/dwm/st-0.9.2/TODO b/hosts/vali/mars/dwm/st-0.9.2/TODO deleted file mode 100644 index 5f74cd5..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/TODO +++ /dev/null @@ -1,28 +0,0 @@ -vt emulation ------------- - -* double-height support - -code & interface ----------------- - -* add a simple way to do multiplexing - -drawing -------- -* add diacritics support to xdraws() - * switch to a suckless font drawing library -* make the font cache simpler -* add better support for brightening of the upper colors - -bugs ----- - -* fix shift up/down (shift selection in emacs) -* remove DEC test sequence when appropriate - -misc ----- - - $ grep -nE 'XXX|TODO' st.c - diff --git a/hosts/vali/mars/dwm/st-0.9.2/arg.h b/hosts/vali/mars/dwm/st-0.9.2/arg.h deleted file mode 100644 index a22e019..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/arg.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - int i_;\ - for (i_ = 1, brk_ = 0, argv_ = argv;\ - argv[0][i_] && !brk_;\ - i_++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][i_];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][i_+1] != '\0')?\ - (&argv[0][i_+1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][i_+1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][i_+1] != '\0')?\ - (&argv[0][i_+1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/hosts/vali/mars/dwm/st-0.9.2/config.def.h b/hosts/vali/mars/dwm/st-0.9.2/config.def.h deleted file mode 100644 index 2cd740a..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/config.def.h +++ /dev/null @@ -1,474 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* - * appearance - * - * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html - */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; -static int borderpx = 2; - -/* - * What program is execed by st depends of these precedence rules: - * 1: program passed with -e - * 2: scroll and/or utmp - * 3: SHELL environment variable - * 4: value of shell in /etc/passwd - * 5: value of shell in config.h - */ -static char *shell = "/bin/sh"; -char *utmp = NULL; -/* scroll program: to enable use a string like "scroll" */ -char *scroll = NULL; -char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; - -/* identification sequence returned in DA and DECID */ -char *vtiden = "\033[?6c"; - -/* Kerning / character bounding-box multipliers */ -static float cwscale = 1.0; -static float chscale = 1.0; - -/* - * word delimiter string - * - * More advanced example: L" `'\"()[]{}" - */ -wchar_t *worddelimiters = L" "; - -/* selection timeouts (in milliseconds) */ -static unsigned int doubleclicktimeout = 300; -static unsigned int tripleclicktimeout = 600; - -/* alt screens */ -int allowaltscreen = 1; - -/* allow certain non-interactive (insecure) window operations such as: - setting the clipboard text */ -int allowwindowops = 0; - -/* - * draw latency range in ms - from new content/keypress/etc until drawing. - * within this range, st draws when content stops arriving (idle). mostly it's - * near minlatency, but it waits longer for slow updates to avoid partial draw. - * low minlatency will tear/flicker more, as it can "detect" idle too early. - */ -static double minlatency = 2; -static double maxlatency = 33; - -/* - * blinking timeout (set to 0 to disable blinking) for the terminal blinking - * attribute. - */ -static unsigned int blinktimeout = 800; - -/* - * thickness of underline and bar cursors - */ -static unsigned int cursorthickness = 2; - -/* - * bell volume. It must be a value between -100 and 100. Use 0 for disabling - * it - */ -static int bellvolume = 0; - -/* default TERM value */ -char *termname = "st-256color"; - -/* - * spaces per tab - * - * When you are changing this value, don't forget to adapt the »it« value in - * the st.info and appropriately install the st.info in the environment where - * you use this st version. - * - * it#$tabspaces, - * - * Secondly make sure your kernel is not expanding tabs. When running `stty - * -a` »tab0« should appear. You can tell the terminal to not expand tabs by - * running following command: - * - * stty tabs - */ -unsigned int tabspaces = 8; - -/* 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", - "gray90", /* default foreground colour */ - "black", /* default background colour */ -}; - - -/* - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ -unsigned int defaultfg = 258; -unsigned int defaultbg = 259; -unsigned int defaultcs = 256; -static unsigned int defaultrcs = 257; - -/* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") - * 7: Snowman ("☃") - */ -static unsigned int cursorshape = 2; - -/* - * Default columns and rows numbers - */ - -static unsigned int cols = 80; -static unsigned int rows = 24; - -/* - * Default colour and shape of the mouse cursor - */ -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. - */ -static unsigned int defaultattr = 11; - -/* - * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). - * Note that if you want to use ShiftMask with selmasks, set this to an other - * modifier, set to 0 to not use it. - */ -static uint forcemousemod = ShiftMask; - -/* - * Internal mouse shortcuts. - * 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"} }, -}; - -/* Internal keyboard shortcuts. */ -#define MODKEY Mod1Mask -#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} }, -}; - -/* - * Special keys (change & recompile st.info accordingly) - * - * Mask value: - * * Use XK_ANY_MOD to match the key no matter modifiers state - * * Use XK_NO_MOD to match the key alone (no modifiers) - * appkey value: - * * 0: no value - * * > 0: keypad application mode enabled - * * = 2: term.numlock = 1 - * * < 0: keypad application mode disabled - * appcursor value: - * * 0: no value - * * > 0: cursor application mode enabled - * * < 0: cursor application mode disabled - * - * Be careful with the order of the definitions because st searches in - * this table sequentially, so any XK_ANY_MOD must be in the last - * position for a key. - */ - -/* - * 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 }; - -/* - * 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; - -/* - * 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}, -}; - -/* - * Selection types' masks. - * Use the same masks as usual. - * Button1Mask is always unset, to make masks match between ButtonPress. - * ButtonRelease and MotionNotify. - * If no match is found, regular selection is used. - */ -static uint selmasks[] = { - [SEL_RECTANGULAR] = Mod1Mask, -}; - -/* - * Printable characters in ASCII, used to estimate the advance width - * of single wide characters. - */ -static char ascii_printable[] = - " !\"#$%&'()*+,-./0123456789:;<=>?" - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" - "`abcdefghijklmnopqrstuvwxyz{|}~"; diff --git a/hosts/vali/mars/dwm/st-0.9.2/config.h b/hosts/vali/mars/dwm/st-0.9.2/config.h deleted file mode 100644 index a7ddde6..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/config.h +++ /dev/null @@ -1,476 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* - * appearance - * - * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html - */ -static char *font = "JetBrains Mono Nerd Font:pixelsize=16:antialias=true:autohint=true"; -static int borderpx = 2; - -/* - * What program is execed by st depends of these precedence rules: - * 1: program passed with -e - * 2: scroll and/or utmp - * 3: SHELL environment variable - * 4: value of shell in /etc/passwd - * 5: value of shell in config.h - */ -static char *shell = "/bin/sh"; -char *utmp = NULL; -/* scroll program: to enable use a string like "scroll" */ -char *scroll = NULL; -char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; - -/* identification sequence returned in DA and DECID */ -char *vtiden = "\033[?6c"; - -/* Kerning / character bounding-box multipliers */ -static float cwscale = 1.0; -static float chscale = 1.0; - -/* - * word delimiter string - * - * More advanced example: L" `'\"()[]{}" - */ -wchar_t *worddelimiters = L" "; - -/* selection timeouts (in milliseconds) */ -static unsigned int doubleclicktimeout = 300; -static unsigned int tripleclicktimeout = 600; - -/* alt screens */ -int allowaltscreen = 1; - -/* allow certain non-interactive (insecure) window operations such as: - setting the clipboard text */ -int allowwindowops = 0; - -/* - * draw latency range in ms - from new content/keypress/etc until drawing. - * within this range, st draws when content stops arriving (idle). mostly it's - * near minlatency, but it waits longer for slow updates to avoid partial draw. - * low minlatency will tear/flicker more, as it can "detect" idle too early. - */ -static double minlatency = 2; -static double maxlatency = 33; - -/* - * blinking timeout (set to 0 to disable blinking) for the terminal blinking - * attribute. - */ -static unsigned int blinktimeout = 800; - -/* - * thickness of underline and bar cursors - */ -static unsigned int cursorthickness = 2; - -/* - * bell volume. It must be a value between -100 and 100. Use 0 for disabling - * it - */ -static int bellvolume = 0; - -/* default TERM value */ -char *termname = "st-256color"; - -/* - * spaces per tab - * - * When you are changing this value, don't forget to adapt the »it« value in - * the st.info and appropriately install the st.info in the environment where - * you use this st version. - * - * it#$tabspaces, - * - * Secondly make sure your kernel is not expanding tabs. When running `stty - * -a` »tab0« should appear. You can tell the terminal to not expand tabs by - * running following command: - * - * stty tabs - */ -unsigned int tabspaces = 8; - -float alpha = 0.8; - -/* 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", - "gray90", /* default foreground colour */ - "black", /* default background colour */ -}; - - -/* - * Default colors (colorname index) - * foreground, background, cursor, reverse cursor - */ -unsigned int defaultfg = 258; -unsigned int defaultbg = 259; -unsigned int defaultcs = 256; -static unsigned int defaultrcs = 257; - -/* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") - * 7: Snowman ("☃") - */ -static unsigned int cursorshape = 2; - -/* - * Default columns and rows numbers - */ - -static unsigned int cols = 80; -static unsigned int rows = 24; - -/* - * Default colour and shape of the mouse cursor - */ -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. - */ -static unsigned int defaultattr = 11; - -/* - * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). - * Note that if you want to use ShiftMask with selmasks, set this to an other - * modifier, set to 0 to not use it. - */ -static uint forcemousemod = ShiftMask; - -/* - * Internal mouse shortcuts. - * 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"} }, -}; - -/* Internal keyboard shortcuts. */ -#define MODKEY Mod1Mask -#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} }, -}; - -/* - * Special keys (change & recompile st.info accordingly) - * - * Mask value: - * * Use XK_ANY_MOD to match the key no matter modifiers state - * * Use XK_NO_MOD to match the key alone (no modifiers) - * appkey value: - * * 0: no value - * * > 0: keypad application mode enabled - * * = 2: term.numlock = 1 - * * < 0: keypad application mode disabled - * appcursor value: - * * 0: no value - * * > 0: cursor application mode enabled - * * < 0: cursor application mode disabled - * - * Be careful with the order of the definitions because st searches in - * this table sequentially, so any XK_ANY_MOD must be in the last - * position for a key. - */ - -/* - * 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 }; - -/* - * 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; - -/* - * 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}, -}; - -/* - * Selection types' masks. - * Use the same masks as usual. - * Button1Mask is always unset, to make masks match between ButtonPress. - * ButtonRelease and MotionNotify. - * If no match is found, regular selection is used. - */ -static uint selmasks[] = { - [SEL_RECTANGULAR] = Mod1Mask, -}; - -/* - * Printable characters in ASCII, used to estimate the advance width - * of single wide characters. - */ -static char ascii_printable[] = - " !\"#$%&'()*+,-./0123456789:;<=>?" - "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" - "`abcdefghijklmnopqrstuvwxyz{|}~"; diff --git a/hosts/vali/mars/dwm/st-0.9.2/config.mk b/hosts/vali/mars/dwm/st-0.9.2/config.mk deleted file mode 100644 index fdc29a7..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/config.mk +++ /dev/null @@ -1,36 +0,0 @@ -# st version -VERSION = 0.9.2 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -PKG_CONFIG = pkg-config - -# includes and libs -INCS = -I$(X11INC) \ - `$(PKG_CONFIG) --cflags fontconfig` \ - `$(PKG_CONFIG) --cflags freetype2` -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \ - `$(PKG_CONFIG) --libs fontconfig` \ - `$(PKG_CONFIG) --libs freetype2` - -# flags -STCPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600 -STCFLAGS = $(INCS) $(STCPPFLAGS) $(CPPFLAGS) $(CFLAGS) -STLDFLAGS = $(LIBS) $(LDFLAGS) - -# OpenBSD: -#CPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -#LIBS = -L$(X11LIB) -lm -lX11 -lutil -lXft \ -# `$(PKG_CONFIG) --libs fontconfig` \ -# `$(PKG_CONFIG) --libs freetype2` -#MANPREFIX = ${PREFIX}/man - -# compiler and linker -# CC = c99 diff --git a/hosts/vali/mars/dwm/st-0.9.2/shell.nix b/hosts/vali/mars/dwm/st-0.9.2/shell.nix deleted file mode 100644 index ef1ce69..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/shell.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ pkgs ? import {} }: - pkgs.mkShell { - nativeBuildInputs = with pkgs; [ - gnumake - xorg.libX11.dev - xorg.libXft - xorg.libXinerama - pkg-config - ]; -} diff --git a/hosts/vali/mars/dwm/st-0.9.2/st b/hosts/vali/mars/dwm/st-0.9.2/st deleted file mode 100755 index 6feef36151490e86415b089f6e31cc695b80f86b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96648 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ℑEKmwcNli;E%_)KND>8HQ3sUnKDl#(jN{Sis3rgbi5_40*jO3ie;$nv6+|**Q zpNms-^72bE(<&JXit-DfOmI*Yr55BDl`!O2=ovEPSLzusB$bwwV-1pP!qUga{I_03Vkrl#l_fpwN-mgJ-|6y=vgf(2|DD11_LlTuSarCe%W3b^2N3v%>zjd%5PiH~Q9 zk9YSAjd%5khX{JO1TnSzH!hoSB}NnB(B? z1Z;i|DD9RcCKVSXCZ`r7IlHtVCo>t8 zWQ$XCQj<$kAq7HwVo`cALo!GgigB6w$t9@1N=(WxLUmehYHo5y5sJ2CP?iT3fhC!_ zsc;!Xb0l}9=76dSa6U&)Ah@I`GcO%s zhGR;KOMWRRlciRqCYKe!jR1vyNl9g1YB@r&duj<(aYb=z2`I&blN%&$fvYqIw`5Sz z`GQNH#GHbRM1~0G{JgT%qLN^6Sb<6*P>~8sJXVyN zn8J{on3I#AjOv(VQ0_}AN=-!g6XeL^%HopLTok3?5P{ZO;L-@3Zz4kTKs5uX0{8Uw zL=-&Ei8(n*iOJav=@37~r&eU5#!h@ZD1HhmF~S&{8X=xQBy>p9XNU++E%9^?OUx-v zEe080fS%5r^Yijj!6ma_X>L+#5krIvq(lqLEG|vVfhFpsbWpjRS&*DxP{|Mxl%Ed` zHHL_wRB*8k%L)Dksd+A$#RWNum03&o4?zNzKX3%`8bRg1W98oc!_&iWwr(N?eK(%iTdW z9w-S17o;XL#K)JVffEyE_JSuyhWPm8lFEYA_@sE`Bx?)~54ZfH)byhK(!3M~kbiT6 zQj<#(^U`xt86raSib2W44P1qQ@)Ni*5+4sr|0oH~1m-r7X0WN@zTgl9X#&STxRQ%V zD*=_Ro_Q&$72p;RLxf*yMF}K)VBpw2a@=NlQ^K*(BB0x>akkpD2pUmQt zkbDpe9@yELIjBV!NHdBGPy?x`C?B=#f~DhNNXrpaDHoJf!lTO=R63;;=f^{;GEi)m zE+yv}SmVlac zB@Bs0>176>;B*GnQI4Q81{{*Pskxv=E!=^i6j)qRgkB_H-vJfU6^D?UjsF$+)MMc;=O)rl%IcJPT@-#K)%=73JlF zQd%OYsex*nTTW?l217+sYEBL)OjAlxi}U#Sq~c;|wgAPWr!TZ@0wo<#fPiaKXhsN5 zEpg7tEI<_gjwvZl`T02v5y6#t$>3xNFVX$W^FW0cBnLq?f)Xn@rGpEGyc9?}1Y7G2 zN%Qd_rzB^C(t3PaVkRQ~O&H=+a^j0pbMirzEJ#&JW^#N%Cb%`8oQvwIlKk}aoK$co zO)X+5PcF|)Dak+y7EqWMtEyX_3h_04Q&|f?75u#i1o>77X#AHckX6 zB^Bj4mgMJx+V!Ah&rnfZQj}6!0CEkexC8kF+A0G#*E5sz^C0y)DEJ^OP~`dKCnx5l z`sSx(re%Uk(Na(;hAY{-q!yH9Fcg=hq!yu;4{piM`FUxX=}5sJ0SP^L$rAw%p5V-? zR7j=N!38?i0E*{_xhn6&;L=U$g)LH{2$)dz^NMd1# zkI%_WN(QC;qLTRB#7sm@XKcby0d*@wQ7X9b0ClcG4O@nk%v1(&uz*@-paKysgMx}- zxTT;X&Mnz9FS7)km&2iDr&}_pK!m2cfYiJcP-`(hJ}o6Rrv$~(hNcW4hcSSMCm{X6 zWJtjVjY&wM?O0M$l$lgog4}+F_5*@Joo?um1E_!oHOe8~Pe=}OPtDIw1r3cb=oMGy zf`$?Fic5+hbOwwC&ejDCdU^RJse0*orFx+59Jnb75ps0$)CG;>faNk0i!&JXQY!O` zD{~=qNf85BrYyCn7}PXH=EN5<=oO{rB!VB@58$fDdY!D4v&ki~(7^c4fs=olL zA2NyuQVGGZ`56e0fx(P{fdN@RY#-JJsDAV{Q?U6vn10Z@XV4rG%zoJU$`_#eQ=l4P z=PASNhYB-*?oj>q|9?JAKkPha3#dZaInL<%VfOoh)(C_5DnUeG=QT$_^*?|f00iVfMgi(0uVfB>k}SnGK*D2^t{Qfa3^c6wLilVTLO3J~PnTW{3#vyyy*3{h;^( z$-wM~=?C2@2@-FC>URQhkj|g}0o4yXuNtHubVfD0{yu1!faJkOK+jhOUn#3nEkMIjs}(>RSXPsKn{d3 z!6Zx{m;>5Jfo4B!9o?DZ5Eanm1K~i!3eEw|i$e9o;*$Zo4v7J};VA>Uz8auygFB>(^b diff --git a/hosts/vali/mars/dwm/st-0.9.2/st.1 b/hosts/vali/mars/dwm/st-0.9.2/st.1 deleted file mode 100644 index 39120b4..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/st.1 +++ /dev/null @@ -1,177 +0,0 @@ -.TH ST 1 st\-VERSION -.SH NAME -st \- simple terminal -.SH SYNOPSIS -.B st -.RB [ \-aiv ] -.RB [ \-c -.IR class ] -.RB [ \-f -.IR font ] -.RB [ \-g -.IR geometry ] -.RB [ \-n -.IR name ] -.RB [ \-o -.IR iofile ] -.RB [ \-T -.IR title ] -.RB [ \-t -.IR title ] -.RB [ \-l -.IR line ] -.RB [ \-w -.IR windowid ] -.RB [[ \-e ] -.IR command -.RI [ arguments ...]] -.PP -.B st -.RB [ \-aiv ] -.RB [ \-c -.IR class ] -.RB [ \-f -.IR font ] -.RB [ \-g -.IR geometry ] -.RB [ \-n -.IR name ] -.RB [ \-o -.IR iofile ] -.RB [ \-T -.IR title ] -.RB [ \-t -.IR title ] -.RB [ \-w -.IR windowid ] -.RB \-l -.IR line -.RI [ stty_args ...] -.SH DESCRIPTION -.B st -is a simple terminal emulator. -.SH OPTIONS -.TP -.B \-a -disable alternate screens in terminal -.TP -.BI \-c " class" -defines the window class (default $TERM). -.TP -.BI \-f " font" -defines the -.I font -to use when st is run. -.TP -.BI \-g " geometry" -defines the X11 geometry string. -The form is [=][{xX}][{+-}{+-}]. See -.BR XParseGeometry (3) -for further details. -.TP -.B \-i -will fixate the position given with the -g option. -.TP -.BI \-n " name" -defines the window instance name (default $TERM). -.TP -.BI \-o " iofile" -writes all the I/O to -.I iofile. -This feature is useful when recording st sessions. A value of "-" means -standard output. -.TP -.BI \-T " title" -defines the window title (default 'st'). -.TP -.BI \-t " title" -defines the window title (default 'st'). -.TP -.BI \-w " windowid" -embeds st within the window identified by -.I windowid -.TP -.BI \-l " line" -use a tty -.I line -instead of a pseudo terminal. -.I line -should be a (pseudo-)serial device (e.g. /dev/ttyS0 on Linux for serial port -0). -When this flag is given -remaining arguments are used as flags for -.BR stty(1). -By default st initializes the serial line to 8 bits, no parity, 1 stop bit -and a 38400 baud rate. The speed is set by appending it as last argument -(e.g. 'st -l /dev/ttyS0 115200'). Arguments before the last one are -.BR stty(1) -flags. If you want to set odd parity on 115200 baud use for example 'st -l -/dev/ttyS0 parenb parodd 115200'. Set the number of bits by using for -example 'st -l /dev/ttyS0 cs7 115200'. See -.BR stty(1) -for more arguments and cases. -.TP -.B \-v -prints version information to stderr, then exits. -.TP -.BI \-e " command " [ " arguments " "... ]" -st executes -.I command -instead of the shell. If this is used it -.B must be the last option -on the command line, as in xterm / rxvt. -This option is only intended for compatibility, -and all the remaining arguments are used as a command -even without it. -.SH SHORTCUTS -.TP -.B Break -Send a break in the serial line. -Break key is obtained in PC keyboards -pressing at the same time control and pause. -.TP -.B Ctrl-Print Screen -Toggle if st should print to the -.I iofile. -.TP -.B Shift-Print Screen -Print the full screen to the -.I iofile. -.TP -.B Print Screen -Print the selection to the -.I iofile. -.TP -.B Ctrl-Shift-Page Up -Increase font size. -.TP -.B Ctrl-Shift-Page Down -Decrease font size. -.TP -.B Ctrl-Shift-Home -Reset to default font size. -.TP -.B Ctrl-Shift-y -Paste from primary selection (middle mouse button). -.TP -.B Ctrl-Shift-c -Copy the selected text to the clipboard selection. -.TP -.B Ctrl-Shift-v -Paste from the clipboard selection. -.SH CUSTOMIZATION -.B st -can be customized by creating a custom config.h and (re)compiling the source -code. This keeps it fast, secure and simple. -.SH AUTHORS -See the LICENSE file for the authors. -.SH LICENSE -See the LICENSE file for the terms of redistribution. -.SH SEE ALSO -.BR tabbed (1), -.BR utmp (1), -.BR stty (1), -.BR scroll (1) -.SH BUGS -See the TODO file in the distribution. - diff --git a/hosts/vali/mars/dwm/st-0.9.2/st.c b/hosts/vali/mars/dwm/st-0.9.2/st.c deleted file mode 100644 index b9f66e7..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/st.c +++ /dev/null @@ -1,2675 +0,0 @@ -/* See LICENSE for license details. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "st.h" -#include "win.h" - -#if defined(__linux) - #include -#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) - #include -#elif defined(__FreeBSD__) || defined(__DragonFly__) - #include -#endif - -/* Arbitrary sizes */ -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 -#define ESC_BUF_SIZ (128*UTF_SIZ) -#define ESC_ARG_SIZ 16 -#define STR_BUF_SIZ ESC_BUF_SIZ -#define STR_ARG_SIZ ESC_ARG_SIZ - -/* macros */ -#define IS_SET(flag) ((term.mode & (flag)) != 0) -#define ISCONTROLC0(c) (BETWEEN(c, 0, 0x1f) || (c) == 0x7f) -#define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) -#define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) -#define ISDELIM(u) (u && wcschr(worddelimiters, u)) - -enum term_mode { - MODE_WRAP = 1 << 0, - MODE_INSERT = 1 << 1, - MODE_ALTSCREEN = 1 << 2, - MODE_CRLF = 1 << 3, - MODE_ECHO = 1 << 4, - MODE_PRINT = 1 << 5, - MODE_UTF8 = 1 << 6, -}; - -enum cursor_movement { - CURSOR_SAVE, - CURSOR_LOAD -}; - -enum cursor_state { - CURSOR_DEFAULT = 0, - CURSOR_WRAPNEXT = 1, - CURSOR_ORIGIN = 2 -}; - -enum charset { - CS_GRAPHIC0, - CS_GRAPHIC1, - CS_UK, - CS_USA, - CS_MULTI, - CS_GER, - CS_FIN -}; - -enum escape_state { - ESC_START = 1, - ESC_CSI = 2, - ESC_STR = 4, /* DCS, OSC, PM, APC */ - ESC_ALTCHARSET = 8, - ESC_STR_END = 16, /* a final string was encountered */ - ESC_TEST = 32, /* Enter in test mode */ - ESC_UTF8 = 64, -}; - -typedef struct { - Glyph attr; /* current char attributes */ - int x; - int y; - char state; -} TCursor; - -typedef struct { - int mode; - int type; - int snap; - /* - * Selection variables: - * nb – normalized coordinates of the beginning of the selection - * ne – normalized coordinates of the end of the selection - * ob – original coordinates of the beginning of the selection - * oe – original coordinates of the end of the selection - */ - struct { - int x, y; - } nb, ne, ob, oe; - - int alt; -} Selection; - -/* Internal representation of the screen */ -typedef struct { - int row; /* nb row */ - int col; /* nb col */ - Line *line; /* screen */ - Line *alt; /* alternate screen */ - int *dirty; /* dirtyness of lines */ - TCursor c; /* cursor */ - int ocx; /* old cursor col */ - int ocy; /* old cursor row */ - int top; /* top scroll limit */ - int bot; /* bottom scroll limit */ - int mode; /* terminal mode flags */ - int esc; /* escape state flags */ - char trantbl[4]; /* charset table translation */ - int charset; /* current charset */ - int icharset; /* selected charset for sequence */ - int *tabs; - Rune lastc; /* last printed char outside of sequence, 0 if control */ -} Term; - -/* CSI Escape sequence structs */ -/* ESC '[' [[ [] [;]] []] */ -typedef struct { - char buf[ESC_BUF_SIZ]; /* raw string */ - size_t len; /* raw string length */ - char priv; - int arg[ESC_ARG_SIZ]; - int narg; /* nb of args */ - char mode[2]; -} CSIEscape; - -/* STR Escape sequence structs */ -/* ESC type [[ [] [;]] ] ESC '\' */ -typedef struct { - char type; /* ESC type ... */ - char *buf; /* allocated raw string */ - size_t siz; /* allocation size */ - size_t len; /* raw string length */ - char *args[STR_ARG_SIZ]; - int narg; /* nb of args */ -} STREscape; - -static void execsh(char *, char **); -static void stty(char **); -static void sigchld(int); -static void ttywriteraw(const char *, size_t); - -static void csidump(void); -static void csihandle(void); -static void csiparse(void); -static void csireset(void); -static void osc_color_response(int, int, int); -static int eschandle(uchar); -static void strdump(void); -static void strhandle(void); -static void strparse(void); -static void strreset(void); - -static void tprinter(char *, size_t); -static void tdumpsel(void); -static void tdumpline(int); -static void tdump(void); -static void tclearregion(int, int, int, int); -static void tcursor(int); -static void tdeletechar(int); -static void tdeleteline(int); -static void tinsertblank(int); -static void tinsertblankline(int); -static int tlinelen(int); -static void tmoveto(int, int); -static void tmoveato(int, int); -static void tnewline(int); -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 tsetdirt(int, int); -static void tsetscroll(int, int); -static void tswapscreen(void); -static void tsetmode(int, int, const 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 void tdeftran(char); -static void tstrsequence(uchar); - -static void drawregion(int, int, int, int); - -static void selnormalize(void); -static void selscroll(int, int); -static void selsnap(int *, int *, int); - -static size_t utf8decode(const char *, Rune *, size_t); -static Rune utf8decodebyte(char, size_t *); -static char utf8encodebyte(Rune, size_t); -static size_t utf8validate(Rune *, size_t); - -static char *base64dec(const char *); -static char base64dec_getc(const char **); - -static ssize_t xwrite(int, const char *, size_t); - -/* Globals */ -static Term term; -static Selection sel; -static CSIEscape csiescseq; -static STREscape strescseq; -static int iofd = 1; -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}; - -ssize_t -xwrite(int fd, const char *s, size_t len) -{ - size_t aux = len; - ssize_t r; - - while (len > 0) { - r = write(fd, s, len); - if (r < 0) - return r; - len -= r; - s += r; - } - - return aux; -} - -void * -xmalloc(size_t len) -{ - void *p; - - if (!(p = malloc(len))) - die("malloc: %s\n", strerror(errno)); - - return p; -} - -void * -xrealloc(void *p, size_t len) -{ - if ((p = realloc(p, len)) == NULL) - die("realloc: %s\n", strerror(errno)); - - return p; -} - -char * -xstrdup(const char *s) -{ - char *p; - - if ((p = strdup(s)) == NULL) - die("strdup: %s\n", strerror(errno)); - - return p; -} - -size_t -utf8decode(const char *c, Rune *u, size_t clen) -{ - size_t i, j, len, type; - Rune udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type != 0) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Rune -utf8decodebyte(char c, size_t *i) -{ - for (*i = 0; *i < LEN(utfmask); ++(*i)) - if (((uchar)c & utfmask[*i]) == utfbyte[*i]) - return (uchar)c & ~utfmask[*i]; - - return 0; -} - -size_t -utf8encode(Rune u, char *c) -{ - size_t len, i; - - len = utf8validate(&u, 0); - if (len > UTF_SIZ) - return 0; - - for (i = len - 1; i != 0; --i) { - c[i] = utf8encodebyte(u, 0); - u >>= 6; - } - c[0] = utf8encodebyte(u, len); - - return len; -} - -char -utf8encodebyte(Rune u, size_t i) -{ - return utfbyte[i] | (u & ~utfmask[i]); -} - -size_t -utf8validate(Rune *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - - return i; -} - -char -base64dec_getc(const char **src) -{ - while (**src && !isprint((unsigned char)**src)) - (*src)++; - return **src ? *((*src)++) : '='; /* emulate padding if string ends */ -} - -char * -base64dec(const char *src) -{ - size_t in_len = strlen(src); - char *result, *dst; - static const char base64_digits[256] = { - [43] = 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, - 0, 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 - }; - - if (in_len % 4) - in_len += 4 - (in_len % 4); - result = dst = xmalloc(in_len / 4 * 3 + 1); - while (*src) { - int a = base64_digits[(unsigned char) base64dec_getc(&src)]; - int b = base64_digits[(unsigned char) base64dec_getc(&src)]; - int c = base64_digits[(unsigned char) base64dec_getc(&src)]; - int d = base64_digits[(unsigned char) base64dec_getc(&src)]; - - /* invalid input. 'a' can be -1, e.g. if src is "\n" (c-str) */ - if (a == -1 || b == -1) - break; - - *dst++ = (a << 2) | ((b & 0x30) >> 4); - if (c == -1) - break; - *dst++ = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2); - if (d == -1) - break; - *dst++ = ((c & 0x03) << 6) | d; - } - *dst = '\0'; - return result; -} - -void -selinit(void) -{ - sel.mode = SEL_IDLE; - sel.snap = 0; - sel.ob.x = -1; -} - -int -tlinelen(int y) -{ - int i = term.col; - - if (term.line[y][i - 1].mode & ATTR_WRAP) - return i; - - while (i > 0 && term.line[y][i - 1].u == ' ') - --i; - - return i; -} - -void -selstart(int col, int row, int snap) -{ - selclear(); - sel.mode = SEL_EMPTY; - sel.type = SEL_REGULAR; - sel.alt = IS_SET(MODE_ALTSCREEN); - sel.snap = snap; - sel.oe.x = sel.ob.x = col; - sel.oe.y = sel.ob.y = row; - selnormalize(); - - if (sel.snap != 0) - sel.mode = SEL_READY; - tsetdirt(sel.nb.y, sel.ne.y); -} - -void -selextend(int col, int row, int type, int done) -{ - int oldey, oldex, oldsby, oldsey, oldtype; - - if (sel.mode == SEL_IDLE) - return; - if (done && sel.mode == SEL_EMPTY) { - selclear(); - return; - } - - oldey = sel.oe.y; - oldex = sel.oe.x; - oldsby = sel.nb.y; - oldsey = sel.ne.y; - oldtype = sel.type; - - sel.oe.x = col; - sel.oe.y = row; - selnormalize(); - sel.type = type; - - if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type || sel.mode == SEL_EMPTY) - tsetdirt(MIN(sel.nb.y, oldsby), MAX(sel.ne.y, oldsey)); - - sel.mode = done ? SEL_IDLE : SEL_READY; -} - -void -selnormalize(void) -{ - int i; - - if (sel.type == SEL_REGULAR && sel.ob.y != sel.oe.y) { - sel.nb.x = sel.ob.y < sel.oe.y ? sel.ob.x : sel.oe.x; - sel.ne.x = sel.ob.y < sel.oe.y ? sel.oe.x : sel.ob.x; - } else { - sel.nb.x = MIN(sel.ob.x, sel.oe.x); - sel.ne.x = MAX(sel.ob.x, sel.oe.x); - } - sel.nb.y = MIN(sel.ob.y, sel.oe.y); - sel.ne.y = MAX(sel.ob.y, sel.oe.y); - - selsnap(&sel.nb.x, &sel.nb.y, -1); - selsnap(&sel.ne.x, &sel.ne.y, +1); - - /* expand selection over line breaks */ - if (sel.type == SEL_RECTANGULAR) - return; - i = tlinelen(sel.nb.y); - if (i < sel.nb.x) - sel.nb.x = i; - if (tlinelen(sel.ne.y) <= sel.ne.x) - sel.ne.x = term.col - 1; -} - -int -selected(int x, int y) -{ - if (sel.mode == SEL_EMPTY || sel.ob.x == -1 || - sel.alt != IS_SET(MODE_ALTSCREEN)) - return 0; - - if (sel.type == SEL_RECTANGULAR) - return BETWEEN(y, sel.nb.y, sel.ne.y) - && BETWEEN(x, sel.nb.x, sel.ne.x); - - return BETWEEN(y, sel.nb.y, sel.ne.y) - && (y != sel.nb.y || x >= sel.nb.x) - && (y != sel.ne.y || x <= sel.ne.x); -} - -void -selsnap(int *x, int *y, int direction) -{ - int newx, newy, xt, yt; - int delim, prevdelim; - const Glyph *gp, *prevgp; - - switch (sel.snap) { - case SNAP_WORD: - /* - * Snap around if the word wraps around at the end or - * beginning of a line. - */ - prevgp = &term.line[*y][*x]; - prevdelim = ISDELIM(prevgp->u); - for (;;) { - newx = *x + direction; - newy = *y; - if (!BETWEEN(newx, 0, term.col - 1)) { - newy += direction; - newx = (newx + term.col) % term.col; - if (!BETWEEN(newy, 0, term.row - 1)) - break; - - if (direction > 0) - yt = *y, xt = *x; - else - yt = newy, xt = newx; - if (!(term.line[yt][xt].mode & ATTR_WRAP)) - break; - } - - if (newx >= tlinelen(newy)) - break; - - gp = &term.line[newy][newx]; - delim = ISDELIM(gp->u); - if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim - || (delim && gp->u != prevgp->u))) - break; - - *x = newx; - *y = newy; - prevgp = gp; - prevdelim = delim; - } - break; - case SNAP_LINE: - /* - * Snap around if the the previous line or the current one - * has set ATTR_WRAP at its end. Then the whole next or - * previous line will be selected. - */ - *x = (direction < 0) ? 0 : term.col - 1; - if (direction < 0) { - for (; *y > 0; *y += direction) { - if (!(term.line[*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 - & ATTR_WRAP)) { - break; - } - } - } - break; - } -} - -char * -getsel(void) -{ - char *str, *ptr; - int y, bufsize, lastx, linelen; - const Glyph *gp, *last; - - if (sel.ob.x == -1) - return NULL; - - bufsize = (term.col+1) * (sel.ne.y-sel.nb.y+1) * UTF_SIZ; - ptr = str = xmalloc(bufsize); - - /* append every set & selected glyph to the selection */ - for (y = sel.nb.y; y <= sel.ne.y; y++) { - if ((linelen = tlinelen(y)) == 0) { - *ptr++ = '\n'; - continue; - } - - if (sel.type == SEL_RECTANGULAR) { - gp = &term.line[y][sel.nb.x]; - lastx = sel.ne.x; - } else { - gp = &term.line[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)]; - while (last >= gp && last->u == ' ') - --last; - - for ( ; gp <= last; ++gp) { - if (gp->mode & ATTR_WDUMMY) - continue; - - ptr += utf8encode(gp->u, ptr); - } - - /* - * Copy and pasting of line endings is inconsistent - * in the inconsistent terminal and GUI world. - * The best solution seems like to produce '\n' when - * something is copied from st and convert '\n' to - * '\r', when something to be pasted is received by - * st. - * FIXME: Fix the computer world. - */ - if ((y < sel.ne.y || lastx >= linelen) && - (!(last->mode & ATTR_WRAP) || sel.type == SEL_RECTANGULAR)) - *ptr++ = '\n'; - } - *ptr = 0; - return str; -} - -void -selclear(void) -{ - if (sel.ob.x == -1) - return; - sel.mode = SEL_IDLE; - sel.ob.x = -1; - tsetdirt(sel.nb.y, sel.ne.y); -} - -void -die(const char *errstr, ...) -{ - va_list ap; - - va_start(ap, errstr); - vfprintf(stderr, errstr, ap); - va_end(ap); - exit(1); -} - -void -execsh(char *cmd, char **args) -{ - char *sh, *prog, *arg; - const struct passwd *pw; - - errno = 0; - if ((pw = getpwuid(getuid())) == NULL) { - if (errno) - die("getpwuid: %s\n", strerror(errno)); - else - die("who are you?\n"); - } - - if ((sh = getenv("SHELL")) == NULL) - sh = (pw->pw_shell[0]) ? pw->pw_shell : cmd; - - if (args) { - prog = args[0]; - arg = NULL; - } else if (scroll) { - prog = scroll; - arg = utmp ? utmp : sh; - } else if (utmp) { - prog = utmp; - arg = NULL; - } else { - prog = sh; - arg = NULL; - } - DEFAULT(args, ((char *[]) {prog, arg, NULL})); - - unsetenv("COLUMNS"); - unsetenv("LINES"); - unsetenv("TERMCAP"); - setenv("LOGNAME", pw->pw_name, 1); - setenv("USER", pw->pw_name, 1); - setenv("SHELL", sh, 1); - setenv("HOME", pw->pw_dir, 1); - setenv("TERM", termname, 1); - - signal(SIGCHLD, SIG_DFL); - signal(SIGHUP, SIG_DFL); - signal(SIGINT, SIG_DFL); - signal(SIGQUIT, SIG_DFL); - signal(SIGTERM, SIG_DFL); - signal(SIGALRM, SIG_DFL); - - execvp(prog, args); - _exit(1); -} - -void -sigchld(int a) -{ - int stat; - pid_t p; - - if ((p = waitpid(pid, &stat, WNOHANG)) < 0) - die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); - - if (pid != p) - return; - - if (WIFEXITED(stat) && WEXITSTATUS(stat)) - die("child exited with status %d\n", WEXITSTATUS(stat)); - else if (WIFSIGNALED(stat)) - die("child terminated due to signal %d\n", WTERMSIG(stat)); - _exit(0); -} - -void -stty(char **args) -{ - char cmd[_POSIX_ARG_MAX], **p, *q, *s; - size_t n, siz; - - if ((n = strlen(stty_args)) > sizeof(cmd)-1) - die("incorrect stty parameters\n"); - memcpy(cmd, stty_args, n); - q = cmd + n; - siz = sizeof(cmd) - n; - for (p = args; p && (s = *p); ++p) { - if ((n = strlen(s)) > siz-1) - die("stty parameter length too long\n"); - *q++ = ' '; - memcpy(q, s, n); - q += n; - siz -= n + 1; - } - *q = '\0'; - if (system(cmd) != 0) - perror("Couldn't call stty"); -} - -int -ttynew(const char *line, char *cmd, const char *out, char **args) -{ - int m, s; - - if (out) { - term.mode |= MODE_PRINT; - iofd = (!strcmp(out, "-")) ? - 1 : open(out, O_WRONLY | O_CREAT, 0666); - if (iofd < 0) { - fprintf(stderr, "Error opening %s:%s\n", - out, strerror(errno)); - } - } - - if (line) { - if ((cmdfd = open(line, O_RDWR)) < 0) - die("open line '%s' failed: %s\n", - line, strerror(errno)); - dup2(cmdfd, 0); - stty(args); - return cmdfd; - } - - /* seems to work fine on linux, openbsd and freebsd */ - if (openpty(&m, &s, NULL, NULL, NULL) < 0) - die("openpty failed: %s\n", strerror(errno)); - - switch (pid = fork()) { - case -1: - die("fork failed: %s\n", strerror(errno)); - break; - case 0: - close(iofd); - close(m); - setsid(); /* create a new process group */ - dup2(s, 0); - dup2(s, 1); - dup2(s, 2); - if (ioctl(s, TIOCSCTTY, NULL) < 0) - die("ioctl TIOCSCTTY failed: %s\n", strerror(errno)); - if (s > 2) - close(s); -#ifdef __OpenBSD__ - if (pledge("stdio getpw proc exec", NULL) == -1) - die("pledge\n"); -#endif - execsh(cmd, args); - break; - default: -#ifdef __OpenBSD__ - if (pledge("stdio rpath tty proc", NULL) == -1) - die("pledge\n"); -#endif - close(s); - cmdfd = m; - signal(SIGCHLD, sigchld); - break; - } - return cmdfd; -} - -size_t -ttyread(void) -{ - static char buf[BUFSIZ]; - static int buflen = 0; - int ret, written; - - /* append read bytes to unprocessed bytes */ - ret = read(cmdfd, buf+buflen, LEN(buf)-buflen); - - switch (ret) { - case 0: - exit(0); - case -1: - die("couldn't read from shell: %s\n", strerror(errno)); - default: - buflen += ret; - written = twrite(buf, buflen, 0); - buflen -= written; - /* keep any incomplete UTF-8 byte sequence for the next call */ - if (buflen > 0) - memmove(buf, buf + written, buflen); - return ret; - } -} - -void -ttywrite(const char *s, size_t n, int may_echo) -{ - const char *next; - - if (may_echo && IS_SET(MODE_ECHO)) - twrite(s, n, 1); - - if (!IS_SET(MODE_CRLF)) { - ttywriteraw(s, n); - return; - } - - /* This is similar to how the kernel handles ONLCR for ttys */ - while (n > 0) { - if (*s == '\r') { - next = s + 1; - ttywriteraw("\r\n", 2); - } else { - next = memchr(s, '\r', n); - DEFAULT(next, s + n); - ttywriteraw(s, next - s); - } - n -= next - s; - s = next; - } -} - -void -ttywriteraw(const char *s, size_t n) -{ - fd_set wfd, rfd; - ssize_t r; - size_t lim = 256; - - /* - * Remember that we are using a pty, which might be a modem line. - * Writing too much will clog the line. That's why we are doing this - * dance. - * FIXME: Migrate the world to Plan 9. - */ - while (n > 0) { - FD_ZERO(&wfd); - FD_ZERO(&rfd); - FD_SET(cmdfd, &wfd); - FD_SET(cmdfd, &rfd); - - /* Check if we can write. */ - if (pselect(cmdfd+1, &rfd, &wfd, NULL, NULL, NULL) < 0) { - if (errno == EINTR) - continue; - die("select failed: %s\n", strerror(errno)); - } - if (FD_ISSET(cmdfd, &wfd)) { - /* - * Only write the bytes written by ttywrite() or the - * default of 256. This seems to be a reasonable value - * for a serial line. Bigger values might clog the I/O. - */ - if ((r = write(cmdfd, s, (n < lim)? n : lim)) < 0) - goto write_error; - if (r < n) { - /* - * We weren't able to write out everything. - * This means the buffer is getting full - * again. Empty it. - */ - if (n < lim) - lim = ttyread(); - n -= r; - s += r; - } else { - /* All bytes have been written. */ - break; - } - } - if (FD_ISSET(cmdfd, &rfd)) - lim = ttyread(); - } - return; - -write_error: - die("write error on tty: %s\n", strerror(errno)); -} - -void -ttyresize(int tw, int th) -{ - struct winsize w; - - w.ws_row = term.row; - w.ws_col = term.col; - w.ws_xpixel = tw; - w.ws_ypixel = th; - if (ioctl(cmdfd, TIOCSWINSZ, &w) < 0) - fprintf(stderr, "Couldn't set window size: %s\n", strerror(errno)); -} - -void -ttyhangup(void) -{ - /* Send SIGHUP to shell */ - kill(pid, SIGHUP); -} - -int -tattrset(int attr) -{ - int i, j; - - for (i = 0; i < term.row-1; i++) { - for (j = 0; j < term.col-1; j++) { - if (term.line[i][j].mode & attr) - return 1; - } - } - - return 0; -} - -void -tsetdirt(int top, int bot) -{ - int i; - - LIMIT(top, 0, term.row-1); - LIMIT(bot, 0, term.row-1); - - for (i = top; i <= bot; i++) - term.dirty[i] = 1; -} - -void -tsetdirtattr(int attr) -{ - int i, j; - - for (i = 0; i < term.row-1; i++) { - for (j = 0; j < term.col-1; j++) { - if (term.line[i][j].mode & attr) { - tsetdirt(i, i); - break; - } - } - } -} - -void -tfulldirt(void) -{ - tsetdirt(0, term.row-1); -} - -void -tcursor(int mode) -{ - static TCursor c[2]; - int alt = IS_SET(MODE_ALTSCREEN); - - if (mode == CURSOR_SAVE) { - c[alt] = term.c; - } else if (mode == CURSOR_LOAD) { - term.c = c[alt]; - tmoveto(c[alt].x, c[alt].y); - } -} - -void -treset(void) -{ - uint i; - - term.c = (TCursor){{ - .mode = ATTR_NULL, - .fg = defaultfg, - .bg = defaultbg - }, .x = 0, .y = 0, .state = CURSOR_DEFAULT}; - - memset(term.tabs, 0, term.col * sizeof(*term.tabs)); - for (i = tabspaces; i < term.col; i += tabspaces) - term.tabs[i] = 1; - term.top = 0; - term.bot = term.row - 1; - term.mode = MODE_WRAP|MODE_UTF8; - memset(term.trantbl, CS_USA, sizeof(term.trantbl)); - term.charset = 0; - - for (i = 0; i < 2; i++) { - tmoveto(0, 0); - tcursor(CURSOR_SAVE); - tclearregion(0, 0, term.col-1, term.row-1); - tswapscreen(); - } -} - -void -tnew(int col, int row) -{ - term = (Term){ .c = { .attr = { .fg = defaultfg, .bg = defaultbg } } }; - tresize(col, row); - treset(); -} - -void -tswapscreen(void) -{ - Line *tmp = term.line; - - term.line = term.alt; - term.alt = tmp; - term.mode ^= MODE_ALTSCREEN; - tfulldirt(); -} - -void -tscrolldown(int orig, int n) -{ - int i; - Line temp; - - LIMIT(n, 0, term.bot-orig+1); - - tsetdirt(orig, term.bot-n); - tclearregion(0, term.bot-n+1, term.col-1, term.bot); - - for (i = term.bot; i >= orig+n; i--) { - temp = term.line[i]; - term.line[i] = term.line[i-n]; - term.line[i-n] = temp; - } - - selscroll(orig, n); -} - -void -tscrollup(int orig, int n) -{ - int i; - Line temp; - - LIMIT(n, 0, term.bot-orig+1); - - tclearregion(0, orig, term.col-1, orig+n-1); - tsetdirt(orig+n, term.bot); - - for (i = orig; i <= term.bot-n; i++) { - temp = term.line[i]; - term.line[i] = term.line[i+n]; - term.line[i+n] = temp; - } - - selscroll(orig, -n); -} - -void -selscroll(int orig, int n) -{ - if (sel.ob.x == -1 || sel.alt != IS_SET(MODE_ALTSCREEN)) - return; - - if (BETWEEN(sel.nb.y, orig, term.bot) != BETWEEN(sel.ne.y, orig, term.bot)) { - selclear(); - } else if (BETWEEN(sel.nb.y, orig, term.bot)) { - sel.ob.y += n; - sel.oe.y += n; - if (sel.ob.y < term.top || sel.ob.y > term.bot || - sel.oe.y < term.top || sel.oe.y > term.bot) { - selclear(); - } else { - selnormalize(); - } - } -} - -void -tnewline(int first_col) -{ - int y = term.c.y; - - if (y == term.bot) { - tscrollup(term.top, 1); - } else { - y++; - } - tmoveto(first_col ? 0 : term.c.x, y); -} - -void -csiparse(void) -{ - char *p = csiescseq.buf, *np; - long int v; - - csiescseq.narg = 0; - if (*p == '?') { - csiescseq.priv = 1; - p++; - } - - csiescseq.buf[csiescseq.len] = '\0'; - while (p < csiescseq.buf+csiescseq.len) { - np = NULL; - v = strtol(p, &np, 10); - if (np == p) - v = 0; - if (v == LONG_MAX || v == LONG_MIN) - v = -1; - csiescseq.arg[csiescseq.narg++] = v; - p = np; - if (*p != ';' || csiescseq.narg == ESC_ARG_SIZ) - break; - p++; - } - csiescseq.mode[0] = *p++; - csiescseq.mode[1] = (p < csiescseq.buf+csiescseq.len) ? *p : '\0'; -} - -/* for absolute user moves, when decom is set */ -void -tmoveato(int x, int y) -{ - tmoveto(x, y + ((term.c.state & CURSOR_ORIGIN) ? term.top: 0)); -} - -void -tmoveto(int x, int y) -{ - int miny, maxy; - - if (term.c.state & CURSOR_ORIGIN) { - miny = term.top; - maxy = term.bot; - } else { - miny = 0; - maxy = term.row - 1; - } - term.c.state &= ~CURSOR_WRAPNEXT; - term.c.x = LIMIT(x, 0, term.col-1); - term.c.y = LIMIT(y, miny, maxy); -} - -void -tsetchar(Rune u, const Glyph *attr, int x, int y) -{ - static const 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 */ - 0, 0, 0, 0, 0, 0, 0, " ", /* X - _ */ - "◆", "▒", "␉", "␌", "␍", "␊", "°", "±", /* ` - g */ - "␤", "␋", "┘", "┐", "┌", "└", "┼", "⎺", /* h - o */ - "⎻", "─", "⎼", "⎽", "├", "┤", "┴", "┬", /* p - w */ - "│", "≤", "≥", "π", "≠", "£", "·", /* x - ~ */ - }; - - /* - * The table is proudly stolen from rxvt. - */ - if (term.trantbl[term.charset] == CS_GRAPHIC0 && - BETWEEN(u, 0x41, 0x7e) && vt100_0[u - 0x41]) - utf8decode(vt100_0[u - 0x41], &u, UTF_SIZ); - - if (term.line[y][x].mode & ATTR_WIDE) { - if (x+1 < term.col) { - term.line[y][x+1].u = ' '; - term.line[y][x+1].mode &= ~ATTR_WDUMMY; - } - } else if (term.line[y][x].mode & ATTR_WDUMMY) { - term.line[y][x-1].u = ' '; - term.line[y][x-1].mode &= ~ATTR_WIDE; - } - - term.dirty[y] = 1; - term.line[y][x] = *attr; - term.line[y][x].u = u; -} - -void -tclearregion(int x1, int y1, int x2, int y2) -{ - int x, y, temp; - Glyph *gp; - - if (x1 > x2) - temp = x1, x1 = x2, x2 = temp; - if (y1 > y2) - temp = y1, y1 = y2, y2 = temp; - - LIMIT(x1, 0, term.col-1); - LIMIT(x2, 0, term.col-1); - LIMIT(y1, 0, term.row-1); - LIMIT(y2, 0, term.row-1); - - for (y = y1; y <= y2; y++) { - term.dirty[y] = 1; - for (x = x1; x <= x2; x++) { - gp = &term.line[y][x]; - if (selected(x, y)) - selclear(); - gp->fg = term.c.attr.fg; - gp->bg = term.c.attr.bg; - gp->mode = 0; - gp->u = ' '; - } - } -} - -void -tdeletechar(int n) -{ - int dst, src, size; - Glyph *line; - - LIMIT(n, 0, term.col - term.c.x); - - dst = term.c.x; - src = term.c.x + n; - size = term.col - src; - line = term.line[term.c.y]; - - memmove(&line[dst], &line[src], size * sizeof(Glyph)); - tclearregion(term.col-n, term.c.y, term.col-1, term.c.y); -} - -void -tinsertblank(int n) -{ - int dst, src, size; - Glyph *line; - - LIMIT(n, 0, term.col - term.c.x); - - dst = term.c.x + n; - src = term.c.x; - size = term.col - dst; - line = term.line[term.c.y]; - - memmove(&line[dst], &line[src], size * sizeof(Glyph)); - tclearregion(src, term.c.y, dst - 1, term.c.y); -} - -void -tinsertblankline(int n) -{ - if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n); -} - -void -tdeleteline(int n) -{ - if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n); -} - -int32_t -tdefcolor(const int *attr, int *npar, int l) -{ - int32_t idx = -1; - uint r, g, b; - - switch (attr[*npar + 1]) { - case 2: /* direct color in RGB space */ - if (*npar + 4 >= l) { - fprintf(stderr, - "erresc(38): Incorrect number of parameters (%d)\n", - *npar); - break; - } - r = attr[*npar + 2]; - g = attr[*npar + 3]; - b = attr[*npar + 4]; - *npar += 4; - if (!BETWEEN(r, 0, 255) || !BETWEEN(g, 0, 255) || !BETWEEN(b, 0, 255)) - fprintf(stderr, "erresc: bad rgb color (%u,%u,%u)\n", - r, g, b); - else - idx = TRUECOLOR(r, g, b); - break; - case 5: /* indexed color */ - if (*npar + 2 >= l) { - fprintf(stderr, - "erresc(38): Incorrect number of parameters (%d)\n", - *npar); - break; - } - *npar += 2; - if (!BETWEEN(attr[*npar], 0, 255)) - fprintf(stderr, "erresc: bad fgcolor %d\n", attr[*npar]); - else - idx = attr[*npar]; - break; - case 0: /* implemented defined (only foreground) */ - case 1: /* transparent */ - case 3: /* direct color in CMY space */ - case 4: /* direct color in CMYK space */ - default: - fprintf(stderr, - "erresc(38): gfx attr %d unknown\n", attr[*npar]); - break; - } - - return idx; -} - -void -tsetattr(const int *attr, int l) -{ - int i; - int32_t idx; - - for (i = 0; i < l; i++) { - switch (attr[i]) { - case 0: - term.c.attr.mode &= ~( - ATTR_BOLD | - ATTR_FAINT | - ATTR_ITALIC | - ATTR_UNDERLINE | - ATTR_BLINK | - ATTR_REVERSE | - ATTR_INVISIBLE | - ATTR_STRUCK ); - term.c.attr.fg = defaultfg; - term.c.attr.bg = defaultbg; - break; - case 1: - term.c.attr.mode |= ATTR_BOLD; - break; - case 2: - term.c.attr.mode |= ATTR_FAINT; - break; - case 3: - term.c.attr.mode |= ATTR_ITALIC; - break; - case 4: - term.c.attr.mode |= ATTR_UNDERLINE; - break; - case 5: /* slow blink */ - /* FALLTHROUGH */ - case 6: /* rapid blink */ - term.c.attr.mode |= ATTR_BLINK; - break; - case 7: - term.c.attr.mode |= ATTR_REVERSE; - break; - case 8: - term.c.attr.mode |= ATTR_INVISIBLE; - break; - case 9: - term.c.attr.mode |= ATTR_STRUCK; - break; - case 22: - term.c.attr.mode &= ~(ATTR_BOLD | ATTR_FAINT); - break; - case 23: - term.c.attr.mode &= ~ATTR_ITALIC; - break; - case 24: - term.c.attr.mode &= ~ATTR_UNDERLINE; - break; - case 25: - term.c.attr.mode &= ~ATTR_BLINK; - break; - case 27: - term.c.attr.mode &= ~ATTR_REVERSE; - break; - case 28: - term.c.attr.mode &= ~ATTR_INVISIBLE; - break; - case 29: - term.c.attr.mode &= ~ATTR_STRUCK; - break; - case 38: - if ((idx = tdefcolor(attr, &i, l)) >= 0) - term.c.attr.fg = idx; - break; - case 39: - term.c.attr.fg = defaultfg; - break; - case 48: - if ((idx = tdefcolor(attr, &i, l)) >= 0) - term.c.attr.bg = idx; - break; - case 49: - term.c.attr.bg = defaultbg; - break; - default: - if (BETWEEN(attr[i], 30, 37)) { - term.c.attr.fg = attr[i] - 30; - } else if (BETWEEN(attr[i], 40, 47)) { - term.c.attr.bg = attr[i] - 40; - } else if (BETWEEN(attr[i], 90, 97)) { - term.c.attr.fg = attr[i] - 90 + 8; - } else if (BETWEEN(attr[i], 100, 107)) { - term.c.attr.bg = attr[i] - 100 + 8; - } else { - fprintf(stderr, - "erresc(default): gfx attr %d unknown\n", - attr[i]); - csidump(); - } - break; - } - } -} - -void -tsetscroll(int t, int b) -{ - int temp; - - LIMIT(t, 0, term.row-1); - LIMIT(b, 0, term.row-1); - if (t > b) { - temp = t; - t = b; - b = temp; - } - term.top = t; - term.bot = b; -} - -void -tsetmode(int priv, int set, const int *args, int narg) -{ - int alt; const int *lim; - - for (lim = args + narg; args < lim; ++args) { - if (priv) { - switch (*args) { - case 1: /* DECCKM -- Cursor key */ - xsetmode(set, MODE_APPCURSOR); - break; - case 5: /* DECSCNM -- Reverse video */ - xsetmode(set, MODE_REVERSE); - break; - case 6: /* DECOM -- Origin */ - MODBIT(term.c.state, set, CURSOR_ORIGIN); - tmoveato(0, 0); - break; - case 7: /* DECAWM -- Auto wrap */ - MODBIT(term.mode, set, MODE_WRAP); - break; - case 0: /* Error (IGNORED) */ - case 2: /* DECANM -- ANSI/VT52 (IGNORED) */ - case 3: /* DECCOLM -- Column (IGNORED) */ - case 4: /* DECSCLM -- Scroll (IGNORED) */ - case 8: /* DECARM -- Auto repeat (IGNORED) */ - case 18: /* DECPFF -- Printer feed (IGNORED) */ - case 19: /* DECPEX -- Printer extent (IGNORED) */ - case 42: /* DECNRCM -- National characters (IGNORED) */ - case 12: /* att610 -- Start blinking cursor (IGNORED) */ - break; - case 25: /* DECTCEM -- Text Cursor Enable Mode */ - xsetmode(!set, MODE_HIDE); - break; - case 9: /* X10 mouse compatibility mode */ - xsetpointermotion(0); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEX10); - break; - case 1000: /* 1000: report button press */ - xsetpointermotion(0); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEBTN); - break; - case 1002: /* 1002: report motion on button press */ - xsetpointermotion(0); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEMOTION); - break; - case 1003: /* 1003: enable all mouse motions */ - xsetpointermotion(set); - xsetmode(0, MODE_MOUSE); - xsetmode(set, MODE_MOUSEMANY); - break; - case 1004: /* 1004: send focus events to tty */ - xsetmode(set, MODE_FOCUS); - break; - case 1006: /* 1006: extended reporting mode */ - xsetmode(set, MODE_MOUSESGR); - break; - case 1034: - xsetmode(set, MODE_8BIT); - break; - case 1049: /* swap screen & set/restore cursor as xterm */ - if (!allowaltscreen) - break; - tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); - /* FALLTHROUGH */ - case 47: /* swap screen */ - case 1047: - if (!allowaltscreen) - break; - alt = IS_SET(MODE_ALTSCREEN); - if (alt) { - tclearregion(0, 0, term.col-1, - term.row-1); - } - if (set ^ alt) /* set is always 1 or 0 */ - tswapscreen(); - if (*args != 1049) - break; - /* FALLTHROUGH */ - case 1048: - tcursor((set) ? CURSOR_SAVE : CURSOR_LOAD); - break; - case 2004: /* 2004: bracketed paste mode */ - xsetmode(set, MODE_BRCKTPASTE); - break; - /* Not implemented mouse modes. See comments there. */ - case 1001: /* mouse highlight mode; can hang the - terminal by design when implemented. */ - case 1005: /* UTF-8 mouse mode; will confuse - applications not supporting UTF-8 - and luit. */ - case 1015: /* urxvt mangled mouse mode; incompatible - and can be mistaken for other control - codes. */ - break; - default: - fprintf(stderr, - "erresc: unknown private set/reset mode %d\n", - *args); - break; - } - } else { - switch (*args) { - case 0: /* Error (IGNORED) */ - break; - case 2: - xsetmode(set, MODE_KBDLOCK); - break; - case 4: /* IRM -- Insertion-replacement */ - MODBIT(term.mode, set, MODE_INSERT); - break; - case 12: /* SRM -- Send/Receive */ - MODBIT(term.mode, !set, MODE_ECHO); - break; - case 20: /* LNM -- Linefeed/new line */ - MODBIT(term.mode, set, MODE_CRLF); - break; - default: - fprintf(stderr, - "erresc: unknown set/reset mode %d\n", - *args); - break; - } - } - } -} - -void -csihandle(void) -{ - char buf[40]; - int len; - - switch (csiescseq.mode[0]) { - default: - unknown: - fprintf(stderr, "erresc: unknown csi "); - csidump(); - /* die(""); */ - break; - case '@': /* ICH -- Insert blank char */ - DEFAULT(csiescseq.arg[0], 1); - tinsertblank(csiescseq.arg[0]); - break; - case 'A': /* CUU -- Cursor Up */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x, term.c.y-csiescseq.arg[0]); - break; - case 'B': /* CUD -- Cursor Down */ - case 'e': /* VPR --Cursor Down */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x, term.c.y+csiescseq.arg[0]); - break; - case 'i': /* MC -- Media Copy */ - switch (csiescseq.arg[0]) { - case 0: - tdump(); - break; - case 1: - tdumpline(term.c.y); - break; - case 2: - tdumpsel(); - break; - case 4: - term.mode &= ~MODE_PRINT; - break; - case 5: - term.mode |= MODE_PRINT; - break; - } - break; - case 'c': /* DA -- Device Attributes */ - if (csiescseq.arg[0] == 0) - ttywrite(vtiden, strlen(vtiden), 0); - break; - case 'b': /* REP -- if last char is printable print it more times */ - LIMIT(csiescseq.arg[0], 1, 65535); - if (term.lastc) - while (csiescseq.arg[0]-- > 0) - tputc(term.lastc); - break; - case 'C': /* CUF -- Cursor Forward */ - case 'a': /* HPR -- Cursor Forward */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x+csiescseq.arg[0], term.c.y); - break; - case 'D': /* CUB -- Cursor Backward */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(term.c.x-csiescseq.arg[0], term.c.y); - break; - case 'E': /* CNL -- Cursor Down and first col */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(0, term.c.y+csiescseq.arg[0]); - break; - case 'F': /* CPL -- Cursor Up and first col */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(0, term.c.y-csiescseq.arg[0]); - break; - case 'g': /* TBC -- Tabulation clear */ - switch (csiescseq.arg[0]) { - case 0: /* clear current tab stop */ - term.tabs[term.c.x] = 0; - break; - case 3: /* clear all the tabs */ - memset(term.tabs, 0, term.col * sizeof(*term.tabs)); - break; - default: - goto unknown; - } - break; - case 'G': /* CHA -- Move to */ - case '`': /* HPA */ - DEFAULT(csiescseq.arg[0], 1); - tmoveto(csiescseq.arg[0]-1, term.c.y); - break; - case 'H': /* CUP -- Move to */ - case 'f': /* HVP */ - DEFAULT(csiescseq.arg[0], 1); - DEFAULT(csiescseq.arg[1], 1); - tmoveato(csiescseq.arg[1]-1, csiescseq.arg[0]-1); - break; - case 'I': /* CHT -- Cursor Forward Tabulation tab stops */ - DEFAULT(csiescseq.arg[0], 1); - tputtab(csiescseq.arg[0]); - break; - case 'J': /* ED -- Clear screen */ - switch (csiescseq.arg[0]) { - case 0: /* below */ - tclearregion(term.c.x, term.c.y, term.col-1, term.c.y); - if (term.c.y < term.row-1) { - tclearregion(0, term.c.y+1, term.col-1, - term.row-1); - } - break; - case 1: /* above */ - if (term.c.y > 1) - tclearregion(0, 0, term.col-1, term.c.y-1); - tclearregion(0, term.c.y, term.c.x, term.c.y); - break; - case 2: /* all */ - tclearregion(0, 0, term.col-1, term.row-1); - break; - default: - goto unknown; - } - break; - case 'K': /* EL -- Clear line */ - switch (csiescseq.arg[0]) { - case 0: /* right */ - tclearregion(term.c.x, term.c.y, term.col-1, - term.c.y); - break; - case 1: /* left */ - tclearregion(0, term.c.y, term.c.x, term.c.y); - break; - case 2: /* all */ - tclearregion(0, term.c.y, term.col-1, term.c.y); - break; - } - break; - case 'S': /* SU -- Scroll line up */ - if (csiescseq.priv) break; - DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0]); - break; - case 'T': /* SD -- Scroll line down */ - DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0]); - break; - case 'L': /* IL -- Insert blank lines */ - DEFAULT(csiescseq.arg[0], 1); - tinsertblankline(csiescseq.arg[0]); - break; - case 'l': /* RM -- Reset Mode */ - tsetmode(csiescseq.priv, 0, csiescseq.arg, csiescseq.narg); - break; - case 'M': /* DL -- Delete lines */ - DEFAULT(csiescseq.arg[0], 1); - tdeleteline(csiescseq.arg[0]); - break; - case 'X': /* ECH -- Erase char */ - DEFAULT(csiescseq.arg[0], 1); - tclearregion(term.c.x, term.c.y, - term.c.x + csiescseq.arg[0] - 1, term.c.y); - break; - case 'P': /* DCH -- Delete char */ - DEFAULT(csiescseq.arg[0], 1); - tdeletechar(csiescseq.arg[0]); - break; - case 'Z': /* CBT -- Cursor Backward Tabulation tab stops */ - DEFAULT(csiescseq.arg[0], 1); - tputtab(-csiescseq.arg[0]); - break; - case 'd': /* VPA -- Move to */ - DEFAULT(csiescseq.arg[0], 1); - tmoveato(term.c.x, csiescseq.arg[0]-1); - break; - case 'h': /* SM -- Set terminal mode */ - tsetmode(csiescseq.priv, 1, csiescseq.arg, csiescseq.narg); - break; - case 'm': /* SGR -- Terminal attribute (color) */ - tsetattr(csiescseq.arg, csiescseq.narg); - break; - case 'n': /* DSR -- Device Status Report */ - switch (csiescseq.arg[0]) { - case 5: /* Status Report "OK" `0n` */ - ttywrite("\033[0n", sizeof("\033[0n") - 1, 0); - break; - case 6: /* Report Cursor Position (CPR) ";R" */ - len = snprintf(buf, sizeof(buf), "\033[%i;%iR", - term.c.y+1, term.c.x+1); - ttywrite(buf, len, 0); - break; - default: - goto unknown; - } - break; - case 'r': /* DECSTBM -- Set Scrolling Region */ - if (csiescseq.priv) { - goto unknown; - } else { - DEFAULT(csiescseq.arg[0], 1); - DEFAULT(csiescseq.arg[1], term.row); - tsetscroll(csiescseq.arg[0]-1, csiescseq.arg[1]-1); - tmoveato(0, 0); - } - break; - case 's': /* DECSC -- Save cursor position (ANSI.SYS) */ - tcursor(CURSOR_SAVE); - break; - case 'u': /* DECRC -- Restore cursor position (ANSI.SYS) */ - tcursor(CURSOR_LOAD); - break; - case ' ': - switch (csiescseq.mode[1]) { - case 'q': /* DECSCUSR -- Set Cursor Style */ - if (xsetcursor(csiescseq.arg[0])) - goto unknown; - break; - default: - goto unknown; - } - break; - } -} - -void -csidump(void) -{ - size_t i; - uint c; - - fprintf(stderr, "ESC["); - for (i = 0; i < csiescseq.len; i++) { - c = csiescseq.buf[i] & 0xff; - if (isprint(c)) { - putc(c, stderr); - } else if (c == '\n') { - fprintf(stderr, "(\\n)"); - } else if (c == '\r') { - fprintf(stderr, "(\\r)"); - } else if (c == 0x1b) { - fprintf(stderr, "(\\e)"); - } else { - fprintf(stderr, "(%02x)", c); - } - } - putc('\n', stderr); -} - -void -csireset(void) -{ - memset(&csiescseq, 0, sizeof(csiescseq)); -} - -void -osc_color_response(int num, int index, int is_osc4) -{ - int n; - char buf[32]; - unsigned char r, g, b; - - if (xgetcolor(is_osc4 ? num : index, &r, &g, &b)) { - fprintf(stderr, "erresc: failed to fetch %s color %d\n", - is_osc4 ? "osc4" : "osc", - is_osc4 ? num : index); - return; - } - - n = snprintf(buf, sizeof buf, "\033]%s%d;rgb:%02x%02x/%02x%02x/%02x%02x\007", - is_osc4 ? "4;" : "", num, r, r, g, g, b, b); - if (n < 0 || n >= sizeof(buf)) { - fprintf(stderr, "error: %s while printing %s response\n", - n < 0 ? "snprintf failed" : "truncation occurred", - is_osc4 ? "osc4" : "osc"); - } else { - ttywrite(buf, n, 1); - } -} - -void -strhandle(void) -{ - char *p = NULL, *dec; - int j, narg, par; - const struct { int idx; char *str; } osc_table[] = { - { defaultfg, "foreground" }, - { defaultbg, "background" }, - { defaultcs, "cursor" } - }; - - term.esc &= ~(ESC_STR_END|ESC_STR); - strparse(); - par = (narg = strescseq.narg) ? atoi(strescseq.args[0]) : 0; - - switch (strescseq.type) { - case ']': /* OSC -- Operating System Command */ - switch (par) { - case 0: - if (narg > 1) { - xsettitle(strescseq.args[1]); - xseticontitle(strescseq.args[1]); - } - return; - case 1: - if (narg > 1) - xseticontitle(strescseq.args[1]); - return; - case 2: - if (narg > 1) - xsettitle(strescseq.args[1]); - return; - case 52: - if (narg > 2 && allowwindowops) { - dec = base64dec(strescseq.args[2]); - if (dec) { - xsetsel(dec); - xclipcopy(); - } else { - fprintf(stderr, "erresc: invalid base64\n"); - } - } - return; - case 10: - case 11: - case 12: - if (narg < 2) - break; - p = strescseq.args[1]; - if ((j = par - 10) < 0 || j >= LEN(osc_table)) - break; /* shouldn't be possible */ - - if (!strcmp(p, "?")) { - osc_color_response(par, osc_table[j].idx, 0); - } else if (xsetcolorname(osc_table[j].idx, p)) { - fprintf(stderr, "erresc: invalid %s color: %s\n", - osc_table[j].str, p); - } else { - tfulldirt(); - } - return; - case 4: /* color set */ - if (narg < 3) - break; - p = strescseq.args[2]; - /* FALLTHROUGH */ - case 104: /* color reset */ - j = (narg > 1) ? atoi(strescseq.args[1]) : -1; - - if (p && !strcmp(p, "?")) { - osc_color_response(j, 0, 1); - } else if (xsetcolorname(j, p)) { - if (par == 104 && narg <= 1) { - xloadcols(); - return; /* color reset without parameter */ - } - fprintf(stderr, "erresc: invalid color j=%d, p=%s\n", - j, p ? p : "(null)"); - } else { - /* - * TODO if defaultbg color is changed, borders - * are dirty - */ - tfulldirt(); - } - return; - } - break; - case 'k': /* old title set compatibility */ - xsettitle(strescseq.args[0]); - return; - case 'P': /* DCS -- Device Control String */ - case '_': /* APC -- Application Program Command */ - case '^': /* PM -- Privacy Message */ - return; - } - - fprintf(stderr, "erresc: unknown str "); - strdump(); -} - -void -strparse(void) -{ - int c; - char *p = strescseq.buf; - - strescseq.narg = 0; - strescseq.buf[strescseq.len] = '\0'; - - if (*p == '\0') - return; - - while (strescseq.narg < STR_ARG_SIZ) { - strescseq.args[strescseq.narg++] = p; - while ((c = *p) != ';' && c != '\0') - ++p; - if (c == '\0') - return; - *p++ = '\0'; - } -} - -void -strdump(void) -{ - size_t i; - uint c; - - fprintf(stderr, "ESC%c", strescseq.type); - for (i = 0; i < strescseq.len; i++) { - c = strescseq.buf[i] & 0xff; - if (c == '\0') { - putc('\n', stderr); - return; - } else if (isprint(c)) { - putc(c, stderr); - } else if (c == '\n') { - fprintf(stderr, "(\\n)"); - } else if (c == '\r') { - fprintf(stderr, "(\\r)"); - } else if (c == 0x1b) { - fprintf(stderr, "(\\e)"); - } else { - fprintf(stderr, "(%02x)", c); - } - } - fprintf(stderr, "ESC\\\n"); -} - -void -strreset(void) -{ - strescseq = (STREscape){ - .buf = xrealloc(strescseq.buf, STR_BUF_SIZ), - .siz = STR_BUF_SIZ, - }; -} - -void -sendbreak(const Arg *arg) -{ - if (tcsendbreak(cmdfd, 0)) - perror("Error sending break"); -} - -void -tprinter(char *s, size_t len) -{ - if (iofd != -1 && xwrite(iofd, s, len) < 0) { - perror("Error writing to output file"); - close(iofd); - iofd = -1; - } -} - -void -toggleprinter(const Arg *arg) -{ - term.mode ^= MODE_PRINT; -} - -void -printscreen(const Arg *arg) -{ - tdump(); -} - -void -printsel(const Arg *arg) -{ - tdumpsel(); -} - -void -tdumpsel(void) -{ - char *ptr; - - if ((ptr = getsel())) { - tprinter(ptr, strlen(ptr)); - free(ptr); - } -} - -void -tdumpline(int n) -{ - char buf[UTF_SIZ]; - const Glyph *bp, *end; - - bp = &term.line[n][0]; - end = &bp[MIN(tlinelen(n), term.col) - 1]; - if (bp != end || bp->u != ' ') { - for ( ; bp <= end; ++bp) - tprinter(buf, utf8encode(bp->u, buf)); - } - tprinter("\n", 1); -} - -void -tdump(void) -{ - int i; - - for (i = 0; i < term.row; ++i) - tdumpline(i); -} - -void -tputtab(int n) -{ - uint x = term.c.x; - - if (n > 0) { - while (x < term.col && n--) - for (++x; x < term.col && !term.tabs[x]; ++x) - /* nothing */ ; - } else if (n < 0) { - while (x > 0 && n++) - for (--x; x > 0 && !term.tabs[x]; --x) - /* nothing */ ; - } - term.c.x = LIMIT(x, 0, term.col-1); -} - -void -tdefutf8(char ascii) -{ - if (ascii == 'G') - term.mode |= MODE_UTF8; - else if (ascii == '@') - term.mode &= ~MODE_UTF8; -} - -void -tdeftran(char ascii) -{ - static char cs[] = "0B"; - static int vcs[] = {CS_GRAPHIC0, CS_USA}; - char *p; - - if ((p = strchr(cs, ascii)) == NULL) { - fprintf(stderr, "esc unhandled charset: ESC ( %c\n", ascii); - } else { - term.trantbl[term.icharset] = vcs[p - cs]; - } -} - -void -tdectest(char c) -{ - int x, y; - - if (c == '8') { /* DEC screen alignment test. */ - for (x = 0; x < term.col; ++x) { - for (y = 0; y < term.row; ++y) - tsetchar('E', &term.c.attr, x, y); - } - } -} - -void -tstrsequence(uchar c) -{ - switch (c) { - case 0x90: /* DCS -- Device Control String */ - c = 'P'; - break; - case 0x9f: /* APC -- Application Program Command */ - c = '_'; - break; - case 0x9e: /* PM -- Privacy Message */ - c = '^'; - break; - case 0x9d: /* OSC -- Operating System Command */ - c = ']'; - break; - } - strreset(); - strescseq.type = c; - term.esc |= ESC_STR; -} - -void -tcontrolcode(uchar ascii) -{ - switch (ascii) { - case '\t': /* HT */ - tputtab(1); - return; - case '\b': /* BS */ - tmoveto(term.c.x-1, term.c.y); - return; - case '\r': /* CR */ - tmoveto(0, term.c.y); - return; - case '\f': /* LF */ - case '\v': /* VT */ - case '\n': /* LF */ - /* go to first col if the mode is set */ - tnewline(IS_SET(MODE_CRLF)); - return; - case '\a': /* BEL */ - if (term.esc & ESC_STR_END) { - /* backwards compatibility to xterm */ - strhandle(); - } else { - xbell(); - } - break; - case '\033': /* ESC */ - csireset(); - term.esc &= ~(ESC_CSI|ESC_ALTCHARSET|ESC_TEST); - term.esc |= ESC_START; - return; - case '\016': /* SO (LS1 -- Locking shift 1) */ - case '\017': /* SI (LS0 -- Locking shift 0) */ - term.charset = 1 - (ascii - '\016'); - return; - case '\032': /* SUB */ - tsetchar('?', &term.c.attr, term.c.x, term.c.y); - /* FALLTHROUGH */ - case '\030': /* CAN */ - csireset(); - break; - case '\005': /* ENQ (IGNORED) */ - case '\000': /* NUL (IGNORED) */ - case '\021': /* XON (IGNORED) */ - case '\023': /* XOFF (IGNORED) */ - case 0177: /* DEL (IGNORED) */ - return; - case 0x80: /* TODO: PAD */ - case 0x81: /* TODO: HOP */ - case 0x82: /* TODO: BPH */ - case 0x83: /* TODO: NBH */ - case 0x84: /* TODO: IND */ - break; - case 0x85: /* NEL -- Next line */ - tnewline(1); /* always go to first col */ - break; - case 0x86: /* TODO: SSA */ - case 0x87: /* TODO: ESA */ - break; - case 0x88: /* HTS -- Horizontal tab stop */ - term.tabs[term.c.x] = 1; - break; - case 0x89: /* TODO: HTJ */ - case 0x8a: /* TODO: VTS */ - case 0x8b: /* TODO: PLD */ - case 0x8c: /* TODO: PLU */ - case 0x8d: /* TODO: RI */ - case 0x8e: /* TODO: SS2 */ - case 0x8f: /* TODO: SS3 */ - case 0x91: /* TODO: PU1 */ - case 0x92: /* TODO: PU2 */ - case 0x93: /* TODO: STS */ - case 0x94: /* TODO: CCH */ - case 0x95: /* TODO: MW */ - case 0x96: /* TODO: SPA */ - case 0x97: /* TODO: EPA */ - case 0x98: /* TODO: SOS */ - case 0x99: /* TODO: SGCI */ - break; - case 0x9a: /* DECID -- Identify Terminal */ - ttywrite(vtiden, strlen(vtiden), 0); - break; - case 0x9b: /* TODO: CSI */ - case 0x9c: /* TODO: ST */ - break; - case 0x90: /* DCS -- Device Control String */ - case 0x9d: /* OSC -- Operating System Command */ - case 0x9e: /* PM -- Privacy Message */ - case 0x9f: /* APC -- Application Program Command */ - tstrsequence(ascii); - return; - } - /* only CAN, SUB, \a and C1 chars interrupt a sequence */ - term.esc &= ~(ESC_STR_END|ESC_STR); -} - -/* - * returns 1 when the sequence is finished and it hasn't to read - * more characters for this sequence, otherwise 0 - */ -int -eschandle(uchar ascii) -{ - switch (ascii) { - case '[': - term.esc |= ESC_CSI; - return 0; - case '#': - term.esc |= ESC_TEST; - return 0; - case '%': - term.esc |= ESC_UTF8; - return 0; - case 'P': /* DCS -- Device Control String */ - case '_': /* APC -- Application Program Command */ - case '^': /* PM -- Privacy Message */ - case ']': /* OSC -- Operating System Command */ - case 'k': /* old title set compatibility */ - tstrsequence(ascii); - return 0; - case 'n': /* LS2 -- Locking shift 2 */ - case 'o': /* LS3 -- Locking shift 3 */ - term.charset = 2 + (ascii - 'n'); - break; - case '(': /* GZD4 -- set primary charset G0 */ - case ')': /* G1D4 -- set secondary charset G1 */ - case '*': /* G2D4 -- set tertiary charset G2 */ - case '+': /* G3D4 -- set quaternary charset G3 */ - term.icharset = ascii - '('; - term.esc |= ESC_ALTCHARSET; - return 0; - case 'D': /* IND -- Linefeed */ - if (term.c.y == term.bot) { - tscrollup(term.top, 1); - } else { - tmoveto(term.c.x, term.c.y+1); - } - break; - case 'E': /* NEL -- Next line */ - tnewline(1); /* always go to first col */ - break; - case 'H': /* HTS -- Horizontal tab stop */ - term.tabs[term.c.x] = 1; - break; - case 'M': /* RI -- Reverse index */ - if (term.c.y == term.top) { - tscrolldown(term.top, 1); - } else { - tmoveto(term.c.x, term.c.y-1); - } - break; - case 'Z': /* DECID -- Identify Terminal */ - ttywrite(vtiden, strlen(vtiden), 0); - break; - case 'c': /* RIS -- Reset to initial state */ - treset(); - resettitle(); - xloadcols(); - xsetmode(0, MODE_HIDE); - break; - case '=': /* DECPAM -- Application keypad */ - xsetmode(1, MODE_APPKEYPAD); - break; - case '>': /* DECPNM -- Normal keypad */ - xsetmode(0, MODE_APPKEYPAD); - break; - case '7': /* DECSC -- Save Cursor */ - tcursor(CURSOR_SAVE); - break; - case '8': /* DECRC -- Restore Cursor */ - tcursor(CURSOR_LOAD); - break; - case '\\': /* ST -- String Terminator */ - if (term.esc & ESC_STR_END) - strhandle(); - break; - default: - fprintf(stderr, "erresc: unknown sequence ESC 0x%02X '%c'\n", - (uchar) ascii, isprint(ascii)? ascii:'.'); - break; - } - return 1; -} - -void -tputc(Rune u) -{ - char c[UTF_SIZ]; - int control; - int width, len; - Glyph *gp; - - control = ISCONTROL(u); - if (u < 127 || !IS_SET(MODE_UTF8)) { - c[0] = u; - width = len = 1; - } else { - len = utf8encode(u, c); - if (!control && (width = wcwidth(u)) == -1) - width = 1; - } - - if (IS_SET(MODE_PRINT)) - tprinter(c, len); - - /* - * STR sequence must be checked before anything else - * because it uses all following characters until it - * receives a ESC, a SUB, a ST or any other C1 control - * character. - */ - if (term.esc & ESC_STR) { - if (u == '\a' || u == 030 || u == 032 || u == 033 || - ISCONTROLC1(u)) { - term.esc &= ~(ESC_START|ESC_STR); - term.esc |= ESC_STR_END; - goto check_control_code; - } - - if (strescseq.len+len >= strescseq.siz) { - /* - * Here is a bug in terminals. If the user never sends - * some code to stop the str or esc command, then st - * will stop responding. But this is better than - * silently failing with unknown characters. At least - * then users will report back. - * - * In the case users ever get fixed, here is the code: - */ - /* - * term.esc = 0; - * strhandle(); - */ - if (strescseq.siz > (SIZE_MAX - UTF_SIZ) / 2) - return; - strescseq.siz *= 2; - strescseq.buf = xrealloc(strescseq.buf, strescseq.siz); - } - - memmove(&strescseq.buf[strescseq.len], c, len); - strescseq.len += len; - return; - } - -check_control_code: - /* - * Actions of control codes must be performed as soon they arrive - * because they can be embedded inside a control sequence, and - * they must not cause conflicts with sequences. - */ - if (control) { - /* in UTF-8 mode ignore handling C1 control characters */ - if (IS_SET(MODE_UTF8) && ISCONTROLC1(u)) - return; - tcontrolcode(u); - /* - * control codes are not shown ever - */ - if (!term.esc) - term.lastc = 0; - return; - } else if (term.esc & ESC_START) { - if (term.esc & ESC_CSI) { - csiescseq.buf[csiescseq.len++] = u; - if (BETWEEN(u, 0x40, 0x7E) - || csiescseq.len >= \ - sizeof(csiescseq.buf)-1) { - term.esc = 0; - csiparse(); - csihandle(); - } - return; - } else if (term.esc & ESC_UTF8) { - tdefutf8(u); - } else if (term.esc & ESC_ALTCHARSET) { - tdeftran(u); - } else if (term.esc & ESC_TEST) { - tdectest(u); - } else { - if (!eschandle(u)) - return; - /* sequence already finished */ - } - term.esc = 0; - /* - * All characters which form part of a sequence are not - * printed - */ - return; - } - if (selected(term.c.x, term.c.y)) - selclear(); - - gp = &term.line[term.c.y][term.c.x]; - if (IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) { - gp->mode |= ATTR_WRAP; - tnewline(1); - gp = &term.line[term.c.y][term.c.x]; - } - - if (IS_SET(MODE_INSERT) && term.c.x+width < term.col) { - memmove(gp+width, gp, (term.col - term.c.x - width) * sizeof(Glyph)); - gp->mode &= ~ATTR_WIDE; - } - - if (term.c.x+width > term.col) { - if (IS_SET(MODE_WRAP)) - tnewline(1); - else - tmoveto(term.col - width, term.c.y); - gp = &term.line[term.c.y][term.c.x]; - } - - tsetchar(u, &term.c.attr, term.c.x, term.c.y); - term.lastc = u; - - if (width == 2) { - gp->mode |= ATTR_WIDE; - if (term.c.x+1 < term.col) { - if (gp[1].mode == ATTR_WIDE && term.c.x+2 < term.col) { - gp[2].u = ' '; - gp[2].mode &= ~ATTR_WDUMMY; - } - gp[1].u = '\0'; - gp[1].mode = ATTR_WDUMMY; - } - } - if (term.c.x+width < term.col) { - tmoveto(term.c.x+width, term.c.y); - } else { - term.c.state |= CURSOR_WRAPNEXT; - } -} - -int -twrite(const char *buf, int buflen, int show_ctrl) -{ - int charsize; - Rune u; - int n; - - for (n = 0; n < buflen; n += charsize) { - if (IS_SET(MODE_UTF8)) { - /* process a complete utf8 char */ - charsize = utf8decode(buf + n, &u, buflen - n); - if (charsize == 0) - break; - } else { - u = buf[n] & 0xFF; - charsize = 1; - } - if (show_ctrl && ISCONTROL(u)) { - if (u & 0x80) { - u &= 0x7f; - tputc('^'); - tputc('['); - } else if (u != '\n' && u != '\r' && u != '\t') { - u ^= 0x40; - tputc('^'); - } - } - tputc(u); - } - return n; -} - -void -tresize(int col, int row) -{ - int i; - int minrow = MIN(row, term.row); - int mincol = MIN(col, term.col); - int *bp; - TCursor c; - - if (col < 1 || row < 1) { - fprintf(stderr, - "tresize: error resizing to %dx%d\n", col, row); - return; - } - - /* - * slide screen to keep cursor where we expect it - - * tscrollup would work here, but we can optimize to - * memmove because we're freeing the earlier lines - */ - for (i = 0; i <= term.c.y - row; i++) { - free(term.line[i]); - free(term.alt[i]); - } - /* ensure that both src and dst are not NULL */ - if (i > 0) { - memmove(term.line, term.line + i, row * sizeof(Line)); - memmove(term.alt, term.alt + i, row * sizeof(Line)); - } - for (i += row; i < term.row; i++) { - free(term.line[i]); - free(term.alt[i]); - } - - /* resize to new height */ - term.line = xrealloc(term.line, row * sizeof(Line)); - term.alt = xrealloc(term.alt, row * sizeof(Line)); - term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); - term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); - - /* 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)); - term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph)); - } - - /* allocate any new rows */ - for (/* i = minrow */; i < row; i++) { - term.line[i] = xmalloc(col * sizeof(Glyph)); - term.alt[i] = xmalloc(col * sizeof(Glyph)); - } - if (col > term.col) { - bp = term.tabs + term.col; - - memset(bp, 0, sizeof(*term.tabs) * (col - term.col)); - while (--bp > term.tabs && !*bp) - /* nothing */ ; - for (bp += tabspaces; bp < term.tabs + col; bp += tabspaces) - *bp = 1; - } - /* update terminal size */ - term.col = col; - term.row = row; - /* reset scrolling region */ - tsetscroll(0, row-1); - /* make use of the LIMIT in tmoveto */ - tmoveto(term.c.x, term.c.y); - /* Clearing both screens (it makes dirty all lines) */ - c = term.c; - for (i = 0; i < 2; i++) { - if (mincol < col && 0 < minrow) { - tclearregion(mincol, 0, col - 1, minrow - 1); - } - if (0 < col && minrow < row) { - tclearregion(0, minrow, col - 1, row - 1); - } - tswapscreen(); - tcursor(CURSOR_LOAD); - } - term.c = c; -} - -void -resettitle(void) -{ - xsettitle(NULL); -} - -void -drawregion(int x1, int y1, int x2, int y2) -{ - int y; - - for (y = y1; y < y2; y++) { - if (!term.dirty[y]) - continue; - - term.dirty[y] = 0; - xdrawline(term.line[y], x1, y, x2); - } -} - -void -draw(void) -{ - int cx = term.c.x, ocx = term.ocx, ocy = term.ocy; - - if (!xstartdraw()) - return; - - /* adjust cursor position */ - LIMIT(term.ocx, 0, term.col-1); - LIMIT(term.ocy, 0, term.row-1); - if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY) - term.ocx--; - if (term.line[term.c.y][cx].mode & ATTR_WDUMMY) - 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]); - term.ocx = cx; - term.ocy = term.c.y; - xfinishdraw(); - if (ocx != term.ocx || ocy != term.ocy) - xximspot(term.ocx, term.ocy); -} - -void -redraw(void) -{ - tfulldirt(); - draw(); -} diff --git a/hosts/vali/mars/dwm/st-0.9.2/st.h b/hosts/vali/mars/dwm/st-0.9.2/st.h deleted file mode 100644 index fd3b0d8..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/st.h +++ /dev/null @@ -1,126 +0,0 @@ -/* See LICENSE for license details. */ - -#include -#include - -/* macros */ -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define MAX(a, b) ((a) < (b) ? (b) : (a)) -#define LEN(a) (sizeof(a) / sizeof(a)[0]) -#define BETWEEN(x, a, b) ((a) <= (x) && (x) <= (b)) -#define DIVCEIL(n, d) (((n) + ((d) - 1)) / (d)) -#define DEFAULT(a, b) (a) = (a) ? (a) : (b) -#define LIMIT(x, a, b) (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) -#define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || \ - (a).bg != (b).bg) -#define TIMEDIFF(t1, t2) ((t1.tv_sec-t2.tv_sec)*1000 + \ - (t1.tv_nsec-t2.tv_nsec)/1E6) -#define MODBIT(x, set, bit) ((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) - -#define TRUECOLOR(r,g,b) (1 << 24 | (r) << 16 | (g) << 8 | (b)) -#define IS_TRUECOL(x) (1 << 24 & (x)) - -enum glyph_attribute { - ATTR_NULL = 0, - ATTR_BOLD = 1 << 0, - ATTR_FAINT = 1 << 1, - ATTR_ITALIC = 1 << 2, - ATTR_UNDERLINE = 1 << 3, - ATTR_BLINK = 1 << 4, - ATTR_REVERSE = 1 << 5, - ATTR_INVISIBLE = 1 << 6, - ATTR_STRUCK = 1 << 7, - ATTR_WRAP = 1 << 8, - ATTR_WIDE = 1 << 9, - ATTR_WDUMMY = 1 << 10, - ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, -}; - -enum selection_mode { - SEL_IDLE = 0, - SEL_EMPTY = 1, - SEL_READY = 2 -}; - -enum selection_type { - SEL_REGULAR = 1, - SEL_RECTANGULAR = 2 -}; - -enum selection_snap { - SNAP_WORD = 1, - SNAP_LINE = 2 -}; - -typedef unsigned char uchar; -typedef unsigned int uint; -typedef unsigned long ulong; -typedef unsigned short ushort; - -typedef uint_least32_t Rune; - -#define Glyph Glyph_ -typedef struct { - Rune u; /* character code */ - ushort mode; /* attribute flags */ - uint32_t fg; /* foreground */ - uint32_t bg; /* background */ -} Glyph; - -typedef Glyph *Line; - -typedef union { - int i; - uint ui; - float f; - const void *v; - const char *s; -} Arg; - -void die(const char *, ...); -void redraw(void); -void draw(void); - -void printscreen(const Arg *); -void printsel(const Arg *); -void sendbreak(const Arg *); -void toggleprinter(const Arg *); - -int tattrset(int); -void tnew(int, int); -void tresize(int, int); -void tsetdirtattr(int); -void ttyhangup(void); -int ttynew(const char *, char *, const char *, char **); -size_t ttyread(void); -void ttyresize(int, int); -void ttywrite(const char *, size_t, int); - -void resettitle(void); - -void selclear(void); -void selinit(void); -void selstart(int, int, int); -void selextend(int, int, int, int); -int selected(int, int); -char *getsel(void); - -size_t utf8encode(Rune, char *); - -void *xmalloc(size_t); -void *xrealloc(void *, size_t); -char *xstrdup(const char *); - -/* config.h globals */ -extern char *utmp; -extern char *scroll; -extern char *stty_args; -extern char *vtiden; -extern wchar_t *worddelimiters; -extern int allowaltscreen; -extern int allowwindowops; -extern char *termname; -extern unsigned int tabspaces; -extern unsigned int defaultfg; -extern unsigned int defaultbg; -extern unsigned int defaultcs; diff --git a/hosts/vali/mars/dwm/st-0.9.2/st.info b/hosts/vali/mars/dwm/st-0.9.2/st.info deleted file mode 100644 index efab2cf..0000000 --- a/hosts/vali/mars/dwm/st-0.9.2/st.info +++ /dev/null @@ -1,243 +0,0 @@ -st-mono| simpleterm monocolor, - acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, - am, - bce, - bel=^G, - blink=\E[5m, - bold=\E[1m, - cbt=\E[Z, - cvvis=\E[?25h, - civis=\E[?25l, - clear=\E[H\E[2J, - cnorm=\E[?12l\E[?25h, - colors#2, - cols#80, - cr=^M, - csr=\E[%i%p1%d;%p2%dr, - cub=\E[%p1%dD, - cub1=^H, - cud1=^J, - cud=\E[%p1%dB, - cuf1=\E[C, - cuf=\E[%p1%dC, - cup=\E[%i%p1%d;%p2%dH, - cuu1=\E[A, - cuu=\E[%p1%dA, - dch=\E[%p1%dP, - dch1=\E[P, - dim=\E[2m, - dl=\E[%p1%dM, - dl1=\E[M, - ech=\E[%p1%dX, - ed=\E[J, - el=\E[K, - el1=\E[1K, - enacs=\E)0, - flash=\E[?5h$<80/>\E[?5l, - fsl=^G, - home=\E[H, - hpa=\E[%i%p1%dG, - hs, - ht=^I, - hts=\EH, - ich=\E[%p1%d@, - il1=\E[L, - il=\E[%p1%dL, - ind=^J, - indn=\E[%p1%dS, - invis=\E[8m, - is2=\E[4l\E>\E[?1034l, - it#8, - kel=\E[1;2F, - ked=\E[1;5F, - ka1=\E[1~, - ka3=\E[5~, - kc1=\E[4~, - kc3=\E[6~, - kbs=\177, - kcbt=\E[Z, - kb2=\EOu, - kcub1=\EOD, - kcud1=\EOB, - kcuf1=\EOC, - kcuu1=\EOA, - kDC=\E[3;2~, - kent=\EOM, - kEND=\E[1;2F, - kIC=\E[2;2~, - kNXT=\E[6;2~, - kPRV=\E[5;2~, - kHOM=\E[1;2H, - kLFT=\E[1;2D, - kRIT=\E[1;2C, - kind=\E[1;2B, - kri=\E[1;2A, - kclr=\E[3;5~, - kdl1=\E[3;2~, - kdch1=\E[3~, - kich1=\E[2~, - kend=\E[4~, - kf1=\EOP, - kf2=\EOQ, - kf3=\EOR, - kf4=\EOS, - kf5=\E[15~, - kf6=\E[17~, - kf7=\E[18~, - kf8=\E[19~, - kf9=\E[20~, - kf10=\E[21~, - kf11=\E[23~, - kf12=\E[24~, - kf13=\E[1;2P, - kf14=\E[1;2Q, - kf15=\E[1;2R, - kf16=\E[1;2S, - kf17=\E[15;2~, - kf18=\E[17;2~, - kf19=\E[18;2~, - kf20=\E[19;2~, - kf21=\E[20;2~, - kf22=\E[21;2~, - kf23=\E[23;2~, - kf24=\E[24;2~, - kf25=\E[1;5P, - kf26=\E[1;5Q, - kf27=\E[1;5R, - kf28=\E[1;5S, - kf29=\E[15;5~, - kf30=\E[17;5~, - kf31=\E[18;5~, - kf32=\E[19;5~, - kf33=\E[20;5~, - kf34=\E[21;5~, - kf35=\E[23;5~, - kf36=\E[24;5~, - kf37=\E[1;6P, - kf38=\E[1;6Q, - kf39=\E[1;6R, - kf40=\E[1;6S, - kf41=\E[15;6~, - kf42=\E[17;6~, - kf43=\E[18;6~, - kf44=\E[19;6~, - kf45=\E[20;6~, - kf46=\E[21;6~, - kf47=\E[23;6~, - kf48=\E[24;6~, - kf49=\E[1;3P, - kf50=\E[1;3Q, - kf51=\E[1;3R, - kf52=\E[1;3S, - kf53=\E[15;3~, - kf54=\E[17;3~, - kf55=\E[18;3~, - kf56=\E[19;3~, - kf57=\E[20;3~, - kf58=\E[21;3~, - kf59=\E[23;3~, - kf60=\E[24;3~, - kf61=\E[1;4P, - kf62=\E[1;4Q, - kf63=\E[1;4R, - khome=\E[1~, - kil1=\E[2;5~, - krmir=\E[2;2~, - knp=\E[6~, - kmous=\E[M, - kpp=\E[5~, - lines#24, - mir, - msgr, - npc, - op=\E[39;49m, - pairs#64, - mc0=\E[i, - mc4=\E[4i, - mc5=\E[5i, - rc=\E8, - rev=\E[7m, - ri=\EM, - rin=\E[%p1%dT, - ritm=\E[23m, - rmacs=\E(B, - rmcup=\E[?1049l, - rmir=\E[4l, - rmkx=\E[?1l\E>, - rmso=\E[27m, - rmul=\E[24m, - rs1=\Ec, - rs2=\E[4l\E>\E[?1034l, - sc=\E7, - sitm=\E[3m, - sgr0=\E[0m, - smacs=\E(0, - smcup=\E[?1049h, - smir=\E[4h, - smkx=\E[?1h\E=, - smso=\E[7m, - smul=\E[4m, - tbc=\E[3g, - tsl=\E]0;, - xenl, - vpa=\E[%i%p1%dd, -# XTerm extensions - rmxx=\E[29m, - smxx=\E[9m, - BE=\E[?2004h, - BD=\E[?2004l, - PS=\E[200~, - PE=\E[201~, -# disabled rep for now: causes some issues with older ncurses versions. -# rep=%p1%c\E[%p2%{1}%-%db, -# tmux extensions, see TERMINFO EXTENSIONS in tmux(1) - Tc, - Ms=\E]52;%p1%s;%p2%s\007, - Se=\E[2 q, - Ss=\E[%p1%d q, - -st| simpleterm, - use=st-mono, - colors#8, - setab=\E[4%p1%dm, - setaf=\E[3%p1%dm, - setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, - setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, - sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, - -st-256color| simpleterm with 256 colors, - use=st, - ccc, - colors#256, - oc=\E]104\007, - pairs#32767, -# Nicked from xterm-256color - initc=\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, - setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m, - setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m, - -st-meta| simpleterm with meta key, - use=st, - km, - rmm=\E[?1034l, - smm=\E[?1034h, - rs2=\E[4l\E>\E[?1034h, - is2=\E[4l\E>\E[?1034h, - -st-meta-256color| simpleterm with meta key and 256 colors, - use=st-256color, - km, - rmm=\E[?1034l, - smm=\E[?1034h, - rs2=\E[4l\E>\E[?1034h, - is2=\E[4l\E>\E[?1034h, - -st-bs| simpleterm with backspace as backspace, - use=st, - kbs=\010, - kdch1=\177, - -st-bs-256color| simpleterm with backspace as backspace and 256colors, - use=st-256color, - kbs=\010, - kdch1=\177, diff --git a/hosts/vali/mars/dwm/st-0.9.2/st.o b/hosts/vali/mars/dwm/st-0.9.2/st.o deleted file mode 100644 index 78397f5d4946e6914563b399b2700b61287fedb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79120 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 v==wo%f*$uE{T$GPMx;TB1|$H*Ap4+9Fa -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -char *argv0; -#include "arg.h" -#include "st.h" -#include "win.h" - -/* types used in config.h */ -typedef struct { - uint mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Shortcut; - -typedef struct { - uint mod; - uint button; - void (*func)(const Arg *); - const Arg arg; - uint release; -} MouseShortcut; - -typedef struct { - KeySym k; - uint mask; - char *s; - /* three-valued logic variables: 0 indifferent, 1 on, -1 off */ - signed char appkey; /* application keypad */ - signed char appcursor; /* application cursor */ -} Key; - -/* X modifiers */ -#define XK_ANY_MOD UINT_MAX -#define XK_NO_MOD 0 -#define XK_SWITCH_MOD (1<<13|1<<14) - -/* function definitions used in config.h */ -static void clipcopy(const Arg *); -static void clippaste(const Arg *); -static void numlock(const Arg *); -static void selpaste(const Arg *); -static void zoom(const Arg *); -static void zoomabs(const Arg *); -static void zoomreset(const Arg *); -static void ttysend(const Arg *); - -/* config.h for applying patches and the configuration. */ -#include "config.h" - -/* XEMBED messages */ -#define XEMBED_FOCUS_IN 4 -#define XEMBED_FOCUS_OUT 5 - -/* macros */ -#define IS_SET(flag) ((win.mode & (flag)) != 0) -#define TRUERED(x) (((x) & 0xff0000) >> 8) -#define TRUEGREEN(x) (((x) & 0xff00)) -#define TRUEBLUE(x) (((x) & 0xff) << 8) - -typedef XftDraw *Draw; -typedef XftColor Color; -typedef XftGlyphFontSpec GlyphFontSpec; - -/* Purely graphic info */ -typedef struct { - int tw, th; /* tty width and height */ - int w, h; /* window width and height */ - int ch; /* char height */ - int cw; /* char width */ - int mode; /* window state/mode flags */ - int cursor; /* cursor style */ -} TermWindow; - -typedef struct { - Display *dpy; - Colormap cmap; - Window win; - Drawable buf; - GlyphFontSpec *specbuf; /* font spec buffer used for rendering */ - Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid; - struct { - XIM xim; - XIC xic; - XPoint spot; - XVaNestedList spotlist; - } ime; - Draw draw; - Visual *vis; - XSetWindowAttributes attrs; - int scr; - int isfixed; /* is fixed geometry? */ - int l, t; /* left and top offset */ - int gm; /* geometry mask */ -} XWindow; - -typedef struct { - Atom xtarget; - char *primary, *clipboard; - struct timespec tclick1; - struct timespec tclick2; -} XSelection; - -/* Font structure */ -#define Font Font_ -typedef struct { - int height; - int width; - int ascent; - int descent; - int badslant; - int badweight; - short lbearing; - short rbearing; - XftFont *match; - FcFontSet *set; - FcPattern *pattern; -} Font; - -/* Drawing Context */ -typedef struct { - Color *col; - size_t collen; - Font font, bfont, ifont, ibfont; - GC gc; -} DC; - -static inline ushort sixd_to_16bit(int); -static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int); -static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int); -static void xdrawglyph(Glyph, int, int); -static void xclear(int, int, int, int); -static int xgeommasktogravity(int); -static int ximopen(Display *); -static void ximinstantiate(Display *, XPointer, XPointer); -static void ximdestroy(XIM, XPointer, XPointer); -static int xicdestroy(XIC, XPointer, XPointer); -static void xinit(int, int); -static void cresize(int, int); -static void xresize(int, int); -static void xhints(void); -static int xloadcolor(int, const char *, Color *); -static int xloadfont(Font *, FcPattern *); -static void xloadfonts(const char *, double); -static void xunloadfont(Font *); -static void xunloadfonts(void); -static void xsetenv(void); -static void xseturgency(int); -static int evcol(XEvent *); -static int evrow(XEvent *); - -static void expose(XEvent *); -static void visibility(XEvent *); -static void unmap(XEvent *); -static void kpress(XEvent *); -static void cmessage(XEvent *); -static void resize(XEvent *); -static void focus(XEvent *); -static uint buttonmask(uint); -static int mouseaction(XEvent *, uint); -static void brelease(XEvent *); -static void bpress(XEvent *); -static void bmotion(XEvent *); -static void propnotify(XEvent *); -static void selnotify(XEvent *); -static void selclear_(XEvent *); -static void selrequest(XEvent *); -static void setsel(char *, Time); -static void mousesel(XEvent *, int); -static void mousereport(XEvent *); -static char *kmap(KeySym, uint); -static int match(uint, uint); - -static void run(void); -static void usage(void); - -static void (*handler[LASTEvent])(XEvent *) = { - [KeyPress] = kpress, - [ClientMessage] = cmessage, - [ConfigureNotify] = resize, - [VisibilityNotify] = visibility, - [UnmapNotify] = unmap, - [Expose] = expose, - [FocusIn] = focus, - [FocusOut] = focus, - [MotionNotify] = bmotion, - [ButtonPress] = bpress, - [ButtonRelease] = brelease, -/* - * Uncomment if you want the selection to disappear when you select something - * different in another window. - */ -/* [SelectionClear] = selclear_, */ - [SelectionNotify] = selnotify, -/* - * PropertyNotify is only turned on when there is some INCR transfer happening - * for the selection retrieval. - */ - [PropertyNotify] = propnotify, - [SelectionRequest] = selrequest, -}; - -/* Globals */ -static DC dc; -static XWindow xw; -static XSelection xsel; -static TermWindow win; - -/* Font Ring Cache */ -enum { - FRC_NORMAL, - FRC_ITALIC, - FRC_BOLD, - FRC_ITALICBOLD -}; - -typedef struct { - XftFont *font; - int flags; - Rune unicodep; -} Fontcache; - -/* Fontcache is an array now. A new font will be appended to the array. */ -static Fontcache *frc = NULL; -static int frclen = 0; -static int frccap = 0; -static char *usedfont = NULL; -static double usedfontsize = 0; -static double defaultfontsize = 0; - -static char *opt_class = NULL; -static char **opt_cmd = NULL; -static char *opt_embed = NULL; -static char *opt_font = NULL; -static char *opt_io = NULL; -static char *opt_line = NULL; -static char *opt_name = NULL; -static char *opt_title = NULL; - -static uint buttons; /* bit field of pressed buttons */ - -void -clipcopy(const Arg *dummy) -{ - Atom clipboard; - - free(xsel.clipboard); - xsel.clipboard = NULL; - - if (xsel.primary != NULL) { - xsel.clipboard = xstrdup(xsel.primary); - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); - } -} - -void -clippaste(const Arg *dummy) -{ - Atom clipboard; - - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - XConvertSelection(xw.dpy, clipboard, xsel.xtarget, clipboard, - xw.win, CurrentTime); -} - -void -selpaste(const Arg *dummy) -{ - XConvertSelection(xw.dpy, XA_PRIMARY, xsel.xtarget, XA_PRIMARY, - xw.win, CurrentTime); -} - -void -numlock(const Arg *dummy) -{ - win.mode ^= MODE_NUMLOCK; -} - -void -zoom(const Arg *arg) -{ - Arg larg; - - larg.f = usedfontsize + arg->f; - zoomabs(&larg); -} - -void -zoomabs(const Arg *arg) -{ - xunloadfonts(); - xloadfonts(usedfont, arg->f); - cresize(0, 0); - redraw(); - xhints(); -} - -void -zoomreset(const Arg *arg) -{ - Arg larg; - - if (defaultfontsize > 0) { - larg.f = defaultfontsize; - zoomabs(&larg); - } -} - -void -ttysend(const Arg *arg) -{ - ttywrite(arg->s, strlen(arg->s), 1); -} - -int -evcol(XEvent *e) -{ - int x = e->xbutton.x - borderpx; - LIMIT(x, 0, win.tw - 1); - return x / win.cw; -} - -int -evrow(XEvent *e) -{ - int y = e->xbutton.y - borderpx; - LIMIT(y, 0, win.th - 1); - return y / win.ch; -} - -void -mousesel(XEvent *e, int done) -{ - int type, seltype = SEL_REGULAR; - uint state = e->xbutton.state & ~(Button1Mask | forcemousemod); - - for (type = 1; type < LEN(selmasks); ++type) { - if (match(selmasks[type], state)) { - seltype = type; - break; - } - } - selextend(evcol(e), evrow(e), seltype, done); - if (done) - setsel(getsel(), e->xbutton.time); -} - -void -mousereport(XEvent *e) -{ - int len, btn, code; - int x = evcol(e), y = evrow(e); - int state = e->xbutton.state; - char buf[40]; - static int ox, oy; - - if (e->type == MotionNotify) { - if (x == ox && y == oy) - return; - if (!IS_SET(MODE_MOUSEMOTION) && !IS_SET(MODE_MOUSEMANY)) - return; - /* MODE_MOUSEMOTION: no reporting if no button is pressed */ - if (IS_SET(MODE_MOUSEMOTION) && buttons == 0) - return; - /* Set btn to lowest-numbered pressed button, or 12 if no - * buttons are pressed. */ - for (btn = 1; btn <= 11 && !(buttons & (1<<(btn-1))); btn++) - ; - code = 32; - } else { - btn = e->xbutton.button; - /* Only buttons 1 through 11 can be encoded */ - if (btn < 1 || btn > 11) - return; - if (e->type == ButtonRelease) { - /* MODE_MOUSEX10: no button release reporting */ - if (IS_SET(MODE_MOUSEX10)) - return; - /* Don't send release events for the scroll wheel */ - if (btn == 4 || btn == 5) - return; - } - code = 0; - } - - ox = x; - oy = y; - - /* Encode btn into code. If no button is pressed for a motion event in - * MODE_MOUSEMANY, then encode it as a release. */ - if ((!IS_SET(MODE_MOUSESGR) && e->type == ButtonRelease) || btn == 12) - code += 3; - else if (btn >= 8) - code += 128 + btn - 8; - else if (btn >= 4) - code += 64 + btn - 4; - else - code += btn - 1; - - if (!IS_SET(MODE_MOUSEX10)) { - code += ((state & ShiftMask ) ? 4 : 0) - + ((state & Mod1Mask ) ? 8 : 0) /* meta key: alt */ - + ((state & ControlMask) ? 16 : 0); - } - - if (IS_SET(MODE_MOUSESGR)) { - len = snprintf(buf, sizeof(buf), "\033[<%d;%d;%d%c", - code, x+1, y+1, - e->type == ButtonRelease ? 'm' : 'M'); - } else if (x < 223 && y < 223) { - len = snprintf(buf, sizeof(buf), "\033[M%c%c%c", - 32+code, 32+x+1, 32+y+1); - } else { - return; - } - - ttywrite(buf, len, 0); -} - -uint -buttonmask(uint button) -{ - return button == Button1 ? Button1Mask - : button == Button2 ? Button2Mask - : button == Button3 ? Button3Mask - : button == Button4 ? Button4Mask - : button == Button5 ? Button5Mask - : 0; -} - -int -mouseaction(XEvent *e, uint release) -{ - MouseShortcut *ms; - - /* ignore Buttonmask for Button - it's set on release */ - uint state = e->xbutton.state & ~buttonmask(e->xbutton.button); - - for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { - if (ms->release == release && - ms->button == e->xbutton.button && - (match(ms->mod, state) || /* exact or forced */ - match(ms->mod, state & ~forcemousemod))) { - ms->func(&(ms->arg)); - return 1; - } - } - - return 0; -} - -void -bpress(XEvent *e) -{ - int btn = e->xbutton.button; - struct timespec now; - int snap; - - if (1 <= btn && btn <= 11) - buttons |= 1 << (btn-1); - - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - if (mouseaction(e, 0)) - return; - - if (btn == Button1) { - /* - * If the user clicks below predefined timeouts specific - * snapping behaviour is exposed. - */ - clock_gettime(CLOCK_MONOTONIC, &now); - if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) { - snap = SNAP_LINE; - } else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) { - snap = SNAP_WORD; - } else { - snap = 0; - } - xsel.tclick2 = xsel.tclick1; - xsel.tclick1 = now; - - selstart(evcol(e), evrow(e), snap); - } -} - -void -propnotify(XEvent *e) -{ - XPropertyEvent *xpev; - Atom clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - - xpev = &e->xproperty; - if (xpev->state == PropertyNewValue && - (xpev->atom == XA_PRIMARY || - xpev->atom == clipboard)) { - selnotify(e); - } -} - -void -selnotify(XEvent *e) -{ - ulong nitems, ofs, rem; - int format; - uchar *data, *last, *repl; - Atom type, incratom, property = None; - - incratom = XInternAtom(xw.dpy, "INCR", 0); - - ofs = 0; - if (e->type == SelectionNotify) - property = e->xselection.property; - else if (e->type == PropertyNotify) - property = e->xproperty.atom; - - if (property == None) - return; - - do { - if (XGetWindowProperty(xw.dpy, xw.win, property, ofs, - BUFSIZ/4, False, AnyPropertyType, - &type, &format, &nitems, &rem, - &data)) { - fprintf(stderr, "Clipboard allocation failed\n"); - return; - } - - if (e->type == PropertyNotify && nitems == 0 && rem == 0) { - /* - * If there is some PropertyNotify with no data, then - * this is the signal of the selection owner that all - * data has been transferred. We won't need to receive - * PropertyNotify events anymore. - */ - MODBIT(xw.attrs.event_mask, 0, PropertyChangeMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, - &xw.attrs); - } - - if (type == incratom) { - /* - * Activate the PropertyNotify events so we receive - * when the selection owner does send us the next - * chunk of data. - */ - MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, - &xw.attrs); - - /* - * Deleting the property is the transfer start signal. - */ - XDeleteProperty(xw.dpy, xw.win, (int)property); - continue; - } - - /* - * As seen in getsel: - * Line endings are inconsistent in the terminal and GUI world - * copy and pasting. When receiving some selection data, - * replace all '\n' with '\r'. - * FIXME: Fix the computer world. - */ - repl = data; - last = data + nitems * format / 8; - while ((repl = memchr(repl, '\n', last - repl))) { - *repl++ = '\r'; - } - - if (IS_SET(MODE_BRCKTPASTE) && ofs == 0) - ttywrite("\033[200~", 6, 0); - ttywrite((char *)data, nitems * format / 8, 1); - if (IS_SET(MODE_BRCKTPASTE) && rem == 0) - ttywrite("\033[201~", 6, 0); - XFree(data); - /* number of 32-bit chunks returned */ - ofs += nitems * format / 32; - } while (rem > 0); - - /* - * Deleting the property again tells the selection owner to send the - * next data chunk in the property. - */ - XDeleteProperty(xw.dpy, xw.win, (int)property); -} - -void -xclipcopy(void) -{ - clipcopy(NULL); -} - -void -selclear_(XEvent *e) -{ - selclear(); -} - -void -selrequest(XEvent *e) -{ - XSelectionRequestEvent *xsre; - XSelectionEvent xev; - Atom xa_targets, string, clipboard; - char *seltext; - - xsre = (XSelectionRequestEvent *) e; - xev.type = SelectionNotify; - xev.requestor = xsre->requestor; - xev.selection = xsre->selection; - xev.target = xsre->target; - xev.time = xsre->time; - if (xsre->property == None) - xsre->property = xsre->target; - - /* reject */ - xev.property = None; - - xa_targets = XInternAtom(xw.dpy, "TARGETS", 0); - if (xsre->target == xa_targets) { - /* respond with the supported type */ - string = xsel.xtarget; - XChangeProperty(xsre->display, xsre->requestor, xsre->property, - XA_ATOM, 32, PropModeReplace, - (uchar *) &string, 1); - xev.property = xsre->property; - } else if (xsre->target == xsel.xtarget || xsre->target == XA_STRING) { - /* - * xith XA_STRING non ascii characters may be incorrect in the - * requestor. It is not our problem, use utf8. - */ - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); - if (xsre->selection == XA_PRIMARY) { - seltext = xsel.primary; - } else if (xsre->selection == clipboard) { - seltext = xsel.clipboard; - } else { - fprintf(stderr, - "Unhandled clipboard selection 0x%lx\n", - xsre->selection); - return; - } - if (seltext != NULL) { - XChangeProperty(xsre->display, xsre->requestor, - xsre->property, xsre->target, - 8, PropModeReplace, - (uchar *)seltext, strlen(seltext)); - xev.property = xsre->property; - } - } - - /* all done, send a notification to the listener */ - if (!XSendEvent(xsre->display, xsre->requestor, 1, 0, (XEvent *) &xev)) - fprintf(stderr, "Error sending SelectionNotify event\n"); -} - -void -setsel(char *str, Time t) -{ - if (!str) - return; - - free(xsel.primary); - xsel.primary = str; - - XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); - if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) - selclear(); -} - -void -xsetsel(char *str) -{ - setsel(str, CurrentTime); -} - -void -brelease(XEvent *e) -{ - int btn = e->xbutton.button; - - if (1 <= btn && btn <= 11) - buttons &= ~(1 << (btn-1)); - - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - if (mouseaction(e, 1)) - return; - if (btn == Button1) - mousesel(e, 1); -} - -void -bmotion(XEvent *e) -{ - if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { - mousereport(e); - return; - } - - mousesel(e, 0); -} - -void -cresize(int width, int height) -{ - int col, row; - - if (width != 0) - win.w = width; - if (height != 0) - win.h = height; - - col = (win.w - 2 * borderpx) / win.cw; - row = (win.h - 2 * borderpx) / win.ch; - col = MAX(1, col); - row = MAX(1, row); - - tresize(col, row); - xresize(col, row); - ttyresize(win.tw, win.th); -} - -void -xresize(int col, int row) -{ - win.tw = col * win.cw; - win.th = row * win.ch; - - XFreePixmap(xw.dpy, xw.buf); - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, - DefaultDepth(xw.dpy, xw.scr)); - XftDrawChange(xw.draw, xw.buf); - xclear(0, 0, win.w, win.h); - - /* resize to new width */ - xw.specbuf = xrealloc(xw.specbuf, col * sizeof(GlyphFontSpec)); -} - -ushort -sixd_to_16bit(int x) -{ - return x == 0 ? 0 : 0x3737 + 0x2828 * x; -} - -int -xloadcolor(int i, const char *name, Color *ncolor) -{ - XRenderColor color = { .alpha = 0xffff }; - - if (!name) { - if (BETWEEN(i, 16, 255)) { /* 256 color */ - if (i < 6*6*6+16) { /* same colors as xterm */ - color.red = sixd_to_16bit( ((i-16)/36)%6 ); - color.green = sixd_to_16bit( ((i-16)/6) %6 ); - color.blue = sixd_to_16bit( ((i-16)/1) %6 ); - } else { /* greyscale */ - color.red = 0x0808 + 0x0a0a * (i - (6*6*6+16)); - color.green = color.blue = color.red; - } - return XftColorAllocValue(xw.dpy, xw.vis, - xw.cmap, &color, ncolor); - } else - name = colorname[i]; - } - - return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); -} - -void -xloadcols(void) -{ - int i; - static int loaded; - Color *cp; - - if (loaded) { - for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) - XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); - } else { - dc.collen = MAX(LEN(colorname), 256); - dc.col = xmalloc(dc.collen * sizeof(Color)); - } - - for (i = 0; i < dc.collen; i++) - if (!xloadcolor(i, NULL, &dc.col[i])) { - if (colorname[i]) - die("could not allocate color '%s'\n", colorname[i]); - else - die("could not allocate color %d\n", i); - } - loaded = 1; -} - -int -xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) -{ - if (!BETWEEN(x, 0, dc.collen - 1)) - return 1; - - *r = dc.col[x].color.red >> 8; - *g = dc.col[x].color.green >> 8; - *b = dc.col[x].color.blue >> 8; - - return 0; -} - -int -xsetcolorname(int x, const char *name) -{ - Color ncolor; - - if (!BETWEEN(x, 0, dc.collen - 1)) - return 1; - - if (!xloadcolor(x, name, &ncolor)) - return 1; - - XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); - dc.col[x] = ncolor; - - return 0; -} - -/* - * Absolute coordinates. - */ -void -xclear(int x1, int y1, int x2, int y2) -{ - XftDrawRect(xw.draw, - &dc.col[IS_SET(MODE_REVERSE)? defaultfg : defaultbg], - x1, y1, x2-x1, y2-y1); -} - -void -xhints(void) -{ - XClassHint class = {opt_name ? opt_name : termname, - opt_class ? opt_class : termname}; - XWMHints wm = {.flags = InputHint, .input = 1}; - XSizeHints *sizeh; - - sizeh = XAllocSizeHints(); - - sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; - sizeh->height = win.h; - sizeh->width = win.w; - sizeh->height_inc = win.ch; - sizeh->width_inc = win.cw; - sizeh->base_height = 2 * borderpx; - sizeh->base_width = 2 * borderpx; - sizeh->min_height = win.ch + 2 * borderpx; - sizeh->min_width = win.cw + 2 * borderpx; - if (xw.isfixed) { - sizeh->flags |= PMaxSize; - sizeh->min_width = sizeh->max_width = win.w; - sizeh->min_height = sizeh->max_height = win.h; - } - if (xw.gm & (XValue|YValue)) { - sizeh->flags |= USPosition | PWinGravity; - sizeh->x = xw.l; - sizeh->y = xw.t; - sizeh->win_gravity = xgeommasktogravity(xw.gm); - } - - XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, - &class); - XFree(sizeh); -} - -int -xgeommasktogravity(int mask) -{ - switch (mask & (XNegative|YNegative)) { - case 0: - return NorthWestGravity; - case XNegative: - return NorthEastGravity; - case YNegative: - return SouthWestGravity; - } - - return SouthEastGravity; -} - -int -xloadfont(Font *f, FcPattern *pattern) -{ - FcPattern *configured; - FcPattern *match; - FcResult result; - XGlyphInfo extents; - int wantattr, haveattr; - - /* - * Manually configure instead of calling XftMatchFont - * so that we can use the configured pattern for - * "missing glyph" lookups. - */ - configured = FcPatternDuplicate(pattern); - if (!configured) - return 1; - - FcConfigSubstitute(NULL, configured, FcMatchPattern); - XftDefaultSubstitute(xw.dpy, xw.scr, configured); - - match = FcFontMatch(NULL, configured, &result); - if (!match) { - FcPatternDestroy(configured); - return 1; - } - - if (!(f->match = XftFontOpenPattern(xw.dpy, match))) { - FcPatternDestroy(configured); - FcPatternDestroy(match); - return 1; - } - - if ((XftPatternGetInteger(pattern, "slant", 0, &wantattr) == - XftResultMatch)) { - /* - * Check if xft was unable to find a font with the appropriate - * slant but gave us one anyway. Try to mitigate. - */ - if ((XftPatternGetInteger(f->match->pattern, "slant", 0, - &haveattr) != XftResultMatch) || haveattr < wantattr) { - f->badslant = 1; - fputs("font slant does not match\n", stderr); - } - } - - if ((XftPatternGetInteger(pattern, "weight", 0, &wantattr) == - XftResultMatch)) { - if ((XftPatternGetInteger(f->match->pattern, "weight", 0, - &haveattr) != XftResultMatch) || haveattr != wantattr) { - f->badweight = 1; - fputs("font weight does not match\n", stderr); - } - } - - XftTextExtentsUtf8(xw.dpy, f->match, - (const FcChar8 *) ascii_printable, - strlen(ascii_printable), &extents); - - f->set = NULL; - f->pattern = configured; - - f->ascent = f->match->ascent; - f->descent = f->match->descent; - f->lbearing = 0; - f->rbearing = f->match->max_advance_width; - - f->height = f->ascent + f->descent; - f->width = DIVCEIL(extents.xOff, strlen(ascii_printable)); - - return 0; -} - -void -xloadfonts(const char *fontstr, double fontsize) -{ - FcPattern *pattern; - double fontval; - - if (fontstr[0] == '-') - pattern = XftXlfdParse(fontstr, False, False); - else - pattern = FcNameParse((const FcChar8 *)fontstr); - - if (!pattern) - die("can't open font %s\n", fontstr); - - if (fontsize > 1) { - FcPatternDel(pattern, FC_PIXEL_SIZE); - FcPatternDel(pattern, FC_SIZE); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, (double)fontsize); - usedfontsize = fontsize; - } else { - if (FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == - FcResultMatch) { - usedfontsize = fontval; - } else if (FcPatternGetDouble(pattern, FC_SIZE, 0, &fontval) == - FcResultMatch) { - usedfontsize = -1; - } else { - /* - * Default font size is 12, if none given. This is to - * have a known usedfontsize value. - */ - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, 12); - usedfontsize = 12; - } - defaultfontsize = usedfontsize; - } - - if (xloadfont(&dc.font, pattern)) - die("can't open font %s\n", fontstr); - - if (usedfontsize < 0) { - FcPatternGetDouble(dc.font.match->pattern, - FC_PIXEL_SIZE, 0, &fontval); - usedfontsize = fontval; - if (fontsize == 0) - defaultfontsize = fontval; - } - - /* Setting character width and height. */ - win.cw = ceilf(dc.font.width * cwscale); - win.ch = ceilf(dc.font.height * chscale); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); - if (xloadfont(&dc.ifont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDel(pattern, FC_WEIGHT); - FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); - if (xloadfont(&dc.ibfont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDel(pattern, FC_SLANT); - FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); - if (xloadfont(&dc.bfont, pattern)) - die("can't open font %s\n", fontstr); - - FcPatternDestroy(pattern); -} - -void -xunloadfont(Font *f) -{ - XftFontClose(xw.dpy, f->match); - FcPatternDestroy(f->pattern); - if (f->set) - FcFontSetDestroy(f->set); -} - -void -xunloadfonts(void) -{ - /* Free the loaded fonts in the font cache. */ - while (frclen > 0) - XftFontClose(xw.dpy, frc[--frclen].font); - - xunloadfont(&dc.font); - xunloadfont(&dc.bfont); - xunloadfont(&dc.ifont); - xunloadfont(&dc.ibfont); -} - -int -ximopen(Display *dpy) -{ - XIMCallback imdestroy = { .client_data = NULL, .callback = ximdestroy }; - XICCallback icdestroy = { .client_data = NULL, .callback = xicdestroy }; - - xw.ime.xim = XOpenIM(xw.dpy, NULL, NULL, NULL); - if (xw.ime.xim == NULL) - return 0; - - if (XSetIMValues(xw.ime.xim, XNDestroyCallback, &imdestroy, NULL)) - fprintf(stderr, "XSetIMValues: " - "Could not set XNDestroyCallback.\n"); - - xw.ime.spotlist = XVaCreateNestedList(0, XNSpotLocation, &xw.ime.spot, - NULL); - - if (xw.ime.xic == NULL) { - xw.ime.xic = XCreateIC(xw.ime.xim, XNInputStyle, - XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, xw.win, - XNDestroyCallback, &icdestroy, - NULL); - } - if (xw.ime.xic == NULL) - fprintf(stderr, "XCreateIC: Could not create input context.\n"); - - return 1; -} - -void -ximinstantiate(Display *dpy, XPointer client, XPointer call) -{ - if (ximopen(dpy)) - XUnregisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); -} - -void -ximdestroy(XIM xim, XPointer client, XPointer call) -{ - xw.ime.xim = NULL; - XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); - XFree(xw.ime.spotlist); -} - -int -xicdestroy(XIC xim, XPointer client, XPointer call) -{ - xw.ime.xic = NULL; - return 1; -} - -void -xinit(int cols, int rows) -{ - XGCValues gcvalues; - Cursor cursor; - Window parent; - pid_t thispid = getpid(); - XColor xmousefg, xmousebg; - - if (!(xw.dpy = XOpenDisplay(NULL))) - die("can't open display\n"); - xw.scr = XDefaultScreen(xw.dpy); - xw.vis = XDefaultVisual(xw.dpy, xw.scr); - - /* font */ - if (!FcInit()) - die("could not init fontconfig.\n"); - - usedfont = (opt_font == NULL)? font : opt_font; - xloadfonts(usedfont, 0); - - /* colors */ - xw.cmap = XDefaultColormap(xw.dpy, xw.scr); - xloadcols(); - - /* adjust fixed window geometry */ - win.w = 2 * borderpx + cols * win.cw; - win.h = 2 * borderpx + rows * win.ch; - if (xw.gm & XNegative) - xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; - if (xw.gm & YNegative) - xw.t += DisplayHeight(xw.dpy, xw.scr) - win.h - 2; - - /* Events */ - xw.attrs.background_pixel = dc.col[defaultbg].pixel; - xw.attrs.border_pixel = dc.col[defaultbg].pixel; - xw.attrs.bit_gravity = NorthWestGravity; - xw.attrs.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask - | ExposureMask | VisibilityChangeMask | StructureNotifyMask - | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; - xw.attrs.colormap = xw.cmap; - - if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) - parent = XRootWindow(xw.dpy, xw.scr); - xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, - win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, - xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity - | CWEventMask | CWColormap, &xw.attrs); - - memset(&gcvalues, 0, sizeof(gcvalues)); - gcvalues.graphics_exposures = False; - dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, - &gcvalues); - xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, - DefaultDepth(xw.dpy, xw.scr)); - XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); - XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); - - /* font spec buffer */ - xw.specbuf = xmalloc(cols * sizeof(GlyphFontSpec)); - - /* Xft rendering context */ - xw.draw = XftDrawCreate(xw.dpy, xw.buf, xw.vis, xw.cmap); - - /* input methods */ - if (!ximopen(xw.dpy)) { - XRegisterIMInstantiateCallback(xw.dpy, NULL, NULL, NULL, - ximinstantiate, NULL); - } - - /* white cursor, black outline */ - cursor = XCreateFontCursor(xw.dpy, mouseshape); - XDefineCursor(xw.dpy, xw.win, cursor); - - if (XParseColor(xw.dpy, xw.cmap, colorname[mousefg], &xmousefg) == 0) { - xmousefg.red = 0xffff; - xmousefg.green = 0xffff; - xmousefg.blue = 0xffff; - } - - if (XParseColor(xw.dpy, xw.cmap, colorname[mousebg], &xmousebg) == 0) { - xmousebg.red = 0x0000; - xmousebg.green = 0x0000; - xmousebg.blue = 0x0000; - } - - XRecolorCursor(xw.dpy, cursor, &xmousefg, &xmousebg); - - xw.xembed = XInternAtom(xw.dpy, "_XEMBED", False); - xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); - xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False); - xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False); - XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); - - xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False); - XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32, - PropModeReplace, (uchar *)&thispid, 1); - - win.mode = MODE_NUMLOCK; - resettitle(); - xhints(); - XMapWindow(xw.dpy, xw.win); - XSync(xw.dpy, False); - - clock_gettime(CLOCK_MONOTONIC, &xsel.tclick1); - clock_gettime(CLOCK_MONOTONIC, &xsel.tclick2); - xsel.primary = NULL; - xsel.clipboard = NULL; - xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); - if (xsel.xtarget == None) - xsel.xtarget = XA_STRING; -} - -int -xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) -{ - float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; - ushort mode, prevmode = USHRT_MAX; - Font *font = &dc.font; - int frcflags = FRC_NORMAL; - float runewidth = win.cw; - Rune rune; - FT_UInt glyphidx; - FcResult fcres; - FcPattern *fcpattern, *fontpattern; - FcFontSet *fcsets[] = { NULL }; - FcCharSet *fccharset; - int i, f, numspecs = 0; - - for (i = 0, xp = winx, yp = winy + font->ascent; i < len; ++i) { - /* Fetch rune and mode for current glyph. */ - rune = glyphs[i].u; - mode = glyphs[i].mode; - - /* Skip dummy wide-character spacing. */ - if (mode == ATTR_WDUMMY) - continue; - - /* Determine font for glyph if different from previous glyph. */ - if (prevmode != mode) { - prevmode = mode; - font = &dc.font; - frcflags = FRC_NORMAL; - runewidth = win.cw * ((mode & ATTR_WIDE) ? 2.0f : 1.0f); - if ((mode & ATTR_ITALIC) && (mode & ATTR_BOLD)) { - font = &dc.ibfont; - frcflags = FRC_ITALICBOLD; - } else if (mode & ATTR_ITALIC) { - font = &dc.ifont; - frcflags = FRC_ITALIC; - } else if (mode & ATTR_BOLD) { - font = &dc.bfont; - frcflags = FRC_BOLD; - } - yp = winy + font->ascent; - } - - /* Lookup character index with default font. */ - glyphidx = XftCharIndex(xw.dpy, font->match, rune); - if (glyphidx) { - specs[numspecs].font = font->match; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; - continue; - } - - /* Fallback on font cache, search the font cache for match. */ - for (f = 0; f < frclen; f++) { - glyphidx = XftCharIndex(xw.dpy, frc[f].font, rune); - /* Everything correct. */ - if (glyphidx && frc[f].flags == frcflags) - break; - /* We got a default font for a not found glyph. */ - if (!glyphidx && frc[f].flags == frcflags - && frc[f].unicodep == rune) { - break; - } - } - - /* Nothing was found. Use fontconfig to find matching font. */ - if (f >= frclen) { - if (!font->set) - font->set = FcFontSort(0, font->pattern, - 1, 0, &fcres); - fcsets[0] = font->set; - - /* - * Nothing was found in the cache. Now use - * some dozen of Fontconfig calls to get the - * font for one single character. - * - * Xft and fontconfig are design failures. - */ - fcpattern = FcPatternDuplicate(font->pattern); - fccharset = FcCharSetCreate(); - - FcCharSetAddChar(fccharset, rune); - FcPatternAddCharSet(fcpattern, FC_CHARSET, - fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, 1); - - FcConfigSubstitute(0, fcpattern, - FcMatchPattern); - FcDefaultSubstitute(fcpattern); - - fontpattern = FcFontSetMatch(0, fcsets, 1, - fcpattern, &fcres); - - /* Allocate memory for the new cache entry. */ - if (frclen >= frccap) { - frccap += 16; - frc = xrealloc(frc, frccap * sizeof(Fontcache)); - } - - frc[frclen].font = XftFontOpenPattern(xw.dpy, - fontpattern); - if (!frc[frclen].font) - die("XftFontOpenPattern failed seeking fallback font: %s\n", - strerror(errno)); - frc[frclen].flags = frcflags; - frc[frclen].unicodep = rune; - - glyphidx = XftCharIndex(xw.dpy, frc[frclen].font, rune); - - f = frclen; - frclen++; - - FcPatternDestroy(fcpattern); - FcCharSetDestroy(fccharset); - } - - specs[numspecs].font = frc[f].font; - specs[numspecs].glyph = glyphidx; - specs[numspecs].x = (short)xp; - specs[numspecs].y = (short)yp; - xp += runewidth; - numspecs++; - } - - return numspecs; -} - -void -xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) -{ - int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); - int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, - width = charlen * win.cw; - Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; - XRenderColor colfg, colbg; - XRectangle r; - - /* Fallback on color display for attributes not supported by the font */ - if (base.mode & ATTR_ITALIC && base.mode & ATTR_BOLD) { - if (dc.ibfont.badslant || dc.ibfont.badweight) - base.fg = defaultattr; - } else if ((base.mode & ATTR_ITALIC && dc.ifont.badslant) || - (base.mode & ATTR_BOLD && dc.bfont.badweight)) { - base.fg = defaultattr; - } - - if (IS_TRUECOL(base.fg)) { - colfg.alpha = 0xffff; - colfg.red = TRUERED(base.fg); - colfg.green = TRUEGREEN(base.fg); - colfg.blue = TRUEBLUE(base.fg); - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &truefg); - fg = &truefg; - } else { - fg = &dc.col[base.fg]; - } - - if (IS_TRUECOL(base.bg)) { - colbg.alpha = 0xffff; - colbg.green = TRUEGREEN(base.bg); - colbg.red = TRUERED(base.bg); - colbg.blue = TRUEBLUE(base.bg); - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &truebg); - bg = &truebg; - } else { - bg = &dc.col[base.bg]; - } - - /* Change basic system colors [0-7] to bright system colors [8-15] */ - if ((base.mode & ATTR_BOLD_FAINT) == ATTR_BOLD && BETWEEN(base.fg, 0, 7)) - fg = &dc.col[base.fg + 8]; - - if (IS_SET(MODE_REVERSE)) { - if (fg == &dc.col[defaultfg]) { - fg = &dc.col[defaultbg]; - } else { - colfg.red = ~fg->color.red; - colfg.green = ~fg->color.green; - colfg.blue = ~fg->color.blue; - colfg.alpha = fg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, - &revfg); - fg = &revfg; - } - - if (bg == &dc.col[defaultbg]) { - bg = &dc.col[defaultfg]; - } else { - colbg.red = ~bg->color.red; - colbg.green = ~bg->color.green; - colbg.blue = ~bg->color.blue; - colbg.alpha = bg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, - &revbg); - bg = &revbg; - } - } - - if ((base.mode & ATTR_BOLD_FAINT) == ATTR_FAINT) { - colfg.red = fg->color.red / 2; - colfg.green = fg->color.green / 2; - colfg.blue = fg->color.blue / 2; - colfg.alpha = fg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg); - fg = &revfg; - } - - if (base.mode & ATTR_REVERSE) { - temp = fg; - fg = bg; - bg = temp; - } - - if (base.mode & ATTR_BLINK && win.mode & MODE_BLINK) - fg = bg; - - if (base.mode & ATTR_INVISIBLE) - fg = bg; - - /* Intelligent cleaning up of the borders. */ - if (x == 0) { - xclear(0, (y == 0)? 0 : winy, borderpx, - winy + win.ch + - ((winy + win.ch >= borderpx + win.th)? win.h : 0)); - } - if (winx + width >= borderpx + win.tw) { - xclear(winx + width, (y == 0)? 0 : winy, win.w, - ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); - } - if (y == 0) - xclear(winx, 0, winx + width, borderpx); - if (winy + win.ch >= borderpx + win.th) - xclear(winx, winy + win.ch, winx + width, win.h); - - /* Clean up the region we want to draw to. */ - XftDrawRect(xw.draw, bg, winx, winy, width, win.ch); - - /* Set the clip region because Xft is sometimes dirty. */ - r.x = 0; - r.y = 0; - r.height = win.ch; - r.width = width; - XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); - - /* Render the glyphs. */ - XftDrawGlyphFontSpec(xw.draw, fg, specs, len); - - /* Render underline and strikethrough. */ - if (base.mode & ATTR_UNDERLINE) { - XftDrawRect(xw.draw, fg, winx, winy + dc.font.ascent * chscale + 1, - width, 1); - } - - if (base.mode & ATTR_STRUCK) { - XftDrawRect(xw.draw, fg, winx, winy + 2 * dc.font.ascent * chscale / 3, - width, 1); - } - - /* Reset clip to none. */ - XftDrawSetClip(xw.draw, 0); -} - -void -xdrawglyph(Glyph g, int x, int y) -{ - int numspecs; - XftGlyphFontSpec spec; - - numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y); - xdrawglyphfontspecs(&spec, g, numspecs, x, y); -} - -void -xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) -{ - Color drawcol; - - /* remove the old cursor */ - if (selected(ox, oy)) - og.mode ^= ATTR_REVERSE; - xdrawglyph(og, ox, oy); - - if (IS_SET(MODE_HIDE)) - return; - - /* - * Select the right color for the right mode. - */ - g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; - - if (IS_SET(MODE_REVERSE)) { - g.mode |= ATTR_REVERSE; - g.bg = defaultfg; - if (selected(cx, cy)) { - drawcol = dc.col[defaultcs]; - g.fg = defaultrcs; - } else { - drawcol = dc.col[defaultrcs]; - g.fg = defaultcs; - } - } else { - if (selected(cx, cy)) { - g.fg = defaultfg; - g.bg = defaultrcs; - } else { - g.fg = defaultbg; - g.bg = defaultcs; - } - drawcol = dc.col[g.bg]; - } - - /* draw the new one */ - if (IS_SET(MODE_FOCUSED)) { - switch (win.cursor) { - case 7: /* st extension */ - g.u = 0x2603; /* snowman (U+2603) */ - /* FALLTHROUGH */ - case 0: /* Blinking Block */ - case 1: /* Blinking Block (Default) */ - case 2: /* Steady Block */ - xdrawglyph(g, cx, cy); - break; - case 3: /* Blinking Underline */ - case 4: /* Steady Underline */ - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + (cy + 1) * win.ch - \ - cursorthickness, - win.cw, cursorthickness); - break; - case 5: /* Blinking bar */ - case 6: /* Steady bar */ - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + cy * win.ch, - cursorthickness, win.ch); - break; - } - } else { - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + cy * win.ch, - win.cw - 1, 1); - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, - borderpx + (cx + 1) * win.cw - 1, - borderpx + cy * win.ch, - 1, win.ch - 1); - XftDrawRect(xw.draw, &drawcol, - borderpx + cx * win.cw, - borderpx + (cy + 1) * win.ch - 1, - win.cw, 1); - } -} - -void -xsetenv(void) -{ - char buf[sizeof(long) * 8 + 1]; - - snprintf(buf, sizeof(buf), "%lu", xw.win); - setenv("WINDOWID", buf, 1); -} - -void -xseticontitle(char *p) -{ - XTextProperty prop; - DEFAULT(p, opt_title); - - if (p[0] == '\0') - p = opt_title; - - if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, - &prop) != Success) - return; - XSetWMIconName(xw.dpy, xw.win, &prop); - XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmiconname); - XFree(prop.value); -} - -void -xsettitle(char *p) -{ - XTextProperty prop; - DEFAULT(p, opt_title); - - if (p[0] == '\0') - p = opt_title; - - if (Xutf8TextListToTextProperty(xw.dpy, &p, 1, XUTF8StringStyle, - &prop) != Success) - return; - XSetWMName(xw.dpy, xw.win, &prop); - XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname); - XFree(prop.value); -} - -int -xstartdraw(void) -{ - return IS_SET(MODE_VISIBLE); -} - -void -xdrawline(Line line, int x1, int y1, int x2) -{ - int i, x, ox, numspecs; - Glyph base, new; - XftGlyphFontSpec *specs = xw.specbuf; - - numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1); - i = ox = 0; - for (x = x1; x < x2 && i < numspecs; x++) { - new = line[x]; - if (new.mode == ATTR_WDUMMY) - continue; - if (selected(x, y1)) - new.mode ^= ATTR_REVERSE; - if (i > 0 && ATTRCMP(base, new)) { - xdrawglyphfontspecs(specs, base, i, ox, y1); - specs += i; - numspecs -= i; - i = 0; - } - if (i == 0) { - ox = x; - base = new; - } - i++; - } - if (i > 0) - xdrawglyphfontspecs(specs, base, i, ox, y1); -} - -void -xfinishdraw(void) -{ - XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w, - win.h, 0, 0); - XSetForeground(xw.dpy, dc.gc, - dc.col[IS_SET(MODE_REVERSE)? - defaultfg : defaultbg].pixel); -} - -void -xximspot(int x, int y) -{ - if (xw.ime.xic == NULL) - return; - - xw.ime.spot.x = borderpx + x * win.cw; - xw.ime.spot.y = borderpx + (y + 1) * win.ch; - - XSetICValues(xw.ime.xic, XNPreeditAttributes, xw.ime.spotlist, NULL); -} - -void -expose(XEvent *ev) -{ - redraw(); -} - -void -visibility(XEvent *ev) -{ - XVisibilityEvent *e = &ev->xvisibility; - - MODBIT(win.mode, e->state != VisibilityFullyObscured, MODE_VISIBLE); -} - -void -unmap(XEvent *ev) -{ - win.mode &= ~MODE_VISIBLE; -} - -void -xsetpointermotion(int set) -{ - MODBIT(xw.attrs.event_mask, set, PointerMotionMask); - XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); -} - -void -xsetmode(int set, unsigned int flags) -{ - int mode = win.mode; - MODBIT(win.mode, set, flags); - if ((win.mode & MODE_REVERSE) != (mode & MODE_REVERSE)) - redraw(); -} - -int -xsetcursor(int cursor) -{ - if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */ - return 1; - win.cursor = cursor; - return 0; -} - -void -xseturgency(int add) -{ - XWMHints *h = XGetWMHints(xw.dpy, xw.win); - - MODBIT(h->flags, add, XUrgencyHint); - XSetWMHints(xw.dpy, xw.win, h); - XFree(h); -} - -void -xbell(void) -{ - if (!(IS_SET(MODE_FOCUSED))) - xseturgency(1); - if (bellvolume) - XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); -} - -void -focus(XEvent *ev) -{ - XFocusChangeEvent *e = &ev->xfocus; - - if (e->mode == NotifyGrab) - return; - - if (ev->type == FocusIn) { - if (xw.ime.xic) - XSetICFocus(xw.ime.xic); - win.mode |= MODE_FOCUSED; - xseturgency(0); - if (IS_SET(MODE_FOCUS)) - ttywrite("\033[I", 3, 0); - } else { - if (xw.ime.xic) - XUnsetICFocus(xw.ime.xic); - win.mode &= ~MODE_FOCUSED; - if (IS_SET(MODE_FOCUS)) - ttywrite("\033[O", 3, 0); - } -} - -int -match(uint mask, uint state) -{ - return mask == XK_ANY_MOD || mask == (state & ~ignoremod); -} - -char* -kmap(KeySym k, uint state) -{ - Key *kp; - int i; - - /* Check for mapped keys out of X11 function keys. */ - for (i = 0; i < LEN(mappedkeys); i++) { - if (mappedkeys[i] == k) - break; - } - if (i == LEN(mappedkeys)) { - if ((k & 0xFFFF) < 0xFD00) - return NULL; - } - - for (kp = key; kp < key + LEN(key); kp++) { - if (kp->k != k) - continue; - - if (!match(kp->mask, state)) - continue; - - if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0) - continue; - if (IS_SET(MODE_NUMLOCK) && kp->appkey == 2) - continue; - - if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0) - continue; - - return kp->s; - } - - return NULL; -} - -void -kpress(XEvent *ev) -{ - XKeyEvent *e = &ev->xkey; - KeySym ksym = NoSymbol; - char buf[64], *customkey; - int len; - Rune c; - Status status; - Shortcut *bp; - - if (IS_SET(MODE_KBDLOCK)) - return; - - if (xw.ime.xic) { - len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); - if (status == XBufferOverflow) - return; - } else { - len = XLookupString(e, buf, sizeof buf, &ksym, NULL); - } - /* 1. shortcuts */ - for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { - if (ksym == bp->keysym && match(bp->mod, e->state)) { - bp->func(&(bp->arg)); - return; - } - } - - /* 2. custom keys from config.h */ - if ((customkey = kmap(ksym, e->state))) { - ttywrite(customkey, strlen(customkey), 1); - return; - } - - /* 3. composed string from input method */ - if (len == 0) - return; - if (len == 1 && e->state & Mod1Mask) { - if (IS_SET(MODE_8BIT)) { - if (*buf < 0177) { - c = *buf | 0x80; - len = utf8encode(c, buf); - } - } else { - buf[1] = buf[0]; - buf[0] = '\033'; - len = 2; - } - } - ttywrite(buf, len, 1); -} - -void -cmessage(XEvent *e) -{ - /* - * See xembed specs - * http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html - */ - if (e->xclient.message_type == xw.xembed && e->xclient.format == 32) { - if (e->xclient.data.l[1] == XEMBED_FOCUS_IN) { - win.mode |= MODE_FOCUSED; - xseturgency(0); - } else if (e->xclient.data.l[1] == XEMBED_FOCUS_OUT) { - win.mode &= ~MODE_FOCUSED; - } - } else if (e->xclient.data.l[0] == xw.wmdeletewin) { - ttyhangup(); - exit(0); - } -} - -void -resize(XEvent *e) -{ - if (e->xconfigure.width == win.w && e->xconfigure.height == win.h) - return; - - cresize(e->xconfigure.width, e->xconfigure.height); -} - -void -run(void) -{ - XEvent ev; - int w = win.w, h = win.h; - fd_set rfd; - int xfd = XConnectionNumber(xw.dpy), ttyfd, xev, drawing; - struct timespec seltv, *tv, now, lastblink, trigger; - double timeout; - - /* Waiting for window mapping */ - do { - XNextEvent(xw.dpy, &ev); - /* - * This XFilterEvent call is required because of XOpenIM. It - * does filter out the key event and some client message for - * the input method too. - */ - if (XFilterEvent(&ev, None)) - continue; - if (ev.type == ConfigureNotify) { - w = ev.xconfigure.width; - h = ev.xconfigure.height; - } - } while (ev.type != MapNotify); - - ttyfd = ttynew(opt_line, shell, opt_io, opt_cmd); - cresize(w, h); - - for (timeout = -1, drawing = 0, lastblink = (struct timespec){0};;) { - FD_ZERO(&rfd); - FD_SET(ttyfd, &rfd); - FD_SET(xfd, &rfd); - - if (XPending(xw.dpy)) - timeout = 0; /* existing events might not set xfd */ - - seltv.tv_sec = timeout / 1E3; - seltv.tv_nsec = 1E6 * (timeout - 1E3 * seltv.tv_sec); - tv = timeout >= 0 ? &seltv : NULL; - - if (pselect(MAX(xfd, ttyfd)+1, &rfd, NULL, NULL, tv, NULL) < 0) { - if (errno == EINTR) - continue; - die("select failed: %s\n", strerror(errno)); - } - clock_gettime(CLOCK_MONOTONIC, &now); - - if (FD_ISSET(ttyfd, &rfd)) - ttyread(); - - xev = 0; - while (XPending(xw.dpy)) { - xev = 1; - XNextEvent(xw.dpy, &ev); - if (XFilterEvent(&ev, None)) - continue; - if (handler[ev.type]) - (handler[ev.type])(&ev); - } - - /* - * To reduce flicker and tearing, when new content or event - * triggers drawing, we first wait a bit to ensure we got - * everything, and if nothing new arrives - we draw. - * We start with trying to wait minlatency ms. If more content - * arrives sooner, we retry with shorter and shorter periods, - * and eventually draw even without idle after maxlatency ms. - * Typically this results in low latency while interacting, - * maximum latency intervals during `cat huge.txt`, and perfect - * sync with periodic updates from animations/key-repeats/etc. - */ - if (FD_ISSET(ttyfd, &rfd) || xev) { - if (!drawing) { - trigger = now; - drawing = 1; - } - timeout = (maxlatency - TIMEDIFF(now, trigger)) \ - / maxlatency * minlatency; - if (timeout > 0) - continue; /* we have time, try to find idle */ - } - - /* idle detected or maxlatency exhausted -> draw */ - timeout = -1; - if (blinktimeout && tattrset(ATTR_BLINK)) { - timeout = blinktimeout - TIMEDIFF(now, lastblink); - if (timeout <= 0) { - if (-timeout > blinktimeout) /* start visible */ - win.mode |= MODE_BLINK; - win.mode ^= MODE_BLINK; - tsetdirtattr(ATTR_BLINK); - lastblink = now; - timeout = blinktimeout; - } - } - - draw(); - XFlush(xw.dpy); - drawing = 0; - } -} - -void -usage(void) -{ - die("usage: %s [-aiv] [-c class] [-f font] [-g geometry]" - " [-n name] [-o file]\n" - " [-T title] [-t title] [-w windowid]" - " [[-e] command [args ...]]\n" - " %s [-aiv] [-c class] [-f font] [-g geometry]" - " [-n name] [-o file]\n" - " [-T title] [-t title] [-w windowid] -l line" - " [stty_args ...]\n", argv0, argv0); -} - -int -main(int argc, char *argv[]) -{ - xw.l = xw.t = 0; - xw.isfixed = False; - xsetcursor(cursorshape); - - ARGBEGIN { - case 'a': - allowaltscreen = 0; - break; - case 'c': - opt_class = EARGF(usage()); - break; - case 'e': - if (argc > 0) - --argc, ++argv; - goto run; - case 'f': - opt_font = EARGF(usage()); - break; - case 'g': - xw.gm = XParseGeometry(EARGF(usage()), - &xw.l, &xw.t, &cols, &rows); - break; - case 'i': - xw.isfixed = 1; - break; - case 'o': - opt_io = EARGF(usage()); - break; - case 'l': - opt_line = EARGF(usage()); - break; - case 'n': - opt_name = EARGF(usage()); - break; - case 't': - case 'T': - opt_title = EARGF(usage()); - break; - case 'w': - opt_embed = EARGF(usage()); - break; - case 'v': - die("%s " VERSION "\n", argv0); - break; - default: - usage(); - } ARGEND; - -run: - if (argc > 0) /* eat all remaining arguments */ - opt_cmd = argv; - - if (!opt_title) - opt_title = (opt_line || !opt_cmd) ? "st" : opt_cmd[0]; - - setlocale(LC_CTYPE, ""); - XSetLocaleModifiers(""); - cols = MAX(cols, 1); - rows = MAX(rows, 1); - tnew(cols, rows); - xinit(cols, rows); - xsetenv(); - selinit(); - run(); - - return 0; -} diff --git a/hosts/vali/mars/dwm/st-0.9.2/x.o b/hosts/vali/mars/dwm/st-0.9.2/x.o deleted file mode 100644 index 5188aa0b13a060cfe6a721d8d1831f9e9b802f36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75272 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 M0k)nKrXF2C0RLvQTL1t6 From 40c0028586d51af9ba8afed995c8db9cc5d6ad6d Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 21 Apr 2024 22:02:51 +0200 Subject: [PATCH 28/50] Added nvidia driver 535 config --- options/common/gpu/nvidia_535_wayland.nix | 59 +++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 options/common/gpu/nvidia_535_wayland.nix diff --git a/options/common/gpu/nvidia_535_wayland.nix b/options/common/gpu/nvidia_535_wayland.nix new file mode 100644 index 0000000..30108f4 --- /dev/null +++ b/options/common/gpu/nvidia_535_wayland.nix @@ -0,0 +1,59 @@ +{ pkgs, config, libs, ... }: + +{ + + environment.variables = { + GBM_BACKEND = "nvidia-drm"; + WLR_NO_HARDWARE_CURSORS = "1"; + LIBVA_DRIVER_NAME = "nvidia"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + }; + + environment.systemPackages = with pkgs; [ + vulkan-loader + vulkan-validation-layers + vulkan-tools + ]; + +# Enable OpenGL + hardware.opengl = { + enable = true; + driSupport = true; + driSupport32Bit = true; + extraPackages = with pkgs; [ nvidia-vaapi-driver ]; + }; + +# Load nvidia driver for Xorg and Wayland + services.xserver.videoDrivers = ["nvidia"]; + + hardware.nvidia.modesetting.enable = true; + hardware.nvidia.powerManagement.enable = false; + hardware.nvidia.powerManagement.finegrained = false; + hardware.nvidia.open = false; + hardware.nvidia.nvidiaSettings = true; + hardware.nvidia.forceFullCompositionPipeline = false; + # package = config.boot.kernelPackages.nvidiaPackages.beta; +# Special config to load the latest (535 or 550) driver for the support of the 4070 SUPER + hardware.nvidia.package = let + rcu_patch = pkgs.fetchpatch { + url = "https://github.com/gentoo/gentoo/raw/c64caf53/x11-drivers/nvidia-drivers/files/nvidia-drivers-470.223.02-gpl-pfn_valid.patch"; + hash = "sha256-eZiQQp2S/asE7MfGvfe6dA/kdCvek9SYa/FFGp24dVg="; + }; + in config.boot.kernelPackages.nvidiaPackages.mkDriver { + version = "535.154.05"; + sha256_64bit = "sha256-fpUGXKprgt6SYRDxSCemGXLrEsIA6GOinp+0eGbqqJg="; + sha256_aarch64 = "sha256-G0/GiObf/BZMkzzET8HQjdIcvCSqB1uhsinro2HLK9k="; + openSha256 = "sha256-wvRdHguGLxS0mR06P5Qi++pDJBCF8pJ8hr4T8O6TJIo="; + settingsSha256 = "sha256-9wqoDEWY4I7weWW05F4igj1Gj9wjHsREFMztfEmqm10="; + persistencedSha256 = "sha256-d0Q3Lk80JqkS1B54Mahu2yY/WocOqFFbZVBh+ToGhaE="; + + #version = "550.40.07"; + #sha256_64bit = "sha256-KYk2xye37v7ZW7h+uNJM/u8fNf7KyGTZjiaU03dJpK0="; + #sha256_aarch64 = "sha256-AV7KgRXYaQGBFl7zuRcfnTGr8rS5n13nGUIe3mJTXb4="; + #openSha256 = "sha256-mRUTEWVsbjq+psVe+kAT6MjyZuLkG2yRDxCMvDJRL1I="; + #settingsSha256 = "sha256-c30AQa4g4a1EHmaEu1yc05oqY01y+IusbBuq+P6rMCs="; + #persistencedSha256 = "sha256-11tLSY8uUIl4X/roNnxf5yS2PQvHvoNjnd2CB67e870="; + + patches = [ rcu_patch ]; + }; +} From 4c37ea841ca599fc6b2717756017ca944028e2c3 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 21 Apr 2024 22:02:59 +0200 Subject: [PATCH 29/50] flake update --- flake.lock | 264 ++++++++++++++++++++++------------------------------- 1 file changed, 108 insertions(+), 156 deletions(-) diff --git a/flake.lock b/flake.lock index bd07fb4..5f2d2b8 100644 --- a/flake.lock +++ b/flake.lock @@ -29,11 +29,11 @@ ] }, "locked": { - "lastModified": 1712136515, - "narHash": "sha256-LpjQJYC24S5P5XhJsZX6HqsQT1pohcFzM6N42I6qo/U=", + "lastModified": 1713259062, + "narHash": "sha256-WTO84hUL8IlNuHDK2yOCeJ38EewFzGt5E0kzBjNWxa8=", "owner": "Kirottu", "repo": "anyrun", - "rev": "be6728884d543665e7bd137bbef62dc1d04a210b", + "rev": "f9d30e34fa4ccb2797c6becec37e8bcff6585d39", "type": "github" }, "original": { @@ -95,11 +95,11 @@ ] }, "locked": { - "lastModified": 1711099426, - "narHash": "sha256-HzpgM/wc3aqpnHJJ2oDqPBkNsqWbW0WfWUO8lKu8nGk=", + "lastModified": 1713532798, + "narHash": "sha256-wtBhsdMJA3Wa32Wtm1eeo84GejtI43pMrFrmwLXrsEc=", "owner": "numtide", "repo": "devshell", - "rev": "2d45b54ca4a183f2fdcf4b19c895b64fbf620ee8", + "rev": "12e914740a25ea1891ec619bb53cf5e6ca922e40", "type": "github" }, "original": { @@ -116,11 +116,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1712903033, - "narHash": "sha256-KcvsEm0h1mIwBHFAzWFBjGihnbf2fxpAaXOdVbUfAI4=", + "lastModified": 1713680591, + "narHash": "sha256-3pbv7UgAgetwz9YdjzIT/lZ6Rgj6wj6MR4mphBLyDjU=", "owner": "nix-community", "repo": "fenix", - "rev": "c739f83545e625227f4d0af7fe2a71e69931fa4c", + "rev": "19aaa94a73cc670a4d87e84f0909966cd8f8cd79", "type": "github" }, "original": { @@ -320,11 +320,11 @@ ] }, "locked": { - "lastModified": 1706830856, - "narHash": "sha256-a0NYyp+h9hlb7ddVz4LUn1vT/PLwqfrWYcHMvFB1xYg=", + "lastModified": 1712014858, + "narHash": "sha256-sB4SWl2lX95bExY2gMFG5HIzvva5AVMJd4Igm+GpZNw=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "b253292d9c0a5ead9bc98c4e9a26c6312e27d69f", + "rev": "9126214d0a59633752a136528f5f3b9aa8565b7d", "type": "github" }, "original": { @@ -356,11 +356,11 @@ "systems": "systems_2" }, "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -522,11 +522,11 @@ ] }, "locked": { - "lastModified": 1712759992, - "narHash": "sha256-2APpO3ZW4idlgtlb8hB04u/rmIcKA8O7pYqxF66xbNY=", + "lastModified": 1713682182, + "narHash": "sha256-2RSqVmQMFmn6OjQ21SXnWC+HuSeqDLWLftRv/ZhEDZE=", "owner": "nix-community", "repo": "home-manager", - "rev": "31357486b0ef6f4e161e002b6893eeb4fafc3ca9", + "rev": "4cec20dbf5c0a716115745ae32531e34816ecbbe", "type": "github" }, "original": { @@ -543,11 +543,11 @@ ] }, "locked": { - "lastModified": 1712759992, - "narHash": "sha256-2APpO3ZW4idlgtlb8hB04u/rmIcKA8O7pYqxF66xbNY=", + "lastModified": 1713566308, + "narHash": "sha256-7Y91t8pheIzjJveUMAPyeh5NOq5F49Nq4Hl2532QpJs=", "owner": "nix-community", "repo": "home-manager", - "rev": "31357486b0ef6f4e161e002b6893eeb4fafc3ca9", + "rev": "057117a401a34259c9615ce62218aea7afdee4d3", "type": "github" }, "original": { @@ -564,11 +564,11 @@ ] }, "locked": { - "lastModified": 1708591310, - "narHash": "sha256-8mQGVs8JccWTnORgoLOTh9zvf6Np+x2JzhIc+LDcJ9s=", + "lastModified": 1712759992, + "narHash": "sha256-2APpO3ZW4idlgtlb8hB04u/rmIcKA8O7pYqxF66xbNY=", "owner": "nix-community", "repo": "home-manager", - "rev": "0e0e9669547e45ea6cca2de4044c1a384fd0fe55", + "rev": "31357486b0ef6f4e161e002b6893eeb4fafc3ca9", "type": "github" }, "original": { @@ -577,54 +577,20 @@ "type": "github" } }, - "hyprcursor": { - "inputs": { - "hyprlang": [ - "split-monitor-workspaces", - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "split-monitor-workspaces", - "hyprland", - "nixpkgs" - ], - "systems": [ - "split-monitor-workspaces", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1712434681, - "narHash": "sha256-qwmR2p1oc48Bj7gUDvb1oGL19Rjs2PmEmk4ChV01A5o=", - "owner": "hyprwm", - "repo": "hyprcursor", - "rev": "818d8c4b69e0997483d60b75f701fe14b561a7a3", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprcursor", - "type": "github" - } - }, "hyprland": { "inputs": { - "hyprcursor": "hyprcursor", "hyprland-protocols": "hyprland-protocols", - "hyprlang": "hyprlang", "nixpkgs": "nixpkgs_6", - "systems": "systems_6", + "systems": "systems_7", "wlroots": "wlroots", "xdph": "xdph" }, "locked": { - "lastModified": 1712969717, - "narHash": "sha256-vAtfM8lHOLjuHh/CTzSFUaCJp0qlAWttWimin3KoDXM=", + "lastModified": 1694029537, + "narHash": "sha256-TxVjVBkLlVhJ91gCyHfhy0FaJ9Din6/NlO+eAK3QpG4=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "582d6233c802327fea45a14d146e7cbab5fe4b1e", + "rev": "8c83852704ad8d78b839bd532d73b3b9e44724b9", "type": "github" }, "original": { @@ -660,44 +626,17 @@ "type": "github" } }, - "hyprlang": { - "inputs": { - "nixpkgs": [ - "split-monitor-workspaces", - "hyprland", - "nixpkgs" - ], - "systems": [ - "split-monitor-workspaces", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1711671891, - "narHash": "sha256-C/Wwsy/RLxHP1axFFl+AnwJRWfd8gxDKKoa8nt8Qk3c=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "c1402612146ba06606ebf64963a02bc1efe11e74", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, "lib-aggregate": { "inputs": { "flake-utils": "flake-utils_2", "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1712491724, - "narHash": "sha256-E5EcBzf/zaR3hD8g1CDtqqwXXebSWtqOvoaR+LDjTME=", + "lastModified": 1713105314, + "narHash": "sha256-X3URKbcgIy4UaQGrsy3DmY5x+fePQ5IYaa76YewoUE0=", "owner": "nix-community", "repo": "lib-aggregate", - "rev": "2737d0204685c3274390229a09eb8f7eaa1a9e89", + "rev": "f347ed9a1cab12c27541ed4d173e2f2d5c9bc0bb", "type": "github" }, "original": { @@ -716,11 +655,11 @@ }, "locked": { "dir": "contrib", - "lastModified": 1712963920, - "narHash": "sha256-5Rh+bUrpeQLYtvnFlMFmUFkV/H6b+I22Bei8oNa+dBw=", + "lastModified": 1713650988, + "narHash": "sha256-YAbwiZkKxpbM+fdTVcXmp49XtHMDYQNng/wc9L85eZs=", "owner": "neovim", "repo": "neovim", - "rev": "66220d164a40791a5131d4660e6ffbee431070d5", + "rev": "9e1bbb9813e0ea4e37f6325fe00e8f43617ef912", "type": "github" }, "original": { @@ -739,11 +678,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1712966609, - "narHash": "sha256-XkNBbh8x1niHtVILUiNlGJHN9N2JkY+a8MR8w0/mhrI=", + "lastModified": 1713657840, + "narHash": "sha256-O99sOWro/5J4qWyIFZ3vEw+abLnzOv4jrfA7FaRoyrI=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "c83e531b908c1fe71a95830bbad6db8a1e5b5b6b", + "rev": "3ad9c1eae733e9ba5cc73c6833e3d62dbc12df9e", "type": "github" }, "original": { @@ -760,11 +699,11 @@ ] }, "locked": { - "lastModified": 1711763326, - "narHash": "sha256-sXcesZWKXFlEQ8oyGHnfk4xc9f2Ip0X/+YZOq3sKviI=", + "lastModified": 1713543876, + "narHash": "sha256-olEWxacm1xZhAtpq+ZkEyQgR4zgfE7ddpNtZNvubi3g=", "owner": "lnl7", "repo": "nix-darwin", - "rev": "36524adc31566655f2f4d55ad6b875fb5c1a4083", + "rev": "9e7c20ffd056e406ddd0276ee9d89f09c5e5f4ed", "type": "github" }, "original": { @@ -844,11 +783,11 @@ ] }, "locked": { - "lastModified": 1708597894, - "narHash": "sha256-KxpKOBDGPJ76k37vLukYHp/wd7U4DoUVIvy8atHfy/k=", + "lastModified": 1709985524, + "narHash": "sha256-29ZwMJBErP41ZPis1MskhdheDRgt+reDuf53jONSkc8=", "owner": "nixpak", "repo": "nixpak", - "rev": "535dd408c4b19f407bc22e42eb32ccb9256e5865", + "rev": "b0862a125da8fe5d179633d6cc7aed57d5316871", "type": "github" }, "original": { @@ -875,11 +814,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1712450863, - "narHash": "sha256-K6IkdtMtq9xktmYPj0uaYc8NsIqHuaAoRBaMgu9Fvrw=", + "lastModified": 1713055793, + "narHash": "sha256-vIrZQykYW32RnlI2lT/gCcB59BOIqqrAmPirBdiirrc=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "3c62b6a12571c9a7f65ab037173ee153d539905f", + "rev": "361d8a4f443bbfab20bd6d222f9022b8c6665906", "type": "github" }, "original": { @@ -914,11 +853,11 @@ "nixpkgs": "nixpkgs_5" }, "locked": { - "lastModified": 1712942143, - "narHash": "sha256-pTpvq5EXPD9noOBkmTEa7mkwMpeda8+8u3anmjxhRAI=", + "lastModified": 1713691001, + "narHash": "sha256-yq3AR19+XQoBhN+nY+VEfuCEnllexcnjtuFxx7Q92lY=", "owner": "nix-community", "repo": "nixpkgs-wayland", - "rev": "8ed6e0db00db83e5a598afa6cdf32c9b41f083bd", + "rev": "04fd0059bcf112c76ed7e69837b5dc19bc212f14", "type": "github" }, "original": { @@ -929,11 +868,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1712849433, - "narHash": "sha256-flQtf/ZPJgkLY/So3Fd+dGilw2DKIsiwgMEn7BbBHL0=", + "lastModified": 1713596654, + "narHash": "sha256-LJbHQQ5aX1LVth2ST+Kkse/DRzgxlVhTL1rxthvyhZc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f173d0881eff3b21ebb29a2ef8bedbc106c86ea5", + "rev": "fd16bb6d3bcca96039b11aa52038fafeb6e4f4be", "type": "github" }, "original": { @@ -945,11 +884,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1712791164, - "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", + "lastModified": 1713537308, + "narHash": "sha256-XtTSSIB2DA6tOv+l0FhvfDMiyCmhoRbNB+0SeInZkbk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", + "rev": "5c24cf2f0a12ad855f444c30b2421d044120c66f", "type": "github" }, "original": { @@ -977,11 +916,11 @@ }, "nixpkgs_5": { "locked": { - "lastModified": 1712791164, - "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", + "lastModified": 1713537308, + "narHash": "sha256-XtTSSIB2DA6tOv+l0FhvfDMiyCmhoRbNB+0SeInZkbk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", + "rev": "5c24cf2f0a12ad855f444c30b2421d044120c66f", "type": "github" }, "original": { @@ -993,11 +932,11 @@ }, "nixpkgs_6": { "locked": { - "lastModified": 1712439257, - "narHash": "sha256-aSpiNepFOMk9932HOax0XwNxbA38GOUVOiXfUVPOrck=", + "lastModified": 1693158576, + "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ff0dbd94265ac470dda06a657d5fe49de93b4599", + "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780", "type": "github" }, "original": { @@ -1020,11 +959,11 @@ "pre-commit-hooks": "pre-commit-hooks" }, "locked": { - "lastModified": 1713008785, - "narHash": "sha256-fblaj6/83OQYrD1UHBjLapxjGQaC4edouX4g2X8CVhk=", + "lastModified": 1713652174, + "narHash": "sha256-/eCtK6kZIMpOx3qXWP9SJC3BZ8Cb0hth5xftb9Qw0L0=", "owner": "nix-community", "repo": "nixvim", - "rev": "21c233919d747d3375e3a173b65f7f26ccf01256", + "rev": "9a24838aac6b55a865dd30f1b5885ac4f62c78e1", "type": "github" }, "original": { @@ -1035,11 +974,11 @@ }, "nur": { "locked": { - "lastModified": 1712918680, - "narHash": "sha256-luYW6W6PQ491E/fIaHwVNhjpgoEZYjyiotWr7p+mtTY=", + "lastModified": 1713692778, + "narHash": "sha256-F5rAsavZtY2epAl4DAz2KmYWii4gQ39uB8sqrLSWuO8=", "owner": "nix-community", "repo": "NUR", - "rev": "67d041f54e20ba1abf70069400e6637a3655b9b5", + "rev": "5edf97f8cb76f16b6d7f3a53cfac7d2e3f40c510", "type": "github" }, "original": { @@ -1094,11 +1033,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1712818880, - "narHash": "sha256-VDxsvgj/bNypHq48tQWtc3VRbWvzlFjzKf9ZZIVO10Y=", + "lastModified": 1713628977, + "narHash": "sha256-iN5QUlUq527lswmBC+RopfXdu6Xx7mmTaBSH2l59FtM=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "657b33b0cb9bd49085202e91ad5b4676532c9140", + "rev": "55d9a533b309119c8acd13061581b43ae8840823", "type": "github" }, "original": { @@ -1117,14 +1056,15 @@ "nixpkgs": [ "nixpkgs" ], - "searx-randomizer": "searx-randomizer" + "searx-randomizer": "searx-randomizer", + "systems": "systems_6" }, "locked": { - "lastModified": 1710502118, - "narHash": "sha256-kPzvCwGVuLlPDVRD35dMnudWPpEzRXfU/9DHsG12PaY=", + "lastModified": 1713551575, + "narHash": "sha256-6XVKzjdTgPreYApjWMBEWr8ew6IaM1dLDsJNNEdeOFs=", "owner": "schizofox", "repo": "schizofox", - "rev": "8dde2033a6f448c48a48d4d0aeb22bf2da840b7d", + "rev": "6e006ab97adcf1492d9080793d7abc787eb5f738", "type": "github" }, "original": { @@ -1162,11 +1102,11 @@ "nix-filter": "nix-filter" }, "locked": { - "lastModified": 1712527107, - "narHash": "sha256-stmJqifOWf8oXxKwHvCo3RaVapXSk1n/+Sf9nKNENEA=", + "lastModified": 1713693088, + "narHash": "sha256-42x8C984A46FHybQh6+RTbfUDuOz0iTa+HaAUNLA06U=", "owner": "Duckonaut", "repo": "split-monitor-workspaces", - "rev": "c5696000777f6586aaa255bd0a9b0627d5da911f", + "rev": "65d4cb11a27f8c0e6aa976e5d1c17d9086469938", "type": "github" }, "original": { @@ -1265,6 +1205,21 @@ "type": "github" } }, + "systems_7": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -1290,18 +1245,20 @@ "wlroots": { "flake": false, "locked": { - "lastModified": 1712935342, - "narHash": "sha256-zzIbTFNFd/as42jyGx23fil2uBDYYv+8GA5JmRq5y9c=", - "owner": "hyprwm", - "repo": "wlroots-hyprland", - "rev": "62eeffbe233d199f520a5755c344e85f8eab7940", - "type": "github" + "host": "gitlab.freedesktop.org", + "lastModified": 1692976565, + "narHash": "sha256-eBKkG7tMxg92NskEn8dHRFY245JwjirWRoOZzW6DnUw=", + "owner": "wlroots", + "repo": "wlroots", + "rev": "717ded9bb0191ea31bf4368be32e7a15fe1b8294", + "type": "gitlab" }, "original": { - "owner": "hyprwm", - "repo": "wlroots-hyprland", - "rev": "62eeffbe233d199f520a5755c344e85f8eab7940", - "type": "github" + "host": "gitlab.freedesktop.org", + "owner": "wlroots", + "repo": "wlroots", + "rev": "717ded9bb0191ea31bf4368be32e7a15fe1b8294", + "type": "gitlab" } }, "xdph": { @@ -1311,11 +1268,6 @@ "hyprland", "hyprland-protocols" ], - "hyprlang": [ - "split-monitor-workspaces", - "hyprland", - "hyprlang" - ], "nixpkgs": [ "split-monitor-workspaces", "hyprland", @@ -1328,11 +1280,11 @@ ] }, "locked": { - "lastModified": 1709299639, - "narHash": "sha256-jYqJM5khksLIbqSxCLUUcqEgI+O2LdlSlcMEBs39CAU=", + "lastModified": 1691841170, + "narHash": "sha256-RCTm1/MVWYPnReMgyp7tr2ogGYo/pvw38jZaFwemgPU=", "owner": "hyprwm", "repo": "xdg-desktop-portal-hyprland", - "rev": "2d2fb547178ec025da643db57d40a971507b82fe", + "rev": "57a3a41ba6b358109e4fc25c6a4706b5f7d93c6b", "type": "github" }, "original": { From 9d83d95186251595fb857edd178d8f31c7070601 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 21 Apr 2024 22:04:36 +0200 Subject: [PATCH 30/50] Working Minecraft Setup --- hosts/lars/kronos/profile.nix | 2 +- hosts/lars/kronos/programs.nix | 49 ++++++--------------------- options/common/gpu/nvidia_wayland.nix | 1 + 3 files changed, 12 insertions(+), 40 deletions(-) diff --git a/hosts/lars/kronos/profile.nix b/hosts/lars/kronos/profile.nix index e567018..3e07756 100644 --- a/hosts/lars/kronos/profile.nix +++ b/hosts/lars/kronos/profile.nix @@ -3,7 +3,7 @@ _: { ../../../options/boot/grub-boot.nix ../../../options/desktop/fonts.nix ../../../options/common/networking.nix - ../../../options/common/gpu/nvidia.nix + ../../../options/common/gpu/nvidia_wayland.nix ../../../options/common/pin-registry.nix ../../../options/common/preserve-system.nix ../../../options/common/bluetooth.nix diff --git a/hosts/lars/kronos/programs.nix b/hosts/lars/kronos/programs.nix index 8877ef2..6fbaf64 100644 --- a/hosts/lars/kronos/programs.nix +++ b/hosts/lars/kronos/programs.nix @@ -1,41 +1,12 @@ -{ config, inputs, pkgs, lib, ... }: +{ config, lib, pkgs, ... }: + let - username = config.modules.other.system.username; - - # Fetch the GLFW with Wayland patches for Minecraft - customGLFW = let - mcWaylandPatchRepo = pkgs.fetchFromGitHub { - owner = "Admicos"; - repo = "minecraft-wayland"; - rev = "370ce5b95e3ae9bc4618fb45113bc641fbb13867"; - sha256 = "sha256-RPRg6Gd7N8yyb305V607NTC1kUzvyKiWsh6QlfHW+JE="; - }; - mcWaylandPatches = map (name: "${mcWaylandPatchRepo}/${name}") - (lib.naturalSort (builtins.attrNames (lib.filterAttrs - (name: type: - type == "regular" && lib.hasSuffix ".patch" name) - (builtins.readDir mcWaylandPatchRepo)))); - in pkgs.glfw.overrideAttrs (previousAttrs: { - patches = previousAttrs.patches ++ mcWaylandPatches; - buildInputs = previousAttrs.buildInputs ++ [ pkgs.wayland ]; - }); - - # Minecraft launcher with the custom GLFW - minecraftPrismLauncher = pkgs.prismlauncher.override { - glfw = customGLFW; - }; - -in { - home-manager.users.${username} = { - home.packages = let - fenix = inputs.fenix.packages.${pkgs.system}; - - in with pkgs; [ - ]; - }; - - # System-wide installation of Minecraft PrismLauncher - environment.systemPackages = [ - minecraftPrismLauncher - ]; + +in +{ + environment.systemPackages = with pkgs; [ + prismlauncher + glfw-wayland-minecraft # Use these parameters in the prism launcher: -Dfml.earlyprogresswindow=false -Dorg.lwjgl.glfw.libname=/nix/store/ypkdx5844pp1vdw2z2nmnf2nb9kgl0mp-glfw-wayland-minecraft-unstable-2023-06-01/lib/libglfw.so + mmex + ]; } diff --git a/options/common/gpu/nvidia_wayland.nix b/options/common/gpu/nvidia_wayland.nix index 2dcd218..e4856fb 100644 --- a/options/common/gpu/nvidia_wayland.nix +++ b/options/common/gpu/nvidia_wayland.nix @@ -6,6 +6,7 @@ WLR_NO_HARDWARE_CURSORS = "1"; LIBVA_DRIVER_NAME = "nvidia"; __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + __GL_THREADED_OPTIMIZATIONS=0; }; environment.systemPackages = with pkgs; [ vulkan-loader From 05214e6caee7395c7e1c33efd03a32762a3081b9 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 21 Apr 2024 22:04:54 +0200 Subject: [PATCH 31/50] Some xwayland explicit sync tries --- hosts/lars/default.nix | 1 + hosts/lars/xwayland.nix | 53 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 hosts/lars/xwayland.nix diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 38b0b60..0656fd0 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -3,6 +3,7 @@ imports = [ ./hyprland.nix ./programs.nix + # ./xwayland.nix ]; nixpkgs.config.allowUnfree = true; diff --git a/hosts/lars/xwayland.nix b/hosts/lars/xwayland.nix new file mode 100644 index 0000000..847aafd --- /dev/null +++ b/hosts/lars/xwayland.nix @@ -0,0 +1,53 @@ +{ inputs, outputs, lib, pkgs, pkg-config, ... }: + +let +newer_xwayland = self: super: { + xwayland = super.xwayland.overrideAttrs (prev: { + version = "23.2.6-HEAD"; + src = pkgs.fetchFromGitLab { + domain = "gitlab.freedesktop.org"; + owner = "xorg"; + repo = "xserver"; + rev = "43f47e8e6597f06cf2082514c10a71965fa6d3c8"; + sha256 = "93DzgA8nXVodDvllCOIuTtOYWpUdXwzPIGpi2SUSNqo="; + + }; + mesonFlags = [ + # (lib.mesonBool "xwayland_eglstream" true) + (lib.mesonBool "xcsecurity" true) + # (lib.mesonOption "default_font_path" defaultFontPath) + # (lib.mesonOption "xkb_bin_dir" "${xkbcomp}/bin") + # (lib.mesonOption "xkb_dir" "${xkeyboard_config}/etc/X11/xkb") + # (lib.mesonOption "xkb_output_dir" "${placeholder "out"}/share/X11/xkb/compiled") + # (lib.mesonBool "libunwind" withLibunwind) + ]; + }); +}; + +newer_xorgproto = self: super: { + xorg.xorgproto = super.xorg.xorgproto.overrideAttrs (prev: { + pname = "xorgproto"; + version = "2023.2"; + builder = ./builder.sh; + src = pkgs.fetchurl { + url = "mirror://xorg/individual/proto/xorgproto-2023.2.tar.xz"; + sha256 = "0b4c27aq25w1fccks49p020avf9jzh75kaq5qwnww51bp1yvq7xn"; + }; + hardeningDisable = [ "bindnow" "relro" ]; + strictDeps = true; + nativeBuildInputs = [ pkg-config pkgs.python3 ]; + buildInputs = [ pkgs.libXt ]; + # passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + meta = { + pkgConfigModules = [ "applewmproto" "bigreqsproto" "compositeproto" "damageproto" "dmxproto" "dpmsproto" "dri2proto" "dri3proto" "evieproto" "fixesproto" "fontcacheproto" "fontsproto" "glproto" "inputproto" "kbproto" "lg3dproto" "presentproto" "printproto" "randrproto" "recordproto" "renderproto" "resourceproto" "scrnsaverproto" "trapproto" "videoproto" "windowswmproto" "xcalibrateproto" "xcmiscproto" "xextproto" "xf86bigfontproto" "xf86dgaproto" "xf86driproto" "xf86miscproto" "xf86rushproto" "xf86vidmodeproto" "xineramaproto" "xproto" "xproxymngproto" "xwaylandproto" ]; + platforms = lib.platforms.unix; + }; + }); +}; +in +{ + nixpkgs.overlays = [ + newer_xwayland + newer_xorgproto + ]; +} From 866e41130c5ffabecdef759803e7310391682a3c Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Mon, 22 Apr 2024 10:25:11 +0200 Subject: [PATCH 32/50] Added feh to program list --- hosts/lars/programs.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index 2d52b7f..ed78f81 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -64,6 +64,7 @@ in { yubioath-flutter fzf tldr + feh ]; }; } From dc8c17cb8bf886e6c7c9c4bcf81a20998ced44b0 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Mon, 22 Apr 2024 12:50:48 +0200 Subject: [PATCH 33/50] Yubico Keys added again --- hosts/lars/default.nix | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 73782fa..404aeae 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -120,6 +120,14 @@ # services.flatpak.enable = true; services = { twingate.enable = true; + pcscd.enable = true; + }; + + security.pam.yubico = { + enable = true; + debug = true; + mode = "challenge-response"; + id = [ "28067815" "28067816" ]; }; # SSH AGENT From b7ba981b19076827463aeed61c331e23466f49c9 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Mon, 22 Apr 2024 12:51:00 +0200 Subject: [PATCH 34/50] MMEX switched to flatpak --- hosts/lars/kronos/configuration.nix | 1 + hosts/lars/kronos/programs.nix | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/lars/kronos/configuration.nix b/hosts/lars/kronos/configuration.nix index 01cc83c..cd91bec 100644 --- a/hosts/lars/kronos/configuration.nix +++ b/hosts/lars/kronos/configuration.nix @@ -37,4 +37,5 @@ }; services.getty.autologinUser = "lars"; + services.flatpak.enable = true; } diff --git a/hosts/lars/kronos/programs.nix b/hosts/lars/kronos/programs.nix index 6fbaf64..ad01a4d 100644 --- a/hosts/lars/kronos/programs.nix +++ b/hosts/lars/kronos/programs.nix @@ -7,6 +7,5 @@ in environment.systemPackages = with pkgs; [ prismlauncher glfw-wayland-minecraft # Use these parameters in the prism launcher: -Dfml.earlyprogresswindow=false -Dorg.lwjgl.glfw.libname=/nix/store/ypkdx5844pp1vdw2z2nmnf2nb9kgl0mp-glfw-wayland-minecraft-unstable-2023-06-01/lib/libglfw.so - mmex ]; } From ddd5455a6a0a51484d3f66833322f925c85d22ee Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Mon, 22 Apr 2024 13:47:17 +0200 Subject: [PATCH 35/50] Removed debug from yubikey --- hosts/lars/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index 404aeae..fc0fb51 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -125,7 +125,7 @@ security.pam.yubico = { enable = true; - debug = true; + debug = false; mode = "challenge-response"; id = [ "28067815" "28067816" ]; }; From 46a14640c7eef9802ea72c559ea79e3da10a3ddd Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Mon, 22 Apr 2024 21:43:37 +0200 Subject: [PATCH 36/50] Minecraft config --- hosts/lars/kronos/configuration.nix | 5 +++++ hosts/lars/kronos/programs.nix | 5 ----- modules/gui/default.nix | 1 + modules/gui/minecraft.nix | 28 +++++++++++++++++++++++++++ options/common/gpu/nvidia_wayland.nix | 1 - 5 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 modules/gui/minecraft.nix diff --git a/hosts/lars/kronos/configuration.nix b/hosts/lars/kronos/configuration.nix index cd91bec..40e90e7 100644 --- a/hosts/lars/kronos/configuration.nix +++ b/hosts/lars/kronos/configuration.nix @@ -18,6 +18,11 @@ enable = true; gamescope = true; }; + + minecraft = { + enable = true; + wayland = true; + }; }; hyprland = { diff --git a/hosts/lars/kronos/programs.nix b/hosts/lars/kronos/programs.nix index ad01a4d..3341de5 100644 --- a/hosts/lars/kronos/programs.nix +++ b/hosts/lars/kronos/programs.nix @@ -1,11 +1,6 @@ { config, lib, pkgs, ... }: -let - -in { environment.systemPackages = with pkgs; [ - prismlauncher - glfw-wayland-minecraft # Use these parameters in the prism launcher: -Dfml.earlyprogresswindow=false -Dorg.lwjgl.glfw.libname=/nix/store/ypkdx5844pp1vdw2z2nmnf2nb9kgl0mp-glfw-wayland-minecraft-unstable-2023-06-01/lib/libglfw.so ]; } diff --git a/modules/gui/default.nix b/modules/gui/default.nix index ff880a6..9d5dc81 100644 --- a/modules/gui/default.nix +++ b/modules/gui/default.nix @@ -15,5 +15,6 @@ _: { ./alacritty.nix ./firefox.nix ./steam.nix + ./minecraft.nix ]; } diff --git a/modules/gui/minecraft.nix b/modules/gui/minecraft.nix new file mode 100644 index 0000000..72c4aa7 --- /dev/null +++ b/modules/gui/minecraft.nix @@ -0,0 +1,28 @@ +{ config, lib, inputs, pkgs, ... }: +with lib; let + username = config.modules.other.system.username; + cfg = config.modules.programs.minecraft; +in { + options.modules.programs.minecraft = { + enable = mkEnableOption "minecraft"; + wayland = mkEnableOption "wayland"; + }; + + config = mkIf cfg.enable { + # Set wayland environment flag + environment.variables = mkIf cfg.wayland { + __GL_THREADED_OPTIMIZATIONS=0; + }; + # Install glfw-wayland-minecraft + environment.systemPackages = with pkgs; mkIf cfg.wayland [ + glfw-wayland-minecraft # Use these parameters in the prism launcher: -Dfml.earlyprogresswindow=false -Dorg.lwjgl.glfw.libname=/nix/store/ypkdx5844pp1vdw2z2nmnf2nb9kgl0mp-glfw-wayland-minecraft-unstable-2023-06-01/lib/libglfw.so + ]; + + home-manager.users.${username} = { + # Install minecraft + home.packages = with pkgs; [ + prismlauncher + ]; + }; + }; +} diff --git a/options/common/gpu/nvidia_wayland.nix b/options/common/gpu/nvidia_wayland.nix index e4856fb..2dcd218 100644 --- a/options/common/gpu/nvidia_wayland.nix +++ b/options/common/gpu/nvidia_wayland.nix @@ -6,7 +6,6 @@ WLR_NO_HARDWARE_CURSORS = "1"; LIBVA_DRIVER_NAME = "nvidia"; __GLX_VENDOR_LIBRARY_NAME = "nvidia"; - __GL_THREADED_OPTIMIZATIONS=0; }; environment.systemPackages = with pkgs; [ vulkan-loader From 11ab11d59ef4b2b1616943b980bb90e972d7be72 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Tue, 23 Apr 2024 10:59:57 +0200 Subject: [PATCH 37/50] fixed fonts, added newsboat --- hosts/vali/mars/configuration.nix | 19 +- hosts/vali/mars/dwm/default.nix | 0 hosts/vali/mars/dwm/dmenu-5.3/config.h | 2 +- hosts/vali/mars/dwm/dmenu-5.3/dmenu | Bin 42560 -> 42560 bytes hosts/vali/mars/dwm/dmenu-5.3/dmenu.o | Bin 32384 -> 32384 bytes hosts/vali/mars/dwm/dwm-6.5/config.def.h | 7 + hosts/vali/mars/dwm/dwm-6.5/config.h | 36 +- hosts/vali/mars/dwm/dwm-6.5/dwm | Bin 62656 -> 62920 bytes .../dwm-multiple-dynamic-scratchpads.diff | 207 ++ .../dwm-scratchpad-20240321-061e9fe.diff | 105 + hosts/vali/mars/dwm/dwm-6.5/dwm.c | 150 +- hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig | 2207 +++++++++++++++++ hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej | 23 + hosts/vali/mars/dwm/dwm-6.5/dwm.o | Bin 57904 -> 59856 bytes hosts/vali/mars/dwm/dwm.nix | 13 +- hosts/vali/mars/dwm/eww/eww.scss | 0 hosts/vali/mars/dwm/eww/eww.yuck | 0 hosts/vali/mars/programs.nix | 4 +- modules/gui/default.nix | 1 + modules/gui/kitty.nix | 78 + modules/tui/default.nix | 2 +- modules/tui/newsboat.nix | 73 + options/desktop/fonts.nix | 2 +- 23 files changed, 2892 insertions(+), 37 deletions(-) delete mode 100644 hosts/vali/mars/dwm/default.nix create mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm-multiple-dynamic-scratchpads.diff create mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff create mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig create mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej delete mode 100644 hosts/vali/mars/dwm/eww/eww.scss delete mode 100644 hosts/vali/mars/dwm/eww/eww.yuck create mode 100644 modules/gui/kitty.nix create mode 100644 modules/tui/newsboat.nix diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index 5bea2c4..0031be2 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -1,4 +1,4 @@ -{ config, inputs, pkgs, ... }: +{ config, inputs, pkgs, lib, ... }: { nixpkgs.config.allowUnfree = true; # Time Zone @@ -23,7 +23,6 @@ security.sudo.package = pkgs.sudo.override { withInsults = true; }; security.polkit.enable = true; programs.kdeconnect.enable = true; - services.picom.enable = true; services.mpd = { enable = true; musicDirectory = "/home/vali/Nextcloud/Media/Music/"; @@ -35,6 +34,12 @@ } ''; }; +/* options.ui.darkTheme = { + type = lib.types.bool; + default = true; + example = false; + description = "If ui programs should use a dark or light theme"; + };*/ modules = { other = { system = { @@ -49,10 +54,10 @@ }; programs = { vesktop.enable = true; - ncmpcpp.enable = true; ssh.enable = true; btop.enable = true; mpv.enable = true; + kitty.enable = true; dwm.enable = true; schizofox.enable = true; #git = { @@ -66,13 +71,6 @@ enable = true; profiling = false; }; - alacritty = { - enable = true; - catppuccin = true; - opacity = 0.8; - blur = true; - # Grüsse - }; }; services = { pipewire.enable = true; @@ -106,3 +104,4 @@ }; system.stateVersion = "23.11"; } + diff --git a/hosts/vali/mars/dwm/default.nix b/hosts/vali/mars/dwm/default.nix deleted file mode 100644 index e69de29..0000000 diff --git a/hosts/vali/mars/dwm/dmenu-5.3/config.h b/hosts/vali/mars/dwm/dmenu-5.3/config.h index 687b07c..1edb647 100644 --- a/hosts/vali/mars/dwm/dmenu-5.3/config.h +++ b/hosts/vali/mars/dwm/dmenu-5.3/config.h @@ -4,7 +4,7 @@ static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ /* -fn option overrides fonts[0]; default X11 font or font set */ static const char *fonts[] = { - "monospace:size=18" + "monospace:size=10" }; static const char *prompt = NULL; /* -p option; prompt to the left of input field */ static const char *colors[SchemeLast][2] = { diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu b/hosts/vali/mars/dwm/dmenu-5.3/dmenu index e47d6461d622e7c3e46a853b9c513ee498f9f3f6..8906fbffc1fddc3401e9a2b3ca90ab0537e36dad 100755 GIT binary patch delta 15 WcmX?bhUvf=rVaKl3V~du?8>z diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu.o b/hosts/vali/mars/dwm/dmenu-5.3/dmenu.o index 693870d44626714aca6da283a423c9b815a3c06b..75e7e0be9078e3e3c70141fc419ae6da5255619b 100644 GIT binary patch delta 16 XcmZqp%h>RjaYGG1qrv7{e&&1tJV*u_ delta 16 XcmZqp%h>RjaYGG1qs8W0e&&1tJa`5o diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.def.h b/hosts/vali/mars/dwm/dwm-6.5/config.def.h index 9efa774..aabd622 100644 --- a/hosts/vali/mars/dwm/dwm-6.5/config.def.h +++ b/hosts/vali/mars/dwm/dwm-6.5/config.def.h @@ -95,6 +95,13 @@ static const Key keys[] = { TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY, XK_s, scratchpad_show, {.i = 1} }, + { MODKEY, XK_y, scratchpad_show, {.i = 2} }, + { MODKEY, XK_u, scratchpad_show, {.i = 3} }, + { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.i = 1} }, + { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} }, + { MODKEY|ShiftMask, XK_u, scratchpad_hide, {.i = 3} }, + { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} }, }; /* button definitions */ diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.h b/hosts/vali/mars/dwm/dwm-6.5/config.h index 647ebed..1e4f2b6 100644 --- a/hosts/vali/mars/dwm/dwm-6.5/config.h +++ b/hosts/vali/mars/dwm/dwm-6.5/config.h @@ -1,21 +1,22 @@ -/* See LICENSE file for copyright and license details. */ + /* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int borderpx = 4; /* border pixel of windows */ static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ +static const int showbar = 0; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "monospace:size=10" }; static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; +static const char col_gray1[] = "#282828"; +static const char col_gray2[] = "#98971a"; static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; +static const char col_gray4[] = "#928374"; +static const char col_cyan[] = "#BD93BD"; +static const char col_sel[] = "#d79921"; static const char *colors[][3] = { /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeNorm] = { col_gray2, col_gray1, col_gray4 }, + [SchemeSel] = { col_gray2, col_gray1, col_sel }, }; /* tagging */ @@ -57,14 +58,18 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *dmenucmd[] = { "rofi", "-show", "drun", NULL }; static const char *termcmd[] = { "kitty", NULL }; +static const char *browsercmd[] = { "tor-browser", NULL }; +static const char *filebrowsercmd[] = { "pcmanfm", NULL }; +static const char *spkeepassxc[] = { "keepassxc", NULL }; static const Key keys[] = { - /* modifier key function argument */ +/* modifier key function argument */ { MODKEY, XK_d, spawn, {.v = dmenucmd } }, { MODKEY, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_b, spawn, {.v = browsercmd } }, + { MODKEY, XK_e, spawn, {.v = filebrowsercmd } }, { MODKEY, XK_j, focusstack, {.i = +1 } }, { MODKEY, XK_k, focusstack, {.i = -1 } }, { MODKEY, XK_i, incnmaster, {.i = +1 } }, @@ -85,6 +90,13 @@ static const Key keys[] = { { MODKEY, XK_space, togglefullscr, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_s, scratchpad_show, {.i = 1} }, + { MODKEY, XK_y, scratchpad_show, {.i = 2} }, + { MODKEY, XK_p, scratchpad_show, {.i = 3} }, + { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.i = 1} }, + { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} }, + { MODKEY|ShiftMask, XK_p, scratchpad_hide, {.i = 3} }, + { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm b/hosts/vali/mars/dwm/dwm-6.5/dwm index 3952e1f89fa70658d5e11aaa2c07e62b069d2c1a..382a15dc453a6090162ab2d5a8141dd99db6729d 100755 GIT binary patch delta 19772 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 Xt`m15x+?i6Cw(zva(p{^))zGZ7RCQw delta 18326 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 diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm-multiple-dynamic-scratchpads.diff b/hosts/vali/mars/dwm/dwm-6.5/dwm-multiple-dynamic-scratchpads.diff new file mode 100644 index 0000000..22d0000 --- /dev/null +++ b/hosts/vali/mars/dwm/dwm-6.5/dwm-multiple-dynamic-scratchpads.diff @@ -0,0 +1,207 @@ +diff --git a/config.def.h b/config.def.h +index a2ac963..1c82453 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -95,6 +95,13 @@ static Key keys[] = { + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, ++ { MODKEY, XK_s, scratchpad_show, {.i = 1} }, ++ { MODKEY, XK_y, scratchpad_show, {.i = 2} }, ++ { MODKEY, XK_u, scratchpad_show, {.i = 3} }, ++ { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.i = 1} }, ++ { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} }, ++ { MODKEY|ShiftMask, XK_u, scratchpad_hide, {.i = 3} }, ++ { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} }, + }; + + /* button definitions */ +diff --git a/dwm.c b/dwm.c +index 5f16260..202038f 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -195,6 +195,11 @@ static void resizemouse(const Arg *arg); + static void restack(Monitor *m); + static void run(void); + static void scan(void); ++static void scratchpad_hide(); ++static void scratchpad_remove(); ++static void scratchpad_show(); ++static void scratchpad_show_client(Client *c); ++static void scratchpad_show_first(int scratchNum); + static int sendevent(Client *c, Atom proto); + static void sendmon(Client *c, Monitor *m); + static void setclientstate(Client *c, long state); +@@ -269,11 +274,19 @@ static Drw *drw; + static Monitor *mons, *selmon; + static Window root, wmcheckwin; + ++/* scratchpad */ ++#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) ++#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) ++#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) ++static int scratchpad_hide_flag = 0; ++static Client *scratchpad_last_showed_1 = NULL; ++static Client *scratchpad_last_showed_2 = NULL; ++static Client *scratchpad_last_showed_3 = NULL; + /* configuration, allows nested code to access above variables */ + #include "config.h" + + /* compile-time check if all tags fit into an unsigned int bit array. */ +-struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; ++struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; + + /* function implementations */ + void +@@ -309,7 +322,9 @@ applyrules(Client *c) + XFree(ch.res_class); + if (ch.res_name) + XFree(ch.res_name); ++ if(c->tags != SCRATCHPAD_MASK_1 && c->tags != SCRATCHPAD_MASK_2 && c->tags != SCRATCHPAD_MASK_3) { + c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; ++ } + } + + int +@@ -1412,6 +1427,124 @@ scan(void) + } + } + ++static void scratchpad_hide(const Arg *arg) { ++ if(scratchpad_hide_flag < 4) { ++ if(arg->i == 1) { ++ if(selmon->sel) { ++ selmon->sel->tags = SCRATCHPAD_MASK_1; ++ selmon->sel->isfloating = 1; ++ focus(NULL); ++ arrange(selmon); ++ scratchpad_hide_flag++; ++ } ++ } ++ else if(arg->i == 2) { ++ if(selmon->sel) { ++ selmon->sel->tags = SCRATCHPAD_MASK_2; ++ selmon->sel->isfloating = 1; ++ focus(NULL); ++ arrange(selmon); ++ scratchpad_hide_flag++; ++ } ++ } ++ else if(arg->i == 3) { ++ if(selmon->sel) { ++ selmon->sel->tags = SCRATCHPAD_MASK_3; ++ selmon->sel->isfloating = 1; ++ focus(NULL); ++ arrange(selmon); ++ scratchpad_hide_flag++; ++ } ++ } ++ } ++} ++ ++static void scratchpad_remove() { ++ if(selmon->sel && (scratchpad_last_showed_1 != NULL || scratchpad_last_showed_2 != NULL ||scratchpad_last_showed_3 != NULL) && (selmon->sel == scratchpad_last_showed_1 || selmon->sel == scratchpad_last_showed_2 || selmon->sel == scratchpad_last_showed_3)) { ++ if(scratchpad_last_showed_1 == selmon->sel) { ++ scratchpad_last_showed_1 = NULL; ++ scratchpad_hide_flag--; ++ } ++ else if(scratchpad_last_showed_2 == selmon->sel) { ++ scratchpad_last_showed_2 = NULL; ++ scratchpad_hide_flag--; ++ } ++ else if(scratchpad_last_showed_3 == selmon->sel) { ++ scratchpad_last_showed_3 = NULL; ++ scratchpad_hide_flag--; ++ } ++ } ++} ++ ++static void scratchpad_show(const Arg *arg) { ++ if(arg->i == 1) { ++ if(scratchpad_last_showed_1 == NULL) { ++ scratchpad_show_first(arg->i); ++ } ++ else { ++ if(scratchpad_last_showed_1->tags != SCRATCHPAD_MASK_1) { ++ scratchpad_last_showed_1->tags = SCRATCHPAD_MASK_1; ++ focus(NULL); ++ arrange(selmon); ++ } ++ else { ++ scratchpad_show_first(arg->i); ++ } ++ } ++ } ++ else if(arg->i == 2) { ++ if(scratchpad_last_showed_2 == NULL) { ++ scratchpad_show_first(arg->i); ++ } ++ else { ++ if(scratchpad_last_showed_2->tags != SCRATCHPAD_MASK_2) { ++ scratchpad_last_showed_2->tags = SCRATCHPAD_MASK_2; ++ focus(NULL); ++ arrange(selmon); ++ } ++ else { ++ scratchpad_show_first(arg->i); ++ } ++ } ++ } ++ else if(arg->i == 3) { ++ if(scratchpad_last_showed_3 == NULL) { ++ scratchpad_show_first(arg->i); ++ } ++ else { ++ if(scratchpad_last_showed_3->tags != SCRATCHPAD_MASK_3) { ++ scratchpad_last_showed_3->tags = SCRATCHPAD_MASK_3; ++ focus(NULL); ++ arrange(selmon); ++ } ++ else { ++ scratchpad_show_first(arg->i); ++ } ++ } ++ } ++} ++ ++static void scratchpad_show_client(Client *c) { ++ c->tags = selmon->tagset[selmon->seltags]; ++ focus(c); ++ arrange(selmon); ++} ++ ++static void scratchpad_show_first(int scratchNum) { ++ for(Client *c = selmon->clients; c !=NULL; c = c->next) { ++ if(c->tags == SCRATCHPAD_MASK_1 && scratchNum == 1) { ++ scratchpad_last_showed_1 = c; ++ scratchpad_show_client(c); ++ } else if(c->tags == SCRATCHPAD_MASK_2 && scratchNum == 2) { ++ scratchpad_last_showed_2 = c; ++ scratchpad_show_client(c); ++ } else if(c->tags == SCRATCHPAD_MASK_3 && scratchNum == 3) { ++ scratchpad_last_showed_3 = c; ++ scratchpad_show_client(c); ++ } ++ } ++} ++ + void + sendmon(Client *c, Monitor *m) + { +@@ -1785,6 +1918,16 @@ unmanage(Client *c, int destroyed) + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } ++ if(scratchpad_last_showed_1 == c) { ++ scratchpad_last_showed_1 = NULL; ++ } ++ if(scratchpad_last_showed_2 == c) { ++ scratchpad_last_showed_2 = NULL; ++ } ++ if(scratchpad_last_showed_3 == c) { ++ scratchpad_last_showed_3 = NULL; ++ } ++ + free(c); + focus(NULL); + updateclientlist(); diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff b/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff new file mode 100644 index 0000000..cb218b6 --- /dev/null +++ b/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff @@ -0,0 +1,105 @@ +From b9f3c11c3150f0b5d5b297a4eeeb2012764c98f5 Mon Sep 17 00:00:00 2001 +From: visil +Date: Thu, 21 Mar 2024 15:16:39 +0300 +Subject: [PATCH] Patch updated to 6.5 + +--- + config.def.h | 3 +++ + dwm.c | 34 ++++++++++++++++++++++++++++++++++ + 2 files changed, 37 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 9efa774..0b8b310 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -59,11 +59,14 @@ static const Layout layouts[] = { + static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ + static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; + static const char *termcmd[] = { "st", NULL }; ++static const char scratchpadname[] = "scratchpad"; ++static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL }; + + static const Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, ++ { MODKEY, XK_grave, togglescratch, {.v = scratchpadcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, +diff --git a/dwm.c b/dwm.c +index f1d86b2..a8db21a 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -211,6 +211,7 @@ static void tagmon(const Arg *arg); + static void tile(Monitor *m); + static void togglebar(const Arg *arg); + static void togglefloating(const Arg *arg); ++static void togglescratch(const Arg *arg); + static void toggletag(const Arg *arg); + static void toggleview(const Arg *arg); + static void unfocus(Client *c, int setfocus); +@@ -271,6 +272,8 @@ static Window root, wmcheckwin; + /* configuration, allows nested code to access above variables */ + #include "config.h" + ++static unsigned int scratchtag = 1 << LENGTH(tags); ++ + /* compile-time check if all tags fit into an unsigned int bit array. */ + struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + +@@ -1061,6 +1064,14 @@ manage(Window w, XWindowAttributes *wa) + c->y = MAX(c->y, c->mon->wy); + c->bw = borderpx; + ++ selmon->tagset[selmon->seltags] &= ~scratchtag; ++ if (!strcmp(c->name, scratchpadname)) { ++ c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag; ++ c->isfloating = True; ++ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); ++ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); ++ } ++ + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); +@@ -1651,6 +1662,7 @@ spawn(const Arg *arg) + + if (arg->v == dmenucmd) + dmenumon[0] = '0' + selmon->num; ++ selmon->tagset[selmon->seltags] &= ~scratchtag; + if (fork() == 0) { + if (dpy) + close(ConnectionNumber(dpy)); +@@ -1735,6 +1747,28 @@ togglefloating(const Arg *arg) + arrange(selmon); + } + ++void ++togglescratch(const Arg *arg) ++{ ++ Client *c; ++ unsigned int found = 0; ++ ++ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); ++ if (found) { ++ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; ++ if (newtagset) { ++ selmon->tagset[selmon->seltags] = newtagset; ++ focus(NULL); ++ arrange(selmon); ++ } ++ if (ISVISIBLE(c)) { ++ focus(c); ++ restack(selmon); ++ } ++ } else ++ spawn(arg); ++} ++ + void + toggletag(const Arg *arg) + { +-- +2.44.0 + diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c b/hosts/vali/mars/dwm/dwm-6.5/dwm.c index e940130..f7e94b6 100644 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.c +++ b/hosts/vali/mars/dwm/dwm-6.5/dwm.c @@ -195,6 +195,11 @@ static void resizemouse(const Arg *arg); static void restack(Monitor *m); static void run(void); static void scan(void); +static void scratchpad_hide(); +static void scratchpad_remove(); +static void scratchpad_show(); +static void scratchpad_show_client(Client *c); +static void scratchpad_show_first(int scratchNum); static int sendevent(Client *c, Atom proto); static void sendmon(Client *c, Monitor *m); static void setclientstate(Client *c, long state); @@ -269,11 +274,20 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; +/* scratchpad */ +#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) +#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) +#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) +static int scratchpad_hide_flag = 0; +static Client *scratchpad_last_showed_1 = NULL; +static Client *scratchpad_last_showed_2 = NULL; +static Client *scratchpad_last_showed_3 = NULL; + /* configuration, allows nested code to access above variables */ #include "config.h" /* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; +struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; /* function implementations */ void @@ -309,7 +323,9 @@ applyrules(Client *c) XFree(ch.res_class); if (ch.res_name) XFree(ch.res_name); + if(c->tags != SCRATCHPAD_MASK_1 && c->tags != SCRATCHPAD_MASK_2 && c->tags != SCRATCHPAD_MASK_3) { c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; + } } int @@ -1062,13 +1078,15 @@ manage(Window w, XWindowAttributes *wa) c->y = MAX(c->y, c->mon->wy); c->bw = borderpx; - wc.border_width = c->bw; + wc.border_width = c->bw; XConfigureWindow(dpy, w, CWBorderWidth, &wc); XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); configure(c); /* propagates border_width, if size doesn't change */ updatewindowtype(c); updatesizehints(c); updatewmhints(c); + c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; + c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); grabbuttons(c, 0); if (!c->isfloating) @@ -1418,6 +1436,124 @@ scan(void) } } +static void scratchpad_hide(const Arg *arg) { + if(scratchpad_hide_flag < 4) { + if(arg->i == 1) { + if(selmon->sel) { + selmon->sel->tags = SCRATCHPAD_MASK_1; + selmon->sel->isfloating = 1; + focus(NULL); + arrange(selmon); + scratchpad_hide_flag++; + } + } + else if(arg->i == 2) { + if(selmon->sel) { + selmon->sel->tags = SCRATCHPAD_MASK_2; + selmon->sel->isfloating = 1; + focus(NULL); + arrange(selmon); + scratchpad_hide_flag++; + } + } + else if(arg->i == 3) { + if(selmon->sel) { + selmon->sel->tags = SCRATCHPAD_MASK_3; + selmon->sel->isfloating = 1; + focus(NULL); + arrange(selmon); + scratchpad_hide_flag++; + } + } + } +} + +static void scratchpad_remove() { + if(selmon->sel && (scratchpad_last_showed_1 != NULL || scratchpad_last_showed_2 != NULL ||scratchpad_last_showed_3 != NULL) && (selmon->sel == scratchpad_last_showed_1 || selmon->sel == scratchpad_last_showed_2 || selmon->sel == scratchpad_last_showed_3)) { + if(scratchpad_last_showed_1 == selmon->sel) { + scratchpad_last_showed_1 = NULL; + scratchpad_hide_flag--; + } + else if(scratchpad_last_showed_2 == selmon->sel) { + scratchpad_last_showed_2 = NULL; + scratchpad_hide_flag--; + } + else if(scratchpad_last_showed_3 == selmon->sel) { + scratchpad_last_showed_3 = NULL; + scratchpad_hide_flag--; + } + } +} + +static void scratchpad_show(const Arg *arg) { + if(arg->i == 1) { + if(scratchpad_last_showed_1 == NULL) { + scratchpad_show_first(arg->i); + } + else { + if(scratchpad_last_showed_1->tags != SCRATCHPAD_MASK_1) { + scratchpad_last_showed_1->tags = SCRATCHPAD_MASK_1; + focus(NULL); + arrange(selmon); + } + else { + scratchpad_show_first(arg->i); + } + } + } + else if(arg->i == 2) { + if(scratchpad_last_showed_2 == NULL) { + scratchpad_show_first(arg->i); + } + else { + if(scratchpad_last_showed_2->tags != SCRATCHPAD_MASK_2) { + scratchpad_last_showed_2->tags = SCRATCHPAD_MASK_2; + focus(NULL); + arrange(selmon); + } + else { + scratchpad_show_first(arg->i); + } + } + } + else if(arg->i == 3) { + if(scratchpad_last_showed_3 == NULL) { + scratchpad_show_first(arg->i); + } + else { + if(scratchpad_last_showed_3->tags != SCRATCHPAD_MASK_3) { + scratchpad_last_showed_3->tags = SCRATCHPAD_MASK_3; + focus(NULL); + arrange(selmon); + } + else { + scratchpad_show_first(arg->i); + } + } + } +} + +static void scratchpad_show_client(Client *c) { + c->tags = selmon->tagset[selmon->seltags]; + focus(c); + arrange(selmon); +} + +static void scratchpad_show_first(int scratchNum) { + for(Client *c = selmon->clients; c !=NULL; c = c->next) { + if(c->tags == SCRATCHPAD_MASK_1 && scratchNum == 1) { + scratchpad_last_showed_1 = c; + scratchpad_show_client(c); + } else if(c->tags == SCRATCHPAD_MASK_2 && scratchNum == 2) { + scratchpad_last_showed_2 = c; + scratchpad_show_client(c); + } else if(c->tags == SCRATCHPAD_MASK_3 && scratchNum == 3) { + scratchpad_last_showed_3 = c; + scratchpad_show_client(c); + } + } +} + void sendmon(Client *c, Monitor *m) { @@ -1803,6 +1939,16 @@ unmanage(Client *c, int destroyed) XSetErrorHandler(xerror); XUngrabServer(dpy); } + if(scratchpad_last_showed_1 == c) { + scratchpad_last_showed_1 = NULL; + } + if(scratchpad_last_showed_2 == c) { + scratchpad_last_showed_2 = NULL; + } + if(scratchpad_last_showed_3 == c) { + scratchpad_last_showed_3 = NULL; + } + free(c); focus(NULL); updateclientlist(); diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig new file mode 100644 index 0000000..7ab1910 --- /dev/null +++ b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig @@ -0,0 +1,2207 @@ +/* See LICENSE file for copyright and license details. + * + * dynamic window manager is designed like any other X client as well. It is + * driven through handling X events. In contrast to other X clients, a window + * manager selects for SubstructureRedirectMask on the root window, to receive + * events about window (dis-)appearance. Only one X connection at a time is + * allowed to select for this event mask. + * + * The event handlers of dwm are organized in an array which is accessed + * whenever a new event has been fetched. This allows event dispatching + * in O(1) time. + * + * Each child of the root window is called a client, except windows which have + * set the override_redirect flag. Clients are organized in a linked client + * list on each monitor, the focus history is remembered through a stack list + * on each monitor. Each client contains a bit array to indicate the tags of a + * client. + * + * Keys and tagging rules are organized as arrays and defined in config.h. + * + * To understand everything else, start reading main(). + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef XINERAMA +#include +#endif /* XINERAMA */ +#include + +#include "drw.h" +#include "util.h" + +/* macros */ +#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) +#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) +#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ + * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) +#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) +#define LENGTH(X) (sizeof X / sizeof X[0]) +#define MOUSEMASK (BUTTONMASK|PointerMotionMask) +#define WIDTH(X) ((X)->w + 2 * (X)->bw) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define TAGMASK ((1 << LENGTH(tags)) - 1) +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +/* enums */ +enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +enum { SchemeNorm, SchemeSel }; /* color schemes */ +enum { NetSupported, NetWMName, NetWMState, NetWMCheck, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ +enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ +enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ + +typedef union { + int i; + unsigned int ui; + float f; + const void *v; +} Arg; + +typedef struct { + unsigned int click; + unsigned int mask; + unsigned int button; + void (*func)(const Arg *arg); + const Arg arg; +} Button; + +typedef struct Monitor Monitor; +typedef struct Client Client; +struct Client { + char name[256]; + float mina, maxa; + int x, y, w, h; + int oldx, oldy, oldw, oldh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; + int bw, oldbw; + unsigned int tags; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + Client *next; + Client *snext; + Monitor *mon; + Window win; +}; + +typedef struct { + unsigned int mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; +} Key; + +typedef struct { + const char *symbol; + void (*arrange)(Monitor *); +} Layout; + +struct Monitor { + char ltsymbol[16]; + float mfact; + int nmaster; + int num; + int by; /* bar geometry */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ + unsigned int seltags; + unsigned int sellt; + unsigned int tagset[2]; + int showbar; + int topbar; + Client *clients; + Client *sel; + Client *stack; + Monitor *next; + Window barwin; + const Layout *lt[2]; +}; + +typedef struct { + const char *class; + const char *instance; + const char *title; + unsigned int tags; + int isfloating; + int monitor; +} Rule; + +/* function declarations */ +static void applyrules(Client *c); +static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +static void arrange(Monitor *m); +static void arrangemon(Monitor *m); +static void attach(Client *c); +static void attachstack(Client *c); +static void buttonpress(XEvent *e); +static void checkotherwm(void); +static void cleanup(void); +static void cleanupmon(Monitor *mon); +static void clientmessage(XEvent *e); +static void configure(Client *c); +static void configurenotify(XEvent *e); +static void configurerequest(XEvent *e); +static Monitor *createmon(void); +static void destroynotify(XEvent *e); +static void detach(Client *c); +static void detachstack(Client *c); +static Monitor *dirtomon(int dir); +static void drawbar(Monitor *m); +static void drawbars(void); +static void enternotify(XEvent *e); +static void expose(XEvent *e); +static void focus(Client *c); +static void focusin(XEvent *e); +static void focusmon(const Arg *arg); +static void focusstack(const Arg *arg); +static Atom getatomprop(Client *c, Atom prop); +static int getrootptr(int *x, int *y); +static long getstate(Window w); +static int gettextprop(Window w, Atom atom, char *text, unsigned int size); +static void grabbuttons(Client *c, int focused); +static void grabkeys(void); +static void incnmaster(const Arg *arg); +static void keypress(XEvent *e); +static void killclient(const Arg *arg); +static void manage(Window w, XWindowAttributes *wa); +static void mappingnotify(XEvent *e); +static void maprequest(XEvent *e); +static void monocle(Monitor *m); +static void motionnotify(XEvent *e); +static void movemouse(const Arg *arg); +static Client *nexttiled(Client *c); +static void pop(Client *c); +static void propertynotify(XEvent *e); +static void quit(const Arg *arg); +static Monitor *recttomon(int x, int y, int w, int h); +static void resize(Client *c, int x, int y, int w, int h, int interact); +static void resizeclient(Client *c, int x, int y, int w, int h); +static void resizemouse(const Arg *arg); +static void restack(Monitor *m); +static void run(void); +static void scan(void); +static int sendevent(Client *c, Atom proto); +static void sendmon(Client *c, Monitor *m); +static void setclientstate(Client *c, long state); +static void setfocus(Client *c); +static void setfullscreen(Client *c, int fullscreen); +static void setlayout(const Arg *arg); +static void setmfact(const Arg *arg); +static void setup(void); +static void seturgent(Client *c, int urg); +static void showhide(Client *c); +static void spawn(const Arg *arg); +static void tag(const Arg *arg); +static void tagmon(const Arg *arg); +static void tile(Monitor *m); +static void togglebar(const Arg *arg); +static void togglefloating(const Arg *arg); +static void togglefullscr(const Arg *arg); +static void togglescratch(const Arg *arg); +static void toggletag(const Arg *arg); +static void toggleview(const Arg *arg); +static void unfocus(Client *c, int setfocus); +static void unmanage(Client *c, int destroyed); +static void unmapnotify(XEvent *e); +static void updatebarpos(Monitor *m); +static void updatebars(void); +static void updateclientlist(void); +static int updategeom(void); +static void updatenumlockmask(void); +static void updatesizehints(Client *c); +static void updatestatus(void); +static void updatetitle(Client *c); +static void updatewindowtype(Client *c); +static void updatewmhints(Client *c); +static void view(const Arg *arg); +static Client *wintoclient(Window w); +static Monitor *wintomon(Window w); +static int xerror(Display *dpy, XErrorEvent *ee); +static int xerrordummy(Display *dpy, XErrorEvent *ee); +static int xerrorstart(Display *dpy, XErrorEvent *ee); +static void zoom(const Arg *arg); + +/* variables */ +static const char broken[] = "broken"; +static char stext[256]; +static int screen; +static int sw, sh; /* X display screen geometry width, height */ +static int bh; /* bar height */ +static int lrpad; /* sum of left and right padding for text */ +static int (*xerrorxlib)(Display *, XErrorEvent *); +static unsigned int numlockmask = 0; +static void (*handler[LASTEvent]) (XEvent *) = { + [ButtonPress] = buttonpress, + [ClientMessage] = clientmessage, + [ConfigureRequest] = configurerequest, + [ConfigureNotify] = configurenotify, + [DestroyNotify] = destroynotify, + [EnterNotify] = enternotify, + [Expose] = expose, + [FocusIn] = focusin, + [KeyPress] = keypress, + [MappingNotify] = mappingnotify, + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, + [UnmapNotify] = unmapnotify +}; +static Atom wmatom[WMLast], netatom[NetLast]; +static int running = 1; +static Cur *cursor[CurLast]; +static Clr **scheme; +static Display *dpy; +static Drw *drw; +static Monitor *mons, *selmon; +static Window root, wmcheckwin; + +/* configuration, allows nested code to access above variables */ +#include "config.h" + +static unsigned int scratchtag = 1 << LENGTH(tags); +/* compile-time check if all tags fit into an unsigned int bit array. */ +struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + +/* function implementations */ +void +applyrules(Client *c) +{ + const char *class, *instance; + unsigned int i; + const Rule *r; + Monitor *m; + XClassHint ch = { NULL, NULL }; + + /* rule matching */ + c->isfloating = 0; + c->tags = 0; + XGetClassHint(dpy, c->win, &ch); + class = ch.res_class ? ch.res_class : broken; + instance = ch.res_name ? ch.res_name : broken; + + for (i = 0; i < LENGTH(rules); i++) { + r = &rules[i]; + if ((!r->title || strstr(c->name, r->title)) + && (!r->class || strstr(class, r->class)) + && (!r->instance || strstr(instance, r->instance))) + { + c->isfloating = r->isfloating; + c->tags |= r->tags; + for (m = mons; m && m->num != r->monitor; m = m->next); + if (m) + c->mon = m; + } + } + if (ch.res_class) + XFree(ch.res_class); + if (ch.res_name) + XFree(ch.res_name); + c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; +} + +int +applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) +{ + int baseismin; + Monitor *m = c->mon; + + /* set minimum possible */ + *w = MAX(1, *w); + *h = MAX(1, *h); + if (interact) { + if (*x > sw) + *x = sw - WIDTH(c); + if (*y > sh) + *y = sh - HEIGHT(c); + if (*x + *w + 2 * c->bw < 0) + *x = 0; + if (*y + *h + 2 * c->bw < 0) + *y = 0; + } else { + if (*x >= m->wx + m->ww) + *x = m->wx + m->ww - WIDTH(c); + if (*y >= m->wy + m->wh) + *y = m->wy + m->wh - HEIGHT(c); + if (*x + *w + 2 * c->bw <= m->wx) + *x = m->wx; + if (*y + *h + 2 * c->bw <= m->wy) + *y = m->wy; + } + if (*h < bh) + *h = bh; + if (*w < bh) + *w = bh; + if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { + if (!c->hintsvalid) + updatesizehints(c); + /* see last two sentences in ICCCM 4.1.2.3 */ + baseismin = c->basew == c->minw && c->baseh == c->minh; + if (!baseismin) { /* temporarily remove base dimensions */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for aspect limits */ + if (c->mina > 0 && c->maxa > 0) { + if (c->maxa < (float)*w / *h) + *w = *h * c->maxa + 0.5; + else if (c->mina < (float)*h / *w) + *h = *w * c->mina + 0.5; + } + if (baseismin) { /* increment calculation requires this */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for increment value */ + if (c->incw) + *w -= *w % c->incw; + if (c->inch) + *h -= *h % c->inch; + /* restore base dimensions */ + *w = MAX(*w + c->basew, c->minw); + *h = MAX(*h + c->baseh, c->minh); + if (c->maxw) + *w = MIN(*w, c->maxw); + if (c->maxh) + *h = MIN(*h, c->maxh); + } + return *x != c->x || *y != c->y || *w != c->w || *h != c->h; +} + +void +arrange(Monitor *m) +{ + if (m) + showhide(m->stack); + else for (m = mons; m; m = m->next) + showhide(m->stack); + if (m) { + arrangemon(m); + restack(m); + } else for (m = mons; m; m = m->next) + arrangemon(m); +} + +void +arrangemon(Monitor *m) +{ + strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); + if (m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); +} + +void +attach(Client *c) +{ + c->next = c->mon->clients; + c->mon->clients = c; +} + +void +attachstack(Client *c) +{ + c->snext = c->mon->stack; + c->mon->stack = c; +} + +void +buttonpress(XEvent *e) +{ + unsigned int i, x, click; + Arg arg = {0}; + Client *c; + Monitor *m; + XButtonPressedEvent *ev = &e->xbutton; + + click = ClkRootWin; + /* focus monitor if necessary */ + if ((m = wintomon(ev->window)) && m != selmon) { + unfocus(selmon->sel, 1); + selmon = m; + focus(NULL); + } + if (ev->window == selmon->barwin) { + i = x = 0; + do + x += TEXTW(tags[i]); + while (ev->x >= x && ++i < LENGTH(tags)); + if (i < LENGTH(tags)) { + click = ClkTagBar; + arg.ui = 1 << i; + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; + else if (ev->x > selmon->ww - (int)TEXTW(stext)) + click = ClkStatusText; + else + click = ClkWinTitle; + } else if ((c = wintoclient(ev->window))) { + focus(c); + restack(selmon); + XAllowEvents(dpy, ReplayPointer, CurrentTime); + click = ClkClientWin; + } + for (i = 0; i < LENGTH(buttons); i++) + if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button + && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) + buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); +} + +void +checkotherwm(void) +{ + xerrorxlib = XSetErrorHandler(xerrorstart); + /* this causes an error if some other window manager is running */ + XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); + XSync(dpy, False); + XSetErrorHandler(xerror); + XSync(dpy, False); +} + +void +cleanup(void) +{ + Arg a = {.ui = ~0}; + Layout foo = { "", NULL }; + Monitor *m; + size_t i; + + view(&a); + selmon->lt[selmon->sellt] = &foo; + for (m = mons; m; m = m->next) + while (m->stack) + unmanage(m->stack, 0); + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) + free(scheme[i]); + free(scheme); + XDestroyWindow(dpy, wmcheckwin); + drw_free(drw); + XSync(dpy, False); + XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); +} + +void +cleanupmon(Monitor *mon) +{ + Monitor *m; + + if (mon == mons) + mons = mons->next; + else { + for (m = mons; m && m->next != mon; m = m->next); + m->next = mon->next; + } + XUnmapWindow(dpy, mon->barwin); + XDestroyWindow(dpy, mon->barwin); + free(mon); +} + +void +clientmessage(XEvent *e) +{ + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + + if (!c) + return; + if (cme->message_type == netatom[NetWMState]) { + if (cme->data.l[1] == netatom[NetWMFullscreen] + || cme->data.l[2] == netatom[NetWMFullscreen]) + setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ + || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); + } else if (cme->message_type == netatom[NetActiveWindow]) { + if (c != selmon->sel && !c->isurgent) + seturgent(c, 1); + } +} + +void +configure(Client *c) +{ + XConfigureEvent ce; + + ce.type = ConfigureNotify; + ce.display = dpy; + ce.event = c->win; + ce.window = c->win; + ce.x = c->x; + ce.y = c->y; + ce.width = c->w; + ce.height = c->h; + ce.border_width = c->bw; + ce.above = None; + ce.override_redirect = False; + XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); +} + +void +configurenotify(XEvent *e) +{ + Monitor *m; + Client *c; + XConfigureEvent *ev = &e->xconfigure; + int dirty; + + /* TODO: updategeom handling sucks, needs to be simplified */ + if (ev->window == root) { + dirty = (sw != ev->width || sh != ev->height); + sw = ev->width; + sh = ev->height; + if (updategeom() || dirty) { + drw_resize(drw, sw, bh); + updatebars(); + for (m = mons; m; m = m->next) { + for (c = m->clients; c; c = c->next) + if (c->isfullscreen) + resizeclient(c, m->mx, m->my, m->mw, m->mh); + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); + } + focus(NULL); + arrange(NULL); + } + } +} + +void +configurerequest(XEvent *e) +{ + Client *c; + Monitor *m; + XConfigureRequestEvent *ev = &e->xconfigurerequest; + XWindowChanges wc; + + if ((c = wintoclient(ev->window))) { + if (ev->value_mask & CWBorderWidth) + c->bw = ev->border_width; + else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { + m = c->mon; + if (ev->value_mask & CWX) { + c->oldx = c->x; + c->x = m->mx + ev->x; + } + if (ev->value_mask & CWY) { + c->oldy = c->y; + c->y = m->my + ev->y; + } + if (ev->value_mask & CWWidth) { + c->oldw = c->w; + c->w = ev->width; + } + if (ev->value_mask & CWHeight) { + c->oldh = c->h; + c->h = ev->height; + } + if ((c->x + c->w) > m->mx + m->mw && c->isfloating) + c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ + if ((c->y + c->h) > m->my + m->mh && c->isfloating) + c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ + if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) + configure(c); + if (ISVISIBLE(c)) + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + } else + configure(c); + } else { + wc.x = ev->x; + wc.y = ev->y; + wc.width = ev->width; + wc.height = ev->height; + wc.border_width = ev->border_width; + wc.sibling = ev->above; + wc.stack_mode = ev->detail; + XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); + } + XSync(dpy, False); +} + +Monitor * +createmon(void) +{ + Monitor *m; + + m = ecalloc(1, sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; + m->mfact = mfact; + m->nmaster = nmaster; + m->showbar = showbar; + m->topbar = topbar; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + return m; +} + +void +destroynotify(XEvent *e) +{ + Client *c; + XDestroyWindowEvent *ev = &e->xdestroywindow; + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); +} + +void +detach(Client *c) +{ + Client **tc; + + for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); + *tc = c->next; +} + +void +detachstack(Client *c) +{ + Client **tc, *t; + + for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); + *tc = c->snext; + + if (c == c->mon->sel) { + for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); + c->mon->sel = t; + } +} + +Monitor * +dirtomon(int dir) +{ + Monitor *m = NULL; + + if (dir > 0) { + if (!(m = selmon->next)) + m = mons; + } else if (selmon == mons) + for (m = mons; m->next; m = m->next); + else + for (m = mons; m->next != selmon; m = m->next); + return m; +} + +void +drawbar(Monitor *m) +{ + int x, w, tw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + Client *c; + + if (!m->showbar) + return; + + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); + tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ + drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); + } + + for (c = m->clients; c; c = c->next) { + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; + } + x = 0; + for (i = 0; i < LENGTH(tags); i++) { + w = TEXTW(tags[i]); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); + if (occ & 1 << i) + drw_rect(drw, x + boxs, boxs, boxw, boxw, + m == selmon && selmon->sel && selmon->sel->tags & 1 << i, + urg & 1 << i); + x += w; + } + w = TEXTW(m->ltsymbol); + drw_setscheme(drw, scheme[SchemeNorm]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + + if ((w = m->ww - tw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } + drw_map(drw, m->barwin, 0, 0, m->ww, bh); +} + +void +drawbars(void) +{ + Monitor *m; + + for (m = mons; m; m = m->next) + drawbar(m); +} + +void +enternotify(XEvent *e) +{ + Client *c; + Monitor *m; + XCrossingEvent *ev = &e->xcrossing; + + if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) + return; + c = wintoclient(ev->window); + m = c ? c->mon : wintomon(ev->window); + if (m != selmon) { + unfocus(selmon->sel, 1); + selmon = m; + } else if (!c || c == selmon->sel) + return; + focus(c); +} + +void +expose(XEvent *e) +{ + Monitor *m; + XExposeEvent *ev = &e->xexpose; + + if (ev->count == 0 && (m = wintomon(ev->window))) + drawbar(m); +} + +void +focus(Client *c) +{ + if (!c || !ISVISIBLE(c)) + for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); + if (selmon->sel && selmon->sel != c) + unfocus(selmon->sel, 0); + if (c) { + if (c->mon != selmon) + selmon = c->mon; + if (c->isurgent) + seturgent(c, 0); + detachstack(c); + attachstack(c); + grabbuttons(c, 1); + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); + setfocus(c); + } else { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } + selmon->sel = c; + drawbars(); +} + +/* there are some broken focus acquiring clients needing extra handling */ +void +focusin(XEvent *e) +{ + XFocusChangeEvent *ev = &e->xfocus; + + if (selmon->sel && ev->window != selmon->sel->win) + setfocus(selmon->sel); +} + +void +focusmon(const Arg *arg) +{ + Monitor *m; + + if (!mons->next) + return; + if ((m = dirtomon(arg->i)) == selmon) + return; + unfocus(selmon->sel, 0); + selmon = m; + focus(NULL); +} + +void +focusstack(const Arg *arg) +{ + Client *c = NULL, *i; + + if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) + return; + if (arg->i > 0) { + for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + if (!c) + for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + } else { + for (i = selmon->clients; i != selmon->sel; i = i->next) + if (ISVISIBLE(i)) + c = i; + if (!c) + for (; i; i = i->next) + if (ISVISIBLE(i)) + c = i; + } + if (c) { + focus(c); + restack(selmon); + } +} + +Atom +getatomprop(Client *c, Atom prop) +{ + int di; + unsigned long dl; + unsigned char *p = NULL; + Atom da, atom = None; + + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; + XFree(p); + } + return atom; +} + +int +getrootptr(int *x, int *y) +{ + int di; + unsigned int dui; + Window dummy; + + return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); +} + +long +getstate(Window w) +{ + int format; + long result = -1; + unsigned char *p = NULL; + unsigned long n, extra; + Atom real; + + if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], + &real, &format, &n, &extra, (unsigned char **)&p) != Success) + return -1; + if (n != 0) + result = *p; + XFree(p); + return result; +} + +int +gettextprop(Window w, Atom atom, char *text, unsigned int size) +{ + char **list = NULL; + int n; + XTextProperty name; + + if (!text || size == 0) + return 0; + text[0] = '\0'; + if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) + return 0; + if (name.encoding == XA_STRING) { + strncpy(text, (char *)name.value, size - 1); + } else if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { + strncpy(text, *list, size - 1); + XFreeStringList(list); + } + text[size - 1] = '\0'; + XFree(name.value); + return 1; +} + +void +grabbuttons(Client *c, int focused) +{ + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + if (!focused) + XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, + BUTTONMASK, GrabModeSync, GrabModeSync, None, None); + for (i = 0; i < LENGTH(buttons); i++) + if (buttons[i].click == ClkClientWin) + for (j = 0; j < LENGTH(modifiers); j++) + XGrabButton(dpy, buttons[i].button, + buttons[i].mask | modifiers[j], + c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + } +} + +void +grabkeys(void) +{ + updatenumlockmask(); + { + unsigned int i, j, k; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + int start, end, skip; + KeySym *syms; + + XUngrabKey(dpy, AnyKey, AnyModifier, root); + XDisplayKeycodes(dpy, &start, &end); + syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); + if (!syms) + return; + for (k = start; k <= end; k++) + for (i = 0; i < LENGTH(keys); i++) + /* skip modifier codes, we do that ourselves */ + if (keys[i].keysym == syms[(k - start) * skip]) + for (j = 0; j < LENGTH(modifiers); j++) + XGrabKey(dpy, k, + keys[i].mod | modifiers[j], + root, True, + GrabModeAsync, GrabModeAsync); + XFree(syms); + } +} + +void +incnmaster(const Arg *arg) +{ + selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); +} + +#ifdef XINERAMA +static int +isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) +{ + while (n--) + if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org + && unique[n].width == info->width && unique[n].height == info->height) + return 0; + return 1; +} +#endif /* XINERAMA */ + +void +keypress(XEvent *e) +{ + unsigned int i; + KeySym keysym; + XKeyEvent *ev; + + ev = &e->xkey; + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); + for (i = 0; i < LENGTH(keys); i++) + if (keysym == keys[i].keysym + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) + && keys[i].func) + keys[i].func(&(keys[i].arg)); +} + +void +killclient(const Arg *arg) +{ + if (!selmon->sel) + return; + if (!sendevent(selmon->sel, wmatom[WMDelete])) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); + XKillClient(dpy, selmon->sel->win); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } +} + +void +manage(Window w, XWindowAttributes *wa) +{ + Client *c, *t = NULL; + Window trans = None; + XWindowChanges wc; + + c = ecalloc(1, sizeof(Client)); + c->win = w; + /* geometry */ + c->x = c->oldx = wa->x; + c->y = c->oldy = wa->y; + c->w = c->oldw = wa->width; + c->h = c->oldh = wa->height; + c->oldbw = wa->border_width; + + updatetitle(c); + if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { + c->mon = t->mon; + c->tags = t->tags; + } else { + c->mon = selmon; + applyrules(c); + } + + if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) + c->x = c->mon->wx + c->mon->ww - WIDTH(c); + if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) + c->y = c->mon->wy + c->mon->wh - HEIGHT(c); + c->x = MAX(c->x, c->mon->wx); + c->y = MAX(c->y, c->mon->wy); + c->bw = borderpx; + + selmon->tagset[selmon->seltags] &= ~scratchtag; + if (!strcmp(c->name, scratchpadname)) { + c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag; + c->isfloating = True; + c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); + c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); + } + + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); + configure(c); /* propagates border_width, if size doesn't change */ + updatewindowtype(c); + updatesizehints(c); + updatewmhints(c); + c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; + c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; + XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); + grabbuttons(c, 0); + if (!c->isfloating) + c->isfloating = c->oldstate = trans != None || c->isfixed; + if (c->isfloating) + XRaiseWindow(dpy, c->win); + attach(c); + attachstack(c); + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ + setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, 0); + c->mon->sel = c; + arrange(c->mon); + XMapWindow(dpy, c->win); + focus(NULL); +} + +void +mappingnotify(XEvent *e) +{ + XMappingEvent *ev = &e->xmapping; + + XRefreshKeyboardMapping(ev); + if (ev->request == MappingKeyboard) + grabkeys(); +} + +void +maprequest(XEvent *e) +{ + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + + if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) + return; + if (!wintoclient(ev->window)) + manage(ev->window, &wa); +} + +void +monocle(Monitor *m) +{ + unsigned int n = 0; + Client *c; + + for (c = m->clients; c; c = c->next) + if (ISVISIBLE(c)) + n++; + if (n > 0) /* override layout symbol */ + snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); + for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) + resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); +} + +void +motionnotify(XEvent *e) +{ + static Monitor *mon = NULL; + Monitor *m; + XMotionEvent *ev = &e->xmotion; + + if (ev->window != root) + return; + if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { + unfocus(selmon->sel, 1); + selmon = m; + focus(NULL); + } + mon = m; +} + +void +movemouse(const Arg *arg) +{ + int x, y, ocx, ocy, nx, ny; + Client *c; + Monitor *m; + XEvent ev; + Time lasttime = 0; + + if (!(c = selmon->sel)) + return; + if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) + return; + if (!getrootptr(&x, &y)) + return; + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + if ((ev.xmotion.time - lasttime) <= (1000 / 60)) + continue; + lasttime = ev.xmotion.time; + + nx = ocx + (ev.xmotion.x - x); + ny = ocy + (ev.xmotion.y - y); + if (abs(selmon->wx - nx) < snap) + nx = selmon->wx; + else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) + nx = selmon->wx + selmon->ww - WIDTH(c); + if (abs(selmon->wy - ny) < snap) + ny = selmon->wy; + else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) + ny = selmon->wy + selmon->wh - HEIGHT(c); + if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) + togglefloating(NULL); + if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) + resize(c, nx, ny, c->w, c->h, 1); + break; + } + } while (ev.type != ButtonRelease); + XUngrabPointer(dpy, CurrentTime); + if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } +} + +Client * +nexttiled(Client *c) +{ + for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + return c; +} + +void +pop(Client *c) +{ + detach(c); + attach(c); + focus(c); + arrange(c->mon); +} + +void +propertynotify(XEvent *e) +{ + Client *c; + Window trans; + XPropertyEvent *ev = &e->xproperty; + + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if (ev->state == PropertyDelete) + return; /* ignore */ + else if ((c = wintoclient(ev->window))) { + switch(ev->atom) { + default: break; + case XA_WM_TRANSIENT_FOR: + if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && + (c->isfloating = (wintoclient(trans)) != NULL)) + arrange(c->mon); + break; + case XA_WM_NORMAL_HINTS: + c->hintsvalid = 0; + break; + case XA_WM_HINTS: + updatewmhints(c); + drawbars(); + break; + } + if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { + updatetitle(c); + if (c == c->mon->sel) + drawbar(c->mon); + } + if (ev->atom == netatom[NetWMWindowType]) + updatewindowtype(c); + } +} + +void +quit(const Arg *arg) +{ + running = 0; +} + +Monitor * +recttomon(int x, int y, int w, int h) +{ + Monitor *m, *r = selmon; + int a, area = 0; + + for (m = mons; m; m = m->next) + if ((a = INTERSECT(x, y, w, h, m)) > area) { + area = a; + r = m; + } + return r; +} + +void +resize(Client *c, int x, int y, int w, int h, int interact) +{ + if (applysizehints(c, &x, &y, &w, &h, interact)) + resizeclient(c, x, y, w, h); +} + +void +resizeclient(Client *c, int x, int y, int w, int h) +{ + XWindowChanges wc; + + c->oldx = c->x; c->x = wc.x = x; + c->oldy = c->y; c->y = wc.y = y; + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +} + +void +resizemouse(const Arg *arg) +{ + int ocx, ocy, nw, nh; + Client *c; + Monitor *m; + XEvent ev; + Time lasttime = 0; + + if (!(c = selmon->sel)) + return; + if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) + return; + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + if ((ev.xmotion.time - lasttime) <= (1000 / 60)) + continue; + lasttime = ev.xmotion.time; + + nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); + nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); + if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww + && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) + { + if (!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) + togglefloating(NULL); + } + if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) + resize(c, c->x, c->y, nw, nh, 1); + break; + } + } while (ev.type != ButtonRelease); + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + XUngrabPointer(dpy, CurrentTime); + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); + if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } +} + +void +restack(Monitor *m) +{ + Client *c; + XEvent ev; + XWindowChanges wc; + + drawbar(m); + if (!m->sel) + return; + if (m->sel->isfloating || !m->lt[m->sellt]->arrange) + XRaiseWindow(dpy, m->sel->win); + if (m->lt[m->sellt]->arrange) { + wc.stack_mode = Below; + wc.sibling = m->barwin; + for (c = m->stack; c; c = c->snext) + if (!c->isfloating && ISVISIBLE(c)) { + XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); + wc.sibling = c->win; + } + } + XSync(dpy, False); + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); +} + +void +run(void) +{ + XEvent ev; + /* main event loop */ + XSync(dpy, False); + while (running && !XNextEvent(dpy, &ev)) + if (handler[ev.type]) + handler[ev.type](&ev); /* call handler */ +} + +void +scan(void) +{ + unsigned int i, num; + Window d1, d2, *wins = NULL; + XWindowAttributes wa; + + if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { + for (i = 0; i < num; i++) { + if (!XGetWindowAttributes(dpy, wins[i], &wa) + || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) + continue; + if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) + manage(wins[i], &wa); + } + for (i = 0; i < num; i++) { /* now the transients */ + if (!XGetWindowAttributes(dpy, wins[i], &wa)) + continue; + if (XGetTransientForHint(dpy, wins[i], &d1) + && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) + manage(wins[i], &wa); + } + if (wins) + XFree(wins); + } +} + +void +sendmon(Client *c, Monitor *m) +{ + if (c->mon == m) + return; + unfocus(c, 1); + detach(c); + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); + focus(NULL); + arrange(NULL); +} + +void +setclientstate(Client *c, long state) +{ + long data[] = { state, None }; + + XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, + PropModeReplace, (unsigned char *)data, 2); +} + +int +sendevent(Client *c, Atom proto) +{ + int n; + Atom *protocols; + int exists = 0; + XEvent ev; + + if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { + while (!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } + if (exists) { + ev.type = ClientMessage; + ev.xclient.window = c->win; + ev.xclient.message_type = wmatom[WMProtocols]; + ev.xclient.format = 32; + ev.xclient.data.l[0] = proto; + ev.xclient.data.l[1] = CurrentTime; + XSendEvent(dpy, c->win, False, NoEventMask, &ev); + } + return exists; +} + +void +setfocus(Client *c) +{ + if (!c->neverfocus) { + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); + XChangeProperty(dpy, root, netatom[NetActiveWindow], + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } + sendevent(c, wmatom[WMTakeFocus]); +} + +void +setfullscreen(Client *c, int fullscreen) +{ + if (fullscreen && !c->isfullscreen) { + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); + c->isfullscreen = 1; + c->oldstate = c->isfloating; + c->oldbw = c->bw; + c->bw = 0; + c->isfloating = 1; + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } else if (!fullscreen && c->isfullscreen){ + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)0, 0); + c->isfullscreen = 0; + c->isfloating = c->oldstate; + c->bw = c->oldbw; + c->x = c->oldx; + c->y = c->oldy; + c->w = c->oldw; + c->h = c->oldh; + resizeclient(c, c->x, c->y, c->w, c->h); + arrange(c->mon); + } +} + +void +setlayout(const Arg *arg) +{ + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) + selmon->sellt ^= 1; + if (arg && arg->v) + selmon->lt[selmon->sellt] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if (selmon->sel) + arrange(selmon); + else + drawbar(selmon); +} + +/* arg > 1.0 will set mfact absolutely */ +void +setmfact(const Arg *arg) +{ + float f; + + if (!arg || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.05 || f > 0.95) + return; + selmon->mfact = f; + arrange(selmon); +} + +void +setup(void) +{ + int i; + XSetWindowAttributes wa; + Atom utf8string; + struct sigaction sa; + + /* do not transform children into zombies when they terminate */ + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; + sa.sa_handler = SIG_IGN; + sigaction(SIGCHLD, &sa, NULL); + + /* clean up any zombies (inherited from .xinitrc etc) immediately */ + while (waitpid(-1, NULL, WNOHANG) > 0); + + /* init screen */ + screen = DefaultScreen(dpy); + sw = DisplayWidth(dpy, screen); + sh = DisplayHeight(dpy, screen); + root = RootWindow(dpy, screen); + drw = drw_create(dpy, screen, root, sw, sh); + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; + bh = drw->fonts->h + 2; + updategeom(); + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); + wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); + wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); + wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); + netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); + netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); + /* init cursors */ + cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); + cursor[CurResize] = drw_cur_create(drw, XC_sizing); + cursor[CurMove] = drw_cur_create(drw, XC_fleur); + /* init appearance */ + scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], 3); + /* init bars */ + updatebars(); + updatestatus(); + /* supporting window for NetWMCheck */ + wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &wmcheckwin, 1); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, + PropModeReplace, (unsigned char *) "dwm", 3); + XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &wmcheckwin, 1); + /* EWMH support per view */ + XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, + PropModeReplace, (unsigned char *) netatom, NetLast); + XDeleteProperty(dpy, root, netatom[NetClientList]); + /* select events */ + wa.cursor = cursor[CurNormal]->cursor; + wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask + |ButtonPressMask|PointerMotionMask|EnterWindowMask + |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; + XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); + XSelectInput(dpy, root, wa.event_mask); + grabkeys(); + focus(NULL); +} + +void +seturgent(Client *c, int urg) +{ + XWMHints *wmh; + + c->isurgent = urg; + if (!(wmh = XGetWMHints(dpy, c->win))) + return; + wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); + XSetWMHints(dpy, c->win, wmh); + XFree(wmh); +} + +void +showhide(Client *c) +{ + if (!c) + return; + if (ISVISIBLE(c)) { + /* show clients top down */ + XMoveWindow(dpy, c->win, c->x, c->y); + if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) + resize(c, c->x, c->y, c->w, c->h, 0); + showhide(c->snext); + } else { + /* hide clients bottom up */ + showhide(c->snext); + XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); + } +} + +void +spawn(const Arg *arg) +{ + struct sigaction sa; + + if (arg->v == dmenucmd) + dmenumon[0] = '0' + selmon->num; + selmon->tagset[selmon->seltags] &= ~scratchtag; + if (fork() == 0) { + if (dpy) + close(ConnectionNumber(dpy)); + setsid(); + + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = SIG_DFL; + sigaction(SIGCHLD, &sa, NULL); + + execvp(((char **)arg->v)[0], (char **)arg->v); + die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); + } +} + +void +tag(const Arg *arg) +{ + if (selmon->sel && arg->ui & TAGMASK) { + selmon->sel->tags = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); + } +} + +void +tagmon(const Arg *arg) +{ + if (!selmon->sel || !mons->next) + return; + sendmon(selmon->sel, dirtomon(arg->i)); +} + +void +tile(Monitor *m) +{ + unsigned int i, n, h, mw, my, ty; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + if (n > m->nmaster) + mw = m->nmaster ? m->ww * m->mfact : 0; + else + mw = m->ww; + for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + h = (m->wh - my) / (MIN(n, m->nmaster) - i); + resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); + if (my + HEIGHT(c) < m->wh) + my += HEIGHT(c); + } else { + h = (m->wh - ty) / (n - i); + resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); + if (ty + HEIGHT(c) < m->wh) + ty += HEIGHT(c); + } +} + +void +togglebar(const Arg *arg) +{ + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + arrange(selmon); +} + +void +togglefloating(const Arg *arg) +{ + if (!selmon->sel) + return; + if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ + return; + selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; + if (selmon->sel->isfloating) + resize(selmon->sel, selmon->sel->x, selmon->sel->y, + selmon->sel->w, selmon->sel->h, 0); + arrange(selmon); +} + +void +togglescratch(const Arg *arg) +{ + Client *c; + unsigned int found = 0; + + for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); + if (found) { + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); + arrange(selmon); + } + if (ISVISIBLE(c)) { + focus(c); + restack(selmon); + } + } else + spawn(arg); +} +void +togglefullscr(const Arg *arg) +{ + if(selmon->sel) + setfullscreen(selmon->sel, !selmon->sel->isfullscreen); +} + +void +toggletag(const Arg *arg) +{ + unsigned int newtags; + + if (!selmon->sel) + return; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if (newtags) { + selmon->sel->tags = newtags; + focus(NULL); + arrange(selmon); + } +} + +void +toggleview(const Arg *arg) +{ + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); + arrange(selmon); + } +} + +void +unfocus(Client *c, int setfocus) +{ + if (!c) + return; + grabbuttons(c, 0); + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); + if (setfocus) { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } +} + +void +unmanage(Client *c, int destroyed) +{ + Monitor *m = c->mon; + XWindowChanges wc; + + detach(c); + detachstack(c); + if (!destroyed) { + wc.border_width = c->oldbw; + XGrabServer(dpy); /* avoid race conditions */ + XSetErrorHandler(xerrordummy); + XSelectInput(dpy, c->win, NoEventMask); + XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + setclientstate(c, WithdrawnState); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } + free(c); + focus(NULL); + updateclientlist(); + arrange(m); +} + +void +unmapnotify(XEvent *e) +{ + Client *c; + XUnmapEvent *ev = &e->xunmap; + + if ((c = wintoclient(ev->window))) { + if (ev->send_event) + setclientstate(c, WithdrawnState); + else + unmanage(c, 0); + } +} + +void +updatebars(void) +{ + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, + .background_pixmap = ParentRelative, + .event_mask = ButtonPressMask|ExposureMask + }; + XClassHint ch = {"dwm", "dwm"}; + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } +} + +void +updatebarpos(Monitor *m) +{ + m->wy = m->my; + m->wh = m->mh; + if (m->showbar) { + m->wh -= bh; + m->by = m->topbar ? m->wy : m->wy + m->wh; + m->wy = m->topbar ? m->wy + bh : m->wy; + } else + m->by = -bh; +} + +void +updateclientlist() +{ + Client *c; + Monitor *m; + + XDeleteProperty(dpy, root, netatom[NetClientList]); + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + XChangeProperty(dpy, root, netatom[NetClientList], + XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); +} + +int +updategeom(void) +{ + int dirty = 0; + +#ifdef XINERAMA + if (XineramaIsActive(dpy)) { + int i, j, n, nn; + Client *c; + Monitor *m; + XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); + XineramaScreenInfo *unique = NULL; + + for (n = 0, m = mons; m; m = m->next, n++); + /* only consider unique geometries as separate screens */ + unique = ecalloc(nn, sizeof(XineramaScreenInfo)); + for (i = 0, j = 0; i < nn; i++) + if (isuniquegeom(unique, j, &info[i])) + memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); + XFree(info); + nn = j; + + /* new monitors if nn > n */ + for (i = n; i < nn; i++) { + for (m = mons; m && m->next; m = m->next); + if (m) + m->next = createmon(); + else + mons = createmon(); + } + for (i = 0, m = mons; i < nn && m; m = m->next, i++) + if (i >= n + || unique[i].x_org != m->mx || unique[i].y_org != m->my + || unique[i].width != m->mw || unique[i].height != m->mh) + { + dirty = 1; + m->num = i; + m->mx = m->wx = unique[i].x_org; + m->my = m->wy = unique[i].y_org; + m->mw = m->ww = unique[i].width; + m->mh = m->wh = unique[i].height; + updatebarpos(m); + } + /* removed monitors if n > nn */ + for (i = nn; i < n; i++) { + for (m = mons; m && m->next; m = m->next); + while ((c = m->clients)) { + dirty = 1; + m->clients = c->next; + detachstack(c); + c->mon = mons; + attach(c); + attachstack(c); + } + if (m == selmon) + selmon = mons; + cleanupmon(m); + } + free(unique); + } else +#endif /* XINERAMA */ + { /* default monitor setup */ + if (!mons) + mons = createmon(); + if (mons->mw != sw || mons->mh != sh) { + dirty = 1; + mons->mw = mons->ww = sw; + mons->mh = mons->wh = sh; + updatebarpos(mons); + } + } + if (dirty) { + selmon = mons; + selmon = wintomon(root); + } + return dirty; +} + +void +updatenumlockmask(void) +{ + unsigned int i, j; + XModifierKeymap *modmap; + + numlockmask = 0; + modmap = XGetModifierMapping(dpy); + for (i = 0; i < 8; i++) + for (j = 0; j < modmap->max_keypermod; j++) + if (modmap->modifiermap[i * modmap->max_keypermod + j] + == XKeysymToKeycode(dpy, XK_Num_Lock)) + numlockmask = (1 << i); + XFreeModifiermap(modmap); +} + +void +updatesizehints(Client *c) +{ + long msize; + XSizeHints size; + + if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) + /* size is uninitialized, ensure that size.flags aren't used */ + size.flags = PSize; + if (size.flags & PBaseSize) { + c->basew = size.base_width; + c->baseh = size.base_height; + } else if (size.flags & PMinSize) { + c->basew = size.min_width; + c->baseh = size.min_height; + } else + c->basew = c->baseh = 0; + if (size.flags & PResizeInc) { + c->incw = size.width_inc; + c->inch = size.height_inc; + } else + c->incw = c->inch = 0; + if (size.flags & PMaxSize) { + c->maxw = size.max_width; + c->maxh = size.max_height; + } else + c->maxw = c->maxh = 0; + if (size.flags & PMinSize) { + c->minw = size.min_width; + c->minh = size.min_height; + } else if (size.flags & PBaseSize) { + c->minw = size.base_width; + c->minh = size.base_height; + } else + c->minw = c->minh = 0; + if (size.flags & PAspect) { + c->mina = (float)size.min_aspect.y / size.min_aspect.x; + c->maxa = (float)size.max_aspect.x / size.max_aspect.y; + } else + c->maxa = c->mina = 0.0; + c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); + c->hintsvalid = 1; +} + +void +updatestatus(void) +{ + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); +} + +void +updatetitle(Client *c) +{ + if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) + gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); + if (c->name[0] == '\0') /* hack to mark broken clients */ + strcpy(c->name, broken); +} + +void +updatewindowtype(Client *c) +{ + Atom state = getatomprop(c, netatom[NetWMState]); + Atom wtype = getatomprop(c, netatom[NetWMWindowType]); + + if (state == netatom[NetWMFullscreen]) + setfullscreen(c, 1); + if (wtype == netatom[NetWMWindowTypeDialog]) + c->isfloating = 1; +} + +void +updatewmhints(Client *c) +{ + XWMHints *wmh; + + if ((wmh = XGetWMHints(dpy, c->win))) { + if (c == selmon->sel && wmh->flags & XUrgencyHint) { + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + } else + c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; + if (wmh->flags & InputHint) + c->neverfocus = !wmh->input; + else + c->neverfocus = 0; + XFree(wmh); + } +} + +void +view(const Arg *arg) +{ + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ + if (arg->ui & TAGMASK) + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); +} + +Client * +wintoclient(Window w) +{ + Client *c; + Monitor *m; + + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + if (c->win == w) + return c; + return NULL; +} + +Monitor * +wintomon(Window w) +{ + int x, y; + Client *c; + Monitor *m; + + if (w == root && getrootptr(&x, &y)) + return recttomon(x, y, 1, 1); + for (m = mons; m; m = m->next) + if (w == m->barwin) + return m; + if ((c = wintoclient(w))) + return c->mon; + return selmon; +} + +/* There's no way to check accesses to destroyed windows, thus those cases are + * ignored (especially on UnmapNotify's). Other types of errors call Xlibs + * default error handler, which may call exit. */ +int +xerror(Display *dpy, XErrorEvent *ee) +{ + if (ee->error_code == BadWindow + || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) + || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) + || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) + || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) + || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) + || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) + || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) + || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) + return 0; + fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", + ee->request_code, ee->error_code); + return xerrorxlib(dpy, ee); /* may call exit */ +} + +int +xerrordummy(Display *dpy, XErrorEvent *ee) +{ + return 0; +} + +/* Startup Error handler to check if another window manager + * is already running. */ +int +xerrorstart(Display *dpy, XErrorEvent *ee) +{ + die("dwm: another window manager is already running"); + return -1; +} + +void +zoom(const Arg *arg) +{ + Client *c = selmon->sel; + + if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) + return; + if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) + return; + pop(c); +} + +int +main(int argc, char *argv[]) +{ + if (argc == 2 && !strcmp("-v", argv[1])) + die("dwm-"VERSION); + else if (argc != 1) + die("usage: dwm [-v]"); + if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fputs("warning: no locale support\n", stderr); + if (!(dpy = XOpenDisplay(NULL))) + die("dwm: cannot open display"); + checkotherwm(); + setup(); +#ifdef __OpenBSD__ + if (pledge("stdio rpath proc exec", NULL) == -1) + die("pledge"); +#endif /* __OpenBSD__ */ + scan(); + run(); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; +} diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej new file mode 100644 index 0000000..10b98fd --- /dev/null +++ b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej @@ -0,0 +1,23 @@ +--- dwm.c ++++ dwm.c +@@ -274,11 +279,19 @@ static Drw *drw; + static Monitor *mons, *selmon; + static Window root, wmcheckwin; + ++/* scratchpad */ ++#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) ++#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) ++#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) ++static int scratchpad_hide_flag = 0; ++static Client *scratchpad_last_showed_1 = NULL; ++static Client *scratchpad_last_showed_2 = NULL; ++static Client *scratchpad_last_showed_3 = NULL; + /* configuration, allows nested code to access above variables */ + #include "config.h" + + /* compile-time check if all tags fit into an unsigned int bit array. */ +-struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; ++struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; + + /* function implementations */ + void diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.o b/hosts/vali/mars/dwm/dwm-6.5/dwm.o index e48aabbf016c630168214df4d4544eec04374458..167e75d11e0e21d9afa10ecd139c0e990adfa918 100644 GIT binary patch literal 59856 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 diff --git a/hosts/vali/mars/dwm/dwm.nix b/hosts/vali/mars/dwm/dwm.nix index 325f4f8..bc7670e 100644 --- a/hosts/vali/mars/dwm/dwm.nix +++ b/hosts/vali/mars/dwm/dwm.nix @@ -6,9 +6,11 @@ in { options.modules.programs.dwm.enable = mkEnableOption "dwm"; config = mkIf cfg.enable { - services.xserver = { + services.xserver = { enable = true; - xkb.layout = "de"; + layout = "de, de"; + xkbVariant = ",neo "; + xkbOptions = "grp:alt_space_toggle"; windowManager.dwm = { enable = true; }; @@ -24,12 +26,7 @@ in { }) ]; environment.systemPackages = with pkgs; [ - (st.overrideAttrs (oldAttrs: rec { src = ./st-0.9.2; })) - (dmenu.overrideAttrs (oldAttrs: rec { src = ./dmenu-5.3; })) + # (dmenu.overrideAttrs (oldAttrs: rec { src = ./dmenu-5.3; })) ]; - home-manager.users.${username} = { - programs.eww.enable = true; - programs.eww.configDir=./eww; - }; }; } diff --git a/hosts/vali/mars/dwm/eww/eww.scss b/hosts/vali/mars/dwm/eww/eww.scss deleted file mode 100644 index e69de29..0000000 diff --git a/hosts/vali/mars/dwm/eww/eww.yuck b/hosts/vali/mars/dwm/eww/eww.yuck deleted file mode 100644 index e69de29..0000000 diff --git a/hosts/vali/mars/programs.nix b/hosts/vali/mars/programs.nix index c0cb81c..0ce5632 100644 --- a/hosts/vali/mars/programs.nix +++ b/hosts/vali/mars/programs.nix @@ -36,7 +36,6 @@ in { httpie imagemagick keepassxc - kitty krita lazygit libreoffice-fresh @@ -48,6 +47,7 @@ in { neovim networkmanagerapplet nextcloud-client + nheko pamixer pavucontrol pcmanfm @@ -65,7 +65,6 @@ in { signal-desktop-beta smartmontools spotube - st steam strawberry telegram-desktop @@ -78,6 +77,7 @@ in { ventoy-full vesktop vlc + weechat wget xclip xfce.thunar diff --git a/modules/gui/default.nix b/modules/gui/default.nix index ff880a6..6296fc3 100644 --- a/modules/gui/default.nix +++ b/modules/gui/default.nix @@ -11,6 +11,7 @@ _: { ./foot.nix ./rofi.nix ./WM + ./kitty.nix ./vivado.nix ./alacritty.nix ./firefox.nix diff --git a/modules/gui/kitty.nix b/modules/gui/kitty.nix new file mode 100644 index 0000000..b665bc9 --- /dev/null +++ b/modules/gui/kitty.nix @@ -0,0 +1,78 @@ +{ config, lib, pkgs, ... }: +with lib; let + cfg = config.modules.programs.kitty; + username = config.modules.other.system.username; +in { + options.modules.programs.kitty.enable = mkEnableOption "kitty"; + + config = mkIf cfg.enable { + home-manager.users.${username} = { + programs.kitty = { + enable = true; + settings = { + font_size = "13.0"; + mouse_hide_wait = -1; + url_style = "curly"; + open_url_with = "default"; + background_opacity = "0.9"; + confirm_os_window_close = "0"; + font_family = "JetBrainsMono Nerd Font"; + + cursor_text_color = "background"; + + url_color = "#83a598"; + + visual_bell_color = "#8ec07c"; + bell_border_color = "#8ec07c"; + + active_border_color = "#d3869b"; + inactive_border_color = "#665c54"; + + foreground = "#ebdbb2"; + background = "#282828"; + selection_foreground = "#928374"; + selection_background = "#ebdbb2"; + + active_tab_foreground = "#fbf1c7"; + active_tab_background = "#665c54"; + inactive_tab_foreground = "#a89984"; + inactive_tab_background = "#3c3836"; + + # black (bg3/bg4) + color0 = "#665c54"; + color8 = "#7c6f64"; + + # red + color1 = "#cc241d"; + color9 = "#fb4934"; + + #: green + color2 = "#98971a"; + color10 = "#b8bb26"; + + # yellow + color3 = "#d79921"; + color11 = "#fabd2f"; + + # blue + color4 = "#458588"; + color12 = "#83a598"; + + # purple + color5 = "#b16286"; + color13 = "#d3869b"; + + # aqua + color6 = "#689d6a"; + color14 = "#8ec07c"; + + # white (fg4/fg3) + color7 = "#a89984"; + color15 = "#bdae93"; + }; + + }; + }; + }; + +} diff --git a/modules/tui/default.nix b/modules/tui/default.nix index 459fc7a..34ce59e 100644 --- a/modules/tui/default.nix +++ b/modules/tui/default.nix @@ -3,7 +3,7 @@ _: { ./btop.nix # ./helix.nix ./neovim.nix -# ./newsboat.nix + ./newsboat.nix ./ncmpcpp.nix ./yazi.nix ]; diff --git a/modules/tui/newsboat.nix b/modules/tui/newsboat.nix new file mode 100644 index 0000000..5fa69f2 --- /dev/null +++ b/modules/tui/newsboat.nix @@ -0,0 +1,73 @@ +{ + config, + lib, + ... +}: with lib; let + cfg = config.modules.programs.newsboat; + username = config.modules.other.system.username; +in { + options.modules.programs.newsboat.enable = mkEnableOption "newsboat"; + + config = mkIf cfg.enable { + home-manager.users.${username} = { + programs.newsboat = { + enable = true; + autoReload = true; + extraConfig = '' + download-full-page yes + download-retries 3 + error-log /dev/null + cookie-cache ~/.cache/newsboat/cookies.txt + bind-key j down + bind-key k up + bind-key G end + bind-key g home + bind-key d pagedown + bind-key u pageup + bind-key a toggle-article-read + + color listnormal color15 default + color listnormal_unread color2 default + color listfocus_unread color2 color0 + color listfocus default color0 + color background default default + color article default default + color end-of-text-marker color8 default + color info color4 color8 + color hint-separator default color8 + color hint-description default color8 + color title color14 color8 + + highlight article "^(Feed|Title|Author|Link|Date): .+" color4 default bold + highlight article "^(Feed|Title|Author|Link|Date):" color14 default bold + highlight article "\\((link|image|video)\\)" color8 default + highlight article "https?://[^ ]+" color4 default + highlight article "\[[0-9]+\]" color6 default bold + user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36" + ''; + urls = [ + { + title = "NixOS Weekly"; + url = "https://weekly.nixos.org/feeds/all.rss.xml"; + } + { + title = "Hacker News"; + url = "https://hnrss.org/newest"; + } + { + title = "Phoronix"; + url = "https://www.phoronix.com/rss.php"; + } + { + title = "LWN"; + url = "https://lwn.net/headlines/rss"; + } + { + title = "Hyprland Commit Feed"; + url = "https://github.com/hyprwm/Hyprland/commits/main.atom"; + } + ]; + }; + }; + }; +} diff --git a/options/desktop/fonts.nix b/options/desktop/fonts.nix index 4496e88..247c40d 100644 --- a/options/desktop/fonts.nix +++ b/options/desktop/fonts.nix @@ -3,7 +3,7 @@ fonts.packages = with pkgs; [ material-design-icons (nerdfonts.override { - fonts = [ "JetBrainsMono"]; + # fonts = [ "JetBrains Mono"]; }) noto-fonts noto-fonts-cjk-sans From 6f35f3fd0872c49830ce2dedc44f470942a9b21c Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Tue, 23 Apr 2024 12:56:11 +0200 Subject: [PATCH 38/50] added newsboat --- hosts/vali/mars/configuration.nix | 19 ++++----- hosts/vali/mars/programs.nix | 3 +- modules/gui/default.nix | 2 +- modules/tui/ncmpcpp.nix | 65 ++++++++++++++++++++++++++++++- modules/tui/newsboat.nix | 9 +++++ 5 files changed, 82 insertions(+), 16 deletions(-) diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index 0031be2..163e6e9 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -59,11 +59,10 @@ mpv.enable = true; kitty.enable = true; dwm.enable = true; - schizofox.enable = true; + newsboat.enable = true; #git = { # enable = true; - # userName = "vali"; - # userEmail = "valentin@kaas.cc"; + # userName = "vali"; userEmail = "valentin@kaas.cc"; # defaultBranch = "main"; #}; starship.enable = true; @@ -83,11 +82,9 @@ size = 24; }; gtk = { - enable = false; - package = pkgs.catppuccin-gtk; - name = "Catppuccin-Mocha-Standard-Green-Dark"; - variant = "mocha"; - accentColour = "green"; + enable = true; + package = pkgs.gruvbox-gtk-theme; + name = "Gruvbox-Dark-BL"; iconTheme = { name = "Papirus-Dark"; package = pkgs.catppuccin-papirus-folders; @@ -95,10 +92,8 @@ }; qt = { enable = true; - package = pkgs.catppuccin-kde; - name = "Catppuccin-Mocha-Dark"; - variant = "mocha"; - accentColour = "green"; + package = pkgs.kde-gruvbox; + name = "konsole"; }; }; }; diff --git a/hosts/vali/mars/programs.nix b/hosts/vali/mars/programs.nix index 0ce5632..a23fcb8 100644 --- a/hosts/vali/mars/programs.nix +++ b/hosts/vali/mars/programs.nix @@ -47,7 +47,6 @@ in { neovim networkmanagerapplet nextcloud-client - nheko pamixer pavucontrol pcmanfm @@ -65,7 +64,6 @@ in { signal-desktop-beta smartmontools spotube - steam strawberry telegram-desktop texliveFull @@ -74,6 +72,7 @@ in { trash-cli tree unzip + util-linux ventoy-full vesktop vlc diff --git a/modules/gui/default.nix b/modules/gui/default.nix index 5506af3..bfaf22b 100644 --- a/modules/gui/default.nix +++ b/modules/gui/default.nix @@ -12,7 +12,7 @@ _: { ./rofi.nix ./WM ./kitty.nix - ./vivado.nix +# ./vivado.nix ./alacritty.nix ./firefox.nix ./steam.nix diff --git a/modules/tui/ncmpcpp.nix b/modules/tui/ncmpcpp.nix index 2d69da8..e3036c6 100644 --- a/modules/tui/ncmpcpp.nix +++ b/modules/tui/ncmpcpp.nix @@ -10,9 +10,72 @@ in { xdg.configFile."ncmpcpp/config".source = ./config; programs.ncmpcpp = { enable = true; + package = (pkgs.ncmpcpp.override {visualizerSupport = true;}); mpdMusicDir = "/home/vali/Nextcloud/Media/Music"; + settings = { + mpd_host = "127.0.0.1"; + mpd_port = "6600"; + alternative_header_first_line_format = "$5{$b%t$/b}$9"; + alternative_header_second_line_format = "$3by $7{$b%a$/b}$9 $3from $7{$b%b$/b}$9 $5{(%y)}"; + song_list_format = "♫ $2%n$(end) $9 $3%a$(end) $(245)-$9 $(246)%t$9 $R{ $5%y$9}$(end) $(246)%lq$(end)"; + song_columns_list_format ="(3f)[red]{n} (3f)[246]{} (35)[white]{t} (18)[blue]{a} (30)[green]{b} (5f)[yellow]{d} (5f)[red]{y} (7f)[magenta]{l}"; + song_status_format = "$b $8%A $8•$3• $3%t $3•$5• $5%b $5•$2• $2%y $2•$8• %g"; + playlist_display_mode = "columns"; + browser_display_mode = "columns"; + search_engine_display_mode = "columns"; + now_playing_prefix = "$b"; + now_playing_suffix = "$/b"; + browser_playlist_prefix = "$2 ♥ $5 "; + playlist_disable_highlight_delay = "1"; + message_delay_time = "1"; + progressbar_look = "━━━"; + colors_enabled = "yes"; + empty_tag_color = "red"; + statusbar_color = "blue"; + state_line_color = "black"; + state_flags_color = "default"; + main_window_color = "blue"; + header_window_color = "white"; + alternative_ui_separator_color = "black"; + window_border_color = "green"; + active_window_border = "red"; + volume_color = "default"; + progressbar_color = "black"; + progressbar_elapsed_color = "blue"; + statusbar_time_color = "blue"; + player_state_color = "default"; + display_bitrate = "yes"; + autocenter_mode = "yes"; + centered_cursor = "yes"; + titles_visibility = "no"; + enable_window_title = "yes"; + statusbar_visibility = "yes"; + empty_tag_marker=""; + mouse_support = "yes"; + header_visibility = "no"; + display_remaining_time = "no"; + ask_before_clearing_playlists = "yes"; + discard_colors_if_item_is_selected = "yes"; + user_interface = "alternative"; + default_find_mode = "wrapped"; + lyrics_directory = "~/.lyrics"; + follow_now_playing_lyrics = "yes"; + store_lyrics_in_song_dir = "no"; + ignore_leading_the = "yes"; + lines_scrolled = "1"; + mouse_list_scroll_whole_page = "no"; + show_hidden_files_in_local_browser = "no"; + startup_screen = "playlist"; + execute_on_song_change="/home/dobbie/.bin/np"; + connected_message_on_startup = "no"; + playlist_separate_albums = "no"; + allow_for_physical_item_deletion = "no"; + visualizer_in_stereo = "yes"; + visualizer_data_source = "/tmp/mpd.fifo"; + visualizer_type = "wave_filled"; + visualizer_look = "▉▋"; + }; }; }; }; - } diff --git a/modules/tui/newsboat.nix b/modules/tui/newsboat.nix index 5fa69f2..ac50c83 100644 --- a/modules/tui/newsboat.nix +++ b/modules/tui/newsboat.nix @@ -25,6 +25,7 @@ in { bind-key d pagedown bind-key u pageup bind-key a toggle-article-read + macro x set browser "setsid -f mpv --really-quiet --no-terminal" ; open-in-browser ; set browser librewolf color listnormal color15 default color listnormal_unread color2 default @@ -50,6 +51,14 @@ in { title = "NixOS Weekly"; url = "https://weekly.nixos.org/feeds/all.rss.xml"; } + { + title = "Veronica Explains"; + url = "https://www.youtube.com/feeds/videos.xml?channel_id=UCMiyV_Ib77XLpzHPQH_q0qQ"; + } + { + title = "Mental Outlaw"; + url = "https://www.youtube.com/feeds/videos.xml?channel_id=UC7YOGHUfC1Tb6E4pudI9STA"; + } { title = "Hacker News"; url = "https://hnrss.org/newest"; From 6dbc607ae5d3579a2fba4de16a64f2b3eced1170 Mon Sep 17 00:00:00 2001 From: larszauberer Date: Tue, 23 Apr 2024 16:34:33 +0200 Subject: [PATCH 39/50] next nvidia fix --- hosts/lars/kronos/programs.nix | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hosts/lars/kronos/programs.nix b/hosts/lars/kronos/programs.nix index 3341de5..80f4b07 100644 --- a/hosts/lars/kronos/programs.nix +++ b/hosts/lars/kronos/programs.nix @@ -1,6 +1,21 @@ { config, lib, pkgs, ... }: +let + newer_egl-wayland = self: super: { + egl-wayland = super.xwayland.overrideAttrs (prev: { + # version = "23.2.6-HEAD"; + src = pkgs.fetchFromGitHab { + # domain = "gitlab.freedesktop.org"; + owner = "NVIDIA"; + repo = "egl-wayland"; + rev = "067e43d0d4af82e4ea3fdc8ce476e6a24f69956f"; + sha256 = "93DzgA8nXVodDvllCOIuTtOYWpUdXwzPIGpi2SUSNqo="; + }; + }); + }; +in { environment.systemPackages = with pkgs; [ + egl-wayland ]; } From d868c9496b9bcdb2e300872be83b001d8eb7e580 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Wed, 24 Apr 2024 02:38:20 +0200 Subject: [PATCH 40/50] added wg-tools, tried to fix themes --- hosts/vali/mars/configuration.nix | 15 ++---- hosts/vali/mars/programs.nix | 5 +- hosts/vali/mars/temp | 78 ------------------------------- 3 files changed, 8 insertions(+), 90 deletions(-) delete mode 100644 hosts/vali/mars/temp diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index 163e6e9..cfb6765 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -34,12 +34,7 @@ } ''; }; -/* options.ui.darkTheme = { - type = lib.types.bool; - default = true; - example = false; - description = "If ui programs should use a dark or light theme"; - };*/ + modules = { other = { system = { @@ -82,18 +77,18 @@ size = 24; }; gtk = { - enable = true; + enable = false; package = pkgs.gruvbox-gtk-theme; name = "Gruvbox-Dark-BL"; iconTheme = { - name = "Papirus-Dark"; - package = pkgs.catppuccin-papirus-folders; + # name = "Papirus-Dark"; + # package = pkgs.catppuccin-papirus-folders; }; }; qt = { enable = true; package = pkgs.kde-gruvbox; - name = "konsole"; + name = "Gruvbox"; }; }; }; diff --git a/hosts/vali/mars/programs.nix b/hosts/vali/mars/programs.nix index a23fcb8..9c50ac6 100644 --- a/hosts/vali/mars/programs.nix +++ b/hosts/vali/mars/programs.nix @@ -7,7 +7,6 @@ in { alacritty alsa-utils asciinema -# betterbird bibata-cursors blanket dig @@ -47,6 +46,7 @@ in { neovim networkmanagerapplet nextcloud-client + nicotine-plus pamixer pavucontrol pcmanfm @@ -55,6 +55,7 @@ in { playerctl polkit python3 + python311Packages.pygame qbittorrent ripgrep rustdesk @@ -74,10 +75,10 @@ in { unzip util-linux ventoy-full - vesktop vlc weechat wget + wireguard-tools xclip xfce.thunar xorg.libX11.dev diff --git a/hosts/vali/mars/temp b/hosts/vali/mars/temp deleted file mode 100644 index e2d9650..0000000 --- a/hosts/vali/mars/temp +++ /dev/null @@ -1,78 +0,0 @@ -{ config, inputs, pkgs, ... }: -let - username = config.myOptions.other.system.username; -in { - home-manager.users.${username} = { - home.packages = let - fenix = inputs.fenix.packages.${pkgs.system}; - - in with pkgs; [ - alacritty - alsa-utils - asciinema - betterbird - bibata-cursors - dig - easyeffects - element-desktop - eza - fastfetch - (fenix.complete.withComponents [ - "cargo" - "clippy" - "rust-src" - "rustc" - "rustfmt" - ]) - ffmpeg_6-full - flameshot - foot - gcc - gdb - grimblast - git - httpie - imagemagick - keepassxc - krita - lazygit - libreoffice-fresh - neofetch - neovim - networkmanagerapplet - nextcloud-client - pamixer - pavucontrol - pcmanfm - pfetch - playerctl - polkit - python3 - qbittorrent - ripgrep - rustdesk - rofi - scc - sherlock - signal-desktop-beta - smartmontools - st - steam - strawberry.strawberry-wrapped - telegram-desktop - texliveFull - thunderbird - tor-browser-bundle-bin - trash-cli - tree - unzip - ventoy-full - vesktop - vlc - xclip - yt-dlp - zathura - zip - ]; - }; -} From f45b4ccc02f90441cc2357b52743eb14a9f507b0 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Wed, 24 Apr 2024 23:16:57 +0200 Subject: [PATCH 41/50] fixed vesktop --- hosts/vali/mars/configuration.nix | 2 ++ modules/gui/default.nix | 2 +- modules/gui/vesktop.nix | 4 ++-- modules/other/system.nix | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index cfb6765..55ac9b4 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -23,6 +23,8 @@ security.sudo.package = pkgs.sudo.override { withInsults = true; }; security.polkit.enable = true; programs.kdeconnect.enable = true; + programs.neovim.defaultEditor = true; + programs.adb.enable = true; services.mpd = { enable = true; musicDirectory = "/home/vali/Nextcloud/Media/Music/"; diff --git a/modules/gui/default.nix b/modules/gui/default.nix index bfaf22b..5506af3 100644 --- a/modules/gui/default.nix +++ b/modules/gui/default.nix @@ -12,7 +12,7 @@ _: { ./rofi.nix ./WM ./kitty.nix -# ./vivado.nix + ./vivado.nix ./alacritty.nix ./firefox.nix ./steam.nix diff --git a/modules/gui/vesktop.nix b/modules/gui/vesktop.nix index a209062..d6df275 100644 --- a/modules/gui/vesktop.nix +++ b/modules/gui/vesktop.nix @@ -33,8 +33,8 @@ in { autoUpdate = false; autoUpdateNotification = false; useQuickCss = true; - themeLinks = []; - enabledThemes = ["Catppuccin.theme.css"]; + themeLinks = ["https://github.com/Costeer/Gruvbox-Material-Themes/blob/main/Discord%20Theme/gruvboxmaterial.theme.css"]; + enabledThemes = ["gruvboxmaterial.theme.css"]; enableReactDevtools = true; frameless = false; transparent = false; diff --git a/modules/other/system.nix b/modules/other/system.nix index ab21d91..36f18f9 100644 --- a/modules/other/system.nix +++ b/modules/other/system.nix @@ -27,7 +27,7 @@ in { users.users.${cfg.username} = { isNormalUser = true; - extraGroups = [ "wheel" ]; + extraGroups = [ "wheel" "adbusers" ]; }; }; } From 96bcac1b41bd60dc614063ea2a92e88ced48a8cf Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Thu, 25 Apr 2024 08:28:37 +0200 Subject: [PATCH 42/50] Remove element from autostart --- hosts/lars/hyprland.nix | 2 +- modules/other/xdg.nix | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hosts/lars/hyprland.nix b/hosts/lars/hyprland.nix index cd12319..e1b3ad5 100644 --- a/hosts/lars/hyprland.nix +++ b/hosts/lars/hyprland.nix @@ -93,7 +93,7 @@ in { "swww init & swww img ${gitPath}/${cfg.wallpaper}" "keepassxc" "nextcloud" - "element-desktop --ozone-platform=wayland --enable-features=UseOzonePlatform --enable-features=WaylandWindowDecorations --enable-features=WebRTCPipeWireCpaturer --disable-gpu" + # "element-desktop --ozone-platform=wayland --enable-features=UseOzonePlatform --enable-features=WaylandWindowDecorations --enable-features=WebRTCPipeWireCpaturer --disable-gpu" ]; bind = [ diff --git a/modules/other/xdg.nix b/modules/other/xdg.nix index 2b71588..f22afba 100644 --- a/modules/other/xdg.nix +++ b/modules/other/xdg.nix @@ -11,6 +11,7 @@ media_player = "mpv.desktop"; image_viewer = "imv.desktop"; text_editor = "nvim.desktop"; + terminal = "alacritty.desktop"; in { /* environment.sessionVariables = { @@ -42,6 +43,9 @@ in { xdg-desktop-portal-gtk ]; }; + environment.sessionVariables = { + TERMINAL = "${terminal}"; + }; home-manager.users.${username} = { xdg.configFile."npm/npmrc".text = '' From 4362ece80e7261f9cfd6d9f4c6c74882ba038765 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sat, 27 Apr 2024 21:31:24 +0200 Subject: [PATCH 43/50] Added teamspeak to download --- hosts/lars/kronos/programs.nix | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hosts/lars/kronos/programs.nix b/hosts/lars/kronos/programs.nix index 80f4b07..04caf49 100644 --- a/hosts/lars/kronos/programs.nix +++ b/hosts/lars/kronos/programs.nix @@ -1,6 +1,6 @@ -{ config, lib, pkgs, ... }: - +{ config, lib, pkgs, inputs, ... }: let + username = config.modules.other.system.username; newer_egl-wayland = self: super: { egl-wayland = super.xwayland.overrideAttrs (prev: { # version = "23.2.6-HEAD"; @@ -18,4 +18,12 @@ in environment.systemPackages = with pkgs; [ egl-wayland ]; + home-manager.users.${username} = { + home.packages = let + fenix = inputs.fenix.packages.${pkgs.system}; + + in with pkgs; [ + teamspeak_client + ]; + }; } From 1ee4423625c0775856364d43d4155b0347c90e54 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Sat, 27 Apr 2024 23:46:38 +0200 Subject: [PATCH 44/50] added awesome! --- hosts/vali/mars/awesome/awesome.nix | 23 +++++++++++++++++++++++ hosts/vali/mars/configuration.nix | 1 + hosts/vali/mars/default.nix | 1 + hosts/vali/mars/dwm/dwm.nix | 15 +++------------ hosts/vali/mars/programs.nix | 8 +++++++- 5 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 hosts/vali/mars/awesome/awesome.nix diff --git a/hosts/vali/mars/awesome/awesome.nix b/hosts/vali/mars/awesome/awesome.nix new file mode 100644 index 0000000..b9c2f20 --- /dev/null +++ b/hosts/vali/mars/awesome/awesome.nix @@ -0,0 +1,23 @@ +{ pkgs, lib, config, callPackage, ... }: +with lib; let + username = config.modules.other.system.username; + cfg = config.modules.programs.awesome; +in { + options.modules.programs.dwm.enable = mkEnableOption "awesome"; + + config = mkIf cfg.enable { + services.xserver = { + enable = true; + layout = "de, de"; + xkbVariant = ",neo "; + xkbOptions = "grp:alt_space_toggle"; + windowManager.awesome = { + enable = true; + }; + displayManager = { + sddm.enable = true; + setupCommands = "${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-1 --rotate normal --output DP-2 --rotate normal --left-of HDMI-1 --output HDMI-0 --right-of HDMI-1"; + }; + }; + }; +} diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index 55ac9b4..a2a90da 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -56,6 +56,7 @@ mpv.enable = true; kitty.enable = true; dwm.enable = true; + awesome.enable = true; newsboat.enable = true; #git = { # enable = true; diff --git a/hosts/vali/mars/default.nix b/hosts/vali/mars/default.nix index acef5b9..c1106bb 100644 --- a/hosts/vali/mars/default.nix +++ b/hosts/vali/mars/default.nix @@ -6,6 +6,7 @@ _: { ./profile.nix ./i3 ./dwm/dwm.nix + ./awesome/awesome.nix ]; } diff --git a/hosts/vali/mars/dwm/dwm.nix b/hosts/vali/mars/dwm/dwm.nix index bc7670e..3de5554 100644 --- a/hosts/vali/mars/dwm/dwm.nix +++ b/hosts/vali/mars/dwm/dwm.nix @@ -1,9 +1,9 @@ { pkgs, lib, config, callPackage, ... }: with lib; let username = config.modules.other.system.username; - cfg = config.modules.programs.dwm; + cfg = config.modules.programs.awesome; in { - options.modules.programs.dwm.enable = mkEnableOption "dwm"; + options.modules.programs.awesome.enable = mkEnableOption "awesome"; config = mkIf cfg.enable { services.xserver = { @@ -11,7 +11,7 @@ in { layout = "de, de"; xkbVariant = ",neo "; xkbOptions = "grp:alt_space_toggle"; - windowManager.dwm = { + windowManager.awesome= { enable = true; }; displayManager = { @@ -19,14 +19,5 @@ in { setupCommands = "${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-1 --rotate normal --output DP-2 --rotate normal --left-of HDMI-1 --output HDMI-0 --right-of HDMI-1"; }; }; - nixpkgs.overlays = [ - (final: prev: { - dwm = prev.dwm.overrideAttrs (old: {src = ./dwm-6.5;}); - dmenu = prev.dmenu.overrideAttrs (old: {src = ./dmenu-5.3;}); - }) - ]; - environment.systemPackages = with pkgs; [ - # (dmenu.overrideAttrs (oldAttrs: rec { src = ./dmenu-5.3; })) - ]; }; } diff --git a/hosts/vali/mars/programs.nix b/hosts/vali/mars/programs.nix index 9c50ac6..338b094 100644 --- a/hosts/vali/mars/programs.nix +++ b/hosts/vali/mars/programs.nix @@ -6,9 +6,11 @@ in { environment.systemPackages = with pkgs; [ alacritty alsa-utils + android-tools asciinema bibata-cursors blanket + blugon dig dmenu easyeffects @@ -47,15 +49,16 @@ in { networkmanagerapplet nextcloud-client nicotine-plus + nitrogen pamixer pavucontrol + picom pcmanfm pdfarranger pfetch playerctl polkit python3 - python311Packages.pygame qbittorrent ripgrep rustdesk @@ -65,9 +68,11 @@ in { signal-desktop-beta smartmontools spotube + steam strawberry telegram-desktop texliveFull + trilium-desktop thunderbird tor-browser-bundle-bin trash-cli @@ -84,6 +89,7 @@ in { xorg.libX11.dev xorg.libXft xorg.libXinerama + xournalpp yt-dlp zathura zip From 521403a01eda480322f9b8bb3b6cce0ee8bed59d Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 28 Apr 2024 12:15:19 +0200 Subject: [PATCH 45/50] Add wine --- hosts/lars/programs.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index ed78f81..c636349 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -65,6 +65,7 @@ in { fzf tldr feh + wine ]; }; } From 545220784e3286585b5f1f3ee51b73d5a720dd58 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 28 Apr 2024 12:32:54 +0200 Subject: [PATCH 46/50] Openssh connection --- hosts/lars/kronos/configuration.nix | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hosts/lars/kronos/configuration.nix b/hosts/lars/kronos/configuration.nix index 40e90e7..fff55b7 100644 --- a/hosts/lars/kronos/configuration.nix +++ b/hosts/lars/kronos/configuration.nix @@ -41,6 +41,12 @@ }; }; - services.getty.autologinUser = "lars"; - services.flatpak.enable = true; + services = { + flatpak.enable = true; + getty.autologinUser = "lars"; + openssh = { + enable = true; + passwordAuthentication = true; + }; + }; } From 1d8642fe8a23fe382c3c94873e9b06040df04068 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 28 Apr 2024 22:01:11 +0200 Subject: [PATCH 47/50] ssh switch to key auth --- hosts/lars/kronos/configuration.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/lars/kronos/configuration.nix b/hosts/lars/kronos/configuration.nix index fff55b7..480e44e 100644 --- a/hosts/lars/kronos/configuration.nix +++ b/hosts/lars/kronos/configuration.nix @@ -46,7 +46,7 @@ getty.autologinUser = "lars"; openssh = { enable = true; - passwordAuthentication = true; + passwordAuthentication = false; }; }; } From ed32efa0ca015ee6eece1aaa433944f60c4f6d45 Mon Sep 17 00:00:00 2001 From: LarsZauberer Date: Sun, 28 Apr 2024 22:01:28 +0200 Subject: [PATCH 48/50] Setting up java development --- hosts/lars/default.nix | 7 +++++++ hosts/lars/hyprland.nix | 1 + hosts/lars/programs.nix | 1 + 3 files changed, 9 insertions(+) diff --git a/hosts/lars/default.nix b/hosts/lars/default.nix index fc0fb51..91c4ac8 100644 --- a/hosts/lars/default.nix +++ b/hosts/lars/default.nix @@ -130,6 +130,13 @@ id = [ "28067815" "28067816" ]; }; + programs = { + java = { + enable = true; + package = pkgs.jdk21_headless; + }; + }; + # SSH AGENT programs.ssh.startAgent = true; services.gnome3.gnome-keyring.enable = false; diff --git a/hosts/lars/hyprland.nix b/hosts/lars/hyprland.nix index e1b3ad5..6864d3f 100644 --- a/hosts/lars/hyprland.nix +++ b/hosts/lars/hyprland.nix @@ -43,6 +43,7 @@ in { XDG_SESSION_DESKTOP = "Hyprland"; GTK_USE_PORTAL = "1"; NIXOS_XDG_OPEN_USE_PORTAL = "1"; + NIXOS_OZONE_WL = "1"; }; programs.hyprland = { diff --git a/hosts/lars/programs.nix b/hosts/lars/programs.nix index c636349..2feb30a 100644 --- a/hosts/lars/programs.nix +++ b/hosts/lars/programs.nix @@ -66,6 +66,7 @@ in { tldr feh wine + eclipses.eclipse-java ]; }; } From 19bb0985337bdbb398bdd3614bd8802cecf2fb53 Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Sun, 28 Apr 2024 22:41:27 +0200 Subject: [PATCH 49/50] added fish --- hosts/vali/mars/configuration.nix | 5 +++-- hosts/vali/mars/programs.nix | 9 ++++++--- modules/cli/fish.nix | 2 +- modules/cli/zsh.nix | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index a2a90da..8f34d0f 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -63,11 +63,12 @@ # userName = "vali"; userEmail = "valentin@kaas.cc"; # defaultBranch = "main"; #}; - starship.enable = true; + starship.enable = false; zsh = { enable = true; profiling = false; }; + fish.enable = true; }; services = { pipewire.enable = true; @@ -89,7 +90,7 @@ }; }; qt = { - enable = true; + enable = false; package = pkgs.kde-gruvbox; name = "Gruvbox"; }; diff --git a/hosts/vali/mars/programs.nix b/hosts/vali/mars/programs.nix index 338b094..c62273b 100644 --- a/hosts/vali/mars/programs.nix +++ b/hosts/vali/mars/programs.nix @@ -25,17 +25,19 @@ in { "rustc" "rustfmt" ]) - ffmpeg_6-full + ffmpeg-full + fftw flameshot foot - img2pdf gcc gdb gnumake grimblast git httpie - imagemagick + i3lock + imagemagickBig + img2pdf keepassxc krita lazygit @@ -64,6 +66,7 @@ in { rustdesk rofi scc + scrot sherlock signal-desktop-beta smartmontools diff --git a/modules/cli/fish.nix b/modules/cli/fish.nix index 257f729..22ef906 100644 --- a/modules/cli/fish.nix +++ b/modules/cli/fish.nix @@ -38,6 +38,7 @@ in { plugins = [ ]; shellAliases = { + cl = "clear"; cp = "cp -ivr"; mv = "mv -iv"; @@ -58,7 +59,6 @@ in { woman = "man"; open = "xdg-open"; ":q" = "exit"; - emacs = ":(){ :|:& };:"; } // cfg.extraAliases; }; }; diff --git a/modules/cli/zsh.nix b/modules/cli/zsh.nix index acb9cdd..84a4bb9 100644 --- a/modules/cli/zsh.nix +++ b/modules/cli/zsh.nix @@ -34,7 +34,7 @@ in { config = mkIf cfg.enable { programs.zsh.enable = true; - users.users.${username}.shell = pkgs.zsh; +# users.users.${username}.shell = pkgs.zsh; environment = { shells = [ pkgs.zsh ]; pathsToLink = [ "/share/zsh" ]; From b0271403739f0be2e6c193bb9e782011cb73a5ba Mon Sep 17 00:00:00 2001 From: Charlie Root Date: Mon, 29 Apr 2024 01:29:53 +0200 Subject: [PATCH 50/50] removed dwm and i3, minimizing my config --- hosts/vali/mars/awesome/awesome.nix | 26 +- hosts/vali/mars/configuration.nix | 1 - hosts/vali/mars/default.nix | 2 - hosts/vali/mars/dwm/dmenu-5.3/LICENSE | 30 - hosts/vali/mars/dwm/dmenu-5.3/Makefile | 58 - hosts/vali/mars/dwm/dmenu-5.3/README | 24 - hosts/vali/mars/dwm/dmenu-5.3/arg.h | 49 - hosts/vali/mars/dwm/dmenu-5.3/config.def.h | 23 - hosts/vali/mars/dwm/dmenu-5.3/config.h | 23 - hosts/vali/mars/dwm/dmenu-5.3/config.mk | 32 - hosts/vali/mars/dwm/dmenu-5.3/dmenu | Bin 42560 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/dmenu.1 | 194 -- hosts/vali/mars/dwm/dmenu-5.3/dmenu.c | 796 ------ hosts/vali/mars/dwm/dmenu-5.3/dmenu.o | Bin 32384 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/dmenu_path | 13 - hosts/vali/mars/dwm/dmenu-5.3/dmenu_run | 2 - hosts/vali/mars/dwm/dmenu-5.3/drw.c | 451 ---- hosts/vali/mars/dwm/dmenu-5.3/drw.h | 58 - hosts/vali/mars/dwm/dmenu-5.3/drw.o | Bin 11160 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/shell.nix | 9 - hosts/vali/mars/dwm/dmenu-5.3/stest | Bin 16576 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/stest.1 | 90 - hosts/vali/mars/dwm/dmenu-5.3/stest.c | 109 - hosts/vali/mars/dwm/dmenu-5.3/stest.o | Bin 5328 -> 0 bytes hosts/vali/mars/dwm/dmenu-5.3/util.c | 36 - hosts/vali/mars/dwm/dmenu-5.3/util.h | 9 - hosts/vali/mars/dwm/dmenu-5.3/util.o | Bin 2248 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/.gitignore | 3 - hosts/vali/mars/dwm/dwm-6.5/LICENSE | 38 - hosts/vali/mars/dwm/dwm-6.5/Makefile | 45 - hosts/vali/mars/dwm/dwm-6.5/README | 48 - hosts/vali/mars/dwm/dwm-6.5/config.def.h | 123 - hosts/vali/mars/dwm/dwm-6.5/config.h | 128 - hosts/vali/mars/dwm/dwm-6.5/config.mk | 39 - hosts/vali/mars/dwm/dwm-6.5/drw.c | 450 ---- hosts/vali/mars/dwm/dwm-6.5/drw.h | 58 - hosts/vali/mars/dwm/dwm-6.5/drw.o | Bin 11144 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/dwm | Bin 62920 -> 0 bytes .../dwm-multiple-dynamic-scratchpads.diff | 207 -- .../dwm-scratchpad-20240321-061e9fe.diff | 105 - hosts/vali/mars/dwm/dwm-6.5/dwm.1 | 179 -- hosts/vali/mars/dwm/dwm-6.5/dwm.c | 2319 ----------------- hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig | 2207 ---------------- hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej | 23 - hosts/vali/mars/dwm/dwm-6.5/dwm.o | Bin 59856 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/dwm.png | Bin 373 -> 0 bytes hosts/vali/mars/dwm/dwm-6.5/shell.nix | 9 - hosts/vali/mars/dwm/dwm-6.5/transient.c | 42 - hosts/vali/mars/dwm/dwm-6.5/util.c | 36 - hosts/vali/mars/dwm/dwm-6.5/util.h | 8 - hosts/vali/mars/dwm/dwm-6.5/util.o | Bin 2248 -> 0 bytes hosts/vali/mars/dwm/dwm.nix | 23 - hosts/vali/mars/i3/config | 190 -- hosts/vali/mars/i3/default.nix | 6 - hosts/vali/mars/i3/i3-new.nix | 68 - hosts/vali/mars/i3/i3.nix | 22 - hosts/vali/mars/i3/polybar.sh | 0 hosts/vali/mars/programs.nix | 4 +- 58 files changed, 16 insertions(+), 8399 deletions(-) delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/LICENSE delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/Makefile delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/README delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/arg.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/config.def.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/config.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/config.mk delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/dmenu delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/dmenu.1 delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/dmenu.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/dmenu.o delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/dmenu_path delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/dmenu_run delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/drw.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/drw.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/drw.o delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/shell.nix delete mode 100755 hosts/vali/mars/dwm/dmenu-5.3/stest delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/stest.1 delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/stest.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/stest.o delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/util.c delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/util.h delete mode 100644 hosts/vali/mars/dwm/dmenu-5.3/util.o delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/.gitignore delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/LICENSE delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/Makefile delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/README delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/config.def.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/config.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/config.mk delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/drw.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/drw.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/drw.o delete mode 100755 hosts/vali/mars/dwm/dwm-6.5/dwm delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm-multiple-dynamic-scratchpads.diff delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.1 delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.o delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/dwm.png delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/shell.nix delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/transient.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/util.c delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/util.h delete mode 100644 hosts/vali/mars/dwm/dwm-6.5/util.o delete mode 100644 hosts/vali/mars/dwm/dwm.nix delete mode 100644 hosts/vali/mars/i3/config delete mode 100644 hosts/vali/mars/i3/default.nix delete mode 100644 hosts/vali/mars/i3/i3-new.nix delete mode 100644 hosts/vali/mars/i3/i3.nix delete mode 100644 hosts/vali/mars/i3/polybar.sh diff --git a/hosts/vali/mars/awesome/awesome.nix b/hosts/vali/mars/awesome/awesome.nix index b9c2f20..d3080eb 100644 --- a/hosts/vali/mars/awesome/awesome.nix +++ b/hosts/vali/mars/awesome/awesome.nix @@ -3,21 +3,21 @@ with lib; let username = config.modules.other.system.username; cfg = config.modules.programs.awesome; in { - options.modules.programs.dwm.enable = mkEnableOption "awesome"; + options.modules.programs.awesome.enable = mkEnableOption "awesome"; config = mkIf cfg.enable { - services.xserver = { - enable = true; - layout = "de, de"; - xkbVariant = ",neo "; - xkbOptions = "grp:alt_space_toggle"; - windowManager.awesome = { - enable = true; + services = { + displayManager.sddm.enable = true; + xserver = { + enable = true; + xkb = { + layout = "de, de"; + variant = ",neo "; + options = "grp:alt_space_toggle"; + }; + windowManager.awesome.enable = true; + displayManager.setupCommands = "${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-1 --rotate normal --output DP-2 --rotate normal --left-of HDMI-1 --output HDMI-0 --right-of HDMI-1"; + }; }; - displayManager = { - sddm.enable = true; - setupCommands = "${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-1 --rotate normal --output DP-2 --rotate normal --left-of HDMI-1 --output HDMI-0 --right-of HDMI-1"; - }; - }; }; } diff --git a/hosts/vali/mars/configuration.nix b/hosts/vali/mars/configuration.nix index 8f34d0f..a3ae599 100644 --- a/hosts/vali/mars/configuration.nix +++ b/hosts/vali/mars/configuration.nix @@ -55,7 +55,6 @@ btop.enable = true; mpv.enable = true; kitty.enable = true; - dwm.enable = true; awesome.enable = true; newsboat.enable = true; #git = { diff --git a/hosts/vali/mars/default.nix b/hosts/vali/mars/default.nix index c1106bb..acd94e4 100644 --- a/hosts/vali/mars/default.nix +++ b/hosts/vali/mars/default.nix @@ -4,8 +4,6 @@ _: { ./programs.nix ./hardware-configuration.nix ./profile.nix - ./i3 - ./dwm/dwm.nix ./awesome/awesome.nix ]; diff --git a/hosts/vali/mars/dwm/dmenu-5.3/LICENSE b/hosts/vali/mars/dwm/dmenu-5.3/LICENSE deleted file mode 100644 index 2a64b28..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -MIT/X Consortium License - -© 2006-2019 Anselm R Garbe -© 2006-2008 Sander van Dijk -© 2006-2007 Michał Janeczek -© 2007 Kris Maglione -© 2009 Gottox -© 2009 Markus Schnalke -© 2009 Evan Gates -© 2010-2012 Connor Lane Smith -© 2014-2022 Hiltjo Posthuma -© 2015-2019 Quentin Rameau - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/hosts/vali/mars/dwm/dmenu-5.3/Makefile b/hosts/vali/mars/dwm/dmenu-5.3/Makefile deleted file mode 100644 index 458c524..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# dmenu - dynamic menu -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dmenu.c stest.c util.c -OBJ = $(SRC:.c=.o) - -all: dmenu stest - -.c.o: - $(CC) -c $(CFLAGS) $< - -config.h: - cp config.def.h $@ - -$(OBJ): arg.h config.h config.mk drw.h - -dmenu: dmenu.o drw.o util.o - $(CC) -o $@ dmenu.o drw.o util.o $(LDFLAGS) - -stest: stest.o - $(CC) -o $@ stest.o $(LDFLAGS) - -clean: - rm -f dmenu stest $(OBJ) dmenu-$(VERSION).tar.gz - -dist: clean - mkdir -p dmenu-$(VERSION) - cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\ - drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\ - dmenu-$(VERSION) - tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION) - gzip dmenu-$(VERSION).tar - rm -rf dmenu-$(VERSION) - -install: all - mkdir -p $(DESTDIR)$(PREFIX)/bin - cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path - chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run - chmod 755 $(DESTDIR)$(PREFIX)/bin/stest - mkdir -p $(DESTDIR)$(MANPREFIX)/man1 - sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - sed "s/VERSION/$(VERSION)/g" < stest.1 > $(DESTDIR)$(MANPREFIX)/man1/stest.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/dmenu.1 - chmod 644 $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -uninstall: - rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\ - $(DESTDIR)$(PREFIX)/bin/dmenu_path\ - $(DESTDIR)$(PREFIX)/bin/dmenu_run\ - $(DESTDIR)$(PREFIX)/bin/stest\ - $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ - $(DESTDIR)$(MANPREFIX)/man1/stest.1 - -.PHONY: all clean dist install uninstall diff --git a/hosts/vali/mars/dwm/dmenu-5.3/README b/hosts/vali/mars/dwm/dmenu-5.3/README deleted file mode 100644 index a8fcdfe..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/README +++ /dev/null @@ -1,24 +0,0 @@ -dmenu - dynamic menu -==================== -dmenu is an efficient dynamic menu for X. - - -Requirements ------------- -In order to build dmenu you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dmenu is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dmenu -(if necessary as root): - - make clean install - - -Running dmenu -------------- -See the man page for details. diff --git a/hosts/vali/mars/dwm/dmenu-5.3/arg.h b/hosts/vali/mars/dwm/dmenu-5.3/arg.h deleted file mode 100644 index e94e02b..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/arg.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copy me if you can. - * by 20h - */ - -#ifndef ARG_H__ -#define ARG_H__ - -extern char *argv0; - -/* use main(int argc, char *argv[]) */ -#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\ - argv[0] && argv[0][0] == '-'\ - && argv[0][1];\ - argc--, argv++) {\ - char argc_;\ - char **argv_;\ - int brk_;\ - if (argv[0][1] == '-' && argv[0][2] == '\0') {\ - argv++;\ - argc--;\ - break;\ - }\ - for (brk_ = 0, argv[0]++, argv_ = argv;\ - argv[0][0] && !brk_;\ - argv[0]++) {\ - if (argv_ != argv)\ - break;\ - argc_ = argv[0][0];\ - switch (argc_) - -#define ARGEND }\ - } - -#define ARGC() argc_ - -#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\ - ((x), abort(), (char *)0) :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\ - (char *)0 :\ - (brk_ = 1, (argv[0][1] != '\0')?\ - (&argv[0][1]) :\ - (argc--, argv++, argv[0]))) - -#endif diff --git a/hosts/vali/mars/dwm/dmenu-5.3/config.def.h b/hosts/vali/mars/dwm/dmenu-5.3/config.def.h deleted file mode 100644 index 1edb647..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/config.def.h +++ /dev/null @@ -1,23 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "monospace:size=10" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/hosts/vali/mars/dwm/dmenu-5.3/config.h b/hosts/vali/mars/dwm/dmenu-5.3/config.h deleted file mode 100644 index 1edb647..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/config.h +++ /dev/null @@ -1,23 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -/* Default settings; can be overriden by command line. */ - -static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ -/* -fn option overrides fonts[0]; default X11 font or font set */ -static const char *fonts[] = { - "monospace:size=10" -}; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeOut] = { "#000000", "#00ffff" }, -}; -/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ -static unsigned int lines = 0; - -/* - * Characters not considered part of a word while deleting words - * for example: " /?\"&[]" - */ -static const char worddelimiters[] = " "; diff --git a/hosts/vali/mars/dwm/dmenu-5.3/config.mk b/hosts/vali/mars/dwm/dmenu-5.3/config.mk deleted file mode 100644 index 137f7c8..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/config.mk +++ /dev/null @@ -1,32 +0,0 @@ -# dmenu version -VERSION = 5.3 - -# paths -PREFIX = /usr/local -MANPREFIX = $(PREFIX)/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = $(X11INC)/freetype2 -#MANPREFIX = ${PREFIX}/man - -# includes and libs -INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) -CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) -LDFLAGS = $(LIBS) - -# compiler and linker -CC = cc diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu b/hosts/vali/mars/dwm/dmenu-5.3/dmenu deleted file mode 100755 index 8906fbffc1fddc3401e9a2b3ca90ab0537e36dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42560 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 -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#ifdef XINERAMA -#include -#endif -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ - * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ - -struct item { - char *text; - struct item *left, *right; - int out; -}; - -static char text[BUFSIZ] = ""; -static char *embed; -static int bh, mw, mh; -static int inputw = 0, promptw; -static int lrpad; /* sum of left and right padding */ -static size_t cursor; -static struct item *items = NULL; -static struct item *matches, *matchend; -static struct item *prev, *curr, *next, *sel; -static int mon = -1, screen; - -static Atom clip, utf8; -static Display *dpy; -static Window root, parentwin, win; -static XIC xic; - -static Drw *drw; -static Clr *scheme[SchemeLast]; - -#include "config.h" - -static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; -static char *(*fstrstr)(const char *, const char *) = strstr; - -static unsigned int -textw_clamp(const char *str, unsigned int n) -{ - unsigned int w = drw_fontset_getwidth_clamp(drw, str, n) + lrpad; - return MIN(w, n); -} - -static void -appenditem(struct item *item, struct item **list, struct item **last) -{ - if (*last) - (*last)->right = item; - else - *list = item; - - item->left = *last; - item->right = NULL; - *last = item; -} - -static void -calcoffsets(void) -{ - int i, n; - - if (lines > 0) - n = lines * bh; - else - n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">")); - /* calculate which items will begin the next page and previous page */ - for (i = 0, next = curr; next; next = next->right) - if ((i += (lines > 0) ? bh : textw_clamp(next->text, n)) > n) - break; - for (i = 0, prev = curr; prev && prev->left; prev = prev->left) - if ((i += (lines > 0) ? bh : textw_clamp(prev->left->text, n)) > n) - break; -} - -static void -cleanup(void) -{ - size_t i; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - for (i = 0; i < SchemeLast; i++) - free(scheme[i]); - for (i = 0; items && items[i].text; ++i) - free(items[i].text); - free(items); - drw_free(drw); - XSync(dpy, False); - XCloseDisplay(dpy); -} - -static char * -cistrstr(const char *h, const char *n) -{ - size_t i; - - if (!n[0]) - return (char *)h; - - for (; *h; ++h) { - for (i = 0; n[i] && tolower((unsigned char)n[i]) == - tolower((unsigned char)h[i]); ++i) - ; - if (n[i] == '\0') - return (char *)h; - } - return NULL; -} - -static int -drawitem(struct item *item, int x, int y, int w) -{ - if (item == sel) - drw_setscheme(drw, scheme[SchemeSel]); - else if (item->out) - drw_setscheme(drw, scheme[SchemeOut]); - else - drw_setscheme(drw, scheme[SchemeNorm]); - - return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0); -} - -static void -drawmenu(void) -{ - unsigned int curpos; - struct item *item; - int x = 0, y = 0, w; - - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, 0, 0, mw, mh, 1, 1); - - if (prompt && *prompt) { - drw_setscheme(drw, scheme[SchemeSel]); - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); - } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); - } - - if (lines > 0) { - /* draw vertical list */ - for (item = curr; item != next; item = item->right) - drawitem(item, x, y += bh, mw - x); - } else if (matches) { - /* draw horizontal list */ - x += inputw; - w = TEXTW("<"); - if (curr->left) { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); - } - x += w; - for (item = curr; item != next; item = item->right) - x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">"))); - if (next) { - w = TEXTW(">"); - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0); - } - } - drw_map(drw, win, 0, 0, mw, mh); -} - -static void -grabfocus(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; - Window focuswin; - int i, revertwin; - - for (i = 0; i < 100; ++i) { - XGetInputFocus(dpy, &focuswin, &revertwin); - if (focuswin == win) - return; - XSetInputFocus(dpy, win, RevertToParent, CurrentTime); - nanosleep(&ts, NULL); - } - die("cannot grab focus"); -} - -static void -grabkeyboard(void) -{ - struct timespec ts = { .tv_sec = 0, .tv_nsec = 1000000 }; - int i; - - if (embed) - return; - /* try to grab keyboard, we may have to wait for another process to ungrab */ - for (i = 0; i < 1000; i++) { - if (XGrabKeyboard(dpy, DefaultRootWindow(dpy), True, GrabModeAsync, - GrabModeAsync, CurrentTime) == GrabSuccess) - return; - nanosleep(&ts, NULL); - } - die("cannot grab keyboard"); -} - -static void -match(void) -{ - static char **tokv = NULL; - static int tokn = 0; - - char buf[sizeof text], *s; - int i, tokc = 0; - size_t len, textsize; - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; - - strcpy(buf, text); - /* separate input text into tokens to be matched individually */ - for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " ")) - if (++tokc > tokn && !(tokv = realloc(tokv, ++tokn * sizeof *tokv))) - die("cannot realloc %zu bytes:", tokn * sizeof *tokv); - len = tokc ? strlen(tokv[0]) : 0; - - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; - textsize = strlen(text) + 1; - for (item = items; item && item->text; item++) { - for (i = 0; i < tokc; i++) - if (!fstrstr(item->text, tokv[i])) - break; - if (i != tokc) /* not all tokens match */ - continue; - /* exact matches go first, then prefixes, then substrings */ - if (!tokc || !fstrncmp(text, item->text, textsize)) - appenditem(item, &matches, &matchend); - else if (!fstrncmp(tokv[0], item->text, len)) - appenditem(item, &lprefix, &prefixend); - else - appenditem(item, &lsubstr, &substrend); - } - if (lprefix) { - if (matches) { - matchend->right = lprefix; - lprefix->left = matchend; - } else - matches = lprefix; - matchend = prefixend; - } - if (lsubstr) { - if (matches) { - matchend->right = lsubstr; - lsubstr->left = matchend; - } else - matches = lsubstr; - matchend = substrend; - } - curr = sel = matches; - calcoffsets(); -} - -static void -insert(const char *str, ssize_t n) -{ - if (strlen(text) + n > sizeof text - 1) - return; - /* move existing text out of the way, insert new text, and update cursor */ - memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); - if (n > 0) - memcpy(&text[cursor], str, n); - cursor += n; - match(); -} - -static size_t -nextrune(int inc) -{ - ssize_t n; - - /* return location of next utf8 rune in the given direction (+1 or -1) */ - for (n = cursor + inc; n + inc >= 0 && (text[n] & 0xc0) == 0x80; n += inc) - ; - return n; -} - -static void -movewordedge(int dir) -{ - if (dir < 0) { /* move cursor to the start of the word*/ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - cursor = nextrune(-1); - } else { /* move cursor to the end of the word */ - while (text[cursor] && strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - while (text[cursor] && !strchr(worddelimiters, text[cursor])) - cursor = nextrune(+1); - } -} - -static void -keypress(XKeyEvent *ev) -{ - char buf[64]; - int len; - KeySym ksym = NoSymbol; - Status status; - - len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status); - switch (status) { - default: /* XLookupNone, XBufferOverflow */ - return; - case XLookupChars: /* composed string from input method */ - goto insert; - case XLookupKeySym: - case XLookupBoth: /* a KeySym and a string are returned: use keysym */ - break; - } - - if (ev->state & ControlMask) { - switch(ksym) { - case XK_a: ksym = XK_Home; break; - case XK_b: ksym = XK_Left; break; - case XK_c: ksym = XK_Escape; break; - case XK_d: ksym = XK_Delete; break; - case XK_e: ksym = XK_End; break; - case XK_f: ksym = XK_Right; break; - case XK_g: ksym = XK_Escape; break; - case XK_h: ksym = XK_BackSpace; break; - case XK_i: ksym = XK_Tab; break; - case XK_j: /* fallthrough */ - case XK_J: /* fallthrough */ - case XK_m: /* fallthrough */ - case XK_M: ksym = XK_Return; ev->state &= ~ControlMask; break; - case XK_n: ksym = XK_Down; break; - case XK_p: ksym = XK_Up; break; - - case XK_k: /* delete right */ - text[cursor] = '\0'; - match(); - break; - case XK_u: /* delete left */ - insert(NULL, 0 - cursor); - break; - case XK_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) - insert(NULL, nextrune(-1) - cursor); - break; - case XK_y: /* paste selection */ - case XK_Y: - XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY, - utf8, utf8, win, CurrentTime); - return; - case XK_Left: - case XK_KP_Left: - movewordedge(-1); - goto draw; - case XK_Right: - case XK_KP_Right: - movewordedge(+1); - goto draw; - case XK_Return: - case XK_KP_Enter: - break; - case XK_bracketleft: - cleanup(); - exit(1); - default: - return; - } - } else if (ev->state & Mod1Mask) { - switch(ksym) { - case XK_b: - movewordedge(-1); - goto draw; - case XK_f: - movewordedge(+1); - goto draw; - case XK_g: ksym = XK_Home; break; - case XK_G: ksym = XK_End; break; - case XK_h: ksym = XK_Up; break; - case XK_j: ksym = XK_Next; break; - case XK_k: ksym = XK_Prior; break; - case XK_l: ksym = XK_Down; break; - default: - return; - } - } - - switch(ksym) { - default: -insert: - if (!iscntrl((unsigned char)*buf)) - insert(buf, len); - break; - case XK_Delete: - case XK_KP_Delete: - if (text[cursor] == '\0') - return; - cursor = nextrune(+1); - /* fallthrough */ - case XK_BackSpace: - if (cursor == 0) - return; - insert(NULL, nextrune(-1) - cursor); - break; - case XK_End: - case XK_KP_End: - if (text[cursor] != '\0') { - cursor = strlen(text); - break; - } - if (next) { - /* jump to end of list and position items in reverse */ - curr = matchend; - calcoffsets(); - curr = prev; - calcoffsets(); - while (next && (curr = curr->right)) - calcoffsets(); - } - sel = matchend; - break; - case XK_Escape: - cleanup(); - exit(1); - case XK_Home: - case XK_KP_Home: - if (sel == matches) { - cursor = 0; - break; - } - sel = curr = matches; - calcoffsets(); - break; - case XK_Left: - case XK_KP_Left: - if (cursor > 0 && (!sel || !sel->left || lines > 0)) { - cursor = nextrune(-1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Up: - case XK_KP_Up: - if (sel && sel->left && (sel = sel->left)->right == curr) { - curr = prev; - calcoffsets(); - } - break; - case XK_Next: - case XK_KP_Next: - if (!next) - return; - sel = curr = next; - calcoffsets(); - break; - case XK_Prior: - case XK_KP_Prior: - if (!prev) - return; - sel = curr = prev; - calcoffsets(); - break; - case XK_Return: - case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); - if (!(ev->state & ControlMask)) { - cleanup(); - exit(0); - } - if (sel) - sel->out = 1; - break; - case XK_Right: - case XK_KP_Right: - if (text[cursor] != '\0') { - cursor = nextrune(+1); - break; - } - if (lines > 0) - return; - /* fallthrough */ - case XK_Down: - case XK_KP_Down: - if (sel && sel->right && (sel = sel->right) == next) { - curr = next; - calcoffsets(); - } - break; - case XK_Tab: - if (!sel) - return; - cursor = strnlen(sel->text, sizeof text - 1); - memcpy(text, sel->text, cursor); - text[cursor] = '\0'; - match(); - break; - } - -draw: - drawmenu(); -} - -static void -paste(void) -{ - char *p, *q; - int di; - unsigned long dl; - Atom da; - - /* we have been given the current selection, now insert it into input */ - if (XGetWindowProperty(dpy, win, utf8, 0, (sizeof text / 4) + 1, False, - utf8, &da, &di, &dl, &dl, (unsigned char **)&p) - == Success && p) { - insert(p, (q = strchr(p, '\n')) ? q - p : (ssize_t)strlen(p)); - XFree(p); - } - drawmenu(); -} - -static void -readstdin(void) -{ - char *line = NULL; - size_t i, itemsiz = 0, linesiz = 0; - ssize_t len; - - /* read each line from stdin and add it to the item list */ - for (i = 0; (len = getline(&line, &linesiz, stdin)) != -1; i++) { - if (i + 1 >= itemsiz) { - itemsiz += 256; - if (!(items = realloc(items, itemsiz * sizeof(*items)))) - die("cannot realloc %zu bytes:", itemsiz * sizeof(*items)); - } - if (line[len - 1] == '\n') - line[len - 1] = '\0'; - if (!(items[i].text = strdup(line))) - die("strdup:"); - - items[i].out = 0; - } - free(line); - if (items) - items[i].text = NULL; - lines = MIN(lines, i); -} - -static void -run(void) -{ - XEvent ev; - - while (!XNextEvent(dpy, &ev)) { - if (XFilterEvent(&ev, win)) - continue; - switch(ev.type) { - case DestroyNotify: - if (ev.xdestroywindow.window != win) - break; - cleanup(); - exit(1); - case Expose: - if (ev.xexpose.count == 0) - drw_map(drw, win, 0, 0, mw, mh); - break; - case FocusIn: - /* regrab focus from parent window */ - if (ev.xfocus.window != win) - grabfocus(); - break; - case KeyPress: - keypress(&ev.xkey); - break; - case SelectionNotify: - if (ev.xselection.property == utf8) - paste(); - break; - case VisibilityNotify: - if (ev.xvisibility.state != VisibilityUnobscured) - XRaiseWindow(dpy, win); - break; - } - } -} - -static void -setup(void) -{ - int x, y, i, j; - unsigned int du; - XSetWindowAttributes swa; - XIM xim; - Window w, dw, *dws; - XWindowAttributes wa; - XClassHint ch = {"dmenu", "dmenu"}; -#ifdef XINERAMA - XineramaScreenInfo *info; - Window pw; - int a, di, n, area = 0; -#endif - /* init appearance */ - for (j = 0; j < SchemeLast; j++) - scheme[j] = drw_scm_create(drw, colors[j], 2); - - clip = XInternAtom(dpy, "CLIPBOARD", False); - utf8 = XInternAtom(dpy, "UTF8_STRING", False); - - /* calculate menu geometry */ - bh = drw->fonts->h + 2; - lines = MAX(lines, 0); - mh = (lines + 1) * bh; -#ifdef XINERAMA - i = 0; - if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { - XGetInputFocus(dpy, &w, &di); - if (mon >= 0 && mon < n) - i = mon; - else if (w != root && w != PointerRoot && w != None) { - /* find top-level window containing current input focus */ - do { - if (XQueryTree(dpy, (pw = w), &dw, &w, &dws, &du) && dws) - XFree(dws); - } while (w != root && w != pw); - /* find xinerama screen with which the window intersects most */ - if (XGetWindowAttributes(dpy, pw, &wa)) - for (j = 0; j < n; j++) - if ((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { - area = a; - i = j; - } - } - /* no focused window is on screen, so use pointer location instead */ - if (mon < 0 && !area && XQueryPointer(dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) - for (i = 0; i < n; i++) - if (INTERSECT(x, y, 1, 1, info[i]) != 0) - break; - - x = info[i].x_org; - y = info[i].y_org + (topbar ? 0 : info[i].height - mh); - mw = info[i].width; - XFree(info); - } else -#endif - { - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - x = 0; - y = topbar ? 0 : wa.height - mh; - mw = wa.width; - } - promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = mw / 3; /* input width: ~33% of monitor width */ - match(); - - /* create menu window */ - swa.override_redirect = True; - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; - swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask; - win = XCreateWindow(dpy, root, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); - XSetClassHint(dpy, win, &ch); - - - /* input methods */ - if ((xim = XOpenIM(dpy, NULL, NULL, NULL)) == NULL) - die("XOpenIM failed: could not open input device"); - - xic = XCreateIC(xim, XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, win, XNFocusWindow, win, NULL); - - XMapRaised(dpy, win); - if (embed) { - XReparentWindow(dpy, win, parentwin, x, y); - XSelectInput(dpy, parentwin, FocusChangeMask | SubstructureNotifyMask); - if (XQueryTree(dpy, parentwin, &dw, &w, &dws, &du) && dws) { - for (i = 0; i < du && dws[i] != win; ++i) - XSelectInput(dpy, dws[i], FocusChangeMask); - XFree(dws); - } - grabfocus(); - } - drw_resize(drw, mw, mh); - drawmenu(); -} - -static void -usage(void) -{ - die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); -} - -int -main(int argc, char *argv[]) -{ - XWindowAttributes wa; - int i, fast = 0; - - for (i = 1; i < argc; i++) - /* these options take no arguments */ - if (!strcmp(argv[i], "-v")) { /* prints version information */ - puts("dmenu-"VERSION); - exit(0); - } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */ - topbar = 0; - else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ - fast = 1; - else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ - fstrncmp = strncasecmp; - fstrstr = cistrstr; - } else if (i + 1 == argc) - usage(); - /* these options take one argument */ - else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ - lines = atoi(argv[++i]); - else if (!strcmp(argv[i], "-m")) - mon = atoi(argv[++i]); - else if (!strcmp(argv[i], "-p")) /* adds prompt to left of input field */ - prompt = argv[++i]; - else if (!strcmp(argv[i], "-fn")) /* font or font set */ - fonts[0] = argv[++i]; - else if (!strcmp(argv[i], "-nb")) /* normal background color */ - colors[SchemeNorm][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-nf")) /* normal foreground color */ - colors[SchemeNorm][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-sb")) /* selected background color */ - colors[SchemeSel][ColBg] = argv[++i]; - else if (!strcmp(argv[i], "-sf")) /* selected foreground color */ - colors[SchemeSel][ColFg] = argv[++i]; - else if (!strcmp(argv[i], "-w")) /* embedding window id */ - embed = argv[++i]; - else - usage(); - - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("cannot open display"); - screen = DefaultScreen(dpy); - root = RootWindow(dpy, screen); - if (!embed || !(parentwin = strtol(embed, NULL, 0))) - parentwin = root; - if (!XGetWindowAttributes(dpy, parentwin, &wa)) - die("could not get embedding window attributes: 0x%lx", - parentwin); - drw = drw_create(dpy, screen, root, wa.width, wa.height); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - -#ifdef __OpenBSD__ - if (pledge("stdio rpath", NULL) == -1) - die("pledge"); -#endif - - if (fast && !isatty(0)) { - grabkeyboard(); - readstdin(); - } else { - readstdin(); - grabkeyboard(); - } - setup(); - run(); - - return 1; /* unreachable */ -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu.o b/hosts/vali/mars/dwm/dmenu-5.3/dmenu.o deleted file mode 100644 index 75e7e0be9078e3e3c70141fc419ae6da5255619b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32384 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 diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_path b/hosts/vali/mars/dwm/dmenu-5.3/dmenu_path deleted file mode 100755 index 3a7cda7..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_path +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" -cache="$cachedir/dmenu_run" - -[ ! -e "$cachedir" ] && mkdir -p "$cachedir" - -IFS=: -if stest -dqr -n "$cache" $PATH; then - stest -flx $PATH | sort -u | tee "$cache" -else - cat "$cache" -fi diff --git a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_run b/hosts/vali/mars/dwm/dmenu-5.3/dmenu_run deleted file mode 100755 index 834ede5..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/dmenu_run +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/hosts/vali/mars/dwm/dmenu-5.3/drw.c b/hosts/vali/mars/dwm/dmenu-5.3/drw.c deleted file mode 100644 index 78a2b27..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/drw.c +++ /dev/null @@ -1,451 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - int ty, ellipsis_x = 0; - unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len, hash, h0, h1; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0, overflow = 0; - /* keep track of a couple codepoints for which we have no match. */ - static unsigned int nomatches[128], ellipsis_width; - - if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) - return 0; - - if (!render) { - w = invert ? invert : ~invert; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - if (!ellipsis_width && render) - ellipsis_width = drw_fontset_getwidth(drw, "..."); - while (1) { - ew = ellipsis_len = utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); - if (ew + ellipsis_width <= w) { - /* keep track where the ellipsis still fits */ - ellipsis_x = x + ew; - ellipsis_w = w - ew; - ellipsis_len = utf8strlen; - } - - if (ew + tmpw > w) { - overflow = 1; - /* called from drw_fontset_getwidth_clamp(): - * it wants the width AFTER the overflow - */ - if (!render) - x += tmpw; - else - utf8strlen = ellipsis_len; - } else if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - ew += tmpw; - } else { - nextfont = curfont; - } - break; - } - } - - if (overflow || !charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); - } - x += ew; - w -= ew; - } - if (render && overflow) - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); - - if (!*text || overflow) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - hash = (unsigned int)utf8codepoint; - hash = ((hash >> 16) ^ hash) * 0x21F0AAAD; - hash = ((hash >> 15) ^ hash) * 0xD35A2D97; - h0 = ((hash >> 15) ^ hash) % LENGTH(nomatches); - h1 = (hash >> 17) % LENGTH(nomatches); - /* avoid expensive XftFontMatch call when we know we won't find a match */ - if (nomatches[h0] == utf8codepoint || nomatches[h1] == utf8codepoint) - goto no_match; - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - nomatches[nomatches[h0] ? h1 : h0] = utf8codepoint; -no_match: - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -unsigned int -drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) -{ - unsigned int tmp = 0; - if (drw && drw->fonts && text && n) - tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); - return MIN(n, tmp); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/drw.h b/hosts/vali/mars/dwm/dmenu-5.3/drw.h deleted file mode 100644 index fd7631b..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/drw.h +++ /dev/null @@ -1,58 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/hosts/vali/mars/dwm/dmenu-5.3/drw.o b/hosts/vali/mars/dwm/dmenu-5.3/drw.o deleted file mode 100644 index 05bf8b656009a325422f7ddbb5b29a69d329acbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11160 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 diff --git a/hosts/vali/mars/dwm/dmenu-5.3/shell.nix b/hosts/vali/mars/dwm/dmenu-5.3/shell.nix deleted file mode 100644 index 883e00e..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/shell.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ pkgs ? import {} }: - pkgs.mkShell { - nativeBuildInputs = with pkgs; [ - gnumake - xorg.libX11.dev - xorg.libXft - xorg.libXinerama - ]; -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest b/hosts/vali/mars/dwm/dmenu-5.3/stest deleted file mode 100755 index fe4502343d6b4550687dc5874e7330606ff82269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16576 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 ZLS@1GmC=-dr5ZpTa8SD$%tH|9`T_rqok#!x diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest.1 b/hosts/vali/mars/dwm/dmenu-5.3/stest.1 deleted file mode 100644 index 2667d8a..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/stest.1 +++ /dev/null @@ -1,90 +0,0 @@ -.TH STEST 1 dmenu\-VERSION -.SH NAME -stest \- filter a list of files by properties -.SH SYNOPSIS -.B stest -.RB [ -abcdefghlpqrsuwx ] -.RB [ -n -.IR file ] -.RB [ -o -.IR file ] -.RI [ file ...] -.SH DESCRIPTION -.B stest -takes a list of files and filters by the files' properties, analogous to -.IR test (1). -Files which pass all tests are printed to stdout. If no files are given, stest -reads files from stdin. -.SH OPTIONS -.TP -.B \-a -Test hidden files. -.TP -.B \-b -Test that files are block specials. -.TP -.B \-c -Test that files are character specials. -.TP -.B \-d -Test that files are directories. -.TP -.B \-e -Test that files exist. -.TP -.B \-f -Test that files are regular files. -.TP -.B \-g -Test that files have their set-group-ID flag set. -.TP -.B \-h -Test that files are symbolic links. -.TP -.B \-l -Test the contents of a directory given as an argument. -.TP -.BI \-n " file" -Test that files are newer than -.IR file . -.TP -.BI \-o " file" -Test that files are older than -.IR file . -.TP -.B \-p -Test that files are named pipes. -.TP -.B \-q -No files are printed, only the exit status is returned. -.TP -.B \-r -Test that files are readable. -.TP -.B \-s -Test that files are not empty. -.TP -.B \-u -Test that files have their set-user-ID flag set. -.TP -.B \-v -Invert the sense of tests, only failing files pass. -.TP -.B \-w -Test that files are writable. -.TP -.B \-x -Test that files are executable. -.SH EXIT STATUS -.TP -.B 0 -At least one file passed all tests. -.TP -.B 1 -No files passed all tests. -.TP -.B 2 -An error occurred. -.SH SEE ALSO -.IR dmenu (1), -.IR test (1) diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest.c b/hosts/vali/mars/dwm/dmenu-5.3/stest.c deleted file mode 100644 index e27d3a5..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/stest.c +++ /dev/null @@ -1,109 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include - -#include -#include -#include -#include -#include -#include - -#include "arg.h" -char *argv0; - -#define FLAG(x) (flag[(x)-'a']) - -static void test(const char *, const char *); -static void usage(void); - -static int match = 0; -static int flag[26]; -static struct stat old, new; - -static void -test(const char *path, const char *name) -{ - struct stat st, ln; - - if ((!stat(path, &st) && (FLAG('a') || name[0] != '.') /* hidden files */ - && (!FLAG('b') || S_ISBLK(st.st_mode)) /* block special */ - && (!FLAG('c') || S_ISCHR(st.st_mode)) /* character special */ - && (!FLAG('d') || S_ISDIR(st.st_mode)) /* directory */ - && (!FLAG('e') || access(path, F_OK) == 0) /* exists */ - && (!FLAG('f') || S_ISREG(st.st_mode)) /* regular file */ - && (!FLAG('g') || st.st_mode & S_ISGID) /* set-group-id flag */ - && (!FLAG('h') || (!lstat(path, &ln) && S_ISLNK(ln.st_mode))) /* symbolic link */ - && (!FLAG('n') || st.st_mtime > new.st_mtime) /* newer than file */ - && (!FLAG('o') || st.st_mtime < old.st_mtime) /* older than file */ - && (!FLAG('p') || S_ISFIFO(st.st_mode)) /* named pipe */ - && (!FLAG('r') || access(path, R_OK) == 0) /* readable */ - && (!FLAG('s') || st.st_size > 0) /* not empty */ - && (!FLAG('u') || st.st_mode & S_ISUID) /* set-user-id flag */ - && (!FLAG('w') || access(path, W_OK) == 0) /* writable */ - && (!FLAG('x') || access(path, X_OK) == 0)) != FLAG('v')) { /* executable */ - if (FLAG('q')) - exit(0); - match = 1; - puts(name); - } -} - -static void -usage(void) -{ - fprintf(stderr, "usage: %s [-abcdefghlpqrsuvwx] " - "[-n file] [-o file] [file...]\n", argv0); - exit(2); /* like test(1) return > 1 on error */ -} - -int -main(int argc, char *argv[]) -{ - struct dirent *d; - char path[PATH_MAX], *line = NULL, *file; - size_t linesiz = 0; - ssize_t n; - DIR *dir; - int r; - - ARGBEGIN { - case 'n': /* newer than file */ - case 'o': /* older than file */ - file = EARGF(usage()); - if (!(FLAG(ARGC()) = !stat(file, (ARGC() == 'n' ? &new : &old)))) - perror(file); - break; - default: - /* miscellaneous operators */ - if (strchr("abcdefghlpqrsuvwx", ARGC())) - FLAG(ARGC()) = 1; - else - usage(); /* unknown flag */ - } ARGEND; - - if (!argc) { - /* read list from stdin */ - while ((n = getline(&line, &linesiz, stdin)) > 0) { - if (line[n - 1] == '\n') - line[n - 1] = '\0'; - test(line, line); - } - free(line); - } else { - for (; argc; argc--, argv++) { - if (FLAG('l') && (dir = opendir(*argv))) { - /* test directory contents */ - while ((d = readdir(dir))) { - r = snprintf(path, sizeof path, "%s/%s", - *argv, d->d_name); - if (r >= 0 && (size_t)r < sizeof path) - test(path, d->d_name); - } - closedir(dir); - } else { - test(*argv, *argv); - } - } - } - return match ? 0 : 1; -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/stest.o b/hosts/vali/mars/dwm/dmenu-5.3/stest.o deleted file mode 100644 index 27f2c5e6b523acec7972def72b6187b996e7bee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5328 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 diff --git a/hosts/vali/mars/dwm/dmenu-5.3/util.c b/hosts/vali/mars/dwm/dmenu-5.3/util.c deleted file mode 100644 index 96b82c9..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/util.c +++ /dev/null @@ -1,36 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void -die(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} diff --git a/hosts/vali/mars/dwm/dmenu-5.3/util.h b/hosts/vali/mars/dwm/dmenu-5.3/util.h deleted file mode 100644 index c0a50d4..0000000 --- a/hosts/vali/mars/dwm/dmenu-5.3/util.h +++ /dev/null @@ -1,9 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) -#define LENGTH(X) (sizeof (X) / sizeof (X)[0]) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/hosts/vali/mars/dwm/dmenu-5.3/util.o b/hosts/vali/mars/dwm/dmenu-5.3/util.o deleted file mode 100644 index 4b569ab3cf3d20cbdf0c56dd2448b4cd6d4ad19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmb<-^>JfjWMqH=Mg}_u1P><4z~I4(U^{@B4h(z@ybPhi9-Y5E8sFStU|{g*EK$+$ z=nPRY@aXhWvGD11QE~9;^ilC>IZ$HGuj!%^z_00}lEAMSqEf)GIY*^|fq{WvbBW3X zFug`)0hr#RvH?u*Q8~cCz>wn6&7!ISHrz!;!tj7cw=T$bkIsi4owq!CTU0(UFfi<6 zVqjo6&Z5ErQrBI};L+)#!r{^DqM~rzMTNxxB--hsBJcvFv%#97M9rh~K7>=l{NJin z+@rgcVZQj1q)av7)*L}9`wk2qCElyODu`L6Cug zK>$@Ln5T|ITn~phD9o{$?7I4BLV zBZ==q5(mW*O#OKzaZnnAiC;q!2PJu!_%kGNWc8qI2a*EW%Z+63H;^C$12~<7(g4gH zR#3uXU|;~{RAwagJWz3vIUo#E56UATqd@9G7{mr)NZA812P6)Q9|pbR%G{E~BnG|W zk|GG50b>=V<|OKsq*jzL=%plbdHE%& zdhULqy2T}l$=OhTdS0nsK~a7|YEelggC5wx)QtGFqQu-(kgF)iApe4b0u;B%rosFx z3X(*UK;tqB7p03~4d!)TDdL2OWA4^;xDVnKoo3=G0x z9)f@hgZ&H=^@Q3FVk6@Mm_lShENUYe7#KkL50oa6mBRF+y9?bvg-|om^)G -© 2006-2009 Jukka Salmi -© 2006-2007 Sander van Dijk -© 2007-2011 Peter Hartlich -© 2007-2009 Szabolcs Nagy -© 2007-2009 Christof Musik -© 2007-2009 Premysl Hruby -© 2007-2008 Enno Gottox Boland -© 2008 Martin Hurton -© 2008 Neale Pickett -© 2009 Mate Nagy -© 2010-2016 Hiltjo Posthuma -© 2010-2012 Connor Lane Smith -© 2011 Christoph Lohmann <20h@r-36.net> -© 2015-2016 Quentin Rameau -© 2015-2016 Eric Pruitt -© 2016-2017 Markus Teich -© 2020-2022 Chris Down - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the "Software"), -to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/hosts/vali/mars/dwm/dwm-6.5/Makefile b/hosts/vali/mars/dwm/dwm-6.5/Makefile deleted file mode 100644 index ffa69b4..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# dwm - dynamic window manager -# See LICENSE file for copyright and license details. - -include config.mk - -SRC = drw.c dwm.c util.c -OBJ = ${SRC:.c=.o} - -all: dwm - -.c.o: - ${CC} -c ${CFLAGS} $< - -${OBJ}: config.h config.mk - -config.h: - cp config.def.h $@ - -dwm: ${OBJ} - ${CC} -o $@ ${OBJ} ${LDFLAGS} - -clean: - rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz - -dist: clean - mkdir -p dwm-${VERSION} - cp -R LICENSE Makefile README config.def.h config.mk\ - dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} - tar -cf dwm-${VERSION}.tar dwm-${VERSION} - gzip dwm-${VERSION}.tar - rm -rf dwm-${VERSION} - -install: all - mkdir -p ${DESTDIR}${PREFIX}/bin - cp -f dwm ${DESTDIR}${PREFIX}/bin - chmod 755 ${DESTDIR}${PREFIX}/bin/dwm - mkdir -p ${DESTDIR}${MANPREFIX}/man1 - sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 - chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/dwm\ - ${DESTDIR}${MANPREFIX}/man1/dwm.1 - -.PHONY: all clean dist install uninstall diff --git a/hosts/vali/mars/dwm/dwm-6.5/README b/hosts/vali/mars/dwm/dwm-6.5/README deleted file mode 100644 index 95d4fd0..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/README +++ /dev/null @@ -1,48 +0,0 @@ -dwm - dynamic window manager -============================ -dwm is an extremely fast, small, and dynamic window manager for X. - - -Requirements ------------- -In order to build dwm you need the Xlib header files. - - -Installation ------------- -Edit config.mk to match your local setup (dwm is installed into -the /usr/local namespace by default). - -Afterwards enter the following command to build and install dwm (if -necessary as root): - - make clean install - - -Running dwm ------------ -Add the following line to your .xinitrc to start dwm using startx: - - exec dwm - -In order to connect dwm to a specific display, make sure that -the DISPLAY environment variable is set correctly, e.g.: - - DISPLAY=foo.bar:1 exec dwm - -(This will start dwm on display :1 of the host foo.bar.) - -In order to display status info in the bar, you can do something -like this in your .xinitrc: - - while xsetroot -name "`date` `uptime | sed 's/.*,//'`" - do - sleep 1 - done & - exec dwm - - -Configuration -------------- -The configuration of dwm is done by creating a custom config.h -and (re)compiling the source code. diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.def.h b/hosts/vali/mars/dwm/dwm-6.5/config.def.h deleted file mode 100644 index aabd622..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/config.def.h +++ /dev/null @@ -1,123 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -/* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 1; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ -static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -}; - -/* key definitions */ -#define MODKEY Mod1Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "st", NULL }; - -static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, - { MODKEY, XK_s, scratchpad_show, {.i = 1} }, - { MODKEY, XK_y, scratchpad_show, {.i = 2} }, - { MODKEY, XK_u, scratchpad_show, {.i = 3} }, - { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.i = 1} }, - { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} }, - { MODKEY|ShiftMask, XK_u, scratchpad_hide, {.i = 3} }, - { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static const Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.h b/hosts/vali/mars/dwm/dwm-6.5/config.h deleted file mode 100644 index 1e4f2b6..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/config.h +++ /dev/null @@ -1,128 +0,0 @@ - - -/* appearance */ -static const unsigned int borderpx = 4; /* border pixel of windows */ -static const unsigned int snap = 32; /* snap pixel */ -static const int showbar = 0; /* 0 means no bar */ -static const int topbar = 1; /* 0 means bottom bar */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#282828"; -static const char col_gray2[] = "#98971a"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#928374"; -static const char col_cyan[] = "#BD93BD"; -static const char col_sel[] = "#d79921"; -static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray2, col_gray1, col_gray4 }, - [SchemeSel] = { col_gray2, col_gray1, col_sel }, -}; - -/* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ - /* class instance title tags mask isfloating monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -}; - -/* layout(s) */ -static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ -static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, -}; - -/* key definitions */ -#define MODKEY Mod4Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "rofi", "-show", "drun", NULL }; -static const char *termcmd[] = { "kitty", NULL }; -static const char *browsercmd[] = { "tor-browser", NULL }; -static const char *filebrowsercmd[] = { "pcmanfm", NULL }; -static const char *spkeepassxc[] = { "keepassxc", NULL }; - -static const Key keys[] = { -/* modifier key function argument */ - { MODKEY, XK_d, spawn, {.v = dmenucmd } }, - { MODKEY, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, spawn, {.v = browsercmd } }, - { MODKEY, XK_e, spawn, {.v = filebrowsercmd } }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY|ShiftMask, XK_i, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY|ShiftMask, XK_h, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_l, tagmon, {.i = -1 } }, - { MODKEY, XK_j, focusmon, {.i = -1 } }, - { MODKEY, XK_k, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_q, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY|ShiftMask, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_space, togglefullscr, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_s, scratchpad_show, {.i = 1} }, - { MODKEY, XK_y, scratchpad_show, {.i = 2} }, - { MODKEY, XK_p, scratchpad_show, {.i = 3} }, - { MODKEY|ShiftMask, XK_s, scratchpad_hide, {.i = 1} }, - { MODKEY|ShiftMask, XK_y, scratchpad_hide, {.i = 2} }, - { MODKEY|ShiftMask, XK_p, scratchpad_hide, {.i = 3} }, - { MODKEY|ShiftMask, XK_r, scratchpad_remove, {0} }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_e, quit, {0} }, -}; - -/* button definitions */ -/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static const Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; - diff --git a/hosts/vali/mars/dwm/dwm-6.5/config.mk b/hosts/vali/mars/dwm/dwm-6.5/config.mk deleted file mode 100644 index 8efca9a..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/config.mk +++ /dev/null @@ -1,39 +0,0 @@ -# dwm version -VERSION = 6.5 - -# Customize below to fit your system - -# paths -PREFIX = /usr/local -MANPREFIX = ${PREFIX}/share/man - -X11INC = /usr/X11R6/include -X11LIB = /usr/X11R6/lib - -# Xinerama, comment if you don't want it -XINERAMALIBS = -lXinerama -XINERAMAFLAGS = -DXINERAMA - -# freetype -FREETYPELIBS = -lfontconfig -lXft -FREETYPEINC = /usr/include/freetype2 -# OpenBSD (uncomment) -#FREETYPEINC = ${X11INC}/freetype2 -#MANPREFIX = ${PREFIX}/man - -# includes and libs -INCS = -I${X11INC} -I${FREETYPEINC} -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} - -# flags -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} -CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} -LDFLAGS = ${LIBS} - -# Solaris -#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" -#LDFLAGS = ${LIBS} - -# compiler and linker -CC = cc diff --git a/hosts/vali/mars/dwm/dwm-6.5/drw.c b/hosts/vali/mars/dwm/dwm-6.5/drw.c deleted file mode 100644 index a58a2b4..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/drw.c +++ /dev/null @@ -1,450 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include -#include - -#include "drw.h" -#include "util.h" - -#define UTF_INVALID 0xFFFD -#define UTF_SIZ 4 - -static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; -static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; -static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; -static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; - -static long -utf8decodebyte(const char c, size_t *i) -{ - for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) - if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) - return (unsigned char)c & ~utfmask[*i]; - return 0; -} - -static size_t -utf8validate(long *u, size_t i) -{ - if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) - *u = UTF_INVALID; - for (i = 1; *u > utfmax[i]; ++i) - ; - return i; -} - -static size_t -utf8decode(const char *c, long *u, size_t clen) -{ - size_t i, j, len, type; - long udecoded; - - *u = UTF_INVALID; - if (!clen) - return 0; - udecoded = utf8decodebyte(c[0], &len); - if (!BETWEEN(len, 1, UTF_SIZ)) - return 1; - for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { - udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); - if (type) - return j; - } - if (j < len) - return 0; - *u = udecoded; - utf8validate(u, len); - - return len; -} - -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) -{ - Drw *drw = ecalloc(1, sizeof(Drw)); - - drw->dpy = dpy; - drw->screen = screen; - drw->root = root; - drw->w = w; - drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); - drw->gc = XCreateGC(dpy, root, 0, NULL); - XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); - - return drw; -} - -void -drw_resize(Drw *drw, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - drw->w = w; - drw->h = h; - if (drw->drawable) - XFreePixmap(drw->dpy, drw->drawable); - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); -} - -void -drw_free(Drw *drw) -{ - XFreePixmap(drw->dpy, drw->drawable); - XFreeGC(drw->dpy, drw->gc); - drw_fontset_free(drw->fonts); - free(drw); -} - -/* This function is an implementation detail. Library users should use - * drw_fontset_create instead. - */ -static Fnt * -xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) -{ - Fnt *font; - XftFont *xfont = NULL; - FcPattern *pattern = NULL; - - if (fontname) { - /* Using the pattern found at font->xfont->pattern does not yield the - * same substitution results as using the pattern returned by - * FcNameParse; using the latter results in the desired fallback - * behaviour whereas the former just results in missing-character - * rectangles being drawn, at least with some fonts. */ - if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { - fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); - return NULL; - } - if (!(pattern = FcNameParse((FcChar8 *) fontname))) { - fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); - XftFontClose(drw->dpy, xfont); - return NULL; - } - } else if (fontpattern) { - if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { - fprintf(stderr, "error, cannot load font from pattern.\n"); - return NULL; - } - } else { - die("no font specified."); - } - - font = ecalloc(1, sizeof(Fnt)); - font->xfont = xfont; - font->pattern = pattern; - font->h = xfont->ascent + xfont->descent; - font->dpy = drw->dpy; - - return font; -} - -static void -xfont_free(Fnt *font) -{ - if (!font) - return; - if (font->pattern) - FcPatternDestroy(font->pattern); - XftFontClose(font->dpy, font->xfont); - free(font); -} - -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) -{ - Fnt *cur, *ret = NULL; - size_t i; - - if (!drw || !fonts) - return NULL; - - for (i = 1; i <= fontcount; i++) { - if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { - cur->next = ret; - ret = cur; - } - } - return (drw->fonts = ret); -} - -void -drw_fontset_free(Fnt *font) -{ - if (font) { - drw_fontset_free(font->next); - xfont_free(font); - } -} - -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) -{ - if (!drw || !dest || !clrname) - return; - - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen), - clrname, dest)) - die("error, cannot allocate color '%s'", clrname); -} - -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ -Clr * -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) -{ - size_t i; - Clr *ret; - - /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) - return NULL; - - for (i = 0; i < clrcount; i++) - drw_clr_create(drw, &ret[i], clrnames[i]); - return ret; -} - -void -drw_setfontset(Drw *drw, Fnt *set) -{ - if (drw) - drw->fonts = set; -} - -void -drw_setscheme(Drw *drw, Clr *scm) -{ - if (drw) - drw->scheme = scm; -} - -void -drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert) -{ - if (!drw || !drw->scheme) - return; - XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); - if (filled) - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - else - XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); -} - -int -drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) -{ - int i, ty, ellipsis_x = 0; - unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; - XftDraw *d = NULL; - Fnt *usedfont, *curfont, *nextfont; - int utf8strlen, utf8charlen, render = x || y || w || h; - long utf8codepoint = 0; - const char *utf8str; - FcCharSet *fccharset; - FcPattern *fcpattern; - FcPattern *match; - XftResult result; - int charexists = 0, overflow = 0; - /* keep track of a couple codepoints for which we have no match. */ - enum { nomatches_len = 64 }; - static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; - static unsigned int ellipsis_width = 0; - - if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) - return 0; - - if (!render) { - w = invert ? invert : ~invert; - } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); - XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); - x += lpad; - w -= lpad; - } - - usedfont = drw->fonts; - if (!ellipsis_width && render) - ellipsis_width = drw_fontset_getwidth(drw, "..."); - while (1) { - ew = ellipsis_len = utf8strlen = 0; - utf8str = text; - nextfont = NULL; - while (*text) { - utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); - if (charexists) { - drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL); - if (ew + ellipsis_width <= w) { - /* keep track where the ellipsis still fits */ - ellipsis_x = x + ew; - ellipsis_w = w - ew; - ellipsis_len = utf8strlen; - } - - if (ew + tmpw > w) { - overflow = 1; - /* called from drw_fontset_getwidth_clamp(): - * it wants the width AFTER the overflow - */ - if (!render) - x += tmpw; - else - utf8strlen = ellipsis_len; - } else if (curfont == usedfont) { - utf8strlen += utf8charlen; - text += utf8charlen; - ew += tmpw; - } else { - nextfont = curfont; - } - break; - } - } - - if (overflow || !charexists || nextfont) - break; - else - charexists = 0; - } - - if (utf8strlen) { - if (render) { - ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], - usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); - } - x += ew; - w -= ew; - } - if (render && overflow) - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); - - if (!*text || overflow) { - break; - } else if (nextfont) { - charexists = 0; - usedfont = nextfont; - } else { - /* Regardless of whether or not a fallback font is found, the - * character must be drawn. */ - charexists = 1; - - for (i = 0; i < nomatches_len; ++i) { - /* avoid calling XftFontMatch if we know we won't find a match */ - if (utf8codepoint == nomatches.codepoint[i]) - goto no_match; - } - - fccharset = FcCharSetCreate(); - FcCharSetAddChar(fccharset, utf8codepoint); - - if (!drw->fonts->pattern) { - /* Refer to the comment in xfont_create for more information. */ - die("the first font in the cache must be loaded from a font string."); - } - - fcpattern = FcPatternDuplicate(drw->fonts->pattern); - FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); - FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); - - FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); - FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); - - FcCharSetDestroy(fccharset); - FcPatternDestroy(fcpattern); - - if (match) { - usedfont = xfont_create(drw, NULL, match); - if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { - for (curfont = drw->fonts; curfont->next; curfont = curfont->next) - ; /* NOP */ - curfont->next = usedfont; - } else { - xfont_free(usedfont); - nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; -no_match: - usedfont = drw->fonts; - } - } - } - } - if (d) - XftDrawDestroy(d); - - return x + (render ? w : 0); -} - -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) -{ - if (!drw) - return; - - XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y); - XSync(drw->dpy, False); -} - -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) -{ - if (!drw || !drw->fonts || !text) - return 0; - return drw_text(drw, 0, 0, 0, 0, 0, text, 0); -} - -unsigned int -drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) -{ - unsigned int tmp = 0; - if (drw && drw->fonts && text && n) - tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); - return MIN(n, tmp); -} - -void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) -{ - XGlyphInfo ext; - - if (!font || !text) - return; - - XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); - if (w) - *w = ext.xOff; - if (h) - *h = font->h; -} - -Cur * -drw_cur_create(Drw *drw, int shape) -{ - Cur *cur; - - if (!drw || !(cur = ecalloc(1, sizeof(Cur)))) - return NULL; - - cur->cursor = XCreateFontCursor(drw->dpy, shape); - - return cur; -} - -void -drw_cur_free(Drw *drw, Cur *cursor) -{ - if (!cursor) - return; - - XFreeCursor(drw->dpy, cursor->cursor); - free(cursor); -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/drw.h b/hosts/vali/mars/dwm/dwm-6.5/drw.h deleted file mode 100644 index 6471431..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/drw.h +++ /dev/null @@ -1,58 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -typedef struct { - Cursor cursor; -} Cur; - -typedef struct Fnt { - Display *dpy; - unsigned int h; - XftFont *xfont; - FcPattern *pattern; - struct Fnt *next; -} Fnt; - -enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ -typedef XftColor Clr; - -typedef struct { - unsigned int w, h; - Display *dpy; - int screen; - Window root; - Drawable drawable; - GC gc; - Clr *scheme; - Fnt *fonts; -} Drw; - -/* Drawable abstraction */ -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h); -void drw_resize(Drw *drw, unsigned int w, unsigned int h); -void drw_free(Drw *drw); - -/* Fnt abstraction */ -Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); -void drw_fontset_free(Fnt* set); -unsigned int drw_fontset_getwidth(Drw *drw, const char *text); -unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n); -void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); - -/* Colorscheme abstraction */ -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); - -/* Cursor abstraction */ -Cur *drw_cur_create(Drw *drw, int shape); -void drw_cur_free(Drw *drw, Cur *cursor); - -/* Drawing context manipulation */ -void drw_setfontset(Drw *drw, Fnt *set); -void drw_setscheme(Drw *drw, Clr *scm); - -/* Drawing functions */ -void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); -int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); - -/* Map functions */ -void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); diff --git a/hosts/vali/mars/dwm/dwm-6.5/drw.o b/hosts/vali/mars/dwm/dwm-6.5/drw.o deleted file mode 100644 index 05c8f4bcf9b50e8bbf99e044134728ba7fba5051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11144 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 YXc!5z7seOFq2KW>L 31 ? -1 : 1]; }; -+struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; - - /* function implementations */ - void -@@ -309,7 +322,9 @@ applyrules(Client *c) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); -+ if(c->tags != SCRATCHPAD_MASK_1 && c->tags != SCRATCHPAD_MASK_2 && c->tags != SCRATCHPAD_MASK_3) { - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -+ } - } - - int -@@ -1412,6 +1427,124 @@ scan(void) - } - } - -+static void scratchpad_hide(const Arg *arg) { -+ if(scratchpad_hide_flag < 4) { -+ if(arg->i == 1) { -+ if(selmon->sel) { -+ selmon->sel->tags = SCRATCHPAD_MASK_1; -+ selmon->sel->isfloating = 1; -+ focus(NULL); -+ arrange(selmon); -+ scratchpad_hide_flag++; -+ } -+ } -+ else if(arg->i == 2) { -+ if(selmon->sel) { -+ selmon->sel->tags = SCRATCHPAD_MASK_2; -+ selmon->sel->isfloating = 1; -+ focus(NULL); -+ arrange(selmon); -+ scratchpad_hide_flag++; -+ } -+ } -+ else if(arg->i == 3) { -+ if(selmon->sel) { -+ selmon->sel->tags = SCRATCHPAD_MASK_3; -+ selmon->sel->isfloating = 1; -+ focus(NULL); -+ arrange(selmon); -+ scratchpad_hide_flag++; -+ } -+ } -+ } -+} -+ -+static void scratchpad_remove() { -+ if(selmon->sel && (scratchpad_last_showed_1 != NULL || scratchpad_last_showed_2 != NULL ||scratchpad_last_showed_3 != NULL) && (selmon->sel == scratchpad_last_showed_1 || selmon->sel == scratchpad_last_showed_2 || selmon->sel == scratchpad_last_showed_3)) { -+ if(scratchpad_last_showed_1 == selmon->sel) { -+ scratchpad_last_showed_1 = NULL; -+ scratchpad_hide_flag--; -+ } -+ else if(scratchpad_last_showed_2 == selmon->sel) { -+ scratchpad_last_showed_2 = NULL; -+ scratchpad_hide_flag--; -+ } -+ else if(scratchpad_last_showed_3 == selmon->sel) { -+ scratchpad_last_showed_3 = NULL; -+ scratchpad_hide_flag--; -+ } -+ } -+} -+ -+static void scratchpad_show(const Arg *arg) { -+ if(arg->i == 1) { -+ if(scratchpad_last_showed_1 == NULL) { -+ scratchpad_show_first(arg->i); -+ } -+ else { -+ if(scratchpad_last_showed_1->tags != SCRATCHPAD_MASK_1) { -+ scratchpad_last_showed_1->tags = SCRATCHPAD_MASK_1; -+ focus(NULL); -+ arrange(selmon); -+ } -+ else { -+ scratchpad_show_first(arg->i); -+ } -+ } -+ } -+ else if(arg->i == 2) { -+ if(scratchpad_last_showed_2 == NULL) { -+ scratchpad_show_first(arg->i); -+ } -+ else { -+ if(scratchpad_last_showed_2->tags != SCRATCHPAD_MASK_2) { -+ scratchpad_last_showed_2->tags = SCRATCHPAD_MASK_2; -+ focus(NULL); -+ arrange(selmon); -+ } -+ else { -+ scratchpad_show_first(arg->i); -+ } -+ } -+ } -+ else if(arg->i == 3) { -+ if(scratchpad_last_showed_3 == NULL) { -+ scratchpad_show_first(arg->i); -+ } -+ else { -+ if(scratchpad_last_showed_3->tags != SCRATCHPAD_MASK_3) { -+ scratchpad_last_showed_3->tags = SCRATCHPAD_MASK_3; -+ focus(NULL); -+ arrange(selmon); -+ } -+ else { -+ scratchpad_show_first(arg->i); -+ } -+ } -+ } -+} -+ -+static void scratchpad_show_client(Client *c) { -+ c->tags = selmon->tagset[selmon->seltags]; -+ focus(c); -+ arrange(selmon); -+} -+ -+static void scratchpad_show_first(int scratchNum) { -+ for(Client *c = selmon->clients; c !=NULL; c = c->next) { -+ if(c->tags == SCRATCHPAD_MASK_1 && scratchNum == 1) { -+ scratchpad_last_showed_1 = c; -+ scratchpad_show_client(c); -+ } else if(c->tags == SCRATCHPAD_MASK_2 && scratchNum == 2) { -+ scratchpad_last_showed_2 = c; -+ scratchpad_show_client(c); -+ } else if(c->tags == SCRATCHPAD_MASK_3 && scratchNum == 3) { -+ scratchpad_last_showed_3 = c; -+ scratchpad_show_client(c); -+ } -+ } -+} -+ - void - sendmon(Client *c, Monitor *m) - { -@@ -1785,6 +1918,16 @@ unmanage(Client *c, int destroyed) - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -+ if(scratchpad_last_showed_1 == c) { -+ scratchpad_last_showed_1 = NULL; -+ } -+ if(scratchpad_last_showed_2 == c) { -+ scratchpad_last_showed_2 = NULL; -+ } -+ if(scratchpad_last_showed_3 == c) { -+ scratchpad_last_showed_3 = NULL; -+ } -+ - free(c); - focus(NULL); - updateclientlist(); diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff b/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff deleted file mode 100644 index cb218b6..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm-scratchpad-20240321-061e9fe.diff +++ /dev/null @@ -1,105 +0,0 @@ -From b9f3c11c3150f0b5d5b297a4eeeb2012764c98f5 Mon Sep 17 00:00:00 2001 -From: visil -Date: Thu, 21 Mar 2024 15:16:39 +0300 -Subject: [PATCH] Patch updated to 6.5 - ---- - config.def.h | 3 +++ - dwm.c | 34 ++++++++++++++++++++++++++++++++++ - 2 files changed, 37 insertions(+) - -diff --git a/config.def.h b/config.def.h -index 9efa774..0b8b310 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -59,11 +59,14 @@ static const Layout layouts[] = { - static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ - static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; - static const char *termcmd[] = { "st", NULL }; -+static const char scratchpadname[] = "scratchpad"; -+static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL }; - - static const Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, -+ { MODKEY, XK_grave, togglescratch, {.v = scratchpadcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, -diff --git a/dwm.c b/dwm.c -index f1d86b2..a8db21a 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -211,6 +211,7 @@ static void tagmon(const Arg *arg); - static void tile(Monitor *m); - static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); -+static void togglescratch(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unfocus(Client *c, int setfocus); -@@ -271,6 +272,8 @@ static Window root, wmcheckwin; - /* configuration, allows nested code to access above variables */ - #include "config.h" - -+static unsigned int scratchtag = 1 << LENGTH(tags); -+ - /* compile-time check if all tags fit into an unsigned int bit array. */ - struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -@@ -1061,6 +1064,14 @@ manage(Window w, XWindowAttributes *wa) - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; - -+ selmon->tagset[selmon->seltags] &= ~scratchtag; -+ if (!strcmp(c->name, scratchpadname)) { -+ c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag; -+ c->isfloating = True; -+ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); -+ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); -+ } -+ - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); -@@ -1651,6 +1662,7 @@ spawn(const Arg *arg) - - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; -+ selmon->tagset[selmon->seltags] &= ~scratchtag; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); -@@ -1735,6 +1747,28 @@ togglefloating(const Arg *arg) - arrange(selmon); - } - -+void -+togglescratch(const Arg *arg) -+{ -+ Client *c; -+ unsigned int found = 0; -+ -+ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); -+ if (found) { -+ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; -+ if (newtagset) { -+ selmon->tagset[selmon->seltags] = newtagset; -+ focus(NULL); -+ arrange(selmon); -+ } -+ if (ISVISIBLE(c)) { -+ focus(c); -+ restack(selmon); -+ } -+ } else -+ spawn(arg); -+} -+ - void - toggletag(const Arg *arg) - { --- -2.44.0 - diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.1 b/hosts/vali/mars/dwm/dwm-6.5/dwm.1 deleted file mode 100644 index 38531ea..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.1 +++ /dev/null @@ -1,179 +0,0 @@ -.TH DWM 1 dwm\-VERSION -.SH NAME -dwm \- dynamic window manager -.SH SYNOPSIS -.B dwm -.RB [ \-v ] -.SH DESCRIPTION -dwm is a dynamic window manager for X. It manages windows in tiled, monocle -and floating layouts. Either layout can be applied dynamically, optimising the -environment for the application in use and the task performed. -.P -In tiled layouts windows are managed in a master and stacking area. The master -area on the left contains one window by default, and the stacking area on the -right contains all other windows. The number of master area windows can be -adjusted from zero to an arbitrary number. In monocle layout all windows are -maximised to the screen size. In floating layout windows can be resized and -moved freely. Dialog windows are always managed floating, regardless of the -layout applied. -.P -Windows are grouped by tags. Each window can be tagged with one or multiple -tags. Selecting certain tags displays all windows with these tags. -.P -Each screen contains a small status bar which displays all available tags, the -layout, the title of the focused window, and the text read from the root window -name property, if the screen is focused. A floating window is indicated with an -empty square and a maximised floating window is indicated with a filled square -before the windows title. The selected tags are indicated with a different -color. The tags of the focused window are indicated with a filled square in the -top left corner. The tags which are applied to one or more windows are -indicated with an empty square in the top left corner. -.P -dwm draws a small border around windows to indicate the focus state. -.SH OPTIONS -.TP -.B \-v -prints version information to stderr, then exits. -.SH USAGE -.SS Status bar -.TP -.B X root window name -is read and displayed in the status text area. It can be set with the -.BR xsetroot (1) -command. -.TP -.B Button1 -click on a tag label to display all windows with that tag, click on the layout -label toggles between tiled and floating layout. -.TP -.B Button3 -click on a tag label adds/removes all windows with that tag to/from the view. -.TP -.B Mod1\-Button1 -click on a tag label applies that tag to the focused window. -.TP -.B Mod1\-Button3 -click on a tag label adds/removes that tag to/from the focused window. -.SS Keyboard commands -.TP -.B Mod1\-Shift\-Return -Start -.BR st(1). -.TP -.B Mod1\-p -Spawn -.BR dmenu(1) -for launching other programs. -.TP -.B Mod1\-, -Focus previous screen, if any. -.TP -.B Mod1\-. -Focus next screen, if any. -.TP -.B Mod1\-Shift\-, -Send focused window to previous screen, if any. -.TP -.B Mod1\-Shift\-. -Send focused window to next screen, if any. -.TP -.B Mod1\-b -Toggles bar on and off. -.TP -.B Mod1\-t -Sets tiled layout. -.TP -.B Mod1\-f -Sets floating layout. -.TP -.B Mod1\-m -Sets monocle layout. -.TP -.B Mod1\-space -Toggles between current and previous layout. -.TP -.B Mod1\-j -Focus next window. -.TP -.B Mod1\-k -Focus previous window. -.TP -.B Mod1\-i -Increase number of windows in master area. -.TP -.B Mod1\-d -Decrease number of windows in master area. -.TP -.B Mod1\-l -Increase master area size. -.TP -.B Mod1\-h -Decrease master area size. -.TP -.B Mod1\-Return -Zooms/cycles focused window to/from master area (tiled layouts only). -.TP -.B Mod1\-Shift\-c -Close focused window. -.TP -.B Mod1\-Shift\-space -Toggle fullscreen for focused window. -.TP -.B Mod1\-Shift\-space -Toggle focused window between tiled and floating state. -.TP -.B Mod1\-Tab -Toggles to the previously selected tags. -.TP -.B Mod1\-Shift\-[1..n] -Apply nth tag to focused window. -.TP -.B Mod1\-Shift\-0 -Apply all tags to focused window. -.TP -.B Mod1\-Control\-Shift\-[1..n] -Add/remove nth tag to/from focused window. -.TP -.B Mod1\-[1..n] -View all windows with nth tag. -.TP -.B Mod1\-0 -View all windows with any tag. -.TP -.B Mod1\-Control\-[1..n] -Add/remove all windows with nth tag to/from the view. -.TP -.B Mod1\-Shift\-q -Quit dwm. -.SS Mouse commands -.TP -.B Mod1\-Button1 -Move focused window while dragging. Tiled windows will be toggled to the floating state. -.TP -.B Mod1\-Button2 -Toggles focused window between floating and tiled state. -.TP -.B Mod1\-Button3 -Resize focused window while dragging. Tiled windows will be toggled to the floating state. -.SH CUSTOMIZATION -dwm is customized by creating a custom config.h and (re)compiling the source -code. This keeps it fast, secure and simple. -.SH SEE ALSO -.BR dmenu (1), -.BR st (1) -.SH ISSUES -Java applications which use the XToolkit/XAWT backend may draw grey windows -only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early -JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds -are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the -environment variable -.BR AWT_TOOLKIT=MToolkit -(to use the older Motif backend instead) or running -.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D -or -.B wmname LG3D -(to pretend that a non-reparenting window manager is running that the -XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable -.BR _JAVA_AWT_WM_NONREPARENTING=1 . -.SH BUGS -Send all bug reports with a patch to hackers@suckless.org. diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c b/hosts/vali/mars/dwm/dwm-6.5/dwm.c deleted file mode 100644 index f7e94b6..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.c +++ /dev/null @@ -1,2319 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -static void expose(XEvent *e); -static void focus(Client *c); -static void focusin(XEvent *e); -static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); -static Atom getatomprop(Client *c, Atom prop); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void manage(Window w, XWindowAttributes *wa); -static void mappingnotify(XEvent *e); -static void maprequest(XEvent *e); -static void monocle(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *c); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void scan(void); -static void scratchpad_hide(); -static void scratchpad_remove(); -static void scratchpad_show(); -static void scratchpad_show_client(Client *c); -static void scratchpad_show_first(int scratchNum); -static int sendevent(Client *c, Atom proto); -static void sendmon(Client *c, Monitor *m); -static void setclientstate(Client *c, long state); -static void setfocus(Client *c); -static void setfullscreen(Client *c, int fullscreen); -static void setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setup(void); -static void seturgent(Client *c, int urg); -static void showhide(Client *c); -static void spawn(const Arg *arg); -static void tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void tile(Monitor *m); -static void togglebar(const Arg *arg); -static void togglefloating(const Arg *arg); -static void togglefullscr(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static int updategeom(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatetitle(Client *c); -static void updatewindowtype(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -static int xerror(Display *dpy, XErrorEvent *ee); -static int xerrordummy(Display *dpy, XErrorEvent *ee); -static int xerrorstart(Display *dpy, XErrorEvent *ee); -static void zoom(const Arg *arg); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh; /* bar height */ -static int lrpad; /* sum of left and right padding for text */ -static int (*xerrorxlib)(Display *, XErrorEvent *); -static unsigned int numlockmask = 0; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int running = 1; -static Cur *cursor[CurLast]; -static Clr **scheme; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root, wmcheckwin; - -/* scratchpad */ -#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) -#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) -#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) -static int scratchpad_hide_flag = 0; -static Client *scratchpad_last_showed_1 = NULL; -static Client *scratchpad_last_showed_2 = NULL; -static Client *scratchpad_last_showed_3 = NULL; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - XGetClassHint(dpy, c->win, &ch); - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) - && (!r->class || strstr(class, r->class)) - && (!r->instance || strstr(instance, r->instance))) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; - } - } - if (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - if(c->tags != SCRATCHPAD_MASK_1 && c->tags != SCRATCHPAD_MASK_2 && c->tags != SCRATCHPAD_MASK_3) { - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; - } -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - if (!c->hintsvalid) - updatesizehints(c); - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + TEXTW(selmon->ltsymbol)) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - click = ClkClientWin; - } - for (i = 0; i < LENGTH(buttons); i++) - if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - free(scheme); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, w, tw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; - - if (!m->showbar) - return; - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - tw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) - return 0; - if (name.encoding == XA_STRING) { - strncpy(text, (char *)name.value, size - 1); - } else if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (!focused) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j, k; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - int start, end, skip; - KeySym *syms; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - XDisplayKeycodes(dpy, &start, &end); - syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); - if (!syms) - return; - for (k = start; k <= end; k++) - for (i = 0; i < LENGTH(keys); i++) - /* skip modifier codes, we do that ourselves */ - if (keys[i].keysym == syms[(k - start) * skip]) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, k, - keys[i].mod | modifiers[j], - root, True, - GrabModeAsync, GrabModeAsync); - XFree(syms); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - - if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) - c->x = c->mon->wx + c->mon->ww - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) - c->y = c->mon->wy + c->mon->wh - HEIGHT(c); - c->x = MAX(c->x, c->mon->wx); - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; - c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attach(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->wx - nx) < snap) - nx = selmon->wx; - else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) - ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - c->hintsvalid = 0; - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { - updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - XUngrabPointer(dpy, CurrentTime); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -static void scratchpad_hide(const Arg *arg) { - if(scratchpad_hide_flag < 4) { - if(arg->i == 1) { - if(selmon->sel) { - selmon->sel->tags = SCRATCHPAD_MASK_1; - selmon->sel->isfloating = 1; - focus(NULL); - arrange(selmon); - scratchpad_hide_flag++; - } - } - else if(arg->i == 2) { - if(selmon->sel) { - selmon->sel->tags = SCRATCHPAD_MASK_2; - selmon->sel->isfloating = 1; - focus(NULL); - arrange(selmon); - scratchpad_hide_flag++; - } - } - else if(arg->i == 3) { - if(selmon->sel) { - selmon->sel->tags = SCRATCHPAD_MASK_3; - selmon->sel->isfloating = 1; - focus(NULL); - arrange(selmon); - scratchpad_hide_flag++; - } - } - } -} - -static void scratchpad_remove() { - if(selmon->sel && (scratchpad_last_showed_1 != NULL || scratchpad_last_showed_2 != NULL ||scratchpad_last_showed_3 != NULL) && (selmon->sel == scratchpad_last_showed_1 || selmon->sel == scratchpad_last_showed_2 || selmon->sel == scratchpad_last_showed_3)) { - if(scratchpad_last_showed_1 == selmon->sel) { - scratchpad_last_showed_1 = NULL; - scratchpad_hide_flag--; - } - else if(scratchpad_last_showed_2 == selmon->sel) { - scratchpad_last_showed_2 = NULL; - scratchpad_hide_flag--; - } - else if(scratchpad_last_showed_3 == selmon->sel) { - scratchpad_last_showed_3 = NULL; - scratchpad_hide_flag--; - } - } -} - -static void scratchpad_show(const Arg *arg) { - if(arg->i == 1) { - if(scratchpad_last_showed_1 == NULL) { - scratchpad_show_first(arg->i); - } - else { - if(scratchpad_last_showed_1->tags != SCRATCHPAD_MASK_1) { - scratchpad_last_showed_1->tags = SCRATCHPAD_MASK_1; - focus(NULL); - arrange(selmon); - } - else { - scratchpad_show_first(arg->i); - } - } - } - else if(arg->i == 2) { - if(scratchpad_last_showed_2 == NULL) { - scratchpad_show_first(arg->i); - } - else { - if(scratchpad_last_showed_2->tags != SCRATCHPAD_MASK_2) { - scratchpad_last_showed_2->tags = SCRATCHPAD_MASK_2; - focus(NULL); - arrange(selmon); - } - else { - scratchpad_show_first(arg->i); - } - } - } - else if(arg->i == 3) { - if(scratchpad_last_showed_3 == NULL) { - scratchpad_show_first(arg->i); - } - else { - if(scratchpad_last_showed_3->tags != SCRATCHPAD_MASK_3) { - scratchpad_last_showed_3->tags = SCRATCHPAD_MASK_3; - focus(NULL); - arrange(selmon); - } - else { - scratchpad_show_first(arg->i); - } - } - } -} - -static void scratchpad_show_client(Client *c) { - c->tags = selmon->tagset[selmon->seltags]; - focus(c); - arrange(selmon); -} - -static void scratchpad_show_first(int scratchNum) { - for(Client *c = selmon->clients; c !=NULL; c = c->next) { - if(c->tags == SCRATCHPAD_MASK_1 && scratchNum == 1) { - scratchpad_last_showed_1 = c; - scratchpad_show_client(c); - } else if(c->tags == SCRATCHPAD_MASK_2 && scratchNum == 2) { - scratchpad_last_showed_2 = c; - scratchpad_show_client(c); - } else if(c->tags == SCRATCHPAD_MASK_3 && scratchNum == 3) { - scratchpad_last_showed_3 = c; - scratchpad_show_client(c); - } - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) -{ - float f; - - if (!arg || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; - selmon->mfact = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - struct sigaction sa; - - /* do not transform children into zombies when they terminate */ - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); - - /* clean up any zombies (inherited from .xinitrc etc) immediately */ - while (waitpid(-1, NULL, WNOHANG) > 0); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); - netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask - |ButtonPressMask|PointerMotionMask|EnterWindowMask - |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - -void -seturgent(Client *c, int urg) -{ - XWMHints *wmh; - - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -spawn(const Arg *arg) -{ - struct sigaction sa; - - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = SIG_DFL; - sigaction(SIGCHLD, &sa, NULL); - - execvp(((char **)arg->v)[0], (char **)arg->v); - die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - if (my + HEIGHT(c) < m->wh) - my += HEIGHT(c); - } else { - h = (m->wh - ty) / (n - i); - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); - if (ty + HEIGHT(c) < m->wh) - ty += HEIGHT(c); - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -togglefullscr(const Arg *arg) -{ - if(selmon->sel) - setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XSelectInput(dpy, c->win, NoEventMask); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - if(scratchpad_last_showed_1 == c) { - scratchpad_last_showed_1 = NULL; - } - if(scratchpad_last_showed_2 == c) { - scratchpad_last_showed_2 = NULL; - } - if(scratchpad_last_showed_3 == c) { - scratchpad_last_showed_3 = NULL; - } - - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - - /* new monitors if nn > n */ - for (i = n; i < nn; i++) { - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - /* removed monitors if n > nn */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - free(unique); - } else -#endif /* XINERAMA */ - { /* default monitor setup */ - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); - c->hintsvalid = 1; -} - -void -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatetitle(Client *c) -{ - if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); - if (c->name[0] == '\0') /* hack to mark broken clients */ - strcpy(c->name, broken); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) - return; - if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig deleted file mode 100644 index 7ab1910..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.orig +++ /dev/null @@ -1,2207 +0,0 @@ -/* See LICENSE file for copyright and license details. - * - * dynamic window manager is designed like any other X client as well. It is - * driven through handling X events. In contrast to other X clients, a window - * manager selects for SubstructureRedirectMask on the root window, to receive - * events about window (dis-)appearance. Only one X connection at a time is - * allowed to select for this event mask. - * - * The event handlers of dwm are organized in an array which is accessed - * whenever a new event has been fetched. This allows event dispatching - * in O(1) time. - * - * Each child of the root window is called a client, except windows which have - * set the override_redirect flag. Clients are organized in a linked client - * list on each monitor, the focus history is remembered through a stack list - * on each monitor. Each client contains a bit array to indicate the tags of a - * client. - * - * Keys and tagging rules are organized as arrays and defined in config.h. - * - * To understand everything else, start reading main(). - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef XINERAMA -#include -#endif /* XINERAMA */ -#include - -#include "drw.h" -#include "util.h" - -/* macros */ -#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) -#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ - * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -#define LENGTH(X) (sizeof X / sizeof X[0]) -#define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -#define TAGMASK ((1 << LENGTH(tags)) - 1) -#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) - -/* enums */ -enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ -enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - -typedef union { - int i; - unsigned int ui; - float f; - const void *v; -} Arg; - -typedef struct { - unsigned int click; - unsigned int mask; - unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; -} Button; - -typedef struct Monitor Monitor; -typedef struct Client Client; -struct Client { - char name[256]; - float mina, maxa; - int x, y, w, h; - int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; - int bw, oldbw; - unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; - Client *next; - Client *snext; - Monitor *mon; - Window win; -}; - -typedef struct { - unsigned int mod; - KeySym keysym; - void (*func)(const Arg *); - const Arg arg; -} Key; - -typedef struct { - const char *symbol; - void (*arrange)(Monitor *); -} Layout; - -struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; - int topbar; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; - const Layout *lt[2]; -}; - -typedef struct { - const char *class; - const char *instance; - const char *title; - unsigned int tags; - int isfloating; - int monitor; -} Rule; - -/* function declarations */ -static void applyrules(Client *c); -static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -static void arrange(Monitor *m); -static void arrangemon(Monitor *m); -static void attach(Client *c); -static void attachstack(Client *c); -static void buttonpress(XEvent *e); -static void checkotherwm(void); -static void cleanup(void); -static void cleanupmon(Monitor *mon); -static void clientmessage(XEvent *e); -static void configure(Client *c); -static void configurenotify(XEvent *e); -static void configurerequest(XEvent *e); -static Monitor *createmon(void); -static void destroynotify(XEvent *e); -static void detach(Client *c); -static void detachstack(Client *c); -static Monitor *dirtomon(int dir); -static void drawbar(Monitor *m); -static void drawbars(void); -static void enternotify(XEvent *e); -static void expose(XEvent *e); -static void focus(Client *c); -static void focusin(XEvent *e); -static void focusmon(const Arg *arg); -static void focusstack(const Arg *arg); -static Atom getatomprop(Client *c, Atom prop); -static int getrootptr(int *x, int *y); -static long getstate(Window w); -static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -static void grabbuttons(Client *c, int focused); -static void grabkeys(void); -static void incnmaster(const Arg *arg); -static void keypress(XEvent *e); -static void killclient(const Arg *arg); -static void manage(Window w, XWindowAttributes *wa); -static void mappingnotify(XEvent *e); -static void maprequest(XEvent *e); -static void monocle(Monitor *m); -static void motionnotify(XEvent *e); -static void movemouse(const Arg *arg); -static Client *nexttiled(Client *c); -static void pop(Client *c); -static void propertynotify(XEvent *e); -static void quit(const Arg *arg); -static Monitor *recttomon(int x, int y, int w, int h); -static void resize(Client *c, int x, int y, int w, int h, int interact); -static void resizeclient(Client *c, int x, int y, int w, int h); -static void resizemouse(const Arg *arg); -static void restack(Monitor *m); -static void run(void); -static void scan(void); -static int sendevent(Client *c, Atom proto); -static void sendmon(Client *c, Monitor *m); -static void setclientstate(Client *c, long state); -static void setfocus(Client *c); -static void setfullscreen(Client *c, int fullscreen); -static void setlayout(const Arg *arg); -static void setmfact(const Arg *arg); -static void setup(void); -static void seturgent(Client *c, int urg); -static void showhide(Client *c); -static void spawn(const Arg *arg); -static void tag(const Arg *arg); -static void tagmon(const Arg *arg); -static void tile(Monitor *m); -static void togglebar(const Arg *arg); -static void togglefloating(const Arg *arg); -static void togglefullscr(const Arg *arg); -static void togglescratch(const Arg *arg); -static void toggletag(const Arg *arg); -static void toggleview(const Arg *arg); -static void unfocus(Client *c, int setfocus); -static void unmanage(Client *c, int destroyed); -static void unmapnotify(XEvent *e); -static void updatebarpos(Monitor *m); -static void updatebars(void); -static void updateclientlist(void); -static int updategeom(void); -static void updatenumlockmask(void); -static void updatesizehints(Client *c); -static void updatestatus(void); -static void updatetitle(Client *c); -static void updatewindowtype(Client *c); -static void updatewmhints(Client *c); -static void view(const Arg *arg); -static Client *wintoclient(Window w); -static Monitor *wintomon(Window w); -static int xerror(Display *dpy, XErrorEvent *ee); -static int xerrordummy(Display *dpy, XErrorEvent *ee); -static int xerrorstart(Display *dpy, XErrorEvent *ee); -static void zoom(const Arg *arg); - -/* variables */ -static const char broken[] = "broken"; -static char stext[256]; -static int screen; -static int sw, sh; /* X display screen geometry width, height */ -static int bh; /* bar height */ -static int lrpad; /* sum of left and right padding for text */ -static int (*xerrorxlib)(Display *, XErrorEvent *); -static unsigned int numlockmask = 0; -static void (*handler[LASTEvent]) (XEvent *) = { - [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, - [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, - [Expose] = expose, - [FocusIn] = focusin, - [KeyPress] = keypress, - [MappingNotify] = mappingnotify, - [MapRequest] = maprequest, - [MotionNotify] = motionnotify, - [PropertyNotify] = propertynotify, - [UnmapNotify] = unmapnotify -}; -static Atom wmatom[WMLast], netatom[NetLast]; -static int running = 1; -static Cur *cursor[CurLast]; -static Clr **scheme; -static Display *dpy; -static Drw *drw; -static Monitor *mons, *selmon; -static Window root, wmcheckwin; - -/* configuration, allows nested code to access above variables */ -#include "config.h" - -static unsigned int scratchtag = 1 << LENGTH(tags); -/* compile-time check if all tags fit into an unsigned int bit array. */ -struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -/* function implementations */ -void -applyrules(Client *c) -{ - const char *class, *instance; - unsigned int i; - const Rule *r; - Monitor *m; - XClassHint ch = { NULL, NULL }; - - /* rule matching */ - c->isfloating = 0; - c->tags = 0; - XGetClassHint(dpy, c->win, &ch); - class = ch.res_class ? ch.res_class : broken; - instance = ch.res_name ? ch.res_name : broken; - - for (i = 0; i < LENGTH(rules); i++) { - r = &rules[i]; - if ((!r->title || strstr(c->name, r->title)) - && (!r->class || strstr(class, r->class)) - && (!r->instance || strstr(instance, r->instance))) - { - c->isfloating = r->isfloating; - c->tags |= r->tags; - for (m = mons; m && m->num != r->monitor; m = m->next); - if (m) - c->mon = m; - } - } - if (ch.res_class) - XFree(ch.res_class); - if (ch.res_name) - XFree(ch.res_name); - c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -} - -int -applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) -{ - int baseismin; - Monitor *m = c->mon; - - /* set minimum possible */ - *w = MAX(1, *w); - *h = MAX(1, *h); - if (interact) { - if (*x > sw) - *x = sw - WIDTH(c); - if (*y > sh) - *y = sh - HEIGHT(c); - if (*x + *w + 2 * c->bw < 0) - *x = 0; - if (*y + *h + 2 * c->bw < 0) - *y = 0; - } else { - if (*x >= m->wx + m->ww) - *x = m->wx + m->ww - WIDTH(c); - if (*y >= m->wy + m->wh) - *y = m->wy + m->wh - HEIGHT(c); - if (*x + *w + 2 * c->bw <= m->wx) - *x = m->wx; - if (*y + *h + 2 * c->bw <= m->wy) - *y = m->wy; - } - if (*h < bh) - *h = bh; - if (*w < bh) - *w = bh; - if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { - if (!c->hintsvalid) - updatesizehints(c); - /* see last two sentences in ICCCM 4.1.2.3 */ - baseismin = c->basew == c->minw && c->baseh == c->minh; - if (!baseismin) { /* temporarily remove base dimensions */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for aspect limits */ - if (c->mina > 0 && c->maxa > 0) { - if (c->maxa < (float)*w / *h) - *w = *h * c->maxa + 0.5; - else if (c->mina < (float)*h / *w) - *h = *w * c->mina + 0.5; - } - if (baseismin) { /* increment calculation requires this */ - *w -= c->basew; - *h -= c->baseh; - } - /* adjust for increment value */ - if (c->incw) - *w -= *w % c->incw; - if (c->inch) - *h -= *h % c->inch; - /* restore base dimensions */ - *w = MAX(*w + c->basew, c->minw); - *h = MAX(*h + c->baseh, c->minh); - if (c->maxw) - *w = MIN(*w, c->maxw); - if (c->maxh) - *h = MIN(*h, c->maxh); - } - return *x != c->x || *y != c->y || *w != c->w || *h != c->h; -} - -void -arrange(Monitor *m) -{ - if (m) - showhide(m->stack); - else for (m = mons; m; m = m->next) - showhide(m->stack); - if (m) { - arrangemon(m); - restack(m); - } else for (m = mons; m; m = m->next) - arrangemon(m); -} - -void -arrangemon(Monitor *m) -{ - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -} - -void -attach(Client *c) -{ - c->next = c->mon->clients; - c->mon->clients = c; -} - -void -attachstack(Client *c) -{ - c->snext = c->mon->stack; - c->mon->stack = c; -} - -void -buttonpress(XEvent *e) -{ - unsigned int i, x, click; - Arg arg = {0}; - Client *c; - Monitor *m; - XButtonPressedEvent *ev = &e->xbutton; - - click = ClkRootWin; - /* focus monitor if necessary */ - if ((m = wintomon(ev->window)) && m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - if (ev->window == selmon->barwin) { - i = x = 0; - do - x += TEXTW(tags[i]); - while (ev->x >= x && ++i < LENGTH(tags)); - if (i < LENGTH(tags)) { - click = ClkTagBar; - arg.ui = 1 << i; - } else if (ev->x < x + TEXTW(selmon->ltsymbol)) - click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) - click = ClkStatusText; - else - click = ClkWinTitle; - } else if ((c = wintoclient(ev->window))) { - focus(c); - restack(selmon); - XAllowEvents(dpy, ReplayPointer, CurrentTime); - click = ClkClientWin; - } - for (i = 0; i < LENGTH(buttons); i++) - if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button - && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -} - -void -checkotherwm(void) -{ - xerrorxlib = XSetErrorHandler(xerrorstart); - /* this causes an error if some other window manager is running */ - XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); - XSync(dpy, False); - XSetErrorHandler(xerror); - XSync(dpy, False); -} - -void -cleanup(void) -{ - Arg a = {.ui = ~0}; - Layout foo = { "", NULL }; - Monitor *m; - size_t i; - - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) - while (m->stack) - unmanage(m->stack, 0); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); - free(scheme); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); - XSync(dpy, False); - XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -} - -void -cleanupmon(Monitor *mon) -{ - Monitor *m; - - if (mon == mons) - mons = mons->next; - else { - for (m = mons; m && m->next != mon; m = m->next); - m->next = mon->next; - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); - free(mon); -} - -void -clientmessage(XEvent *e) -{ - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); - - if (!c) - return; - if (cme->message_type == netatom[NetWMState]) { - if (cme->data.l[1] == netatom[NetWMFullscreen] - || cme->data.l[2] == netatom[NetWMFullscreen]) - setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ - || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); - } else if (cme->message_type == netatom[NetActiveWindow]) { - if (c != selmon->sel && !c->isurgent) - seturgent(c, 1); - } -} - -void -configure(Client *c) -{ - XConfigureEvent ce; - - ce.type = ConfigureNotify; - ce.display = dpy; - ce.event = c->win; - ce.window = c->win; - ce.x = c->x; - ce.y = c->y; - ce.width = c->w; - ce.height = c->h; - ce.border_width = c->bw; - ce.above = None; - ce.override_redirect = False; - XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); -} - -void -configurenotify(XEvent *e) -{ - Monitor *m; - Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - - /* TODO: updategeom handling sucks, needs to be simplified */ - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; - sh = ev->height; - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); - arrange(NULL); - } - } -} - -void -configurerequest(XEvent *e) -{ - Client *c; - Monitor *m; - XConfigureRequestEvent *ev = &e->xconfigurerequest; - XWindowChanges wc; - - if ((c = wintoclient(ev->window))) { - if (ev->value_mask & CWBorderWidth) - c->bw = ev->border_width; - else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { - m = c->mon; - if (ev->value_mask & CWX) { - c->oldx = c->x; - c->x = m->mx + ev->x; - } - if (ev->value_mask & CWY) { - c->oldy = c->y; - c->y = m->my + ev->y; - } - if (ev->value_mask & CWWidth) { - c->oldw = c->w; - c->w = ev->width; - } - if (ev->value_mask & CWHeight) { - c->oldh = c->h; - c->h = ev->height; - } - if ((c->x + c->w) > m->mx + m->mw && c->isfloating) - c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ - if ((c->y + c->h) > m->my + m->mh && c->isfloating) - c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ - if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) - configure(c); - if (ISVISIBLE(c)) - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); - } else - configure(c); - } else { - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; - wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; - XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); - } - XSync(dpy, False); -} - -Monitor * -createmon(void) -{ - Monitor *m; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); - return m; -} - -void -destroynotify(XEvent *e) -{ - Client *c; - XDestroyWindowEvent *ev = &e->xdestroywindow; - - if ((c = wintoclient(ev->window))) - unmanage(c, 1); -} - -void -detach(Client *c) -{ - Client **tc; - - for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); - *tc = c->next; -} - -void -detachstack(Client *c) -{ - Client **tc, *t; - - for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); - *tc = c->snext; - - if (c == c->mon->sel) { - for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); - c->mon->sel = t; - } -} - -Monitor * -dirtomon(int dir) -{ - Monitor *m = NULL; - - if (dir > 0) { - if (!(m = selmon->next)) - m = mons; - } else if (selmon == mons) - for (m = mons; m->next; m = m->next); - else - for (m = mons; m->next != selmon; m = m->next); - return m; -} - -void -drawbar(Monitor *m) -{ - int x, w, tw = 0; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; - Client *c; - - if (!m->showbar) - return; - - /* draw status first so it can be overdrawn by tags later */ - if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); - } - - for (c = m->clients; c; c = c->next) { - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; - } - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } - w = TEXTW(m->ltsymbol); - drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - tw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } - } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); -} - -void -drawbars(void) -{ - Monitor *m; - - for (m = mons; m; m = m->next) - drawbar(m); -} - -void -enternotify(XEvent *e) -{ - Client *c; - Monitor *m; - XCrossingEvent *ev = &e->xcrossing; - - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) - return; - c = wintoclient(ev->window); - m = c ? c->mon : wintomon(ev->window); - if (m != selmon) { - unfocus(selmon->sel, 1); - selmon = m; - } else if (!c || c == selmon->sel) - return; - focus(c); -} - -void -expose(XEvent *e) -{ - Monitor *m; - XExposeEvent *ev = &e->xexpose; - - if (ev->count == 0 && (m = wintomon(ev->window))) - drawbar(m); -} - -void -focus(Client *c) -{ - if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - if (selmon->sel && selmon->sel != c) - unfocus(selmon->sel, 0); - if (c) { - if (c->mon != selmon) - selmon = c->mon; - if (c->isurgent) - seturgent(c, 0); - detachstack(c); - attachstack(c); - grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } - selmon->sel = c; - drawbars(); -} - -/* there are some broken focus acquiring clients needing extra handling */ -void -focusin(XEvent *e) -{ - XFocusChangeEvent *ev = &e->xfocus; - - if (selmon->sel && ev->window != selmon->sel->win) - setfocus(selmon->sel); -} - -void -focusmon(const Arg *arg) -{ - Monitor *m; - - if (!mons->next) - return; - if ((m = dirtomon(arg->i)) == selmon) - return; - unfocus(selmon->sel, 0); - selmon = m; - focus(NULL); -} - -void -focusstack(const Arg *arg) -{ - Client *c = NULL, *i; - - if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) - return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); - if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); - } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; - if (!c) - for (; i; i = i->next) - if (ISVISIBLE(i)) - c = i; - } - if (c) { - focus(c); - restack(selmon); - } -} - -Atom -getatomprop(Client *c, Atom prop) -{ - int di; - unsigned long dl; - unsigned char *p = NULL; - Atom da, atom = None; - - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; - XFree(p); - } - return atom; -} - -int -getrootptr(int *x, int *y) -{ - int di; - unsigned int dui; - Window dummy; - - return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); -} - -long -getstate(Window w) -{ - int format; - long result = -1; - unsigned char *p = NULL; - unsigned long n, extra; - Atom real; - - if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) - return -1; - if (n != 0) - result = *p; - XFree(p); - return result; -} - -int -gettextprop(Window w, Atom atom, char *text, unsigned int size) -{ - char **list = NULL; - int n; - XTextProperty name; - - if (!text || size == 0) - return 0; - text[0] = '\0'; - if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) - return 0; - if (name.encoding == XA_STRING) { - strncpy(text, (char *)name.value, size - 1); - } else if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); - XFreeStringList(list); - } - text[size - 1] = '\0'; - XFree(name.value); - return 1; -} - -void -grabbuttons(Client *c, int focused) -{ - updatenumlockmask(); - { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if (!focused) - XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeSync, GrabModeSync, None, None); - for (i = 0; i < LENGTH(buttons); i++) - if (buttons[i].click == ClkClientWin) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i].button, - buttons[i].mask | modifiers[j], - c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - } -} - -void -grabkeys(void) -{ - updatenumlockmask(); - { - unsigned int i, j, k; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - int start, end, skip; - KeySym *syms; - - XUngrabKey(dpy, AnyKey, AnyModifier, root); - XDisplayKeycodes(dpy, &start, &end); - syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip); - if (!syms) - return; - for (k = start; k <= end; k++) - for (i = 0; i < LENGTH(keys); i++) - /* skip modifier codes, we do that ourselves */ - if (keys[i].keysym == syms[(k - start) * skip]) - for (j = 0; j < LENGTH(modifiers); j++) - XGrabKey(dpy, k, - keys[i].mod | modifiers[j], - root, True, - GrabModeAsync, GrabModeAsync); - XFree(syms); - } -} - -void -incnmaster(const Arg *arg) -{ - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); -} - -#ifdef XINERAMA -static int -isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) -{ - while (n--) - if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org - && unique[n].width == info->width && unique[n].height == info->height) - return 0; - return 1; -} -#endif /* XINERAMA */ - -void -keypress(XEvent *e) -{ - unsigned int i; - KeySym keysym; - XKeyEvent *ev; - - ev = &e->xkey; - keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); - for (i = 0; i < LENGTH(keys); i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keys[i].func) - keys[i].func(&(keys[i].arg)); -} - -void -killclient(const Arg *arg) -{ - if (!selmon->sel) - return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { - XGrabServer(dpy); - XSetErrorHandler(xerrordummy); - XSetCloseDownMode(dpy, DestroyAll); - XKillClient(dpy, selmon->sel->win); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } -} - -void -manage(Window w, XWindowAttributes *wa) -{ - Client *c, *t = NULL; - Window trans = None; - XWindowChanges wc; - - c = ecalloc(1, sizeof(Client)); - c->win = w; - /* geometry */ - c->x = c->oldx = wa->x; - c->y = c->oldy = wa->y; - c->w = c->oldw = wa->width; - c->h = c->oldh = wa->height; - c->oldbw = wa->border_width; - - updatetitle(c); - if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { - c->mon = t->mon; - c->tags = t->tags; - } else { - c->mon = selmon; - applyrules(c); - } - - if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) - c->x = c->mon->wx + c->mon->ww - WIDTH(c); - if (c->y + HEIGHT(c) > c->mon->wy + c->mon->wh) - c->y = c->mon->wy + c->mon->wh - HEIGHT(c); - c->x = MAX(c->x, c->mon->wx); - c->y = MAX(c->y, c->mon->wy); - c->bw = borderpx; - - selmon->tagset[selmon->seltags] &= ~scratchtag; - if (!strcmp(c->name, scratchpadname)) { - c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag; - c->isfloating = True; - c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); - c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); - } - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); - XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); - c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2; - c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2; - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); - grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); - attach(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); - XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ - setclientstate(c, NormalState); - if (c->mon == selmon) - unfocus(selmon->sel, 0); - c->mon->sel = c; - arrange(c->mon); - XMapWindow(dpy, c->win); - focus(NULL); -} - -void -mappingnotify(XEvent *e) -{ - XMappingEvent *ev = &e->xmapping; - - XRefreshKeyboardMapping(ev); - if (ev->request == MappingKeyboard) - grabkeys(); -} - -void -maprequest(XEvent *e) -{ - static XWindowAttributes wa; - XMapRequestEvent *ev = &e->xmaprequest; - - if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) - return; - if (!wintoclient(ev->window)) - manage(ev->window, &wa); -} - -void -monocle(Monitor *m) -{ - unsigned int n = 0; - Client *c; - - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; - if (n > 0) /* override layout symbol */ - snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); - for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) - resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); -} - -void -motionnotify(XEvent *e) -{ - static Monitor *mon = NULL; - Monitor *m; - XMotionEvent *ev = &e->xmotion; - - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { - unfocus(selmon->sel, 1); - selmon = m; - focus(NULL); - } - mon = m; -} - -void -movemouse(const Arg *arg) -{ - int x, y, ocx, ocy, nx, ny; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nx = ocx + (ev.xmotion.x - x); - ny = ocy + (ev.xmotion.y - y); - if (abs(selmon->wx - nx) < snap) - nx = selmon->wx; - else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) - nx = selmon->wx + selmon->ww - WIDTH(c); - if (abs(selmon->wy - ny) < snap) - ny = selmon->wy; - else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) - ny = selmon->wy + selmon->wh - HEIGHT(c); - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) - togglefloating(NULL); - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, nx, ny, c->w, c->h, 1); - break; - } - } while (ev.type != ButtonRelease); - XUngrabPointer(dpy, CurrentTime); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -Client * -nexttiled(Client *c) -{ - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); - return c; -} - -void -pop(Client *c) -{ - detach(c); - attach(c); - focus(c); - arrange(c->mon); -} - -void -propertynotify(XEvent *e) -{ - Client *c; - Window trans; - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) - updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { - switch(ev->atom) { - default: break; - case XA_WM_TRANSIENT_FOR: - if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && - (c->isfloating = (wintoclient(trans)) != NULL)) - arrange(c->mon); - break; - case XA_WM_NORMAL_HINTS: - c->hintsvalid = 0; - break; - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { - updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); - } -} - -void -quit(const Arg *arg) -{ - running = 0; -} - -Monitor * -recttomon(int x, int y, int w, int h) -{ - Monitor *m, *r = selmon; - int a, area = 0; - - for (m = mons; m; m = m->next) - if ((a = INTERSECT(x, y, w, h, m)) > area) { - area = a; - r = m; - } - return r; -} - -void -resize(Client *c, int x, int y, int w, int h, int interact) -{ - if (applysizehints(c, &x, &y, &w, &h, interact)) - resizeclient(c, x, y, w, h); -} - -void -resizeclient(Client *c, int x, int y, int w, int h) -{ - XWindowChanges wc; - - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); - configure(c); - XSync(dpy, False); -} - -void -resizemouse(const Arg *arg) -{ - int ocx, ocy, nw, nh; - Client *c; - Monitor *m; - XEvent ev; - Time lasttime = 0; - - if (!(c = selmon->sel)) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, - None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { - XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); - switch(ev.type) { - case ConfigureRequest: - case Expose: - case MapRequest: - handler[ev.type](&ev); - break; - case MotionNotify: - if ((ev.xmotion.time - lasttime) <= (1000 / 60)) - continue; - lasttime = ev.xmotion.time; - - nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); - nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); - if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww - && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) - { - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange - && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) - togglefloating(NULL); - } - if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) - resize(c, c->x, c->y, nw, nh, 1); - break; - } - } while (ev.type != ButtonRelease); - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - XUngrabPointer(dpy, CurrentTime); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); - if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { - sendmon(c, m); - selmon = m; - focus(NULL); - } -} - -void -restack(Monitor *m) -{ - Client *c; - XEvent ev; - XWindowChanges wc; - - drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) - XRaiseWindow(dpy, m->sel->win); - if (m->lt[m->sellt]->arrange) { - wc.stack_mode = Below; - wc.sibling = m->barwin; - for (c = m->stack; c; c = c->snext) - if (!c->isfloating && ISVISIBLE(c)) { - XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); - wc.sibling = c->win; - } - } - XSync(dpy, False); - while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -run(void) -{ - XEvent ev; - /* main event loop */ - XSync(dpy, False); - while (running && !XNextEvent(dpy, &ev)) - if (handler[ev.type]) - handler[ev.type](&ev); /* call handler */ -} - -void -scan(void) -{ - unsigned int i, num; - Window d1, d2, *wins = NULL; - XWindowAttributes wa; - - if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) - manage(wins[i], &wa); - } - for (i = 0; i < num; i++) { /* now the transients */ - if (!XGetWindowAttributes(dpy, wins[i], &wa)) - continue; - if (XGetTransientForHint(dpy, wins[i], &d1) - && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) - manage(wins[i], &wa); - } - if (wins) - XFree(wins); - } -} - -void -sendmon(Client *c, Monitor *m) -{ - if (c->mon == m) - return; - unfocus(c, 1); - detach(c); - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); - attachstack(c); - focus(NULL); - arrange(NULL); -} - -void -setclientstate(Client *c, long state) -{ - long data[] = { state, None }; - - XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, - PropModeReplace, (unsigned char *)data, 2); -} - -int -sendevent(Client *c, Atom proto) -{ - int n; - Atom *protocols; - int exists = 0; - XEvent ev; - - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); - } - if (exists) { - ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; - ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); - } - return exists; -} - -void -setfocus(Client *c) -{ - if (!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); -} - -void -setfullscreen(Client *c, int fullscreen) -{ - if (fullscreen && !c->isfullscreen) { - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; - c->oldstate = c->isfloating; - c->oldbw = c->bw; - c->bw = 0; - c->isfloating = 1; - resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); - XRaiseWindow(dpy, c->win); - } else if (!fullscreen && c->isfullscreen){ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)0, 0); - c->isfullscreen = 0; - c->isfloating = c->oldstate; - c->bw = c->oldbw; - c->x = c->oldx; - c->y = c->oldy; - c->w = c->oldw; - c->h = c->oldh; - resizeclient(c, c->x, c->y, c->w, c->h); - arrange(c->mon); - } -} - -void -setlayout(const Arg *arg) -{ - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; - if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); - else - drawbar(selmon); -} - -/* arg > 1.0 will set mfact absolutely */ -void -setmfact(const Arg *arg) -{ - float f; - - if (!arg || !selmon->lt[selmon->sellt]->arrange) - return; - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.05 || f > 0.95) - return; - selmon->mfact = f; - arrange(selmon); -} - -void -setup(void) -{ - int i; - XSetWindowAttributes wa; - Atom utf8string; - struct sigaction sa; - - /* do not transform children into zombies when they terminate */ - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART; - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); - - /* clean up any zombies (inherited from .xinitrc etc) immediately */ - while (waitpid(-1, NULL, WNOHANG) > 0); - - /* init screen */ - screen = DefaultScreen(dpy); - sw = DisplayWidth(dpy, screen); - sh = DisplayHeight(dpy, screen); - root = RootWindow(dpy, screen); - drw = drw_create(dpy, screen, root, sw, sh); - if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) - die("no fonts could be loaded."); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; - updategeom(); - /* init atoms */ - utf8string = XInternAtom(dpy, "UTF8_STRING", False); - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); - wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); - wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); - netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); - netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); - netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); - netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); - netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); - netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ - cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ - updatebars(); - updatestatus(); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, - PropModeReplace, (unsigned char *) "dwm", 3); - XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wmcheckwin, 1); - /* EWMH support per view */ - XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, - PropModeReplace, (unsigned char *) netatom, NetLast); - XDeleteProperty(dpy, root, netatom[NetClientList]); - /* select events */ - wa.cursor = cursor[CurNormal]->cursor; - wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask - |ButtonPressMask|PointerMotionMask|EnterWindowMask - |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; - XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); - XSelectInput(dpy, root, wa.event_mask); - grabkeys(); - focus(NULL); -} - -void -seturgent(Client *c, int urg) -{ - XWMHints *wmh; - - c->isurgent = urg; - if (!(wmh = XGetWMHints(dpy, c->win))) - return; - wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); - XSetWMHints(dpy, c->win, wmh); - XFree(wmh); -} - -void -showhide(Client *c) -{ - if (!c) - return; - if (ISVISIBLE(c)) { - /* show clients top down */ - XMoveWindow(dpy, c->win, c->x, c->y); - if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) - resize(c, c->x, c->y, c->w, c->h, 0); - showhide(c->snext); - } else { - /* hide clients bottom up */ - showhide(c->snext); - XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); - } -} - -void -spawn(const Arg *arg) -{ - struct sigaction sa; - - if (arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; - selmon->tagset[selmon->seltags] &= ~scratchtag; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - setsid(); - - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = SIG_DFL; - sigaction(SIGCHLD, &sa, NULL); - - execvp(((char **)arg->v)[0], (char **)arg->v); - die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); - } -} - -void -tag(const Arg *arg) -{ - if (selmon->sel && arg->ui & TAGMASK) { - selmon->sel->tags = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); - } -} - -void -tagmon(const Arg *arg) -{ - if (!selmon->sel || !mons->next) - return; - sendmon(selmon->sel, dirtomon(arg->i)); -} - -void -tile(Monitor *m) -{ - unsigned int i, n, h, mw, my, ty; - Client *c; - - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); - if (n == 0) - return; - - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else - mw = m->ww; - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { - h = (m->wh - my) / (MIN(n, m->nmaster) - i); - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); - if (my + HEIGHT(c) < m->wh) - my += HEIGHT(c); - } else { - h = (m->wh - ty) / (n - i); - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); - if (ty + HEIGHT(c) < m->wh) - ty += HEIGHT(c); - } -} - -void -togglebar(const Arg *arg) -{ - selmon->showbar = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); -} - -void -togglefloating(const Arg *arg) -{ - if (!selmon->sel) - return; - if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) - resize(selmon->sel, selmon->sel->x, selmon->sel->y, - selmon->sel->w, selmon->sel->h, 0); - arrange(selmon); -} - -void -togglescratch(const Arg *arg) -{ - Client *c; - unsigned int found = 0; - - for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); - if (found) { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } - if (ISVISIBLE(c)) { - focus(c); - restack(selmon); - } - } else - spawn(arg); -} -void -togglefullscr(const Arg *arg) -{ - if(selmon->sel) - setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -} - -void -toggletag(const Arg *arg) -{ - unsigned int newtags; - - if (!selmon->sel) - return; - newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); - if (newtags) { - selmon->sel->tags = newtags; - focus(NULL); - arrange(selmon); - } -} - -void -toggleview(const Arg *arg) -{ - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); - - if (newtagset) { - selmon->tagset[selmon->seltags] = newtagset; - focus(NULL); - arrange(selmon); - } -} - -void -unfocus(Client *c, int setfocus) -{ - if (!c) - return; - grabbuttons(c, 0); - XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); - } -} - -void -unmanage(Client *c, int destroyed) -{ - Monitor *m = c->mon; - XWindowChanges wc; - - detach(c); - detachstack(c); - if (!destroyed) { - wc.border_width = c->oldbw; - XGrabServer(dpy); /* avoid race conditions */ - XSetErrorHandler(xerrordummy); - XSelectInput(dpy, c->win, NoEventMask); - XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - setclientstate(c, WithdrawnState); - XSync(dpy, False); - XSetErrorHandler(xerror); - XUngrabServer(dpy); - } - free(c); - focus(NULL); - updateclientlist(); - arrange(m); -} - -void -unmapnotify(XEvent *e) -{ - Client *c; - XUnmapEvent *ev = &e->xunmap; - - if ((c = wintoclient(ev->window))) { - if (ev->send_event) - setclientstate(c, WithdrawnState); - else - unmanage(c, 0); - } -} - -void -updatebars(void) -{ - Monitor *m; - XSetWindowAttributes wa = { - .override_redirect = True, - .background_pixmap = ParentRelative, - .event_mask = ButtonPressMask|ExposureMask - }; - XClassHint ch = {"dwm", "dwm"}; - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); - XSetClassHint(dpy, m->barwin, &ch); - } -} - -void -updatebarpos(Monitor *m) -{ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; - m->wy = m->topbar ? m->wy + bh : m->wy; - } else - m->by = -bh; -} - -void -updateclientlist() -{ - Client *c; - Monitor *m; - - XDeleteProperty(dpy, root, netatom[NetClientList]); - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - XChangeProperty(dpy, root, netatom[NetClientList], - XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -} - -int -updategeom(void) -{ - int dirty = 0; - -#ifdef XINERAMA - if (XineramaIsActive(dpy)) { - int i, j, n, nn; - Client *c; - Monitor *m; - XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); - XineramaScreenInfo *unique = NULL; - - for (n = 0, m = mons; m; m = m->next, n++); - /* only consider unique geometries as separate screens */ - unique = ecalloc(nn, sizeof(XineramaScreenInfo)); - for (i = 0, j = 0; i < nn; i++) - if (isuniquegeom(unique, j, &info[i])) - memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); - XFree(info); - nn = j; - - /* new monitors if nn > n */ - for (i = n; i < nn; i++) { - for (m = mons; m && m->next; m = m->next); - if (m) - m->next = createmon(); - else - mons = createmon(); - } - for (i = 0, m = mons; i < nn && m; m = m->next, i++) - if (i >= n - || unique[i].x_org != m->mx || unique[i].y_org != m->my - || unique[i].width != m->mw || unique[i].height != m->mh) - { - dirty = 1; - m->num = i; - m->mx = m->wx = unique[i].x_org; - m->my = m->wy = unique[i].y_org; - m->mw = m->ww = unique[i].width; - m->mh = m->wh = unique[i].height; - updatebarpos(m); - } - /* removed monitors if n > nn */ - for (i = nn; i < n; i++) { - for (m = mons; m && m->next; m = m->next); - while ((c = m->clients)) { - dirty = 1; - m->clients = c->next; - detachstack(c); - c->mon = mons; - attach(c); - attachstack(c); - } - if (m == selmon) - selmon = mons; - cleanupmon(m); - } - free(unique); - } else -#endif /* XINERAMA */ - { /* default monitor setup */ - if (!mons) - mons = createmon(); - if (mons->mw != sw || mons->mh != sh) { - dirty = 1; - mons->mw = mons->ww = sw; - mons->mh = mons->wh = sh; - updatebarpos(mons); - } - } - if (dirty) { - selmon = mons; - selmon = wintomon(root); - } - return dirty; -} - -void -updatenumlockmask(void) -{ - unsigned int i, j; - XModifierKeymap *modmap; - - numlockmask = 0; - modmap = XGetModifierMapping(dpy); - for (i = 0; i < 8; i++) - for (j = 0; j < modmap->max_keypermod; j++) - if (modmap->modifiermap[i * modmap->max_keypermod + j] - == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); -} - -void -updatesizehints(Client *c) -{ - long msize; - XSizeHints size; - - if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) - /* size is uninitialized, ensure that size.flags aren't used */ - size.flags = PSize; - if (size.flags & PBaseSize) { - c->basew = size.base_width; - c->baseh = size.base_height; - } else if (size.flags & PMinSize) { - c->basew = size.min_width; - c->baseh = size.min_height; - } else - c->basew = c->baseh = 0; - if (size.flags & PResizeInc) { - c->incw = size.width_inc; - c->inch = size.height_inc; - } else - c->incw = c->inch = 0; - if (size.flags & PMaxSize) { - c->maxw = size.max_width; - c->maxh = size.max_height; - } else - c->maxw = c->maxh = 0; - if (size.flags & PMinSize) { - c->minw = size.min_width; - c->minh = size.min_height; - } else if (size.flags & PBaseSize) { - c->minw = size.base_width; - c->minh = size.base_height; - } else - c->minw = c->minh = 0; - if (size.flags & PAspect) { - c->mina = (float)size.min_aspect.y / size.min_aspect.x; - c->maxa = (float)size.max_aspect.x / size.max_aspect.y; - } else - c->maxa = c->mina = 0.0; - c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); - c->hintsvalid = 1; -} - -void -updatestatus(void) -{ - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); - drawbar(selmon); -} - -void -updatetitle(Client *c) -{ - if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); - if (c->name[0] == '\0') /* hack to mark broken clients */ - strcpy(c->name, broken); -} - -void -updatewindowtype(Client *c) -{ - Atom state = getatomprop(c, netatom[NetWMState]); - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) - setfullscreen(c, 1); - if (wtype == netatom[NetWMWindowTypeDialog]) - c->isfloating = 1; -} - -void -updatewmhints(Client *c) -{ - XWMHints *wmh; - - if ((wmh = XGetWMHints(dpy, c->win))) { - if (c == selmon->sel && wmh->flags & XUrgencyHint) { - wmh->flags &= ~XUrgencyHint; - XSetWMHints(dpy, c->win, wmh); - } else - c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; - if (wmh->flags & InputHint) - c->neverfocus = !wmh->input; - else - c->neverfocus = 0; - XFree(wmh); - } -} - -void -view(const Arg *arg) -{ - if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - focus(NULL); - arrange(selmon); -} - -Client * -wintoclient(Window w) -{ - Client *c; - Monitor *m; - - for (m = mons; m; m = m->next) - for (c = m->clients; c; c = c->next) - if (c->win == w) - return c; - return NULL; -} - -Monitor * -wintomon(Window w) -{ - int x, y; - Client *c; - Monitor *m; - - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) - if (w == m->barwin) - return m; - if ((c = wintoclient(w))) - return c->mon; - return selmon; -} - -/* There's no way to check accesses to destroyed windows, thus those cases are - * ignored (especially on UnmapNotify's). Other types of errors call Xlibs - * default error handler, which may call exit. */ -int -xerror(Display *dpy, XErrorEvent *ee) -{ - if (ee->error_code == BadWindow - || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) - || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) - || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) - || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) - || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) - || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) - || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) - || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) - return 0; - fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", - ee->request_code, ee->error_code); - return xerrorxlib(dpy, ee); /* may call exit */ -} - -int -xerrordummy(Display *dpy, XErrorEvent *ee) -{ - return 0; -} - -/* Startup Error handler to check if another window manager - * is already running. */ -int -xerrorstart(Display *dpy, XErrorEvent *ee) -{ - die("dwm: another window manager is already running"); - return -1; -} - -void -zoom(const Arg *arg) -{ - Client *c = selmon->sel; - - if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) - return; - if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) - return; - pop(c); -} - -int -main(int argc, char *argv[]) -{ - if (argc == 2 && !strcmp("-v", argv[1])) - die("dwm-"VERSION); - else if (argc != 1) - die("usage: dwm [-v]"); - if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) - fputs("warning: no locale support\n", stderr); - if (!(dpy = XOpenDisplay(NULL))) - die("dwm: cannot open display"); - checkotherwm(); - setup(); -#ifdef __OpenBSD__ - if (pledge("stdio rpath proc exec", NULL) == -1) - die("pledge"); -#endif /* __OpenBSD__ */ - scan(); - run(); - cleanup(); - XCloseDisplay(dpy); - return EXIT_SUCCESS; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej b/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej deleted file mode 100644 index 10b98fd..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/dwm.c.rej +++ /dev/null @@ -1,23 +0,0 @@ ---- dwm.c -+++ dwm.c -@@ -274,11 +279,19 @@ static Drw *drw; - static Monitor *mons, *selmon; - static Window root, wmcheckwin; - -+/* scratchpad */ -+#define SCRATCHPAD_MASK_1 (1u << sizeof tags / sizeof * tags) -+#define SCRATCHPAD_MASK_2 (1u << (sizeof tags / sizeof * tags + 1)) -+#define SCRATCHPAD_MASK_3 (1u << (sizeof tags / sizeof * tags + 2)) -+static int scratchpad_hide_flag = 0; -+static Client *scratchpad_last_showed_1 = NULL; -+static Client *scratchpad_last_showed_2 = NULL; -+static Client *scratchpad_last_showed_3 = NULL; - /* configuration, allows nested code to access above variables */ - #include "config.h" - - /* compile-time check if all tags fit into an unsigned int bit array. */ --struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; -+struct NumTags { char limitexceeded[LENGTH(tags) > 28 ? -1 : 1]; }; - - /* function implementations */ - void diff --git a/hosts/vali/mars/dwm/dwm-6.5/dwm.o b/hosts/vali/mars/dwm/dwm-6.5/dwm.o deleted file mode 100644 index 167e75d11e0e21d9afa10ecd139c0e990adfa918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59856 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 GgeCxv)opSB diff --git a/hosts/vali/mars/dwm/dwm-6.5/shell.nix b/hosts/vali/mars/dwm/dwm-6.5/shell.nix deleted file mode 100644 index 883e00e..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/shell.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ pkgs ? import {} }: - pkgs.mkShell { - nativeBuildInputs = with pkgs; [ - gnumake - xorg.libX11.dev - xorg.libXft - xorg.libXinerama - ]; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/transient.c b/hosts/vali/mars/dwm/dwm-6.5/transient.c deleted file mode 100644 index 040adb5..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/transient.c +++ /dev/null @@ -1,42 +0,0 @@ -/* cc transient.c -o transient -lX11 */ - -#include -#include -#include -#include - -int main(void) { - Display *d; - Window r, f, t = None; - XSizeHints h; - XEvent e; - - d = XOpenDisplay(NULL); - if (!d) - exit(1); - r = DefaultRootWindow(d); - - f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0); - h.min_width = h.max_width = h.min_height = h.max_height = 400; - h.flags = PMinSize | PMaxSize; - XSetWMNormalHints(d, f, &h); - XStoreName(d, f, "floating"); - XMapWindow(d, f); - - XSelectInput(d, f, ExposureMask); - while (1) { - XNextEvent(d, &e); - - if (t == None) { - sleep(5); - t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0); - XSetTransientForHint(d, t, f); - XStoreName(d, t, "transient"); - XMapWindow(d, t); - XSelectInput(d, t, ExposureMask); - } - } - - XCloseDisplay(d); - exit(0); -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/util.c b/hosts/vali/mars/dwm/dwm-6.5/util.c deleted file mode 100644 index 96b82c9..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/util.c +++ /dev/null @@ -1,36 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include -#include -#include -#include - -#include "util.h" - -void -die(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - va_end(ap); - - if (fmt[0] && fmt[strlen(fmt)-1] == ':') { - fputc(' ', stderr); - perror(NULL); - } else { - fputc('\n', stderr); - } - - exit(1); -} - -void * -ecalloc(size_t nmemb, size_t size) -{ - void *p; - - if (!(p = calloc(nmemb, size))) - die("calloc:"); - return p; -} diff --git a/hosts/vali/mars/dwm/dwm-6.5/util.h b/hosts/vali/mars/dwm/dwm-6.5/util.h deleted file mode 100644 index f633b51..0000000 --- a/hosts/vali/mars/dwm/dwm-6.5/util.h +++ /dev/null @@ -1,8 +0,0 @@ -/* See LICENSE file for copyright and license details. */ - -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) - -void die(const char *fmt, ...); -void *ecalloc(size_t nmemb, size_t size); diff --git a/hosts/vali/mars/dwm/dwm-6.5/util.o b/hosts/vali/mars/dwm/dwm-6.5/util.o deleted file mode 100644 index 4b569ab3cf3d20cbdf0c56dd2448b4cd6d4ad19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmb<-^>JfjWMqH=Mg}_u1P><4z~I4(U^{@B4h(z@ybPhi9-Y5E8sFStU|{g*EK$+$ z=nPRY@aXhWvGD11QE~9;^ilC>IZ$HGuj!%^z_00}lEAMSqEf)GIY*^|fq{WvbBW3X zFug`)0hr#RvH?u*Q8~cCz>wn6&7!ISHrz!;!tj7cw=T$bkIsi4owq!CTU0(UFfi<6 zVqjo6&Z5ErQrBI};L+)#!r{^DqM~rzMTNxxB--hsBJcvFv%#97M9rh~K7>=l{NJin z+@rgcVZQj1q)av7)*L}9`wk2qCElyODu`L6Cug zK>$@Ln5T|ITn~phD9o{$?7I4BLV zBZ==q5(mW*O#OKzaZnnAiC;q!2PJu!_%kGNWc8qI2a*EW%Z+63H;^C$12~<7(g4gH zR#3uXU|;~{RAwagJWz3vIUo#E56UATqd@9G7{mr)NZA812P6)Q9|pbR%G{E~BnG|W zk|GG50b>=V<|OKsq*jzL=%plbdHE%& zdhULqy2T}l$=OhTdS0nsK~a7|YEelggC5wx)QtGFqQu-(kgF)iApe4b0u;B%rosFx z3X(*UK;tqB7p03~4d!)TDdL2OWA4^;xDVnKoo3=G0x z9)f@hgZ&H=^@Q3FVk6@Mm_lShENUYe7#KkL50oa6mBRF+y9?bvg-|om^)G