@@ -331,6 +331,7 @@ struct MacWindowState {
331
331
traffic_light_position : Option < Point < Pixels > > ,
332
332
previous_modifiers_changed_event : Option < PlatformInput > ,
333
333
keystroke_for_do_command : Option < Keystroke > ,
334
+ do_command_handled : Option < bool > ,
334
335
external_files_dragged : bool ,
335
336
// Whether the next left-mouse click is also the focusing click.
336
337
first_mouse : bool ,
@@ -609,6 +610,7 @@ impl MacWindow {
609
610
. and_then ( |titlebar| titlebar. traffic_light_position ) ,
610
611
previous_modifiers_changed_event : None ,
611
612
keystroke_for_do_command : None ,
613
+ do_command_handled : None ,
612
614
external_files_dragged : false ,
613
615
first_mouse : false ,
614
616
fullscreen_restore_bounds : Bounds :: default ( ) ,
@@ -1251,14 +1253,22 @@ extern "C" fn handle_key_event(this: &Object, native_event: id, key_equivalent:
1251
1253
// otherwise we only send to the input handler if we don't have a matching binding.
1252
1254
// The input handler may call `do_command_by_selector` if it doesn't know how to handle
1253
1255
// a key. If it does so, it will return YES so we won't send the key twice.
1254
- if is_composing || event. keystroke . key . is_empty ( ) {
1255
- window_state. as_ref ( ) . lock ( ) . keystroke_for_do_command = Some ( event. keystroke . clone ( ) ) ;
1256
+ if is_composing || event. keystroke . key_char . is_none ( ) {
1257
+ {
1258
+ let mut lock = window_state. as_ref ( ) . lock ( ) ;
1259
+ lock. keystroke_for_do_command = Some ( event. keystroke . clone ( ) ) ;
1260
+ lock. do_command_handled . take ( ) ;
1261
+ drop ( lock) ;
1262
+ }
1263
+
1256
1264
let handled: BOOL = unsafe {
1257
1265
let input_context: id = msg_send ! [ this, inputContext] ;
1258
1266
msg_send ! [ input_context, handleEvent: native_event]
1259
1267
} ;
1260
1268
window_state. as_ref ( ) . lock ( ) . keystroke_for_do_command . take ( ) ;
1261
- if handled == YES {
1269
+ if let Some ( handled) = window_state. as_ref ( ) . lock ( ) . do_command_handled . take ( ) {
1270
+ return handled as BOOL ;
1271
+ } else if handled == YES {
1262
1272
return YES ;
1263
1273
}
1264
1274
@@ -1377,6 +1387,14 @@ extern "C" fn handle_view_event(this: &Object, _: Sel, native_event: id) {
1377
1387
} ;
1378
1388
1379
1389
match & event {
1390
+ PlatformInput :: MouseDown ( _) => {
1391
+ drop ( lock) ;
1392
+ unsafe {
1393
+ let input_context: id = msg_send ! [ this, inputContext] ;
1394
+ msg_send ! [ input_context, handleEvent: native_event]
1395
+ }
1396
+ lock = window_state. as_ref ( ) . lock ( ) ;
1397
+ }
1380
1398
PlatformInput :: MouseMove (
1381
1399
event @ MouseMoveEvent {
1382
1400
pressed_button : Some ( _) ,
@@ -1790,10 +1808,11 @@ extern "C" fn do_command_by_selector(this: &Object, _: Sel, _: Sel) {
1790
1808
drop ( lock) ;
1791
1809
1792
1810
if let Some ( ( keystroke, mut callback) ) = keystroke. zip ( event_callback. as_mut ( ) ) {
1793
- ( callback) ( PlatformInput :: KeyDown ( KeyDownEvent {
1811
+ let handled = ( callback) ( PlatformInput :: KeyDown ( KeyDownEvent {
1794
1812
keystroke,
1795
1813
is_held : false ,
1796
1814
} ) ) ;
1815
+ state. as_ref ( ) . lock ( ) . do_command_handled = Some ( !handled. propagate ) ;
1797
1816
}
1798
1817
1799
1818
state. as_ref ( ) . lock ( ) . event_callback = event_callback;
0 commit comments