wayland fixes
All checks were successful
pyrite-dev/milsko/pipeline/head This commit looks good

This commit is contained in:
IoI_xD 2026-03-17 17:43:22 -07:00
commit d14c17b86e
3 changed files with 41 additions and 29 deletions

View file

@ -3,7 +3,7 @@
MwWidget window, instructions, text;
void resize(MwWidget handle, void* user_data, void* call_data) {
unsigned int w, h, mh;
unsigned int w, h;
(void)user_data;
(void)call_data;
@ -12,13 +12,13 @@ void resize(MwWidget handle, void* user_data, void* call_data) {
h = MwGetInteger(handle, MwNheight);
MwVaApply(instructions,
MwNy, 50 + mh,
MwNy, 50,
MwNwidth, w - 50 * 2,
MwNheight, h - 125 - 50 * 3,
NULL);
MwVaApply(text,
MwNy, 200 + mh,
MwNy, 200,
MwNwidth, w - 50 * 2,
MwNheight, h - 125 - 50 * 3,
NULL);
@ -30,7 +30,7 @@ void clipboard(MwWidget handle, void* user_data, void* call_data) {
(void)user_data;
if(clipboard != NULL) {
MwVaApply(text, MwNtext, clipboard);
MwVaApply(text, MwNtext, clipboard, NULL);
MwForceRender(text);
}
MwForceRender(window);

View file

@ -186,6 +186,7 @@ struct _MwLLWayland {
MwLL parent;
MwBool force_render;
MwBool did_event_loop_early;
struct _MwLLWaylandShmBuffer framebuffer;
struct _MwLLWaylandShmBuffer cursor;

View file

@ -5,6 +5,8 @@
#include <wayland-client-protocol.h>
#include "../../external/stb_ds.h"
#include "Mw/BaseTypes.h"
#include "Mw/LowLevel.h"
#include <sys/mman.h>
#include <wayland-util.h>
@ -432,6 +434,9 @@ static void pointer_button(void* data, struct wl_pointer* wl_pointer, MwU32 seri
p.point = self->wayland.cur_mouse_pos;
if(p.point.x > self->wayland.x && p.point.x < self->wayland.x + self->wayland.ww && p.point.y > self->wayland.y && p.point.y < self->wayland.y + self->wayland.wh) {
int i;
p.point.x -= self->wayland.x;
p.point.y -= self->wayland.y;
switch(button) {
case BTN_LEFT:
p.button = MwLLMouseLeft;
@ -1038,12 +1043,6 @@ static int event_loop(MwLL handle) {
fd.fd = wl_display_get_fd(wayland->display);
fd.events = POLLIN;
while(wl_display_prepare_read(handle->wayland.display) != 0) {
if(wl_display_dispatch_pending(handle->wayland.display) > 0) {
return 0;
}
}
/* If an error other than EAGAIN happens, we have likely been disconnected from the Wayland session */
while(wl_display_flush(wayland->display) == -1) {
if(errno != EAGAIN) {
@ -1060,19 +1059,17 @@ static int event_loop(MwLL handle) {
}
}
wl_display_prepare_read(handle->wayland.display);
/* Condition where no events are being sent. */
if(!poll(&fd, 1, timeout)) {
wl_display_cancel_read(handle->wayland.display);
wl_display_cancel_read(wayland->display);
/* In this case, we need to commit the surface for any animations, etc. */
wl_surface_commit(handle->wayland.framebuffer.surface);
wl_surface_commit(wayland->framebuffer.surface);
return 0;
}
if(fd.revents & POLLIN) {
wl_display_read_events(wayland->display);
if(wl_display_dispatch_pending(wayland->display) > 0) {
}
} else {
wl_display_read_events(wayland->display);
if(wl_display_dispatch_pending(wayland->display) < 0) {
wl_display_cancel_read(handle->wayland.display);
}
@ -1588,32 +1585,42 @@ static int MwLLPendingImpl(MwLL handle) {
MwBool pending = MwFALSE;
struct timespec timeout;
int i;
timeout.tv_nsec = 1;
timeout.tv_sec = 0;
pending = wl_display_dispatch_timeout(handle->wayland.display, &timeout);
if(handle->wayland.always_render) {
event_loop(handle);
return 0;
}
// if(handle->wayland.force_render) {
// // event_loop(handle);
// // handle->wayland.force_render = 0;
// // update_buffer(&handle->wayland.framebuffer);
// return 1;
// }
if(handle->wayland.events_pending || handle->wayland.force_render) {
handle->wayland.did_event_loop_early = MwTRUE;
return event_loop(handle);
}
timeout.tv_nsec = 10;
timeout.tv_sec = 0;
if(handle->wayland.force_render) {
return 1;
}
if(handle->wayland.events_pending) {
return 1;
}
return wl_display_dispatch_timeout(handle->wayland.display, &timeout);
return pending;
}
static void MwLLNextEventImpl(MwLL handle) {
if(!handle->wayland.always_render) {
event_loop(handle);
if(handle->wayland.did_event_loop_early) {
handle->wayland.did_event_loop_early = MwFALSE;
} else {
event_loop(handle);
}
}
if(handle->wayland.events_pending) {
handle->wayland.events_pending = 0;
}
if(handle->wayland.force_render) {
update_buffer(&handle->wayland.framebuffer);
handle->wayland.force_render = 0;
}
}
@ -1683,6 +1690,10 @@ static void MwLLDrawPixmapImpl(MwLL handle, MwRect* rect, MwLLPixmap pixmap) {
cairo_destroy(c);
cairo_surface_destroy(cs);
MwLLForceRender(handle);
// update_buffer(&handle->wayland.framebuffer);
// wl_surface_damage(handle->wayland.framebuffer.surface, 0, 0, handle->wayland.ww, handle->wayland.wh);
}
static void MwLLSetIconImpl(MwLL handle, MwLLPixmap pixmap) {
if(handle->wayland.type == MWLL_WAYLAND_TOPLEVEL) {