X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=driver%2Fxscreensaver.c;h=7b16c898aaab4d95f22aa643084ed3842b2cd772;hp=000b9d91d694b171fa0d0ded9539c75368b41669;hb=59ac4e9a0de290e4275a7bbb890ad16abd09d68f;hpb=f54438ea00f152166e68073e98000fd3a00f65cd diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 000b9d91..7b16c898 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -131,6 +131,7 @@ #include #include #include +#include /* for gethostbyname() */ #ifdef HAVE_XMU # ifndef VMS # include @@ -142,7 +143,7 @@ #endif /* !HAVE_XMU */ #ifdef HAVE_XIDLE_EXTENSION -#include +# include #endif /* HAVE_XIDLE_EXTENSION */ #include "xscreensaver.h" @@ -188,6 +189,8 @@ static XrmOptionDescRec options [] = { { "-no-mit-extension", ".mitSaverExtension",XrmoptionNoArg, "off" }, { "-sgi-extension", ".sgiSaverExtension",XrmoptionNoArg, "on" }, { "-no-sgi-extension", ".sgiSaverExtension",XrmoptionNoArg, "off" }, + { "-proc-interrupts", ".procInterrupts", XrmoptionNoArg, "on" }, + { "-no-proc-interrupts", ".procInterrupts", XrmoptionNoArg, "off" }, { "-splash", ".splash", XrmoptionNoArg, "on" }, { "-no-splash", ".splash", XrmoptionNoArg, "off" }, { "-nosplash", ".splash", XrmoptionNoArg, "off" }, @@ -214,7 +217,7 @@ do_help (saver_info *si) fflush (stdout); fflush (stderr); fprintf (stdout, "\ -xscreensaver %s, copyright (c) 1991-1998 by Jamie Zawinski \n\ +xscreensaver %s, copyright (c) 1991-1999 by Jamie Zawinski \n\ The standard Xt command-line options are accepted; other options include:\n\ \n\ -timeout When the screensaver should activate.\n\ @@ -570,7 +573,7 @@ print_banner (saver_info *si) if (p->verbose_p) fprintf (stderr, - "%s %s, copyright (c) 1991-1998 " + "%s %s, copyright (c) 1991-1999 " "by Jamie Zawinski .\n", progname, si->version); @@ -697,10 +700,13 @@ initialize_server_extensions (saver_info *si) Bool server_has_xidle_extension_p = False; Bool server_has_sgi_saver_extension_p = False; Bool server_has_mit_saver_extension_p = False; + Bool system_has_proc_interrupts_p = False; + const char *piwhy = 0; si->using_xidle_extension = p->use_xidle_extension; si->using_sgi_saver_extension = p->use_sgi_saver_extension; si->using_mit_saver_extension = p->use_mit_saver_extension; + si->using_proc_interrupts = p->use_proc_interrupts; #ifdef HAVE_XIDLE_EXTENSION server_has_xidle_extension_p = query_xidle_extension (si); @@ -711,6 +717,9 @@ initialize_server_extensions (saver_info *si) #ifdef HAVE_MIT_SAVER_EXTENSION server_has_mit_saver_extension_p = query_mit_saver_extension (si); #endif +#ifdef HAVE_PROC_INTERRUPTS + system_has_proc_interrupts_p = query_proc_interrupts_available (si, &piwhy); +#endif if (!server_has_xidle_extension_p) si->using_xidle_extension = False; @@ -746,6 +755,25 @@ initialize_server_extensions (saver_info *si) "%s: not using server's lame MIT-SCREEN-SAVER extension.\n", blurb()); } + + if (!system_has_proc_interrupts_p) + { + si->using_proc_interrupts = False; + if (p->verbose_p && piwhy) + fprintf (stderr, "%s: not using /proc/interrupts: %s.\n", blurb(), + piwhy); + } + else if (p->verbose_p) + { + if (si->using_proc_interrupts) + fprintf (stderr, + "%s: consulting /proc/interrupts for keyboard activity.\n", + blurb()); + else + fprintf (stderr, + "%s: not consulting /proc/interrupts for keyboard activity.\n", + blurb()); + } } @@ -792,7 +820,8 @@ select_events (saver_info *si) for window creation events, so that new subwindows will be noticed. */ for (i = 0; i < si->nscreens; i++) - start_notice_events_timer (si, RootWindowOfScreen (si->screens[i].screen)); + start_notice_events_timer (si, RootWindowOfScreen (si->screens[i].screen), + False); if (p->verbose_p) fprintf (stderr, " done.\n"); @@ -1008,7 +1037,7 @@ clientmessage_response (saver_info *si, Window w, Bool error, L++; XChangeProperty (si->dpy, w, XA_SCREENSAVER_RESPONSE, XA_STRING, 8, - PropModeReplace, proto, L); + PropModeReplace, (unsigned char *) proto, L); XSync (si->dpy, False); free (proto); } @@ -1380,3 +1409,50 @@ analyze_display (saver_info *si) } } } + +Bool +display_is_on_console_p (saver_info *si) +{ + Bool not_on_console = True; + char *dpystr = DisplayString (si->dpy); + char *tail = (char *) strchr (dpystr, ':'); + if (! tail || strncmp (tail, ":0", 2)) + not_on_console = True; + else + { + char dpyname[255], localname[255]; + strncpy (dpyname, dpystr, tail-dpystr); + dpyname [tail-dpystr] = 0; + if (!*dpyname || + !strcmp(dpyname, "unix") || + !strcmp(dpyname, "localhost")) + not_on_console = False; + else if (gethostname (localname, sizeof (localname))) + not_on_console = True; /* can't find hostname? */ + else + { + /* We have to call gethostbyname() on the result of gethostname() + because the two aren't guarenteed to be the same name for the + same host: on some losing systems, one is a FQDN and the other + is not. Here in the wide wonderful world of Unix it's rocket + science to obtain the local hostname in a portable fashion. + + And don't forget, gethostbyname() reuses the structure it + returns, so we have to copy the fucker before calling it again. + Thank you master, may I have another. + */ + struct hostent *h = gethostbyname (dpyname); + if (!h) + not_on_console = True; + else + { + char hn [255]; + struct hostent *l; + strcpy (hn, h->h_name); + l = gethostbyname (localname); + not_on_console = (!l || !!(strcmp (l->h_name, hn))); + } + } + } + return !not_on_console; +}