From 36057d2ed15f4486cf5e465fb114877c7cf787bc Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 6 Feb 2011 23:18:11 +0000 Subject: [PATCH] gui: hidraw support seems to work at least as far as getting notices for unbound events, and evdev support seems to work again now too --- hostside/gui | 103 +++++++++++++++++++++++----------- hostside/gui-liberator.config | 2 +- 2 files changed, 72 insertions(+), 33 deletions(-) diff --git a/hostside/gui b/hostside/gui index b1fe3de..854804e 100755 --- a/hostside/gui +++ b/hostside/gui @@ -824,8 +824,9 @@ proc bind-input-static {event sysfs concrete args} { } proc bind-input-raw {devtype concrete args} { + set descriptors [exec ./hidrawconv-$devtype -d] bind-input-core hidraw:[get-unique $devtype] \ - hidraw [list $devtype] \ + hidraw [list $devtype $descriptors] \ $concrete $args } @@ -898,7 +899,7 @@ proc scan-input-bindings {} { if {[info exists v(devid)] && [info exists v(sysfs)] && [info exists v(event)]} { - lappend target($v(devid)) [list $v(event) $v(sysfs)] + lappend target(evdev:$v(devid)) [list $v(event) $v(sysfs)] } catch { unset v } } @@ -932,9 +933,8 @@ proc scan-input-bindings {} { foreach binding [input-bindings-list hidraw] { manyset $binding devkind devid devinfo concrete concargs switch -exact $devkind hidraw { } default continue - manyset $devinfo devtype - set rawmap([hidraw-descriptors/$devtype]) \ - [list $devid $devtype $concrete] + manyset $devinfo devtype descriptors + set rawmap($descriptors) [list $devid $devtype $concrete] } if {[array exists rawmap]} { set new_hidraws [lsort [glob -nocomplain -directory /dev hidraw*]] @@ -970,11 +970,13 @@ proc scan-input-bindings {} { continue } set raw(devid) $devid - set raw(chan) $chan - fconfigure $chan -buffering none -blocking no \ - -encoding binary -eofchar {} -translation binary - fileevent $chan readable \ - [list hidraw-readable/$devtype $chan $hidraw $devid] + set cmdl [list ./hidrawconv-$devtype -e <@ $chan 2>@ stderr] + set evch [open |$cmdl r] + set raw(chan) $evch + fconfigure $evch -blocking 0 -buffering line + fileevent $evch readable \ + [list catch-for-input-binding hidraw $hidraw \ + [list readable input-binding-raw $evch $hidraw $devid]] input-binding-present $devid 1 "hidraw $hidraw" } set old_hidraws $new_hidraws @@ -1000,11 +1002,12 @@ proc scan-input-bindings {} { continue } lappend cmdl 2>@ stderr - catch-for-input-binding $devid { + catch-for-input-binding evdev $devid { debug "ib $devid running $cmdl" set in(chan) [open |$cmdl r+] fconfigure $in(chan) -blocking 0 -buffering line - fileevent $in(chan) readable [list catch-for-input-binding $devid \ + fileevent $in(chan) readable \ + [list catch-for-input-binding evdev $devid \ [list readable input-binding $in(chan) $devid]] } } @@ -1033,34 +1036,33 @@ proc input-binding-present {devid yes why} { proc input-binding-eof {chan devid} { upvar #0 input/$devid in - fconfigure $in(chan) -blocking 1 - close $in(chan) - error "evdev-manip exited" {} {CHILDSTATUS ? 0} + input-binding-eof-core $in(chan) "evdev-manip exited" +} + +proc input-binding-eof-core {chan msg} { + fconfigure $chan -blocking 1 + close $chan + error $msg {} {CHILDSTATUS ? 0} +} + +proc input-binding-raw-eof {chan hidraw devid} { + upvar #0 hidraw/$hidraw raw + input-binding-eof-core $raw(chan) "hidrawconv-* exited" } proc input-binding-inputline {chan l devid} { - global showunbound upvar #0 input/$devid in - if {![catch { info args ib-inputline/$in(concrete) }]} { - # give the input binding first dibs - if {[ib-inputline/$in(concrete) $devid $l]} return - } + if {[input-binding-inputline-core-ib $devid $l]} return regsub {^[^ ]+ } $l {} lr switch -glob -- $lr { {opened *} { debug "ib $devid start << $l" - input-binding-present 1 $devid "evdev open" + input-binding-present $devid 1 "evdev open" } {[-0-9]*} { manyset [split $lr] value kindl kindr codel coder - set proc ib-ev/$in(concrete)/${kindl}_${kindr}/${codel}_${coder} - if {[catch { info args $proc }]} { - if {$showunbound} { - debug "ib $devid unbound $proc << $l" - } - return - } - $proc $devid $value + input-binding-inputline-core-ev $devid \ + ${kindl}_${kindr}/${codel}_${coder} $value $l } * { debug "ib $devid ignored << $l" @@ -1068,8 +1070,34 @@ proc input-binding-inputline {chan l devid} { } } -proc catch-for-input-binding {devid body} { +proc input-binding-inputline-core-ib {devid l} { + # give the input binding first dibs + upvar #0 input/$devid in + if {[catch { info args ib-inputline/$in(concrete) }]} { return 0 } + return [ib-inputline/$in(concrete) $devid $l] +} + +proc input-binding-inputline-core-ev {devid kindcode value l} { + global showunbound upvar #0 input/$devid in + set proc ib-ev/$in(concrete)/$kindcode + if {[catch { info args $proc }]} { + if {$showunbound} { + debug "ib $devid unbound $proc << $l" + } + return + } + $proc $devid $value +} + +proc input-binding-raw-inputline {chan l hidraw devid} { + upvar #0 hidraw/$hidraw raw + if {[input-binding-inputline-core-ib $devid $l]} return + manyset [split $l] kind code value + input-binding-inputline-core-ev $devid $kind/$code $value $l +} + +proc catch-for-input-binding {devkind ident body} { global errorInfo errorCode set r [catch { uplevel 1 $body } rv] if {$r!=1} { return -code $r $rv } @@ -1079,13 +1107,24 @@ proc catch-for-input-binding {devid body} { {POSIX *} { set m "communication error: [lindex $errorCode 1]" } * { error $rv $errorInfo $errorCode } } - debug "ib $devid died $m" + debug "ib $devkind $ident died $m" + input-binding-destroy/$devkind $ident $m +} + +proc input-binding-destroy/evdev {devid m} { + upvar #0 input/$devid in catch { close $in(chan) } catch { unset in(chan) } - input-binding-present $devid 0 "died $m" } +proc input-binding-destroy/hidraw {hidraw m} { + upvar #0 hidraw/$hidraw raw + catch { close $raw(chan) } + catch { unset raw(chan) } + input-binding-present $raw(devid) 0 "died $m" +} + proc engage-input-bindings {} { scan-input-bindings } diff --git a/hostside/gui-liberator.config b/hostside/gui-liberator.config index 3fb9f65..51e59d4 100644 --- a/hostside/gui-liberator.config +++ b/hostside/gui-liberator.config @@ -1,3 +1,3 @@ bind-input 0003 093a 2510 0111 wheelmouse "wheel mouse" bind-keyboard-speed bracketleft bracketright braceleft braceright "keys \[]{}" -bind-input-raw gamepad-neo-s gamepad "Gamepad" +bind-input-raw joytechneos gamepad "Gamepad" -- 2.30.2