diff --git a/hypridle/.config/hypr/hypridle.conf b/hypridle/.config/hypr/hypridle.conf new file mode 100644 index 0000000..9353723 --- /dev/null +++ b/hypridle/.config/hypr/hypridle.conf @@ -0,0 +1,27 @@ +general { + lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances. + before_sleep_cmd = loginctl lock-session # lock before suspend. + after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display. +} + +listener { + timeout = 150 # 2.5min. + on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor. + on-resume = brightnessctl -r # monitor backlight restore. +} + +listener { + timeout = 300 # 5min + on-timeout = loginctl lock-session # lock screen when timeout has passed +} + +listener { + timeout = 330 # 5.5min + on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed + on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired. +} + +listener { + timeout = 1800 # 30min + on-timeout = systemctl suspend # suspend pc +} \ No newline at end of file diff --git a/hyprland/.config/hypr/hyprland.conf b/hyprland/.config/hypr/hyprland.conf index 6de2486..42dd9aa 100644 --- a/hyprland/.config/hypr/hyprland.conf +++ b/hyprland/.config/hypr/hyprland.conf @@ -35,6 +35,8 @@ monitor= DP-1, 5120x1440@120, 0x0, 1 $terminal = kitty $fileManager = comsic-files $menu = rofi -show drun -theme rounded-purple-dark +$windowSwitcher = rofi -show window -theme rounded-purple-dark +$powerMenu = rofi -show power-menu -modi power-menu:rofi-power-menu -theme rounded-purple-dark ################# @@ -44,9 +46,14 @@ $menu = rofi -show drun -theme rounded-purple-dark # Autostart necessary processes (like notifications daemons, status bars, etc.) # Or execute your favorite apps at launch like this: -exec-once = waybar & hyprpaper +exec-once = waybar +exec-once = hyprpaper +exec-once = hypridle exec-once = systemctl --user start polkit-gnome +exec-once = [workspace 3] steam +exec-once = [workspace 4] flatpak run com.discordapp.Discord + ############################# ### ENVIRONMENT VARIABLES ### @@ -56,7 +63,7 @@ exec-once = systemctl --user start polkit-gnome env = XCURSOR_SIZE,24 env = HYPRCURSOR_SIZE,24 - +env = PATH,$PATH:$HOME/.local/bin ##################### ### LOOK AND FEEL ### @@ -181,7 +188,7 @@ input { kb_options = kb_rules = - follow_mouse = 2 + follow_mouse = 1 sensitivity = 0 # -1.0 - 1.0, 0 means no modification. @@ -197,6 +204,12 @@ device { sensitivity = -0.5 } +device { + name = bastard-keyboards-charybdis-(4x6)-splinky-mouse + sensitivity = -0.80 + accel_profile = adaptive +} + ################### ### KEYBINDINGS ### diff --git a/hyprland/.config/hypr/hyprland.conf.save b/hyprland/.config/hypr/hyprland.conf.save new file mode 100644 index 0000000..d9d525c --- /dev/null +++ b/hyprland/.config/hypr/hyprland.conf.save @@ -0,0 +1,223 @@ + +# ####################################################################################### +# AUTOGENERATED HYPRLAND CONFIG. +# PLEASE USE THE CONFIG PROVIDED IN THE GIT REPO /examples/hyprland.conf AND EDIT IT, +# OR EDIT THIS ONE ACCORDING TO THE WIKI INSTRUCTIONS. +# ####################################################################################### + +# This is an example Hyprland config file. +# Refer to the wiki for more information. +# https://wiki.hyprland.org/Configuring/ + +# Please note not all available settings / options are set here. +# For a full list, see the wiki + +# You can split this configuration into multiple files +# Create your files separately and then link them to this file like this: +# source = ~/.config/hypr/myColors.conf + + +################ +### MONITORS ### +################ + +# See https://wiki.hyprland.org/Configuring/Monitors/ +monitor= DP-1, 5120x1440@120, 0x0, 1 + + +################### +### MY PROGRAMS ### +################### + +# See https://wiki.hyprland.org/Configuring/Keywords/ + +# Set programs that you use +$terminal = kitty +$fileManager = comsic-files +$menu = rofi -show drun -theme rounded-purple-dark +$windowSwitcher = rofi -show window -theme rounded-purple-dark +$powerMenu = rofi -show power-menu -modi power-menu:rofi-power-menu -theme rounded-purple-dark + + +################# +### AUTOSTART ### +################# + +# Autostart necessary processes (like notifications daemons, status bars, etc.) +# Or execute your favorite apps at launch like this: + +exec-once = waybar +exec-once = hyprpaper +exec-once = hypridle +exec-once = systemctl --user start polkit-gnome + + +############################# +### ENVIRONMENT VARIABLES ### +############################# + +# See https://wiki.hyprland.org/Configuring/Environment-variables/ + +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 +env = PATH,$PATH:$HOME/.local/bin + +##################### +### LOOK AND FEEL ### +##################### + +# Refer to https://wiki.hyprland.org/Configuring/Variables/ + +# https://wiki.hyprland.org/Configuring/Variables/#general +general { + gaps_in = 5 + gaps_out = 20 + + border_size = 2 + + # https://wiki.hyprland.org/Configuring/Variables/#variable-types for info about colors + col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg + col.inactive_border = rgba(595959aa) + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +# https://wiki.hyprland.org/Configuring/Variables/#decoration +decoration { + rounding = 10 + + # Change transparency of focused and unfocused windows + active_opacity = 1.0 + inactive_opacity = 1.0 + + shadow { + enabled = true + range = 4 + render_power = 3 + color = rgba(1a1a1aee) + } + + # https://wiki.hyprland.org/Configuring/Variables/#blur + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } +} + +# https://wiki.hyprland.org/Configuring/Variables/#animations +animations { + enabled = yes, please :) + + # Default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 4.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 1, 1.94, almostLinear, fade + animation = workspacesIn, 1, 1.21, almostLinear, fade + animation = workspacesOut, 1, 1.94, almostLinear, fade +} + +# Ref https://wiki.hyprland.org/Configuring/Workspace-Rules/ +# "Smart gaps" / "No gaps when only" +# uncomment all if you wish to use that. +# workspace = w[tv1], gapsout:0, gapsin:0 +# workspace = f[1], gapsout:0, gapsin:0 +# windowrulev2 = bordersize 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = rounding 0, floating:0, onworkspace:w[tv1] +# windowrulev2 = bordersize 0, floating:0, onworkspace:f[1] +# windowrulev2 = rounding 0, floating:0, onworkspace:f[1] + +# windowrulev2 = opacity 1 .9, title:(Jellyfin Media Player) + +# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more +dwindle { + pseudotile = true # Master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # You probably want this +} + +# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more +master { + new_status = master +} + +# https://wiki.hyprland.org/Configuring/Variables/#misc +misc { + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers + disable_hyprland_logo = false # If true disables the random hyprland logo / anime girl background. :( +} + + +############# +### INPUT ### +############# + +# https://wiki.hyprland.org/Configuring/Variables/#input +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. + + touchpad { + natural_scroll = false + } +} + +# Example per-device config +# See https://wiki.hyprland.org/Configuring/Keywords/#per-device-input-configs for more +device { + name = epic-mouse-v1 + sensitivity = -0.5 +} + + +################### +### KEYBINDINGS ### +################### + +source = ~/.config/hypr/keybinds.conf + +############################## +### WINDOWS AND WORKSPACES ### +############################## + +# See https://wiki.hyprland.org/Configuring/Window-Rules/ for more +# See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules + +# Ignore maximize requests from apps. You'll probably like this. +windowrulev2 = suppressevent maximize, class:.* + +# Fix some dragging issues with XWayland +windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0 + diff --git a/hyprland/.config/hypr/keybinds.conf b/hyprland/.config/hypr/keybinds.conf index 8149df9..17800c4 100644 --- a/hyprland/.config/hypr/keybinds.conf +++ b/hyprland/.config/hypr/keybinds.conf @@ -12,6 +12,8 @@ bind = $mainMod, V, togglefloating, bind = $mainMod, R, exec, $menu bind = $mainMod, P, pseudo, # dwindle bind = $mainMod, J, togglesplit, # dwindle +bind = ALT, TAB, exec, $windowSwitcher +bind = $mainMod, F12, exec, $powerMenu # Move focus with mainMod + arrow keys bind = $mainMod, left, movefocus, l diff --git a/hyprlock/.config/hypr/hyprlock.conf b/hyprlock/.config/hypr/hyprlock.conf new file mode 100644 index 0000000..ebaa446 --- /dev/null +++ b/hyprlock/.config/hypr/hyprlock.conf @@ -0,0 +1,24 @@ +background { + monitor = DP-1 + path = $HOME/.config/hypr/backgrounds/mask.jpg + blur_passes = 0 +} + +input-field { + monitor = DP-1 + size = 20%, 5% + outline_thickness = 3 + inner_color = rgba(0, 0, 0, 1.0) # no fill + + outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg + check_color=rgba(00ff99ee) rgba(ff6633ee) 120deg + fail_color=rgba(ff6633ee) rgba(ff0066ee) 40deg + + font_color = rgb(143, 143, 143) + fade_on_empty = false + rounding = 15 + + position = 0, -150 + halign = center + valign = center +} \ No newline at end of file diff --git a/hyprpaper/.config/hypr/backgrounds/mask.jpg b/hyprpaper/.config/hypr/backgrounds/mask.jpg index d8a347f..a48acac 100644 Binary files a/hyprpaper/.config/hypr/backgrounds/mask.jpg and b/hyprpaper/.config/hypr/backgrounds/mask.jpg differ diff --git a/rofi/.config/rofi/themes/rounded-common.rasi b/rofi/.config/rofi/themes/rounded-common.rasi index 63aada3..3a926a7 100644 --- a/rofi/.config/rofi/themes/rounded-common.rasi +++ b/rofi/.config/rofi/themes/rounded-common.rasi @@ -71,6 +71,7 @@ element { padding: 8px 16px; spacing: 8px; border-radius: 16px; + children: [element-icon, element-text]; } element normal active { diff --git a/rofi/.local/bin/dmenu-power-menu b/rofi/.local/bin/dmenu-power-menu new file mode 100755 index 0000000..89a810a --- /dev/null +++ b/rofi/.local/bin/dmenu-power-menu @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +# Simple stand-alone wrapper for rofi-power-menu. +# +# This script takes the same CLI arguments as rofi-power-menu. +# +# rofi-script-to-dmenu needs to be installed + +# Use local rofi-power-menu if present. This makes developing easier. +command -v ./rofi-power-menu >/dev/null +powermenu_exists=$? +if [ $powermenu_exists -eq 0 ] +then + powermenu="./rofi-power-menu" +else + powermenu="rofi-power-menu" +fi + +cmd="$powermenu $@" +rofi-script-to-dmenu "$cmd" diff --git a/rofi/.local/bin/rofi-power-menu b/rofi/.local/bin/rofi-power-menu new file mode 100755 index 0000000..13e17e3 --- /dev/null +++ b/rofi/.local/bin/rofi-power-menu @@ -0,0 +1,280 @@ +#!/usr/bin/env bash + +# This script defines just a mode for rofi instead of being a self-contained +# executable that launches rofi by itself. This makes it more flexible than +# running rofi inside this script as now the user can call rofi as one pleases. +# For instance: +# +# rofi -show powermenu -modi powermenu:./rofi-power-menu +# +# See README.md for more information. + +set -e +set -u + +# All supported choices +all=(shutdown reboot suspend hibernate logout lockscreen) + +# By default, show all (i.e., just copy the array) +show=("${all[@]}") + +declare -A texts +texts[lockscreen]="lock screen" +texts[switchuser]="switch user" +texts[logout]="log out" +texts[suspend]="suspend" +texts[hibernate]="hibernate" +texts[reboot]="reboot" +texts[shutdown]="shut down" + +declare -A icons +icons[lockscreen]="\Uf033e" +icons[switchuser]="\Uf0019" +icons[logout]="\Uf0343" +icons[suspend]="\Uf04b2" +icons[hibernate]="\Uf02ca" +icons[reboot]="\Uf0709" +icons[shutdown]="\Uf0425" +icons[cancel]="\Uf0156" + +declare -A actions +actions[lockscreen]="loginctl lock-session ${XDG_SESSION_ID-}" +#actions[switchuser]="???" +actions[logout]="loginctl terminate-session ${XDG_SESSION_ID-}" +actions[suspend]="systemctl suspend" +actions[hibernate]="systemctl hibernate" +actions[reboot]="systemctl reboot" +actions[shutdown]="systemctl poweroff" + +# By default, ask for confirmation for actions that are irreversible +confirmations=(reboot shutdown logout) + +# By default, no dry run +dryrun=false +showsymbols=true +showtext=true + +function check_valid { + option="$1" + shift 1 + for entry in "${@}" + do + if [ -z "${actions[$entry]+x}" ] + then + echo "Invalid choice in $1: $entry" >&2 + exit 1 + fi + done +} + +# Parse command-line options +parsed=$(getopt --options=h --longoptions=help,dry-run,confirm:,choices:,choose:,symbols,no-symbols,text,no-text,symbols-font: --name "$0" -- "$@") +if [ $? -ne 0 ]; then + echo 'Terminating...' >&2 + exit 1 +fi +eval set -- "$parsed" +unset parsed +while true; do + case "$1" in + "-h"|"--help") + echo "rofi-power-menu - a power menu mode for Rofi" + echo + echo "Usage: rofi-power-menu [--choices CHOICES] [--confirm CHOICES]" + echo " [--choose CHOICE] [--dry-run] [--symbols|--no-symbols]" + echo + echo "Use with Rofi in script mode. For instance, to ask for shutdown or reboot:" + echo + echo " rofi -show menu -modi \"menu:rofi-power-menu --choices=shutdown/reboot\"" + echo + echo "Available options:" + echo " --dry-run Don't perform the selected action but print it to stderr." + echo " --choices CHOICES Show only the selected choices in the given order. Use /" + echo " as the separator. Available choices are lockscreen," + echo " logout,suspend, hibernate, reboot and shutdown. By" + echo " default, all available choices are shown." + echo " --confirm CHOICES Require confirmation for the gives choices only. Use / as" + echo " the separator. Available choices are lockscreen, logout," + echo " suspend, hibernate, reboot and shutdown. By default, only" + echo " irreversible actions logout, reboot and shutdown require" + echo " confirmation." + echo " --choose CHOICE Preselect the given choice and only ask for a" + echo " confirmation (if confirmation is set to be requested). It" + echo " is strongly recommended to combine this option with" + echo " --confirm=CHOICE if the choice wouldn't require" + echo " confirmation by default. Available choices are" + echo " lockscreen, logout, suspend, hibernate, reboot and" + echo " shutdown." + echo " --[no-]symbols Show Unicode symbols or not. Requires a font with support" + echo " for the symbols. Use, for instance, fonts from the" + echo " Nerdfonts collection. By default, they are shown" + echo " --[no-]text Show text description or not." + echo " --symbols-font FONT Use the given font for symbols. By default, the symbols" + echo " use the same font as the text. That font is configured" + echo " with rofi." + echo " -h,--help Show this help text." + exit 0 + ;; + "--dry-run") + dryrun=true + shift 1 + ;; + "--confirm") + IFS='/' read -ra confirmations <<< "$2" + check_valid "$1" "${confirmations[@]}" + shift 2 + ;; + "--choices") + IFS='/' read -ra show <<< "$2" + check_valid "$1" "${show[@]}" + shift 2 + ;; + "--choose") + # Check that the choice is valid + check_valid "$1" "$2" + selectionID="$2" + shift 2 + ;; + "--symbols") + showsymbols=true + shift 1 + ;; + "--no-symbols") + showsymbols=false + shift 1 + ;; + "--text") + showtext=true + shift 1 + ;; + "--no-text") + showtext=false + shift 1 + ;; + "--symbols-font") + symbols_font="$2" + shift 2 + ;; + "--") + shift + break + ;; + *) + echo "Internal error" >&2 + exit 1 + ;; + esac +done + +if [ "$showsymbols" = "false" -a "$showtext" = "false" ] +then + echo "Invalid options: cannot have --no-symbols and --no-text enabled at the same time." >&2 + exit 1 +fi + +# Define the messages after parsing the CLI options so that it is possible to +# configure them in the future. + +function write_message { + if [ -z ${symbols_font+x} ]; + then + icon="$1" + else + icon="$1" + fi + text="$2" + if [ "$showsymbols" = "true" ] + then + if [ "$showtext" = "true" ] + then + echo -n "\u200e$icon \u2068$text\u2069" + else + echo -n "\u200e$icon" + fi + else + echo -n "$text" + fi +} + +function print_selection { + echo -e "$1" | $(read -r -d '' entry; echo "echo $entry") +} + +declare -A messages +declare -A confirmationMessages +for entry in "${all[@]}" +do + messages[$entry]=$(write_message "${icons[$entry]}" "${texts[$entry]^}") +done +for entry in "${all[@]}" +do + confirmationMessages[$entry]=$(write_message "${icons[$entry]}" "Yes, ${texts[$entry]}") +done +confirmationMessages[cancel]=$(write_message "${icons[cancel]}" "No, cancel") + +if [ $# -gt 0 ] +then + # If arguments given, use those as the selection + selection="${@}" +else + # Otherwise, use the CLI passed choice if given + if [ -n "${selectionID+x}" ] + then + selection="${messages[$selectionID]}" + fi +fi + +# Don't allow custom entries +echo -e "\0no-custom\x1ftrue" +# Use markup +echo -e "\0markup-rows\x1ftrue" + +if [ -z "${selection+x}" ] +then + echo -e "\0prompt\x1fPower menu" + for entry in "${show[@]}" + do + echo -e "${messages[$entry]}\0icon\x1f${icons[$entry]}" + done +else + for entry in "${show[@]}" + do + if [ "$selection" = "$(print_selection "${messages[$entry]}")" ] + then + # Check if the selected entry is listed in confirmation requirements + for confirmation in "${confirmations[@]}" + do + if [ "$entry" = "$confirmation" ] + then + # Ask for confirmation + echo -e "\0prompt\x1fAre you sure" + echo -e "${confirmationMessages[$entry]}\0icon\x1f${icons[$entry]}" + echo -e "${confirmationMessages[cancel]}\0icon\x1f${icons[cancel]}" + exit 0 + fi + done + # If not, then no confirmation is required, so mark confirmed + selection=$(print_selection "${confirmationMessages[$entry]}") + fi + if [ "$selection" = "$(print_selection "${confirmationMessages[$entry]}")" ] + then + if [ $dryrun = true ] + then + # Tell what would have been done + echo "Selected: $entry" >&2 + else + # Perform the action + ${actions[$entry]} + fi + exit 0 + fi + if [ "$selection" = "$(print_selection "${confirmationMessages[cancel]}")" ] + then + # Do nothing + exit 0 + fi + done + # The selection didn't match anything, so raise an error + echo "Invalid selection: $selection" >&2 + exit 1 +fi diff --git a/waybar/.config/waybar/config b/waybar/.config/waybar/config index 8feb2d7..50eb2da 100644 --- a/waybar/.config/waybar/config +++ b/waybar/.config/waybar/config @@ -16,7 +16,8 @@ "cpu", "memory", "temperature", - "clock" + "clock", + "custom/power", ], "hyprland/window": { "format": "{}", @@ -80,5 +81,9 @@ }, "tray": { "spacing": 10 + }, + "custom/power": { + "format": "⏻", + "on-click": "rofi -show power-menu -modi power-menu:rofi-power-menu -theme rounded-purple-dark", } } diff --git a/waybar/.config/waybar/style.css b/waybar/.config/waybar/style.css index 1a8322f..fc44605 100644 --- a/waybar/.config/waybar/style.css +++ b/waybar/.config/waybar/style.css @@ -120,6 +120,12 @@ button:hover { color: @sapphire; } +#custom-power { + color: @green; + padding-left: 10px; + padding-right: 10px; +} + @keyframes blink { to { color: #000000;