Initial sway, waybar and rofi config
This commit is contained in:
parent
2bf5db5288
commit
be2e1e5aa3
16 changed files with 1078 additions and 28 deletions
32
flake.nix
32
flake.nix
|
@ -2,8 +2,7 @@
|
||||||
description = "System config";
|
description = "System config";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-21.05";
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
|
||||||
|
|
||||||
home-manager = {
|
home-manager = {
|
||||||
url = "github:nix-community/home-manager";
|
url = "github:nix-community/home-manager";
|
||||||
|
@ -15,7 +14,8 @@
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { nixpkgs, home-manager, ... }@inputs:
|
outputs = { self, ... }@inputs:
|
||||||
|
with inputs;
|
||||||
let
|
let
|
||||||
|
|
||||||
defSystem = systemArch: baseConfig:
|
defSystem = systemArch: baseConfig:
|
||||||
|
@ -24,12 +24,11 @@
|
||||||
modules = [
|
modules = [
|
||||||
{ _module.args.inputs = inputs; }
|
{ _module.args.inputs = inputs; }
|
||||||
{ _module.args.self-overlay = self.overlay; }
|
{ _module.args.self-overlay = self.overlay; }
|
||||||
{ _module.args.overlay-unstable = self.overlay-unstable; }
|
|
||||||
({ ... }: {
|
({ ... }: {
|
||||||
imports = builtins.attrValues self.nixosModules ++ [
|
imports = builtins.attrValues self.nixosModules ++ [
|
||||||
{
|
{
|
||||||
nix.nixPath = [ "nixpkgs=${nixpkgs}" ];
|
nix.nixPath = [ "nixpkgs=${nixpkgs}" ];
|
||||||
nixpkgs.overlays = [ self.overlay self.overlay-unstable ];
|
nixpkgs.overlays = [ self.overlay ];
|
||||||
}
|
}
|
||||||
|
|
||||||
baseConfig
|
baseConfig
|
||||||
|
@ -70,12 +69,12 @@
|
||||||
# };
|
# };
|
||||||
|
|
||||||
overlay = final: prev: (import ./overlays) final prev;
|
overlay = final: prev: (import ./overlays) final prev;
|
||||||
overlay-unstable = final: prev: {
|
# overlay = final: prev: {
|
||||||
unstable = import nixpkgs-unstable {
|
# unstable = import nixpkgs {
|
||||||
system = "x86_64-linux";
|
# system = "x86_64-linux";
|
||||||
config.allowUnfree = true;
|
# config.allowUnfree = true;
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
|
|
||||||
nixosModules = builtins.listToAttrs (map
|
nixosModules = builtins.listToAttrs (map
|
||||||
(x: {
|
(x: {
|
||||||
|
@ -112,6 +111,11 @@
|
||||||
|
|
||||||
# cpuCores = 4;
|
# cpuCores = 4;
|
||||||
# };
|
# };
|
||||||
|
vm1 = defSystem "x86_64-linux" {
|
||||||
|
imports = [
|
||||||
|
(import (./machines/vm1/configuration.nix) { inherit self; })
|
||||||
|
];
|
||||||
|
};
|
||||||
vm2 = defSystem "x86_64-linux" {
|
vm2 = defSystem "x86_64-linux" {
|
||||||
imports = [
|
imports = [
|
||||||
(import (./machines/vm2/configuration.nix) { inherit self; })
|
(import (./machines/vm2/configuration.nix) { inherit self; })
|
||||||
|
@ -125,8 +129,8 @@
|
||||||
# };
|
# };
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
} //
|
||||||
(flake-utils.lib.eachSystem [ "x86_64-linux" ])
|
(flake-utils.lib.eachSystem [ "x86_64-linux" ])
|
||||||
(system:
|
(system:
|
||||||
let
|
let
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
|
@ -141,10 +145,12 @@
|
||||||
rec {
|
rec {
|
||||||
packages = flake-utils.lib.flattenTree {
|
packages = flake-utils.lib.flattenTree {
|
||||||
rofi-wayland = pkgs.rofi-wayland;
|
rofi-wayland = pkgs.rofi-wayland;
|
||||||
|
pamedia = pkgs.pamedia;
|
||||||
};
|
};
|
||||||
|
|
||||||
apps = {
|
apps = {
|
||||||
rofi-wayland = flake-utils.lib.mkApp { drv = packages.rofi-wayland; };
|
rofi-wayland = flake-utils.lib.mkApp { drv = packages.rofi-wayland; };
|
||||||
|
pamedia = flake-utils.lib.mkApp { drv = packages.pamedia; };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
86
home-manager/modules/rofi/config.rasi
Normal file
86
home-manager/modules/rofi/config.rasi
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
configuration {
|
||||||
|
modi: "drun";
|
||||||
|
font: "Overpass Nerd Font 10";
|
||||||
|
display-drun: "";
|
||||||
|
sidebar-mode: false;
|
||||||
|
show-icons: true;
|
||||||
|
icon-theme: "Paper";
|
||||||
|
}
|
||||||
|
|
||||||
|
@theme "/dev/null"
|
||||||
|
|
||||||
|
* {
|
||||||
|
bg: #b5b5aa;
|
||||||
|
fg: #2b2b2b;
|
||||||
|
button: #9e9e95;
|
||||||
|
|
||||||
|
background-color: @bg;
|
||||||
|
text-color: @fg;
|
||||||
|
}
|
||||||
|
|
||||||
|
window {
|
||||||
|
transparency: "real";
|
||||||
|
border-radius: 7px;
|
||||||
|
width: 40%;
|
||||||
|
y-offset: 10px;
|
||||||
|
padding: 20px;
|
||||||
|
location: north;
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt { enabled: false; }
|
||||||
|
|
||||||
|
entry {
|
||||||
|
placeholder: "Search";
|
||||||
|
expand: true;
|
||||||
|
padding: 5px 2% 5px 2%;
|
||||||
|
background-color: @button;
|
||||||
|
placeholder-color: @fg;
|
||||||
|
}
|
||||||
|
|
||||||
|
inputbar {
|
||||||
|
children: [ prompt, entry ];
|
||||||
|
background-color: @button;
|
||||||
|
text-color: @fg;
|
||||||
|
expand: false;
|
||||||
|
border-radius: 6px;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
listview {
|
||||||
|
columns: 1;
|
||||||
|
lines: 8;
|
||||||
|
cycle: false;
|
||||||
|
dynamic: true;
|
||||||
|
layout: vertical;
|
||||||
|
}
|
||||||
|
|
||||||
|
mainbox {
|
||||||
|
children: [ inputbar, listview ];
|
||||||
|
spacing: 2%;
|
||||||
|
padding: 2% 1% 2% 1%;
|
||||||
|
}
|
||||||
|
|
||||||
|
element {
|
||||||
|
orientation: horizontal;
|
||||||
|
border-radius: 0%;
|
||||||
|
padding: 1.0% 0% 1.0% 1.0%;
|
||||||
|
}
|
||||||
|
|
||||||
|
element-text {
|
||||||
|
expand: true;
|
||||||
|
vertical-align: 0.5;
|
||||||
|
margin: 0.5% 1% 0% 1%;
|
||||||
|
background-color: inherit;
|
||||||
|
text-color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
element-icon {
|
||||||
|
size: 48px;
|
||||||
|
border: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
element selected {
|
||||||
|
background-color: @fg;
|
||||||
|
text-color: @bg;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
16
home-manager/modules/rofi/default.nix
Normal file
16
home-manager/modules/rofi/default.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.eboskma.programs.rofi;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.eboskma.programs.rofi.enable = mkEnableOption "Enable rofi";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
|
||||||
|
programs.rofi = {
|
||||||
|
enable = true;
|
||||||
|
theme = ./launch.rasi;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
111
home-manager/modules/rofi/power.rasi
Normal file
111
home-manager/modules/rofi/power.rasi
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
configuration {
|
||||||
|
dpi: 0;
|
||||||
|
me-select-entry: "Control+MousePrimary";
|
||||||
|
me-accept-entry: "MousePrimary";
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
blue: #009ad1;
|
||||||
|
orange: #d14200;
|
||||||
|
text: #efefef;
|
||||||
|
text-alt: #c2c2c2;
|
||||||
|
bg: #333333;
|
||||||
|
|
||||||
|
spacing: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
font: "DroidSansMono Nerd Font Mono, 14, FontAwesome5Free, 14";
|
||||||
|
highlight: bold;
|
||||||
|
text-color: @text;
|
||||||
|
}
|
||||||
|
|
||||||
|
window {
|
||||||
|
transparency: "real";
|
||||||
|
y-offset: -1.5em;
|
||||||
|
x-offset: -0.5em;
|
||||||
|
width: 27em;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
inputbar {
|
||||||
|
enabled: false;
|
||||||
|
border: 1px;
|
||||||
|
border-color: @orange;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 0 5px;
|
||||||
|
background-color: @bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt {
|
||||||
|
text-color: @text;
|
||||||
|
}
|
||||||
|
|
||||||
|
textbox-prompt-colon {
|
||||||
|
expand: false;
|
||||||
|
str: ":";
|
||||||
|
text-color: @text-alt;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry {
|
||||||
|
margin: 0 0.0em;
|
||||||
|
}
|
||||||
|
|
||||||
|
listview {
|
||||||
|
padding: 0.2em;
|
||||||
|
spacing: 0.2em;
|
||||||
|
dynamic: true;
|
||||||
|
scrollbar: false;
|
||||||
|
lines: 1;
|
||||||
|
columns: 5;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
element {
|
||||||
|
padding: 0.6em;
|
||||||
|
text-color: @text-alt;
|
||||||
|
highlight: bold #95ee8f; /* green */
|
||||||
|
background-color: @bg;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 1px;
|
||||||
|
border-color: @orange;
|
||||||
|
}
|
||||||
|
element-icon {
|
||||||
|
size: 1em;
|
||||||
|
padding: 0 0.6em 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
element selected {
|
||||||
|
border: 0 0 0 1px;
|
||||||
|
background-color: @blue;
|
||||||
|
text-color: @text;
|
||||||
|
}
|
||||||
|
|
||||||
|
element urgent, element selected urgent {
|
||||||
|
text-color: @red;
|
||||||
|
}
|
||||||
|
|
||||||
|
element active, element selected active {
|
||||||
|
text-color: @purple;
|
||||||
|
}
|
||||||
|
|
||||||
|
message, error-message {
|
||||||
|
margin: 0 0 0.6em;
|
||||||
|
padding: 1%;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: @emphasis;
|
||||||
|
}
|
||||||
|
error-message {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.6em;
|
||||||
|
border-color: @red;
|
||||||
|
border: 3px;
|
||||||
|
}
|
||||||
|
mode-switcher {
|
||||||
|
margin: 0.1em 0 0 0;
|
||||||
|
}
|
||||||
|
button selected {
|
||||||
|
padding: 0.3em;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: @emphasis;
|
||||||
|
}
|
186
home-manager/modules/sway/default.nix
Normal file
186
home-manager/modules/sway/default.nix
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.eboskma.programs.sway;
|
||||||
|
mod = "Mod4";
|
||||||
|
swaylockcmd = "${pkgs.swaylock}/bin/swaylock --ignore-empty-password --daemonize --show-failed-attempts --indicator-caps-lock --clock --image /home/erwin/Dropbox/Private/Wallpapers/2560x1440/arch.png --fade-in 0.5 --scaling fill";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.eboskma.programs.sway.enable = mkEnableOption "Enable sway";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
wayland.windowManager.sway = {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
modifier = mod;
|
||||||
|
|
||||||
|
assigns = {
|
||||||
|
"1" = [{ app_id = "firefox"; }];
|
||||||
|
"2" = [{ app_id = "Alacritty"; }];
|
||||||
|
"3" = [{ class = "Code"; }];
|
||||||
|
"10" = [{ class = "telegramdesktop"; } { class = "Signal"; }];
|
||||||
|
};
|
||||||
|
bars = [
|
||||||
|
{
|
||||||
|
command = "${pkgs.waybar}/bin/waybar";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
left = "n";
|
||||||
|
down = "e";
|
||||||
|
up = "i";
|
||||||
|
right = "o";
|
||||||
|
|
||||||
|
floating = {
|
||||||
|
criteria = [{ app_id = "gnome-calculator"; }];
|
||||||
|
modifier = mod;
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
names = [ "Iosevka Nerd Font" ];
|
||||||
|
style = "Regular";
|
||||||
|
size = 12.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
gaps = {
|
||||||
|
inner = 10;
|
||||||
|
outer = 5;
|
||||||
|
smartBorders = "on";
|
||||||
|
};
|
||||||
|
|
||||||
|
input = {
|
||||||
|
"36125:40349:splitKB_Kyria" = {
|
||||||
|
xkb_options = "lv3:ralt_switch";
|
||||||
|
};
|
||||||
|
"1133:49291:Logitech_G502_HERO_SE" = {
|
||||||
|
natural_scroll = "enabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
output = {
|
||||||
|
"Virtual-1" = {
|
||||||
|
bg = "~/.wallpapers/river-1920.png fill";
|
||||||
|
mode = "1920x1080@60Hz";
|
||||||
|
};
|
||||||
|
"DP-2" = {
|
||||||
|
bg = "~/.wallpapers/river-2560.png fill";
|
||||||
|
mode = "2560x1440@144Hz";
|
||||||
|
adaptive_sync = "on";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
menu = "${pkgs.wofi}/bin/wofi --show drun -i | ${pkgs.findutils}/bin/xargs swaymsg exec --";
|
||||||
|
|
||||||
|
keybindings = {
|
||||||
|
"${mod}+Return" = "exec ${config.wayland.windowManager.sway.config.terminal}";
|
||||||
|
"${mod}+Shift+q" = "kill";
|
||||||
|
"${mod}+s" = "exec ${config.wayland.windowManager.sway.config.menu}";
|
||||||
|
"${mod}+Shift+s" = "exec ${pkgs.wofi}/bin/wofi --show run | ${pkgs.findutils}/bin/xargs swaymsg exec --";
|
||||||
|
|
||||||
|
"${mod}+${config.wayland.windowManager.sway.config.left}" = "focus left";
|
||||||
|
"${mod}+${config.wayland.windowManager.sway.config.down}" = "focus down";
|
||||||
|
"${mod}+${config.wayland.windowManager.sway.config.up}" = "focus up";
|
||||||
|
"${mod}+${config.wayland.windowManager.sway.config.right}" = "focus right";
|
||||||
|
|
||||||
|
"${mod}+Left" = "focus left";
|
||||||
|
"${mod}+Down" = "focus down";
|
||||||
|
"${mod}+Up" = "focus up";
|
||||||
|
"${mod}+Right" = "focus right";
|
||||||
|
|
||||||
|
"${mod}+Shift+${config.wayland.windowManager.sway.config.left}" = "move left";
|
||||||
|
"${mod}+Shift+${config.wayland.windowManager.sway.config.down}" = "move down";
|
||||||
|
"${mod}+Shift+${config.wayland.windowManager.sway.config.up}" = "move up";
|
||||||
|
"${mod}+Shift+${config.wayland.windowManager.sway.config.right}" = "move right";
|
||||||
|
|
||||||
|
"${mod}+Shift+Left" = "move left";
|
||||||
|
"${mod}+Shift+Down" = "move down";
|
||||||
|
"${mod}+Shift+Up" = "move up";
|
||||||
|
"${mod}+Shift+Right" = "move right";
|
||||||
|
|
||||||
|
"${mod}+h" = "split h";
|
||||||
|
"${mod}+v" = "split v";
|
||||||
|
"${mod}+t" = "fullscreen toggle";
|
||||||
|
"${mod}+a" = "focus parent";
|
||||||
|
|
||||||
|
"${mod}+r" = "layout stacking";
|
||||||
|
"${mod}+w" = "layout tabbed";
|
||||||
|
"${mod}+f" = "layout toggle split";
|
||||||
|
|
||||||
|
"${mod}+Shift+space" = "floating toggle";
|
||||||
|
"${mod}+space" = "focus mode_toggle";
|
||||||
|
|
||||||
|
"${mod}+1" = "workspace number 1";
|
||||||
|
"${mod}+2" = "workspace number 2";
|
||||||
|
"${mod}+3" = "workspace number 3";
|
||||||
|
"${mod}+4" = "workspace number 4";
|
||||||
|
"${mod}+5" = "workspace number 5";
|
||||||
|
"${mod}+6" = "workspace number 6";
|
||||||
|
"${mod}+7" = "workspace number 7";
|
||||||
|
"${mod}+8" = "workspace number 8";
|
||||||
|
"${mod}+9" = "workspace number 9";
|
||||||
|
|
||||||
|
"${mod}+Shift+1" =
|
||||||
|
"move container to workspace number 1";
|
||||||
|
"${mod}+Shift+2" =
|
||||||
|
"move container to workspace number 2";
|
||||||
|
"${mod}+Shift+3" =
|
||||||
|
"move container to workspace number 3";
|
||||||
|
"${mod}+Shift+4" =
|
||||||
|
"move container to workspace number 4";
|
||||||
|
"${mod}+Shift+5" =
|
||||||
|
"move container to workspace number 5";
|
||||||
|
"${mod}+Shift+6" =
|
||||||
|
"move container to workspace number 6";
|
||||||
|
"${mod}+Shift+7" =
|
||||||
|
"move container to workspace number 7";
|
||||||
|
"${mod}+Shift+8" =
|
||||||
|
"move container to workspace number 8";
|
||||||
|
"${mod}+Shift+9" =
|
||||||
|
"move container to workspace number 9";
|
||||||
|
|
||||||
|
"${mod}+Shift+minus" = "move scratchpad";
|
||||||
|
"${mod}+minus" = "scratchpad show";
|
||||||
|
|
||||||
|
"${mod}+Shift+c" = "reload";
|
||||||
|
"${mod}+Shift+p" = "restart";
|
||||||
|
|
||||||
|
"${mod}+Shift+f" = "exec --no-startup-id ~/.config/wofi/session.sh";
|
||||||
|
"${mod}+l" = "exec ${swaylockcmd}";
|
||||||
|
"${mod}+p" = "mode resize";
|
||||||
|
|
||||||
|
"${mod}+Print" = "exec grim -o $(swaymsg -t get_outputs | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name')";
|
||||||
|
"${mod}+Shift+Print" = "exec grim -o $(swaymsg -t get_outputs | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name') - | ${pkgs.wl-clipboard}/bin/wl-copy -t \"image/png\" -f";
|
||||||
|
"${mod}+Shift+Ctrl+Print" = "exec grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | ${pkgs.wl-clipboard}/bin/wl-copy -t \"image/png\" -f";
|
||||||
|
"${mod}+Shift+Alt+Print" = "exec grim -g \"$(${pkgs.slurp}/bin/slurp)\"";
|
||||||
|
|
||||||
|
"XF86AudioRaiseVolume" = "exec ${pkgs.pamedia}/bin/pamedia up";
|
||||||
|
"XF86AudioLowerVolume" = "exec ${pkgs.pamedia}/bin/pamedia down";
|
||||||
|
"XF86AudioMute" = "exec ${pkgs.pamedia}/bin/pamedia mute";
|
||||||
|
"XF86Calculator" = "exec ${pkgs.gnome.gnome-calculator}/bin/gnome-calculator";
|
||||||
|
};
|
||||||
|
|
||||||
|
terminal = "${pkgs.alacritty}/bin/alacritty";
|
||||||
|
|
||||||
|
window = {
|
||||||
|
border = 1;
|
||||||
|
titlebar = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
workspaceAutoBackAndForth = true;
|
||||||
|
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
assign [app_id="firefox"] 1
|
||||||
|
assign [app_id="Alacritty"] 2
|
||||||
|
assign [app_id="Code"] 3
|
||||||
|
assign [app_id="telegramdesktop"] 10
|
||||||
|
assign [app_id="Signal"] 10
|
||||||
|
|
||||||
|
for_window [app_id="^.*"] inhibit_idle fullscreen
|
||||||
|
for_window [class="^.*"] inhibit_idle fullscreen
|
||||||
|
for_window [app_id="gnome-calculator"] floating enable
|
||||||
|
|
||||||
|
exec --no-startup-id ${pkgs.networkmanagerapplet}/bin/nm-applet --indicator
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
366
home-manager/modules/waybar/default.nix
Normal file
366
home-manager/modules/waybar/default.nix
Normal file
|
@ -0,0 +1,366 @@
|
||||||
|
{ lib, pkgs, config, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.eboskma.programs.waybar;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.eboskma.programs.waybar.enable = mkEnableOption "Enable waybar";
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
programs.waybar = {
|
||||||
|
enable = true;
|
||||||
|
settings = [
|
||||||
|
{
|
||||||
|
layer = "top";
|
||||||
|
position = "top";
|
||||||
|
height = 30;
|
||||||
|
|
||||||
|
modules-left = [
|
||||||
|
"sway/workspaces"
|
||||||
|
"sway/mode"
|
||||||
|
# "custom/now_playing"
|
||||||
|
];
|
||||||
|
modules-center = [
|
||||||
|
"sway/window"
|
||||||
|
];
|
||||||
|
modules-right = [
|
||||||
|
"network"
|
||||||
|
"memory"
|
||||||
|
"cpu"
|
||||||
|
"temperature"
|
||||||
|
"custom/keyboard-layout"
|
||||||
|
"pulseaudio"
|
||||||
|
"tray"
|
||||||
|
"clock#date"
|
||||||
|
"clock#time"
|
||||||
|
"idle_inhibitor"
|
||||||
|
];
|
||||||
|
modules = {
|
||||||
|
"clock#time" = {
|
||||||
|
interval = 1;
|
||||||
|
format = "{:%H:%M:%S}";
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"clock#date" = {
|
||||||
|
interval = 10;
|
||||||
|
format = " {:%e %b %Y}";
|
||||||
|
tooltip-format = "{:%e %B %Y}";
|
||||||
|
};
|
||||||
|
|
||||||
|
"cpu" = {
|
||||||
|
interval = 5;
|
||||||
|
format = " {usage}% ({load})";
|
||||||
|
states = {
|
||||||
|
warning = 70;
|
||||||
|
critical = 90;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"custom/keyboard-layout" = {
|
||||||
|
exec = "swaymsg -t get_inputs | grep -m1 'xkb_active_layout_name' | cut -d '\"' -f4";
|
||||||
|
interval = 30;
|
||||||
|
format = " {}"; # Icon: keyboard
|
||||||
|
# Signal sent by Sway key binding (~/.config/sway/key-bindings)
|
||||||
|
signal = 1; # SIGHUP
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
"memory" = {
|
||||||
|
interval = 5;
|
||||||
|
format = " {}%"; # Icon: memory
|
||||||
|
states = {
|
||||||
|
warning = 70;
|
||||||
|
critical = 90;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"network" = {
|
||||||
|
interval = 5;
|
||||||
|
format-wifi = "直 {essid} ({signalStrength}%)"; # Icon: wifi
|
||||||
|
format-ethernet = " {ifname}: {ipaddr}/{cidr}"; # Icon: ethernet
|
||||||
|
format-disconnected = "⚠ Disconnected";
|
||||||
|
tooltip-format = "{ifname}: {ipaddr}";
|
||||||
|
};
|
||||||
|
|
||||||
|
"sway/mode" = {
|
||||||
|
format = "<span style=\"italic\"> {}</span>"; # Icon: expand-arrows-alt
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: package as nix thingy
|
||||||
|
# "custom/now_playing" = {
|
||||||
|
# exec = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY";
|
||||||
|
# format = " ♪ {}";
|
||||||
|
# interval = 2;
|
||||||
|
# on-click = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY play-pause";
|
||||||
|
# on-scroll-down = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY volume-up";
|
||||||
|
# on-scroll-up = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY volume-down";
|
||||||
|
# };
|
||||||
|
|
||||||
|
"sway/window" = {
|
||||||
|
format = "{}";
|
||||||
|
max-length = 120;
|
||||||
|
};
|
||||||
|
|
||||||
|
"sway/workspaces" = {
|
||||||
|
all-outputs = false;
|
||||||
|
disable-scroll = true;
|
||||||
|
format = "{icon} {name}";
|
||||||
|
format-icons = {
|
||||||
|
"1 =www" = "";
|
||||||
|
# Icon = firefox-browser
|
||||||
|
"2 =mail" = "";
|
||||||
|
# Icon = mail
|
||||||
|
"3 =editor" = "";
|
||||||
|
# Icon = code
|
||||||
|
"4 =terminals" = "";
|
||||||
|
# Icon = terminal
|
||||||
|
"5 =portal" = "";
|
||||||
|
# Icon = terminal
|
||||||
|
"urgent" = "";
|
||||||
|
"focused" = "";
|
||||||
|
"default" = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
"pulseaudio" = {
|
||||||
|
#scroll-step = 1;
|
||||||
|
format = "{icon} {volume}%";
|
||||||
|
format-bluetooth = "{icon} {volume}%";
|
||||||
|
format-muted = "婢";
|
||||||
|
format-icons = {
|
||||||
|
headphones = "";
|
||||||
|
handsfree = "";
|
||||||
|
headset = "";
|
||||||
|
phone = "";
|
||||||
|
portable = "";
|
||||||
|
car = "";
|
||||||
|
default = [ "奄" "奔" "墳" ];
|
||||||
|
};
|
||||||
|
on-click = "pavucontrol";
|
||||||
|
};
|
||||||
|
|
||||||
|
"temperature" = {
|
||||||
|
hwmon-path = "/sys/class/hwmon/hwmon2/temp1_input";
|
||||||
|
critical-threshold = 80;
|
||||||
|
interval = 5;
|
||||||
|
format = "{icon} {temperatureC}°C";
|
||||||
|
format-icons = [
|
||||||
|
"" # Icon = temperature-empty
|
||||||
|
"" # Icon = temperature-quarter
|
||||||
|
"" # Icon = temperature-half
|
||||||
|
"" # Icon = temperature-three-quarters
|
||||||
|
"" # Icon = temperature-full
|
||||||
|
];
|
||||||
|
tooltip = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"tray" = {
|
||||||
|
icon-size = 21;
|
||||||
|
spacing = 10;
|
||||||
|
};
|
||||||
|
"idle_inhibitor" = {
|
||||||
|
format = "<span size=\"large\">{icon}</span>";
|
||||||
|
format-icons = {
|
||||||
|
activated = "";
|
||||||
|
deactivated = "";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
style =
|
||||||
|
''
|
||||||
|
@keyframes blink-warning {
|
||||||
|
70% {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
color: white;
|
||||||
|
background-color: orange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes blink-critical {
|
||||||
|
70% {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
color: white;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
min-height: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#waybar {
|
||||||
|
background: #323232;
|
||||||
|
color: white;
|
||||||
|
font-family: "MesloLGM Nerd Font", sans-serif;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery,
|
||||||
|
#clock,
|
||||||
|
#cpu,
|
||||||
|
#custom-keyboard-layout,
|
||||||
|
#memory,
|
||||||
|
#mode,
|
||||||
|
#network,
|
||||||
|
#pulseaudio,
|
||||||
|
#temperature,
|
||||||
|
#tray,
|
||||||
|
#custom-now_playing,
|
||||||
|
#idle_inhibitor {
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery {
|
||||||
|
animation-timing-function: linear;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
animation-direction: alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.warning {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.critical {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.warning.discharging {
|
||||||
|
animation-name: blink-warning;
|
||||||
|
animation-duration: 3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.critical.discharging {
|
||||||
|
animation-name: blink-critical;
|
||||||
|
animation-duration: 2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#clock {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu {
|
||||||
|
/* No styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu.warning {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cpu.critical {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory {
|
||||||
|
animation-timing-function: linear;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
animation-direction: alternate;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory.warning {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
#memory.critical {
|
||||||
|
color: red;
|
||||||
|
animation-name: blink-critical;
|
||||||
|
animation-duration: 2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mode {
|
||||||
|
background: #64727D;
|
||||||
|
border-top: 2px solid white;
|
||||||
|
/* To compensate for the top border and still have vertical centering */
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#network {
|
||||||
|
/* No styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
#network.disconnected {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio {
|
||||||
|
/* No styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio.muted {
|
||||||
|
/* No styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-spotify {
|
||||||
|
color: rgb(102, 220, 105);
|
||||||
|
}
|
||||||
|
|
||||||
|
#temperature {
|
||||||
|
/* No styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
#temperature.critical {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tray {
|
||||||
|
/* No styles */
|
||||||
|
}
|
||||||
|
|
||||||
|
#window {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button {
|
||||||
|
border-top: 2px solid transparent;
|
||||||
|
/* To compensate for the top border and still have vertical centering */
|
||||||
|
padding-bottom: 2px;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
color: #888888;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.focused {
|
||||||
|
border-color: #4c7899;
|
||||||
|
color: white;
|
||||||
|
background-color: #285577;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.urgent {
|
||||||
|
border-color: #c9545d;
|
||||||
|
color: #c9545d;
|
||||||
|
}
|
||||||
|
|
||||||
|
#idle_inhibitor {
|
||||||
|
background-color: transparent;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#idle_inhibitor.activated {
|
||||||
|
background-color: #c9545d;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-now_playing {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
38
machines/vm1/configuration.nix
Normal file
38
machines/vm1/configuration.nix
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
{ self, ... }:
|
||||||
|
{
|
||||||
|
imports = [ ./hardware-configuration.nix ];
|
||||||
|
|
||||||
|
eboskma = {
|
||||||
|
desktop = {
|
||||||
|
enable = true;
|
||||||
|
home-manager = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "vm2";
|
||||||
|
useDHCP = false;
|
||||||
|
interfaces.enp1s.useDHCP = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# nix = {
|
||||||
|
# package = pkgs.nixUnstable;
|
||||||
|
# extraOptions = ''
|
||||||
|
# experimental-features = nix-command flakes
|
||||||
|
# '';
|
||||||
|
# };
|
||||||
|
|
||||||
|
services.openssh.enable = true;
|
||||||
|
# This value determines the NixOS release from which the default
|
||||||
|
# settings for stateful data, like file locations and database versions
|
||||||
|
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||||
|
# this value at the release version of the first install of this system.
|
||||||
|
# Before changing this value read the documentation for this option
|
||||||
|
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||||
|
system.stateVersion = "21.05"; # Did you read the comment?
|
||||||
|
}
|
32
machines/vm1/hardware-configuration.nix
Normal file
32
machines/vm1/hardware-configuration.nix
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{
|
||||||
|
device = "/dev/disk/by-label/nixos";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{
|
||||||
|
device = "/dev/disk/by-label/boot";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices =
|
||||||
|
[{ device = "/dev/disk/by-label/swap"; }];
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,13 @@
|
||||||
{ self, ... }:
|
{ self, ... }:
|
||||||
{
|
{
|
||||||
imports = [ ./hardware-configuration.nix ../../users/erwin.nix ];
|
imports = [ ./hardware-configuration.nix ];
|
||||||
|
|
||||||
|
eboskma = {
|
||||||
|
desktop = {
|
||||||
|
enable = true;
|
||||||
|
home-manager = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
boot.loader.systemd-boot.enable = true;
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
@ -8,17 +15,17 @@
|
||||||
time.timeZone = "Europe/Amsterdam";
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
hostname = "vm2";
|
hostName = "vm2";
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
interfaces.enp1s.useDHCP = true;
|
interfaces.enp1s.useDHCP = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
nix = {
|
# nix = {
|
||||||
package = pkgs.nixUnstable;
|
# package = pkgs.nixUnstable;
|
||||||
extraOptions = ''
|
# extraOptions = ''
|
||||||
experimental-features = nix-command flakes
|
# experimental-features = nix-command flakes
|
||||||
'';
|
# '';
|
||||||
};
|
# };
|
||||||
|
|
||||||
services.openssh.enable = true;
|
services.openssh.enable = true;
|
||||||
# This value determines the NixOS release from which the default
|
# This value determines the NixOS release from which the default
|
||||||
|
|
53
modules/desktop/default.nix
Normal file
53
modules/desktop/default.nix
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
{ lib, pkgs, config, inputs, self-overlay, ... }:
|
||||||
|
with lib;
|
||||||
|
let cfg = config.eboskma.desktop;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [ ../../users/erwin.nix ../../users/root.nix ];
|
||||||
|
|
||||||
|
options.eboskma.desktop = {
|
||||||
|
enable = mkEnableOption "Enable default desktop configuration";
|
||||||
|
home-manager = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
Enable home-manager for this desktop
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
home-manager.users.erwin = mkIf cfg.home-manager {
|
||||||
|
_module.args.flake-inputs = inputs;
|
||||||
|
|
||||||
|
programs.home-manager.enable = true;
|
||||||
|
programs.command-not-found.enable = true;
|
||||||
|
|
||||||
|
home.username = "erwin";
|
||||||
|
home.homeDirectory = "/home/erwin";
|
||||||
|
|
||||||
|
nixpkgs.config = { allowUnfree = true; };
|
||||||
|
services.gnome-keyring.enable = true;
|
||||||
|
|
||||||
|
home.stateVersion = "21.11";
|
||||||
|
|
||||||
|
eboskma = {
|
||||||
|
programs = {
|
||||||
|
sway.enable = true;
|
||||||
|
rofi.enable = true;
|
||||||
|
waybar.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
(nerdfonts.override { fonts = [ "CascadiaCode" "FantasqueSansMono" "FiraCode" "Iosevka" "JetBrainsMono" "Meslo" "Noto" "SourceCodePro" ]; })
|
||||||
|
];
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
../../home-manager/modules/sway
|
||||||
|
../../home-manager/modules/waybar
|
||||||
|
../../home-manager/modules/rofi
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
self: super: {
|
self: super: {
|
||||||
rofi-wayland = super.pkgs.callPackage ../pkgs/rofi-wayland { };
|
rofi = super.pkgs.callPackage ../pkgs/rofi-wayland { };
|
||||||
|
pamedia = super.pkgs.callPackage ../pkgs/pamedia { };
|
||||||
}
|
}
|
||||||
|
|
21
pkgs/pamedia/default.nix
Normal file
21
pkgs/pamedia/default.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ buildPythonPackage, lib, pulsectl }:
|
||||||
|
buildPythonPackage rec {
|
||||||
|
pname = "pamedia";
|
||||||
|
version = "0.1.0";
|
||||||
|
|
||||||
|
src = ./src;
|
||||||
|
|
||||||
|
propagatedBuildInputs = [
|
||||||
|
pulsectl
|
||||||
|
];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
install -d $out/bin
|
||||||
|
install -m 0755 $src/pamedia $out/bin/pamedia
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Change volume of the PulseAudio default sink";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
};
|
||||||
|
}
|
116
pkgs/pamedia/src/pamedia
Executable file
116
pkgs/pamedia/src/pamedia
Executable file
|
@ -0,0 +1,116 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import pulsectl
|
||||||
|
import gi
|
||||||
|
|
||||||
|
gi.require_version('Notify', '0.7')
|
||||||
|
|
||||||
|
from gi.repository import GLib
|
||||||
|
from gi.repository import Notify
|
||||||
|
|
||||||
|
|
||||||
|
class PAMedia:
|
||||||
|
def __init__(self, sink=None):
|
||||||
|
self.client = pulsectl.Pulse('volumectl')
|
||||||
|
sinks = self.client.sink_list()
|
||||||
|
|
||||||
|
if sink == None:
|
||||||
|
self.sink = self.client.get_sink_by_name(
|
||||||
|
self.client.server_info().default_sink_name)
|
||||||
|
else:
|
||||||
|
if sink > len(sinks):
|
||||||
|
notification = Notify.Notification.new(
|
||||||
|
'Volume', f'Unknown sink index \'{sink}\', using default sink')
|
||||||
|
notification.show()
|
||||||
|
self.sink = self.client.get_sink_by_name(
|
||||||
|
self.client.server_info().default_sink_name)
|
||||||
|
|
||||||
|
self.sink = sinks[sink]
|
||||||
|
|
||||||
|
def toggle_mute(self):
|
||||||
|
self.client.mute(self.sink, mute=not self.sink.mute)
|
||||||
|
|
||||||
|
def volume_up(self):
|
||||||
|
self.client.mute(self.sink, mute=False)
|
||||||
|
self.client.volume_change_all_chans(self.sink, 0.05)
|
||||||
|
|
||||||
|
def volume_down(self):
|
||||||
|
self.client.mute(self.sink, mute=False)
|
||||||
|
self.client.volume_change_all_chans(self.sink, -0.05)
|
||||||
|
|
||||||
|
def volume_set(self, new_volume):
|
||||||
|
new_volume = min(100, max(0, int(new_volume)))
|
||||||
|
self.client.volume_set_all_chans(self.sink, new_volume / 100.0)
|
||||||
|
|
||||||
|
def list_sinks(self):
|
||||||
|
for num, sink in enumerate(self.client.sink_list()):
|
||||||
|
print(f'[{num}] {sink.description}')
|
||||||
|
|
||||||
|
def icon(self):
|
||||||
|
if self.sink.mute:
|
||||||
|
return 'muted'
|
||||||
|
elif self.sink.volume.value_flat <= 0.3:
|
||||||
|
return 'low'
|
||||||
|
elif self.sink.volume.value_flat <= 0.7:
|
||||||
|
return 'medium'
|
||||||
|
else:
|
||||||
|
return 'high'
|
||||||
|
|
||||||
|
def notify(self):
|
||||||
|
icon = f'audio-volume-{self.icon()}'
|
||||||
|
title = f'Volume'
|
||||||
|
|
||||||
|
if self.sink.mute:
|
||||||
|
title = 'Muted'
|
||||||
|
|
||||||
|
notification = Notify.Notification.new(title, '', icon)
|
||||||
|
if not self.sink.mute:
|
||||||
|
notification.set_hint(
|
||||||
|
'x-canonical-private-synchronous', GLib.Variant.new_string('audio'))
|
||||||
|
notification.set_hint(
|
||||||
|
'value', GLib.Variant.new_int32(round(self.volume())))
|
||||||
|
|
||||||
|
notification.show()
|
||||||
|
|
||||||
|
def volume(self):
|
||||||
|
return self.sink.volume.value_flat * 100
|
||||||
|
|
||||||
|
def volume_format(self):
|
||||||
|
volume = round(self.volume())
|
||||||
|
|
||||||
|
return f'{volume}%'
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser(description='PulseAudio volume control')
|
||||||
|
parser.add_argument('-s', '--sink', type=int,
|
||||||
|
help='Select output sink to control')
|
||||||
|
parser.add_argument('command', metavar='CMD', type=str,
|
||||||
|
nargs='+', help='Command, one of: mute, up, down, set, get, sinks')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
ctl = PAMedia(sink=args.sink)
|
||||||
|
Notify.init('volumectl')
|
||||||
|
|
||||||
|
if args.command[0] == 'mute':
|
||||||
|
ctl.toggle_mute()
|
||||||
|
elif args.command[0] == 'up':
|
||||||
|
ctl.volume_up()
|
||||||
|
elif args.command[0] == 'down':
|
||||||
|
ctl.volume_down()
|
||||||
|
elif args.command[0] == 'get':
|
||||||
|
print(f'Volume: {ctl.volume_format()}')
|
||||||
|
exit(0)
|
||||||
|
elif args.command[0] == 'set' and len(args.command) >= 2:
|
||||||
|
ctl.volume_set(args.command[1])
|
||||||
|
elif args.command[0] == 'sinks':
|
||||||
|
ctl.list_sinks()
|
||||||
|
exit(0)
|
||||||
|
else:
|
||||||
|
print(f"Unknown command '{args.command}'")
|
||||||
|
parser.print_help()
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
ctl.notify()
|
|
@ -19,7 +19,7 @@ stdenv.mkDerivation rec {
|
||||||
'';
|
'';
|
||||||
|
|
||||||
nativeBuildInputs = [ meson ninja pkgconfig ];
|
nativeBuildInputs = [ meson ninja pkgconfig ];
|
||||||
buildInputs = [
|
buildInputs = with pkgs; [
|
||||||
libxkbcommon
|
libxkbcommon
|
||||||
pango
|
pango
|
||||||
cairo
|
cairo
|
||||||
|
@ -29,9 +29,9 @@ stdenv.mkDerivation rec {
|
||||||
librsvg
|
librsvg
|
||||||
check
|
check
|
||||||
libstartup_notification
|
libstartup_notification
|
||||||
libxcb
|
xorg.libxcb
|
||||||
xcbutil
|
xorg.xcbutil
|
||||||
xcbutilwm
|
xorg.xcbutilwm
|
||||||
xcbutilxrm
|
xcbutilxrm
|
||||||
which
|
which
|
||||||
wayland-protocols
|
wayland-protocols
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{ config, pkgs, lib, ... }:
|
{ pkgs, ... }:
|
||||||
{
|
{
|
||||||
users.users.erwin = {
|
users.users.erwin = {
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
home = "/home/erwin";
|
home = "/home/erwin";
|
||||||
exdraGroups = [ "wheel" "adm" "audio" "video" ];
|
extraGroups = [ "wheel" "adm" "audio" "video" ];
|
||||||
shell = pkgs.fish;
|
shell = pkgs.fish;
|
||||||
openssh.authorizedKeys.keyFiles = [
|
openssh.authorizedKeys.keyFiles = [
|
||||||
(pkgs.fetchurl {
|
(pkgs.fetchurl {
|
||||||
|
|
11
users/root.nix
Normal file
11
users/root.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
users.users.root = {
|
||||||
|
openssh.authorizedKeys.keyFiles = [
|
||||||
|
(pkgs.fetchurl {
|
||||||
|
url = "https://github.com/eboskma.keys";
|
||||||
|
sha256 = "1l7f425kvfmrs4dfcvllb76182jgb14l1silyy4qmjxvinawb1yj";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue