comparison dw.hpp @ 2911:f27fe14eef82

C++: MenuItem constructors need to call Setup() and Clickable::ClickedConnected may not have been initialized, both could cause problems particularly on Windows.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 27 Dec 2022 09:00:02 +0000
parents 1567f787b965
children 08fcbd5fa069
comparison
equal deleted inserted replaced
2910:927fcf85b132 2911:f27fe14eef82
129 #ifdef DW_LAMBDA 129 #ifdef DW_LAMBDA
130 std::function<int()> _ConnectClicked; 130 std::function<int()> _ConnectClicked;
131 #else 131 #else
132 int (*_ConnectClicked)(); 132 int (*_ConnectClicked)();
133 #endif 133 #endif
134 static int _OnClicked(HWND window, void *data) { 134 static int _OnClicked(HWND window, void *data) {
135 if(reinterpret_cast<Clickable *>(data)->_ConnectClicked) 135 if(reinterpret_cast<Clickable *>(data)->_ConnectClicked)
136 return reinterpret_cast<Clickable *>(data)->_ConnectClicked(); 136 return reinterpret_cast<Clickable *>(data)->_ConnectClicked();
137 return reinterpret_cast<Clickable *>(data)->OnClicked(); } 137 return reinterpret_cast<Clickable *>(data)->OnClicked(); }
138 protected: 138 protected:
139 void Setup() { 139 void Setup() {
140 _ConnectClicked = 0; 140 _ConnectClicked = 0;
141 if(IsOverridden(Clickable::OnClicked, this)) { 141 if(IsOverridden(Clickable::OnClicked, this)) {
142 dw_signal_connect(hwnd, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_OnClicked), this); 142 dw_signal_connect(hwnd, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_OnClicked), this);
143 ClickedConnected = true; 143 ClickedConnected = true;
144 } 144 }
145 else {
146 ClickedConnected = false;
147 }
145 } 148 }
146 // Our signal handler functions to be overriden... 149 // Our signal handler functions to be overriden...
147 // If they are not overridden and an event is generated, remove the unused handler 150 // If they are not overridden and an event is generated, remove the unused handler
148 virtual int OnClicked() { 151 virtual int OnClicked() {
149 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_CLICKED); 152 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_CLICKED);
203 class MenuItem : public Clickable 206 class MenuItem : public Clickable
204 { 207 {
205 public: 208 public:
206 // Constructors 209 // Constructors
207 MenuItem(Menus *menu, const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) { 210 MenuItem(Menus *menu, const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) {
208 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : DW_NOMENU)); 211 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : DW_NOMENU)); Setup();
209 } 212 }
210 MenuItem(Menus *menu, const char *title, Menus *submenu) { 213 MenuItem(Menus *menu, const char *title, Menus *submenu) {
211 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, submenu ? submenu->GetHMENUI() : DW_NOMENU)); 214 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, submenu ? submenu->GetHMENUI() : DW_NOMENU)); Setup();
212 } 215 }
213 MenuItem(Menus *menu, const char *title) { 216 MenuItem(Menus *menu, const char *title) {
214 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, DW_NOMENU)); 217 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, DW_NOMENU)); Setup();
215 } 218 }
216 219
217 // User functions 220 // User functions
218 void SetState(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); } 221 void SetState(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); }
219 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); } 222 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); }