Advertisement
Guest User

Untitled

a guest
Feb 10th, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. import sys
  4.  
  5. #this encodes key layout on a wired, extended silver apple keyboard, european style
  6. #(euro key, mark-sign-and-cmd, alt-and-junction-sign, ctrl, §± left-top, `~ next to
  7. # small shift in left-bottom)
  8. keyskip=1.9 #normal small keys
  9. rowheight=1.85
  10. keywid=1.5
  11. keyhei=1.5
  12.  
  13. rightedge=27.2
  14. bottomedge=8.9
  15.  
  16. layoutlist=[] #list of (lowercase char,(x,y,w,h))
  17. for i,c in enumerate("§1234567890-="):
  18. layoutlist.append((c,(keyskip*i,0,keywid,keyhei)))
  19. layoutlist.append(("\b",(keyskip*13,0,2.5,keyhei)))
  20. layoutlist.append(("\t",(0,rowheight,2.5,keyhei)))
  21. for i,c in enumerate("qwertyuiop[]"):
  22. layoutlist.append((c,(2.8+keyskip*i,rowheight,keywid,keyhei)))
  23. layoutlist.append(("caps",(0,2*rowheight,3,keyhei)))
  24. for i,c in enumerate("asdfghjkl;'\\"):
  25. layoutlist.append((c,(3.3+keyskip*i,2*rowheight,keywid,keyhei)))
  26. layoutlist.append(("\n",(3.3+keyskip*12,rowheight,1.1,rowheight+keyhei)))
  27. layoutlist.append(("shift",(0,3*rowheight,2,keyhei)))
  28. for i,c in enumerate("`zxcvbnm,./"):
  29. layoutlist.append((c,(2.4+keyskip*i,3*rowheight,keywid,keyhei)))
  30. layoutlist.append(("shift",(2.4+keyskip*11,rowheight*3,3.8,keyhei)))
  31. layoutlist.append(("ctrl",(0,rowheight*4,2.5,keyhei)))
  32. layoutlist.append(("alt",(2.8,rowheight*4,2.1,keyhei)))
  33. layoutlist.append(("cmd",(5.2,rowheight*4,2.5,keyhei)))
  34. layoutlist.append((" ",(8,rowheight*4,11.1,keyhei)))
  35. layoutlist.append(("cmd",(19.4,rowheight*4,2.5,keyhei)))
  36. layoutlist.append(("alt",(22.2,rowheight*4,2.1,keyhei)))
  37. layoutlist.append(("ctrl",(24.6,rowheight*4,2.5,keyhei)))
  38.  
  39. for i,v in enumerate(layoutlist):
  40. layoutlist[i]=(v[0],tuple(round(x,2) for x in v[1]))
  41.  
  42. layoutdict=dict(layoutlist)
  43.  
  44. modkeys=["shift","ctrl","alt","cmd","caps"]
  45.  
  46. uptolow={"±":"§","!":"1","@":"2","#":"3","$":"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0","_":"-","+":"=","Q":"q","W":"w","E":"e","R":"r","T":"t","Y":"y","U":"u","I":"i","O":"o","P":"p","{":"[","}":"]","A":"a","S":"s","D":"d","F":"f","G":"g","H":"h","J":"j","K":"k","L":"l",":":";","\"":"'","|":"\\","~":"`","Z":"z","X":"x","C":"c","V":"v","B":"b","N":"n","M":"m","<":",",">":".","?":"/"}
  47. lowtoup=dict((low,up) for up,low in uptolow.items())
  48.  
  49.  
  50. capslockenabled=False
  51.  
  52. def keybyxy(x,y):
  53. for (key,pos) in layoutlist:
  54. if x>=pos[0] and x<=pos[0]+pos[2] and y>=pos[1] and y<=pos[1]+pos[3]:
  55. return key
  56.  
  57. mindistsq=float("inf")
  58. minat=None
  59. for (key,pos) in layoutlist:
  60. distsq=(pos[0]+pos[2]/2-x)*(pos[0]+pos[2]/2-x)+(pos[1]+pos[3]/2-y)*(pos[1]+pos[3]/2-y)
  61. if distsq<mindistsq:
  62. mindistsq=distsq
  63. minat=key
  64. return key
  65.  
  66. def flipkey(c):
  67. global capslockenabled
  68. try:
  69. c=uptolow[c]
  70. return flipkey("shift")+flipkey(c)
  71. except:
  72. pass
  73. try: x,y,w,h=layoutdict[c]
  74. except: return c
  75. key=keybyxy(rightedge-(x+w/2),bottomedge-(y+h/2))
  76. assert key!=None
  77. if key=="caps":
  78. capslockenabled=not capslockenabled
  79. if key in modkeys: key=""
  80. if capslockenabled: key=key.upper()
  81. return key
  82.  
  83. for line in sys.stdin:
  84. print("".join(flipkey(c) for c in line[:-1]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement