前のページで見てきた(押された)キーの取得方法を見て来たが、マウスからの情報も同じように取得できる。
一般的に、UIはユーザにキーボードとマウスの両方を用いた操作を可能としているものです。
まず何よりも先に、受信したい(マウスの)イベントは、mousemask()関数で有効にしなければならない。
mousemask( mmask_t newmask, /* The events you want to listen to */ mmask_t *oldmask) /* The old events mask */
上の関数の、最初のパラメタは受け取りたい(マウスの)イベントのビットマスクである。
デフォルトでは、全ての(マウスの)イベントは無効になっている。
”ALL_MOUSE_EVENTS”を指定すると、マウスに関連する全てのイベントを受信することができる。
以下に、マウスに関連する全てのイベントのビットマスク値を示す。
Name Description --------------------------------------------------------------------- BUTTON1_PRESSED mouse button 1 down BUTTON1_RELEASED mouse button 1 up BUTTON1_CLICKED mouse button 1 clicked BUTTON1_DOUBLE_CLICKED mouse button 1 double clicked BUTTON1_TRIPLE_CLICKED mouse button 1 triple clicked BUTTON2_PRESSED mouse button 2 down BUTTON2_RELEASED mouse button 2 up BUTTON2_CLICKED mouse button 2 clicked BUTTON2_DOUBLE_CLICKED mouse button 2 double clicked BUTTON2_TRIPLE_CLICKED mouse button 2 triple clicked BUTTON3_PRESSED mouse button 3 down BUTTON3_RELEASED mouse button 3 up BUTTON3_CLICKED mouse button 3 clicked BUTTON3_DOUBLE_CLICKED mouse button 3 double clicked BUTTON3_TRIPLE_CLICKED mouse button 3 triple clicked BUTTON4_PRESSED mouse button 4 down BUTTON4_RELEASED mouse button 4 up BUTTON4_CLICKED mouse button 4 clicked BUTTON4_DOUBLE_CLICKED mouse button 4 double clicked BUTTON4_TRIPLE_CLICKED mouse button 4 triple clicked BUTTON_SHIFT shift was down during button state change BUTTON_CTRL control was down during button state change BUTTON_ALT alt was down during button state change ALL_MOUSE_EVENTS report all button state changes REPORT_MOUSE_POSITION report mouse movement
一度マウスイベントの取得を有効にすると、以後マウスのイベントが発生した時に、getch()などのキー入力関数から、”KEY_MOUSE”の戻り値が返されるようになる。
この戻り値が返された時、getmouse()関数によって具体的なマウスのイベントを取得することができる。
以下にコードの概要例を示す:
MEVENT event; ch = getch(); if(ch == KEY_MOUSE) if(getmouse(&event) == OK) . /* Do some thing with the event */ . .
getmouse()関数からは、以下に示す構造体へのポインタを得ることができる。
typedef struct { short id; /* マウスのID */ int x, y, z; /* マウスポインタの座標 */ mmask_t bstate; /* ボタンのビットマスク */ }"bstate"メンバ変数の値が、マウスのボタンの状態を示す。
以下の様なコードの例で、マウスボタンの変化を検知することができる。
if(event.bstate & BUTTON1_PRESSED) printw("Left Button Pressed");
以下に、マウス操作が可能なメニューの簡単な例を示す。この例は単純にするため、キー操作はできないようにしている。
/* Example 11. Access the menu with mouse !!! */ #include <ncurses.h> #define WIDTH 30 #define HEIGHT 10 int startx = 0; int starty = 0; char *choices[] = { "Choice 1", "Choice 2", "Choice 3", "Choice 4", "Exit", }; int n_choices = sizeof(choices) / sizeof(char *); void print_menu(WINDOW *menu_win, int highlight); void report_choice(int mouse_x, int mouse_y, int *p_choice); int main() { int c, choice = 0; WINDOW *menu_win; MEVENT event; /* Initialize curses */ initscr(); clear(); noecho(); cbreak(); //Line buffering disabled. pass on everything /* Try to put the window in the middle of screen */ startx = (80 - WIDTH) / 2; starty = (24 - HEIGHT) / 2; attron(A_REVERSE); mvprintw(23, 1, "Click on Exit to quit (Works best in a virtual console)"); refresh(); attroff(A_REVERSE); /* Print the menu for the first time */ menu_win = newwin(HEIGHT, WIDTH, starty, startx); print_menu(menu_win, 1); /* Get all the mouse events */ mousemask(ALL_MOUSE_EVENTS, NULL); while(1) { c = wgetch(menu_win); switch(c) { case KEY_MOUSE: if(getmouse(&event) == OK) { /* When the user clicks left mouse button */ if(event.bstate & BUTTON1_PRESSED) { report_choice(event.x + 1, event.y + 1, &choice); if(choice == -1) //Exit chosen goto end; mvprintw(22, 1, "Choice made is : %d String Chosen is \"%10s\"", choice, choices[choice - 1]); refresh(); } } print_menu(menu_win, choice); break; } } end: endwin(); return 0; } void print_menu(WINDOW *menu_win, int highlight) { int x, y, i; x = 2; y = 2; box(menu_win, 0, 0); for(i = 0; i < n_choices; ++i) { if(highlight == i + 1) { wattron(menu_win, A_REVERSE); mvwprintw(menu_win, y, x, "%s", choices[i]); wattroff(menu_win, A_REVERSE); } else mvwprintw(menu_win, y, x, "%s", choices[i]); ++y; } wrefresh(menu_win); } /* Report the choice according to mouse position */ void report_choice(int mouse_x, int mouse_y, int *p_choice) { int i,j, choice; i = startx + 2; j = starty + 3; for(choice = 0; choice < n_choices; ++choice) if(mouse_y == j + choice && mouse_x >= i && mouse_x <= i + strlen(choices[choice])) { if(choice == n_choices - 1) *p_choice = -1; else *p_choice = choice + 1; break; } }
mouse_trafo()関数とwmouse_trafo()関数は、stdscr起点のの座標からウィンドウ起点の座標に変換する。詳しくはcurs_mouse(3x)のmanページを参照すること。
mouseinterval()関数は、マウスボタンの操作をクリックと認識する場合の、「押すイベント」と「離すイベント」の時間差の最大値をミリ秒単位で設定する。
この関数は、設定前のこの間隔が戻り値となる。デフォルト値は1.5秒である。
[PageInfo]
LastUpdate: 2013-09-29 22:25:09, ModifiedBy: koinec
[License]
FreeBSD Documentation License
[Permissions]
view:all, edit:members, delete/config:members