diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 74a75bc..70d130a 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -193,6 +193,7 @@ #include "../../wmspec.h" /* Phase 30+: get_window_image_from_x11 */ #include "../../icon.h" /* WIcon, TILE_* */ #include "../../appicon.h" /* WAppIcon */ +#include "../../menu.h" /* WMenu, WMenuEntry */ #include "../backend.h" #include "wl_backend.h" @@ -6349,15 +6350,87 @@ static void wl_event_handle_signal_exit(void) static void wl_noop_icon_select(WIcon *icon) { (void)icon; } static void wl_noop_icon_change_title(WIcon *icon, WWindow *wwin) { (void)icon; (void)wwin; } -static void wl_noop_clip_icon_paint(WAppIcon *aicon) { (void)aicon; } -static void wl_noop_drawer_icon_paint(WAppIcon *aicon) { (void)aicon; } +static void wl_clip_icon_paint(WAppIcon *aicon) { wl_appicon_paint(aicon); } +static void wl_drawer_icon_paint(WAppIcon *aicon) { wl_appicon_paint(aicon); } static void wl_noop_balloon_init(WScreen *scr) { (void)scr; } static void wl_noop_do_kaboom(WScreen *scr, WNativeWindow win, int x, int y) { (void)scr; (void)win; (void)x; (void)y; } -static void wl_noop_menu_paint_entry(WMenu *menu, int index, int selected) -{ (void)menu; (void)index; (void)selected; } -static void wl_noop_menu_draw_frame(WScreen *scr, WNativeWindow win, int y, int w, int h, int type) -{ (void)scr; (void)win; (void)y; (void)w; (void)h; (void)type; } +static void wl_menu_paint_entry(WMenu *menu, int index, int selected) +{ + if (!menu || !menu->menu || !menu->menu->window) + return; + + struct wl_frame_buf *fb = frame_buf_find((WNativeWindow)menu->menu->window); + if (!fb || !fb->image) + return; + + WScreen *scr = menu->frame->screen_ptr; + WMenuEntry *entry = menu->entries[index]; + int y = menu->entry_height * index; + int h = menu->entry_height; + int w = fb->width; + uint32_t *dst = (uint32_t *)pixman_image_get_data(fb->image); + int stride = pixman_image_get_stride(fb->image) / 4; + + /* Background color */ + uint32_t bg; + if (selected) { + bg = 0xFF4A6984; /* selection blue */ + } else { + bg = 0xFFAEAAAE; /* menu grey */ + } + + /* Fill entry background */ + for (int row = y; row < y + h && row < fb->height; row++) + for (int col = 0; col < w; col++) + dst[row * stride + col] = bg; + + /* Text color */ + uint32_t fg = selected ? 0xFFFFFFFF : (entry->flags.enabled ? 0xFF000000 : 0xFF666666); + + /* Simple 1px text placeholder: draw a line where text would be */ + int text_y = y + h / 2; + int text_len = entry->text ? strlen(entry->text) * 7 : 0; + if (text_len > w - 16) text_len = w - 16; + if (text_y < fb->height) { + for (int col = 8; col < 8 + text_len && col < w; col++) + dst[text_y * stride + col] = fg; + } + + (void)scr; + wlr_scene_buffer_set_buffer(fb->scene_buf, &fb->base); +} + +static void wl_menu_draw_frame(WScreen *scr, WNativeWindow win, int y, int w, int h, int type) +{ + struct wl_frame_buf *fb = frame_buf_find(win); + if (!fb || !fb->image) + return; + + uint32_t *dst = (uint32_t *)pixman_image_get_data(fb->image); + int stride = pixman_image_get_stride(fb->image) / 4; + uint32_t dark = 0xFF555555; + uint32_t light = 0xFFDDDDDD; + + /* Right edge */ + for (int row = y; row < y + h && row < fb->height; row++) + if (w - 1 < fb->width) + dst[row * stride + (w - 1)] = dark; + /* Bottom edge */ + if (y + h - 1 < fb->height) + for (int col = 0; col < w && col < fb->width; col++) + dst[(y + h - 1) * stride + col] = dark; + /* Left edge */ + for (int row = y; row < y + h && row < fb->height; row++) + dst[row * stride] = light; + /* Top edge */ + if (y < fb->height) + for (int col = 0; col < w && col < fb->width; col++) + dst[y * stride + col] = light; + + (void)scr; (void)type; + wlr_scene_buffer_set_buffer(fb->scene_buf, &fb->base); +} static void wl_noop_draw_bevel(WNativeWindow d, unsigned int width, unsigned int height, WTexSolid *texture, int relief) @@ -6670,12 +6743,12 @@ const WMBackend wl_backend = { .event_handle_signal_exit = wl_event_handle_signal_exit, .icon_select = wl_noop_icon_select, .icon_change_title = wl_noop_icon_change_title, - .clip_icon_paint = wl_noop_clip_icon_paint, - .drawer_icon_paint = wl_noop_drawer_icon_paint, + .clip_icon_paint = wl_clip_icon_paint, + .drawer_icon_paint = wl_drawer_icon_paint, .balloon_init = wl_noop_balloon_init, .do_kaboom = wl_noop_do_kaboom, - .menu_paint_entry = wl_noop_menu_paint_entry, - .menu_draw_frame = wl_noop_menu_draw_frame, + .menu_paint_entry = wl_menu_paint_entry, + .menu_draw_frame = wl_menu_draw_frame, .draw_bevel = wl_noop_draw_bevel, .appmenu_send = wl_noop_appmenu_send, .display_get_name = wl_display_get_name,