| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 | #!/usr/bin/python3import osimport timeimport syssys.path.insert(0,"/opt/LibreLight/Xdesk/")import psutilimport json    import inspectimport _thread as threadimport lib.showlib as showlibfrom lib.cprint import cprintSHOW_PATH = showlib.current_show_path() #SHOW_PATH # python3 movewin.py window-title x y# python3 movewin.py COMMA 723 943class Control():    def __init__(self):        self.title = "WinfoWinName"        self.winid = ""    def winfo(self):        winid = winfo(self.title)        if type(winid) == list:            if len(winid) >= 1:                self.winid = winid[0]    def winfo2(self):        winid = winfo2(self.title)        #if type(winid) == list:        #    if len(winid) >= 1:        #        self.winid = winid[0]    def move(self,x=None,y=None):        if self.winid:            cmd=movewin(_id=self.winid,x=x,y=y)            print("movewin.move:",cmd)            system(cmd)    def size(self,x=None,y=None):        if self.winid:            cmd = sizewin(_id=self.winid,x=x,y=y)            system(cmd)    def activate(self):        if self.winid:            cmd=activate(_id=self.winid)            system(cmd)def winfo(name="WinfoWinName"):    search = name    cmd = "xwininfo -root -children -all | grep '{}'"    cmd = cmd.format(search)    print(cmd)    r = os.popen(cmd)    lines = r.readlines()    _id = [] #"xxxx"    if lines and lines[0]:        _id.append( lines[0].split()[0] )    print("ID:",_id)    for line in lines:        line = line.strip()        print("-",line)    return _iddef parse_winfo_line(line):    a1 = 0    a2 = 0    ps_name  = ""    ps_title = ""    ps_id    = ""    ps_pos   = ""    ps_size  = ""    if line: # in lines:        a1 = line.index(' ("')+2           a2 = line.index('") ')+1           ps_id   = line.split()[0]        ps_id   = ps_id.replace(" ","")        ps_pos  = line.split()[-1]        ps_size = line.split()[-2]        ps_pos  = ps_pos.replace("+"," ").replace("x"," ")        ps_size = ps_size.replace("+"," ").replace("x"," ")        ps_pos = ps_pos.strip().split()        ps_size = ps_size.strip().split()        for i in range(len(ps_pos)):            ps_pos[i] = int(ps_pos[i])        for i in range(len(ps_size)):            ps_size[i] = int(ps_size[i])                ps_pos[-2] -= ps_size[-2]        ps_pos[-1] -= ps_size[-1]        #ps_pos_x1 = int(ps_apos.split("+")[-2])        #ps_pos_y1 = int(ps_pos.split("+")[-1])        if a1 >= 0 and a2 >= 0:            ps_name = line[a1:a2]            line = line[:a1]+line[a2:]            if ' "' in line and '":' in line:                a1 = line.index(' "')+2                a2 = line.index('":')                ps_title = line[a1:a2]                _line = [ps_id,ps_name,ps_title,ps_size,ps_pos]                print("   ",_line)                return _line def winfo2(name="WinfoWinName"):    #print("--------------")    search = name    cmd = "xwininfo -root -children -all | grep '{}'"    cmd = cmd.format(search)    #print(cmd)    r = os.popen(cmd)    lines = r.readlines()    _data = []     for line in lines:        a = parse_winfo_line(line)        if a:            _data.append(a)    #print("--------------")    return _datadef get_store_sdl_line():    #print()    #print("-> def",inspect.currentframe().f_code.co_name,"-"*10)    lines = winfo2(name="SDL-")    lines.extend( winfo2(name="TK-"))    out_lines=[]    for line in lines:        t=line[2].split()        for k in t:            k = k.replace(" ", "_")            if "SDL-" in k or "TK-" in k:                s=line[-2]                p=line[-1]                # info: b x h + x + y                out = [1,k, s[0],s[1],p[0],p[1] ]                out_lines.append(out)    return out_linesdef load_all_sdl(title="X"):    fname = SHOW_PATH + "/gui-sdl.txt"    if os.path.isfile(fname):        f=open(fname,"r")        lines = f.readlines()        f.close()        print("  load_all_sdl fname:",fname)        for line in lines:            if title in line:                return json.loads(line)def _start_sub(cmd,name,mute=0):    r = os.popen(cmd)    while 1:        #print(dir(r))        line = r.readline()        if not line:            break        line = line.strip()        if mute == 0:            cprint(name,":",[line],color="blue")    cprint("EXIT:",name,cmd)    #BrokenPipeError: [Errno 32] Broken pipedef start_sub(cmd,name="<PROCESS>",mute=0):    cprint("  start_sub",cmd,name,"mute-stdout:",mute,color="green")    thread.start_new_thread(_start_sub,(cmd,name,mute)) # SERVERdef startup_all_sdl():    #print()    #print("-> def",inspect.currentframe().f_code.co_name,"-"*10)    fname = SHOW_PATH + "/gui-sdl.txt"    if os.path.isfile(fname):        f=open(fname,"r")        xlines = f.readlines()        f.close()        print()        cprint("startup_all_sdl() ",fname,color="yellow")        for line in xlines:            line = line.strip()            if line.startswith("#-- history"):                break            elif line.startswith("#"):                continue            if not line:                continue            else:                #print("    line >> ",[line])                try:                    line = json.loads(line)                    cmd = "python3 /opt/LibreLight/Xdesk/tksdl/{}"                    if line[1] == "SDL-MIDI":                        cmd=cmd.format("midi.py")                        #r=os.popen(cmd)                        start_sub(cmd,"SDL-MIDI",mute=1)                    elif line[1] == "SDL-DMX":                        cmd=cmd.format("dmx.py")                        #os.popen(cmd)                        start_sub(cmd,"SDL-DMX",mute=1)                    elif line[1] == "SDL-FIX-LIST":                        cmd=cmd.format("fix.py")                        #r=os.popen(cmd)                        start_sub(cmd,"SDL-FIX",mute=1)                    elif line[1] == "TK-EXEC":                        cmd = "python3 /opt/LibreLight/Xdesk/tkgui/{}"                        cmd=cmd.format("EXEC.py")                        #r=os.popen(cmd)                        start_sub(cmd,"TK-EXEC",mute=1)                except json.decoder.JSONDecodeError as e:                    cprint("ERR",e,color="red")            time.sleep(0.3)        print()def store_all_sdl():    #print()    #print("-> def",inspect.currentframe().f_code.co_name,"-"*10)    error = 0       fname = SHOW_PATH + "/gui-sdl.txt"    in_lines = []    if os.path.isfile(fname):        f=open(fname,"r")        xlines = f.readlines()        f.close()        #print("  store_all_sdl fname",fname)        for line in xlines:            line = line.strip()            if not line.startswith("#") and line:                in_lines.append(line)        #in_lines.append('[0,"xx aa",0,0,0,0]')        #for line in in_lines:        #    print(" R:",[line])    lines = get_store_sdl_line()    ap_line = []    pop = []    for line in lines:        ok = 0        iline = ""        for j,iline in enumerate(in_lines):            if line[1] in iline:                if j not in pop:                    pop.append(j)                #print(" del ",j,line)    for i in pop[::-1]:        try:            in_lines.pop(i)        except Exception as e:            cprint("  ERR:",e,color="red")             error += 0       temp = {}    for i in in_lines:        k = json.loads(i)[1]        if k not in temp:            temp[k] = i    f=open(fname,"w")    f.write("#"+json.dumps(["on","title","w","h","x","y"])+"\n")    for line in lines:        f.write(json.dumps(line)+"\n")    f.write("\n")    f.write("#-- history \n")    for k,line in temp.items(): #in_lines:        #print("+++>",line)        f.write(line+"\n")    f.write("\n")    f.close()    if not error:        cprint("  store_all_sdl OK fname:",fname,color="green")        return 1    cprint("  store_all_sdl FAIL fname:",fname,color="red")def movewin(_id="0xWinId",x=None,y=None):    print()    #print("-> def",inspect.currentframe().f_code.co_name,"-"*10)    cmd="xdotool windowmove {} {} {}".format(_id,x,y)    print("movewin.movewin:",cmd)    return cmddef sizewin(_id="0xWinId",x=None,y=None):    print()    #print("-> def",inspect.currentframe().f_code.co_name,"-"*10)    cmd="xdotool windowsize {} {} {}".format(_id,x,y)    return cmddef activate(_id="0xWinId"):    cmd="xdotool windowactivate {}".format(_id)    return cmddef system(cmd):    print(cmd)    os.system(cmd)def search_process(_file_path,exact=1):    print("search_process",_file_path)    pids = psutil.pids()    count = 0    out = []    for pid in pids:        try:            p = psutil.Process(pid)        except psutil.NoSuchProcess:            break        ps = p.cmdline()        if len(ps) < 2:            continue        if "python" not in ps[0]:            continue        #print(" ",[ps[1]])        #print("exact_search",exact)        if exact:            if str(_file_path) == str(ps[1]):                print(ps)                count += 1                out.append(pid)        else:            if str(_file_path) in str(ps[1]):                print(ps)                count += 1                out.append(pid)    print("search_process",count)    return outdef process_kill(path):    pids = search_process(path,exact=0)    for pid in pids:        print("process_kill:",[path,pid])        cmd="kill -kill {} ".format(pid)        os.system(cmd)    time.sleep(0.2)    #for pid in pids:    #    print("process_kill:",path,pid)    #    p = psutil.Process(pid)       #    #p.name()    #    #p.cmdline()    #    p.terminate()    #    p.wait()    print("process_kill OK")def get_lineno():  callerframerecord = inspect.stack()[1]    # 0 represents this line                                            # 1 represents line at caller  frame = callerframerecord[0]  info = inspect.getframeinfo(frame)  #print(info.filename)                      # __FILE__     -> Test.py  #print(info.function)                      # __FUNCTION__ -> Main  #print(info.lineno)                        # __LINE__     -> 13  return info.linenoif __name__ == "__main__":    print("# python3 movewin.py window-title x y")    print("# python3 movewin.py COMMA 723 943")    import random    a=random.randint(100,400)    b=random.randint(100,400)        search = "ASD"    try:        search = sys.argv[1]        search = search.replace("'","")    except:pass    try:        a = sys.argv[2]    except:pass    try:        b = sys.argv[3]    except:pass    _ids = winfo(search)    for _id in _ids:        c1 = sizewin(_id,a,b)        c2 = movewin(_id,a,b)        c3 = activate(_id)        system(c1)        time.sleep(0.1)        system(c2)        time.sleep(0.1)        system(c3)def check_is_started(CAPTION,_file_path,sleep=0):    if sleep:        time.sleep(sleep)    pids = search_process(_file_path)    if len(pids) >= 2:        search = CAPTION[:]        _ids = winfo(search)        for _id in _ids:            c3  = activate(_id)            print()            print(" check_is_started CMD:",c3)            print(" EXIT",_file_path,CAPTION)            os.system(c3)        time.sleep(1)        print(" EXIT",_file_path,CAPTION)        print()        sys.exit()
 |