_LibreLightDesk.py 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. (c) 2012 micha@librelight.de
  5. SPDX-License-Identifier: GPL-2.0-only
  6. """
  7. import random
  8. import subprocess
  9. import string
  10. import copy
  11. import traceback
  12. import json
  13. import time
  14. import sys
  15. import os
  16. import _thread as thread
  17. for i in range(30):
  18. print() # boot space
  19. IS_GUI = 0
  20. if __name__ == "__main__":
  21. IS_GUI = 1
  22. import tool.movewin as movewin
  23. import lib.fixlib as fixlib
  24. import lib.libwin as libwin
  25. import lib.libtk as libtk
  26. import lib.libconfig as libconfig
  27. import lib.meta as meta
  28. rnd_id = str(random.randint(100,900))
  29. rnd_id += " beta"
  30. rnd_id2 = ""
  31. rnd_id3 = ""
  32. _ENCODER_WINDOW = None
  33. __run_main = 0
  34. if __name__ == "__main__":
  35. __run_main = 1
  36. else:
  37. import __main__
  38. if "unittest" not in dir(__main__):
  39. __run_main = 1
  40. import tool.git as git
  41. rnd_id += git.get_all()
  42. try:
  43. xtitle = __file__
  44. except:
  45. xtitle = "__file__"
  46. if "/" in xtitle:
  47. xtitle = xtitle.split("/")[-1]
  48. sys.stdout.write("\x1b]2;"+str(xtitle)+" "+str(rnd_id)+"\x07") # terminal title
  49. HOME = os.getenv('HOME')
  50. space_font = None
  51. INIT_OK = 0
  52. _global_short_key = 1
  53. from pathlib import Path
  54. home_dir = str(Path.home())
  55. path = home_dir+"/LibreLight/"
  56. #os.chdir(path)
  57. f = open(path+"init.txt","r")
  58. lines=f.readlines()
  59. f.close()
  60. out = []
  61. for line in lines:
  62. if line != "EASY\n":
  63. out.append(line)
  64. f = open(path+"init.txt","w")
  65. f.writelines(out)
  66. f.close()
  67. if "--easy" in sys.argv:
  68. f = open(path+"init.txt","a")
  69. f.write("EASY\n")
  70. f.close()
  71. if not os.path.isdir(path+"show/EASY"):
  72. cmd = "cp -vrf '/opt/LibreLight/Xdesk/home/LibreLight/show/EASY' '{}/show/EASY' ".format(path)
  73. print(cmd)
  74. #input()
  75. os.system(cmd)
  76. # check if EASY show exist !
  77. from lib.cprint import cprint
  78. cprint("________________________________")
  79. def cb(**args):
  80. cprint("MAIN.cb DUMMY",**args,color="red")
  81. import lib.zchat as chat
  82. import lib.motion as motion
  83. from collections import OrderedDict
  84. _FIX_FADE_ATTR = ["PAN","TILT","DIM","RED","GREEN","BLUE","WHITE","CYAN","YELLOW","MAGENTA","FOCUS","ZOOM","FROST"]
  85. CUES = OrderedDict()
  86. groups = OrderedDict()
  87. class Modes():
  88. def __init__(self):
  89. self.modes = {}
  90. self.__cfg = {}
  91. self.__cb = None
  92. def val(self,mode,value=None): #like jquery
  93. if value is not None:
  94. return self.set(mode,value)
  95. elif mode in self.modes:
  96. return self.modes[mode]
  97. def list(self,_filter="all"): # actvie
  98. _modes = []
  99. for m in self.modes:
  100. v = self.val(m)
  101. if _filter == "active" and v:
  102. _modes.append(m)
  103. if _filter == "all":
  104. _modes.append(m)
  105. return _modes
  106. def info(self):
  107. for m in self.modes:
  108. print("modes",m,self.val(m))
  109. def get(self,mode,value=None):
  110. return self.val(mode,value)
  111. def __check(self,mode):
  112. if mode not in self.modes:
  113. self.modes[mode] = 0
  114. self.__cfg[mode] = 0
  115. def cfg(self,mode,data={}):
  116. self.__check(mode)
  117. if type(data) is dict:
  118. for k in data:
  119. v = data[k]
  120. if v not in self.__cfg:
  121. self.__cfg[k] = v
  122. return 1
  123. elif type(data) is str:
  124. if data in self.__cfg:
  125. return self.__cfg[data]
  126. def clear(self,protect=[]):
  127. protected = ["BLIND"]
  128. protected.extend(protect)
  129. for m in self.modes:
  130. if m in protected:
  131. continue
  132. self.modes[m] = 0
  133. def set(self,mode,value):
  134. protected = ["BLIND","CLEAR","REC-FX"]
  135. self.__check(mode)
  136. if mode == "CLEAR":
  137. return 1
  138. elif mode == "ESC":
  139. for m in self.modes:
  140. cprint("ESC",m)
  141. if m == "COPY":
  142. EXEC.clear_copy()
  143. if m == "MOVE":
  144. EXEC.clear_move()
  145. if m != "BLIND":
  146. self.modes[m] = 0
  147. self.callback(m)
  148. return 1
  149. if value:
  150. for m in self.modes:
  151. if m not in protected and mode not in protected and m != mode:
  152. #cprint("-#-# clear mode",mode,m,value,color="red")
  153. if self.modes[m]:
  154. self.modes[m]= 0
  155. self.callback(m)
  156. if self.modes[mode] and value == 1:
  157. if modes == "MOVE":
  158. EXEC.clear_move()
  159. if modes == "COPY":
  160. EXEC.clear_copy()
  161. self.modes[mode] = 0 # value
  162. else:
  163. self.modes[mode] = value #1 #value
  164. else:
  165. self.modes[mode] = 0 #value
  166. if modes == "COPY":
  167. EXEC.clear_copy()
  168. if modes == "MOVE":
  169. EXEC.clear_move()
  170. self.callback(mode)
  171. return value
  172. def set_cb(self,cb):
  173. if cb:
  174. self.__cb = cb
  175. def callback(self,mode):
  176. if self.__cb is not None and mode in self.modes:
  177. value = self.modes[mode]
  178. self.__cb(mode=mode,value=value)
  179. modes = Modes()
  180. #modes.val("BLIND", 0)
  181. #modes.modes["BLIND"] = 0
  182. modes.modes["ESC"] = 0
  183. modes.modes["REC"] = 0
  184. modes.modes["EDIT"] = 0
  185. modes.modes["MOVE"] = 0
  186. modes.modes["FLASH"] = 0
  187. modes.modes["GO"] = 0
  188. modes.modes["DEL"] = 0
  189. modes.modes["REC-FX"] = 0
  190. modes.modes["SELECT"] = 0
  191. modes.modes["CFG-BTN"] = 0
  192. modes.modes["LABEL"] = 0
  193. POS = ["PAN","TILT","MOTION"]
  194. COLOR = ["RED","GREEN","BLUE","COLOR"]
  195. BEAM = ["GOBO","G-ROT","PRISMA","P-ROT","FOCUS","SPEED"]
  196. INT = ["DIM","SHUTTER","STROBE","FUNC"]
  197. #client = chat.tcp_sender(port=50001)
  198. def set_exec_fader_cfg(nr,val,label="",color=""):
  199. exec_wing = window_manager.get_obj(name="EXEC-WING")
  200. if not exec_wing:
  201. return
  202. try:
  203. if len(exec_wing.fader_elem) > nr:
  204. exec_wing.fader_elem[nr].attr["text"] = label
  205. cfg = get_exec_btn_cfg(nr+80)
  206. exec_wing.fader_elem[nr].attr["bg"] = cfg["bg"]
  207. exec_wing.fader_elem[nr].attr["fg"] = cfg["fg"]
  208. #exec_wing.fader_elem[nr].attr["fx"] = cfg["fx"]
  209. except Exception as e:
  210. cprint(" set_exec_fader_cfg err:",e,color="red")
  211. print(" ",nr,val,label)
  212. raise e
  213. def set_exec_fader(nr,val,label="",color="",info="info",change=0):
  214. exec_wing = window_manager.get_obj(name="EXEC-WING")
  215. if not exec_wing:
  216. return
  217. try:
  218. exec_wing.set_fader(nr,val,color=color,info=info,change=change)
  219. except Exception as e:
  220. cprint(" - set_exec_fader err:",e,color="red")
  221. print(" ",nr,val,label)
  222. raise e
  223. def set_exec_fader_all():
  224. print()
  225. cprint( "set_exec_fader_all()",color="green")
  226. for nr in range(10):
  227. _label = EXEC.label_exec[nr+80] # = label
  228. print(" set_exec_fader_all._label =",_label)
  229. set_exec_fader(nr,0,label=_label)
  230. set_exec_fader_cfg(nr,0,label=_label)
  231. def refresh_exec_fader_cfg():
  232. cprint( "set_exec_fader_all()",color="green")
  233. for nr in range(10):
  234. _label = EXEC.label_exec[nr+80] # = label
  235. #print("_label",_label)
  236. set_exec_fader_cfg(nr,0,label=_label)
  237. # remote input - start (memcached)
  238. def JCB(x,sock=None):
  239. for i in x:
  240. jv = x[i]
  241. try:
  242. jv = json.loads(jv)
  243. jv = jv[0]
  244. #print(jv)
  245. v = jv["iVAL"]
  246. #exec_wing.set_fader(0,v)
  247. set_exec_fader(0,v)
  248. set_exec_fader(1,200-v)
  249. set_exec_fader(2,int(v/2+10))
  250. except Exception as e:
  251. cprint("exception",e)
  252. print(sys.exc_info()[2])
  253. #print("remote in:",round(time.time(),0),"x",i,v)
  254. if __name__ == "__main__":
  255. r1_server = chat.Server(port=30002)
  256. def server1_loop():
  257. while 1:
  258. r1_server.poll(cb=JCB)
  259. time.sleep(1/90)
  260. thread.start_new_thread(server1_loop,()) # SERVER
  261. import lib.jsbc as JSBC
  262. if __name__ == "__main__":
  263. r_server = chat.Server(port=30003,cb=JSBC.JSCB)
  264. def server_loop():
  265. while 1:
  266. r_server.poll(cb=JSBC.JSCB)
  267. thread.start_new_thread(server_loop,()) # SERVER
  268. import lib.fifo as FIFO
  269. if __name__ == "__main__":
  270. f_server = FIFO.read_loop() #chat.Server(port=30003,cb=JSBC.JSCB)
  271. f_server.loop(sleep=1)
  272. def f_server_read_loop():
  273. time.sleep(10)
  274. print("FIFO read_loop() __ ")
  275. while 1:
  276. try:
  277. data = f_server.read()
  278. for jdata in data:
  279. # JSCB [{'event': 'EXEC', 'EXEC': 161, 'VAL': 0, 'NR-KEY': 1}]
  280. print("FIFO:",jdata)
  281. ok=1
  282. for i in ["event","VAL","EXEC"]:
  283. if i not in jdata:
  284. ok=0
  285. if ok:
  286. if jdata["event"] != "EXEC":
  287. continue
  288. if "EXEC" in jdata:
  289. exec_nr = jdata["EXEC"]
  290. if "VAL" in jdata:
  291. val = jdata["VAL"]
  292. master.exec_go(exec_nr-1,xfade=None,val=val)
  293. else:
  294. time.sleep(0.02)
  295. except KeyboardInterrupt as e:
  296. raise e
  297. except Exception as e:
  298. print("FIFO ERR1",e)
  299. thread.start_new_thread(f_server_read_loop,()) # SERVER
  300. # read memcachd
  301. memcache = None
  302. try:
  303. import memcache
  304. except Exception as e:
  305. cprint("Exception IMPORT ERROR",e)
  306. class MC():
  307. def __init__(self,server="127.0.0.1",port=11211):
  308. cprint("MC.init() ----------" ,server,port,color="red")
  309. try:
  310. #self.mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  311. self.mc = memcache.Client(['{}:{}'.format(server,port)], debug=0)
  312. #self.init()
  313. except Exception as e:
  314. cprint("-- Exception",e)
  315. index = self.mc.get("index")
  316. if index:
  317. for i in index:
  318. print(" key",i)
  319. self.last_fader_val = [-1]*512
  320. self.fader_map = []
  321. for i in range(30+1):
  322. self.fader_map.append({"UNIV":0,"DMX":0})
  323. try:
  324. fname = HOME + "/LibreLight/fader.json"
  325. f = open(fname)
  326. lines = f.readlines()
  327. cprint("FADER MAP",fname)
  328. for i,line in enumerate(lines):
  329. jdata = json.loads(line)
  330. print(" fader_map ->>",i,jdata)
  331. self.fader_map[i] = jdata
  332. except Exception as e:
  333. cprint("-- Except Fader_map",e)
  334. #exit()
  335. def ok(self):
  336. if self.mc:
  337. return 1
  338. return 0
  339. def test(self):
  340. if not self.ok():
  341. return
  342. self.mc.set("some_key", "Some value")
  343. self.value = mc.get("some_key")
  344. self.mc.set("another_key", 3)
  345. self.mc.delete("another_key")
  346. def loop(self):
  347. thread.start_new_thread(self._loop,())
  348. if not self.ok():
  349. return
  350. def _exec_fader_loop(self,x):
  351. for i, line in enumerate(self.fader_map):
  352. try:
  353. #print(i,line)
  354. dmx = int(line["DMX"])
  355. if dmx > 0:
  356. val = x[dmx-1]
  357. #print("mc val",val)
  358. #print("dmx_in change:",[i,val])
  359. change = 0
  360. if i < len(self.last_fader_val):
  361. if self.last_fader_val[i] != val:
  362. self.last_fader_val[i] = val
  363. print("dmx_in change:",[i,val])
  364. change = 1
  365. set_exec_fader(nr=i,val=val,color="#aaa",info="dmx_in",change=change)
  366. except Exception as e:
  367. cprint("MC exc:",e,color="red")
  368. traceback.print_exc()
  369. pass
  370. def _loop(self):
  371. time.sleep(6)
  372. cprint("++++++++++ start.memcachd read loop",self )
  373. ip = libconfig.load_remote_ip()
  374. print("IP:",ip)
  375. #input()
  376. while 1:
  377. #print("+")
  378. try:
  379. #ip="10.10.10.13:0"
  380. #ip="ltp-out:0"
  381. x=self.mc.get(ip)
  382. #print(ip,len(x))
  383. if x:
  384. #print(ip,x)
  385. #val = x[501-1]
  386. #val = x[141-1]
  387. self._exec_fader_loop(x)
  388. time.sleep(1/10)
  389. except Exception as e:
  390. cprint("exc", e)
  391. time.sleep(1)
  392. _mc=MC()
  393. _mc.loop()
  394. def message_buss_loop():
  395. while 1:
  396. try:
  397. mc = memcache.Client(['127.0.0.1:11211'], debug=0)
  398. break
  399. except Exception as e:
  400. cprint("--1 message_buss_loop Exc",[e])
  401. time.sleep(2)
  402. while 1:
  403. try:
  404. key="MODES"
  405. cfg = {}
  406. for k,v in modes.modes.items():
  407. if v:
  408. cfg[k] = v
  409. cfg["S-KEY"] = _global_short_key
  410. mc.set(key,json.dumps(cfg))
  411. except Exception as e:
  412. cprint("--2 message_buss_loop Exc:",[e])
  413. time.sleep(2)
  414. time.sleep(0.2)
  415. thread.start_new_thread(message_buss_loop,())
  416. console = chat.Client() #port=50001)
  417. def jclient_send(data):
  418. t_start = time.time()
  419. jtxt = data
  420. jdatas = []
  421. print("jclient_send.type(data)",type(data))
  422. for jdata in data:
  423. #print("xxffrr",jdata)
  424. if type(jdata) not in [dict,OrderedDict]:
  425. cprint("jclient_send, error jdata not dict like ",[jdata,type(jdata)],color="red")
  426. continue
  427. if "CMD" in jdata:
  428. try:
  429. jdatas.append(jdata)
  430. except Exception as e:
  431. cprint("jclient_send, Exception DMX ",color="red")
  432. cprint("",e,color="red")
  433. cprint("",jdata,color="red")
  434. cprint("-----",color="red")
  435. elif "DMX" in jdata:
  436. try:
  437. #print(jdata)
  438. jdata["DMX"] = int(jdata["DMX"])
  439. dmx = jdata["DMX"]
  440. if "ATTR" not in jdata:
  441. # for fx off
  442. jdatas.append(jdata)
  443. else:
  444. fix = "00000"
  445. attr = "00000"
  446. if "FIX" in jdata:
  447. fix = jdata["FIX"]
  448. if "ATTR" in jdata:
  449. attr = jdata["ATTR"]
  450. dmx_fine = fixlib.get_dmx(FIXTURES.fixtures,fix,attr+"-FINE")
  451. if jdata["DMX"] != dmx_fine and dmx > 0 and dmx_fine > 0:
  452. jdata["DMX-FINE"] = dmx_fine
  453. if "DMX-FINE" in jdata:
  454. if jdata["DMX-FINE"] <= 0:
  455. del jdata["DMX-FINE"]
  456. if jdata["ATTR"].startswith("_"):
  457. pass # ignore attr._ACTIVE
  458. else:#
  459. jdata["time"] = int(t_start*1000)/1000
  460. jdatas.append(jdata)
  461. #cprint("-- ",jdata,color="red")
  462. except Exception as e:
  463. cprint("jclient_send, Exception 4 DMX ",color="red")
  464. cprint("",jdata,color="red")
  465. cprint(e,color="red")
  466. #pt Exception as e:
  467. exc_type, exc_obj, exc_tb = sys.exc_info()
  468. _ = exc_obj
  469. fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
  470. print(exc_type, fname, exc_tb.tb_lineno)
  471. cprint("-----",color="red")
  472. jtxt = jdatas
  473. jtxt = json.dumps(jtxt)
  474. jtxt = jtxt.encode()
  475. console.send( jtxt ) #b"\00 ")
  476. cprint("{:0.04} sec.".format(time.time()-t_start),color="yellow")
  477. cprint("{:0.04} tick".format(time.time()),color="yellow")
  478. def _highlight(fix,_attr="DIM"):
  479. " patch test button "
  480. cprint("highlight",fix,"1")
  481. if fix not in FIXTURES.fixtures:
  482. return None
  483. d = FIXTURES.fixtures[fix]
  484. #for k,v in d.items():
  485. # cprint("-",k,v)
  486. DMX = d["DMX"] + d["UNIVERS"]*512
  487. if "ATTRIBUT" in d:
  488. ATTR= d["ATTRIBUT"]
  489. data = {"VALUE":200,"DMX":1}
  490. attr = ""
  491. if _attr in ATTR:
  492. attr = _attr
  493. else:
  494. return #stop
  495. cprint(attr,ATTR[attr])
  496. old_val = ATTR[attr]["VALUE"]
  497. data["DMX"] = DMX + ATTR[attr]["NR"]-1
  498. cprint(attr,ATTR[attr])
  499. cprint(data)
  500. for _ in range(3):
  501. cprint("highlight",fix,"0")
  502. data["VALUE"] = 100
  503. jclient_send([data])
  504. time.sleep(0.1)
  505. cprint("highlight",fix,"1")
  506. data["VALUE"] = 234
  507. jclient_send([data])
  508. time.sleep(0.3)
  509. cprint("highlight",fix,"0")
  510. data["VALUE"] = old_val
  511. jclient_send([data])
  512. def highlight2(fix,attr="DIM"):
  513. def x():
  514. highlight(fix,attr=attr)
  515. return x
  516. def highlight(fix):
  517. cprint("highlight",fix)
  518. thread.start_new_thread(_highlight,(fix,"DIM"))
  519. thread.start_new_thread(_highlight,(fix,"RED"))
  520. thread.start_new_thread(_highlight,(fix,"GREEN"))
  521. thread.start_new_thread(_highlight,(fix,"BLUE"))
  522. class FX_handler():
  523. def __init__():
  524. pass
  525. class dummy_event():
  526. def __init__(self):
  527. self.num =0
  528. self.type = 4 #press 5 release
  529. self.set_value=-1
  530. from lib import matrix
  531. import lib.fxlib as fxlib
  532. def process_matrix(xfixtures):
  533. meta.fx_x = meta.fx_prm["2D-X"]
  534. meta.fx_mod = meta.fx_x_modes[meta.fx_prm["2D:MODE"]]
  535. r = _process_matrix(xfixtures,meta.fx_x,meta.fx_mod)
  536. return r
  537. def _process_matrix(xfixtures,fx_x,fx_mod):
  538. fix_count = len(xfixtures)
  539. cprint("----",fx_x,fx_mod)
  540. if fx_x > 1 and fix_count > fx_x:
  541. try:
  542. w=fx_x
  543. h=int(fix_count/fx_x)
  544. if fx_mod == "spiral":
  545. _map = matrix.spiral(w,h)
  546. elif fx_mod == "up_down":
  547. _map = matrix.up_down(w,h)
  548. elif fx_mod == "left_right":
  549. _map = matrix.left_right(w,h)
  550. elif fx_mod == "left":
  551. _map = matrix.left(w,h)
  552. elif fx_mod == "right":
  553. _map = matrix.right(w,h)
  554. elif fx_mod == "up":
  555. _map = matrix.up(w,h)
  556. elif fx_mod == "down":
  557. _map = matrix.down(w,h)
  558. else:
  559. return xfixtures # do nothing
  560. matrix.mprint(xfixtures,w,h)
  561. out = ["0"]*(w*h)
  562. for i,f in enumerate(xfixtures):
  563. if i < w*h:
  564. j = int(_map[i])
  565. cprint(["i:",i,"f:",f,"j:",j])
  566. out[j] = f
  567. matrix.mprint(out,w,h)
  568. xfixtures = out
  569. except Exception as e:
  570. cprint("matrix exception",e)
  571. return xfixtures
  572. def check_backup_path():
  573. pass
  574. def save_show_to_backup():
  575. pass
  576. def check_save_path(basepath="",show_name=""):
  577. if basepath and show_name:
  578. cwd = os.getcwd()
  579. try:
  580. print("cwd:",cwd)
  581. cd = "/".join(basepath.split("/")[:-3])
  582. os.chdir(cd)
  583. mkdir = "/".join(basepath.split("/")[-3:])
  584. mkdir += str(show_name)
  585. CMD="mkdir -p '{}'".format(mkdir)
  586. print("CMD:",cd,";",CMD)
  587. os.system(CMD)
  588. finally:
  589. os.chdir(cwd)
  590. return True
  591. def show_path_list():
  592. print()
  593. print("libwin ", libwin.showlib.SHOW_DIR)
  594. print("movewin ", movewin.SHOW_PATH)
  595. print("EXEC ", EXEC.base.show_path)
  596. print("FIXTURES", FIXTURES.base.show_path)
  597. print()
  598. def show_path_reset():
  599. print("show_path_reset()")
  600. name = showlib.current_show_name()
  601. SHOW_DIR = showlib.BASE_PATH+"/show/"
  602. show_path_set(SHOW_DIR,name)
  603. def show_path_set(path,name):
  604. SHOW_PATH = path + str(name)
  605. SHOW_DIR = path
  606. libwin.showlib.SHOW_DIR = SHOW_DIR
  607. #movewin.showlib.SHOW_DIR = SHOW_DIR
  608. movewin.SHOW_PATH = SHOW_PATH
  609. EXEC.base.show_path = SHOW_PATH
  610. FIXTURES.base.show_path = SHOW_PATH
  611. def save_show_to_usb():
  612. cprint("*** "*20,color="yellow")
  613. CMD = "df | grep /media/$USER"
  614. CMD = "ls /media/$USER/"
  615. CMD = "mount | grep /media/$USER | cut -d ' ' -f 3"
  616. r = os.popen(CMD)
  617. usbs = r.readlines()
  618. print("USB's:",usbs)
  619. for usb in usbs:
  620. usb = usb.strip()
  621. print(usb)
  622. _show_name = showlib.current_show_name()
  623. _usbstick_path = ""+str(usb)+"/LibreLight/show/"
  624. SHOW_DIR = libwin.showlib.SHOW_DIR
  625. try:
  626. if check_save_path(basepath=_usbstick_path,show_name=_show_name):
  627. #show_path_list()
  628. show_path_set(path=_usbstick_path,name=_show_name)
  629. a=EXEC.backup_exec()
  630. b=FIXTURES.backup_patch()
  631. c=libwin.save_window_geo()
  632. d=movewin.store_all_sdl()
  633. except FileNotFoundError as e:
  634. cprint("EXC",e,color="red")
  635. finally:
  636. show_path_reset()
  637. print(SHOW_DIR,showlib.current_show_path())
  638. cprint(" ","*** "*20,color="yellow")
  639. if a and b and d: # and c
  640. #show_path_list()
  641. cprint("SAVE SHOW OK",[a,b,c,d],_usbstick_path,color="green")
  642. cprint("--- "*20,color="yellow")
  643. def save_show(fpath=None,new=0):
  644. # show_path_list()
  645. if fpath:
  646. a=EXEC.backup_exec(save_as=fpath,new=new)
  647. b=FIXTURES.backup_patch(save_as=fpath,new=new)
  648. meta.save_meta(save_as=fpath,new=new)
  649. c=libwin.save_window_geo(save_as=fpath)
  650. d=movewin.store_all_sdl()
  651. else:
  652. print()
  653. print()
  654. cprint("SAVE SHOW ..",color="yellow")
  655. a=EXEC.backup_exec()
  656. b=FIXTURES.backup_patch()
  657. meta.save_meta()
  658. c=libwin.save_window_geo()
  659. d=movewin.store_all_sdl()
  660. if 1:
  661. save_show_to_usb()
  662. if a and b and d: # and c
  663. #show_path_list()
  664. cprint("SAVE SHOW OK",[fpath,new],[a,b,c,d],color="green")
  665. print()
  666. print()
  667. print()
  668. return 1
  669. cprint("SAVE SHOW FAIL",[fpath,new],[a,b,c,d],color="red")
  670. print()
  671. print()
  672. print()
  673. def save_show_as(fname,new=0):
  674. print()
  675. print()
  676. fpath = showlib.generate_show_path(fname)
  677. info = "SAVE SHOW AS"
  678. if new:
  679. info = "SAVE (NEW) SHOW AS"
  680. cprint(info,fpath,fname,color="green")
  681. if showlib.create_new_show_path(fpath):
  682. return save_show(fpath,new)
  683. import lib.showlib as showlib
  684. class cb():
  685. def __init__(self,win):
  686. self.win = win
  687. def _callback(self,event):
  688. undermouse=self.win.find_closest(self.win.CURRENT)
  689. cprint( repr(undermouse))
  690. def callback(self,event):
  691. cprint(__file__,self,"callback",event)
  692. cnv = self.win
  693. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  694. tags = cnv.gettags(item)
  695. #cnv.itemconfigure(self.tag, text=tags[0])
  696. cprint(tags,item)
  697. color = cnv.itemcget(item, "fill")
  698. cnv.itemconfig("all", width=1)#filla="green")
  699. cnv.itemconfig(item, width=3)#filla="green")
  700. cprint(color)
  701. cprint( hex_to_rgb(color[1:]))
  702. import copy
  703. def get_exec_btn_cfg(nr):
  704. k = nr
  705. if 1:
  706. _bg = "grey"
  707. _ba = "grey"
  708. _fg = "lightgrey"
  709. _text = "N/V"
  710. txt = "None/nNone"
  711. txt1 = "None/nNone"
  712. if nr >= 0:
  713. if nr != k:
  714. return #continue
  715. label = ""
  716. if k in EXEC.label_exec:
  717. label = EXEC.label_exec[k]
  718. ifval = 0
  719. fx_only = 0
  720. fx_color = 0
  721. if k in EXEC.val_exec and len(EXEC.val_exec[k]) :
  722. sdata = EXEC.val_exec[k]
  723. have_fx = 0
  724. have_val = 0
  725. fix_count = 0
  726. BTN="go"
  727. if "CFG" in sdata:#["BUTTON"] = "GO"
  728. if "BUTTON" in sdata["CFG"]:
  729. BTN = sdata["CFG"]["BUTTON"]
  730. txt="{} {} {}\n{}".format(k+1,BTN,len(sdata)-1,label)
  731. _text = txt
  732. if len(sdata) > 1:
  733. ifval = 1
  734. val_color = 0
  735. for fix in sdata:
  736. if fix == "CFG":
  737. continue
  738. fix_count += 1
  739. for attr in sdata[fix]:
  740. if attr.startswith("_"):
  741. continue
  742. if "FX2" in sdata[fix][attr]:
  743. if sdata[fix][attr]["FX2"]:
  744. fx_color = 1
  745. have_fx += 1
  746. if "FX" in sdata[fix][attr]:
  747. if sdata[fix][attr]["FX"]:
  748. fx_color = 1
  749. have_fx += 1
  750. if "VALUE" in sdata[fix][attr]:
  751. if sdata[fix][attr]["VALUE"] is not None:
  752. val_color = 1
  753. have_val += 1
  754. #if val_color:
  755. # have_val += 1
  756. #if fx_color:
  757. # have_fx += 1
  758. if val_color:
  759. _bg = "gold"
  760. _ba = "#ffaa55"
  761. if fx_color:
  762. _fg = "blue"
  763. else:
  764. if fx_color:
  765. fx_only = 1
  766. else:
  767. _bg = "grey"
  768. _ba = "#aaa"
  769. sdata["CFG"]["HAVE-FX"] = have_fx
  770. sdata["CFG"]["HAVE-VAL"] = have_val
  771. sdata["CFG"]["FIX-COUNT"] = fix_count
  772. if "\n" in txt:
  773. txt1 = txt.split("\n")[0]
  774. _fg = "black"
  775. if ifval:
  776. if fx_only:
  777. _bg = "cyan"
  778. _ba = "#55d4ff"
  779. if "SEL" in txt1:
  780. _bg = "#77f"
  781. else:
  782. _bg = "grey"
  783. _fg = "darkgrey"
  784. if "SEL" in txt1:
  785. _fg = "blue"
  786. elif "ON" in txt1:
  787. _fg = "#040"
  788. elif "GO" in txt1:
  789. _fg = "#555"
  790. if "FL" in txt1:
  791. _fg = "#00e"
  792. out = {} # default
  793. out["fx"] = ""
  794. out["bg"] = "lightgrey"
  795. out["ba"] = "grey"
  796. out["fg"] = "grey"
  797. out["text"] = "?"
  798. out["fx"] = fx_color
  799. out["bg"] = _bg
  800. out["ba"] = _ba
  801. out["fg"] = _fg
  802. out["text"] = _text
  803. return out
  804. import lib.execlib as execlib
  805. class MASTER():
  806. def __init__(self):
  807. self.base = showlib.Base ()
  808. self.load()
  809. self._XX = 0
  810. self.all_attr =["DIM","PAN","TILT"] # encoder
  811. self.elem_attr = {}
  812. for i in range(8*8*8):
  813. if i not in EXEC.val_exec:
  814. EXEC.val_exec[i] = OrderedDict() # FIX
  815. EXEC.val_exec[i]["CFG"] = OrderedDict() # CONFIG
  816. EXEC.label_exec[i] = "-"
  817. modes.set_cb(self.xcb)
  818. def jclient_send(self,data):
  819. # namespace wraper
  820. if not modes.val("BLIND"):
  821. jclient_send(data)
  822. def button_refresh(self,name,color,color2=None,text="",fg=None):
  823. #cprint("button_refresh",name,color)
  824. if color2 is None:
  825. color2 = color
  826. if text:
  827. text = "\n"+str(text)
  828. elem=None
  829. for ct in [meta.commands,meta.fx_cfg,meta.fx_main,meta.fx_moves]:
  830. elem = ct.elem
  831. try:
  832. if name in elem:
  833. #print(" in xx.elem OK ",[name,color,name,text,color2])
  834. if name in ["BLIND","CLEAR"] and color == "lightgrey":
  835. color = "grey"
  836. color2 = "grey"
  837. elem[name]["bg"] = color
  838. elem[name]["text"] = name+ text
  839. elem[name].config(activebackground=color2)
  840. if fg:
  841. elem[name]["fg"] = fg
  842. except Exception as e:
  843. cprint(" master.button_refresh",self,e)
  844. cprint(" ",elem)
  845. def dialog_cfg_return(self,nr):
  846. # buffer nr
  847. def _cb(data):
  848. cfg = EXEC._btn_cfg(nr)
  849. if not data:
  850. cprint("err443",self,"_cb",data)
  851. return None
  852. cprint("btn_cfg._cb()",data)
  853. print( "dialog_cfg_retrun",data)
  854. if data:
  855. if "Button" in data and type(data["Button"]) is str:
  856. txt = data["Button"]
  857. EXEC.btn_cfg(nr,txt)
  858. if "Label" in data and type(data["Label"]) is str:
  859. txt = data["Label"]
  860. EXEC.label(nr,txt)
  861. if "Delay" in data and type(data["Delay"]) is str:
  862. txt = data["Delay"]
  863. try:
  864. txt = float(txt)
  865. if "DELAY" in cfg:
  866. cfg["DELAY"] = round(txt,2)
  867. except Exception as e:
  868. print("DELAY Exception",e)
  869. if "in-Fade" in data and type(data["in-Fade"]) is str:
  870. txt = data["in-Fade"]
  871. try:
  872. txt = float(txt)
  873. if "FADE" in cfg:
  874. cfg["FADE"] = round(txt,2)
  875. except Exception as e:
  876. print("in-Fade Exception",e)
  877. if "out-Fade" in data and type(data["out-Fade"]) is str:
  878. txt = data["out-Fade"]
  879. try:
  880. txt = float(txt)
  881. cfg["OUT-FADE"] = round(txt,2)
  882. except Exception as e:
  883. print("out-Fade Exception",e)
  884. modes.val("CFG-BTN",0)
  885. master._refresh_exec(nr=nr)
  886. return _cb
  887. def btn_cfg(self,nr,testing=0):
  888. cfg = EXEC._btn_cfg(nr)
  889. button = EXEC.btn_cfg(nr)
  890. label = EXEC.label(nr)
  891. dialog._cb = self.dialog_cfg_return(nr) # return cb()
  892. if 1: # testing:
  893. dialog.ask_exec_config(str(nr+1),button=button,label=label,cfg=cfg)
  894. else:
  895. dialog.askstring("CFG-BTN","GO=GO FL=FLASH\nSEL=SELECT EXE:"+str(nr+1),initialvalue=txt)
  896. def label(self,nr):
  897. txt = EXEC.label(nr)
  898. def _cb(data):
  899. if not data:
  900. cprint("err443",self,"_cb",data)
  901. return None
  902. txt = data["Value"]
  903. cprint("label._cb()",nr,txt)
  904. if txt:
  905. EXEC.label(nr,txt)
  906. modes.val("LABEL", 0)
  907. master._refresh_exec(nr=nr)
  908. dialog._cb= _cb #_x(nr)
  909. dialog.askstring("LABEL","EXE:"+str(nr+1),initialvalue=txt)
  910. def button_clear(self):
  911. modes.clear()
  912. txt=""
  913. for m in modes.modes:
  914. if not modes.modes[m]:
  915. self.button_refresh(m,color="lightgrey",text=txt)
  916. def xcb(self,mode,value=None):
  917. cprint(" Master.xcb mode:",str(mode).rjust(10," "),value,color="yellow",end="")
  918. if value:
  919. cprint("===== ON ======",color="green")
  920. txt = ""
  921. if mode == "REC-FX":
  922. modes.modes["REC"] = 1 # HACK !
  923. self.button_refresh("REC",color="red",text=txt)#,fg="blue")
  924. self.button_refresh(mode,color="red",text=txt)#,fg="blue")
  925. if value == 2:
  926. if mode in ["MOVE","COPY"]:
  927. txt="to"
  928. self.button_refresh(mode,color="orange",text=txt)#,fg="blue")
  929. else:
  930. if mode in ["MOVE","COPY"]:
  931. txt="from"
  932. self.button_refresh(mode,color="red",text=txt)#,fg="blue",text="from")
  933. else:
  934. cprint("===== OFF ======",color="red")
  935. if mode == "REC":
  936. modes.val("REC-FX",0)
  937. if mode == "REC-FX":
  938. modes.modes["REC"] = 0 # HACK !
  939. self.button_refresh("REC",color="lightgrey")#,fg="black")
  940. self.button_refresh(mode,color="lightgrey")#,fg="black")
  941. #modes.info()
  942. def load(self,fname=""):
  943. pass
  944. def exit(self):
  945. cprint("__del__",self)
  946. def refresh_exec(self):
  947. refresher_exec.reset() # = tkrefresh.Refresher()
  948. def _refresh_exec(self,nr=-1):
  949. cprint("EXEC.refresh_exec()")
  950. refresher_exec.reset() # = tkrefresh.Refresher()
  951. self._XX +=1
  952. self._nr_ok = 0
  953. for nr in EXEC.val_exec:
  954. get_exec_btn_cfg(nr)
  955. time.sleep(0.01)
  956. def refresh_fix(self):
  957. refresher_fix.reset() # = tkrefresh.Refresher()
  958. self._refresh_fix_menu()
  959. def _refresh_fix_menu(self):
  960. #cprint("_refresh_fix_menu")
  961. menu_buff = {"DIM":0,"DIM-SUB":0,"FIX":0,"FIX-SUB":0}
  962. for fix in FIXTURES.fixtures:
  963. sdata = FIXTURES.fixtures[fix]
  964. if "DIM" in sdata["ATTRIBUT"] and "_ACTIVE" in sdata["ATTRIBUT"] and len(sdata["ATTRIBUT"]) == 2:
  965. KEY = "DIM-SUB"
  966. else:
  967. KEY = "FIX-SUB"
  968. FIX = 0
  969. DIM = 0
  970. for attr in sdata["ATTRIBUT"]:
  971. _buff = {}
  972. row = sdata["ATTRIBUT"][attr]
  973. if attr.endswith("-FINE"):
  974. continue
  975. b_attr = attr
  976. if b_attr == "_ACTIVE":
  977. b_attr = "S"
  978. if row["ACTIVE"]:
  979. menu_buff[KEY] += 1
  980. if b_attr == "S":
  981. if KEY == "DIM-SUB":
  982. DIM =1
  983. else:
  984. FIX =1
  985. menu_buff["FIX"] += FIX
  986. menu_buff["DIM"] += DIM
  987. menu_buff["FIX-SUB"] -= menu_buff["FIX"]
  988. _color = ""
  989. if menu_buff["FIX-SUB"]:
  990. #print("orange", (menu_buff["FIX-SUB"] % menu_buff["FIX"]) == 0)
  991. if menu_buff["FIX-SUB"] % menu_buff["FIX"] == 0 and menu_buff["FIX"] > 1:
  992. #_color = "#aff"
  993. _color = "orange"
  994. _color = "yellow"
  995. else:
  996. #_color = "yellow"
  997. _color = "orange"
  998. elif menu_buff["FIX"]:
  999. _color = "orange"
  1000. gui_menu.config("FIX-LIST","bg",_color)
  1001. gui_menu.config("FIX-LIST","activebackground",_color)
  1002. gui_menu.update("FIX-LIST","{} : {}".format(menu_buff["FIX"],menu_buff["FIX-SUB"]))
  1003. menu_buff["DIM-SUB"] -= menu_buff["DIM"]
  1004. if menu_buff["DIM-SUB"]:
  1005. gui_menu.config("DIMMER","bg","yellow")
  1006. gui_menu.config("DIMMER","activebackground","yellow")
  1007. elif menu_buff["DIM"]:
  1008. gui_menu.config("DIMMER","bg","orange")
  1009. gui_menu.config("DIMMER","activebackground","orange")
  1010. else:
  1011. gui_menu.config("DIMMER","bg","")
  1012. gui_menu.config("DIMMER","activebackground","")
  1013. gui_menu.update("DIMMER","{} : {}".format(menu_buff["DIM"],menu_buff["DIM-SUB"]))
  1014. #cprint("fix:",_XXX,round(time.time()-s),color="red"); _XXX += 1
  1015. def _refresh_fix(self):
  1016. cprint("_refresh_fix")
  1017. s=time.time(); _XXX=0
  1018. menu_buff = {"DIM":0,"DIM-SUB":0,"FIX":0,"FIX-SUB":0}
  1019. elem_buffer = []
  1020. for fix in FIXTURES.fixtures:
  1021. sdata = FIXTURES.fixtures[fix]
  1022. elem_attr_fix = None
  1023. if fix in self.elem_attr:
  1024. elem_attr_fix = self.elem_attr[fix]
  1025. if "DIM" in sdata["ATTRIBUT"] and "_ACTIVE" in sdata["ATTRIBUT"] and len(sdata["ATTRIBUT"]) == 2:
  1026. KEY = "DIM-SUB"
  1027. else:
  1028. KEY = "FIX-SUB"
  1029. FIX = 0
  1030. DIM = 0
  1031. for attr in sdata["ATTRIBUT"]:
  1032. _buff = {}
  1033. row = sdata["ATTRIBUT"][attr]
  1034. if attr.endswith("-FINE"):
  1035. continue
  1036. b_attr = attr
  1037. if b_attr == "_ACTIVE":
  1038. b_attr = "S"
  1039. elem = None
  1040. if elem_attr_fix:
  1041. if b_attr not in elem_attr_fix:
  1042. continue
  1043. elem = elem_attr_fix[b_attr]
  1044. if not elem:
  1045. continue
  1046. if "elem" not in _buff:
  1047. _buff["elem"] = elem
  1048. if not attr.startswith("_"):
  1049. v2 = row["VALUE"]
  1050. #_text = "{} {}".format(str(attr).rjust(4,"0"),str(v2).rjust(4,"0")) # ~0.2 sec
  1051. _text = "{} {}".format(attr,v2)
  1052. _buff["text"] = _text
  1053. if row["ACTIVE"]:
  1054. _buff["bg"] = "yellow"
  1055. _buff["abg"] = "yellow"
  1056. menu_buff[KEY] += 1
  1057. if b_attr == "S":
  1058. if KEY == "DIM-SUB":
  1059. DIM =1
  1060. else:
  1061. FIX =1
  1062. else:
  1063. _buff["bg"] = "grey"
  1064. _buff["abg"] = "grey"
  1065. if "FX" not in row: # insert FX2 excetption
  1066. row["FX"] = "" #OrderedDict()
  1067. if "FX2" not in row: # insert FX2 excetption
  1068. row["FX2"] = {} #OrderedDict()
  1069. #print("row",fix,row)
  1070. if row["FX"]:
  1071. _buff["fg"] = "blue"
  1072. elif row["FX2"]:
  1073. _buff["fg"] = "red"
  1074. else:
  1075. _buff["fg"] = "black"
  1076. elem_buffer.append(_buff)
  1077. menu_buff["FIX"] += FIX
  1078. menu_buff["DIM"] += DIM
  1079. try:
  1080. for row in elem_buffer:
  1081. elem = row["elem"]
  1082. if not elem:
  1083. continue
  1084. for e in row:
  1085. if e == "elem":
  1086. continue
  1087. v = row[e]
  1088. if e == "abg":
  1089. elem.config(activebackground=v)
  1090. else:
  1091. elem[e] = v
  1092. w = window_manager.get_win("FIXTURES")
  1093. if w:
  1094. w.update_idle_task()
  1095. except Exception as e:
  1096. cprint("exc434",e,color="red")
  1097. cprint("fix:",_XXX,round(time.time()-s,2),color="red");_XXX += 1
  1098. cprint(gui_menu)
  1099. #menu_buff["FIX-SUB"] -= menu_buff["FIX"]
  1100. #if menu_buff["FIX-SUB"]:
  1101. # gui_menu.config("FIXTURES","bg","yellow")
  1102. # gui_menu.config("FIXTURES","activebackground","yellow")
  1103. #elif menu_buff["FIX"]:
  1104. # gui_menu.config("FIXTURES","bg","orange")
  1105. # gui_menu.config("FIXTURES","activebackground","orange")
  1106. #else:
  1107. # gui_menu.config("FIXTURES","bg","")
  1108. # gui_menu.config("FIXTURES","activebackground","")
  1109. #gui_menu.update("FIXTURES","{} : {}".format(menu_buff["FIX"],menu_buff["FIX-SUB"]))
  1110. #menu_buff["DIM-SUB"] -= menu_buff["DIM"]
  1111. #if menu_buff["DIM-SUB"]:
  1112. # gui_menu.config("DIMMER","bg","yellow")
  1113. # gui_menu.config("DIMMER","activebackground","yellow")
  1114. #elif menu_buff["DIM"]:
  1115. # gui_menu.config("DIMMER","bg","orange")
  1116. # gui_menu.config("DIMMER","activebackground","orange")
  1117. #else:
  1118. # gui_menu.config("DIMMER","bg","")
  1119. # gui_menu.config("DIMMER","activebackground","")
  1120. #gui_menu.update("DIMMER","{} : {}".format(menu_buff["DIM"],menu_buff["DIM-SUB"]))
  1121. cprint("fix:",_XXX,round(time.time()-s),color="red"); _XXX += 1
  1122. def exec_rec(self,nr):
  1123. cprint("Master.exec_rec","-- EXEC RECORD ------------------------------")
  1124. _filter=""
  1125. if modes.val("REC-FX"):
  1126. _filter="ONLY-FX"
  1127. data = fixlib.get_active(FIXTURES.fixtures,_filter=_filter)
  1128. EXEC.rec(nr,data)
  1129. sdata=data
  1130. EXEC.val_exec[nr] = sdata
  1131. modes.val("REC-FX",0)
  1132. modes.val("REC",0)
  1133. _ = get_exec_btn_cfg(nr)
  1134. #master._refresh_exec()
  1135. return 1
  1136. def exec_edit(self,nr):
  1137. cprint("Master.exec_edit","-- EXEC EDIT ------------------------------")
  1138. fixlib.clear(MAIN.FIXTURES.fixtures)
  1139. self.exec_select(nr)
  1140. event=None
  1141. self.exec_go(nr,xfade=0,event=event,val=255,button="go")
  1142. modes.val("EDIT", 0)
  1143. master.refresh_fix()
  1144. refresher_fix.reset() # = tkrefresh.Refresher()
  1145. def exec_select(self,nr):
  1146. cprint("Master.exec_select","-- EXEC SELECT ------------------------------")
  1147. sdata = EXEC.val_exec[nr]
  1148. for fix in sdata:
  1149. if fix == "CFG":
  1150. continue
  1151. for attr in sdata[fix]:
  1152. #v2 = sdata[fix][attr]["VALUE"]
  1153. #v2_fx = sdata[fix][attr]["FX"]
  1154. #print( self.data.elem_attr)
  1155. #if fix in self.elem_attr:
  1156. # if attr in self.elem_attr[fix]:
  1157. # elem = self.elem_attr[fix][attr]
  1158. if fix in FIXTURES.fixtures:
  1159. FIXTURES.fixtures[fix]["ATTRIBUT"][attr]["ACTIVE"] = 1
  1160. FIXTURES.fixtures[fix]["ATTRIBUT"]["_ACTIVE"]["ACTIVE"] = 1
  1161. else:
  1162. cprint("exec_select: fix not in FIXTURE.fixtures ! exec:",nr+1,"fix:",fix,color="red")
  1163. #elem["bg"] = "yellow"
  1164. def exec_go(self,nr,val=None,xfade=None,event=None,button="",ptfade=None):
  1165. t_start = time.time()
  1166. if xfade is None and meta.FADE._is():
  1167. xfade = meta.FADE.val()
  1168. if ptfade is None and meta.FADE_move._is():
  1169. ptfade = meta.FADE_move.val()
  1170. print()
  1171. cprint("Master.exec_go","-- EXEC GO FADE -----",nr,val)
  1172. rdata = EXEC.get_raw_map(nr)
  1173. if not rdata:
  1174. return 0
  1175. cfg = EXEC.get_cfg(nr)
  1176. if not cfg:
  1177. cprint(" NO CFG",cfg,nr)
  1178. return 0
  1179. xFLASH = 0
  1180. value=None
  1181. cprint(" exec_go",nr,cfg)
  1182. if modes.val("SELECT") or ( "BUTTON" in cfg and cfg["BUTTON"] == "SEL") and val and not button: #FLASH
  1183. self.exec_select(nr)
  1184. elif modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL") and not button: #FLASH
  1185. xFLASH = 1
  1186. xfade = 0
  1187. if type(val) is not type(None) and val == 0 :
  1188. value = "off"
  1189. xfade=0
  1190. if "OUT-FADE" in cfg:
  1191. xfade=cfg["OUT-FADE"]
  1192. if event:
  1193. if str(event.type) == "ButtonRelease" or event.type == '5' :
  1194. value = "off"
  1195. xfade=0
  1196. if "OUT-FADE" in cfg:
  1197. xfade=cfg["OUT-FADE"]
  1198. cprint(" exec_go() FLUSH",value,color="red")
  1199. #print(";",rdata)
  1200. print(" cfg:",cfg)
  1201. fcmd = FIXTURES.update_raw(rdata,update=0)
  1202. #print(":",fcmd) # raw dmx
  1203. self._exec_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH,nr=nr)
  1204. elif not val:
  1205. cprint("exec_go() STOP",value,color="red")
  1206. elif button == "on" or ( modes.val("ON") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["on","ON"])):
  1207. fcmd = FIXTURES.update_raw(rdata)
  1208. self._exec_go(rdata,cfg,fcmd,value,xfade=0,xFLASH=xFLASH)
  1209. elif button == "go" or ( modes.val("GO") or ( "BUTTON" in cfg and cfg["BUTTON"] in ["go","GO"])):
  1210. fcmd = FIXTURES.update_raw(rdata)
  1211. self._exec_go(rdata,cfg,fcmd,value,xfade=xfade,xFLASH=xFLASH,ptfade=ptfade,nr=nr)
  1212. return
  1213. if not (modes.val("FLASH") or ( "BUTTON" in cfg and cfg["BUTTON"] == "FL")): #FLASH
  1214. self.refresh_exec()
  1215. self.refresh_fix()
  1216. cprint("exec_go",time.time()-t_start)
  1217. def _exec_go(self,rdata,cfg,fcmd,value=None,xfade=None,event=None,xFLASH=0,ptfade=0,nr=None):
  1218. if xfade is None and meta.FADE._is():
  1219. xfade = meta.FADE.val()
  1220. xdelay=None
  1221. if xdelay is None and meta.DELAY._is():
  1222. xdelay = meta.DELAY.val()/100.
  1223. if ptfade is None and meta.FADE_move._is():
  1224. ptfade = meta.FADE_move.val()
  1225. cprint("EXEC._exec_go() len=",len(rdata),cfg)
  1226. if xfade is None:
  1227. xfade = cfg["FADE"]
  1228. if ptfade is None:
  1229. ptfade = cfg["FADE"]
  1230. vcmd = execlib.reshape_exec( rdata ,value,xfade=xfade,ptfade=ptfade,DELAY=xdelay)
  1231. execlib.calc_align_delay(meta,xdelay,xfade,vcmd)
  1232. cmd = []
  1233. for i,_ in enumerate(fcmd):
  1234. #print("go",i,v)
  1235. if xFLASH:
  1236. vcmd[i]["FLASH"] = 1
  1237. DMX = fcmd[i]["DMX"]
  1238. if "VALUE" in vcmd[i] and type(vcmd[i]["VALUE"]) is type(float):
  1239. vcmd[i]["VALUE"] = round(vcmd[i]["VALUE"],3)
  1240. if value is not None:
  1241. vcmd[i]["VALUE"] = value
  1242. if value == "off":
  1243. if "FX2" in vcmd:
  1244. vcmd[i]["FX2"]["TYPE"] = value
  1245. if "FIX" in fcmd:
  1246. vcmd[i]["FIX"] = fcmd["FIX"]
  1247. if DMX and vcmd[i]:
  1248. vcmd[i]["DMX"] = DMX
  1249. if type(nr) is not type(None):
  1250. vcmd[i]["EXEC"] = str(int(nr)+1)
  1251. cmd.append(vcmd[i])
  1252. if cmd and not modes.val("BLIND"):
  1253. jclient_send(cmd)
  1254. def render(self):
  1255. #Xroot.bind("<Key>",tk_event(fix=0,elem=None,attr="ROOT",data=self,mode="ROOT").cb)
  1256. #self.draw_input()
  1257. pass
  1258. ##draw_sub_dim
  1259. import tkgui.dialog as dialoglib
  1260. dialog = dialoglib.Dialog()
  1261. from tkgui.draw import *
  1262. from tkgui.GUI import *
  1263. import tkgui.MENUE as MENUE
  1264. class LOAD_SHOW_AND_RESTART():
  1265. def __init__(self,fname=""):
  1266. self.fname=fname
  1267. self.base = showlib.Base()
  1268. def cb(self,event=None,force=0):
  1269. print()
  1270. print()
  1271. print()
  1272. cprint("LOAD_SHOW_AND_RESTART.cb force={} name={}".format(force,self.fname),color="red" )
  1273. if not self.fname and not force:
  1274. return 0
  1275. if self.base.show_name == self.fname and not force:
  1276. cprint("filename is the same",self.fname)
  1277. return 0
  1278. if not force:
  1279. self.base._set(self.fname)
  1280. cprint("LOAD SHOW:",event,self.fname)
  1281. BASE_PATH = "/opt/LibreLight/Xdesk/"
  1282. cmd="_LibreLightDesk.py"
  1283. arg = ""
  1284. print("fork",[BASE_PATH,cmd,arg])
  1285. if "--easy" in sys.argv:
  1286. arg = "--easy"
  1287. movewin.process_kill(BASE_PATH+"tksdl/")
  1288. os.execl("/usr/bin/python3", BASE_PATH, cmd,arg)
  1289. sys.exit()
  1290. lf_nr = 0
  1291. from tkinter import PhotoImage
  1292. _shift_key = 0
  1293. class WindowManager():
  1294. def __init__(self):
  1295. self.windows = {}
  1296. self.obj = {}
  1297. self.nr= 0
  1298. self.first=""
  1299. self.window_init_buffer = {}
  1300. def update(self,w,name="",obj=None):
  1301. name = str(name)
  1302. for k in self.windows:
  1303. if k == name:
  1304. self.windows[str(name)] = w
  1305. self.obj[str(name)] = obj
  1306. def new(self,w,name="",obj=None,wcb=None):
  1307. name = str(name)
  1308. if wcb and name:
  1309. self.window_init_buffer[name] = wcb
  1310. if not self.first:
  1311. if name:
  1312. self.first = name
  1313. else:
  1314. self.first = str(self.nr)
  1315. if w:
  1316. w.tk.state(newstate='normal')
  1317. w.tk.attributes('-topmost',True)
  1318. if name:
  1319. self.windows[str(name)] = w
  1320. self.obj[str(name)] = obj
  1321. else:
  1322. self.windows[str(self.nr)] = w
  1323. self.obj[str(self.nr)] = obj
  1324. self.nr+=1
  1325. def mainloop(self):
  1326. self.windows[self.first].mainloop()
  1327. def get_win(self,name):
  1328. #cprint(".get_win(name) =",name)
  1329. name = str(name)
  1330. if name in self.windows:
  1331. out = self.windows[name]
  1332. #cprint(out)
  1333. return out
  1334. def get(self,name):
  1335. return get_win(name)
  1336. def get_obj(self,name):
  1337. name = str(name)
  1338. if name in self.windows:
  1339. out = self.obj[name]
  1340. return out
  1341. def create(self,name):
  1342. #cprint( "create WindowContainer",name)
  1343. if name in self.window_init_buffer:
  1344. c = self.window_init_buffer[name]
  1345. w,obj,cb_ok = c.create()
  1346. window_manager.update(w,name,obj)
  1347. if cb_ok:
  1348. cb_ok()
  1349. libwin.get_cur_window_geo(_filter=name,win=w)
  1350. if name in ["ENCODER"]:
  1351. global _ENCODER_WINDOW
  1352. _ENCODER_WINDOW = w
  1353. if name in ["DIMMER","FIXTURES"]:
  1354. refresher_fix.reset() # = tkrefresh.Refresher()
  1355. def _check_window_is_open(self,name):
  1356. try:
  1357. win = self.windows[name]
  1358. if "tk" not in dir(win):
  1359. return 0
  1360. return win.tk.winfo_exists()
  1361. except Exception as e:
  1362. cprint("_check_window_is_open err",e,color="red")
  1363. def top(self,name):
  1364. name = str(name)
  1365. if name not in self.windows:
  1366. cprint(name," not in self.windows",self.windows.keys())
  1367. return
  1368. if not self._check_window_is_open(name):
  1369. cprint(" ",name," window is closed ! ")
  1370. self.create(name)
  1371. w = self.windows[name]
  1372. if not str(type(w)).startswith("<class 'function'>"):
  1373. w.tk.deiconify()
  1374. w.tk.attributes('-topmost',True)
  1375. w.tk.attributes('-topmost',False)
  1376. w.tk.update_idletasks()
  1377. else:
  1378. print(" 2.2-",w)
  1379. w()
  1380. class Console():
  1381. def __init__(self):
  1382. pass
  1383. def flash_off(self,fix):
  1384. pass
  1385. def fx_off(self,fix):
  1386. cprint("Console.fx_off()",fix)
  1387. if not fix or fix == "all":
  1388. j = []
  1389. if 0:
  1390. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2, 'DMX': '0'}
  1391. j.append(jdata)
  1392. jdata = {'VALUE': None, 'args': [], 'FX': 'alloff::::', 'FADE': 2,'FLASH':1, 'DMX': '0'}
  1393. j.append(jdata)
  1394. else:
  1395. jdata = {'VALUE': None, 'args': [], 'FX2': {"TYPE":"alloff"}, 'FADE': 2,'FLASH':1, 'DMX': '1'}
  1396. j.append(jdata)
  1397. if not modes.val("BLIND"):
  1398. jclient_send(j)
  1399. return 0
  1400. window_manager = WindowManager()
  1401. CONSOLE = Console()
  1402. EXEC = execlib.EXEC()
  1403. def refresh_exec_mc():
  1404. time.sleep(10)
  1405. while 1:
  1406. try:
  1407. pass#
  1408. execlib.exec_set_mc(EXEC.label_exec,EXEC.val_exec)
  1409. except Exception as e:
  1410. print("refresh_exec_mc ERR",e)
  1411. time.sleep(5) # extra time
  1412. time.sleep(3) # refresh time
  1413. thread.start_new_thread(refresh_exec_mc,())
  1414. FIXTURES = fixlib.Fixtures()
  1415. from lib import mc_api
  1416. thread.start_new_thread(mc_api.mc_set_patch_loop,(FIXTURES,))
  1417. def LOAD_SHOW():
  1418. EXEC.load_exec()
  1419. FIXTURES.load_patch()
  1420. meta.load_meta()
  1421. LOAD_SHOW()
  1422. master = MASTER()
  1423. def menu_loop():
  1424. time.sleep(5)
  1425. while 1:
  1426. time.sleep(1)
  1427. master._refresh_fix_menu()
  1428. thread.start_new_thread(menu_loop,())
  1429. print("main",__name__)
  1430. import lib.tkrefresh as tkrefresh
  1431. refresher_fix = tkrefresh.Refresher()
  1432. refresher_fix.time_delta = 0.50
  1433. refresher_fix.name = "fix"
  1434. refresher_fix.reset()
  1435. refresher_fix.cb = master._refresh_fix
  1436. refresher_exec = tkrefresh.Refresher()
  1437. refresher_exec.time_delta = 10 #0
  1438. refresher_exec.name = "exec"
  1439. refresher_exec.reset()
  1440. refresher_exec.cb = master._refresh_exec
  1441. refresher_exec = tkrefresh.Refresher()
  1442. refresher_exec.time_delta = 10 #0
  1443. refresher_exec.name = "exec-fader"
  1444. refresher_exec.reset()
  1445. refresher_exec.cb = refresh_exec_fader_cfg
  1446. def loops(**args):
  1447. time.sleep(5) # wait until draw all window's
  1448. cprint("-> run loops")
  1449. thread.start_new_thread(refresher_fix.loop,())
  1450. thread.start_new_thread(refresher_exec.loop,())
  1451. thread.start_new_thread(loops,())
  1452. class window_create_sdl_buffer():
  1453. def __init__(self,args,cls,data,cb_ok=None,scroll=0,gui=None):
  1454. self.args = args.copy()
  1455. self.cls = cls
  1456. self.cb_ok = cb_ok
  1457. self.data = data
  1458. self.scroll = scroll
  1459. self.gui = gui
  1460. def create(self,hidde=0):
  1461. cprint()
  1462. return [self.cls,self.cls,None] #w,obj,cb_ok
  1463. def open_sdl_window():
  1464. cprint("open_sdl_window ... delay 1sec",color="yellow")
  1465. time.sleep(1)
  1466. #if "--easy" not in sys.argv:
  1467. movewin.startup_all_sdl()
  1468. thread.start_new_thread(open_sdl_window,())
  1469. def mc_fix_loop():
  1470. global master
  1471. time.sleep(5)
  1472. c=0
  1473. while 1:
  1474. try:
  1475. if c >= 10:
  1476. c=0
  1477. for nr in EXEC.val_exec:
  1478. get_exec_btn_cfg(nr)
  1479. except Exception as e:
  1480. print("MC_FIX EXCEPTION",e)
  1481. #raise e
  1482. c+=1
  1483. try:
  1484. data = FIXTURES.fixtures
  1485. mc_api.mc_set_fix(index="fix",data=data)
  1486. except Exception as e:
  1487. print("MC_FIX EXCEPTION",e)
  1488. time.sleep(1/10)
  1489. thread.start_new_thread(mc_fix_loop,())
  1490. if __run_main:
  1491. cprint("main")
  1492. TOP = libtk._POS_TOP + 15
  1493. L0 = libtk._POS_LEFT
  1494. L1 = libtk._POS_LEFT + 95
  1495. L2 = libtk._POS_LEFT + 920
  1496. W1 = 810
  1497. H1 = 550
  1498. HTB = 23 # hight of the titlebar from window manager
  1499. geo_list = libwin.read_window_geo()
  1500. #geo = libwin.filter_window_geo(geo_list,name)
  1501. #args = {"title":name,"master":0,"width":600,"height":113,"left":L1+5,"top":TOP+5+HTB*2+H1}
  1502. #geo = libwin.filter_window_geo(geo_list,name)
  1503. #if geo:
  1504. # args.update(geo)
  1505. data = []
  1506. #data.append({"text":"COMMAND"})
  1507. #data.append({"text":"CONFIG"})
  1508. data.append({"text":"PATCH"})
  1509. data.append({"text":"DIMMER"})
  1510. data.append({"text":"FIXTURES"})
  1511. data.append({"text":"FIX-LIST","tip":"YELLOW = 'EVEN' SELECTION OK\nORANGE = 'ODD' SELECTION, SHURE ?"})
  1512. #data.append({"text":"EXEC-BTN","name":"EXEC-BTN"})
  1513. data.append({"text":"EXEC-BTN","name":"EXEC-BTN"})
  1514. data.append({"text":"EXEC-WING"})
  1515. data.append({"text":"---"})
  1516. data.append({"text":"SETUP"})
  1517. data.append({"text":"COMMAND"})
  1518. data.append({"text":"LIVE"})
  1519. data.append({"text":"FX"})
  1520. data.append({"text":"FX3","name":"FX3-beta"})
  1521. data.append({"text":"ENCODER"})
  1522. data.append({"text":"COLORPICKER","name":"COLOR"})
  1523. data.append({"text":"---"})
  1524. data.append({"text":"FIXTURE-EDITOR","name":"FIX-EDIT"})
  1525. data.append({"text":"SDL-MIDI"})
  1526. data.append({"text":"CLOCK"})
  1527. data.append({"text":"RAY-DMX"})
  1528. data.append({"text":"SDL-VPU"})
  1529. data.append({"text":"---"})
  1530. data.append({"text":"Nodescanner","name":"NodeScan"})
  1531. data.append({"text":"TK-Ping"})
  1532. data.append({"text":"SDL-OSZI"})
  1533. data.append({"text":"---"})
  1534. data.append({"text":"- DEMO -"})
  1535. data.append({"text":"---"})
  1536. data.append({"text":"SDL-STAGE"})
  1537. data.append({"text":"SDL-Shader"})
  1538. data.append({"text":"TABLE"})
  1539. data.append({"text":"---"})
  1540. data.append({"text":"- NEW -"})
  1541. data.append({"text":"R-FIX-LIST"})
  1542. data.append({"text":"XWING"})
  1543. data.append({"text":"CONFIG"})
  1544. data.append({"text":"---"})
  1545. data.append({"text":"- OLD -"})
  1546. data.append({"text":"SDL-DMX"})
  1547. #data.append({"text":"TK-EXEC"})
  1548. #data.append({"text":"EXEC-BTN","name":"EXEC-BTN"})
  1549. #data.append({"text":"MASTER-WING"})
  1550. name="MAIN"
  1551. args = {"title":"MAIN","master":1,"width":80,"height":H1,"left":L0,"top":TOP,"resize":1}
  1552. geo = libwin.filter_window_geo(geo_list,name)
  1553. if geo:
  1554. args.update(geo)
  1555. cls = MENUE.GUI_menu
  1556. cb_ok = None
  1557. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1558. window_manager.new(None,name,wcb=c)
  1559. window_manager.top(name)
  1560. gui_menu_gui = window_manager.get_win(name)
  1561. gui_menu = window_manager.get_obj(name)
  1562. master._refresh_fix()
  1563. # =======================================================================
  1564. if 0:
  1565. name="EXEC-BTN"
  1566. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1567. geo = libwin.filter_window_geo(geo_list,name)
  1568. if geo:
  1569. args.update(geo)
  1570. data = EXEC
  1571. cls = draw_exec #GUI_ExecWingLayout
  1572. cb_ok = None #set_exec_fader_all
  1573. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1574. window_manager.new(None,name,wcb=c)
  1575. if libwin.split_window_show(geo_list,_filter=name):
  1576. window_manager.top(name)
  1577. #print(dir(cls))
  1578. #print(cls)
  1579. #sys.exit()
  1580. # =======================================================================
  1581. name="SDL-MIDI"
  1582. def sdl_starter():
  1583. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/midi.py > /dev/null 2>&1 &"
  1584. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/midi.py " #&"
  1585. print(cmd)
  1586. #os.popen(cmd)
  1587. def xyz123(cmd):
  1588. os.system(cmd)
  1589. thread.start_new_thread(xyz123,(cmd,))
  1590. return [None,None,None]
  1591. #class window_create_sdl_buffer():
  1592. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1593. geo = libwin.filter_window_geo(geo_list,name)
  1594. if geo:
  1595. args.update(geo)
  1596. data = []
  1597. cls = sdl_starter #: None #GUI_CONF
  1598. cb_ok = None
  1599. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1600. window_manager.new(None,name,wcb=c)
  1601. if libwin.split_window_show(geo_list,_filter=name):
  1602. window_manager.top(name)
  1603. # =======================================================================
  1604. name="SDL-VPU"
  1605. def sdl_starter():
  1606. cmd="python3 /opt/LibreLight/Xdesk/vpu/watchdog_vpu.py -single"
  1607. print(cmd)
  1608. def xyz123(cmd):
  1609. os.system(cmd)
  1610. thread.start_new_thread(xyz123,(cmd,))
  1611. return [None,None,None]
  1612. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1613. geo = libwin.filter_window_geo(geo_list,name)
  1614. if geo:
  1615. args.update(geo)
  1616. data = []
  1617. cls = sdl_starter #: None #GUI_CONF
  1618. cb_ok = None
  1619. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1620. window_manager.new(None,name,wcb=c)
  1621. if libwin.split_window_show(geo_list,_filter=name):
  1622. window_manager.top(name)
  1623. # =======================================================================
  1624. name="SDL-OSZI"
  1625. def sdl_starter():
  1626. cmd="python3 /opt/LibreLight/ASP/monitor/oszi_grid.py"
  1627. print(cmd)
  1628. def xyz123(cmd):
  1629. os.system(cmd)
  1630. thread.start_new_thread(xyz123,(cmd,))
  1631. return [None,None,None]
  1632. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1633. geo = libwin.filter_window_geo(geo_list,name)
  1634. if geo:
  1635. args.update(geo)
  1636. data = []
  1637. cls = sdl_starter #: None #GUI_CONF
  1638. cb_ok = None
  1639. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1640. window_manager.new(None,name,wcb=c)
  1641. if libwin.split_window_show(geo_list,_filter=name):
  1642. window_manager.top(name)
  1643. # =======================================================================
  1644. name="SDL-DMX"
  1645. def sdl_starter():
  1646. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/dmx.py " #&"
  1647. print(cmd)
  1648. def xyz123(cmd):
  1649. os.system(cmd)
  1650. thread.start_new_thread(xyz123,(cmd,))
  1651. return [None,None,None]
  1652. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1653. geo = libwin.filter_window_geo(geo_list,name)
  1654. if geo:
  1655. args.update(geo)
  1656. data = []
  1657. cls = sdl_starter #: None #GUI_CONF
  1658. cb_ok = None
  1659. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1660. window_manager.new(None,name,wcb=c)
  1661. if libwin.split_window_show(geo_list,_filter=name):
  1662. window_manager.top(name)
  1663. # =======================================================================
  1664. name="R-FIX-LIST"
  1665. def sdl_starter():
  1666. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkray/fix.py " #&"
  1667. print(cmd)
  1668. def xyz123(cmd):
  1669. os.system(cmd)
  1670. thread.start_new_thread(xyz123,(cmd,))
  1671. return [None,None,None]
  1672. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1673. geo = libwin.filter_window_geo(geo_list,name)
  1674. if geo:
  1675. args.update(geo)
  1676. data = []
  1677. cls = sdl_starter #: None #GUI_CONF
  1678. cb_ok = None
  1679. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1680. window_manager.new(None,name,wcb=c)
  1681. if libwin.split_window_show(geo_list,_filter=name):
  1682. window_manager.top(name)
  1683. # =======================================================================
  1684. name="RAY-DMX"
  1685. def sdl_starter():
  1686. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkray/dmx.py " #&"
  1687. print(cmd)
  1688. def xyz123(cmd):
  1689. os.system(cmd)
  1690. thread.start_new_thread(xyz123,(cmd,))
  1691. return [None,None,None]
  1692. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1693. geo = libwin.filter_window_geo(geo_list,name)
  1694. if geo:
  1695. args.update(geo)
  1696. data = []
  1697. cls = sdl_starter #: None #GUI_CONF
  1698. cb_ok = None
  1699. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1700. window_manager.new(None,name,wcb=c)
  1701. if libwin.split_window_show(geo_list,_filter=name):
  1702. window_manager.top(name)
  1703. # =======================================================================
  1704. name="EXEC-BTN" #"TK-EXEC"
  1705. def sdl_starter():
  1706. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkgui/EXEC-BTN.py " #&"
  1707. print(cmd)
  1708. def xyz123(cmd):
  1709. os.system(cmd)
  1710. thread.start_new_thread(xyz123,(cmd,))
  1711. return [None,None,None]
  1712. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1713. geo = libwin.filter_window_geo(geo_list,name)
  1714. if geo:
  1715. args.update(geo)
  1716. data = []
  1717. cls = sdl_starter #: None #GUI_CONF
  1718. cb_ok = None
  1719. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1720. window_manager.new(None,name,wcb=c)
  1721. if libwin.split_window_show(geo_list,_filter=name):
  1722. window_manager.top(name)
  1723. # =======================================================================
  1724. # =======================================================================
  1725. name="TK-Ping" #"TK-EXEC"
  1726. def sdl_starter():
  1727. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tool/TK-Ping.py > /dev/null 2>&1 " #&"
  1728. print(cmd)
  1729. def xyz123(cmd):
  1730. os.system(cmd)
  1731. thread.start_new_thread(xyz123,(cmd,))
  1732. return [None,None,None]
  1733. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1734. geo = libwin.filter_window_geo(geo_list,name)
  1735. if geo:
  1736. args.update(geo)
  1737. data = []
  1738. cls = sdl_starter #: None #GUI_CONF
  1739. cb_ok = None
  1740. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1741. window_manager.new(None,name,wcb=c)
  1742. if libwin.split_window_show(geo_list,_filter=name):
  1743. window_manager.top(name)
  1744. # =======================================================================
  1745. # =======================================================================
  1746. name="Nodescanner" #"TK-EXEC"
  1747. def sdl_starter():
  1748. cmd="nohup /usr/bin/python3 /opt/LibreLight/Xdesk/tool/TK-Nodescanner.py > /dev/null 2>&1 " #&"
  1749. print(cmd)
  1750. def xyz123(cmd):
  1751. os.system(cmd)
  1752. thread.start_new_thread(xyz123,(cmd,))
  1753. return [None,None,None]
  1754. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1755. geo = libwin.filter_window_geo(geo_list,name)
  1756. if geo:
  1757. args.update(geo)
  1758. data = []
  1759. cls = sdl_starter #: None #GUI_CONF
  1760. cb_ok = None
  1761. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1762. window_manager.new(None,name,wcb=c)
  1763. if libwin.split_window_show(geo_list,_filter=name):
  1764. window_manager.top(name)
  1765. # =======================================================================
  1766. # =======================================================================
  1767. name="XWING" #"TK-EXEC"
  1768. def sdl_starter():
  1769. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkgui/EXEC-XWING.py " #&"
  1770. print(cmd)
  1771. def xyz123(cmd):
  1772. os.system(cmd)
  1773. thread.start_new_thread(xyz123,(cmd,))
  1774. return [None,None,None]
  1775. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1776. geo = libwin.filter_window_geo(geo_list,name)
  1777. if geo:
  1778. args.update(geo)
  1779. data = []
  1780. cls = sdl_starter #: None #GUI_CONF
  1781. cb_ok = None
  1782. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1783. window_manager.new(None,name,wcb=c)
  1784. if libwin.split_window_show(geo_list,_filter=name):
  1785. window_manager.top(name)
  1786. # =======================================================================
  1787. name="SDL-STAGE"
  1788. def sdl_starter():
  1789. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk//3d/stage_3d.py " #&"
  1790. print(cmd)
  1791. def xyz123(cmd):
  1792. os.system(cmd)
  1793. thread.start_new_thread(xyz123,(cmd,))
  1794. return [None,None,None]
  1795. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1796. geo = libwin.filter_window_geo(geo_list,name)
  1797. if geo:
  1798. args.update(geo)
  1799. data = []
  1800. cls = sdl_starter #: None #GUI_CONF
  1801. cb_ok = None
  1802. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1803. window_manager.new(None,name,wcb=c)
  1804. if libwin.split_window_show(geo_list,_filter=name):
  1805. window_manager.top(name)
  1806. # =======================================================================
  1807. name="SDL-Shader"
  1808. def sdl_starter():
  1809. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk//3d/demo_shaders.py " #&"
  1810. print(cmd)
  1811. #os.popen(cmd)
  1812. def xyz123(cmd):
  1813. os.system(cmd)
  1814. thread.start_new_thread(xyz123,(cmd,))
  1815. return [None,None,None]
  1816. #class window_create_sdl_buffer():
  1817. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1818. geo = libwin.filter_window_geo(geo_list,name)
  1819. if geo:
  1820. args.update(geo)
  1821. data = []
  1822. cls = sdl_starter #: None #GUI_CONF
  1823. cb_ok = None
  1824. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1825. window_manager.new(None,name,wcb=c)
  1826. if libwin.split_window_show(geo_list,_filter=name):
  1827. window_manager.top(name)
  1828. # =======================================================================
  1829. name="FIX-LIST"
  1830. def sdl_starter():
  1831. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tksdl/fix.py " #&"
  1832. print(cmd)
  1833. #os.popen(cmd)
  1834. def xyz123(cmd):
  1835. os.system(cmd)
  1836. thread.start_new_thread(xyz123,(cmd,))
  1837. return [None,None,None]
  1838. #class window_create_sdl_buffer():
  1839. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1840. geo = libwin.filter_window_geo(geo_list,name)
  1841. if geo:
  1842. args.update(geo)
  1843. data = []
  1844. cls = sdl_starter #: None #GUI_CONF
  1845. cb_ok = None
  1846. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1847. window_manager.new(None,name,wcb=c)
  1848. if libwin.split_window_show(geo_list,_filter=name):
  1849. window_manager.top(name)
  1850. # =======================================================================
  1851. name="CONFIG"
  1852. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1853. geo = libwin.filter_window_geo(geo_list,name)
  1854. if geo:
  1855. args.update(geo)
  1856. data = []
  1857. cls = GUI_CONF
  1858. cb_ok = None
  1859. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1860. window_manager.new(None,name,wcb=c)
  1861. if libwin.split_window_show(geo_list,_filter=name):
  1862. window_manager.top(name)
  1863. # =======================================================================
  1864. name="DIMMER"
  1865. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1866. geo = libwin.filter_window_geo(geo_list,name)
  1867. if geo:
  1868. args.update(geo)
  1869. cls = GUI_DIM
  1870. data = FIXTURES
  1871. ok_cb=None
  1872. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1873. window_manager.new(None,name,wcb=c)
  1874. if libwin.split_window_show(geo_list,_filter=name):
  1875. window_manager.top(name)
  1876. # =======================================================================
  1877. name="FIXTURES"
  1878. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1879. geo = libwin.filter_window_geo(geo_list,name)
  1880. if geo:
  1881. args.update(geo)
  1882. cls = GUI_FIX
  1883. ok_cb=None
  1884. data = FIXTURES
  1885. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1886. window_manager.new(None,name,wcb=c)
  1887. if libwin.split_window_show(geo_list,_filter=name):
  1888. window_manager.top(name)
  1889. # =======================================================================
  1890. name="FIXTURE-EDITOR"
  1891. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP}
  1892. geo = libwin.filter_window_geo(geo_list,name)
  1893. if geo:
  1894. args.update(geo)
  1895. data=[]
  1896. for i in range(12*6):
  1897. data.append({"text"+str(i):"test"})
  1898. import tkgui.fix as guifix
  1899. cls = guifix.GUI_FixtureEditor
  1900. cb_ok = None
  1901. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1902. window_manager.new(None,name,wcb=c)
  1903. # =======================================================================
  1904. name="MASTER-WING"
  1905. args = {"title":name,"master":0,"width":75,"height":405,"left":L0,"top":TOP+H1-220,"resize":0}
  1906. geo = libwin.filter_window_geo(geo_list,name)
  1907. if geo:
  1908. args.update(geo)
  1909. data=[]
  1910. for i in range(2):
  1911. data.append({"MASTER"+str(i):"MASTER"})
  1912. cls = GUI_MasterWingLayout #(w1,data)
  1913. cb_ok = None
  1914. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1915. window_manager.new(None,name,wcb=c)
  1916. if libwin.split_window_show(geo_list,_filter=name):
  1917. window_manager.top(name)
  1918. # =======================================================================
  1919. name="EXEC-WING"
  1920. args = {"title":name,"master":0,"width":600,"height":415,"left":L1,"top":TOP+H1+HTB*2,"H1":H1,"W1":W1}
  1921. geo = libwin.filter_window_geo(geo_list,name)
  1922. if geo:
  1923. args.update(geo)
  1924. data=[]
  1925. for i in range(10*3):
  1926. data.append({"EXEC"+str(i):"EXEC"})
  1927. cls = GUI_ExecWingLayout
  1928. cb_ok = set_exec_fader_all
  1929. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  1930. window_manager.new(None,name,wcb=c)
  1931. if libwin.split_window_show(geo_list,_filter=name):
  1932. window_manager.top(name)
  1933. # =======================================================================
  1934. name="ENCODER"
  1935. args = {"title":name,"master":0,"width":620,"height":113,"left":L0+710,"top":TOP+H1+15+HTB*2}
  1936. geo = libwin.filter_window_geo(geo_list,name)
  1937. if geo:
  1938. args.update(geo)
  1939. cls = draw_enc #(master,w.tk)#Xroot)
  1940. cb_ok = None
  1941. data = FIXTURES #master
  1942. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1943. window_manager.new(None,name,wcb=c)
  1944. if libwin.split_window_show(geo_list,_filter=name):
  1945. window_manager.top(name)
  1946. # =======================================================================
  1947. name = "SETUP"
  1948. args = {"title":name +" SHOW:"+master.base.show_name,
  1949. "master":0,"width":445,"height":42,"left":L1+10+W1,"top":TOP,"resize":10}
  1950. args["title"] = "SETUP SHOW:"+master.base.show_name
  1951. geo = libwin.filter_window_geo(geo_list,name)
  1952. try:
  1953. geo["width"] = args["width"]
  1954. geo["height"] = args["height"]
  1955. except:pass
  1956. if geo:
  1957. args.update(geo)
  1958. cls = draw_setup #(master,w.tk)
  1959. data = []
  1960. cb_ok = None
  1961. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1962. window_manager.new(None,name,wcb=c)
  1963. if libwin.split_window_show(geo_list,_filter=name):
  1964. window_manager.top(name)
  1965. # =======================================================================
  1966. name = "COMMAND"
  1967. args = {"title":name,"master":0,"width":415,"height":130,"left":L1+10+W1,"top":TOP+81,"resize":10}
  1968. geo = libwin.filter_window_geo(geo_list,name)
  1969. if geo:
  1970. args.update(geo)
  1971. cls = draw_command #(master,w.tk)
  1972. data = []
  1973. cb_ok = None
  1974. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1975. window_manager.new(None,name,wcb=c)
  1976. if libwin.split_window_show(geo_list,_filter=name):
  1977. window_manager.top(name)
  1978. # =======================================================================
  1979. name = "LIVE"
  1980. args = {"title":name,"master":0,"width":415,"height":42,"left":L1+10+W1,"top":TOP+235,"resize":10}
  1981. geo = libwin.filter_window_geo(geo_list,name)
  1982. if geo:
  1983. args.update(geo)
  1984. cls = draw_live #(master,w.tk)
  1985. data = []
  1986. cb_ok = None
  1987. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  1988. window_manager.new(None,name,wcb=c)
  1989. if libwin.split_window_show(geo_list,_filter=name):
  1990. window_manager.top(name)
  1991. # =======================================================================
  1992. name = "CLOCK"
  1993. args = {"title":name,"master":0,"width":335,"height":102,"left":L1+10+W1+80,"top":TOP+H1+HTB+160,"resize":0}
  1994. geo = libwin.filter_window_geo(geo_list,name)
  1995. if geo:
  1996. args.update(geo)
  1997. cclock = X_CLOCK()
  1998. cls = cclock.draw_clock
  1999. data = []
  2000. cb_ok = None
  2001. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2002. window_manager.new(None,name,wcb=c)
  2003. if libwin.split_window_show(geo_list,_filter=name):
  2004. window_manager.top(name)
  2005. # =======================================================================
  2006. name="FX"
  2007. args = {"title":name,"master":0,"width":415,"height":297+30,"left":L1+10+W1,"top":TOP+302,"resize":1}
  2008. geo = libwin.filter_window_geo(geo_list,name)
  2009. if geo:
  2010. args.update(geo)
  2011. cls = draw_fx #(master,w.tk)
  2012. data = []
  2013. cb_ok = None
  2014. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2015. window_manager.new(None,name,wcb=c)
  2016. if libwin.split_window_show(geo_list,_filter=name):
  2017. window_manager.top(name)
  2018. # =======================================================================
  2019. name="FX3" #"TK-EXEC"
  2020. def sdl_starter():
  2021. cmd="/usr/bin/python3 /opt/LibreLight/Xdesk/tkgui/FX3.py " #&"
  2022. print(cmd)
  2023. def xyz123(cmd):
  2024. os.system(cmd)
  2025. thread.start_new_thread(xyz123,(cmd,))
  2026. return [None,None,None]
  2027. args = {"title":name,"master":0,"width":380,"height":500,"left":L1,"top":TOP}
  2028. geo = libwin.filter_window_geo(geo_list,name)
  2029. if geo:
  2030. args.update(geo)
  2031. data = []
  2032. cls = sdl_starter #: None #GUI_CONF
  2033. cb_ok = None
  2034. c = window_create_sdl_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2035. window_manager.new(None,name,wcb=c)
  2036. if libwin.split_window_show(geo_list,_filter=name):
  2037. window_manager.top(name)
  2038. # =======================================================================
  2039. name="PATCH"
  2040. args = {"title":name,"master":0,"width":W1,"height":H1,"left":L1,"top":TOP,"foot":1,"head":1}
  2041. geo = libwin.filter_window_geo(geo_list,name)
  2042. if geo:
  2043. args.update(geo)
  2044. cls = GUI_PATCH
  2045. data = FIXTURES
  2046. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=1)
  2047. window_manager.new(None,name,wcb=c) #,obj)
  2048. if libwin.split_window_show(geo_list,_filter=name):
  2049. window_manager.top(name)
  2050. # =======================================================================
  2051. name="COLORPICKER"
  2052. args = {"title":name,"master":0,"width":600,"height":113,"left":L1+5,"top":TOP+5+HTB*2+H1}
  2053. geo = libwin.filter_window_geo(geo_list,name)
  2054. if geo:
  2055. args.update(geo)
  2056. cls = draw_colorpicker #(master,w.tk,FIXTURES,master)
  2057. data = [FIXTURES,master]
  2058. cb_ok = None #FIXTURES
  2059. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2060. window_manager.new(None,name,wcb=c)
  2061. if libwin.split_window_show(geo_list,_filter=name):
  2062. window_manager.top(name)
  2063. # =======================================================================
  2064. name="TABLE"
  2065. args = {"title":name,"master":0,"width":600,"height":113,"left":L1+5,"top":TOP+5+HTB*2+H1}
  2066. geo = libwin.filter_window_geo(geo_list,name)
  2067. if geo:
  2068. args.update(geo)
  2069. #cls = draw_colorpicker #(master,w.tk,FIXTURES,master)
  2070. cls = TableFrame #(root=w.tk)#,left=80,top=620)
  2071. data = [FIXTURES,master]
  2072. cb_ok = None #FIXTURES
  2073. c = libtk.window_create_buffer(args=args,cls=cls,data=data,cb_ok=cb_ok,gui=master,scroll=0)
  2074. window_manager.new(None,name,wcb=c)
  2075. if libwin.split_window_show(geo_list,_filter=name):
  2076. window_manager.top(name)
  2077. def wm_mainloop():
  2078. try:
  2079. window_manager.mainloop()
  2080. finally:
  2081. print()
  2082. print()
  2083. cmd="xset -display :0.0 r rate 240 20"
  2084. os.system(cmd)
  2085. cprint(" - EXIT -",color="red")
  2086. BASE_PATH = "/opt/LibreLight/Xdesk/"
  2087. movewin.process_kill(BASE_PATH+"tksdl/")
  2088. modes.val("EXIT",1) # set MODES EXIT
  2089. time.sleep(2)
  2090. del modes.modes["EXIT"] #val("EXIT",0) # set MODES EXIT
  2091. time.sleep(1)
  2092. master.exit()
  2093. sys.exit()
  2094. wm_mainloop() #window_manager.mainloop()
  2095. # thread.start_new_thread(wm_mainloop,()) # break TKINTER !!!
  2096. while 1:
  2097. print("loop..")
  2098. time.sleep(1)
  2099. cmd="xset -display :0.0 r rate 240 20"
  2100. os.system(cmd)
  2101. print("FOCUS_OUT", cmd)
  2102. #os.system(cmd) # DISABLED