Mercurial > dwindows
comparison os2/dw.c @ 1853:4790589f52a9
Initial commit for new dw_signal_connect_data() function...
Same as dw_signal_connect() but it has an additional callback
parameter that gets called when the callback is being removed.
This allows me to free memory allocated for the data parameter
and prevent memory leaks in godwindows... Tested GTK and Mac.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Wed, 27 Feb 2013 19:14:22 +0000 |
parents | d7e13f446c41 |
children | c836603d3f14 |
comparison
equal
deleted
inserted
replaced
1852:5f0e4ca14dcd | 1853:4790589f52a9 |
---|---|
164 struct _sighandler *next; | 164 struct _sighandler *next; |
165 ULONG message; | 165 ULONG message; |
166 HWND window; | 166 HWND window; |
167 int id; | 167 int id; |
168 void *signalfunction; | 168 void *signalfunction; |
169 void *discfunction; | |
169 void *data; | 170 void *data; |
170 | 171 |
171 } SignalHandler; | 172 } SignalHandler; |
172 | 173 |
173 SignalHandler *Root = NULL; | 174 SignalHandler *Root = NULL; |
214 return GlobalID; | 215 return GlobalID; |
215 } | 216 } |
216 | 217 |
217 /* This function adds a signal handler callback into the linked list. | 218 /* This function adds a signal handler callback into the linked list. |
218 */ | 219 */ |
219 void _new_signal(ULONG message, HWND window, int id, void *signalfunction, void *data) | 220 void _new_signal(ULONG message, HWND window, int id, void *signalfunction, void *discfunc, void *data) |
220 { | 221 { |
221 SignalHandler *new = malloc(sizeof(SignalHandler)); | 222 SignalHandler *new = malloc(sizeof(SignalHandler)); |
222 | 223 |
223 new->message = message; | 224 new->message = message; |
224 new->window = window; | 225 new->window = window; |
225 new->id = id; | 226 new->id = id; |
226 new->signalfunction = signalfunction; | 227 new->signalfunction = signalfunction; |
228 new->discfunction = discfunc; | |
227 new->data = data; | 229 new->data = data; |
228 new->next = NULL; | 230 new->next = NULL; |
229 | 231 |
230 if (!Root) | 232 if (!Root) |
231 Root = new; | 233 Root = new; |
13208 { | 13210 { |
13209 int timerid = WinStartTimer(dwhab, NULLHANDLE, 0, interval); | 13211 int timerid = WinStartTimer(dwhab, NULLHANDLE, 0, interval); |
13210 | 13212 |
13211 if(timerid) | 13213 if(timerid) |
13212 { | 13214 { |
13213 _new_signal(WM_TIMER, NULLHANDLE, timerid, sigfunc, data); | 13215 _new_signal(WM_TIMER, NULLHANDLE, timerid, sigfunc, NULL, data); |
13214 return timerid; | 13216 return timerid; |
13215 } | 13217 } |
13216 } | 13218 } |
13217 return 0; | 13219 return 0; |
13218 } | 13220 } |
13265 * sigfunc: The pointer to the function to be used as the callback. | 13267 * sigfunc: The pointer to the function to be used as the callback. |
13266 * data: User data to be passed to the handler function. | 13268 * data: User data to be passed to the handler function. |
13267 */ | 13269 */ |
13268 void API dw_signal_connect(HWND window, char *signame, void *sigfunc, void *data) | 13270 void API dw_signal_connect(HWND window, char *signame, void *sigfunc, void *data) |
13269 { | 13271 { |
13272 dw_signal_connect_data(window, signame, sigfunc, NULL, data); | |
13273 } | |
13274 | |
13275 /* | |
13276 * Add a callback to a window event with a closure callback. | |
13277 * Parameters: | |
13278 * window: Window handle of signal to be called back. | |
13279 * signame: A string pointer identifying which signal to be hooked. | |
13280 * sigfunc: The pointer to the function to be used as the callback. | |
13281 * discfunc: The pointer to the function called when this handler is removed. | |
13282 * data: User data to be passed to the handler function. | |
13283 */ | |
13284 void API dw_signal_connect_data(HWND window, char *signame, void *sigfunc, void *discfunc, void *data) | |
13285 { | |
13270 ULONG message = 0, id = 0; | 13286 ULONG message = 0, id = 0; |
13271 | 13287 |
13272 if(window && signame && sigfunc) | 13288 if(window && signame && sigfunc) |
13273 { | 13289 { |
13274 if((message = _findsigmessage(signame)) != 0) | 13290 if((message = _findsigmessage(signame)) != 0) |
13289 { | 13305 { |
13290 id = window; | 13306 id = window; |
13291 window = owner; | 13307 window = owner; |
13292 } | 13308 } |
13293 } | 13309 } |
13294 _new_signal(message, window, id, sigfunc, data); | 13310 _new_signal(message, window, id, sigfunc, discfunc, data); |
13295 } | 13311 } |
13296 } | 13312 } |
13297 } | 13313 } |
13298 | 13314 |
13299 /* | 13315 /* |
13311 | 13327 |
13312 while(tmp) | 13328 while(tmp) |
13313 { | 13329 { |
13314 if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->message == message) | 13330 if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->message == message) |
13315 { | 13331 { |
13332 void (API_FUNC discfunc)(HWND, void *) = (void (API_FUNC)(HWND, void *))tmp->discfunction; | |
13333 | |
13334 if(discfunc) | |
13335 { | |
13336 discfunc(tmp->window, tmp->data); | |
13337 } | |
13338 | |
13316 if(prev) | 13339 if(prev) |
13317 { | 13340 { |
13318 prev->next = tmp->next; | 13341 prev->next = tmp->next; |
13319 free(tmp); | 13342 free(tmp); |
13320 tmp = prev->next; | 13343 tmp = prev->next; |
13345 | 13368 |
13346 while(tmp) | 13369 while(tmp) |
13347 { | 13370 { |
13348 if((window < 65536 && tmp->id == window) || tmp->window == window) | 13371 if((window < 65536 && tmp->id == window) || tmp->window == window) |
13349 { | 13372 { |
13373 void (API_FUNC discfunc)(HWND, void *) = (void (API_FUNC)(HWND, void *))tmp->discfunction; | |
13374 | |
13375 if(discfunc) | |
13376 { | |
13377 discfunc(tmp->window, tmp->data); | |
13378 } | |
13379 | |
13350 if(prev) | 13380 if(prev) |
13351 { | 13381 { |
13352 prev->next = tmp->next; | 13382 prev->next = tmp->next; |
13353 free(tmp); | 13383 free(tmp); |
13354 tmp = prev->next; | 13384 tmp = prev->next; |
13380 | 13410 |
13381 while(tmp) | 13411 while(tmp) |
13382 { | 13412 { |
13383 if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->data == data) | 13413 if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->data == data) |
13384 { | 13414 { |
13415 void (API_FUNC discfunc)(HWND, void *) = (void (API_FUNC)(HWND, void *))tmp->discfunction; | |
13416 | |
13417 if(discfunc) | |
13418 { | |
13419 discfunc(tmp->window, tmp->data); | |
13420 } | |
13421 | |
13385 if(prev) | 13422 if(prev) |
13386 { | 13423 { |
13387 prev->next = tmp->next; | 13424 prev->next = tmp->next; |
13388 free(tmp); | 13425 free(tmp); |
13389 tmp = prev->next; | 13426 tmp = prev->next; |