# include "config.h"
#endif
-#ifndef NO_LOCKING /* whole file */
-
#include <X11/Intrinsic.h>
+#include <X11/Xos.h> /* for time() */
#include "xscreensaver.h"
#include "resources.h"
+#ifndef NO_LOCKING /* (mostly) whole file */
+
#ifdef HAVE_SYSLOG
# include <syslog.h>
#endif /* HAVE_SYSLOG */
char *body_label;
char *user_label;
char *passwd_label;
+ char *date_label;
char *user_string;
char *passwd_string;
XFontStruct *body_font;
XFontStruct *label_font;
XFontStruct *passwd_font;
+ XFontStruct *date_font;
Pixel foreground;
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;
Dimension thermo_field_x, thermo_field_y;
Dimension thermo_field_height;
+ Pixmap logo_pixmap;
+ int logo_npixels;
+ unsigned long *logo_pixels;
+
Pixmap save_under;
};
"Dialog.Label.Label");
pw->passwd_label = get_string_resource ("passwd.passwd.label",
"Dialog.Label.Label");
+ pw->date_label = get_string_resource ("dateFormat", "DateFormat");
if (!pw->heading_label)
pw->heading_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
pw->body_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
if (!pw->user_label) pw->user_label = strdup("ERROR");
if (!pw->passwd_label) pw->passwd_label = strdup("ERROR");
+ if (!pw->date_label) pw->date_label = strdup("ERROR");
/* Put the version number in the label. */
{
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");
if (!pw->passwd_font) pw->passwd_font = XLoadQueryFont (si->dpy, "fixed");
if (f) free (f);
+ f = get_string_resource("passwd.dateFont", "Dialog.Font");
+ pw->date_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+ if (!pw->date_font) pw->date_font = XLoadQueryFont (si->dpy, "fixed");
+ if (f) free (f);
+
pw->foreground = get_pixel_resource ("passwd.foreground",
"Dialog.Foreground",
si->dpy, cmap);
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);
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
pw->body_font->ascent + pw->body_font->descent +
(2 * MAX ((pw->label_font->ascent + pw->label_font->descent),
(pw->passwd_font->ascent + pw->passwd_font->descent +
- (pw->shadow_width * 4)))));
+ (pw->shadow_width * 4)))) +
+ pw->date_font->ascent + pw->date_font->descent
+ );
spacing = ((pw->height - (2 * pw->shadow_width) -
pw->internal_border - height)) / 8;
if (spacing < 0) spacing = 0;
pw->shadow_width,
pw->shadow_bottom, pw->shadow_top);
- /* the logo
+
+ /* The date, below the text fields
*/
- XSetForeground (si->dpy, gc1, pw->logo_foreground);
- XSetForeground (si->dpy, gc2, pw->logo_background);
+ {
+ char buf[100];
+ time_t now = time ((time_t *) 0);
+ struct tm *tm = localtime (&now);
+ memset (buf, 0, sizeof(buf));
+ strftime (buf, sizeof(buf)-1, pw->date_label, tm);
+
+ XSetFont (si->dpy, gc1, pw->date_font->fid);
+ y1 += pw->shadow_width;
+ y1 += (spacing + tb_height);
+ y1 += spacing/2;
+ sw = string_width (pw->date_font, buf);
+ x2 = x1 + x2 - sw;
+ XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1, buf, strlen(buf));
+ }
+
+ /* The logo
+ */
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);
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,
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);
}
+static XComposeStatus *compose_status;
+
static void
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;
}
+static void
+handle_typeahead (saver_info *si)
+{
+ passwd_dialog_data *pw = si->pw_data;
+ int i;
+ if (!si->unlock_typeahead)
+ return;
+
+ i = strlen (si->unlock_typeahead);
+ if (i >= sizeof(pw->typed_passwd) - 1)
+ i = sizeof(pw->typed_passwd) - 1;
+
+ memcpy (pw->typed_passwd, si->unlock_typeahead, i);
+ pw->typed_passwd [i] = 0;
+
+ memset (si->unlock_typeahead, '*', strlen(si->unlock_typeahead));
+ si->unlock_typeahead[i] = 0;
+ update_passwd_window (si, si->unlock_typeahead, pw->ratio);
+
+ free (si->unlock_typeahead);
+ si->unlock_typeahead = 0;
+}
+
+
Bool
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);
#ifdef HAVE_XF86VMODE
xfree_lock_mode_switch (si, locked_p); /* turn off/on C-Alt-Plus */
#endif
+
+ store_saver_status (si); /* store locked-p */
}