suggestion picker: a persistent layer to complement virtual keyboards like wvkbd
| -rw-r--r-- | README.md | 3 | ||||
| -rw-r--r-- | config.h | 5 | ||||
| -rw-r--r-- | keyboard.c | 40 | ||||
| -rw-r--r-- | keyboard.h | 22 | ||||
| -rw-r--r-- | main.c | 14 |
5 files changed, 23 insertions, 61 deletions
@@ -19,9 +19,6 @@ You'll need the following developer packages Make any customizations you would like in `config.def.h` and run `make` -The default set of layouts is called `mobintl` *(mobile international)*, which groups various layouts aimed at mobile devices -and also attempts to accommodate various international users. The resulting binary is called `wvkbd-mobintl`. - ## Usage The keyboard can be hidden by sending it a `SIGUSR1` signal and shown again by sending it `SIGUSR2`. This saves some @@ -12,9 +12,4 @@ struct clr_scheme scheme = { .text = {.color = UINT32_MAX}, }; -/* layers is an ordered list of layouts, used to cycle through */ -static enum layout_id layers[] = { - Full, // First layout is the default layout on startup -}; - #endif // config_def_h_INCLUDED @@ -12,33 +12,30 @@ exit(1) void -kbd_init(struct kbd *kb, struct layout *layouts) { +kbd_init(struct kbd *kb) { fprintf(stderr, "Initializing keyboard\n"); - kb->layouts = layouts; - - kb->layer_index = 0; - - enum layout_id layer; - layer = kb->layers[kb->layer_index]; - kb->layout = &kb->layouts[layer]; + kb->suggs[0].label = "Hello"; + kb->suggs[1].label = "World"; + kb->suggs[2].label = "World"; + kb->suggs[3].label = NULL; } void -kbd_init_layout(struct layout *l, uint32_t width, uint32_t height) { +kbd_init_suggs(struct key *suggs, uint32_t width, uint32_t height) { uint32_t x = 0, y = 0; uint8_t rows = 1; - l->keyheight = height / rows; + uint32_t keyheight = height / rows; - struct key *k = l->keys; + struct key *k = suggs; double rowlength = kbd_get_row_length(k); while (k->label != NULL) { k->x = x; k->y = y; k->w = width / rowlength; x += k->w; - k->h = l->keyheight; + k->h = keyheight; k++; } } @@ -55,8 +52,7 @@ kbd_get_row_length(struct key *k) { struct key * kbd_get_key(struct kbd *kb, uint32_t x, uint32_t y) { - struct layout *l = kb->layout; - struct key *k = l->keys; + struct key *k = kb->suggs; if (kb->debug) fprintf(stderr, "get key: +%d+%d\n", x, y); while (k->label != NULL) { @@ -95,18 +91,12 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) { if (k->label) { kb->last_press = k; kbd_draw_key(kb, k, Press); - kbd_print_key_stdout(kb, k); + printf("%s", k->label); + fflush(stdout); } } void -kbd_print_key_stdout(struct kbd *kb, struct key *k) { - /* we generally print what is on the key LABEL and only support the normal */ - printf("%s", k->label); - fflush(stdout); -} - -void kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type type) { struct drwsurf *d = kb->surf; const char *label = k->label; @@ -131,7 +121,7 @@ kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type type) { void kbd_draw_layout(struct kbd *kb) { struct drwsurf *d = kb->surf; - struct key *next_key = kb->layout->keys; + struct key *next_key = kb->suggs; if (kb->debug) fprintf(stderr, "Draw layout"); @@ -144,13 +134,13 @@ kbd_draw_layout(struct kbd *kb) { } void -kbd_resize(struct kbd *kb, struct layout *layouts) { +kbd_resize(struct kbd *kb) { struct drwsurf *d = kb->surf; fprintf(stderr, "Resize %dx%d %d\n", kb->w, kb->h, kb->s); drwsurf_resize(d, kb->w, kb->h, kb->s); - kbd_init_layout(&layouts[0], kb->w, kb->h); + kbd_init_suggs(kb->suggs, kb->w, kb->h); kbd_draw_layout(kb); } @@ -7,7 +7,6 @@ struct clr_scheme; struct key; -struct layout; struct kbd; enum key_draw_type { @@ -26,24 +25,14 @@ struct clr_scheme { struct key { const char *label; // primary label - - struct layout *layout; // pointer back to the parent layout that holds this - // key - // actual coordinates on the surface (pixels), will be computed automatically // for all keys uint32_t x, y, w, h; }; -struct layout { - struct key *keys; - uint32_t keyheight; // absolute height (pixels) -}; - struct kbd { bool debug; - struct layout *layout; struct clr_scheme scheme; uint32_t w, h, s; @@ -51,10 +40,8 @@ struct kbd { uint8_t mods; uint8_t compose; struct key *last_press; - size_t layer_index; - struct layout *layouts; - enum layout_id *layers; + struct key suggs[64]; struct drwsurf *surf; }; @@ -64,17 +51,16 @@ void draw_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width, void draw_over_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width, uint32_t height, uint32_t border, Color color); -void kbd_init(struct kbd *kb, struct layout *layouts); -void kbd_init_layout(struct layout *l, uint32_t width, uint32_t height); +void kbd_init(struct kbd *kb); +void kbd_init_suggs(struct key *suggs, uint32_t width, uint32_t height); struct key *kbd_get_key(struct kbd *kb, uint32_t x, uint32_t y); void kbd_unpress_key(struct kbd *kb, uint32_t time); void kbd_release_key(struct kbd *kb, uint32_t time); void kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y); void kbd_press_key(struct kbd *kb, struct key *k, uint32_t time); -void kbd_print_key_stdout(struct kbd *kb, struct key *k); void kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type); void kbd_draw_layout(struct kbd *kb); -void kbd_resize(struct kbd *kb, struct layout *layouts); +void kbd_resize(struct kbd *kb); double kbd_get_row_length(struct key *k); #ifndef LAYOUT @@ -258,11 +258,6 @@ display_handle_geometry(void *data, struct wl_output *wl_output, int x, int y, return; // no changes } - enum layout_id layer; - layer = keyboard.layers[0]; - - keyboard.layout = &keyboard.layouts[layer]; - zwlr_layer_surface_v1_set_size(layer_surface, 0, height); zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, height); wl_surface_commit(draw_surf.surf); @@ -317,7 +312,7 @@ layer_surface_configure(void *data, struct zwlr_layer_surface_v1 *surface, uint32_t serial, uint32_t w, uint32_t h) { keyboard.w = w + KBD_PIXEL_OVERSCAN_WIDTH; keyboard.h = h; - kbd_resize(&keyboard, layouts); + kbd_resize(&keyboard); zwlr_layer_surface_v1_ack_configure(surface, serial); } @@ -390,7 +385,8 @@ handle_input(FILE *fd) { line = malloc(1024); if (fgets(line, 1024, fd) != NULL) { - printf("Retrieved line: %s\n", line); + fprintf(stderr, "Retrieved line: %s", line); + } free(line); @@ -410,9 +406,7 @@ main(int argc, char **argv) { landscape_height = atoi(tmp); /* keyboard settings */ - keyboard.layers = (enum layout_id *)&layers; keyboard.scheme = scheme; - keyboard.layer_index = 0; bool starthidden = false; @@ -481,7 +475,7 @@ main(int argc, char **argv) { die("layer_shell not available\n"); } - kbd_init(&keyboard, (struct layout *)&layouts); + kbd_init(&keyboard); draw_ctx.font_description = pango_font_description_from_string(fc_font_pattern); |