112 lines
3.1 KiB
Python
Executable File
112 lines
3.1 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import re
|
|
import sys
|
|
import getopt
|
|
|
|
DX = DY = PX = PY = KX = KY = 0
|
|
|
|
_RE_LINE = re.compile("^\s*(?P<keyword>[\w-]+)\s+{\s*$")
|
|
_RE_XY = re.compile("^(?P<start>\s*)(?P<xy>[x|y]\s+)(?P<num>\d+)(?P<end>\s*)$")
|
|
|
|
def main():
|
|
ParseArgs()
|
|
ParseInput()
|
|
|
|
def Usage():
|
|
print >>sys.stderr, """
|
|
Usage: %s --dx offset-x-display --dy offset-y-display --px offset-x-phone-buttons --py offset-y-phone-buttons --kx offset-x-keyboard --ky offset-y-keyboard < layout > layout2.
|
|
|
|
Unspecified offsets default to 0 (unchanged).
|
|
Reads from stdin, outputs to stdout.
|
|
Phone buttons: soft-left/top/righ/bottom, home, dpad, dial, power, etc.
|
|
Keyboard is the soft keyboard.
|
|
|
|
If your shell doesn't let you use negative integers, use _ for minus sign,
|
|
i.e. --dx _40 --dy _42 for <-40,-42).
|
|
""" % (sys.argv[0])
|
|
sys.exit(1)
|
|
|
|
def ParseArgs():
|
|
global DX, DY, PX, PY, KX, KY
|
|
try:
|
|
options, args = getopt.getopt(sys.argv[1:], "", ["dx=", "dy=", "px=", "py=", "kx=", "ky="])
|
|
for opt, value in options:
|
|
if opt in ["--dx"]:
|
|
DX = int(value.replace("_", "-"))
|
|
elif opt in ["--dy"]:
|
|
DY = int(value.replace("_", "-"))
|
|
elif opt in ["--px"]:
|
|
PX = int(value.replace("_", "-"))
|
|
elif opt in ["--py"]:
|
|
PY = int(value.replace("_", "-"))
|
|
elif opt in ["--kx"]:
|
|
KX = int(value.replace("_", "-"))
|
|
elif opt in ["--ky"]:
|
|
KY = int(value.replace("_", "-"))
|
|
else:
|
|
Usage()
|
|
except getopt.error, msg:
|
|
Usage()
|
|
|
|
def ParseInput():
|
|
global DX, DY, PX, PY, KX, KY
|
|
|
|
PHONE = [ "soft-left", "home", "back", "dpad-up", "dpad-down", "dpad-left", "dpad-right", "dpad-center", "phone-dial", "phone-hangup", "power", "volume-up", "volume-down" ]
|
|
KEYBOARD = [ "DEL", "CAP", "CAP2", "PERIOD", "ENTER", "ALT", "SYM", "AT", "SPACE", "SLASH", "COMMA", "ALT2" ]
|
|
|
|
mode = None
|
|
while True:
|
|
line = sys.stdin.readline()
|
|
if not line:
|
|
return
|
|
m_line = _RE_LINE.match(line)
|
|
if m_line:
|
|
keyword = m_line.group("keyword")
|
|
if keyword in ["display", "button"]:
|
|
mode = keyword
|
|
is_phone = False
|
|
is_keyboard = False
|
|
print >>sys.stderr, "Mode:", mode
|
|
else:
|
|
if mode == "button" and "{" in line:
|
|
is_phone = keyword in PHONE
|
|
is_keyboard = (len(keyword) == 1 and keyword.isalnum())
|
|
if not is_keyboard:
|
|
is_keyboard = keyword in KEYBOARD
|
|
elif "}" in line:
|
|
is_phone = False
|
|
is_keyboard = False
|
|
if mode == "display":
|
|
mode = None
|
|
else:
|
|
m_xy = _RE_XY.match(line)
|
|
if m_xy:
|
|
x = 0
|
|
y = 0
|
|
if mode == "display":
|
|
x = DX
|
|
y = DY
|
|
elif mode == "button" and is_phone:
|
|
x = PX
|
|
y = PY
|
|
elif mode == "button" and is_keyboard:
|
|
x = KX
|
|
y = KY
|
|
if x or y:
|
|
d = m_xy.groupdict()
|
|
n = int(d["num"])
|
|
if d["xy"].startswith("x"):
|
|
n += x
|
|
else:
|
|
n += y
|
|
d["num"] = n
|
|
line = "%(start)s%(xy)s%(num)s%(end)s" % d
|
|
sys.stdout.write(line)
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|