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; }