1+ #![ allow( clippy:: needless_doctest_main) ]
12#![ doc = include_str ! ( "../README.md" ) ]
23
34use fltk:: {
@@ -6,39 +7,11 @@ use fltk::{
67 window,
78} ;
89use fltk_webview_sys as wv;
9- pub use wv :: Webview ;
10+ use std :: { os :: raw , sync :: Arc } ;
1011pub use wv:: SizeHint ;
11- use std:: {
12- os:: raw,
13- sync:: Arc ,
14- } ;
12+ pub use wv:: Webview ;
1513
16- #[ cfg( not( any( target_os = "macos" , target_os = "windows" ) ) ) ]
17- fn win_manager ( prog : & str ) -> bool {
18- let sm = std:: env:: var ( "SESSION_MANAGER" ) ;
19- if let Ok ( sm) = sm {
20- let pid = sm. split ( "/" ) . last ( ) ;
21- if let Some ( pid) = pid {
22- match std:: process:: Command :: new ( "ps" )
23- . args ( & [ "-p" , pid, "-o" , "comm=" ] )
24- . output ( )
25- {
26- Ok ( out) => {
27- if String :: from_utf8_lossy ( & out. stdout ) . contains ( prog) {
28- true
29- } else {
30- false
31- }
32- }
33- _ => false ,
34- }
35- } else {
36- false
37- }
38- } else {
39- false
40- }
41- }
14+ // Linux path is unified under X11; Wayland embedding is not supported.
4215
4316pub trait FromFltkWindow {
4417 fn create ( debug : bool , win : & mut window:: Window ) -> Webview ;
@@ -75,15 +48,19 @@ impl FromFltkWindow for Webview {
7548 fltk:: enums:: Event :: Push => {
7649 SetFocus ( w. raw_handle ( ) as _ ) ;
7750 true
78- } ,
79- _ => false
51+ }
52+ _ => false ,
8053 } ) ;
8154 }
8255 #[ cfg( target_os = "macos" ) ]
8356 {
8457 pub enum NSWindow { }
8558 extern "C" {
86- pub fn make_delegate ( child : * mut NSWindow , parent : * mut NSWindow , add_menu : i32 ) ;
59+ pub fn make_delegate (
60+ child : * mut NSWindow ,
61+ parent : * mut NSWindow ,
62+ add_menu : i32 ,
63+ ) ;
8764 pub fn my_close_win ( win : * mut NSWindow ) ;
8865 }
8966 let handle = win. raw_handle ( ) ;
@@ -107,9 +84,11 @@ impl FromFltkWindow for Webview {
10784 pub enum Display { }
10885 extern "C" {
10986 pub fn gtk_init ( argc : * mut i32 , argv : * mut * mut raw:: c_char ) ;
87+ pub fn my_gtk_events_pending ( ) -> i32 ;
11088 pub fn my_get_win ( wid : * mut GtkWindow ) -> * mut GdkWindow ;
11189 pub fn my_get_xid ( w : * mut GdkWindow ) -> u64 ;
11290 pub fn x_init ( disp : * mut Display , child : u64 , parent : u64 ) ;
91+ pub fn x_focus ( disp : * mut Display , child : u64 ) ;
11392 pub fn gtk_main_iteration_do ( blocking : bool ) ;
11493 }
11594 gtk_init ( & mut 0 , std:: ptr:: null_mut ( ) ) ;
@@ -121,25 +100,37 @@ impl FromFltkWindow for Webview {
121100 assert ! ( !temp. is_null( ) ) ;
122101 let xid = my_get_xid ( temp as _ ) ;
123102 let flxid = win. raw_handle ( ) ;
124- if win_manager ( "gnome-session" ) {
125- win. draw ( move |w| {
126- x_init ( app:: display ( ) as _ , xid, flxid) ;
127- app:: sleep ( 0.03 ) ;
128- wv:: webview_set_size ( inner, w. w ( ) , w. h ( ) , 0 ) ;
129- } ) ;
130- win. flush ( ) ;
131- } else {
132- x_init ( app:: display ( ) as _ , xid, flxid) ;
133- win. draw ( move |w| wv:: webview_set_size ( inner, w. w ( ) , w. h ( ) , 0 ) ) ;
134- }
135103
136- app:: add_timeout3 ( 0.001 , |handle| {
137- gtk_main_iteration_do ( false ) ;
138- app:: repeat_timeout3 ( 0.001 , handle) ;
104+ // Unified X11 path: make child unmanaged and reparent into FLTK window
105+ x_init ( app:: display ( ) as _ , xid, flxid) ;
106+ // Ensure input focus goes to the embedded child when shown
107+ x_focus ( app:: display ( ) as _ , xid) ;
108+
109+ win. draw ( move |w| wv:: webview_set_size ( inner, w. w ( ) , w. h ( ) , 0 ) ) ;
110+
111+ // Set focus to child on mouse press to ensure keystrokes reach WebKit
112+ let xid_for_focus = xid;
113+ win. handle ( move |_, ev| {
114+ if ev == enums:: Event :: Push {
115+ x_focus ( app:: display ( ) as _ , xid_for_focus) ;
116+ true
117+ } else {
118+ false
119+ }
120+ } ) ;
121+
122+ app:: add_timeout3 ( 0.016 , |handle| {
123+ let mut spins = 0 ;
124+ while my_gtk_events_pending ( ) != 0 && spins < 4 {
125+ gtk_main_iteration_do ( false ) ;
126+ spins += 1 ;
127+ }
128+ app:: repeat_timeout3 ( 0.016 , handle) ;
139129 } ) ;
140130 }
141131 }
142132 assert ! ( !inner. is_null( ) ) ;
133+ #[ allow( clippy:: arc_with_non_send_sync) ]
143134 let inner = Arc :: new ( inner) ;
144135 Webview :: from_raw ( inner)
145136 }
0 commit comments