]> Pileus Git - lackey/commitdiff
Add basic screen layout stuff
authorAndy Spencer <andy753421@gmail.com>
Sat, 29 Sep 2012 04:31:30 +0000 (04:31 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sat, 29 Sep 2012 04:31:30 +0000 (04:31 +0000)
15 files changed:
.gitignore
src/main.c
src/main.h
src/makefile
src/screen.c
src/screen.h
src/view/day.c
src/view/help.c
src/view/mkview.sh [new file with mode: 0755]
src/view/month.c
src/view/notes.c
src/view/settings.c
src/view/todo.c
src/view/week.c
src/view/year.c

index ce7e03463d3bf7d2494860f61d0b7b0693f705a7..61bceb3d07f7e8ee5f4dcc7a741e0a0c8b82bc21 100644 (file)
@@ -1,4 +1,6 @@
-*~
+*.log
 *.o
+*~
 .vimrc
 acal
+tags
index 1329eca482b5553b5c0c0f078b6439e52e67cf6d..41e1c81c180cf62c047d7bf87a93df0a6856f3b4 100644 (file)
@@ -1,12 +1,99 @@
+#define _POSIX_C_SOURCE 1
+#include <stdarg.h>
+#include <stdlib.h>
+#include <signal.h>
 #include <ncurses.h>
 
-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;
 }
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ea66f9dec9b7e92fca0d9413623d3956e7d4e8f0 100644 (file)
@@ -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;
index 2024cc8c86798a760c82b9ed7e327233ecb85754..20ac4a8b09046f74c81140ac68d33be3e02c6e2a 100644 (file)
@@ -15,7 +15,8 @@ default: test
 all: $(PROG)
 
 test: $(PROG)
-       ./$<
+       @urxvt -e ./$<
+       @cat acal.log
 
 clean:
        rm -f *.o view/*.o $(PROG)
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a841f1e9fc68f836fada6f9cb0be2de151d13679 100644 (file)
@@ -0,0 +1,76 @@
+#include <ncurses.h>
+#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);
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9df33aba5624cef481abe259b54e02f14f41cb12 100644 (file)
@@ -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);
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4944861377e1dfd7ddcceaccf543a33f196ffd0d 100644 (file)
@@ -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;
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..63b2ebcc767b5bbf06ac927e26094fa0f8003c6d 100644 (file)
@@ -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 (executable)
index 0000000..cda2b2d
--- /dev/null
@@ -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
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..435faf558e49e705a1bac6acd1b209c90f485675 100644 (file)
@@ -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;
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7a4307a9954ac018696bfc2dc711df4ed9a98b65 100644 (file)
@@ -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;
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d013fa11cabd602da18cb4d908b643402f97249a 100644 (file)
@@ -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;
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..430cbf8d2bad540d7519354b85bd95338ea560d0 100644 (file)
@@ -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;
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cc6e5d69582a81320785d9e280fcbea48282675e 100644 (file)
@@ -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;
+}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9819228f29486d605f1ab83135f7211291a873fa 100644 (file)
@@ -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;
+}