/* http://www.cyut.edu.tw/~ckhung/b/mi/ */
/* 1999-06 */
/* how to compile: gcc -Wall mouse.c -lncurses */

#include <ncurses/curses.h>

int which_button(mmask_t m)
{
    int i;

    for (i=0; i < 4; ++i) {
	if (m & (077 << (i * 6)))
	    return i+1;
    }
    return 0;
}

#define B_RELEASED 1
#define B_PRESSED 2
#define B_CLICKED 3
#define B_DOUBLE_CLICKED 4
#define B_TRIPLE_CLICKED 5
#define B_RESERVED_EVENT 6

int which_event(mmask_t m)
{
    int i;

    for (i=0; i < 6; ++i) {
	if (m & (01010101 << i))
	    return i+1;
    }
    return 0;
}

int main(void)
{
    mmask_t oldmask, newmask;
    MEVENT mev;
    int c, go_on;
    char key, btn_name[] = "_LMRX";

    initscr();
    cbreak();
    noecho();
    keypad(stdscr, 1);
    newmask = mousemask(ALL_MOUSE_EVENTS, & oldmask);
    go_on = 1;
    while (go_on) {
	c = getch();
	switch (c) {
	case KEY_MOUSE:
	    getmouse(& mev);
	    mvaddch(mev.y, mev.x, btn_name[which_button(mev.bstate)]);
	    switch (which_event(mev.bstate)) {
	    case B_RELEASED: key = '^'; break;
	    case B_PRESSED: key = 'v'; break;
	    case B_CLICKED: key = '1'; break;
	    case B_DOUBLE_CLICKED: key = '2'; break;
	    case B_TRIPLE_CLICKED: key = '3'; break;
	    default:
		key = '?';
	    }
	    addch(key);
	    break;
	default:
	    go_on = 0;
	}
    }
    endwin();
    return 0;
}

