|
@@ -1877,11 +1877,15 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
|
|
break;
|
|
|
}
|
|
|
case WM_ACTIVATE: { // Watch For Window Activate Message
|
|
|
- saved_wparam = wParam;
|
|
|
- saved_lparam = lParam;
|
|
|
+ if (!windows[window_id].window_focused) {
|
|
|
+ _process_activate_event(window_id, wParam, lParam);
|
|
|
+ } else {
|
|
|
+ windows[window_id].saved_wparam = wParam;
|
|
|
+ windows[window_id].saved_lparam = lParam;
|
|
|
|
|
|
- // Run a timer to prevent event catching warning if the window is closing.
|
|
|
- focus_timer_id = SetTimer(windows[window_id].hWnd, 2, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
|
|
+ // Run a timer to prevent event catching warning if the focused window is closing.
|
|
|
+ windows[window_id].focus_timer_id = SetTimer(windows[window_id].hWnd, 2, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
|
|
+ }
|
|
|
return 0; // Return To The Message Loop
|
|
|
}
|
|
|
case WM_GETMINMAXINFO: {
|
|
@@ -1922,8 +1926,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
|
|
|
|
|
case WM_CLOSE: // Did We Receive A Close Message?
|
|
|
{
|
|
|
- if (focus_timer_id != 0U) {
|
|
|
- KillTimer(windows[window_id].hWnd, focus_timer_id);
|
|
|
+ if (windows[window_id].focus_timer_id != 0U) {
|
|
|
+ KillTimer(windows[window_id].hWnd, windows[window_id].focus_timer_id);
|
|
|
}
|
|
|
_send_window_event(windows[window_id], WINDOW_EVENT_CLOSE_REQUEST);
|
|
|
|
|
@@ -2607,39 +2611,21 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
|
|
|
|
|
case WM_ENTERSIZEMOVE: {
|
|
|
Input::get_singleton()->release_pressed_events();
|
|
|
- move_timer_id = SetTimer(windows[window_id].hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
|
|
+ windows[window_id].move_timer_id = SetTimer(windows[window_id].hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
|
|
|
} break;
|
|
|
case WM_EXITSIZEMOVE: {
|
|
|
- KillTimer(windows[window_id].hWnd, move_timer_id);
|
|
|
+ KillTimer(windows[window_id].hWnd, windows[window_id].move_timer_id);
|
|
|
} break;
|
|
|
case WM_TIMER: {
|
|
|
- if (wParam == move_timer_id) {
|
|
|
+ if (wParam == windows[window_id].move_timer_id) {
|
|
|
_process_key_events();
|
|
|
if (!Main::is_iterating()) {
|
|
|
Main::iteration();
|
|
|
}
|
|
|
- } else if (wParam == focus_timer_id) {
|
|
|
- windows[window_id].minimized = HIWORD(saved_wparam) != 0;
|
|
|
-
|
|
|
- if (LOWORD(saved_wparam) == WA_ACTIVE || LOWORD(saved_wparam) == WA_CLICKACTIVE) {
|
|
|
- _send_window_event(windows[window_id], WINDOW_EVENT_FOCUS_IN);
|
|
|
- windows[window_id].window_focused = true;
|
|
|
- alt_mem = false;
|
|
|
- control_mem = false;
|
|
|
- shift_mem = false;
|
|
|
- } else { // WM_INACTIVE
|
|
|
- Input::get_singleton()->release_pressed_events();
|
|
|
- _send_window_event(windows[window_id], WINDOW_EVENT_FOCUS_OUT);
|
|
|
- windows[window_id].window_focused = false;
|
|
|
- alt_mem = false;
|
|
|
- };
|
|
|
-
|
|
|
- if ((OS::get_singleton()->get_current_tablet_driver() == "wintab") && wintab_available && windows[window_id].wtctx) {
|
|
|
- wintab_WTEnable(windows[window_id].wtctx, GET_WM_ACTIVATE_STATE(saved_wparam, saved_lparam));
|
|
|
- }
|
|
|
-
|
|
|
- KillTimer(windows[window_id].hWnd, focus_timer_id);
|
|
|
- focus_timer_id = 0U;
|
|
|
+ } else if (wParam == windows[window_id].focus_timer_id) {
|
|
|
+ _process_activate_event(window_id, windows[window_id].saved_wparam, windows[window_id].saved_lparam);
|
|
|
+ KillTimer(windows[window_id].hWnd, wParam);
|
|
|
+ windows[window_id].focus_timer_id = 0U;
|
|
|
}
|
|
|
} break;
|
|
|
|
|
@@ -2796,6 +2782,25 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
|
|
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
|
|
}
|
|
|
|
|
|
+void DisplayServerWindows::_process_activate_event(WindowID p_window_id, WPARAM wParam, LPARAM lParam) {
|
|
|
+ if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) {
|
|
|
+ _send_window_event(windows[p_window_id], WINDOW_EVENT_FOCUS_IN);
|
|
|
+ windows[p_window_id].window_focused = true;
|
|
|
+ alt_mem = false;
|
|
|
+ control_mem = false;
|
|
|
+ shift_mem = false;
|
|
|
+ } else { // WM_INACTIVE
|
|
|
+ Input::get_singleton()->release_pressed_events();
|
|
|
+ _send_window_event(windows[p_window_id], WINDOW_EVENT_FOCUS_OUT);
|
|
|
+ windows[p_window_id].window_focused = false;
|
|
|
+ alt_mem = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ if ((OS::get_singleton()->get_current_tablet_driver() == "wintab") && wintab_available && windows[p_window_id].wtctx) {
|
|
|
+ wintab_WTEnable(windows[p_window_id].wtctx, GET_WM_ACTIVATE_STATE(wParam, lParam));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void DisplayServerWindows::_process_key_events() {
|
|
|
for (int i = 0; i < key_event_pos; i++) {
|
|
|
KeyEvent &ke = key_event_buffer[i];
|