diff --git a/TODO b/TODO index 7a6884b..7795c10 100644 --- a/TODO +++ b/TODO @@ -1 +1,4 @@ [ ] Get PulseAudio sound controls on polybar to work +[x] Add desktop switching to windows (context menu?) +[ ] Decide on an icon theme (flat-remix-icon-theme or pantheon.elementary-icon-theme?) +[ ] Use XDG??? diff --git a/configs/openbox/menu.xml b/configs/openbox/menu.xml index e391187..dbcb472 100644 --- a/configs/openbox/menu.xml +++ b/configs/openbox/menu.xml @@ -17,6 +17,12 @@ + + + nitrogen ~/.dotfiles/assets/wallpapers + + + reboot now diff --git a/configs/openbox/rc.xml b/configs/openbox/rc.xml index 4fc05a0..6ff0922 100644 --- a/configs/openbox/rc.xml +++ b/configs/openbox/rc.xml @@ -117,6 +117,11 @@ + + + client-menu + + diff --git a/configs/openbox/themes/neralie/openbox-3/themerc b/configs/openbox/themes/neralie/openbox-3/themerc index ed6fc28..34f027e 100644 --- a/configs/openbox/themes/neralie/openbox-3/themerc +++ b/configs/openbox/themes/neralie/openbox-3/themerc @@ -10,20 +10,34 @@ window.handle.width: 0 menu.border.width: 0 # Border colors -window.active.client.color: #9aa6b2 +window.active.client.color: #bcccdc +window.inactive.client.color: #9aa6b2 # Active window window.active.title.bg: Solid Flat -window.active.title.bg.color: #9aa6b2 +window.active.title.bg.color: #bcccdc window.active.label.bg: Parentrelative -window.active.label.text.color: #f8fafc +window.active.label.text.color: #000000 window.active.button.unpressed.bg: Solid Flat -window.active.button.unpressed.bg.color: #bcccdc +window.active.button.unpressed.bg.color: #d9eafd window.active.button.pressed.bg: Solid Flat -window.active.button.pressed.bg.color: #d9eafd +window.active.button.pressed.bg.color: #f8fafc + +# Inactive window +window.inactive.title.bg: Solid Flat +window.inactive.title.bg.color: #9aa6b2 + +window.inactive.label.bg: Parentrelative +window.inactive.label.text.color: #f8fafc + +window.inactive.button.unpressed.bg: Solid Flat +window.inactive.button.unpressed.bg.color: #bcccdc + +window.inactive.button.pressed.bg: Solid Flat +window.inactive.button.pressed.bg.color: #d9eafd # Menus menu.separator.color: #f8fafc diff --git a/nixos/home.nix b/nixos/home.nix index c8f0591..5b6d2b9 100644 --- a/nixos/home.nix +++ b/nixos/home.nix @@ -133,5 +133,12 @@ in }; }; }; + + gtk = { + enable = true; + cursorTheme.name = "Posy's Cursor"; + iconTheme.name = "Flat-Remix-Cyan-Light"; + theme.name = "io.elementary.stylesheet.blueberry"; + }; }; } diff --git a/nixos/hosts/qemu/configuration.nix b/nixos/hosts/qemu/configuration.nix index ef68167..e40f49d 100644 --- a/nixos/hosts/qemu/configuration.nix +++ b/nixos/hosts/qemu/configuration.nix @@ -6,6 +6,8 @@ ../../packages.nix ]; + nixpkgs.config.allowUnfree = true; + boot.loader = { # efi.efiSysMountPoint = "/boot/efi"; grub = { @@ -30,6 +32,7 @@ }; programs = { + dconf.enable = true; firefox.enable = true; fish.enable = true; gnupg.agent = { @@ -47,12 +50,6 @@ openbox.enable = true; twm.enable = true; }; - desktopManager = { - xfce = { - enable = true; - noDesktop = true; - }; - }; }; displayManager = { sddm = { @@ -60,7 +57,7 @@ settings = { Autologin = { User = "rae"; - Session = "xfce+openbox"; + Session = "none+openbox"; }; }; }; diff --git a/nixos/packages.nix b/nixos/packages.nix index 0707e28..924b850 100644 --- a/nixos/packages.nix +++ b/nixos/packages.nix @@ -10,7 +10,9 @@ hyfetch imagemagick kitty + monitor xclip + xfce.xfce4-taskmanager yt-dlp zellij # text editors @@ -21,10 +23,15 @@ nitrogen polybarFull rofi + themechanger xcompmgr xdotool xorg.xev xorg.xwininfo + # gtk + flat-remix-icon-theme + posy-cursors + pantheon.elementary-gtk-theme # misc uxn ]; diff --git a/scripts/hideIt.sh b/scripts/hideIt.sh deleted file mode 100755 index 9c925e2..0000000 --- a/scripts/hideIt.sh +++ /dev/null @@ -1,686 +0,0 @@ -#!/usr/bin/env bash -# -# Automagically hide/show a window by its name when the cursor is -# within a defined region or you mouse over it. -# -# This script was initially written to imitate gnome-shell's systray -# but should be generic enough to do other things as well. -# -# Requirements: -# bash, xdotool, xwininfo, xev -# - -# Global variables used throughout the script -WIN_ID="" -WIN_NAME="" -WIN_CLASS="" -WIN_INSTANCE="" -WAIT=1 - -WIN_WIDTH="" -WIN_HEIGHT="" -WIN_POSX="" -WIN_POSY="" - -SCREEN_WIDTH="" -SCREEN_HEIGHT="" - -MINX="" -MINY="" -MAXX="" -MAXY="" - -HOVER=1 -SIGNAL=1 -INTERVAL=1 -PEEK=3 -DIRECTION="left" -STEPS=3 -NO_TRANS=1 -TOGGLE=1 -TOGGLE_PEEK=1 - -_IS_HIDDEN=1 -_DOES_PEEK=0 -_HAS_REGION=1 -_WAIT_PID="" -_PID_FILE="" - - -usage() { - # Print usage - printf "usage: $0 [options]\n" - printf "\n" - printf "Required (At least on):\n" - printf " -N, --name [pattern]\n" - printf " Match against the window name.\n" - printf " This is the same string that is displayed in the window titlebar.\n" - printf "\n" - printf " -C, --class [pattern]\n" - printf " Match against the window class.\n" - printf "\n" - printf " -I, --instance [pattern]\n" - printf " Match against the window instance.\n" - printf "\n" - printf " --id [window-id]\n" - printf " Explicitly specify a window id rather than searching for one.\n" - printf "\n" - printf "Optional:\n" - printf " -w, --wait\n" - printf " Wait until a matching window was found.\n" - printf " This will check once every second.\n" - printf "\n" - printf " -r, --region [posXxposY+offsetX+offsetY]\n" - printf " Cursor region at which to trigger.\n" - printf " Examples:\n" - printf " --region 0x1080+10+-10 (Bottom left incl. a 10 pixel offset)\n" - printf " --region 1920x1080+0+0 (Bottom right without offset)\n" - printf "\n" - printf " -H, --hover\n" - printf " Show the window when hovering over it.\n" - printf " If --region was defined, --hover will be ignored!\n" - printf " This will only work if --peek is greater 0.\n" - printf " By default, hover is off.\n" - printf "\n" - printf " -S, --signal\n" - printf " Toggle the visibility by sending a 'SIGUSR1' signal.\n" - printf " Both --region and --hover will be ignored.\n" - printf "\n" - printf " -i, --interval [interval]\n" - printf " Interval in seconds to check the cursors location.\n" - printf " Defaults to 1.\n" - printf "\n" - printf " -p, --peek [amount]\n" - printf " When hidden, peek 'amount' of pixels to indicate the window.\n" - printf " Required if --hover is used." - printf " Defaults to 3.\n" - printf "\n" - printf " -d, --direction [left|right|top|bottom]\n" - printf " direction in which to move the window.\n" - printf " Defaults to left.\n" - printf "\n" - printf " -s, --steps [amount]\n" - printf " steps in pixel used to move the window. The higher the value,\n" - printf " the faster it will move at the cost of smoothness.\n" - printf " Defaults to 3.\n" - printf "\n" - printf " -T, --no-trans\n" - printf " Turn of the transition effect.\n" - printf "\n" - printf " -t, --toggle\n" - printf " Send a SIGUSR1 signal to the process matching the same window.\n" - printf " This will toggle the visibility of the window." - printf "\n\n" - printf " -P, --toggle-peek\n" - printf " Send a SIGUSR2 signal to the process matching the same window.\n" - printf " This will toggle the hidden state of the window if --peek is greater 0." - printf "\n\n" - printf "Examples:\n" - printf " Dropdown Terminal:\n" - printf " # Start a terminal with a unique name\n" - printf " # (Make sure yourself it is positioned correctly)\n" - printf " $ termite --title=dropdown-terminal &\n" - printf "\n" - printf " # Hide it and wait for a SIGUSR1 signal\n" - printf " $ hideIt.sh --name '^dropdown-terminal$' --direction top --steps 5 --signal\n" - printf "\n" - printf " # Send a SIGUSR1 signal (This could be mapped to a keyboard shortcut)\n" - printf " $ hideIt.sh --name '^dropdown-terminal$' --toggle\n" -} - - -argparse() { - # Parse system args - - while [ $# -gt 0 ]; do - case $1 in - "-N"|"--name") - WIN_NAME="$2" - shift - ;; - "-C"|"--class") - WIN_CLASS="$2" - shift - ;; - "-I"|"--instance") - WIN_INSTANCE="$2" - shift - ;; - "--id") - if [[ ! $2 =~ [0-9]+ ]]; then - printf "Invalid window id. Should be a number.\n" 1>&2 - exit 1 - fi - - WIN_ID="$2" - shift - ;; - "-w"|"--wait") - WAIT=0 - ;; - "-H"|"--hover") - HOVER=0 - ;; - "-S"|"--signal") - SIGNAL=0 - ;; - "-r"|"--region") - local posX posY offsetX offsetY - read posX posY offsetX offsetY <<<$(echo "$2" | \ - sed -rn 's/^([0-9]+)x([0-9]+)\+(-?[0-9]+)\+(-?[0-9]+)/\1 \2 \3 \4/p') - - # Test if we have proper values by trying - # to add them all together - expr $posX + $posY + $offsetX + $offsetY > /dev/null 2>&1 - if [ $? -ne 0 ]; then - printf "Invalid region. See --help for usage.\n" 1>&2 - exit 1 - fi - - MINX=$posX - MAXX=$((${MINX} + ${offsetX})) - if [ $MINX -gt $MAXX ]; then - read MINX MAXX <<< "$MAXX $MINX" - fi - - MINY=$posY - MAXY=$((${MINY} + ${offsetY})) - if [ $MINY -gt $MAXY ]; then - read MINY MAXY <<< "$MAXY $MINY" - fi - - if [[ ! $MINX =~ [0-9]+ ]] || [[ ! $MINY =~ [0-9]+ ]] \ - || [[ ! $MAXY =~ [0-9]+ ]] || [[ ! $MAXY =~ [0-9]+ ]]; then - printf "Missing or invalid region. See --help for usage.\n" 1>&2 - exit 1 - fi - _HAS_REGION=0 - shift - ;; - "-i"|"--interval") - INTERVAL="$2" - if [[ ! $INTERVAL =~ [0-9]+ ]]; then - printf "Interval should be a number. " 1>&2 - exit 1 - fi - shift - ;; - "-p"|"--peek") - PEEK="$2" - if [[ ! $PEEK =~ [0-9]+ ]]; then - printf "Peek should be a number. " 1>&2 - exit 1 - fi - shift - ;; - "-d"|"--direction") - DIRECTION="$2" - if [[ ! "$DIRECTION" =~ ^(left|right|top|bottom)$ ]]; then - printf "Invalid direction. See --help for usage.\n" 1>&2 - exit 1 - fi - shift - ;; - "-s"|"--steps") - STEPS="$2" - if [[ ! $STEPS =~ [0-9]+ ]]; then - printf "Steps should be a number. " 1>&2 - exit 1 - fi - shift - ;; - "-T"|"--no-trans") - NO_TRANS=0 - ;; - "-t"|"--toggle") - TOGGLE=0 - ;; - "-P"|"--toggle-peek") - TOGGLE_PEEK=0 - ;; - "-h"|"--help") - usage - exit 0 - ;; - **) - printf "Didn't understand '$1'\n" 1>&2 - printf "See --help for usage.\n" - exit 1 - ;; - esac - shift - done - - # Check required arguments - local _names="${WIN_ID}${WIN_NAME}${WIN_CLASS}${WIN_INSTANCE}" - if [ -z "$_names" ] && [ -z "$WIN_ID" ]; then - printf "At least one of --name, --class, --instance or --id" 1>&2 - printf " is required!\n" 1>&2 - exit 1 - fi - - if [ $TOGGLE -ne 0 ] && [ $TOGGLE_PEEK -ne 0 ] && [ $SIGNAL -ne 0 ] \ - && [ $_HAS_REGION -ne 0 ] && [ $HOVER -ne 0 ]; then - printf "At least one of --toggle, --signal, --hover or" 1>&2 - printf " --region is required!\n" 1>&2 - exit 1 - fi -} - - -function fetch_window_id() { - # Sets the values for the following global - # WIN_ID - - # We already have a window id - if [ ! -z "$WIN_ID" ]; then - _PID_FILE="/tmp/hideIt-${WIN_ID}.pid" - return - fi - - local _id=-1 - - # Search all windows matching the provided class - local _tmp1=() - if [ ! -z "$WIN_CLASS" ]; then - _tmp1=($(xdotool search --class "$WIN_CLASS")) - _tmp1=${_tmp1:--1} - fi - - # Search all windows matching the provided instance - local _tmp2=() - if [ ! -z "$WIN_INSTANCE" ]; then - _tmp2=($(xdotool search --classname "$WIN_INSTANCE")) - _tmp2=${_tmp2:--1} - fi - - # Search all windows matching the provided name (title) - local _tmp3=() - if [ ! -z "$WIN_NAME" ]; then - _tmp3=($(xdotool search --name "$WIN_NAME")) - _tmp3=${_tmp3:--1} - fi - - # Shift values upwards - for i in {1..2}; do - if [ -z $_tmp1 ]; then - _tmp1=(${_tmp2[@]}) - _tmp2=() - fi - - if [ -z $_tmp2 ]; then - _tmp2=(${_tmp3[@]}) - _tmp3=() - fi - done - - if [ -z $_tmp2 ]; then - # We only have one list of ids so we pick the first one from it - _id=${_tmp1[0]} - else - # We have multiple lists so we have to find the id that appears - # in all of them - local _oldIFS=$IFS - IFS=$'\n\t' - - local _ids=($(comm -12 \ - <(echo "${_tmp1[*]}" | sort) \ - <(echo "${_tmp2[*]}" | sort))) - - if [ ! -z $_tmp3 ]; then - _ids=($(comm -12 \ - <(echo "${_tmp3[*]}" | sort) \ - <(echo "${_ids[*]}" | sort))) - fi - IFS=$_oldIFS - - _id=${_ids[0]} - fi - - if [[ $_id =~ [0-9]+ ]] && [ $_id -gt 0 ]; then - WIN_ID=$_id - _PID_FILE="/tmp/hideIt-${WIN_ID}.pid" - fi -} - - -function fetch_screen_dimensions() { - # Sets the values for the following globals - # SCREEN_WIDTH, SCREEN_HEIGHT - - local win_info=$(xwininfo -root) - SCREEN_WIDTH=$(echo "$win_info" | sed -rn 's/.*Width: +([0-9]+)/\1/p') - SCREEN_HEIGHT=$(echo "$win_info" | sed -rn 's/.*Height: +([0-9]+)/\1/p') -} - - -function fetch_window_dimensions() { - # Sets the values for the following globals unless no WIN_ID exists - # WIN_WIDTH, WIN_HEIGHT, WIN_POSX, WIN_POSY - - if [[ ! $WIN_ID =~ [0-9]+ ]]; then - return - fi - - local win_info=$(xwininfo -id $WIN_ID) - - WIN_WIDTH=$(echo "$win_info" | sed -rn 's/.*Width: +([0-9]+)/\1/p') - WIN_HEIGHT=$(echo "$win_info" | sed -rn 's/.*Height: +([0-9]+)/\1/p') - - if [ ! -z "$1" ] && [ $1 -eq 0 ]; then - WIN_POSX=$(echo "$win_info" | \ - sed -rn 's/.*Absolute upper-left X: +(-?[0-9]+)/\1/p') - WIN_POSY=$(echo "$win_info" | \ - sed -rn 's/.*Absolute upper-left Y: +(-?[0-9]+)/\1/p') - fi -} - - -function send_signal() { - # Send a SIGUSR1 to an active hideIt.sh instance - # if a pid file was found. - local signal=$1 - if [ ! -f "$_PID_FILE" ]; then - printf "Pid file at \"${_PID_FILE}\" doesn't exist!\n" 1>&2 - exit 1 - fi - - local _pid=`cat $_PID_FILE` - printf "Sending ${signal} to instance...\n" - - if [[ $_pid =~ [0-9]+ ]]; then - kill -${signal} $_pid - exit 0 - else - printf "Invalid pid in \"${_PID_FILE}\".\n" 1>&2 - exit 1 - fi -} - - -function hide_window() { - # Move the window in or out - # Args: - # hide: 0 to hide, 1 to show - - local hide=$1 - - # Make sure window still exists and exit if not. - xwininfo -id $WIN_ID &> /dev/null - if [ $? -ne 0 ]; then - printf "Window doesn't exist anymore, exiting!\n" - exit 0 - fi - - _IS_HIDDEN=$hide - - # Update WIN_WIDTH, WIN_HEIGHT in case they changed - fetch_window_dimensions - - # Activate the window. - # Should bring it to the front, change workspace etc. - if [ $hide -ne 0 ]; then - xdotool windowactivate $WIN_ID > /dev/null 2>&1 - fi - - # Generate the sequence used to move the window - local to=() - local sequence=() - if [ "$DIRECTION" == "left" ]; then - to=-$(($WIN_WIDTH - $PEEK)) - if [ $hide -eq 0 ]; then - sequence=($(seq $WIN_POSX -$STEPS $to)) - sequence+=($to) - else - sequence=($(seq $to $STEPS $WIN_POSX)) - sequence+=($WIN_POSX) - fi - - elif [ "$DIRECTION" == "right" ]; then - to=$(($SCREEN_WIDTH - $PEEK)) - if [ $hide -eq 0 ]; then - sequence=($(seq $WIN_POSX $STEPS $to)) - sequence+=($to) - else - sequence=($(seq $to -$STEPS $WIN_POSX)) - sequence+=($WIN_POSX) - fi - - elif [ "$DIRECTION" == "bottom" ]; then - to=$(($SCREEN_HEIGHT - $PEEK)) - if [ $hide -eq 0 ]; then - sequence=($(seq $WIN_POSY $STEPS $to)) - sequence+=($to) - else - sequence=($(seq $to -$STEPS $WIN_POSY)) - sequence+=($WIN_POSY) - fi - - elif [ "$DIRECTION" == "top" ]; then - to=-$(($WIN_HEIGHT - $PEEK)) - if [ $hide -eq 0 ]; then - sequence=($(seq $WIN_POSY -$STEPS $to)) - sequence+=($to) - else - sequence=($(seq $to $STEPS $WIN_POSY)) - sequence+=($WIN_POSY) - fi - fi - - # Actually move the window - if [ $NO_TRANS -ne 0 ]; then - for pos in ${sequence[@]}; do - if [[ "$DIRECTION" =~ ^(left|right)$ ]]; then - xdotool windowmove $WIN_ID $pos $WIN_POSY - elif [[ "$DIRECTION" =~ ^(top|bottom)$ ]]; then - xdotool windowmove $WIN_ID $WIN_POSX $pos - fi - done - else - pos=${sequence[-1]} - if [[ "$DIRECTION" =~ ^(left|right)$ ]]; then - xdotool windowmove $WIN_ID $pos $WIN_POSY - elif [[ "$DIRECTION" =~ ^(top|bottom)$ ]]; then - xdotool windowmove $WIN_ID $WIN_POSX $pos - fi - fi - - # In case we hid the window, try to give focus to whatever is - # underneath the cursor. - if [ $hide -eq 0 ]; then - eval $(xdotool getmouselocation --shell) - xdotool windowactivate $WINDOW > /dev/null 2>&1 - fi -} - - -function toggle() { - # Toggle the hidden state of the window - - if [ $_IS_HIDDEN -eq 0 ]; then - hide_window 1 - else - hide_window 0 - fi -} - -function toggle_peek() { - # Completely hide/unhide the window in case PEEK is greater 0 - - if [ $PEEK -eq 0 ]; then - return - fi - - local _peek=$PEEK - local _win_posx=$WIN_POSX - local _win_posy=$WIN_POSY - - fetch_window_dimensions 0 - - if [ $_DOES_PEEK -eq 0 ]; then - _DOES_PEEK=1 - PEEK=0 - else - _DOES_PEEK=0 - fi - - hide_window 0 - - PEEK=$_peek - WIN_POSX=$_win_posx - WIN_POSY=$_win_posy -} - -function serve_region() { - # Check the cursors location and act accordingly - - local _hide=0 - while true; do - if [ $_DOES_PEEK -eq 0 ]; then - # Get cursor x, y position and active window - eval $(xdotool getmouselocation --shell) - - # Test if the cursor is within the region - if [ $X -ge $MINX -a $X -le $MAXX ] \ - && [ $Y -ge $MINY -a $Y -le $MAXY ]; then - _hide=1 - else - _hide=0 - fi - - # Don't hide if the cursor is still above the window - if [ $_IS_HIDDEN -ne 0 ] \ - && [ $_hide -eq 0 ] \ - && [ $WINDOW -eq $WIN_ID ]; then - _hide=1 - fi - - # Only do something if necessary - if [ $_IS_HIDDEN -ne $_hide ]; then - hide_window $_hide - fi - fi - - # Cut some slack - sleep $INTERVAL - done -} - - -function serve_xev() { - # Wait for cursor "Enter" and "Leave" events reported by - # xev and act accordingly - - xev -id $WIN_ID -event mouse | while read line; do - if [[ "$line" =~ ^EnterNotify.* ]]; then - hide_window 1 - elif [[ "$line" =~ ^LeaveNotify.* ]]; then - hide_window 0 - fi - done -} - - -function restore() { - # Called by trap once we receive an EXIT - - if [ -n "$_WAIT_PID" ]; then - kill -- "-${_WAIT_PID}" - fi - - if [ -f "$_PID_FILE" ]; then - rm "$_PID_FILE" - fi - - if [ $_IS_HIDDEN -eq 0 ]; then - printf "Restoring original window position...\n" - hide_window 1 - fi - - exit 0 -} - - -function main() { - # Entry point for hideIt - - # Parse all the args! - argparse "$@" - - printf "Searching window...\n" - fetch_window_id - - # If enabled, wait until a window was found. - if [ $WAIT -eq 0 ] && [[ ! $WIN_ID =~ [0-9]+ ]]; then - printf "Waiting for window" - while [[ ! $WIN_ID =~ [0-9]+ ]]; do - printf "." - fetch_window_id - sleep 1 - done - printf "\n" - fi - - if [[ ! $WIN_ID =~ [0-9]+ ]]; then - printf "No window found!\n" 1>&2 - exit 1 - else - printf "Found window with id: $WIN_ID\n" - fi - - if [ $TOGGLE -eq 0 ]; then - send_signal SIGUSR1 - exit 0 - fi - - if [ $TOGGLE_PEEK -eq 0 ]; then - send_signal SIGUSR2 - exit 0 - fi - - printf "Fetching window dimensions...\n" - fetch_window_dimensions 0 - - printf "Fetching screen dimensions...\n" - fetch_screen_dimensions - - trap restore EXIT - - printf "Initially hiding window...\n" - hide_window 0 - - # Save our pid into a file - echo "$$" > /tmp/hideIt-${WIN_ID}.pid - trap toggle_peek SIGUSR2 - - # Start observing - if [ $_HAS_REGION -eq 0 ]; then - printf "Defined region:\n" - printf " X: $MINX $MAXX\n" - printf " Y: $MINY $MAXY\n" - printf "\n" - printf "Waiting for region...\n" - serve_region & - _WAIT_PID=$! - elif [ $SIGNAL -eq 0 ]; then - printf "Waiting for SIGUSR1...\n" - trap toggle SIGUSR1 - sleep infinity & - _WAIT_PID=$! - elif [ $HOVER -eq 0 ]; then - printf "Waiting for HOVER...\n" - serve_xev & - _WAIT_PID=$! - fi - - if [ -n "$_WAIT_PID" ]; then - while true; do - wait "$_WAIT_PID" - printf "Received signal...\n" - done - fi -} - -# Lets do disss! -set -m -main "$@"