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。 |