61 Commits

Author SHA1 Message Date
Patrick Stevens
f413ff7918 Format 2024-11-29 09:38:23 +00:00
Patrick Stevens
7de8ba96f8 Get sway working 2024-11-29 09:37:28 +00:00
Patrick Stevens
ab4af6d488 Merge branch 'main' into more-earthworm 2024-11-28 22:55:29 +00:00
Patrick Stevens
02f757bf57 Fix pavucontrol (#96) 2024-11-24 12:47:27 +00:00
Patrick Stevens
6d3804a5ee Start tmux automatically (#95) 2024-11-20 18:29:59 +00:00
Patrick Stevens
6c3bdcc4b2 AMD GPU on capybara (#94) 2024-11-20 18:23:01 +00:00
Patrick Stevens
f9172d159b Stash pop 2024-11-15 00:10:47 +00:00
Patrick Stevens
233771f07d Merge main 2024-11-15 00:10:10 +00:00
Patrick Stevens
2123c53980 Bump flake again (#93) 2024-11-14 23:40:40 +00:00
Patrick Stevens
7f712faf2c Bump flake (#92) 2024-11-14 23:31:22 +00:00
Patrick Stevens
5b8b64b0a2 Keepassxc broken on aarch64-darwin (#91) 2024-11-14 23:26:55 +00:00
Patrick Stevens
73efe7a18c Add golang (#90) 2024-10-26 08:25:43 +00:00
Patrick Stevens
f6dd2e686a Add gopls (#89) 2024-10-26 08:20:48 +00:00
Patrick Stevens
df071387b2 Pipewire on Capybara (#88) 2024-10-23 21:00:06 +00:00
Patrick Stevens
f83285dec2 Use Waybar (#87) 2024-10-21 23:23:29 +00:00
Patrick Stevens
d7221c2af1 Resolve borked merge 2024-10-21 23:20:40 +01:00
Patrick Stevens
8969b0c347 Merge main 2024-10-21 23:06:40 +01:00
Patrick Stevens
a40777c034 Add waybar 2024-10-21 23:05:37 +01:00
Patrick Stevens
dbe797cf03 WIP 2024-10-21 22:41:31 +01:00
Patrick Stevens
e60a954838 Fix Earthworm key 2024-10-21 22:41:10 +01:00
Patrick Stevens
0e00b6250f Merge main 2024-10-20 10:33:21 +01:00
Patrick Stevens
8ef0e6ef37 Merge main 2024-10-19 22:30:32 +01:00
Patrick Stevens
def75585dd Fix merge 2024-06-14 22:08:39 +01:00
Patrick Stevens
8c67cd2e0a Merge main 2024-06-14 21:58:47 +01:00
Smaug123
348d913a49 Merge branch 'main' into more-earthworm 2024-03-26 00:04:11 +00:00
Smaug123
e668501cad Merge main 2024-03-26 00:01:04 +00:00
Smaug123
e160ff5704 Merge main 2024-03-25 23:58:23 +00:00
Smaug123
7a1e5eb445 Merge branch 'main' into more-earthworm 2024-03-25 23:54:14 +00:00
Smaug123
47fc4dfd39 Use roslyn-nvim, fix some prefixes 2024-03-25 23:44:29 +00:00
Smaug123
ae0713074f Add C# language server 2024-03-25 21:29:19 +00:00
Smaug123
db633836f1 Attempt at venv creation thing 2024-03-25 09:39:47 +00:00
Smaug123
4554ea1a90 Fix buffer-specific binds 2024-03-24 23:30:52 +00:00
Smaug123
75cebeaa7a Stop for today 2024-03-24 21:08:06 +00:00
Smaug123
b94098e5af Fix 2024-03-24 18:18:02 +00:00
Smaug123
371af97527 Fix misalignment 2024-03-24 17:15:54 +00:00
Smaug123
742a708c0c Tidy up 2024-03-24 17:14:24 +00:00
Smaug123
ddbd6718b5 Upgrade nixpkgs 2024-03-24 16:53:46 +00:00
Smaug123
824e35351d Move entirely to Lua 2024-03-24 11:24:35 +00:00
Smaug123
8336993820 Document more 2024-03-23 19:07:25 +00:00
Smaug123
49f2b9be5c Much better 2024-03-23 18:46:18 +00:00
Smaug123
289e430d52 It works 2024-03-23 17:44:00 +00:00
Smaug123
d54f38cf68 Move more stuff to Lua 2024-03-23 14:12:42 +00:00
Smaug123
14981d3401 More 2024-03-23 11:11:27 +00:00
Smaug123
3e9b26c093 More 2024-03-23 11:07:02 +00:00
Smaug123
47b5993422 Nearly working 2024-03-23 01:06:01 +00:00
Smaug123
93b5fc92e9 Rustaceanvim 2024-03-22 21:24:48 +00:00
Smaug123
e493cdbcdd And F# 2024-03-22 21:17:19 +00:00
Smaug123
78b2d62ce2 Python setup 2024-03-22 21:01:26 +00:00
Smaug123
1e4c4c525f More 2024-03-22 19:38:21 +00:00
Smaug123
21bb1ebd3d Fix autoloads 2024-02-26 18:32:35 +00:00
Smaug123
b111a9509d Fix config 2024-02-25 20:01:12 +00:00
Smaug123
ef64007cc9 Couple of fixes 2024-02-25 17:24:04 +00:00
Smaug123
b9bb4c49fa Merge branch 'main' into more-earthworm 2024-02-23 22:47:53 +00:00
Smaug123
d2718febf8 Rem oh-my-zsh 2024-02-23 22:44:39 +00:00
Smaug123
b3eb9adb9f Format 2024-02-23 14:16:04 +00:00
Smaug123
ada02e558b FiraCode 2024-02-23 14:11:48 +00:00
Smaug123
ae96250101 Delete unused keybinds 2024-02-23 11:15:36 +00:00
Smaug123
5e3f257ce6 Merge branch 'main' into more-earthworm 2024-02-23 11:11:39 +00:00
Smaug123
134b0dc8a7 CHADdeps and coq_nvim 2024-02-23 11:06:57 +00:00
Smaug123
a290279914 Relegate to Linux 2024-02-04 23:39:41 +00:00
Patrick Stevens
bea4ca1220 More earthworm 2024-02-04 20:15:15 +00:00
11 changed files with 608 additions and 82 deletions

78
flake.lock generated
View File

@@ -7,11 +7,11 @@
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1725418254,
"narHash": "sha256-2zPzPP9Eu5NxgJxTVcuCCX5xh7CWy7rYaLHfaAZS6H8=",
"lastModified": 1731473366,
"narHash": "sha256-sE2WfD3YyNrCROfRZKqMDR77g3KV4FXUaJ7NWe+A7ro=",
"owner": "tpwrules",
"repo": "nixos-apple-silicon",
"rev": "c5f944f49a052232015bb3c03524b69e3fdd2aa4",
"rev": "3eee753e4b074790342fadb1c4e7183d037ddac4",
"type": "github"
},
"original": {
@@ -27,11 +27,11 @@
]
},
"locked": {
"lastModified": 1729382845,
"narHash": "sha256-REiWck1zIOnZIgGmmOWfwvkQw1f4UrBsxxOSKVSAG4w=",
"lastModified": 1731454423,
"narHash": "sha256-TtwvgFxUa0wyptLhQbKaixgNW1UXf3+TDqfX3Kp63oM=",
"owner": "lnl7",
"repo": "nix-darwin",
"rev": "a001f44cfc47164839eb61c6b1e7f4288813f7e8",
"rev": "6c71c49e2448e51ad830ed211024e6d0edc50116",
"type": "github"
},
"original": {
@@ -43,18 +43,17 @@
},
"emacs": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1729390258,
"narHash": "sha256-z4Hg8k6iXIV55lA8HUntfJBdBzxOuG8M4ftWoJhrVqU=",
"lastModified": 1731604406,
"narHash": "sha256-CUkO4CXaDcGyUqQ+/ArvekL3hlfgass7LjrnG6m2+g8=",
"owner": "nix-community",
"repo": "emacs-overlay",
"rev": "89860b1c343648e8d71b6820e9311b98353ff14e",
"rev": "f6c94b95f529cfbd29848c12816111a2471a5293",
"type": "github"
},
"original": {
@@ -82,24 +81,6 @@
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1726560853,
"narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1701680307,
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
@@ -121,11 +102,11 @@
]
},
"locked": {
"lastModified": 1729321331,
"narHash": "sha256-KVyQq+ez/oB30/WbdNgVD8g/bda34z8NiU187QKQb74=",
"lastModified": 1731604581,
"narHash": "sha256-Qq2YZZaDTB3FZLWU/Hgh1uuWlUBl3cMLGB99bm7rFUM=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "122f70545b29ccb922e655b08acfe05bfb44ec68",
"rev": "1d0862ee2d7c6f6cd720d6f32213fa425004be10",
"type": "github"
},
"original": {
@@ -148,11 +129,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1725103162,
"narHash": "sha256-Ym04C5+qovuQDYL/rKWSR+WESseQBbNAe5DsXNx5trY=",
"lastModified": 1731139594,
"narHash": "sha256-IigrKK3vYRpUu+HEjPL/phrfh7Ox881er1UEsZvw9Q4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "12228ff1752d7b7624a54e9c1af4b222b3c1073b",
"rev": "76612b17c0ce71689921ca12d9ffdc9c23ce40b2",
"type": "github"
},
"original": {
@@ -164,11 +145,11 @@
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1729181673,
"narHash": "sha256-LDiPhQ3l+fBjRATNtnuDZsBS7hqoBtPkKBkhpoBHv3I=",
"lastModified": 1731386116,
"narHash": "sha256-lKA770aUmjPHdTaJWnP3yQ9OI1TigenUqVC3wweqZuI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4eb33fe664af7b41a4c446f87d20c9a0a6321fa3",
"rev": "689fed12a013f56d4c4d3f612489634267d86529",
"type": "github"
},
"original": {
@@ -180,11 +161,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1729265718,
"narHash": "sha256-4HQI+6LsO3kpWTYuVGIzhJs1cetFcwT7quWCk/6rqeo=",
"lastModified": 1731531548,
"narHash": "sha256-sz8/v17enkYmfpgeeuyzniGJU0QQBfmAjlemAUYhfy8=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "ccc0c2126893dd20963580b6478d1a10a4512185",
"rev": "24f0d4acd634792badd6470134c387a3b039dace",
"type": "github"
},
"original": {
@@ -250,24 +231,9 @@
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"whisper": {
"inputs": {
"flake-utils": "flake-utils_2",
"flake-utils": "flake-utils",
"model": "model",
"nixpkgs": "nixpkgs_3"
},

View File

@@ -1,8 +1,6 @@
{
pkgs,
config,
username,
dotnet,
...
}: {
nixpkgs.config.allowUnfree = true;
@@ -12,25 +10,26 @@
hardware.graphics = {
enable = true;
enable32Bit = true;
};
services.xserver.videoDrivers = ["nvidia"];
hardware.nvidia = {
modesetting.enable = true;
powerManagement.enable = false;
# I don't have a Turing GPU
powerManagement.finegrained = false;
open = false;
nvidiaSettings = true;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
};
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.loader.grub.useOSProber = true;
boot.kernelParams = [
"video=DP-1:2560x1440@144"
"video=HDMI-A-1:1920x1080@144"
];
boot.extraModulePackages = [config.boot.kernelPackages.rtl8821au];
networking = {

View File

@@ -3,7 +3,31 @@
../hardware/earthworm.nix
];
hardware.asahi.peripheralFirmwareDirectory = ../firmware;
hardware.asahi.peripheralFirmwareDirectory = ./../firmware;
hardware.asahi = {
useExperimentalGPUDriver = true;
experimentalGPUInstallMode = "overlay";
setupAsahiSound = true;
withRust = true;
};
hardware.graphics.enable = true;
programs.light.enable = true;
services.actkbd = {
enable = true;
bindings = [
{
keys = [225];
events = ["key"];
command = "${pkgs.light}/bin/light -A 10";
}
{
keys = [224];
events = ["key"];
command = "${pkgs.light}/bin/light -U 10";
}
];
};
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = false;
@@ -14,6 +38,10 @@
networking = {
hostName = "earthworm";
networkmanager.enable = true;
wireless.iwd = {
enable = true;
settings.General.EnableNetworkConfiguration = true;
};
};
time.timeZone = "Europe/London";
@@ -31,10 +59,11 @@
environment.systemPackages = [
pkgs.vim
pkgs.wget
pkgs.mesa-asahi-edge
];
environment.loginShellInit = ''
[[ "$(tty)" == /dev/tty1 ]] && sway
[[ "$(tty)" == /dev/tty1 ]] && export WLR_RENDER_NO_EXPLICIT_SYNC=1 && sway
'';
services.openssh.enable = true;

View File

@@ -278,7 +278,6 @@
nixpkgs.netcoredbg
nixpkgs.nil
nixpkgs.fsautocomplete
nixpkgs.keepassxc
nixpkgs.wget
nixpkgs.yt-dlp
nixpkgs.cmake
@@ -313,6 +312,9 @@
nixpkgs.clang-tools
nixpkgs.deno
nixpkgs.yazi
nixpkgs.font-awesome
nixpkgs.gopls
nixpkgs.go
]
++ (
if nixpkgs.stdenv.isLinux
@@ -320,6 +322,7 @@
nixpkgs.protonmail-bridge
nixpkgs.pinentry
nixpkgs.signal-desktop
nixpkgs.keepassxc
]
else []
)
@@ -335,4 +338,88 @@
home.file.".ideavimrc".source = ./ideavimrc;
home.file.".config/yt-dlp/config".source = ./youtube-dl.conf;
programs.firefox = {
enable = true;
package = nixpkgs.firefox-wayland;
profiles = {
patrick = {
isDefault = true;
name = "patrick";
search = {
default = "Google";
force = true;
};
settings = {
# see https://github.com/TLATER/dotfiles/blob/b39af91fbd13d338559a05d69f56c5a97f8c905d/home-config/config/graphical-applications/firefox.nix
# see https://www.ghacks.net/2015/08/18/a-comprehensive-list-of-firefox-privacy-and-security-settings/
"browser.search.isUS" = false;
"browser.search.region" = "GB";
"gfx.webrender.all" = true; # enable GPU acceleration
"media.ffmpeg.vaapi.enabled" = true;
"widget.dmabuf.force-enabled" = true;
"privacy.webrtc.legacyGlobalIndicator" = false;
"app.shield.optoutstudies.enabled" = false;
"app.update.enabled" = false;
"app.update.auto" = false;
"app.update.silent" = false;
"app.update.service.enabled" = false;
"app.update.staging.enabled" = false;
"browser.discovery.enabled" = false;
"browser.laterrun.enabled" = false;
"browser.shell.checkDefaultBrowser" = false;
"browser.rights.3.shown" = true;
"browser.search.update" = false;
"extensions.update.enabled" = false;
"extensions.update.autoUpdateDefault" = false;
"extensions.getAddons.cache.enabled" = false;
"dom.ipc.plugins.reportCrashURL" = false;
"extensions.webservice.discoverURL" = "http://127.0.0.1";
"toolkit.telemetry.unified" = false;
"toolkit.telemetry.unifiedIsOptIn" = true;
"toolkit.telemetry.enabled" = false;
"toolkit.telemetry.server" = "";
"toolkit.telemetry.archive.enabled" = false;
"lightweightThemes.update.enabled" = false;
"startup.homepage_welcome_url" = "";
"startup.homepage_welcome_url.additional" = "";
"startup.homepage_override_url" = "";
"datareporting.healthreport.uploadEnabled" = false;
"datareporting.healthreport.documentServerURI" = "";
"datareporting.healthreport.service.enabled" = false;
"datareporting.healthreport.about.reportUrl" = "data:text/plain,";
"toolkit.telemetry.cachedClientID" = "";
"browser.selfsupport.url" = "";
"browser.selfsupport.enabled" = false;
"experiments.enabled" = false;
"experiments.supported" = false;
"experiments.activeExperiment" = false;
"experiments.manifest.uri" = "";
"network.allow-experiments" = false;
"breakpad.reportURL" = "";
"browser.tabs.crashReporting.sendReport" = false;
"browser.newtab.preload" = false;
"browser.newtabpage.directory.ping" = "data:text/plain,";
"browser.newtabpage.directory.source" = "data:text/plain,";
"browser.newtabpage.enabled" = false;
"browser.newtabpage.enhanced" = false;
"browser.newtabpage.introShown" = true;
"browser.aboutHomeSnippets.updateUrl" = "https://127.0.0.1";
"extensions.pocket.enabled" = false;
"extensions.pocket.api" = "";
"extensions.pocket.site" = "";
"extensions.pocket.oAuthConsumerKey" = "";
"social.whitelist" = "";
"social.toast-notifications.enabled" = false;
"social.shareDirectory" = "";
"social.remote-install.enabled" = false;
"social.directories" = "";
"social.share.activationPanelEnabled" = false;
"social.enabled" = false;
"dom.flyweb.enabled" = false;
"services.sync.enabled" = false;
};
};
};
};
}

View File

@@ -1,6 +1,13 @@
{nixpkgs, ...}: {
home.packages = [nixpkgs.firefox-wayland nixpkgs.jetbrains.rider];
nixpkgs.config.firefox.speechSynthesisSupport = true;
{
nixpkgs,
username,
dotnet,
...
}: {
home.packages = [nixpkgs.wl-clipboard nixpkgs.jetbrains.rider];
nixpkgs.config.firefox = {
speechSynthesisSupport = true;
};
wayland.windowManager.sway = {
enable = true;
@@ -9,9 +16,189 @@
modifier = "Mod4";
terminal = "alacritty";
window = {border = 5;};
bars = [
{command = "${nixpkgs.waybar}/bin/waybar";}
];
};
extraConfig = ''
output Unknown-1 scale 2
extraConfig = builtins.readFile ./sway.conf;
};
programs.waybar = {
enable = true;
settings = {
"bar-0" = {
position = "bottom";
layer = "top";
height = 34;
spacing = 8;
modules-left = ["sway/workspaces" "sway/mode" "sway/scratchpad" "custom/media"];
modules-center = ["sway/window"];
modules-right = ["mpd" "idle_inhibitor" "pulseaudio" "network" "power-profiles-daemon" "cpu" "memory" "temperature" "backlight" "keyboard-state" "sway/language" "battery" "battery#bat2" "clock" "tray" "custom/power"];
"keyboard-state" = {
"numlock" = true;
"capslock" = true;
"format" = "{name} {icon}";
"format-icons" = {
"locked" = "";
"unlocked" = "";
};
};
"sway/mode" = {
"format" = "<span style=\"italic\">{}</span>";
};
"sway/scratchpad" = {
"format" = "{icon} {count}";
"show-empty" = false;
"format-icons" = ["" ""];
"tooltip" = true;
"tooltip-format" = "{app}: {title}";
};
"mpd" = {
"format" = "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) {songPosition}|{queueLength} {volume}% ";
"format-disconnected" = "Disconnected ";
"format-stopped" = "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ";
"unknown-tag" = "N/A";
"interval" = 5;
"consume-icons" = {
"on" = " ";
};
"random-icons" = {
"off" = "<span color=\"#f53c3c\"></span> ";
"on" = " ";
};
"repeat-icons" = {
"on" = " ";
};
"single-icons" = {
"on" = "1 ";
};
"state-icons" = {
"paused" = "";
"playing" = "";
};
"tooltip-format" = "MPD (connected)";
"tooltip-format-disconnected" = "MPD (disconnected)";
};
"idle_inhibitor" = {
"format" = "{icon}";
"format-icons" = {
"activated" = "";
"deactivated" = "";
};
};
"tray" = {
"spacing" = 20;
};
"clock" = {
"tooltip-format" = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
"format" = "{:%Y-%m-%d %H:%M:%S}";
"interval" = 1;
};
"cpu" = {
"format" = "{usage}% ";
"tooltip" = false;
};
"memory" = {
"format" = "{}% ";
};
"temperature" = {
"critical-threshold" = 80;
"format" = "{temperatureC}°C {icon}";
"format-icons" = ["" "" ""];
};
"backlight" = {
"format" = "{percent}% {icon}";
"format-icons" = ["" "" "" "" "" "" "" "" ""];
};
"battery" = {
"states" = {
"warning" = 30;
"critical" = 15;
};
"format" = "{capacity}% {icon}";
"format-full" = "{capacity}% {icon}";
"format-charging" = "{capacity}% ";
"format-plugged" = "{capacity}% ";
"format-alt" = "{time} {icon}";
"format-icons" = ["" "" "" "" ""];
};
"battery#bat2" = {
"bat" = "BAT2";
};
"power-profiles-daemon" = {
"format" = "{icon}";
"tooltip-format" = "Power profile: {profile}\nDriver: {driver}";
"tooltip" = true;
"format-icons" = {
"default" = "";
"performance" = "";
"balanced" = "";
"power-saver" = "";
};
};
"network" = {
"format-wifi" = "{essid} ({signalStrength}%) ";
"format-ethernet" = "{bandwidthDownBytes}/{bandwidthUpBytes} ";
"interval" = 5;
"tooltip-format" = "{ifname} via {gwaddr} ";
"format-linked" = "{ifname} (No IP) ";
"format-disconnected" = "Disconnected ";
"format-alt" = "{ifname}: {ipaddr}/{cidr}";
};
"pulseaudio" = {
"format" = "{volume}% {icon} {format_source}";
"format-bluetooth" = "{volume}% {icon} {format_source}";
"format-bluetooth-muted" = " {icon} {format_source}";
"format-muted" = " {format_source}";
"format-source" = "{volume}% ";
"format-source-muted" = "";
"format-icons" = {
"headphone" = "";
"hands-free" = "";
"headset" = "";
"phone" = "";
"portable" = "";
"car" = "";
"default" = ["" "" ""];
};
"on-click" = "${nixpkgs.pavucontrol}/bin/pavucontrol";
};
"custom/media" = {
"format" = "{icon} {text}";
"return-type" = "json";
"max-length" = 40;
"format-icons" = {
"spotify" = "";
"default" = "🎜";
};
"escape" = true;
"exec" = let
python = nixpkgs.python312.withPackages (ppkgs: [ppkgs.pygobject3]);
in "${python}/bin/python ${./modules/waybar/mediaplayer.py} 2> /dev/null";
};
"custom/power" = {
"format" = " ";
"tooltip" = false;
"menu" = "on-click";
"menu-file" = ./modules/waybar/power_menu.xml;
"menu-actions" = {
"shutdown" = "shutdown";
"reboot" = "reboot";
"suspend" = "systemctl suspend";
"hibernate" = "systemctl hibernate";
};
};
};
};
style = ''
* {
font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif;
font-size: 13px;
}
'';
};
@@ -21,9 +208,4 @@
};
services.swayidle = {enable = true;};
services.cbatticon = {
lowLevelPercent = 20;
iconType = "standard";
enable = true;
};
}

View File

@@ -7,6 +7,7 @@
family = "FiraCode Nerd Font Mono";
};
};
terminal = {shell = "${pkgs.zsh}/bin/zsh";};
};
};

View File

@@ -0,0 +1,199 @@
#!/usr/bin/env python3
# MIT licenced, https://github.com/Alexays/Waybar/blob/dacecb9b265c1c7c36ee43d17526fa95f4e6596f/resources/custom_modules/mediaplayer.py
# See licence in power_menu.xml
import gi
gi.require_version("Playerctl", "2.0")
from gi.repository import Playerctl, GLib
from gi.repository.Playerctl import Player
import argparse
import logging
import sys
import signal
import gi
import json
import os
from typing import List
logger = logging.getLogger(__name__)
def signal_handler(sig, frame):
logger.info("Received signal to stop, exiting")
sys.stdout.write("\n")
sys.stdout.flush()
# loop.quit()
sys.exit(0)
class PlayerManager:
def __init__(self, selected_player=None, excluded_player=[]):
self.manager = Playerctl.PlayerManager()
self.loop = GLib.MainLoop()
self.manager.connect(
"name-appeared", lambda *args: self.on_player_appeared(*args))
self.manager.connect(
"player-vanished", lambda *args: self.on_player_vanished(*args))
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
self.selected_player = selected_player
self.excluded_player = excluded_player.split(',') if excluded_player else []
self.init_players()
def init_players(self):
for player in self.manager.props.player_names:
if player.name in self.excluded_player:
continue
if self.selected_player is not None and self.selected_player != player.name:
logger.debug(f"{player.name} is not the filtered player, skipping it")
continue
self.init_player(player)
def run(self):
logger.info("Starting main loop")
self.loop.run()
def init_player(self, player):
logger.info(f"Initialize new player: {player.name}")
player = Playerctl.Player.new_from_name(player)
player.connect("playback-status",
self.on_playback_status_changed, None)
player.connect("metadata", self.on_metadata_changed, None)
self.manager.manage_player(player)
self.on_metadata_changed(player, player.props.metadata)
def get_players(self) -> List[Player]:
return self.manager.props.players
def write_output(self, text, player):
logger.debug(f"Writing output: {text}")
output = {"text": text,
"class": "custom-" + player.props.player_name,
"alt": player.props.player_name}
sys.stdout.write(json.dumps(output) + "\n")
sys.stdout.flush()
def clear_output(self):
sys.stdout.write("\n")
sys.stdout.flush()
def on_playback_status_changed(self, player, status, _=None):
logger.debug(f"Playback status changed for player {player.props.player_name}: {status}")
self.on_metadata_changed(player, player.props.metadata)
def get_first_playing_player(self):
players = self.get_players()
logger.debug(f"Getting first playing player from {len(players)} players")
if len(players) > 0:
# if any are playing, show the first one that is playing
# reverse order, so that the most recently added ones are preferred
for player in players[::-1]:
if player.props.status == "Playing":
return player
# if none are playing, show the first one
return players[0]
else:
logger.debug("No players found")
return None
def show_most_important_player(self):
logger.debug("Showing most important player")
# show the currently playing player
# or else show the first paused player
# or else show nothing
current_player = self.get_first_playing_player()
if current_player is not None:
self.on_metadata_changed(current_player, current_player.props.metadata)
else:
self.clear_output()
def on_metadata_changed(self, player, metadata, _=None):
logger.debug(f"Metadata changed for player {player.props.player_name}")
player_name = player.props.player_name
artist = player.get_artist()
title = player.get_title()
title = title.replace("&", "&amp;")
track_info = ""
if player_name == "spotify" and "mpris:trackid" in metadata.keys() and ":ad:" in player.props.metadata["mpris:trackid"]:
track_info = "Advertisement"
elif artist is not None and title is not None:
track_info = f"{artist} - {title}"
else:
track_info = title
if track_info:
if player.props.status == "Playing":
track_info = "" + track_info
else:
track_info = "" + track_info
# only print output if no other player is playing
current_playing = self.get_first_playing_player()
if current_playing is None or current_playing.props.player_name == player.props.player_name:
self.write_output(track_info, player)
else:
logger.debug(f"Other player {current_playing.props.player_name} is playing, skipping")
def on_player_appeared(self, _, player):
logger.info(f"Player has appeared: {player.name}")
if player.name in self.excluded_player:
logger.debug(
"New player appeared, but it's in exclude player list, skipping")
return
if player is not None and (self.selected_player is None or player.name == self.selected_player):
self.init_player(player)
else:
logger.debug(
"New player appeared, but it's not the selected player, skipping")
def on_player_vanished(self, _, player):
logger.info(f"Player {player.props.player_name} has vanished")
self.show_most_important_player()
def parse_arguments():
parser = argparse.ArgumentParser()
# Increase verbosity with every occurrence of -v
parser.add_argument("-v", "--verbose", action="count", default=0)
parser.add_argument("-x", "--exclude", "- Comma-separated list of excluded player")
# Define for which player we"re listening
parser.add_argument("--player")
parser.add_argument("--enable-logging", action="store_true")
return parser.parse_args()
def main():
arguments = parse_arguments()
# Initialize logging
if arguments.enable_logging:
logfile = os.path.join(os.path.dirname(
os.path.realpath(__file__)), "media-player.log")
logging.basicConfig(filename=logfile, level=logging.DEBUG,
format="%(asctime)s %(name)s %(levelname)s:%(lineno)d %(message)s")
# Logging is set by default to WARN and higher.
# With every occurrence of -v it's lowered by one
logger.setLevel(max((3 - arguments.verbose) * 10, 0))
logger.info("Creating player manager")
if arguments.player:
logger.info(f"Filtering for player: {arguments.player}")
if arguments.exclude:
logger.info(f"Exclude player {arguments.exclude}")
player = PlayerManager(arguments.player, arguments.exclude)
player.run()
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Source: https://github.com/Alexays/Waybar/blob/dacecb9b265c1c7c36ee43d17526fa95f4e6596f/resources/custom_modules/power_menu.xml -->
<!-- MIT licence available at https://github.com/Alexays/Waybar/blob/dacecb9b265c1c7c36ee43d17526fa95f4e6596f/LICENSE
MIT License
Copyright (c) 2018 Alex
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-->
<interface>
<object class="GtkMenu" id="menu">
<child>
<object class="GtkMenuItem" id="suspend">
<property name="label">Suspend</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="hibernate">
<property name="label">Hibernate</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="shutdown">
<property name="label">Shutdown</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="delimiter1"/>
</child>
<child>
<object class="GtkMenuItem" id="reboot">
<property name="label">Reboot</property>
</object>
</child>
</object>
</interface>

View File

@@ -30,3 +30,7 @@ bindkey '^X^E' edit-command-line
bindkey -e
PATH="$PATH:$HOME/.cargo/bin"
if [[ -z "$TMUX" ]]; then
tmux new-session -A -s default
fi

View File

@@ -15,6 +15,8 @@ local schemas = {
require("lspconfig")["clangd"].setup({})
require("lspconfig")["gopls"].setup({})
require("lspconfig")["yamlls"].setup({
settings = {
yaml = {

4
home-manager/sway.conf Normal file
View File

@@ -0,0 +1,4 @@
output Unknown-1 scale 2
input * {
xkb_layout "gb"
}