From 56fd08ed58d437cdf46023ce777ee868b3faa801 Mon Sep 17 00:00:00 2001 From: J0hannes101 <93882518+J0hannes101@users.noreply.github.com> Date: Sat, 8 Mar 2025 18:34:39 +0100 Subject: [PATCH] [scrollbar] Add theming for rounded corners (#2108) * [scrollbar] Add theming for rounded corners * rename "rounded-corners" to "handle-rounded-corners" --- doc/rofi-theme.5.markdown | 1 + source/widgets/scrollbar.c | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/doc/rofi-theme.5.markdown b/doc/rofi-theme.5.markdown index b14ae467..e1fb7ed0 100644 --- a/doc/rofi-theme.5.markdown +++ b/doc/rofi-theme.5.markdown @@ -1011,6 +1011,7 @@ The following properties are currently supported: - **handle-width**: distance - **handle-color**: color - **border-color**: color +- **handle-rounded-corners**: boolean for rounded scrollbar ### box diff --git a/source/widgets/scrollbar.c b/source/widgets/scrollbar.c index edb40246..6b9d463b 100644 --- a/source/widgets/scrollbar.c +++ b/source/widgets/scrollbar.c @@ -175,8 +175,26 @@ static void scrollbar_draw(widget *wid, cairo_t *draw) { // Cap length; rofi_theme_get_color(WIDGET(sb), "handle-color", draw); - cairo_rectangle(draw, widget_padding_get_left(wid), - widget_padding_get_top(wid) + y, - widget_padding_get_remaining_width(wid), height); - cairo_fill(draw); + if (rofi_theme_get_boolean(WIDGET(sb), "handle-rounded-corners", FALSE)) { + float x = widget_padding_get_left(wid); + float width = widget_padding_get_remaining_width(wid); + + float radius = ((width < height) ? width : height) / 2; // Limit radius to prevent overlap + + // Draw rounded rectangle + cairo_new_sub_path(draw); + cairo_arc(draw, x + width - radius, y + radius, radius, -G_PI_2, 0); + cairo_arc(draw, x + width - radius, y + height - radius, radius, 0, G_PI_2); + cairo_arc(draw, x + radius, y + height - radius, radius, G_PI_2, G_PI); + cairo_arc(draw, x + radius, y + radius, radius, G_PI, 1.5 * G_PI); + cairo_close_path(draw); + + cairo_fill(draw); + } + else { + cairo_rectangle(draw, widget_padding_get_left(wid), + widget_padding_get_top(wid) + y, + widget_padding_get_remaining_width(wid), height); + cairo_fill(draw); + } }