#!/usr/bin/ruby # ./grox.rb # +left, +right, flip: relative movement # left, right, normal, inverted: absolute movement # devices to manipulate $screen = 'eDP-1' $touchscreen1 = 'Wacom Pen and multitouch sensor Pen stylus' $touchscreen2 = 'Wacom Pen and multitouch sensor Pen eraser' $touchscreen3 = 'Wacom Pen and multitouch sensor Finger touch' $touchpad = '' $keyboard = 'AT Translated Set 2 keyboard' # disable keypad and touchpad on all but normal orientation #$controlKeys = true $controlKeys = false # runs cmd and greps output to find orientation $orientationCmd = 'xrandr' $orientationRE = /\s*#{$screen}\s+\w+\s+\w+\s+\d+x\d+\+\d+\+\d+\s+(|left|right|inverted)\s*\(/ # default direction $defaultDirection = '+right' # CODE def main() direction = $defaultDirection if ARGV.length > 0 direction = ARGV[0] end doOrientate(getNewOrientation(direction)) end def orientateCmd(orientation, transform) rotateScreen = "xrandr --output #{$screen}" + " --rotate #{orientation}"; rotateTouchscreen1 = "xsetwacom --set '#{$touchscreen1}' Rotate #{transform}" rotateTouchscreen2 = "xsetwacom --set '#{$touchscreen2}' Rotate #{transform}" rotateTouchscreen3 = "xsetwacom --set '#{$touchscreen3}' Rotate #{transform}" controlKeys = "" if $controlKeys setCmd = orientation == 'normal' ? 'xinput --enable ' : 'xinput --disable ' controlKeys = "#{setCmd} '#{$touchpad}'; #{setCmd} '#{$keyboard}';" end return controlKeys + rotateScreen + ';' + rotateTouchscreen1 + ';' + rotateTouchscreen2 + ';' + rotateTouchscreen3 + ';' end def doOrientate(orientation) case orientation when 'normal' `#{orientateCmd('normal', 'none')}` when 'left' `#{orientateCmd('left', 'ccw')}` when 'right' `#{orientateCmd('right', 'cw')}` when 'inverted' `#{orientateCmd('inverted', 'half')}` else raise "Don't know how to orientate to #{orientation}" end end # returns direction of $screen: left, right, normal or invert def getOrientation() if `#{$orientationCmd}` =~ $orientationRE return $1 == '' ? 'normal' : $1 else raise "Could not determine orientation of #{$screen} from #{$orientationCmd}" end end # direction should be +left, +right, flip, left, right, normal, or inverted def getNewOrientation(direction) clockwise = ['normal', 'right', 'inverted', 'left'] if clockwise.include?(direction) return direction else curdir = clockwise.find_index(getOrientation()) shift = case direction when '+left' then -1 when '+right' then 1 when 'flip' then 2 else raise "Unrecognised rotate direction #{direction}" end newdir = (curdir + shift) % 4 return clockwise[newdir] end end # DO main()