blob: 655548811811ebb4a763e64e1b4b9be1109089ee [file] [log] [blame]
#!/usr/bin/python
# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""almost a hundred lines to call 1 ioctl. tool to tune remote repeat speed."""
__author__ = "edjames@google.com (Ed James)"
import fcntl
import os
import struct
import sys
import options
import commands
optspec = """
input-repeat -f /dev/input/eventX [-d delay] [-p period] [-m max (if supported)]
--
f,file= Path to a /dev/input/event* device
d,delay= delay before repeat starts in milliseconds
p,period= time between repeats in milliseconds
m,max= maximum times to repeat (may not be available)
"""
def get_or_set_rep(efile, delay, period, maxrep):
"""optionally apply changes and display settings."""
if commands.getoutput("uname -m") == 'mips':
eviocgrep = 0x40084503
eviocsrep = 0x80084503
else:
eviocgrep = 0x80084503
eviocsrep = 0x40084503
change = (delay is not None or period is not None or maxrep is not None)
efd = os.open(efile, os.O_RDWR)
vin = [0, 0, 0]
buf = struct.pack("@iii", *vin)
buf = fcntl.ioctl(efd, eviocgrep, buf)
vout = list(struct.unpack("@iii", buf))
if change:
vin = vout[:]
if delay is not None:
vin[0] = delay
if period:
vin[1] = period
if maxrep:
vin[2] = maxrep
buf = struct.pack("@iii", *vin)
fcntl.ioctl(efd, eviocsrep, buf)
vin = [0, 0, 0]
buf = struct.pack("@iii", *vin)
buf = fcntl.ioctl(efd, eviocgrep, buf)
vout = list(struct.unpack("@iii", buf))
print("{}: delay {} period {} max {} (0 means unsupported)".
format(efile, *vout))
def main(argv):
"""parse args and get or set hid repeat values."""
err = 0
delay = None
period = None
maxrep = None
opts = options.Options(optspec)
(opt, unused_flags, unused_extra) = opts.parse(argv[1:])
if unused_extra:
print "{}: extra arguments found".format(argv[0])
err += 1
if opt.file is None:
print "{}: -f/--file is required".format(argv[0])
err += 1
if opt.delay is not None:
delay = int(opt.delay)
if opt.period is not None:
period = int(opt.period)
if opt.max is not None:
maxrep = int(opt.max)
if ((delay is not None and delay < 1) or
(period is not None and period < 1) or
(maxrep is not None and maxrep < 1)):
print "{}: delay, period and/or max must be >= 1".format(argv[0])
err += 1
if err:
sys.exit(err)
get_or_set_rep(opt.file, delay, period, maxrep)
if __name__ == "__main__":
main(sys.argv)