diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2014-10-23 09:22:17 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2014-10-23 09:23:10 +0200 |
commit | 47e6e7fa23df7cdde3f1e77bd401c898d3330861 (patch) | |
tree | 607090b4bffb6efba9ffa31081b496bfa1049abf | |
parent | de8b897b31b62a207d16815d802cee7547f7d60c (diff) | |
download | neetdraw-47e6e7fa23df7cdde3f1e77bd401c898d3330861.tar.gz neetdraw-47e6e7fa23df7cdde3f1e77bd401c898d3330861.tar.xz neetdraw-47e6e7fa23df7cdde3f1e77bd401c898d3330861.zip |
Use a real indexed palette
Instead of copying attributes from the screen.
And other minor changes, e.g. don't select a colour when the mouse
is dragged over the palette, instead of clicking on it.
-rw-r--r-- | autistdraw.c | 71 |
1 files changed, 43 insertions, 28 deletions
diff --git a/autistdraw.c b/autistdraw.c index ace5e14..effd220 100644 --- a/autistdraw.c +++ b/autistdraw.c @@ -16,17 +16,25 @@ #include "config.h" -typedef struct app_data app_data_t; -struct app_data +#define PALETTE_WIDTH 9 ///< Width of the palette + +typedef struct app_context app_context_t; +struct app_context { - termo_t *tk; + termo_t *tk; ///< Termo instance + + chtype palette[2 * 9]; ///< Attribute palette - // Current attributes for the left mouse button - int current_attrs_left; - // Current attributes for the right mouse button - int current_attrs_right; + uint8_t current_color_left; ///< Left mouse button color + uint8_t current_color_right; ///< Right mouse button color }; +static void +app_init (app_context_t *self) +{ + memset (self, 0, sizeof *self); +} + static int g_winch_pipe[2]; static void @@ -46,7 +54,7 @@ display (const char *format, ...) } static void -init_palette (app_data_t *app) +init_palette (app_context_t *app) { start_color (); @@ -63,13 +71,19 @@ init_palette (app_data_t *app) init_pair (10 + i, COLOR_BLACK + i, COLOR_WHITE); } + // Initialize the palette of characters with attributes + for (int i = 0; i < PALETTE_WIDTH; i++) + { + app->palette[i] = ' ' | COLOR_PAIR (i); + app->palette[i + 9] = ' ' | COLOR_PAIR (i + 9) | A_REVERSE | A_BOLD; + } + // This usually creates a solid black or white. - app->current_attrs_left = - app->current_attrs_right = COLOR_PAIR (9) | A_REVERSE | A_BOLD; + app->current_color_left = app->current_color_right = 9; } static void -redraw (void) +redraw (app_context_t *app) { int i; @@ -78,9 +92,9 @@ redraw (void) for (i = 0; i < COLS; i++) { - int pair = (float) i / COLS * 9; - mvaddch (1, i, ' ' | COLOR_PAIR (pair)); - mvaddch (2, i, ' ' | COLOR_PAIR (pair + 9) | A_REVERSE | A_BOLD); + int pair = (float) i / COLS * PALETTE_WIDTH; + mvaddch (1, i, app->palette[pair]); + mvaddch (2, i, app->palette[pair + PALETTE_WIDTH]); } display ("Choose a color from the palette and draw. " @@ -89,7 +103,7 @@ redraw (void) } static bool -on_key (app_data_t *app, termo_key_t *key) +on_key (app_context_t *app, termo_key_t *key) { if (key->type == TERMO_TYPE_KEYSYM && key->code.sym == TERMO_SYM_ESCAPE) @@ -110,24 +124,25 @@ on_key (app_data_t *app, termo_key_t *key) if (event != TERMO_MOUSE_PRESS && event != TERMO_MOUSE_DRAG) return true; - int *attrs; + uint8_t *color; if (button == 1) - attrs = &app->current_attrs_left; + color = &app->current_color_left; else if (button == 3) - attrs = &app->current_attrs_right; + color = &app->current_color_right; else return true; - chtype ch = mvwinch (stdscr, line, col); + move (line, col); if (line >= 3) { - // Paste the attributes where the user clicked. - addch (' ' | *attrs); + addch (app->palette[*color]); refresh (); } - else if (line > 0) - // Copy attributes from the pallete. - *attrs = ch & (A_COLOR | A_ATTRIBUTES); + else if (line > 0 && event != TERMO_MOUSE_DRAG) + { + int pair = (float) col / COLS * PALETTE_WIDTH; + *color = pair + (line - 1) * PALETTE_WIDTH; + } return true; } @@ -177,12 +192,12 @@ main (int argc, char *argv[]) exit (EXIT_FAILURE); } - app_data_t app; - memset (&app, 0, sizeof app); + app_context_t app; + app_init (&app); app.tk = tk; init_palette (&app); - redraw (); + redraw (&app); termo_result_t ret; termo_key_t key; @@ -213,7 +228,7 @@ main (int argc, char *argv[]) endwin (); refresh (); - redraw (); + redraw (&app); } if (fds[0].revents & (POLLIN | POLLHUP | POLLERR)) termo_advisereadable (tk); |