우분투에서의 전역 키보드 이벤트에 대해 질문을 올리고자 합니다.
글쓴이: 온새미 / 작성시간: 토, 2010/02/06 - 12:43오전
안녕하세요. 혼자서 하다가 도저히 어떻게 해야할지 모르겠어서 올리게 되었습니다. 일단 제가 만들고자 하는 프로그램은
http://twitter.com/onsemy/status/8667508705
이런 것인데, 구글링을 해서 어찌해서 소스코드를 만들어보게 되었습니다
#include <X11/Xlib.h> #include <stdio.h> int main() { Window root; XEvent e; int iKeyCode; int iKeyState; int iKeyTime; // Open the display Display *dpy = XOpenDisplay(0); if (!dpy) return 1; // Get the root window -- so keys will be global root = DefaultRootWindow(dpy); // wait for events for(;;) { XGrabKeyboard(dpy, root, 1, GrabModeAsync, GrabModeAsync, CurrentTime); XNextEvent(dpy, &e); iKeyCode = e.xkey.keycode; iKeyState = e.xkey.state; iKeyTime = e.xkey.time; //int iKeyType = e.type; Window tmp = e.xkey.window; XUngrabKeyboard(dpy, CurrentTime); XPutBackEvent(dpy, &e); XSelectInput(dpy, tmp, KeyPressMask | KeyReleaseMask); XGrabKey(dpy, iKeyCode, None, tmp, 1, GrabModeAsync, GrabModeAsync); XNextEvent(dpy, &e); //XSendEvent(disp, InputFocus, FALSE, xev.type, &xev); XAllowEvents(dpy, ReplayKeyboard, iKeyTime); if (e.type == KeyPress){ // 나중에 사운드 재생 printf("Pressed!!\n"); } } return 0; }
전역으로 하는건 성공했는데 문제는 이 프로그램이 켜진채로 타이핑이 불가하다는 것이지요(이게 맞는 표현인지 모르겠습니다만)
그러니까 저 소스코드를 실행한 채로 코딩을 하려고 하면 아무런 글씨는 써지지 않고 소리만 나는 것이지요...
어떻게 해야할지 도무지 모르겠네요 ㅇ<-< 제가 원하는 것은 소리는 소리대로 나오고 타이핑은 쳐지는 것을 원했는데... 윈도우에서 쓰는 GetAsyncKeyStates라는 함수를 리눅스에서 쓸 수 없을까 뒤져보다가 이렇게 구현한 것입니다; 혹시나 저 함수같이 쓸 수 있는 것이 있을까요? 적어도 GNOME환경에서라도...
꼭 도와주세요! 군대가기전에 재밋을거같아서 잡은 건데 해결도 못하고 갈 수가 없네요 ㅠㅠ...
Forums:
제 생각에는
xev 소스 코드를 참고하세요.
이거 혹시 해결방법 아시는분 계시나요? xev소스
이거 혹시 해결방법 아시는분 계시나요?
xev소스 찾아봤자. 해당 부분은 나오지 않아서 그럽니다.
(입력받은값을 검사만 할뿐, 그 값을 그대로 출력해 주지는 않아요,
게다가 root window를 대상으로하는것도 아니고...... 그래서 별 도움이 안되네요)
XNextEvent로 이벤트 루프를 돌라면 값 가지고 오는건 쉬운데, 그 값이 입력되면서 값 가지고 오게 하는 방법은 모르겠네요.
댓글 달기