fedri_browser 0.1.0

A lightweight web engine bridge for WebKit2GTK on Linux.
Documentation
use libc::{c_char, c_int, c_void};
use std::ffi::CString;
use std::ptr;

// Adding gobject-2.0 to find g_signal_connect_data
#[link(name = "webkit2gtk-4.1")]
#[link(name = "gtk-3")]
#[link(name = "gobject-2.0")]
extern "C" {
    fn gtk_init(argc: *mut c_int, argv: *mut *mut *mut c_char);
    fn gtk_window_new(t: c_int) -> *mut c_void;
    fn gtk_window_set_title(w: *mut c_void, t: *const c_char);
    fn gtk_window_set_default_size(w: *mut c_void, width: c_int, height: c_int);
    fn gtk_window_maximize(w: *mut c_void);
    fn webkit_web_view_new() -> *mut c_void;
    fn webkit_web_view_load_uri(v: *mut c_void, u: *const c_char);
    fn gtk_container_add(c: *mut c_void, w: *mut c_void);
    fn gtk_widget_show_all(w: *mut c_void);
    fn gtk_main();
    fn gtk_main_quit();

    fn g_signal_connect_data(
        instance: *mut c_void,
        detailed_signal: *const c_char,
        c_handler: extern "C" fn(),
        data: *mut c_void,
        destroy_data: *mut c_void,
        connect_flags: c_int,
    ) -> u64;
}

extern "C" fn destroy_callback() {
    unsafe {
        println!("Fedri: Closing engine safely...");
        gtk_main_quit();
    }
}

pub fn fedri_start(url_str: &str, title_str: &str) {
    unsafe {
        gtk_init(ptr::null_mut(), ptr::null_mut());

        let window = gtk_window_new(0);
        let title = CString::new(title_str).unwrap();
        gtk_window_set_title(window, title.as_ptr());
        gtk_window_set_default_size(window, 1280, 720);
        gtk_window_maximize(window);

        let signal_name = CString::new("destroy").unwrap();
        g_signal_connect_data(
            window,
            signal_name.as_ptr(),
            destroy_callback,
            ptr::null_mut(),
            ptr::null_mut(),
            0,
        );

        let webview = webkit_web_view_new();
        let url = CString::new(url_str).unwrap();
        webkit_web_view_load_uri(webview, url.as_ptr());

        gtk_container_add(window, webview);
        gtk_widget_show_all(window);

        println!("--- Fedri Engine: ONLINE ---");
        println!("Action: Loading initial workspace...");
        println!("Target URL: {}", url_str);

        gtk_main();
    }
}