FX3.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. #!/usr/bin/python3
  2. import json
  3. import time
  4. import sys
  5. import os
  6. import tkinter as tk
  7. import traceback
  8. import _thread as thread
  9. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  10. gui=None
  11. INIT_OK = 1
  12. IS_GUI = 0
  13. import __main__ as MAIN
  14. import lib.meta as meta
  15. import tool.git as git
  16. CAPTION = "FX3"
  17. title = CAPTION
  18. title += git.get_all()
  19. from lib.cprint import cprint
  20. import lib.libtk as libtk
  21. import lib.libtk2 as libtk2
  22. import lib.zchat as chat
  23. import lib.mytklib as mytklib
  24. import lib.tkevent as tkevent
  25. #import tkgui.draw as draw
  26. import tool.movewin as movewin
  27. movewin.check_is_started("FX3","/opt/LibreLight/Xdesk/tkgui/FX3.py")
  28. def _add_space(frame,r,c):
  29. b = tk.Canvas(frame,bg="black", height=2,bd=0,width=6,highlightthickness=0) #,bd="black")
  30. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  31. r+=1
  32. c=0
  33. return r,c
  34. def basic():
  35. for i in range(4):
  36. k = "GRP:1" #.format(i+1)
  37. MAIN.meta.fx3_grid[k].val("POS")
  38. k = "ATTR:1" #.format(i+1)
  39. MAIN.meta.fx3_grid[k].val("-")
  40. k = "ATTR:2" #.format(i+1)
  41. MAIN.meta.fx3_grid[k].val("-")
  42. k = "ATTR:3" #.format(i+1)
  43. MAIN.meta.fx3_grid[k].val("-")
  44. k = "ATTR:4" #.format(i+1)
  45. MAIN.meta.fx3_grid[k].val("-")
  46. k = "SIZE:{}".format(i+1)
  47. MAIN.meta.fx3_grid[k].val(255)
  48. MAIN.meta.fx3_grid[k].data["init_value"] = 255
  49. MAIN.meta.fx3_grid[k].data["max"] = 512
  50. MAIN.meta.fx3_grid[k].data["cycle"] = [0,127,255]
  51. k = "SPEED:{}".format(i+1)
  52. MAIN.meta.fx3_grid[k].val(10)
  53. MAIN.meta.fx3_grid[k].data["init_value"] = 10
  54. MAIN.meta.fx3_grid[k].data["max"] = 255
  55. MAIN.meta.fx3_grid[k].data["cycle"] = [0,5,25,30,100,255]
  56. k = "OFFSET:{}".format(i+1)
  57. MAIN.meta.fx3_grid[k].val(100)
  58. MAIN.meta.fx3_grid[k].data["init_value"] = 100
  59. MAIN.meta.fx3_grid[k].data["inc"] = 25
  60. k = "WIDTH:{}".format(i+1)
  61. MAIN.meta.fx3_grid[k].val(25)
  62. MAIN.meta.fx3_grid[k].data["init_value"] = 25
  63. MAIN.meta.fx3_grid[k].data["max"] = 100
  64. MAIN.meta.fx3_grid[k].data["inc"] = 5
  65. k = "START:{}".format(i+1)
  66. MAIN.meta.fx3_grid[k].val(0)
  67. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  68. MAIN.meta.fx3_grid[k].data["max"] = 255
  69. MAIN.meta.fx3_grid[k].data["inc"] = 5
  70. k = "SHUFFLE:{}".format(i+1)
  71. MAIN.meta.fx3_grid[k].val(0)
  72. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  73. MAIN.meta.fx3_grid[k].data["max"] = 2
  74. k = "DIR:{}".format(i+1)
  75. MAIN.meta.fx3_grid[k].val(1)
  76. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  77. MAIN.meta.fx3_grid[k].data["max"] = 1
  78. k = "INVERT:{}".format(i+1)
  79. MAIN.meta.fx3_grid[k].val(1)
  80. MAIN.meta.fx3_grid[k].data["init_value"] = 1
  81. MAIN.meta.fx3_grid[k].data["max"] = 1
  82. k = "BASE:{}".format(i+1)
  83. MAIN.meta.fx3_grid[k].val(1)
  84. MAIN.meta.fx3_grid[k].data["init_value"] = 0
  85. MAIN.meta.fx3_grid[k].data["max"] = 1
  86. MAIN.meta.fx3_grid[k].data["min"] = -1
  87. basic()
  88. class tk_event_fx():
  89. """ global input event Handeler for short cut's ... etc
  90. """
  91. def __init__(self,fix,elem,attr=None,data=None,mode=None):
  92. self.fix = fix
  93. self.data = data # gui / master
  94. self.attr = attr
  95. self.elem = elem
  96. self.mode = mode
  97. self.ATTR_GRP = ""
  98. def command_fx3(self,event,mode=""):
  99. prm = []
  100. ct = ""
  101. print(" --", self.attr)
  102. fx3_grid = MAIN.meta.fx3_grid # OptionBuffer()
  103. if self.attr == "START":
  104. _fx3_jdata = []
  105. for k,v in fx3_grid.items(): # re-order fx3_grid to command
  106. vv = v.val()
  107. kk,ii = k.split(":")
  108. ii = int(ii)-1
  109. if len(_fx3_jdata) <= ii: #extand list
  110. _fx3_jdata.append({})
  111. _fx3_jdata[ii][kk] = vv
  112. out = []
  113. FIX=3001
  114. z=0
  115. for i in _fx3_jdata: #info
  116. #i["event"] = "FX3"
  117. if i["ATTR"].strip():
  118. out.append( {"event":"FX3","DMX":"123","VALUE":"","FIX":str(FIX+z),"FX3":i} )
  119. print(i)
  120. z+=1
  121. msg=json.dumps(out).encode("utf-8")
  122. cprint("SEND FX3:",msg,color="green")
  123. cmd_client.send(msg)
  124. if self.attr not in fx3_grid:
  125. fx_data = {}
  126. if self.attr == "CIRCLE":
  127. for k,v in fx3_grid.items():
  128. if k.startswith("ATTR"):
  129. print(self.attr,k,v)
  130. if self.attr == "PLAY":
  131. for k,v in fx3_grid.items():
  132. vv = v.val()
  133. k_name , k_nr = k.split(":")
  134. if k_nr not in fx_data:
  135. fx_data[k_nr] = {}
  136. fx_data[k_nr][k_name] = vv
  137. #print("**",k,vv,v)
  138. for k,v in fx_data.items():
  139. print("fx33",k,v)
  140. if "ATTR" in v and v["ATTR"] != " ":
  141. print("HH",k,v)
  142. print()
  143. return
  144. fx_func = MAIN.meta.OptionBuffer()
  145. if self.attr.startswith("ATTR:"):
  146. col = self.attr.split(":")[1]
  147. fx_func1 = fx3_grid["GRP:"+str(col)]
  148. GRP = fx_func1.val()
  149. if GRP != self.ATTR_GRP:
  150. self.ATTR_GRP = GRP
  151. fx_func1.val(GRP)
  152. fx3_grid[self.attr] = MAIN.meta.Optionbuffer_create_ATTR(GRP)
  153. fx_func = fx3_grid[self.attr]
  154. print(fx_func.data)
  155. fx_func.data["wrap"] = 1
  156. else:
  157. fx_func = fx3_grid[self.attr]
  158. fx_func.data["wrap"] = 1
  159. print("func",fx_func,fx_func.val())
  160. if event.num == 3:
  161. fx_func.reset()
  162. elif event.num == 4:
  163. fx_func.inc()
  164. elif event.num == 5:
  165. fx_func.dec()
  166. v=fx_func.val()
  167. #print(v)
  168. #print(self.elem)
  169. self.elem["text"] = v
  170. return
  171. def command(self,event,mode=""):
  172. cprint("tkevent.tk_event_fx.command")
  173. cprint(" ",self.mode)
  174. prm = None
  175. ct = None
  176. if self.mode == "FX-3":
  177. return self.command_fx3(event,mode=mode)
  178. def cb(self,event):
  179. cprint("tkevent.EVENT_fx.cb:",self.attr,self.mode,event,color='yellow')
  180. cprint(["type",event.type,"num",event.num])
  181. try:
  182. change = 0
  183. if self.mode.startswith("FX"):
  184. self.command(event)
  185. return 0
  186. except Exception as e:
  187. cprint("== cb EXCEPT",e,color="red")
  188. cprint("Error on line {}".format(sys.exc_info()[-1].tb_lineno),color="red")
  189. cprint(''.join(traceback.format_exception(None, e, e.__traceback__)),color="red")
  190. return 1
  191. def motion(code="circle"):
  192. #basic()
  193. k = "GRP:1" #.format(i+1)
  194. MAIN.meta.fx3_grid[k].val("POS")
  195. MAIN.meta.change_grp(name=k,val="POS")
  196. k = "GRP:2" #.format(i+1)
  197. MAIN.meta.fx3_grid[k].val("POS")
  198. MAIN.meta.change_grp(name=k,val="POS")
  199. k = "GRP:3" #.format(i+1)
  200. MAIN.meta.fx3_grid[k].val(" ")
  201. MAIN.meta.change_grp(name=k,val=" ")
  202. k = "ATTR:1" #.format(i+1)
  203. MAIN.meta.fx3_grid[k].val("PAN")
  204. k = "ATTR:2" #.format(i+1)
  205. MAIN.meta.fx3_grid[k].val("TILT")
  206. k = "ATTR:3" #.format(i+1)
  207. MAIN.meta.fx3_grid[k].val(" ")
  208. if code == "circle":
  209. k = "TYPE:1"
  210. MAIN.meta.fx3_grid[k].val("SIN")
  211. k = "TYPE:2"
  212. MAIN.meta.fx3_grid[k].val("COS")
  213. k = "SIZE:1"
  214. MAIN.meta.fx3_grid[k].val(100)
  215. k = "SIZE:2"
  216. MAIN.meta.fx3_grid[k].val(100)
  217. k = "BASE:1"
  218. MAIN.meta.fx3_grid[k].val(0)
  219. k = "BASE:2"
  220. MAIN.meta.fx3_grid[k].val(0)
  221. if code == "pan":
  222. k = "TYPE:1"
  223. MAIN.meta.fx3_grid[k].val("SIN")
  224. k = "TYPE:2"
  225. MAIN.meta.fx3_grid[k].val("COS")
  226. k = "TYPE:3"
  227. MAIN.meta.fx3_grid[k].val("-")
  228. k = "TYPE:4"
  229. MAIN.meta.fx3_grid[k].val("-")
  230. k = "SIZE:1"
  231. MAIN.meta.fx3_grid[k].val(100)
  232. k = "SIZE:2"
  233. MAIN.meta.fx3_grid[k].val(0)
  234. k = "BASE:1"
  235. MAIN.meta.fx3_grid[k].val(0)
  236. k = "BASE:2"
  237. MAIN.meta.fx3_grid[k].val(0)
  238. if code == "tilt":
  239. k = "TYPE:1"
  240. MAIN.meta.fx3_grid[k].val("SIN")
  241. k = "TYPE:2"
  242. MAIN.meta.fx3_grid[k].val("COS")
  243. k = "TYPE:3"
  244. MAIN.meta.fx3_grid[k].val("-")
  245. k = "TYPE:4"
  246. MAIN.meta.fx3_grid[k].val("-")
  247. k = "SIZE:1"
  248. MAIN.meta.fx3_grid[k].val(0)
  249. k = "SIZE:2"
  250. MAIN.meta.fx3_grid[k].val(100)
  251. k = "BASE:1"
  252. MAIN.meta.fx3_grid[k].val(0)
  253. k = "BASE:2"
  254. MAIN.meta.fx3_grid[k].val(0)
  255. def size(val=255):
  256. for i in range(4):
  257. k = "SIZE:{}".format(i+1)
  258. kt = "TYPE:{}".format(i+1)
  259. print(" ",k,val)
  260. if MAIN.meta.fx3_grid[kt].val() not in ["STATIC","-"]:
  261. MAIN.meta.fx3_grid[k].val(val)
  262. __refresh_fx3(_filter="SIZE")
  263. def speed(val=255):
  264. for i in range(4):
  265. k = "SPEED:{}".format(i+1)
  266. kt = "TYPE:{}".format(i+1)
  267. print(" ",k,val)
  268. if MAIN.meta.fx3_grid[kt].val() not in ["STATIC","-"]:
  269. MAIN.meta.fx3_grid[k].val(val)
  270. __refresh_fx3(_filter="SPEED")
  271. def rgb(code="red"):
  272. #basic()
  273. k = "GRP:1"
  274. MAIN.meta.change_grp(name=k,val="RGB")
  275. MAIN.meta.fx3_grid[k].val("RGB")
  276. k = "GRP:2"
  277. MAIN.meta.change_grp(name=k,val="RGB")
  278. MAIN.meta.fx3_grid[k].val("RGB")
  279. k = "GRP:3"
  280. MAIN.meta.change_grp(name=k,val="RGB")
  281. MAIN.meta.fx3_grid[k].val("RGB")
  282. k = "ATTR:1"
  283. MAIN.meta.fx3_grid[k].val("RED")
  284. k = "ATTR:2"
  285. MAIN.meta.fx3_grid[k].val("GREEN")
  286. k = "ATTR:3"
  287. MAIN.meta.fx3_grid[k].val("BLUE")
  288. k = "TYPE:1"
  289. MAIN.meta.fx3_grid[k].val("STATIC") #"255")
  290. k = "TYPE:2"
  291. MAIN.meta.fx3_grid[k].val("STATIC") #255")
  292. k = "TYPE:3"
  293. MAIN.meta.fx3_grid[k].val("STATIC") #255")
  294. k = "TYPE:4"
  295. MAIN.meta.fx3_grid[k].val("STATIC") #255")
  296. k = "BASE:1"
  297. MAIN.meta.fx3_grid[k].val(-1)
  298. k = "BASE:2"
  299. MAIN.meta.fx3_grid[k].val(-1)
  300. k = "BASE:3"
  301. MAIN.meta.fx3_grid[k].val(-1)
  302. if code == "red":
  303. k = "TYPE:1"
  304. MAIN.meta.fx3_grid[k].val("FD")
  305. if code == "green":
  306. k = "TYPE:2"
  307. MAIN.meta.fx3_grid[k].val("FD")
  308. if code == "blue":
  309. k = "TYPE:3"
  310. MAIN.meta.fx3_grid[k].val("FD")
  311. if code == "blue":
  312. k = "TYPE:3"
  313. MAIN.meta.fx3_grid[k].val("FD")
  314. if code == "blue":
  315. k = "TYPE:3"
  316. MAIN.meta.fx3_grid[k].val("FD")
  317. __refresh_fx3()
  318. def clear():
  319. basic()
  320. k = "GRP:1"
  321. MAIN.meta.fx3_grid[k].val(" ")
  322. k = "GRP:2"
  323. MAIN.meta.fx3_grid[k].val(" ")
  324. k = "GRP:3"
  325. MAIN.meta.fx3_grid[k].val(" ")
  326. k = "ATTR:1"
  327. MAIN.meta.fx3_grid[k].val(" ")
  328. k = "ATTR:2"
  329. MAIN.meta.fx3_grid[k].val(" ")
  330. k = "ATTR:3"
  331. MAIN.meta.fx3_grid[k].val(" ")
  332. k = "TYPE:1"
  333. MAIN.meta.fx3_grid[k].val(" ")
  334. k = "TYPE:2"
  335. MAIN.meta.fx3_grid[k].val(" ")
  336. k = "TYPE:3"
  337. MAIN.meta.fx3_grid[k].val(" ")
  338. motion("circle")
  339. def _refresh_fx3x(): #frame,c,r,gui,mode="FX"):
  340. time.sleep(5)
  341. while 1:
  342. print("Ö " *22)
  343. motion("circle")
  344. time.sleep(3)
  345. rgb()
  346. time.sleep(3)
  347. clear()
  348. time.sleep(3)
  349. print("Ö " *22)
  350. break
  351. def __refresh_fx3(_filter=""):
  352. ct = MAIN.meta.fx3 #moves
  353. prm = MAIN.meta.fx3_prm
  354. for comm in ct.labels:
  355. if comm not in ct.elem:
  356. continue
  357. b = ct.elem[comm]
  358. if comm in MAIN.meta.fx3_grid:
  359. if _filter and _filter != comm:
  360. continue
  361. #MAIN.meta.fx3_grid[comm].val("X")
  362. v2 = MAIN.meta.fx3_grid[comm].val()
  363. v1 = b["text"]
  364. #if "ATTR" in comm or "GRP" in comm:
  365. # print([comm,v1,v2,b])
  366. if "ATTR" in comm:
  367. pass #MAIN.meta.fx3_grid[comm].val("PAN")
  368. #print(MAIN.meta.fx3_grid[comm].data)
  369. v2 = MAIN.meta.fx3_grid[comm].val()
  370. v1 = b["text"]
  371. if "ATTR" in comm or "GRP" in comm:
  372. pass #print("A",[comm,v1,v2,b])
  373. if str(v2) != str(v1):
  374. print(" change")
  375. #print([comm,b,v1,v2])
  376. b["text"] = str(v2)
  377. def _refresh_fx3(): #frame,c,r,gui,mode="FX"):
  378. while 1:
  379. __refresh_fx3()
  380. time.sleep(2)
  381. def _draw_fx3(frame,c,r,gui,mode="FX"):
  382. ct = MAIN.meta.fx3 #moves
  383. prm = MAIN.meta.fx3_prm
  384. for comm in ct.labels:
  385. print(" draw3",comm)
  386. if comm == "\n\n":
  387. b = tk.Label(frame,bg="black", text="-",font=space_font)
  388. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  389. c=0
  390. r+=1
  391. continue
  392. if comm == "\n":
  393. c=0
  394. r+=1
  395. continue
  396. v=0
  397. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=1)
  398. ct.elem[comm] = b
  399. ct.val[comm] = 0
  400. def _XXX(xcb,xcomm,xb):
  401. def XXX(event=None,**data):
  402. print("BTN:",xb["text"],xcomm)
  403. print("xXx "*22)
  404. print("XXX",event,data)
  405. if xcomm == "CIRCLE":
  406. motion("circle")
  407. elif xcomm == "PAN":
  408. motion("pan")
  409. elif xcomm == "TILT":
  410. motion("tilt")
  411. elif xcomm == "RED":
  412. rgb("red")
  413. elif xcomm == "GREEN":
  414. rgb("green")
  415. elif xcomm == "BLUE":
  416. rgb("blue")
  417. elif xcomm == "MINI":
  418. size(10)
  419. elif xcomm == "SMALL":
  420. size(25)
  421. elif xcomm == "NORMAL":
  422. size(50)
  423. elif xcomm == "BIG":
  424. size(100)
  425. elif xcomm == "SLOW":
  426. speed(5)
  427. elif xcomm == "MID":
  428. speed(25)
  429. elif xcomm == "FAST":
  430. speed(100)
  431. elif xcomm == "TURBO":
  432. speed(200)
  433. xcb(event) #,data)
  434. return XXX
  435. _cb = tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb
  436. _comm = comm
  437. _b = b
  438. XXX = _XXX(_cb,_comm,_b)
  439. b.bind("<Button>",XXX)
  440. #b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  441. if comm == "xREC-FX":
  442. b["bg"] = "grey"
  443. elif comm == "xFX OFF":
  444. b["bg"] = "magenta"
  445. elif comm[:3] == "xFX:" or comm[:3] == "x2D:":
  446. b["text"] = comm
  447. b["bg"] = "#ffbf00"
  448. if comm == "START":
  449. b["bg"] = "orange"
  450. b.config(activebackground="#dd0")
  451. if comm in MAIN.meta.fx3_grid:
  452. fx_func = MAIN.meta.fx3_grid[comm]
  453. fx_func.data["wrap"] = 1
  454. #fx_func.inc()
  455. v=fx_func.val()
  456. print("3>",[comm,fx_func,v])
  457. b["text"] = v
  458. if comm.startswith("TYPE:"):
  459. b["bg"] = "orange"
  460. b.config(activebackground="#dd0")
  461. for a in ["SPEED:","SIZE:","START:","OFFSET:"]:
  462. if comm.startswith(a):
  463. b["bg"] = "lightgreen"
  464. b.config(activebackground="#0d0")
  465. if comm:
  466. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  467. c+=1
  468. if c >=6:
  469. c=0
  470. r+=1
  471. c=0
  472. r+=1
  473. return c,r
  474. def _draw_fx(frame,c,r,gui,mode="FX"):
  475. ct = None
  476. prm = None
  477. if mode=="FX-MAIN":
  478. ct = MAIN.meta.fx_main
  479. prm = MAIN.meta.fx_prm_main
  480. print("-- draw")
  481. for comm in ct.labels:
  482. print(" draw",comm)
  483. if comm == "\n\n":
  484. b = tk.Label(frame,bg="black", text="-",font=space_font)
  485. b.grid(row=r, column=c,pady=0,padx=0, sticky=tk.W+tk.E)
  486. c=0
  487. r+=1
  488. continue
  489. if comm == "\n":
  490. c=0
  491. r+=1
  492. continue
  493. v=0
  494. b = tk.Button(frame,bg="lightgrey", text=str(comm),width=6,height=2)
  495. ct.elem[comm] = b
  496. ct.val[comm] = 0
  497. #b.bind("<Button>",tkevent.tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  498. b.bind("<Button>",tk_event_fx(fix=0,elem=b,attr=comm,data=gui,mode=mode).cb)
  499. if comm == "REC-FX":
  500. b["bg"] = "grey"
  501. elif comm == "FX OFF":
  502. b["bg"] = "magenta"
  503. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  504. c+=1
  505. if c >=6:
  506. c=0
  507. r+=1
  508. c=0
  509. r+=1
  510. return c,r
  511. def draw_fx3(gui,xframe):
  512. frame_fx=xframe
  513. i=0
  514. c=0
  515. r=0
  516. frame = tk.Frame(frame_fx,bg="black")
  517. frame.pack(fill=tk.X, side=tk.TOP)
  518. # ------------------------------
  519. b = tk.Button(frame,bg="lightblue", text="FX3",width=6)
  520. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  521. c+=1
  522. _add_space(frame,r,c)
  523. c,r = _draw_fx(frame,c,r,gui,mode="FX-MAIN")
  524. r,c=_add_space(frame,r,c)
  525. c,r = _draw_fx3(frame,c,r,gui,mode="FX-3")
  526. _global_short_key = 1
  527. root = None
  528. cmd_client = chat.Client(port=30003)
  529. try:
  530. import memcache
  531. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  532. #data = mc.get("MODES")
  533. except:
  534. mc = None
  535. class MANAGER_X(): # DUMMY
  536. def __init__(self,*arg,**args):
  537. print(self,"__init__",arg,args)
  538. def send(self,nr,*arg,**args): #val=None,xfade=None,event=None,button="",ptfade=None):
  539. if _global_key_lock:
  540. return
  541. print(self,"MASTER",nr,arg,args)
  542. btn_nr = nr
  543. v = args["val"]
  544. msg=json.dumps([{"event":"EXEC","EXEC":btn_nr+1,"VAL":v,"NR-KEY":btn_nr}]).encode("utf-8")
  545. msg=json.dumps([{"event":"XXX","YYY":1,"VAL":12}]).encode("utf-8")
  546. cprint("SEND MASTER._GO:",msg,color="green")
  547. cmd_client.send(msg)
  548. import lib.manager as manager
  549. master = manager.MANAGER() #{}
  550. class Modes(): # DUMMY
  551. def __init__(self,*arg,**args):
  552. print("Modes.__init__",arg,args)
  553. self.modes = {}
  554. def val(self,*arg,**args):
  555. #print("Modes.val",arg,args)
  556. pass
  557. class Gui(): # DUMMY
  558. def __init__(self):
  559. self.elem_exec = []
  560. self.elem_meta = [None]*512
  561. self.old_btn_nr = -1
  562. self.METAS = []
  563. for i in range(512):
  564. self.METAS.append({})
  565. def _load_meta(self,nr):
  566. data = {}
  567. try:
  568. data = mc.get("EXEC-META-"+str(nr))
  569. data = json.loads(data)
  570. except Exception as e:
  571. print(" ER1R mc...",e)
  572. return data
  573. def _refresh_data(self,*arg,**args):
  574. start = time.time()
  575. METAS = []
  576. for i in range(512):
  577. nr = i #+1
  578. METAS.append( self._load_meta(nr) )
  579. self.METAS = METAS
  580. for nr,b in enumerate( self.elem_exec): #[nr]
  581. self._refresh_data_single(nr,b,METAS)
  582. print(__file__.split("/")[-1], "_refresh_data:",int((time.time()-start)*10)/10 )
  583. def _refresh_data_single(self,nr,b,METAS=None):
  584. start = time.time()
  585. no_meta = 0
  586. if not METAS:
  587. no_meta = 1
  588. try:
  589. data = mc.get("EXEC-META-"+str(nr)) #,json.dumps(index))
  590. data = json.loads(data)
  591. self.METAS[nr] = data #.append(data)
  592. #print(time.time())
  593. print(" _REFRESH_EXEC_SINGLE",nr,b,data["LABEL"])
  594. except Exception as e:
  595. print(" ER1R mc...",e)
  596. METAS = self.METAS
  597. #manager = MANAGER()
  598. #master = MANAGER()
  599. modes = Modes()
  600. gui = Gui()
  601. root = tk.Tk()
  602. root.maxsize(600,800)
  603. win_title="FX3"
  604. store = movewin.load_all_sdl(win_title)
  605. print(store)
  606. W=380
  607. H=550
  608. POS=[800,200]
  609. if store:
  610. W = store[-4]
  611. H = store[-3]
  612. POS=[store[-2],store[-1]]
  613. root.geometry('%dx%d+%d+%d' % (W, H, POS[0],POS[1]))
  614. root.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  615. defaultFont = tk.font.nametofont("TkDefaultFont")
  616. defaultFont.configure(family="FreeSans", size=10, weight="bold")
  617. # MAIN MENUE
  618. try:
  619. ico_path = "/opt/LibreLight/Xdesk/icon/"
  620. root.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  621. except Exception as e:
  622. print(" Exception GUIWindowContainer.__init__",e)
  623. xframe = libtk.ScrollFrame(root,width=820,height=400,bd=1,bg="black",head=None,foot=None)
  624. draw_fx3(gui,xframe)
  625. root.title(title)
  626. root.bind("<Button>",libtk2.tk_event)#
  627. root.bind("<Key>",libtk2.tk_event)#,self.callback)
  628. root.bind("<KeyRelease>",libtk2.tk_event)#,self.callback)
  629. #root.bind("<FocusIn>",libtk2.tk_event)#, on_focus(self.args["title"],"In").cb)
  630. #root.bind("<FocusOut>",libtk2.tk_event)#, on_focus(self.args["title"],"Out").cb)
  631. _global_key_lock = 0
  632. def focus_in(event=None):
  633. _global_short_key = 0 # protect key-press-repeat
  634. cmd = "xset -display :0.0 r off"
  635. print("FOCUS_IN1", cmd)
  636. os.system(cmd)
  637. time.sleep(0.3)
  638. print("FOCUS_IN2", cmd)
  639. os.system(cmd)
  640. _global_short_key = 1 # protect key-press-repeat
  641. time.sleep(0.3)
  642. _global_key_lock = 0
  643. def focus_out(event=None):
  644. _global_key_lock = 1
  645. _global_short_key = 0
  646. cmd="xset -display :0.0 r rate 240 20"
  647. print("FOCUS_OUT", cmd)
  648. #os.system(cmd) # DISABLED
  649. root.bind("<FocusIn>", focus_in)
  650. root.bind("<FocusOut>", focus_out)
  651. def _refr_loop():
  652. time.sleep(3)
  653. while 1:
  654. try:
  655. gui._refresh_data()
  656. time.sleep(3)
  657. except Exception as e:
  658. print(" ER5R refr_loop()...",e)
  659. time.sleep(3)
  660. time.sleep(0.1)
  661. def _refr_loop2():
  662. time.sleep(3)
  663. while 1:
  664. try:
  665. global root,title
  666. data = mc.get("MODES")
  667. title2 = title +" "+str(data)
  668. data = json.loads(data)
  669. #print("MODES",data)
  670. modes.modes = data
  671. if root:
  672. root.title(title2)
  673. if "S-KEY" in data:
  674. _global_short_key = 0
  675. if data["S-KEY"]:
  676. _global_short_key = 1
  677. for k in data:
  678. #print("title",k)
  679. for kk in ["RESTART","PRO","EASY","EXIT"]:
  680. if kk in str(k):
  681. print("RESTART !!! EXIT !!")
  682. time.sleep(0.1)
  683. root.quit()
  684. #sys.exit()
  685. fx3_line = {}
  686. for comm,v in MAIN.meta.fx3_grid.items():
  687. #print(":",comm,v.val())
  688. if comm.startswith("ATTR:"):
  689. fx3_line[comm] = 1
  690. except Exception as e:
  691. print(" ER7R mc...",e)
  692. time.sleep(3)
  693. time.sleep(0.1)
  694. thread.start_new_thread(_refr_loop,())
  695. thread.start_new_thread(_refr_loop2,())
  696. thread.start_new_thread(_refresh_fx3,())
  697. #thread.start_new_thread(_refresh_fx3x,())
  698. root.mainloop()