#!/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()