summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--ChangeLog25
-rw-r--r--contrib/rpshowall.sh24
-rw-r--r--doc/ratpoison.texi4
-rw-r--r--src/actions.c1
-rw-r--r--src/communications.c11
-rw-r--r--src/communications.h2
-rw-r--r--src/events.c2
-rw-r--r--src/main.c36
-rw-r--r--src/ratpoison.h7
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 <rupert.debian@hotpop.com>
Tim Goodwin <tjg@star.le.ac.uk>
Joshua Neuheisel <jneuheisel@msn.com>
Thien-Thi Nguyen <ttn@glug.org>
+Joshua Neuheisel <jneuheisel@msn.com>
diff --git a/ChangeLog b/ChangeLog
index ed60655..86bc9de 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,28 @@
+2003-11-17 Shawn Betts <sabetts@vcn.bc.ca>
+
+ * 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 <rcyeske@vcn.bc.ca>
* 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 <cantsin@zedat.fu-berlin.de>
-
+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,7 +290,8 @@ print_help ()
printf ("-v, --version Display the version\n");
printf ("-d, --display <dpy> Set the X display to use\n");
printf ("-s, --screen <num> Only use the specified screen\n");
- printf ("-c, --command <cmd> Send ratpoison a colon-command\n\n");
+ printf ("-c, --command <cmd> 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");
@@ -297,6 +299,15 @@ print_help ()
}
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)
{
size_t n = 256;
@@ -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<cmd_count; i++)
{
if (screen_arg)
- send_command (command[i], screen_num);
+ send_command (interactive, command[i], screen_num);
else
- send_command (command[i], -1);
+ send_command (interactive, command[i], -1);
free (command[i]);
}
diff --git a/src/ratpoison.h b/src/ratpoison.h
index 5d4bd7b..0a9719e 100644
--- a/src/ratpoison.h
+++ b/src/ratpoison.h
@@ -30,6 +30,12 @@
#include <stdio.h>
#include <stdarg.h>
#include <X11/Xlib.h>
+#include <fcntl.h>
+
+/* 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);