EXEC.py 14 KB

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