Linux/X11 вводят библиотеку, не создавая окно

7
задан rck 17 September 2008 в 23:27
поделиться

2 ответа

Хорошо, если Вы находитесь под X11, и Вы хотите получить kbd, необходимо сделать захват. Если Вы не, мой единственный хороший ответ является ncurses от терминала.

Вот то, как Вы захватываете все с клавиатуры и выпуска снова:

/* Demo code, needs more error checking, compile
 * with "gcc nameofthisfile.c -lX11".

/* weird formatting for markdown follows.  argh! */

#include <X11/Xlib.h>

int main(int argc, char **argv)
{
   Display *dpy;
   XEvent ev;
   char *s;
   unsigned int kc;
   int quit = 0;

   if (NULL==(dpy=XOpenDisplay(NULL))) {
      perror(argv[0]);
      exit(1);
   }

   /*
    * You might want to warp the pointer to somewhere that you know
    * is not associated with anything that will drain events.
    *  (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y);
    */

   XGrabKeyboard(dpy, DefaultRootWindow(dpy),
                 True, GrabModeAsync, GrabModeAsync, CurrentTime);

   printf("KEYBOARD GRABBED!  Hit 'q' to quit!\n"
          "If this job is killed or you get stuck, use Ctrl-Alt-F1\n"
          "to switch to a console (if possible) and run something that\n"
          "ungrabs the keyboard.\n");


   /* A very simple event loop: start at "man XEvent" for more info. */
   /* Also see "apropos XGrab" for various ways to lock down access to
    * certain types of info. coming out of or going into the server */
   for (;!quit;) {
      XNextEvent(dpy, &ev);
      switch (ev.type) {
         case KeyPress:
            kc = ((XKeyPressedEvent*)&ev)->keycode;
            s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));
            /* s is NULL or a static no-touchy return string. */
            if (s) printf("KEY:%s\n", s);
            if (!strcmp(s, "q")) quit=~0;
            break;
         case Expose:
               /* Often, it's a good idea to drain residual exposes to
                * avoid visiting Blinky's Fun Club. */
               while (XCheckTypedEvent(dpy, Expose, &ev)) /* empty body */ ;
            break;
         case ButtonPress:
         case ButtonRelease:
         case KeyRelease:
         case MotionNotify:
         case ConfigureNotify:
         default:
            break;
      }
   }

   XUngrabKeyboard(dpy, CurrentTime);

   if (XCloseDisplay(dpy)) {
      perror(argv[0]);
      exit(1);
   }

   return 0;
}

Выполните это от терминала, и все kbd события должны поразить его. Я тестирую его в соответствии с Xorg, но это использует почтенные, стабильные механизмы Xlib.

Надеюсь, это поможет.

БУДЬТЕ ОСТОРОЖНЫ с захватами под X. Когда Вы плохо знакомы с ними, иногда это - хорошая идея запустить процесс с временной задержкой, который не захватит сервер, когда Вы протестируете код и позволяете ему находиться и выполнить и не захватывать каждые несколько минут. Это сохраняет необходимость уничтожить или переключиться далеко от сервера для внешнего сброса состояния.

Отсюда, я предоставлю Вам право решать, как мультиплексировать рендеринг. Прочитайте документы XGrabKeyboard и документы XEvent для начала работы. Если Вам выставили маленькие окна в экранных углах, Вы могли бы запихнуть указатель в один угол для выбора контроллера. XWarpPointer может пихнуть указатель на одного из них также из кода.

Еще одна точка: можно захватить указатель также и другие ресурсы. Если бы у Вас был один контроллер, работающий на поле, перед которым Вы сидите, то Вы могли использовать вход клавиатуры и мыши для переключения его между открытыми сокетами с различными рендерерами. Вы не должны должны быть изменять размер окна вывода на меньше, чем полный экран больше с этим подходом, когда-либо. С большим количеством работы Вы могли на самом деле отбросить смешанные альфой оверлейные программы на вершине с помощью ФОРМЫ и СОСТАВИТЬ расширения для получения хорошей функции наложения в ответ на ввод данных пользователем (который мог бы рассчитать как золочение лилии).

7
ответ дан 7 December 2019 в 03:23
поделиться

Для мыши можно использовать GPM.

Я не уверен первое, что пришло на ум для клавиатуры или джойстика.

Это, вероятно, не было бы слишком плохо для чтения непосредственно прочь там /dev файлы в случае необходимости.

Надежда это помогает

2
ответ дан 7 December 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: