diff --git a/include/Mw/LowLevel/Wayland.h b/include/Mw/LowLevel/Wayland.h index 21bbc28..1de48b3 100644 --- a/include/Mw/LowLevel/Wayland.h +++ b/include/Mw/LowLevel/Wayland.h @@ -428,6 +428,8 @@ struct _MwLLWayland { MwBool dispatching_resize; + MwBool is_toplevel_menu; + struct _MwLLWaylandShmBuffer framebuffer; struct _MwLLWaylandShmBuffer backbuffer; struct _MwLLWaylandShmBuffer cursor; diff --git a/include/Mw/TypeDefs.h b/include/Mw/TypeDefs.h index d31aeac..b31c4b4 100644 --- a/include/Mw/TypeDefs.h +++ b/include/Mw/TypeDefs.h @@ -119,6 +119,8 @@ struct _MwWidget { int berserk; long last_tick; + + MwBool is_menu; }; #endif diff --git a/src/backend/wayland/buffer.c b/src/backend/wayland/buffer.c index 15e7e4e..ce56599 100644 --- a/src/backend/wayland/buffer.c +++ b/src/backend/wayland/buffer.c @@ -31,7 +31,7 @@ void MwLLWaylandBackbufferSetup(struct _MwLLWayland* wayland) { } MwLLWaylandBufferSetup(&wayland->backbuffer, w, h); - MwLLCairoBackSetup(&wayland->cairo, wayland->backbuffer.buf_back, wayland->ww, wayland->wh); + MwLLCairoBackSetup(&wayland->cairo, wayland->backbuffer.buf_back, w, h); memset(wayland->backbuffer.buf_back, 255, wayland->backbuffer.buf_size); if(wayland->configured) diff --git a/src/backend/wayland/wayland.c b/src/backend/wayland/wayland.c index 5faa2c6..c156e04 100644 --- a/src/backend/wayland/wayland.c +++ b/src/backend/wayland/wayland.c @@ -451,7 +451,6 @@ static void popup_configure(void* data, int32_t height) { MwLL self = data; (void)xdg_popup; - self->wayland.x = x; self->wayland.y = y; self->wayland.ww = width; @@ -483,18 +482,23 @@ struct xdg_popup_listener popup_listener = { /* Popup setup function */ static void setup_popup(MwLL r, int x, int y, MwLL parent) { MwLL topmost_parent = r->wayland.parent; + r->wayland.type = MwLL_WAYLAND_POPUP; + r->wayland.x = x; + r->wayland.y = y; + r->wayland.popup = malloc(sizeof(struct _MwLLWaylandPopup)); - r->wayland.type = MwLL_WAYLAND_POPUP; - r->wayland.x = x; - r->wayland.y = y; - r->wayland.popup = malloc(sizeof(struct _MwLLWaylandPopup)); + if(parent) { + MwWidget p = parent->common.user; + while(topmost_parent->wayland.parent) { + topmost_parent = topmost_parent->wayland.parent; + } - while(topmost_parent->wayland.type != MwLL_WAYLAND_TOPLEVEL && topmost_parent->wayland.type != MwLL_WAYLAND_LAYER_SURFACE) { - topmost_parent = topmost_parent->wayland.parent; - } - if(!topmost_parent->wayland.has_decorations && topmost_parent->wayland.do_csd) { - r->wayland.x += ceil((float)CSD_BORDER_FRAME_LEFT / 2.); - r->wayland.y += ceil((float)CSD_BORDER_FRAME_TOP / 2.); + if(!topmost_parent->wayland.has_decorations && topmost_parent->wayland.do_csd) { + if(p->is_menu) { + r->wayland.x += round((float)CSD_BORDER_FRAME_LEFT / 2.); + r->wayland.y += ceil((float)CSD_BORDER_FRAME_TOP / 2.); + } + } } MwLLWaylandSetupCallbacks(&r->wayland); @@ -525,7 +529,13 @@ static void setup_popup(MwLL r, int x, int y, MwLL parent) { xdg_positioner_set_size(r->wayland.popup->xdg_positioner, r->wayland.ww, r->wayland.wh); xdg_positioner_set_anchor_rect( r->wayland.popup->xdg_positioner, - r->wayland.x, r->wayland.y, r->wayland.ww, r->wayland.wh); + topmost_parent->wayland.x, topmost_parent->wayland.y, r->wayland.ww, r->wayland.wh); + xdg_positioner_set_offset( + r->wayland.popup->xdg_positioner, + r->wayland.x, r->wayland.y); + + xdg_positioner_set_anchor(r->wayland.popup->xdg_positioner, XDG_POSITIONER_ANCHOR_NONE); + xdg_positioner_set_gravity(r->wayland.popup->xdg_positioner, XDG_POSITIONER_GRAVITY_NONE); r->wayland.xkb_keymap = topmost_parent->wayland.xkb_keymap; r->wayland.xkb_state = topmost_parent->wayland.xkb_state; diff --git a/src/widget/menu.c b/src/widget/menu.c index 7df61f2..8dd3d7a 100644 --- a/src/widget/menu.c +++ b/src/widget/menu.c @@ -24,6 +24,7 @@ static int wcreate(MwWidget handle) { m->wsub = NULL; m->sub = NULL; handle->internal = m; + handle->is_menu = MwTRUE; MwSetDefault(handle);