summaryrefslogtreecommitdiff
path: root/src/communications.c
diff options
context:
space:
mode:
authorsabetts <sabetts>2001-03-29 04:29:15 +0000
committersabetts <sabetts>2001-03-29 04:29:15 +0000
commiteb256cbcbed3431ec5a330fe6dcb12f75ec76c8a (patch)
treed57dd638f39dc32492f92ac86fd16c88929bc0a8 /src/communications.c
parent889c6fc041fe9af255f609ba434eceab74491e8c (diff)
downloadratpoison-eb256cbcbed3431ec5a330fe6dcb12f75ec76c8a.zip
better command functionality
Diffstat (limited to 'src/communications.c')
-rw-r--r--src/communications.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/communications.c b/src/communications.c
index f87e115..0a0194d 100644
--- a/src/communications.c
+++ b/src/communications.c
@@ -67,9 +67,69 @@ send_kill ()
}
}
+/* Sending commands to ratpoison */
+
+static void
+recieve_command_result (Window w)
+{
+ Atom type_ret;
+ int format_ret;
+ unsigned long nitems;
+ unsigned long bytes_after;
+ unsigned char *result;
+
+
+ if (XGetWindowProperty (dpy, w, rp_command_result,
+ 0, 0, False, XA_STRING,
+ &type_ret, &format_ret, &nitems, &bytes_after,
+ &result) == Success
+ &&
+ XGetWindowProperty (dpy, w, rp_command_result,
+ 0, (bytes_after / 4) + (bytes_after % 4 ? 1 : 0),
+ True, XA_STRING, &type_ret, &format_ret, &nitems,
+ &bytes_after, &result) == Success)
+ {
+ if (result)
+ {
+ printf ("%s\n", result);
+ }
+ XFree (result);
+ }
+}
+
int
send_command (unsigned char *cmd)
{
- return XChangeProperty (dpy, DefaultRootWindow (dpy), rp_command, XA_STRING,
- 8, PropModeAppend, cmd, strlen (cmd) + 1);
+ Window w;
+ int done = 0;
+
+ w = XCreateSimpleWindow (dpy, DefaultRootWindow (dpy),
+ 0, 0, 1, 1, 0, 0, 0);
+
+ // Select first to avoid race condition
+ XSelectInput (dpy, w, PropertyChangeMask);
+
+ XChangeProperty (dpy, w, rp_command, XA_STRING,
+ 8, PropModeReplace, cmd, strlen (cmd) + 1);
+
+ XChangeProperty (dpy, DefaultRootWindow (dpy),
+ rp_command_request, XA_WINDOW,
+ 8, PropModeAppend, (unsigned char *)&w, sizeof (Window));
+
+ while (!done)
+ {
+ XEvent ev;
+
+ XMaskEvent (dpy, PropertyChangeMask, &ev);
+ if (ev.xproperty.atom == rp_command_result
+ && ev.xproperty.state == PropertyNewValue)
+ {
+ recieve_command_result(ev.xproperty.window);
+ done = 1;
+ }
+ }
+
+ XDestroyWindow (dpy, w);
+
+ return 1;
}