Skip to content

Instantly share code, notes, and snippets.

@flatcap
Created May 30, 2022 10:33
Show Gist options
  • Save flatcap/7d4cdc9250cdd1ea80e009fb99968faa to your computer and use it in GitHub Desktop.
Save flatcap/7d4cdc9250cdd1ea80e009fb99968faa to your computer and use it in GitHub Desktop.
mouse ncurses dump events
// gcc -o mouse mouse.c -lncursesw
#include <assert.h>
#include <ncurses.h>
#include <string.h>
WINDOW *create_newwin(int height, int width, int starty, int startx)
{
WINDOW *local_win;
local_win = newwin(height, width, starty, startx);
box(local_win, 0, 0);
wrefresh(local_win);
return local_win;
}
static void init_colours(void)
{
start_color();
init_pair(1, COLOR_BLACK, COLOR_RED);
init_pair(2, COLOR_BLACK, COLOR_GREEN);
init_pair(3, COLOR_BLACK, COLOR_YELLOW);
init_pair(4, COLOR_BLACK, COLOR_BLUE);
init_pair(5, COLOR_BLACK, COLOR_MAGENTA);
init_pair(6, COLOR_BLACK, COLOR_CYAN);
init_pair(7, COLOR_BLACK, COLOR_WHITE);
}
int main()
{
int ch;
mmask_t old;
initscr();
clear();
noecho();
cbreak();
init_colours();
WINDOW *base = create_newwin(LINES, COLS, 0, 0);
WINDOW *win = create_newwin(LINES / 2, COLS / 2, LINES / 4, COLS / 4);
keypad(base, true);
scrollok(base, true);
wrefresh(base);
keypad(win, true);
scrollok(win, true);
wrefresh(win);
mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, &old);
while ((ch = wgetch(base)) != 'q')
{
if (ch == KEY_MOUSE)
{
MEVENT event;
assert(getmouse(&event) == OK);
if (wenclose(win, event.y, event.x))
{
wcolor_set(win, 2, NULL);
}
else
{
wcolor_set(win, 6, NULL);
}
wprintw(win, "%3dx, %3dy -- ", event.x, event.y);
unsigned long s = event.bstate;
// clang-format off
if (s & BUTTON_CTRL) { wprintw(win, "CTRL "); s &= ~BUTTON_CTRL; }
if (s & BUTTON_SHIFT) { wprintw(win, "SHIFT "); s &= ~BUTTON_SHIFT; }
if (s & BUTTON_ALT) { wprintw(win, "ALT "); s &= ~BUTTON_ALT; }
if (s & BUTTON1_RELEASED) { wprintw(win, "BUT1-release "); s &= ~BUTTON1_RELEASED; }
if (s & BUTTON1_PRESSED) { wprintw(win, "BUT1-pressed "); s &= ~BUTTON1_PRESSED; }
if (s & BUTTON1_CLICKED) { wprintw(win, "BUT1-clicked "); s &= ~BUTTON1_CLICKED; }
if (s & BUTTON1_DOUBLE_CLICKED) { wprintw(win, "BUT1-double "); s &= ~BUTTON1_DOUBLE_CLICKED; }
if (s & BUTTON1_TRIPLE_CLICKED) { wprintw(win, "BUT1-triple "); s &= ~BUTTON1_TRIPLE_CLICKED; }
if (s & BUTTON2_RELEASED) { wprintw(win, "BUT2-release "); s &= ~BUTTON2_RELEASED; }
if (s & BUTTON2_PRESSED) { wprintw(win, "BUT2-pressed "); s &= ~BUTTON2_PRESSED; }
if (s & BUTTON2_CLICKED) { wprintw(win, "BUT2-clicked "); s &= ~BUTTON2_CLICKED; }
if (s & BUTTON2_DOUBLE_CLICKED) { wprintw(win, "BUT2-double "); s &= ~BUTTON2_DOUBLE_CLICKED; }
if (s & BUTTON2_TRIPLE_CLICKED) { wprintw(win, "BUT2-triple "); s &= ~BUTTON2_TRIPLE_CLICKED; }
if (s & BUTTON3_RELEASED) { wprintw(win, "BUT3-release "); s &= ~BUTTON3_RELEASED; }
if (s & BUTTON3_PRESSED) { wprintw(win, "BUT3-pressed "); s &= ~BUTTON3_PRESSED; }
if (s & BUTTON3_CLICKED) { wprintw(win, "BUT3-clicked "); s &= ~BUTTON3_CLICKED; }
if (s & BUTTON3_DOUBLE_CLICKED) { wprintw(win, "BUT3-double "); s &= ~BUTTON3_DOUBLE_CLICKED; }
if (s & BUTTON3_TRIPLE_CLICKED) { wprintw(win, "BUT3-triple "); s &= ~BUTTON3_TRIPLE_CLICKED; }
if (s & BUTTON4_RELEASED) { wprintw(win, "BUT4-release "); s &= ~BUTTON4_RELEASED; }
if (s & BUTTON4_PRESSED) { wprintw(win, "BUT4-pressed "); s &= ~BUTTON4_PRESSED; }
if (s & BUTTON4_CLICKED) { wprintw(win, "BUT4-clicked "); s &= ~BUTTON4_CLICKED; }
if (s & BUTTON4_DOUBLE_CLICKED) { wprintw(win, "BUT4-double "); s &= ~BUTTON4_DOUBLE_CLICKED; }
if (s & BUTTON4_TRIPLE_CLICKED) { wprintw(win, "BUT4-triple "); s &= ~BUTTON4_TRIPLE_CLICKED; }
if (s & 134217728) { wprintw(win, "BUT5-pressed "); s &= ~134217728; }
// clang-format on
if (s > 0)
wprintw(win, "-- %ld", s);
wprintw(win, "\n");
}
else
{
wprintw(win, "Key %d\n", ch);
}
wrefresh(win);
}
endwin();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment