diff options
Diffstat (limited to 'swaybar/tray')
-rw-r--r-- | swaybar/tray/item.c | 42 | ||||
-rw-r--r-- | swaybar/tray/tray.c | 4 |
2 files changed, 34 insertions, 12 deletions
diff --git a/swaybar/tray/item.c b/swaybar/tray/item.c index a5660f62..0cb5ee9d 100644 --- a/swaybar/tray/item.c +++ b/swaybar/tray/item.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include "swaybar/tray/item.h" | 13 | #include "swaybar/tray/item.h" |
14 | #include "swaybar/tray/tray.h" | 14 | #include "swaybar/tray/tray.h" |
15 | #include "background-image.h" | 15 | #include "background-image.h" |
16 | #include "cairo.h" | 16 | #include "cairo_util.h" |
17 | #include "list.h" | 17 | #include "list.h" |
18 | #include "log.h" | 18 | #include "log.h" |
19 | #include "wlr-layer-shell-unstable-v1-client-protocol.h" | 19 | #include "wlr-layer-shell-unstable-v1-client-protocol.h" |
@@ -118,8 +118,13 @@ static int get_property_callback(sd_bus_message *msg, void *data, | |||
118 | 118 | ||
119 | int ret; | 119 | int ret; |
120 | if (sd_bus_message_is_method_error(msg, NULL)) { | 120 | if (sd_bus_message_is_method_error(msg, NULL)) { |
121 | sway_log(SWAY_ERROR, "%s %s: %s", sni->watcher_id, prop, | 121 | const sd_bus_error *err = sd_bus_message_get_error(msg); |
122 | sd_bus_message_get_error(msg)->message); | 122 | sway_log_importance_t log_lv = SWAY_ERROR; |
123 | if ((!strcmp(prop, "IconThemePath")) && | ||
124 | (!strcmp(err->name, SD_BUS_ERROR_UNKNOWN_PROPERTY))) { | ||
125 | log_lv = SWAY_DEBUG; | ||
126 | } | ||
127 | sway_log(log_lv, "%s %s: %s", sni->watcher_id, prop, err->message); | ||
123 | ret = sd_bus_message_get_errno(msg); | 128 | ret = sd_bus_message_get_errno(msg); |
124 | goto cleanup; | 129 | goto cleanup; |
125 | } | 130 | } |
@@ -461,6 +466,11 @@ uint32_t render_sni(cairo_t *cairo, struct swaybar_output *output, double *x, | |||
461 | sni->target_size = target_size; | 466 | sni->target_size = target_size; |
462 | } | 467 | } |
463 | 468 | ||
469 | // Passive | ||
470 | if (sni->status && sni->status[0] == 'P') { | ||
471 | return 0; | ||
472 | } | ||
473 | |||
464 | int icon_size; | 474 | int icon_size; |
465 | cairo_surface_t *icon; | 475 | cairo_surface_t *icon; |
466 | if (sni->icon) { | 476 | if (sni->icon) { |
@@ -488,24 +498,36 @@ uint32_t render_sni(cairo_t *cairo, struct swaybar_output *output, double *x, | |||
488 | cairo_destroy(cairo_icon); | 498 | cairo_destroy(cairo_icon); |
489 | } | 499 | } |
490 | 500 | ||
491 | int padded_size = icon_size + 2*padding; | 501 | double descaled_padding = (double)padding / output->scale; |
492 | *x -= padded_size; | 502 | double descaled_icon_size = (double)icon_size / output->scale; |
493 | int y = floor((height - padded_size) / 2.0); | 503 | |
504 | int size = descaled_icon_size + 2 * descaled_padding; | ||
505 | *x -= size; | ||
506 | int icon_y = floor((output->height - size) / 2.0); | ||
494 | 507 | ||
495 | cairo_operator_t op = cairo_get_operator(cairo); | 508 | cairo_operator_t op = cairo_get_operator(cairo); |
496 | cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); | 509 | cairo_set_operator(cairo, CAIRO_OPERATOR_OVER); |
497 | cairo_set_source_surface(cairo, icon, *x + padding, y + padding); | 510 | |
498 | cairo_rectangle(cairo, *x, y, padded_size, padded_size); | 511 | cairo_matrix_t scale_matrix; |
512 | cairo_pattern_t *icon_pattern = cairo_pattern_create_for_surface(icon); | ||
513 | // TODO: check cairo_pattern_status for "ENOMEM" | ||
514 | cairo_matrix_init_scale(&scale_matrix, output->scale, output->scale); | ||
515 | cairo_matrix_translate(&scale_matrix, -(*x + descaled_padding), -(icon_y + descaled_padding)); | ||
516 | cairo_pattern_set_matrix(icon_pattern, &scale_matrix); | ||
517 | cairo_set_source(cairo, icon_pattern); | ||
518 | cairo_rectangle(cairo, *x, icon_y, size, size); | ||
499 | cairo_fill(cairo); | 519 | cairo_fill(cairo); |
520 | |||
500 | cairo_set_operator(cairo, op); | 521 | cairo_set_operator(cairo, op); |
501 | 522 | ||
523 | cairo_pattern_destroy(icon_pattern); | ||
502 | cairo_surface_destroy(icon); | 524 | cairo_surface_destroy(icon); |
503 | 525 | ||
504 | struct swaybar_hotspot *hotspot = calloc(1, sizeof(struct swaybar_hotspot)); | 526 | struct swaybar_hotspot *hotspot = calloc(1, sizeof(struct swaybar_hotspot)); |
505 | hotspot->x = *x; | 527 | hotspot->x = *x; |
506 | hotspot->y = 0; | 528 | hotspot->y = 0; |
507 | hotspot->width = height; | 529 | hotspot->width = size; |
508 | hotspot->height = height; | 530 | hotspot->height = output->height; |
509 | hotspot->callback = icon_hotspot_callback; | 531 | hotspot->callback = icon_hotspot_callback; |
510 | hotspot->destroy = free; | 532 | hotspot->destroy = free; |
511 | hotspot->data = strdup(sni->watcher_id); | 533 | hotspot->data = strdup(sni->watcher_id); |
diff --git a/swaybar/tray/tray.c b/swaybar/tray/tray.c index 5fe6f9c3..b0545f4a 100644 --- a/swaybar/tray/tray.c +++ b/swaybar/tray/tray.c | |||
@@ -116,8 +116,8 @@ uint32_t render_tray(cairo_t *cairo, struct swaybar_output *output, double *x) { | |||
116 | } | 116 | } |
117 | } // else display on all | 117 | } // else display on all |
118 | 118 | ||
119 | if ((int) output->height*output->scale <= 2*config->tray_padding) { | 119 | if ((int)(output->height * output->scale) <= 2 * config->tray_padding) { |
120 | return 2*config->tray_padding + 1; | 120 | return (2 * config->tray_padding + 1) / output->scale; |
121 | } | 121 | } |
122 | 122 | ||
123 | uint32_t max_height = 0; | 123 | uint32_t max_height = 0; |