diff options
Diffstat (limited to 'src/communications.c')
-rw-r--r-- | src/communications.c | 155 |
1 files changed, 0 insertions, 155 deletions
diff --git a/src/communications.c b/src/communications.c deleted file mode 100644 index 76f3b98..0000000 --- a/src/communications.c +++ /dev/null @@ -1,155 +0,0 @@ -/* communications.c -- Send commands to a running copy of ratpoison. - * Copyright (C) 2000, 2001, 2002, 2003, 2004 Shawn Betts <sabetts@vcn.bc.ca> - * - * This file is part of ratpoison. - * - * ratpoison is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ratpoison is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - */ - -#include <X11/X.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xatom.h> -#include <X11/Xproto.h> - -#include <string.h> - -#include "ratpoison.h" - - -/* Sending commands to ratpoison */ -static int -receive_command_result (Window w) -{ - int query; - int return_status = RET_FAILURE; - Atom type_ret; - int format_ret; - unsigned long nitems; - unsigned long bytes_after; - unsigned char *result = NULL; - - /* First, find out how big the property is. */ - query = XGetWindowProperty (dpy, w, rp_command_result, - 0, 0, False, xa_string, - &type_ret, &format_ret, &nitems, &bytes_after, - &result); - - /* Failed to retrieve property. */ - if (query != Success || result == NULL) - { - PRINT_DEBUG (("failed to get command result length\n")); - return return_status; - } - - /* XGetWindowProperty always allocates one extra byte even if - the property is zero length. */ - XFree (result); - - /* Now that we have the length of the message, we can get the - whole message. */ - query = 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); - - /* Failed to retrieve property. */ - if (query != Success || result == NULL) - { - PRINT_DEBUG (("failed to get command result\n")); - return return_status; - } - - /* - * We can receive: - * - an empty string, indicating a success but no output - * - a string starting with '1', indicating a success and an output - * - a string starting with '0', indicating a failure and an optional output - */ - switch (result[0]) - { - case '\0': /* Command succeeded but no string to print */ - return_status = RET_SUCCESS; - break; - case '0': /* Command failed, don't print an empty line if no explanation - was given */ - if (result[1] != '\0') - fprintf (stderr, "%s\n", &result[1]); - return_status = RET_FAILURE; - break; - case '1': /* Command succeeded, print the output */ - printf ("%s\n", &result[1]); - return_status = RET_SUCCESS; - break; - default: /* We probably got junk, so ignore it */ - return_status = RET_FAILURE; - } - - /* Free the result. */ - XFree (result); - - return return_status; -} - -int -send_command (unsigned char interactive, unsigned char *cmd, int screen_num) -{ - Window w, root; - int done = 0, return_status = RET_FAILURE; - 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. */ - if (screen_num >= 0) - root = RootWindow (dpy, screen_num); - else - root = DefaultRootWindow (dpy); - - w = XCreateSimpleWindow (dpy, root, 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, (unsigned char*)sbuf_get(s), strlen ((char *)cmd) + 2); - - XChangeProperty (dpy, root, - rp_command_request, XA_WINDOW, - 8, PropModeAppend, (unsigned char *)&w, sizeof (Window)); - - sbuf_free (s); - - while (!done) - { - XEvent ev; - - XMaskEvent (dpy, PropertyChangeMask, &ev); - if (ev.xproperty.atom == rp_command_result - && ev.xproperty.state == PropertyNewValue) - { - return_status = receive_command_result(ev.xproperty.window); - done = 1; - } - } - - XDestroyWindow (dpy, w); - - return return_status; -} |