2008-09-08 4 views
7

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

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

+0

Я удалил «ответ», который привел к пояснению выше ... Я думаю, что разъяснение должно остаться, но оно достаточно охватывает, что мой псевдо-ответ, который мог быть комментарием, можно полностью удалить. –

ответ

7

OK, если вы под 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. Когда вы новичок в них, иногда это хорошая идеи начать процесс задержки времени, который будет ungrab сервера, когда вы тестирования кода и дайте ему сидеть и работать и разграбить каждые пару минут. Это экономит на том, чтобы убить или переключиться с сервера на состояние внешнего сброса.

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

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

+0

Этот ответ + ответ GPM Брайена отвечает на мой вопрос, но я могу выбрать только один ответ. – rck

+0

Обратите внимание, что GPM, вероятно, не будет комфортно взаимодействовать с активным X на том же терминале ... внимательно прочитайте раздел раздела «ОШИБКИ». Даже если он выглядит работоспособным, я бы пошел на X-сервер для обоих видов событий. –

2

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

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

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

Надеется, что это помогает