Index: src/actions.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/actions.c,v retrieving revision 1.164 diff -u -r1.164 actions.c --- src/actions.c 17 May 2003 10:11:05 -0000 1.164 +++ src/actions.c 18 May 2003 08:47:20 -0000 @@ -43,6 +43,7 @@ {"curframe", cmd_curframe, arg_VOID}, {"delete", cmd_delete, arg_VOID}, {"echo", cmd_echo, arg_STRING}, + {"echo_exec", cmd_echo_exec, arg_STRING}, {"escape", cmd_escape, arg_STRING}, {"exec", cmd_exec, arg_STRING}, {"focus", cmd_next_frame, arg_VOID}, @@ -1075,6 +1076,58 @@ { kill_signalled = 1; return NULL; +} + +#define REALLOC_SIZE 100 + +/* Print the first line of output from an executed function */ +char * +cmd_echo_exec (int interactive, char *data) +{ + FILE *f; + char *msg, *cur; + int size = REALLOC_SIZE, r, read_size; + + f = popen(data, "r"); + if (f < 0) { + marked_message_printf (0, 0, " Couldn't execute %s ", data); + } + + cur = msg = malloc(size); + read_size = size; + while(1) { + r = fread(cur, sizeof(char), REALLOC_SIZE, f); + if (r < read_size) { + if (feof(f)) { + /* NULL Terminate it */ + if (cur[r-1] == '\n') + cur[r-1] = '\0'; + else + cur[r] = '\0'; + marked_message_printf(0, 0, "%s", msg); + } else { + if (errno == EINTR) { + clearerr(f); + cur += r; + read_size -=r; + continue; + } + marked_message_printf(0, 0, + " Error reading stdin: %s ", + strerror(errno)); + } + break; + } else { + size += REALLOC_SIZE; + msg = realloc(msg, size); + cur = msg + size - REALLOC_SIZE; + read_size = REALLOC_SIZE; + } + } + free(msg); + pclose(f); + + return NULL; } /* Show the current time on the bar. Thanks to Martin Samuelsson Index: src/actions.h =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/actions.h,v retrieving revision 1.60 diff -u -r1.60 actions.h --- src/actions.h 16 May 2003 23:25:07 -0000 1.60 +++ src/actions.h 18 May 2003 08:47:20 -0000 @@ -67,6 +67,7 @@ char *cmd_defwinname (int interactive, char *data); char *cmd_delete (int interactive, char *data); char *cmd_echo (int interactive, char *data); +char *cmd_echo_exec (int interactive, char *data); char *cmd_escape (int interactive, char *data); char *cmd_exec (int interactive, char *data); char *cmd_fdump (int interactively, char *data); Index: src/bar.c =================================================================== RCS file: /cvsroot/ratpoison/ratpoison/src/bar.c,v retrieving revision 1.37 diff -u -r1.37 bar.c --- src/bar.c 15 May 2003 06:57:10 -0000 1.37 +++ src/bar.c 18 May 2003 08:47:20 -0000 @@ -190,7 +190,7 @@ buffer = xvsprintf (fmt, ap); va_end (ap); - marked_message (buffer, mark_start, mark_end); + marked_wrapped_message (buffer, mark_start, mark_end); free (buffer); }