@@ -35,7 +35,7 @@ use tdf::{
3535 PrerenderLimit ,
3636 converter:: { ConvertedPage , ConverterMsg , run_conversion_loop} ,
3737 kitty:: { KittyDisplay , display_kitty_images, do_shms_work, run_action} ,
38- renderer:: { self , RenderError , RenderInfo , RenderNotif } ,
38+ renderer:: { self , LinkTarget , RenderError , RenderInfo , RenderNotif } ,
3939 tui:: { BottomMessage , InputAction , MessageSetting , Tui }
4040} ;
4141
@@ -83,11 +83,11 @@ async fn inner_main() -> Result<(), WrappedErr> {
8383 let flags = xflags:: parse_or_exit! {
8484 /// Display the pdf with the pages starting at the right hand size and moving left and
8585 /// adjust input keys to match
86- optional -r, --r-to-l r_to_l : bool
86+ optional -r, --r-to-l
8787 /// The maximum number of pages to display together, horizontally, at a time
8888 optional -m, --max-wide max_wide: NonZeroUsize
8989 /// Fullscreen the pdf (hide document name, page count, etc)
90- optional -f, --fullscreen fullscreen : bool
90+ optional -f, --fullscreen
9191 /// The number of pages to prerender surrounding the currently-shown page; 0 means no
9292 /// limit. By default, there is no limit.
9393 optional -p, --prerender prerender: usize
@@ -267,12 +267,7 @@ async fn inner_main() -> Result<(), WrappedErr> {
267267 || "Unknown file" . into ( ) ,
268268 |n| n. to_string_lossy ( ) . to_string ( )
269269 ) ;
270- let tui = Tui :: new (
271- file_name,
272- flags. max_wide ,
273- flags. r_to_l . unwrap_or_default ( ) ,
274- is_kitty
275- ) ;
270+ let tui = Tui :: new ( file_name, flags. max_wide , flags. r_to_l , is_kitty) ;
276271
277272 let backend = CrosstermBackend :: new ( std:: io:: stdout ( ) ) ;
278273 let mut term = Terminal :: new ( backend) . map_err ( |e| {
@@ -300,7 +295,7 @@ async fn inner_main() -> Result<(), WrappedErr> {
300295 } ) ?;
301296 }
302297
303- let fullscreen = flags. fullscreen . unwrap_or_default ( ) ;
298+ let fullscreen = flags. fullscreen ;
304299 let main_area = Tui :: main_layout ( & term. get_frame ( ) , fullscreen) ;
305300 to_renderer
306301 . send ( RenderNotif :: Area ( main_area. page_area ) )
@@ -376,6 +371,41 @@ async fn enter_redraw_loop(
376371 None => needs_redraw = false ,
377372 Some ( action) => match action {
378373 InputAction :: Redraw => ( ) ,
374+ InputAction :: Click { col, row } => {
375+ if let Some ( ( page_num, mupdf_x, mupdf_y) ) = tui. map_click_to_page( col, row, & main_area, font_size) {
376+ let ( resp_tx, resp_rx) = flume:: bounded( 1 ) ;
377+ to_renderer. send( RenderNotif :: QueryLinkAt {
378+ page: page_num,
379+ mupdf_x_px: mupdf_x,
380+ mupdf_y_px: mupdf_y,
381+ resp: resp_tx
382+ } ) ?;
383+ // await the renderer reply; the renderer now returns
384+ // Result<Option<LinkTarget>, String> so we can display errors
385+ match resp_rx. recv_async( ) . await {
386+ Ok ( Ok ( Some ( LinkTarget :: Uri ( uri) ) ) ) => {
387+ if let Err ( e) = webbrowser:: open( & uri) {
388+ tui. set_msg( MessageSetting :: Some ( BottomMessage :: Error (
389+ format!( "Failed to open uri {}: {e}" , uri)
390+ ) ) ) ;
391+ }
392+ }
393+ Ok ( Ok ( Some ( LinkTarget :: GoTo { page_index } ) ) ) => {
394+ to_renderer. send( RenderNotif :: JumpToPage ( page_index) ) ?;
395+ to_converter. send( ConverterMsg :: GoToPage ( page_index) ) ?;
396+ }
397+ Ok ( Ok ( None ) ) => { } ,
398+ Ok ( Err ( err_str) ) => {
399+ tui. set_msg( MessageSetting :: Some ( BottomMessage :: Error ( err_str) ) ) ;
400+ }
401+ Err ( e) => {
402+ tui. set_msg( MessageSetting :: Some ( BottomMessage :: Error (
403+ format!( "Failed to receive link response from renderer: {e}" )
404+ ) ) ) ;
405+ }
406+ }
407+ }
408+ } ,
379409 InputAction :: QuitApp => return Ok ( ( ) ) ,
380410 InputAction :: JumpingToPage ( page) => {
381411 to_renderer. send( RenderNotif :: JumpToPage ( page) ) ?;
0 commit comments