--- /usr/sbin/x2gothinclientd.orig 2015-01-06 18:34:27.591213413 +0000 +++ /usr/sbin/x2gothinclientd 2015-01-06 18:44:40.679505839 +0000 @@ -111,19 +111,67 @@ # wait for X-Server to come up sleep(3); - # align displays next to each other in order of appearance in xrandr - my $this_display; - my $next_display; - foreach (`DISPLAY=:0 LANG=C xrandr 2>/dev/null | grep ' connected ' | cut -d ' ' -f1`) + # Align displays next to each other in order of appearance in xrandr, unless touch + # devices are detected - in that case, clone displays so that touchable area and display + # stay aligned. This fix has been introduced for a certain make of wacom touch-sensitive + # displays. If you have a touch-sensitive device that isn't affected by this, or that + # is negatively affected by this fix, please let us know so we can add a better detection. + # The fix is bypassed if a mouse device is detected. + # Note that you can manually override the behavior by passing a kernel parameter + # xinerama=above|below|same-as|left-of|right-of to override the autodetection. + + # check if a xinerama kernel parameter is set + my $xrandrcmdtainted = `cat /proc/cmdline | tr ' ' '\n' | awk -F '=' '$1 == "xinerama" { print $2 }'`; + my $xrandrcmd; + if ($xrandrcmdtainted =~ /(^above$|^below$|^same-as$|^left-of$|^right-of$)/) { - $next_display = $_; - $next_display =~ s/\n//; - if (defined($this_display)) - { - `DISPLAY=:0 /usr/bin/xrandr --output $next_display --left-of $this_display`; - } - $this_display = $next_display; + # if the parameter value matches one value of the defined set, use that + $xrandrcmd = $1; } + else + { + # else default to "left-of", which was our standard behavior in previous versions + $xrandrcmd = "left-of"; + } + + # find out how many touch devices we have + my $touchdevicescount = `DISPLAY=:0 xsetwacom -d localhost:0.0 --list devices | wc -l`; + + # find out how many mouse devices we have + my $micecount = `find /dev/input -maxdepth 1 -name "mouse*" | wc -l`; + + # declare two variables for the upcoming loop + my $this_display; + my $next_display; + + # loop through the following code block for all connected display devices + foreach (`DISPLAY=:0 LANG=C xrandr 2>/dev/null | grep ' connected ' | cut -d ' ' -f1`) + { + # assign a value to $next_display and remove newline from it + chomp ($next_display = $_); + + # $this_display won't be defined until the second time the loop is executed, which is a + # neat way of running xrandr only if there are at least two connected display devices + if (defined($this_display)) + { + if (($touchdevicescount > 0) && ($micecount < 1) && ($xrandrcmdtainted eq "")) + { + # we have a touch device and no mice, and no xinerama parameter was set, + # so switch to clone view to make the touch device usable + `DISPLAY=:0 /usr/bin/xrandr --output $next_display --same-as $this_display`; + } + else + { + # else use whatever is in $xrandrcmd (which is either our default of "left-of", + # or a valid xinerama kernel parameter value) + `DISPLAY=:0 /usr/bin/xrandr --output $next_display --$xrandrcmd $this_display`; + } + } + + # now set $this_display -> every subsequent iteration of the loop will now enter the code block + # above where (defined($this_display)) is the conditional + $this_display = $next_display; + } } # test if pulseaudio is running, if not launch it...