diff --git a/src/backend/wayland/wl_icon.c b/src/backend/wayland/wl_icon.c index 905d570..657db24 100644 --- a/src/backend/wayland/wl_icon.c +++ b/src/backend/wayland/wl_icon.c @@ -175,8 +175,6 @@ void wl_clip_icon_paint(WAppIcon *aicon) return; WScreen *scr = aicon->icon->core->screen_ptr; - if (!scr->workspaces || !scr->workspaces[scr->current_workspace]) - return; /* Paint base tile + icon image */ wl_appicon_paint(aicon); @@ -185,7 +183,8 @@ void wl_clip_icon_paint(WAppIcon *aicon) if (!fb || !fb->image) return; - WWorkspace *workspace = scr->workspaces[scr->current_workspace]; + WWorkspace *workspace = (scr->workspaces && scr->workspaces[scr->current_workspace]) + ? scr->workspaces[scr->current_workspace] : NULL; /* Use aicon->dock to read collapsed state — workspace->clip may be a * stale freed pointer during wWorkspaceRestoreState (the old clip is * destroyed before scr->workspaces[i]->clip is reassigned, and we @@ -210,13 +209,42 @@ void wl_clip_icon_paint(WAppIcon *aicon) WMDrawString(scr->wmscreen, d, color, scr->clip_title_font, tx, 2, ws_number, nlength); /* Draw workspace name at bottom */ - if (wPreferences.show_clip_title) { + if (wPreferences.show_clip_title && workspace) { int length = strlen(workspace->name); int ty = size - WMFontHeight(scr->clip_title_font) - 3; tx = CLIP_BUTTON_SIZE * size / 64; WMDrawString(scr->wmscreen, d, color, scr->clip_title_font, tx, ty, workspace->name, length); } + /* Draw clip arrows (filled triangles) matching X11 paintClipButtons */ + uint32_t pixel = ((uint32_t)0xFF << 24) | + ((uint32_t)WMRedComponentOfColor(color) >> 8 << 16) | + ((uint32_t)WMGreenComponentOfColor(color) >> 8 << 8) | + ((uint32_t)WMBlueComponentOfColor(color) >> 8); + uint32_t *data = (uint32_t *)pixman_image_get_data(fb->image); + int stride = pixman_image_get_stride(fb->image) / 4; + int pt = CLIP_BUTTON_SIZE * size / 64; + int as = pt - 15; + + /* Top-right arrow: vertices (size-5-as,5) (size-6,5) (size-6,4+as) */ + for (int row = 5; row <= 4 + as; row++) { + /* Triangle: at row=5 full width, at row=4+as width=1 */ + int x0 = size - 6; + int x1 = size - 6 - (row - 5) * as / (as > 0 ? as : 1); + for (int col = x1; col <= x0 && col < size; col++) + if (row < fb->height && col >= 0) + data[row * stride + col] = pixel; + } + + /* Bottom-left arrow: vertices (5,size-5-as) (5,size-6) (4+as,size-6) */ + for (int row = size - 5 - as; row <= size - 6; row++) { + int progress = row - (size - 5 - as); + int x1 = 5 + progress * as / (as > 0 ? as : 1); + for (int col = 5; col <= x1 && col < size; col++) + if (row >= 0 && row < fb->height) + data[row * stride + col] = pixel; + } + /* Commit updated buffer */ wlr_scene_buffer_set_buffer_with_damage(fb->scene_buf, &fb->base, NULL); }