From 9d18e1c58ca8b48158ba14c4db0abc700eefcda0 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 20 Mar 2016 07:57:53 +0100 Subject: Reintroduce event loops for parentless windows (non-plugins). --- plugingui/nativewindow_win32.cc | 69 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/plugingui/nativewindow_win32.cc b/plugingui/nativewindow_win32.cc index 1ab4126..e4a1e73 100644 --- a/plugingui/nativewindow_win32.cc +++ b/plugingui/nativewindow_win32.cc @@ -286,9 +286,7 @@ LRESULT CALLBACK NativeWindowWin32::dialogProc(HWND hwnd, UINT msg, NativeWindowWin32::NativeWindowWin32(void* native_window, Window& window) : window(window) { - WNDCLASSEX wcex; - - std::memset(&wcex, 0, sizeof(wcex)); + WNDCLASSEX wcex{}; //Time to register a window class. //Generic flags and everything. cbWndExtra is the size of a pointer to an @@ -315,12 +313,14 @@ NativeWindowWin32::NativeWindowWin32(void* native_window, Window& window) RegisterClassEx(&wcex); + parent_window = (HWND)native_window; + m_hwnd = CreateWindowEx(0/*ex_style*/, m_className, "DGBasisWidget", (native_window?WS_CHILD:WS_OVERLAPPEDWINDOW) | WS_VISIBLE, window.x(), window.y(), window.width(), window.height(), - (HWND)native_window, nullptr, + parent_window, nullptr, GetModuleHandle(nullptr), nullptr); SetWindowLongPtr(m_hwnd, GWLP_USERDATA, (LONG_PTR)this); @@ -372,9 +372,15 @@ void NativeWindowWin32::hide() void NativeWindowWin32::redraw() { - InvalidateRect(m_hwnd, 0, TRUE); - //RedrawWindow(m_hwnd, nullptr, nullptr, RDW_ERASE|RDW_INVALIDATE); - //UpdateWindow(m_hwnd); + if(parent_window) + { + RedrawWindow(m_hwnd, nullptr, nullptr, RDW_ERASE|RDW_INVALIDATE); + UpdateWindow(m_hwnd); + } + else + { + InvalidateRect(m_hwnd, 0, TRUE); + } } void NativeWindowWin32::setCaption(const std::string &caption) @@ -396,11 +402,41 @@ void NativeWindowWin32::grabMouse(bool grab) bool NativeWindowWin32::hasEvent() { - return !event_queue.empty(); + if(!event_queue.empty()) + { + return true; + } + + // Parented windows have their event loop somewhere else. + if(parent_window) + { + MSG msg; + return PeekMessage(&msg, m_hwnd, 0, 0, PM_NOREMOVE) != 0; + } + + return false; } Event* NativeWindowWin32::getNextEvent() { + if(!event_queue.empty()) + { + auto event = event_queue.front(); + event_queue.pop(); + return event; + } + + // Parented windows have their event loop somewhere else. + if(parent_window) + { + MSG msg; + if(GetMessage(&msg, m_hwnd, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + if(event_queue.empty()) { return nullptr; @@ -413,6 +449,23 @@ Event* NativeWindowWin32::getNextEvent() Event* NativeWindowWin32::peekNextEvent() { + if(!event_queue.empty()) + { + auto event = event_queue.front(); + return event; + } + + // Parented windows have their event loop somewhere else. + if(parent_window) + { + MSG msg; + if(PeekMessage(&msg, m_hwnd, 0, 0, PM_NOREMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + if(event_queue.empty()) { return nullptr; -- cgit v1.2.3