X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fxscreensaver.c;h=a70de0e4043a2eba2e497f7b36210824cd85c530;hb=6a1da724858673ac40aa13a9612340d8bed8c7b9;hp=57cc234d760cd13ca05e6c102fb909a4c3a0b7cb;hpb=c28aecf9fc41e3a03494bacf7279745425e2fa18;p=xscreensaver diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 57cc234d..a70de0e4 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1991-2002 Jamie Zawinski +/* xscreensaver, Copyright (c) 1991-2003 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -127,6 +127,9 @@ #include #include #include + +#include + #include #include #include @@ -213,6 +216,12 @@ static XrmOptionDescRec options [] = { #endif /* 0 */ }; +#ifdef __GNUC__ + __extension__ /* shut up about "string length is greater than the length + ISO C89 compilers are required to support" when including + the .ad file... */ +#endif + static char *defaults[] = { #include "XScreenSaver_ad.h" 0 @@ -228,13 +237,15 @@ do_help (saver_info *si) fflush (stdout); fflush (stderr); fprintf (stdout, "\ -xscreensaver %s, copyright (c) 1991-2002 by Jamie Zawinski \n\ +xscreensaver %s, copyright (c) 1991-2003 by Jamie Zawinski \n\ \n\ All xscreensaver configuration is via the `~/.xscreensaver' file.\n\ Rather than editing that file by hand, just run `xscreensaver-demo':\n\ that program lets you configure the screen saver graphically,\n\ including timeouts, locking, and display modes.\n\ -\n\ +\n", + si->version); + fprintf (stdout, "\ Just getting started? Try this:\n\ \n\ xscreensaver &\n\ @@ -243,8 +254,8 @@ xscreensaver %s, copyright (c) 1991-2002 by Jamie Zawinski \n\ For updates, online manual, and FAQ, please see the web page:\n\ \n\ http://www.jwz.org/xscreensaver/\n\ -\n", - si->version); +\n"); + fflush (stdout); fflush (stderr); exit (1); @@ -338,7 +349,8 @@ saver_ehandler (Display *dpy, XErrorEvent *error) " bug. That will cause xscreensaver to dump a `core' file to the\n" " current directory. Please include the stack trace from that core\n" " file in your bug report. *DO NOT* mail the core file itself!\n" - " That won't work.\n" + " That won't work.\n"); + fprintf (real_stderr, "\n" " http://www.jwz.org/xscreensaver/bugs.html explains how to create\n" " the most useful bug reports, and how to examine core files.\n" @@ -493,6 +505,37 @@ lock_initialization (saver_info *si, int *argc, char **argv) si->locking_disabled_p = True; si->nolock_reason = "running under GDM"; } + + /* If the server is XDarwin (MacOS X) then disable locking. + (X grabs only affect X programs, so you can use Command-Tab + to bring any other Mac program to the front, e.g., Terminal.) + */ + if (!si->locking_disabled_p) + { + int op = 0, event = 0, error = 0; + Bool macos_p = False; + +#ifdef __APPLE__ + /* Disable locking if *running* on Apple hardware, since we have no + reliable way to determine whether the server is running on MacOS. + Hopefully __APPLE__ means "MacOS" and not "Linux on Mac hardware" + but I'm not really sure about that. + */ + macos_p = True; +#endif + + if (!macos_p) + /* This extension exists on the Apple X11 server, but not + on earlier versions of the XDarwin server. */ + macos_p = XQueryExtension (si->dpy, "Apple-DRI", &op, &event, &error); + + if (macos_p) + { + si->locking_disabled_p = True; + si->nolock_reason = "Cannot lock securely on MacOS X"; + } + } + #endif /* NO_LOCKING */ } @@ -655,7 +698,7 @@ print_banner (saver_info *si) if (p->verbose_p) fprintf (stderr, - "%s %s, copyright (c) 1991-2002 " + "%s %s, copyright (c) 1991-2003 " "by Jamie Zawinski .\n", progname, si->version); @@ -688,11 +731,17 @@ print_banner (saver_info *si) fprintf (stderr, "%s: in process %lu.\n", blurb(), (unsigned long) getpid()); } +} + +static void +print_lock_failure_banner (saver_info *si) +{ + saver_preferences *p = &si->prefs; /* If locking was not able to be initalized for some reason, explain why. (This has to be done after we've read the lock_p resource.) */ - if (p->lock_p && si->locking_disabled_p) + if (si->locking_disabled_p) { p->lock_p = False; fprintf (stderr, "%s: locking is disabled (%s).\n", blurb(), @@ -707,6 +756,7 @@ print_banner (saver_info *si) "\t See the manual for details.\n", blurb()); } + } @@ -754,7 +804,7 @@ initialize_per_screen_info (saver_info *si, Widget toplevel_shell) XtNvisual, ssi->current_visual, XtNdepth, visual_depth (ssi->screen, ssi->current_visual), - 0); + NULL); if (! found_any_writable_cells) { @@ -1250,6 +1300,7 @@ main (int argc, char **argv) exit (1); lock_initialization (si, &argc, argv); + print_lock_failure_banner (si); if (p->xsync_p) XSynchronize (si->dpy, True); @@ -1893,6 +1944,8 @@ analyze_display (saver_info *si) # endif }, { "XINERAMA", "Xinerama", True + }, { "Apple-DRI", "Apple-DRI (XDarwin)", + True }, };