Mercurial > dwindows
changeset 2923:969cc3b8bec2
C++: Include the old style function support even when lambdas are available.
This allows old style applications to compile unmodified on lambda supported
compilers. Also include the original extremely simple test program in
dwtestoo.cpp so non-lambda compilers will see something besides a build
failure. Add a message to the old sample to upgrade to a lambda supported
compiler to see the full sample application.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 29 Dec 2022 21:56:58 +0000 |
parents | 0919c2b82109 |
children | 248e32f744f0 |
files | dw.hpp dwtestoo.cpp |
diffstat | 2 files changed, 502 insertions(+), 175 deletions(-) [+] |
line wrap: on
line diff
--- a/dw.hpp Thu Dec 29 10:10:48 2022 +0000 +++ b/dw.hpp Thu Dec 29 21:56:58 2022 +0000 @@ -135,16 +135,23 @@ bool ClickedConnected; #ifdef DW_LAMBDA std::function<int()> _ConnectClicked; -#else - int (*_ConnectClicked)(); #endif + int (*_ConnectClickedOld)(Clickable *); static int _OnClicked(HWND window, void *data) { - if(reinterpret_cast<Clickable *>(data)->_ConnectClicked) - return reinterpret_cast<Clickable *>(data)->_ConnectClicked(); - return reinterpret_cast<Clickable *>(data)->OnClicked(); } + Clickable *classptr = reinterpret_cast<Clickable *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectClicked) + return classptr->_ConnectClicked(); +#endif + if(classptr->_ConnectClickedOld) + return classptr->_ConnectClickedOld(classptr); + return classptr->OnClicked(); } protected: void Setup() { +#ifdef DW_LAMBDA _ConnectClicked = 0; +#endif + _ConnectClickedOld = 0; if(IsOverridden(Clickable::OnClicked, this)) { dw_signal_connect(hwnd, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_OnClicked), this); ClickedConnected = true; @@ -163,9 +170,6 @@ public: #ifdef DW_LAMBDA void ConnectClicked(std::function<int()> userfunc) -#else - void ConnectClicked(int (*userfunc)()) -#endif { _ConnectClicked = userfunc; if(!ClickedConnected) { @@ -173,6 +177,15 @@ ClickedConnected = true; } } +#endif + void ConnectClicked(int (*userfunc)(Clickable *)) + { + _ConnectClickedOld = userfunc; + if(!ClickedConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_OnClicked), this); + ClickedConnected = true; + } + } }; class Menus : public Handle @@ -264,13 +277,16 @@ #ifdef DW_LAMBDA std::function<int()> _ConnectDelete; std::function<int(int, int)> _ConnectConfigure; -#else - int (*_ConnectDelete)(); - int (*_ConnectConfigure)(int width, int height); #endif + int (*_ConnectDeleteOld)(Window *); + int (*_ConnectConfigureOld)(Window *, int width, int height); void Setup() { +#ifdef DW_LAMBDA _ConnectDelete = 0; _ConnectConfigure = 0; +#endif + _ConnectDeleteOld = 0; + _ConnectConfigureOld = 0; menu = DW_NULL; if(IsOverridden(Window::OnDelete, this)) { dw_signal_connect(hwnd, DW_SIGNAL_DELETE, DW_SIGNAL_FUNC(_OnDelete), this); @@ -285,14 +301,24 @@ ConfigureConnected = false; } } - static int _OnDelete(HWND window, void *data) { - if(reinterpret_cast<Window *>(data)->_ConnectDelete) - return reinterpret_cast<Window *>(data)->_ConnectDelete(); - return reinterpret_cast<Window *>(data)->OnDelete(); } + static int _OnDelete(HWND window, void *data) { + Window *classptr = reinterpret_cast<Window *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectDelete) + return classptr->_ConnectDelete(); +#endif + if(classptr->_ConnectDeleteOld) + return classptr->_ConnectDeleteOld(classptr); + return classptr->OnDelete(); } static int _OnConfigure(HWND window, int width, int height, void *data) { - if(reinterpret_cast<Window *>(data)->_ConnectConfigure) - return reinterpret_cast<Window *>(data)->_ConnectConfigure(width, height); - return reinterpret_cast<Window *>(data)->OnConfigure(width, height); } + Window *classptr = reinterpret_cast<Window *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectConfigure) + return classptr->_ConnectConfigure(width, height); +#endif + if(classptr->_ConnectConfigureOld) + return classptr->_ConnectConfigureOld(classptr, width, height); + return classptr->OnConfigure(width, height); } MenuBar *menu; public: // Constructors @@ -338,9 +364,6 @@ } #ifdef DW_LAMBDA void ConnectDelete(std::function<int()> userfunc) -#else - void ConnectDelete(int (*userfunc)()) -#endif { _ConnectDelete = userfunc; if(!DeleteConnected) { @@ -350,11 +373,19 @@ DeleteConnected = false; } } +#endif + void ConnectDelete(int (*userfunc)(Window *)) + { + _ConnectDeleteOld = userfunc; + if(!DeleteConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_DELETE, DW_SIGNAL_FUNC(_OnDelete), this); + DeleteConnected = true; + } else { + DeleteConnected = false; + } + } #ifdef DW_LAMBDA void ConnectConfigure(std::function<int(int, int)> userfunc) -#else - void ConnectConfigure(int (*userfunc)(int, int)) -#endif { _ConnectConfigure = userfunc; if(!ConfigureConnected) { @@ -364,6 +395,17 @@ ConfigureConnected = false; } } +#endif + void ConnectConfigure(int (*userfunc)(Window *, int, int)) + { + _ConnectConfigureOld = userfunc; + if(!ConfigureConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_CONFIGURE, DW_SIGNAL_FUNC(_OnConfigure), this); + ConfigureConnected = true; + } else { + ConfigureConnected = false; + } + } protected: // Our signal handler functions to be overriden... // If they are not overridden and an event is generated, remove the unused handler @@ -563,21 +605,28 @@ std::function<int(int, int, int)> _ConnectButtonPress; std::function<int(int, int, int)> _ConnectButtonRelease; std::function<int(int, int, int)> _ConnectMotionNotify; -#else - int (*_ConnectExpose)(DWExpose *); - int (*_ConnectConfigure)(int width, int height); - int (*_ConnectKeyPress)(char c, int vk, int state, char *utf8); - int (*_ConnectButtonPress)(int x, int y, int buttonmask); - int (*_ConnectButtonRelease)(int x, int y, int buttonmask); - int (*_ConnectMotionNotify)(int x, int y, int buttonmask); #endif + int (*_ConnectExposeOld)(Render *, DWExpose *); + int (*_ConnectConfigureOld)(Render *, int width, int height); + int (*_ConnectKeyPressOld)(Render *, char c, int vk, int state, char *utf8); + int (*_ConnectButtonPressOld)(Render *, int x, int y, int buttonmask); + int (*_ConnectButtonReleaseOld)(Render *, int x, int y, int buttonmask); + int (*_ConnectMotionNotifyOld)(Render *, int x, int y, int buttonmask); void Setup() { +#ifdef DW_LAMBDA _ConnectExpose = 0; _ConnectConfigure = 0; _ConnectKeyPress = 0; _ConnectButtonPress = 0; _ConnectButtonRelease = 0; _ConnectMotionNotify = 0; +#endif + _ConnectExposeOld = 0; + _ConnectConfigureOld = 0; + _ConnectKeyPressOld = 0; + _ConnectButtonPressOld = 0; + _ConnectButtonReleaseOld = 0; + _ConnectMotionNotifyOld = 0; if(IsOverridden(Render::OnExpose, this)) { dw_signal_connect(hwnd, DW_SIGNAL_EXPOSE, DW_SIGNAL_FUNC(_OnExpose), this); ExposeConnected = true; @@ -616,29 +665,59 @@ } } static int _OnExpose(HWND window, DWExpose *exp, void *data) { - if(reinterpret_cast<Render *>(data)->_ConnectExpose) - return reinterpret_cast<Render *>(data)->_ConnectExpose(exp); - return reinterpret_cast<Render *>(data)->OnExpose(exp); } + Render *classptr = reinterpret_cast<Render *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectExpose) + return classptr->_ConnectExpose(exp); +#endif + if(classptr->_ConnectExposeOld) + return classptr->_ConnectExposeOld(classptr, exp); + return classptr->OnExpose(exp); } static int _OnConfigure(HWND window, int width, int height, void *data) { - if(reinterpret_cast<Render *>(data)->_ConnectConfigure) - return reinterpret_cast<Render *>(data)->_ConnectConfigure(width, height); - return reinterpret_cast<Render *>(data)->OnConfigure(width, height); } + Render *classptr = reinterpret_cast<Render *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectConfigure) + return classptr->_ConnectConfigure(width, height); +#endif + if(classptr->_ConnectConfigureOld) + return classptr->_ConnectConfigureOld(classptr, width, height); + return classptr->OnConfigure(width, height); } static int _OnKeyPress(HWND window, char c, int vk, int state, void *data, char *utf8) { - if(reinterpret_cast<Render *>(data)->_ConnectKeyPress) - return reinterpret_cast<Render *>(data)->_ConnectKeyPress(c, vk, state, utf8); - return reinterpret_cast<Render *>(data)->OnKeyPress(c, vk, state, utf8); } + Render *classptr = reinterpret_cast<Render *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectKeyPress) + return classptr->_ConnectKeyPress(c, vk, state, utf8); +#endif + if(classptr->_ConnectKeyPressOld) + return classptr->_ConnectKeyPressOld(classptr, c, vk, state, utf8); + return classptr->OnKeyPress(c, vk, state, utf8); } static int _OnButtonPress(HWND window, int x, int y, int buttonmask, void *data) { - if(reinterpret_cast<Render *>(data)->_ConnectButtonPress) - return reinterpret_cast<Render *>(data)->_ConnectButtonPress(x, y, buttonmask); - return reinterpret_cast<Render *>(data)->OnButtonPress(x, y, buttonmask); } + Render *classptr = reinterpret_cast<Render *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectButtonPress) + return classptr->_ConnectButtonPress(x, y, buttonmask); +#endif + if(classptr->_ConnectButtonPressOld) + return classptr->_ConnectButtonPressOld(classptr, x, y, buttonmask); + return classptr->OnButtonPress(x, y, buttonmask); } static int _OnButtonRelease(HWND window, int x, int y, int buttonmask, void *data) { - if(reinterpret_cast<Render *>(data)->_ConnectButtonRelease) - return reinterpret_cast<Render *>(data)->_ConnectButtonRelease(x, y, buttonmask); - return reinterpret_cast<Render *>(data)->OnButtonRelease(x, y, buttonmask); } + Render *classptr = reinterpret_cast<Render *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectButtonRelease) + return classptr->_ConnectButtonRelease(x, y, buttonmask); +#endif + if(classptr->_ConnectButtonReleaseOld) + return classptr->_ConnectButtonReleaseOld(classptr, x, y, buttonmask); + return classptr->OnButtonRelease(x, y, buttonmask); } static int _OnMotionNotify(HWND window, int x, int y, int buttonmask, void *data) { - if(reinterpret_cast<Render *>(data)->_ConnectMotionNotify) - return reinterpret_cast<Render *>(data)->_ConnectMotionNotify(x, y, buttonmask); - return reinterpret_cast<Render *>(data)->OnMotionNotify(x, y, buttonmask); } + Render *classptr = reinterpret_cast<Render *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectMotionNotify) + return classptr->_ConnectMotionNotify(x, y, buttonmask); +#endif + if(classptr->_ConnectMotionNotifyOld) + return classptr->_ConnectMotionNotifyOld(classptr, x, y, buttonmask); + return classptr->OnMotionNotify(x, y, buttonmask); } public: // Constructors Render(unsigned long id) { SetHWND(dw_render_new(id)); Setup(); } @@ -666,9 +745,6 @@ void Flush() { dw_flush(); } #ifdef DW_LAMBDA void ConnectExpose(std::function<int(DWExpose *)> userfunc) -#else - void ConnectExpose(int (*userfunc)(DWExpose *)) -#endif { _ConnectExpose = userfunc; if(!ExposeConnected) { @@ -676,11 +752,17 @@ ExposeConnected = true; } } +#endif + void ConnectExpose(int (*userfunc)(Render *, DWExpose *)) + { + _ConnectExposeOld = userfunc; + if(!ExposeConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_EXPOSE, DW_SIGNAL_FUNC(_OnExpose), this); + ExposeConnected = true; + } + } #ifdef DW_LAMBDA void ConnectConfigure(std::function<int(int, int)> userfunc) -#else - void ConnectConfigure(int (*userfunc)(int, int)) -#endif { _ConnectConfigure = userfunc; if(!ConfigureConnected) { @@ -688,11 +770,17 @@ ConfigureConnected = true; } } +#endif + void ConnectConfigure(int (*userfunc)(Render *, int, int)) + { + _ConnectConfigureOld = userfunc; + if(!ConfigureConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_CONFIGURE, DW_SIGNAL_FUNC(_OnConfigure), this); + ConfigureConnected = true; + } + } #ifdef DW_LAMBDA void ConnectKeyPress(std::function<int(char, int, int, char *)> userfunc) -#else - void ConnectKeyPress(int (*userfunc)(char, int, int, char *)) -#endif { _ConnectKeyPress = userfunc; if(!KeyPressConnected) { @@ -700,11 +788,17 @@ KeyPressConnected = true; } } +#endif + void ConnectKeyPress(int (*userfunc)(Render *, char, int, int, char *)) + { + _ConnectKeyPressOld = userfunc; + if(!KeyPressConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_KEY_PRESS, DW_SIGNAL_FUNC(_OnKeyPress), this); + KeyPressConnected = true; + } + } #ifdef DW_LAMBDA void ConnectButtonPress(std::function<int(int, int, int)> userfunc) -#else - void ConnectButtonPress(int (*userfunc)(int, int, int)) -#endif { _ConnectButtonPress = userfunc; if(!KeyPressConnected) { @@ -712,11 +806,17 @@ ButtonPressConnected = true; } } +#endif + void ConnectButtonPress(int (*userfunc)(Render *, int, int, int)) + { + _ConnectButtonPressOld = userfunc; + if(!KeyPressConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_BUTTON_PRESS, DW_SIGNAL_FUNC(_OnButtonPress), this); + ButtonPressConnected = true; + } + } #ifdef DW_LAMBDA void ConnectButtonRelease(std::function<int(int, int, int)> userfunc) -#else - void ConnectButtonRelease(int (*userfunc)(int, int, int)) -#endif { _ConnectButtonRelease = userfunc; if(!KeyPressConnected) { @@ -724,11 +824,17 @@ ButtonReleaseConnected = true; } } +#endif + void ConnectButtonRelease(int (*userfunc)(Render *, int, int, int)) + { + _ConnectButtonReleaseOld = userfunc; + if(!KeyPressConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_BUTTON_RELEASE, DW_SIGNAL_FUNC(_OnButtonRelease), this); + ButtonReleaseConnected = true; + } + } #ifdef DW_LAMBDA void ConnectMotionNotify(std::function<int(int, int, int)> userfunc) -#else - void ConnectMotionNotify(int (*userfunc)(int, int, int)) -#endif { _ConnectMotionNotify = userfunc; if(!MotionNotifyConnected) { @@ -736,6 +842,15 @@ MotionNotifyConnected = true; } } +#endif + void ConnectMotionNotify(int (*userfunc)(Render *, int, int, int)) + { + _ConnectMotionNotifyOld = userfunc; + if(!MotionNotifyConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_MOTION_NOTIFY, DW_SIGNAL_FUNC(_OnMotionNotify), this); + MotionNotifyConnected = true; + } + } protected: // Our signal handler functions to be overriden... // If they are not overridden and an event is generated, remove the unused handler @@ -854,13 +969,16 @@ #ifdef DW_LAMBDA std::function<int(int, char *)> _ConnectChanged; std::function<int(int, char *, void *)> _ConnectResult; -#else - int (*_ConnectChanged)(int status, char *url); - int (*_ConnectResult)(int status, char *result, void *scriptdata); #endif + int (*_ConnectChangedOld)(HTML *, int status, char *url); + int (*_ConnectResultOld)(HTML *, int status, char *result, void *scriptdata); void Setup() { +#ifdef DW_LAMBDA _ConnectChanged = 0; _ConnectResult = 0; +#endif + _ConnectChangedOld = 0; + _ConnectResultOld = 0; if(IsOverridden(HTML::OnChanged, this)) { dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this); ChangedConnected = true; @@ -875,13 +993,23 @@ } } static int _OnChanged(HWND window, int status, char *url, void *data) { - if(reinterpret_cast<HTML *>(data)->_ConnectChanged) - return reinterpret_cast<HTML *>(data)->_ConnectChanged(status, url); - return reinterpret_cast<HTML *>(data)->OnChanged(status, url); } + HTML *classptr = reinterpret_cast<HTML *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectChanged) + return classptr->_ConnectChanged(status, url); +#endif + if(classptr->_ConnectChangedOld) + return classptr->_ConnectChangedOld(classptr, status, url); + return classptr->OnChanged(status, url); } static int _OnResult(HWND window, int status, char *result, void *scriptdata, void *data) { - if(reinterpret_cast<HTML *>(data)->_ConnectResult) - return reinterpret_cast<HTML *>(data)->_ConnectResult(status, result, scriptdata); - return reinterpret_cast<HTML *>(data)->OnResult(status, result, scriptdata); } + HTML *classptr = reinterpret_cast<HTML *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectResult) + return classptr->_ConnectResult(status, result, scriptdata); +#endif + if(classptr->_ConnectResultOld) + return classptr->_ConnectResultOld(classptr, status, result, scriptdata); + return classptr->OnResult(status, result, scriptdata); } public: // Constructors HTML(unsigned long id) { SetHWND(dw_html_new(id)); Setup(); } @@ -894,9 +1022,6 @@ int URL(const char *url) { return dw_html_url(hwnd, url); } #ifdef DW_LAMBDA void ConnectChanged(std::function<int(int, char *)> userfunc) -#else - void ConnectChanged(int (*userfunc)(int, char *)) -#endif { _ConnectChanged = userfunc; if(!ChangedConnected) { @@ -904,11 +1029,17 @@ ChangedConnected = true; } } +#endif + void ConnectChanged(int (*userfunc)(HTML *, int, char *)) + { + _ConnectChangedOld = userfunc; + if(!ChangedConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this); + ChangedConnected = true; + } + } #ifdef DW_LAMBDA void ConnectResult(std::function<int(int, char *, void *)> userfunc) -#else - void ConnectResult(int (*userfunc)(int, char *, void *)) -#endif { _ConnectResult = userfunc; if(!ResultConnected) { @@ -916,6 +1047,15 @@ ResultConnected = true; } } +#endif + void ConnectResult(int (*userfunc)(HTML *, int, char *, void *)) + { + _ConnectResultOld = userfunc; + if(!ResultConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnResult), this); + ResultConnected = true; + } + } protected: // Our signal handler functions to be overriden... // If they are not overridden and an event is generated, remove the unused handler @@ -967,20 +1107,27 @@ bool ListSelectConnected; #ifdef DW_LAMBDA std::function<int(int)> _ConnectListSelect; -#else - int (*_ConnectListSelect)(int index); #endif + int (*_ConnectListSelectOld)(ListBoxes *, int index); void Setup() { +#ifdef DW_LAMBDA _ConnectListSelect = 0; +#endif + _ConnectListSelectOld = 0; if(IsOverridden(ListBoxes::OnListSelect, this)) { dw_signal_connect(hwnd, DW_SIGNAL_LIST_SELECT, DW_SIGNAL_FUNC(_OnListSelect), this); ListSelectConnected = true; } } static int _OnListSelect(HWND window, int index, void *data) { - if(reinterpret_cast<ListBoxes *>(data)->_ConnectListSelect) - return reinterpret_cast<ListBoxes *>(data)->_ConnectListSelect(index); - return reinterpret_cast<ListBoxes *>(data)->OnListSelect(index); + ListBoxes *classptr = reinterpret_cast<ListBoxes *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectListSelect) + return classptr->_ConnectListSelect(index); +#endif + if(classptr->_ConnectListSelectOld) + return classptr->_ConnectListSelectOld(classptr, index); + return classptr->OnListSelect(index); } public: // User functions @@ -998,9 +1145,6 @@ void SetTop(int top) { dw_listbox_set_top(hwnd, top); } #ifdef DW_LAMBDA void ConnectListSelect(std::function<int(int)> userfunc) -#else - void ConnectListSelect(int (*userfunc)(int)) -#endif { _ConnectListSelect = userfunc; if(!ListSelectConnected) { @@ -1008,6 +1152,15 @@ ListSelectConnected = true; } } +#endif + void ConnectListSelect(int (*userfunc)(ListBoxes *, int)) + { + _ConnectListSelectOld = userfunc; + if(!ListSelectConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_LIST_SELECT, DW_SIGNAL_FUNC(_OnListSelect), this); + ListSelectConnected = true; + } + } protected: // Our signal handler functions to be overriden... // If they are not overridden and an event is generated, remove the unused handler @@ -1045,13 +1198,17 @@ bool ValueChangedConnected; #ifdef DW_LAMBDA std::function<int(int)> _ConnectValueChanged; -#else - int (*_ConnectValueChanged)(int value); #endif + int (*_ConnectValueChangedOld)(Ranged *, int value); static int _OnValueChanged(HWND window, int value, void *data) { - if(reinterpret_cast<Ranged *>(data)->_ConnectValueChanged) - return reinterpret_cast<Ranged *>(data)->_ConnectValueChanged(value); - return reinterpret_cast<Ranged *>(data)->OnValueChanged(value); + Ranged *classptr = reinterpret_cast<Ranged *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectValueChanged) + return classptr->_ConnectValueChanged(value); +#endif + if(classptr->_ConnectValueChangedOld) + return classptr->_ConnectValueChangedOld(classptr, value); + return classptr->OnValueChanged(value); } protected: void Setup() { @@ -1073,9 +1230,6 @@ public: #ifdef DW_LAMBDA void ConnectValueChanged(std::function<int(int)> userfunc) -#else - void ConnectValueChanged(int (*userfunc)(int)) -#endif { _ConnectValueChanged = userfunc; if(!ValueChangedConnected) { @@ -1083,6 +1237,15 @@ ValueChangedConnected = true; } } +#endif + void ConnectValueChanged(int (*userfunc)(Ranged *, int)) + { + _ConnectValueChangedOld = userfunc; + if(!ValueChangedConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_VALUE_CHANGED, DW_SIGNAL_FUNC(_OnValueChanged), this); + ValueChangedConnected = true; + } + } }; class Slider : public Ranged @@ -1155,13 +1318,17 @@ bool SwitchPageConnected; #ifdef DW_LAMBDA std::function<int(unsigned long)> _ConnectSwitchPage; -#else - int (*_ConnectSwitchPage)(unsigned long); #endif + int (*_ConnectSwitchPageOld)(Notebook *, unsigned long); static int _OnSwitchPage(HWND window, unsigned long pageid, void *data) { - if(reinterpret_cast<Notebook *>(data)->_ConnectSwitchPage) - return reinterpret_cast<Notebook *>(data)->_ConnectSwitchPage(pageid); - return reinterpret_cast<Notebook *>(data)->OnSwitchPage(pageid); + Notebook *classptr = reinterpret_cast<Notebook *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectSwitchPage) + return classptr->_ConnectSwitchPage(pageid); +#endif + if(classptr->_ConnectSwitchPageOld) + return classptr->_ConnectSwitchPageOld(classptr, pageid); + return classptr->OnSwitchPage(pageid); } protected: void Setup() { @@ -1198,9 +1365,6 @@ void PageSetText(unsigned long pageid, const char *text) { dw_notebook_page_set_text(hwnd, pageid, text); } #ifdef DW_LAMBDA void ConnectSwitchPage(std::function<int(unsigned long)> userfunc) -#else - void ConnectSwitchPage(int (*userfunc)(unsigned long)) -#endif { _ConnectSwitchPage = userfunc; if(!SwitchPageConnected) { @@ -1208,6 +1372,15 @@ SwitchPageConnected = true; } } +#endif + void ConnectSwitchPage(int (*userfunc)(Notebook *, unsigned long)) + { + _ConnectSwitchPageOld = userfunc; + if(!SwitchPageConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_SWITCH_PAGE, DW_SIGNAL_FUNC(_OnSwitchPage), this); + SwitchPageConnected = true; + } + } }; class ObjectView : virtual public Widget @@ -1217,24 +1390,37 @@ #ifdef DW_LAMBDA std::function<int(HTREEITEM, char *, void *)> _ConnectItemSelect; std::function<int(char *, int, int, void *)> _ConnectItemContext; -#else - int (*_ConnectItemSelect)(HTREEITEM, char *, void *); - int (*_ConnectItemContext)(char *, int, int, void *); #endif + int (*_ConnectItemSelectOld)(ObjectView *, HTREEITEM, char *, void *); + int (*_ConnectItemContextOld)(ObjectView *, char *, int, int, void *); static int _OnItemSelect(HWND window, HTREEITEM item, char *text, void *itemdata, void *data) { - if(reinterpret_cast<ObjectView *>(data)->_ConnectItemSelect) - return reinterpret_cast<ObjectView *>(data)->_ConnectItemSelect(item, text, itemdata); - return reinterpret_cast<ObjectView *>(data)->OnItemSelect(item, text, itemdata); + ObjectView *classptr = reinterpret_cast<ObjectView *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectItemSelect) + return classptr->_ConnectItemSelect(item, text, itemdata); +#endif + if(classptr->_ConnectItemSelectOld) + return classptr->_ConnectItemSelectOld(classptr, item, text, itemdata); + return classptr->OnItemSelect(item, text, itemdata); } static int _OnItemContext(HWND window, char *text, int x, int y, void *itemdata, void *data) { - if(reinterpret_cast<ObjectView *>(data)->_ConnectItemContext) - return reinterpret_cast<ObjectView *>(data)->_ConnectItemContext(text, x, y, itemdata); - return reinterpret_cast<ObjectView *>(data)->OnItemContext(text, x, y, itemdata); + ObjectView *classptr = reinterpret_cast<ObjectView *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectItemContext) + return classptr->_ConnectItemContext(text, x, y, itemdata); +#endif + if(classptr->_ConnectItemContextOld) + return classptr->_ConnectItemContextOld(classptr, text, x, y, itemdata); + return classptr->OnItemContext(text, x, y, itemdata); } protected: void SetupObjectView() { +#ifdef DW_LAMBDA _ConnectItemSelect = 0; _ConnectItemContext = 0; +#endif + _ConnectItemSelectOld = 0; + _ConnectItemContextOld = 0; if(IsOverridden(ObjectView::OnItemSelect, this)) { dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); ItemSelectConnected = true; @@ -1263,9 +1449,6 @@ public: #ifdef DW_LAMBDA void ConnectItemSelect(std::function<int(HTREEITEM, char *, void *)> userfunc) -#else - void ConnectItemSelect(int (*userfunc)(HTREEITEM, char *, void *)) -#endif { _ConnectItemSelect = userfunc; if(!ItemSelectConnected) { @@ -1273,11 +1456,17 @@ ItemSelectConnected = true; } } +#endif + void ConnectItemSelect(int (*userfunc)(ObjectView *, HTREEITEM, char *, void *)) + { + _ConnectItemSelectOld = userfunc; + if(!ItemSelectConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); + ItemSelectConnected = true; + } + } #ifdef DW_LAMBDA void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc) -#else - void ConnectItemContext(int (*userfunc)(char *, int, int, void *)) -#endif { _ConnectItemContext = userfunc; if(!ItemContextConnected) { @@ -1285,6 +1474,15 @@ ItemContextConnected = true; } } +#endif + void ConnectItemContext(int (*userfunc)(ObjectView *, char *, int, int, void *)) + { + _ConnectItemContextOld = userfunc; + if(!ItemContextConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this); + ItemContextConnected = true; + } + } }; class Containers : virtual public Focusable, virtual public ObjectView @@ -1294,26 +1492,39 @@ #ifdef DW_LAMBDA std::function<int(char *)> _ConnectItemEnter; std::function<int(int)> _ConnectColumnClick; -#else - int (*_ConnectItemEnter)(char *); - int (*_ConnectColumnClick)(int); #endif + int (*_ConnectItemEnterOld)(Containers *, char *); + int (*_ConnectColumnClickOld)(Containers *, int); static int _OnItemEnter(HWND window, char *text, void *data) { - if(reinterpret_cast<Containers *>(data)->_ConnectItemEnter) - return reinterpret_cast<Containers *>(data)->_ConnectItemEnter(text); - return reinterpret_cast<Containers *>(data)->OnItemEnter(text); + Containers *classptr = reinterpret_cast<Containers *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectItemEnter) + return classptr->_ConnectItemEnter(text); +#endif + if(classptr->_ConnectItemEnterOld) + return classptr->_ConnectItemEnterOld(classptr, text); + return classptr->OnItemEnter(text); } static int _OnColumnClick(HWND window, int column, void *data) { - if(reinterpret_cast<Containers *>(data)->_ConnectColumnClick) - return reinterpret_cast<Containers *>(data)->_ConnectColumnClick(column); - return reinterpret_cast<Containers *>(data)->OnColumnClick(column); + Containers *classptr = reinterpret_cast<Containers *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectColumnClick) + return classptr->_ConnectColumnClick(column); +#endif + if(classptr->_ConnectColumnClickOld) + return classptr->_ConnectColumnClickOld(classptr, column); + return classptr->OnColumnClick(column); } protected: void *allocpointer; int allocrowcount; void SetupContainer() { +#ifdef DW_LAMBDA _ConnectItemEnter = 0; _ConnectColumnClick = 0; +#endif + _ConnectItemEnterOld = 0; + _ConnectColumnClickOld = 0; if(IsOverridden(Container::OnItemEnter, this)) { dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this); ItemEnterConnected = true; @@ -1361,9 +1572,6 @@ void SetStripe(unsigned long oddcolor, unsigned long evencolor) { dw_container_set_stripe(hwnd, oddcolor, evencolor); } #ifdef DW_LAMBDA void ConnectItemEnter(std::function<int(char *)> userfunc) -#else - void ConnectItemEnter(int (*userfunc)(char *)) -#endif { _ConnectItemEnter = userfunc; if(!ItemEnterConnected) { @@ -1371,11 +1579,17 @@ ItemEnterConnected = true; } } +#endif + void ConnectItemEnter(int (*userfunc)(Containers *, char *)) + { + _ConnectItemEnterOld = userfunc; + if(!ItemEnterConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this); + ItemEnterConnected = true; + } + } #ifdef DW_LAMBDA void ConnecColumnClick(std::function<int(int)> userfunc) -#else - void ConnectColumnClick(int (*userfunc)(int)) -#endif { _ConnectColumnClick = userfunc; if(!ColumnClickConnected) { @@ -1383,6 +1597,15 @@ ColumnClickConnected = true; } } +#endif + void ConnectColumnClick(int (*userfunc)(Containers *, int)) + { + _ConnectColumnClickOld = userfunc; + if(!ColumnClickConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_COLUMN_CLICK, DW_SIGNAL_FUNC(_OnColumnClick), this); + ColumnClickConnected = true; + } + } }; class Container : public Containers @@ -1424,16 +1647,23 @@ bool TreeExpandConnected; #ifdef DW_LAMBDA std::function<int(HTREEITEM)> _ConnectTreeExpand; -#else - int (*_ConnectTreeExpand)(HTREEITEM); #endif + int (*_ConnectTreeExpandOld)(Tree *, HTREEITEM); static int _OnTreeExpand(HWND window, HTREEITEM item, void *data) { - if(reinterpret_cast<Tree *>(data)->_ConnectTreeExpand) - return reinterpret_cast<Tree *>(data)->_ConnectTreeExpand(item); - return reinterpret_cast<Tree *>(data)->OnTreeExpand(item); + Tree *classptr = reinterpret_cast<Tree *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectTreeExpand) + return classptr->_ConnectTreeExpand(item); +#endif + if(classptr->_ConnectTreeExpandOld) + return classptr->_ConnectTreeExpandOld(classptr, item); + return classptr->OnTreeExpand(item); } void SetupTree() { +#ifdef DW_LAMBDA _ConnectTreeExpand = 0; +#endif + _ConnectTreeExpandOld = 0; if(IsOverridden(Tree::OnTreeExpand, this)) { dw_signal_connect(hwnd, DW_SIGNAL_TREE_EXPAND, DW_SIGNAL_FUNC(_OnTreeExpand), this); TreeExpandConnected = true; @@ -1469,9 +1699,6 @@ void SetData(HTREEITEM item, void *itemdata) { dw_tree_item_set_data(hwnd, item, itemdata); } #ifdef DW_LAMBDA void ConnectTreeExpand(std::function<int(HTREEITEM)> userfunc) -#else - void ConnectTreeExpand(int (*userfunc)(HTREEITEM)) -#endif { _ConnectTreeExpand = userfunc; if(!TreeExpandConnected) { @@ -1479,6 +1706,15 @@ TreeExpandConnected = true; } } +#endif + void ConnectTreeExpandOld(int (*userfunc)(Tree *, HTREEITEM)) + { + _ConnectTreeExpandOld = userfunc; + if(!TreeExpandConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_TREE_EXPAND, DW_SIGNAL_FUNC(_OnTreeExpand), this); + TreeExpandConnected = true; + } + } }; class SplitBar : public Widget @@ -1571,24 +1807,34 @@ HTIMER timer; #ifdef DW_LAMBDA std::function<int()> _ConnectTimer; -#else - int (*_ConnectTimer)(); #endif + int (*_ConnectTimerOld)(Timer *); static int _OnTimer(void *data) { - if(reinterpret_cast<Timer *>(data)->_ConnectTimer) - return reinterpret_cast<Timer *>(data)->_ConnectTimer(); - return reinterpret_cast<Timer *>(data)->OnTimer(); + Timer *classptr = reinterpret_cast<Timer *>(data); +#ifdef DW_LAMBDA + if(classptr->_ConnectTimer) + return classptr->_ConnectTimer(); +#endif + if(classptr->_ConnectTimerOld) + return classptr->_ConnectTimerOld(classptr); + return classptr->OnTimer(); } public: // Constructors Timer(int interval) { _ConnectTimer = 0; timer = dw_timer_connect(interval, DW_SIGNAL_FUNC(_OnTimer), this); SetHandle(reinterpret_cast<void *>(timer)); } #ifdef DW_LAMBDA - Timer(int interval, std::function<int()> userfunc) -#else - Timer(int interval, int (*userfunc)()) + Timer(int interval, std::function<int()> userfunc) { + _ConnectTimer = userfunc; + _ConnectTimerOld = 0; + timer = dw_timer_connect(interval, DW_SIGNAL_FUNC(_OnTimer), this); + SetHandle(reinterpret_cast<void *>(timer)); + } #endif - { - _ConnectTimer = userfunc; + Timer(int interval, int (*userfunc)(Timer *)) { + _ConnectTimerOld = userfunc; +#ifdef DW_LAMBDA + _ConnectTimer = 0; +#endif timer = dw_timer_connect(interval, DW_SIGNAL_FUNC(_OnTimer), this); SetHandle(reinterpret_cast<void *>(timer)); } @@ -1627,17 +1873,22 @@ HPRINT print; #ifdef DW_LAMBDA std::function<int(Pixmap *, int)> _ConnectDrawPage; -#else - int (*_ConnectDrawPage)(Pixmap *, int); #endif + int (*_ConnectDrawPageOld)(Print *, Pixmap *, int); static int _OnDrawPage(HPRINT print, HPIXMAP hpm, int page_num, void *data) { int retval; Pixmap *pixmap = new Pixmap(hpm); + Print *classptr = reinterpret_cast<Print *>(data); - if(reinterpret_cast<Print *>(data)->_ConnectDrawPage) - retval = reinterpret_cast<Print *>(data)->_ConnectDrawPage(pixmap, page_num); +#ifdef DW_LAMBDA + if(classptr->_ConnectDrawPage) + retval = classptr->_ConnectDrawPage(pixmap, page_num); else - retval = reinterpret_cast<Print *>(data)->OnDrawPage(pixmap, page_num); +#endif + if(classptr->_ConnectDrawPageOld) + retval = classptr->_ConnectDrawPageOld(classptr, pixmap, page_num); + else + retval = classptr->OnDrawPage(pixmap, page_num); delete pixmap; return retval; @@ -1649,14 +1900,17 @@ print = dw_print_new(jobname, flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this); SetHandle(reinterpret_cast<void *>(print)); _ConnectDrawPage = userfunc; + _ConnectDrawPageOld = 0; } -#else - Print(const char *jobname, unsigned long flags, unsigned int pages, int (*userfunc)(Pixmap *, int)) { +#endif + Print(const char *jobname, unsigned long flags, unsigned int pages, int (*userfunc)(Print *, Pixmap *, int)) { print = dw_print_new(jobname, flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this); SetHandle(reinterpret_cast<void *>(print)); - _ConnectDrawPage = userfunc; + _ConnectDrawPageOld = userfunc; +#ifdef DW_LAMBDA + _ConnectDrawPage = 0; +#endif } -#endif // Destructor virtual ~Print() { if(print) dw_print_cancel(print); print = 0; }
--- a/dwtestoo.cpp Thu Dec 29 10:10:48 2022 +0000 +++ b/dwtestoo.cpp Thu Dec 29 21:56:58 2022 +0000 @@ -1,9 +1,9 @@ -/* - * Simple C++ Dynamic Windows Example - */ +// An example Dynamic Windows application and testing +// ground for Dynamic Windows features in C++. +// By: Brian Smith and Mark Hessling #include "dw.hpp" -/* Select a fixed width font for our platform */ +// Select a fixed width font for our platform #ifdef __OS2__ #define FIXEDFONT "5.System VIO" #define PLATFORMFOLDER "os2\\" @@ -31,6 +31,80 @@ #define APP_TITLE "Dynamic Windows C++" #define APP_EXIT "Are you sure you want to exit?" +// Handle the case of very old compilers by using +// A simple non-lambda example instead. +#ifndef DW_LAMBDA + +// Simple C++ Dynamic Windows Example + +class DWTest : public DW::Window +{ +public: + DW::App *app; + + DWTest() { + app = DW::App::Init(); + + SetText(APP_TITLE); + SetSize(200, 200); + } + int OnDelete() override { + if(app->MessageBox(APP_TITLE, DW_MB_YESNO | DW_MB_QUESTION, APP_EXIT) != 0) { + app->MainQuit(); + } + return FALSE; + } +}; + +int button_clicked(Clickable *classptr) +{ + DW::App *app = DW::App::Init(); + app->MessageBox("Button", DW_MB_OK | DW_MB_INFORMATION, "Clicked!"); + return TRUE; +} + +int exit_handler(Clickable *classptr) +{ + DW::App *app = DW::App::Init(); + if(app->MessageBox(APP_TITLE, DW_MB_YESNO | DW_MB_QUESTION, APP_EXIT) != 0) { + app->MainQuit(); + } + return TRUE; +} + +int dwmain(int argc, char* argv[]) +{ + DW::App *app = DW::App::Init(argc, argv, "org.dbsoft.dwindows.dwtestoo"); + + app->MessageBox(APP_TITLE, DW_MB_OK | DW_MB_INFORMATION, + "Warning: You are viewing the simplified version of this sample program.\n\n" \ + "This is because your compiler does not have lambda support.\n\n" \ + "Please upgrade to Clang, GCC 4.5 or Visual Studio 2010 to see the full sample."); + + DWTest *window = new DWTest(); + DW::Button *button = new DW::Button("Test window"); + + window->PackStart(button, DW_SIZE_AUTO, DW_SIZE_AUTO, TRUE, TRUE, 0); + button->ConnectClicked(&button_clicked); + + DW::MenuBar *mainmenubar = window->MenuBarNew(); + + // add menus to the menubar + DW::Menu *menu = new DW::Menu(); + DW::MenuItem *menuitem = menu->AppendItem("~Quit"); + menuitem->ConnectClicked(&exit_handler); + + // Add the "File" menu to the menubar... + mainmenubar->AppendItem("~File", menu); + + window->Show(); + + app->Main(); + app->Exit(0); + + return 0; +} +#else class DWTest : public DW::Window { private: @@ -1000,7 +1074,7 @@ } }; -/* Pretty list of features corresponding to the DWFEATURE enum in dw.h */ +// Pretty list of features corresponding to the DWFEATURE enum in dw.h const char *DWFeatureList[] = { "Supports the HTML Widget", "Supports the DW_SIGNAL_HTML_RESULT callback", @@ -1021,24 +1095,22 @@ "Supports alternate container view modes", NULL }; -/* - * Let's demonstrate the functionality of this library. :) - */ +// Let's demonstrate the functionality of this library. :) int dwmain(int argc, char* argv[]) { - /* Initialize the Dynamic Windows engine */ + // Initialize the Dynamic Windows engine DW::App *app = DW::App::Init(argc, argv, "org.dbsoft.dwindows.dwtestoo", "Dynamic Windows Test C++"); - /* Enable full dark mode on platforms that support it */ + // Enable full dark mode on platforms that support it if(getenv("DW_DARK_MODE")) app->SetFeature(DW_FEATURE_DARK_MODE, DW_DARK_MODE_FULL); #ifdef DW_MOBILE - /* Enable multi-line container display on Mobile platforms */ + // Enable multi-line container display on Mobile platforms app->SetFeature(DW_FEATURE_CONTAINER_MODE, DW_CONTAINER_MODE_MULTI); #endif - /* Test all the features and display the results */ + // Test all the features and display the results for(int intfeat=DW_FEATURE_HTML; intfeat<DW_FEATURE_MAX; intfeat++) { DWFEATURE feat = static_cast<DWFEATURE>(intfeat); @@ -1061,3 +1133,4 @@ return 0; } +#endif