def gen_all_windows(minwin,maxwin,session): from ScreenSaver import ScreenSaver ss=ScreenSaver(session,'/dev/null','/dev/null') cwin=-1 ctty=None searching=False for i in range(minwin,maxwin+1): id=str(i) if not searching: pass cwin,ctitle=ss.get_number_and_title(id) if (cwin==-1): #no such window if searching: pass else: searching=True else: if(searching): searching=False # has to follow get_number_and_title() to recognize zombie windows ctty = ss.tty(id) if ctty.startswith('This'): ctype=-1 elif ctty=='telnet': ctype=1 else: ctype=0 yield cwin,ctype,ctitle
def main(): logfile="___log-nest-layout" dumpfile="___scs-nest-layout-dump-%d"%os.getpid() if not os.path.exists(tmpdir): os.makedirs(tmpdir) logfile=os.path.join(tmpdir,logfile) dumpfile=os.path.join(tmpdir,dumpfile) sys.stdout=open(logfile,'w') sys.stderr=sys.stdout session=sys.argv[1] tlayout=sys.argv[2] scs=ScreenSaver(session) homelayout,homelayoutname=scs.get_layout_number() while True: regions=sc.get_regions(scs.pid) try: focusminsize="%s %s"%(regions[3][0], regions[3][1]) regions_c=regions[0] foff=regions[1] rsize=tuple([int(regions[4+foff][1]),int(regions[4+foff][2])]) hsize=int(regions[2][0]),int(regions[2][1]) if regions[4][0]: break except Exception,x: print(x) sys.exit(2) pass
def sort(session,min,max,key=None): ss=ScreenSaver(session,'/dev/null','/dev/null') wins=[] wins_trans={} groups={} cgroup=None for win,type,title in sc.gen_all_windows(min,max,session): iwin=int(win) group=ss.get_group(win) lastval=(group,iwin,type,title) try: groups[group].append(lastval) except: groups[group]=[lastval] win_biggest=lastval[1] for i in range(0,win_biggest+1): wins_trans[i]=i i=0 for group,props in groups.items(): props.sort(key=lambda wins:wins[3].lower()) #print( str(len(props))+' : '+group + ' : ' + str(props)) for group,win,type,title in props: if wins_trans[win]!=i: #print("win %d(%d)(%s) as %d"%(wins_trans[win],win,group,i)) ss.number(str(i),str(wins_trans[win])) tmp=wins_trans[win] wins_trans[win]=wins_trans[i] wins_trans[i]=tmp i+=1 return
def layout_checkpoint(session, layout): ss = ScreenSaver(session) layhist = get_layout_history(session, layout) os.mkdir(tdir_c) tfile1 = os.path.join(tdir_c, layout_dump) tfile2 = os.path.join(tdir_c, layout_regions) ss.command_at(False , """eval "layout dump '%s'" "dumpscreen layout '%s'" \ 'layout title'""" % (tfile1, tfile2)) try: import filecmp for old_current in layhist.current: told2 = os.path.join(old_current, os.path.basename(tfile2)) if filecmp.cmp(told2, tfile2, True): told1 = os.path.join(old_current, os.path.basename(tfile1)) os.remove(told1) os.remove(told2) os.rmdir(old_current) else: os.rename(old_current, os.path.join(tdir_u, os.path.basename(old_current))) except OSError: pass try: for date,redo_dir in layhist.redo: os.remove(os.path.join(redo_dir,layout_dump)) os.remove(os.path.join(redo_dir,layout_regions)) os.rmdir(redo_dir) except OSError: pass return tfile1,tfile2
def tui_attach_session(scs, arg, psession): #print2ui('LOGIC: attaching \"%s\"'%args[0]) sys.stderr.write('tui trying to attach %s' % psession) scs_target = ScreenSaver(arg) if not scs_target.exists(): print2ui('LOGIC: session does not exists') return (None, None) scs.focus('bottom') cnum = scs.get_number_and_title()[0] if scs.sessionname() == arg: print2ui('LOGIC: THIS is session [%s]' % arg) elif psession and psession == arg: print2ui('LOGIC: parent session is [%s]' % psession) print2ui('LOGIC: Unable to attach loop detected') else: scs.screen(SCREEN + ' -x \"%s\"' % arg) scs.title(arg) if int(cnum) > 2: #print2ui('LOGIC: killing window \"%s\"'%cnum) scs.kill(cnum) scs.focus('top') return (None, arg)
def kill_group(session,groupids): ss=ScreenSaver(session) excluded_groups,excluded_wins=subwindows(session,groupids) print('Killing groups: %s'%str(excluded_groups)) print('All killed windows: %s'%str(excluded_wins)) for win in excluded_wins: ss.kill(win)
def renumber(session, datadir): ss = ScreenSaver(session, '/dev/null', '/dev/null') wins = [] wins_trans = {} for (cwin, cgroupid, ctype, ctty, ctitle) in sc.gen_all_windows_fast(session, datadir): iwin = int(cwin) wins.append((iwin, cgroupid, ctype)) wins_trans[iwin] = iwin wins.sort(key=lambda wins: wins[0]) print wins_trans i = 0 for (win, groupid, ctype) in wins: if wins_trans[win] != i: #print("win %d(%d)(%s) as %d"%(wins_trans[win],win,group,i)) ss.number(str(i), str(wins_trans[win])) tmp = wins_trans[win] try: wins_trans[win] = wins_trans[i] except: wins_trans[win] = -1 wins_trans[i] = tmp i += 1 print wins_trans
def subwindows(session, datadir, groupids): ss = ScreenSaver(session) bAll = False try: if groupids[0] in ('cg', 'current', '..'): groupids[0] = ss.get_group()[0] if groupids[0] == "-1": bAll = True elif groupids[0] in ('cw', 'current-window', '.'): groupids[0] = ss.get_number_and_title()[0] elif groupids[0] == 'all': bAll = True except IndexError: bAll = True group_wins = {} group_groups = {} excluded_wins = [] excluded_groups = [] for (cwin, cgroupid, ctype, ctty, ctitle) in sc.gen_all_windows_fast(session, datadir): if ctype == 1: # group if cwin in groupids or bAll or ctitle in groupids: excluded_groups.append(cwin) try: group_groups[cgroupid] += [cwin] except: group_groups[cgroupid] = [cwin] else: # anything other than group if cwin in groupids or bAll or ctitle in groupids: excluded_wins.append(cwin) else: try: group_wins[cgroupid] += [cwin] except: group_wins[cgroupid] = [cwin] excluded_groups_tmp = [] while excluded_groups: egroup = excluded_groups.pop() if egroup not in excluded_groups_tmp: excluded_groups_tmp.append(egroup) try: ngroups = group_groups[egroup] if ngroups: for g in ngroups: excluded_groups.append(g) except: pass excluded_groups = excluded_groups_tmp for egroup in excluded_groups: excluded_wins.append(egroup) try: for w in group_wins[egroup]: excluded_wins.append(w) except: pass return (excluded_groups, excluded_wins)
def kill_group(session, datadir, groupids): ss = ScreenSaver(session) (excluded_groups, excluded_wins) = subwindows(session, datadir, groupids) print 'Killing groups: %s' % str(excluded_groups) print 'All killed windows: %s' % str(excluded_wins) for win in excluded_wins: ss.kill(win)
def kill_win_last_proc(session,win="-1",sig="TERM"): import signal,os ss=ScreenSaver(session,'/dev/null','/dev/null') ctty=ss.tty(win) pids=sc.get_tty_pids(ctty) pid = pids[len(pids)-1] sig=eval('signal.SIG'+sig) os.kill(int(pid),sig)
def kill_zombie(session,groupids=[]): ss=ScreenSaver(session,'/dev/null','/dev/null') if groupids: windows=subwindows(session,groupids)[1] for cwin,cgroupid,ctype,ctty,ctitle in sc.gen_all_windows_fast(session): if ctype==-1: if groupids: if cwin in windows: ss.kill(cwin) else: ss.kill(cwin)
def kill_win_last_proc(session,win="-1",sig="TERM"): import signal,os,platform ss=ScreenSaver(session,'/dev/null','/dev/null') ctty=ss.tty(win) if platform.system() == 'FreeBSD': pids=sc.get_tty_pids(ctty) else: pids=sc._get_tty_pids_pgrep(ctty) pid = pids[-1] sig=eval('signal.SIG'+sig) os.kill(int(pid),sig)
def layout_end(): global layout_file global layout_session global layout_source_file global layout_focusminsize_x global layout_focusminsize_y if layout_focusminsize_x != '0' or layout_focusminsize_y != '0': layout_file.write('focusminsize %s %s\n' % (layout_focusminsize_x, layout_focusminsize_y)) layout_file.close() from ScreenSaver import ScreenSaver ss = ScreenSaver(layout_session) ss.source(layout_source_file)
def kill_group(session,win): print ('killing group %s'%win) ss=ScreenSaver(session,'/dev/null','/dev/null') tty=ss.tty(win) if tty!="telnet": print('This window is not a group. Aborting.') return ss.select(win) wins=sc.parse_windows(sc.get_windows(session))[0] print wins for w in wins: print('killing %s'%w)
def subwindows(session,groupids,datafile=None): ss=ScreenSaver(session) bAll=False if groupids[0] in ('cg','current'): groupids[0]=ss.get_group()[0] elif groupids[0] in ('cw','current-window'): groupids[0]=ss.get_number_and_title()[0] elif groupids[0]=='all': bAll=True group_wins={} group_groups={} excluded_wins=[] excluded_groups=[] #for cwin,cgroupid,cgroup,ctty,ctype,ctypestr,ctitle,cfilter,cscroll,ctime in sc.gen_all_windows_full(session): for cwin,cgroupid,ctype,ctty,ctitle in sc.gen_all_windows_fast(session,datafile): if(ctype==1): # group if cwin in groupids or bAll or ctitle in groupids: excluded_groups.append(cwin) try: group_groups[cgroupid]+=[cwin] except: group_groups[cgroupid]=[cwin] else: # anything other than group if cwin in groupids or ctitle in groupids: excluded_wins.append(cwin) else: try: group_wins[cgroupid]+=[cwin] except: group_wins[cgroupid]=[cwin] excluded_groups_tmp=[] while excluded_groups: egroup=excluded_groups.pop() if egroup not in excluded_groups_tmp: excluded_groups_tmp.append(egroup) try: ngroups = group_groups[egroup] if ngroups: for g in ngroups: excluded_groups.append(g) except: pass excluded_groups = excluded_groups_tmp for egroup in excluded_groups: excluded_wins.append(egroup) try: for w in group_wins[egroup]: excluded_wins.append(w) except: pass return excluded_groups,excluded_wins
def layout_dump(session): from ScreenSaver import ScreenSaver tdir = make_dumpscreen_dirs(session) ss = ScreenSaver(session) tfile = None i = 0 while True: tfile = os.path.join(tdir, '___layout_dump-%d-%d' % (os.getpid(),i)) if not os.path.exists(tfile): break else: i += 1 ss.query_at('layout dump \"%s\"' % tfile) return tfile
def layout_dump(session): from ScreenSaver import ScreenSaver tdir = make_dumpscreen_dirs(session) ss = ScreenSaver(session) tfile = None i = 0 while True: tfile = os.path.join(tdir, '___layout_dump-%d-%d' % (os.getpid(), i)) if not os.path.exists(tfile): break else: i += 1 ss.query_at('layout dump \"%s\"' % tfile) return tfile
def dumpscreen_window(session, full=False): from ScreenSaver import ScreenSaver #print('dumpscreen_window()') tdir = make_dumpscreen_dirs(session) ss = ScreenSaver(session) if full: ss.command_at(False, "at \# dumpscreen window-full \"%s\"" % tdir) f = open(os.path.join(tdir, 'full'), 'w') f.close() tfile = os.path.join(tdir, 'winlist') ss.query_at("at \# dumpscreen window \"%s\"" % tfile) return tdir
def get_win_last_proc(session, win="-1", ctty = None): import platform if not ctty: ss = ScreenSaver(session, '/dev/null', '/dev/null') ctty = ss.tty(win) if ctty is None or ctty == -1: stderr.write("Window does not exist (%s)\n" % win) return False if platform.system() == 'FreeBSD': pids = sc.get_tty_pids(ctty) else: pids = sc._get_tty_pids_pgrep(ctty) if len(pids) > 0: return pids[-1] else: ## No processes for this window. return None
def get_win_last_proc(session, win="-1", ctty=None): import platform if not ctty: ss = ScreenSaver(session, '/dev/null', '/dev/null') ctty = ss.tty(win) if ctty is None or ctty == -1: stderr.write("Window does not exist (%s)\n" % win) return False if platform.system() == 'FreeBSD': pids = sc.get_tty_pids(ctty) else: pids = sc._get_tty_pids_pgrep(ctty) if len(pids) > 0: return pids[-1] else: ## No processes for this window. return None
def sort(session, datadir, key=None): ss = ScreenSaver(session, '/dev/null', '/dev/null') wins = [] wins_trans = {} groups = {} cgroup = None for (cwin, cgroupid, ctype, ctty, ctitle) in sc.gen_all_windows_fast(session, datadir): iwin = int(cwin) lastval = (groupid, iwin, ctype, ss.title('', iwin)) try: groups[groupid].append(lastval) except: groups[groupid] = [lastval] wins_trans[iwin] = iwin i = 0 for (group, props) in groups.items(): try: props.sort(key=lambda wins: wins[3].lower()) except: print 'FAIL' print str(len(props)) + ' : ' + group + ' : ' + str(props) pass #print( str(len(props))+' : '+group + ' : ' + str(props)) for (groupid, win, ctype, title) in props: if wins_trans[win] != i: #print("win %d(%d)(%s) as %d"%(wins_trans[win],win,group,i)) ss.number(str(i), str(wins_trans[win])) tmp = wins_trans[win] try: wins_trans[win] = wins_trans[i] except: wins_trans[win] = -1 wins_trans[i] = tmp i += 1 return
def renumber(session,min,max): ss=ScreenSaver(session,'/dev/null','/dev/null') wins=[] wins_trans={} for win,type,title in sc.gen_all_windows(min,max,session): iwin=int(win) wins.append((ss.get_group(win),iwin,type)) win_biggest=wins[len(wins)-1][1] for i in range(0,win_biggest+1): wins_trans[i]=i wins.sort(key=lambda wins:wins[0]) i=0 for group,win,type in wins: if wins_trans[win]!=i: #print("win %d(%d)(%s) as %d"%(wins_trans[win],win,group,i)) ss.number(str(i),str(wins_trans[win])) tmp=wins_trans[win] wins_trans[win]=wins_trans[i] wins_trans[i]=tmp i+=1
def kill_zombie(session, datadir, groupids=[]): ss = ScreenSaver(session, '/dev/null', '/dev/null') if groupids: windows = subwindows(session, datadir, groupids)[1] for (cwin, cgroupid, ctype, ctty, ctitle) in sc.gen_all_windows_fast(session, datadir): if ctype == -1: if groupids: if cwin in windows: ss.kill(cwin) else: ss.kill(cwin)
def gen_all_windows_fast(session, datadir): from ScreenSaver import ScreenSaver ss = ScreenSaver(session) tfile = os.path.join(datadir, 'winlist') for line in open(tfile, "r"): try: (cwin, cgroupid, ctty, ctitle) = line.strip().split(" ", 3) except: (cwin, cgroupid, ctty) = line.strip().split(" ") ctitle = None if ctty[0] == 'z': ctypeid = -1 elif ctty[0] == 'g': ctypeid = 1 elif ctty[0] == 't': ctypeid = 2 else: ctypeid = 0 yield (cwin, cgroupid, ctypeid, ctty, ctitle)
sc.cleanup() for r in (regions.regions)[focus_offset:]: this_win_history.append(r[0]) for r in (regions.regions)[:focus_offset]: this_win_history.append(r[0]) new_windows = [] for r in (regions_n.regions)[focus_offset:]: new_windows.append(r[0]) for r in (regions_n.regions)[:focus_offset]: new_windows.append(r[0]) return (this_win_history, new_windows, regions_c) if __name__ == '__main__': if not os.path.exists(tmpdir_source): os.makedirs(tmpdir_source) inputfile = os.path.join(tmpdir, inputfile) subprogram = os.path.join(os.path.dirname((sys.argv)[0]), subprogram) session = (sys.argv)[1] scs = ScreenSaver(session) (win_history, wins, regions_c) = prepare_windows(scs) signal.signal(signal.SIGUSR1, handler) signal.pause()
if not input: input = list_sessions(home, projectsdir, util.archiveend, '*', False) if not input: out("No recent session to load.") doexit(1) if not output: if current_session: output = current_session else: out("for loading you must specify target Screen session -S <sessionname>") doexit(1) pid = output savedir = input scs = ScreenSaver(pid, projectsdir, savedir) scs.command_at(False, "msgminwait 0") if not scs.exists(): out('No such session: \"%s\"' % pid) doexit(1) if savedir == '__tmp_pack' and mode == 1: out("savedir cannot be named \"%s\". Aborting." % savedir) doexit(1) elif savedir == scs.blacklistfile: out("savedir cannot be named \"%s\". Aborting." % savedir) doexit(1) maxwin_real = scs.maxwin() if maxwin == -1:
elif mode == 2: if not input: input=list_sessions(home,projectsdir,util.archiveend,'*') if not input: out("No recent session to load.") doexit(1) if not output: if current_session: output = current_session else: out("for loading you must specify target Screen session -S <sessionname>") doexit(1) pid = output savedir = input scs=ScreenSaver(pid,projectsdir,savedir) scs.command_at(False,"msgminwait 0") if not scs.exists(): out('No such session: %s'%pid) doexit(1) if savedir == '__tmp_pack' and mode==1: out("savedir cannot be named \"%s\". Aborting." % savedir) doexit(1) elif savedir == scs.blacklistfile: out("savedir cannot be named \"%s\". Aborting." % savedir) doexit(1) maxwin_real=scs.maxwin() if (maxwin==-1):
def run(session, requirecleanup_win, requirecleanup_lay, curwin, curlay, height, select_other = False): global lock_and_com_file, mru_file lltmpdir = os.path.join(tmpdir, '___layoutlist') try: os.makedirs(lltmpdir) except: pass signal.signal(signal.SIGINT, handler) session = session.split('.', 1)[0] ret = 0 ss = ScreenSaver(session) wnum = os.getenv('WINDOW') if requirecleanup_lay: lnum = ss.get_layout_number()[0] else: lnum = None mru_file = os.path.join(lltmpdir, '%s_MRU' % session) if select_other: mru_layouts = pickle.load(open(mru_file, 'r')) num, title = mru_layouts[1] tmp = mru_layouts[0] mru_layouts[0] = mru_layouts[1] mru_layouts[1] = tmp ss.command_at(False, 'eval "layout select %s" "layout title"' % num) pickle.dump(mru_layouts, open(mru_file, 'w')) return ret if NO_END: lock_and_com_file = os.path.join(lltmpdir, '%s' % session) f = open(lock_and_com_file, 'w') f.write(str(os.getpid()) + '\n') if requirecleanup_win and not requirecleanup_lay: f.write(wnum + '\n') else: f.write('-1\n') if requirecleanup_lay: f.write(lnum + '\n') else: f.write('-1\n') f.close() try: try: layinfo = list(sc.gen_layout_info(ss, sc.dumpscreen_layout_info(ss))) finally: sc.cleanup() except: sys.stderr.write('Layouts dumping error.\n') return 1 screen = curses.initscr() (laytable, pos_start) = create_table(ss, screen, curlay, layinfo, lnum, height) try: curses.start_color() except: curses.endwin() sys.stderr.write('start_color() failed!\n') return 1 curses.noecho() #screen.notimeout(1) try: choice = menu_table( ss, screen, lnum, curwin, curlay, layinfo, laytable, pos_start[0], pos_start[1], height, ) if requirecleanup_lay and choice == lnum: choice = curlay except Exception: import traceback traceback.print_exc(file=sys.stderr) choice = curlay ret = 1 curses.endwin() if NO_END: from util import remove remove(lock_and_com_file) if requirecleanup_lay: ss.command_at(False, 'eval "layout select %s" "layout remove %s" "at \"%s\#\" kill" "layout title"' % (choice, lnum, wnum)) elif requirecleanup_win: ss.command_at(False, 'eval "select %s" "layout select %s" "at \"%s\#\" kill" "layout title"' % (curwin, choice, wnum)) else: ss.command_at(False, 'eval "layout select %s" "layout title"' % choice) return ret
def gen_all_windows_full(session, datadir, reverse=False, sort=False): from ScreenSaver import ScreenSaver import string ss = ScreenSaver(session) tfile = os.path.join(datadir, 'winlist') if sort: linesource = list(open(tfile, "r").readlines()) if reverse: linesource.sort(lambda b, a: cmp(int(a.split(" ", 1)[0]), int(b.split(" ", 1)[0]))) else: linesource.sort(lambda a, b: cmp(int(a.split(" ", 1)[0]), int(b.split(" ", 1)[0]))) elif reverse: linesource = reversed(open(tfile, "r").readlines()) else: linesource = open(tfile, "r") for line in linesource: try: (cwin, cgroupid, ctty, ctitle) = line.strip().split(" ", 3) except: (cwin, cgroupid, ctty) = line.strip().split(" ") ctitle = None (cwin, ctime, cgroup, ctype, ctitle, cfilter, cscroll, cmdargs) = \ list(map(string.strip, open(os.path.join(datadir, 'win_' + cwin), "r").readlines())) if ctty[0] == 'z': # zombie ctypeid = -1 elif ctype[0] == 'g': # group ctypeid = 1 elif ctype[0] == 't': # telnet ctypeid = 2 else: # basic ctypeid = 0 try: (cgroupid, cgroup) = cgroup.split(" ") except: cgroup = ss.none_group yield ( cwin, cgroupid, cgroup, ctty, ctypeid, ctype, ctitle, cfilter, cscroll, ctime, cmdargs, )
input=os.readlink(os.path.join(home,projectsdir,input)).rsplit('__',1)[0] except: out("No recent session to load") doexit("Aborting",waitfor) if not output: if current_session: output = current_session else: out("for loading you must specify target Screen session PID as --out") doexit("Aborting",waitfor) pid = output savedir = input scs=ScreenSaver(pid,projectsdir,savedir) if idle: d_args_d=('-I','-i','--current-session','--idle','--in') nargv=[] bSkipNext=False for arg in sys.argv: if arg in d_args_d: bSkipNext=True elif bSkipNext: bSkipNext=False else: if not arg.startswith('logpipe'): nargv.append(arg) nargv[0]=util.which('screen-session')[0] scscall=nargv.pop(0)
def nest_layout(session, src_layuot, dst_layout): src_dumpfile = os.path.join(tmpdir_source, 'nest_layout-dump-%d' % os.getpid()) if not os.path.exists(tmpdir_source): os.makedirs(tmpdir_source) scs = ScreenSaver(session) print('layouts src: %s dst: %s' % (src_layout, dst_layout)) regions_file_dst = regions_file = sc.dumpscreen_layout(scs.pid) regions_dst = sc.get_regions(regions_file) dst_focusminsize = "%s %s" % (regions_dst.focusminsize_x, regions_dst.focusminsize_y) dst_rsize = (int(regions_dst.regions[regions_dst.focus_offset][1]), int(regions_dst.regions[regions_dst.focus_offset][2])) dst_term_size = (int(regions_dst.term_size_x), int(regions_dst.term_size_y)) scs.layout('select %s' % src_layout, False) scs.layout('dump %s' % src_dumpfile, False) regions_file_src = sc.dumpscreen_layout(scs.pid) regions_src = sc.get_regions(regions_file_src) src_term_size = (int(regions_src.term_size_x), int(regions_src.term_size_y)) print ('dst_rsize: %s' % str(dst_rsize)) print ('src_term_size: %s' % str(src_term_size)) scs.layout('select %s' % dst_layout, False) regions_new = sc.Regions() regions_new.focus_offset = regions_dst.focus_offset + regions_src.focus_offset regions_new.term_size_x = regions_dst.term_size_x regions_new.term_size_y = regions_dst.term_size_y regions_new.focusminsize_x = regions_dst.focusminsize_x regions_new.focusminsize_y = regions_dst.focusminsize_y regions_new.regions = regions_dst.regions[:regions_dst.focus_offset] for (window, sizex, sizey) in regions_src.regions: print('SRC REGION' + str((window,sizex,sizey))) x = (int(sizex) * dst_rsize[0]) / src_term_size[0] y = (int(sizey) * dst_rsize[1]) / src_term_size[1] print( '%s * %d / %d = %d' % (sizex, dst_rsize[0], src_term_size[0], x)) print( '%s * %d / %d = %d' % (sizey, dst_rsize[1], src_term_size[0], y)) regions_new.regions.append((window, str(x), str(y))) regions_new.regions = regions_new.regions + regions_dst.regions[regions_dst.focus_offset+1:] print('destination regions: '+ str(regions_dst.regions)) print('source regions: ' + str(regions_src.regions)) print('new regions: ' + str(regions_new.regions)) sc.layout_begin(session) sc.layout_load_dump(open(src_dumpfile, 'r')) sc.layout_load_regions(regions_new, None, dst_term_size[0], dst_term_size[1]) sc.layout_end() remove(src_dumpfile) remove(regions_file_dst) remove(regions_file_src) sc.cleanup()
lastmod_date = time.localtime(stats.st_mtime) date_file_tuple = (lastmod_date, f) layhist.redo.append(date_file_tuple) layhist.redo.sort(reverse = True) layhist.current = glob.glob(os.path.join(tdir, 'L*')) return layhist pass if __name__ == '__main__': mode = (sys.argv)[1] session = (sys.argv)[2] ss = ScreenSaver(session) layout = ss.get_layout_number()[0] setup_dirs(session, layout) if mode in ('undo', 'redo'): try: targ = int((sys.argv)[3]) except: targ = 1 if mode == 'undo': targ = -targ layhist = get_layout_history(session, layout) try:
def run(psession): if not os.path.exists(tmpdir): os.makedirs(tmpdir) #files may get deleted by screen-session need to prevent fifoname=os.path.join(tmpdir,'___internal_manager_logic_%s'%os.getpid()) fifoname2=os.path.join(tmpdir,'___internal_manager_ui2_%s'%os.getpid()) last_session=None if not os.path.exists(fifoname): os.mkfifo(fifoname) if not os.path.exists(fifoname2): os.mkfifo(fifoname2) while True: sys.stderr.write('priming..\n') session=prime(fifoname) session_pid=session.split('.',1)[0] fifoname_access=os.path.join(tmpdir,'__manager_'+session_pid) os.symlink(fifoname,fifoname_access) scs=ScreenSaver(session,'/dev/null','/dev/null') #scs.command_at(False , 'bindkey ^[T exec sh -c "echo \'focus\' >> %s"'%fifoname_access) scs.command_at(False, 'eval \'title \"command window\"\' \'zombie cr\' \'rendition so ky\' \'caption string \"%?%F%{kr}%?%t\"\' \'hardstatus lastline \"GNU Screen session manager\"\' \'bindkey ^[t focus next\' \'escape ^Gg\' \'defmousetrack on\'') scs.source(os.path.join(HOME,'.screenrc_MANAGER')) data=mmap.mmap(-1,100) pid=os.fork() if pid==0: command=logic(scs,fifoname,fifoname2,session,psession,last_session) for i,c in enumerate(command): data[i]=c break else: attach_session(session) os.waitpid(pid,0) try: os.remove(fifoname_access) except: pass command=data.readline().strip() options,command=command.split(';;;',1) options=options.split(';') command=command.split(';') if len(options)>0: tui=int(options[0]) psession=options[1] last_session=options[2] if command[0]=='enter': print ("entering \"%s\""%(command[1])) #os.execvp('screen',['-x',command[1]]) attach_session(command[1]) elif command[0]=='restart': print('restarting...') pass elif command[0]=='new': cmd='screen -m %s'%command[1] print ("creating session: [%s]"%(cmd)) os.popen(cmd) else: try: os.remove(fifoname) except: pass try: os.remove(fifoname2) except: pass break pass
regions_new.regions.append((window, str(x), str(y))) regions_new.regions = regions_new.regions + regions_dst.regions[regions_dst.focus_offset+1:] print('destination regions: '+ str(regions_dst.regions)) print('source regions: ' + str(regions_src.regions)) print('new regions: ' + str(regions_new.regions)) sc.layout_begin(session) sc.layout_load_dump(open(src_dumpfile, 'r')) sc.layout_load_regions(regions_new, None, dst_term_size[0], dst_term_size[1]) sc.layout_end() remove(src_dumpfile) remove(regions_file_dst) remove(regions_file_src) sc.cleanup() if __name__ == '__main__': logfile = os.path.join(tmpdir, '___log_nest-layout') sys.stdout = open(logfile, 'w') sys.stderr = sys.stdout session = (sys.argv)[1] src_layout = (sys.argv)[2] scs = ScreenSaver(session) dst_layout = scs.get_layout_number()[0] nest_layout(session, src_layout, dst_layout)
def main(): global tui sys.stderr.write('starting..\n') if(sys.argv)==0: print('Usage: program [p|ui|ui2] [session or named pipe]') if sys.argv[1]=='p': try: psession=sys.argv[2] except: psession=None tmpdir=os.path.join(tempfile.gettempdir(),'screen-sessions-'+pwd.getpwuid(os.geteuid())[0] ) if not os.path.exists(tmpdir): os.makedirs(tmpdir) #files may get deleted by screen-session need to prevent fifoname=os.path.join(tmpdir,'__manager_%s_ui'%os.getpid()) fifoname2=os.path.join(tmpdir,'__manager_%s_ui2'%os.getpid()) last_session=None if not os.path.exists(fifoname): os.mkfifo(fifoname) if not os.path.exists(fifoname2): os.mkfifo(fifoname2) while True: sys.stderr.write('priming..\n') session=prime(fifoname) scs=ScreenSaver(session,'/dev/null','/dev/null') scs.command_at('rendition so ky') scs.command_at('bindkey ^[t focus prev') scs.command_at('bindkey ^[T focus prev') scs.source(os.path.join(os.getenv('HOME'),'.screenrc_MANAGER')) data=mmap.mmap(-1,100) #pipeout = os.open(fifoname, os.O_WRONLY) #os.write(pipeout,'%s\n'%'help') pid=os.fork() if pid==0: command=logic(scs,fifoname,fifoname2,session,psession,last_session) for i,c in enumerate(command): data[i]=c break else: attach_session(session) os.waitpid(pid,0) command=data.readline().strip() options,command=command.split(';;;',1) options=options.split(';') command=command.split(';') ''' for m in command: print('[]%d|mode=%s'%(len(m),m ''' tui=int(options[0]) psession=options[1] last_session=options[2] if command[0]=='enter': print ("entering \"%s\""%(command[1])) attach_session(command[1]) elif command[0]=='restart': print('restarting...') pass elif command[0]=='new': cmd='screen -m %s'%command[1] print ("creating session: [%s]"%(cmd)) os.popen(cmd) else: try: os.remove(fifoname) except: pass try: os.remove(fifoname2) except: pass break elif sys.argv[1]=='ui': fifoname=sys.argv[2] ui1(fifoname) elif sys.argv[1]=='ui2': fifoname=sys.argv[2] ui2(fifoname)
def eval_command(scs,command,last_session,psession): command=command.split(' ',1) mode=command[0] if len(command)>1: args=[] for arg in command[1].split(' '): args.append(arg) else: args=[''] #print2ui('command: %s args: %s'%(command,str(args))) if mode.startswith('a'): # attach return tui_attach_session(scs,args[0],psession) if mode.startswith('d'): # deselect print2ui('LOGIC: deselecting' ) scs.focus('bottom') scs.select('-') scs.focus('top') return None,'\0' elif mode=='kill': if last_session: print2ui('LOGIC: killing session \"%s\"'%last_session) scs=ScreenSaver(last_session,'/dev/null','/dev/null') scs.quit() elif mode.startswith('q'): # quit print2ui('LOGIC: quiting...' ) return 'quit',None elif mode.startswith('h'): # help usage() elif mode.startswith('e'): # enter return 'enter',None elif mode=='restart': # restart print2ui('LOGIC: restarting') return 'restart',None elif mode.startswith('r'): # refresh print2ui('LOGIC: refreshing') elif mode.startswith('l'): # layout global tui print2ui('LOGIC: toggling layout') scs.focus('bottom') cnum=scs.get_number_and_title()[0] scs.focus('top') if tui!=maxtui: tui+=1 else: tui=1 reset_tui(scs) if int(cnum)>1: scs.focus('bottom') scs.select(cnum) scs.focus('top') elif mode.startswith('w'): # wipe print2ui('LOGIC: wiping out dead sessions') scs.wipe() elif mode.startswith('save'): # save if args[0]: arg_out='%s'%args[0] else: arg_out='%s'%last_session print2ui('LOGIC: saving session as %s'%arg_out) os.popen('screen-session save --force --log /dev/null --in \"%s\" --out \"%s\"'%(last_session,arg_out)) elif mode.startswith('s'): # screen if args and len(args[0])>0: arg=" ".join(["%s"%v for v in args]) else: arg=' ' cmd='screen -d -m %s'%arg print2ui('LOGIC: creating new session: [%s]'%(cmd.strip())) l1=sc.get_session_list() os.popen(cmd) l2=sc.get_session_list() newsession=sc.find_new_session(l1,l2) return tui_attach_session(scs,newsession,psession) elif mode.startswith('n'): # name if last_session: print2ui('LOGIC: renaming session to \"%s\"'%args[0]) if scs.sessionname() == last_session: scs_target=scs else: scs_target=ScreenSaver(last_session,'/dev/null','/dev/null') nsessionname=scs_target.sessionname(args[0]) print2ui('LOGIC: new sessionname is now [%s]'%nsessionname) scs.focus('bottom') cnum=scs.get_number_and_title()[0] if (psession and psession==last_session): psession=nsessionname print2ui('LOGIC: parent session is now [%s]'%nsessionname) elif nsessionname==scs.sessionname(): print2ui('LOGIC: THIS is session [%s]'%nsessionname) else: scs.screen('screen -x \"%s\"'%nsessionname) scs.title(nsessionname) if int(cnum)>1: #print2ui('LOGIC: killing window \"%s\"'%cnum) scs.kill(cnum) scs.focus('top') return None,nsessionname,psession else: print2ui('LOGIC: no such command')
session = (sys.argv)[1] newlay = (sys.argv)[2] == '1' and True or False newwin = (sys.argv)[3] == '1' and True or False s_no_end = (sys.argv)[4] no_end = (sys.argv)[4] == '1' and True or False select_other = (sys.argv)[5] == '1' and True or False title_width = int((sys.argv)[6]) autosearch = (sys.argv)[7] layout_checkpoint = (sys.argv)[8] == '1' and True or False try: height = int((sys.argv)[9]) except: height = 0 ss = ScreenSaver(session) if no_end: lock_and_com_file = os.path.join(lltmpdir, '%s' % session.split('.', 1)[0]) if os.path.exists(lock_and_com_file): try: f = open(lock_and_com_file, 'r') pid = f.readline().strip() tmpwin = f.readline().strip() tmplay = f.readline().strip() cwin = f.readline().strip() if tmpwin != '-1': cwin = ss.get_number_and_title()[0] else: cwin = '-1' clay = f.readline().strip()
def eval_command(scs, command, last_session, psession, fifoname2, ui_pid): global menu_tmp_last_selection global tui command = command.split(" ", 1) mode = command[0] if len(command) > 1: args = [] for arg in command[1].split(" "): args.append(arg) else: args = [""] #print2ui('pid: %d command: %s args: %s'%(ui_pid,command,str(args))) #print2ui('trying to send SIGINT to %s'% type(ui_pid)) #os.kill(ui_pid, signal.SIGINT) if mode.startswith('a'): # attach return tui_attach_session(scs, args[0], psession) if mode.startswith('d'): # deselect scs.focus('bottom') scs.select('-') scs.focus('top') return (None, '\0') elif mode == 'kill' or mode == 'K': if last_session: menu_tmp_last_selection = -1 print2ui('LOGIC: killing session \"%s\"' % last_session) scst = ScreenSaver(last_session) scst.quit() scs.focus('top') elif mode.startswith('p'): # print print2ui((" ").join(["%s" % v for v in args])) elif mode.startswith('q'): # quit print2ui('LOGIC: quiting...') return ("quit", '\0') elif mode.startswith('h') or mode == '?': # help scs.focus('bottom') cnum = scs.get_number_and_title()[0] if int(cnum) > 2: #print2ui('LOGIC: killing window \"%s\"'%cnum) scs.kill(cnum) #scs.command_at(False,'eval "select 2" "focus top"') scs.select('2') #scs.screen('sh -c "screen-session help manager | less"') scs.focus('top') elif mode.startswith('e'): # enter return ("enter", None) elif mode == 'restart': # restart print2ui('LOGIC: restarting') return ('restart', None) elif mode.startswith('f'): # focus top|bottom global tui_focus if tui_focus == 0: scs.focus('bottom') tui_focus = 1 print2ui('LOGIC: focus bottom') else: scs.focus('top') tui_focus = 0 print2ui('LOGIC: focus top') elif mode.startswith('r'): # refresh print2ui('LOGIC: refreshing') elif mode.startswith('l'): # layout print2ui('LOGIC: toggling layout') scs.focus('bottom') cnum = scs.get_number_and_title()[0] scs.focus('top') if tui != maxtui: tui += 1 else: tui = 1 reset_tui(scs) if int(cnum) > 1: scs.focus('bottom') scs.select(cnum) scs.focus('top') elif mode.startswith('L'): # layout print2ui('LOGIC: toggling layout') scs.focus('bottom') cnum = scs.get_number_and_title()[0] scs.focus('top') if tui != 1: tui -= 1 else: tui = maxtui reset_tui(scs) if int(cnum) > 1: scs.focus('bottom') scs.select(cnum) scs.focus('top') elif mode.startswith('w'): # wipe print2ui('LOGIC: wiping out dead sessions') menu_tmp_last_selection = -1 scs.wipe() elif mode.startswith('save') or mode == 'S': # save if args[0]: arg_out = "%s" % args[0] else: arg_out = "%s" % last_session print2ui('LOGIC: saving session as %s' % arg_out) os.system('screen-session save -S \"%s\" --force --log \"%s\" \"%s\" 1>&- 2>&-' % (last_session, fifoname2, arg_out)) elif mode.startswith('s'): # screen if args and len(args[0]) > 0: arg = (" ").join(["%s" % v for v in args]) else: arg = " " cmd = SCREEN + ' -d -m %s' % arg print2ui('LOGIC: creating a new session: [%s]' % cmd.strip()) l1 = sc.get_session_list() os.popen(cmd) l2 = sc.get_session_list() newsession = sc.find_new_session(l1, l2) menu_tmp_last_selection = newsession print2ui('LOGIC: "%s"' % menu_tmp_last_selection) return tui_attach_session(scs, newsession, psession) elif mode.startswith('n'): # name if last_session: print2ui('LOGIC: renaming session to \"%s\"' % args[0]) if scs.sessionname() == last_session: scs_target = scs else: scs_target = ScreenSaver(last_session, '/dev/null', '/dev/null') nsessionname = scs_target.sessionname(args[0]) print2ui('LOGIC: new sessionname is now [%s]' % nsessionname) scs.focus('bottom') cnum = scs.get_number_and_title()[0] if psession and psession == last_session: psession = nsessionname print2ui('LOGIC: parent session is now [%s]' % nsessionname) elif nsessionname == scs.sessionname(): print2ui('LOGIC: THIS is session [%s]' % nsessionname) else: scs.screen(SCREEN + ' -x \"%s\"' % nsessionname) scs.title(nsessionname) if int(cnum) > 1: #print2ui('LOGIC: killing window \"%s\"'%cnum) scs.kill(cnum) scs.focus('top') return (None, nsessionname, psession) elif mode == 'pid': return ('pid', int(args[0])) else: print2ui('LOGIC: no such command')
def run(psession): signal.signal(signal.SIGINT, handler) if not os.path.exists(tmpdir): os.makedirs(tmpdir) #files may get deleted by screen-session need to prevent fifoname = os.path.join(tmpdir, '___internal_manager_logic_%s' % os.getpid()) fifoname2 = os.path.join(tmpdir, '___internal_manager_ui2_%s' % os.getpid()) last_session = None if not os.path.exists(fifoname): os.mkfifo(fifoname) if not os.path.exists(fifoname2): os.mkfifo(fifoname2) while True: sys.stderr.write('priming..\n') session = prime(fifoname) session_pid = session.split('.', 1)[0] fifoname_access = os.path.join(tmpdir, '__manager_' + session_pid) os.symlink(fifoname, fifoname_access) scs = ScreenSaver(session, '/dev/null', '/dev/null') scs.command_at(False, 'setenv SCS_FIFO_ACCESS \"%s\"' % fifoname_access) scs.source(os.path.join(os.path.split(os.path.abspath(__file__))[0], 'screenrc_MANAGER')) #scs.source(os.path.join(HOME,'.screenrc_MANAGER')) data = mmap.mmap(-1, 100) pid = os.fork() if pid == 0: command = logic(scs, fifoname, fifoname2, session, psession, last_session) try: for (i, c) in enumerate(command): data[i] = c break except: pass else: attach_session(session) os.waitpid(pid, 0) try: os.remove(fifoname_access) except: pass command = data.readline().strip() (options, command) = command.split(';;;', 1) options = options.split(';') command = command.split(';') if len(options) > 0: tui = int(options[0]) psession = options[1] last_session = options[2] if command[0] == "enter": print "entering \"%s\"" % command[1] #os.execvp('screen',['-x',command[1]]) #os.system(SCREEN+' -x \"%s\"'%(command[1])) attach_session(command[1]) elif command[0] == 'restart': print 'restarting...' pass elif command[0] == 'new': cmd = SCREEN + ' -m %s' % command[1] print "creating session: [%s]" % cmd os.popen(cmd) else: try: os.remove(fifoname) except: pass try: os.remove(fifoname2) except: pass break pass