Browse Source

support multiple devices, virtual display per device

Daniel Sheffield 2 weeks ago
parent
commit
28dae4045c

+ 0 - 14
android-usb-vnc/system/etc/systemd/system/x11vnc.service

@@ -1,14 +0,0 @@
-[Unit]
-Description=Start x11vnc server on virtual display
-Requires=xpra.service
-After=xpra.service
-
-[Service]
-User=das
-Type=simple
-RemainAfterExit=yes
-Environment=DISPLAY=:19
-ExecStart=/usr/bin/bash -c "for i in {1..10}; do if /usr/bin/xhost &>/dev/null; then break; else sleep 1; fi; done && /usr/bin/xpra control :19 start '/usr/bin/x11vnc -display :19 -forever -shared -rfbport 5900 -listen localhost -nopw'"
-ExecStop=/usr/bin/xpra control :19 start "/bin/bash -c 'pidof x11vnc && kill $(pidof x11vnc)'"
-Restart=on-failure
-

+ 14 - 0
android-usb-vnc/system/etc/systemd/system/x11vnc@.service

@@ -0,0 +1,14 @@
+[Unit]
+Description=Start x11vnc server for %I
+Requires=xpra@%i.service
+BindsTo=dev-vd%i.device
+After=dev-vd%i.device
+
+[Service]
+User=das
+Type=simple
+RemainAfterExit=yes
+ExecStart=/usr/local/bin/x11vnc_for_android.sh start %i
+ExecStop=/usr/local/bin/x11vnc_for_android.sh stop %i
+Restart=on-failure
+

+ 0 - 13
android-usb-vnc/system/etc/systemd/system/xpra.service

@@ -1,13 +0,0 @@
-[Unit]
-Description=Start xrpa server
-Requires=xvfb.service
-After=xvfb.service
-
-[Service]
-RemainAfterExit=yes
-User=das
-Type=simple
-Environment=DISPLAY=:19
-ExecStart=/usr/bin/bash -c "for i in {1..10}; do if xhost &>/dev/null; then break; else sleep 1; fi; done && /usr/bin/xpra start-desktop --use-display=yes --start=/usr/bin/startlxqt :19"
-ExecStop=/usr/bin/xpra stop :19
-Restart=on-failure

+ 12 - 0
android-usb-vnc/system/etc/systemd/system/xpra@.service

@@ -0,0 +1,12 @@
+[Unit]
+Description=Start xrpa server for %I
+Requires=xvfb@%i.service
+After=xvfb%i.service
+
+[Service]
+RemainAfterExit=yes
+User=das
+Type=simple
+ExecStart=/usr/local/bin/xpra_for_android.sh start %i
+ExecStop=/usr/local/bin/xpra_for_android.sh stop %i
+Restart=on-failure

+ 0 - 9
android-usb-vnc/system/etc/systemd/system/xvfb.service

@@ -1,9 +0,0 @@
-[Unit]
-Description=Start Xvfb virtual display
-After=adb.service
-
-[Service]
-Type=simple
-Environment=DISPLAY=:19
-ExecStart=/usr/local/bin/xvfb_for_android.sh
-Restart=on-failure

+ 8 - 0
android-usb-vnc/system/etc/systemd/system/xvfb@.service

@@ -0,0 +1,8 @@
+[Unit]
+Description=Start Xvfb virtual display for %I
+After=adb.service
+
+[Service]
+Type=simple
+ExecStart=/usr/local/bin/xvfb_for_android.sh %i
+Restart=on-failure

+ 2 - 7
android-usb-vnc/system/etc/udev/rules.d/99-android-usb-remote.rules

@@ -1,10 +1,5 @@
 # Lenovo
-SUBSYSTEM=="usb", ATTR{idVendor}=="17ef", ENV{ID_SERIAL_SHORT}!="", TAG+="systemd", ENV{SYSTEMD_WANTS}="adb-reverse@%E{ID_SERIAL_SHORT}.service"
-ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="17ef", TAG+="systemd", ENV{SYSTEMD_WANTS}="x11vnc.service"
-ACTION=="remove", SUBSYSTEM=="usb", RUN+="/usr/bin/bash -c '/usr/bin/lsusb | grep 17ef: || /usr/bin/systemctl stop x11vnc.service'"
+SUBSYSTEM=="usb", ATTR{idVendor}=="17ef", ENV{ID_SERIAL_SHORT}!="", SYMLINK+="vd$env{ID_SERIAL_SHORT}", TAG+="systemd", ENV{SYSTEMD_WANTS}="adb-reverse@%E{ID_SERIAL_SHORT}.service x11vnc@%E{ID_SERIAL_SHORT}.service"
 
 # Samsung
-SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ENV{ID_SERIAL_SHORT}!="", TAG+="systemd", ENV{SYSTEMD_WANTS}="adb-reverse@%E{ID_SERIAL_SHORT}.service"
-ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", TAG+="systemd", ENV{SYSTEMD_WANTS}="x11vnc.service"
-ACTION=="remove", SUBSYSTEM=="usb", RUN+="/usr/bin/bash -c '/usr/bin/lsusb | grep 04e8: || /usr/bin/systemctl stop x11vnc.service'"
-
+SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ENV{ID_SERIAL_SHORT}!="", SYMLINK+="vd$env{ID_SERIAL_SHORT}", TAG+="systemd", ENV{SYSTEMD_WANTS}="adb-reverse@%E{ID_SERIAL_SHORT}.service x11vnc@%E{ID_SERIAL_SHORT}.service"

+ 25 - 0
android-usb-vnc/system/usr/local/bin/x11vnc_for_android.sh

@@ -0,0 +1,25 @@
+#!/bin/bash
+set -euo pipefail
+
+ACTION="$1"
+SERIAL_SHORT="$2"
+REMOTE_DISPLAY="$(cat "/var/lib/xvfb/$SERIAL_SHORT/display")"
+
+for i in {1..10}
+do
+    DISPLAY=:"$REMOTE_DISPLAY" /usr/bin/xhost &>/dev/null && break
+    sleep 1
+done
+
+case "$ACTION"
+in
+    "start")
+        /usr/bin/xpra control :"$REMOTE_DISPLAY" start "/usr/bin/x11vnc -forever -shared -rfbport 5900 -listen localhost -nopw"
+        ;;
+    "stop")
+        /usr/bin/xpra control :"$REMOTE_DISPLAY" start "/bin/bash -c 'pidof x11vnc && kill $(pidof x11vnc)'"
+        ;;
+    *)
+        exit 1
+        ;;
+esac

+ 5 - 2
android-usb-vnc/system/usr/local/bin/xpra_attach_hdpi.sh

@@ -1,5 +1,8 @@
 #!/bin/bash
 set -euo pipefail
+
 set -x
-REMOTE_DISPLAY=:19
-/usr/bin/xpra attach --desktop-scaling=0.5 "${REMOTE_DISPLAY}"
+(( $# )) && REMOTE_DISPLAY="$1"
+(( $# )) || REMOTE_DISPLAY="$(find /var/lib/xvfb -type f -name 'display' -exec bash -c 'cat $1; echo' find-shell {} \; | sort -V | head -n1)"
+
+/usr/bin/xpra attach --desktop-scaling=0.5 :"${REMOTE_DISPLAY}"

+ 26 - 0
android-usb-vnc/system/usr/local/bin/xpra_for_android.sh

@@ -0,0 +1,26 @@
+#!/bin/bash
+set -euo pipefail
+
+ACTION="$1"
+SERIAL_SHORT="$2"
+
+REMOTE_DISPLAY="$(cat "/var/lib/xvfb/$SERIAL_SHORT/display")"
+
+for i in {1..10}
+do
+    DISPLAY=:"$REMOTE_DISPLAY" /usr/bin/xhost &>/dev/null && break
+    sleep 1
+done
+case "$ACTION"
+in
+    "start")
+        /usr/bin/xpra start-desktop --use-display=yes --start=/usr/bin/startlxqt :"$REMOTE_DISPLAY"
+        ;;
+    "stop")
+        /usr/bin/xpra stop :"$REMOTE_DISPLAY"
+        ;;
+    *)
+        exit 1
+        ;;
+esac
+

+ 23 - 8
android-usb-vnc/system/usr/local/bin/xvfb_for_android.sh

@@ -1,19 +1,34 @@
 #!/usr/bin/bash
 set -euo pipefail
+
 set -x
+SERIAL_SHORT="$1"
+mkdir -p "/var/lib/xvfb/$SERIAL_SHORT"
+serial_to_display_map="/var/lib/xvfb/$SERIAL_SHORT/display"
+serial_to_size_map="/var/lib/xvfb/$SERIAL_SHORT/size"
+if ! [ -f "$serial_to_display_map" ]
+then
+
+    nd="$(find /var/lib/xvfb -type f -name 'display' -exec bash -c 'cat $1; echo' find-shell {} \; | sort -V | tail -n1)"
+    [ "$nd" ] || nd=100
+    echo -n "$((nd + 1))" > "$serial_to_display_map"
+fi
+REMOTE_DISPLAY="$(cat "$serial_to_display_map")"
+
 for i in {1..10}
 do
-    if /usr/bin/adb shell wm size &>/dev/null
+    if /usr/bin/adb -s "$SERIAL_SHORT" shell wm size > "$serial_to_size_map"
     then
-        break
+        # get native display dimensions
+        raw_size="$(cat "$serial_to_size_map" | cut -d: -f2 | tr -d ' ')"
+        # convert to landscape
+        size="$(echo "$raw_size" | tr x '\n' | sort -Vr | tr '\n' 'x')"24
+        /usr/bin/Xvfb ":${REMOTE_DISPLAY}" -screen 0 "${size}" -dpi 192 -nolisten tcp
+        exit "$?"
     else
+        rm "$serial_to_size_map"
         sleep 1
     fi
 done
-set -x
-# get native display dimensions
-raw_size="$(/usr/bin/adb shell wm size | cut -d: -f2 | tr -d ' ')"
-# convert to landscape
-size="$(echo "$raw_size" | tr x '\n' | sort -Vr | tr '\n' 'x')"24
-/usr/bin/Xvfb ${DISPLAY} -screen 0 "${size}" -dpi 192 -nolisten tcp
+exit 1