2008-09-08 22 views
7

Linux'ta kullanıcı girişini mouse/klavye/joystick'ten toplamak için kullanabileceğiniz iyi bir kütüphane var mıdır ki bunu yapmak için görünür bir pencere oluşturmaya zorlamıyor musunuz? SDL, kullanıcı girişini makul bir şekilde almanıza izin verir, ancak sizi kontrol eden bir kontrol paneli oluşturduğunuzda sorun yaratmayan bir pencere yaratmaya zorlarsınız. Böylece kontrol makinesinin render makinesi ile aynı olması gerekmez. Bununla birlikte, kontrol ve render makineleri aynıysa, bu ekranınızın üstünde çirkin bir SDL penceresiyle sonuçlanır. netleştirin içinLinux/X11 giriş kütüphanesi pencere oluşturmadan

Düzenleme:
oluşturucu normal kullanım halinde, bu pencere tam ekran ikisi de bunu vermek mümkündür sadece bu yüzden, aynı bilgisayarda çalışan olduğu durumlar dışında, olup, bir çıkış penceresi var denetleyici odağı. Aslında aynı kontrolör tarafından kontrol edilen farklı bilgisayarlarda aynı verinin farklı bir görüntüsünü gösteren çok sayıda renderer olabilir, bu yüzden çıktıdan gelen girdinin toplam dekuplajı (ekranın daha azı için X11 istemci/sunucu öğesinde yerleşik olandan yararlanma) kullanılabilir) Ayrıca, bir işleyici için çoklu denetleyici uygulamaları da mümkündür. Denetleyiciler ve oluşturucular arasındaki iletişim, soketler yoluyla gerçekleştirilir.

+0

Yukarıdaki açıklamaya neden olan "yanıtı" sildim ... Açıklamanın kalması gerektiğini düşünüyorum, ancak yorumda bulunabilecek olan sözde cevabım tamamen silinebilir. –

cevap

7

OK yardımcı olur. Değilseniz, benim tek iyi cevabım bir terminalden ncurses. İşte

klavyeden her şeyi yakala ve yeniden serbest aşağıda açıklanmıştır:

 
/* 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; 
} 

bir terminalden çalıştırın bu ve tüm kbd olayları vurmak gerekir. Ben Xorg altında test ediyorum ama saygıdeğer, kararlı Xlib mekanizmaları kullanır.

Bu yardımcı olur umarım.

bazen o test kodu olduğunuzda sunucu ungrab bir zaman gecikmesi işlemini başlatmak ve oturup çalışmasına izin ve iyi bir fikir, onlara yeni olduğunuzda X altında kapmak DİKKAT EDİNİZ Her birkaç dakikayı ungrab. Sunucudan harici durumu sıfırlamak için öldürmek veya kapatmak zorunda kalmadan kaydeder.

Buradan, size nasıl işleneceğini çoğaltmaya karar vermek için bırakacağım. Başlamak için XGrabKeyboard belgelerini ve XEvent belgelerini okuyun. Ekran köşelerinde küçük pencereler varsa, denetleyiciyi seçmek için işaretçiyi bir köşeye sıkışmış olabilirsiniz. XWarpPointer, numarasını, işaretçiyi kodlardan birine de ekleyebilir.

Bir nokta daha: İşaretçiyi ve diğer kaynakları da yakalayabilirsiniz. Oturduğunuz kutuda bir denetleyici çalışıyorsa, farklı oluşturuculardaki açık yuvalar arasında geçiş yapmak için klavye ve fare girişini kullanabilirsiniz.Bu yaklaşıma göre çıkış penceresini artık tam ekrandan daha azına yeniden boyutlandırmanız gerekmemelidir. Daha fazla çalışma ile, kullanıcı girdisine yanıt olarak güzel bir bindirme özelliği elde etmek için SHAPE ve COMPOSITE uzantılarını kullanarak alfa ile harmanlanmış bindirmeleri gerçekten üstüne bırakabilirsiniz (bu, zammın yaldızı olarak sayılabilir).

+0

Bu cevap + Brian'ın GPM yanıtı sorumu yanıtlıyor, ancak sadece 1 cevabı seçebiliyorum. – rck

+0

GPM'nin muhtemelen aynı terminalde X aktif ile rahatça etkileşime girmeyeceğini unutmayın ... "BUGS" bölümünün son sayfasını dikkatlice okuyun. Çalışkan görünüyor olsa bile, her iki olay için de X sunucusuna giderdim. –

2

Fare için GPM'u kullanabilirsiniz.

Kafamın üstünde klavye veya oyun çubuğu için emin değilim.

Gerekirse doğrudan orada /dev dosyaları okumak için çok kötü olmazdı.

Eğer X11 altında ve sen kbd almak istiyorsanız, bir kepçe yapmak gerekir,