summaryrefslogtreecommitdiff
path: root/lock
diff options
context:
space:
mode:
Diffstat (limited to 'lock')
-rwxr-xr-xlock97
1 files changed, 97 insertions, 0 deletions
diff --git a/lock b/lock
new file mode 100755
index 0000000..bff4240
--- /dev/null
+++ b/lock
@@ -0,0 +1,97 @@
+#!/bin/bash
+
+# This script is a workaround for xsecurelock not being able to lock the screen when a fullscreen window is active.
+
+# Lock the screen with xsecurelock and take care of picom
+lock_screen() {
+ # kill the compositor so that xsecurelock doesn't complain
+ pkill picom
+
+ # xsecurelock configuration (you can find more flags here: https://github.com/google/xsecurelock)
+
+ export XSECURELOCK_PASSWORD_PROMPT=time_hex
+ export XSECURELOCK_FONT="Inconsolata:size=17"
+ export XSECURELOCK_DATETIME_FORMAT="</%B %d> <%H:%M>"
+ export XSECURELOCK_SHOW_DATETIME=1
+
+ export XSECURELOCK_BACKGROUND_COLOR="#0a001f"
+ export XSECURELOCK_AUTH_BACKGROUND_COLOR="#0a001f"
+ export XSECURELOCK_AUTH_FOREGROUND_COLOR="#ace6f0"
+
+ export XSECURELOCK_DISCARD_FIRST_KEYPRESS=0
+ export XSECURELOCK_BURNIN_MITIGATION=0
+
+ xsecurelock
+
+ picom &
+}
+
+# Settings
+declare -a LIST_OF_WINDOW_TITLES_THAT_PREVENT_LOCKING=(
+ "YouTube"
+ "Netflix"
+ "Twitch"
+ #"Spotify"
+ "MPlayer"
+ "VLC"
+ "mpv"
+ "Google Meet"
+ "Microsoft Teams"
+ "Zoom"
+ #"Discord"
+ #"Slack"
+ #"Plex"
+ "CCTV"
+)
+
+# Dependencies
+AWK=/usr/bin/awk
+GREP=/usr/bin/grep
+XPROP=/usr/bin/xprop
+
+# Find active window id
+get_active_id() {
+ $XPROP -root | $AWK '$1 ~ /_NET_ACTIVE_WINDOW/ { print $5 }'
+}
+
+# Determine a window's title text by it's ID
+get_window_title() {
+ # For mplayer or vlc, we might need to check WM_CLASS(STRING), idk.
+ $XPROP -id $1 | $AWK -F '=' '$1 ~ /_NET_WM_NAME\(UTF8_STRING\)/ { print $2 }'
+}
+
+# Determine if a window is fullscreen based on it's ID
+is_fullscreen() {
+ $XPROP -id $1 | $AWK -F '=' '$1 ~ /_NET_WM_STATE\(ATOM\)/ { for (i=2; i<=3; i++) if ($i ~ /FULLSCREEN/) exit 0; exit 1 }'
+ return $?
+}
+
+# Determine if the locker command should run based on which windows are fullscreened.
+should_lock() {
+ id=$(get_active_id)
+ title=$(get_window_title $id)
+
+ if is_fullscreen $id; then
+ for i in "${LIST_OF_WINDOW_TITLES_THAT_PREVENT_LOCKING[@]}"; do
+ if [[ $title =~ $i ]]; then
+ return 0
+ fi
+ done
+ #echo "Fullscreen window detected: $title"
+ return 0
+ else
+ return 1
+ fi
+}
+
+# Debugging
+if should_lock; then
+ echo "Locking the screen..."
+else
+ echo "Not locking the screen..."
+fi
+
+# main()
+if should_lock; then
+ lock_screen
+fi