--- /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