Входная библиотека Linux / X11 без создания окна - PullRequest
7 голосов
/ 08 сентября 2008

Есть ли хорошая библиотека для использования для ввода пользовательского ввода в Linux с помощью мыши / клавиатуры / джойстика, которая не заставляет вас создавать видимое окно для этого? SDL позволяет вам разумно вводить пользовательский ввод, но, кажется, вынуждает вас создавать окно, что создает проблемы, если у вас есть абстрагированное управление, поэтому управляющий компьютер не обязательно должен быть таким же, как компьютер визуализации. Однако если машины управления и рендеринга совпадают, это приводит к появлению уродливого маленького окна SDL в верхней части экрана.

Изменить для уточнения :
Рендерер имеет окно вывода, в обычном случае использования, это окно полноэкранное, за исключением случаев, когда они оба работают на одном компьютере, так что можно сосредоточиться на контроллере. На самом деле может быть несколько средств визуализации, отображающих различное представление одних и тех же данных на разных компьютерах, управляемых одним и тем же контроллером, следовательно, полное разъединение ввода с выхода Можно использовать также несколько приложений контроллера для одного рендерера. Связь между контроллерами и визуализаторами осуществляется через сокеты.

Ответы [ 2 ]

7 голосов
/ 09 сентября 2008

ОК, если вы находитесь под 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 может и указывать на код указатель на один из них.

Еще один момент: вы можете взять указатель, а также другие ресурсы. Если у вас был один контроллер, работающий на коробке, перед которой вы сидите, вы можете использовать ввод с клавиатуры и мыши, чтобы переключать его между открытыми сокетами с различными средствами визуализации. При таком подходе вам больше не нужно изменять размер окна вывода до уровня ниже полного экрана. Если бы у вас было больше работы, вы могли бы на самом деле отбрасывать альфа-смешанные наложения сверху, используя расширения SHAPE и COMPOSITE, чтобы получить хорошую функцию наложения в ответ на ввод пользователя (который может считаться позолотой лилии).

2 голосов
/ 08 сентября 2008

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

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

Вероятно, было бы неплохо читать прямо там /dev файлы, если это необходимо.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...