aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sfwk-wpe.c127
1 files changed, 117 insertions, 10 deletions
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 <EGL/egl.h>
#include <SDL3/SDL_video.h>
@@ -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) {