http://packetstormsecurity.org/UNIX/admin/xscreensaver-3.28.tar.gz
[xscreensaver] / driver / lock.c
index 6d498b199fdf835ff38172ca05c0a1ac33edfe3c..2c766b55ed3291c8d3edd1e24c48cbf4f66ba590 100644 (file)
 # 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 */
@@ -170,7 +170,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");
@@ -538,18 +538,12 @@ draw_passwd_window (saver_info *si)
 
   /* 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));
+  draw_logo (si, si->passwd_dialog, x1, y1, x2, y2, True);
 
   /* The thermometer
    */
@@ -680,6 +674,18 @@ update_passwd_window (saver_info *si, const char *printed_passwd, float ratio)
                      MAX (0, pw->thermo_field_height - y - 2));
     }
 
+  /* the logo
+   */
+  {
+    int x1, y1, x2, y2;
+    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);
+
+    draw_logo (si, si->passwd_dialog, x1, y1, x2, y2, False);
+  }
+
   XFreeGC (si->dpy, gc1);
   XFreeGC (si->dpy, gc2);
   XSync (si->dpy, False);
@@ -985,6 +991,8 @@ passwd_animate_timer (XtPointer closure, XtIntervalId *id)
 }
 
 
+static XComposeStatus *compose_status;
+
 static void
 handle_passwd_key (saver_info *si, XKeyEvent *event)
 {
@@ -995,7 +1003,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;
 
@@ -1164,6 +1172,30 @@ passwd_event_loop (saver_info *si)
 }
 
 
+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)
 {
@@ -1183,11 +1215,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);
 
@@ -1209,6 +1247,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 */
 }