From 8106d7606d5d0ea24d23b3f0fadeafe7e6e528f6 Mon Sep 17 00:00:00 2001 From: mojyack Date: Thu, 28 Mar 2024 20:39:10 +0900 Subject: [PATCH 1/4] Check if popup surf configured on callbacks In some situations, wl_touch_* events come between layer_surface_configure and xdg_popup_surface_configure. It causes the keyboard to be drawn before the popup surf is configured, leading to "error 3: xdg_surface has never been configured". This commit fixes this. --- main.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/main.c b/main.c index 5e2e423..6b68756 100644 --- a/main.c +++ b/main.c @@ -46,6 +46,7 @@ static struct wp_fractional_scale_v1 *wfs_draw_surf; static struct wp_fractional_scale_manager_v1 *wfs_mgr; static struct wp_viewport *draw_surf_viewport, *popup_draw_surf_viewport; static struct wp_viewporter *viewporter; +static bool popup_xdg_surface_configured; struct Output { uint32_t name; @@ -190,6 +191,10 @@ wl_touch_down(void *data, struct wl_touch *wl_touch, uint32_t serial, uint32_t time, struct wl_surface *surface, int32_t id, wl_fixed_t x, wl_fixed_t y) { + if(!popup_xdg_surface_configured) { + return; + } + struct key *next_key; uint32_t touch_x, touch_y; @@ -212,6 +217,10 @@ void wl_touch_up(void *data, struct wl_touch *wl_touch, uint32_t serial, uint32_t time, int32_t id) { + if(!popup_xdg_surface_configured) { + return; + } + kbd_release_key(&keyboard, time); } @@ -219,6 +228,10 @@ void wl_touch_motion(void *data, struct wl_touch *wl_touch, uint32_t time, int32_t id, wl_fixed_t x, wl_fixed_t y) { + if(!popup_xdg_surface_configured) { + return; + } + uint32_t touch_x, touch_y; touch_x = wl_fixed_to_int(x); @@ -267,6 +280,10 @@ void wl_pointer_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) { + if(!popup_xdg_surface_configured) { + return; + } + cur_x = wl_fixed_to_int(surface_x); cur_y = wl_fixed_to_int(surface_y); @@ -279,6 +296,10 @@ void wl_pointer_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, uint32_t time, uint32_t button, uint32_t state) { + if(!popup_xdg_surface_configured) { + return; + } + struct key *next_key; cur_press = state == WL_POINTER_BUTTON_STATE_PRESSED; @@ -304,6 +325,10 @@ void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis, wl_fixed_t value) { + if(!popup_xdg_surface_configured) { + return; + } + kbd_next_layer(&keyboard, NULL, (value >= 0)); drwsurf_flip(keyboard.surf); } @@ -489,6 +514,7 @@ xdg_popup_surface_configure(void *data, struct xdg_surface *xdg_surface, uint32_t serial) { xdg_surface_ack_configure(xdg_surface, serial); + popup_xdg_surface_configured = true; drwsurf_flip(&popup_draw_surf); } @@ -605,6 +631,7 @@ layer_surface_configure(void *data, struct zwlr_layer_surface_v1 *surface, wl_surface_set_input_region(popup_draw_surf.surf, empty_region); popup_xdg_surface = xdg_wm_base_get_xdg_surface(wm_base, popup_draw_surf.surf); + popup_xdg_surface_configured = false; xdg_surface_add_listener(popup_xdg_surface, &xdg_popup_surface_listener, NULL); popup_xdg_popup = xdg_surface_get_popup(popup_xdg_surface, NULL, From e3081fb6e95c1cdd8a65b88cc88f7744a124ff98 Mon Sep 17 00:00:00 2001 From: rdbo Date: Mon, 1 Apr 2024 19:13:34 -0300 Subject: [PATCH 2/4] fixed malfunctioning theme at random --- main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.c b/main.c index 6b68756..c9f79c8 100644 --- a/main.c +++ b/main.c @@ -797,7 +797,7 @@ set_kbd_colors(uint8_t *bgra, char *hex) // bg, fg, text, high, swipe int length = strlen(hex); if (length == 6 || length == 8) { - char subhex[2]; + char subhex[3] = { 0 }; memcpy(subhex, hex, 2); bgra[2] = (int)strtol(subhex, NULL, 16); memcpy(subhex, hex + 2, 2); From d423720553be863c07b077c84e7d0ac1fd77db58 Mon Sep 17 00:00:00 2001 From: Amir Dahan <72354122+AmirDahan@users.noreply.github.com> Date: Sun, 14 Apr 2024 05:10:29 +0300 Subject: [PATCH 3/4] Add basic rounding There's probably a better way of doing this, But this will do for now. Added basic rounding to buttons. Signed-off-by: Maarten van Gompel --- config.def.h | 2 ++ drw.c | 43 ++++++++++++++++++++++++++++++++----------- drw.h | 6 +++--- keyboard.c | 20 ++++++++++---------- keyboard.h | 5 +++-- 5 files changed, 50 insertions(+), 26 deletions(-) diff --git a/config.def.h b/config.def.h index f8db8d5..80dfcd0 100644 --- a/config.def.h +++ b/config.def.h @@ -13,6 +13,7 @@ struct clr_scheme schemes[] = { .swipe = {.bgra = {100, 255, 100, 64}}, .text = {.color = UINT32_MAX}, .font = DEFAULT_FONT, + .rounding = 5, }, { /* colors */ @@ -22,6 +23,7 @@ struct clr_scheme schemes[] = { .swipe = {.bgra = {100, 255, 100, 64}}, .text = {.color = UINT32_MAX}, .font = DEFAULT_FONT, + .rounding = 5, } }; diff --git a/drw.c b/drw.c index 9f2a21a..6f38163 100644 --- a/drw.c +++ b/drw.c @@ -71,7 +71,7 @@ drw_do_clear(struct drwsurf *d, uint32_t x, uint32_t y, uint32_t w, uint32_t h) void drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y, - uint32_t w, uint32_t h, bool over) + uint32_t w, uint32_t h, bool over, int rounding) { cairo_save(d->cairo); @@ -81,27 +81,48 @@ drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y, cairo_set_operator(d->cairo, CAIRO_OPERATOR_SOURCE); } - cairo_rectangle(d->cairo, x, y, w, h); - cairo_set_source_rgba( - d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255, - color.bgra[0] / (double)255, color.bgra[3] / (double)255); - cairo_fill(d->cairo); + if (rounding > 0) { + double radius = rounding / 1.0; + double degrees = M_PI / 180.0; - cairo_restore(d->cairo); + cairo_new_sub_path (d->cairo); + cairo_arc (d->cairo, x + w - radius, y + radius, radius, -90 * degrees, 0 * degrees); + cairo_arc (d->cairo, x + w - radius, y + h - radius, radius, 0 * degrees, 90 * degrees); + cairo_arc (d->cairo, x + radius, y + h - radius, radius, 90 * degrees, 180 * degrees); + cairo_arc (d->cairo, x + radius, y + radius, radius, 180 * degrees, 270 * degrees); + cairo_close_path (d->cairo); + + cairo_set_source_rgba( + d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255, + color.bgra[0] / (double)255, color.bgra[3] / (double)255); + cairo_fill (d->cairo); + cairo_set_source_rgba(d->cairo, 0, 0, 0, 0.9); + cairo_set_line_width(d->cairo, 1.0); + cairo_stroke(d->cairo); + } + else { + cairo_rectangle(d->cairo, x, y, w, h); + cairo_set_source_rgba( + d->cairo, color.bgra[2] / (double)255, color.bgra[1] / (double)255, + color.bgra[0] / (double)255, color.bgra[3] / (double)255); + cairo_fill(d->cairo); + + cairo_restore(d->cairo); + } } void drw_fill_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y, - uint32_t w, uint32_t h) + uint32_t w, uint32_t h, int rounding) { - drw_do_rectangle(d, color, x, y, w, h, false); + drw_do_rectangle(d, color, x, y, w, h, false, rounding); } void drw_over_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y, - uint32_t w, uint32_t h) + uint32_t w, uint32_t h, int rounding) { - drw_do_rectangle(d, color, x, y, w, h, true); + drw_do_rectangle(d, color, x, y, w, h, true, rounding); } uint32_t diff --git a/drw.h b/drw.h index 6ebdd1c..628ba58 100644 --- a/drw.h +++ b/drw.h @@ -33,11 +33,11 @@ typedef union { void drw_do_clear(struct drwsurf *d, uint32_t x, uint32_t y, uint32_t w, uint32_t h); void drw_do_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y, - uint32_t w, uint32_t h, bool fill); + uint32_t w, uint32_t h, bool fill, int rounding); void drw_fill_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y, - uint32_t w, uint32_t h); + uint32_t w, uint32_t h, int rounding); void drw_over_rectangle(struct drwsurf *d, Color color, uint32_t x, uint32_t y, - uint32_t w, uint32_t h); + uint32_t w, uint32_t h, int rounding); void drw_draw_text(struct drwsurf *d, Color color, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t b, const char *label, diff --git a/keyboard.c b/keyboard.c index afe0639..e142e3d 100644 --- a/keyboard.c +++ b/keyboard.c @@ -561,15 +561,15 @@ kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type type) case None: case Unpress: draw_inset(kb->surf, k->x, k->y, k->w, k->h, KBD_KEY_BORDER, - scheme->fg); + scheme->fg, scheme->rounding); break; case Press: draw_inset(kb->surf, k->x, k->y, k->w, k->h, KBD_KEY_BORDER, - scheme->high); + scheme->high, scheme->rounding); break; case Swipe: draw_over_inset(kb->surf, k->x, k->y, k->w, k->h, KBD_KEY_BORDER, - scheme->swipe); + scheme->swipe, scheme->rounding); break; } @@ -586,9 +586,9 @@ kbd_draw_key(struct kbd *kb, struct key *k, enum key_draw_type type) kb->last_popup_h = k->h; drw_fill_rectangle(kb->popup_surf, scheme->bg, k->x, - kb->last_popup_y, k->w, k->h); + kb->last_popup_y, k->w, k->h, scheme->rounding); draw_inset(kb->popup_surf, k->x, kb->last_popup_y, k->w, k->h, - KBD_KEY_BORDER, scheme->high); + KBD_KEY_BORDER, scheme->high, scheme->rounding); drw_draw_text(kb->popup_surf, scheme->text, k->x, kb->last_popup_y, k->w, k->h, KBD_KEY_BORDER, label, scheme->font_description); @@ -605,7 +605,7 @@ kbd_draw_layout(struct kbd *kb) if (kb->debug) fprintf(stderr, "Draw layout\n"); - drw_fill_rectangle(d, kb->schemes[0].bg, 0, 0, kb->w, kb->h); + drw_fill_rectangle(d, kb->schemes[0].bg, 0, 0, kb->w, kb->h, 0); while (next_key->type != Last) { if ((next_key->type == Pad) || (next_key->type == EndRow)) { @@ -647,17 +647,17 @@ kbd_resize(struct kbd *kb, struct layout *layouts, uint8_t layoutcount) void draw_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width, - uint32_t height, uint32_t border, Color color) + uint32_t height, uint32_t border, Color color, int rounding) { drw_fill_rectangle(ds, color, x + border, y + border, width - (border * 2), - height - (border * 2)); + height - (border * 2), rounding); } void draw_over_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width, - uint32_t height, uint32_t border, Color color) + uint32_t height, uint32_t border, Color color, int rounding) { drw_over_rectangle(ds, color, x + border, y + border, width - (border * 2), - height - (border * 2)); + height - (border * 2), rounding); } void diff --git a/keyboard.h b/keyboard.h index f09b363..ebc0438 100644 --- a/keyboard.h +++ b/keyboard.h @@ -55,6 +55,7 @@ struct clr_scheme { Color swipe; Color text; char *font; + int rounding; PangoFontDescription *font_description; }; @@ -121,9 +122,9 @@ struct kbd { }; void draw_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width, - uint32_t height, uint32_t border, Color color); + uint32_t height, uint32_t border, Color color, int rounding); void draw_over_inset(struct drwsurf *ds, uint32_t x, uint32_t y, uint32_t width, - uint32_t height, uint32_t border, Color color); + uint32_t height, uint32_t border, Color color, int rounding); void kbd_init(struct kbd *kb, struct layout *layouts, char *layer_names_list, char *landscape_layer_names_list); From ba778478e67bd675e39cd5b25e970c6cc6037eeb Mon Sep 17 00:00:00 2001 From: Maarten van Gompel Date: Mon, 15 Apr 2024 20:38:02 +0200 Subject: [PATCH 4/4] added -R parameter to configure rounding --- config.def.h | 5 +++-- main.c | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 80dfcd0..190c56f 100644 --- a/config.def.h +++ b/config.def.h @@ -2,6 +2,7 @@ #define config_def_h_INCLUDED #define DEFAULT_FONT "Sans 14" +#define DEFAULT_ROUNDING 5 static const int transparency = 255; struct clr_scheme schemes[] = { @@ -13,7 +14,7 @@ struct clr_scheme schemes[] = { .swipe = {.bgra = {100, 255, 100, 64}}, .text = {.color = UINT32_MAX}, .font = DEFAULT_FONT, - .rounding = 5, + .rounding = DEFAULT_ROUNDING, }, { /* colors */ @@ -23,7 +24,7 @@ struct clr_scheme schemes[] = { .swipe = {.bgra = {100, 255, 100, 64}}, .text = {.color = UINT32_MAX}, .font = DEFAULT_FONT, - .rounding = 5, + .rounding = DEFAULT_ROUNDING, } }; diff --git a/main.c b/main.c index c9f79c8..4fff144 100644 --- a/main.c +++ b/main.c @@ -76,6 +76,7 @@ static int cur_x = -1, cur_y = -1; static bool cur_press = false; static struct kbd keyboard; static uint32_t height, normal_height, landscape_height; +static int rounding = DEFAULT_ROUNDING; static bool hidden = false; /* event handler prototypes */ @@ -680,6 +681,7 @@ usage(char *argv0) " -O - Print intersected keys to standard output\n"); fprintf(stderr, " -H [int] - Height in pixels\n"); fprintf(stderr, " -L [int] - Landscape height in pixels\n"); + fprintf(stderr, " -R [int] - Rounding radius in pixels\n"); fprintf(stderr, " --fn [font] - Set font (e.g: DejaVu Sans 20)\n"); fprintf(stderr, " --hidden - Start hidden (send SIGUSR2 to show)\n"); fprintf( @@ -948,6 +950,12 @@ main(int argc, char **argv) exit(1); } height = landscape_height = atoi(argv[++i]); + } else if (!strcmp(argv[i], "-R")) { + if (i >= argc - 1) { + usage(argv[0]); + exit(1); + } + rounding = atoi(argv[++i]); } else if (!strcmp(argv[i], "-D")) { keyboard.debug = true; } else if ((!strcmp(argv[i], "-fn")) || (!strcmp(argv[i], "--fn"))) { @@ -988,6 +996,11 @@ main(int argc, char **argv) schemes[i].font = fc_font_pattern; } + if (rounding != DEFAULT_ROUNDING) { + for (i = 0; i < countof(schemes); i++) + schemes[i].rounding = rounding; + } + display = wl_display_connect(NULL); if (display == NULL) { die("Failed to create display\n");