X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Flock.c;h=d47c99a0d1d159ab0a0868f54abbf8f97c3d2399;hb=3d9140a05b5272fed0883a0af0a71e30ef44d47f;hp=26441f071261c8fb522fb45ee0a698e2bb3d6fb3;hpb=c596d1306f5f92f7eab76224d3b049980a14adcb;p=xscreensaver diff --git a/driver/lock.c b/driver/lock.c index 26441f07..d47c99a0 100644 --- a/driver/lock.c +++ b/driver/lock.c @@ -17,13 +17,13 @@ # include "config.h" #endif -#ifndef NO_LOCKING /* whole file */ - #include #include /* for time() */ #include "xscreensaver.h" #include "resources.h" +#ifndef NO_LOCKING /* (mostly) whole file */ + #ifdef HAVE_SYSLOG # include #endif /* HAVE_SYSLOG */ @@ -104,8 +104,8 @@ struct passwd_dialog_data { Pixel background; Pixel passwd_foreground; Pixel passwd_background; - Pixel logo_foreground; - Pixel logo_background; + Pixel thermo_foreground; + Pixel thermo_background; Pixel shadow_top; Pixel shadow_bottom; @@ -121,6 +121,10 @@ struct passwd_dialog_data { Dimension thermo_field_x, thermo_field_y; Dimension thermo_field_height; + Pixmap logo_pixmap; + int logo_npixels; + unsigned long *logo_pixels; + Pixmap save_under; }; @@ -170,7 +174,7 @@ make_passwd_window (saver_info *si) pw->heading_label = s; } - pw->user_string = (p->pw_name ? p->pw_name : "???"); + pw->user_string = (p && p->pw_name ? p->pw_name : "???"); pw->passwd_string = strdup(""); f = get_string_resource ("passwd.headingFont", "Dialog.Font"); @@ -218,12 +222,12 @@ make_passwd_window (saver_info *si) pw->passwd_background = get_pixel_resource ("passwd.text.background", "Dialog.Text.Background", si->dpy, cmap); - pw->logo_foreground = get_pixel_resource ("passwd.logo.foreground", - "Dialog.Logo.Foreground", - si->dpy, cmap); - pw->logo_background = get_pixel_resource ("passwd.logo.background", - "Dialog.Logo.Background", - si->dpy, cmap); + pw->thermo_foreground = get_pixel_resource ("passwd.thermometer.foreground", + "Dialog.Thermometer.Foreground", + si->dpy, cmap); + pw->thermo_background = get_pixel_resource ("passwd.thermometer.background", + "Dialog.Thermometer.Background", + si->dpy, cmap); pw->shadow_top = get_pixel_resource ("passwd.topShadowColor", "Dialog.Foreground", si->dpy, cmap); @@ -353,6 +357,10 @@ make_passwd_window (saver_info *si) attrmask, &attrs); XSetWindowBackground (si->dpy, si->passwd_dialog, pw->background); + pw->logo_pixmap = xscreensaver_logo (si->dpy, si->passwd_dialog, cmap, + pw->background, + &pw->logo_pixels, &pw->logo_npixels, + True); /* Before mapping the window, save the bits that are underneath the rectangle the window will occlude. When we lower the window, we @@ -536,23 +544,39 @@ draw_passwd_window (saver_info *si) } - /* the logo + /* The logo */ - XSetForeground (si->dpy, gc1, pw->logo_foreground); - XSetForeground (si->dpy, gc2, pw->logo_background); - x1 = pw->shadow_width * 3; y1 = pw->shadow_width * 3; x2 = pw->logo_width - (pw->shadow_width * 6); y2 = pw->logo_height - (pw->shadow_width * 6); - XFillRectangle (si->dpy, si->passwd_dialog, gc2, x1, y1, x2, y2); - skull (si->dpy, si->passwd_dialog, gc1, gc2, - x1 + pw->shadow_width, y1 + pw->shadow_width, - x2 - (pw->shadow_width * 2), y2 - (pw->shadow_width * 2)); + if (pw->logo_pixmap) + { + Window root; + int x, y; + unsigned int w, h, bw, d; + XGetGeometry (si->dpy, pw->logo_pixmap, &root, &x, &y, &w, &h, &bw, &d); + XSetForeground (si->dpy, gc1, pw->foreground); + XSetBackground (si->dpy, gc1, pw->background); + if (d == 1) + XCopyPlane (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1, + 0, 0, w, h, + x1 + ((x2 - (int)w) / 2), + y1 + ((y2 - (int)h) / 2), + 1); + else + XCopyArea (si->dpy, pw->logo_pixmap, si->passwd_dialog, gc1, + 0, 0, w, h, + x1 + ((x2 - (int)w) / 2), + y1 + ((y2 - (int)h) / 2)); + } /* The thermometer */ + XSetForeground (si->dpy, gc1, pw->thermo_foreground); + XSetForeground (si->dpy, gc2, pw->thermo_background); + pw->thermo_field_x = pw->logo_width + pw->shadow_width; pw->thermo_field_y = pw->shadow_width * 3; pw->thermo_field_height = pw->height - (pw->shadow_width * 6); @@ -672,7 +696,7 @@ update_passwd_window (saver_info *si, const char *printed_passwd, float ratio) pw->thermo_field_y + 1, pw->thermo_width-2, y); - XSetForeground (si->dpy, gc1, pw->logo_foreground); + XSetForeground (si->dpy, gc1, pw->thermo_foreground); XFillRectangle (si->dpy, si->passwd_dialog, gc1, pw->thermo_field_x + 1, pw->thermo_field_y + 1 + y, @@ -743,15 +767,22 @@ destroy_passwd_window (saver_info *si) XFreeColors (si->dpy, cmap, &pw->passwd_foreground, 1, 0L); if (pw->passwd_background != black && pw->passwd_background != white) XFreeColors (si->dpy, cmap, &pw->passwd_background, 1, 0L); - if (pw->logo_foreground != black && pw->logo_foreground != white) - XFreeColors (si->dpy, cmap, &pw->logo_foreground, 1, 0L); - if (pw->logo_background != black && pw->logo_background != white) - XFreeColors (si->dpy, cmap, &pw->logo_background, 1, 0L); + if (pw->thermo_foreground != black && pw->thermo_foreground != white) + XFreeColors (si->dpy, cmap, &pw->thermo_foreground, 1, 0L); + if (pw->thermo_background != black && pw->thermo_background != white) + XFreeColors (si->dpy, cmap, &pw->thermo_background, 1, 0L); if (pw->shadow_top != black && pw->shadow_top != white) XFreeColors (si->dpy, cmap, &pw->shadow_top, 1, 0L); if (pw->shadow_bottom != black && pw->shadow_bottom != white) XFreeColors (si->dpy, cmap, &pw->shadow_bottom, 1, 0L); + if (pw->logo_pixmap) + XFreePixmap (si->dpy, pw->logo_pixmap); + if (pw->logo_npixels && pw->logo_pixels) + XFreeColors (si->dpy, cmap, pw->logo_pixels, pw->logo_npixels, 0L); + if (pw->logo_pixels) + free (pw->logo_pixels); + memset (pw, 0, sizeof(*pw)); free (pw); @@ -985,6 +1016,8 @@ passwd_animate_timer (XtPointer closure, XtIntervalId *id) } +static XComposeStatus *compose_status; + static void handle_passwd_key (saver_info *si, XKeyEvent *event) { @@ -995,7 +1028,7 @@ handle_passwd_key (saver_info *si, XKeyEvent *event) char s[2]; char *stars = 0; int i; - int size = XLookupString (event, s, 1, 0, 0); + int size = XLookupString (event, s, 1, 0, compose_status); if (size != 1) return; @@ -1207,12 +1240,17 @@ unlock_p (saver_info *si) make_passwd_window (si); if (cmap) XInstallColormap (si->dpy, cmap); + compose_status = calloc (1, sizeof (*compose_status)); + handle_typeahead (si); passwd_event_loop (si); status = (si->pw_data->state == pw_ok); destroy_passwd_window (si); + free (compose_status); + compose_status = 0; + cmap = si->default_screen->cmap; if (cmap) XInstallColormap (si->dpy, cmap); @@ -1234,6 +1272,8 @@ set_locked_p (saver_info *si, Bool locked_p) #ifdef HAVE_XF86VMODE xfree_lock_mode_switch (si, locked_p); /* turn off/on C-Alt-Plus */ #endif + + store_saver_status (si); /* store locked-p */ }