536N/A # define XtNgreetFace "greetFace"
851N/A # define XtNfailFace "failFace"
851N/A # define XtNfailTimeout "failTimeout"
536N/A+# define XtNgrabDelay "grabDelay"
536N/A # define XtNsessionArgument "sessionArgument"
536N/A # define XtNsecureSession "secureSession"
536N/A # define XtNallowAccess "allowAccess"
536N/A # define XtCPasswdPrompt "PasswdPrompt"
536N/A # define XtCFail "Fail"
536N/A # define XtCFailTimeout "FailTimeout"
536N/A+# define XtCGrabDelay "GrabDelay"
536N/A # define XtCSessionArgument "SessionArgument"
536N/A # define XtCSecureSession "SecureSession"
536N/A # define XtCAllowAccess "AllowAccess"
536N/A char *sessionArg; /* argument passed to session */
536N/A LoginFunc notify_done; /* proc to call when done */
536N/A int failTimeout; /* seconds til drop fail msg */
536N/A+ int grabDelay; /* time to retry to set the input focus to the login widget */
536N/A XtIntervalId interval_id; /* drop fail message note */
536N/A Boolean secure_session; /* session is secured */
536N/A Boolean allow_access; /* disable access control on login */
536N/A (XtPointer) "Password Change Required" },
536N/A {XtNfailTimeout, XtCFailTimeout, XtRInt, sizeof (int),
536N/A offset(failTimeout), XtRImmediate, (XtPointer) 10},
536N/A+ {XtNgrabDelay, XtCGrabDelay, XtRInt, sizeof (int),
536N/A+ offset(grabDelay), XtRImmediate, (XtPointer) 10},
536N/A {XtNnotifyDone, XtCCallback, XtRFunction, sizeof (XtPointer),
536N/A offset(notify_done), XtRFunction, (XtPointer) 0},
536N/A {XtNsessionArgument, XtCSessionArgument, XtRString, sizeof (char *),
536N/A+ s = "window is not visible";
536N/A+ s = "window is no longer valid";
536N/A+ s = "generic failure";
536N/A+static volatile int xerr;
+xErrorHandler(Display *d, XErrorEvent *xeep)
+ xerr = xeep->error_code;
- XSetInputFocus (XtDisplay (w), XtWindow (w),
- RevertToPointerRoot, CurrentTime);
+ if (XGrabKeyboard (XtDisplay (w), XtWindow (w), False, GrabModeAsync,
+ GrabModeAsync, CurrentTime) != GrabSuccess)
+ typedef int (*x_e_h)(Display *, XErrorEvent *);
+ x_e_h originalHandler = XSetErrorHandler(xErrorHandler);
+ XSetInputFocus (XtDisplay (w), XtWindow (w),
+ RevertToPointerRoot, CurrentTime);
+ XSync(XtDisplay (w), False);
+ if (xerr != BadMatch) {
+ if (waitsecs == 0) { /* timed out */
+ (void) XSetErrorHandler(originalHandler);
+ fprintf(stderr, "%s: failed to set focus; %s\n",
+ "greeter", xerrMessage(xerr));
/* Returns 0 on success, -1 on failure */
#define BS \ /* cpp can be trickier than m4 */
#define NLBS \n\ /* don't remove these comments */