sco启动图形界面与numlock的问题

发表于:2007-05-26来源:作者:点击数: 标签:
sco在启动后一般不自动激活numlock键。有一个程序是启动numlock,可以加入到/etc/inittab中,当机器启动时自动激活numlock,免去了很多麻烦。 但是,当图形界面不启动(scologindisable)在启动机器时,numlock键能够激活。当图形界面启动(scologinenable)在

sco在启动后一般不自动激活numlock键。有一个程序是启动numlock,可以加入到/etc/inittab中,当机器启动时自动激活numlock,免去了很多麻烦。
但是,当图形界面不启动 (scologin disable )在启动机器时,numlock键能够激活。当图形界面 启动 (scologin enable )在启动机器时, numlock键就不能够激活。我看了一下/usr/lib/X11/scologin下的文件没有找出原因。请各位同行研究研究。

 zhkun 回复于:2004-09-19 09:53:02
我在/etc/rc 加入了,机器自动启动到图形界面时,numlock灯熄灭。
在/etc/rc2.d/S9xxxx 加入了,机器自动启动到图形界面时,numlock灯熄灭。
在/usr/lib/X11/scologin/X...的文件中也加入了,机器自动启动到图形界面时,numlock灯熄灭。
最后在/etc/profile加入是可以,但是有些用户不能启动/dev/console。况且当有的用户名是带有数字的时候,也同样是个麻烦。
请高手们,点拨。

 CNL 回复于:2004-09-19 10:35:02
1、在/etc/rc2中‘The system is ready.’那行前加
2、不行的话,debug跟踪修改scologin程序代码,把numlock那段代码封掉
有必要吗?

 zhkun 回复于:2004-09-19 10:41:46
您好,怎么跟踪呀,指点一下。
谢谢!!!

 CNL 回复于:2004-09-19 10:45:16
使用dbXtra跟踪吧,建议先看SCO培训手册,
否则我至少要回复你100多次问题   :em06:

 zhkun 回复于:2004-09-19 11:39:43
CNL真是对不起,既然回复100次,多一次也不多吗,谢谢啦。这边有礼了!!!

 zhkun 回复于:2004-09-19 11:43:46
CNL:dbXtra不是调试C程序的吗?这个C(指numlock)是别人编译好的。我只是将它加入到某某个地方,在机器启动时既能到达启动图形画面又能启动数字键盘的目的。
谢谢啦!!!

 CNL 回复于:2004-09-19 11:55:46
老大,你还真准备去debug啊,的确没有源代码你只能使用adb调试了,
不过前提你需要掌握AT&T标准的汇编语言,而且精通SCO底层函数的中断调用,
没有这些基础,恐怕是很艰难的工作,有必要吗??

 zhkun 回复于:2004-09-19 12:03:09
CNL老大:我只是将它加入到某某个地方,在机器启动时既能到达启动图形画面又能启动数字键盘的目的。不需要搞太复杂了吧。

 CNL 回复于:2004-09-19 12:09:44
1、启动scologin图形界面时scologin程序本身会把numlock灭掉,除非你不进入图形模式
2、我不是建议你修改/etc/rc2文件试一下吗,你试了吗? :em02:

 zhkun 回复于:2004-09-19 12:29:10
加在/etc/rc2.d/S9xxxxxxx中试过啦,不行。

 sdccf 回复于:2004-09-19 12:36:51
numlock有源代码的。

 CNL 回复于:2004-09-19 12:42:32
老大,i 服了you
你编辑/etc/rc2文件,rc2本身就是个文件!!!

 zhkun 回复于:2004-09-19 16:43:03
sorry,我没有明白您的意思。
sdccf:有源代码。

 zhkun 回复于:2004-09-19 16:57:48
CNL老大:加入/etc/rc2中也不行,只要自动启动图形界面后,到终端出现login,numlock灯都不亮。

 CNL 回复于:2004-09-19 18:43:18
那就没办法了,
你干吗非要自动启动图形界面呢,
把它先disable掉启动机器后用的时候再enable不行吗

给你个尝试的思路:
直接编辑/etc/inittab,
把终端对应的那行比如tty21A之类的/etc/getty改为你自己的一个shell,
这个shell里面先执行你的numlock,再执行/etc/getty,
注意把getty原来的参数带上。
如果可以的话,还要修改/etc/conf/cf.d/init.base,
否则一重连核心inittab就复原了

 lvgq2001 回复于:2004-09-19 23:28:00
不用讨论了,因为那个自动numlock程序本来就是for控制台的,
在图形界面下它不能生效,而且SCO一进图形界面自动将numlock
复位成为off状态!!!
俺在网上找到一个numlockx是for Xwindows版的,但是在SCO
平台下我费了九牛二虎之力好不容易编译通过了,执行时虽然不报错,
但仍然无效,不知道那位大虾能够解决一下?!
地址:http://ktown.kde.org/~seli/numlockx/
另外一个类似程序(核心代码是一样的。)
[code:1:268069e4dc]
#include <X11/extensions/XTest.h>
#include <X11/keysym.h>
#include <X11/Xlib.h>

int main()
{
  Display *disp = XOpenDisplay(NULL);
  if(disp==NULL)
    return 1;

  XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_Num_Lock), True, CurrentTime);
  XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_Num_Lock), False, CurrentTime);
  XCloseDisplay(disp);

  return 0;
}
[/code:1:268069e4dc]

 lvgq2001 回复于:2004-09-19 23:29:44
忘了说明一下:在SCO下编译需加入 -lsocket 连接选项!

 CNL 回复于:2004-09-20 08:26:52
//  XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_Num_Lock), False, CurrentTime); 
把这行封掉试一下

 zhkun 回复于:2004-09-20 08:35:12
/*
 * Program to control the console lock keys states
 *
 * Build with "cc -o lockkeys lockkeys.c"
 * cp lockkeys numlock.init.string /etc/
 * in /etc/inittab
 * "snum::sysinit:/etc/lockkeys numlock on </dev/console>/dev/console 2>&1"
 */
#include <stdio.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/vtkd.h>

#define RDFD       0
#define CAPSLOCK   0x01
#define NUMLOCK    0x02
#define SCROLLLOCK 0x04

void main( argc, argv )
int argc;
char *argv[];
{
        char c;
        int function, key;

        if ( argc != 3 ) {
                fprintf( stderr, "Usage: lockkeys key on | off | toggle\n" );
                exit( 1 );
        }

        if ( !strcmp( argv[2], "off" ))
                function=0;
        else if ( !strcmp( argv[2], "on" ))
                function=1;
        else if ( !strcmp( argv[2], "toggle" ))
                function=2;
        else {
                fprintf( stderr,
                        "lockkeys: function must be on, off, or toggle\n" );
                exit( 1 );
        }

        if ( !strcmp( argv[1], "numlock" ))
                key=NUMLOCK;
        else if ( !strcmp( argv[1], "capslock" ))
                key=CAPSLOCK;
        else if ( !strcmp( argv[1], "scrolllock" ))
                key=SCROLLLOCK;
        else {
                fprintf( stderr,
                        "lockkeys: key must be numlock, capslock, or scrolllock\n" );
                exit( 1 );
        }

        if ( ioctl( RDFD, KDGETLED, &c ) != 0 ) {
                perror( "lockkeys: can't get current lock state" );
                exit( 2 );
        }
        if ( function == 0 )
                c &= ~key;
        else if ( function == 1 )
                c |=  key;
        else
                c ^=  key;
        if ( ioctl( RDFD, KDSETLED, c ) != 0 ) {
                perror( "lockkeys: error setting lock state" );
                exit( 2 );
        }
        exit( 0 );
}

 CNL 回复于:2004-09-20 08:55:43
楼上的程序应只对控制台</dev/console>有效
开终端的numlock需要对应终端的转义序列,应当更简单,
echo一下即可,但我很长时间没有搞过终端了,你自己查终端随机手册吧

 zhkun 回复于:2004-09-20 09:13:08
lvgq2001说的也是,但是我觉得既要能够启动numlock,又能启动图形界面,那么既可以屏保,使用有方便,何乐而不为呢?
我原来就是使用没有图形界面的,并启动numlock。现在觉得两者更方便。

 zhkun 回复于:2004-09-20 10:46:32
请CNL能不能编译好之后,我们使用。谢谢CNL!!!

 CNL 回复于:2004-09-20 10:54:29
抱歉,我看了手头的机器,没有装X11开发环境,没有X11的库函数,编译不了
我把步骤贴出来,哪位有X11的试一下吧。
不知道结果怎么样。
# cc -o Xnumlock Xnumlock.c
[code:1:d50441b0ee]
#include <X11/extensions/XTest.h> 
#include <X11/keysym.h> 
#include <X11/Xlib.h> 

int main() 

  Display *disp = XOpenDisplay(NULL); 
  if(disp==NULL) 
    return 1; 

  XTestFakeKeyEvent(disp, XKeysymToKeycode(disp, XK_Num_Lock), True, CurrentTime);  // 开numlock灯
  XCloseDisplay(disp); 
  return 0; 

[/code:1:d50441b0ee]

 zhkun 回复于:2004-09-20 11:12:33
我编译了,但是有错误。一种是:
cc -o num num.c -lsocket
提示:
undefined                       first referenced
 symbol                             in file
XOpenDisplay                        num.o
XKeysymToKeycode                    num.o
XTestFakeKeyEvent                   num.o
XCloseDisplay                       num.o
i386ld fatal: Symbol referencing errors. No output written to num

另一种是:
cc -o num num.c
undefined                       first referenced
 symbol                             in file
XOpenDisplay                        num.o
XKeysymToKeycode                    num.o
XTestFakeKeyEvent                   num.o
XCloseDisplay                       num.o
i386ld fatal: Symbol referencing errors. No output written to num

请CNL查看。谢谢。

 zhkun 回复于:2004-09-20 13:50:50
请sdccf、CNL等高手看看。

 CNL 回复于:2004-09-20 15:12:44
cc -o num num.c -lXtst -lXext -lX11 -lsocket
试一下

 zhkun 回复于:2004-09-20 15:22:13
提示:

cc -o num num.c -lX11 -lXtst -lsocket
undefined                       first referenced
 symbol                             in file
XQueryExtension                     /usr/lib/libXtst.a
XextCreateExtension                 /usr/lib/libXtst.a
XextFindDisplay                     /usr/lib/libXtst.a
XextAddDisplay                      /usr/lib/libXtst.a
XextRemoveDisplay                   /usr/lib/libXtst.a
XMissingExtension                   /usr/lib/libXtst.a
i386ld fatal: Symbol referencing errors. No output written to num
#

 CNL 回复于:2004-09-20 15:25:27
顺序错误且缺少-lXext

 zhkun 回复于:2004-09-20 15:41:52
# cc -o num num.c -lX11 -lXtst -lXext -lsocket
i386ld libsocket.a fatal: Can't o-lXext for input
#
# cc -o num num.c  -lX11 -lXext -lXtst -lsocket
i386ld libXtst.a: can't f.ad library libsocket
#
# cc -o num num.c -lXext -lX11 -lXtst -lsocket
undefined                       first referenced
 symbol                             in file
XQueryExtension                     /usr/lib/libXtst.a
XextCreateExtension                 /usr/lib/libXtst.a
XextFindDisplay                     /usr/lib/libXtst.a
XextAddDisplay                      /usr/lib/libXtst.a
XextRemoveDisplay                   /usr/lib/libXtst.a
XMissingExtension                   /usr/lib/libXtst.a
i386ld fatal: Symbol referencing errors. No output written to num
#
请查看

 zhkun 回复于:2004-09-20 15:45:17
# cc -o num num.c -lX11 -lXtst -lXext -lsocket
undefined                       first referenced
 symbol                             in file
XQueryExtension                     /usr/lib/libXtst.a
XInitExtension                      /usr/lib/libXext.a
XESetWireToEvent                    /usr/lib/libXext.a
XESetEventToWire                    /usr/lib/libXext.a
XESetCreateGC                       /usr/lib/libXext.a
XESetCopyGC                         /usr/lib/libXext.a
XESetFlushGC                        /usr/lib/libXext.a
XESetFreeGC                         /usr/lib/libXext.a
XESetCreateFont                     /usr/lib/libXext.a
XESetFreeFont                       /usr/lib/libXext.a
XESetCloseDisplay                   /usr/lib/libXext.a
XESetError                          /usr/lib/libXext.a
XESetErrorString                    /usr/lib/libXext.a
i386ld fatal: Symbol referencing errors. No output written to num
#

 lw371 回复于:2004-09-20 15:51:23
楼上你为什么不按CNL说的做呢,你看错了吗??
# cc -o num num.c -lXtst -lXext -lX11 -lsocket

 zhkun 回复于:2004-09-20 16:11:29
# cc -o num num.c -lXtst -lXext -lX11 -lsocket
可以了,但是运行


我把numlock指示灯熄灭
#chmod 777 num
#./num 
稍等numlock灯不亮。说明上述程序有问题。

 lvgq2001 回复于:2004-09-20 22:16:43
关于该问题的讨论基本可以结束了,本人在总结了CNL的经验
和抄袭了numlockx 1.0的部分代码之后,编译并运行成功!
代码如下:
[code:1:333563ce7e]
/****************************************************************************

 XNumLock fro SCO OpenServer 5.X
 
 Copyright (C) 2004 Lv Yonghui <lvgq2001@163.com>

 Compiler: cc -o Xnumlock Xnumlock.c -lXtst -lXext -lX11 -lsocket
           strip Xnumlock

****************************************************************************/

#define PACKAGE "Xnumlock"
#define VERSION "1.0"

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>
#include <X11/keysym.h>

void usage( const char* argv0 )
    {
    printf( "NumLockX " VERSION "\n"
        "(C) 2004      Lv Yonghui  <lvgq2001@163.com>\n"
        "Usage : %s [on|off]\n"
        "on     - turns NumLock on in X ( default )\n"
        "off    - turns NumLock off in X\n"
        "\n"
        , argv0 );
    }

Display* dpy;

int xtest_get_numlock_state()
    {
    int i;
    int numlock_mask = 0;
    Window dummy1, dummy2;
    int dummy3, dummy4, dummy5, dummy6;
    unsigned int mask;
    XModifierKeymap* map = XGetModifierMapping( dpy );
    KeyCode numlock_keycode = XKeysymToKeycode( dpy, XK_Num_Lock );
    if( numlock_keycode == NoSymbol )
        return 0;
    for( i = 0;
         i < 8;
         ++i )
        {
if( map->modifiermap[ map->max_keypermod * i ] == numlock_keycode )
numlock_mask = 1 << i;
}
    XQueryPointer( dpy, DefaultRootWindow( dpy ), &dummy1, &dummy2,
        &dummy3, &dummy4, &dummy5, &dummy6, &mask );
    XFreeModifiermap( map );
    return mask & numlock_mask;
    }

void xtest_change_numlock_on()
    {
    XTestFakeKeyEvent( dpy, XKeysymToKeycode( dpy, XK_Num_Lock ), True, CurrentTime );
    }

void xtest_change_numlock_off()
    {
    XTestFakeKeyEvent( dpy, XKeysymToKeycode( dpy, XK_Num_Lock ), False, CurrentTime );
    }

void xtest_set_on()
    {
    if( !xtest_get_numlock_state())
        xtest_change_numlock_on();
    }

void xtest_set_off()
    {
    if( xtest_get_numlock_state())
        xtest_change_numlock_off();
    }

void numlock_set_on()
    {
    xtest_set_on();
    }

void numlock_set_off()
    {
    xtest_set_off();
    }

int main( int argc, char* argv[] )
    {
    if( argc > 2 )
        {
        usage( argv[ 0 ] );
        return 1;
        }
    dpy = XOpenDisplay( NULL );
    if( dpy == NULL )
        {
        fprintf( stderr, "Error opening display!\n" );
        return 1;
        }
    if( argc == 1 )
        numlock_set_on();
    else if( strcmp( argv[ 1 ], "on" ) == 0 )
        numlock_set_on();
    else if( strcmp( argv[ 1 ], "off" ) == 0 )
        numlock_set_off();
    else
        {
        usage( argv[ 0 ] );
        XCloseDisplay( dpy );
        return 2;
        }
    XCloseDisplay( dpy );
    return 0;
    }
[/code:1:333563ce7e]
运行方式:Xnumlock on 开启数字锁
          Xnumlock off 关闭数字锁
但是开启或关闭后NumLock灯并不发生变化,但是小键盘区的键的确有变化。
(原因不得而知!:))
另外,通过我的实验,在scologin的登录窗口下无法执行该命令,基本上没有
地方可以将该程序加进X的启动过程中,只能加到用户登录后的ScoSession
过程中去,做法是将如下代码加入到/usr/lib/X11/sco/ScoSession/startup文件中
[code:1:333563ce7e]
/usr/bin/X11/Xnumlock on
[/code:1:333563ce7e]
如果那位大虾能够想办法让scologin支持numlock请转告一下!

 zhkun 回复于:2004-09-21 08:37:13
lvgq2001 先生,既然到现在没有搞清楚就不必讨论了,为什么还叫别人告诉您呢?讨论不就是辨别是非,最终有个清楚的认识吗?您说呢?
您的源代码我编译了,反正在我的机器上,不论使用什么on or off 都是一样,numlock灯都是无反应。

 lvgq2001 回复于:2004-09-21 10:13:09
zhkun兄弟请你不要急躁,你可能没有看清楚我的帖子,我已经说明了
程序是有效的,Xnumlock on 之后无论numlock灯是否发生变化,
小键盘区的确是输入的“数字”!!!off后就变成了光标移动键。
我想你不会硬要灯亮,而不管是否能够输入数字吧?!
下次请先全面测试清楚后再发表你的言论,谢谢!

 zhkun 回复于:2004-09-21 11:31:32
岂敢岂敢。谢谢您多提醒,俺等着您的结果。最好是成功的消息,我多么想使用呀!!!

 sdccf 回复于:2004-09-21 12:07:58
lvgq2001 做的已经可以使用了,只是NumLock指示灯不亮而已.

 zhkun 回复于:2004-09-21 13:51:25
我编译后,按照说明的,为什么不能使用,况且在图形界面中,输入用户名和密码,怎么也进入不到图形桌面,图形闪了一下又回到注册状态?

 zhkun 回复于:2004-09-21 14:19:39
各位老大:您们可能有些误解我的意思了。
  我想:在机器启动时图形界面也启动,在这种情况下,如果在图形界面输入带有数字名称的用户名时,不按numlock键(即使numlock灯不亮也无妨),就可以把数字输入到位(不使用大键盘的数字)。
  在机器启动时图形界面也启动,在这种情况下,我切换其它屏幕也同时不要按numlock键,就可以使用数字小键盘,这样,当要使用数字就可以使用,不使用键盘,图形界面同时也可以处在屏保状态。两者何乐而不为呢?!!!!!
(我不是说从图形界面进入桌面的unix提示符状态,numlock灯不亮,老大的程序不可以使用。我试验过了,进入图形桌面的unix提示符状态,程序没有把numlock点亮,但数字键盘是可以使用的).

 zhkun 回复于:2004-09-22 07:33:35
go on。

原文转自:http://www.ltesting.net