# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1671313140 0 # Node ID ada74f4d3f39d0f89e998012cce8e19ae1749cad # Parent 6ea67d0809eb44787f69d83c495d7afa1f6d08ad C++: Implement conditional signal handlers based on overrides. This uses templates in a sort of hacky way to determine if our virtual functions have been overridden. Leaving some debug code in for the moment to make sure it works on all platforms. OS/2 will require using GCC for the C++ bindings, since VisualAge only supports C++99 and Watcom doesn't even support that as far as I know. diff -r 6ea67d0809eb -r ada74f4d3f39 Makefile.in --- a/Makefile.in Sat Dec 17 11:51:22 2022 +0000 +++ b/Makefile.in Sat Dec 17 21:39:00 2022 +0000 @@ -6,6 +6,7 @@ MLFLAGS = -L. include $(srcdir)/Version CCFLAGS = @CFLAGS@ $(PLATCCFLAGS) @ARCH@ -D@DW_DEFINE@ -DBUILD_DLL -DDW_RESOURCES -DVER_REV=$(VER_REV) +CXXFLAGS= -std=c++11 LFLAGS = @LIBS@ @ARCH@ ARFLAGS = @ARFLAGS@ INSTALL = @INSTALL@ @@ -39,7 +40,7 @@ # $(CC) -c $(CCFLAGS) $(INCPATH) -o $@ $< #.cpp.o: -# $(CXX) -c $(CCFLAGS) $(INCPATH) -o $@ $< +# $(CXX) -c $(CXXFLAGS) $(CCFLAGS) $(INCPATH) -o $@ $< # Link flags shared objects @@ -199,7 +200,7 @@ -$(srcdir)/mac/finishup.sh $(srcdir) dwtest dwtestoo.o: $(srcdir)/dwtestoo.cpp $(srcdir)/dw.h $(srcdir)/dw.hpp - $(CXX) -c $(INCPATH) $(CCFLAGS) -o $@ $(srcdir)/dwtestoo.cpp + $(CXX) -c $(INCPATH) $(CXXFLAGS) $(CCFLAGS) -o $@ $(srcdir)/dwtestoo.cpp dwtestoo: dwtestoo.o $(CC) -o dwtestoo dwtestoo.o $(MLFLAGS) -l$(TARGET) $(LFLAGS) -lstdc++ diff -r 6ea67d0809eb -r ada74f4d3f39 dw.hpp --- a/dw.hpp Sat Dec 17 11:51:22 2022 +0000 +++ b/dw.hpp Sat Dec 17 21:39:00 2022 +0000 @@ -1,5 +1,6 @@ /* Dynamic Windows C++ Language Bindings * Copyright 2022 Brian Smith + * Requires a C++11 compatible compiler. */ #ifndef _HPP_DW @@ -35,11 +36,20 @@ }; // Top-level window class is packable +template class Window : public Box { private: - void Setup() { dw_signal_connect(hwnd, DW_SIGNAL_DELETE, DW_SIGNAL_FUNC(_OnDelete), this); - dw_signal_connect(hwnd, DW_SIGNAL_CONFIGURE, DW_SIGNAL_FUNC(_OnConfigure), this); } + void Setup() { + if(&Derived::OnDelete != &Window::OnDelete) { + dw_signal_connect(hwnd, DW_SIGNAL_DELETE, DW_SIGNAL_FUNC(_OnDelete), this); + dw_debug("DW_SIGNAL_DELETE\n"); + } + if(&Derived::OnConfigure != &Window::OnConfigure) { + dw_signal_connect(hwnd, DW_SIGNAL_CONFIGURE, DW_SIGNAL_FUNC(_OnConfigure), this); + dw_debug("DW_SIGNAL_CONFIGURE\n"); + } + } static int _OnDelete(HWND window, void *data) { return reinterpret_cast(data)->OnDelete(); } static int _OnConfigure(HWND window, int width, int height, void *data) { return reinterpret_cast(data)->OnConfigure(width, height); } public: @@ -54,9 +64,9 @@ void SetText(const char *text) { dw_window_set_text(hwnd, text); } void SetSize(unsigned long width, unsigned long height) { dw_window_set_size(hwnd, width, height); } void Show() { dw_window_show(hwnd); } -protected: - virtual int OnDelete() = 0; - virtual int OnConfigure(int width, int height) = 0; + // Our signal handler functions to be overriden + virtual int OnDelete() { return FALSE; } + virtual int OnConfigure(int width, int height) { return FALSE; }; }; class App diff -r 6ea67d0809eb -r ada74f4d3f39 dwtestoo.cpp --- a/dwtestoo.cpp Sat Dec 17 11:51:22 2022 +0000 +++ b/dwtestoo.cpp Sat Dec 17 21:39:00 2022 +0000 @@ -1,15 +1,14 @@ #include -class MyWindow : public DW::Window +class MyWindow : public DW::Window { public: MyWindow() { SetText("Basic application"); SetSize(200, 200); } -protected: - virtual int OnDelete() { DW::App *app = DW::App::Init(); app->MainQuit(); return FALSE; } - virtual int OnConfigure(int width, int height) { return FALSE; } + virtual int OnDelete() override { DW::App *app = DW::App::Init(); app->MainQuit(); return FALSE; } + virtual int OnConfigure(int width, int height) override { return FALSE; } }; int dwmain(int argc, char* argv[])