Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104622376
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-16 22:39:08

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

XNumLock fro SCO OpenServer 5.X 

Copyright (C) 2004   Lv Yonghui    

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

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

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

#include  
#include  
#include  
#include  
#include  
#include  

void usage( const char* argv0 ) 
    { 
    printf( "NumLockX " VERSION "\n" 
        "(C) 2004      Lv Yonghui  \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; 
    } 
 

运行方式:Xnumlock on 开启数字锁 
Xnumlock off 关闭数字锁 
但是开启或关闭后NumLock灯并不发生变化,但是小键盘区的键的确有变化。 (原因不得而知!) 
另外,通过我的实验,在scologin的登录窗口下无法执行该命令,基本上没有地方可以将该程序加进X的启动过程中,只能加到用户登录后的ScoSession 过程中去,做法是将如下代码加入到/usr/lib/X11/sco/ScoSession/startup文件中 
代码: 

/usr/bin/X11/Xnumlock on 
阅读(586) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~