2012-07-02 6 views
8

私はUnixプラットフォーム用のコンソールアプリケーションを作っています。私はcurses(またはncurses)ライブラリを使ってキーボードとマウスの入力を処理しています。問題は非常に詳細な例を持たないthis pagethis oneのappartから、それをどのように正確に使用するのかについてのほとんどのドキュメントが見つかりませんでした。 左クリックをキャプチャできましたが、ターミナルエミュレータのオプションメニューがカーソル位置に表示されますが、イベントはアプリケーションによって処理されないため、右クリックでは機能しません。これを避けて、イベントをアプリケーションに取り込ませるにはどうしたらいいですか?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

さて、私は複数の端末で実行しようとしました.Ubuntu 11.10のデフォルト端末、Guake、NetBeans IDEの内部端末であり、どれも動作しません。イベントをアプリに渡すためにどのように設定することができたか知っていますか? –

+4

http://askubuntu.com/questions/21330/how-to-disable-right-click-menu-in-minminal同様の質問のために、部分的な答え、すなわちxtermを使います。 –

答えて

2

マウスの右ボタンは、ボタン2ではなくボタン3です。ボタン2は中央のボタンです。

+0

はい、私はそれに気付きましたが、イベントはまだアプリケーションに送られていませんでした。私は質問の最後のコメントに右ボタンイベントを入れます。 –

0

私はあなたのコードを使用していましたが、私は何の反応も得られません。マウスの左ボタンも機能しません。

これは完全なコードですか?誰がS /彼はNcursesの持つすべてのでマウスイベントをcapureことができない理由を把握しようとここに来て

#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」を使用していますか?押されたものは私のために働かなかった。 –

+0

問題は、私はターミナルウィンドウを持っていないということです。私は窓の管理なしでヘッドレスUbuntuを使って作業します... – user1455085

+0

私は、あなたがコンテキストメニューの問題を持っていないだろうと思っています(ヘッドレスには何もありません)。私はそれを証言することはできませんが、それはデフォルトのシェルで動作するはずです。修正されたコードで試しましたか?マウスドライバが実行されていることを確認してください(通常、ヘッドレススタートではデフォルトでロードされません)。 –

9

、最も可能性が高いこれはあなたが必要とするラインである:

keypad(window, TRUE); 

これがなければ、私はgetch()でマウスイベントを取得しませんでした。

私が見たすべてのチュートリアルや例から抜けています。だからこそ、自分のコードに何が間違っているかを理解するのに多くの時間がかかりました。

+0

これは私のDebian/terminator環境の問題を解決するようです。それがなければ、イベントは発生しないようです。私はこの答えが正しいとマークするべきだと思います。 –

+0

これもOS Xで修正されています。 – AdUki

関連する問題