ltk_webkit/wpe/
fullscreen.rsuse std::ffi::c_char;
use std::ptr;
use std::sync::{ Mutex, Weak };
use glib_sys::{ gboolean, gpointer, GTRUE };
use gobject_sys::{ g_signal_connect_data, GObject };
use wpe_webkit_sys::*;
use super::{ popups, Inner, WebView };
type FullscreenFn = unsafe extern "C" fn( *mut WebKitWebView, gpointer ) -> gboolean;
const EXIT_SCRIPT: &[ u8 ] = b"if ( document.fullscreenElement ) { document.exitFullscreen(); }\0";
impl WebView
{
pub fn take_fullscreen_request( &self ) -> Option<bool>
{
self.inner.lock().ok().and_then( |mut g| g.fullscreen_request.take() )
}
pub fn exit_fullscreen( &self )
{
let Ok( g ) = self.inner.lock() else { return };
let webview = g.webview;
drop( g );
if webview.is_null() { return; }
unsafe
{
webkit_web_view_evaluate_javascript( webview, EXIT_SCRIPT.as_ptr() as *const c_char, -1, ptr::null(), ptr::null(), ptr::null_mut(), None, ptr::null_mut() );
}
}
}
pub( crate ) unsafe fn connect( webview: *mut WebKitWebView, inner: Weak<Mutex<Inner>> )
{
unsafe
{
let enter = std::mem::transmute::<FullscreenFn, unsafe extern "C" fn()>( on_enter );
let leave = std::mem::transmute::<FullscreenFn, unsafe extern "C" fn()>( on_leave );
let enter_data = Box::into_raw( Box::new( inner.clone() ) ) as gpointer;
let leave_data = Box::into_raw( Box::new( inner ) ) as gpointer;
g_signal_connect_data( webview as *mut GObject, b"enter-fullscreen\0".as_ptr() as *const c_char, Some( enter ), enter_data, Some( popups::drop_weak ), 0 );
g_signal_connect_data( webview as *mut GObject, b"leave-fullscreen\0".as_ptr() as *const c_char, Some( leave ), leave_data, Some( popups::drop_weak ), 0 );
}
}
unsafe fn request( user_data: gpointer, enter: bool ) -> gboolean
{
if let Some( inner ) = unsafe { &*( user_data as *const Weak<Mutex<Inner>> ) }.upgrade()
{
if let Ok( mut g ) = inner.lock() { g.fullscreen_request = Some( enter ); }
}
GTRUE
}
unsafe extern "C" fn on_enter( _webview: *mut WebKitWebView, user_data: gpointer ) -> gboolean
{
unsafe { request( user_data, true ) }
}
unsafe extern "C" fn on_leave( _webview: *mut WebKitWebView, user_data: gpointer ) -> gboolean
{
unsafe { request( user_data, false ) }
}