aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/tray/item.c
diff options
context:
space:
mode:
Diffstat (limited to 'swaybar/tray/item.c')
-rw-r--r--swaybar/tray/item.c42
1 files changed, 32 insertions, 10 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);