Compare commits
48 Commits
3e2891be28
...
master
Author | SHA1 | Date | |
---|---|---|---|
8c5d99b231 | |||
![]() |
0eb31c0ca8 | ||
![]() |
02fb719e5b | ||
![]() |
b3010c39ec | ||
![]() |
d6d387ee85 | ||
![]() |
499a7859ee | ||
![]() |
55ee078daf | ||
![]() |
9574adb7a7 | ||
![]() |
a90b640470 | ||
![]() |
45d64858bd | ||
![]() |
3e5e10f5b5 | ||
![]() |
d409d60b72 | ||
![]() |
f0abdb3a2c | ||
![]() |
cf447ad966 | ||
![]() |
0cd39b3b42 | ||
![]() |
a8e801e040 | ||
![]() |
7bbb1a9921 | ||
![]() |
c3aba30c34 | ||
![]() |
160ea2abc7 | ||
![]() |
4747ba1c58 | ||
![]() |
a4a76bd91f | ||
![]() |
9999dc3baf | ||
![]() |
009edeb259 | ||
![]() |
617119491f | ||
![]() |
76bb9c4d60 | ||
![]() |
fb10bb05eb | ||
![]() |
bfaf0a1b9c | ||
![]() |
9c00f3c466 | ||
![]() |
5823b2d534 | ||
![]() |
f67ce54e8a | ||
![]() |
c6bf052da6 | ||
![]() |
a7a9e9fd6a | ||
![]() |
89f10fbf63 | ||
![]() |
ec50143a97 | ||
![]() |
68f9f0afb0 | ||
![]() |
eb10424ccf | ||
![]() |
21feb914f0 | ||
![]() |
40e02f8ece | ||
![]() |
5834779d2b | ||
![]() |
f1a7bf0b6b | ||
![]() |
5443a41016 | ||
![]() |
20ff1d16dd | ||
![]() |
3c0a5834b0 | ||
![]() |
42130edad6 | ||
![]() |
510f3b41db | ||
![]() |
2c8b799325 | ||
![]() |
a68b5786e5 | ||
![]() |
4da8df94ac |
2345
flake.lock
generated
30
flake.nix
@ -2,45 +2,53 @@
|
||||
description = "Sojus07 shitty NixOS Configuration lol";
|
||||
|
||||
inputs = {
|
||||
nix-sdr.url = "github:Sojus07/nix-sdr";
|
||||
dwm-nix.url = "github:Sojus07/dwm-nix";
|
||||
nvf-config.url = "github:Sojus07/nvf-config";
|
||||
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||
nvf.url = "github:notashelf/nvf";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
home-manager,
|
||||
nvf,
|
||||
nix-sdr,
|
||||
dwm-nix,
|
||||
nvf-config,
|
||||
}: {
|
||||
nixosConfigurations.computer = nixpkgs.lib.nixosSystem {
|
||||
nixosConfigurations.iridium = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
./hosts/computer/configuration.nix
|
||||
nvf.nixosModules.default
|
||||
./hosts/iridium/configuration.nix
|
||||
home-manager.nixosModules.home-manager
|
||||
nix-sdr.nixosModules.default
|
||||
dwm-nix.nixosModules.default
|
||||
nvf-config.nixosModules.default
|
||||
{
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
useUserPackages = true;
|
||||
users.fabian = import ./hosts/default/home/home.nix;
|
||||
users.fabian = import ./modules/home.nix;
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
nixosConfigurations.laptop = nixpkgs.lib.nixosSystem {
|
||||
nixosConfigurations.meteor = nixpkgs.lib.nixosSystem {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
./hosts/laptop/configuration.nix
|
||||
nvf.nixosModules.default
|
||||
./hosts/meteor/configuration.nix
|
||||
home-manager.nixosModules.home-manager
|
||||
nix-sdr.nixosModules.default
|
||||
dwm-nix.nixosModules.default
|
||||
nvf-config.nixosModules.default
|
||||
{
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
useUserPackages = true;
|
||||
users.fabian = import ./hosts/default/home/home.nix;
|
||||
users.fabian = import ./modules/home.nix;
|
||||
};
|
||||
}
|
||||
];
|
||||
|
@ -1,17 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
boot = {
|
||||
loader = {
|
||||
systemd-boot = {
|
||||
enable = true;
|
||||
extraEntries = {
|
||||
"mint.conf" = ''
|
||||
title Linux Mint
|
||||
efi /EFI/ubuntu/shimx64.efi
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
supportedFilesystems = [ "ntfs" ];
|
||||
};
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./networking.nix
|
||||
./users.nix
|
||||
./services.nix
|
||||
./gaming.nix
|
||||
./firefox.nix
|
||||
./pkgs.nix
|
||||
./sec.nix
|
||||
./virt.nix
|
||||
./boot.nix
|
||||
./hw.nix
|
||||
];
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
programs = {
|
||||
steam = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
hardware = {
|
||||
bluetooth = {
|
||||
enable = true;
|
||||
};
|
||||
graphics = {
|
||||
enable = true;
|
||||
};
|
||||
rtl-sdr = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
networking = {
|
||||
hostName = "poggers";
|
||||
networkmanager.enable = true;
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [
|
||||
80
|
||||
1337
|
||||
8080
|
||||
3000
|
||||
8000
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
}
|
@ -1,123 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
# System utilities
|
||||
unzip
|
||||
yt-dlp
|
||||
inetutils
|
||||
git
|
||||
wget
|
||||
curl
|
||||
dosfstools
|
||||
ntfs3g
|
||||
usbutils
|
||||
alsa-utils
|
||||
pavucontrol
|
||||
flameshot
|
||||
feh
|
||||
gnumake
|
||||
tree
|
||||
gdb
|
||||
vscode
|
||||
neovide
|
||||
|
||||
# Command-line utilities
|
||||
neofetch
|
||||
fastfetch
|
||||
onefetch
|
||||
vim
|
||||
weechat
|
||||
ranger
|
||||
eza
|
||||
fzf
|
||||
htop
|
||||
btop
|
||||
jq
|
||||
|
||||
# Development & compilers
|
||||
rustup
|
||||
python3
|
||||
python312Packages.pip
|
||||
nodejs
|
||||
gccgo14
|
||||
go
|
||||
dotnet-sdk
|
||||
bear
|
||||
|
||||
# Android development
|
||||
android-tools
|
||||
android-udev-rules
|
||||
android-studio-tools
|
||||
|
||||
# Windows compatibility
|
||||
wine
|
||||
winetricks
|
||||
|
||||
# Embedded & hardware development
|
||||
espup
|
||||
esphome
|
||||
esptool
|
||||
espflash
|
||||
minicom
|
||||
pulseview
|
||||
cp210x-program
|
||||
arduino-ide
|
||||
arduino-cli
|
||||
flashrom
|
||||
binwalk
|
||||
chirp
|
||||
picocom
|
||||
pwndbg
|
||||
minipro
|
||||
ethtool
|
||||
|
||||
# Language servers (LSPs)
|
||||
nixd
|
||||
arduino-language-server
|
||||
|
||||
# Libraries
|
||||
python312Packages.pyserial
|
||||
python312Packages.meshtastic
|
||||
|
||||
# Virtualization
|
||||
qemu
|
||||
|
||||
# Software Defined Radio (SDR)
|
||||
noaa-apt
|
||||
wsjtx
|
||||
qsstv
|
||||
gpredict
|
||||
sdrangel
|
||||
sdrpp
|
||||
gnuradio
|
||||
cubicsdr
|
||||
gqrx
|
||||
multimon-ng
|
||||
|
||||
# Miscellaneous
|
||||
cava
|
||||
vesktop
|
||||
pacman
|
||||
wf-recorder
|
||||
qbittorrent
|
||||
];
|
||||
|
||||
fonts = {
|
||||
fontconfig.enable = true;
|
||||
packages = with pkgs; [
|
||||
terminus-nerdfont
|
||||
noto-fonts
|
||||
noto-fonts-emoji
|
||||
liberation_ttf
|
||||
fira-code
|
||||
fira-code-symbols
|
||||
fantasque-sans-mono
|
||||
mplus-outline-fonts.githubRelease
|
||||
dina-font
|
||||
proggyfonts
|
||||
pkgs.nerd-fonts._0xproto
|
||||
pkgs.nerd-fonts.droid-sans-mono
|
||||
];
|
||||
};
|
||||
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
security = {
|
||||
doas = {
|
||||
enable = true;
|
||||
extraRules = [
|
||||
{
|
||||
users = [ "fabian" ];
|
||||
noPass = true;
|
||||
keepEnv = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
services = {
|
||||
libinput = {
|
||||
enable = true;
|
||||
};
|
||||
pipewire = {
|
||||
enable = true;
|
||||
pulse.enable = true;
|
||||
wireplumber.enable = true;
|
||||
};
|
||||
mullvad-vpn = {
|
||||
enable = true;
|
||||
package = pkgs.mullvad-vpn;
|
||||
};
|
||||
sdrplayApi = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
users = {
|
||||
defaultUserShell = pkgs.fish;
|
||||
users = {
|
||||
fabian = {
|
||||
useDefaultShell = true;
|
||||
shell = pkgs.fish;
|
||||
isNormalUser = true;
|
||||
initialPassword = "1601";
|
||||
extraGroups = [
|
||||
"wheel"
|
||||
"docker"
|
||||
"audio"
|
||||
"video"
|
||||
"dialout"
|
||||
"plugdev"
|
||||
"adbusers"
|
||||
"kvm"
|
||||
"dialout"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
virtualisation = {
|
||||
docker = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
./windowManager/dwm/default.nix
|
||||
./editors/nvim/default.nix
|
||||
];
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
programs.nvf.settings.vim = {
|
||||
extraLuaFiles = [
|
||||
(builtins.path {
|
||||
path = ./raw/cmp.lua;
|
||||
name = "my-lua-file";
|
||||
})
|
||||
];
|
||||
autocomplete = {
|
||||
nvim-cmp = {
|
||||
enable = true;
|
||||
setupOpts = {
|
||||
completion = {
|
||||
completeopt = "menu,menuone,noinsert,noselect";
|
||||
};
|
||||
};
|
||||
#sourcePlugins = [
|
||||
# "crates-nvim"
|
||||
# "cmp-nvim-lsp"
|
||||
# "rustaceanvim"
|
||||
#];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./lsp.nix
|
||||
./terminal.nix
|
||||
./neotree.nix
|
||||
./cmp.nix
|
||||
./lualine.nix
|
||||
./snip.nix
|
||||
./extraPlugins.nix
|
||||
];
|
||||
programs.nvf = {
|
||||
enable = true;
|
||||
settings = {
|
||||
vim = {
|
||||
ui = {
|
||||
noice = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
extraLuaFiles = [
|
||||
(builtins.path {
|
||||
path = ./raw/opts.lua;
|
||||
name = "opts.lua";
|
||||
})
|
||||
];
|
||||
autopairs.nvim-autopairs.enable = true;
|
||||
telescope.enable = true;
|
||||
theme = {
|
||||
enable = true;
|
||||
name = "oxocarbon";
|
||||
style = "dark";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -1,11 +0,0 @@
|
||||
{ pkgs, lib, ... }:
|
||||
{
|
||||
programs.nvf.settings.vim = {
|
||||
extraPlugins = with pkgs; {
|
||||
neocord = {
|
||||
package = vimPlugins.neocord;
|
||||
setup = "require('neocord').setup {}";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
programs.nvf.settings.vim = {
|
||||
languages = {
|
||||
clang = {
|
||||
enable = true;
|
||||
dap.enable = true;
|
||||
treesitter.enable = true;
|
||||
lsp.enable = true;
|
||||
};
|
||||
python = {
|
||||
enable = true;
|
||||
lsp.enable = true;
|
||||
treesitter.enable = true;
|
||||
};
|
||||
go = {
|
||||
enable = true;
|
||||
lsp.enable = true;
|
||||
treesitter.enable = true;
|
||||
};
|
||||
lua = {
|
||||
enable = true;
|
||||
};
|
||||
rust = {
|
||||
enable = true;
|
||||
dap.enable = true;
|
||||
format.enable = true;
|
||||
lsp.enable = true;
|
||||
};
|
||||
html = {
|
||||
enable = true;
|
||||
treesitter = {
|
||||
enable = true;
|
||||
autotagHtml = true;
|
||||
};
|
||||
};
|
||||
css = {
|
||||
enable = true;
|
||||
treesitter.enable = true;
|
||||
lsp.enable = true;
|
||||
};
|
||||
assembly = {
|
||||
enable = true;
|
||||
lsp.enable = true;
|
||||
treesitter.enable = true;
|
||||
};
|
||||
bash = {
|
||||
enable = true;
|
||||
lsp.enable = true;
|
||||
treesitter.enable = true;
|
||||
};
|
||||
ts = {
|
||||
enable = true;
|
||||
extraDiagnostics.enable = true;
|
||||
treesitter.enable = true;
|
||||
lsp.enable = true;
|
||||
};
|
||||
nix = {
|
||||
enable = true;
|
||||
extraDiagnostics = {
|
||||
enable = true;
|
||||
};
|
||||
format = {
|
||||
enable = true;
|
||||
type = "alejandra";
|
||||
};
|
||||
lsp.enable = true;
|
||||
treesitter.enable = true;
|
||||
};
|
||||
};
|
||||
lsp = {
|
||||
trouble = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
{ pkgs, lib, ... }:
|
||||
{
|
||||
programs.nvf.settings.vim = {
|
||||
statusline = {
|
||||
lualine = {
|
||||
enable = true;
|
||||
theme = "oxocarbon";
|
||||
globalStatus = true;
|
||||
icons.enable = true;
|
||||
ignoreFocus = [
|
||||
"neo-tree"
|
||||
"filename"
|
||||
"location"
|
||||
];
|
||||
componentSeparator = {
|
||||
left = "";
|
||||
right = "";
|
||||
};
|
||||
sectionSeparator = {
|
||||
left = "";
|
||||
right = "";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
programs.nvf.settings.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;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
local cmp = require("cmp")
|
||||
vim.opt.completeopt = { "menu", "menuone", "noinsert", "noselect" }
|
||||
cmp.setup({
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
require('luasnip').lsp_expand(args.body)
|
||||
end,
|
||||
},
|
||||
sorting = {
|
||||
comparators = {
|
||||
cmp.config.compare.offset,
|
||||
cmp.config.compare.exact,
|
||||
cmp.config.compare.recently_used,
|
||||
cmp.config.compare.kind,
|
||||
cmp.config.compare.sort_text,
|
||||
cmp.config.compare.length,
|
||||
cmp.config.compare.order,
|
||||
},
|
||||
},
|
||||
window = {
|
||||
completion = cmp.config.window.bordered(),
|
||||
documentation = cmp.config.window.bordered(),
|
||||
},
|
||||
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(),
|
||||
["<C-Left>"] = cmp.mapping.abort(),
|
||||
["<CR>"] = cmp.mapping.confirm({ select = false }),
|
||||
}),
|
||||
sources = cmp.config.sources({
|
||||
{ name = 'nvim_lsp' },
|
||||
{ name = 'luasnip' },
|
||||
{ name = 'buffer' },
|
||||
{ name = 'path' },
|
||||
{ name = 'nvim_lua' },
|
||||
{ name = 'emoji' },
|
||||
}),
|
||||
highlight = {
|
||||
default = "Subtle"
|
||||
},
|
||||
})
|
@ -1,40 +0,0 @@
|
||||
vim.opt.shiftwidth = 4
|
||||
vim.opt.tabstop = 4
|
||||
vim.opt.cursorline = true
|
||||
vim.opt.cursorcolumn = true
|
||||
vim.opt.expandtab = true
|
||||
vim.opt.autoindent = true
|
||||
vim.opt.smartindent = true
|
||||
vim.opt.softtabstop = 4
|
||||
vim.opt.relativenumber = true
|
||||
|
||||
vim.diagnostic.config({
|
||||
virtual_text = true,
|
||||
virtual_lines = true,
|
||||
})
|
||||
|
||||
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', '<c-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
|
||||
]]
|
||||
|
@ -1,21 +0,0 @@
|
||||
{ pkgs, lib,...}:
|
||||
{
|
||||
programs.nvf.settings.vim = {
|
||||
snippets = {
|
||||
luasnip = {
|
||||
enable = true;
|
||||
loaders = "require('luasnip.loaders.from_snipmate').lazy_load()";
|
||||
#providers = [
|
||||
# "friendly-snippets"
|
||||
# "crates-nvim"
|
||||
# "lspkind"
|
||||
# "lspsaga"
|
||||
# "rustaceanvim"
|
||||
#];
|
||||
setupOpts = {
|
||||
enable_autosnippets = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
programs.nvf.settings.vim = {
|
||||
terminal = {
|
||||
toggleterm = {
|
||||
enable = true;
|
||||
lazygit.enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./nix
|
||||
./../windowManager/sway/default.nix
|
||||
];
|
||||
home = {
|
||||
enableNixpkgsReleaseCheck = false;
|
||||
stateVersion = "24.11";
|
||||
file = {
|
||||
".wp/temple.png".source = ./raw/wp/temple.png;
|
||||
".wp/skull_purple.png".source = ./raw/wp/skull_purple.png;
|
||||
".wp/gruvbox-dark-blue.png".source = ./raw/wp/gruvbox-dark-blue.png;
|
||||
".wp/anime_blue.png".source = ./raw/wp/anime_blue.png;
|
||||
".wp/fuji.png".source = ./raw/wp/fuji.png;
|
||||
".wp/orbit.png".source = ./raw/wp/orbit.png;
|
||||
".wp/hollow_knight.png".source = ./raw/wp/hollow_knight.png;
|
||||
".wp/ios.png".source = ./raw/wp/ios.png;
|
||||
".wp/manga.png".source = ./raw/wp/manga.png;
|
||||
".wp/bg.png".source = ./raw/wp/bg.png;
|
||||
".wp/wolf.png".source = ./raw/wp/wolf.png;
|
||||
".wp/nixos_dark.png".source = ./raw/wp/nixos_dark.png;
|
||||
".wp/GABE_Windows.png".source = ./raw/wp/GABE_Windows.png;
|
||||
".wp/skulls.png".source = ./raw/wp/skulls.png;
|
||||
".wp/soyuz.png".source = ./raw/wp/soyuz.png;
|
||||
};
|
||||
};
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
programs.alacritty = {
|
||||
enable = true;
|
||||
settings = {
|
||||
window.dimensions = {
|
||||
lines = 4;
|
||||
columns = 200;
|
||||
};
|
||||
font = {
|
||||
size = 15;
|
||||
normal = {
|
||||
family = "TerminessNerdFont";
|
||||
style = "Regular";
|
||||
};
|
||||
};
|
||||
terminal = {
|
||||
shell = "tmux";
|
||||
};
|
||||
colors = {
|
||||
primary = {
|
||||
foreground = "#f2f4f8";
|
||||
background = "#121212";
|
||||
};
|
||||
normal = {
|
||||
black = "#121212";
|
||||
red = "#ee5396";
|
||||
green = "#25be6a";
|
||||
yellow = "#08bdba";
|
||||
blue = "#78a9ff";
|
||||
magenta = "#be95ff";
|
||||
cyan = "#33b1ff";
|
||||
white = "#dfdfe0";
|
||||
};
|
||||
bright = {
|
||||
black = "#525252";
|
||||
red = "#ff7eb6";
|
||||
green = "#42be65";
|
||||
yellow = "#3ddbd9";
|
||||
blue = "#82cfff";
|
||||
magenta = "#df99ff";
|
||||
cyan = "#6ea6ff";
|
||||
white = "#ffffff";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
./alacritty.nix
|
||||
./shell.nix
|
||||
./git.nix
|
||||
./tmux.nix
|
||||
./mpd.nix
|
||||
];
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
programs = {
|
||||
git = {
|
||||
enable = true;
|
||||
userName = "Sojus07";
|
||||
userEmail = "Sojus07";
|
||||
};
|
||||
};
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
mpc
|
||||
mpd-discord-rpc
|
||||
mpv
|
||||
];
|
||||
services = {
|
||||
mpd = {
|
||||
enable = true;
|
||||
musicDirectory = "/home/fabian/.music";
|
||||
extraConfig = ''
|
||||
audio_output {
|
||||
type "pipewire"
|
||||
name "Pipewire Output"
|
||||
}
|
||||
|
||||
audio_output {
|
||||
type "fifo"
|
||||
name "Visualizer feed"
|
||||
path "/tmp/mpd.fifo"
|
||||
format "44100:16:2"
|
||||
}
|
||||
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
programs = {
|
||||
ncmpcpp = {
|
||||
enable = true;
|
||||
mpdMusicDir = "/home/fabian/.music";
|
||||
bindings = [
|
||||
];
|
||||
settings = {
|
||||
ncmpcpp_directory = "~/.ncmpcpp";
|
||||
mpd_host = "localhost";
|
||||
mpd_port = 6600;
|
||||
header_window_color = "cyan";
|
||||
progressbar_look = "━━━";
|
||||
visualizer_color = "cyan";
|
||||
visualizer_look = "┃│";
|
||||
now_playing_prefix = " ";
|
||||
visualizer_type = "wave";
|
||||
song_status_format = " $2%a $4⟫$3⟫ $8%t $4⟫$3⟫ $5%b ";
|
||||
autocenter_mode = "yes";
|
||||
centered_cursor = "yes";
|
||||
display_bitrate = "no";
|
||||
enable_window_title = "no";
|
||||
follow_now_playing_lyrics = "yes";
|
||||
ignore_leading_the = "yes";
|
||||
empty_tag_marker = "";
|
||||
visualizer_data_source = "/tmp/mpd.fifo";
|
||||
visualizer_output_name = "my_fifo";
|
||||
header_visibility = false;
|
||||
statusbar_visibility = true;
|
||||
titles_visibility = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
grc
|
||||
];
|
||||
programs = {
|
||||
fish = {
|
||||
enable = true;
|
||||
generateCompletions = true;
|
||||
interactiveShellInit = ''
|
||||
set -gx DEVKITPRO "/opt/devkitpro";
|
||||
set -gx DEVKITPPC "/opt/devkitpro/devkitPPC";
|
||||
set -gx DEVKITA64 "/opt/devkitpro/devkitA64";
|
||||
set -gx DEVKITARM "/opt/devkitpro/devkitARM";
|
||||
set -gx PATH "/opt/devkitpro/tools/bin:$PATH";
|
||||
'';
|
||||
shellAliases = {
|
||||
g = "git";
|
||||
gc = "git commit";
|
||||
ga = "git add -A";
|
||||
http = "python3 -m http.server";
|
||||
ls = "${pkgs.eza}/bin/eza -l --icons";
|
||||
tree = "${pkgs.eza}/bin/eza --tree --icons";
|
||||
cp = "cp -rv";
|
||||
mv = "mv -v";
|
||||
mkdir = "mkdir -pv";
|
||||
update-default = "sudo nixos-rebuild switch --flake /etc/nixos#default --impure";
|
||||
update-laptop = "sudo nixos-rebuild switch --flake /etc/nixos#laptop --impure";
|
||||
};
|
||||
plugins = [
|
||||
{
|
||||
name = "fzf-fish";
|
||||
src = pkgs.fishPlugins.fzf-fish.src;
|
||||
}
|
||||
{
|
||||
name = "git-abbr";
|
||||
src = pkgs.fishPlugins.git-abbr.src;
|
||||
}
|
||||
{
|
||||
name = "forgit";
|
||||
src = pkgs.fishPlugins.forgit.src;
|
||||
}
|
||||
{
|
||||
name = "colored-man-pages";
|
||||
src = pkgs.fishPlugins.colored-man-pages.src;
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
bash = {
|
||||
enable = false;
|
||||
enableCompletion = true;
|
||||
sessionVariables = {
|
||||
DEVKITPRO = "/opt/devkitpro";
|
||||
DEVKITPPC = "/opt/devkitpro/devkitPPC";
|
||||
DEVKITA64 = "/opt/devkitpro/devkitA64";
|
||||
DEVKITARM = "/opt/devkitpro/devkitARM";
|
||||
PATH = "/opt/devkitpro/tools/bin:$PATH";
|
||||
};
|
||||
shellAliases = {
|
||||
http = "python3 -m http.server";
|
||||
rm = "rm $@ -v -I";
|
||||
ls = "${pkgs.eza}/bin/eza -l --icons";
|
||||
cp = "cp -rv";
|
||||
mv = "mv -v";
|
||||
mkdir = "mkdir -pv";
|
||||
update = "doas nixos-rebuild switch";
|
||||
};
|
||||
shellOptions = [
|
||||
"histappend"
|
||||
"checkwinsize"
|
||||
"extglob"
|
||||
"globstar"
|
||||
"checkjobs"
|
||||
];
|
||||
initExtra = ''
|
||||
PS1="(\u) % "
|
||||
|
||||
eval "$(fzf --bash)"
|
||||
complete -cf doas
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
programs = {
|
||||
tmux = {
|
||||
enable = true;
|
||||
plugins = with pkgs; [
|
||||
tmuxPlugins.net-speed
|
||||
tmuxPlugins.cpu
|
||||
tmuxPlugins.battery
|
||||
tmuxPlugins.gruvbox
|
||||
];
|
||||
disableConfirmationPrompt = true;
|
||||
mouse = true;
|
||||
keyMode = "vi";
|
||||
extraConfig = ''
|
||||
unbind C-b
|
||||
set-option -g prefix C-a
|
||||
bind-key C-a send-prefix
|
||||
bind \\ split-window -h
|
||||
bind - split-window -v
|
||||
unbind '"'
|
||||
unbind %
|
||||
|
||||
bind t new-window
|
||||
bind -n M-w previous-window
|
||||
bind -n M-e next-window
|
||||
bind r source-file ~/.config/tmux/tmux.conf
|
||||
bind -n M-Left select-pane -L
|
||||
bind -n M-Right select-pane -R
|
||||
bind -n M-Up select-pane -U
|
||||
bind -n M-Down select-pane -D
|
||||
|
||||
#setw -g window-status-current-format "[ #W ]"
|
||||
#setw -g window-status-format "#W"
|
||||
|
||||
set-option -s status-interval 1
|
||||
set -g status-right-length 100
|
||||
set -g @net_speed_interfaces "wg0-mullvad"
|
||||
set -g @download_speed_format "%1s"
|
||||
set -g @upload_speed_format "%1s"
|
||||
set -g @net_speed_format "D:%1s U:%1s"
|
||||
|
||||
set -g status-right '#{battery_icon} #{battery_percentage} [ #{net_speed}] [ #{cpu_percentage}] [ %H:%M] '
|
||||
|
||||
run-shell ${pkgs.tmuxPlugins.net-speed}/share/tmux-plugins/net-speed/net_speed.tmux
|
||||
run-shell ${pkgs.tmuxPlugins.cpu}/share/tmux-plugins/cpu/cpu.tmux
|
||||
run-shell ${pkgs.tmuxPlugins.battery}/share/tmux-plugins/battery/battery.tmux
|
||||
|
||||
set -g status-position top
|
||||
#set-option -g status-style bg=default
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
Before ![]() (image error) Size: 534 KiB |
Before ![]() (image error) Size: 12 MiB |
Before ![]() (image error) Size: 2.3 MiB |
Before ![]() (image error) Size: 1.0 MiB |
Before ![]() (image error) Size: 181 KiB |
Before ![]() (image error) Size: 754 KiB |
Before ![]() (image error) Size: 1.8 MiB |
Before ![]() (image error) Size: 1.2 MiB |
Before ![]() (image error) Size: 164 KiB |
Before ![]() (image error) Size: 964 KiB |
Before ![]() (image error) Size: 6.2 MiB |
Before ![]() (image error) Size: 19 MiB |
Before ![]() (image error) Size: 410 KiB |
Before ![]() (image error) Size: 759 KiB |
Before ![]() (image error) Size: 486 KiB |
@ -1,17 +0,0 @@
|
||||
[options]
|
||||
HoldPkg = pacman glibc
|
||||
Architecture = auto
|
||||
UseSyslog
|
||||
Color
|
||||
ILoveCandy
|
||||
CheckSpace
|
||||
VerbosePkgLists
|
||||
ParallelDownloads = 5
|
||||
SigLevel = Never
|
||||
LocalFileSigLevel = Optional
|
||||
|
||||
[dkp-libs]
|
||||
Server = https://pkg.devkitpro.org/packages
|
||||
|
||||
[dkp-linux]
|
||||
Server = https://pkg.devkitpro.org/packages/linux/$arch/
|
@ -1,20 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
dmenu
|
||||
];
|
||||
services = {
|
||||
xserver = {
|
||||
enable = true;
|
||||
displayManager.startx.enable = true;
|
||||
windowManager = {
|
||||
dwm = {
|
||||
enable = true;
|
||||
package = pkgs.dwm.overrideAttrs {
|
||||
src = ./source/dwm;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
# dwm - dynamic window manager
|
||||
# See LICENSE file for copyright and license details.
|
||||
|
||||
include config.mk
|
||||
|
||||
SRC = drw.c dwm.c util.c
|
||||
OBJ = ${SRC:.c=.o}
|
||||
|
||||
all: dwm
|
||||
|
||||
.c.o:
|
||||
${CC} -c ${CFLAGS} $<
|
||||
|
||||
${OBJ}: config.h config.mk
|
||||
|
||||
config.h:
|
||||
cp config.def.h $@
|
||||
|
||||
dwm: ${OBJ}
|
||||
${CC} -o $@ ${OBJ} ${LDFLAGS}
|
||||
|
||||
clean:
|
||||
rm -f 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
|
@ -1,168 +0,0 @@
|
||||
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 = 1; /* 0 means no bar */
|
||||
static const int topbar = 1; /* 0 means bottom bar */
|
||||
static const char *fonts[] = {"Fantasque Sans Mono:size=10"};
|
||||
static const char dmenufont[] = "Fantasque Sans Mono:size=10";
|
||||
|
||||
//static const char col_gray1[] = "#262626";
|
||||
//static const char col_gray2[] = "#ffffff";
|
||||
//static const char col_gray3[] = "#dde1e6";
|
||||
//static const char col_gray4[] = "#ffffff";
|
||||
//static const char col_cyan[] = "#262626";
|
||||
|
||||
static const char col_gray1[] = "#121212";
|
||||
static const char col_gray2[] = "#ffffff";
|
||||
static const char col_gray3[] = "#dde1e6";
|
||||
static const char col_gray4[] = "#ffffff";
|
||||
static const char col_cyan[] = "#121212";
|
||||
|
||||
|
||||
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[] = {
|
||||
{"[\\]", dwindle},
|
||||
{NULL, centeredfloatingmaster},
|
||||
{"|M|", centeredmaster},
|
||||
{"[]=", tile}, /* first entry is default */
|
||||
{"[M]", monocle},
|
||||
{"[@]", spiral},
|
||||
{"H[]", deck},
|
||||
{"TTT", bstack},
|
||||
{"===", bstackhoriz},
|
||||
{"HHH", grid},
|
||||
{"###", nrowgrid},
|
||||
{"---", horizgrid},
|
||||
{":::", gaplessgrid},
|
||||
{"><>", NULL}, /* no layout function means floating behavior */
|
||||
{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"; /* component of dmenucmd, manipulated in spawn() */
|
||||
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 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}},
|
||||
|
||||
};
|
||||
|
||||
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}},
|
||||
};
|
@ -1,39 +0,0 @@
|
||||
# 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
|
@ -1,425 +0,0 @@
|
||||
/* 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);
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
typedef struct {
|
||||
Cursor cursor;
|
||||
} Cur;
|
||||
|
||||
typedef struct Fnt {
|
||||
Display *dpy;
|
||||
unsigned int h;
|
||||
XftFont *xfont;
|
||||
FcPattern *pattern;
|
||||
struct Fnt *next;
|
||||
} Fnt;
|
||||
|
||||
enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
|
||||
typedef XftColor Clr;
|
||||
|
||||
typedef struct {
|
||||
unsigned int w, h;
|
||||
Display *dpy;
|
||||
int screen;
|
||||
Window root;
|
||||
Drawable drawable;
|
||||
GC gc;
|
||||
Clr *scheme;
|
||||
Fnt *fonts;
|
||||
} Drw;
|
||||
|
||||
/* Drawable abstraction */
|
||||
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w,
|
||||
unsigned int h);
|
||||
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
|
||||
void drw_free(Drw *drw);
|
||||
|
||||
/* Fnt abstraction */
|
||||
Fnt *drw_fontset_create(Drw *drw, const char *fonts[], size_t fontcount);
|
||||
void drw_fontset_free(Fnt *set);
|
||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
|
||||
unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text,
|
||||
unsigned int n);
|
||||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len,
|
||||
unsigned int *w, unsigned int *h);
|
||||
|
||||
/* Colorscheme abstraction */
|
||||
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
||||
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
|
||||
|
||||
/* Cursor abstraction */
|
||||
Cur *drw_cur_create(Drw *drw, int shape);
|
||||
void drw_cur_free(Drw *drw, Cur *cursor);
|
||||
|
||||
/* Drawing context manipulation */
|
||||
void drw_setfontset(Drw *drw, Fnt *set);
|
||||
void drw_setscheme(Drw *drw, Clr *scm);
|
||||
|
||||
/* Drawing functions */
|
||||
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h,
|
||||
int filled, int invert);
|
||||
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h,
|
||||
unsigned int lpad, const char *text, int invert);
|
||||
|
||||
/* Map functions */
|
||||
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w,
|
||||
unsigned int h);
|
@ -1,176 +0,0 @@
|
||||
.TH DWM 1 dwm\-VERSION
|
||||
.SH NAME
|
||||
dwm \- dynamic window manager
|
||||
.SH SYNOPSIS
|
||||
.B dwm
|
||||
.RB [ \-v ]
|
||||
.SH DESCRIPTION
|
||||
dwm is a dynamic window manager for X. It manages windows in tiled, monocle
|
||||
and floating layouts. Either layout can be applied dynamically, optimising the
|
||||
environment for the application in use and the task performed.
|
||||
.P
|
||||
In tiled layouts windows are managed in a master and stacking area. The master
|
||||
area on the left contains one window by default, and the stacking area on the
|
||||
right contains all other windows. The number of master area windows can be
|
||||
adjusted from zero to an arbitrary number. In monocle layout all windows are
|
||||
maximised to the screen size. In floating layout windows can be resized and
|
||||
moved freely. Dialog windows are always managed floating, regardless of the
|
||||
layout applied.
|
||||
.P
|
||||
Windows are grouped by tags. Each window can be tagged with one or multiple
|
||||
tags. Selecting certain tags displays all windows with these tags.
|
||||
.P
|
||||
Each screen contains a small status bar which displays all available tags, the
|
||||
layout, the title of the focused window, and the text read from the root window
|
||||
name property, if the screen is focused. A floating window is indicated with an
|
||||
empty square and a maximised floating window is indicated with a filled square
|
||||
before the windows title. The selected tags are indicated with a different
|
||||
color. The tags of the focused window are indicated with a filled square in the
|
||||
top left corner. The tags which are applied to one or more windows are
|
||||
indicated with an empty square in the top left corner.
|
||||
.P
|
||||
dwm draws a small border around windows to indicate the focus state.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-v
|
||||
prints version information to stderr, then exits.
|
||||
.SH USAGE
|
||||
.SS Status bar
|
||||
.TP
|
||||
.B X root window name
|
||||
is read and displayed in the status text area. It can be set with the
|
||||
.BR xsetroot (1)
|
||||
command.
|
||||
.TP
|
||||
.B Button1
|
||||
click on a tag label to display all windows with that tag, click on the layout
|
||||
label toggles between tiled and floating layout.
|
||||
.TP
|
||||
.B Button3
|
||||
click on a tag label adds/removes all windows with that tag to/from the view.
|
||||
.TP
|
||||
.B Mod1\-Button1
|
||||
click on a tag label applies that tag to the focused window.
|
||||
.TP
|
||||
.B Mod1\-Button3
|
||||
click on a tag label adds/removes that tag to/from the focused window.
|
||||
.SS Keyboard commands
|
||||
.TP
|
||||
.B Mod1\-Shift\-Return
|
||||
Start
|
||||
.BR st(1).
|
||||
.TP
|
||||
.B Mod1\-p
|
||||
Spawn
|
||||
.BR dmenu(1)
|
||||
for launching other programs.
|
||||
.TP
|
||||
.B Mod1\-,
|
||||
Focus previous screen, if any.
|
||||
.TP
|
||||
.B Mod1\-.
|
||||
Focus next screen, if any.
|
||||
.TP
|
||||
.B Mod1\-Shift\-,
|
||||
Send focused window to previous screen, if any.
|
||||
.TP
|
||||
.B Mod1\-Shift\-.
|
||||
Send focused window to next screen, if any.
|
||||
.TP
|
||||
.B Mod1\-b
|
||||
Toggles bar on and off.
|
||||
.TP
|
||||
.B Mod1\-t
|
||||
Sets tiled layout.
|
||||
.TP
|
||||
.B Mod1\-f
|
||||
Sets floating layout.
|
||||
.TP
|
||||
.B Mod1\-m
|
||||
Sets monocle layout.
|
||||
.TP
|
||||
.B Mod1\-space
|
||||
Toggles between current and previous layout.
|
||||
.TP
|
||||
.B Mod1\-j
|
||||
Focus next window.
|
||||
.TP
|
||||
.B Mod1\-k
|
||||
Focus previous window.
|
||||
.TP
|
||||
.B Mod1\-i
|
||||
Increase number of windows in master area.
|
||||
.TP
|
||||
.B Mod1\-d
|
||||
Decrease number of windows in master area.
|
||||
.TP
|
||||
.B Mod1\-l
|
||||
Increase master area size.
|
||||
.TP
|
||||
.B Mod1\-h
|
||||
Decrease master area size.
|
||||
.TP
|
||||
.B Mod1\-Return
|
||||
Zooms/cycles focused window to/from master area (tiled layouts only).
|
||||
.TP
|
||||
.B Mod1\-Shift\-c
|
||||
Close focused window.
|
||||
.TP
|
||||
.B Mod1\-Shift\-space
|
||||
Toggle 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.
|
@ -1,42 +0,0 @@
|
||||
/* 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);
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
/* 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;
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||
#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
|
||||
|
||||
void die(const char *fmt, ...);
|
||||
void *ecalloc(size_t nmemb, size_t size);
|
@ -1,778 +0,0 @@
|
||||
/* 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;
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
./sway.nix
|
||||
];
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
waybar
|
||||
swaybg
|
||||
slurp
|
||||
grim
|
||||
];
|
||||
file = {
|
||||
".config/rofi/config.rasi".source = ./raw/config.rasi;
|
||||
".config/waybar/style.css".source = ./raw/style.css;
|
||||
".config/waybar/config".source = ./raw/config;
|
||||
};
|
||||
};
|
||||
}
|
@ -1,189 +0,0 @@
|
||||
[
|
||||
{
|
||||
"battery": {
|
||||
"format": "{icon} {capacity}%",
|
||||
"format-alt": "{icon} {time}",
|
||||
"format-charging": " {capacity}%",
|
||||
"format-icons": [
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
""
|
||||
],
|
||||
"format-plugged": " {capacity}% ",
|
||||
"states": {
|
||||
"critical": 15,
|
||||
"good": 95,
|
||||
"warning": 30
|
||||
}
|
||||
},
|
||||
"cava#left": {
|
||||
"autosens": 1,
|
||||
"bar_delimiter": 0,
|
||||
"bars": 18,
|
||||
"format-icons": [
|
||||
"<span foreground='#cba6f7'>▁</span>",
|
||||
"<span foreground='#cba6f7'>▂</span>",
|
||||
"<span foreground='#cba6f7'>▃</span>",
|
||||
"<span foreground='#cba6f7'>▄</span>",
|
||||
"<span foreground='#89b4fa'>▅</span>",
|
||||
"<span foreground='#89b4fa'>▆</span>",
|
||||
"<span foreground='#89b4fa'>▇</span>",
|
||||
"<span foreground='#89b4fa'>█</span>"
|
||||
],
|
||||
"framerate": 60,
|
||||
"higher_cutoff_freq": 10000,
|
||||
"input_delay": 2,
|
||||
"lower_cutoff_freq": 50,
|
||||
"method": "pulse",
|
||||
"monstercat": false,
|
||||
"reverse": false,
|
||||
"source": "auto",
|
||||
"stereo": true,
|
||||
"waves": false
|
||||
},
|
||||
"cava#right": {
|
||||
"autosens": 1,
|
||||
"bar_delimiter": 0,
|
||||
"bars": 18,
|
||||
"format-icons": [
|
||||
"<span foreground='#cba6f7'>▁</span>",
|
||||
"<span foreground='#cba6f7'>▂</span>",
|
||||
"<span foreground='#cba6f7'>▃</span>",
|
||||
"<span foreground='#cba6f7'>▄</span>",
|
||||
"<span foreground='#89b4fa'>▅</span>",
|
||||
"<span foreground='#89b4fa'>▆</span>",
|
||||
"<span foreground='#89b4fa'>▇</span>",
|
||||
"<span foreground='#89b4fa'>█</span>"
|
||||
],
|
||||
"framerate": 60,
|
||||
"higher_cutoff_freq": 10000,
|
||||
"input_delay": 2,
|
||||
"lower_cutoff_freq": 50,
|
||||
"method": "pulse",
|
||||
"monstercat": false,
|
||||
"reverse": false,
|
||||
"source": "auto",
|
||||
"stereo": true,
|
||||
"waves": false
|
||||
},
|
||||
"clock": {
|
||||
"format": " {:%a, %d %b, %I:%M %p}",
|
||||
"format-alt": " {:%d/%m}",
|
||||
"tooltip": "true",
|
||||
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
|
||||
},
|
||||
"cpu": {
|
||||
"format": " {usage}%",
|
||||
"format-alt": " {avg_frequency} GHz",
|
||||
"interval": 5
|
||||
},
|
||||
"custom/launcher": {
|
||||
"format": "",
|
||||
"tooltip": "false"
|
||||
},
|
||||
"custom/playerctl#backward": {
|
||||
"format": " ",
|
||||
"on-click": "playerctl previous",
|
||||
"on-scroll-down": "playerctl volume .05-",
|
||||
"on-scroll-up": "playerctl volume .05+"
|
||||
},
|
||||
"custom/playerctl#foward": {
|
||||
"format": " ",
|
||||
"on-click": "playerctl next",
|
||||
"on-scroll-down": "playerctl volume .05-",
|
||||
"on-scroll-up": "playerctl volume .05+"
|
||||
},
|
||||
"custom/playerctl#play": {
|
||||
"exec": "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F",
|
||||
"format": "{icon}",
|
||||
"format-icons": {
|
||||
"Paused": "<span> </span>",
|
||||
"Playing": "<span> </span>",
|
||||
"Stopped": "<span> </span>"
|
||||
},
|
||||
"on-click": "playerctl play-pause",
|
||||
"on-scroll-down": "playerctl volume .05-",
|
||||
"on-scroll-up": "playerctl volume .05+",
|
||||
"return-type": "json"
|
||||
},
|
||||
"custom/playerlabel": {
|
||||
"exec": "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F",
|
||||
"format": "<span> {} </span>",
|
||||
"max-length": 40,
|
||||
"on-click": "",
|
||||
"return-type": "json"
|
||||
},
|
||||
"custom/randwall": {
|
||||
"format": ""
|
||||
},
|
||||
"height": 35,
|
||||
"layer": "top",
|
||||
"margin-bottom": 0,
|
||||
"margin-left": 0,
|
||||
"margin-right": 0,
|
||||
"margin-top": 0,
|
||||
"memory": {
|
||||
"format": " {}%",
|
||||
"format-alt": " {used}/{total} GiB",
|
||||
"interval": 5
|
||||
},
|
||||
"modules-center": [
|
||||
"custom/playerlabel",
|
||||
],
|
||||
"modules-left": [
|
||||
"cava#left",
|
||||
"custom/playerctl#backward",
|
||||
"custom/playerctl#play",
|
||||
"custom/playerctl#foward",
|
||||
],
|
||||
"modules-right": [
|
||||
"tray",
|
||||
"battery",
|
||||
"pulseaudio",
|
||||
"network",
|
||||
],
|
||||
|
||||
"network": {
|
||||
"format-disconnected": " 0% ",
|
||||
"format-ethernet": " 100% ",
|
||||
"format-linked": "{ifname} (No IP)",
|
||||
"format-wifi": " {signalStrength}%",
|
||||
"tooltip-format": "Connected to {essid} {ifname} via {gwaddr}"
|
||||
},
|
||||
"position": "top",
|
||||
"pulseaudio": {
|
||||
"format": "{icon} {volume}%",
|
||||
"format-icons": {
|
||||
"default": [
|
||||
"",
|
||||
"",
|
||||
""
|
||||
]
|
||||
},
|
||||
"format-muted": "",
|
||||
"on-click": "pavucontrol",
|
||||
"scroll-step": 5
|
||||
},
|
||||
"tray": {
|
||||
"icon-size": 20,
|
||||
"spacing": 8
|
||||
},
|
||||
"wlr/workspaces": {
|
||||
"active-only": false,
|
||||
"all-outputs": false,
|
||||
"disable-scroll": false,
|
||||
"format": "{name}",
|
||||
"format-icons": {
|
||||
"active": "",
|
||||
"default": "",
|
||||
"sort-by-number": true,
|
||||
"urgent": ""
|
||||
},
|
||||
"on-click": "activate",
|
||||
"on-scroll-down": "hyprctl dispatch workspace e+1",
|
||||
"on-scroll-up": "hyprctl dispatch workspace e-1"
|
||||
}
|
||||
}
|
||||
]
|
@ -1,76 +0,0 @@
|
||||
configuration {
|
||||
display-drun: "Applications:";
|
||||
drun-display-format: "{icon} {name}";
|
||||
font: "JetBrainsMono Nerd Font Medium 10";
|
||||
show-icons: true;
|
||||
modi: "drun";
|
||||
}
|
||||
|
||||
@theme "/dev/null"
|
||||
|
||||
* {
|
||||
|
||||
opacity: 0.5;
|
||||
color0: #39305320;
|
||||
color1: #494d6420;
|
||||
color3: #d8dee9;
|
||||
color4: #7b68ee;
|
||||
color5: #cbe3e7;
|
||||
|
||||
|
||||
background-color: transparent;
|
||||
text-color: @color3;
|
||||
accent-color: @color5;
|
||||
|
||||
margin: 0px;
|
||||
border: 0px;
|
||||
padding: 0px;
|
||||
spacing: 0px;
|
||||
}
|
||||
|
||||
window {
|
||||
background-color: @color0;
|
||||
border-color: @accent-color;
|
||||
|
||||
width: 50%;
|
||||
border: 2px;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
padding: 10px 12px;
|
||||
spacing: 12px;
|
||||
children: [ prompt, entry ];
|
||||
}
|
||||
|
||||
prompt, entry, element-text, element-icon {
|
||||
vertical-align: 0.5;
|
||||
}
|
||||
|
||||
prompt {
|
||||
text-color: @accent-color;
|
||||
enabled: true;
|
||||
text-color: @color4;
|
||||
}
|
||||
|
||||
listview {
|
||||
lines: 8;
|
||||
columns: 2;
|
||||
|
||||
}
|
||||
|
||||
element {
|
||||
padding: 8px;
|
||||
spacing: 8px;
|
||||
}
|
||||
|
||||
element selected {
|
||||
text-color: @color4;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
size: 20;
|
||||
}
|
||||
|
||||
element-text {
|
||||
text-color: inherit;
|
||||
}
|
@ -1,134 +0,0 @@
|
||||
* {
|
||||
border: none;
|
||||
border-radius: 0px;
|
||||
font-family: RobotoMono Nerd Font;
|
||||
font-size: 14px;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
/* background: rgba(17,17,27,1); */
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
#cava.left, #cava.right {
|
||||
/* background: #25253a; */
|
||||
|
||||
/*background: #25253a;*/
|
||||
background: #010101;
|
||||
margin: 5px;
|
||||
padding: 8px 16px;
|
||||
color: #cba6f7;
|
||||
}
|
||||
#cava.left {
|
||||
border-radius: 24px 24px 24px 24px;
|
||||
}
|
||||
#cava.right {
|
||||
border-radius: 10px 24px 10px 24px;
|
||||
}
|
||||
#workspaces {
|
||||
background: #11111b;
|
||||
margin: 5px 5px;
|
||||
padding: 8px 5px;
|
||||
border-radius: 16px;
|
||||
color: #cba6f7
|
||||
}
|
||||
#workspaces button {
|
||||
padding: 0px 5px;
|
||||
margin: 0px 3px;
|
||||
border-radius: 16px;
|
||||
color: transparent;
|
||||
background: rgba(17,17,27,1);
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
#workspaces button.active {
|
||||
background-color: #89b4fa;
|
||||
color: #11111B;
|
||||
border-radius: 16px;
|
||||
min-width: 50px;
|
||||
background-size: 400% 400%;
|
||||
transition: all 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
#workspaces button:hover {
|
||||
background-color: #f5f5f5;
|
||||
color: #11111B;
|
||||
border-radius: 16px;
|
||||
min-width: 50px;
|
||||
background-size: 400% 400%;
|
||||
}
|
||||
|
||||
#tray, #pulseaudio, #network, #battery,
|
||||
#custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward{
|
||||
background: #010101;
|
||||
font-weight: bold;
|
||||
margin: 5px 0px;
|
||||
opacity: 1;
|
||||
}
|
||||
#tray, #pulseaudio, #network, #battery{
|
||||
color: #f5f5f5;
|
||||
border-radius: 24px 24px 24px 24px;
|
||||
padding: 0 20px;
|
||||
margin-left: 7px;
|
||||
}
|
||||
#clock {
|
||||
color: #f5f5f5;
|
||||
background: #010101;
|
||||
border-radius: 0px 0px 0px 40px;
|
||||
padding: 10px 10px 15px 25px;
|
||||
margin-left: 7px;
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
}
|
||||
#custom-launcher {
|
||||
color: #89b4fa;
|
||||
background: #010101;
|
||||
border-radius: 0px 0px 40px 0px;
|
||||
margin: 0px;
|
||||
padding: 0px 35px 0px 15px;
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
#custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward {
|
||||
background: #010101;
|
||||
font-size: 22px;
|
||||
}
|
||||
#custom-playerctl.backward:hover, #custom-playerctl.play:hover, #custom-playerctl.foward:hover{
|
||||
color: #f5f5f5;
|
||||
}
|
||||
#custom-playerctl.backward {
|
||||
color: #cba6f7;
|
||||
border-radius: 24px 0px 0px 24px;
|
||||
padding-left: 16px;
|
||||
margin-left: 7px;
|
||||
}
|
||||
#custom-playerctl.play {
|
||||
color: #89b4fa;
|
||||
padding: 0 5px;
|
||||
}
|
||||
#custom-playerctl.foward {
|
||||
color: #cba6f7;
|
||||
border-radius: 0px 24px 24px 0px;
|
||||
padding-right: 12px;
|
||||
margin-right: 7px
|
||||
}
|
||||
#custom-playerlabel {
|
||||
background: #010101;
|
||||
color: #f5f5f5;
|
||||
padding: 0 20px;
|
||||
border-radius: 24px 24px 24px 24px;
|
||||
margin: 5px 0;
|
||||
font-weight: bold;
|
||||
}
|
||||
#window{
|
||||
/*background: #25253a; */
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
border-radius: 16px;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
opacity: 0.1;
|
||||
}
|
@ -1,109 +0,0 @@
|
||||
{config, pkgs, ... }:
|
||||
{
|
||||
wayland.windowManager.sway = {
|
||||
enable = true;
|
||||
xwayland = true;
|
||||
package = pkgs.swayfx-unwrapped;
|
||||
wrapperFeatures.gtk = true;
|
||||
checkConfig = false;
|
||||
extraSessionCommands = ''
|
||||
export _JAVA_AWT_WM_NONREPARENTING=1
|
||||
export QT_QPA_PLATFORM=wayland
|
||||
export XDG_CURRENT_DESKTOP=sway
|
||||
'';
|
||||
|
||||
config = rec {
|
||||
modifier = "Mod4";
|
||||
terminal = "alacritty";
|
||||
menu = "${pkgs.rofi}/bin/rofi -show run -c .config/rofi/config.rasi";
|
||||
startup = [
|
||||
{command = "swaybg -i $HOME/.wp/soyuz.png";}
|
||||
];
|
||||
bars = [{ command = "waybar"; }];
|
||||
gaps = {
|
||||
outer = 5;
|
||||
inner = 10;
|
||||
};
|
||||
|
||||
window = {
|
||||
border = 0;
|
||||
};
|
||||
|
||||
keybindings = {
|
||||
# IMPORTANT STUFF #
|
||||
"${modifier}+Return" = "exec ${terminal}";
|
||||
"${modifier}+space" = "exec ${menu}";
|
||||
"${modifier}+Q" = "kill";
|
||||
"${modifier}+Shift+R" = "reload";
|
||||
"${modifier}+Shift+S" = "${pkgs.grim}/bin/grim -g '$(${pkgs.slurp}/bin/slurp)'";
|
||||
# WINDOW STUFF #
|
||||
"${modifier}+Shift+space" = "floating toggle";
|
||||
"${modifier}+Shift+F" = "fullscreen toggle";
|
||||
"${modifier}+Left" = "focus left";
|
||||
"${modifier}+Down" = "focus down";
|
||||
"${modifier}+Up" = "focus up";
|
||||
"${modifier}+Right" = "focus right";
|
||||
|
||||
"${modifier}+Ctrl+Right" = "resize shrink width 3 px or 3 ppt";
|
||||
"${modifier}+Ctrl+Down" = "resize grow height 3 px or 3 ppt";
|
||||
"${modifier}+Ctrl+Up" = "resize shrink height 3 px or 3 ppt";
|
||||
"${modifier}+Ctrl+Left" = "resize grow width 3 px or 3 ppt";
|
||||
|
||||
"${modifier}+Shift+Left" = "move left";
|
||||
"${modifier}+Shift+Down" = "move down";
|
||||
"${modifier}+Shift+Up" = "move up";
|
||||
"${modifier}+Shift+Right" = "move right";
|
||||
|
||||
# WORKSPACES #
|
||||
"${modifier}+1" = "workspace number 1";
|
||||
"${modifier}+2" = "workspace number 2";
|
||||
"${modifier}+3" = "workspace number 3";
|
||||
"${modifier}+4" = "workspace number 4";
|
||||
"${modifier}+5" = "workspace number 5";
|
||||
"${modifier}+6" = "workspace number 6";
|
||||
"${modifier}+7" = "workspace number 7";
|
||||
"${modifier}+8" = "workspace number 8";
|
||||
"${modifier}+9" = "workspace number 9";
|
||||
|
||||
# MOVE WINDOW TO OTHER WS #
|
||||
"${modifier}+Shift+1" = "move container to workspace number 1";
|
||||
"${modifier}+Shift+2" = "move container to workspace number 2";
|
||||
"${modifier}+Shift+3" = "move container to workspace number 3";
|
||||
"${modifier}+Shift+4" = "move container to workspace number 4";
|
||||
"${modifier}+Shift+5" = "move container to workspace number 5";
|
||||
"${modifier}+Shift+6" = "move container to workspace number 6";
|
||||
"${modifier}+Shift+7" = "move container to workspace number 7";
|
||||
"${modifier}+Shift+8" = "move container to workspace number 8";
|
||||
"${modifier}+Shift+9" = "move container to workspace number 9";
|
||||
|
||||
# Audio
|
||||
"XF86AudioRaiseVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +10%";
|
||||
"XF86AudioLowerVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -10%";
|
||||
"XF86AudioMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-volume toggle-mute";
|
||||
"XF86AudioStop" = "exec ${pkgs.playerctl}/bin/playerctl stop";
|
||||
"XF86AudioPrev" = "exec ${pkgs.playerctl}/bin/playerctl previous";
|
||||
"XF86AudioNext" = "exec ${pkgs.playerctl}/bin/playerctl next";
|
||||
"XF86AudioPlay" = "exec ${pkgs.playerctl}/bin/playerctl play-pause";
|
||||
|
||||
"XF86MonBrightnessDown" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set 15%-";
|
||||
"XF86MonBrightnessUp" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set +15%";
|
||||
};
|
||||
};
|
||||
|
||||
extraConfig = ''
|
||||
shadows enable
|
||||
corner_radius 12
|
||||
blur_radius 7
|
||||
blur_passes 4
|
||||
default_dim_inactive 0.2
|
||||
|
||||
for_window [app_id="wezterm"] blur enable
|
||||
for_window [app_id="code"] blur enable
|
||||
for_window [app_id="rofi"] blur enable
|
||||
|
||||
default_border pixel 0px
|
||||
default_floating_border none
|
||||
titlebar_border_thickness 0
|
||||
'';
|
||||
};
|
||||
}
|
89
hosts/iridium/configuration.nix
Normal file
@ -0,0 +1,89 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
networking.hostName = "iridium";
|
||||
|
||||
imports = [
|
||||
./hardware-configuration.nix
|
||||
../../modules/default.nix
|
||||
];
|
||||
|
||||
boot = {
|
||||
loader = {
|
||||
systemd-boot = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
supportedFilesystems = [ "ntfs" ];
|
||||
};
|
||||
|
||||
programs = {
|
||||
steam = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
nixpkgs = {
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
permittedInsecurePackages = [
|
||||
"freeimage-unstable-2021-11-01"
|
||||
];
|
||||
};
|
||||
};
|
||||
nix.settings.experimental-features = [
|
||||
"nix-command"
|
||||
"flakes"
|
||||
];
|
||||
|
||||
systemd = {
|
||||
services = {
|
||||
modem-manager.enable = false;
|
||||
mpd.environment = {
|
||||
XDG_RUNTIME_DIR = "/run/user/1000";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
console = {
|
||||
font = "Lat2-Terminus16";
|
||||
useXkbConfig = true;
|
||||
};
|
||||
|
||||
programs = {
|
||||
nix-ld.enable = true;
|
||||
dconf = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
environment.etc = {
|
||||
"makepkg.conf".source = "${pkgs.pacman}/etc/makepkg.conf";
|
||||
"pacman.conf".text = ''
|
||||
[options]
|
||||
HoldPkg = pacman glibc
|
||||
UseSyslog
|
||||
Color
|
||||
ILoveCandy
|
||||
CheckSpace
|
||||
VerbosePkgLists
|
||||
ParallelDownloads = 5
|
||||
SigLevel = Never
|
||||
|
||||
[dkp-libs]
|
||||
Server = https://pkg.devkitpro.org/packages
|
||||
|
||||
[dkp-linux]
|
||||
Server = https://pkg.devkitpro.org/packages/linux/x86_64/
|
||||
|
||||
'';
|
||||
};
|
||||
|
||||
system.stateVersion = "25.05";
|
||||
|
||||
}
|
@ -1,48 +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,
|
||||
...
|
||||
}:
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
imports =
|
||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [
|
||||
"nvme"
|
||||
"xhci_pci"
|
||||
"ahci"
|
||||
"usb_storage"
|
||||
"usbhid"
|
||||
"sd_mod"
|
||||
];
|
||||
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-amd" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/850226f1-be02-42df-bb13-669f364ced4c";
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/D3F1-6A1B";
|
||||
fileSystems."/boot" =
|
||||
{ device = "/dev/disk/by-label/ESP";
|
||||
fsType = "vfat";
|
||||
options = [
|
||||
"fmask=0022"
|
||||
"dmask=0022"
|
||||
];
|
||||
options = [ "fmask=0022" "dmask=0022" ];
|
||||
};
|
||||
fileSystems."/media/STUFF" = {
|
||||
device = "/dev/disk/by-label/STUFF";
|
||||
fsType = "ext4";
|
||||
fileSystems."/media/STUFF" =
|
||||
{ device = "/dev/disk/by-label/STUFF";
|
||||
fsType = "ntfs";
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
@ -50,6 +35,7 @@
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp2s0f0u1.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp6s0.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlp5s0.useDHCP = lib.mkDefault true;
|
||||
|
@ -1,66 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
./hardware-configuration.nix
|
||||
./modules/default.nix
|
||||
];
|
||||
|
||||
nixpkgs = {
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
permittedInsecurePackages = [
|
||||
"freeimage-unstable-2021-11-01"
|
||||
];
|
||||
};
|
||||
};
|
||||
nix = {
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "daily";
|
||||
options = "--delete-older-than 3d";
|
||||
};
|
||||
settings.experimental-features = [
|
||||
"nix-command"
|
||||
"flakes"
|
||||
];
|
||||
};
|
||||
systemd = {
|
||||
services = {
|
||||
modem-manager.enable = false;
|
||||
mpd.environment = {
|
||||
XDG_RUNTIME_DIR = "/run/user/1000";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
time.timeZone = "Europe/Berlin";
|
||||
console = {
|
||||
font = "Lat2-Terminus16";
|
||||
useXkbConfig = true;
|
||||
};
|
||||
|
||||
xdg.portal = {
|
||||
enable = false;
|
||||
extraPortals = [
|
||||
pkgs.xdg-desktop-portal-gtk
|
||||
];
|
||||
};
|
||||
|
||||
programs = {
|
||||
nix-ld.enable = true;
|
||||
fish.enable = true;
|
||||
};
|
||||
|
||||
environment.etc = {
|
||||
"makepkg.conf".source = "${pkgs.pacman}/etc/makepkg.conf";
|
||||
"pacman.conf".source = ../default/raw/pacman.conf;
|
||||
};
|
||||
|
||||
system.stateVersion = "unstable";
|
||||
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
boot = {
|
||||
loader = {
|
||||
systemd-boot = {
|
||||
enable = true;
|
||||
extraEntries = {
|
||||
"mint.conf" = ''
|
||||
title Linux Mint
|
||||
efi /EFI/ubuntu/shimx64.efi
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
supportedFilesystems = [ "ntfs" ];
|
||||
};
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
./networking.nix
|
||||
./users.nix
|
||||
./services.nix
|
||||
./firefox.nix
|
||||
./pkgs.nix
|
||||
./sec.nix
|
||||
./virt.nix
|
||||
./boot.nix
|
||||
./hw.nix
|
||||
./fingerprint.nix
|
||||
];
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
services.fprintd = {
|
||||
enable = true;
|
||||
};
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
lock-false = {
|
||||
Value = false;
|
||||
Status = "locked";
|
||||
};
|
||||
lock-true = {
|
||||
Value = true;
|
||||
Status = "locked";
|
||||
};
|
||||
in
|
||||
{
|
||||
programs = {
|
||||
firefox = {
|
||||
enable = true;
|
||||
languagePacks = [ "en-US" ];
|
||||
policies = {
|
||||
DisableTelemetry = true;
|
||||
DisableFirefoxStudies = true;
|
||||
EnableTrackingProtection = {
|
||||
Value = true;
|
||||
Locked = true;
|
||||
Cryptomining = true;
|
||||
Fingerprinting = true;
|
||||
};
|
||||
DisablePocket = true;
|
||||
DisableFirefoxAccounts = true;
|
||||
DisableAccounts = true;
|
||||
DisableFirefoxScreenshots = true;
|
||||
OverrideFirstRunPage = "";
|
||||
OverridePostUpdatePage = "";
|
||||
DontCheckDefaultBrowser = true;
|
||||
DisplayBookmarksToolbar = "newtab";
|
||||
DisplayMenuBar = "default-off";
|
||||
SearchBar = "unified";
|
||||
ExtensionSettings = {
|
||||
"uBlock0@raymondhill.net" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
"78272b6fa58f4a1abaac99321d503a20@proton.me" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/latest/proton-pass/latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
"addon@darkreader.org" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/latest/darkreader/latest.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
"{f5bcc922-5c09-4ba5-9611-d7931812785c}" = {
|
||||
install_url = "https://addons.mozilla.org/firefox/downloads/file/4354513/oxocarbon-1.0.xpi";
|
||||
installation_mode = "force_installed";
|
||||
};
|
||||
};
|
||||
};
|
||||
preferences = {
|
||||
"browser.contentblocking.category" = true;
|
||||
"extensions.pocket.enabled" = false;
|
||||
"extensions.screenshots.disabled" = true;
|
||||
"browser.topsites.contile.enabled" = false;
|
||||
"browser.formfill.enable" = false;
|
||||
"browser.search.suggest.enabled" = false;
|
||||
"browser.search.suggest.enabled.private" = false;
|
||||
"browser.urlbar.suggest.searches" = false;
|
||||
"browser.urlbar.showSearchSuggestionsFirst" = false;
|
||||
"browser.newtabpage.activity-stream.feeds.section.topstories" = false;
|
||||
"browser.newtabpage.activity-stream.feeds.snippets" = false;
|
||||
"browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
|
||||
"browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
|
||||
"browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
|
||||
"browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
|
||||
"browser.newtabpage.activity-stream.showSponsored" = false;
|
||||
"browser.newtabpage.activity-stream.system.showSponsored" = false;
|
||||
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
hardware = {
|
||||
bluetooth = {
|
||||
enable = true;
|
||||
};
|
||||
graphics = {
|
||||
enable = true;
|
||||
};
|
||||
rtl-sdr = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
networking = {
|
||||
hostName = "poggers";
|
||||
networkmanager.enable = true;
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [
|
||||
80
|
||||
1337
|
||||
8080
|
||||
3000
|
||||
8000
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
security = {
|
||||
rtkit = {
|
||||
enable = true;
|
||||
};
|
||||
polkit = {
|
||||
enable = true;
|
||||
};
|
||||
doas = {
|
||||
enable = true;
|
||||
extraRules = [
|
||||
{
|
||||
users = [ "fabian" ];
|
||||
noPass = true;
|
||||
keepEnv = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
environment.systemPackages = with pkgs; [
|
||||
polkit
|
||||
polkit_gnome
|
||||
];
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
services = {
|
||||
libinput = {
|
||||
enable = true;
|
||||
};
|
||||
pipewire = {
|
||||
enable = true;
|
||||
pulse.enable = true;
|
||||
wireplumber.enable = true;
|
||||
};
|
||||
mullvad-vpn = {
|
||||
enable = true;
|
||||
package = pkgs.mullvad-vpn;
|
||||
};
|
||||
sdrplayApi = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
users = {
|
||||
defaultUserShell = pkgs.fish;
|
||||
users = {
|
||||
fabian = {
|
||||
useDefaultShell = true;
|
||||
shell = pkgs.fish;
|
||||
isNormalUser = true;
|
||||
initialPassword = "1601";
|
||||
extraGroups = [
|
||||
"wheel"
|
||||
"docker"
|
||||
"audio"
|
||||
"video"
|
||||
"dialout"
|
||||
"plugdev"
|
||||
"adbusers"
|
||||
"kvm"
|
||||
"dialout"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
virtualisation = {
|
||||
docker = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
}
|
@ -5,12 +5,22 @@
|
||||
...
|
||||
}:
|
||||
{
|
||||
networking.hostName = "meteor";
|
||||
|
||||
imports = [
|
||||
./hardware-configuration.nix
|
||||
./modules/default.nix
|
||||
../default/default.nix
|
||||
../../modules/default.nix
|
||||
];
|
||||
|
||||
boot = {
|
||||
loader = {
|
||||
systemd-boot = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
supportedFilesystems = [ "ntfs" ];
|
||||
};
|
||||
|
||||
nixpkgs = {
|
||||
config = {
|
||||
allowUnfree = true;
|
||||
@ -39,23 +49,13 @@
|
||||
useXkbConfig = true;
|
||||
};
|
||||
|
||||
xdg.portal = {
|
||||
enable = false;
|
||||
extraPortals = [
|
||||
pkgs.xdg-desktop-portal-gtk
|
||||
];
|
||||
};
|
||||
|
||||
programs = {
|
||||
nix-ld.enable = true;
|
||||
fish.enable = true;
|
||||
dconf = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
environment.etc = {
|
||||
"makepkg.conf".source = "${pkgs.pacman}/etc/makepkg.conf";
|
||||
"pacman.conf".source = ../default/raw/pacman.conf;
|
||||
};
|
||||
|
||||
system.stateVersion = "unstable";
|
||||
system.stateVersion = "25.05";
|
||||
|
||||
}
|
@ -14,12 +14,12 @@
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/disk/by-uuid/76e9b32a-249f-4827-ad98-9bc467952cfd";
|
||||
{ device = "/dev/disk/by-uuid/04b38f31-ff39-4bd9-9958-1ab012bdbd37";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{ device = "/dev/disk/by-uuid/2A44-4B06";
|
||||
{ device = "/dev/disk/by-uuid/EA73-5CEC";
|
||||
fsType = "vfat";
|
||||
options = [ "fmask=0022" "dmask=0022" ];
|
||||
};
|
39
modules/default.nix
Normal file
@ -0,0 +1,39 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
./pkgs.nix
|
||||
./services.nix
|
||||
./users.nix
|
||||
./firefox.nix
|
||||
./git.nix
|
||||
./tmux.nix
|
||||
#./alacritty.nix
|
||||
];
|
||||
|
||||
hardware = {
|
||||
bluetooth = {
|
||||
enable = true;
|
||||
};
|
||||
graphics = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
virtualisation = {
|
||||
docker = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
environment.systemPackages = with pkgs; [
|
||||
iperf3
|
||||
speedtest-cli
|
||||
dhcpcd
|
||||
];
|
||||
services = {
|
||||
iperf3 = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
networking = {
|
||||
networkmanager.enable = true;
|
||||
};
|
||||
}
|
12
modules/git.nix
Normal file
@ -0,0 +1,12 @@
|
||||
{ config, ... }:
|
||||
{
|
||||
programs.git = {
|
||||
enable = true;
|
||||
config = {
|
||||
user.name = "Sojus07";
|
||||
user.email = "Sojus07@0xcc01.de";
|
||||
init.defaultBranch = "master";
|
||||
core.editor = "nvim";
|
||||
};
|
||||
};
|
||||
}
|
63
modules/home.nix
Normal file
@ -0,0 +1,63 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
./git.nix
|
||||
./tmux.nix
|
||||
./alacritty.nix
|
||||
];
|
||||
home = {
|
||||
enableNixpkgsReleaseCheck = false;
|
||||
stateVersion = "24.11";
|
||||
file = {
|
||||
".wp/galaxy.png".source = ./raw/wp/galaxy.png;
|
||||
".wp/eye.png".source = ./raw/wp/eye.png;
|
||||
};
|
||||
};
|
||||
|
||||
programs.alacritty = {
|
||||
enable = true;
|
||||
settings = {
|
||||
window.dimensions = {
|
||||
lines = 4;
|
||||
columns = 200;
|
||||
};
|
||||
font = {
|
||||
size = 15;
|
||||
normal = {
|
||||
family = "TerminessNerdFont";
|
||||
style = "Regular";
|
||||
};
|
||||
};
|
||||
terminal = {
|
||||
shell = "tmux";
|
||||
};
|
||||
colors = {
|
||||
primary = {
|
||||
foreground = "#ffffff";
|
||||
background = "#000000";
|
||||
};
|
||||
normal = {
|
||||
black = "#000000";
|
||||
red = "#ffffff";
|
||||
green = "#ffffff";
|
||||
yellow = "#ffffff";
|
||||
blue = "#ffffff";
|
||||
magenta = "#ffffff";
|
||||
cyan = "#ffffff";
|
||||
white = "#ffffff";
|
||||
};
|
||||
bright = {
|
||||
black = "#000000";
|
||||
red = "#ffffff";
|
||||
green = "#ffffff";
|
||||
yellow = "#ffffff";
|
||||
blue = "#ffffff";
|
||||
magenta = "#ffffff";
|
||||
cyan = "#ffffff";
|
||||
white = "#ffffff";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
@ -3,7 +3,6 @@
|
||||
environment.systemPackages = with pkgs; [
|
||||
# System utilities
|
||||
unzip
|
||||
yt-dlp
|
||||
inetutils
|
||||
git
|
||||
wget
|
||||
@ -18,21 +17,22 @@
|
||||
gnumake
|
||||
tree
|
||||
gdb
|
||||
vscode
|
||||
neovide
|
||||
wireshark
|
||||
|
||||
# Command-line utilities
|
||||
neofetch
|
||||
fastfetch
|
||||
onefetch
|
||||
cpufetch
|
||||
vim
|
||||
weechat
|
||||
ranger
|
||||
eza
|
||||
fzf
|
||||
htop
|
||||
btop
|
||||
jq
|
||||
ffmpeg
|
||||
gh-dash
|
||||
|
||||
# Development & compilers
|
||||
rustup
|
||||
@ -41,7 +41,6 @@
|
||||
nodejs
|
||||
gccgo14
|
||||
go
|
||||
dotnet-sdk
|
||||
bear
|
||||
|
||||
# Android development
|
||||
@ -54,27 +53,17 @@
|
||||
winetricks
|
||||
|
||||
# Embedded & hardware development
|
||||
espup
|
||||
esphome
|
||||
esptool
|
||||
espflash
|
||||
minicom
|
||||
pulseview
|
||||
cp210x-program
|
||||
arduino-ide
|
||||
arduino-cli
|
||||
flashrom
|
||||
binwalk
|
||||
chirp
|
||||
picocom
|
||||
pwndbg
|
||||
minipro
|
||||
ethtool
|
||||
|
||||
# Language servers (LSPs)
|
||||
nixd
|
||||
arduino-language-server
|
||||
|
||||
# Libraries
|
||||
python312Packages.pyserial
|
||||
python312Packages.meshtastic
|
||||
@ -82,30 +71,15 @@
|
||||
# Virtualization
|
||||
qemu
|
||||
|
||||
# Software Defined Radio (SDR)
|
||||
noaa-apt
|
||||
wsjtx
|
||||
qsstv
|
||||
gpredict
|
||||
sdrangel
|
||||
sdrpp
|
||||
gnuradio
|
||||
cubicsdr
|
||||
gqrx
|
||||
multimon-ng
|
||||
|
||||
# Miscellaneous
|
||||
cava
|
||||
vesktop
|
||||
pacman
|
||||
wf-recorder
|
||||
qbittorrent
|
||||
];
|
||||
|
||||
fonts = {
|
||||
fontconfig.enable = true;
|
||||
packages = with pkgs; [
|
||||
|
||||
noto-fonts
|
||||
noto-fonts-emoji
|
||||
liberation_ttf
|
BIN
modules/raw/wp/eye.png
Normal file
After ![]() (image error) Size: 8.9 MiB |
BIN
modules/raw/wp/galaxy.png
Normal file
After ![]() (image error) Size: 94 KiB |
24
modules/services.nix
Normal file
@ -0,0 +1,24 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
|
||||
|
||||
services = {
|
||||
libinput = {
|
||||
enable = true;
|
||||
};
|
||||
dbus.enable = true;
|
||||
mullvad-vpn = {
|
||||
enable = true;
|
||||
package = pkgs.mullvad-vpn;
|
||||
};
|
||||
gnome.gnome-keyring.enable = true;
|
||||
};
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
wireplumber.enable = true;
|
||||
};
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
ISC License
|
||||
|
||||
Copyright 2016-2022 Aaron Marcher <me@drkhsh.at>
|
||||
|
||||
Copyright 2016 Roy Freytag <rfreytag@hs-mittweida.de>
|
||||
Copyright 2016 Vincent Loupmon <vincentloupmon@gmail.com>
|
||||
Copyright 2016 Daniel Walter <d.walter@0x90.at>
|
||||
Copyright 2016-2018 Ali H. Fardan <raiz@firemail.cc>
|
||||
Copyright 2016 Jody Leonard <me@jodyleonard.com>
|
||||
Copyright 2016-2018 Quentin Rameau <quinq@fifth.space>
|
||||
Copyright 2016 Mike Coddington <mike@coddington.us>
|
||||
Copyright 2016-2018 Ivan J. <parazyd@dyne.org>
|
||||
Copyright 2017 Tobias Stoeckmann <tobias@stoeckmann.org>
|
||||
Copyright 2017-2018 Laslo Hunhold <dev@frign.de>
|
||||
Copyright 2018 Darron Anderson <darronanderson@protonmail.com>
|
||||
Copyright 2018 Josuah Demangeon <mail@josuah.net>
|
||||
Copyright 2018 Tobias Tschinkowitz <tobias@he4d.net>
|
||||
Copyright 2018 David Demelier <markand@malikania.fr>
|
||||
Copyright 2018-2012 Michael Buch <michaelbuch12@gmail.com>
|
||||
Copyright 2018 Ian Remmler <ian@remmler.org>
|
||||
Copyright 2016-2019 Joerg Jung <jung@openbsd.org>
|
||||
Copyright 2019 Ryan Kes <alrayyes@gmail.com>
|
||||
Copyright 2019 Cem Keylan <cem@ckyln.com>
|
||||
Copyright 2019 Dimitris Papastamos <dsp@2f30.org>
|
||||
Copyright 2019-2022 Ingo Feinerer <feinerer@logic.at>
|
||||
Copyright 2020 Alexandre Ratchov <alex@caoua.org>
|
||||
Copyright 2020 Mart Lubbers <mart@martlubbers.net>
|
||||
Copyright 2020 Daniel Moch <daniel@danielmoch.com>
|
||||
Copyright 2022 Nickolas Raymond Kaczynski <nrk@disroot.org>
|
||||
Copyright 2022 Patrick Iacob <iacobp@oregonstate.edu>
|
||||
Copyright 2021-2022 Steven Ward <planet36@gmail.com>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
@ -1,70 +0,0 @@
|
||||
# See LICENSE file for copyright and license details
|
||||
# slstatus - suckless status monitor
|
||||
.POSIX:
|
||||
|
||||
include config.mk
|
||||
|
||||
REQ = util
|
||||
COM =\
|
||||
components/battery\
|
||||
components/cat\
|
||||
components/cpu\
|
||||
components/datetime\
|
||||
components/disk\
|
||||
components/entropy\
|
||||
components/hostname\
|
||||
components/ip\
|
||||
components/kernel_release\
|
||||
components/keyboard_indicators\
|
||||
components/keymap\
|
||||
components/load_avg\
|
||||
components/netspeeds\
|
||||
components/num_files\
|
||||
components/ram\
|
||||
components/run_command\
|
||||
components/swap\
|
||||
components/temperature\
|
||||
components/uptime\
|
||||
components/user\
|
||||
components/volume\
|
||||
components/wifi\
|
||||
components/mullvad\
|
||||
components/relay
|
||||
all: slstatus
|
||||
|
||||
$(COM:=.o): config.mk $(REQ:=.h) slstatus.h
|
||||
slstatus.o: slstatus.c slstatus.h arg.h config.h config.mk $(REQ:=.h)
|
||||
|
||||
.c.o:
|
||||
$(CC) -o $@ -c $(CPPFLAGS) $(CFLAGS) $<
|
||||
|
||||
config.h:
|
||||
cp config.def.h $@
|
||||
|
||||
slstatus: slstatus.o $(COM:=.o) $(REQ:=.o)
|
||||
$(CC) -o $@ $(LDFLAGS) $(COM:=.o) $(REQ:=.o) slstatus.o $(LDLIBS)
|
||||
|
||||
clean:
|
||||
rm -f slstatus slstatus.o $(COM:=.o) $(REQ:=.o) slstatus-${VERSION}.tar.gz
|
||||
|
||||
dist:
|
||||
rm -rf "slstatus-$(VERSION)"
|
||||
mkdir -p "slstatus-$(VERSION)/components"
|
||||
cp -R LICENSE Makefile README config.mk config.def.h \
|
||||
arg.h slstatus.h slstatus.c $(REQ:=.c) $(REQ:=.h) \
|
||||
slstatus.1 "slstatus-$(VERSION)"
|
||||
cp -R $(COM:=.c) "slstatus-$(VERSION)/components"
|
||||
tar -cf - "slstatus-$(VERSION)" | gzip -c > "slstatus-$(VERSION).tar.gz"
|
||||
rm -rf "slstatus-$(VERSION)"
|
||||
|
||||
install: all
|
||||
mkdir -p "$(DESTDIR)$(PREFIX)/bin"
|
||||
cp -f slstatus "$(DESTDIR)$(PREFIX)/bin"
|
||||
chmod 755 "$(DESTDIR)$(PREFIX)/bin/slstatus"
|
||||
mkdir -p "$(DESTDIR)$(MANPREFIX)/man1"
|
||||
cp -f slstatus.1 "$(DESTDIR)$(MANPREFIX)/man1"
|
||||
chmod 644 "$(DESTDIR)$(MANPREFIX)/man1/slstatus.1"
|
||||
rm config.h
|
||||
uninstall:
|
||||
rm -f "$(DESTDIR)$(PREFIX)/bin/slstatus"
|
||||
rm -f "$(DESTDIR)$(MANPREFIX)/man1/slstatus.1"
|
@ -1,65 +0,0 @@
|
||||
slstatus - suckless status
|
||||
==========================
|
||||
slstatus is a small tool for providing system status information to other
|
||||
programs over the EWMH property of the root window (used by dwm(1)) or
|
||||
standard input/output. It is designed to be as efficient as possible by
|
||||
only issuing the minimum of system calls required.
|
||||
|
||||
|
||||
Features
|
||||
--------
|
||||
- Battery percentage/state/time left
|
||||
- Cat (read file)
|
||||
- CPU usage
|
||||
- CPU frequency
|
||||
- Custom shell commands
|
||||
- Date and time
|
||||
- Disk status (free storage, percentage, total storage and used storage)
|
||||
- Available entropy
|
||||
- Username/GID/UID
|
||||
- Hostname
|
||||
- IP address (IPv4 and IPv6)
|
||||
- Kernel version
|
||||
- Keyboard indicators
|
||||
- Keymap
|
||||
- Load average
|
||||
- Network speeds (RX and TX)
|
||||
- Number of files in a directory (hint: Maildir)
|
||||
- Memory status (free memory, percentage, total memory and used memory)
|
||||
- Swap status (free swap, percentage, total swap and used swap)
|
||||
- Temperature
|
||||
- Uptime
|
||||
- Volume percentage
|
||||
- WiFi signal percentage and ESSID
|
||||
|
||||
|
||||
Requirements
|
||||
------------
|
||||
Currently slstatus works on FreeBSD, Linux and OpenBSD.
|
||||
In order to build slstatus you need the Xlib header files.
|
||||
|
||||
- For volume percentage on Linux the kernel module `snd-mixer-oss` must be
|
||||
loaded.
|
||||
- For volume percentage on FreeBSD, `sndio` must be installed.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
Edit config.mk to match your local setup (slstatus is installed into the
|
||||
/usr/local namespace by default).
|
||||
|
||||
Afterwards enter the following command to build and install slstatus (if
|
||||
necessary as root):
|
||||
|
||||
make clean install
|
||||
|
||||
|
||||
Running slstatus
|
||||
----------------
|
||||
See the man page for details.
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
slstatus can be customized by creating a custom config.h and (re)compiling the
|
||||
source code. This keeps it fast, secure and simple.
|
@ -1,33 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#ifndef ARG_H
|
||||
#define ARG_H
|
||||
|
||||
extern char *argv0;
|
||||
|
||||
/* int main(int argc, char *argv[]) */
|
||||
#define ARGBEGIN for (argv0 = *argv, *argv ? (argc--, argv++) : ((void *)0); \
|
||||
*argv && (*argv)[0] == '-' && (*argv)[1]; argc--, argv++) { \
|
||||
int i_, argused_; \
|
||||
if ((*argv)[1] == '-' && !(*argv)[2]) { \
|
||||
argc--, argv++; \
|
||||
break; \
|
||||
} \
|
||||
for (i_ = 1, argused_ = 0; (*argv)[i_]; i_++) { \
|
||||
switch ((*argv)[i_])
|
||||
#define ARGEND if (argused_) { \
|
||||
if ((*argv)[i_ + 1]) { \
|
||||
break; \
|
||||
} else { \
|
||||
argc--, argv++; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
#define ARGC() ((*argv)[i_])
|
||||
#define ARGF_(x) (((*argv)[i_ + 1]) ? (argused_ = 1, &((*argv)[i_ + 1])) : \
|
||||
(*(argv + 1)) ? (argused_ = 1, *(argv + 1)) : (x))
|
||||
#define EARGF(x) ARGF_(((x), exit(1), (char *)0))
|
||||
#define ARGF() ARGF_((char *)0)
|
||||
|
||||
#endif
|
@ -1,247 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
#if defined(__linux__)
|
||||
/*
|
||||
* https://www.kernel.org/doc/html/latest/power/power_supply_class.html
|
||||
*/
|
||||
#include <limits.h>
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define POWER_SUPPLY_CAPACITY "/sys/class/power_supply/%s/capacity"
|
||||
#define POWER_SUPPLY_STATUS "/sys/class/power_supply/%s/status"
|
||||
#define POWER_SUPPLY_CHARGE "/sys/class/power_supply/%s/charge_now"
|
||||
#define POWER_SUPPLY_ENERGY "/sys/class/power_supply/%s/energy_now"
|
||||
#define POWER_SUPPLY_CURRENT "/sys/class/power_supply/%s/current_now"
|
||||
#define POWER_SUPPLY_POWER "/sys/class/power_supply/%s/power_now"
|
||||
|
||||
static const char *
|
||||
pick(const char *bat, const char *f1, const char *f2, char *path,
|
||||
size_t length)
|
||||
{
|
||||
if (esnprintf(path, length, f1, bat) > 0 &&
|
||||
access(path, R_OK) == 0)
|
||||
return f1;
|
||||
|
||||
if (esnprintf(path, length, f2, bat) > 0 &&
|
||||
access(path, R_OK) == 0)
|
||||
return f2;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_perc(const char *bat)
|
||||
{
|
||||
int cap_perc;
|
||||
char path[PATH_MAX];
|
||||
|
||||
if (esnprintf(path, sizeof(path), POWER_SUPPLY_CAPACITY, bat) < 0)
|
||||
return NULL;
|
||||
if (pscanf(path, "%d", &cap_perc) != 1)
|
||||
return NULL;
|
||||
|
||||
return bprintf("%d", cap_perc);
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_state(const char *bat)
|
||||
{
|
||||
static struct {
|
||||
char *state;
|
||||
char *symbol;
|
||||
} map[] = {
|
||||
{ "Charging", "+" },
|
||||
{ "Discharging", "-" },
|
||||
{ "Full", "o" },
|
||||
{ "Not charging", "o" },
|
||||
};
|
||||
size_t i;
|
||||
char path[PATH_MAX], state[12];
|
||||
|
||||
if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0)
|
||||
return NULL;
|
||||
if (pscanf(path, "%12[a-zA-Z ]", state) != 1)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < LEN(map); i++)
|
||||
if (!strcmp(map[i].state, state))
|
||||
break;
|
||||
|
||||
return (i == LEN(map)) ? "?" : map[i].symbol;
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_remaining(const char *bat)
|
||||
{
|
||||
uintmax_t charge_now, current_now, m, h;
|
||||
double timeleft;
|
||||
char path[PATH_MAX], state[12];
|
||||
|
||||
if (esnprintf(path, sizeof(path), POWER_SUPPLY_STATUS, bat) < 0)
|
||||
return NULL;
|
||||
if (pscanf(path, "%12[a-zA-Z ]", state) != 1)
|
||||
return NULL;
|
||||
|
||||
if (!pick(bat, POWER_SUPPLY_CHARGE, POWER_SUPPLY_ENERGY, path,
|
||||
sizeof(path)) ||
|
||||
pscanf(path, "%ju", &charge_now) < 0)
|
||||
return NULL;
|
||||
|
||||
if (!strcmp(state, "Discharging")) {
|
||||
if (!pick(bat, POWER_SUPPLY_CURRENT, POWER_SUPPLY_POWER, path,
|
||||
sizeof(path)) ||
|
||||
pscanf(path, "%ju", ¤t_now) < 0)
|
||||
return NULL;
|
||||
|
||||
if (current_now == 0)
|
||||
return NULL;
|
||||
|
||||
timeleft = (double)charge_now / (double)current_now;
|
||||
h = timeleft;
|
||||
m = (timeleft - (double)h) * 60;
|
||||
|
||||
return bprintf("%juh %jum", h, m);
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <fcntl.h>
|
||||
#include <machine/apmvar.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static int
|
||||
load_apm_power_info(struct apm_power_info *apm_info)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/apm", O_RDONLY);
|
||||
if (fd < 0) {
|
||||
warn("open '/dev/apm':");
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(apm_info, 0, sizeof(struct apm_power_info));
|
||||
if (ioctl(fd, APM_IOC_GETPOWER, apm_info) < 0) {
|
||||
warn("ioctl 'APM_IOC_GETPOWER':");
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
return close(fd), 1;
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_perc(const char *unused)
|
||||
{
|
||||
struct apm_power_info apm_info;
|
||||
|
||||
if (load_apm_power_info(&apm_info))
|
||||
return bprintf("%d", apm_info.battery_life);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_state(const char *unused)
|
||||
{
|
||||
struct {
|
||||
unsigned int state;
|
||||
char *symbol;
|
||||
} map[] = {
|
||||
{ APM_AC_ON, "+" },
|
||||
{ APM_AC_OFF, "-" },
|
||||
};
|
||||
struct apm_power_info apm_info;
|
||||
size_t i;
|
||||
|
||||
if (load_apm_power_info(&apm_info)) {
|
||||
for (i = 0; i < LEN(map); i++)
|
||||
if (map[i].state == apm_info.ac_state)
|
||||
break;
|
||||
|
||||
return (i == LEN(map)) ? "?" : map[i].symbol;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_remaining(const char *unused)
|
||||
{
|
||||
struct apm_power_info apm_info;
|
||||
unsigned int h, m;
|
||||
|
||||
if (load_apm_power_info(&apm_info)) {
|
||||
if (apm_info.ac_state != APM_AC_ON) {
|
||||
h = apm_info.minutes_left / 60;
|
||||
m = apm_info.minutes_left % 60;
|
||||
return bprintf("%uh %02um", h, m);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#elif defined(__FreeBSD__)
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#define BATTERY_LIFE "hw.acpi.battery.life"
|
||||
#define BATTERY_STATE "hw.acpi.battery.state"
|
||||
#define BATTERY_TIME "hw.acpi.battery.time"
|
||||
|
||||
const char *
|
||||
battery_perc(const char *unused)
|
||||
{
|
||||
int cap_perc;
|
||||
size_t len;
|
||||
|
||||
len = sizeof(cap_perc);
|
||||
if (sysctlbyname(BATTERY_LIFE, &cap_perc, &len, NULL, 0) < 0 || !len)
|
||||
return NULL;
|
||||
|
||||
return bprintf("%d", cap_perc);
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_state(const char *unused)
|
||||
{
|
||||
int state;
|
||||
size_t len;
|
||||
|
||||
len = sizeof(state);
|
||||
if (sysctlbyname(BATTERY_STATE, &state, &len, NULL, 0) < 0 || !len)
|
||||
return NULL;
|
||||
|
||||
switch (state) {
|
||||
case 0: /* FALLTHROUGH */
|
||||
case 2:
|
||||
return "+";
|
||||
case 1:
|
||||
return "-";
|
||||
default:
|
||||
return "?";
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
battery_remaining(const char *unused)
|
||||
{
|
||||
int rem;
|
||||
size_t len;
|
||||
|
||||
len = sizeof(rem);
|
||||
if (sysctlbyname(BATTERY_TIME, &rem, &len, NULL, 0) < 0 || !len
|
||||
|| rem < 0)
|
||||
return NULL;
|
||||
|
||||
return bprintf("%uh %02um", rem / 60, rem % 60);
|
||||
}
|
||||
#endif
|
@ -1,32 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
const char *
|
||||
cat(const char *path)
|
||||
{
|
||||
char *f;
|
||||
FILE *fp;
|
||||
|
||||
if (!(fp = fopen(path, "r"))) {
|
||||
warn("fopen '%s':", path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
f = fgets(buf, sizeof(buf) - 1, fp);
|
||||
if (fclose(fp) < 0) {
|
||||
warn("fclose '%s':", path);
|
||||
return NULL;
|
||||
}
|
||||
if (!f)
|
||||
return NULL;
|
||||
|
||||
if ((f = strrchr(buf, '\n')))
|
||||
f[0] = '\0';
|
||||
|
||||
return buf[0] ? buf : NULL;
|
||||
}
|
||||
|
@ -1,157 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
#if defined(__linux__)
|
||||
#define CPU_FREQ "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
|
||||
|
||||
const char *
|
||||
cpu_freq(const char *unused)
|
||||
{
|
||||
uintmax_t freq;
|
||||
|
||||
/* in kHz */
|
||||
if (pscanf(CPU_FREQ, "%ju", &freq) != 1)
|
||||
return NULL;
|
||||
|
||||
return fmt_human(freq * 1000, 1000);
|
||||
}
|
||||
|
||||
const char *
|
||||
cpu_perc(const char *unused)
|
||||
{
|
||||
static long double a[7];
|
||||
long double b[7], sum;
|
||||
|
||||
memcpy(b, a, sizeof(b));
|
||||
/* cpu user nice system idle iowait irq softirq */
|
||||
if (pscanf("/proc/stat", "%*s %Lf %Lf %Lf %Lf %Lf %Lf %Lf",
|
||||
&a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])
|
||||
!= 7)
|
||||
return NULL;
|
||||
|
||||
if (b[0] == 0)
|
||||
return NULL;
|
||||
|
||||
sum = (b[0] + b[1] + b[2] + b[3] + b[4] + b[5] + b[6]) -
|
||||
(a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6]);
|
||||
|
||||
if (sum == 0)
|
||||
return NULL;
|
||||
|
||||
return bprintf("%d", (int)(100 *
|
||||
((b[0] + b[1] + b[2] + b[5] + b[6]) -
|
||||
(a[0] + a[1] + a[2] + a[5] + a[6])) / sum));
|
||||
}
|
||||
#elif defined(__OpenBSD__)
|
||||
#include <sys/param.h>
|
||||
#include <sys/sched.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
const char *
|
||||
cpu_freq(const char *unused)
|
||||
{
|
||||
int freq, mib[2];
|
||||
size_t size;
|
||||
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = HW_CPUSPEED;
|
||||
|
||||
size = sizeof(freq);
|
||||
|
||||
/* in MHz */
|
||||
if (sysctl(mib, 2, &freq, &size, NULL, 0) < 0) {
|
||||
warn("sysctl 'HW_CPUSPEED':");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fmt_human(freq * 1E6, 1000);
|
||||
}
|
||||
|
||||
const char *
|
||||
cpu_perc(const char *unused)
|
||||
{
|
||||
int mib[2];
|
||||
static uintmax_t a[CPUSTATES];
|
||||
uintmax_t b[CPUSTATES], sum;
|
||||
size_t size;
|
||||
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_CPTIME;
|
||||
|
||||
size = sizeof(a);
|
||||
|
||||
memcpy(b, a, sizeof(b));
|
||||
if (sysctl(mib, 2, &a, &size, NULL, 0) < 0) {
|
||||
warn("sysctl 'KERN_CPTIME':");
|
||||
return NULL;
|
||||
}
|
||||
if (b[0] == 0)
|
||||
return NULL;
|
||||
|
||||
sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) -
|
||||
(b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]);
|
||||
|
||||
if (sum == 0)
|
||||
return NULL;
|
||||
|
||||
return bprintf("%d", 100 *
|
||||
((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
|
||||
a[CP_INTR]) -
|
||||
(b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
|
||||
b[CP_INTR])) / sum);
|
||||
}
|
||||
#elif defined(__FreeBSD__)
|
||||
#include <devstat.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
const char *
|
||||
cpu_freq(const char *unused)
|
||||
{
|
||||
int freq;
|
||||
size_t size;
|
||||
|
||||
size = sizeof(freq);
|
||||
/* in MHz */
|
||||
if (sysctlbyname("hw.clockrate", &freq, &size, NULL, 0) < 0 || !size) {
|
||||
warn("sysctlbyname 'hw.clockrate':");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fmt_human(freq * 1E6, 1000);
|
||||
}
|
||||
|
||||
const char *
|
||||
cpu_perc(const char *unused)
|
||||
{
|
||||
size_t size;
|
||||
static long a[CPUSTATES];
|
||||
long b[CPUSTATES], sum;
|
||||
|
||||
size = sizeof(a);
|
||||
memcpy(b, a, sizeof(b));
|
||||
if (sysctlbyname("kern.cp_time", &a, &size, NULL, 0) < 0 || !size) {
|
||||
warn("sysctlbyname 'kern.cp_time':");
|
||||
return NULL;
|
||||
}
|
||||
if (b[0] == 0)
|
||||
return NULL;
|
||||
|
||||
sum = (a[CP_USER] + a[CP_NICE] + a[CP_SYS] + a[CP_INTR] + a[CP_IDLE]) -
|
||||
(b[CP_USER] + b[CP_NICE] + b[CP_SYS] + b[CP_INTR] + b[CP_IDLE]);
|
||||
|
||||
if (sum == 0)
|
||||
return NULL;
|
||||
|
||||
return bprintf("%d", 100 *
|
||||
((a[CP_USER] + a[CP_NICE] + a[CP_SYS] +
|
||||
a[CP_INTR]) -
|
||||
(b[CP_USER] + b[CP_NICE] + b[CP_SYS] +
|
||||
b[CP_INTR])) / sum);
|
||||
}
|
||||
#endif
|
@ -1,20 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
const char *
|
||||
datetime(const char *fmt)
|
||||
{
|
||||
time_t t;
|
||||
|
||||
t = time(NULL);
|
||||
if (!strftime(buf, sizeof(buf), fmt, localtime(&t))) {
|
||||
warn("strftime: Result string exceeds buffer size");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <sys/statvfs.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
const char *
|
||||
disk_free(const char *path)
|
||||
{
|
||||
struct statvfs fs;
|
||||
|
||||
if (statvfs(path, &fs) < 0) {
|
||||
warn("statvfs '%s':", path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fmt_human(fs.f_frsize * fs.f_bavail, 1024);
|
||||
}
|
||||
|
||||
const char *
|
||||
disk_perc(const char *path)
|
||||
{
|
||||
struct statvfs fs;
|
||||
|
||||
if (statvfs(path, &fs) < 0) {
|
||||
warn("statvfs '%s':", path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return bprintf("%d", (int)(100 *
|
||||
(1 - ((double)fs.f_bavail / (double)fs.f_blocks))));
|
||||
}
|
||||
|
||||
const char *
|
||||
disk_total(const char *path)
|
||||
{
|
||||
struct statvfs fs;
|
||||
|
||||
if (statvfs(path, &fs) < 0) {
|
||||
warn("statvfs '%s':", path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fmt_human(fs.f_frsize * fs.f_blocks, 1024);
|
||||
}
|
||||
|
||||
const char *
|
||||
disk_used(const char *path)
|
||||
{
|
||||
struct statvfs fs;
|
||||
|
||||
if (statvfs(path, &fs) < 0) {
|
||||
warn("statvfs '%s':", path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fmt_human(fs.f_frsize * (fs.f_blocks - fs.f_bfree), 1024);
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include "../slstatus.h"
|
||||
#if defined(__linux__)
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "../util.h"
|
||||
|
||||
#define ENTROPY_AVAIL "/proc/sys/kernel/random/entropy_avail"
|
||||
|
||||
const char *
|
||||
entropy(const char *unused)
|
||||
{
|
||||
uintmax_t num;
|
||||
|
||||
if (pscanf(ENTROPY_AVAIL, "%ju", &num) != 1)
|
||||
return NULL;
|
||||
|
||||
return bprintf("%ju", num);
|
||||
}
|
||||
#elif defined(__OpenBSD__) | defined(__FreeBSD__)
|
||||
const char *
|
||||
entropy(const char *unused)
|
||||
{
|
||||
// https://www.unicode.org/charts/PDF/U2200.pdf
|
||||
/* Unicode Character 'INFINITY' (U+221E) */
|
||||
return "\u221E";
|
||||
}
|
||||
#endif
|
@ -1,17 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
const char *
|
||||
hostname(const char *unused)
|
||||
{
|
||||
if (gethostname(buf, sizeof(buf)) < 0) {
|
||||
warn("gethostbyname:");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <ifaddrs.h>
|
||||
#include <netdb.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#if defined(__OpenBSD__)
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#elif defined(__FreeBSD__)
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
static const char *
|
||||
ip(const char *interface, unsigned short sa_family)
|
||||
{
|
||||
struct ifaddrs *ifaddr, *ifa;
|
||||
int s;
|
||||
char host[NI_MAXHOST];
|
||||
|
||||
if (getifaddrs(&ifaddr) < 0) {
|
||||
warn("getifaddrs:");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
|
||||
if (!ifa->ifa_addr)
|
||||
continue;
|
||||
|
||||
s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6),
|
||||
host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
|
||||
if (!strcmp(ifa->ifa_name, interface) &&
|
||||
(ifa->ifa_addr->sa_family == sa_family)) {
|
||||
freeifaddrs(ifaddr);
|
||||
if (s != 0) {
|
||||
warn("getnameinfo: %s", gai_strerror(s));
|
||||
return NULL;
|
||||
}
|
||||
return bprintf("%s", host);
|
||||
}
|
||||
}
|
||||
|
||||
freeifaddrs(ifaddr);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
ipv4(const char *interface)
|
||||
{
|
||||
return ip(interface, AF_INET);
|
||||
}
|
||||
|
||||
const char *
|
||||
ipv6(const char *interface)
|
||||
{
|
||||
return ip(interface, AF_INET6);
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
const char *
|
||||
kernel_release(const char *unused)
|
||||
{
|
||||
struct utsname udata;
|
||||
|
||||
if (uname(&udata) < 0) {
|
||||
warn("uname:");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return bprintf("%s", udata.release);
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
/* See LICENSE file for copyright and license details. */
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include "../slstatus.h"
|
||||
#include "../util.h"
|
||||
|
||||
/*
|
||||
* fmt consists of uppercase or lowercase 'c' for caps lock and/or 'n' for num
|
||||
* lock, each optionally followed by '?', in the order of indicators desired.
|
||||
* If followed by '?', the letter with case preserved is included in the output
|
||||
* if the corresponding indicator is on. Otherwise, the letter is always
|
||||
* included, lowercase when off and uppercase when on.
|
||||
*/
|
||||
const char *
|
||||
keyboard_indicators(const char *fmt)
|
||||
{
|
||||
Display *dpy;
|
||||
XKeyboardState state;
|
||||
size_t fmtlen, i, n;
|
||||
int togglecase, isset;
|
||||
char key;
|
||||
|
||||
if (!(dpy = XOpenDisplay(NULL))) {
|
||||
warn("XOpenDisplay: Failed to open display");
|
||||
return NULL;
|
||||
}
|
||||
XGetKeyboardControl(dpy, &state);
|
||||
XCloseDisplay(dpy);
|
||||
|
||||
fmtlen = strnlen(fmt, 4);
|
||||
for (i = n = 0; i < fmtlen; i++) {
|
||||
key = tolower(fmt[i]);
|
||||
if (key != 'c' && key != 'n')
|
||||
continue;
|
||||
|
||||
togglecase = (i + 1 >= fmtlen || fmt[i + 1] != '?');
|
||||
isset = (state.led_mask & (1 << (key == 'n')));
|
||||
|
||||
if (togglecase)
|
||||
buf[n++] = isset ? toupper(key) : key;
|
||||
else if (isset)
|
||||
buf[n++] = fmt[i];
|
||||
}
|
||||
|
||||
buf[n] = 0;
|
||||
return buf;
|
||||
}
|