From 84ab027f57e88c7eb73c7264c2fef4c7fb5d50cf Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Sat, 29 Sep 2012 04:31:30 +0000 Subject: [PATCH] Add basic screen layout stuff --- .gitignore | 4 +- src/main.c | 97 ++++++++++++++++++++++++++++++++++++++++++--- src/main.h | 6 +++ src/makefile | 3 +- src/screen.c | 76 +++++++++++++++++++++++++++++++++++ src/screen.h | 34 ++++++++++++++++ src/view/day.c | 15 +++++++ src/view/help.c | 15 +++++++ src/view/mkview.sh | 23 +++++++++++ src/view/month.c | 15 +++++++ src/view/notes.c | 15 +++++++ src/view/settings.c | 15 +++++++ src/view/todo.c | 15 +++++++ src/view/week.c | 15 +++++++ src/view/year.c | 15 +++++++ 15 files changed, 356 insertions(+), 7 deletions(-) create mode 100755 src/view/mkview.sh diff --git a/.gitignore b/.gitignore index ce7e034..61bceb3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -*~ +*.log *.o +*~ .vimrc acal +tags diff --git a/src/main.c b/src/main.c index 1329eca..41e1c81 100644 --- a/src/main.c +++ b/src/main.c @@ -1,12 +1,99 @@ +#define _POSIX_C_SOURCE 1 +#include +#include +#include #include -int main(int argc, char **argv) +#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 */ +static void on_sigint(int signum) { - initscr(); - printw("hello, world"); - refresh(); - getch(); endwin(); + debug("got sigint\n"); + 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(); +} + +/* Debugging functions */ +int debug(char *fmt, ...) +{ + int rval; + va_list ap; + va_start(ap, fmt); + vfprintf(debug_fd, "debug: ", ap); + rval = vfprintf(debug_fd, fmt, ap); + va_end(ap); + return rval; +} + +/* Main */ +int main(int argc, char **argv) +{ + /* Misc setup */ + debug_fd = fopen("acal.log", "w+"); + struct sigaction act; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + act.sa_handler = on_sigint; + if (sigaction(SIGINT, &act, NULL) < 0) + debug("sigint error\n"); + act.sa_handler = on_sigwinch; + if (sigaction(SIGWINCH, &act, NULL) < 0) + debug("sigwinch error\n"); + + /* Curses setup */ + win = initscr(); + cbreak(); + noecho(); + start_color(); + curs_set(false); + screen_init(); + + /* Run */ + while (1) { + int chr = getch(); + if (chr == 'q') + break; + switch (chr) { + case 'L': + clear(); + case 'l': + update(); + break; + default: + screen_run(chr); + break; + } + } + + /* Cleanup, see also on_sigint */ + endwin(); + debug("cleanup"); return 0; } diff --git a/src/main.h b/src/main.h index e69de29..ea66f9d 100644 --- a/src/main.h +++ b/src/main.h @@ -0,0 +1,6 @@ +#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/makefile b/src/makefile index 2024cc8..20ac4a8 100644 --- a/src/makefile +++ b/src/makefile @@ -15,7 +15,8 @@ default: test all: $(PROG) test: $(PROG) - ./$< + @urxvt -e ./$< + @cat acal.log clean: rm -f *.o view/*.o $(PROG) diff --git a/src/screen.c b/src/screen.c index e69de29..a841f1e 100644 --- a/src/screen.c +++ b/src/screen.c @@ -0,0 +1,76 @@ +#include +#include "main.h" +#include "screen.h" + +/* Types */ +typedef struct { + char *name; + void (*init)(void); + void (*draw)(void); + int (*run)(int); + int keys[8]; +} view_t; + +/* Data */ +view_t views[] = { + { "Day", day_init, day_draw, day_run, {KEY_F(1), '1', 'd', } }, + { "Week", week_init, week_draw, week_run, {KEY_F(2), '2', 'w', } }, + { "Month", month_init, month_draw, month_run, {KEY_F(3), '3', 'm', } }, + { "Year", year_init, year_draw, year_run, {KEY_F(4), '4', 'y', } }, + { "|", NULL, NULL, NULL, { } }, + { "Todo", todo_init, todo_draw, todo_run, {KEY_F(5), '5', 't', } }, + { "Notes", notes_init, notes_draw, notes_run, {KEY_F(6), '6', 'n', } }, + { "|", NULL, NULL, NULL, { } }, + { "Settings", settings_init, settings_draw, settings_run, {KEY_F(7), '7', 's', } }, + { "Help", help_init, help_draw, help_run, {KEY_F(8), '8', 'h', '?'} }, +}; + +view_t *active = &views[0]; + +/* Local functions */ +void draw_header(void) +{ + move(0, 0); + attron(COLOR_PAIR(1)); + for (int i = 0; i < N_ELEMENTS(views); i++) { + if (active == &views[i]) + attron(A_BOLD); + printw(" %s", views[i].name); + if (active == &views[i]) + attroff(A_BOLD); + } + attroff(COLOR_PAIR(1)); + mvhline(1, 0, ACS_HLINE, win_cols); +} + +/* Screen init */ +void screen_init(void) +{ + init_pair(1, COLOR_GREEN, COLOR_BLACK); +} + +/* Scren draw */ +void screen_draw(void) +{ + draw_header(); + active->draw(); +} + +/* Screen run */ +int screen_run(int chr) +{ + /* Check for view change */ + for (int i = 0; i < N_ELEMENTS(views); i++) { + view_t *view = &views[i]; + if (view == active) + continue; + for (int j = 0; j < N_ELEMENTS(view->keys); j++) + if (view->keys[j] == chr) { + active = view; + screen_draw(); + } + } + + /* Pass key to active view */ + return active->run(chr); +} diff --git a/src/screen.h b/src/screen.h index e69de29..9df33ab 100644 --- a/src/screen.h +++ b/src/screen.h @@ -0,0 +1,34 @@ +/* Screen functions */ +void screen_init(void); +void screen_draw(void); +int screen_run(int); + +/* View init functions */ +void day_init(void); +void week_init(void); +void month_init(void); +void year_init(void); +void todo_init(void); +void notes_init(void); +void settings_init(void); +void help_init(void); + +/* View draw functions */ +void day_draw(void); +void week_draw(void); +void month_draw(void); +void year_draw(void); +void todo_draw(void); +void notes_draw(void); +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); diff --git a/src/view/day.c b/src/view/day.c index e69de29..4944861 100644 --- a/src/view/day.c +++ b/src/view/day.c @@ -0,0 +1,15 @@ +/* day init */ +void day_init(void) +{ +} + +/* day draw */ +void day_draw(void) +{ +} + +/* day run */ +int day_run(int chr) +{ + return 0; +} diff --git a/src/view/help.c b/src/view/help.c index e69de29..63b2ebc 100644 --- a/src/view/help.c +++ b/src/view/help.c @@ -0,0 +1,15 @@ +/* help init */ +void help_init(void) +{ +} + +/* help draw */ +void help_draw(void) +{ +} + +/* help run */ +int help_run(int chr) +{ + return 0; +} diff --git a/src/view/mkview.sh b/src/view/mkview.sh new file mode 100755 index 0000000..cda2b2d --- /dev/null +++ b/src/view/mkview.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +for file; do + name=${file%.c} + tab=" " + cat > $file <<-EOF + /* $name init */ + void ${name}_init(void) + { + } + + /* $name draw */ + void ${name}_draw(void) + { + } + + /* $name run */ + int ${name}_run(int chr) + { + ${tab}return 0; + } + EOF +done diff --git a/src/view/month.c b/src/view/month.c index e69de29..435faf5 100644 --- a/src/view/month.c +++ b/src/view/month.c @@ -0,0 +1,15 @@ +/* month init */ +void month_init(void) +{ +} + +/* month draw */ +void month_draw(void) +{ +} + +/* month run */ +int month_run(int chr) +{ + return 0; +} diff --git a/src/view/notes.c b/src/view/notes.c index e69de29..7a4307a 100644 --- a/src/view/notes.c +++ b/src/view/notes.c @@ -0,0 +1,15 @@ +/* notes init */ +void notes_init(void) +{ +} + +/* notes draw */ +void notes_draw(void) +{ +} + +/* notes run */ +int notes_run(int chr) +{ + return 0; +} diff --git a/src/view/settings.c b/src/view/settings.c index e69de29..d013fa1 100644 --- a/src/view/settings.c +++ b/src/view/settings.c @@ -0,0 +1,15 @@ +/* settings init */ +void settings_init(void) +{ +} + +/* settings draw */ +void settings_draw(void) +{ +} + +/* settings run */ +int settings_run(int chr) +{ + return 0; +} diff --git a/src/view/todo.c b/src/view/todo.c index e69de29..430cbf8 100644 --- a/src/view/todo.c +++ b/src/view/todo.c @@ -0,0 +1,15 @@ +/* todo init */ +void todo_init(void) +{ +} + +/* todo draw */ +void todo_draw(void) +{ +} + +/* todo run */ +int todo_run(int chr) +{ + return 0; +} diff --git a/src/view/week.c b/src/view/week.c index e69de29..cc6e5d6 100644 --- a/src/view/week.c +++ b/src/view/week.c @@ -0,0 +1,15 @@ +/* week init */ +void week_init(void) +{ +} + +/* week draw */ +void week_draw(void) +{ +} + +/* week run */ +int week_run(int chr) +{ + return 0; +} diff --git a/src/view/year.c b/src/view/year.c index e69de29..9819228 100644 --- a/src/view/year.c +++ b/src/view/year.c @@ -0,0 +1,15 @@ +/* year init */ +void year_init(void) +{ +} + +/* year draw */ +void year_draw(void) +{ +} + +/* year run */ +int year_run(int chr) +{ + return 0; +} -- 2.43.2