aboutsummaryrefslogtreecommitdiff
path: root/src/sfwk-wpe.c
diff options
context:
space:
mode:
authorArslaan Pathan <[email protected]>2026-05-07 08:53:51 +1200
committerArslaan Pathan <[email protected]>2026-05-07 08:53:51 +1200
commit04be60da025135501010de0f50a08ff8f60e3cd5 (patch)
treeac5467eafe27506ecdc40c076e68b1b9556555aa /src/sfwk-wpe.c
parente6a1e69bea00fc808ae71709abc4e6a4b8f33b3b (diff)
downloadsaffronwebkit-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/sfwk-wpe.c')
-rw-r--r--src/sfwk-wpe.c41
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;