diff options
| author | Arslaan Pathan <[email protected]> | 2026-05-07 08:53:51 +1200 |
|---|---|---|
| committer | Arslaan Pathan <[email protected]> | 2026-05-07 08:53:51 +1200 |
| commit | 04be60da025135501010de0f50a08ff8f60e3cd5 (patch) | |
| tree | ac5467eafe27506ecdc40c076e68b1b9556555aa /src | |
| parent | e6a1e69bea00fc808ae71709abc4e6a4b8f33b3b (diff) | |
| download | saffronwebkit-04be60da025135501010de0f50a08ff8f60e3cd5.tar.xz saffronwebkit-04be60da025135501010de0f50a08ff8f60e3cd5.zip | |
Make it work on Wayland
IT RUNSSSSSSSSSSSSSSS!!! FUCK WAYLAND that was so shit to do, im switching to XLibre
Diffstat (limited to 'src')
| -rw-r--r-- | src/sfwk-wpe.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/sfwk-wpe.c b/src/sfwk-wpe.c index b9c04a4..1d374b3 100644 --- a/src/sfwk-wpe.c +++ b/src/sfwk-wpe.c @@ -519,11 +519,33 @@ static bool sfwk_webview_ensure_initialized(SFWKWebView* webview) { EGLContext webkit_ctx = eglCreateContext(saffron_display, saffron_conf, saffron_ctx, NULL); - if (!SDL_GL_MakeCurrent(webview->window->sdl_window, (SDL_GLContext)webkit_ctx)) { - g_debug("SFWK: SDL_GL_MakeCurrent failed: %s", SDL_GetError()); + EGLint pbuffer_attribs[] = { + EGL_WIDTH, + 1, + EGL_HEIGHT, + 1, + EGL_NONE + }; + + EGLSurface dummy_surface = eglCreatePbufferSurface(saffron_display, saffron_conf, pbuffer_attribs); + if (dummy_surface == EGL_NO_SURFACE) { + g_debug("sfwk: eglCreatePbufferSurface failed: 0x%x", eglGetError()); + eglDestroyContext(saffron_display, webkit_ctx); return false; } + + if (!eglMakeCurrent(saffron_display, dummy_surface, dummy_surface, webkit_ctx)) { + g_debug("sfwk: eglMakeCurrent failed: 0x%x", eglGetError()); + eglDestroySurface(saffron_display, dummy_surface); + eglDestroyContext(saffron_display, webkit_ctx); + return false; + } + + webview->wpe.egl_display = saffron_display; + webview->wpe.egl_context = webkit_ctx; + webview->wpe.egl_dummy_surface = dummy_surface; + saved_egl_context = eglGetCurrentContext(); saved_egl_display = eglGetCurrentDisplay(); @@ -603,6 +625,20 @@ static void sfwk_webview_draw(SaffronWidget* widget, SDL_Renderer* renderer) { SDL_RenderFillRect(renderer, &(SDL_FRect){0, 0, widget->w, widget->h}); } +static void sfwk_webview_free(SaffronWidget* widget) { + if (!widget) return; + SFWKWebView* webview = (SFWKWebView*)widget; + + if (webview->wpe.egl_context) { + eglMakeCurrent(webview->wpe.egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (webview->wpe.egl_dummy_surface) eglDestroySurface(webview->wpe.egl_display, webview->wpe.egl_dummy_surface); + eglDestroyContext(webview->wpe.egl_display, webview->wpe.egl_context); + } + if (webview->url) free(webview->url); + // Webview doesn't need to free itself, saffron handles that after calling widget->free(); +} + bool sfwk_process_event(SFWKContext *context, SFWKWebView* webview, SDL_Event *event) { if (!webview) return false; if (!sfwk_webview_ensure_initialized(webview)) return false; @@ -729,6 +765,7 @@ SFWKWebView* sfwk_webview_new(SFWKContext* context, const char* url, int w, int ((SaffronWidget*)webview)->w = webview->w = w; ((SaffronWidget*)webview)->h = webview->h = h; ((SaffronWidget*)webview)->draw = sfwk_webview_draw; + ((SaffronWidget*)webview)->free = sfwk_webview_free; // add an on_resize here webview->context = context; |
