⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 event.c

📁 这是一个介绍 linux 编程知识的文章。
💻 C
📖 第 1 页 / 共 2 页
字号:
        event = vga_waitevent(VGA_MOUSEEVENT | VGA_KEYEVENT,
                              NULL, NULL, NULL, &timeout);
    }
    else {
        if(mouse_update()) event |= VGA_MOUSEEVENT;
        if(keyboard_update()) event |= VGA_KEYEVENT;
    }
    
    if( event == 0 && wait) {
        
        if(timeout.tv_sec == 0 && timeout.tv_usec == 0) {
            lwe->type = LWETYPE_TIMEOUT;
            lwe->count = ++timeout_count;
            return 1;
        }
        return 0;
    }

    timeout_count = 0;
    // There was a event occurred.
    if (event & VGA_MOUSEEVENT) {
        lwe->type = LWETYPE_MOUSE;
        if (RefreshCursor(&me->x, &me->y, &button))
        {
            me->event = ME_MOVED;
            timerclear(&time1);
            timerclear(&time2);

            return 1;
        }
        
        if (oldbutton == button)
            return 0;

        if ( !(oldbutton & MOUSE_LEFTBUTTON) && 
              (button & MOUSE_LEFTBUTTON) )
        {
            if( timerisset(&time1) )	// check double click
            {
                gettimeofday(&temp, NULL);
                secinter = temp.tv_sec - time1.tv_sec;
                usecinter = (temp.tv_usec - time1.tv_usec)/1000;
                if(usecinter < 0)
                    usecinter += 1000;
                if( secinter < 2 && usecinter <= dblclicktime )
                    me->event = ME_LEFTDBLCLICK;
                else
                    me->event = ME_LEFTDOWN;

                timerclear(&time1);
            }
            else
            {
                gettimeofday(&time1, NULL);
                me->event = ME_LEFTDOWN;
            }
            goto mouseret;
        }

        if ( (oldbutton & MOUSE_LEFTBUTTON) && 
             !(button & MOUSE_LEFTBUTTON) )
        {
            me->event = ME_LEFTUP;
            goto mouseret;
        }

        if ( !(oldbutton & MOUSE_RIGHTBUTTON) && 
              (button & MOUSE_RIGHTBUTTON) )
        {
            if( timerisset(&time2) )	// check double click
            {
                gettimeofday(&temp, NULL);
                secinter = temp.tv_sec - time2.tv_sec;
                usecinter = (temp.tv_usec - time2.tv_usec)/1000;
                if(usecinter < 0)
                    usecinter += 1000;
                if( secinter < 2 && usecinter <= dblclicktime )
                    me->event = ME_RIGHTDBLCLICK;
                else
                    me->event = ME_RIGHTDOWN;

                timerclear(&time2);
            }
            else
            {
                gettimeofday(&time2, NULL);
                me->event = ME_RIGHTDOWN;
            }
            goto mouseret;
        }

        if ( (oldbutton & MOUSE_RIGHTBUTTON) && 
            !(button & MOUSE_RIGHTBUTTON) )
        {
            me->event = ME_RIGHTUP;
            goto mouseret;
        }
    }

    if(event & VGA_KEYEVENT) {
        lwe->type = LWETYPE_KEY;
        keystate = keyboard_getstate();
        for(i = 0; i < NR_KEYS; i++) {
            if(!oldkeystate[i] && keystate[i]) {
                 ke->event = KE_KEYDOWN;
                 ke->scancode = i;
                 olddownkey = i;
                 break;
            }
            if(oldkeystate[i] && !keystate[i]) {
                 ke->event = KE_KEYUP;
                 ke->scancode = i;
                 break;
            }
        }
        if (i == NR_KEYS) {
            ke->event = KE_KEYDOWN;
            ke->scancode = olddownkey;
        }
        
        make = (ke->event == KE_KEYDOWN)?1:0;

        if (i != NR_KEYS) {
            switch (ke->scancode) {
                case SCANCODE_CAPSLOCK:
                    if (make && caps_off) {
                        capslock = 1 - capslock;
                        set_leds();
                    }
                    caps_off = 1 - make;
                break;
                    
                case SCANCODE_NUMLOCK:
                    if (make && num_off) {
                        numlock = 1 - numlock;
                        set_leds();
                    }
                    num_off = 1 - make;
                break;
                
                case SCANCODE_SCROLLLOCK:
                    if (make & slock_off) {
                        slock = 1 - slock;
                        set_leds();
                    }
                    slock_off = 1 - make;
                    break;

                case SCANCODE_LEFTCONTROL:
                    control1 = make;
                    break;
                    
                case SCANCODE_RIGHTCONTROL:
                    control2 = make;
                    break;
                    
                case SCANCODE_LEFTSHIFT:
                    shift1 = make;
                    break;
                    
                case SCANCODE_RIGHTSHIFT:
                    shift2 = make;
                    break;
                    
                case SCANCODE_LEFTALT:
                    alt1 = make;
                    break;

                case SCANCODE_RIGHTALT:
                    alt2 = make;
                    break;
                    
            }

            status &= 0xFFFFF0C0;

            status |= (DWORD)((capslock << 8) |
                             (numlock << 7)   |
                             (slock << 6)     |
                             (control1 << 5)  |
                             (control2 << 4)  |
                             (alt1 << 3)      |
                             (alt2 << 2)      |
                             (shift1 << 1)    |
                             (shift2));
                             
            // Mouse button status
            if (oldbutton & MOUSE_LEFTBUTTON)
                status |= 0x00000100;
            else if (oldbutton & MOUSE_RIGHTBUTTON)
                status |= 0x00000200;
        }
        ke->status = status;
        memcpy(oldkeystate, keystate, NR_KEYS);
        return 1;
    } 

    return 0;

mouseret:
    status &= 0xFFFFF0FF;
    oldbutton = button;
    if (oldbutton & MOUSE_LEFTBUTTON)
        status |= 0x00000100;
    if (oldbutton & MOUSE_RIGHTBUTTON)
        status |= 0x00000200;
    me->status = status;
    return 1;
}

BOOL GUIAPI GetKeyStatus (UINT uKey)
{
    if (uKey & 0x0F00)      // this is a mouse key
        return oldbutton & (uKey >> 8);
    else if (uKey < NR_KEYS)
        return oldkeystate [uKey];

    return FALSE;
}

DWORD GUIAPI GetShiftKeyStatus (void)
{
    return status;
}

BOOL InitLWEvent(void)
{
    // Use raw keyboard.
    keyboard_translatekeys (TRANSLATE_KEYPADENTER 
                            | DONT_CATCH_CTRLC
                            | DONT_SWITCH_VT);

    if( keyboard_init() ) {
        return FALSE;
    }

    GetDblclickTime();
    GetTimeout();

    ResetMouseEvent();
    ResetKeyEvent();

    return TRUE;
}

void TerminateLWEvent(void)
{
    ResetMouseEvent ();
    ResetKeyEvent ();

    keyboard_close ();
    mouse_close ();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -