use std::ffi::{ c_char, c_uint };
use std::sync::{ Mutex, Weak };
use glib_sys::gpointer;
use gobject_sys::{ g_signal_connect_data, GObject };
use wpe_webkit_sys::*;
use super::{ context_menu, popups, Inner, WebView };
type MouseTargetFn = unsafe extern "C" fn( *mut WebKitWebView, *mut WebKitHitTestResult, c_uint, gpointer );
impl WebView
{
pub fn hovered_link( &self ) -> Option<String>
{
self.inner.lock().ok().and_then( |g| g.hovered_link.clone() )
}
}
pub( crate ) unsafe fn connect( webview: *mut WebKitWebView, inner: Weak<Mutex<Inner>> )
{
unsafe
{
let handler = std::mem::transmute::<MouseTargetFn, unsafe extern "C" fn()>( on_mouse_target );
let data = Box::into_raw( Box::new( inner ) ) as gpointer;
g_signal_connect_data( webview as *mut GObject, b"mouse-target-changed\0".as_ptr() as *const c_char, Some( handler ), data, Some( popups::drop_weak ), 0 );
}
}
unsafe extern "C" fn on_mouse_target( _webview: *mut WebKitWebView, hit: *mut WebKitHitTestResult, _modifiers: c_uint, user_data: gpointer )
{
let Some( inner ) = unsafe { &*( user_data as *const Weak<Mutex<Inner>> ) }.upgrade() else { return };
let link = if hit.is_null() { None } else { unsafe { context_menu::text( webkit_hit_test_result_get_link_uri( hit ) ) } };
if let Ok( mut g ) = inner.lock() { g.hovered_link = link; };
}