2.3.1.4. Пример программы, работающей с клавиатурой.

    В данном разделе приводится фрагмент программы, которая распознает функциональные клавиши <F1>-<F5>, и при их нажатии печатает соответствующую строку. Программа также сопоставляет комбинации <Shift+Control+A> строку "EXIT". Эта комбинация используется для завершения программы.

........
Display	*prDisplay;
int	nScreenNum;
GC	prGC;
XEvent	rEvent;
Window	nWnd;
char	sKeyStr[20];
KeySym	nKeySym, naModList[2];
int	n;

/* Устанавливаем связь с сервером, получаем номер экрана . . . */
.........
/* Задаем соответствие символ-строка */
naModList[0] = XK_Control_L;
naModList[1] = XK_Shift_L;
XRebindKeysym (prDisplay, XK_F6, naModList, 2, "EXIT",
     strlen ("EXIT"));
    /* Цикл получения и обработки событий */

white (1) {
   XNextEvent (prDisplay, &rEvent);
   switch (rEvent.type) {
      ......
      case KeyPress :
         /* Очищаем строку */
         memset (sKeyStr, 0, sizeof (sKeyStr));

         /* Получаем строку, соответствующую событию */
         XLookupString (&rEvent.xkey, sKeyStr),
              sizeof (sKeyStr), &nKeySym, NULL);
         if ( !strcmp (sKeyStr, "EXIT"))
         {
            XFreeGC (prDisplay, prGC);
            XCloseDisplay (prDisplay);
            exit (0);
         }

         n = nKeySym == XK_F1 ? 1 :
             nKeySym == XK_F2 ? 2 :
             nKeySym == XK_F3 ? 3 :
             nKeySym == XK_F4 ? 4 :
             nKeySym == XK_F5 ? 5 : 0;

         if (n) {
            sprintf (sKeyStr, "F%d pressed.", n);
            XClearWindow (prDisplay, nWnd);
            XDrawString (prDisplay, nWnd, prGC, 10, 50,
                    sKeyStr, strlen (sKeyStr));
         }
         break;
   }
}
........