X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fwindows.c;h=b092a72b62d82baae3231b3155d61019a8bc8a51;hb=14627f4038ada5d11456f3770090f3c39740d70f;hp=ded26972a547d1b1241ff25f43605b45bb88e01b;hpb=df7adbee81405e2849728a24b498ad2117784b1f;p=xscreensaver diff --git a/driver/windows.c b/driver/windows.c index ded26972..b092a72b 100644 --- a/driver/windows.c +++ b/driver/windows.c @@ -1,5 +1,5 @@ /* windows.c --- turning the screen black; dealing with visuals, virtual roots. - * xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2000 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 @@ -63,14 +63,12 @@ extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ Atom XA_VROOT, XA_XSETROOT_ID; Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; -Atom XA_SCREENSAVER_TIME; +Atom XA_SCREENSAVER_STATUS; extern saver_info *global_si_kludge; /* I hate C so much... */ -static void store_activate_time (saver_info *si, Bool use_last_p); - #define ALL_POINTER_EVENTS \ (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \ LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \ @@ -653,11 +651,10 @@ saver_exit (saver_info *si, int status, const char *dump_core_reason) vrs = restore_real_vroot_1 (si); emergency_kill_subproc (si); + shutdown_stderr (si); - if (vrs && (p->verbose_p || status != 0)) - fprintf (real_stderr, "%s: vroot restored, exiting.\n", blurb()); - else if (p->verbose_p) - fprintf (real_stderr, "%s: no vroot to restore; exiting.\n", blurb()); + if (p->verbose_p && vrs) + fprintf (real_stderr, "%s: old vroot restored.\n", blurb()); fflush(real_stdout); @@ -731,7 +728,7 @@ store_saver_id (saver_screen_info *ssi) struct passwd *p = getpwuid (getuid ()); const char *name, *host; char *id; - + /* First store the name and class on the window. */ class_hints.res_name = progname; @@ -786,6 +783,35 @@ store_saver_id (saver_screen_info *ssi) } +void +store_saver_status (saver_info *si) +{ + CARD32 *status; + int size = si->nscreens + 2; + int i; + + status = (CARD32 *) calloc (size, sizeof(CARD32)); + + status[0] = (CARD32) (si->screen_blanked_p + ? (si->locked_p ? XA_LOCK : XA_BLANK) + : 0); + status[1] = (CARD32) si->blank_time; + + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + status [2 + i] = ssi->current_hack + 1; + } + + XChangeProperty (si->dpy, + RootWindow (si->dpy, 0), /* always screen #0 */ + XA_SCREENSAVER_STATUS, + XA_INTEGER, 32, PropModeReplace, + (unsigned char *) status, size); +} + + + /* Returns the area of the screen which the xscreensaver window should cover. Normally this is the whole screen, but if the X server's root window is actually larger than the monitor's displayable area, then we want to @@ -803,12 +829,17 @@ get_screen_viewport (saver_screen_info *ssi, #ifdef HAVE_XF86VMODE saver_info *si = ssi->global; int screen_no = screen_number (ssi->screen); - int event, error; + int op, event, error; int dot; XF86VidModeModeLine ml; int x, y; - if (XF86VidModeQueryExtension (si->dpy, &event, &error) && + /* Check for Xinerama first, because the VidModeExtension is broken + when Xinerama is present. Wheee! + */ + + if (!XQueryExtension (si->dpy, "XINERAMA", &op, &event, &error) && + XF86VidModeQueryExtension (si->dpy, &event, &error) && XF86VidModeGetModeLine (si->dpy, screen_no, &dot, &ml) && XF86VidModeGetViewPort (si->dpy, screen_no, &x, &y)) { @@ -822,6 +853,35 @@ get_screen_viewport (saver_screen_info *ssi, /* There is no viewport -- the screen does not scroll. */ return; + + /* Apparently some versions of XFree86 return nonsense here! + I've had reports of 1024x768 viewports at -1936862040, -1953705044. + So, sanity-check the values and give up if they are out of range. + */ + if (*x_ret < 0 || *x_ret >= w || + *y_ret < 0 || *y_ret >= h || + *w_ret <= 0 || *w_ret > w || + *h_ret <= 0 || *h_ret > h) + { + static int warned_once = 0; + if (!warned_once) + { + fprintf (stderr, "\n" + "%s: X SERVER BUG: %dx%d viewport at %d,%d is impossible.\n" + "%s: The XVidMode server extension is returning nonsense.\n" + "%s: Please report this bug to your X server vendor.\n\n", + blurb(), *w_ret, *h_ret, *x_ret, *y_ret, + blurb(), blurb()); + warned_once = 1; + } + *x_ret = 0; + *y_ret = 0; + *w_ret = w; + *h_ret = h; + return; + } + + sprintf (msg, "%s: vp is %dx%d+%d+%d", blurb(), *w_ret, *h_ret, *x_ret, *y_ret); @@ -1056,14 +1116,12 @@ initialize_screensaver_window_1 (saver_screen_info *ssi) ssi->current_visual, attrmask, &attrs); reset_stderr (ssi); - store_activate_time(si, True); if (p->verbose_p) fprintf (stderr, "%s: saver window is 0x%lx.\n", blurb(), (unsigned long) ssi->screensaver_window); } - - store_saver_id (ssi); + store_saver_id (ssi); /* store window name and IDs */ if (!ssi->cursor) { @@ -1248,15 +1306,19 @@ blank_screen (saver_info *si) } #endif /* HAVE_XF86VMODE */ } - store_activate_time (si, si->screen_blanked_p); + raise_window (si, False, False, False); si->screen_blanked_p = True; + si->blank_time = time ((time_t) 0); si->last_wall_clock_time = 0; + store_saver_status (si); /* store blank time */ + return True; } + void unblank_screen (saver_info *si) { @@ -1265,8 +1327,6 @@ unblank_screen (saver_info *si) int i; monitor_power_on (si); - - store_activate_time (si, True); reset_watchdog_timer (si, False); if (si->demoing_p) @@ -1360,8 +1420,7 @@ unblank_screen (saver_info *si) kill_xsetroot_data (si->dpy, ssi->screensaver_window, p->verbose_p); } - store_activate_time(si, False); /* store unblank time */ - + store_saver_status (si); /* store unblank time */ ungrab_keyboard_and_mouse (si); restore_real_vroot (si); @@ -1373,27 +1432,10 @@ unblank_screen (saver_info *si) XUnmapWindow (si->dpy, si->screens[i].screensaver_window); si->screen_blanked_p = False; + si->blank_time = time ((time_t) 0); si->last_wall_clock_time = 0; -} - -static void -store_activate_time (saver_info *si, Bool use_last_p) -{ - static time_t last_time = 0; - time_t now = ((use_last_p && last_time) ? last_time : time ((time_t) 0)); - CARD32 now32 = (CARD32) now; - int i; - last_time = now; - - for (i = 0; i < si->nscreens; i++) - { - saver_screen_info *ssi = &si->screens[i]; - if (!ssi->screensaver_window) continue; - XChangeProperty (si->dpy, ssi->screensaver_window, XA_SCREENSAVER_TIME, - XA_INTEGER, 32, PropModeReplace, - (unsigned char *) &now32, 1); - } + store_saver_status (si); /* store unblank time */ } @@ -1409,25 +1451,29 @@ select_visual (saver_screen_info *ssi, const char *visual_name) if (visual_name && *visual_name) { - if (!strcmp(visual_name, "default-i")) + if (!strcmp(visual_name, "default-i") || + !strcmp(visual_name, "Default-i") || + !strcmp(visual_name, "Default-I") + ) { visual_name = "default"; install_cmap_p = True; } - else if (!strcmp(visual_name, "default-n")) + else if (!strcmp(visual_name, "default-n") || + !strcmp(visual_name, "Default-n") || + !strcmp(visual_name, "Default-N")) { visual_name = "default"; install_cmap_p = False; } -#ifdef DAEMON_USE_GL else if (!strcmp(visual_name, "gl") || + !strcmp(visual_name, "Gl") || !strcmp(visual_name, "GL")) { - new_v = get_gl_visual (ssi->screen); + new_v = ssi->best_gl_visual; if (!new_v && p->verbose_p) fprintf (stderr, "%s: no GL visuals.\n", progname); } -#endif /* DAEMON_USE_GL */ if (!new_v) new_v = get_visual (ssi->screen, visual_name, True, False); @@ -1480,8 +1526,6 @@ select_visual (saver_screen_info *ssi, const char *visual_name) raise_window (si, True, True, False); store_vroot_property (si->dpy, ssi->screensaver_window, ssi->screensaver_window); - store_activate_time (si, True); - /* Transfer the grabs from the old window to the new.