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;