diff --git a/wpf/libui.msbuild b/wpf/libui.msbuild
index aabf3401..d9147c1a 100755
--- a/wpf/libui.msbuild
+++ b/wpf/libui.msbuild
@@ -87,6 +87,7 @@
false
+
diff --git a/wpf/window.cpp b/wpf/window.cpp
new file mode 100644
index 00000000..74cb961e
--- /dev/null
+++ b/wpf/window.cpp
@@ -0,0 +1,136 @@
+// 25 november 2015
+#include "uipriv_wpf.hpp"
+
+ref class libuiWindow : public Window {
+public:
+ uiWindow *w;
+ void onClosing(Object ^sender, CancelEventArgs ^e);
+};
+
+struct uiWindow {
+ uiWindowsControl c;
+ gcroot *window;
+
+ int margined;
+
+ int (*onClosing)(uiWindow *, void *);
+ void *onClosingData;
+};
+
+static void onDestroy(uiWindow *);
+
+uiWindowsDefineControlWithOnDestroy(
+ uiWindow, // type name
+ uiWindowType, // type function
+ window, // handle
+ onDestroy(hthis); // on destroy
+)
+
+void libuiWindow::onClosing(Object ^sender, CancelEventArgs ^e)
+{
+ e->Cancel = (*(this->w->onClosing))(this->w, this->w->onClosingData) == 0;
+}
+
+static int defaultOnClosing(uiWindow *w, void *data)
+{
+ return 0;
+}
+
+static void onDestroy(uiWindow *w)
+{
+ // TODO
+}
+
+static void windowCommitShow(uiControl *c)
+{
+ uiWindow *w = uiWindow(c);
+
+ // TODO does this behave properly in re presentation?
+ (*(w->window))->Show();
+}
+
+static void windowCommitHide(uiControl *c)
+{
+ uiWindow *w = uiWindow(c);
+
+ (*(w->window))->Hide();
+}
+
+static void windowContainerUpdateState(uiControl *c)
+{
+/*TODO
+ uiWindow *w = uiWindow(c);
+
+ if (w->child != NULL)
+ childUpdateState(w->child);
+*/
+}
+
+char *uiWindowTitle(uiWindow *w)
+{
+ return uiWindowsCLRStringToText((*(w->window))->Title);
+}
+
+void uiWindowSetTitle(uiWindow *w, const char *title)
+{
+ (*(w->window))->Title = fromUTF8(title);
+}
+
+void uiWindowOnClosing(uiWindow *w, int (*f)(uiWindow *, void *), void *data)
+{
+ w->onClosing = f;
+ w->onClosingData = data;
+}
+
+void uiWindowSetChild(uiWindow *w, uiControl *child)
+{
+/*TODO
+ if (w->child != NULL)
+ childRemove(w->child);
+ w->child = newChild(child, uiControl(w), w->hwnd);
+ if (w->child != NULL) {
+ childSetSoleControlID(w->child);
+ childQueueRelayout(w->child);
+ }
+*/
+}
+
+int uiWindowMargined(uiWindow *w)
+{
+ return w->margined;
+}
+
+void uiWindowSetMargined(uiWindow *w, int margined)
+{
+ w->margined = margined;
+//TODO uiWindowsControlQueueRelayout(uiWindowsControl(w));
+}
+
+uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
+{
+ uiWindow *w;
+
+ w = (uiWindow *) uiNewControl(uiWindowType());
+
+ w->window = new gcroot();
+ *(w->window) = gcnew libuiWindow();
+ (*(w->window))->w = w;
+
+ (*(w->window))->Title = fromUTF8(title);
+ // TODO is this the client size?
+ (*(w->window))->Width = width;
+ (*(w->window))->Height = height;
+
+ // TODO background color
+
+ (*(w->window))->Closing += gcnew CancelEventHandler(*(w->window),
+ &libuiWindow::onClosing);
+ uiWindowOnClosing(w, defaultOnClosing, NULL);
+
+ uiWindowsFinishNewControl(w, uiWindow, window);
+ uiControl(w)->CommitShow = windowCommitShow;
+ uiControl(w)->CommitHide = windowCommitHide;
+ uiControl(w)->ContainerUpdateState = windowContainerUpdateState;
+
+ return w;
+}
diff --git a/wpf/wpf.cpp b/wpf/wpf.cpp
deleted file mode 100644
index 7271ad23..00000000
--- a/wpf/wpf.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-// 24 november 2015
-#include
-#define EXPORT __declspec(dllexport)
-#include "wpf.h"
-
-#using
-#using
-#using
-#using
-using namespace System;
-using namespace System::ComponentModel;
-using namespace System::Windows;
-
-ref class windowEvents {
-public:
- wpfWindow *w;
- // TODO the using namespace above doesn't work?
- void closingEvent(Object ^sender, CancelEventArgs ^e);
-};
-
-struct wpfWindow {
- gcroot window;
- gcroot events;
- void (*onClosing)(wpfWindow *, void *);
- void *onClosingData;
-};
-
-void windowEvents::closingEvent(Object ^sender, CancelEventArgs ^e)
-{
- (*(this->w->onClosing))(this->w, this->w->onClosingData);
-}
-
-wpfWindow *wpfNewWindow(const char *title, int width, int height)
-{
- wpfWindow *w;
-
- w = new wpfWindow;
-
- w->window = gcnew Window();
- w->window->Title = gcnew String(title);
- w->window->Width = width;
- w->window->Height = height;
-
- w->events = gcnew windowEvents();
- w->events->w = w;
- w->window->Closing += gcnew CancelEventHandler(w->events, &windowEvents::closingEvent);
-
- w->window->Show();
-
- return w;
-}
-
-void wpfWindowOnClosing(wpfWindow *w, void (*f)(wpfWindow *w, void *data), void *data)
-{
- w->onClosing = f;
- w->onClosingData = data;
-}