diff options
author | Nathan Schulte <nmschulte@gmail.com> | 2021-10-08 02:45:17 -0500 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-01-07 15:06:29 +0100 |
commit | 107d15fafde279cef0855197e243b64fbffa5c3e (patch) | |
tree | d7a7e013eae1fb4aeb9713e2b3edbd560ddf7711 | |
parent | swaybar: fix tray_padding vs min-height re: scale (diff) | |
download | sway-107d15fafde279cef0855197e243b64fbffa5c3e.tar.gz sway-107d15fafde279cef0855197e243b64fbffa5c3e.tar.zst sway-107d15fafde279cef0855197e243b64fbffa5c3e.zip |
swaybar: fix tray item icon scaling, positioning
-rw-r--r-- | swaybar/tray/item.c | 26 |
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); |