first commit
@@ -0,0 +1,200 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1751685974,
|
||||||
|
"narHash": "sha256-NKw96t+BgHIYzHUjkTK95FqYRVKB8DHpVhefWSz/kTw=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "549f2762aebeff29a2e5ece7a7dc0f955281a1d1",
|
||||||
|
"revCount": 92,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.lix.systems/lix-project/flake-compat.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.lix.systems/lix-project/flake-compat.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": [
|
||||||
|
"nvf",
|
||||||
|
"nvf",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1753121425,
|
||||||
|
"narHash": "sha256-TVcTNvOeWWk1DXljFxVRp+E0tzG1LhrVjOGGoMHuXio=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "644e0fc48951a860279da645ba77fe4a6e814c5e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1781477932,
|
||||||
|
"narHash": "sha256-7EZqIpytCiWoVsUQIRytWr2H0esy2xuntQHjG4Hb/48=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "ed8263e7d7813ec8f447e78e5dcd7f94f333f1d5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mnw": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1748710831,
|
||||||
|
"narHash": "sha256-eZu2yH3Y2eA9DD3naKWy/sTxYS5rPK2hO7vj8tvUCSU=",
|
||||||
|
"owner": "Gerg-L",
|
||||||
|
"repo": "mnw",
|
||||||
|
"rev": "cff958a4e050f8d917a6ff3a5624bc4681c6187d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Gerg-L",
|
||||||
|
"repo": "mnw",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1780365719,
|
||||||
|
"narHash": "sha256-QfWfccTN+70ZQ4m2qlU9PiKfz2Yppq94058iJyARNwc=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "ffa10e26ae11d676b2db836259889f1f571cb14f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1781577229,
|
||||||
|
"narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "567a49d1913ce81ac6e9582e3553dd90a955875f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1754214453,
|
||||||
|
"narHash": "sha256-Q/I2xJn/j1wpkGhWkQnm20nShYnG7TI99foDBpXm1SY=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5b09dc45f24cf32316283e62aec81ffee3c3e376",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1753432016,
|
||||||
|
"narHash": "sha256-cnL5WWn/xkZoyH/03NNUS7QgW5vI7D1i74g48qplCvg=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "6027c30c8e9810896b92429f0092f624f7b1aace",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvf": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs_3",
|
||||||
|
"nvf": "nvf_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"path": "./modules/nvim",
|
||||||
|
"type": "path"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"path": "./modules/nvim",
|
||||||
|
"type": "path"
|
||||||
|
},
|
||||||
|
"parent": []
|
||||||
|
},
|
||||||
|
"nvf_2": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"mnw": "mnw",
|
||||||
|
"nixpkgs": "nixpkgs_4",
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1754388740,
|
||||||
|
"narHash": "sha256-6++6FDc/hcMpaJPgOrGzwmzCSgix3zIlcuTIy9+aNSs=",
|
||||||
|
"owner": "notashelf",
|
||||||
|
"repo": "nvf",
|
||||||
|
"rev": "22fb0d22cc474e85f94c5aa95b6c550c81ca7278",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "notashelf",
|
||||||
|
"repo": "nvf",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"nixpkgs": "nixpkgs_2",
|
||||||
|
"nvf": "nvf"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
home-manager.url = "github:nix-community/home-manager";
|
||||||
|
nvf.url = "path:./modules/nvim";
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs, home-manager, nvf, ... }@inputs:
|
||||||
|
let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
in {
|
||||||
|
nixosConfigurations.darkstar = nixpkgs.lib.nixosSystem {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
specialArgs = { inherit inputs system; };
|
||||||
|
modules = [
|
||||||
|
nvf.nixosModules.default
|
||||||
|
./hosts/darkstar/configuration.nix
|
||||||
|
home-manager.nixosModules.home-manager
|
||||||
|
{
|
||||||
|
home-manager = {
|
||||||
|
useGlobalPkgs = true;
|
||||||
|
useUserPackages = true;
|
||||||
|
extraSpecialArgs = { inherit inputs; };
|
||||||
|
users.user = ./modules/home/home.nix;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
./hardware-configuration.nix
|
||||||
|
../../modules/default.nix
|
||||||
|
];
|
||||||
|
networking.hostName = "darkstar";
|
||||||
|
boot.initrd.luks.devices."luks-9cd65807-a47b-4ffe-ac11-05680b9fffb0".device = "/dev/disk/by-uuid/9cd65807-a47b-4ffe-ac11-05680b9fffb0";
|
||||||
|
time.timeZone = "Europe/Berlin";
|
||||||
|
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
|
||||||
|
# programs.gnupg.agent = {
|
||||||
|
# enable = true;
|
||||||
|
# enableSSHSupport = true;
|
||||||
|
# };
|
||||||
|
|
||||||
|
|
||||||
|
services.openssh.enable = true;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-amd" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/mapper/luks-3072c85b-5f74-4088-b78c-e9ed6e9104eb";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.initrd.luks.devices."luks-3072c85b-5f74-4088-b78c-e9ed6e9104eb".device = "/dev/disk/by-uuid/3072c85b-5f74-4088-b78c-e9ed6e9104eb";
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/87AD-413A";
|
||||||
|
fsType = "vfat";
|
||||||
|
options = [ "fmask=0077" "dmask=0077" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices =
|
||||||
|
[ { device = "/dev/mapper/luks-9cd65807-a47b-4ffe-ac11-05680b9fffb0"; }
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
./hardware-configuration.nix
|
||||||
|
../../modules/default.nix
|
||||||
|
];
|
||||||
|
networking.hostName = "molniya";
|
||||||
|
boot.initrd.luks.devices."luks-9cd65807-a47b-4ffe-ac11-05680b9fffb0".device = "/dev/disk/by-uuid/9cd65807-a47b-4ffe-ac11-05680b9fffb0";
|
||||||
|
time.timeZone = "Europe/Berlin";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
services.openssh.enable = true;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "sdhci_pci" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/mapper/luks-d810fef7-b1c9-4007-bcb1-12c99c8692b0";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.initrd.luks.devices."luks-d810fef7-b1c9-4007-bcb1-12c99c8692b0".device = "/dev/disk/by-uuid/d810fef7-b1c9-4007-bcb1-12c99c8692b0";
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/9BFC-2A7B";
|
||||||
|
fsType = "vfat";
|
||||||
|
options = [ "fmask=0077" "dmask=0077" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
boot = {
|
||||||
|
initrd = {
|
||||||
|
luks = {
|
||||||
|
devices."luks-9cd65807-a47b-4ffe-ac11-05680b9fffb0".device = "/dev/disk/by-uuid/9cd65807-a47b-4ffe-ac11-05680b9fffb0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extraModulePackages = with config.boot.kernelPackages; [ ];
|
||||||
|
kernelParams = [ "debug" ];
|
||||||
|
loader = {
|
||||||
|
efi = {
|
||||||
|
# canTouchEfiVariables = true;
|
||||||
|
efiSysMountPoint = "/boot";
|
||||||
|
};
|
||||||
|
grub = {
|
||||||
|
enable = true;
|
||||||
|
copyKernels = true;
|
||||||
|
efiInstallAsRemovable = true;
|
||||||
|
enableCryptodisk = false;
|
||||||
|
efiSupport = true;
|
||||||
|
devices = [ "nodev" ];
|
||||||
|
extraEntries = ''
|
||||||
|
menuentry "Reboot" {
|
||||||
|
reboot
|
||||||
|
}
|
||||||
|
menuentry "Poweroff" {
|
||||||
|
halt
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
./boot.nix
|
||||||
|
./users.nix
|
||||||
|
./networking.nix
|
||||||
|
./security.nix
|
||||||
|
./system.nix
|
||||||
|
./environment.nix
|
||||||
|
./gaming.nix
|
||||||
|
./media.nix
|
||||||
|
./graphics.nix
|
||||||
|
#./openrgb.nix
|
||||||
|
./shell.nix
|
||||||
|
./irc.nix
|
||||||
|
./devel/default.nix
|
||||||
|
./dwm/default.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./nix-lang.nix
|
||||||
|
./python.nix
|
||||||
|
./lua.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [ luaPackages.lua-lsp ];
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
nixd
|
||||||
|
nil
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [ basedpyright ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
dmenu alacritty feh flameshot
|
||||||
|
];
|
||||||
|
services = {
|
||||||
|
xserver = {
|
||||||
|
enable = true;
|
||||||
|
xkb = {
|
||||||
|
layout = "us";
|
||||||
|
variant = "";
|
||||||
|
};
|
||||||
|
displayManager.startx.enable = true;
|
||||||
|
windowManager = {
|
||||||
|
dwm = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.dwm.overrideAttrs {
|
||||||
|
src = ./source/dwm;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# 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 config.h 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 config.h 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
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||||
|
static const unsigned int snap = 32; /* snap pixel */
|
||||||
|
static const unsigned int gappih = 10; /* horiz inner gap between windows */
|
||||||
|
static const unsigned int gappiv = 10; /* vert inner gap between windows */
|
||||||
|
static const unsigned int gappoh =
|
||||||
|
10; /* horiz outer gap between windows and screen edge */
|
||||||
|
static const unsigned int gappov =
|
||||||
|
10; /* vert outer gap between windows and screen edge */
|
||||||
|
static int smartgaps =
|
||||||
|
0; /* 1 means no outer gap when there is only one window */
|
||||||
|
static const int showbar = 0; /* 0 means no bar */
|
||||||
|
static const int topbar = 0; /* 0 means bottom bar */
|
||||||
|
static const char *fonts[] = {"Terminess Nerd Font Mono:size=10"};
|
||||||
|
static const char dmenufont[] = "Terminess Nerd Font Mono:size=10";
|
||||||
|
|
||||||
|
static const char col_gray1[] = "#010101";
|
||||||
|
static const char col_gray2[] = "#ffffff";
|
||||||
|
static const char col_gray3[] = "#dde1e6";
|
||||||
|
static const char col_gray4[] = "#ffffff";
|
||||||
|
static const char col_cyan[] = "#010101";
|
||||||
|
|
||||||
|
static const char *colors[][3] = {
|
||||||
|
/* fg bg border */
|
||||||
|
[SchemeNorm] = {col_gray3, col_gray1, col_gray1},
|
||||||
|
[SchemeSel] = {col_gray4, col_cyan, col_gray2},
|
||||||
|
};
|
||||||
|
|
||||||
|
/* tagging */
|
||||||
|
static const char *tags[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
|
||||||
|
|
||||||
|
static const Rule rules[] = {
|
||||||
|
{"Gimp", NULL, NULL, 0, 1, -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 */
|
||||||
|
|
||||||
|
#define FORCE_VSPLIT \
|
||||||
|
1 /* nrowgrid layout: force two clients to always split vertically */
|
||||||
|
#include "vanitygaps.c"
|
||||||
|
#include <X11/XF86keysym.h>
|
||||||
|
|
||||||
|
static const Layout layouts[] = {
|
||||||
|
{"><>", NULL},
|
||||||
|
//{NULL, centeredfloatingmaster},
|
||||||
|
//{"|M|", centeredmaster},
|
||||||
|
{"[]=", tile}, /* first entry is default */
|
||||||
|
{"[M]", monocle},
|
||||||
|
{"[@]", spiral},
|
||||||
|
{"H[]", deck},
|
||||||
|
{"TTT", bstack},
|
||||||
|
{"===", bstackhoriz},
|
||||||
|
{"HHH", grid},
|
||||||
|
{"###", nrowgrid},
|
||||||
|
{"---", horizgrid},
|
||||||
|
// {":::", gaplessgrid},
|
||||||
|
{NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
#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}},
|
||||||
|
|
||||||
|
#define SHCMD(cmd) \
|
||||||
|
{ \
|
||||||
|
.v = (const char *[]) { "/bin/sh", "-c", cmd, NULL } \
|
||||||
|
}
|
||||||
|
|
||||||
|
static char dmenumon[2] =
|
||||||
|
"0";
|
||||||
|
static const char *termcmd[] = {"alacritty", NULL};
|
||||||
|
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 *upvol[] = {"wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@",
|
||||||
|
"5%+", NULL};
|
||||||
|
static const char *downvol[] = {"wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@",
|
||||||
|
"5%-", NULL};
|
||||||
|
static const char *mutevol[] = {"wpctl", "set-mute", "@DEFAULT_AUDIO_SINK@",
|
||||||
|
"toggle", NULL};
|
||||||
|
static const char *screenshot[] = {"flameshot", "gui", NULL};
|
||||||
|
|
||||||
|
static const char *blup[] = { "brightnessctl", "set", "+10%", NULL};
|
||||||
|
static const char *bldown[] = { "brightnessctl", "set", "10%-", NULL};
|
||||||
|
|
||||||
|
static const Key keys[] = {
|
||||||
|
/* modifier key function argument */
|
||||||
|
{MODKEY, XK_space, spawn, {.v = dmenucmd}},
|
||||||
|
{MODKEY, XK_Return, spawn, {.v = termcmd}},
|
||||||
|
{MODKEY|ShiftMask, XK_s, spawn, {.v = screenshot}},
|
||||||
|
{MODKEY | ShiftMask, XK_m, quit, {0}},
|
||||||
|
{MODKEY, XK_Right, focusstack, {.i = +1}},
|
||||||
|
{MODKEY, XK_Left, focusstack, {.i = -1}},
|
||||||
|
{MODKEY, XK_i, incnmaster, {.i = +1}},
|
||||||
|
{MODKEY, XK_d, incnmaster, {.i = -1}},
|
||||||
|
{MODKEY, XK_r, rotatestack, {.i = -1}},
|
||||||
|
{MODKEY | ShiftMask, XK_Left, setmfact, {.f = -0.05}},
|
||||||
|
{MODKEY | ShiftMask, XK_Right, setmfact, {.f = +0.05}},
|
||||||
|
{MODKEY, XK_Tab, view, {0}},
|
||||||
|
{MODKEY, XK_q, killclient, {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}},
|
||||||
|
{MODKEY, XK_b, togglebar, {0}},
|
||||||
|
|
||||||
|
// Vanity Gaps shit //
|
||||||
|
{MODKEY | ShiftMask, XK_h, setcfact, {.f = +0.25}},
|
||||||
|
{MODKEY | ShiftMask, XK_l, setcfact, {.f = -0.25}},
|
||||||
|
{MODKEY | ShiftMask, XK_o, setcfact, {.f = 0.00}},
|
||||||
|
{MODKEY | Mod1Mask, XK_u, incrgaps, {.i = +3}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_u, incrgaps, {.i = -3}},
|
||||||
|
{MODKEY | Mod1Mask, XK_i, incrigaps, {.i = +1}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_i, incrigaps, {.i = -1}},
|
||||||
|
{MODKEY | Mod1Mask, XK_o, incrogaps, {.i = +1}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_o, incrogaps, {.i = -1}},
|
||||||
|
{MODKEY | Mod1Mask, XK_6, incrihgaps, {.i = +1}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_6, incrihgaps, {.i = -1}},
|
||||||
|
{MODKEY | Mod1Mask, XK_7, incrivgaps, {.i = +5}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_7, incrivgaps, {.i = -5}},
|
||||||
|
{MODKEY | Mod1Mask, XK_8, incrohgaps, {.i = +1}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_8, incrohgaps, {.i = -1}},
|
||||||
|
{MODKEY | Mod1Mask, XK_9, incrovgaps, {.i = +1}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_9, incrovgaps, {.i = -1}},
|
||||||
|
{MODKEY | Mod1Mask, XK_0, togglegaps, {0}},
|
||||||
|
{MODKEY | Mod1Mask | ShiftMask, XK_0, defaultgaps, {0}},
|
||||||
|
|
||||||
|
// WS
|
||||||
|
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)
|
||||||
|
|
||||||
|
// Media Keys //
|
||||||
|
{0, XF86XK_AudioLowerVolume, spawn, {.v = downvol}},
|
||||||
|
{0, XF86XK_AudioMute, spawn, {.v = mutevol}},
|
||||||
|
{0, XF86XK_AudioRaiseVolume, spawn, {.v = upvol}},
|
||||||
|
{0, XF86XK_MonBrightnessUp, spawn, {.v = blup}},
|
||||||
|
{0, XF86XK_MonBrightnessDown, spawn, {.v = bldown}},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const Button buttons[] = {
|
||||||
|
{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, Button3, resizemouse, {0}},
|
||||||
|
{ClkTagBar, 0, Button1, view, {0}},
|
||||||
|
{ClkTagBar, 0, Button3, toggleview, {0}},
|
||||||
|
{ClkTagBar, MODKEY, Button1, tag, {0}},
|
||||||
|
{ClkTagBar, MODKEY, Button3, toggletag, {0}},
|
||||||
|
};
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# dwm version
|
||||||
|
VERSION = 6.5
|
||||||
|
|
||||||
|
# Customize below to fit your system
|
||||||
|
|
||||||
|
# paths
|
||||||
|
PREFIX = /usr/local
|
||||||
|
MANPREFIX = ${PREFIX}/share/man
|
||||||
|
|
||||||
|
X11INC = ${PREFIX}/include
|
||||||
|
X11LIB = ${PREFIX}/lib
|
||||||
|
|
||||||
|
# Xinerama, comment if you don't want it
|
||||||
|
XINERAMALIBS = -lXinerama
|
||||||
|
XINERAMAFLAGS = -DXINERAMA
|
||||||
|
|
||||||
|
# freetype
|
||||||
|
FREETYPELIBS = -lfontconfig -lXft
|
||||||
|
FREETYPEINC = ${PREFIX}/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
|
||||||
@@ -0,0 +1,425 @@
|
|||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <X11/Xft/Xft.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/* 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);
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
.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 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.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/* cc transient.c -o transient -lX11 */
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/* 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);
|
||||||
@@ -0,0 +1,778 @@
|
|||||||
|
/* Key binding functions */
|
||||||
|
static void defaultgaps(const Arg *arg);
|
||||||
|
static void incrgaps(const Arg *arg);
|
||||||
|
static void incrigaps(const Arg *arg);
|
||||||
|
static void incrogaps(const Arg *arg);
|
||||||
|
static void incrohgaps(const Arg *arg);
|
||||||
|
static void incrovgaps(const Arg *arg);
|
||||||
|
static void incrihgaps(const Arg *arg);
|
||||||
|
static void incrivgaps(const Arg *arg);
|
||||||
|
static void togglegaps(const Arg *arg);
|
||||||
|
/* Layouts (delete the ones you do not need) */
|
||||||
|
static void bstack(Monitor *m);
|
||||||
|
static void bstackhoriz(Monitor *m);
|
||||||
|
static void centeredmaster(Monitor *m);
|
||||||
|
static void centeredfloatingmaster(Monitor *m);
|
||||||
|
static void deck(Monitor *m);
|
||||||
|
static void dwindle(Monitor *m);
|
||||||
|
static void fibonacci(Monitor *m, int s);
|
||||||
|
static void grid(Monitor *m);
|
||||||
|
static void nrowgrid(Monitor *m);
|
||||||
|
static void spiral(Monitor *m);
|
||||||
|
static void tile(Monitor *m);
|
||||||
|
/* Internals */
|
||||||
|
static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv,
|
||||||
|
unsigned int *nc);
|
||||||
|
static void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf,
|
||||||
|
int *mr, int *sr);
|
||||||
|
static void setgaps(int oh, int ov, int ih, int iv);
|
||||||
|
|
||||||
|
/* Settings */
|
||||||
|
#if !PERTAG_PATCH
|
||||||
|
static int enablegaps = 1;
|
||||||
|
#endif // PERTAG_PATCH
|
||||||
|
|
||||||
|
void setgaps(int oh, int ov, int ih, int iv) {
|
||||||
|
if (oh < 0)
|
||||||
|
oh = 0;
|
||||||
|
if (ov < 0)
|
||||||
|
ov = 0;
|
||||||
|
if (ih < 0)
|
||||||
|
ih = 0;
|
||||||
|
if (iv < 0)
|
||||||
|
iv = 0;
|
||||||
|
|
||||||
|
selmon->gappoh = oh;
|
||||||
|
selmon->gappov = ov;
|
||||||
|
selmon->gappih = ih;
|
||||||
|
selmon->gappiv = iv;
|
||||||
|
arrange(selmon);
|
||||||
|
}
|
||||||
|
|
||||||
|
void togglegaps(const Arg *arg) {
|
||||||
|
#if PERTAG_PATCH
|
||||||
|
selmon->pertag->enablegaps[selmon->pertag->curtag] =
|
||||||
|
!selmon->pertag->enablegaps[selmon->pertag->curtag];
|
||||||
|
#else
|
||||||
|
enablegaps = !enablegaps;
|
||||||
|
#endif // PERTAG_PATCH
|
||||||
|
arrange(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void defaultgaps(const Arg *arg) { setgaps(gappoh, gappov, gappih, gappiv); }
|
||||||
|
|
||||||
|
void incrgaps(const Arg *arg) {
|
||||||
|
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i,
|
||||||
|
selmon->gappih + arg->i, selmon->gappiv + arg->i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void incrigaps(const Arg *arg) {
|
||||||
|
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
||||||
|
selmon->gappiv + arg->i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void incrogaps(const Arg *arg) {
|
||||||
|
setgaps(selmon->gappoh + arg->i, selmon->gappov + arg->i, selmon->gappih,
|
||||||
|
selmon->gappiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void incrohgaps(const Arg *arg) {
|
||||||
|
setgaps(selmon->gappoh + arg->i, selmon->gappov, selmon->gappih,
|
||||||
|
selmon->gappiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void incrovgaps(const Arg *arg) {
|
||||||
|
setgaps(selmon->gappoh, selmon->gappov + arg->i, selmon->gappih,
|
||||||
|
selmon->gappiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void incrihgaps(const Arg *arg) {
|
||||||
|
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih + arg->i,
|
||||||
|
selmon->gappiv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void incrivgaps(const Arg *arg) {
|
||||||
|
setgaps(selmon->gappoh, selmon->gappov, selmon->gappih,
|
||||||
|
selmon->gappiv + arg->i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc) {
|
||||||
|
unsigned int n, oe, ie;
|
||||||
|
#if PERTAG_PATCH
|
||||||
|
oe = ie = selmon->pertag->enablegaps[selmon->pertag->curtag];
|
||||||
|
#else
|
||||||
|
oe = ie = enablegaps;
|
||||||
|
#endif // PERTAG_PATCH
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
||||||
|
;
|
||||||
|
if (smartgaps && n == 1) {
|
||||||
|
oe = 0; // outer gaps disabled when only one client
|
||||||
|
}
|
||||||
|
|
||||||
|
*oh = m->gappoh * oe; // outer horizontal gap
|
||||||
|
*ov = m->gappov * oe; // outer vertical gap
|
||||||
|
*ih = m->gappih * ie; // inner horizontal gap
|
||||||
|
*iv = m->gappiv * ie; // inner vertical gap
|
||||||
|
*nc = n; // number of clients
|
||||||
|
}
|
||||||
|
|
||||||
|
void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr,
|
||||||
|
int *sr) {
|
||||||
|
unsigned int n;
|
||||||
|
float mfacts = 0, sfacts = 0;
|
||||||
|
int mtotal = 0, stotal = 0;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
||||||
|
if (n < m->nmaster)
|
||||||
|
mfacts += c->cfact;
|
||||||
|
else
|
||||||
|
sfacts += c->cfact;
|
||||||
|
|
||||||
|
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
||||||
|
if (n < m->nmaster)
|
||||||
|
mtotal += msize * (c->cfact / mfacts);
|
||||||
|
else
|
||||||
|
stotal += ssize * (c->cfact / sfacts);
|
||||||
|
|
||||||
|
*mf = mfacts; // total factor of master area
|
||||||
|
*sf = sfacts; // total factor of stack area
|
||||||
|
*mr = msize -
|
||||||
|
mtotal; // the remainder (rest) of pixels after a cfacts master split
|
||||||
|
*sr = ssize -
|
||||||
|
stotal; // the remainder (rest) of pixels after a cfacts stack split
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Layouts
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bottomstack layout + gaps
|
||||||
|
* https://dwm.suckless.org/patches/bottomstack/
|
||||||
|
*/
|
||||||
|
static void bstack(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
int mx = 0, my = 0, mh = 0, mw = 0;
|
||||||
|
int sx = 0, sy = 0, sh = 0, sw = 0;
|
||||||
|
float mfacts, sfacts;
|
||||||
|
int mrest, srest;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sx = mx = m->wx + ov;
|
||||||
|
sy = my = m->wy + oh;
|
||||||
|
sh = mh = m->wh - 2 * oh;
|
||||||
|
mw = m->ww - 2 * ov - iv * (MIN(n, m->nmaster) - 1);
|
||||||
|
sw = m->ww - 2 * ov - iv * (n - m->nmaster - 1);
|
||||||
|
|
||||||
|
if (m->nmaster && n > m->nmaster) {
|
||||||
|
sh = (mh - ih) * (1 - m->mfact);
|
||||||
|
mh = mh - ih - sh;
|
||||||
|
sx = mx;
|
||||||
|
sy = my + mh + ih;
|
||||||
|
}
|
||||||
|
|
||||||
|
getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
||||||
|
if (i < m->nmaster) {
|
||||||
|
resize(c, mx, my,
|
||||||
|
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
||||||
|
mh - (2 * c->bw), 0);
|
||||||
|
mx += WIDTH(c) + iv;
|
||||||
|
} else {
|
||||||
|
resize(c, sx, sy,
|
||||||
|
sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
||||||
|
(2 * c->bw),
|
||||||
|
sh - (2 * c->bw), 0);
|
||||||
|
sx += WIDTH(c) + iv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bstackhoriz(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
int mx = 0, my = 0, mh = 0, mw = 0;
|
||||||
|
int sx = 0, sy = 0, sh = 0, sw = 0;
|
||||||
|
float mfacts, sfacts;
|
||||||
|
int mrest, srest;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sx = mx = m->wx + ov;
|
||||||
|
sy = my = m->wy + oh;
|
||||||
|
mh = m->wh - 2 * oh;
|
||||||
|
sh = m->wh - 2 * oh - ih * (n - m->nmaster - 1);
|
||||||
|
mw = m->ww - 2 * ov - iv * (MIN(n, m->nmaster) - 1);
|
||||||
|
sw = m->ww - 2 * ov;
|
||||||
|
|
||||||
|
if (m->nmaster && n > m->nmaster) {
|
||||||
|
sh = (mh - ih) * (1 - m->mfact);
|
||||||
|
mh = mh - ih - sh;
|
||||||
|
sy = my + mh + ih;
|
||||||
|
sh = m->wh - mh - 2 * oh - ih * (n - m->nmaster);
|
||||||
|
}
|
||||||
|
|
||||||
|
getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest);
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
||||||
|
if (i < m->nmaster) {
|
||||||
|
resize(c, mx, my,
|
||||||
|
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
||||||
|
mh - (2 * c->bw), 0);
|
||||||
|
mx += WIDTH(c) + iv;
|
||||||
|
} else {
|
||||||
|
resize(c, sx, sy, sw - (2 * c->bw),
|
||||||
|
sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
||||||
|
(2 * c->bw),
|
||||||
|
0);
|
||||||
|
sy += HEIGHT(c) + ih;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Centred master layout + gaps
|
||||||
|
* https://dwm.suckless.org/patches/centeredmaster/
|
||||||
|
*/
|
||||||
|
void centeredmaster(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
int mx = 0, my = 0, mh = 0, mw = 0;
|
||||||
|
int lx = 0, ly = 0, lw = 0, lh = 0;
|
||||||
|
int rx = 0, ry = 0, rw = 0, rh = 0;
|
||||||
|
float mfacts = 0, lfacts = 0, rfacts = 0;
|
||||||
|
int mtotal = 0, ltotal = 0, rtotal = 0;
|
||||||
|
int mrest = 0, lrest = 0, rrest = 0;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* initialize areas */
|
||||||
|
mx = m->wx + ov;
|
||||||
|
my = m->wy + oh;
|
||||||
|
mh = m->wh - 2 * oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
|
||||||
|
mw = m->ww - 2 * ov;
|
||||||
|
lh = m->wh - 2 * oh - ih * (((n - m->nmaster) / 2) - 1);
|
||||||
|
rh = m->wh - 2 * oh -
|
||||||
|
ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1));
|
||||||
|
|
||||||
|
if (m->nmaster && n > m->nmaster) {
|
||||||
|
/* go mfact box in the center if more than nmaster clients */
|
||||||
|
if (n - m->nmaster > 1) {
|
||||||
|
/* ||<-S->|<---M--->|<-S->|| */
|
||||||
|
mw = (m->ww - 2 * ov - 2 * iv) * m->mfact;
|
||||||
|
lw = (m->ww - mw - 2 * ov - 2 * iv) / 2;
|
||||||
|
rw = (m->ww - mw - 2 * ov - 2 * iv) - lw;
|
||||||
|
mx += lw + iv;
|
||||||
|
} else {
|
||||||
|
/* ||<---M--->|<-S->|| */
|
||||||
|
mw = (mw - iv) * m->mfact;
|
||||||
|
lw = 0;
|
||||||
|
rw = m->ww - mw - iv - 2 * ov;
|
||||||
|
}
|
||||||
|
lx = m->wx + ov;
|
||||||
|
ly = m->wy + oh;
|
||||||
|
rx = mx + mw + iv;
|
||||||
|
ry = m->wy + oh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate facts */
|
||||||
|
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
|
||||||
|
if (!m->nmaster || n < m->nmaster)
|
||||||
|
mfacts += c->cfact;
|
||||||
|
else if ((n - m->nmaster) % 2)
|
||||||
|
lfacts += c->cfact; // total factor of left hand stack area
|
||||||
|
else
|
||||||
|
rfacts += c->cfact; // total factor of right hand stack area
|
||||||
|
}
|
||||||
|
|
||||||
|
for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
|
||||||
|
if (!m->nmaster || n < m->nmaster)
|
||||||
|
mtotal += mh * (c->cfact / mfacts);
|
||||||
|
else if ((n - m->nmaster) % 2)
|
||||||
|
ltotal += lh * (c->cfact / lfacts);
|
||||||
|
else
|
||||||
|
rtotal += rh * (c->cfact / rfacts);
|
||||||
|
|
||||||
|
mrest = mh - mtotal;
|
||||||
|
lrest = lh - ltotal;
|
||||||
|
rrest = rh - rtotal;
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
||||||
|
if (!m->nmaster || i < m->nmaster) {
|
||||||
|
/* nmaster clients are stacked vertically, in the center of the screen */
|
||||||
|
resize(c, mx, my, mw - (2 * c->bw),
|
||||||
|
mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw), 0);
|
||||||
|
my += HEIGHT(c) + ih;
|
||||||
|
} else {
|
||||||
|
/* stack clients are stacked vertically */
|
||||||
|
if ((i - m->nmaster) % 2) {
|
||||||
|
resize(c, lx, ly, lw - (2 * c->bw),
|
||||||
|
lh * (c->cfact / lfacts) +
|
||||||
|
((i - 2 * m->nmaster) < 2 * lrest ? 1 : 0) - (2 * c->bw),
|
||||||
|
0);
|
||||||
|
ly += HEIGHT(c) + ih;
|
||||||
|
} else {
|
||||||
|
resize(c, rx, ry, rw - (2 * c->bw),
|
||||||
|
rh * (c->cfact / rfacts) +
|
||||||
|
((i - 2 * m->nmaster) < 2 * rrest ? 1 : 0) - (2 * c->bw),
|
||||||
|
0);
|
||||||
|
ry += HEIGHT(c) + ih;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void centeredfloatingmaster(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
float mfacts, sfacts;
|
||||||
|
float mivf = 1.0; // master inner vertical gap factor
|
||||||
|
int oh, ov, ih, iv, mrest, srest;
|
||||||
|
int mx = 0, my = 0, mh = 0, mw = 0;
|
||||||
|
int sx = 0, sy = 0, sh = 0, sw = 0;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sx = mx = m->wx + ov;
|
||||||
|
sy = my = m->wy + oh;
|
||||||
|
sh = mh = m->wh - 2 * oh;
|
||||||
|
mw = m->ww - 2 * ov - iv * (n - 1);
|
||||||
|
sw = m->ww - 2 * ov - iv * (n - m->nmaster - 1);
|
||||||
|
|
||||||
|
if (m->nmaster && n > m->nmaster) {
|
||||||
|
mivf = 0.8;
|
||||||
|
/* go mfact box in the center if more than nmaster clients */
|
||||||
|
if (m->ww > m->wh) {
|
||||||
|
mw = m->ww * m->mfact - iv * mivf * (MIN(n, m->nmaster) - 1);
|
||||||
|
mh = m->wh * 0.9;
|
||||||
|
} else {
|
||||||
|
mw = m->ww * 0.9 - iv * mivf * (MIN(n, m->nmaster) - 1);
|
||||||
|
mh = m->wh * m->mfact;
|
||||||
|
}
|
||||||
|
mx = m->wx + (m->ww - mw) / 2;
|
||||||
|
my = m->wy + (m->wh - mh - 2 * oh) / 2;
|
||||||
|
|
||||||
|
sx = m->wx + ov;
|
||||||
|
sy = m->wy + oh;
|
||||||
|
sh = m->wh - 2 * oh;
|
||||||
|
}
|
||||||
|
|
||||||
|
getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
|
if (i < m->nmaster) {
|
||||||
|
/* nmaster clients are stacked horizontally, in the center of the screen
|
||||||
|
*/
|
||||||
|
resize(c, mx, my,
|
||||||
|
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
||||||
|
mh - (2 * c->bw), 0);
|
||||||
|
mx += WIDTH(c) + iv * mivf;
|
||||||
|
} else {
|
||||||
|
/* stack clients are stacked horizontally */
|
||||||
|
resize(c, sx, sy,
|
||||||
|
sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
||||||
|
(2 * c->bw),
|
||||||
|
sh - (2 * c->bw), 0);
|
||||||
|
sx += WIDTH(c) + iv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Deck layout + gaps
|
||||||
|
* https://dwm.suckless.org/patches/deck/
|
||||||
|
*/
|
||||||
|
void deck(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
int mx = 0, my = 0, mh = 0, mw = 0;
|
||||||
|
int sx = 0, sy = 0, sh = 0, sw = 0;
|
||||||
|
float mfacts, sfacts;
|
||||||
|
int mrest, srest;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sx = mx = m->wx + ov;
|
||||||
|
sy = my = m->wy + oh;
|
||||||
|
sh = mh = m->wh - 2 * oh - ih * (MIN(n, m->nmaster) - 1);
|
||||||
|
sw = mw = m->ww - 2 * ov;
|
||||||
|
|
||||||
|
if (m->nmaster && n > m->nmaster) {
|
||||||
|
sw = (mw - iv) * (1 - m->mfact);
|
||||||
|
mw = mw - iv - sw;
|
||||||
|
sx = mx + mw + iv;
|
||||||
|
sh = m->wh - 2 * oh;
|
||||||
|
}
|
||||||
|
|
||||||
|
getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
|
||||||
|
|
||||||
|
if (n - m->nmaster > 0) /* override layout symbol */
|
||||||
|
snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m->nmaster);
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
|
if (i < m->nmaster) {
|
||||||
|
resize(c, mx, my, mw - (2 * c->bw),
|
||||||
|
mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw), 0);
|
||||||
|
my += HEIGHT(c) + ih;
|
||||||
|
} else {
|
||||||
|
resize(c, sx, sy, sw - (2 * c->bw), sh - (2 * c->bw), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fibonacci layout + gaps
|
||||||
|
* https://dwm.suckless.org/patches/fibonacci/
|
||||||
|
*/
|
||||||
|
void fibonacci(Monitor *m, int s) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int nx, ny, nw, nh;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
int nv, hrest = 0, wrest = 0, r = 1;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nx = m->wx + ov;
|
||||||
|
ny = m->wy + oh;
|
||||||
|
nw = m->ww - 2 * ov;
|
||||||
|
nh = m->wh - 2 * oh;
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
|
||||||
|
if (r) {
|
||||||
|
if ((i % 2 && (nh - ih) / 2 <= (bh + 2 * c->bw)) ||
|
||||||
|
(!(i % 2) && (nw - iv) / 2 <= (bh + 2 * c->bw))) {
|
||||||
|
r = 0;
|
||||||
|
}
|
||||||
|
if (r && i < n - 1) {
|
||||||
|
if (i % 2) {
|
||||||
|
nv = (nh - ih) / 2;
|
||||||
|
hrest = nh - 2 * nv - ih;
|
||||||
|
nh = nv;
|
||||||
|
} else {
|
||||||
|
nv = (nw - iv) / 2;
|
||||||
|
wrest = nw - 2 * nv - iv;
|
||||||
|
nw = nv;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((i % 4) == 2 && !s)
|
||||||
|
nx += nw + iv;
|
||||||
|
else if ((i % 4) == 3 && !s)
|
||||||
|
ny += nh + ih;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((i % 4) == 0) {
|
||||||
|
if (s) {
|
||||||
|
ny += nh + ih;
|
||||||
|
nh += hrest;
|
||||||
|
} else {
|
||||||
|
nh -= hrest;
|
||||||
|
ny -= nh + ih;
|
||||||
|
}
|
||||||
|
} else if ((i % 4) == 1) {
|
||||||
|
nx += nw + iv;
|
||||||
|
nw += wrest;
|
||||||
|
} else if ((i % 4) == 2) {
|
||||||
|
ny += nh + ih;
|
||||||
|
nh += hrest;
|
||||||
|
if (i < n - 1)
|
||||||
|
nw += wrest;
|
||||||
|
} else if ((i % 4) == 3) {
|
||||||
|
if (s) {
|
||||||
|
nx += nw + iv;
|
||||||
|
nw -= wrest;
|
||||||
|
} else {
|
||||||
|
nw -= wrest;
|
||||||
|
nx -= nw + iv;
|
||||||
|
nh += hrest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i == 0) {
|
||||||
|
if (n != 1) {
|
||||||
|
nw = (m->ww - iv - 2 * ov) - (m->ww - iv - 2 * ov) * (1 - m->mfact);
|
||||||
|
wrest = 0;
|
||||||
|
}
|
||||||
|
ny = m->wy + oh;
|
||||||
|
} else if (i == 1)
|
||||||
|
nw = m->ww - nw - iv - 2 * ov;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
resize(c, nx, ny, nw - (2 * c->bw), nh - (2 * c->bw), False);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dwindle(Monitor *m) { fibonacci(m, 1); }
|
||||||
|
|
||||||
|
void spiral(Monitor *m) { fibonacci(m, 0); }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gappless grid layout + gaps (ironically)
|
||||||
|
* https://dwm.suckless.org/patches/gaplessgrid/
|
||||||
|
*/
|
||||||
|
void gaplessgrid(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* grid dimensions */
|
||||||
|
for (cols = 0; cols <= n / 2; cols++)
|
||||||
|
if (cols * cols >= n)
|
||||||
|
break;
|
||||||
|
if (n ==
|
||||||
|
5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
|
||||||
|
cols = 2;
|
||||||
|
rows = n / cols;
|
||||||
|
cn = rn = 0; // reset column no, row no, client count
|
||||||
|
|
||||||
|
ch = (m->wh - 2 * oh - ih * (rows - 1)) / rows;
|
||||||
|
cw = (m->ww - 2 * ov - iv * (cols - 1)) / cols;
|
||||||
|
rrest = (m->wh - 2 * oh - ih * (rows - 1)) - ch * rows;
|
||||||
|
crest = (m->ww - 2 * ov - iv * (cols - 1)) - cw * cols;
|
||||||
|
x = m->wx + ov;
|
||||||
|
y = m->wy + oh;
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
|
||||||
|
if (i / rows + 1 > cols - n % cols) {
|
||||||
|
rows = n / cols + 1;
|
||||||
|
ch = (m->wh - 2 * oh - ih * (rows - 1)) / rows;
|
||||||
|
rrest = (m->wh - 2 * oh - ih * (rows - 1)) - ch * rows;
|
||||||
|
}
|
||||||
|
resize(c, x, y + rn * (ch + ih) + MIN(rn, rrest),
|
||||||
|
cw + (cn < crest ? 1 : 0) - 2 * c->bw,
|
||||||
|
ch + (rn < rrest ? 1 : 0) - 2 * c->bw, 0);
|
||||||
|
rn++;
|
||||||
|
if (rn >= rows) {
|
||||||
|
rn = 0;
|
||||||
|
x += cw + ih + (cn < crest ? 1 : 0);
|
||||||
|
cn++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Gridmode layout + gaps
|
||||||
|
* https://dwm.suckless.org/patches/gridmode/
|
||||||
|
*/
|
||||||
|
void grid(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
|
||||||
|
/* grid dimensions */
|
||||||
|
for (rows = 0; rows <= n / 2; rows++)
|
||||||
|
if (rows * rows >= n)
|
||||||
|
break;
|
||||||
|
cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
|
||||||
|
|
||||||
|
/* window geoms (cell height/width) */
|
||||||
|
ch = (m->wh - 2 * oh - ih * (rows - 1)) / (rows ? rows : 1);
|
||||||
|
cw = (m->ww - 2 * ov - iv * (cols - 1)) / (cols ? cols : 1);
|
||||||
|
chrest = (m->wh - 2 * oh - ih * (rows - 1)) - ch * rows;
|
||||||
|
cwrest = (m->ww - 2 * ov - iv * (cols - 1)) - cw * cols;
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
|
||||||
|
cc = i / rows;
|
||||||
|
cr = i % rows;
|
||||||
|
cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest);
|
||||||
|
cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest);
|
||||||
|
resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2 * c->bw,
|
||||||
|
ch + (cr < chrest ? 1 : 0) - 2 * c->bw, False);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Horizontal grid layout + gaps
|
||||||
|
* https://dwm.suckless.org/patches/horizgrid/
|
||||||
|
*/
|
||||||
|
void horizgrid(Monitor *m) {
|
||||||
|
Client *c;
|
||||||
|
unsigned int n, i;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
int mx = 0, my = 0, mh = 0, mw = 0;
|
||||||
|
int sx = 0, sy = 0, sh = 0, sw = 0;
|
||||||
|
int ntop, nbottom = 1;
|
||||||
|
float mfacts = 0, sfacts = 0;
|
||||||
|
int mrest, srest, mtotal = 0, stotal = 0;
|
||||||
|
|
||||||
|
/* Count windows */
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (n <= 2)
|
||||||
|
ntop = n;
|
||||||
|
else {
|
||||||
|
ntop = n / 2;
|
||||||
|
nbottom = n - ntop;
|
||||||
|
}
|
||||||
|
sx = mx = m->wx + ov;
|
||||||
|
sy = my = m->wy + oh;
|
||||||
|
sh = mh = m->wh - 2 * oh;
|
||||||
|
sw = mw = m->ww - 2 * ov;
|
||||||
|
|
||||||
|
if (n > ntop) {
|
||||||
|
sh = (mh - ih) / 2;
|
||||||
|
mh = mh - ih - sh;
|
||||||
|
sy = my + mh + ih;
|
||||||
|
mw = m->ww - 2 * ov - iv * (ntop - 1);
|
||||||
|
sw = m->ww - 2 * ov - iv * (nbottom - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate facts */
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
|
if (i < ntop)
|
||||||
|
mfacts += c->cfact;
|
||||||
|
else
|
||||||
|
sfacts += c->cfact;
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
|
if (i < ntop)
|
||||||
|
mtotal += mh * (c->cfact / mfacts);
|
||||||
|
else
|
||||||
|
stotal += sw * (c->cfact / sfacts);
|
||||||
|
|
||||||
|
mrest = mh - mtotal;
|
||||||
|
srest = sw - stotal;
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
|
if (i < ntop) {
|
||||||
|
resize(c, mx, my,
|
||||||
|
mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw),
|
||||||
|
mh - (2 * c->bw), 0);
|
||||||
|
mx += WIDTH(c) + iv;
|
||||||
|
} else {
|
||||||
|
resize(c, sx, sy,
|
||||||
|
sw * (c->cfact / sfacts) + ((i - ntop) < srest ? 1 : 0) -
|
||||||
|
(2 * c->bw),
|
||||||
|
sh - (2 * c->bw), 0);
|
||||||
|
sx += WIDTH(c) + iv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nrowgrid layout + gaps
|
||||||
|
* https://dwm.suckless.org/patches/nrowgrid/
|
||||||
|
*/
|
||||||
|
void nrowgrid(Monitor *m) {
|
||||||
|
unsigned int n;
|
||||||
|
int ri = 0, ci = 0; /* counters */
|
||||||
|
int oh, ov, ih, iv; /* vanitygap settings */
|
||||||
|
unsigned int cx, cy, cw, ch; /* client geometry */
|
||||||
|
unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */
|
||||||
|
unsigned int cols, rows = m->nmaster + 1;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
/* count clients */
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
|
||||||
|
/* nothing to do here */
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* force 2 clients to always split vertically */
|
||||||
|
if (FORCE_VSPLIT && n == 2)
|
||||||
|
rows = 1;
|
||||||
|
|
||||||
|
/* never allow empty rows */
|
||||||
|
if (n < rows)
|
||||||
|
rows = n;
|
||||||
|
|
||||||
|
/* define first row */
|
||||||
|
cols = n / rows;
|
||||||
|
uc = cols;
|
||||||
|
cy = m->wy + oh;
|
||||||
|
ch = (m->wh - 2 * oh - ih * (rows - 1)) / rows;
|
||||||
|
uh = ch;
|
||||||
|
|
||||||
|
for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) {
|
||||||
|
if (ci == cols) {
|
||||||
|
uw = 0;
|
||||||
|
ci = 0;
|
||||||
|
ri++;
|
||||||
|
|
||||||
|
/* next row */
|
||||||
|
cols = (n - uc) / (rows - ri);
|
||||||
|
uc += cols;
|
||||||
|
cy = m->wy + oh + uh + ih;
|
||||||
|
uh += ch + ih;
|
||||||
|
}
|
||||||
|
|
||||||
|
cx = m->wx + ov + uw;
|
||||||
|
cw = (m->ww - 2 * ov - uw) / (cols - ci);
|
||||||
|
uw += cw + iv;
|
||||||
|
|
||||||
|
resize(c, cx, cy, cw - (2 * c->bw), ch - (2 * c->bw), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default tile layout + gaps
|
||||||
|
*/
|
||||||
|
static void tile(Monitor *m) {
|
||||||
|
unsigned int i, n;
|
||||||
|
int oh, ov, ih, iv;
|
||||||
|
int mx = 0, my = 0, mh = 0, mw = 0;
|
||||||
|
int sx = 0, sy = 0, sh = 0, sw = 0;
|
||||||
|
float mfacts, sfacts;
|
||||||
|
int mrest, srest;
|
||||||
|
Client *c;
|
||||||
|
|
||||||
|
getgaps(m, &oh, &ov, &ih, &iv, &n);
|
||||||
|
if (n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sx = mx = m->wx + ov;
|
||||||
|
sy = my = m->wy + oh;
|
||||||
|
mh = m->wh - 2 * oh - ih * (MIN(n, m->nmaster) - 1);
|
||||||
|
sh = m->wh - 2 * oh - ih * (n - m->nmaster - 1);
|
||||||
|
sw = mw = m->ww - 2 * ov;
|
||||||
|
|
||||||
|
if (m->nmaster && n > m->nmaster) {
|
||||||
|
sw = (mw - iv) * (1 - m->mfact);
|
||||||
|
mw = mw - iv - sw;
|
||||||
|
sx = mx + mw + iv;
|
||||||
|
}
|
||||||
|
|
||||||
|
getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
|
||||||
|
|
||||||
|
for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
|
||||||
|
if (i < m->nmaster) {
|
||||||
|
resize(c, mx, my, mw - (2 * c->bw),
|
||||||
|
mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2 * c->bw), 0);
|
||||||
|
my += HEIGHT(c) + ih;
|
||||||
|
} else {
|
||||||
|
resize(c, sx, sy, sw - (2 * c->bw),
|
||||||
|
sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) -
|
||||||
|
(2 * c->bw),
|
||||||
|
0);
|
||||||
|
sy += HEIGHT(c) + ih;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
{ config, pkgs, inputs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
# default
|
||||||
|
fastfetch
|
||||||
|
vim
|
||||||
|
tmux
|
||||||
|
git
|
||||||
|
wget
|
||||||
|
curl
|
||||||
|
htop
|
||||||
|
|
||||||
|
# utils
|
||||||
|
lsof
|
||||||
|
tree
|
||||||
|
ntfs3g
|
||||||
|
|
||||||
|
# dev
|
||||||
|
rustup
|
||||||
|
python3
|
||||||
|
|
||||||
|
|
||||||
|
# networking
|
||||||
|
net-tools
|
||||||
|
inetutils
|
||||||
|
ethtool
|
||||||
|
|
||||||
|
qutebrowser
|
||||||
|
neovide
|
||||||
|
];
|
||||||
|
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-color-emoji
|
||||||
|
|
||||||
|
nerd-fonts.symbols-only
|
||||||
|
nerd-fonts._0xproto
|
||||||
|
nerd-fonts.terminess-ttf
|
||||||
|
|
||||||
|
terminus_font
|
||||||
|
font-awesome
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
programs.steam.enable = true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
hardware = {
|
||||||
|
graphics = {
|
||||||
|
enable = true;
|
||||||
|
enable32Bit = true;
|
||||||
|
|
||||||
|
#extraPackage = [];
|
||||||
|
#extraPackage32 = [];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
imports = [ ../web/qutebrowser.nix ../web/firefox.nix ../web/librewolf.nix ./proton.nix ./irssi.nix ];
|
||||||
|
home = {
|
||||||
|
username = "user";
|
||||||
|
homeDirectory = "/home/user";
|
||||||
|
|
||||||
|
enableNixpkgsReleaseCheck = false;
|
||||||
|
stateVersion = "26.05";
|
||||||
|
|
||||||
|
file = {
|
||||||
|
".wp/" = {
|
||||||
|
source = ./raw/wp;
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
".irssi/" = {
|
||||||
|
source = ./raw/irssi/themes;
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
programs = {
|
||||||
|
irssi = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = "";
|
||||||
|
|
||||||
|
# irc networks
|
||||||
|
networks = {
|
||||||
|
liberachat = {
|
||||||
|
channels = {
|
||||||
|
nixos = {
|
||||||
|
autoJoin = true;
|
||||||
|
};
|
||||||
|
linux = {
|
||||||
|
autoJoin = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
nick = "halbg0tt";
|
||||||
|
server = {
|
||||||
|
address = "irc.libera.chat";
|
||||||
|
autoConnect = false;
|
||||||
|
port = 6697;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
home = {
|
||||||
|
packages = with pkgs; [ proton-vpn ];
|
||||||
|
};
|
||||||
|
services = {
|
||||||
|
proton-pass-agent = {
|
||||||
|
enable = false;
|
||||||
|
package = pkgs.proton-pass-cli;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,303 @@
|
|||||||
|
######################### evilkat.theme by dubkat@efnet ##################################
|
||||||
|
# includes formats for scripts such as nact.pl kills.pl and chanact.pl
|
||||||
|
# this theme may not look too good directly in a term, but looks ok in putty if you have
|
||||||
|
# 'bolded text as alternate color' checked in your putty window/colours settings
|
||||||
|
# enjoy.
|
||||||
|
|
||||||
|
# default foreground color (%N) - -1 is the "default terminal color"
|
||||||
|
default_color = "-1";
|
||||||
|
|
||||||
|
# print timestamp/servertag at the end of line, not at beginning
|
||||||
|
info_eol = "false";
|
||||||
|
|
||||||
|
# these characters are automatically replaced with specified color
|
||||||
|
# (dark grey by default)
|
||||||
|
replaces = { "!" = "%R$*%n"; "[]=" = "%K$*%n"; };
|
||||||
|
|
||||||
|
abstracts = {
|
||||||
|
##
|
||||||
|
## generic
|
||||||
|
##
|
||||||
|
|
||||||
|
# text to insert at the beginning of each non-message line
|
||||||
|
line_start = "";
|
||||||
|
|
||||||
|
# timestamp styling, nothing by default
|
||||||
|
timestamp = "%w$*%n";
|
||||||
|
|
||||||
|
# any kind of text that needs hilighting, default is to bold
|
||||||
|
hilight = "%_$*%_";
|
||||||
|
|
||||||
|
# any kind of error message, default is bright red
|
||||||
|
error = "%R$*%n";
|
||||||
|
|
||||||
|
# channel name is printed
|
||||||
|
channel = "%_$*%_";
|
||||||
|
|
||||||
|
# nick is printed
|
||||||
|
nick = "%_$*%_";
|
||||||
|
|
||||||
|
# nick host is printed
|
||||||
|
nickhost = "$*";
|
||||||
|
|
||||||
|
# server name is printed
|
||||||
|
server = "%_$*%_";
|
||||||
|
|
||||||
|
# some kind of comment is printed
|
||||||
|
comment = "[$*]";
|
||||||
|
|
||||||
|
# reason for something is printed (part, quit, kick, ..)
|
||||||
|
reason = "{comment %_$*%_}";
|
||||||
|
|
||||||
|
# mode change is printed ([+o nick])
|
||||||
|
mode = "{highlight %p$*%n}";
|
||||||
|
|
||||||
|
##
|
||||||
|
## channel specific messages
|
||||||
|
##
|
||||||
|
|
||||||
|
# highlighted nick/host is printed (joins)
|
||||||
|
channick_hilight = "$*";
|
||||||
|
chanhost_hilight = "{nickhost %K$*%n}";
|
||||||
|
|
||||||
|
# nick/host is printed (parts, quits, etc.)
|
||||||
|
channick = "$*";
|
||||||
|
chanhost = "{nickhost %K$*%n}";
|
||||||
|
|
||||||
|
# highlighted channel name is printed
|
||||||
|
channelhilight = "%R$*%n";
|
||||||
|
|
||||||
|
# ban/ban exception/invite list mask is printed
|
||||||
|
ban = "%r$*%n";
|
||||||
|
|
||||||
|
##
|
||||||
|
## messages
|
||||||
|
##
|
||||||
|
|
||||||
|
# the basic styling of how to print message, $0 = nick mode, $1 = nick
|
||||||
|
msgnick = "%K<%n%_$0%_$1%K>%n %|";
|
||||||
|
|
||||||
|
# message from you is printed. "msgownnick" specifies the styling of the
|
||||||
|
# nick ($0 part in msgnick) and "ownmsgnick" specifies the styling of the
|
||||||
|
# whole line.
|
||||||
|
|
||||||
|
# Example1: You want the message text to be green:
|
||||||
|
# ownmsgnick = "{msgnick $0 $1-}%g";
|
||||||
|
# Example2.1: You want < and > chars to be yellow:
|
||||||
|
# ownmsgnick = "%Y{msgnick $0 $1-%Y}%n";
|
||||||
|
# (you'll also have to remove <> from replaces list above)
|
||||||
|
# Example2.2: But you still want to keep <> grey for other messages:
|
||||||
|
# pubmsgnick = "%K{msgnick $0 $1-%K}%n";
|
||||||
|
# pubmsgmenick = "%K{msgnick $0 $1-%K}%n";
|
||||||
|
# pubmsghinick = "%K{msgnick $1 $0$2-%n%K}%n";
|
||||||
|
# ownprivmsgnick = "%K{msgnick $*%K}%n";
|
||||||
|
# privmsgnick = "%K{msgnick %R$*%K}%n";
|
||||||
|
|
||||||
|
# $0 = nick mode, $1 = nick
|
||||||
|
ownmsgnick = "{msgnick $0 $1-}%W";
|
||||||
|
ownnick = "%r$*%n";
|
||||||
|
|
||||||
|
# public message in channel, $0 = nick mode, $1 = nick
|
||||||
|
pubmsgnick = "{msgnick $0$1-}";
|
||||||
|
pubnick = "%N$*%n";
|
||||||
|
|
||||||
|
# public message in channel meant for me, $0 = nick mode, $1 = nick
|
||||||
|
pubmsgmenick = "{msgnick $0$1-}";
|
||||||
|
menick = "%g$*%n";
|
||||||
|
|
||||||
|
# public highlighted message in channel
|
||||||
|
# $0 = highlight color, $1 = nick mode, $2 = nick
|
||||||
|
pubmsghinick = "{msgnick $1 $0$2-%n}";
|
||||||
|
|
||||||
|
# channel name is printed with message
|
||||||
|
msgchannel = "%r:$*%n";
|
||||||
|
|
||||||
|
# private message, $0 = nick, $1 = host
|
||||||
|
privmsg = "[%w$0!%r$1-%n] ";
|
||||||
|
|
||||||
|
# private message from you, $0 = "msg", $1 = target nick
|
||||||
|
ownprivmsg = "[%r$0%b(%R$1-%b)%n] ";
|
||||||
|
|
||||||
|
# own private message in query
|
||||||
|
ownprivmsgnick = "{msgnick $*}";
|
||||||
|
ownprivnick = "%w$*%n";
|
||||||
|
|
||||||
|
# private message in query
|
||||||
|
privmsgnick = "{msgnick %r$*%n}";
|
||||||
|
|
||||||
|
##
|
||||||
|
## Actions (/ME stuff)
|
||||||
|
##
|
||||||
|
|
||||||
|
# used internally by this theme
|
||||||
|
action_core = "%p &%n$*";
|
||||||
|
|
||||||
|
# generic one that's used by most actions
|
||||||
|
action = "{action_core $*} ";
|
||||||
|
|
||||||
|
# own action, both private/public
|
||||||
|
ownaction = "{action %p$*}";
|
||||||
|
|
||||||
|
# own action with target, both private/public
|
||||||
|
ownaction_target = "{action_core $0}%p:%c$1%n ";
|
||||||
|
|
||||||
|
# private action sent by others
|
||||||
|
pvtaction = "%p (*) $*%n ";
|
||||||
|
pvtaction_query = "{action $* }";
|
||||||
|
|
||||||
|
# public action sent by others
|
||||||
|
pubaction = "{action $*}";
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## other IRC events
|
||||||
|
##
|
||||||
|
|
||||||
|
# whois
|
||||||
|
whois = " %r¤ %W$[8]0%n %r¤ %w$1-%n";
|
||||||
|
|
||||||
|
# notices
|
||||||
|
ownnotice = "[%w$0!%r$1-]%n ";
|
||||||
|
notice = "[%rnotice%K(%n$*%K)%n] ";
|
||||||
|
pubnotice_channel = "%R:%R$*";
|
||||||
|
pvtnotice_host = "!%K$*%n";
|
||||||
|
servernotice = "%g¤ %w$*%g ¤%n %_";
|
||||||
|
|
||||||
|
# CTCPs
|
||||||
|
ownctcp = "[%w$0!%c$1-] ";
|
||||||
|
ctcp = "%C$*%n";
|
||||||
|
|
||||||
|
# wallops
|
||||||
|
wallop = "%W$*%n: ";
|
||||||
|
wallop_nick = "%n$*";
|
||||||
|
wallop_action = "%W * $*%n ";
|
||||||
|
|
||||||
|
# netsplits
|
||||||
|
netsplit = "%R$*%n";
|
||||||
|
netjoin = "%G$*%n";
|
||||||
|
|
||||||
|
# /names list
|
||||||
|
names_prefix = " %r¤%n ";
|
||||||
|
names_nick = "[%_$0%_$1-] ";
|
||||||
|
names_nick_op = "%r{names_nick $*}%n";
|
||||||
|
names_nick_halfop = "%r{names_nick $*}%n";
|
||||||
|
names_nick_voice = "%y{names_nick $*}%n";
|
||||||
|
names_users = "[%w$*%n]";
|
||||||
|
names_channel = "%r$*%n";
|
||||||
|
|
||||||
|
# DCC
|
||||||
|
dcc = "%g$*%n";
|
||||||
|
dccfile = "%_$*%_";
|
||||||
|
|
||||||
|
# DCC chat, own msg/action
|
||||||
|
dccownmsg = "[%w$0!%r$1-%n] ";
|
||||||
|
dccownnick = "%w$*%n";
|
||||||
|
dccownquerynick = "%W$*%n";
|
||||||
|
dccownaction = "{action $*}";
|
||||||
|
dccownaction_target = "{action_core $0}%B:%c$1%n ";
|
||||||
|
|
||||||
|
# DCC chat, others
|
||||||
|
dccmsg = "[%w$1-!%g$0%n] ";
|
||||||
|
dccquerynick = "%G$*%n";
|
||||||
|
dccaction = "%W (*dcc*) $*%n %|";
|
||||||
|
|
||||||
|
##
|
||||||
|
## statusbar
|
||||||
|
##
|
||||||
|
|
||||||
|
# default background for all statusbars. You can also give
|
||||||
|
# the default foreground color for statusbar items.
|
||||||
|
sb_background = "%0%K";
|
||||||
|
|
||||||
|
# default backround for "default" statusbar group
|
||||||
|
sb_default_bg = "%0%K";
|
||||||
|
# background for prompt / input line
|
||||||
|
sb_prompt_bg = "%n";
|
||||||
|
# background for info statusbar
|
||||||
|
sb_info_bg = "%0";
|
||||||
|
# background for topicbar (same default)
|
||||||
|
#sb_topic_bg = "%0";
|
||||||
|
|
||||||
|
# text at the beginning of statusbars. sb-item already puts
|
||||||
|
# space there,so we don't use anything by default.
|
||||||
|
sbstart = " %r¤%n ";
|
||||||
|
# text at the end of statusbars. Use space so that it's never
|
||||||
|
# used for anything.
|
||||||
|
sbend = " %r¤%n ";
|
||||||
|
|
||||||
|
topicsbstart = "{sbstart $*}";
|
||||||
|
topicsbend = "{sbend $*}";
|
||||||
|
|
||||||
|
prompt = "[%r$S%W/%r$*%n]%r:%W ";
|
||||||
|
|
||||||
|
sb = " [%K$*%n]";
|
||||||
|
sbmode = " (+%K$*%n)";
|
||||||
|
sbaway = " (%Kaway%n)";
|
||||||
|
sbservertag = ":$1%r";
|
||||||
|
sbnickmode = "%_$0%_";
|
||||||
|
|
||||||
|
# activity in statusbar
|
||||||
|
|
||||||
|
# ',' separator
|
||||||
|
sb_act_sep = "$*";
|
||||||
|
# normal text
|
||||||
|
sb_act_text = "%Y$*";
|
||||||
|
# public message
|
||||||
|
sb_act_msg = "%w$*";
|
||||||
|
# hilight
|
||||||
|
sb_act_hilight = "%G$*";
|
||||||
|
# hilight with specified color, $0 = color, $1 = text
|
||||||
|
sb_act_hilight_color = "$0$1-%n";
|
||||||
|
|
||||||
|
#usercount
|
||||||
|
sb_usercount = "{sb total:%w$0%n $1-}";
|
||||||
|
sb_uc_ircops = "opers:%w$*%n";
|
||||||
|
sb_uc_ops = "chanop:%w$*%n";
|
||||||
|
sb_uc_halfops = "halfop:%w$*%n";
|
||||||
|
sb_uc_voices = "voice:%w$*%n";
|
||||||
|
sb_uc_normal = "peon:%w$*%n";
|
||||||
|
sb_uc_space = " ";
|
||||||
|
|
||||||
|
#nact
|
||||||
|
nact_display = "%B(%b$3%n%B)%n$0%G>%W$1%R>%n$2%B(%b$4%B)%n";
|
||||||
|
};
|
||||||
|
|
||||||
|
formats = {
|
||||||
|
"fe-common/core" = {
|
||||||
|
pubmsg = "{pubmsgnick $2 {pubnick $[-9]0}}$1";
|
||||||
|
join = "%gjoin %G>%n {nick %W$0%n}!%n{chanhost_hilight $1}";
|
||||||
|
part = "%cpart %C<%n {nick %w$0%n}!%n{chanhost_hilight $1} {reason $3}";
|
||||||
|
kick = "%rkick %R<%n {nick %w$0%n} {reason %w$3%n} by {nick $2}";
|
||||||
|
quit = "%Kquit %K<%n {nick %K$0%n}!%n{chanhost_hilight $1} {reason $2}";
|
||||||
|
nick_changed = "%ynick %y~%n {nick %w$0%n} %Nis now {nick %W$1%n}";
|
||||||
|
|
||||||
|
own_msg = "{ownmsgnick $2 {ownnick $[-9]0}}$1";
|
||||||
|
own_msg_channel = "{ownmsgnick $3 {ownnick $[-9]0}{msgchannel $1}}$2";
|
||||||
|
pubmsg_me = "{pubmsgmenick $2 {menick $[-9]0}}$1";
|
||||||
|
pubmsg_me_channel = "{pubmsgmenick $3 {menick $[-9]0}{msgchannel $1}}$2";
|
||||||
|
pubmsg_hilight = "{pubmsghinick $0 $3 $[-9]1}$2";
|
||||||
|
pubmsg_hilight_channel = "{pubmsghinick $0 $4 $[-9]1{msgchannel $2}}$3";
|
||||||
|
pubmsg_channel = "{pubmsgnick $3 {pubnick $[-9]0}{msgchannel $1}}$2";
|
||||||
|
own_msg_private_query = "{ownprivmsgnick {ownprivnick $[-9]2}}$1";
|
||||||
|
msg_private_query = "{privmsgnick $[-9]0}$2";
|
||||||
|
};
|
||||||
|
"fe-common/irc" = {
|
||||||
|
netsplit = "{netsplit %rsplit %R<<%n} {server $0} %w<-%r\\->%n {server %R$1%n}: [$2]";
|
||||||
|
netsplit_more = "{netsplit %rsplit %R<<%n} {server $0} %W<-%r\\->%n {server %R$1%n}: [$2%_+$3 more%_]";
|
||||||
|
netsplit_join = "{netjoin %gre-join %G>>%n} [$0]";
|
||||||
|
netsplit_join_more = "{netjoin %gre-join %G>>%n} [$0\012%_+$1 more%_]";
|
||||||
|
chanmode_change = "%rmode #%n [{mode $1}] by {nick $2}";
|
||||||
|
server_chanmode_change = "%rserv #%n [{mode $1}] by {nick $2}";
|
||||||
|
own_action = "{ownaction $0}%|$1";
|
||||||
|
action_public = "{pubaction $0}%|$1";
|
||||||
|
who = "%#{channelhilight $[-10]0} {nick %n$[9]1%n} $[3]2 $[2]3 {comment {hilight $[10]6}} {comment $[!18]7} {chanhost %n$4@$5}";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Script Addons....
|
||||||
|
|
||||||
|
# kills.pl reformat
|
||||||
|
"Irssi::Script::kills" = {
|
||||||
|
kill_public = "%rkilled ¤%n {channick %w$0%n}!{chanhost $1%n} {reason %w$4%n} by {nick %W$2%n}$3";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 101 KiB |
|
After Width: | Height: | Size: 3.5 MiB |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 253 KiB |
|
After Width: | Height: | Size: 890 KiB |
@@ -0,0 +1,9 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [weechat];
|
||||||
|
services = {
|
||||||
|
weechat = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{ config, pkgs, ...}:
|
||||||
|
{
|
||||||
|
services = {
|
||||||
|
pulseaudio.enable = false;
|
||||||
|
pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
alsa.support32Bit = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [ wireguard-tools ];
|
||||||
|
services = {
|
||||||
|
mullvad-vpn = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.mullvad-vpn;
|
||||||
|
};
|
||||||
|
|
||||||
|
tor = {
|
||||||
|
enable = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
networking = {
|
||||||
|
networkmanager = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
firewall = {
|
||||||
|
enable = false;
|
||||||
|
checkReversePath = false;
|
||||||
|
|
||||||
|
allowedTCPPorts = [];
|
||||||
|
allowedUDPPorts = [];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
vim = {
|
||||||
|
autocomplete = {
|
||||||
|
nvim-cmp = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
sources = {
|
||||||
|
nvim_lsp = "[LSP]";
|
||||||
|
path = "[PATH]";
|
||||||
|
nvim_lua = "[LUA]";
|
||||||
|
};
|
||||||
|
sourcePlugins = [
|
||||||
|
"cmp-nvim-lsp"
|
||||||
|
"cmp-path"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extraLuaFiles = [
|
||||||
|
(builtins.path {
|
||||||
|
path = ./raw/cmp.lua;
|
||||||
|
name = "my-lua-file";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.clang = {
|
||||||
|
dap = {
|
||||||
|
enable = true;
|
||||||
|
debugger = "lldb-vscode";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./rust.nix
|
||||||
|
./clang.nix
|
||||||
|
./python.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.python = {
|
||||||
|
dap = {
|
||||||
|
enable = true;
|
||||||
|
debugger = "debugpy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.rust = {
|
||||||
|
dap = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./terminal.nix
|
||||||
|
./neotree.nix
|
||||||
|
./cmp.nix
|
||||||
|
./lualine.nix
|
||||||
|
./ui.nix
|
||||||
|
./lsp/default.nix
|
||||||
|
./dbg/default.nix
|
||||||
|
];
|
||||||
|
vim = {
|
||||||
|
extraLuaFiles = [
|
||||||
|
(builtins.path {
|
||||||
|
path = ./raw/opts.lua;
|
||||||
|
name = "opts.lua";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
autopairs.nvim-autopairs.enable = true;
|
||||||
|
telescope.enable = true;
|
||||||
|
autocomplete = { enableSharedCmpSources = true; };
|
||||||
|
|
||||||
|
binds = {
|
||||||
|
whichKey = {
|
||||||
|
enable = true;
|
||||||
|
#setupOpts.preset = "helix";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1777699697,
|
||||||
|
"narHash": "sha256-Eg9b/rq/ECYwNwEXs5i9wHyhxNI0JrYx2srdI2uZMaQ=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "382052b74656a369c5408822af3f2501e9b1af81",
|
||||||
|
"revCount": 94,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.lix.systems/lix-project/flake-compat.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.lix.systems/lix-project/flake-compat.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": [
|
||||||
|
"nvf",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1778716662,
|
||||||
|
"narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mnw": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1780772958,
|
||||||
|
"narHash": "sha256-VKKe8r4pwCGWZ3Yr9CPN129R4S3CKLSrlYqdYz3vKpM=",
|
||||||
|
"owner": "Gerg-L",
|
||||||
|
"repo": "mnw",
|
||||||
|
"rev": "0871dbf63a53610c95db04439ed8ea4d6ec9c160",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Gerg-L",
|
||||||
|
"repo": "mnw",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ndg": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nvf",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1779233504,
|
||||||
|
"narHash": "sha256-YIKEyzh0NFQlD0O92LQQNMoVCDwV8yw1Xz0Iu+4ZC5U=",
|
||||||
|
"owner": "feel-co",
|
||||||
|
"repo": "ndg",
|
||||||
|
"rev": "86f6644411a64d5413711895b7cf6e0e1be465b6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "feel-co",
|
||||||
|
"ref": "refs/tags/v2.8.0",
|
||||||
|
"repo": "ndg",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1754214453,
|
||||||
|
"narHash": "sha256-Q/I2xJn/j1wpkGhWkQnm20nShYnG7TI99foDBpXm1SY=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5b09dc45f24cf32316283e62aec81ffee3c3e376",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1781216227,
|
||||||
|
"narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-26.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nvf": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"mnw": "mnw",
|
||||||
|
"ndg": "ndg",
|
||||||
|
"nixpkgs": "nixpkgs_2",
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1781534482,
|
||||||
|
"narHash": "sha256-d3UIqXuigQhsc7amQkZ7F+SWnaJFAxIROE2f2X+pzUs=",
|
||||||
|
"owner": "notashelf",
|
||||||
|
"repo": "nvf",
|
||||||
|
"rev": "63d8fc82d652c23419a837e2b2934dd4bead04f3",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "notashelf",
|
||||||
|
"repo": "nvf",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nvf": "nvf"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
description = "My autistic nvf config";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
nvf.url = "github:notashelf/nvf";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { nixpkgs, nvf, ... }: let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
nvimWrapped = nvf.lib.neovimConfiguration {
|
||||||
|
inherit pkgs;
|
||||||
|
modules = [ ./default.nix ];
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
packages.${system}.default = nvimWrapped.neovim;
|
||||||
|
nixosModules.default = { ... }: {
|
||||||
|
imports = [ nvf.nixosModules.default ];
|
||||||
|
programs.nvf = { enable = true; settings = import ./default.nix; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.assembly = {
|
||||||
|
enable = true;
|
||||||
|
lsp = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.bash = {
|
||||||
|
enable = true;
|
||||||
|
lsp.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.clang = {
|
||||||
|
enable = true;
|
||||||
|
lsp = {
|
||||||
|
enable = true;
|
||||||
|
server = "ccls";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./asm.nix
|
||||||
|
./bash.nix
|
||||||
|
./clang.nix
|
||||||
|
./go.nix
|
||||||
|
./lua.nix
|
||||||
|
./nix-lang.nix
|
||||||
|
./python.nix
|
||||||
|
./rust.nix
|
||||||
|
./lspkind.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.go = {
|
||||||
|
enable = true;
|
||||||
|
lsp.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim = {
|
||||||
|
lsp = {
|
||||||
|
lspkind = {
|
||||||
|
enable = true;
|
||||||
|
setupOpts = {
|
||||||
|
mode = "symbol_text";
|
||||||
|
preset = "codicons";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.lua = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
|
||||||
|
vim.languages.nix = {
|
||||||
|
enable = true;
|
||||||
|
extraDiagnostics = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
format = {
|
||||||
|
enable = true;
|
||||||
|
type = "alejandra";
|
||||||
|
};
|
||||||
|
lsp = {
|
||||||
|
enable = true;
|
||||||
|
server = "nixd";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.python = {
|
||||||
|
enable = true;
|
||||||
|
lsp.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim.languages.rust = {
|
||||||
|
enable = true;
|
||||||
|
dap.enable = true;
|
||||||
|
format.enable = true;
|
||||||
|
lsp.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim = {
|
||||||
|
statusline = {
|
||||||
|
lualine = {
|
||||||
|
enable = true;
|
||||||
|
theme = "base16";
|
||||||
|
globalStatus = true;
|
||||||
|
icons.enable = true;
|
||||||
|
ignoreFocus = [
|
||||||
|
"neo-tree"
|
||||||
|
"filename"
|
||||||
|
"location"
|
||||||
|
];
|
||||||
|
componentSeparator = {
|
||||||
|
left = "";
|
||||||
|
right = "";
|
||||||
|
};
|
||||||
|
sectionSeparator = {
|
||||||
|
left = "";
|
||||||
|
right = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{ pkgs, ... }: {
|
||||||
|
vim = {
|
||||||
|
filetree = {
|
||||||
|
neo-tree = {
|
||||||
|
enable = true;
|
||||||
|
setupOpts = {
|
||||||
|
enable = true;
|
||||||
|
enable_git_status = true;
|
||||||
|
enable_diagnostics = true;
|
||||||
|
enable_refresh_on_write = true;
|
||||||
|
auto_clean_after_session_restore = true;
|
||||||
|
git_status_async = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
local cmp = require("cmp")
|
||||||
|
local lspkind = require("lspkind")
|
||||||
|
|
||||||
|
vim.opt.completeopt = { "menu", "menuone", "noinsert", "noselect" }
|
||||||
|
|
||||||
|
cmp.setup({
|
||||||
|
formatting = {
|
||||||
|
format = function(entry, vim_item)
|
||||||
|
vim_item.kind = lspkind.symbolic(vim_item.kind, { mode = "symbol_text" })[entry.source.name]
|
||||||
|
|
||||||
|
vim_item.dup = ({
|
||||||
|
vsnip = 0,
|
||||||
|
nvim_lsp = 0,
|
||||||
|
nvim_lua = 0,
|
||||||
|
buffer = 0,
|
||||||
|
})[entry.source.name] or 0
|
||||||
|
|
||||||
|
return vim_item
|
||||||
|
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
sorting = {
|
||||||
|
comparators = {
|
||||||
|
cmp.config.compare.offset,
|
||||||
|
cmp.config.compare.exact,
|
||||||
|
cmp.config.compare.score,
|
||||||
|
cmp.config.compare.kind,
|
||||||
|
cmp.config.compare.sort_text,
|
||||||
|
cmp.config.compare.length,
|
||||||
|
cmp.config.compare.order,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
window = {
|
||||||
|
completion = {
|
||||||
|
autocomplete = true,
|
||||||
|
col_offset = -3,
|
||||||
|
side_padding = 0,
|
||||||
|
},
|
||||||
|
completion = cmp.config.window.bordered({
|
||||||
|
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None",
|
||||||
|
}),
|
||||||
|
documentation = cmp.config.window.bordered({
|
||||||
|
winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,CursorLine:PmenuSel,Search:None",
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
mapping = cmp.mapping.preset.insert({
|
||||||
|
["<Tab>"] = cmp.mapping(function(fallback)
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_next_item()
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end, { "i", "s" }),
|
||||||
|
|
||||||
|
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||||
|
if cmp.visible() then
|
||||||
|
cmp.select_prev_item()
|
||||||
|
else
|
||||||
|
fallback()
|
||||||
|
end
|
||||||
|
end, { "i", "s" }),
|
||||||
|
|
||||||
|
["<C-b>"] = cmp.mapping.scroll_docs(-4),
|
||||||
|
["<C-f>"] = cmp.mapping.scroll_docs(4),
|
||||||
|
["<C-Space>"] = cmp.mapping.complete(),
|
||||||
|
["<C-e>"] = cmp.mapping.abort(),
|
||||||
|
["<CR>"] = cmp.mapping.confirm({ select = false }),
|
||||||
|
}),
|
||||||
|
--sources = cmp.config.sources({
|
||||||
|
-- { name = 'nvim_lsp' },
|
||||||
|
-- { name = 'path' },
|
||||||
|
-- { name = 'nvim_lua' },
|
||||||
|
--}),
|
||||||
|
})
|
||||||
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
vim.opt.shiftwidth = 2
|
||||||
|
vim.opt.tabstop = 2
|
||||||
|
vim.opt.cursorline = true
|
||||||
|
vim.opt.cursorcolumn = true
|
||||||
|
vim.opt.expandtab = true
|
||||||
|
vim.opt.autoindent = true
|
||||||
|
vim.opt.smartindent = true
|
||||||
|
vim.opt.softtabstop = 2
|
||||||
|
vim.opt.relativenumber = true
|
||||||
|
|
||||||
|
vim.diagnostic.config({
|
||||||
|
virtual_text = true,
|
||||||
|
virtual_lines = false,
|
||||||
|
})
|
||||||
|
|
||||||
|
local map = vim.api.nvim_set_keymap
|
||||||
|
local opts = { noremap = true, silent = true }
|
||||||
|
|
||||||
|
vim.g.mapleader = "\\"
|
||||||
|
map('n', '<c-t>', ":ToggleTerm size=15<CR>", opts)
|
||||||
|
map('n', '<leader>n', ":Neotree filesystem reveal toggle<CR>", opts)
|
||||||
|
map('v', '<Tab>', '>gv', opts)
|
||||||
|
map('v', '<S-Tab>', '<gv', opts)
|
||||||
|
map('n', '<leader>ff', 'Telescope find_files<CR>', opts)
|
||||||
|
map('n', '<leader>gs', 'Telescope grep_string<CR>', opts)
|
||||||
|
|
||||||
|
vim.cmd [[
|
||||||
|
set nobackup
|
||||||
|
cnoreabbrev W! w!
|
||||||
|
cnoreabbrev Q! q!
|
||||||
|
cnoreabbrev Qall! qall!
|
||||||
|
cnoreabbrev Wq wq
|
||||||
|
cnoreabbrev Wa wa
|
||||||
|
cnoreabbrev wQ wq
|
||||||
|
cnoreabbrev WQ wq
|
||||||
|
cnoreabbrev W w
|
||||||
|
cnoreabbrev Q q
|
||||||
|
cnoreabbrev Qall qall
|
||||||
|
]]
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
vim = {
|
||||||
|
terminal = {
|
||||||
|
toggleterm = {
|
||||||
|
enable = true;
|
||||||
|
lazygit.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
vim = {
|
||||||
|
tabline = {
|
||||||
|
nvimBufferline = {
|
||||||
|
enable = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
ui = {
|
||||||
|
borders = {
|
||||||
|
enable = true;
|
||||||
|
globalStyle = "rounded";
|
||||||
|
};
|
||||||
|
colorful-menu-nvim.enable = true;
|
||||||
|
colorizer.enable = true;
|
||||||
|
};
|
||||||
|
theme = {
|
||||||
|
enable = true;
|
||||||
|
name = "oxocarbon";
|
||||||
|
style = "dark";
|
||||||
|
};
|
||||||
|
visuals = {
|
||||||
|
indent-blankline.enable = true;
|
||||||
|
fidget-nvim.enable = true;
|
||||||
|
nvim-web-devicons.enable = true;
|
||||||
|
};
|
||||||
|
dashboard.alpha = {
|
||||||
|
enable = true;
|
||||||
|
theme = "startify";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
let
|
||||||
|
no-rgb = pkgs.writeScriptBin "no-rgb" ''
|
||||||
|
#!/bin/sh
|
||||||
|
NUM_DEVICES=$(${pkgs.openrgb}/bin/openrgb --noautoconnect --list-devices | grep -E '^[0-9]+: ' | wc -l)
|
||||||
|
|
||||||
|
for i in $(seq 0 $(($NUM_DEVICES - 1))); do
|
||||||
|
${pkgs.openrgb}/bin/openrgb --noautoconnect --device $i --mode static --color 000000
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
config = {
|
||||||
|
services.udev.packages = [ pkgs.openrgb ];
|
||||||
|
boot.kernelModules = [ "i2c-dev" ];
|
||||||
|
hardware.i2c.enable = true;
|
||||||
|
|
||||||
|
systemd.services.no-rgb = {
|
||||||
|
description = "no-rgb";
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = "${no-rgb}/bin/no-rgb";
|
||||||
|
#Type = "oneshot";
|
||||||
|
};
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
security = {
|
||||||
|
doas = {
|
||||||
|
enable = true;
|
||||||
|
extraConfig = "permit nopass keepenv :wheel";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
programs = {
|
||||||
|
bash = {
|
||||||
|
enable = true;
|
||||||
|
enableLsColors = true;
|
||||||
|
completion = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.bash-completion;
|
||||||
|
};
|
||||||
|
promptInit = ''
|
||||||
|
PS1="\$PWD:[\h] % "
|
||||||
|
'';
|
||||||
|
shellAliases = {
|
||||||
|
"mount" = "doas mount --mkdir -v $@";
|
||||||
|
"mkdir" = "mkdir -pv";
|
||||||
|
"cp" = "cp -rv";
|
||||||
|
"mv" = "mv -v $@";
|
||||||
|
"rm" = "rm -v $@ -I";
|
||||||
|
"ls" = "${pkgs.eza}/bin/eza --icons -l";
|
||||||
|
"http" = "${pkgs.python3}/bin/python3 -m http.server 1337";
|
||||||
|
"sudo" = "doas";
|
||||||
|
"myip" = "curl -sSL icanhazip.com";
|
||||||
|
"update" = "doas nixos-rebuild switch";
|
||||||
|
"f" = "fastfetch";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
ssh = {
|
||||||
|
askPassword = "${pkgs.openssh-askpass}/libexec/gtk-ssh-askpass";
|
||||||
|
};
|
||||||
|
git = {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
init = {
|
||||||
|
defaultBranch = "main";
|
||||||
|
};
|
||||||
|
user = {
|
||||||
|
name = "halbg0tt";
|
||||||
|
email = "halbg0tt@protonmail.com";
|
||||||
|
};
|
||||||
|
url = {
|
||||||
|
"https://github.com" = {
|
||||||
|
insteadOf = [
|
||||||
|
"gh:"
|
||||||
|
"github:"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
tmux = {
|
||||||
|
enable = true;
|
||||||
|
keyMode = "vi";
|
||||||
|
aggressiveResize = true;
|
||||||
|
terminal = "tmux-256color";
|
||||||
|
extraConfig = ''
|
||||||
|
unbind C-b
|
||||||
|
# unbind t
|
||||||
|
set -g prefix C-a
|
||||||
|
bind C-a send-prefix
|
||||||
|
|
||||||
|
bind r source-file /etc/tmux.conf
|
||||||
|
|
||||||
|
setw -g mode-keys vi
|
||||||
|
setw -g mouse on
|
||||||
|
|
||||||
|
# make ctrl + arrow keys working
|
||||||
|
set -s extended-keys on
|
||||||
|
set -as terminal-features 'xterm*:extkeys'
|
||||||
|
set -g xterm-keys on
|
||||||
|
|
||||||
|
bind-key -n S-Left select-pane -L
|
||||||
|
bind-key -n S-Down select-pane -D
|
||||||
|
bind-key -n S-Up select-pane -U
|
||||||
|
bind-key -n S-Right select-pane -R
|
||||||
|
|
||||||
|
bind-key -n C-t new-window "#{pane_current_path}"
|
||||||
|
bind t new-window
|
||||||
|
|
||||||
|
bind-key -n M-w previous-window
|
||||||
|
bind-key -n M-e next-window
|
||||||
|
|
||||||
|
set -g base-index 1
|
||||||
|
set -g renumber-windows on
|
||||||
|
|
||||||
|
set-window-option -g clock-mode-colour colour196
|
||||||
|
|
||||||
|
set -g status-bg black
|
||||||
|
set -g status-fg white
|
||||||
|
set -g status-position top
|
||||||
|
set -g status-interval 1
|
||||||
|
|
||||||
|
set -g status-left-length 64
|
||||||
|
set -g status-left "#[bg=colour196,fg=black,bold] [#S] #[bg=black,fg=colour196,nobold,noitalics,nounderscore] "
|
||||||
|
|
||||||
|
set -g status-right-length 64
|
||||||
|
set -g status-right "#[bg=black,fg=black]#[bg=black,fg=white] #{pane_title} #[bg=black,fg=colour196,bold]#[bg=colour196,fg=black,bold] %a %d %b #[fg=black,bold]%H:%M:%S "
|
||||||
|
|
||||||
|
set-window-option -g window-status-current-format "#[bg=colour196,fg=black,nobold,noitalics,nounderscore]#[bg=colour196,fg=black,bold] #I #[bg=colour196,fg=black,bold] #W#{?window_zoomed_flag,*Z,} #[bg=black,fg=colour196,nobold,noitalics,nounderscore]"
|
||||||
|
set-window-option -g window-status-format "#[bg=black,fg=black,noitalics]#[bg=black,fg=white] #I #[bg=black,fg=white] #W #[bg=black,fg=black,noitalics]"
|
||||||
|
|
||||||
|
bind - split-window
|
||||||
|
bind \\ split-window -h
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
nix = {
|
||||||
|
settings = {
|
||||||
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
sandbox = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
nixpkgs = {
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
permittedInsecurePackages = [
|
||||||
|
"librewolf-151.0.2-1"
|
||||||
|
"librewolf-unwrapped-151.0.2-1"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
stateVersion = "26.05";
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
users.users.user = {
|
||||||
|
isNormalUser = true;
|
||||||
|
createHome = true;
|
||||||
|
home = "/home/user";
|
||||||
|
extraGroups =
|
||||||
|
[
|
||||||
|
"users" "wheel" "root"
|
||||||
|
"plugdev" "dialout" "input"
|
||||||
|
"network" "disk" "cdrom"
|
||||||
|
"video" "audio" "scanner"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./librewolf.nix
|
||||||
|
./firefox.nix
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
programs.firefox.enable = true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
_:
|
||||||
|
{
|
||||||
|
programs.librewolf.enable = true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
{
|
||||||
|
programs = {
|
||||||
|
qutebrowser = {
|
||||||
|
enable = false;
|
||||||
|
enableDefaultBindings = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# home = { file = { }; };
|
||||||
|
}
|
||||||