diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index ea623b5..2580f33 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -8291,27 +8291,12 @@ wl_workspace_badge_render(WScreen *scr, WNativeWindow badge_win, W_RegisterBacking(fb->id, fb->image); } - /* Fill black */ - pixman_image_t *black_fill = pixman_image_create_bits(PIXMAN_a8r8g8b8, width, height, NULL, 0); - if (black_fill) { - uint32_t *data = pixman_image_get_data(black_fill); - for (int i = 0; i < width * height; i++) - data[i] = 0xFF000000; - pixman_image_composite32(PIXMAN_OP_SRC, black_fill, NULL, fb->image, - 0, 0, 0, 0, 0, 0, width, height); - pixman_image_unref(black_fill); - } - - /* Draw text (shadow passes + final) */ - for (int x = 0; x <= 4; x++) - for (int y = 0; y <= 4; y++) - WMDrawString(scr->wmscreen, (WMDrawable)badge_win, scr->white, - scr->workspace_name_font, x, y, name, name_len); - - /* Clear and redraw final text centered */ + /* Fill transparent */ uint32_t *px = pixman_image_get_data(fb->image); for (int i = 0; i < width * height; i++) - px[i] = 0xFF000000; + px[i] = 0x00000000; + + /* Draw white text */ WMDrawString(scr->wmscreen, (WMDrawable)badge_win, scr->white, scr->workspace_name_font, 2, 2, name, name_len); @@ -8319,15 +8304,16 @@ wl_workspace_badge_render(WScreen *scr, WNativeWindow badge_win, if (fb->scene_buf) wlr_scene_buffer_set_buffer_with_damage(fb->scene_buf, &fb->base, NULL); - /* Return RImage copy for fade animation */ - RImage *result = RCreateImage(width, height, False); + /* Return RGBA RImage copy for fade animation */ + RImage *result = RCreateImage(width, height, True); if (result) { uint32_t *src = pixman_image_get_data(fb->image); for (int i = 0; i < width * height; i++) { uint32_t p = src[i]; - result->data[i * 3 + 0] = (p >> 16) & 0xFF; /* R */ - result->data[i * 3 + 1] = (p >> 8) & 0xFF; /* G */ - result->data[i * 3 + 2] = p & 0xFF; /* B */ + result->data[i * 4 + 0] = (p >> 16) & 0xFF; /* R */ + result->data[i * 4 + 1] = (p >> 8) & 0xFF; /* G */ + result->data[i * 4 + 2] = p & 0xFF; /* B */ + result->data[i * 4 + 3] = (p >> 24) & 0xFF; /* A */ } } return result; @@ -8337,9 +8323,10 @@ static RImage * wl_workspace_badge_get_background(WScreen *scr, int x, int y, int width, int height) { (void)scr; (void)x; (void)y; - RImage *img = RCreateImage(width, height, False); + /* Return a fully transparent background so the badge floats over the desktop */ + RImage *img = RCreateImage(width, height, True); if (img) - memset(img->data, 8, width * height * 3); + memset(img->data, 0, width * height * 4); return img; } @@ -8365,7 +8352,8 @@ wl_workspace_badge_update(WScreen *scr, WNativeWindow badge_win, RImage *img) uint8_t r = img->data[si]; uint8_t g = img->data[si + 1]; uint8_t b = img->data[si + 2]; - dst[y * fb->width + x] = 0xFF000000 | (r << 16) | (g << 8) | b; + uint8_t a = (bpp == 4) ? img->data[si + 3] : 0xFF; + dst[y * fb->width + x] = ((uint32_t)a << 24) | (r << 16) | (g << 8) | b; } }