X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fremote.c;h=3c6e4d1e4a04c3114915c6be28cfa2e07508ab32;hb=c28aecf9fc41e3a03494bacf7279745425e2fa18;hp=e05c93e4d0ad478455d866d189dc79765e1449b8;hpb=72c1f4c1dc6ab07fe121a327ff1c30bf51ef74c1;p=xscreensaver diff --git a/driver/remote.c b/driver/remote.c index e05c93e4..3c6e4d1e 100644 --- a/driver/remote.c +++ b/driver/remote.c @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -82,7 +83,7 @@ find_screensaver_window (Display *dpy, char **version) if (parent) abort (); if (! (kids && nkids)) - abort (); + return 0; for (i = 0; i < nkids; i++) { Atom type; @@ -118,35 +119,54 @@ find_screensaver_window (Display *dpy, char **version) if (status == Success && type != None) { + Window ret = kids[i]; if (version) *version = v; - return kids[i]; + XFree (kids); + return ret; } } + + if (kids) XFree (kids); return 0; } static int send_xscreensaver_command (Display *dpy, Atom command, long arg, - Window *window_ret) + Window *window_ret, char **error_ret) { + int status = -1; char *v = 0; Window window = find_screensaver_window (dpy, &v); XWindowAttributes xgwa; + char err[2048]; if (window_ret) *window_ret = window; if (!window) { + sprintf (err, "no screensaver is running on display %s", + DisplayString (dpy)); + + if (error_ret) + { + *error_ret = strdup (err); + status = -1; + goto DONE; + } + if (command == XA_EXIT) - return 1; + { + /* Don't print an error if xscreensaver is already dead. */ + status = 1; + goto DONE; + } - /* Don't print this if xscreensaver is already dead. */ - fprintf (stderr, "%s: no screensaver is running on display %s\n", - progname, DisplayString (dpy)); - return -1; + fprintf (stderr, "%s: %s\n", progname, err); + status = -1; + goto DONE; } /* Select for property change events, so that we can read the response. */ @@ -160,17 +180,30 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, memset (&hint, 0, sizeof(hint)); if (!v || !*v) { - fprintf (stderr, "%s: version property not set on window 0x%x?\n", - progname, (unsigned int) window); - return -1; + sprintf (err, "version property not set on window 0x%x?", + (unsigned int) window); + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + + status = -1; + goto DONE; } XGetClassHint(dpy, window, &hint); if (!hint.res_class) { - fprintf (stderr, "%s: class hints not set on window 0x%x?\n", - progname, (unsigned int) window); - return -1; + sprintf (err, "class hints not set on window 0x%x?", + (unsigned int) window); + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + + if (v) free (v); + status = -1; + goto DONE; } fprintf (stdout, "%s %s", hint.res_class, v); @@ -206,9 +239,9 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, if (data) free (data); fprintf (stdout, "\n"); fflush (stdout); - fprintf (stderr, "%s: bad status format on root window.\n", - progname); - return -1; + fprintf (stderr, "bad status format on root window.\n"); + status = -1; + goto DONE; } blanked = (Atom) data[0]; @@ -245,13 +278,13 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, } if (any && nhacks == 1) - fprintf (stdout, " (hack #%d)\n", data[2]); + fprintf (stdout, " (hack #%d)\n", (int) data[2]); else if (any) { fprintf (stdout, " (hacks: "); for (i = 0; i < nhacks; i++) { - fprintf (stdout, "#%d", data[2 + i]); + fprintf (stdout, "#%d", (int) data[2 + i]); if (i != nhacks-1) fputs (", ", stdout); } @@ -268,14 +301,15 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, if (data) free (data); fprintf (stdout, "\n"); fflush (stdout); - fprintf (stderr, "%s: no saver status on root window.\n", - progname); - return -1; + fprintf (stderr, "no saver status on root window.\n"); + status = -1; + goto DONE; } } /* No need to read a response for these commands. */ - return 1; + status = 1; + goto DONE; } else { @@ -304,25 +338,37 @@ send_xscreensaver_command (Display *dpy, Atom command, long arg, event.xclient.data.l[2] = arg2; if (! XSendEvent (dpy, window, False, 0L, &event)) { - fprintf (stderr, "%s: XSendEvent(dpy, 0x%x ...) failed.\n", - progname, (unsigned int) window); - return -1; + sprintf (err, "XSendEvent(dpy, 0x%x ...) failed.\n", + (unsigned int) window); + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + status = -1; + goto DONE; } } + + status = 0; + + DONE: + if (v) free (v); XSync (dpy, 0); - return 0; + return status; } static int xscreensaver_command_response (Display *dpy, Window window, - Bool verbose_p, Bool exiting_p) + Bool verbose_p, Bool exiting_p, + char **error_ret) { int fd = ConnectionNumber (dpy); int timeout = 10; int status; fd_set fds; struct timeval tv; + char err[2048]; while (1) { @@ -335,13 +381,25 @@ xscreensaver_command_response (Display *dpy, Window window, if (status < 0) { char buf[1024]; - sprintf (buf, "%s: waiting for reply", progname); - perror (buf); + if (error_ret) + { + sprintf (buf, "error waiting for reply"); + *error_ret = strdup (buf); + } + else + { + sprintf (buf, "%s: error waiting for reply", progname); + perror (buf); + } return status; } else if (status == 0) { - fprintf (stderr, "%s: no response to command.\n", progname); + sprintf (err, "no response to command."); + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); return -1; } else @@ -376,9 +434,13 @@ xscreensaver_command_response (Display *dpy, Window window, if (exiting_p) return 0; - fprintf (stderr, - "%s: xscreensaver window unexpectedly deleted.\n", - progname); + sprintf (err, "xscreensaver window unexpectedly deleted."); + + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + return -1; } @@ -386,28 +448,38 @@ xscreensaver_command_response (Display *dpy, Window window, { if (type != XA_STRING || format != 8) { - fprintf (stderr, - "%s: unrecognized response property.\n", - progname); + sprintf (err, "unrecognized response property."); + + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + if (msg) XFree (msg); return -1; } else if (!msg || (msg[0] != '+' && msg[0] != '-')) { - fprintf (stderr, - "%s: unrecognized response message.\n", - progname); + sprintf (err, "unrecognized response message."); + + if (error_ret) + *error_ret = strdup (err); + else + fprintf (stderr, "%s: %s\n", progname, err); + if (msg) XFree (msg); return -1; } else { int ret = (msg[0] == '+' ? 0 : -1); - if (verbose_p || ret != 0) - fprintf ((ret < 0 ? stderr : stdout), - "%s: %s\n", - progname, - msg+1); + sprintf (err, "%s: %s\n", progname, msg+1); + + if (error_ret) + *error_ret = strdup (err); + else if (verbose_p || ret != 0) + fprintf ((ret < 0 ? stderr : stdout), "%s\n", err); + XFree (msg); return ret; } @@ -419,13 +491,15 @@ xscreensaver_command_response (Display *dpy, Window window, int -xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p) +xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p, + char **error_ret) { Window w = 0; - int status = send_xscreensaver_command (dpy, command, arg, &w); + int status = send_xscreensaver_command (dpy, command, arg, &w, error_ret); if (status == 0) status = xscreensaver_command_response (dpy, w, verbose_p, - (command == XA_EXIT)); + (command == XA_EXIT), + error_ret); fflush (stdout); fflush (stderr);