EXEC.py 12 KB

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