Browse Source

Kernel formatting

master
John Mertz 5 months ago
parent
commit
f10d944e17
28 changed files with 1502 additions and 1285 deletions
  1. +80
    -38
      README.md
  2. +627
    -591
      apply-gruvbox.sh
  3. +3
    -2
      audio/noise-cancel.sh
  4. +8
    -1
      i3/detached.sh
  5. +10
    -1
      i3/home.sh
  6. +12
    -12
      i3/i3move.sh
  7. +10
    -1
      i3/work.sh
  8. +2
    -2
      rofi/drun.sh
  9. +14
    -14
      rofi/rofi-openvpn.sh
  10. +18
    -18
      rofi/rofi-power-menu.sh
  11. +2
    -1
      rofi/rofi-send-to-kodi.sh
  12. +17
    -12
      rofi/rofi-ssh-menu.sh
  13. +3
    -3
      rofi/sway-alt-tab.sh
  14. +32
    -26
      send-to-kodi.sh
  15. +211
    -198
      sway/displays.pl
  16. +17
    -16
      sway/gammastep.pl
  17. +46
    -42
      sway/popup-term.pl
  18. +25
    -21
      sway/swayidle.sh
  19. +1
    -1
      sway/swayidlecountdown.sh
  20. +2
    -2
      sway/toggle_outputs.sh
  21. +229
    -198
      thinkpad/blc.pl
  22. +16
    -16
      thinkpad/kbd_backlight.pl
  23. +3
    -1
      thinkpad/user-thinkpad-controls@.service
  24. +100
    -60
      update-firefox.pl
  25. +2
    -2
      waybar/waybar-cpu.sh
  26. +5
    -1
      waybar/waybar-disk.sh
  27. +3
    -1
      waybar/waybar-mem.sh
  28. +4
    -4
      waybar/waybar-nmtui.sh

+ 80
- 38
README.md View File

@@ -1,39 +1,51 @@
# Simple Scripts

## Audio

**audio/mute.sh**

Just a simple script to toggle Alsa mute.

---

**audio/noise-cancel.sh**

Add a noise-cancelled version of existing interfaces to Pulseaudio.

## i3

I haven't used i3 in earnest for quite some time since moving to Sway, so it is very likely that some of these scripts are broken based on other config changes.
I haven't used i3 in earnest for quite some time since moving to Sway, so it is
very likely that some of these scripts are broken based on other config changes.

**i3/i3move.sh**

When any of the Xrandr scripts below is run, it will print it's name to a config file. This script will read that config file and then knows how the outputs are arranged. Once this is known, it allows hotkeys to know which output to move a workspace to.
When any of the Xrandr scripts below is run, it will print it's name to a config
file. This script will read that config file and then knows how the outputs are
arranged. Once this is known, it allows hotkeys to know which output to move a
workspace to.

**i3/detached.sh**

Xrandr config. Just the laptop display.

**i3/work.sh**
**i3/detached.sh**

Xrandr config. Vertical on the left, horizontal aligned to top of the vertical, and laptop directly below that. Left-to-right order is Vertical-Horizontal-Laptop.
Xrandr config. Just the laptop display.

**i3/home.sh**

Xrandr config. Not a layout I currently use. Home is now the "stacked" view from sway/displays.
Xrandr config. Not a layout I currently use. Home is now the "stacked" view from
sway/displays.

**i3/work.sh**

Xrandr config. Vertical on the left, horizontal aligned to top of the vertical,
and laptop directly below that. Left-to-right order is
Vertical-Horizontal-Laptop.

## Rofi

[Rofi](https://github.com/davatorium/rofi) is a neat graphical launcher and menu system. I use it for a bunch of stuff to supplement i3 and Sway to fill out same desktop niceties. See configs in 'dotfiles' repository.
[Rofi](https://github.com/davatorium/rofi) is a neat graphical launcher and menu
system. I use it for a bunch of stuff to supplement i3 and Sway to fill out same
desktop niceties. See configs in 'dotfiles' repository.

**rofi/drun.sh**

@@ -53,7 +65,8 @@ Forward pasted link to ./send-to-kodi.sh.

**rofi/rofi-ssh-menu.sh**

Open a terminal to any SSH shortcut machine. (TODO: Integrate with 'sshs' to get machine list from there instead of a static list).
Open a terminal to any SSH shortcut machine. (TODO: Integrate with 'sshs' to get
machine list from there instead of a static list).

**rofi/sway-alt-tab.sh**

@@ -61,27 +74,40 @@ Show all currently running applications in Sway to locate window.

## Sway

[Sway](https://github.com/swaywm/sway) is an i3-compatible Wayland compositor and tiling window manager. See configs in 'dotfiles' repository. Here are some scripts exclusively for automating or enhancing Sway.
[Sway](https://github.com/swaywm/sway) is an i3-compatible Wayland compositor
and tiling window manager. See configs in 'dotfiles' repository. Here are some
scripts exclusively for automating or enhancing Sway.

**sway/displays.pl**

Script to automatically configure wayland outputs using swaymsg. Also forks waybars for each display. Allows custom configurations. No argument will run the last used configuration (~/config/last_display). '-w' will run only waybar without changing displays.
Script to automatically configure wayland outputs using swaymsg. Also forks
waybars for each display. Allows custom configurations. No argument will run the
last used configuration (~/config/last_display). '-w' will run only waybar
without changing displays.

**sway/gammastep.pl**

Setup Gammastep based on current location. I don't have geolocation in my laptop, so this requires a URL that returns JSON, including a "lat" and "lon". My URL (restricted to my IPs) returns these as recorded by PhoneTrack on my phone similar to:
Setup Gammastep based on current location. I don't have geolocation in my
laptop, so this requires a URL that returns JSON, including a "lat" and "lon".
My URL (restricted to my IPs) returns these as recorded by PhoneTrack on my
phone similar to:

```
{"lat":"180.12345678","lon":"-180.12345678","timestamp":"1599831660"}
```

It forks to keep running if terminal is killed to remove the need for nohup. If location fails to be fetched it will try again every 5 seconds.
It forks to keep running if terminal is killed. If location fails to be fetched
it will try again every 5 seconds.

**sway/popup-term.pl**

A DIY version of the Tilde terminal. If terminal is not running, it opens on the current display. If it is running but not on current display, it moves to current display. If it is already on current display, it is moved to a hidden display ('grave').
A DIY version of the Tilde terminal. If terminal is not running, it opens on the
current display. If it is running but not on current dislpay, it moves to
current display. If it is already on current display, it is moved to a hidden
display ('grave').

Note the relevant settings in dotfiles repository (sway/config) related to the 'grave' workspace, as well as UXTerm which is configured to open floating in the bottom corner.
Note the relevant settings in dotfiles repository (sway/config) related to the
'grave' workspace, as well as UXTerm.

```
for_window [class="UXTerm"] floating enable, resize set height 600px, resize set width 800px, move position 1120px 460px
@@ -91,58 +117,69 @@ bindsym $mod+Grave exec /home/jpm/scripts/sway/popup-term.pl
bindsym $mod+Shift+Grave workspace grave
```

Also note that 'grave' has no label in waybar (waybar/config.template) to allow it to be *hidden*.
Also note that 'grave' has no label in waybar (waybar/config.template) to allow
it to be *hidden*.

```
"sway/workspaces": {
"format": "{icon}",
"format": "{icon}",
"format-icons": {
"0": "0 \uf073", // Example of workspace with a label
"grave": "",
...
"0": "0 \uf073", // Example of workspace with a label
"grave": "",
...
```

**sway/swayidle.sh**

Work in progress. These scripts don't currently work the way I like.

Sway has an Idle detection daemon that can flexibly take different actions after certain periods of inactivity as well as prior to sleep and after wake.
Sway has an Idle detection daemon that can flexibly take different actions after
certain periods of inactivity as well as prior to sleep and after wake.

This script is meant to unify all of the actions into one script by accepting an option.
This script is meant to unify all of the actions into one script by accepting an
option.

**sway/swayidlecountdown.sh**

Prior to locking, a countdown should be provided. Currently testing how to manage a countdown with Dunst, which doesn't actually support dynamic notifications.

**sway/toggle_outputs**

Swap between detached and docked modes using `sway/displays.pl`. Bound to function key for external monitor button.
Prior to locking a countdown should be provided. Currently testing how to manage
a countdown with Dunst, which doesn't actually support dynamic notifications.

## Thinkpad

**thinkpad/blc.pl**
Overly complicated backlight brightness control script. Provides flexible control of backlight so that changes can be easily scripted or called from keyboard shortcuts. --help provides some usage docs.

Overly complicated backlight brightness control script. Provides flexible
control of backlight so that changes can be easily scripted or called from
keyboard shortcuts. --help provides some usage docs.

**thinkpad/kbd_backlight.pl**
Simple script to cycle keyboard backlight. Gets max brightness, current brightness and then changes then increments the current brightness. Uses mod of max+1 so that it will cycle back around to 0 (disabled) if it is already at max.

Simple script to cycle keyboard backlight. Gets max brightness, current
brightness and then changes then increments the current brightness. Uses mod of
max+1 so that it will cycle back around to 0 (disabled) if it is already at max.

**thinkpad/user-thinkpad-control@.service**
SystemD unit file used to give ownership of necessary sys files to whichever user it is enabled for `systemctl enable user-thinkpad-control@jpm`. Without this, the user won't be able to write these files and thus cannot set brightness values.

SystemD unit file used to give ownership of necessary sys files to whichever
user it is enabled for `systemctl enable user-thinkpad-control@jpm`. Without
this, the user won't be able to write these files and thus cannot set brightness
values.

## Waybar

[Waybar](https://github.com/Alexays/Waybar) is a very flexible and customizable taskbar for Sway (and other Wlroots-based wayland compositors). Waybar applets have hover and click functionality and have several scripts related to those. See the .config repository for the actual Waybar and Sway configs.
[Waybar](https://github.com/Alexays/Waybar) is a very flexible and customizable
taskbar for Sway (and other Wlroots-based wayland compositors). Waybar applets
have hover and click functionality and have several scripts related to those.
See the .config repository for the actual Waybar and Sway configs.

**waybar/waybar-cpu.sh**
**waybar/waybar-cpu.sh**

Launch htop in floating window (bottom-right). If already running, kill it.

**waybar/waybar-disk.sh**

Notification with disk usage summaries. Renders properly with Dunst, but not Mako.
Notification with disk usage summaries. Renders properly with Dunst, but not
Mako.

**waybar/waybar-mem.sh**

@@ -156,8 +193,13 @@ Launch nmtui in floating window (bottom-right). If already running, kill it.

**send-to-kodi.sh**

[This script](https://github.com/allejok96/send-to-kodi) sends a URL or local file to a [Kodi](https://github.com/xbmc) media player. Only modified to have my local media server IP.
[This script](https://github.com/allejok96/send-to-kodi) sends a URL or local
file to a [Kodi](https://github.com/xbmc) media player. Only modified to have my
local media server IP.

**apply-gruvbox.sh**

A single theme version of the one provided [here](https://raw.githubusercontent.com/Mayccoll/Gogh). Applies the theme to a variety of terminals. Not really necessary after cloning the 'dotfiles' repository.
A single theme version of the one provided
[here](https://raw.githubusercontent.com/Mayccoll/Gogh). Applies the theme to a
variety of terminals. Not really necessary after cloning the 'dotfiles'
repository.

+ 627
- 591
apply-gruvbox.sh
File diff suppressed because it is too large
View File


+ 3
- 2
audio/noise-cancel.sh View File

@@ -1,6 +1,7 @@
# Microphone Realtime background noise reduction script
# author Luigi Maselli - https://grigio.org licence: AS-IS
# credits: http://askubuntu.com/questions/18958/realtime-noise-removal-with-pulseaudio
# credits:
# http://askubuntu.com/questions/18958/realtime-noise-removal-with-pulseaudio
# run as: sudo && pulseaudio -k

sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.bak
@@ -8,4 +9,4 @@ sudo cat <<EOT >> /etc/pulse/default.pa
load-module module-echo-cancel source_name=noechosource sink_name=noechosink
set-default-source noechosource
set-default-sink noechosink
EOT
EOT

+ 8
- 1
i3/detached.sh View File

@@ -1,3 +1,10 @@
#!/bin/sh
xrandr --output DP-2-1 --off --output DP-2-2 --off --output DP-2-3 --off --output eDP-1 --primary --mode 1920x1080 --pos 0x0 --rotate normal --output HDMI-2 --off --output HDMI-1 --off --output DP-2 --off --output DP-1 --off
xrandr \
--output DP-2-1 --off \
--output DP-2-2 --off \
--output DP-2-3 --off \
--output eDP-1 --primary --mode 1920x1080 --pos 0x0 --rotate normal \
--output HDMI-2 --off \
--output HDMI-1 --off --output DP-2 --off --output DP-1 --off

echo "detached" > ~/.config/screenlayout/i3.current

+ 10
- 1
i3/home.sh View File

@@ -1,3 +1,12 @@
#!/bin/sh
xrandr --output DP-2-1 --mode 1366x768 --pos 0x0 --rotate left --output DP-2-2 --mode 1920x1200 --pos 768x0 --rotate normal --output DP-2-3 --off --output eDP-1 --primary --mode 1920x1080 --pos 768x1200 --rotate normal --output HDMI-2 --off --output HDMI-1 --off --output DP-2 --off --output DP-1 --off
xrandr \
--output DP-2-1 --mode 1366x768 --pos 0x0 --rotate left \
--output DP-2-2 --mode 1920x1200 --pos 768x0 --rotate normal \
--output DP-2-3 --off \
--output eDP-1 --primary --mode 1920x1080 --pos 768x1200 --rotate normal \
--output HDMI-2 --off \
--output HDMI-1 --off \
--output DP-2 --off \
--output DP-1 --off

echo "home" > ~/.config/screenlayout/i3.current

+ 12
- 12
i3/i3move.sh View File

@@ -4,25 +4,25 @@ LAYOUT=`cat ~/.config/screenlayout/i3.current`
MIDDLE="eDP-1"

if [[ $LAYOUT == 'home' ]]; then
RIGHT="DP-2-2"
LEFT="DP-2-1"
RIGHT="DP-2-2"
LEFT="DP-2-1"
elif [[ $LAYOUT == 'work' ]]; then
RIGHT="DP-2-2"
LEFT="DP-2-1"
RIGHT="DP-2-2"
LEFT="DP-2-1"
elif [[ $LAYOUT == '3' ]]; then
MIDDLE="DP-2-2"
LEFT="DP-2-1"
RIGHT="eDP-1"
MIDDLE="DP-2-2"
LEFT="DP-2-1"
RIGHT="eDP-1"
else
echo "No external displays connected"
echo "No external displays connected"
fi

if [[ $1 == 'right' ]]; then
i3 move workspace to output $RIGHT
i3 move workspace to output $RIGHT
elif [[ $1 == 'middle' ]]; then
i3 move workspace to output $MIDDLE
i3 move workspace to output $MIDDLE
elif [[ $1 == 'left' ]]; then
i3 move workspace to output $LEFT
i3 move workspace to output $LEFT
else
echo "Invalid direction. Requires either 'up', 'left', or 'middle'"
echo "Invalid direction. Requires either 'up', 'left', or 'middle'"
fi

+ 10
- 1
i3/work.sh View File

@@ -1,3 +1,12 @@
#!/bin/sh
xrandr --output DP-2-1 --mode 1920x1080 --pos 0x0 --rotate left --output DP-2-2 --mode 1920x1080 --pos 1080x0 --rotate normal --output DP-2-3 --off --output eDP-1 --primary --mode 1920x1080 --pos 1080x1080 --rotate normal --output HDMI-2 --off --output HDMI-1 --off --output DP-2 --off --output DP-1 --off
xrandr \
--output DP-2-1 --mode 1920x1080 --pos 0x0 --rotate left \
--output DP-2-2 --mode 1920x1080 --pos 1080x0 --rotate normal \
--output DP-2-3 --off \
--output eDP-1 --primary --mode 1920x1080 --pos 1080x1080 --rotate normal \
--output HDMI-2 --off \
--output HDMI-1 --off \
--output DP-2 --off \
--output DP-1 --off

echo "work" > ~/.config/screenlayout/i3.current

+ 2
- 2
rofi/drun.sh View File

@@ -4,7 +4,7 @@ ROFI=$(pgrep -c rofi | cut -b 1)
echo $ROFI

if [[ "$ROFI" -eq "0" ]]; then
rofi -config /home/jpm/.config/rofi/config -show drun
rofi -config /home/jpm/.config/rofi/config -show drun
else
killall rofi 2&>1 /dev/null
killall rofi 2&>1 /dev/null
fi

+ 14
- 14
rofi/rofi-openvpn.sh View File

@@ -5,25 +5,25 @@
res=$(echo "Connection|John.Me.tz|MailCleaner|Disconnect|Restart" | rofi -sep "|" -dmenu -i -p 'P ' "" -columns 9 -width 45 -l 1 -config /home/jpm/.config/rofi/config -hide-scrollbar -eh 1 -location 0 -auto-select -no-fullscreen)

if [ $res = "Connection" ]; then
/usr/bin/uxterm -e 'sudo /usr/bin/nmtui'
/usr/bin/uxterm -e 'sudo /usr/bin/nmtui'
elif [ $res = "John.Me.tz" ]; then
sudo /usr/bin/systemctl stop openvpn-client@mailcleaner
sudo /usr/bin/systemctl restart wg-quick@wg0
sudo /usr/bin/systemctl stop openvpn-client@mailcleaner
sudo /usr/bin/systemctl restart wg-quick@wg0
elif [ $res = "MailCleaner" ]; then
sudo /usr/bin/systemctl stop wg-quick@wg0
sudo /usr/bin/systemctl restart openvpn-client@mailcleaner
sudo /usr/bin/systemctl stop wg-quick@wg0
sudo /usr/bin/systemctl restart openvpn-client@mailcleaner
elif [ $res = "Disconnect" ]; then
sudo /usr/bin/systemctl stop openvpn-client@mailcleaner
sudo /usr/bin/systemctl stop wg-quick@wg0
sudo /usr/bin/systemctl stop openvpn-client@mailcleaner
sudo /usr/bin/systemctl stop wg-quick@wg0
elif [ $res = "Restart" ]; then
if [ "`ip addr show wg0 2> /dev/null`" != "" ]; then
sudo /usr/bin/systemctl restart wg-quick@wg0
fi
if [ "`ip addr show tun0 2> /dev/null`" != "" ]; then
sudo /usr/bin/systemctl restart openvpn-client@mailcleaner
fi
if [ "`ip addr show wg0 2> /dev/null`" != "" ]; then
sudo /usr/bin/systemctl restart wg-quick@wg0
fi
if [ "`ip addr show tun0 2> /dev/null`" != "" ]; then
sudo /usr/bin/systemctl restart openvpn-client@mailcleaner
fi
else
exit
exit
fi

# Waybar sometimes doesn't update with the VPN IP, for whatever reason. Restart it.


+ 18
- 18
rofi/rofi-power-menu.sh View File

@@ -4,39 +4,39 @@

# Determine if Sway or i3
if [ -z ${SWAYSOCK+x} ]; then
WM="i3"
WM="i3"
else
WM="sway"
WM="sway"
fi

if [[ $WM == 'i3' ]]; then
res=$(printf "🔒 Lock|↩ Logout|↻ Reload i3|↹ Restart i3|↯ Hibernate|🡙 Reboot|⏻ Shutdown" | rofi -sep "|" -dmenu -i -p 'Power: ' "" -columns 1 -rows 7 -width 32 -l 1 -hide-scrollbar -eh 1 -location 0 -padding 12 -opacity 100 -auto-select -no-fullscreen)
res=$(printf "🔒 Lock|↩ Logout|↻ Reload i3|↹ Restart i3|↯ Hibernate|🡙 Reboot|⏻ Shutdown" | rofi -sep "|" -dmenu -i -p 'Power: ' "" -columns 1 -rows 7 -width 32 -l 1 -hide-scrollbar -eh 1 -location 0 -padding 12 -opacity 100 -auto-select -no-fullscreen)
else
res=$(echo "🔒 Lock|↩ Logout|↻ Reload Sway|↻ Reload Waybar|↯ Hibernate|🡙 Reboot|⏻ Shutdown" | rofi -sep "|" -dmenu -i -p 'Power: ' "" -no-lazy-grab -auto-select -no-fullscreen)
res=$(echo "🔒 Lock|↩ Logout|↻ Reload Sway|↻ Reload Waybar|↯ Hibernate|🡙 Reboot|⏻ Shutdown" | rofi -sep "|" -dmenu -i -p 'Power: ' "" -no-lazy-grab -auto-select -no-fullscreen)
fi

if [ "$res" == "🔒 Lock" ]; then
${WM}lock -c 323232
${WM}lock -c 323232
elif [ "$res" == "↩ Logout" ]; then
# Prevent auto-login
rm /home/jpm/.config/last_login_gui
${WM} exit
# Prevent auto-login
rm /home/jpm/.config/last_login_gui
${WM} exit
elif [ "$res" == "↻ Reload i3" ]; then
i3 reload
i3 reload
elif [ "$res" == "↹ Restart i3" ]; then
i3 restart
i3 restart
elif [ "$res" == "↻ Reload Sway" ]; then
sway reload
sway reload
elif [ "$res" == "↻ Reload Waybar" ]; then
# Need to integrate with sway/displays.pl for alternative outputs
/home/jpm/scripts/sway/displays.pl -w
# Need to integrate with sway/displays.pl for alternative outputs
/home/jpm/scripts/sway/displays.pl -w
elif [ "$res" == "🡙 Reboot" ]; then
rm $SSH_AUTH_SOCK
sudo systemctl reboot -i
rm $SSH_AUTH_SOCK
sudo systemctl reboot -i
elif [ "$res" == "⏻ Shutdown" ]; then
rm $SSH_AUTH_SOCK
sudo systemctl poweroff -i
rm $SSH_AUTH_SOCK
sudo systemctl poweroff -i
elif [ "$res" == "↯ Hibernate" ]; then
sudo systemctl hibernate -i
sudo systemctl hibernate -i
fi
exit 0

+ 2
- 1
rofi/rofi-send-to-kodi.sh View File

@@ -1,5 +1,6 @@
#!/bin/bash

INPUT="$(rofi -dmenu -i -p 'Kodi:' "" -columns 1 -rows 7 -width 32 -l 1 -hide-scrollbar -eh 1 -location 0 -padding 12 -opacity 100)"
INPUT="$(rofi -dmenu -i -p 'Kodi:' "" -columns 1 -rows 7 -width 32 -l 1 \
-hide-scrollbar -eh 1 -location 0 -padding 12 -opacity 100)"

/home/jpm/scripts/send-to-kodi.sh $INPUT 2>&1 /dev/null

+ 17
- 12
rofi/rofi-ssh-menu.sh View File

@@ -1,28 +1,33 @@
#!/bin/bash

res=$(echo "john.me.tz|root@john.me.tz|t470s.lan.john.me.tz|shb.ng|kipary.mailcleaner.net|media.lan.john.me.tz|pipcam.lan.john.me.tz|therm.lan.john.me.tz|hud.lan.john.me.tz|vm.lan.john.me.tz" | rofi -sep "|" -dmenu -i -p 'P ' "" -columns 1 -rows 1 -width 45 -l 1 -config /home/jpm/.config/rofi/config -hide-scrollbar -eh 1 -location 0 -yoffset 0 -padding 12 -opacity 100 -auto-select -no-fullscreen)
res=$(echo "john.me.tz|root@john.me.tz|t470s.lan.john.me.tz|shb.ng|\
kipary.mailcleaner.net|media.lan.john.me.tz|pipcam.lan.john.me.tz|\
therm.lan.john.me.tz|hud.lan.john.me.tz|vm.lan.john.me.tz" | \
rofi -sep "|" -dmenu -i -p 'P ' "" -columns 1 -rows 1 -width 45 -l 1 -config \
/home/jpm/.config/rofi/config -hide-scrollbar -eh 1 -location 0 -yoffset 0 \
-padding 12 -opacity 100 -auto-select -no-fullscreen)

if [ $res = "john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs w'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs w'
elif [ $res = "root@john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs r'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs r'
elif [ $res = "shb.ng" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs s'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs s'
elif [ $res = "kipary.mailcleaner.net" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs d'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs d'
elif [ $res = "camera.lan.john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs c'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs c'
elif [ $res = "hud.lan.john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs h'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs h'
elif [ $res = "media.lan.john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs m'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs m'
elif [ $res = "programmer.lan.john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs p'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs p'
elif [ $res = "t470s.lan.john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs l'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs l'
elif [ $res = "therm.lan.john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs t'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs t'
elif [ $res = "vm.lan.john.me.tz" ]; then
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs v'
/usr/bin/urxvt -e /bin/bash -c '/home/jpm/scripts/sshs v'
fi
exit 0

+ 3
- 3
rofi/sway-alt-tab.sh View File

@@ -9,10 +9,10 @@ sed -e 's/^\([0-9]*\)\t*\(.*\)/\2 \1/' |

rofi -dmenu -config ~/.config/rofi/sidebar.rasi | {

read -r
read -r

id=`echo $REPLY | rev | cut -d' ' -f1 | rev`
id=`echo $REPLY | rev | cut -d' ' -f1 | rev`

swaymsg "[con_id=$id]" focus
swaymsg "[con_id=$id]" focus

}

+ 32
- 26
send-to-kodi.sh View File

@@ -14,7 +14,7 @@ local_port=12345

show_help()
{
cat<<EOF
cat<<EOF
Sends a video URL to Kodi
Usage: send-to-kodi.sh [URL]

@@ -33,24 +33,24 @@ EOF

error()
{
if type zenity &>/dev/null; then
zenity --error --ellipsize --text "$*"
else
echo "$*" 1>&2
fi
if type zenity &>/dev/null; then
zenity --error --ellipsize --text "$*"
else
echo "$*" 1>&2
fi

exit 1
exit 1
}

send_json()
{
curl \
${user:+--user "$user:$pass"} \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"$1"'"}},"id":1}' \
http://$host:$port/jsonrpc \
|| error "Failed to send link - is Kodi running?"
curl \
${user:+--user "$user:$pass"} \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"Player.Open","params":{"item":{"file":"'"$1"'"}},"id":1}' \
http://$host:$port/jsonrpc \
|| error "Failed to send link - is Kodi running?"
}

ytplugin='plugin://plugin.video.youtube/?action=play_video&videoid='
@@ -61,30 +61,35 @@ ytplugin='plugin://plugin.video.youtube/?action=play_video&videoid='
# Dialog box?
input=$1
until [[ $input ]]; do
input="$(zenity --entry --title "Send to Kodi" --text "Paste a video link here")" || exit
input="$(zenity --entry --title "Send to Kodi" --text \
"Paste a video link here")" || exit
done

if [[ $input =~ ^file:// ]]; then
# Remove file:// and carrige return (\r) at the end
input="$(sed 's%^file://%%;s/\r$//' <<< "$input")"
# Remove file:// and carrige return (\r) at the end
input="$(sed 's%^file://%%;s/\r$//' <<< "$input")"
fi

# Get URL for...

# Local media
if [[ -e $input ]]; then
type nc &>/dev/null || error "netcat required"
[[ $local_hostname && $local_port ]] || error "Please set local hostname and port in configuration"
type nc &>/dev/null || error "netcat required"
[[ $local_hostname && $local_port ]] || \
error "Please set local hostname and port in configuration"

# Start netcat in background and kill it when we exit
nc -lp $local_port < "$input" &
trap "kill $!" EXIT
# Start netcat in background and kill it when we exit
nc -lp $local_port < "$input" &
trap "kill $!" EXIT

url="tcp://$local_hostname:$local_port"
url="tcp://$local_hostname:$local_port"

# youtube.com / youtu.be
elif [[ $input =~ ^https?://(www\.)?youtu(\.be/|be\.com/watch\?v=) ]]; then
url="$ytplugin$(sed 's/.*\(youtu\.be\/\|[&?]v=\)\([a-zA-Z0-9_-]\+\).*/\2/' <<< "$input")"
url="$ytplugin$(\
sed 's/.*\(youtu\.be\/\|[&?]v=\)\([a-zA-Z0-9_-]\+\).*/\2/'\
<<< "$input"\
)"

# Playable formats
elif [[ $input =~ \.(mp4|mkv|mov|avi|flv|wmv|asf|mp3|flac|mka|m4a|aac|ogg|pls|jpg|png|gif|jpeg|tiff)(\?.*)?$ ]]; then
@@ -92,8 +97,9 @@ elif [[ $input =~ \.(mp4|mkv|mov|avi|flv|wmv|asf|mp3|flac|mka|m4a|aac|ogg|pls|jp

# Youtube-dl
else
type youtube-dl &>/dev/null || error "youtube-dl required"
url="$(youtube-dl -gf best "$input")" || error "No videos found, or site not supported by youtube-dl"
type youtube-dl &>/dev/null || error "youtube-dl required"
url="$(youtube-dl -gf best "$input")" || \
error "No videos found, or site not supported by youtube-dl"
fi

[[ $url ]] && send_json "$url"


+ 211
- 198
sway/displays.pl View File

@@ -45,10 +45,10 @@ my $last = "$ENV{'HOME'}/.config/last_display";
# $ swaymsg -t get_outputs
# Output eDP-1 'Unknown 0x057D *0x00000000*'
my %outputs = (
'0x00000101' => 'Sam',
'3CQ4342S6W' => 'HP-1',
'3CQ3310Q1Q' => 'HP-2',
'0x00000000' => 'LVDS'
'0x00000101' => 'Sam',
'3CQ4342S6W' => 'HP-1',
'3CQ3310Q1Q' => 'HP-2',
'0x00000000' => 'LVDS'
);

########################################################################
@@ -59,90 +59,90 @@ my %outputs = (
# Second-level keys are the display friendly-names, above
# Third-level are the actual settings for that display
my %configs = (
'detached' => {
'HP-1' => {
'on' => 0
'detached' => {
'HP-1' => {
'on' => 0
},
'HP-2' => {
'on' => 0
},
'Sam' => {
'on' => 0
},
'LVDS' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 0,
'y' => 0,
'rotate' => 0,
'waybar' => 'bottom'
}
},
'HP-2' => {
'on' => 0
'stacked' => {
'Sam' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 960,
'y' => 0,
'rotate' => 0,
'waybar' => 'bottom'
},
'HP-1' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 0,
'y' => 1200,
'rotate' => 0,
'waybar' => 'top'
},
'HP-2' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 1920,
'y' => 1200,
'rotate' => 0,
'waybar' => 'top'
},
'LVDS' => {
'on' => 0
}
},
'Sam' => {
'on' => 0
},
'LVDS' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 0,
'y' => 0,
'rotate' => 0,
'waybar' => 'bottom'
}
},
'stacked' => {
'Sam' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 960,
'y' => 0,
'rotate' => 0,
'waybar' => 'bottom'
},
'HP-1' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 0,
'y' => 1200,
'rotate' => 0,
'waybar' => 'top'
},
'HP-2' => {
'on' => 1,
'width' => 1920,
'height' => 1080,
'x' => 1920,
'y' => 1200,
'rotate' => 0,
'waybar' => 'top'
},
'LVDS' => {
'on' => 0
'sidebyside' => {
'HP-1' => {
'on' => 1,
'width' => 1080,
'height' => 1920,
'x' => 0,
'y' => 225,
'rotate' => 270,
'waybar' => 'top'
},
'Sam' => {
'on' => 1,
'width' => 1200,
'height' => 1920,
'x' => 1080,
'y' => 0,
'rotate' => 90,
'waybar' => 'top'
},
'HP-2' => {
'on' => 1,
'width' => 1080,
'height' => 1920,
'x' => 2280,
'y' => 225,
'rotate' => 90,
'waybar' => 'top'
},
'LVDS' => {
'on' => 0,
}
}
},
'sidebyside' => {
'HP-1' => {
'on' => 1,
'width' => 1080,
'height' => 1920,
'x' => 0,
'y' => 225,
'rotate' => 270,
'waybar' => 'top'
},
'Sam' => {
'on' => 1,
'width' => 1200,
'height' => 1920,
'x' => 1080,
'y' => 0,
'rotate' => 90,
'waybar' => 'top'
},
'HP-2' => {
'on' => 1,
'width' => 1080,
'height' => 1920,
'x' => 2280,
'y' => 225,
'rotate' => 90,
'waybar' => 'top'
},
'LVDS' => {
'on' => 0,
}
}
);

########################################################################
@@ -156,34 +156,37 @@ my $waybar_only = 0;
my $config;

if (scalar(@ARGV)) {
while (@ARGV) {
my $arg = shift;
if ($arg eq "-w") {
$waybar_only = 1;
} else {
if (defined $config) {
die "Too many arguments.\n";
}
$config = $arg;
while (@ARGV) {
my $arg = shift;
if ($arg eq "-w") {
$waybar_only = 1;
} else {
if (defined $config) {
die "Too many arguments.\n";
}
$config = $arg;
}
}
}
}

# Get previous config if one is not provided
unless (defined $config) {
open(my $fh, '<', $last) || die "Config name not provided and failed to open $last\n";
$config = <$fh>;
close($fh);
chomp $config;
open(my $fh, '<', $last) ||
die "Config name not provided and failed to open $last\n";
$config = <$fh>;
close($fh);
chomp $config;
}

# Bail if requested config doesn't exist
unless (defined $configs{$config}) {
die "$config is not a defined configuration: " . join(', ', keys %configs) . "\n";
die "$config is not a defined configuration: "
. join(', ', keys %configs) . "\n";
}

# Write config that is to be used so that it can be recovered as default
open(my $fh, '>', $last) || print STDERR "Config name cannot be written to $last\n";
open(my $fh, '>', $last) ||
print STDERR "Config name cannot be written to $last\n";
print $fh $config;
close($fh);

@@ -199,72 +202,77 @@ my $on;
my @off;
for (my $i = 0; $i < scalar(@$displays); $i++) {

# If a display is found without any settings, print error and turn it off
unless (defined $configs{$config}{$outputs{$displays->[$i]->{serial}}}) {
print STDERR "Output $displays->[$i]->{name} ($displays->[$i]->{serial}) found without defined function. Disabling.\n";
push @off, $displays->[$i]->{name};
next;
}

# If display is enabled, copy all of the desired settings
if ($configs{$config}{$outputs{$displays->[$i]->{serial}}}{on}) {
$on->{$outputs{$displays->[$i]->{serial}}} = $configs{$config}{$outputs{$displays->[$i]->{serial}}};
$on->{$outputs{$displays->[$i]->{serial}}}{output} = $displays->[$i]->{name};
# Otherwise simply list it for disabling
} else {
push @off, $displays->[$i]->{name};
}
# If a display is found without any settings print error and turn it off
unless (defined $configs{$config}{$outputs{$displays->[$i]->{serial}}}){
print STDERR "Output $displays->[$i]->{name} ("
. $displays->[$i]->{serial}
. ") found without defined function. Disabling.\n";
push @off, $displays->[$i]->{name};
next;
}

# If display is enabled, copy all of the desired settings
if ($configs{$config}{$outputs{$displays->[$i]->{serial}}}{on}) {
$on->{$outputs{$displays->[$i]->{serial}}} =
$configs{$config}{$outputs{$displays->[$i]->{serial}}};
$on->{$outputs{$displays->[$i]->{serial}}}{output} =
$displays->[$i]->{name};
# Otherwise simply list it for disabling
} else {
push @off, $displays->[$i]->{name};
}

}

# Skip enabling/disabling displays if only running waybar (re)start
unless ($waybar_only) {
# Number of simultaneous outputs is limited by gpu, so disabled displays first
foreach (@off) {
# Number of simultaneous outputs is limited by gpu, so disabled displays
# first
foreach (@off) {

# Sway returns status as JSON
my $res_raw = `sway output $_ disable`;
my $res = $json->decode($res_raw)->[0];
# Sway returns status as JSON
my $res_raw = `sway output $_ disable`;
my $res = $json->decode($res_raw)->[0];

# If failed, print to STDERR
unless ($res->{success}) {
print STDERR "Error ($res->{error}) in command 'sway output $_ disable'\n";
}
# If failed, print to STDERR
unless ($res->{success}) {
print STDERR "Error ($res->{error}) in command 'sway"
. "output $_ disable'\n";
}

}
}
}

# Kill existing Waybars
require Proc::ProcessTable;
my $t = new Proc::ProcessTable;
foreach my $p ( @{ $t->table } ) {
my $cmndline = $p->{'cmndline'};
$cmndline =~ s/\s*$//g;
if ($cmndline =~ /^waybar.*/) {
# Never kill this process
if ($p->{'pid'} == $$) {
next;
# SIGKILL match
# TODO BUG: when multiple processes are running, some respawn with new PIDs. IDK why?
} else {
$p->kill(9);
my $cmndline = $p->{'cmndline'};
$cmndline =~ s/\s*$//g;
if ($cmndline =~ /^waybar.*/) {
# Never kill this process
if ($p->{'pid'} == $$) {
next;
} else {
$p->kill(9);
}
}
}
}

# Load in config template
my $template;
if (open (my $fh, '<', $waybar_template)) {
while (<$fh>) {
$template .= $_;
}
close $fh;
chomp $template;
while (<$fh>) {
$template .= $_;
}
close $fh;
chomp $template;
} else {
print STDERR "Failed to load template $waybar_template\n";
print STDERR "Failed to load template $waybar_template\n";
}

# If template is already set up as an array, remove the square brackets so that we can concatenate multiple displays
# If template is already set up as an array, remove the square brackets so that
# we can concatenate multiple displays
$template =~ s/^[^\[\{]*\[(.*)\]$/$1/s;

# Setup waybar config file
@@ -273,52 +281,57 @@ my $waybar = '';
# Configure each enabled display
foreach my $out (keys %$on) {

unless ($waybar_only) {
# Build command, starting by enabling and powering on
my $cmd = "sway output $on->{$out}->{output} enable dpms on";

# If additional options are provided, add them to command
if (defined $on->{$out}->{rotate}) {
$cmd .= " transform $on->{$out}->{rotate}";
}
if (defined $on->{$out}->{x} && defined $on->{$out}->{y}) {
$cmd .= " position $on->{$out}->{x} $on->{$out}->{y}";
}
if (defined $on->{$out}->{width} && defined $on->{$out}->{height}) {
$cmd .= " mode $on->{$out}->{width}x$on->{$out}->{height}";
}

# Sway returns status as JSON
my $res_raw = `$cmd`;
my $res = $json->decode($res_raw)->[0];

# If failed, print to STDERR
unless ($res->{success}) {
print STDERR "Error ($res->{error}) in command '$cmd'\n";
unless ($waybar_only) {
# Build command, starting by enabling and powering on
my $cmd = "sway output $on->{$out}->{output} enable dpms on";

# If additional options are provided, add them to command
if (defined $on->{$out}->{rotate}) {
$cmd .= " transform $on->{$out}->{rotate}";
}
if (defined $on->{$out}->{x} && defined $on->{$out}->{y}) {
$cmd .= " position $on->{$out}->{x} $on->{$out}->{y}";
}
if (defined $on->{$out}->{width} &&
defined $on->{$out}->{height} )
{
$cmd .= " mode $on->{$out}->{width}x$on->{$out}->{height}";
}

# Sway returns status as JSON
my $res_raw = `$cmd`;
my $res = $json->decode($res_raw)->[0];

# If failed, print to STDERR
unless ($res->{success}) {
print STDERR "Error ($res->{error}) in command '$cmd'\n";
}
}
}

# Skip waybar setup if template failed to be loaded
if ( (defined $template) && (defined $on->{$out}->{waybar}) && ($on->{$out}->{waybar} =~ m/(top|bottom|left|right)/) ) {
# Skip waybar setup if template failed to be loaded
if ( (defined $template) &&
(defined $on->{$out}->{waybar}) &&
($on->{$out}->{waybar} =~ m/(top|bottom|left|right)/) )
{

# If there's already a display set up, add a comma
unless ($waybar eq '') {
$waybar .= ',';
}

$waybar .= $template;

# Replace basic preferences
$waybar =~ s/__OUTPUT__/"$on->{$out}->{output}"/;
$waybar =~ s/__POSITION__/"$on->{$out}->{waybar}"/;
if (defined $on->{$out}->{width}) {
$waybar =~ s/__WIDTH__/$on->{$out}->{width}/;
# If width is not set, comment that line out to use default
} else {
$waybar =~ s/([^\s]*\s*)__WIDTH__/\/\/ $1__WIDTH__/gg;
}

# If there's already a display set up, add a comma
unless ($waybar eq '') {
$waybar .= ',';
}

$waybar .= $template;

# Replace basic preferences
$waybar =~ s/__OUTPUT__/"$on->{$out}->{output}"/;
$waybar =~ s/__POSITION__/"$on->{$out}->{waybar}"/;
if (defined $on->{$out}->{width}) {
$waybar =~ s/__WIDTH__/$on->{$out}->{width}/;
# If width is not set, comment that line out to use default
} else {
$waybar =~ s/([^\s]*\s*)__WIDTH__/\/\/ $1__WIDTH__/gg;
}

}
}

# Restore array formatting
@@ -327,16 +340,16 @@ $waybar = '[' . $waybar . ']';
# Start Waybar as fork
my $pid = fork;
unless ($pid) {
open STDIN, '/dev/null';
open STDOUT, '>>/dev/null';
open STDERR, '>>/dev/null';
# Write config to a temporary file
my $tmp = $waybar_temporary . "/waybar-" . time() .".config";
open ($fh, '>', $tmp);
print $fh $waybar;
close $fh;
`nohup waybar --config=$tmp`;
# Remove config
unlink $tmp;
open STDIN, '/dev/null';
open STDOUT, '>>/dev/null';
open STDERR, '>>/dev/null';
# Write config to a temporary file
my $tmp = $waybar_temporary . "/waybar-" . time() .".config";
open ($fh, '>', $tmp);
print $fh $waybar;
close $fh;
`nohup waybar --config=$tmp`;
# Remove config
unlink $tmp;
}

+ 17
- 16
sway/gammastep.pl View File

@@ -16,27 +16,28 @@ my $lat_lon = fetch_lat_lon($ua, $json, $location);

my $pid = fork;
unless ($pid) {
open STDIN, '/dev/null';
open STDOUT, '>>/dev/null';
open STDERR, '>>/dev/null';
open STDIN, '/dev/null';
open STDOUT, '>>/dev/null';
open STDERR, '>>/dev/null';

`gammastep -l $lat_lon`;
`gammastep -l $lat_lon`;
}

sub fetch_lat_lon {
my ($ua, $json, $location) = @_;
sub fetch_lat_lon
{
my ($ua, $json, $location) = @_;

my $raw = $ua->get($location)->content();
if (defined $raw) {
my $decoded = $json->decode($raw);
if (defined $decoded->{lat} && defined $decoded->{lon}) {
return "$decoded->{lat}:$decoded->{lon}";
}
print $decoded->{lat};
my $raw = $ua->get($location)->content();
if (defined $raw) {
my $decoded = $json->decode($raw);
if (defined $decoded->{lat} && defined $decoded->{lon}) {
return "$decoded->{lat}:$decoded->{lon}";
}
print $decoded->{lat};

}
sleep 5;
return fetch_lat_lon($ua, $json, $location);
}
sleep 5;
return fetch_lat_lon($ua, $json, $location);
}

exit;

+ 46
- 42
sway/popup-term.pl View File

@@ -19,57 +19,61 @@ my $root = $json->decode($raw);
my $display = $root->{focus}->[0];
my ($workspace, $term_id, $term_ws);
foreach my $d (@{$root->{nodes}}) {
# If both the current workspace and terminal have been found, nothing else to look for
if (defined($workspace) && defined($term_id)) {
last;
# If the display from this iteration of the loop is in focus, look for the active workspace
} elsif ($d->{id} eq $display) {
foreach my $w (@{$d->{nodes}}) {
# Again, if both found, skip
if (defined($workspace) && defined($term_id)) {
# If both the current workspace and terminal have been found
# nothing else to look for
if (defined($workspace) && defined($term_id)) {
last;
# Otherwise if the current workspace is active, mark it
} elsif ($w->{id} eq $d->{focus}->[0]) {
$workspace = $w->{name};
}
# In any case, look for the terminal app
foreach my $n (@{$w->{floating_nodes}}) {
if ($n->{name} eq $term) {
$term_id = $n->{id};
$term_ws = $w->{name};
last;
# If the display from this iteration of the loop is in focus
# look for the active workspace
} elsif ($d->{id} eq $display) {
foreach my $w (@{$d->{nodes}}) {
# Again, if both found, skip
if (defined($workspace) && defined($term_id)) {
last;
# Otherwise if the current workspace is active, mark it
} elsif ($w->{id} eq $d->{focus}->[0]) {
$workspace = $w->{name};
}
# In any case, look for the terminal app
foreach my $n (@{$w->{floating_nodes}}) {
if ($n->{name} eq $term) {
$term_id = $n->{id};
$term_ws = $w->{name};
last;
}
}
}
}
}
# All other displays only need to be quickly searched for the term_id
} else {
foreach my $w (@{$d->{nodes}}) {
if (defined($term_id)) {
last;
}
foreach my $n (@{$w->{floating_nodes}}) {
if ($n->{name} eq $term) {
$term_id = $n->{id};
$term_ws = $w->{name};
last;
# All other displays only need to be quickly searched for the term_id
} else {
foreach my $w (@{$d->{nodes}}) {
if (defined($term_id)) {
last;
}
foreach my $n (@{$w->{floating_nodes}}) {
if ($n->{name} eq $term) {
$term_id = $n->{id};
$term_ws = $w->{name};
last;
}
}
}
}
}
}
}
print "Active workspace = $workspace\nTerminal ID = $term_id\nTerminal WS = $term_ws\n";
print "Active workspace = $workspace\n"
. "Terminal ID = $term_id\n"
. "Terminal WS = $term_ws\n";

# If there is no terminal found, spawn one
if (!defined($term_id)) {
print "No term running, starting one\n";
exec $term
# If the current workspace is known and terminal isn't on it, bring and give focus
print "No term running, starting one\n";
exec $term
# If the current workspace is known and terminal isn't on it, bring and focus
} elsif ($workspace != $term_ws) {
print "Term not on current workspace, bringing it\n";
`swaymsg "[con_id=$term_id]" move workspace $workspace`;
`swaymsg "[con_id=$term_id]" focus`;
print "Term not on current workspace, bringing it\n";
`swaymsg "[con_id=$term_id]" move workspace $workspace`;
`swaymsg "[con_id=$term_id]" focus`;
# Otherwise hide it from whereever it is
} else {
print "Term is on current workspace or lost, moving to $hidden\n";
`swaymsg "[con_id=$term_id]" move workspace $hidden`;
print "Term is on current workspace or lost, moving to $hidden\n";
`swaymsg "[con_id=$term_id]" move workspace $hidden`;
}

+ 25
- 21
sway/swayidle.sh View File

@@ -3,30 +3,34 @@
BLFILE="/tmp/blc"

if [ -z $1 ]; then
echo "Missing argument: swayidlerun, swayidlewarn, swayidlesleep or swayidlewake"
echo "Missing argument: swayidlerun, swayidlewarn, swayidlesleep or" \
" swayidlewake"
elif [ $1 == "swayidlerun" ]; then
swayidle timeout 270 "/home/jpm/scripts/swayidle.sh swayidlewarn" before-sleep "/home/jpm/scripts/swayidle.sh swayidlesleep" resume "/home/jpm/scripts/swayidle.sh swayidlewake"
swayidle timeout 270 "/home/jpm/scripts/swayidle.sh swayidlewarn" \
before-sleep "/home/jpm/scripts/swayidle.sh swayidlesleep" \
resume "/home/jpm/scripts/swayidle.sh swayidlewake"
elif [ $1 == "swayidlewarn" ]; then
# Store current brightness
echo $(/home/jpm/bin/blc.pl %) > $BLFILE
# Dim display
/home/jpm/bin/blc.pl = 1
# Warning notifications
/home/jpm/scripts/swayidlecountdown.sh
# Store current brightness
echo $(/home/jpm/bin/blc.pl %) > $BLFILE
# Dim display
/home/jpm/bin/blc.pl = 1
# Warning notifications
/home/jpm/scripts/swayidlecountdown.sh
elif [ $1 == "swayidlesleep" ]; then
# Change nick to AFK
ssh jpm@john.me.tz -i /home/jpm/.ssh/no_pass -t 'screen -S irssi -X stuff "/nick jpmAFK^M"'
# Turn off monitor
swaymsg 'swaymsg "output * dpms off"'
# Lock screen
swaylock -c 323232
# Change nick to AFK
ssh jpm@john.me.tz -i /home/jpm/.ssh/no_pass -t \
'screen -S irssi -X stuff "/nick jpmAFK^M"'
# Turn off monitor
swaymsg 'swaymsg "output * dpms off"'
# Lock screen
swaylock -c 323232
elif [ $1 == "swayidlewake" ]; then
# Kill sleep if running
# Turn on monitor
swaymsg 'swaymsg "output * dpms on"'
# Restore brightness level
kill `pgrep swayidlecountdo`
/home/jpm/bin/blc.pl = $(cat /tmp/blc)
# Kill sleep if running
# Turn on monitor
swaymsg 'swaymsg "output * dpms on"'
# Restore brightness level
kill `pgrep swayidlecountdo`
/home/jpm/bin/blc.pl = $(cat /tmp/blc)
else
echo "Invalid argument: run, sleep or wake"
echo "Invalid argument: run, sleep or wake"
fi

+ 1
- 1
sway/swayidlecountdown.sh View File

@@ -1,5 +1,5 @@
#!/bin/bash

for i in `seq 0 30`; do
notify-send -t 999 "Sleeping" $(expr 30 - $i); sleep 1
notify-send -t 999 "Sleeping" $(expr 30 - $i); sleep 1
done

+ 2
- 2
sway/toggle_outputs.sh View File

@@ -3,7 +3,7 @@
CURRENT=`cat /home/jpm/.config/last_display`

if [ "$CURRENT" == "detached" ]; then
/home/jpm/scripts/sway/displays.pl stacked
/home/jpm/scripts/sway/displays.pl stacked
else
/home/jpm/scripts/sway/displays.pl detached
/home/jpm/scripts/sway/displays.pl detached
fi

+ 229
- 198
thinkpad/blc.pl View File

@@ -5,107 +5,117 @@ my $cur_file = "/sys/class/backlight/intel_backlight/brightness";
my $max_file = "/sys/class/backlight/intel_backlight/max_brightness";
my $last_file = "/home/jpm/.config/blc.last";

sub to_percent {
my $value = shift;
if ($value eq "Permission Denied") {
return $value;
} else {
$value = int($value/get_max()*100);
return $value . '%';
}
}

sub get_offset {
return int(get_max()/100);
sub to_percent
{
my $value = shift;
if ($value eq "Permission Denied") {
return $value;
} else {
$value = int($value/get_max()*100);
return $value . '%';
}
}

sub get_current {
open(my $c,'<',"$cur_file");
my $current = <$c>;
close $c;
chomp $current;
return $current;
sub get_offset
{
return int(get_max()/100);
}

sub get_max {
open(my $m,'<',"$max_file");
my $max = <$m>;
close $m;
chomp $max;
return $max;
sub get_current
{
open(my $c,'<',"$cur_file");
my $current = <$c>;
close $c;
chomp $current;
return $current;
}

sub get_min {
return int((get_max()/100)+2);
sub get_max
{
open(my $m,'<',"$max_file");
my $max = <$m>;
close $m;
chomp $max;
return $max;
}

sub writable {
if (! -w $cur_file) {
return 0;
} else {
return 1;
}
sub get_min
{
return int((get_max()/100)+2);
}

sub increment {
if (writable()) {
my $current = get_current();
my $max = get_max();
my $target = $current+get_offset();
if ($target > $max) {
$target = $max;
sub writable
{
if (! -w $cur_file) {
return 0;
} else {
return 1;
}
open(my $c,'>',"$cur_file");
print $c $target;
close $c;
return $target;
} else {
return "Permission Denied";
}
}

sub decrement {
if (writable()) {
my $current = get_current();
my $min = get_min();
my $target = $current-get_offset();
if ($target < $min) {
$target = $min;
sub increment
{
if (writable()) {
my $current = get_current();
my $max = get_max();
my $target = $current+get_offset();
if ($target > $max) {
$target = $max;
}
open(my $c,'>',"$cur_file");
print $c $target;
close $c;
return $target;
} else {
return "Permission Denied";
}
open(my $c,'>',"$cur_file");
print $c $target;
close $c;
return $target;
} else {
return "Permission Denied";
}
}

sub set {
my $value = shift;
if (writable()) {
$current = get_current();
if ($value > $current) {
for (my $i=$current;$i<=$value;$i++) {
sub decrement
{
if (writable()) {
my $current = get_current();
my $min = get_min();
my $target = $current-get_offset();
if ($target < $min) {
$target = $min;
}
open(my $c,'>',"$cur_file");
print $c $i;
print $c $target;
close $c;
}
return $target;
} else {
for (my $i=$current;$i>=$value;$i--) {
open(my $c,'>',"$cur_file");
print $c $i;
close $c;
}
return "Permission Denied";
}
}

sub set
{
my $value = shift;
if (writable()) {
$current = get_current();
if ($value > $current) {
for (my $i=$current;$i<=$value;$i++) {
open(my $c,'>',"$cur_file");
print $c $i;
close $c;
}
} else {
for (my $i=$current;$i>=$value;$i--) {
open(my $c,'>',"$cur_file");
print $c $i;
close $c;
}
}
return $value;
} else {
return "Permission Denied";
}
return $value;
} else {
return "Permission Denied";
}
}

sub help {
print "
sub help
{
print "
Backlight Control

Usage: blc.pl [--silent|--notify] [OPTION] [VALUE]
@@ -146,29 +156,30 @@ Print:
Any other option will be printed literally";
}

sub advanced {
$current = get_current();
$max = get_max();
print ".
sub advanced
{
$current = get_current();
$max = get_max();
print ".

Print functions can be strung together but command will exit
with the first non-print option. eg.

\$ blc.pl == / ^
21/100
\$ blc.pl == ++
('==' ignored)
(Backlight incremented)
\$ blc.pl == / ^
21/100
\$ blc.pl == ++
('==' ignored)
(Backlight incremented)

Escape options with \\ in quotes to display them literally. eg.

\$ blc.pl == / ^ '\\=' % \'\\%\'
" . $current . "/" . $max . "=" . int($current/$max*100) . "%
\$ blc.pl == / ^ '\\=' % \'\\%\'
" . $current . "/" . $max . "=" . int($current/$max*100) . "%

Only one \'\\' is removed per block. eg.

\$ blc.pl '\\% \\'
% \\
\$ blc.pl '\\% \\'
% \\

";
}
@@ -177,107 +188,121 @@ my $current = get_current();
my (@output, $target, $silent, $notify);

if (scalar @ARGV) {
for (my $i=0;$i<scalar @ARGV;$i++) {
if ($ARGV[$i] eq '++') {
$target = increment();
@output = to_percent($target);
last;
} elsif ($ARGV[$i] eq '+=') {
for (my $i=0;$i<scalar @ARGV;$i++) {
if ($ARGV[$i] eq '+=') {
if (defined $ARGV[($i+1)]) {
$count = $ARGV[($i+1)];
for (my $j=0;$j<$count;$j++) {
$target = increment();
if ($target eq "Permission Denied") {
last;
}
for (my $i=0;$i<scalar @ARGV;$i++) {
if ($ARGV[$i] eq '++') {
$target = increment();
@output = to_percent($target);
last;
} elsif ($ARGV[$i] eq '+=') {
for (my $i=0;$i<scalar @ARGV;$i++) {
if ($ARGV[$i] eq '+=') {
if (defined $ARGV[($i+1)]) {
$count = $ARGV[($i+1)];
for (my $j=0;$j<$count;$j++) {
$target = increment();
if ($target eq
"Permission Denied") {
last;
}
}
@output = to_percent($target);
} else {
@output =
("No value after $ARGV[$i]");
}
last;
}
}
last;
} elsif ($ARGV[$i] eq '--') {
$target = decrement();
@output = to_percent($target);
} else {
@output = ("No value after $ARGV[$i]");
}
last;
}
}
last;
} elsif ($ARGV[$i] eq '--') {
$target = decrement();
@output = to_percent($target);
last;
} elsif ($ARGV[$i] eq '-=') {
for (my $i=0;$i<scalar @ARGV;$i++) {
if ($ARGV[$i] eq '-=') {
if (defined $ARGV[($i+1)]) {
$count = $ARGV[($i+1)];
for (my $j=0;$j<$count;$j++) {
$target = decrement();
if ($target eq "Permission Denied") {
last;
} elsif ($ARGV[$i] eq '-=') {
for (my $i=0;$i<scalar @ARGV;$i++) {
if ($ARGV[$i] eq '-=') {
if (defined $ARGV[($i+1)]) {
$count = $ARGV[($i+1)];
for (my $j=0;$j<$count;$j++) {
$target = decrement();
if ($target eq
"Permission Denied") {
last;
}
}
@output = to_percent($target);
} else {
@output =
("No value after $ARGV[$i]");
}
last;
}
}
last;
} elsif ($ARGV[$i] eq '=') {
$target = $ARGV[($i+1)];
if (defined $target) {
if ($target < 1) {
$target = set(get_min());
} elsif ($target > get_max()) {
$target = set(get_max());
} elsif ($target > 100) {
$target = set($target);
} else {
$target = set(
int((get_max()*$target/100)+1)
);
}
if ($target eq "Permission Denied") {
@output = $target;
} else {
@output = to_percent($target);
}
last;
} else {
@output = ("No value after $ARGV[$i]");
last;
}
}
@output = to_percent($target);
} else {
@output = ("No value after $ARGV[$i]");
}
last;
}
}
last;
} elsif ($ARGV[$i] eq '=') {
$target = $ARGV[($i+1)];
if (defined $target) {
if ($target < 1) {
$target = set(get_min());
} elsif ($target > get_max()) {
$target = set(get_max());
} elsif ($target > 100) {
$target = set($target);
} else {
$target = set(int((get_max()*$target/100)+1));
}
if ($target eq "Permission Denied") {
@output = $target;
} elsif ($ARGV[$i] eq '%') {
push @output,int(get_current()/get_max()*100);
} elsif ($ARGV[$i] eq '^') {
push @output,get_max();
} elsif ($ARGV[$i] eq '==') {
push @output,get_current();
} elsif ($ARGV[$i] eq '--help') {
help();
print " (see --HELP).\n\n";
exit();
} elsif ($ARGV[$i] eq '--HELP') {
help();
advanced();
exit();
} elsif ($ARGV[$i] eq '--silent') {
$silent = 'TRUE';
} elsif ($ARGV[$i] =~ /^--notify/) {
$notify = 'TRUE';
if ($ARGV[$i] =~ /=[0-9]+$/) {
$duration = $ARGV[$i];
$duration =~ s/.*=([0-9]+)/$1/;
} else {
$duration = 200;
}
} else {
@output = to_percent($target);
my $add = $ARGV[$i];
$add =~ s/\\//;
push @output,$add;
}
last;
} else {
@output = ("No value after $ARGV[$i]");
last;
}
} elsif ($ARGV[$i] eq '%') {
push @output,int(get_current()/get_max()*100);
} elsif ($ARGV[$i] eq '^') {
push @output,get_max();
} elsif ($ARGV[$i] eq '==') {
push @output,get_current();
} elsif ($ARGV[$i] eq '--help') {
help();
print " (see --HELP).\n\n";
exit();
} elsif ($ARGV[$i] eq '--HELP') {
help();
advanced();
exit();
} elsif ($ARGV[$i] eq '--silent') {
$silent = 'TRUE';
} elsif ($ARGV[$i] =~ /^--notify/) {
$notify = 'TRUE';
if ($ARGV[$i] =~ /=[0-9]+$/) {
$duration = $ARGV[$i];
$duration =~ s/.*=([0-9]+)/$1/;
} else {
$duration = 200;
}
} else {
my $add = $ARGV[$i];
$add =~ s/\\//;
push @output,$add;
}
}
} else {
@output = ('{"Backlight":{"Max":"' . get_max() . '","Current":"' . get_current() . '","Percentage","' . int(get_current()/get_max()*100) . '%"}}');
@output = (
'{"Backlight":{"Max":"'
. get_max()
. '","Current":"'
. get_current()
. '","Percentage","'
. int(get_current()/get_max()*100)
. '%"}}'
);
}


@@ -286,20 +311,26 @@ print $fh get_current();
close($fh);

if ($silent) {
exit();
exit();
} elsif ($notify) {
# Don't output anything if the value didn't change
if ($current == get_current()) {
# Don't output anything if the value didn't change
if ($current == get_current()) {
exit();
}
my $concat;
foreach (@output) {
$concat .= $_;
}
system "notify-send --urgency=normal -i "
. "/usr/share/icons/Papirus-Dark-Grey/48x48/status/"
. "notification-display-brightness.svg -t "
. $duration
. ' "'
. $concat
. '"';
exit();
}
my $concat;
foreach (@output) {
$concat .= $_;
}
system "notify-send --urgency=normal -i /usr/share/icons/Papirus-Dark-Grey/48x48/status/notification-display-brightness.svg -t $duration \"$concat\"";
exit();
} else {
print foreach @output;
print "\n";
exit();
print foreach @output;
print "\n";
exit();
}

+ 16
- 16
thinkpad/kbd_backlight.pl View File

@@ -8,32 +8,32 @@ my $current = "/sys/class/leds/tpacpi\:\:kbd_backlight/brightness";

my ($max, $now, $new);
if (open(my $m, '<', $maxfile)) {
$max = readline($m);
chomp $max;
close($m);
$max = readline($m);
chomp $max;
close($m);
} else {
print "Failed to read $maxfile\n";
exit;
print "Failed to read $maxfile\n";
exit;
}
print STDERR "max = $max\n";

if (open(my $c, '<', $current)) {
$now = readline($c);
chomp $now;
close($c);
$now = readline($c);
chomp $now;
close($c);
} else {
print "Failed to read $current\n";
exit;
print "Failed to read $current\n";
exit;
}
print STDERR "now = $now\n";

if (open(my $fh, '>', $current)) {
$new = (($now+1) % ($max+1));
chomp $new;
print $fh $new;
close($fh);
$new = (($now+1) % ($max+1));
chomp $new;
print $fh $new;
close($fh);
} else {
print "Failed to write $current\n";
exit;
print "Failed to write $current\n";
exit;
}
print STDERR "new = $new\n";

+ 3
- 1
thinkpad/user-thinkpad-controls@.service View File

@@ -2,7 +2,9 @@
Description=Give ownership of backlight to %I

[Service]
ExecStart=chown %i:%i /sys/class/backlight/intel_backlight/brightness /sys/class/leds/tpacpi::kbd_backlight/brightness
ExecStart=chown %i:%i \
/sys/class/backlight/intel_backlight/brightness \
/sys/class/leds/tpacpi::kbd_backlight/brightness

[Install]
WantedBy=multi-user.target

+ 100
- 60
update-firefox.pl View File

@@ -11,43 +11,52 @@ my $install = "$ENV{HOME}/.local/bin";
my $working = "/tmp/firefox.new";

# Download link as provided by https://www.mozilla.org/$lang/firefox/developer/
my $url = 'https://download.mozilla.org/?product=firefox-devedition-latest-ssl&os=linux64&lang='.$lang;
my $url = 'https://download.mozilla.org/?product=firefox-devedition-latest-ssl'
. '&os=linux64&lang='.$lang;

# Ensure that we can unzip
unless (which("bunzip2")) {
die "Requires bunzip2. Try:\nsudo apt install zutils or your distro's equivalent\n";
die "Requires bunzip2. Try:\n"
. "sudo apt install zutils or your distro's equivalent\n";
}

# Only understood argument is to not bother verifying the package
my ($download_key, $verify) = (0,1);
if (defined $ARGV[0]) {
if ($ARGV[0] eq '--no-verify') {
$verify = 0;
} else {
die "Didn't understand argument $ARGV[0]\n";
}
if ($ARGV[0] eq '--no-verify') {
$verify = 0;
} else {
die "Didn't understand argument $ARGV[0]\n";
}
}

# If verification is to be done, make sure we have the key
unless ($verify) {
print "Checking for Mozilla GPG key in keyring...\n";
system("gpg --list-keys release\@mozillla.com 2>&1 > /dev/null");
if ($?) {
my $YN = prompt (-in => *STDIN, "You don't currently have Mozilla's GPG key in your keyring.\nWould you like to install it? If not, installation will not be verified. [y/N]: ", -single);
if ($YN eq 'y' || $YN eq 'Y') {
$download_key = 1;
} else {
$verify = 0;
print "Checking for Mozilla GPG key in keyring...\n";
system("gpg --list-keys release\@mozillla.com 2>&1 > /dev/null");
if ($?) {
my $YN = prompt (-in => *STDIN, "You don't currently have "
. "Mozilla's GPG key in your keyring.\n"
. "Would you like to install it? If not, installation "
. "will not be verified. [y/N]: ",
-single
);
if ($YN eq 'y' || $YN eq 'Y') {
$download_key = 1;
} else {
$verify = 0;
}
}
}
}

# If a previous download still exists remove it
if ( -e $working ) {
system("rm -rf $working");
if ($?) {
die "Working directory $working already exists and failed to remove: $!\n";
}
system("rm -rf $working");
if ($?) {
die "Working directory "
. $working
. "already exists and failed to remove: $!\n";
}
}

# Get version currently installed
@@ -58,19 +67,21 @@ chomp $current;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new();

# $url is actually going to redirect to the proper current dowload, so just get the redirect.
# $url is actually going to redirect to the proper current dowload so just get
# the redirect.
my $head = $mech->head($url);

my ($location, $version);
# This redirect will have the version id, so we can use that to determine if a new version actually exists
# This redirect will have the version id, so we can use that to determine if a
# new version actually exists
if ($head->{'_msg'}) {
$version = $location = $head->{'_previous'}->{'_headers'}->{'location'};
$version =~ s/^.*\-([^\-]*)\.tar\.bz2$/$1/;
if ($version eq $current) {
die "Current ($current) is the same as New ($version)\n";
}
$version = $location = $head->{'_previous'}->{'_headers'}->{'location'};
$version =~ s/^.*\-([^\-]*)\.tar\.bz2$/$1/;
if ($version eq $current) {
die "Current ($current) is the same as New ($version)\n";
}
} else {
print "unable to find new download\n";
print "unable to find new download\n";
}

mkdir($working) || die "Couldn't make $working: $!\n";
@@ -78,77 +89,106 @@ mkdir($working) || die "Couldn't make $working: $!\n";
# Download package
print "Fetching package $location...\n";
$mech->get($location);
$mech->save_content( $working."/firefox-".$version.".tar.bz2", binmode => ':raw', decoded_by_headers => 1 );
$mech->save_content( $working."/firefox-".$version.".tar.bz2",
binmode => ':raw',
decoded_by_headers => 1
);

# If verification is required, get signature as well
if ($verify) {
$location .= '.asc';
print "Fetching GPG signature $location...\n";
$mech->get($location);
$mech->save_content( $working."/firefox-".$version.".tar.bz2.asc", binmode => ':raw', decoded_by_headers => 1 );