Mercurial > dwindows
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); } |