From e324f9a3a281d9ce29bb6d4953ba39763b52dbed Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Sun, 24 Mar 2024 11:05:10 +0100 Subject: [PATCH] don't use FX9860G/FXCG50 and slightly more unified APIs We still have a few platform-specific occurrences that I'll want to get rid of in the future. This should ultimately leave me with only one version of the library (but this also precludes the use of macros like DWIDTH/DHEIGHT which will require further changes). --- CMakeLists.txt | 1 + assets/font-fkeys-fx.png | Bin 0 -> 16532 bytes assets/fxconv-metadata.txt | 10 ++++ include/justui/jfkeys.h | 67 ++++++++++++--------------- src/jfileselect.c | 23 ++++++---- src/jfkeys.c | 91 +++++++++++++------------------------ src/jframe.c | 27 ++++++----- src/jinput.c | 19 ++++---- src/jscene.c | 6 ++- 9 files changed, 114 insertions(+), 130 deletions(-) create mode 100644 assets/font-fkeys-fx.png diff --git a/CMakeLists.txt b/CMakeLists.txt index bf76f20..7dbd315 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ configure_file(include/justui/config.h.in include/justui/config.h) set(ASSETS_fx assets/input-modes-fx.png + assets/font-fkeys-fx.png ) set(ASSETS_cg assets/input-modes-cg.png diff --git a/assets/font-fkeys-fx.png b/assets/font-fkeys-fx.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ead6c79d0a4b5e821f7bfafb2ff7877d98e3cb GIT binary patch literal 16532 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 literal 0 HcmV?d00001 diff --git a/assets/fxconv-metadata.txt b/assets/fxconv-metadata.txt index 199811f..a7697eb 100644 --- a/assets/fxconv-metadata.txt +++ b/assets/fxconv-metadata.txt @@ -6,3 +6,13 @@ input-modes-cg.png: name: j_img_input_modes type: bopti-image profile: p4 + +font-fkeys-fx.png: + name: j_font_fkeys_fx + type: font + charset: print + grid.size: 5x6 + grid.padding: 1 + grid.border: 0 + proportional: true + height: 6 diff --git a/include/justui/jfkeys.h b/include/justui/jfkeys.h index 0912014..58f0442 100644 --- a/include/justui/jfkeys.h +++ b/include/justui/jfkeys.h @@ -9,6 +9,7 @@ #include #include +#include /* jfkeys: Functions keys indicating functions for the F1..F6 keys @@ -32,8 +33,8 @@ that should catch attention, or particularly unsafe actions. They are round white keys. - On fx-CG 50, the keys are drawn dynamically using gint's default font, and - specified using 6 strings that give the type and name of the keys: + The more flexible option to draw the keys is dynamically with text. In that + case each key are specified with a strings that combines a type and name: * "/NAME" for a menu key; * ".NAME" for an entry key; @@ -45,20 +46,22 @@ instance, "/F1;#F2|/F1" represents a function bar where the F2 function can be hidden by switching from level 0 to level 1. - On fx-9860G, there is not enough space to generate keys on-the-fly, so the - full specification is just an image. The convention for the image is to be - 128x8 pixels, with each function key (i) positioned at (x = 21*i + 2) of - width 19. Several levels can be stacked up (n levels in an image of height - 9n-1) and selected independently. */ + The other option is to draw the keys with an image. This is most useful at + small resolutions where hand-drawn keys often look better. On the fx-9860G + with its 128x64 resolution, the convention is that the image is 128x8, and + key #i is positioned at x = 21i+2 with width 19. The equivalent of "|"- + separated levels is allowed by stacking up rows of keys (in which case the + image is of height 9n-1 for n rows). */ typedef struct { jwidget widget; int8_t level; - #ifdef FX9860G - bopti_image_t const *img; - #endif + /* Image version; if specified this overrides all text parameters */ + + bopti_image_t const *img; + + /* Text version */ - #ifdef FXCG50 char const *labels; char const *overrides[6]; @@ -66,39 +69,29 @@ typedef struct { int text_color, text_special_color; font_t const *font; - #endif } jfkeys; -/* jfkeys_create(): Create a set of function keysed +/* jfkeys_create2(): Create a set of function keys - The arguments are obviously different on fx-9860G and fx-CG 50. If your - application supports both, you might want to specify arguments for both - platforms in a single call with jfkeys_create2() which will filter them out - for you. Referencing an image unavailable on fx-CG 50 in jfkeys_create2() is - safe since the preprocessor will remove that text. */ + Both the image and text specification are provided; one of them should + generally be NULL (if both are non-NULL, the image takes precedence). For + historical reasons the name fkeys_create() is a one-argument version with + either the text or image depending on the platform. */ +jfkeys *jfkeys_create2( + bopti_image_t const *img, char const *labels, void *parent); -#ifdef FX9860G -jfkeys *jfkeys_create(bopti_image_t const *img, void *parent); -#define jfkeys_create2(img, labels, parent) jfkeys_create(img, parent) -#endif - -#ifdef FXCG50 -jfkeys *jfkeys_create(char const *labels, void *parent); -#define jfkeys_create2(img, labels, parent) jfkeys_create(labels, parent) -#endif - -/* jfkeys_set(): Replace functions +/* jfkeys_set2(): Replace the definition of function keys This will also reset the level to 0. */ +void jfkeys_set2(jfkeys *keys, bopti_image_t const *img, char const *labels); -#ifdef FX9860G -void jfkeys_set(jfkeys *keys, bopti_image_t const *img); -#define jfkeys_set2(keys, img, labels) jfkeys_set(keys, img) -#endif - -#ifdef FXCG50 -void jfkeys_set(jfkeys *keys, char const *labels); -#define jfkeys_set2(keys, img, labels) jfkeys_set(keys, labels) +/* Deprecated platform-specific shortcuts */ +#if GINT_RENDER_MONO +# define jfkeys_create(img, parent) jfkeys_create2(img, NULL, parent) +# define jfkeys_set(keys, img) jfkeys_set2(keys, img, NULL) +#elif GINT_RENDER_RGB +# define jfkeys_create(labels, parent) jfkeys_create2(NULL, labels, parent) +# define jfkeys_set(keys, labels) jfkeys_set2(keys, NULL, labels) #endif /* jfkeys_level(): Return the current function key level */ diff --git a/src/jfileselect.c b/src/jfileselect.c index c28fca6..95cde8b 100644 --- a/src/jfileselect.c +++ b/src/jfileselect.c @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -14,6 +15,16 @@ /* Type identifier for jfileselect */ static int jfileselect_type_id = -1; +#if GINT_RENDER_MONO +# define JFILESELECT_LINE_SPACING 1 +# define JFILESELECT_SCROLLBAR_WIDTH 1 +# define JFILESELECT_INFO_SHORT 1 +#elif GINT_RENDER_RGB +# define JFILESELECT_LINE_SPACING 4 +# define JFILESELECT_SCROLLBAR_WIDTH 2 +# define JFILESELECT_INFO_SHORT 0 +#endif + /* Events */ uint16_t JFILESELECT_LOADED; uint16_t JFILESELECT_VALIDATED; @@ -59,20 +70,14 @@ jfileselect *jfileselect_create(void *parent) fs->saveas_input = input; fs->saveas = false; fs->input_mode = false; + fs->scrollbar_width = JFILESELECT_SCROLLBAR_WIDTH; fs->filter_function = jfileselect_default_filter; fs->cursor = -1; fs->scroll = 0; fs->visible_lines = 0; -#ifdef FX9860G - fs->line_spacing = 1; - fs->scrollbar_width = 1; -#else - fs->line_spacing = 4; - fs->scrollbar_width = 2; -#endif - + fs->line_spacing = JFILESELECT_LINE_SPACING; fs->font = dfont_default(); fs->show_file_size = false; @@ -373,7 +378,7 @@ static void jfileselect_poly_layout(void *fs0) static void generate_info_string(char *str, bool isfolder, int size) { -#ifdef FX9860G +#if JFILESELECT_INFO_SHORT if(size < 0) sprintf(str, "E%d", -size); else if(isfolder) diff --git a/src/jfkeys.c b/src/jfkeys.c index 9c069bc..21b4380 100644 --- a/src/jfkeys.c +++ b/src/jfkeys.c @@ -7,45 +7,39 @@ /* Type identified for jfkeys */ static int jfkeys_type_id = -1; -#ifdef FX9860G -jfkeys *jfkeys_create(bopti_image_t const *img, void *parent) +extern font_t j_font_fkeys_fx; + +#if GINT_RENDER_MONO +# define JFKEYS_HEIGHT 8 +#elif GINT_RENDER_RGB +# define JFKEYS_HEIGHT 17 +#endif + +jfkeys *jfkeys_create2( + bopti_image_t const *img, char const *labels, void *parent) { if(jfkeys_type_id < 0) return NULL; jfkeys *f = malloc(sizeof *f); jwidget_init(&f->widget, jfkeys_type_id, parent); - jfkeys_set(f, img); - - return f; -} - -void jfkeys_set(jfkeys *f, bopti_image_t const *img) -{ - f->img = img; - f->level = 0; - f->widget.update = true; -} -#endif /* FX9860G */ - -#ifdef FXCG50 -jfkeys *jfkeys_create(char const *labels, void *parent) -{ - if(jfkeys_type_id < 0) return NULL; - - jfkeys *f = malloc(sizeof *f); - jwidget_init(&f->widget, jfkeys_type_id, parent); - jfkeys_set(f, labels); + jfkeys_set2(f, img, labels); for(int i = 0; i < 6; i++) f->overrides[i] = NULL; f->bg_color = C_BLACK; f->bg_special_color = C_WHITE; f->text_color = C_WHITE; f->text_special_color = C_BLACK; + +#if GINT_RENDER_MONO + f->font = &j_font_fkeys_fx; +#else f->font = dfont_default(); +#endif return f; } -void jfkeys_set(jfkeys *f, char const *labels) +void jfkeys_set2(jfkeys *f, bopti_image_t const *img, char const *labels) { + f->img = img; f->labels = labels; f->level = 0; f->widget.update = true; @@ -90,7 +84,6 @@ static char const *get_label(char const *level, int key, size_t *len) return NULL; } -#endif /* FXCG50 */ //--- // Polymorphic widget operations @@ -99,37 +92,27 @@ static char const *get_label(char const *level, int key, size_t *len) static void jfkeys_poly_csize(void *f0) { jfkeys *f = f0; - - #ifdef FX9860G - f->widget.w = 128; - f->widget.h = 8; - #endif - - #ifdef FXCG50 - f->widget.w = 396; - f->widget.h = 17; - #endif + f->widget.w = DWIDTH; + f->widget.h = JFKEYS_HEIGHT; } static void jfkeys_poly_render(void *f0, int base_x, int y) { jfkeys *f = f0; - #ifdef FX9860G - dsubimage(base_x, y, f->img, 0, 9*f->level, f->img->width, 8, DIMAGE_NONE); - #endif + if(f->img) { + dsubimage(base_x, y, f->img, 0, (JFKEYS_HEIGHT+1) * f->level, + f->img->width, JFKEYS_HEIGHT, DIMAGE_NONE); + return; + } - #ifdef FXCG50 font_t const *old_font = dfont(f->font); char const *level = get_level(f->labels, f->level); if(!level) return; for(int position = 0; position < 6; position++) { size_t length = 0; - char const *text = NULL; - #ifdef FXCG50 - text = f->overrides[position]; - #endif + char const *text = f->overrides[position]; if(!text) text = get_label(level, position, &length); if(!text || (*text != '.' && *text != '/' && *text != '@' && *text != '#')) continue; @@ -168,7 +151,6 @@ static void jfkeys_poly_render(void *f0, int base_x, int y) } dfont(old_font); - #endif /* FXCG50 */ } int jfkeys_level(jfkeys *f) @@ -183,41 +165,30 @@ void jfkeys_set_level(jfkeys *f, int level) f->widget.update = 1; } -char const *jfkeys_override(GUNUSED jfkeys *keys, GUNUSED int key) +char const *jfkeys_override(jfkeys *keys, int key) { - #ifdef FXCG50 if(key < 1 || key > 6) return NULL; return keys->overrides[key - 1]; - #endif - - return NULL; } -void jfkeys_set_override(GUNUSED jfkeys *keys, GUNUSED int key, - GUNUSED char const *override) +void jfkeys_set_override(jfkeys *keys, int key, char const *override) { - #ifdef FXCG50 if(key < 1 || key > 6) return; keys->overrides[key - 1] = override; - #endif } -void jfkeys_set_color(GUNUSED jfkeys *keys, GUNUSED int bg, - GUNUSED int bg_special, GUNUSED int text, GUNUSED int text_special) +void jfkeys_set_color( + jfkeys *keys, int bg, int bg_special, int text, int text_special) { - #ifdef FXCG50 keys->bg_color = bg; keys->bg_special_color = bg_special; keys->text_color = text; keys->text_special_color = text_special; - #endif } -void jfkeys_set_font(GUNUSED jfkeys *keys, GUNUSED font_t const *font) +void jfkeys_set_font(jfkeys *keys, font_t const *font) { - #ifdef FXCG50 keys->font = font; - #endif } /* jfkeys type definition */ diff --git a/src/jframe.c b/src/jframe.c index 3a65951..e65724c 100644 --- a/src/jframe.c +++ b/src/jframe.c @@ -4,18 +4,28 @@ #include "util.h" #include +#include #include /* Type identifier for jframe */ static int jframe_type_id = -1; +#if GINT_RENDER_MONO +# define JFRAME_SCROLLBAR_WIDTH 1 +# define JFRAME_SCROLLBAR_SPACING 1 +# define JFRAME_DEFAULT_MARGIN 4 +#elif GINT_RENDER_RGB +# define JFRAME_SCROLLBAR_WIDTH 2 +# define JFRAME_SCROLLBAR_SPACING 2 +# define JFRAME_DEFAULT_MARGIN 8 +#endif + jframe *jframe_create(void *parent) { if(jframe_type_id < 0) return NULL; - jframe *f = malloc(sizeof *f); if(!f) return NULL; @@ -30,18 +40,11 @@ jframe *jframe_create(void *parent) f->keyboard_control = false; f->match_width = false; f->match_height = false; + f->scrollbar_width = JFRAME_SCROLLBAR_WIDTH; + f->scrollbar_spacing = JFRAME_SCROLLBAR_SPACING; -#ifdef FX9860G - f->scrollbar_width = 1; - f->scrollbar_spacing = 1; - f->visibility_margin_x = 4; - f->visibility_margin_y = 4; -#else - f->scrollbar_width = 2; - f->scrollbar_spacing = 2; - f->visibility_margin_x = 8; - f->visibility_margin_y = 8; -#endif + f->visibility_margin_x = JFRAME_DEFAULT_MARGIN; + f->visibility_margin_y = JFRAME_DEFAULT_MARGIN; f->scroll_x = 0; f->scroll_y = 0; diff --git a/src/jinput.c b/src/jinput.c index 2c32a0a..ab414d2 100644 --- a/src/jinput.c +++ b/src/jinput.c @@ -5,7 +5,8 @@ #include #include -#include +#include +#include /* Type identifier for jinput */ static int jinput_type_id = -1; @@ -28,11 +29,12 @@ enum { /* Mode indicators and their size */ extern bopti_image_t j_img_input_modes; -#ifdef FX9860G -#define JINPUT_INDICATOR 9 -#endif -#ifdef FXCG50 -#define JINPUT_INDICATOR 12 +#if GINT_RENDER_MONO +# define JINPUT_INDICATOR 9 +# define JINPUT_CURSOR_WIDTH 1 +#elif GINT_RENDER_RGB +# define JINPUT_INDICATOR 12 +# define JINPUT_CURSOR_WIDTH 2 #endif jinput *jinput_create(char const *prompt, size_t length, void *parent) @@ -218,10 +220,7 @@ static void jinput_poly_render(void *i0, int x, int y) else cursor_w = 0; int cursor_x = x + prompt_w + cursor_w; - dline(cursor_x, y, cursor_x, y + h - 1, i->color); - #ifdef FXCG50 - dline(cursor_x + 1, y, cursor_x + 1, y + h - 1, i->color); - #endif + drect(cursor_x, y, cursor_x+JINPUT_CURSOR_WIDTH-1, y + h - 1, i->color); } dfont(old_font); diff --git a/src/jscene.c b/src/jscene.c index f66e5d8..4517e33 100644 --- a/src/jscene.c +++ b/src/jscene.c @@ -233,12 +233,14 @@ jevent jscene_run(jscene *s) continue; } } - #ifdef FX9860G + // TODO: Temporarily disabled to allow build-fxg3a, will put back when + // gint's generic video interface is available +/* #ifdef FX9860G if(k.type == KEYEV_DOWN && k.key == KEY_OPTN && k.shift && !k.alpha) { t6k11_backlight(-1); continue; } - #endif + #endif */ getkey_feature_t feat = getkey_feature_function(); if((k.type == KEYEV_DOWN || k.type == KEYEV_HOLD) && feat && feat(k))