suggestion picker: a persistent layer to complement virtual keyboards like wvkbd
-rw-r--r--README.md3
-rw-r--r--config.h5
-rw-r--r--keyboard.c40
-rw-r--r--keyboard.h22
-rw-r--r--main.c14
5 files changed, 23 insertions, 61 deletions
diff --git a/README.md b/README.md
index 8a66e80..fae9f67 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/config.h b/config.h
index ce6d16f..bdb8dc7 100644
--- a/config.h
+++ b/config.h
@@ -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
diff --git a/keyboard.c b/keyboard.c
index 00a568b..540f6c9 100644
--- a/keyboard.c
+++ b/keyboard.c
@@ -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);
}
diff --git a/keyboard.h b/keyboard.h
index 876172d..f09003d 100644
--- a/keyboard.h
+++ b/keyboard.h
@@ -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
diff --git a/main.c b/main.c
index f1cb6ad..ca922ff 100644
--- a/main.c
+++ b/main.c
@@ -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);