Add IWindowCloseSink

This commit is contained in:
stardust
2026-05-30 20:37:57 +09:30
parent 10c9708a75
commit 534357584e
5 changed files with 74 additions and 20 deletions
+7
View File
@@ -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
View File
@@ -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;
+1
View File
@@ -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
+26
View File
@@ -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;
+7
View File
@@ -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;
};