EXEC.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. import json
  2. import time
  3. import sys
  4. import tkinter as tk
  5. import traceback
  6. import _thread as thread
  7. import dialog
  8. DIALOG = dialog.Dialog()
  9. #d = dialog.Dialog()
  10. #d.ask_exec_config(str(nr+1),button=button,label=label,cfg=cfg)
  11. import __main__ as MAIN
  12. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  13. INIT_OK = 1
  14. IS_GUI = 0
  15. from lib.cprint import cprint
  16. import tkgui.draw as draw
  17. import lib.libtk as libtk
  18. import lib.zchat as chat
  19. _global_short_key = 1
  20. root = None
  21. cmd_client = chat.Client(port=30003)
  22. try:
  23. import memcache
  24. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  25. except:
  26. mc = None
  27. class Refresher(): # DUMMY
  28. def __init__(self,*arg,**args):
  29. print(self,"__init__",arg,args)
  30. def reset(*arg,**args):
  31. print(self,"reset",arg,args)
  32. class MASTER(): # DUMMY
  33. def __init__(self,*arg,**args):
  34. print(self,"__init__",arg,args)
  35. #self.refresh_fix = Refresher()
  36. def refresh_fix(self,*arg,**args):# = Refresher()
  37. print(self,"refresh_fix",arg,args)
  38. def exec_go(self,nr,*arg,**args): #val=None,xfade=None,event=None,button="",ptfade=None):
  39. if _global_key_lock:
  40. return
  41. #def exec_go(nr,xfade=None,val=0):
  42. print(self,"MASTER",nr,arg,args)
  43. btn_nr = nr
  44. v = args["val"]
  45. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  46. cprint("SEND MASTER.EXEC_GO:",msg,color="green")
  47. cmd_client.send(msg)
  48. def refresh_fix(*arg,**args): # DUMMY
  49. print("refresh_fix",arg,args)
  50. class Refresher_fix(): # DUMMY
  51. def __init__(self,*arg,**args):
  52. print(self,"init",arg,args)
  53. def reset(self,*arg,**args):
  54. print(self,"reset",arg,args)
  55. refresher_fix = Refresher_fix()
  56. class Modes(): # DUMMY
  57. def __init__(self,*arg,**args):
  58. print("Modes.__init__",arg,args)
  59. self.modes = {}
  60. def val(self,*arg,**args):
  61. #print("Modes.val",arg,args)
  62. pass
  63. master = MASTER() #{}
  64. modes = Modes()
  65. import tkinter as tk
  66. class Exec(): # DUMMY
  67. def __init__(self):
  68. self.val_exec = {}
  69. for i in range(512):
  70. k=i #"ABC-{}".format(i+1)
  71. self.val_exec[k] = {"NAME":"XX"}
  72. EXEC = Exec()
  73. class Gui(): # DUMMY
  74. def __init__(self):
  75. self.elem_exec = []
  76. self.elem_meta = [None]*512
  77. def _refresh_exec(self,*arg,**args):
  78. print("EXEC_Gui._refresh_exec",arg,args)
  79. nr = 14-1
  80. METAS = []
  81. for i in range(512):
  82. nr = i #+1
  83. try:
  84. data = mc.get("EXEC-META-"+str(nr)) #,json.dumps(index))
  85. data = json.loads(data)
  86. METAS.append(data)
  87. except Exception as e:
  88. print(" ER1R mc...",e)
  89. for nr,b in enumerate( self.elem_exec): #[nr]
  90. _bg = "grey"
  91. _ba = "grey"
  92. _bg = "grey"
  93. _fg = "#555" #darkgrey"
  94. _text = "0 N/V 0\n N/V"
  95. txt = "None/nNone"
  96. txt1 = "None/nNone"
  97. out = {} # default
  98. out["fx"] = ""
  99. out["bg"] = _bg # "grey"
  100. out["ba"] = _ba #"grey"
  101. out["fg"] = _fg
  102. out["text"] = _text #"? "+str(nr+1)
  103. META = {'LABEL': 'ERR', 'LEN': 2, 'CFG': {}}
  104. META["CFG"] = {'FADE': 3.0, 'DEALY': 0, 'DELAY': 4.0, 'BUTTON': 'ON', 'HTP-MASTER': 100,
  105. 'SIZE-MASTER': 100, 'SPEED-MASTER': 100, 'OFFSET-MASTER': 100, 'OUT-FADE': 10.0}
  106. try:
  107. META = METAS[nr]
  108. label = "{} {} {}\n{}".format(nr+1,META["CFG"]["BUTTON"],META["LEN"],META["LABEL"])
  109. out["text"] = str(label)
  110. LEN = META["LEN"] #int(label.split("\n")[0].split()[-1])
  111. if LEN: # >= 3:
  112. _bg = "orange" #yellow"
  113. _fg = "black" #grey"
  114. except Exception as e:
  115. print(" ER4R",e,nr)
  116. time.sleep(0.001)
  117. try:
  118. txt1 = META["CFG"]["BUTTON"]
  119. except:
  120. pass
  121. if META["LEN"]:
  122. _fg = "black"
  123. _bg = "gold"
  124. _ba = "#ffaa55"
  125. if "SEL" in txt1:
  126. #_bg = "blue"
  127. #_fg = "blue"
  128. _bg = "#77f"
  129. elif "ON" in txt1:
  130. _fg = "#040"
  131. _fg = "black"
  132. elif "GO" in txt1:
  133. _fg = "#555"
  134. _fg = "black"
  135. out["fx"] = ""
  136. if META["CFG"]["HAVE-FX"] >= 1:
  137. out["fx"] = META["CFG"]["HAVE-FX"] # show FX on EXEC-BTN
  138. if META["CFG"]["HAVE-FX"] >= 1 and META["CFG"]["HAVE-VAL"] == 0:
  139. _bg = "cyan"
  140. if "FL" in txt1:
  141. _fg = "#00e"
  142. out["fg"] = _fg #= "#00e"
  143. out["bg"] = _bg #= "#00e"
  144. cfg = out
  145. self.elem_meta[nr] = META
  146. b = self.elem_exec[nr]
  147. b.configure(fg=cfg["fg"],bg=cfg["bg"],activebackground=cfg["ba"],text=cfg["text"],fx=cfg["fx"])
  148. def exec_go(self,*arg,**args):
  149. print("Gui.exec_go",arg,args)
  150. #print(" ",dir(arg))
  151. #print(" ",self)
  152. btn_nr = arg[0]
  153. v=args["val"]
  154. if "CFG-BTN" in modes.modes:
  155. button = self.elem_exec[btn_nr]
  156. label = str(btn_nr) #self.elem_meta[nr] = META
  157. if v:
  158. META = self.elem_meta[btn_nr]
  159. print("META",META)
  160. cfg = META["CFG"]
  161. label = META["LABEL"]
  162. button = cfg["BUTTON"]
  163. DIALOG.ask_exec_config(str(btn_nr+1),button=button,label=label,cfg=cfg)
  164. return
  165. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  166. cprint("SEND GUI.EXEC_GO",msg,color="green")
  167. cmd_client.send(msg)
  168. gui = Gui()
  169. #import memcache
  170. #mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  171. #import time
  172. #while 1:
  173. # x=mc.get("MODE")
  174. # print(x)
  175. # time.sleep(1)
  176. root = tk.Tk()
  177. #root.withdraw() # do not draw
  178. #root.resizable(1,1)
  179. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  180. defaultFont = tk.font.nametofont("TkDefaultFont")
  181. #cprint(defaultFont)
  182. defaultFont.configure(family="FreeSans",
  183. size=10,
  184. weight="bold")
  185. # MAIN MENUE
  186. try:
  187. ico_path = "/opt/LibreLight/Xdesk/icon/"
  188. root.iconphoto(False, tk.PhotoImage(file=ico_path+"exec.png"))
  189. except Exception as e:
  190. print(" Exception GUIWindowContainer.__init__",e)
  191. #xframe=root
  192. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  193. draw.draw_exec(gui,xframe,EXEC)
  194. #xframe.pack()
  195. root.title("TK-EXEC 2")
  196. def serialize_event(event):
  197. data = {}
  198. for k in dir(event):
  199. if k.startswith("_"):
  200. continue
  201. v = event.__getattribute__(k)
  202. if v == '??':
  203. continue
  204. if type(v) not in [int,str,float]:
  205. continue
  206. data[k] = v
  207. return data
  208. def tk_event(event,data={}):
  209. print("tk_event",event,data)
  210. if _global_key_lock:
  211. return
  212. #print(" ",dir(event)) #.dict())
  213. data = serialize_event(event)
  214. print(" ",data)
  215. ok=0
  216. if 'keysym' in data:
  217. if data['keysym'] == 'End':
  218. ok = 1
  219. msg=json.dumps([{"event":"FX-OFF"}]).encode("utf-8")
  220. cprint("SEND tk_event",msg,color="green")
  221. cmd_client.send(msg)
  222. if data['keysym'] == 'Escape':
  223. ok = 1
  224. msg=json.dumps([{"event":"CLEAR"}]).encode("utf-8")
  225. cprint("SEND tk_event",msg,color="green")
  226. cmd_client.send(msg)
  227. if not ok:
  228. libtk.tk_keyboard_callback(event,data=data)
  229. root.bind("<Button>",tk_event)#
  230. root.bind("<Key>",tk_event)#,self.callback)
  231. root.bind("<KeyRelease>",tk_event)#,self.callback)
  232. #root.bind("<FocusIn>",tk_event)#, on_focus(self.args["title"],"In").cb)
  233. #root.bind("<FocusOut>",tk_event)#, on_focus(self.args["title"],"Out").cb)
  234. import os
  235. _global_key_lock = 0
  236. def focus_in(event=None):
  237. _global_short_key = 0 # protect key-press-repeat
  238. cmd = "xset -display :0.0 r off"
  239. print("FOCUS_IN1", cmd)
  240. os.system(cmd)
  241. time.sleep(0.3)
  242. print("FOCUS_IN2", cmd)
  243. os.system(cmd)
  244. _global_short_key = 1 # protect key-press-repeat
  245. time.sleep(0.3)
  246. _global_key_lock = 0
  247. def focus_out(event=None):
  248. _global_key_lock = 1
  249. _global_short_key = 0
  250. cmd="xset -display :0.0 r rate 240 20"
  251. print("FOCUS_OUT", cmd)
  252. os.system(cmd)
  253. root.bind("<FocusIn>", focus_in)
  254. root.bind("<FocusOut>", focus_out)
  255. def _refr_loop():
  256. time.sleep(3)
  257. while 1:
  258. gui._refresh_exec()
  259. time.sleep(3)
  260. thread.start_new_thread(_refr_loop,())
  261. def _refr_loop2():
  262. time.sleep(3)
  263. while 1:
  264. try:
  265. global root
  266. title = "TK-EXEC"
  267. data = mc.get("MODES")
  268. title += " "+str(data)
  269. data = json.loads(data)
  270. #print("MODES",data)
  271. modes.modes = data
  272. if "S-KEY" in data:
  273. _global_short_key = 0
  274. if data["S-KEY"]:
  275. _global_short_key = 1
  276. if root:
  277. root.title(title)
  278. except Exception as e:
  279. print(" ER7R mc...",e)
  280. time.sleep(3)
  281. time.sleep(0.5)
  282. thread.start_new_thread(_refr_loop2,())
  283. root.mainloop()