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

StackOverflow https://stackoverflow.com/questions/50182

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Отредактируйте, чтобы уточнить:
Средство визуализации имеет окно вывода, в его обычном варианте использования это окно является полноэкранным, за исключением случаев, когда они оба запущены на одном компьютере, просто чтобы можно было сфокусировать контроллер.На самом деле может быть несколько средств визуализации, отображающих разное представление одних и тех же данных на разных компьютерах, управляемых одним и тем же контроллером, следовательно, полное отделение ввода от вывода (что делает использование встроенных в X11 клиент-серверных материалов для отображения менее удобным) Кроме того, возможно использование нескольких приложений контроллера для одного средства визуализации.Связь между контроллерами и средствами визуализации осуществляется через сокеты.

Это было полезно?

Решение

Хорошо, если у вас младше 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, чтобы получить приятную функцию наложения в ответ на ввод пользователя (что может считаться позолотой лилии).

Другие советы

Для мыши вы можете использовать Скорость вращения в минуту.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top