use libc::{c_char, c_int, c_void};
use std::ffi::CString;
use std::ptr;
#[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();
}
}