summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Schulte <nmschulte@gmail.com>2021-10-08 02:45:17 -0500
committerSimon Ser <contact@emersion.fr>2022-01-07 15:09:24 +0100
commit44bb0aa3ee29eb7f2f15d56ee97d5f988f1a1017 (patch)
tree8b66751027d92bb5cba192a3c0e731022e61bedd
parentec9e4630e08f7da00f3785ae1b1e0e52c2c8f993 (diff)
swaybar: fix tray item icon scaling, positioning
(cherry picked from commit 107d15fafde279cef0855197e243b64fbffa5c3e)
-rw-r--r--swaybar/tray/item.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/swaybar/tray/item.c b/swaybar/tray/item.c
index 19f4beaca..6d4b17bf7 100644
--- a/swaybar/tray/item.c
+++ b/swaybar/tray/item.c
@@ -493,24 +493,36 @@ uint32_t render_sni(cairo_t *cairo, struct swaybar_output *output, double *x,
cairo_destroy(cairo_icon);
}
- int padded_size = icon_size + 2*padding;
- *x -= padded_size;
- int y = floor((height - padded_size) / 2.0);
+ double descaled_padding = (double)padding / output->scale;
+ double descaled_icon_size = (double)icon_size / output->scale;
+
+ int size = descaled_icon_size + 2 * descaled_padding;
+ *x -= size;
+ int icon_y = floor((output->height - size) / 2.0);
cairo_operator_t op = cairo_get_operator(cairo);
cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
- cairo_set_source_surface(cairo, icon, *x + padding, y + padding);
- cairo_rectangle(cairo, *x, y, padded_size, padded_size);
+
+ cairo_matrix_t scale_matrix;
+ cairo_pattern_t *icon_pattern = cairo_pattern_create_for_surface(icon);
+ // TODO: check cairo_pattern_status for "ENOMEM"
+ cairo_matrix_init_scale(&scale_matrix, output->scale, output->scale);
+ cairo_matrix_translate(&scale_matrix, -(*x + descaled_padding), -(icon_y + descaled_padding));
+ cairo_pattern_set_matrix(icon_pattern, &scale_matrix);
+ cairo_set_source(cairo, icon_pattern);
+ cairo_rectangle(cairo, *x, icon_y, size, size);
cairo_fill(cairo);
+
cairo_set_operator(cairo, op);
+ cairo_pattern_destroy(icon_pattern);
cairo_surface_destroy(icon);
struct swaybar_hotspot *hotspot = calloc(1, sizeof(struct swaybar_hotspot));
hotspot->x = *x;
hotspot->y = 0;
- hotspot->width = height;
- hotspot->height = height;
+ hotspot->width = size;
+ hotspot->height = output->height;
hotspot->callback = icon_hotspot_callback;
hotspot->destroy = free;
hotspot->data = strdup(sni->watcher_id);