EXEC.py 15 KB

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