initial commit
This commit is contained in:
commit
eff7b60f4b
9 changed files with 1305 additions and 0 deletions
35
alacritty.toml
Normal file
35
alacritty.toml
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
[window]
|
||||||
|
opacity=0.8
|
||||||
|
dynamic_padding=true
|
||||||
|
|
||||||
|
[font]
|
||||||
|
#normal={family="Source Code Pro"}
|
||||||
|
size=10
|
||||||
|
|
||||||
|
[colors]
|
||||||
|
[colors.primary]
|
||||||
|
background="#000000"
|
||||||
|
foreground="#ffffff"
|
||||||
|
[colors.normal]
|
||||||
|
black = "#000000"
|
||||||
|
red = "#CC0403"
|
||||||
|
green = "#19CB00"
|
||||||
|
yellow = "#CECB00"
|
||||||
|
blue = "#0D73CC"
|
||||||
|
magenta = "#CB1ED1"
|
||||||
|
cyan = "#0DCDCD"
|
||||||
|
white = "#DDDDDD"
|
||||||
|
[colors.bright]
|
||||||
|
black = "#767676"
|
||||||
|
red = "#F2201F"
|
||||||
|
green = "#23FD00"
|
||||||
|
yellow = "#FFFD00"
|
||||||
|
blue = "#1A8FFF"
|
||||||
|
magenta = "#FD28FF"
|
||||||
|
cyan = "#14FFFF"
|
||||||
|
white = "#FFFFFF"
|
||||||
|
|
||||||
|
[keyboard]
|
||||||
|
bindings = [
|
||||||
|
{ key = "Enter", mods = "Super|Shift", action="CreateNewWindow" }
|
||||||
|
]
|
172
configuration.nix
Normal file
172
configuration.nix
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
|
||||||
|
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./home_manager.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.tmp.useTmpfs = true;
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
boot.supportedFilesystems = [ "bcachefs" ];
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
|
||||||
|
networking.hostName = "katvayor"; # Define your hostname.
|
||||||
|
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
|
||||||
|
time.timeZone = "Europe/Paris";
|
||||||
|
|
||||||
|
# Configure network proxy if necessary
|
||||||
|
# networking.proxy.default = "http://user:password@proxy:port/";
|
||||||
|
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";
|
||||||
|
|
||||||
|
# Select internationalisation properties.
|
||||||
|
i18n.defaultLocale = "en_US.UTF-8";
|
||||||
|
console = {
|
||||||
|
font = "Lat2-Terminus16";
|
||||||
|
keyMap = "fr";
|
||||||
|
# useXkbConfig = true; # use xkb.options in tty.
|
||||||
|
};
|
||||||
|
|
||||||
|
# Enable the X11 windowing system.
|
||||||
|
# services.xserver.enable = true;
|
||||||
|
|
||||||
|
# security.polkit.enable = true;
|
||||||
|
# programs.light.enable = true;
|
||||||
|
nixpkgs.config.pulseaudio = true;
|
||||||
|
programs.wshowkeys.enable = true;
|
||||||
|
programs.sway.enable = true;
|
||||||
|
services.dbus.packages = with pkgs; [ dconf ];
|
||||||
|
xdg.portal = {
|
||||||
|
enable = true;
|
||||||
|
extraPortals = with pkgs; [
|
||||||
|
xdg-desktop-portal-wlr
|
||||||
|
xdg-desktop-portal-gtk
|
||||||
|
];
|
||||||
|
};
|
||||||
|
nix.settings.experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
services.gvfs.enable = true;
|
||||||
|
programs.thunar.enable = true;
|
||||||
|
programs.thunar.plugins = with pkgs.xfce; [
|
||||||
|
thunar-volman
|
||||||
|
thunar-archive-plugin
|
||||||
|
thunar-media-tags-plugin
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.config.allowUnfree = true;
|
||||||
|
|
||||||
|
# Configure keymap in X11
|
||||||
|
# services.xserver.xkb.layout = "us";
|
||||||
|
# services.xserver.xkb.options = "eurosign:e,caps:escape";
|
||||||
|
|
||||||
|
# Enable CUPS to print documents.
|
||||||
|
# services.printing.enable = true;
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
pulseaudio = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.pulseaudioFull;
|
||||||
|
};
|
||||||
|
bluetooth = {
|
||||||
|
enable = true;
|
||||||
|
powerOnBoot = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Enable touchpad support (enabled default in most desktopManager).
|
||||||
|
# services.xserver.libinput.enable = true;
|
||||||
|
|
||||||
|
# Define a user account. Don't forget to set a password with ‘passwd’.
|
||||||
|
users.users.catvayor = {
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = [ "wheel" "usb" "networkmanager" "video" "audio" ];
|
||||||
|
packages = with pkgs; [
|
||||||
|
firefox
|
||||||
|
tree
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
wget
|
||||||
|
brightnessctl
|
||||||
|
nix-search-cli
|
||||||
|
git
|
||||||
|
btop
|
||||||
|
ranger
|
||||||
|
];
|
||||||
|
|
||||||
|
# Some programs need SUID wrappers, can be configured further or are
|
||||||
|
# started in user sessions.
|
||||||
|
# programs.mtr.enable = true;
|
||||||
|
programs.gnupg.agent = {
|
||||||
|
enable = true;
|
||||||
|
enableSSHSupport = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.neovim = {
|
||||||
|
enable = true;
|
||||||
|
vimAlias = true;
|
||||||
|
viAlias = true;
|
||||||
|
defaultEditor = true;
|
||||||
|
configure = {
|
||||||
|
customRC = builtins.readFile ./nvim/cfg.vim;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.syncthing = {
|
||||||
|
enable = true;
|
||||||
|
systemService = true;
|
||||||
|
dataDir = "/home/catvayor";
|
||||||
|
user = "catvayor";
|
||||||
|
group = "users";
|
||||||
|
openDefaultPorts = true;
|
||||||
|
settings = {
|
||||||
|
folders."essentials" = {
|
||||||
|
path = "~/essentials";
|
||||||
|
id = "vgpwu-fk3ct";
|
||||||
|
devices = [ "katest" "katel" ];
|
||||||
|
};
|
||||||
|
devices.katest.id = "UPVXT7D-ZQF4E3J-4WKLLRV-2KF7323-7VOMEJJ-4PZVXW4-UQ2YABE-G7ID4AD";
|
||||||
|
devices.katel.id = "DYOKK7J-HZAF5S7-FYTHQF5-UD5GJZ2-4JMV5I5-STUM3HG-5YM2JPR-LATJNAZ";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# List services that you want to enable:
|
||||||
|
|
||||||
|
# Enable the OpenSSH daemon.
|
||||||
|
# services.openssh.enable = true;
|
||||||
|
|
||||||
|
# Open ports in the firewall.
|
||||||
|
# networking.firewall.allowedTCPPorts = [ ... ];
|
||||||
|
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||||
|
# Or disable the firewall altogether.
|
||||||
|
# networking.firewall.enable = false;
|
||||||
|
|
||||||
|
# Copy the NixOS configuration file and link it from the resulting system
|
||||||
|
# (/run/current-system/configuration.nix). This is useful in case you
|
||||||
|
# accidentally delete configuration.nix.
|
||||||
|
# system.copySystemConfiguration = true;
|
||||||
|
|
||||||
|
# This option defines the first version of NixOS you have installed on this particular machine,
|
||||||
|
# and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions.
|
||||||
|
#
|
||||||
|
# Most users should NEVER change this value after the initial install, for any reason,
|
||||||
|
# even if you've upgraded your system to a new NixOS release.
|
||||||
|
#
|
||||||
|
# This value does NOT affect the Nixpkgs version your packages and OS are pulled from,
|
||||||
|
# so changing it will NOT upgrade your system.
|
||||||
|
#
|
||||||
|
# This value being lower than the current NixOS release does NOT mean your system is
|
||||||
|
# out of date, out of support, or vulnerable.
|
||||||
|
#
|
||||||
|
# Do NOT change this value unless you have manually inspected all the changes it would make to your configuration,
|
||||||
|
# and migrated your data accordingly.
|
||||||
|
#
|
||||||
|
# For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion .
|
||||||
|
system.stateVersion = "23.11"; # Did you read the comment?
|
||||||
|
|
||||||
|
}
|
||||||
|
|
46
hardware-configuration.nix
Normal file
46
hardware-configuration.nix
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||||
|
# and may be overwritten by future invocations. Please make changes
|
||||||
|
# to /etc/nixos/configuration.nix instead.
|
||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [ "xhci_pci" "vmd" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
|
||||||
|
boot.initrd.kernelModules = [ ];
|
||||||
|
boot.kernelModules = [ "kvm-intel" ];
|
||||||
|
boot.extraModulePackages = [ ];
|
||||||
|
|
||||||
|
fileSystems."/" =
|
||||||
|
{ device = "/dev/disk/by-uuid/4c1f76c6-5ce6-4987-b15e-9419627b7f19";
|
||||||
|
fsType = "bcachefs";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.initrd.luks.devices."dec-lin" = {
|
||||||
|
device = "/dev/disk/by-uuid/bba45bff-2356-4ec7-a20c-9cbf9d992822";
|
||||||
|
preLVM = true;
|
||||||
|
allowDiscards = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" =
|
||||||
|
{ device = "/dev/disk/by-uuid/4F30-BEC7";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices =
|
||||||
|
[ { device = "/dev/disk/by-uuid/5edcb909-6109-4198-84c7-703cbd471b44"; }
|
||||||
|
];
|
||||||
|
|
||||||
|
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||||
|
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||||
|
# still possible to use this option, but it's recommended to use it in conjunction
|
||||||
|
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.enp2s0.useDHCP = lib.mkDefault true;
|
||||||
|
# networking.interfaces.wlp0s20f3.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
244
home_manager.nix
Normal file
244
home_manager.nix
Normal file
|
@ -0,0 +1,244 @@
|
||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(import <home-manager/nixos>)
|
||||||
|
];
|
||||||
|
home-manager.users.catvayor = {
|
||||||
|
home.stateVersion = "23.11";
|
||||||
|
|
||||||
|
xdg.configFile."sway/config".onChange = lib.mkForce "";
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
MOZ_ENABLE_WAYLAND = "1";
|
||||||
|
MOZ_USE_XINPUT2 = "1";
|
||||||
|
SDL_VIDEODRIVER = "wayland";
|
||||||
|
QT_QPA_PLATFORM = "wayland";
|
||||||
|
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
||||||
|
_JAVA_AWT_WM_NONREPARETING = "1";
|
||||||
|
XDG_SESSION_TYPE = "wayland";
|
||||||
|
XDG_CURRENT_DESKTOP = "sway";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
wl-clipboard
|
||||||
|
firefox
|
||||||
|
pavucontrol
|
||||||
|
font-awesome
|
||||||
|
libnotify
|
||||||
|
|
||||||
|
discord
|
||||||
|
signal-desktop
|
||||||
|
mattermost-desktop
|
||||||
|
keepassxc
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.thunderbird.enable = true;
|
||||||
|
programs.thunderbird.profiles = {};
|
||||||
|
programs.waybar.enable = true;
|
||||||
|
home.file.".config/waybar" = { source = ./waybar; recursive = true; };
|
||||||
|
programs.alacritty = { enable = true; settings = lib.importTOML ./alacritty.toml; };
|
||||||
|
services.mako = {
|
||||||
|
enable = true;
|
||||||
|
width = 400;
|
||||||
|
height = 200;
|
||||||
|
maxVisible = 5;
|
||||||
|
backgroundColor = "#8C3586";
|
||||||
|
textColor = "#F4F40E";
|
||||||
|
borderColor = "#F4F40E";
|
||||||
|
defaultTimeout = 5000;
|
||||||
|
};
|
||||||
|
|
||||||
|
gtk = {
|
||||||
|
enable = true;
|
||||||
|
theme = { package = pkgs.arc-theme; name = "Arc-Dark"; };
|
||||||
|
iconTheme = { package = pkgs.arc-icon-theme; name = "Arc"; };
|
||||||
|
cursorTheme = { package = pkgs.breeze-hacked-cursor-theme; name = "Breeze_Hacked"; };
|
||||||
|
};
|
||||||
|
home.pointerCursor = { package = pkgs.breeze-hacked-cursor-theme; name = "Breeze_Hacked"; };
|
||||||
|
xdg.enable = true;
|
||||||
|
|
||||||
|
services.swayidle =
|
||||||
|
let lockwall = pkgs.runCommand "lock_wall.jpg" {} ''${pkgs.ffmpeg}/bin/ffmpeg -i ${./wall.jpg} -filter_complex 'gblur=sigma=3' $out -y'';
|
||||||
|
in {
|
||||||
|
enable = true;
|
||||||
|
timeouts = [
|
||||||
|
{
|
||||||
|
timeout = 300;
|
||||||
|
command = ''${pkgs.systemd}/bin/loginctl lock-session && ${pkgs.sway}/bin/swaymsg "output * dpms off"'';
|
||||||
|
resumeCommand = ''${pkgs.sway}/bin/swaymsg "output * dpms on"'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
events = [
|
||||||
|
{ event = "before-sleep"; command = "${pkgs.systemd}/bin/loginctl lock-session"; }
|
||||||
|
{ event = "lock"; command = "${pkgs.swaylock}/bin/swaylock -f -i ${lockwall}"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
wayland.windowManager.sway = {
|
||||||
|
enable = true;
|
||||||
|
xwayland = true;
|
||||||
|
wrapperFeatures = {
|
||||||
|
base = false;
|
||||||
|
gtk = false;
|
||||||
|
};
|
||||||
|
extraConfig = ''workspace 1'';
|
||||||
|
config =
|
||||||
|
let menuCmd = "${pkgs.wofi}/bin/wofi --show drun -i | xargs swaymsg exec --";
|
||||||
|
exitMd = ''Exit Mode:| (l)Log out | (r)Reboot | (p)Poweroff'';
|
||||||
|
weechatCmd = pkgs.writeShellScript "weechat.sh" ''
|
||||||
|
nix-shell -p python3 python311Packages.dbus-python python311Packages.notify2 --run 'python ${./weenotify.py} -s' > /dev/null &
|
||||||
|
while true; do
|
||||||
|
ssh -R 5431:localhost:5431 weecat@watcher.kat -t screen -xaA -S weechat
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
in rec {
|
||||||
|
window.border = 1;
|
||||||
|
gaps.smartBorders = "on";
|
||||||
|
modifier = "Mod4";
|
||||||
|
terminal = "alacritty";
|
||||||
|
input."type:keyboard".xkb_layout = "fr";
|
||||||
|
startup = [
|
||||||
|
{ command = "${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ on"; }
|
||||||
|
|
||||||
|
{ command = "discord"; }
|
||||||
|
{ command = "thunderbird"; }
|
||||||
|
{ command = "mattermost-desktop"; }
|
||||||
|
{ command = "signal-desktop --"; }
|
||||||
|
{ command = ''sh -c "sleep 2 && exec keepassxc"''; }
|
||||||
|
{ command = "alacritty --class weechat --title weechat --command ${pkgs.bash}/bin/bash -c ${weechatCmd}"; }
|
||||||
|
];
|
||||||
|
assigns = {
|
||||||
|
"1" = [{ app_id="firefox"; }];
|
||||||
|
"9" = [{ app_id="thunderbird"; }];
|
||||||
|
"10" = [
|
||||||
|
{ class="Mattermost"; }
|
||||||
|
{ class="Signal"; }
|
||||||
|
{ class="discord"; }
|
||||||
|
{ app_id="weechat"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
bars = [{
|
||||||
|
command = "waybar";
|
||||||
|
mode = "hide";
|
||||||
|
}];
|
||||||
|
output."*".bg = "${./wall.jpg} fill";
|
||||||
|
seat."*"."hide_cursor" = "5000";
|
||||||
|
focus.wrapping = "yes";
|
||||||
|
window.titlebar = false;
|
||||||
|
colors =
|
||||||
|
let black = "#000000";
|
||||||
|
dark = "#111111";
|
||||||
|
adark = "#111111BB";
|
||||||
|
aadark = "#11111177";
|
||||||
|
highl = "#222222";
|
||||||
|
gray = "#777777";
|
||||||
|
white = "#FFFFFF";
|
||||||
|
color = "#FFBB00";
|
||||||
|
urgent = "#FF0000";
|
||||||
|
in {
|
||||||
|
focused = {border = adark; background = adark; text = white; indicator = color; childBorder = color; };
|
||||||
|
unfocused = {border = aadark; background = aadark; text = gray; indicator = dark; childBorder = dark; };
|
||||||
|
focusedInactive = {border = adark; background = adark; text = gray; indicator = dark; childBorder = dark; };
|
||||||
|
urgent = {border = urgent; background = urgent; text = white; indicator = urgent; childBorder = urgent; };
|
||||||
|
};
|
||||||
|
modes = {
|
||||||
|
"display" = {
|
||||||
|
"Left" = "output - transform 90";
|
||||||
|
"Down" = "output - transform normal";
|
||||||
|
"Up" = "output - transform 180";
|
||||||
|
"Right" = "output - transform 270";
|
||||||
|
|
||||||
|
"Shift+Left" = "output - transform flipped-90";
|
||||||
|
"Shift+Down" = "output - transform flipped";
|
||||||
|
"Shift+Up" = "output - transform flipped-180";
|
||||||
|
"Shift+Right" = "output - transform flipped-270";
|
||||||
|
|
||||||
|
"Escape" = ''mode default"'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"resize" = {
|
||||||
|
"Left" = "resize shrink width 10px";
|
||||||
|
"Down" = "resize grow height 10px";
|
||||||
|
"Up" = "resize shrink height 10px";
|
||||||
|
"Right" = "resize grow width 10px";
|
||||||
|
|
||||||
|
"Escape" = ''mode default"'';
|
||||||
|
};
|
||||||
|
|
||||||
|
"${exitMd}" = {
|
||||||
|
"l" = "exec swaymsg exit";
|
||||||
|
"r" = "exec systemctl reboot";
|
||||||
|
"p" = "exec systemctl poweroff";
|
||||||
|
"Escape" = ''mode default"'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
keybindings = {
|
||||||
|
"${modifier}+Return" = "exec ${terminal}";
|
||||||
|
"${modifier}+q" = "kill";
|
||||||
|
"${modifier}+d" = "exec ${menuCmd}";
|
||||||
|
"${modifier}+Shift+f" = "exec firefox";
|
||||||
|
"${modifier}+Shift+c" = "reload";
|
||||||
|
"${modifier}+p" = ''exec ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp -d)" - | ${pkgs.wl-clipboard}/bin/wl-copy -t image/png'';
|
||||||
|
"Print" = "exec ${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy -t image/png";
|
||||||
|
|
||||||
|
"${modifier}+x" = ''mode "display"'';
|
||||||
|
"${modifier}+r" = ''mode "resize"'';
|
||||||
|
|
||||||
|
"${modifier}+Shift+e" = ''mode "${exitMd}"'';
|
||||||
|
"${modifier}+l" = "exec ${pkgs.systemd}/bin/loginctl lock-session";
|
||||||
|
|
||||||
|
"${modifier}+Left" = "focus left";
|
||||||
|
"${modifier}+Down" = "focus down";
|
||||||
|
"${modifier}+Up" = "focus up";
|
||||||
|
"${modifier}+Right" = "focus right";
|
||||||
|
"${modifier}+ampersand" = "workspace 1";
|
||||||
|
"${modifier}+eacute" = "workspace 2";
|
||||||
|
"${modifier}+quotedbl" = "workspace 3";
|
||||||
|
"${modifier}+apostrophe" = "workspace 4";
|
||||||
|
"${modifier}+parenleft" = "workspace 5";
|
||||||
|
"${modifier}+minus" = "workspace 6";
|
||||||
|
"${modifier}+egrave" = "workspace 7";
|
||||||
|
"${modifier}+underscore" = "workspace 8";
|
||||||
|
"${modifier}+ccedilla" = "workspace 9";
|
||||||
|
"${modifier}+agrave" = "workspace 10";
|
||||||
|
|
||||||
|
"${modifier}+Shift+Left" = "move left";
|
||||||
|
"${modifier}+Shift+Down" = "move down";
|
||||||
|
"${modifier}+Shift+Up" = "move up";
|
||||||
|
"${modifier}+Shift+Right" = "move right";
|
||||||
|
"${modifier}+Shift+ampersand" = "move container to workspace 1";
|
||||||
|
"${modifier}+Shift+eacute" = "move container to workspace 2";
|
||||||
|
"${modifier}+Shift+quotedbl" = "move container to workspace 3";
|
||||||
|
"${modifier}+Shift+apostrophe" = "move container to workspace 4";
|
||||||
|
"${modifier}+Shift+parenleft" = "move container to workspace 5";
|
||||||
|
"${modifier}+Shift+minus" = "move container to workspace 6";
|
||||||
|
"${modifier}+Shift+egrave" = "move container to workspace 7";
|
||||||
|
"${modifier}+Shift+underscore" = "move container to workspace 8";
|
||||||
|
"${modifier}+Shift+ccedilla" = "move container to workspace 9";
|
||||||
|
"${modifier}+Shift+agrave" = "move container to workspace 10";
|
||||||
|
|
||||||
|
"${modifier}+b" = "splith";
|
||||||
|
"${modifier}+v" = "splitv";
|
||||||
|
"${modifier}+Shift+s" = "layout stacking";
|
||||||
|
"${modifier}+w" = "layout tabbed";
|
||||||
|
"${modifier}+s" = "layout toggle split";
|
||||||
|
|
||||||
|
"${modifier}+f" = "fullscreen";
|
||||||
|
"${modifier}+Shift+space" = "floating toggle";
|
||||||
|
"${modifier}+space" = "focus mode toggle";
|
||||||
|
"${modifier}+z" = "focus parent";
|
||||||
|
"${modifier}+Shift+z" = "focus child";
|
||||||
|
"${modifier}+Shift+F1" = "move scratchpad";
|
||||||
|
"${modifier}+F1" = "scratchpad show";
|
||||||
|
|
||||||
|
"XF86AudioRaiseVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%";
|
||||||
|
"XF86AudioLowerVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%";
|
||||||
|
"XF86AudioMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle";
|
||||||
|
"XF86AudioMicMute" = "exec ${pkgs.pulseaudio}/bin/pactl set-source-mute @DEFAULT_SOURCE@ toggle";
|
||||||
|
"XF86MonBrightnessDown" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set 5%-";
|
||||||
|
"XF86MonBrightnessUp" = "exec ${pkgs.brightnessctl}/bin/brightnessctl set +5%";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
160
nvim/cfg.vim
Normal file
160
nvim/cfg.vim
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
let &packpath = &runtimepath
|
||||||
|
filetype plugin indent on
|
||||||
|
syntax enable
|
||||||
|
|
||||||
|
" Use :help 'option' to see the documentation for the given option.
|
||||||
|
|
||||||
|
set autoindent
|
||||||
|
set backspace=indent,eol,start
|
||||||
|
set complete-=i
|
||||||
|
set smarttab
|
||||||
|
|
||||||
|
let g:mapleader=";"
|
||||||
|
|
||||||
|
set nrformats-=octal
|
||||||
|
|
||||||
|
set ttimeout
|
||||||
|
set ttimeoutlen=100
|
||||||
|
|
||||||
|
set incsearch
|
||||||
|
|
||||||
|
" Use <C-L> to clear the highlighting of :set hlsearch.
|
||||||
|
if maparg('<C-L>', 'n') ==# ''
|
||||||
|
nnoremap <silent> <C-L> :nohlsearch<CR><C-L>
|
||||||
|
endif
|
||||||
|
|
||||||
|
set laststatus=2
|
||||||
|
set ruler
|
||||||
|
set showcmd
|
||||||
|
set wildmenu
|
||||||
|
|
||||||
|
if !&scrolloff
|
||||||
|
set scrolloff=1
|
||||||
|
endif
|
||||||
|
if !&sidescrolloff
|
||||||
|
set sidescrolloff=5
|
||||||
|
endif
|
||||||
|
set display+=lastline
|
||||||
|
|
||||||
|
if &listchars ==# 'eol:$'
|
||||||
|
set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+
|
||||||
|
endif
|
||||||
|
|
||||||
|
if v:version > 703 || v:version == 703 && has("patch541")
|
||||||
|
set formatoptions+=j " Delete comment character when joining commented lines
|
||||||
|
endif
|
||||||
|
|
||||||
|
if has('path_extra')
|
||||||
|
setglobal tags-=./tags tags^=./tags;
|
||||||
|
endif
|
||||||
|
|
||||||
|
set autoread
|
||||||
|
|
||||||
|
if &history < 1000
|
||||||
|
set history=1000
|
||||||
|
endif
|
||||||
|
if &tabpagemax < 50
|
||||||
|
set tabpagemax=50
|
||||||
|
endif
|
||||||
|
if !empty(&viminfo)
|
||||||
|
set viminfo^=!
|
||||||
|
endif
|
||||||
|
set sessionoptions-=options
|
||||||
|
|
||||||
|
" Allow color schemes to do bright colors without forcing bold.
|
||||||
|
if &t_Co == 8 && $TERM !~# '^linux'
|
||||||
|
set t_Co=16
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Load matchit.vim, but only if the user hasn't installed a newer version.
|
||||||
|
if !exists('g:loaded_matchit') && findfile('plugin/matchit.vim', &rtp) ==# ''
|
||||||
|
runtime! macros/matchit.vim
|
||||||
|
endif
|
||||||
|
|
||||||
|
inoremap <C-U> <C-G>u<C-U>
|
||||||
|
set mouse=a
|
||||||
|
vmap <LeftRelease> "*ygv
|
||||||
|
|
||||||
|
set tabstop=2
|
||||||
|
set shiftwidth=2
|
||||||
|
set expandtab
|
||||||
|
|
||||||
|
syntax enable
|
||||||
|
|
||||||
|
" let g:coqtail_nomap = 1
|
||||||
|
"
|
||||||
|
" function Coqfun(count, cmd)
|
||||||
|
" if a:count == 0
|
||||||
|
" let l:count=1
|
||||||
|
" else
|
||||||
|
" let l:count=a:count
|
||||||
|
" endif
|
||||||
|
" execute a:cmd . l:count
|
||||||
|
" endfunction
|
||||||
|
"
|
||||||
|
" map <A-c> :CoqStart<CR>
|
||||||
|
" map <A-q> :CoqStop<CR>
|
||||||
|
" map <A-j> :<C-U>call Coqfun(v:count,"CoqNext")<CR>
|
||||||
|
" map <A-k> :<C-U>call Coqfun(v:count,"CoqUndo")<CR>
|
||||||
|
" map <A-l> :CoqToLine<CR>
|
||||||
|
" imap <A-j> <C-O>:call Coqfun(v:count,"CoqNext")<CR>
|
||||||
|
" imap <A-k> <C-O>:call Coqfun(v:count,"CoqUndo")<CR>
|
||||||
|
" imap <A-l> <C-O>:CoqToLine<CR>
|
||||||
|
"
|
||||||
|
" au BufRead,BufNewFile *.lus,*.ept setlocal filetype=lustre
|
||||||
|
|
||||||
|
""""""""""""""""""""""""""""""""" Colors
|
||||||
|
nnoremap <C-J> a<CR><Esc>k$
|
||||||
|
|
||||||
|
set background=dark
|
||||||
|
hi clear
|
||||||
|
if exists("syntax_on")
|
||||||
|
syntax reset
|
||||||
|
endif
|
||||||
|
let g:colors_name = "perso"
|
||||||
|
|
||||||
|
set cursorline
|
||||||
|
set number
|
||||||
|
set relativenumber
|
||||||
|
|
||||||
|
autocmd InsertEnter * set relativenumber!
|
||||||
|
autocmd InsertLeave * set relativenumber!
|
||||||
|
|
||||||
|
map <F2> :set number!<CR>
|
||||||
|
map <F3> :set relativenumber!<CR>
|
||||||
|
|
||||||
|
hi Normal guifg=cyan guibg=black
|
||||||
|
hi NonText guifg=yellow guibg=#303030
|
||||||
|
hi comment guifg=green
|
||||||
|
hi constant guifg=cyan gui=bold
|
||||||
|
hi identifier guifg=cyan gui=NONE
|
||||||
|
hi statement guifg=lightblue gui=NONE
|
||||||
|
hi preproc guifg=Pink2
|
||||||
|
hi type guifg=seagreen gui=bold
|
||||||
|
hi special guifg=yellow
|
||||||
|
hi ErrorMsg guifg=Black guibg=Red
|
||||||
|
hi WarningMsg guifg=Black guibg=Green
|
||||||
|
hi Error guibg=Red
|
||||||
|
hi Todo guifg=Black guibg=orange
|
||||||
|
hi Cursor guibg=#60a060 guifg=#00ff00
|
||||||
|
hi Search guibg=darkgray guifg=black gui=bold
|
||||||
|
hi IncSearch gui=NONE guibg=steelblue
|
||||||
|
hi LineNr guifg=darkgrey ctermbg=234 ctermfg=141
|
||||||
|
hi CursorLine cterm = NONE
|
||||||
|
hi CursorLineNR cterm=NONE ctermbg=black
|
||||||
|
hi title guifg=darkgrey
|
||||||
|
hi ShowMarksHL ctermfg=cyan ctermbg=lightblue cterm=bold guifg=yellow guibg=black gui=bold
|
||||||
|
hi StatusLineNC gui=NONE guifg=lightblue guibg=darkblue
|
||||||
|
hi StatusLine gui=bold guifg=cyan guibg=blue
|
||||||
|
hi label guifg=gold2
|
||||||
|
hi operator guifg=orange
|
||||||
|
hi clear Visual
|
||||||
|
hi Visual term=reverse cterm=reverse gui=reverse
|
||||||
|
hi DiffChange guibg=darkgreen
|
||||||
|
hi DiffText guibg=olivedrab
|
||||||
|
hi DiffAdd guibg=slateblue
|
||||||
|
hi DiffDelete guibg=coral
|
||||||
|
hi Folded guibg=gray30
|
||||||
|
hi FoldColumn guibg=gray30 guifg=white
|
||||||
|
hi cIf0 guifg=gray
|
||||||
|
hi diffOnly guifg=red gui=bold
|
BIN
wall.jpg
Normal file
BIN
wall.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.5 MiB |
158
waybar/config
Normal file
158
waybar/config
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
// Global
|
||||||
|
{
|
||||||
|
"layer": "top",
|
||||||
|
"position": "bottom",
|
||||||
|
"ipc": true,
|
||||||
|
|
||||||
|
// If height property would be not present, it'd be calculated dynamically
|
||||||
|
//"height": 20,
|
||||||
|
|
||||||
|
"modules-left": [
|
||||||
|
//"custom/launcher",
|
||||||
|
"sway/workspaces",
|
||||||
|
"sway/mode",
|
||||||
|
],
|
||||||
|
|
||||||
|
"modules-center": [
|
||||||
|
],
|
||||||
|
|
||||||
|
"modules-right": [
|
||||||
|
"network",
|
||||||
|
"idle_inhibitor",
|
||||||
|
"memory",
|
||||||
|
"cpu",
|
||||||
|
"pulseaudio",
|
||||||
|
"custom/keyboard-layout",
|
||||||
|
"battery",
|
||||||
|
"backlight",
|
||||||
|
"tray",
|
||||||
|
//"custom/power",
|
||||||
|
"clock",
|
||||||
|
],
|
||||||
|
|
||||||
|
// Modules
|
||||||
|
|
||||||
|
"idle_inhibitor": {
|
||||||
|
"format": "{icon}",
|
||||||
|
"format-icons":{
|
||||||
|
"activated": "",
|
||||||
|
"deactivated": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"battery": {
|
||||||
|
"states": {
|
||||||
|
"good": 100,
|
||||||
|
"warning": 30,
|
||||||
|
"critical": 15
|
||||||
|
},
|
||||||
|
"format": "{capacity}% {icon}",
|
||||||
|
"format-charging": "{capacity}% ",
|
||||||
|
"format-plugged": "{capacity}% ",
|
||||||
|
// "format-good": "", // An empty format will hide the module
|
||||||
|
// "format-full": "",
|
||||||
|
"format-icons": ["", "", "", "", ""]
|
||||||
|
},
|
||||||
|
|
||||||
|
"clock": {
|
||||||
|
"interval": 1,
|
||||||
|
"format": "{:%d-%m-%Y %H:%M:%OS}",
|
||||||
|
},
|
||||||
|
|
||||||
|
"cpu": {
|
||||||
|
"interval": 1,
|
||||||
|
"format": "{icon0}{icon1}{icon2}{icon3}{icon4}{icon5}{icon6}{icon7} {avg_frequency:0.1f}GHz ", // Icon: microchip
|
||||||
|
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"],
|
||||||
|
"states": {
|
||||||
|
"warning": 70,
|
||||||
|
"critical": 90,
|
||||||
|
},
|
||||||
|
"on-click": "xfce4-terminal -e 'top'",
|
||||||
|
},
|
||||||
|
|
||||||
|
"custom/keyboard-layout": {
|
||||||
|
"exec": "swaymsg -t get_inputs | grep -m1 'xkb_active_layout_name' | cut -d '\"' -f4 | head -c2",
|
||||||
|
"interval": 30, // Interval set only as a fallback, as the value is updated by signal
|
||||||
|
"format": "{} ", // Icon: keyboard
|
||||||
|
"signal": 1, // SIGHUP, Signal sent by Sway key binding (~/.config/sway/key-bindings)
|
||||||
|
"tooltip": false,
|
||||||
|
"on-click": "swaymsg input 1:1:AT_Translated_Set_2_keyboard xkb_switch_layout next",
|
||||||
|
},
|
||||||
|
|
||||||
|
"memory": {
|
||||||
|
"interval": 5,
|
||||||
|
"format" : "{icon} ",
|
||||||
|
"tooltip" : true,
|
||||||
|
"tooltip-format": "{used:0.1f}/{total:0.1f}G, swap {swapUsed:0.1f}/{swapTotal:0.1f}G",
|
||||||
|
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"],
|
||||||
|
"on-click": "xfce4-terminal -e 'htop'",
|
||||||
|
"states": {
|
||||||
|
"warning": 70,
|
||||||
|
"critical": 90
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"network": {
|
||||||
|
"interval": 5,
|
||||||
|
"format-wifi": "{essid}: {signalStrength}% ", // Icon: wifi
|
||||||
|
"format-ethernet": "", // Icon: ethernet
|
||||||
|
"format-disconnected": "",
|
||||||
|
"tooltip-format": "{ifname}: {ipaddr}",
|
||||||
|
"tooltip-format-disconnected": "Disconnected",
|
||||||
|
"on-click": "xfce4-terminal -e 'nmtui'",
|
||||||
|
"on-click-right": "wl-copy $(ip -json route get 8.8.8.8 | jq -r '.[].prefsrc')", // copy ip-address
|
||||||
|
},
|
||||||
|
|
||||||
|
"sway/mode": {
|
||||||
|
"format": "{}",
|
||||||
|
"tooltip": false
|
||||||
|
},
|
||||||
|
|
||||||
|
"sway/workspaces": {
|
||||||
|
"disable-scroll": true,
|
||||||
|
"disable-markup" : false,
|
||||||
|
"all-outputs": true,
|
||||||
|
"format":"{icon}",
|
||||||
|
"format-icons": {
|
||||||
|
//"3": "",
|
||||||
|
//"4": "",
|
||||||
|
//"5": "",
|
||||||
|
//"6": "",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"pulseaudio": {
|
||||||
|
"scroll-step": 1, // %, can be a float
|
||||||
|
"format": "{volume}% {icon}",
|
||||||
|
"format-bluetooth": "{volume}% {icon} {format_source}",
|
||||||
|
"format-bluetooth-muted": "× {icon} {format_source}",
|
||||||
|
"format-muted": "×",
|
||||||
|
"format-source": "{volume}% ",
|
||||||
|
"format-source-muted": "",
|
||||||
|
"format-icons": {
|
||||||
|
"headphone": "",
|
||||||
|
"hands-free": "וֹ",
|
||||||
|
"headset": " ",
|
||||||
|
"phone": "",
|
||||||
|
"portable": "",
|
||||||
|
"car": "",
|
||||||
|
"default": [""]
|
||||||
|
},
|
||||||
|
"on-click": "pavucontrol",
|
||||||
|
"on-scroll-up": "pamixer -ui 2",
|
||||||
|
"on-scroll-down": "pamixer -ud 2",
|
||||||
|
},
|
||||||
|
|
||||||
|
"tray": {
|
||||||
|
"icon-size": 18,
|
||||||
|
"spacing":10,
|
||||||
|
},
|
||||||
|
|
||||||
|
"backlight" :{
|
||||||
|
"scroll-step": 1, // %, can be a float
|
||||||
|
"format": "{percent}% {icon}",
|
||||||
|
"format-icons": [""],
|
||||||
|
"on-scroll-down": "brightnessctl -c backlight set 1%-",
|
||||||
|
"on-scroll-up": "brightnessctl -c backlight set +1%"
|
||||||
|
},
|
||||||
|
}
|
196
waybar/style.css
Normal file
196
waybar/style.css
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
/* =============================================================================
|
||||||
|
*
|
||||||
|
* Waybar configuration
|
||||||
|
*
|
||||||
|
* Configuration reference: https://github.com/Alexays/Waybar/wiki/Configuration
|
||||||
|
*
|
||||||
|
* =========================================================================== */
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Keyframes
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@define-color highlight #ffbb00 ;
|
||||||
|
@define-color base1 #111111 ;
|
||||||
|
@define-color lgray #cccccc ;
|
||||||
|
@define-color dgray #777777 ;
|
||||||
|
@define-color urgent #ee1100 ;
|
||||||
|
|
||||||
|
@keyframes blink-warning {
|
||||||
|
70% {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
color: white;
|
||||||
|
background-color: orange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes blink-critical {
|
||||||
|
70% {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
color: white;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Base styles
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Reset all styles */
|
||||||
|
* {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
min-height: 0;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0;
|
||||||
|
all: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The whole bar */
|
||||||
|
#waybar {
|
||||||
|
background: transparent;
|
||||||
|
color: #bebebe;
|
||||||
|
background-color: @base1;
|
||||||
|
font-family: "Ubuntu", "Font Awesome 6 Free-Solid";
|
||||||
|
/* font-weight: bold; */
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Every modules */
|
||||||
|
#battery,
|
||||||
|
#clock,
|
||||||
|
#backlight,
|
||||||
|
#cpu,
|
||||||
|
#custom-keyboard-layout,
|
||||||
|
#memory,
|
||||||
|
#mode,
|
||||||
|
#custom-weather,
|
||||||
|
#network,
|
||||||
|
#pulseaudio,
|
||||||
|
#temperature,
|
||||||
|
#tray,
|
||||||
|
#idle_inhibitor,
|
||||||
|
#custom-PBPbattery {
|
||||||
|
padding:0.0rem 1rem;
|
||||||
|
margin: 0px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Modules styles
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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: @highlight;
|
||||||
|
border-bottom: 3px transparent;
|
||||||
|
color:white;
|
||||||
|
}
|
||||||
|
|
||||||
|
#network.disconnected {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
#temperature.critical {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces {
|
||||||
|
font-size:14px;
|
||||||
|
margin: 2px;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button {
|
||||||
|
border-bottom: 0px solid transparent;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
padding-top: 3px;
|
||||||
|
min-width: 20px;
|
||||||
|
margin-right: 1px;
|
||||||
|
color: @lgray;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.current_output {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.visible {
|
||||||
|
border-bottom: 3px solid @lgray;
|
||||||
|
padding-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.focused {
|
||||||
|
border-bottom: 3px solid transparent;
|
||||||
|
padding-bottom: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.current_output.visible {
|
||||||
|
border-bottom: 3px solid @dgray;
|
||||||
|
padding-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.current_output.focused {
|
||||||
|
border-bottom: 3px solid @highlight;
|
||||||
|
padding-top: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.urgent {
|
||||||
|
border-bottom: 3px solid @urgent;
|
||||||
|
padding-top: 0px;
|
||||||
|
color: @urgent;
|
||||||
|
}
|
294
weenotify.py
Normal file
294
weenotify.py
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
# BSD 2-Clause License
|
||||||
|
#
|
||||||
|
# Copyright (c) 2018, Elia El Lazkani
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice, this
|
||||||
|
# list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
"""
|
||||||
|
Local mode dependencies:
|
||||||
|
- weechat
|
||||||
|
- dbus-python
|
||||||
|
- notify2
|
||||||
|
|
||||||
|
Remote mode dependencies:
|
||||||
|
- weechat
|
||||||
|
|
||||||
|
Server mode dependencies:
|
||||||
|
- dbus-python
|
||||||
|
- notify2
|
||||||
|
|
||||||
|
This script acts as both server and weechat plugin. One can configure it to run
|
||||||
|
locally on the box in which case it will use *notify2* to send notifications
|
||||||
|
through dbus to the user. Or, one can run it in remote mode where both
|
||||||
|
the _host_ and the _port_ need to be configured to send notifications to the server.
|
||||||
|
|
||||||
|
If you are running weechat in an ssh session, you can do the following:
|
||||||
|
> ssh -R 5431:localhost:5431 user@host
|
||||||
|
|
||||||
|
The above will ssh tunnel port 5431 between guest and host and notifications can be
|
||||||
|
sent to the server running locally on your machine.
|
||||||
|
|
||||||
|
To run the server, do the following:
|
||||||
|
> python weenotify.py -s
|
||||||
|
|
||||||
|
One can get the full script help print with:
|
||||||
|
> python weenotify.py -h
|
||||||
|
"""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import socket
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
try:
|
||||||
|
import notify2 as Notify
|
||||||
|
import dbus
|
||||||
|
notify_imported = True
|
||||||
|
dbus_imported = True
|
||||||
|
except ImportError:
|
||||||
|
try:
|
||||||
|
import dbus
|
||||||
|
dbus_imported = True
|
||||||
|
except ImportError:
|
||||||
|
dbus_imported = False
|
||||||
|
notify_imported = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
import weechat as w
|
||||||
|
weechat_imported = True
|
||||||
|
except ImportError:
|
||||||
|
weechat_imported = False
|
||||||
|
|
||||||
|
SCRIPT_NAME = "weenotify"
|
||||||
|
SCRIPT_AUTHOR = "Elia El Lazkani <elia.el.lazkani@gmail.com>"
|
||||||
|
SCRIPT_VERSION = "0.4"
|
||||||
|
SCRIPT_LICENSE = "BSD-2-Clause"
|
||||||
|
SCRIPT_DESCRIPTION = "Plugin/Server to send/receive notifications and display them"
|
||||||
|
|
||||||
|
def listener(sockt):
|
||||||
|
""" Method to handle incoming data from client """
|
||||||
|
conn, addr = sockt.accept()
|
||||||
|
try:
|
||||||
|
data = ""
|
||||||
|
_partial = conn.recv(1024).decode('utf-8')
|
||||||
|
while _partial:
|
||||||
|
data += _partial
|
||||||
|
_partial = conn.recv(1024).decode('utf-8')
|
||||||
|
except Exception:
|
||||||
|
conn.close()
|
||||||
|
return
|
||||||
|
|
||||||
|
if data:
|
||||||
|
print("{}: {}".format(addr, data.strip('\n')))
|
||||||
|
notify(json.loads(data.strip()))
|
||||||
|
|
||||||
|
def server(host, port):
|
||||||
|
""" Method to run the server in a loop """
|
||||||
|
print("Starting server...")
|
||||||
|
host = host if host else ''
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
s.bind((host, port))
|
||||||
|
s.listen(5)
|
||||||
|
if host:
|
||||||
|
print("Server listening on {}:{}...".format(host, port))
|
||||||
|
else:
|
||||||
|
print("Server listening locally on port {}...".format(port))
|
||||||
|
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
listener(s)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("Shutting down server...")
|
||||||
|
finally:
|
||||||
|
s.close()
|
||||||
|
|
||||||
|
def notify(data):
|
||||||
|
""" Method to notify the user through dbus """
|
||||||
|
if data['prefix'] != '--':
|
||||||
|
try:
|
||||||
|
msg = "{} => {}: {}".format(data['buffer'],
|
||||||
|
data['prefix'],
|
||||||
|
data['message'])
|
||||||
|
except UnicodeEncodeError:
|
||||||
|
# Yey to python2
|
||||||
|
msg = "{} => {}: {}".format(data['buffer'],
|
||||||
|
data['prefix'],
|
||||||
|
data['message'].encode('utf-8'))
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
msg = "{} => {}".format(data['buffer'],
|
||||||
|
data['message'])
|
||||||
|
except UnicodeEncodeError:
|
||||||
|
# Woohoo python2
|
||||||
|
msg = "{} => {}".format(data['buffer'],
|
||||||
|
data['message'].encode('utf-8'))
|
||||||
|
Notify.init(SCRIPT_NAME)
|
||||||
|
notification = Notify.Notification(data['type'], msg)
|
||||||
|
try:
|
||||||
|
notification.show()
|
||||||
|
except dbus.exceptions.DBusException as e:
|
||||||
|
print(e)
|
||||||
|
pass
|
||||||
|
|
||||||
|
def local_notify(data):
|
||||||
|
""" Method to send notification locally on the host """
|
||||||
|
if notify_imported:
|
||||||
|
notify(data)
|
||||||
|
else:
|
||||||
|
if dbus_imported:
|
||||||
|
w.prnt("", "notify2 could not be imported, disabling {}"
|
||||||
|
.format(SCRIPT_NAME))
|
||||||
|
else:
|
||||||
|
w.prnt("", "notify2 could not be imported due to missing dbus-python,"
|
||||||
|
"disabling {}".format(SCRIPT_NAME))
|
||||||
|
w.config_set_plugin('enable', 'off')
|
||||||
|
|
||||||
|
def send(host, port, msg):
|
||||||
|
""" Method to send data to the server for notification display """
|
||||||
|
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
try:
|
||||||
|
c.connect((host, port))
|
||||||
|
except Exception:
|
||||||
|
c.close()
|
||||||
|
return
|
||||||
|
message = "{}".format(json.dumps(msg))
|
||||||
|
message = str.encode(message, 'utf-8')
|
||||||
|
c.sendall(message)
|
||||||
|
c.close()
|
||||||
|
|
||||||
|
def on_notify(data, buffer, date, tags, displayed,
|
||||||
|
highlight, prefix, message):
|
||||||
|
""" Method to take action on client notification """
|
||||||
|
enable = w.config_get_plugin('enable')
|
||||||
|
if enable.lower() == 'on':
|
||||||
|
data = weechat_parser(data, buffer, date, tags, displayed,
|
||||||
|
highlight, prefix, message)
|
||||||
|
if data:
|
||||||
|
mode = w.config_get_plugin('mode')
|
||||||
|
if mode.lower() == 'remote':
|
||||||
|
host = w.config_get_plugin('host')
|
||||||
|
port = int(w.config_get_plugin('port'))
|
||||||
|
send(host, port, data)
|
||||||
|
else:
|
||||||
|
local_notify(data)
|
||||||
|
return w.WEECHAT_RC_OK
|
||||||
|
|
||||||
|
def weechat_parser(data, buffer, date, tags, displayed,
|
||||||
|
highlight, prefix, message):
|
||||||
|
""" Method to parte data coming from weechat and take action on it """
|
||||||
|
buffer_name = w.buffer_get_string(buffer, 'short_name')
|
||||||
|
if "NOTICE" in data and buffer_name != "highmon":
|
||||||
|
if buffer_name == prefix:
|
||||||
|
buffer_name = data
|
||||||
|
return { 'buffer': buffer_name,
|
||||||
|
'type': data,
|
||||||
|
'prefix': prefix,
|
||||||
|
'message': message }
|
||||||
|
elif "PRIVMSG" in data and "irc_notice" not in tags:
|
||||||
|
return { 'buffer': buffer_name,
|
||||||
|
'type': data,
|
||||||
|
'prefix': prefix,
|
||||||
|
'message': message }
|
||||||
|
elif "MSG" in data and int(highlight) and \
|
||||||
|
"irc_notice" not in tags:
|
||||||
|
return { 'buffer': buffer_name,
|
||||||
|
'type': data,
|
||||||
|
'prefix': prefix,
|
||||||
|
'message': message }
|
||||||
|
|
||||||
|
def client():
|
||||||
|
""" Method to register the plugin and hook into weechat """
|
||||||
|
settings = {
|
||||||
|
'enable': {
|
||||||
|
'description': 'Enable/Disable notifications.',
|
||||||
|
'values': ['off', 'on'],
|
||||||
|
'default': 'off'
|
||||||
|
},
|
||||||
|
'mode': {
|
||||||
|
'description': 'Set whether notifications need to be'
|
||||||
|
'sent locally or to an external server.',
|
||||||
|
'values': ['local', 'remote'],
|
||||||
|
'default': 'local'
|
||||||
|
},
|
||||||
|
'host': {
|
||||||
|
'description': 'Set the server host to send notifications to.',
|
||||||
|
'values': None,
|
||||||
|
'default': 'localhost'
|
||||||
|
},
|
||||||
|
'port': {
|
||||||
|
'description': 'Set the server port to use to send notifcation.',
|
||||||
|
'values': None,
|
||||||
|
'default': '5431'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE,
|
||||||
|
SCRIPT_DESCRIPTION, '', ''):
|
||||||
|
for option, value in settings.items():
|
||||||
|
if not w.config_is_set_plugin(option):
|
||||||
|
w.config_set_plugin(option, value['default'])
|
||||||
|
if value.get('values', None):
|
||||||
|
w.config_set_desc_plugin(option, '{} (values: [{}], default: {})'.format(
|
||||||
|
value['description'], '/'.join(value['values']), value['default']))
|
||||||
|
else:
|
||||||
|
w.config_set_desc_plugin(option, '{} (default: {})'.format(
|
||||||
|
value['description'], value['default']))
|
||||||
|
w.hook_print('', 'notify_message', '', 1, 'on_notify', 'MSG')
|
||||||
|
w.hook_print('', 'notify_private', '', 1, 'on_notify', 'PRIVMSG')
|
||||||
|
w.hook_print('', 'irc_notice', '', 1, 'on_notify', 'NOTICE')
|
||||||
|
|
||||||
|
def argument_parse():
|
||||||
|
""" Method to parse command line arguments """
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description=SCRIPT_DESCRIPTION)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-s', '--server', action='store_true',
|
||||||
|
help='Run in server mode.')
|
||||||
|
parser.add_argument(
|
||||||
|
'-H', '--host', type=str, default='',
|
||||||
|
help='The host/IP to bind to.')
|
||||||
|
parser.add_argument(
|
||||||
|
'-p', '--port', type=int, default=5431,
|
||||||
|
help='The port to listen to.')
|
||||||
|
parser.add_argument(
|
||||||
|
'-V', '--version', action='version',
|
||||||
|
version='%(prog)s {}'.format(SCRIPT_VERSION),
|
||||||
|
help='Prints version.')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argument_parse()
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.server:
|
||||||
|
if notify_imported:
|
||||||
|
server(args.host, args.port)
|
||||||
|
else:
|
||||||
|
if dbus_imported:
|
||||||
|
print("notify2 could not be imported")
|
||||||
|
else:
|
||||||
|
print("notify2 was not imported due to missing dbus-python")
|
||||||
|
else:
|
||||||
|
if weechat_imported:
|
||||||
|
client()
|
||||||
|
else:
|
||||||
|
print("weechat could not be imported, make sure weechat is running this")
|
Loading…
Reference in a new issue