2012-07-02 23 views
8

मैं यूनिक्स प्लेटफ़ॉर्म के लिए कंसोल एप्लिकेशन बना रहा हूं, और मैं कीबोर्ड और माउस इनपुट को संभालने के लिए शाप (या ncurses) लाइब्रेरी का उपयोग कर रहा हूं। समस्या यह है कि मुझे बहुत कम दस्तावेज मिल गया है कि इसके लिए इसका उपयोग कैसे किया जाए, this page और this one से डालें, जिसमें बहुत विस्तृत उदाहरण नहीं हैं। मैंने बाएं क्लिक को कैप्चर करने में कामयाब रहा है, लेकिन मैं इसे दायाँ क्लिक के लिए काम नहीं कर सकता क्योंकि टर्मिनल एमुलेटर के लिए विकल्प मेनू कर्सर स्थान पर दिखाई देता है, लेकिन ईवेंट को एप्लिकेशन द्वारा संसाधित नहीं किया जाता है। मैं इससे कैसे बच सकता हूं और इस कार्यक्रम में आवेदन कैप्चर कर सकता हूं?कंसोल एप्लिकेशन पर माउस क्लिक कैप्चर करने के लिए ncurses का उपयोग

// Set up mouse event throwing 
mousemask(BUTTON1_PRESSED | BUTTON2_PRESSED, NULL); 

और विधि है कि इनपुट प्रक्रियाओं में, मैं निम्नलिखित है:

int c = getch(); 
MEVENT event; 
switch(c) 
{ 
    case KEY_UP: 
     ... do stuff 
     break; 
    case KEY_DOWN: 
     ... do stuff 
     break; 
    case KEY_MOUSE: 
     if(getmouse(&event) == OK) 
     { 
      if(event.bstate & BUTTON1_PRESSED) // This works for left-click 
      { 
       ... do stuff 
      } 
      else if(event.bstate & BUTTON2_PRESSED) // This doesn't capture right-click 
      { 
       ... do other stuff 
      } 
      else 
       fprintf(stderr, "Event: %i", event.bstate); // Doesn't print anything on right-click 
     } 
     break; 
    default: 
     return; 
} 

मैं भी mousemask() को विन्यस्त की कोशिश की है

मैं माउस की घटनाओं के विन्यास के लिए निम्नलिखित रेखा है ALL_MOUSE_EVENTS मास्क के साथ, लेकिन यह अभी भी पिछले else खंड पर किसी भी ईवेंट को प्रिंट नहीं करता है, इसलिए मुझे लगता है कि ईवेंट बस ट्रिगर नहीं कर रहा है। इस पर किसी भी मदद की सराहना की जाएगी।

+0

ऐसा लगता है कि आपका टर्मिनल एमुलेटर टर्मिनल विंडो पर राइट क्लिक इवेंट पास नहीं कर रहा है। अधिकांश अनुकरणकर्ताओं में ऐसे विकल्प होते हैं जो इनपुट उपकरणों के विशेष हैंडलिंग को अक्षम करते हैं और टर्मिनल पर सीधे ईवेंट पास करने में सक्षम होते हैं। –

+0

खैर, मैंने इसे कई टर्मिनल पर चलाने का प्रयास किया है: उबंटू 11.10 के लिए डिफ़ॉल्ट टर्मिनल, नेटबीन आईडीई का आंतरिक टर्मिनल गुएक, और उनमें से कोई भी काम नहीं करता है। क्या आप जानते हैं कि मैं ऐप में ईवेंट को पास करने के लिए उनमें से एक को कैसे कॉन्फ़िगर कर सकता हूं? –

+4

इसी तरह के प्रश्न के लिए http://askubuntu.com/questions/21330/how-to-disable-right-click-menu-in-terminal, आंशिक उत्तर है यानी xterm का उपयोग करें। –

उत्तर

2

दायां माउस बटन बटन 3 है, बटन नहीं 2. बटन 2 मध्य है।

+0

हां, मैंने देखा कि, लेकिन घटना अभी भी आवेदन के माध्यम से नहीं जा रही थी। मैंने प्रश्न की आखिरी टिप्पणी पर दायां बटन इवेंट डाला। –

0

मैं आपके कोड का उपयोग कर रहा था लेकिन मुझे कोई प्रतिक्रिया नहीं मिल सकती है। बाएं माउसबटन भी काम नहीं करता है।

क्या यह आप पूरा कोड है?

keypad(window, TRUE); 

:

#include <ncurses.h> 

int main(int argc, char **argv){ 

while(1) 
{ 

    mousemask(ALL_MOUSE_EVENTS, NULL); 
     int c = getch(); 
     MEVENT event; 
     switch(c) 
     { 
      case KEY_UP: 
       printf("keyup"); 
       break; 
      case KEY_DOWN: 
       printf("keydown"); 
       break; 
      case KEY_MOUSE: 
       if(getmouse(&event) == OK) 
       { 
        if(event.bstate & BUTTON1_PRESSED) // This works for left-click 
        { 
         printf("button1"); 
        } 
        else if(event.bstate & BUTTON2_PRESSED) // This doesn't capture right-click 
        { 
         printf("button2"); 
        } 
        else 
         printf("Event: %i", event.bstate); // Doesn't print anything on right-click 
       } 
       break; 
     } 
} 
return 0; 
} 
+1

क्या आपने इस प्रश्न पर अंतिम टिप्पणी देखी थी? क्या आप Xterm और ईवेंट 'BUTTON0_CLICKED' और' BUTTON3_CLICKED' बाएं और दाएं बटन के लिए उपयोग कर रहे हैं? PRESSED वाले लोग मेरे लिए काम नहीं करते थे। –

+0

समस्या यह है कि मेरे पास टर्मिनल विंडो नहीं है।मैं किसी भी विंडो प्रबंधन के बिना हेडलेस उबंटू के साथ काम करता हूं ... – user1455085

+0

मुझे लगता है कि आपके पास संदर्भ मेनू समस्या नहीं होगी (हेडलेस में कोई भी नहीं है)। इसे डिफ़ॉल्ट खोल के साथ काम करना चाहिए, हालांकि मैं उस पर गवाही नहीं दे सकता। क्या आपने इसे सही कोड से आजमाया था? क्या आप सुनिश्चित हैं कि माउस चालक चल रहा है (हो सकता है कि आपकी हेडलेस स्टार्ट डिफ़ॉल्ट रूप से लोड न करे क्योंकि इसकी आमतौर पर आवश्यकता नहीं है)। –

9

किसी और को यहाँ आने से यह पता लगाने की क्यों s/वह माउस घटनाओं ncurses के साथ सभी पर capure नहीं कर सकते हैं की कोशिश कर के लिए, सबसे अधिक संभावना इस लाइन है कि आप की जरूरत है इसके बिना, मुझे getch() के साथ कोई माउस ईवेंट नहीं मिला।

यह मेरे द्वारा देखे गए सभी ट्यूटोरियल/उदाहरणों से गायब है, इसलिए मुझे यह पता लगाने में काफी समय लगा कि मेरे कोड में क्या गलत था - शायद यह जवाब दूसरों को समाधान की तुलना में तेज़ी से ढूंढने में मदद करेगा।

+0

ऐसा लगता है कि मेरे डेबियन/टर्मिनेटर वातावरण में समस्या ठीक हो रही है। इसके बिना, कोई घटना आग लगती है। मेरा मानना ​​है कि इस जवाब को मुझे सही के रूप में चिह्नित किया जाना चाहिए। –

+0

यह ओएस एक्स पर भी इसे ठीक करता है। – AdUki