@@ -104,6 +104,8 @@ struct ViewState {
104104 handler : Box < dyn WinHandler > ,
105105 idle_queue : Arc < Mutex < Vec < IdleKind > > > ,
106106 last_mods : KeyModifiers ,
107+ /// Tracks window focusing left clicks
108+ focus_click : bool ,
107109}
108110
109111impl WindowBuilder {
@@ -232,11 +234,17 @@ lazy_static! {
232234 extern "C" fn acceptsFirstResponder( _this: & Object , _sel: Sel ) -> BOOL {
233235 YES
234236 }
237+ // acceptsFirstMouse is called when a left mouse click would focus the window
235238 decl. add_method(
236239 sel!( acceptsFirstMouse: ) ,
237240 acceptsFirstMouse as extern "C" fn ( & Object , Sel , id) -> BOOL ,
238241 ) ;
239- extern "C" fn acceptsFirstMouse( _this: & Object , _sel: Sel , _nsevent: id) -> BOOL {
242+ extern "C" fn acceptsFirstMouse( this: & Object , _sel: Sel , _nsevent: id) -> BOOL {
243+ unsafe {
244+ let view_state: * mut c_void = * this. get_ivar( "viewState" ) ;
245+ let view_state = & mut * ( view_state as * mut ViewState ) ;
246+ view_state. focus_click = true ;
247+ }
240248 YES
241249 }
242250 decl. add_method( sel!( dealloc) , dealloc as extern "C" fn ( & Object , Sel ) ) ;
@@ -346,6 +354,7 @@ fn make_view(handler: Box<dyn WinHandler>) -> (id, Weak<Mutex<Vec<IdleKind>>>) {
346354 handler,
347355 idle_queue,
348356 last_mods : KeyModifiers :: default ( ) ,
357+ focus_click : false ,
349358 } ;
350359 let state_ptr = Box :: into_raw ( Box :: new ( state) ) ;
351360 ( * view) . set_ivar ( "viewState" , state_ptr as * mut c_void ) ;
@@ -367,7 +376,7 @@ extern "C" fn set_frame_size(this: &mut Object, _: Sel, size: NSSize) {
367376 }
368377}
369378
370- fn mouse_event ( nsevent : id , view : id , count : u8 , button : MouseButton ) -> MouseEvent {
379+ fn mouse_event ( nsevent : id , view : id , count : u8 , focus : bool , button : MouseButton ) -> MouseEvent {
371380 unsafe {
372381 let point = nsevent. locationInWindow ( ) ;
373382 let view_point = view. convertPoint_fromView_ ( point, nil) ;
@@ -379,6 +388,7 @@ fn mouse_event(nsevent: id, view: id, count: u8, button: MouseButton) -> MouseEv
379388 buttons,
380389 mods : modifiers,
381390 count,
391+ focus,
382392 button,
383393 }
384394 }
@@ -436,7 +446,8 @@ fn mouse_down(this: &mut Object, nsevent: id, button: MouseButton) {
436446 let view_state: * mut c_void = * this. get_ivar ( "viewState" ) ;
437447 let view_state = & mut * ( view_state as * mut ViewState ) ;
438448 let count = nsevent. clickCount ( ) as u8 ;
439- let event = mouse_event ( nsevent, this as id , count, button) ;
449+ let focus = view_state. focus_click && button == MouseButton :: Left ;
450+ let event = mouse_event ( nsevent, this as id , count, focus, button) ;
440451 ( * view_state) . handler . mouse_down ( & event) ;
441452 }
442453}
@@ -461,7 +472,13 @@ fn mouse_up(this: &mut Object, nsevent: id, button: MouseButton) {
461472 unsafe {
462473 let view_state: * mut c_void = * this. get_ivar ( "viewState" ) ;
463474 let view_state = & mut * ( view_state as * mut ViewState ) ;
464- let event = mouse_event ( nsevent, this as id , 0 , button) ;
475+ let focus = if view_state. focus_click && button == MouseButton :: Left {
476+ view_state. focus_click = false ;
477+ true
478+ } else {
479+ false
480+ } ;
481+ let event = mouse_event ( nsevent, this as id , 0 , focus, button) ;
465482 ( * view_state) . handler . mouse_up ( & event) ;
466483 }
467484}
@@ -470,7 +487,7 @@ extern "C" fn mouse_move(this: &mut Object, _: Sel, nsevent: id) {
470487 unsafe {
471488 let view_state: * mut c_void = * this. get_ivar ( "viewState" ) ;
472489 let view_state = & mut * ( view_state as * mut ViewState ) ;
473- let event = mouse_event ( nsevent, this as id , 0 , MouseButton :: None ) ;
490+ let event = mouse_event ( nsevent, this as id , 0 , false , MouseButton :: None ) ;
474491 ( * view_state) . handler . mouse_move ( & event) ;
475492 }
476493}
0 commit comments