3.4.4 ΓΕΓΟΝΟΤΑ ΠΛΗΚΤΡΟΛΟΓΙΟΥ


Όταν έχουμε ένα γεγονός από το πληκτρολόγιο για να το αποκρυπτογραφήσουμε χρησιμοποιούμε τη συνάρτηση XLookupString ο ορισμός της οποίας βρίσκεται στο αρχείο Xutil.h:

    (int) XLookupString(
        XKeyEvent*       /* event_struct */,
        char*            /* buffer_return */,
        int              /* bytes_buffer */,
        KeySym*          /* keysym_return */,
        XComposeStatus*  /* status_in_out */
    );
Η XLookupString λαμβάνει για ορίσματα την ένωση XEvent (πεδίο της είναι η XKeyEvent), ένα buffer, το μήκος του, ένα δείκτη σε τύπο KeySym ενώ το τελευταίο όρισμα αγνοείται. Στο buffer περνάει η ASCII τιμή του πλήκτρου που πατήθηκε (αν έχει), στο keysym περνάει μια πιο γενική τιμή του πλήκτρου, ενω η συνάρτηση επιστρέφει απευθείας και τον αριθμό των χαρακτήρων που γράφτηκαν στο buffer (συνήθως ένας εκτός αν κάποιο πλήκτρο έχει οριστεί να τυπώνει περισσότερους από ένα χαρακτήρες).

Στο keysym αποθηκεύεται η τιμή του πλήκτρου όταν αυτό δέν είναι απλός αλφαριθμητικός χαρακτήρας. Στο αρχείο keysymdefs.h υπάρχουν προκαθορισμένες σταθερές (defines) για τα διάφορα πλήκτρα (XK_Return, XK_Backspace, XK_Delete, XK_Up, XK_Down, XK_Right, XK_Left, XK_F1, XK_F2, ..., XK_KP_... για το αριθμητικό πληκτρολόγιο κτλ.). Αν θέλουμε να το χρησιμοποιήσουμε πρέπει να το συμπεριλαβουμε στον κώδικά μας (με #include). Έτσι εξετάζοντας το keysym μπορούμε να έχουμε πρόσβαση σε όλα τα πλήκτρα του πληκτρολογίου.

Τέλος εξετάζοντας το πεδίο state του XKeyEvent μπορούμε να μάθουμε άν όταν πατήθηκε το πλήκτρο ήταν πατημενο και κάποιο άλλο ειδικό πλήκτρο, όπως και με τα γεγονότα MotionNotify. Ακολουθεί μια υλοποίηση της keypressed με βάση τα παραπάνω:

    int keypressed( XKeyEvent *event )
    {
        int     quit = 0;
        int     lenght,
                bufferlength = 64;
        char    buffer[65];
        KeySym  keysym;
    
        length = XLookupString( envent,
                    buffer, bufferlength,
                    &keysym, NULL );
        if( (keysym >= ' ') && (keysym <= '~' ) )
        {
            printf( "Key \"%s\" was pressed\n", buffer );
            switch( event->state )
            {
                case ShiftMask :
                    printf("Shift Key was pressed too\n");
                    break;
                case LockMask :
                    printf("Caps Lock was pressed too\n");
                    break;
                case  ControlMask :
                    printf("Control Key was pressed too\n");
                    break;
            }
        }
        else
            switch( keysym )
            {
                case XK_BackSpace :
                    printf("BackSpace was pressed\n");
                    break;
                case XK_Up :
                    printf("Cursor Up was pressed\n");
                    break;
                .
                .
                .
                case XK_F1 :
                    printf("Function Key 1 was pressed\n");
                    break;
                .
                .
                .
                case XK_KP_Enter :
                    printf("KeyPad Enter was pressed\n");
                    break;
                .
                .
                .
            }
        if( (keysym == 'q') && (event->state == Mod1Mask) )
        {
            printf("Quiting...\n");
            quit++;
        }
        return quit;
    }

[prev] [up] [next] [contents] [index]