A tiny cross-platform webview library for C/C++/Golang.
It uses Cocoa/WebKit on macOS, gtk-webkit on Linux and good old MSHTML on Windows.
WebView library prrovides C API. For Go API please see godoc.
For the most simple use cases there is only one function:
// C (#include "webview.h")
int webview(const char *title, const char *url, int width, int height, int resizable);
// Go (package github.com/zserge/webview)
func Open(title, url string, w, h int, resizable bool) error
In C you can use Mongoose or any other web server/framework you like.
You may use it with Go web server running on a random port:
ln, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
log.Fatal(err)
}
defer ln.Close()
go func() {
// Set up your http server here
log.Fatal(http.Serve(ln, nil))
}()
webview.Open("Hello", "http://"+ln.Addr().String(), 400, 300, false)
If you want to have more control over the app you can use the following functions:
struct webview webview = {
.title = title,
.url = url,
.width = w,
.height = h,
.resizable = resizable,
};
/* Create webview window using the provided options */
webview_init(&webview);
/* Main app loop, can be either blocking or non-blocking */
while (webview_loop(&webview, blocking) == 0);
/* Destroy webview window, often exits the app */
webview_exit(&webview);
/* To change window title later: */
webview_set_title(&webview, "New title");
/* To terminate the webview main loop: */
webview_terminate(&webview);
To evaluate arbitrary javascript code use the following C function:
webview_eval(&webview, "alert('hello, world');");
There is also a special callback (webview.external_invoke_cb
) that can be invoked from javascript:
// C
void my_cb(struct webview *w, const char *arg) {
...
}
// JS (note the trailing underscore)
window.external.invoke_('some arg');
// Exactly one string argument must be provided, to pass more complex objects
// serialize them to JSON and parse it in C. To pass binary data consider using
// base64.
window.external.invoke_(JSON.stringify({fn: 'sum', x: 5, y: 3}));
Webview library is meant to be used from a single UI thread only. So if you
want to call webview_eval
or webview_terminate
from some background thread
- you have to use
webview_dispatch
to post some arbitrary function with some context to be executed inside the main UI thread:
// This function will be executed on the UI thread
void render(struct webview *w, void *arg) {
webview_eval(w, ......);
}
// Dispatch render() function from another thread:
webview_dispatch(w, render, some_arg);
Code is distributed under MIT license, feel free to use it in your proprietary projects as well.
Execution on OpenBSD requires wxallowed
mount(8) option.