From a591ba290c9aafd719e8cef8e5447921e07468b1 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Sat, 29 Sep 2012 06:59:15 +0000 Subject: [PATCH] Add some mouse support --- src/main.c | 45 ++++++++++++++++++------------ src/main.h | 6 ++-- src/screen.c | 68 ++++++++++++++++++++++++++++++++------------- src/screen.h | 18 ++++++------ src/view/day.c | 4 ++- src/view/help.c | 4 ++- src/view/mkview.sh | 4 ++- src/view/month.c | 4 ++- src/view/notes.c | 4 ++- src/view/settings.c | 4 ++- src/view/todo.c | 4 ++- src/view/week.c | 4 ++- src/view/year.c | 4 ++- 13 files changed, 115 insertions(+), 58 deletions(-) diff --git a/src/main.c b/src/main.c index 41e1c81..5de195d 100644 --- a/src/main.c +++ b/src/main.c @@ -7,12 +7,7 @@ #include "main.h" #include "screen.h" -/* Global data */ -int win_rows = 0; -int win_cols = 0; - /* Static data */ -static WINDOW *win = NULL; static FILE *debug_fd = NULL; /* Control-C handler, so we don't hose the therminal */ @@ -23,21 +18,12 @@ static void on_sigint(int signum) exit(0); } -/* Window change */ -static void update(void) -{ - getmaxyx(win, win_rows, win_cols); - win_rows++; - win_cols++; - screen_draw(); -} - /* Window change */ static void on_sigwinch(int signum) { endwin(); refresh(); - update(); + screen_draw(); } /* Debugging functions */ @@ -45,9 +31,21 @@ int debug(char *fmt, ...) { int rval; va_list ap; + + /* Log to debug file */ va_start(ap, fmt); vfprintf(debug_fd, "debug: ", ap); rval = vfprintf(debug_fd, fmt, ap); + + /* Log to status bar */ + va_start(ap, fmt); + mvhline(LINES-2, 0, ACS_HLINE, COLS); + move(LINES-1, 0); + attron(COLOR_PAIR(COLOR_ERROR)); + vwprintw(stdscr, fmt, ap); + attroff(COLOR_PAIR(COLOR_ERROR)); + clrtoeol(); + va_end(ap); return rval; } @@ -68,26 +66,37 @@ int main(int argc, char **argv) debug("sigwinch error\n"); /* Curses setup */ - win = initscr(); + initscr(); cbreak(); noecho(); + keypad(stdscr, TRUE); start_color(); curs_set(false); + mousemask(ALL_MOUSE_EVENTS, NULL); + init_pair(COLOR_TITLE, COLOR_GREEN, COLOR_BLACK); + init_pair(COLOR_ERROR, COLOR_RED, COLOR_BLACK); screen_init(); /* Run */ while (1) { + MEVENT btn; int chr = getch(); + if (chr == KEY_MOUSE) + if (getmouse(&btn) != OK) + continue; if (chr == 'q') break; + if (KEY_MOUSE) + //debug("mouse xyz=%d,%d,%d id=%hd state=%lx\n", + // btn.x, btn.y, btn.z, btn.id, btn.bstate); switch (chr) { case 'L': clear(); case 'l': - update(); + screen_draw(); break; default: - screen_run(chr); + screen_run(chr, btn.bstate, btn.y, btn.x); break; } } diff --git a/src/main.h b/src/main.h index ea66f9d..bed6fb1 100644 --- a/src/main.h +++ b/src/main.h @@ -1,6 +1,6 @@ +#define COLOR_TITLE 1 +#define COLOR_ERROR 2 + #define N_ELEMENTS(x) (sizeof(x)/sizeof((x)[0])) int debug(char *fmt, ...); - -extern int win_rows; -extern int win_cols; diff --git a/src/screen.c b/src/screen.c index a841f1e..926ed50 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1,3 +1,4 @@ +#include #include #include "main.h" #include "screen.h" @@ -7,7 +8,7 @@ typedef struct { char *name; void (*init)(void); void (*draw)(void); - int (*run)(int); + int (*run)(int,mmask_t,int,int); int keys[8]; } view_t; @@ -25,52 +26,81 @@ view_t views[] = { { "Help", help_init, help_draw, help_run, {KEY_F(8), '8', 'h', '?'} }, }; -view_t *active = &views[0]; +int active = 0; /* Local functions */ void draw_header(void) { move(0, 0); - attron(COLOR_PAIR(1)); + attron(COLOR_PAIR(COLOR_TITLE)); for (int i = 0; i < N_ELEMENTS(views); i++) { - if (active == &views[i]) + if (i == active) attron(A_BOLD); printw(" %s", views[i].name); - if (active == &views[i]) + if (i == active) attroff(A_BOLD); } - attroff(COLOR_PAIR(1)); - mvhline(1, 0, ACS_HLINE, win_cols); + attroff(COLOR_PAIR(COLOR_TITLE)); + mvhline(1, 0, ACS_HLINE, COLS); } /* Screen init */ void screen_init(void) { - init_pair(1, COLOR_GREEN, COLOR_BLACK); } -/* Scren draw */ +/* Screen draw */ void screen_draw(void) { draw_header(); - active->draw(); + views[active].draw(); +} + +/* Screen set */ +int screen_set(int num) +{ + if (active != num) { + active = num; + screen_draw(); + } + return 1; } /* Screen run */ -int screen_run(int chr) +int screen_run(int key, mmask_t btn, int row, int col) { + /* Check for mouse events */ + if (key == KEY_MOUSE && row == 0) { + int start = 1; + for (int i = 0; i < N_ELEMENTS(views); i++) { + int end = start + strlen(views[i].name) - 1; + if (start <= col && col <= end) + return screen_set(i); + start = end + 2; + } + } + /* Check for view change */ for (int i = 0; i < N_ELEMENTS(views); i++) { - view_t *view = &views[i]; - if (view == active) + if (i == active) continue; - for (int j = 0; j < N_ELEMENTS(view->keys); j++) - if (view->keys[j] == chr) { - active = view; - screen_draw(); - } + for (int j = 0; j < N_ELEMENTS(views[i].keys); j++) + if (views[i].keys[j] == key) + return screen_set(i); + } + + /* Shift windows */ + int num = active; + int shift = key == KEY_RIGHT ? +1 : + key == KEY_LEFT ? -1 : 0; + while (shift) { + num += shift; + num += N_ELEMENTS(views); + num %= N_ELEMENTS(views); + if (views[num].run) + return screen_set(num); } /* Pass key to active view */ - return active->run(chr); + return views[active].run(key, btn, row, col); } diff --git a/src/screen.h b/src/screen.h index 9df33ab..0054dbf 100644 --- a/src/screen.h +++ b/src/screen.h @@ -1,7 +1,7 @@ /* Screen functions */ void screen_init(void); void screen_draw(void); -int screen_run(int); +int screen_run(int key, mmask_t btn, int row, int col); /* View init functions */ void day_init(void); @@ -24,11 +24,11 @@ void settings_draw(void); void help_draw(void); /* View run functions */ -int day_run(int); -int week_run(int); -int month_run(int); -int year_run(int); -int todo_run(int); -int notes_run(int); -int settings_run(int); -int help_run(int); +int day_run(int,mmask_t,int,int); +int week_run(int,mmask_t,int,int); +int month_run(int,mmask_t,int,int); +int year_run(int,mmask_t,int,int); +int todo_run(int,mmask_t,int,int); +int notes_run(int,mmask_t,int,int); +int settings_run(int,mmask_t,int,int); +int help_run(int,mmask_t,int,int); diff --git a/src/view/day.c b/src/view/day.c index 4944861..7d25d5b 100644 --- a/src/view/day.c +++ b/src/view/day.c @@ -1,3 +1,5 @@ +#include + /* day init */ void day_init(void) { @@ -9,7 +11,7 @@ void day_draw(void) } /* day run */ -int day_run(int chr) +int day_run(int key, mmask_t btn, int row, int col) { return 0; } diff --git a/src/view/help.c b/src/view/help.c index 63b2ebc..3db4647 100644 --- a/src/view/help.c +++ b/src/view/help.c @@ -1,3 +1,5 @@ +#include + /* help init */ void help_init(void) { @@ -9,7 +11,7 @@ void help_draw(void) } /* help run */ -int help_run(int chr) +int help_run(int key, mmask_t btn, int row, int col) { return 0; } diff --git a/src/view/mkview.sh b/src/view/mkview.sh index cda2b2d..6f5773c 100755 --- a/src/view/mkview.sh +++ b/src/view/mkview.sh @@ -4,6 +4,8 @@ for file; do name=${file%.c} tab=" " cat > $file <<-EOF + #include + /* $name init */ void ${name}_init(void) { @@ -15,7 +17,7 @@ for file; do } /* $name run */ - int ${name}_run(int chr) + int ${name}_run(int key, mmask_t btn, int row, int col) { ${tab}return 0; } diff --git a/src/view/month.c b/src/view/month.c index 435faf5..1644ed9 100644 --- a/src/view/month.c +++ b/src/view/month.c @@ -1,3 +1,5 @@ +#include + /* month init */ void month_init(void) { @@ -9,7 +11,7 @@ void month_draw(void) } /* month run */ -int month_run(int chr) +int month_run(int key, mmask_t btn, int row, int col) { return 0; } diff --git a/src/view/notes.c b/src/view/notes.c index 7a4307a..6bb2984 100644 --- a/src/view/notes.c +++ b/src/view/notes.c @@ -1,3 +1,5 @@ +#include + /* notes init */ void notes_init(void) { @@ -9,7 +11,7 @@ void notes_draw(void) } /* notes run */ -int notes_run(int chr) +int notes_run(int key, mmask_t btn, int row, int col) { return 0; } diff --git a/src/view/settings.c b/src/view/settings.c index d013fa1..baa84cf 100644 --- a/src/view/settings.c +++ b/src/view/settings.c @@ -1,3 +1,5 @@ +#include + /* settings init */ void settings_init(void) { @@ -9,7 +11,7 @@ void settings_draw(void) } /* settings run */ -int settings_run(int chr) +int settings_run(int key, mmask_t btn, int row, int col) { return 0; } diff --git a/src/view/todo.c b/src/view/todo.c index 430cbf8..acc0682 100644 --- a/src/view/todo.c +++ b/src/view/todo.c @@ -1,3 +1,5 @@ +#include + /* todo init */ void todo_init(void) { @@ -9,7 +11,7 @@ void todo_draw(void) } /* todo run */ -int todo_run(int chr) +int todo_run(int key, mmask_t btn, int row, int col) { return 0; } diff --git a/src/view/week.c b/src/view/week.c index cc6e5d6..ddaec47 100644 --- a/src/view/week.c +++ b/src/view/week.c @@ -1,3 +1,5 @@ +#include + /* week init */ void week_init(void) { @@ -9,7 +11,7 @@ void week_draw(void) } /* week run */ -int week_run(int chr) +int week_run(int key, mmask_t btn, int row, int col) { return 0; } diff --git a/src/view/year.c b/src/view/year.c index 9819228..156a4da 100644 --- a/src/view/year.c +++ b/src/view/year.c @@ -1,3 +1,5 @@ +#include + /* year init */ void year_init(void) { @@ -9,7 +11,7 @@ void year_draw(void) } /* year run */ -int year_run(int chr) +int year_run(int key, mmask_t btn, int row, int col) { return 0; } -- 2.43.2