Skip to content

Commit ecd35d8

Browse files
AlexCharltonprokopyl
authored andcommitted
Windows: Pass EventStatus::Ignored keyboard events to parent
1 parent 017242f commit ecd35d8

1 file changed

Lines changed: 25 additions & 13 deletions

File tree

src/win/window.rs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,16 @@ 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_KILLFOCUS, WM_LBUTTONDOWN,
20-
WM_LBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MOUSEHWHEEL, WM_MOUSEMOVE,
21-
WM_MOUSEWHEEL, WM_NCDESTROY, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_SETCURSOR, WM_SETFOCUS,
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,
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_KILLFOCUS, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP,
21+
WM_MOUSEHWHEEL, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_NCDESTROY, WM_RBUTTONDOWN,
22+
WM_RBUTTONUP, WM_SETCURSOR, WM_SETFOCUS, WM_SHOWWINDOW, WM_SIZE, WM_SYSCHAR,
23+
WM_SYSKEYDOWN, WM_SYSKEYUP, WM_TIMER, WM_USER, WM_XBUTTONDOWN, WM_XBUTTONUP,
24+
WS_CAPTION, WS_CHILD, WS_CLIPSIBLINGS, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUPWINDOW,
25+
WS_SIZEBOX, WS_VISIBLE,
2526
},
2627
},
2728
};
@@ -45,8 +46,8 @@ const BV_WINDOW_MUST_CLOSE: u32 = WM_USER + 1;
4546

4647
use crate::win::hook::{self, KeyboardHookHandle};
4748
use crate::{
48-
Event, MouseButton, MouseCursor, MouseEvent, PhyPoint, PhySize, ScrollDelta, Size, WindowEvent,
49-
WindowHandler, WindowInfo, WindowOpenOptions, WindowScalePolicy,
49+
Event, EventStatus, MouseButton, MouseCursor, MouseEvent, PhyPoint, PhySize, ScrollDelta, Size,
50+
WindowEvent, WindowHandler, WindowInfo, WindowOpenOptions, WindowScalePolicy,
5051
};
5152

5253
use super::cursor::cursor_to_lpcwstr;
@@ -352,13 +353,24 @@ unsafe fn wnd_proc_inner(
352353
let opt_event =
353354
window_state.keyboard_state.borrow_mut().process_message(hwnd, msg, wparam, lparam);
354355

355-
if let Some(event) = opt_event {
356+
let status = if let Some(event) = opt_event {
356357
window_state
357358
.handler
358359
.borrow_mut()
359360
.as_mut()
360361
.unwrap()
361-
.on_event(&mut window, Event::Keyboard(event));
362+
.on_event(&mut window, Event::Keyboard(event))
363+
} else {
364+
EventStatus::Ignored
365+
};
366+
367+
if status == EventStatus::Ignored {
368+
let parent = GetParent(hwnd);
369+
if !parent.is_null() {
370+
SendMessageW(parent, msg, wparam, lparam);
371+
return Some(0);
372+
}
373+
return None;
362374
}
363375

364376
if msg != WM_SYSKEYDOWN {

0 commit comments

Comments
 (0)