mirror of
https://github.com/N3xoX1/sciterui.git
synced 2026-06-17 04:16:14 -07:00
Add IWindowCloseSink
This commit is contained in:
@@ -16,6 +16,11 @@ __interface IWindowDestroySink
|
||||
void OnWindowDestroy(HWINDOW hWnd);
|
||||
};
|
||||
|
||||
__interface IWindowCloseSink
|
||||
{
|
||||
bool OnWindowCloseRequest(HWINDOW hWnd);
|
||||
};
|
||||
|
||||
__interface ISciterWindow
|
||||
{
|
||||
void Show() = 0;
|
||||
@@ -27,6 +32,8 @@ __interface ISciterWindow
|
||||
SCITER_ELEMENT GetRootElement() const = 0;
|
||||
void OnDestroySinkAdd(IWindowDestroySink * Sink) = 0;
|
||||
void OnDestroySinkRemove(IWindowDestroySink * Sink) = 0;
|
||||
void OnCloseSinkAdd(IWindowCloseSink * Sink) = 0;
|
||||
void OnCloseSinkRemove(IWindowCloseSink * Sink) = 0;
|
||||
bool Destroy() = 0;
|
||||
void RunModal() = 0;
|
||||
bool IsClosed() const = 0;
|
||||
|
||||
+33
-20
@@ -39,16 +39,12 @@ bool Sciter::AttachHandler(SCITER_ELEMENT elemHandle, const char * riid, void *
|
||||
return false;
|
||||
}
|
||||
HWINDOW hWnd = SciterElement(elemHandle).GetElementHwnd(true);
|
||||
for (WindowSet::const_iterator itr = m_windows.begin(); itr != m_windows.end(); itr++)
|
||||
SciterWindow * window = FindSciterWindow(hWnd);
|
||||
if (window == nullptr)
|
||||
{
|
||||
SciterWindow * window = *itr;
|
||||
if (window->GetHandle() != hWnd)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
return window->AttachHandler(elemHandle, riid, pinterface);
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
return window->AttachHandler(elemHandle, riid, pinterface);
|
||||
}
|
||||
|
||||
bool Sciter::DetachHandler(SCITER_ELEMENT elemHandle, const char * riid, void * pinterface)
|
||||
@@ -58,20 +54,12 @@ bool Sciter::DetachHandler(SCITER_ELEMENT elemHandle, const char * riid, void *
|
||||
return false;
|
||||
}
|
||||
HWINDOW hWnd = SciterElement(elemHandle).GetElementHwnd(true);
|
||||
for (WindowSet::const_iterator itr = m_windows.begin(); itr != m_windows.end(); itr++)
|
||||
SciterWindow * window = FindSciterWindow(hWnd);
|
||||
if (window == nullptr)
|
||||
{
|
||||
SciterWindow * Window = *itr;
|
||||
if (Window->GetHandle() != hWnd)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (Window->DetachHandler(elemHandle, riid, pinterface))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
return window->DetachHandler(elemHandle, riid, pinterface);
|
||||
}
|
||||
|
||||
std::shared_ptr<void> Sciter::GetElementInterface(SCITER_ELEMENT he, const char * riid)
|
||||
@@ -112,6 +100,19 @@ void Sciter::WindowDestroyed(SciterWindow * window)
|
||||
}
|
||||
}
|
||||
|
||||
SciterWindow * Sciter::FindSciterWindow(HWINDOW hwnd) const
|
||||
{
|
||||
for (WindowSet::const_iterator itr = m_windows.begin(); itr != m_windows.end(); itr++)
|
||||
{
|
||||
SciterWindow * window = *itr;
|
||||
if (window->GetHandle() == hwnd)
|
||||
{
|
||||
return window;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool Sciter::SetElementHtmlFromResource(SCITER_ELEMENT elemHandle, const char * uri)
|
||||
{
|
||||
SciterElement element(elemHandle);
|
||||
@@ -313,6 +314,18 @@ LRESULT CALLBACK Sciter::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WM_CLOSE: {
|
||||
Sciter * sciter = (Sciter *)GetWindowLongPtr(hwnd, 0);
|
||||
if (sciter != nullptr)
|
||||
{
|
||||
SciterWindow * window = sciter->FindSciterWindow(hwnd);
|
||||
if (window != nullptr && !window->QueryClose())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BOOL handled = FALSE;
|
||||
|
||||
@@ -64,6 +64,7 @@ public:
|
||||
bool Initialize(const char * baseLanguage, const char * currentLanguage, bool console);
|
||||
void WindowCreated(SciterWindow * window);
|
||||
void WindowDestroyed(SciterWindow * window);
|
||||
SciterWindow * FindSciterWindow(HWINDOW hwnd) const;
|
||||
uint32_t AttachWidget(LPSCN_ATTACH_BEHAVIOR lpab);
|
||||
|
||||
// ISciterUI
|
||||
|
||||
@@ -167,6 +167,32 @@ void SciterWindow::OnDestroySinkRemove(IWindowDestroySink * Sink)
|
||||
}
|
||||
}
|
||||
|
||||
void SciterWindow::OnCloseSinkAdd(IWindowCloseSink * Sink)
|
||||
{
|
||||
m_onCloseSink.insert(Sink);
|
||||
}
|
||||
|
||||
void SciterWindow::OnCloseSinkRemove(IWindowCloseSink * Sink)
|
||||
{
|
||||
WinCloseSinks::iterator itr = m_onCloseSink.find(Sink);
|
||||
if (itr != m_onCloseSink.end())
|
||||
{
|
||||
m_onCloseSink.erase(itr);
|
||||
}
|
||||
}
|
||||
|
||||
bool SciterWindow::QueryClose() const
|
||||
{
|
||||
for (WinCloseSinks::const_iterator itr = m_onCloseSink.begin(); itr != m_onCloseSink.end(); itr++)
|
||||
{
|
||||
if (!(*itr)->OnWindowCloseRequest(m_hWnd))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SciterWindow::Destroy()
|
||||
{
|
||||
return PostMessage((HWND)m_hWnd, WM_CLOSE, 0, 0) != 0;
|
||||
|
||||
@@ -63,6 +63,7 @@ class SciterWindow :
|
||||
typedef ElementEventProc * LPELEMENT_EVENT_PROC;
|
||||
|
||||
typedef std::set<IWindowDestroySink *> WinDestroySinks;
|
||||
typedef std::set<IWindowCloseSink *> WinCloseSinks;
|
||||
|
||||
public:
|
||||
SciterWindow(Sciter & sciter);
|
||||
@@ -84,10 +85,14 @@ public:
|
||||
SCITER_ELEMENT GetRootElement() const override;
|
||||
void OnDestroySinkAdd(IWindowDestroySink * Sink) override;
|
||||
void OnDestroySinkRemove(IWindowDestroySink * Sink) override;
|
||||
void OnCloseSinkAdd(IWindowCloseSink * Sink) override;
|
||||
void OnCloseSinkRemove(IWindowCloseSink * Sink) override;
|
||||
bool Destroy() override;
|
||||
void RunModal() override;
|
||||
bool IsClosed() const override;
|
||||
|
||||
friend class Sciter;
|
||||
|
||||
private:
|
||||
SciterWindow(void) = delete;
|
||||
SciterWindow(const SciterWindow &) = delete;
|
||||
@@ -121,6 +126,7 @@ private:
|
||||
int64_t OnLoadData(LPSCN_LOAD_DATA pnmld);
|
||||
int64_t OnAttachBehavior(LPSCN_ATTACH_BEHAVIOR pnmld);
|
||||
int64_t OnEngineDestroyed(void);
|
||||
bool QueryClose() const;
|
||||
|
||||
static uint32_t SC_CALLBACK SciterCallback(LPSCITER_CALLBACK_NOTIFICATION pnm, void * param);
|
||||
|
||||
@@ -129,6 +135,7 @@ private:
|
||||
HWINDOW m_hParent;
|
||||
EventSinks m_eventSinks;
|
||||
WinDestroySinks m_onDestroySink;
|
||||
WinCloseSinks m_onCloseSink;
|
||||
bool m_bound;
|
||||
bool m_destroyed;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user