wayland: fix MakeBorderless not working w CSD
Some checks are pending
pyrite-dev/milsko/pipeline/head Build started...

This commit is contained in:
IoIxD 2026-07-05 00:44:54 -07:00
commit d3b0996561
6 changed files with 20 additions and 11 deletions

View file

@ -373,6 +373,9 @@ if(${DBus1_FOUND})
) )
endif() endif()
list(APPEND LIBRARIES m)
target_include_directories( target_include_directories(
Mw Mw
PRIVATE PRIVATE

View file

@ -466,6 +466,7 @@ struct _MwLLWayland {
wayland_protocol_t* value; wayland_protocol_t* value;
}* wl_protocol_map; }* wl_protocol_map;
MwBool do_csd;
MwBool has_decorations; MwBool has_decorations;
char title[256]; char title[256];

View file

@ -27,7 +27,7 @@ void MwLLWaylandBackbufferSetup(struct _MwLLWayland* wayland) {
} }
MwU32 w = wayland->ww; MwU32 w = wayland->ww;
MwU32 h = wayland->wh; MwU32 h = wayland->wh;
if(!wayland->has_decorations) { if(!wayland->has_decorations && wayland->do_csd) {
w += (CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT); w += (CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT);
h += (CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM); h += (CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM);
} }

View file

@ -618,7 +618,7 @@ static void pointer_button(void* data, struct wl_pointer* wl_pointer, MwU32 seri
} }
} }
if(!self->wayland.has_decorations) { if(!self->wayland.has_decorations && self->wayland.do_csd) {
if(state != WL_POINTER_BUTTON_STATE_RELEASED) if(state != WL_POINTER_BUTTON_STATE_RELEASED)
xdg_borderless_step_mdown(self, p, serial); xdg_borderless_step_mdown(self, p, serial);
else else

View file

@ -11,7 +11,7 @@ void MwLLWaylandRegionSetup(MwLL handle) {
int width = (handle->wayland.clipping_rect.width == 0) ? handle->wayland.ww : handle->wayland.clipping_rect.width; int width = (handle->wayland.clipping_rect.width == 0) ? handle->wayland.ww : handle->wayland.clipping_rect.width;
int height = (handle->wayland.clipping_rect.height == 0) ? handle->wayland.wh : handle->wayland.clipping_rect.height; int height = (handle->wayland.clipping_rect.height == 0) ? handle->wayland.wh : handle->wayland.clipping_rect.height;
if(!handle->wayland.has_decorations && handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) { if(!handle->wayland.has_decorations && handle->wayland.do_csd && handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) {
width += CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT; width += CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT;
height += CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM; height += CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM;
} }

View file

@ -270,6 +270,7 @@ static void setup_toplevel(MwLL r, int x, int y) {
/* check now if we have decorations so that everything else can act accordingly */ /* check now if we have decorations so that everything else can act accordingly */
if(shget(r->wayland.wl_protocol_map, zxdg_decoration_manager_v1_interface.name) != NULL) { if(shget(r->wayland.wl_protocol_map, zxdg_decoration_manager_v1_interface.name) != NULL) {
r->wayland.has_decorations = MwTRUE; r->wayland.has_decorations = MwTRUE;
r->wayland.do_csd = MwTRUE;
} }
r->wayland.xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); r->wayland.xkb_context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
@ -314,7 +315,7 @@ static void setup_toplevel(MwLL r, int x, int y) {
zxdg_toplevel_decoration_v1_set_mode( zxdg_toplevel_decoration_v1_set_mode(
dec->decoration, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE); dec->decoration, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
} else { } else {
wl_subsurface_set_position(r->wayland.toplevel->ssurface, CSD_BORDER_FRAME_LEFT, CSD_BORDER_FRAME_TOP); wl_subsurface_set_position(r->wayland.toplevel->ssurface, r->wayland.do_csd ? CSD_BORDER_FRAME_LEFT : 0, r->wayland.do_csd ? CSD_BORDER_FRAME_TOP : 0);
} }
} }
@ -456,7 +457,7 @@ static void setup_popup(MwLL r, int x, int y, MwLL parent) {
while(topmost_parent->wayland.type != MwLL_WAYLAND_TOPLEVEL) { while(topmost_parent->wayland.type != MwLL_WAYLAND_TOPLEVEL) {
topmost_parent = topmost_parent->wayland.parent; topmost_parent = topmost_parent->wayland.parent;
} }
if(!topmost_parent->wayland.has_decorations) { if(!topmost_parent->wayland.has_decorations && topmost_parent->wayland.do_csd) {
r->wayland.x += ceil((float)CSD_BORDER_FRAME_LEFT / 2.); r->wayland.x += ceil((float)CSD_BORDER_FRAME_LEFT / 2.);
r->wayland.y += ceil((float)CSD_BORDER_FRAME_TOP / 2.); r->wayland.y += ceil((float)CSD_BORDER_FRAME_TOP / 2.);
} }
@ -478,6 +479,7 @@ static void setup_popup(MwLL r, int x, int y, MwLL parent) {
/* check now if we have decorations so that everything else can act accordingly */ /* check now if we have decorations so that everything else can act accordingly */
if(shget(r->wayland.wl_protocol_map, zxdg_decoration_manager_v1_interface.name) != NULL) { if(shget(r->wayland.wl_protocol_map, zxdg_decoration_manager_v1_interface.name) != NULL) {
r->wayland.has_decorations = MwTRUE; r->wayland.has_decorations = MwTRUE;
r->wayland.do_csd = MwTRUE;
} }
r->wayland.popup->xdg_wm_base = WAYLAND_GET_INTERFACE(r->wayland, xdg_wm_base)->context; r->wayland.popup->xdg_wm_base = WAYLAND_GET_INTERFACE(r->wayland, xdg_wm_base)->context;
@ -681,7 +683,7 @@ static void widget_setup(MwLL r, MwLL parent, int x, int y, int width, int heigh
r->wayland.keyboard_delay = 600; /* starting at 600ms... */ r->wayland.keyboard_delay = 600; /* starting at 600ms... */
r->wayland.keyboard_rate = 25; /* and going every 25ms... */ r->wayland.keyboard_rate = 25; /* and going every 25ms... */
if(!r->wayland.has_decorations) { if(!r->wayland.has_decorations && r->wayland.do_csd) {
MwLLBeginDraw(r); MwLLBeginDraw(r);
MwLLEndDraw(r); MwLLEndDraw(r);
} }
@ -921,7 +923,7 @@ static void MwLLBeginDrawImpl(MwLL handle) {
return; return;
} }
if(!handle->wayland.has_decorations) { if(!handle->wayland.has_decorations && handle->wayland.do_csd) {
int y; int y;
MwU32 w = handle->wayland.ww + CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT; MwU32 w = handle->wayland.ww + CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT;
MwU32 h = handle->wayland.wh + CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM; MwU32 h = handle->wayland.wh + CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM;
@ -1232,7 +1234,7 @@ static void MwLLSetTitleImpl(MwLL handle, const char* title) {
if(handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) { if(handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) {
xdg_toplevel_set_title(handle->wayland.toplevel->xdg_top_level, title); xdg_toplevel_set_title(handle->wayland.toplevel->xdg_top_level, title);
} }
if(!handle->wayland.has_decorations) { if(!handle->wayland.has_decorations && handle->wayland.do_csd) {
strncpy(handle->wayland.title, title, 255); strncpy(handle->wayland.title, title, 255);
MwLLBeginDraw(handle); MwLLBeginDraw(handle);
MwLLEndDraw(handle); MwLLEndDraw(handle);
@ -1361,7 +1363,7 @@ static void MwLLSetIconImpl(MwLL handle, MwLLPixmap pixmap) {
xdg_toplevel_icon_manager_v1_set_icon(icon_manager, handle->wayland.toplevel->xdg_top_level, icon); xdg_toplevel_icon_manager_v1_set_icon(icon_manager, handle->wayland.toplevel->xdg_top_level, icon);
} }
} }
if(!handle->wayland.has_decorations) { if(!handle->wayland.has_decorations && handle->wayland.do_csd) {
if(handle->wayland.icon_pixmap) { if(handle->wayland.icon_pixmap) {
MwLLDestroyPixmap(handle->wayland.icon_pixmap); MwLLDestroyPixmap(handle->wayland.icon_pixmap);
} }
@ -1483,8 +1485,8 @@ static void MwLLSetSizeHintsImpl(MwLL handle, int minx, int miny, int maxx, int
} }
static void MwLLMakeBorderlessImpl(MwLL handle, int toggle) { static void MwLLMakeBorderlessImpl(MwLL handle, int toggle) {
(void)toggle;
WIDGET_CHECK(handle); WIDGET_CHECK(handle);
printf("%d\n", toggle);
if(handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) { if(handle->wayland.type == MwLL_WAYLAND_TOPLEVEL) {
if(WAYLAND_GET_INTERFACE(handle->wayland, zxdg_decoration_manager_v1) != NULL) { if(WAYLAND_GET_INTERFACE(handle->wayland, zxdg_decoration_manager_v1) != NULL) {
zxdg_decoration_manager_v1_context_t* dec = WAYLAND_GET_INTERFACE(handle->wayland, zxdg_decoration_manager_v1)->context; zxdg_decoration_manager_v1_context_t* dec = WAYLAND_GET_INTERFACE(handle->wayland, zxdg_decoration_manager_v1)->context;
@ -1493,7 +1495,10 @@ static void MwLLMakeBorderlessImpl(MwLL handle, int toggle) {
dec->manager, handle->wayland.toplevel->xdg_top_level); dec->manager, handle->wayland.toplevel->xdg_top_level);
zxdg_toplevel_decoration_v1_set_mode( zxdg_toplevel_decoration_v1_set_mode(
dec->decoration, ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE); dec->decoration, toggle ? ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE : ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
} else {
handle->wayland.do_csd = !toggle;
wl_subsurface_set_position(handle->wayland.toplevel->ssurface, handle->wayland.do_csd ? CSD_BORDER_FRAME_LEFT : 0, handle->wayland.do_csd ? CSD_BORDER_FRAME_TOP : 0);
} }
} }
} }