Skip to content

Commit 1ab776c

Browse files
committed
Windows: Pass EventStatus::Ignored keyboard events to parent
1 parent 3dcd681 commit 1ab776c

1 file changed

Lines changed: 24 additions & 13 deletions

File tree

src/win/window.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ use windows_sys::Win32::{
1313
},
1414
WindowsAndMessaging::{
1515
AdjustWindowRectEx, CreateWindowExW, DefWindowProcW, DestroyWindow, DispatchMessageW,
16-
GetMessageW, GetWindowLongPtrW, LoadCursorW, PostMessageW, SetCursor, SetTimer,
17-
SetWindowLongPtrW, SetWindowPos, TranslateMessage, GWLP_USERDATA, HTCLIENT, MSG,
18-
SWP_NOACTIVATE, SWP_NOMOVE, SWP_NOZORDER, WHEEL_DELTA, WM_CHAR, WM_CLOSE, WM_CREATE,
19-
WM_DPICHANGED, WM_INPUTLANGCHANGE, WM_KEYDOWN, WM_KEYUP, WM_LBUTTONDOWN, WM_LBUTTONUP,
20-
WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MOUSEHWHEEL, WM_MOUSEMOVE, WM_MOUSEWHEEL,
21-
WM_NCDESTROY, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_SETCURSOR, WM_SHOWWINDOW, WM_SIZE,
22-
WM_SYSCHAR, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_TIMER, WM_USER, WM_XBUTTONDOWN,
23-
WM_XBUTTONUP, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, WS_MINIMIZEBOX,
24-
WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE,
16+
GetMessageW, GetParent, GetWindowLongPtrW, LoadCursorW, PostMessageW, SendMessageW,
17+
SetCursor, SetTimer, SetWindowLongPtrW, SetWindowPos, TranslateMessage, GWLP_USERDATA,
18+
HTCLIENT, MSG, SWP_NOACTIVATE, SWP_NOMOVE, SWP_NOZORDER, WHEEL_DELTA, WM_CHAR,
19+
WM_CLOSE, WM_CREATE, WM_DPICHANGED, WM_INPUTLANGCHANGE, WM_KEYDOWN, WM_KEYUP,
20+
WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MOUSEHWHEEL,
21+
WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_NCDESTROY, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_SETCURSOR,
22+
WM_SHOWWINDOW, WM_SIZE, WM_SYSCHAR, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_TIMER, WM_USER,
23+
WM_XBUTTONDOWN, WM_XBUTTONUP, WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX,
24+
WS_MINIMIZEBOX, WS_POPUPWINDOW, WS_SIZEBOX, WS_VISIBLE,
2525
},
2626
},
2727
};
@@ -45,8 +45,8 @@ const BV_WINDOW_MUST_CLOSE: u32 = WM_USER + 1;
4545

4646
use crate::win::hook::{self, KeyboardHookHandle};
4747
use crate::{
48-
Event, MouseButton, MouseCursor, MouseEvent, PhyPoint, PhySize, ScrollDelta, Size, WindowEvent,
49-
WindowHandler, WindowInfo, WindowOpenOptions, WindowScalePolicy,
48+
Event, EventStatus, MouseButton, MouseCursor, MouseEvent, PhyPoint, PhySize, ScrollDelta, Size,
49+
WindowEvent, WindowHandler, WindowInfo, WindowOpenOptions, WindowScalePolicy,
5050
};
5151

5252
use super::cursor::cursor_to_lpcwstr;
@@ -352,13 +352,24 @@ unsafe fn wnd_proc_inner(
352352
let opt_event =
353353
window_state.keyboard_state.borrow_mut().process_message(hwnd, msg, wparam, lparam);
354354

355-
if let Some(event) = opt_event {
355+
let status = if let Some(event) = opt_event {
356356
window_state
357357
.handler
358358
.borrow_mut()
359359
.as_mut()
360360
.unwrap()
361-
.on_event(&mut window, Event::Keyboard(event));
361+
.on_event(&mut window, Event::Keyboard(event))
362+
} else {
363+
EventStatus::Ignored
364+
};
365+
366+
if status == EventStatus::Ignored {
367+
let parent = GetParent(hwnd);
368+
if !parent.is_null() {
369+
SendMessageW(parent, msg, wparam, lparam);
370+
return Some(0);
371+
}
372+
return None;
362373
}
363374

364375
if msg != WM_SYSKEYDOWN {

0 commit comments

Comments
 (0)