diff --git a/src/WebWindow.Native/WebWindow.Linux.cpp b/src/WebWindow.Native/WebWindow.Linux.cpp index 9dd6416..633ba3c 100644 --- a/src/WebWindow.Native/WebWindow.Linux.cpp +++ b/src/WebWindow.Native/WebWindow.Linux.cpp @@ -215,4 +215,9 @@ void WebWindow::AddCustomScheme(UTF8String scheme, WebResourceRequestedCallback (void*)requestHandler, NULL); } +void WebWindow::CloseWindow() +{ + gtk_main_quit(); +} + #endif diff --git a/src/WebWindow.Native/WebWindow.Native.vcxproj b/src/WebWindow.Native/WebWindow.Native.vcxproj index 3c5ef82..8da4d94 100644 --- a/src/WebWindow.Native/WebWindow.Native.vcxproj +++ b/src/WebWindow.Native/WebWindow.Native.vcxproj @@ -1,10 +1,18 @@ + + Debug + ARM + Debug Win32 + + Release + ARM + Release Win32 @@ -34,6 +42,12 @@ v142 Unicode + + Application + true + v142 + Unicode + Application false @@ -41,6 +55,13 @@ true Unicode + + Application + false + v142 + true + Unicode + DynamicLibrary true @@ -62,9 +83,15 @@ + + + + + + @@ -75,12 +102,18 @@ true + + true + true false + + false + false @@ -97,6 +130,19 @@ Windows + + + Level3 + Disabled + true + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + true + Windows + + Level3 @@ -128,6 +174,23 @@ Windows + + + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + true + true + true + Windows + + Level3 diff --git a/src/WebWindow.Native/WebWindow.Windows.cpp b/src/WebWindow.Native/WebWindow.Windows.cpp index ba8d802..4d8d30b 100644 --- a/src/WebWindow.Native/WebWindow.Windows.cpp +++ b/src/WebWindow.Native/WebWindow.Windows.cpp @@ -340,7 +340,15 @@ void WebWindow::SendMessage(UTF8String message) delete[] messageW; } +void WebWindow::CloseWindow() +{ + //SendMessage(_hWnd, 0x0010, 0, 0); + WindowProc(_hWnd, 0x0002, 0, 0); +} + void WebWindow::AddCustomScheme(UTF8String scheme, WebResourceRequestedCallback requestHandler) { _schemeToRequestHandler[scheme] = requestHandler; } + + diff --git a/src/WebWindow.Native/WebWindow.h b/src/WebWindow.Native/WebWindow.h index e7cab14..3269f1f 100644 --- a/src/WebWindow.Native/WebWindow.h +++ b/src/WebWindow.Native/WebWindow.h @@ -60,5 +60,6 @@ class WebWindow void NavigateToUrl(UTF8String url); void NavigateToString(UTF8String content); void SendMessage(UTF8String message); + void CloseWindow(); void AddCustomScheme(UTF8String scheme, WebResourceRequestedCallback requestHandler); }; diff --git a/src/WebWindow/WebWindow.cs b/src/WebWindow/WebWindow.cs index b73597d..8126a58 100644 --- a/src/WebWindow/WebWindow.cs +++ b/src/WebWindow/WebWindow.cs @@ -6,7 +6,7 @@ namespace WebWindows { - public class WebWindow + public class WebWindow : IDisposable { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate void OnWebMessageReceivedCallback([MarshalAs(UnmanagedType.LPUTF8Str)] string message); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate IntPtr OnWebResourceRequestedCallback([MarshalAs(UnmanagedType.LPUTF8Str)] string url, out int numBytes, [MarshalAs(UnmanagedType.LPUTF8Str)] out string contentType); @@ -25,6 +25,7 @@ public class WebWindow [DllImport(DllName)] static extern void WebWindow_ShowMessage(IntPtr instance, [MarshalAs(UnmanagedType.LPUTF8Str)] string title, [MarshalAs(UnmanagedType.LPUTF8Str)] string body, uint type); [DllImport(DllName)] static extern void WebWindow_SendMessage(IntPtr instance, [MarshalAs(UnmanagedType.LPUTF8Str)] string message); [DllImport(DllName)] static extern void WebWindow_AddCustomScheme(IntPtr instance, [MarshalAs(UnmanagedType.LPUTF8Str)] string scheme, IntPtr requestHandler); + [DllImport(DllName)] static extern void WebWindow_CloseWindow(IntPtr instance); private List _gcHandlesToFree = new List(); private IntPtr _nativeWebWindow; @@ -84,12 +85,7 @@ public WebWindow(string title, Action configure) ~WebWindow() { - // TODO: IDisposable - foreach (var gcHandle in _gcHandlesToFree) - { - gcHandle.Free(); - } - _gcHandlesToFree.Clear(); + Dispose(false); } public void Show() => WebWindow_Show(_nativeWebWindow); @@ -212,5 +208,26 @@ private void AddCustomScheme(string scheme, ResolveWebResourceDelegate requestHa var callbackPtr = Marshal.GetFunctionPointerForDelegate(callback); WebWindow_AddCustomScheme(_nativeWebWindow, scheme, callbackPtr); } + + public void Dispose() + { + WebWindow_CloseWindow(_nativeWebWindow); + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(Boolean itIsSafeToAlsoFreeManagedObjects) + { + foreach (var gcHandle in _gcHandlesToFree) + { + gcHandle.Free(); + } + _nativeWebWindow = IntPtr.Zero; + + if (itIsSafeToAlsoFreeManagedObjects) + { + _gcHandlesToFree.Clear(); + } + } } }