diff -Nurp xscreensaver-4.23.orig/config.h.in xscreensaver-4.23/config.h.in
--- xscreensaver-4.23.orig/config.h.in	2005-04-23 21:50:41.000000000 +0200
+++ xscreensaver-4.23/config.h.in	2005-12-22 19:33:33.628999000 +0100
@@ -431,6 +431,9 @@
    Some systems might already have a PAM installation that is configured for
    xlock, so setting this to "xlock" would also work in that case. */
 #undef PAM_SERVICE_NAME
+/* An alternative PAM service can be used when using the AlternativeAuth
+   configuration setting. The default is "xscreensaver-alternative". */
+#undef PAM_ALT_SERVICE_NAME
 
 /* Define if you have PAM and pam_strerror() requires two arguments. */
 #undef PAM_STRERROR_TWO_ARGS
diff -Nurp xscreensaver-4.23.orig/configure xscreensaver-4.23/configure
--- xscreensaver-4.23.orig/configure	2005-10-22 08:43:55.000000000 +0200
+++ xscreensaver-4.23/configure	2005-12-22 19:29:29.738999000 +0100
@@ -889,6 +889,10 @@ Screen blanking and idle-detection optio
   --with-pam-service-name=NAME
                           NAME is the name of the PAM service that
                           xscreensaver will authenticate as.
+  --with-pam-alt-service-name=NAME
+                          NAME is the name of the PAM service that
+                          xscreensaver will authenticate as when using
+                          the AlternativeAuth option.
   --with-kerberos         Include support for Kerberos authentication.
   --with-shadow           Include support for shadow password authentication.
   --with-passwd-helper    Include support for an external password
@@ -12299,6 +12303,14 @@ else
   pam_service_name="xscreensaver"
 fi;
 
+# Check whether --with-pam_alt_service_name or --without-pam_alt_service_name was given.
+if test "${with_pam_alt_service_name+set}" = set; then
+  withval="$with_pam_alt_service_name"
+  pam_alt_service_name="$withval"
+else
+  pam_alt_service_name="xscreensaver-alternative"
+fi;
+
 
    case "$with_pam" in
     yes) ;;
@@ -12413,6 +12425,7 @@ _ACEOF
 
     cat >>confdefs.h <<_ACEOF
 #define PAM_SERVICE_NAME "$pam_service_name"
+#define PAM_ALT_SERVICE_NAME "$pam_alt_service_name"
 _ACEOF
 
 
diff -Nurp xscreensaver-4.23.orig/driver/lock.c xscreensaver-4.23/driver/lock.c
--- xscreensaver-4.23.orig/driver/lock.c	2005-10-17 03:14:37.000000000 +0200
+++ xscreensaver-4.23/driver/lock.c	2005-12-22 19:32:17.278999000 +0100
@@ -1614,7 +1614,17 @@ Bool
 unlock_p (saver_info *si)
 {
   saver_preferences *p = &si->prefs;
-  Bool status;
+  Bool status = False;
+
+# ifdef HAVE_PAM
+  if (p->alternative_auth) { 
+    /* call PAM function, alternative version (last argument == 1)
+     */
+    status = pam_passwd_valid_p ("", p->verbose_p, 1);
+    if (status == True)
+      return status;
+  }
+# endif
 
   raise_window (si, True, True, True);
 
diff -Nurp xscreensaver-4.23.orig/driver/passwd-pam.c xscreensaver-4.23/driver/passwd-pam.c
--- xscreensaver-4.23.orig/driver/passwd-pam.c	2005-03-02 12:25:43.000000000 +0100
+++ xscreensaver-4.23/driver/passwd-pam.c	2005-12-22 19:34:49.068999000 +0100
@@ -47,6 +47,7 @@ extern char *blurb(void);
 
 
 #include <stdio.h>
+#include <stdarg.h>
 #include <string.h>
 #include <sys/types.h>
 #include <pwd.h>
@@ -173,9 +174,11 @@ static void *suns_pam_implementation_blo
    to root.
  */
 Bool
-pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p, ...)
 {
-  const char *service = PAM_SERVICE_NAME;
+  char *service = PAM_SERVICE_NAME;
+  va_list argp;
+  int alternative_pam = 0;
   pam_handle_t *pamh = 0;
   int status = -1;
   struct pam_conv pc;
@@ -187,6 +190,23 @@ pam_passwd_valid_p (const char *typed_pa
   struct passwd *p = getpwuid (getuid ());
   if (!p) return False;
 
+  /* variable function parameter parsing hack */
+  va_start(argp, verbose_p);
+  alternative_pam = va_arg(argp, int);
+  va_end(argp);
+
+  if (alternative_pam == 1)
+    {
+	service = PAM_ALT_SERVICE_NAME;
+    }
+  else
+    {
+	service = PAM_SERVICE_NAME;
+    }
+  if (verbose_p)
+    fprintf (stderr, "%s: alternative_pam:  %d -> pam service: %s\n",
+	blurb(), alternative_pam, service);
+  
   user = strdup (p->pw_name);
 
   c.user = user;
@@ -287,26 +307,31 @@ pam_passwd_valid_p (const char *typed_pa
     }
 
   /* If that didn't work, set the user to root, and try to authenticate again.
+     But only if it's not the alternative authentication mechanism, we don't
+     want to test for root's fingerprint
    */
-  if (user) free (user);
-  user = strdup ("root");
-  c.user = user;
-  status = pam_set_item (pamh, PAM_USER, c.user);
-  if (verbose_p)
-    fprintf (stderr, "%s:   pam_set_item(p, PAM_USER, \"%s\") ==> %d (%s)\n",
-             blurb(), c.user, status, PAM_STRERROR(pamh, status));
-  if (status != PAM_SUCCESS) goto DONE;
-
-  PAM_NO_DELAY(pamh);
-
-  set = block_sigchld();
-  status = pam_authenticate (pamh, 0);
-  sigtimedwait(&set, NULL, &timeout);
-  unblock_sigchld();
-
-  if (verbose_p)
-    fprintf (stderr, "%s:   pam_authenticate (...) ==> %d (%s)\n",
-             blurb(), status, PAM_STRERROR(pamh, status));
+  if ( alternative_pam != 1 )
+    {
+      if (user) free (user);
+      user = strdup ("root");
+      c.user = user;
+      status = pam_set_item (pamh, PAM_USER, c.user);
+      if (verbose_p)
+        fprintf (stderr, "%s:   pam_set_item(p, PAM_USER, \"%s\") ==> %d (%s)\n",
+                 blurb(), c.user, status, PAM_STRERROR(pamh, status));
+      if (status != PAM_SUCCESS) goto DONE;
+    
+      PAM_NO_DELAY(pamh);
+    
+      set = block_sigchld();
+      status = pam_authenticate (pamh, 0);
+      sigtimedwait(&set, NULL, &timeout);
+      unblock_sigchld();
+    
+      if (verbose_p)
+        fprintf (stderr, "%s:   pam_authenticate (...) ==> %d (%s)\n",
+                 blurb(), status, PAM_STRERROR(pamh, status));
+    }
 
  DONE:
   if (user) free (user);
diff -Nurp xscreensaver-4.23.orig/driver/prefs.c xscreensaver-4.23/driver/prefs.c
--- xscreensaver-4.23.orig/driver/prefs.c	2005-08-25 04:08:04.000000000 +0200
+++ xscreensaver-4.23/driver/prefs.c	2005-12-22 19:24:29.688999000 +0100
@@ -244,6 +244,7 @@ static const char * const prefs[] = {
   "lock",
   "lockVTs",			/* not saved */
   "lockTimeout",
+  "alternativeAuth",
   "passwdTimeout",
   "visualID",
   "installColormap",
@@ -777,6 +778,7 @@ write_init_file (saver_preferences *p, c
       CHECK("lockVTs")		continue;  /* don't save */
 # endif
       CHECK("lockTimeout")	type = pref_time, t = p->lock_timeout;
+      CHECK("alternativeAuth")	type = pref_bool, b = p->alternative_auth;
       CHECK("passwdTimeout")	type = pref_time, t = p->passwd_timeout;
       CHECK("visualID")		type = pref_str,  s =    visual_name;
       CHECK("installColormap")	type = pref_bool, b = p->install_cmap_p;
@@ -1033,6 +1035,7 @@ load_init_file (saver_preferences *p)
   p->timestamp_p    = get_boolean_resource ("timestamp", "Boolean");
   p->lock_p	    = get_boolean_resource ("lock", "Boolean");
   p->lock_vt_p	    = get_boolean_resource ("lockVTs", "Boolean");
+  p->alternative_auth = get_boolean_resource ("alternativeAuth", "Boolean");
   p->fade_p	    = get_boolean_resource ("fade", "Boolean");
   p->unfade_p	    = get_boolean_resource ("unfade", "Boolean");
   p->fade_seconds   = 1000 * get_seconds_resource ("fadeSeconds", "Time");
diff -Nurp xscreensaver-4.23.orig/driver/prefs.h xscreensaver-4.23/driver/prefs.h
--- xscreensaver-4.23.orig/driver/prefs.h	2005-03-21 00:20:32.000000000 +0100
+++ xscreensaver-4.23/driver/prefs.h	2005-12-22 19:24:29.688999000 +0100
@@ -107,6 +107,8 @@ struct saver_preferences {
   Bool use_sgi_saver_extension;
   Bool use_proc_interrupts;
 
+  Bool alternative_auth;       /* don't use password - fingerprint get by pam */
+ 
   Bool getviewport_full_of_lies_p; /* XFree86 bug #421 */
 
   char *shell;			/* where to find /bin/sh */
diff -Nurp xscreensaver-4.23.orig/driver/xscreensaver.man xscreensaver-4.23/driver/xscreensaver.man
--- xscreensaver-4.23.orig/driver/xscreensaver.man	2005-07-23 20:21:24.000000000 +0200
+++ xscreensaver-4.23/driver/xscreensaver.man	2005-12-22 19:24:29.688999000 +0100
@@ -146,6 +146,12 @@ should not be too large: the X server is
 password dialog box is up (for security purposes) and leaving the server 
 grabbed for too long can cause problems.
 .TP 8
+.B alternativeAuth\fP (class \fBBoolean\fP)
+Set this True if you don't use password for unlock but some other way. If you 
+use for example fingerprint reader at your laptop to unlock xscreensaver you 
+don't need password dialog appear only if fingerprint authentication failed.
+(\fBNote:\fP this doesn't work if PAM support isn't compiled in.)
+.TP 8
 .B dpmsEnabled\fP (class \fBBoolean\fP)
 Whether power management is enabled.
 .TP 8
@@ -1194,6 +1200,8 @@ to comp.sources.x on 17-Aug-1992.
 
 Please let me know if you find any bugs or make any improvements.
 .SH ACKNOWLEDGEMENTS
+Thanks to Josef Hajas for the biometrics support.
+
 Thanks to Angela Goodman for the XScreenSaver logo.
 
 Thanks to the many people who have contributed graphics demos to the package.
