aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/saffronwebkit.h4
-rw-r--r--src/sfwk-wpe.c41
-rw-r--r--tests/sfwk-minimal.c6
3 files changed, 48 insertions, 3 deletions
diff --git a/include/saffronwebkit.h b/include/saffronwebkit.h
index 73cf22c..3b6a64c 100644
--- a/include/saffronwebkit.h
+++ b/include/saffronwebkit.h
@@ -57,6 +57,10 @@ typedef struct {
WPEView* wpeview;
WebKitWebView* wkwebview;
gboolean initialized;
+
+ EGLDisplay egl_display;
+ EGLContext egl_context;
+ EGLSurface egl_dummy_surface;
} wpe;
SDL_Renderer* renderer;
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;
diff --git a/tests/sfwk-minimal.c b/tests/sfwk-minimal.c
index afac3a2..4a92730 100644
--- a/tests/sfwk-minimal.c
+++ b/tests/sfwk-minimal.c
@@ -1,4 +1,5 @@
#include "glib.h"
+#include <SDL3/SDL_hints.h>
#include <saffron.h>
#include <saffronwebkit.h>
@@ -15,6 +16,9 @@ void btn_callback(SaffronButton* btn) {
}
int main() {
+ SDL_SetHint(SDL_HINT_GPU_DRIVER, "opengles2");
+ SDL_SetHint(SDL_HINT_VIDEO_FORCE_EGL, "true");
+
saffron_init();
const char* driver = SDL_GetCurrentVideoDriver();
@@ -29,7 +33,7 @@ int main() {
ctx = sfwk_init();
if (!ctx) return 1;
- SFWKWebView* webview = sfwk_webview_new(ctx, "https://arslaancodes.com", 900, 600);
+ webview = sfwk_webview_new(ctx, "https://arslaancodes.com", 900, 600);
saffron_widget_add_child(window->root, (SaffronWidget*)button);
saffron_widget_add_child(window->root, (SaffronWidget*)webview);