From 71cb96b06e9b0de0ac652cf8e7cae93a6f4ea6d2 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Sun, 7 Dec 2025 07:10:20 +0900 Subject: [PATCH] make gdi rendering a little bit faster --- include/Mw/LowLevel/GDI.h | 1 + src/backend/gdi.c | 19 +++++++++++++------ src/backend/x11.c | 6 +++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/Mw/LowLevel/GDI.h b/include/Mw/LowLevel/GDI.h index dc35ffe..9c343b5 100644 --- a/include/Mw/LowLevel/GDI.h +++ b/include/Mw/LowLevel/GDI.h @@ -20,6 +20,7 @@ struct _MwLLGDI { HICON icon; int grabbed; + int force_render; }; struct _MwLLGDIColor { diff --git a/src/backend/gdi.c b/src/backend/gdi.c index 4dcc62d..7590ab8 100644 --- a/src/backend/gdi.c +++ b/src/backend/gdi.c @@ -19,6 +19,8 @@ static LRESULT CALLBACK wndproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HBITMAP hbmp; HDC dc, hbdc; + u->ll->gdi.force_render = 0; + if(u->ll->common.copy_buffer) { GetClientRect(hWnd, &rc); @@ -235,11 +237,12 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) { r->common.copy_buffer = 1; r->common.type = MwLLBackendGDI; - r->gdi.grabbed = 0; - r->gdi.hWnd = CreateWindow("milsko", "Milsko", parent == NULL ? (WS_OVERLAPPEDWINDOW) : (WS_CHILD | WS_VISIBLE), x == MwDEFAULT ? CW_USEDEFAULT : x, y == MwDEFAULT ? CW_USEDEFAULT : y, width, height, parent == NULL ? NULL : parent->gdi.hWnd, 0, wc.hInstance, NULL); - r->gdi.hInstance = wc.hInstance; - r->gdi.cursor = NULL; - r->gdi.icon = NULL; + r->gdi.force_render = 0; + r->gdi.grabbed = 0; + r->gdi.hWnd = CreateWindow("milsko", "Milsko", parent == NULL ? (WS_OVERLAPPEDWINDOW) : (WS_CHILD | WS_VISIBLE), x == MwDEFAULT ? CW_USEDEFAULT : x, y == MwDEFAULT ? CW_USEDEFAULT : y, width, height, parent == NULL ? NULL : parent->gdi.hWnd, 0, wc.hInstance, NULL); + r->gdi.hInstance = wc.hInstance; + r->gdi.cursor = NULL; + r->gdi.icon = NULL; u->ll = r; u->min_set = 0; @@ -515,7 +518,11 @@ static void MwLLSetIconImpl(MwLL handle, MwLLPixmap pixmap) { } static void MwLLForceRenderImpl(MwLL handle) { - PostMessage(handle->gdi.hWnd, WM_USER, 0, 0); + if(!handle->gdi.force_render) { + PostMessage(handle->gdi.hWnd, WM_USER, 0, 0); + + handle->gdi.force_render = 1; + } } static void MwLLSetCursorImpl(MwLL handle, MwCursor* image, MwCursor* mask) { diff --git a/src/backend/x11.c b/src/backend/x11.c index 4536d9a..30141d4 100644 --- a/src/backend/x11.c +++ b/src/backend/x11.c @@ -773,10 +773,10 @@ static void MwLLSetIconImpl(MwLL handle, MwLLPixmap pixmap) { } static void MwLLForceRenderImpl(MwLL handle) { - XEvent ev; - memset(&ev, 0, sizeof(ev)); - if(!handle->x11.force_render) { + XEvent ev; + memset(&ev, 0, sizeof(ev)); + ev.type = Expose; ev.xexpose.window = handle->x11.window; XSendEvent(handle->x11.display, handle->x11.window, False, ExposureMask, &ev);