From b0cf022ea75b763531e6ae63abccadf2bfa7a84b Mon Sep 17 00:00:00 2001
From: Bent Bisballe Nyeng <deva@aasimon.org>
Date: Sun, 26 Mar 2017 11:21:43 +0200
Subject: Make plugingui test app nest the UI in a native window.

---
 plugingui/nativewindow.h        |  3 +++
 plugingui/nativewindow_win32.cc |  5 +++++
 plugingui/nativewindow_win32.h  |  1 +
 plugingui/nativewindow_x11.cc   |  5 +++++
 plugingui/nativewindow_x11.h    |  1 +
 plugingui/testmain.cc           | 19 ++++++++++++++++---
 plugingui/window.cc             |  5 +++++
 plugingui/window.h              |  3 +++
 8 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/plugingui/nativewindow.h b/plugingui/nativewindow.h
index c6ca7c8..b4429af 100644
--- a/plugingui/nativewindow.h
+++ b/plugingui/nativewindow.h
@@ -80,6 +80,9 @@ public:
 	//! Reads all currently enqueued events from the native window system.
 	//! \return A queue of shared pointers to events.
 	virtual EventQueue getEvents() = 0;
+
+	// \returns the native window handle, it HWND on Win32 or Window id on X11
+	virtual void* getNativeWindowHandle() const = 0;
 };
 
 } // GUI::
diff --git a/plugingui/nativewindow_win32.cc b/plugingui/nativewindow_win32.cc
index 75d523d..6297b23 100644
--- a/plugingui/nativewindow_win32.cc
+++ b/plugingui/nativewindow_win32.cc
@@ -445,4 +445,9 @@ EventQueue NativeWindowWin32::getEvents()
 	return events;
 }
 
+void* NativeWindowWin32::getNativeWindowHandle() const
+{
+	return (void*)m_hwnd;
+}
+
 } // GUI::
diff --git a/plugingui/nativewindow_win32.h b/plugingui/nativewindow_win32.h
index 630d853..2299189 100644
--- a/plugingui/nativewindow_win32.h
+++ b/plugingui/nativewindow_win32.h
@@ -55,6 +55,7 @@ public:
 	void redraw(const Rect& dirty_rect) override;
 	void grabMouse(bool grab) override;
 	EventQueue getEvents() override;
+	void* getNativeWindowHandle() const override;
 
 private:
 	static LRESULT CALLBACK dialogProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
diff --git a/plugingui/nativewindow_x11.cc b/plugingui/nativewindow_x11.cc
index de2f1d1..989da4e 100644
--- a/plugingui/nativewindow_x11.cc
+++ b/plugingui/nativewindow_x11.cc
@@ -275,6 +275,11 @@ EventQueue NativeWindowX11::getEvents()
 	return events;
 }
 
+void* NativeWindowX11::getNativeWindowHandle() const
+{
+	return (void*)xwindow;
+}
+
 void NativeWindowX11::translateXMessage(XEvent& xevent)
 {
 	switch(xevent.type)
diff --git a/plugingui/nativewindow_x11.h b/plugingui/nativewindow_x11.h
index dd2010e..c850318 100644
--- a/plugingui/nativewindow_x11.h
+++ b/plugingui/nativewindow_x11.h
@@ -57,6 +57,7 @@ public:
 	void redraw(const Rect& dirty_rect) override;
 	void grabMouse(bool grab) override;
 	EventQueue getEvents() override;
+	void* getNativeWindowHandle() const override;
 
 private:
 	void translateXMessage(XEvent& xevent);
diff --git a/plugingui/testmain.cc b/plugingui/testmain.cc
index b1697eb..0bbd21f 100644
--- a/plugingui/testmain.cc
+++ b/plugingui/testmain.cc
@@ -35,19 +35,32 @@
 #include <hugin.hpp>
 #include <settings.h>
 
+#include "window.h"
 #include "mainwindow.h"
 
 int main()
 {
 	INFO(example, "We are up and running");
 
+	GUI::Window parent{nullptr};
+	parent.setCaption("PluginGui Test Application");
+
 	Settings settings;
-	GUI::MainWindow main_window(settings, nullptr);
+	GUI::MainWindow main_window(settings, parent.getNativeWindowHandle());
+
+	parent.show();
 	main_window.show();
-	main_window.resize(370, 330);
 
-	while(main_window.processEvents())
+	parent.resize(370, 330);
+
+	while(true)
 	{
+		parent.eventHandler()->processEvents();
+		if(!main_window.processEvents())
+		{
+			break;
+		}
+
 #if DG_PLATFORM == DG_PLATFORM_WINDOWS
 		SleepEx(50, FALSE);
 #else
diff --git a/plugingui/window.cc b/plugingui/window.cc
index 8bc5c62..66b7337 100644
--- a/plugingui/window.cc
+++ b/plugingui/window.cc
@@ -181,6 +181,11 @@ void Window::needsRedraw()
 	needs_redraw = true;
 }
 
+void* Window::getNativeWindowHandle() const
+{
+	return native->getNativeWindowHandle();
+}
+
 std::size_t Window::translateToWindowX()
 {
 	return 0;
diff --git a/plugingui/window.h b/plugingui/window.h
index cfb004d..218beec 100644
--- a/plugingui/window.h
+++ b/plugingui/window.h
@@ -70,6 +70,9 @@ public:
 	//! Tag the window buffer dirty to be rendered.
 	void needsRedraw();
 
+	// \returns the native window handle, it HWND on Win32 or Window id on X11
+	void* getNativeWindowHandle() const;
+
 protected:
 	// For the EventHandler
 	friend class EventHandler;
-- 
cgit v1.2.3