aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Nathan Schulte <nmschulte@gmail.com>2021-10-08 02:45:17 -0500
committerLibravatar Simon Ser <contact@emersion.fr>2022-01-07 15:06:29 +0100
commit107d15fafde279cef0855197e243b64fbffa5c3e (patch)
treed7a7e013eae1fb4aeb9713e2b3edbd560ddf7711
parentswaybar: fix tray_padding vs min-height re: scale (diff)
downloadsway-107d15fafde279cef0855197e243b64fbffa5c3e.tar.gz
sway-107d15fafde279cef0855197e243b64fbffa5c3e.tar.zst
sway-107d15fafde279cef0855197e243b64fbffa5c3e.zip
swaybar: fix tray item icon scaling, positioning
-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 19f4beac..6d4b17bf 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,
493 cairo_destroy(cairo_icon); 493 cairo_destroy(cairo_icon);
494 } 494 }
495 495
496 int padded_size = icon_size + 2*padding; 496 double descaled_padding = (double)padding / output->scale;
497 *x -= padded_size; 497 double descaled_icon_size = (double)icon_size / output->scale;
498 int y = floor((height - padded_size) / 2.0); 498
499 int size = descaled_icon_size + 2 * descaled_padding;
500 *x -= size;
501 int icon_y = floor((output->height - size) / 2.0);
499 502
500 cairo_operator_t op = cairo_get_operator(cairo); 503 cairo_operator_t op = cairo_get_operator(cairo);
501 cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); 504 cairo_set_operator(cairo, CAIRO_OPERATOR_OVER);
502 cairo_set_source_surface(cairo, icon, *x + padding, y + padding); 505
503 cairo_rectangle(cairo, *x, y, padded_size, padded_size); 506 cairo_matrix_t scale_matrix;
507 cairo_pattern_t *icon_pattern = cairo_pattern_create_for_surface(icon);
508 // TODO: check cairo_pattern_status for "ENOMEM"
509 cairo_matrix_init_scale(&scale_matrix, output->scale, output->scale);
510 cairo_matrix_translate(&scale_matrix, -(*x + descaled_padding), -(icon_y + descaled_padding));
511 cairo_pattern_set_matrix(icon_pattern, &scale_matrix);
512 cairo_set_source(cairo, icon_pattern);
513 cairo_rectangle(cairo, *x, icon_y, size, size);
504 cairo_fill(cairo); 514 cairo_fill(cairo);
515
505 cairo_set_operator(cairo, op); 516 cairo_set_operator(cairo, op);
506 517
518 cairo_pattern_destroy(icon_pattern);
507 cairo_surface_destroy(icon); 519 cairo_surface_destroy(icon);
508 520
509 struct swaybar_hotspot *hotspot = calloc(1, sizeof(struct swaybar_hotspot)); 521 struct swaybar_hotspot *hotspot = calloc(1, sizeof(struct swaybar_hotspot));
510 hotspot->x = *x; 522 hotspot->x = *x;
511 hotspot->y = 0; 523 hotspot->y = 0;
512 hotspot->width = height; 524 hotspot->width = size;
513 hotspot->height = height; 525 hotspot->height = output->height;
514 hotspot->callback = icon_hotspot_callback; 526 hotspot->callback = icon_hotspot_callback;
515 hotspot->destroy = free; 527 hotspot->destroy = free;
516 hotspot->data = strdup(sni->watcher_id); 528 hotspot->data = strdup(sni->watcher_id);