From 541f6b989347c819bcedcd4ee4e9dd47acd19dfa Mon Sep 17 00:00:00 2001 From: kraxel Date: Mon, 3 Jul 2006 14:27:24 +0000 Subject: screen window switching tweaks --- xenscreen.c | 77 +++++++++++++++++++++++++++++++++++++++---------------------- xenscreenrc | 17 ++++++++++---- 2 files changed, 62 insertions(+), 32 deletions(-) diff --git a/xenscreen.c b/xenscreen.c index 3ad5868..c8cbad0 100644 --- a/xenscreen.c +++ b/xenscreen.c @@ -13,7 +13,8 @@ /* ------------------------------------------------------------- */ -#define BUFSIZE 64 +#define BUFSIZE 64 +#define PRE_STATE "%16s: " struct dom { int domid; @@ -26,8 +27,8 @@ struct dom { static LIST_HEAD(doms); static int domcnt; -static char *screenrc = "/etc/xen/xenscreenrc"; -//static char *screenrc = "/home/kraxel/projects/xenwatch/xenscreenrc"; +//static char *screenrc = "/etc/xen/xenscreenrc"; +static char *screenrc = "/home/kraxel/projects/xenwatch/xenscreenrc"; static char *screen_session = "xencon"; static char *screen_title = "watch"; @@ -69,7 +70,7 @@ static void catchsig(int sig) termsig = sig; } -static void try_attach_screen(struct dom *dom) +static void try_attach_screen(struct dom *dom, int boot) { int rc; @@ -80,8 +81,8 @@ static void try_attach_screen(struct dom *dom) if (!strlen(dom->tty)) return; - fprintf(stderr," conn: %s (%d) @ %s\n", - dom->name, dom->domid, dom->tty); + fprintf(stderr, PRE_STATE "%s (%d) @ %s\n", + "connecting", dom->name, dom->domid, dom->tty); if (0 != access(dom->tty, R_OK)) { fprintf(stderr, " error: no access to tty %s\n", dom->tty); @@ -106,10 +107,11 @@ static void try_attach_screen(struct dom *dom) * Better would be to not switch in the first place, * seems screen can't do that though :-( */ - rc = run_application(1, "screen", "screen", - "-X", "-S", screen_session, - "other", - NULL); + if (!boot) + rc = run_application(1, "screen", "screen", + "-X", "-S", screen_session, + "other", + NULL); #endif dom->connected = 1; @@ -120,8 +122,8 @@ static void try_release_domain(struct dom *dom) { if (!dom->destroyed) return; - fprintf(stderr," gone: %s (%d)%s\n", dom->name, dom->domid, - dom->connected ? " [conn]" : ""); + fprintf(stderr, PRE_STATE "%s (%d)%s\n", "disappeared", + dom->name, dom->domid, dom->connected ? " [conn]" : ""); if (dom->connected) domcnt--; list_del(&dom->next); @@ -157,18 +159,27 @@ int main(int argc, char *argv[]) if (0 == rc) exit(0); /* failing that, start a new screen session */ - rc = run_application(1,"screen", "screen", - "-d", "-m", - "-S", screen_session, - "-c", screenrc, - "-t", screen_title, argv[0], - NULL); + if (0 != access(screenrc, R_OK)) + screenrc = "/dev/null"; execlp("screen", "screen", "-S", screen_session, - "-r", "-p", "=", + "-c", screenrc, + "-t", screen_title, argv[0], NULL); perror("execlp(screen)"); exit(1); + + } else if (0 != access(screenrc, R_OK)) { + /* no screenrc: minimum setup (status line only) */ + rc = run_application(1, "screen", "screen", + "-X", "-S", screen_session, + "sorendition", "=s", "wb", + NULL); + rc = run_application(1, "screen", "screen", + "-X", "-S", screen_session, + "hardstatus", "lastline", + "%{=b bw} xen |%{-} %-w%{= yb} %50>%n* %t %{-}%+w%<", + NULL); } /* setup signal handler */ @@ -201,7 +212,7 @@ int main(int argc, char *argv[]) vec = xs_directory(xenstore, xst, "/local/domain", &count); xs_transaction_end(xenstore, xst, 0); - fprintf(stderr,"looking for existing domains ...\n"); + fprintf(stderr,"looking for existing domains\n"); for (i = 0; i < count; i++) { domid = atoi(vec[i]); dom = get_dom(domid); @@ -209,11 +220,19 @@ int main(int argc, char *argv[]) xenstore_read(xenstore, path, dom->name, sizeof(dom->name)); snprintf(path, sizeof(path), "/local/domain/%d/console/tty", domid); xenstore_read(xenstore, path, dom->tty, sizeof(dom->tty)); - try_attach_screen(dom); + try_attach_screen(dom, 1); } + rc = run_application(1, "screen", "screen", + "-X", "-S", screen_session, + "select", "0", + NULL); + rc = run_application(1, "screen", "screen", + "-X", "-S", screen_session, + "windowlist", "-b", + NULL); /* main loop */ - fprintf(stderr,"... done, watching out for new changes now.\n"); + fprintf(stderr,"ok, watching out for changes now\n"); for (;;) { if (termsig) { if (!domcnt) @@ -222,9 +241,13 @@ int main(int argc, char *argv[]) break; fprintf(stderr, "\n" - "Still %d domain(s) active - not quitting.\n" - "Better try detach instead (Ctrl-A d).\n" - "Hit Ctrl-C within 3 secs again to quit nevertheless.\n" + "Got ^C - still %d domain(s) active - not quitting.\n" + "\n" + "You should better use detach instead (^A d).\n" + "Or kill all windows (^A \\) if you don't want\n" + "keep screen hanging around.\n" + "\n" + "Hit ^C within 3 secs again to quit nevertheless.\n" "\n", domcnt); last_ctrl_c = time(NULL); @@ -277,14 +300,14 @@ int main(int argc, char *argv[]) if (0 != rc) continue; strcpy(dom->name, value); - fprintf(stderr," boot: %s (%d)\n", dom->name, dom->domid); + fprintf(stderr, PRE_STATE "%s (%d)\n", "new domain", dom->name, dom->domid); } else { continue; } - try_attach_screen(dom); + try_attach_screen(dom, 0); try_release_domain(dom); } return 0; diff --git a/xenscreenrc b/xenscreenrc index df9bcbb..33683ad 100644 --- a/xenscreenrc +++ b/xenscreenrc @@ -1,15 +1,22 @@ multiuser on + +# status line +sorendition =s wb +hardstatus lastline "%{=b bw} xen |%{-} %-w%{= yb} %50>%n* %t %{-}%+w%<" + +# disable killing windows +bind k +bind K +bind ^K + +# misc settings shell /bin/bash defscrollback 5000 compacthist on defutf8 on termcapinfo xterm hs@ -# status line -hardstatus alwayslastline "%{=b bw} xen |%{-} %-w%{= yb} %50>%n* %t %{-}%+w%<" -sorendition =s wb - -# log files +# for log files #logfile /var/log/screen/screenlog.%t #logtstamp on -- cgit