ui/gtk/webview.c

changeset 102
64ded9f6a6c6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/gtk/webview.c	Tue Feb 25 21:11:00 2025 +0100
@@ -0,0 +1,177 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2025 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "toolkit.h"
+#include "container.h"
+
+#include "webview.h"
+
+#ifdef UI_WEBVIEW
+
+UIWIDGET ui_webview_create(UiObject *obj, UiWebviewArgs args) {
+    UiObject* current = uic_current_obj(obj);
+    
+    GtkWidget *webview = webkit_web_view_new();
+    
+    ui_set_name_and_style(webview, args.name, args.style_class);
+    
+    UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC);
+    if(var) {
+        WebViewData *data = malloc(sizeof(WebViewData));
+        memset(data, 0, sizeof(WebViewData));
+        data->webview = WEBKIT_WEB_VIEW(webview);
+        WebKitSettings *settings = webkit_web_view_get_settings(data->webview);
+        data->javascript = webkit_settings_get_enable_javascript(settings);
+        data->zoom = webkit_web_view_get_zoom_level(data->webview);
+        
+        UiGeneric *value = var->value;
+        value->get = ui_webview_get;
+        value->get_type = ui_webview_get_type;
+        value->set = ui_webview_set;
+        value->obj = data;
+        if(value->value && value->type && !strcmp(value->type, UI_WEBVIEW_OBJECT_TYPE)) {
+            // TODO
+        }
+    }
+    
+    ui_set_widget_groups(obj->ctx, webview, args.groups);
+    UI_APPLY_LAYOUT1(current, args);
+    current->container->add(current->container, webview, FALSE);
+    
+    return webview;
+}
+
+void* ui_webview_get(UiGeneric *g) {
+    return g->value;
+}
+
+const char* ui_webview_get_type(UiGeneric *g) {
+    return UI_WEBVIEW_OBJECT_TYPE;
+}
+
+int ui_webview_set(UiGeneric *g, void *value, const char *type) {
+    if(!type || strcmp(type, UI_WEBVIEW_OBJECT_TYPE)) {
+        return 1;
+    }
+    
+    WebViewData *obj = g->obj;
+    if(!obj->webview) {
+        return 1;
+    }
+    
+    WebViewData *data = value;
+    if(data->type == WEBVIEW_CONTENT_URL) {
+        webkit_web_view_load_uri(obj->webview, data->uri);
+    } else {
+        if(!data->content) {
+            return 1;
+        }
+        
+        GBytes *bytes = g_bytes_new(data->content, data->contentlength);
+        webkit_web_view_load_bytes(obj->webview, bytes, data->mimetype, data->encoding, data->uri);
+    }
+    
+    ui_webview_enable_javascript(g, data->javascript);
+    webkit_web_view_set_zoom_level(data->webview, data->zoom);
+    
+    return 0;
+}
+
+void ui_webview_load_url(UiGeneric *g, const char *url) {
+    WebViewData data = { .uri = (char*)url, .type = WEBVIEW_CONTENT_URL };
+    g->set(g, &data, UI_WEBVIEW_OBJECT_TYPE);
+}
+
+void ui_webview_load_content(
+        UiGeneric *g,
+        const char *uri,
+        const char *content,
+        size_t contentlength,
+        const char *mimetype,
+        const char *encoding)
+{
+    WebViewData data;
+    data.uri = (char*)uri;
+    data.content = (char*)content;
+    data.contentlength = contentlength;
+    data.mimetype = (char*)mimetype;
+    data.encoding = (char*)encoding;
+    data.type = WEBVIEW_CONTENT_CONTENT;
+    g->set(g, &data, UI_WEBVIEW_OBJECT_TYPE);
+}
+
+void ui_webview_reload(UiGeneric *g) {
+    WebViewData *webview = g->obj;
+    webkit_web_view_reload(webview->webview);
+}
+
+UiBool ui_webview_can_go_back(UiGeneric *g) {
+    WebViewData *webview = g->obj;
+    return webkit_web_view_can_go_back(webview->webview);
+}
+
+UiBool ui_webview_can_go_forward(UiGeneric *g) {
+    WebViewData *webview = g->obj;
+    return webkit_web_view_can_go_forward(webview->webview);
+}
+
+void ui_webview_go_back(UiGeneric *g) {
+    WebViewData *webview = g->obj;
+    webkit_web_view_go_back(webview->webview);
+}
+
+void ui_webview_go_forward(UiGeneric *g) {
+    WebViewData *webview = g->obj;
+    webkit_web_view_go_forward(webview->webview);
+}
+
+const char* ui_webview_get_uri(UiGeneric *g) {
+    WebViewData *webview = g->obj;
+    return webkit_web_view_get_uri(webview->webview);
+}
+
+void ui_webview_enable_javascript(UiGeneric *g, UiBool enable) {
+    WebViewData *webview = g->obj;
+    WebKitSettings *settings = webkit_web_view_get_settings(webview->webview);
+    webkit_settings_set_enable_javascript(settings, enable);
+}
+
+void ui_webview_set_zoom(UiGeneric *g, double zoom) {
+    WebViewData *webview = g->obj;
+    webkit_web_view_set_zoom_level(webview->webview, zoom);
+    webview->zoom = zoom;
+}
+
+double ui_webview_get_zoom(UiGeneric *g) {
+    WebViewData *webview = g->obj;
+    webview->zoom = webkit_web_view_get_zoom_level(webview->webview);
+    return webview->zoom;
+}
+
+
+#endif

mercurial