File epoptes-client-x11vnc-wrapper.patch of Package epoptes
=== modified file 'data/client-functions'
--- data/client-functions 2015-08-22 17:30:18 +0000
+++ data/client-functions 2015-10-23 12:48:04 +0000
@@ -234,7 +234,7 @@
# $1 = port.
# $2 = grab keyboard and mouse.
get_assisted() {
- background x11vnc -noshm -24to32 ${2:+-grabptr -grabkbd} -connect_or_exit "$SERVER:$1"
+ background ./x11vnc-wrapper -noshm -24to32 ${2:+-grabptr -grabkbd} -connect_or_exit "$SERVER:$1"
}
# Deactivate the screensaver, in order for the users to watch a broadcast.
=== added file 'epoptes-client/x11vnc-wrapper'
--- epoptes-client/x11vnc-wrapper 1970-01-01 00:00:00 +0000
+++ epoptes-client/x11vnc-wrapper 2015-10-23 12:48:04 +0000
@@ -0,0 +1,129 @@
+#!/bin/sh
+###########################################################################
+# Wraps x11vnc with an alternative treatment
+# for -grabkbd and -grabptr options.
+#
+# This is a workaround for a x11vnc -grabptr limitation
+# where only mouse buttons, but not pointer movement,
+# can be grabbed.
+#
+# It's also a workaround for a x11vnc bug where
+# remote client windows can't be dragged within
+# VNC viewer, if -grabkbd is passed.
+# (https://github.com/LibVNC/x11vnc/issues/18)
+#
+# Usage: x11vnc-wrapper <x11vnc args>
+#
+# Copyright (C) 2015 LaƩrcio de Sousa <laerciosousa@sme-mogidascruzes.sp.gov.br>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# On Debian GNU/Linux systems, the complete text of the GNU General
+# Public License can be found in `/usr/share/common-licenses/GPL'.
+###########################################################################
+# Grab pointer devices.
+# Parameters:
+# $1..$N = devices' IDs
+grab_pointer_devices() {
+ while [ ${#} -gt 0 ]
+ do
+ xinput --set-prop "${1}" "Device Accel Constant Deceleration" 999999
+ shift
+ done
+}
+
+# Ungrab pointer devices.
+# Parameters:
+# $1..$N = devices' IDs
+ungrab_pointer_devices() {
+ while [ ${#} -gt 0 ]
+ do
+ xinput --set-prop "${1}" "Device Accel Constant Deceleration" 1
+ shift
+ done
+}
+
+# Grab key devices.
+# Parameters:
+# $1..$N = devices' IDs
+grab_key_devices() {
+ while [ ${#} -gt 0 ]
+ do
+ xinput --disable "${1}"
+ shift
+ done
+}
+
+# Ungrab key devices.
+# Parameters:
+# $1..$N = devices' IDs
+ungrab_key_devices() {
+ while [ ${#} -gt 0 ]
+ do
+ xinput --enable "${1}"
+ shift
+ done
+}
+
+keyboards=
+pointers=
+
+while [ ${#} -gt 0 ]
+do
+ case "${1}" in
+ -grabkbd)
+ keyboards="$(xinput --list | awk '/slave.*keyboard/ {
+ if ($0 !~ /XTEST/) {
+ match($0, /id=[0-9]+/)
+ if (RSTART)
+ print substr($0, RSTART+3, RLENGTH-3)
+ }
+ }')"
+ ;;
+
+ -grabptr)
+ args="${args} ${1}"
+ pointers="$(xinput --list | awk '/slave.*pointer/ {
+ if ($0 !~ /XTEST/) {
+ match($0, /id=[0-9]+/)
+ if (RSTART)
+ print substr($0, RSTART+3, RLENGTH-3)
+ }
+ }')"
+ ;;
+
+ *)
+ args="${args} ${1}"
+ ;;
+ esac
+
+ shift
+done
+
+grab_key_devices ${keyboards}
+grab_pointer_devices ${pointers}
+
+# Just a safety measure to ensure input devices
+# will be properly ungrabbed if we receive a
+# SIGTERM or SIGINT while x11vnc is running.
+#
+# Uses SIGTERM-propagation scheme as proposed in
+# http://veithen.github.io/2014/11/16/sigterm-propagation.html
+trap 'kill -TERM ${x11vnc_pid}; ungrab_key_devices ${keyboards}; ungrab_pointer_devices ${pointers}; exit 0' TERM INT
+x11vnc ${args} &
+x11vnc_pid=${!}
+wait ${x11vnc_pid}
+
+ungrab_key_devices ${keyboards}
+ungrab_pointer_devices ${pointers}