From d74a5a26385ebb21903da26e3d239a4929c4a5b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Yaroslav=20de=20la=20Pe=C3=B1a=20Smirnov?=
 <yps@yaroslavps.com>
Date: Fri, 11 Dec 2020 18:52:10 +0300
Subject: Screen share hack

Hack to be able to share the screen under certain apps such as Zoom* by
using v4l2loopback to create a fake webcam device to which wf-recorder
outputs the contents of the screen.

*Unfortunately because of the corona shit show my university requires to
use this Chinese piece of crap spyware. This Covid nonsense seriously
needs to end.
---
 dotfiles/.local/bin/camtoggle  |  4 +++-
 dotfiles/.local/bin/swayrecord | 25 ++++++++++++++++++++++++-
 2 files changed, 27 insertions(+), 2 deletions(-)

(limited to 'dotfiles')

diff --git a/dotfiles/.local/bin/camtoggle b/dotfiles/.local/bin/camtoggle
index 00fd201..a12fcb8 100755
--- a/dotfiles/.local/bin/camtoggle
+++ b/dotfiles/.local/bin/camtoggle
@@ -4,12 +4,14 @@
 # If a second camera is present, use the second one
 camera="/dev/video0"
 [ -e /dev/video2 ] && camera="/dev/video2"
+[ -n "$1" ] && camera="$1"
 
 pkill -f /dev/video || mpv \
   --gpu-context=wayland \
+  --profile=low-latency \
   --no-osc \
   --no-input-default-bindings \
   --input-conf=/dev/null \
   --geometry=-0-0 \
   --autofit=25% \
-  --title="mpvfloat" "$camera"
+  --title="mpvfloat" "av://v4l2:$camera"
diff --git a/dotfiles/.local/bin/swayrecord b/dotfiles/.local/bin/swayrecord
index 5c1c2a6..23171e2 100755
--- a/dotfiles/.local/bin/swayrecord
+++ b/dotfiles/.local/bin/swayrecord
@@ -44,11 +44,18 @@ finishscreencast () {
     "Screencast recording stopped and saved at "$VREC_DIR/screencast-$OUTPUT.mp4""
 }
 
+finishscreenshare() {
+  kill -2 "$VIDEO_PID"
+  notify-send "📺 Recording" \
+    "Screen sharing stopped."
+}
+
 finishrecording () {
   case "$TYPE" in
     video) finishvideo;;
     audio) finishaudio;;
     screencast) finishscreencast;;
+    screenshare) finishscreenshare;;
   esac
   rm -f ~/.cache/recordingpid
   rm -f ~/.cache/recordingicon
@@ -71,6 +78,20 @@ video () {
   wait
 }
 
+screenshare () {
+  # Hack to share screen in certain apps under wayland wlroots-based compositors
+  loopbackcam="$(v4l2-ctl --list-devices | \
+  	grep v4l2loopback -m1 -A1 | \
+  	sed -e '1d' -e 's/\s//g')"
+  wf-recorder -x yuv420p -c rawvideo -m v4l2 -f $loopbackcam &
+  VIDEO_PID=$!
+  echo $$ > ~/.cache/recordingpid
+  echo "📺" > ~/.cache/recordingicon
+  notify-send "📺 Recording" "Screen share to fake webcam started"
+  killall -39 waybar
+  wait
+}
+
 screencast () {
   wf-recorder -f "$VREC_DIR/temp-$OUTPUT.mp4" &
   VIDEO_PID=$!
@@ -94,10 +115,11 @@ audio () {
 }
 
 askrecording () {
-  TYPE="$(printf "video\nscreencast\naudio\n" | bemenu -l 6 -i -p "What should be recorded?" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
+  TYPE="$(printf "video\nscreencast\nscreenshare\naudio\n" | bemenu -l 6 -i -p "What should be recorded?" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
   case "$TYPE" in
     video) video;;
     screencast) screencast;;
+  	screenshare) screenshare;;
     audio) audio;;
     *) exit;;
   esac
@@ -111,6 +133,7 @@ fi
 case $1 in
   video) video;;
   screencast) screencast;;
+  screenshare) screenshare;;
   audio) audio;;
   kill) killrecording;;
   *) askrecording;;
-- 
cgit v1.2.3