switch to niri
This commit is contained in:
parent
6e9959802b
commit
0a44a5d372
BIN
backgrounds/cherry-blossom.jpg
Normal file
BIN
backgrounds/cherry-blossom.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 MiB |
BIN
backgrounds/eta-soffa.jpg
Normal file
BIN
backgrounds/eta-soffa.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 MiB |
BIN
backgrounds/eta-tak.jpg
Normal file
BIN
backgrounds/eta-tak.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 MiB |
BIN
backgrounds/stenpiren.jpg
Normal file
BIN
backgrounds/stenpiren.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 MiB |
|
@ -39,9 +39,13 @@
|
||||||
url = "github:youwen5/signal-desktop-flake";
|
url = "github:youwen5/signal-desktop-flake";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
niri = {
|
||||||
|
url = "github:sodiboo/niri-flake";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = { self, nixpkgs, nixpkgs-unstable, home-manager, nix-darwin, kak, unispect, ansi-utils, unambig-path, nixos-apple-silicon, signal-aarch64 }:
|
outputs = { self, nixpkgs, nixpkgs-unstable, home-manager, nix-darwin, kak, unispect, ansi-utils, unambig-path, nixos-apple-silicon, signal-aarch64, niri }:
|
||||||
let
|
let
|
||||||
mkPkgs = system: import nixpkgs { system = system; config.allowUnfree = true; };
|
mkPkgs = system: import nixpkgs { system = system; config.allowUnfree = true; };
|
||||||
mkPkgsUnstable = system: import nixpkgs-unstable { system = system; config.allowUnfree = true; };
|
mkPkgsUnstable = system: import nixpkgs-unstable { system = system; config.allowUnfree = true; };
|
||||||
|
@ -177,7 +181,7 @@
|
||||||
use-iwd = false;
|
use-iwd = false;
|
||||||
};
|
};
|
||||||
graphical = mkNixOsGraphical {
|
graphical = mkNixOsGraphical {
|
||||||
inherit pkgs pkgs-unstable;
|
inherit pkgs pkgs-unstable niri;
|
||||||
background = "pan-wire-3.png";
|
background = "pan-wire-3.png";
|
||||||
use-display-manager = true;
|
use-display-manager = true;
|
||||||
};
|
};
|
||||||
|
@ -215,6 +219,7 @@
|
||||||
inherit system;
|
inherit system;
|
||||||
modules = [
|
modules = [
|
||||||
nixos-apple-silicon.nixosModules.apple-silicon-support
|
nixos-apple-silicon.nixosModules.apple-silicon-support
|
||||||
|
niri.nixosModules.niri
|
||||||
./nixos/machines/foxhut/hardware.nix
|
./nixos/machines/foxhut/hardware.nix
|
||||||
(import ./nixos/machines/foxhut/boot.nix { inherit pkgs pkgs-unstable asahi-firmware; })
|
(import ./nixos/machines/foxhut/boot.nix { inherit pkgs pkgs-unstable asahi-firmware; })
|
||||||
(import ./nixos/machines/foxhut/machine.nix { inherit pkgs pkgs-unstable asahi-firmware signal-aarch64; })
|
(import ./nixos/machines/foxhut/machine.nix { inherit pkgs pkgs-unstable asahi-firmware signal-aarch64; })
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{ pkgs }:
|
{ pkgs }:
|
||||||
|
{ config, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
alacritty = import ./alacritty/alacritty.nix pkgs;
|
alacritty = import ./alacritty/alacritty.nix pkgs;
|
||||||
|
@ -17,11 +18,42 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
XWAYLAND_DISPLAY = ":3";
|
||||||
|
|
||||||
|
x-wayland-clipboard-daemon = pkgs.writeShellApplication {
|
||||||
|
name = "x-wayland-clipboard-daemon";
|
||||||
|
runtimeInputs = [ pkgs.python313 pkgs.wl-clipboard pkgs.xclip ];
|
||||||
|
text = ''
|
||||||
|
python3 ${../x-wayland-clipboard-daemon/x-wayland-clipboard-daemon.py}
|
||||||
|
'';
|
||||||
|
};
|
||||||
in rec {
|
in rec {
|
||||||
home.packages = with pkgs; [
|
home.packages = with pkgs; [
|
||||||
fira-code ibm-plex
|
networkmanagerapplet # for tray icon
|
||||||
|
nerd-fonts.roboto-mono # specifically needed for waybar
|
||||||
|
noto-fonts fira-code ibm-plex
|
||||||
|
fontconfig
|
||||||
|
|
||||||
inkscape
|
inkscape
|
||||||
|
xwayland-satellite
|
||||||
|
pwvucontrol
|
||||||
|
swaybg
|
||||||
|
libnotify
|
||||||
|
blueberry
|
||||||
|
|
||||||
|
wl-clipboard xclip wev
|
||||||
|
|
||||||
|
quodlibet
|
||||||
|
xfce.thunar
|
||||||
|
puddletag
|
||||||
|
rawtherapee
|
||||||
|
brightnessctl
|
||||||
|
obs-studio
|
||||||
]
|
]
|
||||||
|
++ (with pkgs.kdePackages; [
|
||||||
|
gwenview okular
|
||||||
|
])
|
||||||
++ (if pkgs.stdenv.isDarwin then [alloy6-mac] else [pkgs.alloy6])
|
++ (if pkgs.stdenv.isDarwin then [alloy6-mac] else [pkgs.alloy6])
|
||||||
++ (if pkgs.stdenv.isDarwin then [] else [pkgs.keepassxc pkgs.vesktop pkgs.ares])
|
++ (if pkgs.stdenv.isDarwin then [] else [pkgs.keepassxc pkgs.vesktop pkgs.ares])
|
||||||
;
|
;
|
||||||
|
@ -36,4 +68,406 @@ in rec {
|
||||||
]);
|
]);
|
||||||
extraConfig = builtins.readFile ../dotfiles/init.el;
|
extraConfig = builtins.readFile ../dotfiles/init.el;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
home.pointerCursor =
|
||||||
|
let miku-cursor = pkgs.stdenv.mkDerivation {
|
||||||
|
name = "miku-cursor";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "supermariofps";
|
||||||
|
repo = "hatsune-miku-windows-linux-cursors";
|
||||||
|
tag = "1.2.6";
|
||||||
|
sha256 = "sha256-OQjjOc9VnxJ7tWNmpHIMzNWX6WsavAOkgPwK1XAMwtE=";
|
||||||
|
};
|
||||||
|
buildPhase = ''
|
||||||
|
mkdir -p $out/share/icons
|
||||||
|
cp -r $src/miku-cursor-linux $out/share/icons/miku-cursor
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
size = 96; # size gets overwritten by niri
|
||||||
|
package = miku-cursor;
|
||||||
|
name = "miku-cursor";
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.portal = {
|
||||||
|
enable = true;
|
||||||
|
extraPortals = [
|
||||||
|
pkgs.xdg-desktop-portal-gnome
|
||||||
|
];
|
||||||
|
config.common.default = [ "gnome" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.niri.settings = {
|
||||||
|
debug.render-drm-device = "/dev/dri/renderD128";
|
||||||
|
input.keyboard = {
|
||||||
|
xkb = {
|
||||||
|
layout = "fox";
|
||||||
|
options = "caps:escape";
|
||||||
|
};
|
||||||
|
repeat-delay = 160;
|
||||||
|
repeat-rate = 30;
|
||||||
|
};
|
||||||
|
input.touchpad = {
|
||||||
|
tap = false;
|
||||||
|
click-method = "button-areas";
|
||||||
|
|
||||||
|
natural-scroll = false;
|
||||||
|
accel-speed = -0.1;
|
||||||
|
scroll-factor = 0.5;
|
||||||
|
};
|
||||||
|
input.mouse = {
|
||||||
|
accel-speed = -0.6;
|
||||||
|
};
|
||||||
|
outputs."eDP-1" = {
|
||||||
|
scale = 1.0;
|
||||||
|
};
|
||||||
|
binds = with config.lib.niri.actions; {
|
||||||
|
# common programs
|
||||||
|
"Mod+Shift+T" = { hotkey-overlay.title = "run alacritty"; action = spawn "alacritty"; };
|
||||||
|
"Mod+Shift+F" = { hotkey-overlay.title = "run thunar"; action = spawn "thunar"; };
|
||||||
|
"Mod+Shift+I" = { hotkey-overlay.title = "run firefox"; action = spawn "firefox"; };
|
||||||
|
"Mod+Shift+K" = { hotkey-overlay.title = "run keepass"; action = spawn "keepassxc"; };
|
||||||
|
|
||||||
|
"Mod+Space" = { hotkey-overlay.title = "rofi launcher"; action = spawn "rofi" "-modes" "drun" "-show" "drun"; };
|
||||||
|
"Mod+E" = { hotkey-overlay.title = "niri msg"; action = spawn "sh" "${./niri-action.sh}"; };
|
||||||
|
"Mod+Tab" = { hotkey-overlay.title = "focus last window"; action = focus-window-previous; };
|
||||||
|
|
||||||
|
"Mod+Comma" = { hotkey-overlay.title = "show these hotkeys"; action = show-hotkey-overlay; };
|
||||||
|
"Mod+Escape" = { hotkey-overlay.title = "quit niri"; action = quit; };
|
||||||
|
"Mod+Q" = { hotkey-overlay.title = "close window"; action = close-window; };
|
||||||
|
"Mod+F" = { hotkey-overlay.title = "switch width"; action = switch-preset-column-width; };
|
||||||
|
"Mod+T" = { hotkey-overlay.title = "switch to tabbed view"; action = toggle-column-tabbed-display; };
|
||||||
|
"Mod+Down" = { hotkey-overlay.title = "next tab"; action = focus-window-down; };
|
||||||
|
"Mod+Up" = { hotkey-overlay.title = "previous tab"; action = focus-window-up; };
|
||||||
|
"Mod+Shift+3" = { hotkey-overlay.title = "screenshot"; action = screenshot-screen { write-to-disk = false; }; };
|
||||||
|
"Mod+Shift+4" = { hotkey-overlay.title = "screenshot region"; action = screenshot; };
|
||||||
|
"Mod+Shift+5" = { hotkey-overlay.title = "screenshot window"; action = screenshot-window { write-to-disk = false; }; };
|
||||||
|
|
||||||
|
"Mod+TouchpadScrollRight" = { hotkey-overlay.title = "expand window"; action = set-window-width "+10"; };
|
||||||
|
"Mod+TouchpadScrollLeft" = { hotkey-overlay.title = "shrink window"; action = set-window-width "-10"; };
|
||||||
|
"Mod+TouchpadScrollUp" = { hotkey-overlay.title = "expand window"; action = set-window-height "+10"; };
|
||||||
|
"Mod+TouchpadScrollDown" = { hotkey-overlay.title = "shrink window"; action = set-window-height "-10"; };
|
||||||
|
|
||||||
|
"MouseForward" = { hotkey-overlay.title = "next column"; action = focus-column-right; };
|
||||||
|
"MouseBack" = { hotkey-overlay.title = "previous column"; action = focus-column-left; };
|
||||||
|
"Mod+MouseForward" = { hotkey-overlay.title = "next workspace"; action = focus-workspace-down; };
|
||||||
|
"Mod+MouseBack" = { hotkey-overlay.title = "previous workspace"; action = focus-workspace-up; };
|
||||||
|
};
|
||||||
|
switch-events = with config.lib.niri.actions; {
|
||||||
|
"lid-close" = { action = spawn "sh" "-c" "niri msg action do-screen-transition && swaylock"; };
|
||||||
|
};
|
||||||
|
|
||||||
|
spawn-at-startup = [
|
||||||
|
{ command = [ "${pkgs.xwayland-satellite}/bin/xwayland-satellite" XWAYLAND_DISPLAY ]; }
|
||||||
|
{ command = [ "${pkgs.swaybg}/bin/swaybg" "--image" "${../backgrounds/eta-tak.jpg}" ]; }
|
||||||
|
{ command = [ "${x-wayland-clipboard-daemon}" ]; }
|
||||||
|
{ command = [ "${pkgs.dbus}/bin/dbus-update-activation-environment" "--systemd" "WAYLAND_DISPLAY" "XDG_CURRENT_DESKTOP" ]; }
|
||||||
|
];
|
||||||
|
environment.DISPLAY = XWAYLAND_DISPLAY;
|
||||||
|
|
||||||
|
window-rules = [
|
||||||
|
{
|
||||||
|
draw-border-with-background = false;
|
||||||
|
geometry-corner-radius =
|
||||||
|
let rad = 15.0;
|
||||||
|
in { bottom-left = rad; bottom-right = rad; top-right = rad; top-left = rad; };
|
||||||
|
clip-to-geometry = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
excludes = [
|
||||||
|
{ app-id = "^org.kde.gwenview$"; }
|
||||||
|
{ app-id = ''^Gimp-\d+\.\d+$''; }
|
||||||
|
{ title = '' - YouTube — Mozilla Firefox$''; }
|
||||||
|
{ app-id = ''^blender$''; }
|
||||||
|
{ app-id = ''^rawtherapee$''; }
|
||||||
|
];
|
||||||
|
opacity = 0.95;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
matches = [ { app-id = "om.saivert.pwvucontrol"; } ];
|
||||||
|
open-floating = true;
|
||||||
|
default-window-height.proportion = 0.2;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
matches = [ { app-id = "blueberry.py"; } ];
|
||||||
|
open-floating = true;
|
||||||
|
}
|
||||||
|
{ # kicad pop-ups
|
||||||
|
matches = [
|
||||||
|
{ title = ''^Choose (Footprint|Symbol|Power Symbol) ''; } # add menus
|
||||||
|
{ title = ''^Edit \w+ Field$''; }
|
||||||
|
{ title = ''^(\w|\s)+ Properties$''; }
|
||||||
|
];
|
||||||
|
open-floating = true;
|
||||||
|
default-window-height.fixed = 400;
|
||||||
|
}
|
||||||
|
{ # gimp pop-ups
|
||||||
|
matches = [
|
||||||
|
{ app-id = ''^Gimp-\d+\.\d+$''; }
|
||||||
|
];
|
||||||
|
excludes = [ # exclude the main window
|
||||||
|
{ title = ''– GIMP$''; }
|
||||||
|
{ title = ''^GNU Image Manipulation Program$''; }
|
||||||
|
];
|
||||||
|
open-floating = true;
|
||||||
|
default-window-height.fixed = 400;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
cursor.size = 48;
|
||||||
|
|
||||||
|
prefer-no-csd = true;
|
||||||
|
|
||||||
|
layout = {
|
||||||
|
empty-workspace-above-first = true;
|
||||||
|
|
||||||
|
preset-column-widths = [
|
||||||
|
{ proportion = 2.0 / 3.0; }
|
||||||
|
{ proportion = 1.0 / 3.0; }
|
||||||
|
{ proportion = 1.0; }
|
||||||
|
];
|
||||||
|
tab-indicator = {
|
||||||
|
place-within-column = true;
|
||||||
|
width = 8;
|
||||||
|
gap = 10;
|
||||||
|
corner-radius = 5;
|
||||||
|
gaps-between-tabs = 5;
|
||||||
|
length.total-proportion = 1.0;
|
||||||
|
active.gradient = {
|
||||||
|
from = "red";
|
||||||
|
to = "yellow";
|
||||||
|
angle = 0;
|
||||||
|
"in'" = "oklch longer hue";
|
||||||
|
relative-to = "workspace-view";
|
||||||
|
};
|
||||||
|
inactive.gradient = {
|
||||||
|
from = "#222";
|
||||||
|
to = "#666";
|
||||||
|
angle = 0;
|
||||||
|
"in'" = "oklch longer hue";
|
||||||
|
relative-to = "workspace-view";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
focus-ring = {
|
||||||
|
enable = true;
|
||||||
|
width = 5;
|
||||||
|
active.gradient = {
|
||||||
|
# from = "#a9fff5";
|
||||||
|
# to = "#ffb185";
|
||||||
|
from = "#83c6be";
|
||||||
|
to = "#a87458";
|
||||||
|
angle = 30;
|
||||||
|
"in'" = "oklch longer hue";
|
||||||
|
relative-to = "workspace-view";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
shadow = {
|
||||||
|
enable = true;
|
||||||
|
color = "#00000070";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.waybar = {
|
||||||
|
enable = true;
|
||||||
|
systemd = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
settings.mainBar = {
|
||||||
|
height = 40;
|
||||||
|
spacing = 20;
|
||||||
|
|
||||||
|
layer = "top";
|
||||||
|
modules-left = [
|
||||||
|
"tray"
|
||||||
|
];
|
||||||
|
modules-center = [
|
||||||
|
"niri/window"
|
||||||
|
];
|
||||||
|
modules-right = [
|
||||||
|
"pulseaudio" "pulseaudio/slider"
|
||||||
|
"network"
|
||||||
|
"bluetooth"
|
||||||
|
"power-profiles-daemon"
|
||||||
|
"temperature"
|
||||||
|
"battery"
|
||||||
|
"clock"
|
||||||
|
];
|
||||||
|
"niri/window" = {
|
||||||
|
icon = true;
|
||||||
|
icon-size = 24;
|
||||||
|
rewrite = {
|
||||||
|
"(.*) (:?— Mozilla (Firefox|Thunderbird)|- Quod Libet)" = "$1"; # remove some titles
|
||||||
|
"• Discord \\| ([^|]*) \\| (.*)" = "$2 ⟩ $1"; # discord formats things as Discord | Channel | Server
|
||||||
|
"• Discord \\| ([^|]*)" = "$1"; # sometimes there's no server to show
|
||||||
|
# pinged versions
|
||||||
|
"\\((\\d+)\\) Discord \\| ([^|]*) \\| (.*)" = "$3 ⟩ $2 ($1)";
|
||||||
|
"\\((\\d+)\\) Discord \\| ([^|]*)" = "$2 ($1)";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pulseaudio = {
|
||||||
|
format = "{icon}";
|
||||||
|
format-alt = "{volume} {icon}";
|
||||||
|
format-alt-click = "click-right";
|
||||||
|
format-muted = "🔇";
|
||||||
|
format-icons = {
|
||||||
|
default = ["" "" ""];
|
||||||
|
};
|
||||||
|
scroll-step = 10;
|
||||||
|
on-click = "pwvucontrol";
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
network = {
|
||||||
|
format = "{icon}";
|
||||||
|
format-alt = "{ipaddr}/{cidr} {icon}";
|
||||||
|
format-alt-click = "click-right";
|
||||||
|
format-icons = {
|
||||||
|
wifi = [" "];
|
||||||
|
ethernet = [""];
|
||||||
|
};
|
||||||
|
on-click = "alacritty -e nmtui";
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
bluetooth = {
|
||||||
|
on-click = "blueberry";
|
||||||
|
format = "";
|
||||||
|
};
|
||||||
|
clock = {
|
||||||
|
format = "{:%a %d %b %H:%M}";
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
battery = {
|
||||||
|
format = "{capacity}% {icon}";
|
||||||
|
format-alt = "{time} {icon}";
|
||||||
|
format-icons = ["" "" "" "" ""];
|
||||||
|
format-charging = "{capacity}% ";
|
||||||
|
interval = 30;
|
||||||
|
states = {
|
||||||
|
warning = 25;
|
||||||
|
critical = 1;
|
||||||
|
};
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
tray = {
|
||||||
|
icon-size = 24;
|
||||||
|
spacing = 10;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
style = ''
|
||||||
|
window {
|
||||||
|
color: rgba(35, 31, 32, 1);
|
||||||
|
background: rgba(197, 196, 196, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.modules-left {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
.modules-right {
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pulseaudio-slider {
|
||||||
|
min-width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* don't show the grabbable thing in the slider */
|
||||||
|
#pulseaudio-slider slider {
|
||||||
|
min-height: 0px;
|
||||||
|
min-width: 0px;
|
||||||
|
opacity: 0;
|
||||||
|
background-image: none;
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
#pulseaudio-slider trough {
|
||||||
|
min-height: 15px;
|
||||||
|
min-width: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: rgba(35, 31, 32, 1);
|
||||||
|
}
|
||||||
|
#pulseaudio-slider highlight {
|
||||||
|
min-width: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: rgba(247, 246, 246, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
font-family: Roboto Mono;
|
||||||
|
font-size: 20px;
|
||||||
|
box-shadow: none;
|
||||||
|
text-shadow: none;
|
||||||
|
transition-duration: 0s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* battery icon gets cut off otherwise for some reason */
|
||||||
|
#battery {
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.warning {
|
||||||
|
color: rgba(255, 210, 4, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#battery.critical {
|
||||||
|
color: rgba(238, 46, 36, 1);
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.rofi = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.rofi-wayland;
|
||||||
|
theme = "${./rofi-theme.rasi}";
|
||||||
|
extraConfig = {
|
||||||
|
matching = "fuzzy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mako = {
|
||||||
|
enable = true;
|
||||||
|
backgroundColor = "#23201fda";
|
||||||
|
borderColor = "#0f0c0aff";
|
||||||
|
borderRadius = 10;
|
||||||
|
borderSize = 2;
|
||||||
|
margin = "30";
|
||||||
|
font = "Manrope 16";
|
||||||
|
width = 600;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.swaylock = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.swaylock-effects;
|
||||||
|
settings = {
|
||||||
|
# screenshot = true;
|
||||||
|
image = "${../backgrounds/eta-tak.jpg}";
|
||||||
|
effect-blur = "20x3";
|
||||||
|
effect-vignette = "0.4:0.2";
|
||||||
|
fade-in = 0.5;
|
||||||
|
|
||||||
|
indicator = true;
|
||||||
|
indicator-radius = 400;
|
||||||
|
indicator-image = "${../images/profile-picture.png}";
|
||||||
|
ring-color = "22222280";
|
||||||
|
key-hl-color = "ee44ee80";
|
||||||
|
line-color = "00000020";
|
||||||
|
inside-color = "00000000";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: make this work
|
||||||
|
# systemd.user.services.x-wayland-clipboard-daemon =
|
||||||
|
# {
|
||||||
|
# Unit = {
|
||||||
|
# After = "graphical-session.target";
|
||||||
|
# };
|
||||||
|
# Service = {
|
||||||
|
# ExecStart = "${x-wayland-clipboard-daemon}/bin/x-wayland-clipboard-daemon";
|
||||||
|
# Restart = "on-failure";
|
||||||
|
# Environment = [ "DISPLAY=${XWAYLAND_DISPLAY}" ];
|
||||||
|
# };
|
||||||
|
# };
|
||||||
}
|
}
|
||||||
|
|
133
home/niri-action.sh
Normal file
133
home/niri-action.sh
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# from niri msg action help
|
||||||
|
NIRI_ACTIONS=$(cat <<EOF
|
||||||
|
quit
|
||||||
|
power-off-monitors
|
||||||
|
power-on-monitors
|
||||||
|
spawn
|
||||||
|
do-screen-transition
|
||||||
|
screenshot
|
||||||
|
screenshot-screen
|
||||||
|
screenshot-window
|
||||||
|
close-window
|
||||||
|
fullscreen-window
|
||||||
|
focus-window
|
||||||
|
focus-window-in-column
|
||||||
|
focus-window-previous
|
||||||
|
focus-column-left
|
||||||
|
focus-column-right
|
||||||
|
focus-column-first
|
||||||
|
focus-column-last
|
||||||
|
focus-column-right-or-first
|
||||||
|
focus-column-left-or-last
|
||||||
|
focus-window-or-monitor-up
|
||||||
|
focus-window-or-monitor-down
|
||||||
|
focus-column-or-monitor-left
|
||||||
|
focus-column-or-monitor-right
|
||||||
|
focus-window-down
|
||||||
|
focus-window-up
|
||||||
|
focus-window-down-or-column-left
|
||||||
|
focus-window-down-or-column-right
|
||||||
|
focus-window-up-or-column-left
|
||||||
|
focus-window-up-or-column-right
|
||||||
|
focus-window-or-workspace-down
|
||||||
|
focus-window-or-workspace-up
|
||||||
|
focus-window-top
|
||||||
|
focus-window-bottom
|
||||||
|
focus-window-down-or-top
|
||||||
|
focus-window-up-or-bottom
|
||||||
|
move-column-left
|
||||||
|
move-column-right
|
||||||
|
move-column-to-first
|
||||||
|
move-column-to-last
|
||||||
|
move-column-left-or-to-monitor-left
|
||||||
|
move-column-right-or-to-monitor-right
|
||||||
|
move-window-down
|
||||||
|
move-window-up
|
||||||
|
move-window-down-or-to-workspace-down
|
||||||
|
move-window-up-or-to-workspace-up
|
||||||
|
consume-or-expel-window-left
|
||||||
|
consume-or-expel-window-right
|
||||||
|
consume-window-into-column
|
||||||
|
expel-window-from-column
|
||||||
|
swap-window-right
|
||||||
|
swap-window-left
|
||||||
|
toggle-column-tabbed-display
|
||||||
|
set-column-display
|
||||||
|
center-column
|
||||||
|
center-window
|
||||||
|
focus-workspace-down
|
||||||
|
focus-workspace-up
|
||||||
|
focus-workspace
|
||||||
|
focus-workspace-previous
|
||||||
|
move-window-to-workspace-down
|
||||||
|
move-window-to-workspace-up
|
||||||
|
move-window-to-workspace
|
||||||
|
move-column-to-workspace-down
|
||||||
|
move-column-to-workspace-up
|
||||||
|
move-column-to-workspace
|
||||||
|
move-workspace-down
|
||||||
|
move-workspace-up
|
||||||
|
move-workspace-to-index
|
||||||
|
set-workspace-name
|
||||||
|
unset-workspace-name
|
||||||
|
focus-monitor-left
|
||||||
|
focus-monitor-right
|
||||||
|
focus-monitor-down
|
||||||
|
focus-monitor-up
|
||||||
|
focus-monitor-previous
|
||||||
|
focus-monitor-next
|
||||||
|
move-window-to-monitor-left
|
||||||
|
move-window-to-monitor-right
|
||||||
|
move-window-to-monitor-down
|
||||||
|
move-window-to-monitor-up
|
||||||
|
move-window-to-monitor-previous
|
||||||
|
move-window-to-monitor-next
|
||||||
|
move-column-to-monitor-left
|
||||||
|
move-column-to-monitor-right
|
||||||
|
move-column-to-monitor-down
|
||||||
|
move-column-to-monitor-up
|
||||||
|
move-column-to-monitor-previous
|
||||||
|
move-column-to-monitor-next
|
||||||
|
set-window-width
|
||||||
|
set-window-height
|
||||||
|
reset-window-height
|
||||||
|
switch-preset-column-width
|
||||||
|
switch-preset-window-width
|
||||||
|
switch-preset-window-height
|
||||||
|
maximize-column
|
||||||
|
set-column-width
|
||||||
|
expand-column-to-available-width
|
||||||
|
switch-layout
|
||||||
|
show-hotkey-overlay
|
||||||
|
move-workspace-to-monitor-left
|
||||||
|
move-workspace-to-monitor-right
|
||||||
|
move-workspace-to-monitor-down
|
||||||
|
move-workspace-to-monitor-up
|
||||||
|
move-workspace-to-monitor-previous
|
||||||
|
move-workspace-to-monitor-next
|
||||||
|
move-workspace-to-monitor
|
||||||
|
toggle-debug-tint
|
||||||
|
debug-toggle-opaque-regions
|
||||||
|
debug-toggle-damage
|
||||||
|
toggle-window-floating
|
||||||
|
move-window-to-floating
|
||||||
|
move-window-to-tiling
|
||||||
|
focus-floating
|
||||||
|
focus-tiling
|
||||||
|
switch-focus-between-floating-and-tiling
|
||||||
|
move-floating-window
|
||||||
|
toggle-window-rule-opacity
|
||||||
|
help
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
CHOICE=$(echo -n "$NIRI_ACTIONS" | rofi -dmenu -p "niri msg" -markup-rows -sort -sorting-method levenshtein)
|
||||||
|
if [ $? -ne 0 ] ; then
|
||||||
|
echo "No choice selected. Exiting"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
CHOICE=$(echo "$CHOICE" | cut -d" " -f1) # first word only
|
||||||
|
niri msg action "$CHOICE"
|
110
home/rofi-theme.rasi
Normal file
110
home/rofi-theme.rasi
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
/* modified by meeeeeee :3 */
|
||||||
|
/* from https://github.com/newmanls/rofi-themes-collection/blob/master/themes/rounded-blue-dark.rasi */
|
||||||
|
|
||||||
|
/* ROUNDED THEME FOR ROFI */
|
||||||
|
/* Author: Newman Sanchez (https://github.com/newmanls) */
|
||||||
|
|
||||||
|
* {
|
||||||
|
font: "Manrope 18";
|
||||||
|
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @fg0;
|
||||||
|
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
spacing: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
window {
|
||||||
|
location: north;
|
||||||
|
y-offset: calc(50% - 176px);
|
||||||
|
width: 800;
|
||||||
|
border-radius: 24px;
|
||||||
|
|
||||||
|
background-color: @bg0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mainbox {
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
inputbar {
|
||||||
|
background-color: @bg1;
|
||||||
|
border-color: @bg3;
|
||||||
|
|
||||||
|
border: 2px;
|
||||||
|
border-radius: 16px;
|
||||||
|
|
||||||
|
padding: 8px 16px;
|
||||||
|
spacing: 16px;
|
||||||
|
children: [ prompt, entry ];
|
||||||
|
}
|
||||||
|
|
||||||
|
prompt {
|
||||||
|
text-color: @fg2;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry {
|
||||||
|
placeholder: "Search";
|
||||||
|
placeholder-color: @fg3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message {
|
||||||
|
margin: 12px 0 0;
|
||||||
|
border-radius: 16px;
|
||||||
|
border-color: @bg2;
|
||||||
|
background-color: @bg2;
|
||||||
|
}
|
||||||
|
|
||||||
|
textbox {
|
||||||
|
padding: 8px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
listview {
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
margin: 12px 0 0;
|
||||||
|
lines: 8;
|
||||||
|
columns: 1;
|
||||||
|
|
||||||
|
fixed-height: false;
|
||||||
|
}
|
||||||
|
|
||||||
|
element {
|
||||||
|
padding: 8px 16px;
|
||||||
|
spacing: 8px;
|
||||||
|
border-radius: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
element normal active {
|
||||||
|
text-color: @bg3;
|
||||||
|
}
|
||||||
|
|
||||||
|
element alternate active {
|
||||||
|
text-color: @bg3;
|
||||||
|
}
|
||||||
|
|
||||||
|
element selected normal, element selected active {
|
||||||
|
background-color: @bg3;
|
||||||
|
}
|
||||||
|
|
||||||
|
element-icon {
|
||||||
|
size: 1em;
|
||||||
|
vertical-align: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
element-text {
|
||||||
|
text-color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
* {
|
||||||
|
bg0: #212121F2;
|
||||||
|
bg1: #2A2A2A;
|
||||||
|
bg2: #3D3D3D80;
|
||||||
|
bg3: #1A73E8F2;
|
||||||
|
fg0: #E6E6E6;
|
||||||
|
fg1: #FFFFFF;
|
||||||
|
fg2: #969696;
|
||||||
|
fg3: #3D3D3D;
|
||||||
|
}
|
BIN
images/profile-picture.png
Normal file
BIN
images/profile-picture.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 814 KiB |
|
@ -70,8 +70,12 @@
|
||||||
|
|
||||||
home-manager
|
home-manager
|
||||||
git # for home-manager
|
git # for home-manager
|
||||||
|
iperf3 edir
|
||||||
];
|
];
|
||||||
|
|
||||||
|
environment.pathsToLink = [ "/share/xdg-desktop-portal" "/share/applications" ];
|
||||||
|
|
||||||
|
|
||||||
programs.zsh.enable = true;
|
programs.zsh.enable = true;
|
||||||
programs.java = { enable = true; package = pkgs.jdk11; };
|
programs.java = { enable = true; package = pkgs.jdk11; };
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
pkgs-unstable,
|
pkgs-unstable,
|
||||||
background-image ? "pan-wire-3.png",
|
background-image ? "pan-wire-3.png",
|
||||||
use-display-manager,
|
use-display-manager,
|
||||||
|
niri,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
let start-plasma-shortcut = pkgs.writeScriptBin "desktop" ''
|
let start-plasma-shortcut = pkgs.writeScriptBin "desktop" ''
|
||||||
|
@ -57,10 +58,14 @@ let start-plasma-shortcut = pkgs.writeScriptBin "desktop" ''
|
||||||
# });
|
# });
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
nixpkgs.overlays = [ niri.overlays.niri ];
|
||||||
|
|
||||||
|
programs.niri.enable = true;
|
||||||
|
|
||||||
services.xserver = {
|
services.xserver = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
displayManager.lightdm.enable = use-display-manager;
|
displayManager.lightdm.enable = true;
|
||||||
|
|
||||||
xkb = {
|
xkb = {
|
||||||
layout = "fox";
|
layout = "fox";
|
||||||
|
@ -74,8 +79,8 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
services.desktopManager.plasma6.enable = true;
|
# services.desktopManager.plasma6.enable = true;
|
||||||
services.displayManager.defaultSession = "plasma";
|
services.displayManager.defaultSession = "niri";
|
||||||
|
|
||||||
services.mullvad-vpn.enable = true;
|
services.mullvad-vpn.enable = true;
|
||||||
|
|
||||||
|
@ -96,7 +101,7 @@ in
|
||||||
|
|
||||||
users.users.xenia = {
|
users.users.xenia = {
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
extraGroups = [ "wheel" "docker" "dialout" "input" ];
|
extraGroups = [ "wheel" "docker" "dialout" "input" "plugdev" ];
|
||||||
shell = pkgs.zsh;
|
shell = pkgs.zsh;
|
||||||
uid = 1002;
|
uid = 1002;
|
||||||
};
|
};
|
||||||
|
@ -106,7 +111,6 @@ in
|
||||||
|
|
||||||
thunderbird
|
thunderbird
|
||||||
glxinfo
|
glxinfo
|
||||||
start-plasma-shortcut
|
|
||||||
remmina
|
remmina
|
||||||
libreoffice
|
libreoffice
|
||||||
kicad-patch
|
kicad-patch
|
||||||
|
|
355
nixos/kblayouts/fox-compose.xcompose
Normal file
355
nixos/kblayouts/fox-compose.xcompose
Normal file
|
@ -0,0 +1,355 @@
|
||||||
|
# https://github.com/useronym/dotfiles/blob/master/.XCompose
|
||||||
|
|
||||||
|
<Multi_key> <c> <a> <t> <space> : "🐱 "
|
||||||
|
<Multi_key> <c> <a> <t> <2> : "🐈"
|
||||||
|
<Multi_key> <p> <l> <space> : "🥺 "
|
||||||
|
<Multi_key> <p> <l> <e> <a> : "🥺"
|
||||||
|
<Multi_key> <p> <l> <e> <a> <d> <i> <n> <g> : "🥺"
|
||||||
|
<Multi_key> <f> <l> <space> : "😳 "
|
||||||
|
<Multi_key> <f> <l> <u> <s> <h> : "😳"
|
||||||
|
<Multi_key> <c> <r> <a> <b> : "🦀"
|
||||||
|
<Multi_key> <g> <e> <c> : "🦎"
|
||||||
|
<Multi_key> <a> <m> <o> <n> <g> <u> <s> : "ඩ"
|
||||||
|
<Multi_key> <e> <n> <b> <y> <space> : "⚥"
|
||||||
|
<Multi_key> <e> <n> <b> <y> <1> : "⚧"
|
||||||
|
<Multi_key> <e> <n> <b> <y> <2> : "☄"
|
||||||
|
<Multi_key> <e> <n> <b> <y> <3> : "☿"
|
||||||
|
<Multi_key> <d> <o> <t> : "·" # same as multi-cdot
|
||||||
|
<Multi_key> <b> <u> <l> <l> <e> <t> : "∙"
|
||||||
|
<Multi_key> <m> <u> <l> <t> <i> <o> <c> <u> <l> <a> <r> <o> : "ꙮ"
|
||||||
|
<Multi_key> <p> <l> <e> <a> <d> <p> <o> <i> <n> <t> : "🥺👉👈"
|
||||||
|
<Multi_key> <p> <o> <i> <n> <t> : "👉👈"
|
||||||
|
<Multi_key> <i> <n> <v> : "⁻¹"
|
||||||
|
|
||||||
|
# Supersripts and subscripts
|
||||||
|
<Multi_key> <asciicircum> <0> : "⁰"
|
||||||
|
<Multi_key> <asciicircum> <1> : "¹"
|
||||||
|
<Multi_key> <asciicircum> <2> : "²"
|
||||||
|
<Multi_key> <asciicircum> <3> : "³"
|
||||||
|
<Multi_key> <asciicircum> <4> : "⁴"
|
||||||
|
<Multi_key> <asciicircum> <5> : "⁵"
|
||||||
|
<Multi_key> <asciicircum> <6> : "⁶"
|
||||||
|
<Multi_key> <asciicircum> <7> : "⁷"
|
||||||
|
<Multi_key> <asciicircum> <8> : "⁸"
|
||||||
|
<Multi_key> <asciicircum> <9> : "⁹"
|
||||||
|
<Multi_key> <asciicircum> <a> : "ᵃ"
|
||||||
|
<Multi_key> <asciicircum> <b> : "ᵇ"
|
||||||
|
<Multi_key> <asciicircum> <c> : "ᶜ"
|
||||||
|
<Multi_key> <asciicircum> <d> : "ᵈ"
|
||||||
|
<Multi_key> <asciicircum> <e> : "ᵉ"
|
||||||
|
<Multi_key> <asciicircum> <f> : "ᶠ"
|
||||||
|
<Multi_key> <asciicircum> <g> : "ᵍ"
|
||||||
|
<Multi_key> <asciicircum> <h> : "ʰ"
|
||||||
|
<Multi_key> <asciicircum> <i> : "ⁱ"
|
||||||
|
<Multi_key> <asciicircum> <j> : "ʲ"
|
||||||
|
<Multi_key> <asciicircum> <k> : "ᵏ"
|
||||||
|
<Multi_key> <asciicircum> <l> : "ˡ"
|
||||||
|
<Multi_key> <asciicircum> <m> : "ᵐ"
|
||||||
|
<Multi_key> <asciicircum> <n> : "ⁿ"
|
||||||
|
<Multi_key> <asciicircum> <o> : "ᵒ"
|
||||||
|
<Multi_key> <asciicircum> <p> : "ᵖ"
|
||||||
|
<Multi_key> <asciicircum> <r> : "ʳ"
|
||||||
|
<Multi_key> <asciicircum> <s> : "ˢ"
|
||||||
|
<Multi_key> <asciicircum> <t> : "ᵗ"
|
||||||
|
<Multi_key> <asciicircum> <u> : "ᵘ"
|
||||||
|
<Multi_key> <asciicircum> <v> : "ᵛ"
|
||||||
|
<Multi_key> <asciicircum> <w> : "ʷ"
|
||||||
|
<Multi_key> <asciicircum> <x> : "ˣ"
|
||||||
|
<Multi_key> <asciicircum> <y> : "ʸ"
|
||||||
|
<Multi_key> <asciicircum> <z> : "ᶻ"
|
||||||
|
<Multi_key> <asciicircum> <plus> : "⁺"
|
||||||
|
<Multi_key> <asciicircum> <minus> : "⁻"
|
||||||
|
|
||||||
|
<Multi_key> <underscore> <0> : "₀"
|
||||||
|
<Multi_key> <underscore> <1> : "₁"
|
||||||
|
<Multi_key> <underscore> <2> : "₂"
|
||||||
|
<Multi_key> <underscore> <3> : "₃"
|
||||||
|
<Multi_key> <underscore> <4> : "₄"
|
||||||
|
<Multi_key> <underscore> <5> : "₅"
|
||||||
|
<Multi_key> <underscore> <6> : "₆"
|
||||||
|
<Multi_key> <underscore> <7> : "₇"
|
||||||
|
<Multi_key> <underscore> <8> : "₈"
|
||||||
|
<Multi_key> <underscore> <9> : "₉"
|
||||||
|
<Multi_key> <underscore> <a> : "ₐ"
|
||||||
|
<Multi_key> <underscore> <e> : "ₑ"
|
||||||
|
<Multi_key> <underscore> <h> : "ₕ"
|
||||||
|
<Multi_key> <underscore> <i> : "ᵢ"
|
||||||
|
<Multi_key> <underscore> <j> : "ⱼ"
|
||||||
|
<Multi_key> <underscore> <k> : "ₖ"
|
||||||
|
<Multi_key> <underscore> <l> : "ₗ"
|
||||||
|
<Multi_key> <underscore> <m> : "ₘ"
|
||||||
|
<Multi_key> <underscore> <n> : "ₙ"
|
||||||
|
<Multi_key> <underscore> <o> : "ₒ"
|
||||||
|
<Multi_key> <underscore> <p> : "ₚ"
|
||||||
|
<Multi_key> <underscore> <r> : "ᵣ"
|
||||||
|
<Multi_key> <underscore> <s> : "ₛ"
|
||||||
|
<Multi_key> <underscore> <t> : "ₜ"
|
||||||
|
<Multi_key> <underscore> <u> : "ᵤ"
|
||||||
|
<Multi_key> <underscore> <v> : "ᵥ"
|
||||||
|
<Multi_key> <underscore> <x> : "ₓ"
|
||||||
|
<Multi_key> <underscore> <plus> : "₊"
|
||||||
|
<Multi_key> <underscore> <minus> : "₋"
|
||||||
|
<Multi_key> <underscore> <equal> : "₌"
|
||||||
|
<Multi_key> <underscore> <parenleft> : "₍"
|
||||||
|
<Multi_key> <underscore> <parenright> : "₎"
|
||||||
|
|
||||||
|
# Written prose fancy characters
|
||||||
|
<Multi_key> <l> <d> <o> <t> <s> : "…" # latex \ldots
|
||||||
|
<Multi_key> <period> <period> : "…" # latex \ldots
|
||||||
|
<Multi_key> <minus> <minus> : "–" # en dash
|
||||||
|
<Multi_key> <minus> <equal> : "—" # em dash
|
||||||
|
<Multi_key> <c> <h> <e> <c> <k> : "✓"
|
||||||
|
<Multi_key> <m> <u> <s> <i> <c> : "♪"
|
||||||
|
<Multi_key> <v> <e> <g> <a> <n> : "Ⓥ"
|
||||||
|
<Multi_key> <a> <n> <a> <r> <c> <h> <y> : "Ⓐ"
|
||||||
|
<Multi_key> <s> <h> <r> <u> <g> : " ¯\\_(ツ)_/ "
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Arrows
|
||||||
|
<Multi_key> <t> <o> <space> : "→ " # latex \to
|
||||||
|
<Multi_key> <m> <a> <p> <s> <t> <o> : "↦" # latex \mapsto
|
||||||
|
<Multi_key> <m> <u> <l> <t> <i> <m> <a> <p> : "⊸" # latex \multimap
|
||||||
|
<Multi_key> <g> <e> <t> <s> : "←" # latex \gets
|
||||||
|
<Multi_key> <i> <m> <p> <l> : "⇒" # latex \Rightarrow
|
||||||
|
<Multi_key> <i> <m> <p> <r> : "⇐" # latex \Leftarrow
|
||||||
|
<Multi_key> <i> <m> <p> <b> : "⇔" # latex \Leftrightarrow
|
||||||
|
<Multi_key> <u> <p> <space> : "↑ " # latex \uparrow
|
||||||
|
<Multi_key> <d> <n> : "↓" # latex \downarrow
|
||||||
|
<Multi_key> <d> <o> <w> <n> : "↓" # latex \downarrow
|
||||||
|
<Multi_key> <l> <e> <a> <d> <s> <t> <o> : "↝" # latex \leadsto
|
||||||
|
<Multi_key> <f> <r> <o> <m> <t> <o> : "⇄" # latex \leadsto
|
||||||
|
|
||||||
|
# Mathy stuffs
|
||||||
|
<Multi_key> <n> <a> <b> <l> <a> : "∇"
|
||||||
|
<Multi_key> <c> <r> <o> <s> <s> : "⨯"
|
||||||
|
<Multi_key> <v> <e> <c> : "⃗" # combining vector above last symbol
|
||||||
|
<Multi_key> <d> <i> <f> : "∂"
|
||||||
|
<Multi_key> <f> <o> <r> <a> <l> <l> : "∀" # latex \forall
|
||||||
|
<Multi_key> <e> <x> <i> <s> <t> <s> : "∃" # latex \exists
|
||||||
|
<Multi_key> <t> <o> <p> : "⊤" # latex \top
|
||||||
|
<Multi_key> <b> <o> <t> : "⊥" # latex \bot
|
||||||
|
<Multi_key> <s> <t> <a> <r> : "★" # latex \star
|
||||||
|
<Multi_key> <i> <n> <space> : "∈ " # latex \in
|
||||||
|
<Multi_key> <n> <i> : "∋" # latex \ni
|
||||||
|
<Multi_key> <n> <o> <i> <n> : "∉" #latex \notin
|
||||||
|
<Multi_key> <e> <m> <p> <t> <y> : "∅" # latex \empty
|
||||||
|
<Multi_key> <p> <r> <o> <d> : "∏" # latex \prod
|
||||||
|
<Multi_key> <s> <u> <m> : "∑" # latex \sum
|
||||||
|
<Multi_key> <l> <e> <space> : "≤ " # latex \le
|
||||||
|
<Multi_key> <g> <e> <q> : "≥" # latex \ge
|
||||||
|
<Multi_key> <p> <r> <e> <c> : "≺" # latex \prec
|
||||||
|
<Multi_key> <p> <r> <e> <c> <e> <q> : "⪯" # latex \preceq
|
||||||
|
<Multi_key> <p> <m> : "±" # latex \pm
|
||||||
|
<Multi_key> <plus> <plus> : "⧺" # latex ?
|
||||||
|
<Multi_key> <s> <u> <b> <s> <e> <t> : "⊂" # latex \subset
|
||||||
|
<Multi_key> <s> <u> <b> <s> <e> <q> : "⊆" # latex \subseteq
|
||||||
|
<Multi_key> <s> <u> <p> <s> <e> <t> : "⊃" # latex \supset
|
||||||
|
<Multi_key> <s> <u> <p> <s> <e> <q> : "⊇" # latex \supseteq
|
||||||
|
<Multi_key> <s> <e> <t> <m> <i> <n> <u> <s> : "∖" # latex \setminus
|
||||||
|
<Multi_key> <c> <a> <p> : "∩" # latex \cap
|
||||||
|
<Multi_key> <c> <u> <p> : "∪" # latex \cup
|
||||||
|
<Multi_key> <s> <q> <c> <u> <p> : "⊔" # latex \sqcup
|
||||||
|
<Multi_key> <s> <q> <c> <a> <p> : "⊓" # latex \sqcap
|
||||||
|
<Multi_key> <u> <p> <l> <u> <s> : "⊎" # latex \uplus
|
||||||
|
<Multi_key> <U> <p> <l> <u> <s> : "⨄" # latex \Uplus
|
||||||
|
<Multi_key> <r> <h> <d> :"⊳" # latex \rhd
|
||||||
|
<Multi_key> <l> <h> <d> :"⊲" # latex \lhd
|
||||||
|
<Multi_key> <t> <h> <e> <r> <e> <f> <o> <r> <e> : "∴" # latex \therefore
|
||||||
|
<Multi_key> <q> <e> <d> : "∎" # latex \qed
|
||||||
|
<Multi_key> <b> <N> : "ℕ" # latex \N
|
||||||
|
<Multi_key> <b> <B> : "𝔹" # latex \N
|
||||||
|
<Multi_key> <b> <Z> : "ℤ" # latex \Z
|
||||||
|
<Multi_key> <b> <C> : "ℂ" # latex \C
|
||||||
|
<Multi_key> <b> <Q> : "ℚ" # latex \Q
|
||||||
|
<Multi_key> <b> <R> : "ℝ" # latex \R
|
||||||
|
<Multi_key> <b> <E> : "𝔼" # latex \E
|
||||||
|
<Multi_key> <b> <F> : "𝔽" # latex \F
|
||||||
|
<Multi_key> <i> <n> <f> <t> <y> : "∞" # latex \infty
|
||||||
|
<Multi_key> <e> <q> <u> <i> <v> : "≡" # latex \equiv
|
||||||
|
<Multi_key> <n> <e> <q> <u> <i> <v> : "≢" # latex \not\equiv
|
||||||
|
<Multi_key> <s> <i> <m> <e> <q> : "≃" # latex \simeq
|
||||||
|
<Multi_key> <a> <p> <p> <r> <o> <x> : "≈" # latex \approx
|
||||||
|
<Multi_key> <c> <o> <n> <g> : "≅" # latex \cong
|
||||||
|
<Multi_key> <n> <e> <q> <space> : "≠ " # latex \ne
|
||||||
|
<Multi_key> <e> <q> <m> <a> <y> <b> <e> : "≟" # latex \?
|
||||||
|
<Multi_key> <p> <r> <o> <v> <e> <s> : "⊢" # latex \vdash
|
||||||
|
<Multi_key> <n> <p> <r> <o> <v> <e> <s> : "⊬" # latex \nvdash
|
||||||
|
<Multi_key> <e> <n> <t> <a> <i> <l> <s> : "⊨" # latex \vDash
|
||||||
|
<Multi_key> <f> <o> <r> <c> <e> <s> : "⊩" # latex \Vdash
|
||||||
|
<Multi_key> <p> <e> <r> <p> : "⊥" # latex \perp
|
||||||
|
<Multi_key> <v> <e> <e> : "∨" # latex \vee
|
||||||
|
<Multi_key> <w> <e> <d> <g> <e> : "∧" # latex \wedge
|
||||||
|
<Multi_key> <n> <o> <t> : "¬" # latex \not
|
||||||
|
<Multi_key> <c> <d> <o> <t> : "⋅" # latex \cdot
|
||||||
|
<Multi_key> <colon> <space> : "﹕ " # latex \?
|
||||||
|
<Multi_key> <b> <u> <l> <l> <e> <t> : "•" # latex \bullet
|
||||||
|
<Multi_key> <c> <i> <r> <c> : "∘" # latex \circ
|
||||||
|
<Multi_key> <t> <i> <m> <e> <s> : "×" # latex \times
|
||||||
|
# <Multi_key> <o> <p> <l> <u> <s> : "⊕" # latex \oplus
|
||||||
|
# <Multi_key> <c> <i> <r> <c> <l> <e> <d> <a> <s> <t> : "⊛" # latex \circledast
|
||||||
|
<Multi_key> <O> <plus> : "⊕" # latex \oplus
|
||||||
|
<Multi_key> <O> <x> : "⊗" # latex \otimes
|
||||||
|
<Multi_key> <O> <asterisk> : "⊛" # latex \circledast
|
||||||
|
<Multi_key> <l> <a> <n> <g> <l> <e> : "⟨" # latex \langle
|
||||||
|
<Multi_key> <r> <a> <n> <g> <l> <e> : "⟩" # latex \rangle
|
||||||
|
<Multi_key> <bracketleft> : "⟦" # latex \llbracket
|
||||||
|
<Multi_key> <bracketright> : "⟧" # latex \rrbracket
|
||||||
|
<Multi_key> <underscore> <bracketleft> : "⌊" # latex ?
|
||||||
|
<Multi_key> <underscore> <bracketright> : "⌋" # latex ?
|
||||||
|
<Multi_key> <asciicircum> <bracketleft> : "⌈" # latex ?
|
||||||
|
<Multi_key> <asciicircum> <bracketright> : "⌉" # latex ?
|
||||||
|
<Multi_key> <colon> <colon> : "∷" # latex ?
|
||||||
|
<Multi_key> <l> <o> <z> <e> <n> <g> <e> : "◊" # latex \lozenge
|
||||||
|
<Multi_key> <d> <e> <g> : "°"
|
||||||
|
<Multi_key> <comma> : "⹁" # latex ?
|
||||||
|
<Multi_key> <semicolon> : "⁏" # latex ?
|
||||||
|
<Multi_key> <b> <o> <x> : "□" # latex ?
|
||||||
|
<Multi_key> <f> <l> <a> <t> : "♭" # latex ?
|
||||||
|
<Multi_key> <s> <h> <a> <r> <p> : "♯" # latex ?
|
||||||
|
|
||||||
|
# Greek alphabet
|
||||||
|
<Multi_key> <a> <l> <p> <h> <a> : "α" # latex \alpha
|
||||||
|
<Multi_key> <b> <e> <t> <a> : "β" # latex \beta
|
||||||
|
<Multi_key> <g> <a> <m> <m> <a> : "γ" # latex \gamma
|
||||||
|
<Multi_key> <d> <e> <l> <t> <a> : "δ" # latex \delta
|
||||||
|
<Multi_key> <e> <p> <s> <i> <l> <o> <n> : "ε" # latex \epsilon
|
||||||
|
<Multi_key> <z> <e> <t> <a> : "ζ" # latex \zeta
|
||||||
|
<Multi_key> <e> <t> <a> : "η" # latex \eta
|
||||||
|
<Multi_key> <t> <h> <e> <t> <a> : "θ" # latex \theta
|
||||||
|
<Multi_key> <i> <o> <t> <a> : "ι" # latex \iota
|
||||||
|
<Multi_key> <k> <a> <p> <p> <a> : "κ" # latex \kappa
|
||||||
|
<Multi_key> <l> <a> <m> <b> <d> <a> : "λ" # latex \lambda
|
||||||
|
<Multi_key> <l> <a> <m> <b> <d> <b> : "ƛ" # latex \lambda
|
||||||
|
<Multi_key> <m> <u> <space> : "μ " # latex \mu
|
||||||
|
<Multi_key> <m> <i> <c> <r> <o> : "μ" # latex \mu
|
||||||
|
<Multi_key> <n> <u> : "ν" # latex \nu
|
||||||
|
<Multi_key> <x> <i> : "ξ" # latex \xi
|
||||||
|
<Multi_key> <o> <m> <i> <c> <r> <o> <n> : "ο" # latex \omicron
|
||||||
|
<Multi_key> <p> <i> : "π" # latex \pi
|
||||||
|
<Multi_key> <r> <h> <o> : "ρ" # latex \rho
|
||||||
|
<Multi_key> <s> <t> <i> <g> <m> <a> : "ς" # latex \stigma
|
||||||
|
<Multi_key> <s> <i> <g> <m> <a> : "σ" # latex \sigma
|
||||||
|
<Multi_key> <t> <a> <u> : "τ" # latex \tau
|
||||||
|
<Multi_key> <u> <p> <s> <i> <l> <o> <n> : "υ" # latex \upsilon
|
||||||
|
<Multi_key> <p> <h> <i> : "ϕ" # latex \phi
|
||||||
|
<Multi_key> <v> <a> <r> <p> <h> <i> : "φ" # latex \varphi
|
||||||
|
<Multi_key> <c> <h> <i> : "χ" # latex \chi
|
||||||
|
<Multi_key> <p> <s> <i> : "ψ" # latex \psi
|
||||||
|
<Multi_key> <o> <m> <e> <g> <a> : "ω" # latex \omega
|
||||||
|
<Multi_key> <A> <l> <p> <h> <a> : "Α" # latex \Alpha
|
||||||
|
<Multi_key> <B> <e> <t> <a> : "Β" # latex \Beta
|
||||||
|
<Multi_key> <G> <a> <m> <m> <a> : "Γ" # latex \Gamma
|
||||||
|
<Multi_key> <D> <e> <l> <t> <a> : "Δ" # latex \Delta
|
||||||
|
<Multi_key> <E> <p> <s> <i> <l> <o> <n> : "Ε" # latex \Epsilon
|
||||||
|
<Multi_key> <Z> <e> <t> <a> : "Ζ" # latex \Zeta
|
||||||
|
<Multi_key> <E> <t> <a> : "Η" # latex \Eta
|
||||||
|
<Multi_key> <T> <h> <e> <t> <a> : "Θ" # latex \Theta
|
||||||
|
<Multi_key> <I> <o> <t> <a> : "Ι" # latex \Iota
|
||||||
|
<Multi_key> <K> <a> <p> <p> <a> : "Κ" # latex \Kappa
|
||||||
|
<Multi_key> <L> <a> <m> <b> <d> <a> : "Λ" # latex \Lambda
|
||||||
|
<Multi_key> <M> <u> : "Μ" # latex \Mu
|
||||||
|
<Multi_key> <N> <u> : "Ν" # latex \Nu
|
||||||
|
<Multi_key> <X> <i> : "Ξ" # latex \Xi
|
||||||
|
<Multi_key> <O> <m> <i> <c> <r> <o> <n> : "Ο" # latex \Omicron
|
||||||
|
<Multi_key> <P> <i> : "Π" # latex \Pi
|
||||||
|
<Multi_key> <R> <h> <o> : "Ρ" # latex \Rho
|
||||||
|
<Multi_key> <S> <i> <g> <m> <a> : "Σ" # latex \Sigma
|
||||||
|
<Multi_key> <T> <a> <u> : "Τ" # latex \Tau
|
||||||
|
<Multi_key> <U> <p> <s> <i> <l> <o> <n> : "Υ" # latex \Upsilon
|
||||||
|
<Multi_key> <P> <h> <i> : "Φ" # latex \Phi
|
||||||
|
<Multi_key> <C> <h> <i> : "Χ" # latex \Chi
|
||||||
|
<Multi_key> <P> <s> <i> : "Ψ" # latex \Psi
|
||||||
|
<Multi_key> <O> <m> <e> <g> <a> : "Ω" # latex \Omega
|
||||||
|
|
||||||
|
# Caligraphy
|
||||||
|
<Multi_key> <c> <a> <l> <A> : "𝓐"
|
||||||
|
<Multi_key> <c> <a> <l> <B> : "𝓑"
|
||||||
|
<Multi_key> <c> <a> <l> <C> : "𝓒"
|
||||||
|
<Multi_key> <c> <a> <l> <D> : "𝓓"
|
||||||
|
<Multi_key> <c> <a> <l> <E> : "𝓔"
|
||||||
|
<Multi_key> <c> <a> <l> <F> : "𝓕"
|
||||||
|
<Multi_key> <c> <a> <l> <G> : "𝓖"
|
||||||
|
<Multi_key> <c> <a> <l> <H> : "𝓗"
|
||||||
|
<Multi_key> <c> <a> <l> <I> : "𝓘"
|
||||||
|
<Multi_key> <c> <a> <l> <J> : "𝓙"
|
||||||
|
<Multi_key> <c> <a> <l> <K> : "𝓚"
|
||||||
|
<Multi_key> <c> <a> <l> <L> : "𝓛"
|
||||||
|
<Multi_key> <c> <a> <l> <M> : "𝓜"
|
||||||
|
<Multi_key> <c> <a> <l> <N> : "𝓝"
|
||||||
|
<Multi_key> <c> <a> <l> <O> : "𝓞"
|
||||||
|
<Multi_key> <c> <a> <l> <P> : "𝓟"
|
||||||
|
<Multi_key> <c> <a> <l> <Q> : "𝓠"
|
||||||
|
<Multi_key> <c> <a> <l> <R> : "𝓡"
|
||||||
|
<Multi_key> <c> <a> <l> <S> : "𝓢"
|
||||||
|
<Multi_key> <c> <a> <l> <T> : "𝓣"
|
||||||
|
<Multi_key> <c> <a> <l> <U> : "𝓤"
|
||||||
|
<Multi_key> <c> <a> <l> <V> : "𝓥"
|
||||||
|
<Multi_key> <c> <a> <l> <W> : "𝓦"
|
||||||
|
<Multi_key> <c> <a> <l> <X> : "𝓧"
|
||||||
|
<Multi_key> <c> <a> <l> <Y> : "𝓨"
|
||||||
|
<Multi_key> <c> <a> <l> <Z> : "𝓩"
|
||||||
|
<Multi_key> <c> <a> <l> <0> : "𝟎"
|
||||||
|
<Multi_key> <c> <a> <l> <1> : "𝟏"
|
||||||
|
<Multi_key> <c> <a> <l> <2> : "𝟐"
|
||||||
|
<Multi_key> <c> <a> <l> <3> : "𝟑"
|
||||||
|
<Multi_key> <c> <a> <l> <4> : "𝟒"
|
||||||
|
<Multi_key> <c> <a> <l> <5> : "𝟓"
|
||||||
|
<Multi_key> <c> <a> <l> <6> : "𝟔"
|
||||||
|
<Multi_key> <c> <a> <l> <7> : "𝟕"
|
||||||
|
<Multi_key> <c> <a> <l> <8> : "𝟖"
|
||||||
|
<Multi_key> <c> <a> <l> <9> : "𝟗"
|
||||||
|
|
||||||
|
# Fraktur
|
||||||
|
<Multi_key> <f> <r> <a> <a> : "𝖆"
|
||||||
|
<Multi_key> <f> <r> <a> <b> : "𝖇"
|
||||||
|
<Multi_key> <f> <r> <a> <c> : "𝖈"
|
||||||
|
<Multi_key> <f> <r> <a> <d> : "𝖉"
|
||||||
|
<Multi_key> <f> <r> <a> <e> : "𝖊"
|
||||||
|
<Multi_key> <f> <r> <a> <f> : "𝖋"
|
||||||
|
<Multi_key> <f> <r> <a> <g> : "𝖌"
|
||||||
|
<Multi_key> <f> <r> <a> <h> : "𝖍"
|
||||||
|
<Multi_key> <f> <r> <a> <i> : "𝖎"
|
||||||
|
<Multi_key> <f> <r> <a> <j> : "𝖏"
|
||||||
|
<Multi_key> <f> <r> <a> <k> : "𝖐"
|
||||||
|
<Multi_key> <f> <r> <a> <l> : "𝖑"
|
||||||
|
<Multi_key> <f> <r> <a> <m> : "𝖒"
|
||||||
|
<Multi_key> <f> <r> <a> <n> : "𝖓"
|
||||||
|
<Multi_key> <f> <r> <a> <o> : "𝖔"
|
||||||
|
<Multi_key> <f> <r> <a> <p> : "𝖕"
|
||||||
|
<Multi_key> <f> <r> <a> <q> : "𝖖"
|
||||||
|
<Multi_key> <f> <r> <a> <r> : "𝖗"
|
||||||
|
<Multi_key> <f> <r> <a> <s> : "𝖘"
|
||||||
|
<Multi_key> <f> <r> <a> <t> : "𝖙"
|
||||||
|
<Multi_key> <f> <r> <a> <u> : "𝖚"
|
||||||
|
<Multi_key> <f> <r> <a> <v> : "𝖛"
|
||||||
|
<Multi_key> <f> <r> <a> <w> : "𝖜"
|
||||||
|
<Multi_key> <f> <r> <a> <x> : "𝖝"
|
||||||
|
<Multi_key> <f> <r> <a> <y> : "𝖞"
|
||||||
|
<Multi_key> <f> <r> <a> <z> : "𝖟"
|
||||||
|
<Multi_key> <f> <r> <a> <A> : "𝕬"
|
||||||
|
<Multi_key> <f> <r> <a> <B> : "𝕭"
|
||||||
|
<Multi_key> <f> <r> <a> <C> : "𝕮"
|
||||||
|
<Multi_key> <f> <r> <a> <D> : "𝕯"
|
||||||
|
<Multi_key> <f> <r> <a> <E> : "𝕰"
|
||||||
|
<Multi_key> <f> <r> <a> <F> : "𝕱"
|
||||||
|
<Multi_key> <f> <r> <a> <G> : "𝕲"
|
||||||
|
<Multi_key> <f> <r> <a> <H> : "𝕳"
|
||||||
|
<Multi_key> <f> <r> <a> <J> : "𝕴"
|
||||||
|
<Multi_key> <f> <r> <a> <I> : "𝕵"
|
||||||
|
<Multi_key> <f> <r> <a> <K> : "𝕶"
|
||||||
|
<Multi_key> <f> <r> <a> <L> : "𝕷"
|
||||||
|
<Multi_key> <f> <r> <a> <M> : "𝕸"
|
||||||
|
<Multi_key> <f> <r> <a> <N> : "𝕹"
|
||||||
|
<Multi_key> <f> <r> <a> <O> : "𝕺"
|
||||||
|
<Multi_key> <f> <r> <a> <P> : "𝕻"
|
||||||
|
<Multi_key> <f> <r> <a> <Q> : "𝕼"
|
||||||
|
<Multi_key> <f> <r> <a> <R> : "𝕽"
|
||||||
|
<Multi_key> <f> <r> <a> <S> : "𝕾"
|
||||||
|
<Multi_key> <f> <r> <a> <T> : "𝕿"
|
||||||
|
<Multi_key> <f> <r> <a> <U> : "𝖀"
|
||||||
|
<Multi_key> <f> <r> <a> <V> : "𝖁"
|
||||||
|
<Multi_key> <f> <r> <a> <W> : "𝖂"
|
||||||
|
<Multi_key> <f> <r> <a> <X> : "𝖃"
|
||||||
|
<Multi_key> <f> <r> <a> <Y> : "𝖄"
|
||||||
|
<Multi_key> <f> <r> <a> <Z> : "𝖅"
|
|
@ -1,6 +1,6 @@
|
||||||
default
|
default
|
||||||
xkb_symbols "fox" {
|
xkb_symbols "fox" {
|
||||||
key <TLDE> {[ comma, semicolon, VoidSymbol, VoidSymbol ]};
|
key <TLDE> {[ Multi_key ]};
|
||||||
key <AE01> {[ 1, ampersand, VoidSymbol, VoidSymbol ]};
|
key <AE01> {[ 1, ampersand, VoidSymbol, VoidSymbol ]};
|
||||||
key <AE02> {[ 2, quotedbl, at, VoidSymbol ]};
|
key <AE02> {[ 2, quotedbl, at, VoidSymbol ]};
|
||||||
key <AE03> {[ 3, numbersign, VoidSymbol, VoidSymbol ]};
|
key <AE03> {[ 3, numbersign, VoidSymbol, VoidSymbol ]};
|
||||||
|
|
|
@ -11,4 +11,6 @@
|
||||||
networking.nameservers = [ "8.8.8.8" ];
|
networking.nameservers = [ "8.8.8.8" ];
|
||||||
networking.resolvconf.enable = true;
|
networking.resolvconf.enable = true;
|
||||||
networking.resolvconf.dnsExtensionMechanism = false; # edns seems to be fucky with this enabled
|
networking.resolvconf.dnsExtensionMechanism = false; # edns seems to be fucky with this enabled
|
||||||
|
|
||||||
|
programs.nm-applet.enable = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@ in
|
||||||
|
|
||||||
MediaLayerKeys = [
|
MediaLayerKeys = [
|
||||||
{ Icon = "prev-workspace"; Action = "Finance"; } # bind me in the window manager!
|
{ Icon = "prev-workspace"; Action = "Finance"; } # bind me in the window manager!
|
||||||
{ Icon = "next-workspace"; Action = "Sport"; } # bind me in the window manager!
|
{ Icon = "next-workspace"; Action = "Sport"; } # bind me in the window manager!
|
||||||
{ Icon = "brightness_low"; Action = "BrightnessDown"; }
|
{ Icon = "brightness_low"; Action = "BrightnessDown"; }
|
||||||
{ Icon = "brightness_high"; Action = "BrightnessUp"; }
|
{ Icon = "brightness_high"; Action = "BrightnessUp"; }
|
||||||
{ Icon = "backlight_low"; Action = "IllumDown"; }
|
{ Icon = "backlight_low"; Action = "IllumDown"; }
|
||||||
|
|
137
x-wayland-clipboard-daemon/x-wayland-clipboard-daemon.py
Normal file
137
x-wayland-clipboard-daemon/x-wayland-clipboard-daemon.py
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
# very simple daemon that monitors the clipboard for wayland (using wl-clipboard) and X (using xclip)
|
||||||
|
# whenever one changes, clipboard-daemon ensures the other changes as well
|
||||||
|
#
|
||||||
|
# currently supports syncing text/plain and image/png mimetypes between clipboards
|
||||||
|
#
|
||||||
|
# needs wl-paste and xclip in $PATH
|
||||||
|
|
||||||
|
from typing import Optional
|
||||||
|
import subprocess
|
||||||
|
from abc import ABC
|
||||||
|
from dataclasses import dataclass
|
||||||
|
import time
|
||||||
|
|
||||||
|
INTERVAL_MS = 100
|
||||||
|
|
||||||
|
class ClipboardContents(ABC):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TextContents(ClipboardContents):
|
||||||
|
text: bytes
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
if len(self.text) < 20:
|
||||||
|
return f"TextContents(text={self.text!r})"
|
||||||
|
else:
|
||||||
|
return f"TextContents(text={self.text[:20]!r}..)"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return repr(self)
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ImageContents(ClipboardContents):
|
||||||
|
png_data: bytes
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "ImageContents(png_data=...)"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return repr(self)
|
||||||
|
|
||||||
|
|
||||||
|
def get_wayland_clipboard() -> Optional[ClipboardContents]:
|
||||||
|
formats = subprocess.run(["wl-paste", "-l"], capture_output=True).stdout.strip(b"\n")
|
||||||
|
|
||||||
|
if b"image/png" in formats:
|
||||||
|
contents = subprocess.run(["wl-paste", "-t", "image/png"], capture_output=True).stdout
|
||||||
|
return ImageContents(png_data=contents)
|
||||||
|
|
||||||
|
if b"text/plain" in formats:
|
||||||
|
contents = subprocess.run(["wl-paste", "-n", "-t", "text/plain"], capture_output=True).stdout
|
||||||
|
return TextContents(text=contents)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def set_wayland_clipboard(data: ClipboardContents):
|
||||||
|
if isinstance(data, TextContents):
|
||||||
|
subprocess.run(
|
||||||
|
["wl-copy", "-t", "text/plain", "-n"],
|
||||||
|
input=data.text,
|
||||||
|
)
|
||||||
|
elif isinstance(data, ImageContents):
|
||||||
|
subprocess.run(
|
||||||
|
["wl-copy", "-t", "image/png"],
|
||||||
|
input=data.png_data,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unknown clipboard data: {data}")
|
||||||
|
|
||||||
|
def get_x_clipboard() -> Optional[ClipboardContents]:
|
||||||
|
formats = subprocess.run(
|
||||||
|
["xclip", "-out", "-selection", "clipboard", "-target", "TARGETS"],
|
||||||
|
capture_output=True,
|
||||||
|
).stdout.strip(b"\n")
|
||||||
|
|
||||||
|
if b"image/png" in formats:
|
||||||
|
contents = subprocess.run(
|
||||||
|
["xclip", "-out", "-selection", "clipboard", "-target", "image/png"],
|
||||||
|
capture_output=True,
|
||||||
|
).stdout
|
||||||
|
return ImageContents(png_data=contents)
|
||||||
|
|
||||||
|
if b"text/plain" in formats:
|
||||||
|
contents = subprocess.run(
|
||||||
|
["xclip", "-out", "-selection", "clipboard", "-target", "text/plain"],
|
||||||
|
capture_output=True,
|
||||||
|
).stdout
|
||||||
|
return TextContents(text=contents)
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def set_x_clipboard(data: ClipboardContents):
|
||||||
|
if isinstance(data, TextContents):
|
||||||
|
subprocess.run(
|
||||||
|
["xclip", "-in", "-selection", "clipboard", "-target", "text/plain"],
|
||||||
|
input=data.text,
|
||||||
|
)
|
||||||
|
elif isinstance(data, ImageContents):
|
||||||
|
subprocess.run(
|
||||||
|
["xclip", "-in", "-selection", "clipboard", "-target", "image/png"],
|
||||||
|
input=data.png_data,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unknown clipboard data: {data}")
|
||||||
|
|
||||||
|
def clipboard_sync():
|
||||||
|
last_wayland_contents = get_wayland_clipboard()
|
||||||
|
last_x_contents = get_x_clipboard()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
time.sleep(INTERVAL_MS/1000)
|
||||||
|
|
||||||
|
wayland_contents = get_wayland_clipboard()
|
||||||
|
x_contents = get_x_clipboard()
|
||||||
|
|
||||||
|
if wayland_contents != last_wayland_contents:
|
||||||
|
print(f"wayland clipborad updated from {last_wayland_contents} to {wayland_contents}")
|
||||||
|
if wayland_contents is not None:
|
||||||
|
print(" sycning wayland -> x")
|
||||||
|
set_x_clipboard(wayland_contents)
|
||||||
|
x_contents = wayland_contents
|
||||||
|
else:
|
||||||
|
print(" unknown type, not syncing")
|
||||||
|
elif x_contents != last_x_contents:
|
||||||
|
print(f"x clipborad updated from {last_x_contents} to {x_contents}")
|
||||||
|
if x_contents is not None:
|
||||||
|
print(" sycning x -> wayland")
|
||||||
|
set_wayland_clipboard(x_contents)
|
||||||
|
wayland_contents_contents = x_contents
|
||||||
|
else:
|
||||||
|
print(" unknown type, not syncing")
|
||||||
|
|
||||||
|
last_wayland_contents = wayland_contents
|
||||||
|
last_x_contents = x_contents
|
||||||
|
|
||||||
|
print("starting x-wayland-clipboard-daemon")
|
||||||
|
clipboard_sync()
|
Loading…
Reference in New Issue
Block a user