From cf7ad617d4ce46c6bac6ac28e5323ab53e3ef17b Mon Sep 17 00:00:00 2001 From: sabetts Date: Tue, 18 Nov 2003 05:06:35 +0000 Subject: * contrib/rpshowall.sh: store ratpoison binary location in RATPOISON env var. * src/ratpoison.h (FD_CLOEXEC): new define (set_close_on_exec): new prototype * src/main.c (ratpoison_longopts): add "interactive" option. (ratpoison_opts): likewise (print_help): print a help line for interactive option. (set_close_on_exec): new function (read_startup_files): call set_close_on_exec on file pointer (main): parse interactive command line option and pass it to send_command. * src/events.c (execute_remote_command): pass the interactive bit to command. * src/communications.c (send_command): send an interactive bit at the beginning of the message. Take an interactive argument. All callers updated. Prototype updated. * src/actions.c (cmd_source): call set_close_on_exec on file pointer. --- AUTHORS | 1 + ChangeLog | 25 +++++++++++++++++++++++++ contrib/rpshowall.sh | 24 +++++++++++++----------- doc/ratpoison.texi | 4 ++++ src/actions.c | 1 + src/communications.c | 11 +++++++++-- src/communications.h | 2 +- src/events.c | 2 +- src/main.c | 36 ++++++++++++++++++++++++++---------- src/ratpoison.h | 7 +++++++ 10 files changed, 88 insertions(+), 25 deletions(-) diff --git a/AUTHORS b/AUTHORS index a2bf028..747c2eb 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,3 +28,4 @@ Rupert Tim Goodwin Joshua Neuheisel Thien-Thi Nguyen +Joshua Neuheisel diff --git a/ChangeLog b/ChangeLog index ed60655..86bc9de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2003-11-17 Shawn Betts + + * contrib/rpshowall.sh: store ratpoison binary location in + RATPOISON env var. + + * src/ratpoison.h (FD_CLOEXEC): new define + (set_close_on_exec): new prototype + + * src/main.c (ratpoison_longopts): add "interactive" option. + (ratpoison_opts): likewise + (print_help): print a help line for interactive option. + (set_close_on_exec): new function + (read_startup_files): call set_close_on_exec on file pointer + (main): parse interactive command line option and pass it to + send_command. + + * src/events.c (execute_remote_command): pass the interactive bit + to command. + + * src/communications.c (send_command): send an interactive bit at + the beginning of the message. Take an interactive argument. All + callers updated. Prototype updated. + + * src/actions.c (cmd_source): call set_close_on_exec on file pointer. + 2003-11-16 Ryan Yeske * contrib/rpshowall.sh: Added file. From Florian Cramer diff --git a/contrib/rpshowall.sh b/contrib/rpshowall.sh index 2465243..b4d8570 100644 --- a/contrib/rpshowall.sh +++ b/contrib/rpshowall.sh @@ -4,33 +4,35 @@ # ratpoison script to show all open windows # 2003 Florian Cramer - +if [ -z $RATPOISON ]; then + RATPOISON=ratpoison +fi # Save current frameset -framecount=`ratpoison -c windows | wc -l | sed -e "s/[ ]*//g"` -curframe=`ratpoison -c windows | grep "^.\*" | sed -e "s/^\([0-9]*\)\*.*/\1/"` -ratpoison -c "setenv tmp `ratpoison -c 'fdump'`" +framecount=`$RATPOISON -c windows | wc -l | sed -e "s/[ ]*//g"` +curframe=`$RATPOISON -c windows | grep "^.\*" | sed -e "s/^\([0-9]*\)\*.*/\1/"` +$RATPOISON -c "setenv tmp `$RATPOISON -c 'fdump'`" # Create split view of all open windows -ratpoison -c only +$RATPOISON -c only i=2; while [ $i -le $framecount ]; do if [ $i -le `echo $framecount/2 | bc` ] ; then - ratpoison -c hsplit + $RATPOISON -c hsplit else - ratpoison -c vsplit + $RATPOISON -c vsplit fi - ratpoison -c focus - ratpoison -c focus + $RATPOISON -c focus + $RATPOISON -c focus i=$[$i+1]; done # Restore frameset -ratpoison -c "select $curframe" +$RATPOISON -c "select $curframe" echo -n "Restore window layout... " read i -ratpoison -c "frestore `ratpoison -c 'getenv tmp'`" +$RATPOISON -c "frestore `$RATPOISON -c 'getenv tmp'`" diff --git a/doc/ratpoison.texi b/doc/ratpoison.texi index 7d7eec4..6f22aff 100644 --- a/doc/ratpoison.texi +++ b/doc/ratpoison.texi @@ -1248,6 +1248,10 @@ $ ratpoison -c split -c split Here ratpoison would split the current frame twice. +@item -i, --interactive +Force ratpoison to execute commands in interactive mode. This is used +in conjuction with the @option{-c} option. + @end table @node Startup file, Command Index, Command Line Arguments, Top diff --git a/src/actions.c b/src/actions.c index 2b065e3..f547a38 100644 --- a/src/actions.c +++ b/src/actions.c @@ -736,6 +736,7 @@ cmd_source (int interactive, char *data) marked_message_printf (0, 0, " source: %s : %s ", data, strerror(errno)); else { + set_close_on_exec (fileptr); read_rc_file (fileptr); fclose (fileptr); } diff --git a/src/communications.c b/src/communications.c index 4e4e509..352a7ef 100644 --- a/src/communications.c +++ b/src/communications.c @@ -81,10 +81,15 @@ recieve_command_result (Window w) } int -send_command (unsigned char *cmd, int screen_num) +send_command (unsigned char interactive, unsigned char *cmd, int screen_num) { Window w; int done = 0; + struct sbuf *s; + + s = sbuf_new(0); + sbuf_printf(s, "%c%s", interactive, cmd); + /* If the user specified a specific screen, then send the event to that screen. */ @@ -103,12 +108,14 @@ send_command (unsigned char *cmd, int screen_num) XSelectInput (dpy, w, PropertyChangeMask); XChangeProperty (dpy, w, rp_command, XA_STRING, - 8, PropModeReplace, cmd, strlen (cmd) + 1); + 8, PropModeReplace, sbuf_get(s), strlen (cmd) + 2); XChangeProperty (dpy, DefaultRootWindow (dpy), rp_command_request, XA_WINDOW, 8, PropModeAppend, (unsigned char *)&w, sizeof (Window)); + sbuf_free (s); + while (!done) { XEvent ev; diff --git a/src/communications.h b/src/communications.h index 3bd6046..c371282 100644 --- a/src/communications.h +++ b/src/communications.h @@ -22,6 +22,6 @@ #ifndef _RATPOISON_COMMUNICATIONS_H #define _RATPOISON_COMMUNICATIONS_H 1 -int send_command (unsigned char *cmd, int screen_num); +int send_command (unsigned char interactive, unsigned char *cmd, int screen_num); #endif /* ! _RATPOISON_COMMUNICATIONS_H */ diff --git a/src/events.c b/src/events.c index 85548a4..7221883 100644 --- a/src/events.c +++ b/src/events.c @@ -446,7 +446,7 @@ execute_remote_command (Window w) } PRINT_DEBUG (("command: %s\n", req)); - result = command (0, req); + result = command (req[0], &req[1]); XFree (req); return result; diff --git a/src/main.c b/src/main.c index e44ee62..e252d75 100644 --- a/src/main.c +++ b/src/main.c @@ -48,14 +48,15 @@ static void init_screen (rp_screen *s, int screen_num); /* Command line options */ static struct option ratpoison_longopts[] = - { {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'v'}, - {"command", required_argument, 0, 'c'}, - {"display", required_argument, 0, 'd'}, - {"screen", required_argument, 0, 's'}, - {0, 0, 0, 0} }; + { {"help", no_argument, 0, 'h'}, + {"interactive", no_argument, 0, 'i'}, + {"version", no_argument, 0, 'v'}, + {"command", required_argument, 0, 'c'}, + {"display", required_argument, 0, 'd'}, + {"screen", required_argument, 0, 's'}, + {0, 0, 0, 0} }; -static char ratpoison_opts[] = "hvc:d:s:"; +static char ratpoison_opts[] = "hvic:d:s:"; void fatal (const char *msg) @@ -289,13 +290,23 @@ print_help () printf ("-v, --version Display the version\n"); printf ("-d, --display Set the X display to use\n"); printf ("-s, --screen Only use the specified screen\n"); - printf ("-c, --command Send ratpoison a colon-command\n\n"); + printf ("-c, --command Send ratpoison a colon-command\n"); + printf ("-i, --interactive Execute commands in interactive mode\n\n"); printf ("Report bugs to ratpoison-devel@lists.sourceforge.net\n\n"); exit (EXIT_SUCCESS); } +void +set_close_on_exec (FILE *fd) +{ + int fnum = fileno (fd); + int flags = fcntl (fnum, F_GETFD); + if (flags >= 0) + fcntl (fnum, F_SETFD, flags | FD_CLOEXEC); +} + void read_rc_file (FILE *file) { @@ -384,6 +395,7 @@ read_startup_files () if (fileptr) { + set_close_on_exec(fileptr); read_rc_file (fileptr); fclose (fileptr); } @@ -484,6 +496,7 @@ main (int argc, char *argv[]) int screen_arg = 0; int screen_num = 0; char *display = NULL; + unsigned char interactive = 0; myargv = argv; @@ -524,6 +537,9 @@ main (int argc, char *argv[]) screen_arg = 1; screen_num = strtol (optarg, NULL, 10); break; + case 'i': + interactive = 1; + break; default: exit (EXIT_FAILURE); @@ -549,9 +565,9 @@ main (int argc, char *argv[]) for (i=0; i #include #include +#include + +/* Some systems don't define the close-on-exec flag in fcntl.h */ +#ifndef FD_CLOEXEC +# define FD_CLOEXEC 1 +#endif /* Helper macro for error and debug reporting. */ #define PRINT_LINE(type) printf (PACKAGE ":%s:%d: %s: ",__FILE__, __LINE__, #type) @@ -82,6 +88,7 @@ extern XGCValues gv; void clean_up (); rp_screen *find_screen (Window w); +void set_close_on_exec (FILE *fd); void read_rc_file (FILE *file); void fatal (const char *msg); -- cgit v1.2.3