From f21101b98ccd509b4a416723b956158042b7f6e7 Mon Sep 17 00:00:00 2001 From: Arslaan Pathan Date: Sun, 3 May 2026 09:34:18 +1200 Subject: Add stuff --- src/sfwk-wpe.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 117 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/sfwk-wpe.c b/src/sfwk-wpe.c index e69d558..7d6c5e7 100644 --- a/src/sfwk-wpe.c +++ b/src/sfwk-wpe.c @@ -5,6 +5,7 @@ #include "glib-object.h" #include "glib.h" +#include "saffron_api.h" #include "wpe/wpe-platform.h" #include #include @@ -500,23 +501,20 @@ SFWKContext* sfwk_init() { } static bool sfwk_webview_ensure_initialized(SFWKWebView* webview) { - g_debug("SFWK: ensure initialized called"); if (webview->wpe.initialized) return true; - g_debug("SFWK: checking for window reference"); if (!webview->window) { g_debug("sfwk: no window reference, cannot get GL context"); return false; } - g_debug("SFWK: checking for GL context in window"); SDL_GLContext ctx = webview->window->gl_context; if (!ctx) { g_debug("sfwk: no gl context in window?? good luck"); return false; } - g_debug("SFWK: making GL context current..."); + saffron_window_detach_gl_context(webview->window); if (!SDL_GL_MakeCurrent(webview->window->sdl_window, ctx)) { g_debug("SFWK: SDL_GL_MakeCurrent failed: %s", SDL_GetError()); return false; @@ -530,8 +528,6 @@ static bool sfwk_webview_ensure_initialized(SFWKWebView* webview) { return false; } - g_debug("sfwk: Found current EGL context %p on display %p", saved_egl_context, saved_egl_display); - g_autoptr(GError) error = NULL; if (!wpe_display_connect(webview->context->display, &error)) { g_warning("sfwk: Failed to connect display: %s", error->message); @@ -558,7 +554,6 @@ static bool sfwk_webview_ensure_initialized(SFWKWebView* webview) { webview->wpe.toplevel = wpe_view_get_toplevel(webview->wpe.wpeview); - g_debug("Setting toplevel size to %dx%d", webview->w, webview->h); wpe_toplevel_resize(webview->wpe.toplevel, webview->w, webview->h); g_signal_connect(webview->wpe.wkwebview, "load-changed", G_CALLBACK(on_load_changed), webview); @@ -578,7 +573,6 @@ static void sfwk_webview_draw(SaffronWidget* widget, SDL_Renderer* renderer) { webview->renderer = renderer; if (sfwk_webview_ensure_initialized(webview)) { - g_debug("SFWK WebView draw: iterating context"); g_main_context_iteration(webview->context->main_context, FALSE); static gboolean first_frame = TRUE; if (first_frame) { @@ -605,8 +599,121 @@ static void sfwk_webview_draw(SaffronWidget* widget, SDL_Renderer* renderer) { SDL_RenderFillRect(renderer, &(SDL_FRect){0, 0, widget->w, widget->h}); } -void sfwk_process_event(SFWKContext *context, SFWKWebView* webview, SDL_Event *event) { - // do that later +bool sfwk_process_event(SFWKContext *context, SFWKWebView* webview, SDL_Event *event) { + if (!webview) return false; + if (!sfwk_webview_ensure_initialized(webview)) return false; + + WPEToplevel* toplevel = webview->wpe.toplevel; + WPEView* view = webview->wpe.wpeview; + + float mx, my; + SDL_GetMouseState(&mx, &my); + bool mouse_in_webview = mx >= webview->base.x && mx < webview->base.x + webview->base.w && + my >= webview->base.y && my < webview->base.y + webview->base.h; + + g_autoptr(WPEEvent) wpe_event = NULL; + + switch (event->type) { + case SDL_EVENT_WINDOW_SHOWN: + wpe_toplevel_state_changed(toplevel, wpe_toplevel_get_state(toplevel) | WPE_TOPLEVEL_STATE_ACTIVE); + return false; + case SDL_EVENT_WINDOW_HIDDEN: + wpe_toplevel_state_changed(toplevel, wpe_toplevel_get_state(toplevel) & ~WPE_TOPLEVEL_STATE_ACTIVE); + return false; + case SDL_EVENT_WINDOW_FOCUS_GAINED: + if (view) wpe_view_focus_in(view); + return false; + case SDL_EVENT_WINDOW_FOCUS_LOST: + if (view) wpe_view_focus_out(view); + return false; + case SDL_EVENT_WINDOW_CLOSE_REQUESTED: { + GWeakRef *view_ref = g_object_get_data(G_OBJECT(view), "weak-web-view"); + g_autoptr(WebKitWebView) web_view = NULL; + if (view_ref) + web_view = WEBKIT_WEB_VIEW(g_weak_ref_get(view_ref)); + if (web_view) + g_object_unref(web_view); + return false; + } + case SDL_EVENT_WINDOW_MOUSE_ENTER: + case SDL_EVENT_WINDOW_MOUSE_LEAVE: + wpe_event = wpe_event_pointer_move_new( + (event->type == SDL_EVENT_WINDOW_MOUSE_ENTER) ? WPE_EVENT_POINTER_ENTER : WPE_EVENT_POINTER_LEAVE, + view, WPE_INPUT_SOURCE_MOUSE, event->window.timestamp, + 0, 0, 0, 0, 0); + break; + case SDL_EVENT_MOUSE_MOTION: + g_debug("SFWK: mouse motion at (%.1f, %.1f), webview at (%.1f, %.1f) size (%dx%d), in_webview=%d", + mx, my, (double)webview->base.x, (double)webview->base.y, webview->base.w, webview->base.h, mouse_in_webview); + if (!mouse_in_webview) return false; + wpe_event = wpe_event_pointer_move_new(WPE_EVENT_POINTER_MOVE, view, + WPE_INPUT_SOURCE_MOUSE, event->motion.timestamp, + 0, + event->motion.x - webview->base.x, + event->motion.y - webview->base.y, + event->motion.xrel, event->motion.yrel); + break; + case SDL_EVENT_MOUSE_BUTTON_DOWN: + g_debug("SFWK: mouse button DOWN %d at (%.1f, %.1f), in_webview=%d, wpe_button=%d", + event->button.button, event->button.x, event->button.y, + mouse_in_webview, wpe_button_for_sdl_button(event->button.button)); + if (!mouse_in_webview) return false; + if (wpe_button_for_sdl_button(event->button.button)) + wpe_event = wpe_event_pointer_button_new(WPE_EVENT_POINTER_DOWN, view, + WPE_INPUT_SOURCE_MOUSE, event->button.timestamp, + 0, + wpe_button_for_sdl_button(event->button.button), + event->button.x - webview->base.x, + event->button.y - webview->base.y, + event->button.clicks); + break; + case SDL_EVENT_MOUSE_BUTTON_UP: + g_debug("SFWK: mouse button UP %d at (%.1f, %.1f), in_webview=%d", + event->button.button, event->button.x, event->button.y, mouse_in_webview); + if (!mouse_in_webview) return false; + if (wpe_button_for_sdl_button(event->button.button)) + wpe_event = wpe_event_pointer_button_new(WPE_EVENT_POINTER_UP, view, + WPE_INPUT_SOURCE_MOUSE, event->button.timestamp, + 0, + wpe_button_for_sdl_button(event->button.button), + event->button.x - webview->base.x, + event->button.y - webview->base.y, + 0); + break; + case SDL_EVENT_MOUSE_WHEEL: + g_debug("SFWK: mouse wheel (%.1f, %.1f), in_webview=%d", event->wheel.x, event->wheel.y, mouse_in_webview); + if (!mouse_in_webview) return false; + wpe_event = wpe_event_scroll_new(view, + WPE_INPUT_SOURCE_MOUSE, event->wheel.timestamp, + 0, + event->wheel.x, event->wheel.y, + FALSE, FALSE, + event->wheel.mouse_x - webview->base.x, + event->wheel.mouse_y - webview->base.y); + break; + case SDL_EVENT_KEY_DOWN: + case SDL_EVENT_KEY_UP: + g_debug("SFWK: key %s scancode=%d key=%d", + event->type == SDL_EVENT_KEY_DOWN ? "DOWN" : "UP", + event->key.scancode, event->key.key); + wpe_event = wpe_event_keyboard_new( + (event->type == SDL_EVENT_KEY_DOWN) ? WPE_EVENT_KEYBOARD_KEY_DOWN : WPE_EVENT_KEYBOARD_KEY_UP, + view, WPE_INPUT_SOURCE_KEYBOARD, event->key.timestamp, + wpe_modifiers_for_sdl_keymod(event->key.mod), + event->key.scancode, event->key.key); + break; + default: + return false; + } + + if (view && wpe_event) { + g_debug("SFWK: dispatching wpe_event to view %p", view); + wpe_view_event(view, wpe_event); + } else { + g_debug("SFWK: no wpe_event to dispatch (view=%p, wpe_event=%p)", view, wpe_event); + } + + return false; } SFWKWebView* sfwk_webview_new(SFWKContext* context, const char* url, int w, int h) { -- cgit v1.2.3