سؤال

هل هناك مكتبة جيدة لاستخدامها في جمع مدخلات المستخدم في لينكس من الماوس/لوحة المفاتيح/عصا التحكم لا قوة لك لخلق نافذة مرئية القيام بذلك ؟ SDL يتيح لك الحصول على مدخلات المستخدم بطريقة معقولة ، ولكن يبدو أن قوة لك لخلق نافذة ، والتي هي مزعجة إذا كان لديك المستخرجة التحكم بحيث آلة التحكم لا يجب أن تكون نفس يجعل آلة.ومع ذلك ، إذا كان التحكم وتقديم آلات نفس هذه النتائج في الصغير القبيح SDL نافذة على الجزء العلوي من الشاشة.

تحرير لتوضيح:
العارض قد خرج نافذة في الاستخدام العادي الحالة التي نافذة الشاشة الكاملة إلا عندما قيد التشغيل على نفس الكمبيوتر فقط لذلك فمن الممكن أن تعطي تحكم التركيز.لا يمكن أن يكون في الواقع عدة عارضين عرض وجهة نظر مختلفة من نفس البيانات على أجهزة كمبيوتر مختلفة كل تسيطر عليها تحكم نفسها ، وبالتالي مجموع فصل من المدخلات من إخراج (مما يجعل الاستفادة من المدمج في X11 العميل/الخادم الاشياء عرض أقل صالحة للاستعمال) أيضا ، وحدة تحكم متعددة التطبيقات واحد العارض هو ممكن أيضا.الاتصال بين وحدات التحكم و عارضين عبر مآخذ.

هل كانت مفيدة؟

المحلول

حسنا, إذا كنت تحت X11 و كنت ترغب في الحصول على kbd ، تحتاج إلى القيام الاستيلاء.إذا كنت لا ، فقط إجابة جيدة هو سأركع من المحطة.

هنا هو كيف يمكنك انتزاع كل شيء من لوحة المفاتيح و الإفراج مرة أخرى:

/* 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 الخادم عندما كنت اختبار التعليمات البرمجية والسماح لها الجلوس وتشغيل ungrab كل بضع دقائق.فإنه يحفظ الحاجة إلى قتل أو التبديل بعيدا عن خادم خارجيا إعادة الدولة.

من هنا سأترك لك أن تقرر كيفية متعددة renderes.قراءة على XGrabKeyboard مستندات XEvent مستندات للبدء.إذا كان لديك النوافذ الصغيرة المكشوفة في زوايا الشاشة ، يمكنك المربى المؤشر في زاوية واحدة لتحديد وحدة تحكم.XWarpPointer يمكن يشق المؤشر إلى واحد منهم وكذلك من التعليمات البرمجية.

نقطة أخرى:يمكنك الاستيلاء على المؤشر أيضا ، وغيرها من الموارد.إذا كان لديك وحدة تحكم واحدة تعمل على المربع امام الذي تجلس, يمكنك أن تستخدم لوحة المفاتيح الإدخال الماوس للتبديل بين فتح مآخذ مختلفة عارضين.يجب أن لا تحتاج إلى تغيير حجم نافذة الإخراج إلى أقل من كامل الشاشة بعد الآن مع هذا النهج ، من أي وقت مضى.مع أن إسقاط الواقع ألفا المخلوطة تراكب على أعلى باستخدام شكل مركب في التمديدات الحصول على لطيفة تراكب ميزة في الاستجابة إلى إدخال المستخدم (والتي قد عد التذهيب ليلى).

نصائح أخرى

الماوس يمكنك استخدام GPM.

أنا لست متأكدا من أعلى رأسي لوحة المفاتيح أو عصا التحكم.

ربما لا يكون سيئا للغاية على قراءة مباشرة من هناك /dev الملفات إذا لزم الأمر.

آمل أن يساعد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top