Example #1
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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)
Example #6
0
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)
Example #7
0
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
Example #8
0
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
Example #9
0
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)
Example #10
0
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)
Example #11
0
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)
Example #12
0
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)
Example #13
0
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)
Example #14
0
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)
Example #15
0
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)
Example #16
0
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)
Example #17
0
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)
Example #18
0
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
Example #19
0
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
Example #20
0
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
Example #21
0
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
Example #22
0
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
Example #23
0
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
Example #24
0
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
Example #25
0
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
Example #26
0
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
Example #27
0
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)
Example #28
0
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)
Example #29
0
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
Example #30
0
    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()

Example #31
0
        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
Example #34
0
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,
        )
Example #35
0
                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)
Example #36
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()
Example #37
0
        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:
Example #38
0
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
Example #39
0
        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)
Example #40
0
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)
Example #41
0
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')
Example #42
0
    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()
Example #43
0
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')
Example #44
0
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