2008-09-08 15 views
7

Linux에서 마우스/키보드/조이스틱으로 사용자 입력을 수집하는 데 사용할 수있는 라이브러리가 있습니까? 그렇게하면 표시되는 창을 만들지 않아도됩니까? SDL을 사용하면 합리적인 방법으로 사용자 입력을 얻을 수 있지만 창을 만들어야하는 것처럼 보입니다. 추상화 된 컨트롤을 사용하면 컨트롤 머신이 렌더 머신과 같을 필요가 없습니다. 그러나 컨트롤과 렌더 기기가 동일하면 디스플레이 상단에 못 생기는 작은 SDL 창이 생깁니다. 명확히하기 위해창을 만들지 않고 Linux/X11 입력 라이브러리

편집 :
렌더러는 정상적인 사용의 경우, 해당 창은 전체 화면들은 모두가를 제공 할 수 있습니다 만, 그래서 동일한 컴퓨터에서 실행중인 경우를 제외하고, 출력 창이 있습니다 컨트롤러 포커스. 실제로 동일한 컨트롤러에 의해 제어되는 서로 다른 컴퓨터에서 동일한 데이터의 다른 뷰를 표시하는 렌더러가 여러 개있을 수 있으므로 출력에서 ​​입력을 전체적으로 분리 할 수 ​​있습니다 (디스플레이에 내장 된 X11 클라이언트/서버 구성 요소를 덜 활용하여 또한 하나의 렌더러를위한 다중 컨트롤러 어플리케이션도 가능합니다. 컨트롤러와 렌더러 사이의 통신은 소켓을 통해 이루어집니다.

+0

위의 설명을 이끌어 낸 "대답"이 삭제되었습니다. 설명을 유지해야한다고 생각하지만 주석이 될 수있는 의사 답변은 완전히 삭제 될 수 있습니다. –

답변

7

확인을 도움이되기를 바랍니다. 당신이 아니라면, 내 유일한 좋은 대답은 터미널에서 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 메커니즘을 사용합니다.

희망이 도움이됩니다.

때때로 그것은 당신이 테스트 코드가되면 서버를 ungrab하는 시간 지연 프로세스를 시작하고 앉아서 실행할 수 있도록하고 좋은 생각, 당신은 그들에게 새가되면이 X 잡고 조심 몇 분마다 해제하십시오. 서버를 강제 종료하거나 외부로 다시 설정하지 않아도됩니다.

여기에서 렌드를 다중 전송하는 방법을 결정하겠습니다. 시작하려면 XGrabKeyboard docs 및 XEvent 문서 을 읽으십시오. 작은 창문이 화면 모서리에 노출되어있는 경우 포인터를 한 모퉁이에 끼워 컨트롤러를 선택할 수 있습니다. XWarpPointer 코드에서 그들 중 하나뿐만 아니라 포인터를 밀 수 있습니다.

한 번 더 : 포인터와 다른 리소스를 가져올 수 있습니다. 하나의 컨트롤러가 앞에 앉아있는 상자에서 실행 중이면 키보드 및 마우스 입력을 사용하여 다른 렌더러가있는 열린 소켓간에이를 전환 할 수 있습니다.이 방식을 사용하면 출력 창 크기를 전체 화면보다 작게 조정할 필요가 없습니다. 더 많은 작업을 통해 SHAPE 및 COMPOSITE 확장을 사용하여 실제로 알파 블렌딩 된 오버레이를 드롭하여 사용자 입력에 대한 응답으로 멋진 오버레이 기능을 얻을 수 있습니다 (백합을 누적하는 것으로 간주 할 수 있음).

+0

이 답변 + Brian에 의한 GPM 대답은 내 질문에 대한 답변이지만 1 개의 답변 만 선택할 수 있습니다. – rck

+0

GPM은 아마도 같은 터미널에서 X active와 쉽게 상호 작용하지 않을 것입니다 ... 매뉴얼 페이지 "버그"섹션의 끝 부분을주의 깊게 읽으십시오. 실행 가능한 것으로 보일지라도 두 종류의 이벤트 모두에 대해 X 서버로 이동합니다. –

2

마우스의 경우 GPM을 사용할 수 있습니다.

키보드 또는 조이스틱에 머리가 잘 맞지 않습니다.

필요할 경우 /dev 개의 파일을 직접 읽는 것이 좋지 않을 것입니다.

은 당신이 X11 아래에있어, 당신이 KBD를 얻으려면, 당신은 복을 할 필요가,