2008-09-08 14 views
7

क्या माउस/कीबोर्ड/जॉयस्टिक से लिनक्स में उपयोगकर्ता इनपुट एकत्र करने के लिए उपयोग करने के लिए एक अच्छी लाइब्रेरी है जो आपको ऐसा करने के लिए एक दृश्य विंडो बनाने के लिए मजबूर नहीं करती है? एसडीएल आपको एक उचित तरीके से उपयोगकर्ता इनपुट प्राप्त करने देता है, लेकिन ऐसा लगता है कि आपको एक विंडो बनाने के लिए मजबूर होना पड़ता है, जो कि अगर आप नियंत्रण नियंत्रित करते हैं तो परेशानी होती है इसलिए नियंत्रण मशीन को रेंडर मशीन के समान नहीं होना चाहिए। हालांकि, अगर नियंत्रण और रेंडर मशीनें समान हैं, तो यह आपके प्रदर्शन के शीर्ष पर एक बदसूरत छोटी एसडीएल विंडो में परिणाम देती है।विंडो बनाने के बिना लिनक्स/एक्स 11 इनपुट लाइब्रेरी

संपादित स्पष्ट करने के लिए:
रेंडरर एक निर्गम खिड़की है, अपने सामान्य उपयोग के मामले में, उस खिड़की, पूर्ण स्क्रीन है जब वे दोनों एक ही कंप्यूटर पर चल रहा है, सिर्फ इसलिए इसे देने के लिए संभव है सिवाय नियंत्रक फोकस। वास्तव में एक ही नियंत्रक द्वारा नियंत्रित विभिन्न कंप्यूटरों पर एक ही डेटा के एक अलग डेटा को प्रदर्शित करने वाले कई प्रस्तुतकर्ता हो सकते हैं, इसलिए उत्पादन से इनपुट का कुल decoupling (प्रदर्शन के लिए X11 क्लाइंट/सर्वर सामग्री में निर्मित का लाभ लेना कम उपयोग करने योग्य) इसके अलावा, एक रेंडरर के लिए एकाधिक नियंत्रक अनुप्रयोग भी संभव है। नियंत्रकों और renderers के बीच संचार सॉकेट के माध्यम से है।

+0

मैंने "उत्तर" हटा दिया जिसने उपरोक्त स्पष्टीकरण को जन्म दिया ... मुझे लगता है कि स्पष्टीकरण को रहने की जरूरत है, लेकिन इसमें पर्याप्त जानकारी शामिल है कि मेरा छद्म उत्तर, जो एक टिप्पणी हो सकता है, पूरी तरह से हटाया जा सकता है। –

उत्तर

7

ठीक है, यदि आप 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 तंत्र का उपयोग करता है।

उम्मीद है कि इससे मदद मिलती है।

एक्स के तहत पकड़ लेता है के साथ सावधान जब आप उन्हें के लिए नए हैं, कभी-कभी यह एक अच्छा विचार है एक समय देरी प्रक्रिया है कि सर्वर ungrab होगा शुरू करने के लिए जब आप परीक्षण कोड हैं और यह बैठते हैं और चलाते हैं और हर कुछ मिनटों को अनगिनत करें। यह सर्वर से बाहरी रीसेट करने के लिए सर्वर से मारने या स्विच करने के लिए बचाता है।

यहां से, मैं यह तय करने के लिए आपको छोड़ दूंगा कि रेंडर को मल्टीप्लेक्स कैसे करें। शुरू करने के लिए XGrabKeyboard दस्तावेज़ और XEvent दस्तावेज़ पढ़ें। यदि आपके पास स्क्रीन कोनों पर उजागर छोटी खिड़कियां हैं, तो आप एक नियंत्रक का चयन करने के लिए पॉइंटर को एक कोने में जाम कर सकते हैं। XWarpPointer पॉइंटर को कोड में से एक के साथ भी ढक सकता है।

एक और बिंदु: आप पॉइंटर को भी पकड़ सकते हैं, और अन्य संसाधन। यदि आपके सामने बैठे बॉक्स पर एक नियंत्रक चल रहा था, तो आप अलग-अलग प्रस्तुतकर्ताओं के साथ खुले सॉकेट के बीच स्विच करने के लिए कीबोर्ड और माउस इनपुट का उपयोग कर सकते हैं।आपको इस दृष्टिकोण के साथ अब पूर्ण स्क्रीन से कम आउटपुट विंडो का आकार बदलने की आवश्यकता नहीं है। अधिक काम के साथ, आप वास्तव में उपयोगकर्ता इनपुट के जवाब में एक अच्छा ओवरले सुविधा प्राप्त करने के लिए SHAPE और COMPOSITE एक्सटेंशन का उपयोग करके शीर्ष पर अल्फा-मिश्रित ओवरले छोड़ सकते हैं (जो लिली को गिल्डिंग के रूप में गिना जा सकता है)।

+0

यह उत्तर + ब्रायन द्वारा जीपीएम जवाब मेरे प्रश्न का उत्तर देता है, लेकिन मैं केवल 1 उत्तर का चयन कर सकता हूं। – rck

+0

ध्यान दें कि जीपीएम शायद उसी टर्मिनल पर सक्रिय एक्स के साथ आराम से बातचीत नहीं करेगा ... मैन पेज "बग्स" सेक्शन को ध्यान से पढ़ें। भले ही यह व्यावहारिक लग रहा हो, मैं दोनों प्रकार के कार्यक्रम के लिए एक्स सर्वर पर जाऊंगा। –

2

माउस के लिए आप GPM का उपयोग कर सकते हैं।

मुझे कीबोर्ड या जॉयस्टिक के लिए मेरे सिर के शीर्ष से निश्चित नहीं है।

यदि संभव हो तो /dev फ़ाइलों को सीधे पढ़ने के लिए यह बहुत बुरा नहीं होगा।

आशा है कि यह मदद करता है

संबंधित मुद्दे