Newsgroups: japan.comp.x11 Subject: xdm-traverse-field.patch Date: 7 May 1999 10:49:01 GMT Lines: 112 Message-ID: <7guget$2r9@masamune.dais.is.tohoku.ac.jp> Archive-Name: X11/xdm-traverse-field.patch うぃんどうずとかCDEに慣れていると、xlogin (XDMの標準ダイアログ)で Tabトラバーサルが使えなくていらいらしませんか? TabキーでLogin: Password: フィールド間を移動できるようにするパッチ。 単に finish-field() で済ませると、Password: から Login: に 戻れないので、traverse-field() アクションを追加します。 xloginには現在2フィールドしかないので Tab も Shift-Tab も動作は同じですが、 ハンドラのTraverseField()は将来を考えて若干汎用に作ってあります。 一応X11R6.4ベース。(R6ならあたるのでないかな) なお、副作用としてTabを含むパスワードが打てなくなります。 (そーゆー人は少なそうですが) 不都合であれば Xresourcesから該当エントリを削除して下さい。 diff -u xc/programs/xdm/config/Xresources.dist xc/programs/xdm/config/Xresources --- xc/programs/xdm/config/Xresources.dist Mon Nov 11 23:24:49 1996 +++ xc/programs/xdm/config/Xresources Fri May 7 19:01:47 1999 @@ -3,7 +3,9 @@ Ctrl<Key>R: abort-display()\n\ <Key>F1: set-session-argument(failsafe) finish-field()\n\ Ctrl<Key>Return: set-session-argument(failsafe) finish-field()\n\ - <Key>Return: set-session-argument() finish-field() + <Key>Return: set-session-argument() finish-field()\n\ + <Key>Tab: traverse-field(forward) erase-line()\n\ + Shift<Key>Tab: traverse-field(backward) erase-line() xlogin*borderWidth: 3 xlogin*greeting: CLIENTHOST xlogin*namePrompt: login:\040 diff -u xc/programs/xdm/greeter/Imakefile.dist xc/programs/xdm/greeter/Imakefile --- xc/programs/xdm/greeter/Imakefile.dist Sun Sep 29 06:25:58 1996 +++ xc/programs/xdm/greeter/Imakefile Fri May 7 19:06:24 1999 @@ -1,11 +1,12 @@ XCOMM $XConsortium: Imakefile /main/7 1996/09/28 17:17:38 rws $ +XCOMM #define DoNormalLib NO #define DoSharedLib YES #define DoDebugLib NO #define DoProfileLib NO #define LibName XdmGreet #define LibHeaders NO -SOXDMGREETREV = 1.0 +SOXDMGREETREV = 1.1 #define SoRev SOXDMGREETREV #if HasXdmAuth diff -u xc/programs/xdm/greeter/Login.c.dist xc/programs/xdm/greeter/Login.c --- xc/programs/xdm/greeter/Login.c.dist Thu Feb 12 00:00:16 1998 +++ xc/programs/xdm/greeter/Login.c Fri May 7 19:06:43 1999 @@ -1,4 +1,4 @@ -/* $TOG: Login.c /main/43 1998/02/11 10:00:37 kaleb $ */ +/* $TOG: Login.c /main/43 1998/02/11 10:00:37 kaleb $ */ /* Copyright 1988, 1998 The Open Group @@ -533,6 +533,44 @@ /*ARGSUSED*/ static void +TraverseField (ctxw, event, params, num_params) + Widget ctxw; + XEvent *event; + String *params; + Cardinal *num_params; +{ + /* traverse-field(1) forward + * traverse-field(-1) backward + */ + LoginWidget ctx = (LoginWidget)ctxw; + static int traverseList[] = { GET_NAME, GET_PASSWD }; + int i; + + XorCursor (ctx); + RemoveFail (ctx); + + for ( i=0; ; i++) { + if ( i >= XtNumber(traverseList) ) goto nomatch; /* error */ + if (traverseList[i] == ctx->login.state) break; + } + if (*num_params > 0) { + if (!strncmp(params[0], "forward", 4)) i++; + else if (!strncmp(params[0], "backward", 4)) i--; + else i += atoi(params[0]); + } else { + i++; + } + i = i % XtNumber(traverseList); + + ctx->login.state = traverseList[i]; + ctx->login.cursor = 0; + +nomatch: ; + XorCursor (ctx); +} + +/*ARGSUSED*/ +static void AllowAccess (ctxw, event, params, num_params) Widget ctxw; XEvent *event; @@ -852,6 +890,7 @@ {"erase-to-end-of-line", EraseToEndOfLine}, {"erase-line", EraseLine}, {"finish-field", FinishField}, + {"traverse-field", TraverseField}, {"abort-session", AbortSession}, {"abort-display", AbortDisplay}, {"restart-session", RestartSession},