comparison gtk/dw.c @ 361:8c0212f70914

Signal handler changes to avoid a memory leak.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 23 Apr 2003 05:16:23 +0000
parents 9ddcbbaebd50
children eb61b854fd58
comparison
equal deleted inserted replaced
360:cf66410d03b4 361:8c0212f70914
178 return SignalTranslate[z].func; 178 return SignalTranslate[z].func;
179 } 179 }
180 return NULL; 180 return NULL;
181 } 181 }
182 182
183 static SignalHandler _get_signal_handler(GtkWidget *widget, gpointer data)
184 {
185 int counter = (int)data;
186 SignalHandler sh;
187 char text[100];
188
189 sprintf(text, "_dw_sigwindow%d", counter);
190 sh.window = (HWND)gtk_object_get_data(GTK_OBJECT(widget), text);
191 sprintf(text, "_dw_sigfunc%d", counter);
192 sh.func = (void *)gtk_object_get_data(GTK_OBJECT(widget), text);
193 sprintf(text, "_dw_sigdata%d", counter);
194 sh.data = gtk_object_get_data(GTK_OBJECT(widget), text);
195
196 return sh;
197 }
198
199 static int _set_signal_handler(GtkWidget *widget, HWND window, void *func, gpointer data)
200 {
201 int counter = (int)gtk_object_get_data(GTK_OBJECT(widget), "_dw_sigcounter");
202 char text[100];
203
204 sprintf(text, "_dw_sigwindow%d", counter);
205 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)window);
206 sprintf(text, "_dw_sigfunc%d", counter);
207 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)func);
208 sprintf(text, "_dw_sigdata%d", counter);
209 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)data);
210
211 counter++;
212 gtk_object_set_data(GTK_OBJECT(widget), "_dw_sigcounter", (gpointer)counter);
213
214 return counter - 1;
215 }
216
183 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data) 217 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data)
184 { 218 {
185 SignalHandler *work = (SignalHandler *)data; 219 SignalHandler work = _get_signal_handler((GtkWidget *)window, data);
186 int retval = FALSE; 220 int retval = FALSE;
187 221
188 if(work) 222 if(work.window)
189 { 223 {
190 int (*setfocusfunc)(HWND, void *) = work->func; 224 int (*setfocusfunc)(HWND, void *) = work.func;
191 225
192 retval = setfocusfunc((HWND)window, work->data); 226 retval = setfocusfunc(work.window, work.data);
193 } 227 }
194 return retval; 228 return retval;
195 } 229 }
196 230
197 static gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 231 static gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
198 { 232 {
199 SignalHandler *work = (SignalHandler *)data; 233 SignalHandler work = _get_signal_handler(widget, data);
200 int retval = FALSE; 234 int retval = FALSE;
201 235
202 if(work) 236 if(work.window)
203 { 237 {
204 int (*buttonfunc)(HWND, int, int, int, void *) = work->func; 238 int (*buttonfunc)(HWND, int, int, int, void *) = work.func;
205 int mybutton = event->button; 239 int mybutton = event->button;
206 240
207 if(event->button == 3) 241 if(event->button == 3)
208 mybutton = 2; 242 mybutton = 2;
209 else if(event->button == 2) 243 else if(event->button == 2)
210 mybutton = 3; 244 mybutton = 3;
211 245
212 retval = buttonfunc(widget, event->x, event->y, mybutton, work->data); 246 retval = buttonfunc(work.window, event->x, event->y, mybutton, work.data);
213 } 247 }
214 return retval; 248 return retval;
215 } 249 }
216 250
217 static gint _button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 251 static gint _button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
218 { 252 {
219 SignalHandler *work = (SignalHandler *)data; 253 SignalHandler work = _get_signal_handler(widget, data);
220 int retval = FALSE; 254 int retval = FALSE;
221 255
222 if(work) 256 if(work.window)
223 { 257 {
224 int (*buttonfunc)(HWND, int, int, int, void *) = work->func; 258 int (*buttonfunc)(HWND, int, int, int, void *) = work.func;
225 int mybutton = event->button; 259 int mybutton = event->button;
226 260
227 if(event->button == 3) 261 if(event->button == 3)
228 mybutton = 2; 262 mybutton = 2;
229 else if(event->button == 2) 263 else if(event->button == 2)
230 mybutton = 3; 264 mybutton = 3;
231 265
232 retval = buttonfunc(widget, event->x, event->y, mybutton, work->data); 266 retval = buttonfunc(work.window, event->x, event->y, mybutton, work.data);
233 } 267 }
234 return retval; 268 return retval;
235 } 269 }
236 270
237 static gint _motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) 271 static gint _motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
238 { 272 {
239 SignalHandler *work = (SignalHandler *)data; 273 SignalHandler work = _get_signal_handler(widget, data);
240 int retval = FALSE; 274 int retval = FALSE;
241 275
242 if(work) 276 if(work.window)
243 { 277 {
244 int (*motionfunc)(HWND, int, int, int, void *) = work->func; 278 int (*motionfunc)(HWND, int, int, int, void *) = work.func;
245 int keys = 0, x, y; 279 int keys = 0, x, y;
246 GdkModifierType state; 280 GdkModifierType state;
247 281
248 if (event->is_hint) 282 if (event->is_hint)
249 gdk_window_get_pointer (event->window, &x, &y, &state); 283 gdk_window_get_pointer (event->window, &x, &y, &state);
259 if (state & GDK_BUTTON3_MASK) 293 if (state & GDK_BUTTON3_MASK)
260 keys |= DW_BUTTON2_MASK; 294 keys |= DW_BUTTON2_MASK;
261 if (state & GDK_BUTTON2_MASK) 295 if (state & GDK_BUTTON2_MASK)
262 keys |= DW_BUTTON3_MASK; 296 keys |= DW_BUTTON3_MASK;
263 297
264 retval = motionfunc(widget, x, y, keys, work->data); 298 retval = motionfunc(work.window, x, y, keys, work.data);
265 } 299 }
266 return retval; 300 return retval;
267 } 301 }
268 302
269 static gint _delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) 303 static gint _delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
270 { 304 {
271 SignalHandler *work = (SignalHandler *)data; 305 SignalHandler work = _get_signal_handler(widget, data);
272 int retval = FALSE; 306 int retval = FALSE;
273 307
274 if(work) 308 if(work.window)
275 { 309 {
276 int (*closefunc)(HWND, void *) = work->func; 310 int (*closefunc)(HWND, void *) = work.func;
277 311
278 retval = closefunc(widget, work->data); 312 retval = closefunc(work.window, work.data);
279 } 313 }
280 return retval; 314 return retval;
281 } 315 }
282 316
283 static gint _key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data) 317 static gint _key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
284 { 318 {
285 SignalHandler *work = (SignalHandler *)data; 319 SignalHandler work = _get_signal_handler(widget, data);
286 int retval = FALSE; 320 int retval = FALSE;
287 321
288 if(work) 322 if(work.window)
289 { 323 {
290 int (*keypressfunc)(HWND, char, int, int, void *) = work->func; 324 int (*keypressfunc)(HWND, char, int, int, void *) = work.func;
291 325
292 retval = keypressfunc(widget, *event->string, event->keyval, 326 retval = keypressfunc(work.window, *event->string, event->keyval,
293 event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK), work->data); 327 event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK), work.data);
294 } 328 }
295 return retval; 329 return retval;
296 } 330 }
297 331
298 static gint _generic_event(GtkWidget *widget, gpointer data) 332 static gint _generic_event(GtkWidget *widget, gpointer data)
299 { 333 {
300 SignalHandler *work = (SignalHandler *)data; 334 SignalHandler work = _get_signal_handler(widget, data);
301 int retval = FALSE; 335 int retval = FALSE;
302 336
303 if(work) 337 if(work.window)
304 { 338 {
305 int (*genericfunc)(HWND, void *) = work->func; 339 int (*genericfunc)(HWND, void *) = work.func;
306 340
307 retval = genericfunc(widget, work->data); 341 retval = genericfunc(work.window, work.data);
308 } 342 }
309 return retval; 343 return retval;
310 } 344 }
311 345
312 static gint _activate_event(GtkWidget *widget, gpointer data) 346 static gint _activate_event(GtkWidget *widget, gpointer data)
313 { 347 {
314 SignalHandler *work = (SignalHandler *)data; 348 SignalHandler work = _get_signal_handler(widget, data);
315 int retval = FALSE; 349 int retval = FALSE;
316 350
317 if(work && !_dw_ignore_click) 351 if(work.window && !_dw_ignore_click)
318 { 352 {
319 int (*activatefunc)(HWND, void *) = work->func; 353 int (*activatefunc)(HWND, void *) = work.func;
320 354
321 retval = activatefunc(popup ? popup : work->window, work->data); 355 retval = activatefunc(popup ? popup : work.window, work.data);
322 } 356 }
323 return retval; 357 return retval;
324 } 358 }
325 359
326 static gint _configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) 360 static gint _configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
327 { 361 {
328 SignalHandler *work = (SignalHandler *)data; 362 SignalHandler work = _get_signal_handler(widget, data);
329 int retval = FALSE; 363 int retval = FALSE;
330 364
331 if(work) 365 if(work.window)
332 { 366 {
333 int (*sizefunc)(HWND, int, int, void *) = work->func; 367 int (*sizefunc)(HWND, int, int, void *) = work.func;
334 368
335 retval = sizefunc(widget, event->width, event->height, work->data); 369 retval = sizefunc(work.window, event->width, event->height, work.data);
336 } 370 }
337 return retval; 371 return retval;
338 } 372 }
339 373
340 static gint _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) 374 static gint _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
341 { 375 {
342 SignalHandler *work = (SignalHandler *)data; 376 SignalHandler work = _get_signal_handler(widget, data);
343 int retval = FALSE; 377 int retval = FALSE;
344 378
345 if(work) 379 if(work.window)
346 { 380 {
347 DWExpose exp; 381 DWExpose exp;
348 int (*exposefunc)(HWND, DWExpose *, void *) = work->func; 382 int (*exposefunc)(HWND, DWExpose *, void *) = work.func;
349 383
350 exp.x = event->area.x; 384 exp.x = event->area.x;
351 exp.y = event->area.y; 385 exp.y = event->area.y;
352 exp.width = event->area.width; 386 exp.width = event->area.width;
353 exp.height = event->area.height; 387 exp.height = event->area.height;
354 retval = exposefunc(widget, &exp, work->data); 388 retval = exposefunc(work.window, &exp, work.data);
355 } 389 }
356 return retval; 390 return retval;
357 } 391 }
358 392
359 static gint _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data) 393 static gint _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data)
360 { 394 {
361 SignalHandler *work = (SignalHandler *)data; 395 SignalHandler work = _get_signal_handler(widget, data);
362 static int _dw_recursing = 0; 396 static int _dw_recursing = 0;
363 int retval = FALSE; 397 int retval = FALSE;
364 398
365 if(_dw_recursing) 399 if(_dw_recursing)
366 return FALSE; 400 return FALSE;
367 401
368 if(work) 402 if(work.window)
369 { 403 {
370 int (*selectfunc)(HWND, int, void *) = work->func; 404 int (*selectfunc)(HWND, int, void *) = work.func;
371 GList *list; 405 GList *list;
372 int item = 0; 406 int item = 0;
373 407
374 _dw_recursing = 1; 408 _dw_recursing = 1;
375 409
376 if(GTK_IS_COMBO(work->window)) 410 if(GTK_IS_COMBO(work.window))
377 list = GTK_LIST(GTK_COMBO(work->window)->list)->children; 411 list = GTK_LIST(GTK_COMBO(work.window)->list)->children;
378 else if(GTK_IS_LIST(widget)) 412 else if(GTK_IS_LIST(widget))
379 list = GTK_LIST(widget)->children; 413 list = GTK_LIST(widget)->children;
380 else 414 else
381 return FALSE; 415 return FALSE;
382 416
383 while(list) 417 while(list)
384 { 418 {
385 if(list->data == (gpointer)child) 419 if(list->data == (gpointer)child)
386 { 420 {
387 if(!gtk_object_get_data(GTK_OBJECT(work->window), "_dw_appending")) 421 if(!gtk_object_get_data(GTK_OBJECT(work.window), "_dw_appending"))
388 { 422 {
389 gtk_object_set_data(GTK_OBJECT(work->window), "_dw_item", (gpointer)item); 423 gtk_object_set_data(GTK_OBJECT(work.window), "_dw_item", (gpointer)item);
390 if(selectfunc) 424 if(selectfunc)
391 retval = selectfunc(work->window, item, work->data); 425 retval = selectfunc(work.window, item, work.data);
392 } 426 }
393 break; 427 break;
394 } 428 }
395 item++; 429 item++;
396 list = list->next; 430 list = list->next;
400 return retval; 434 return retval;
401 } 435 }
402 436
403 static gint _container_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 437 static gint _container_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
404 { 438 {
405 SignalHandler *work = (SignalHandler *)data; 439 SignalHandler work = _get_signal_handler(widget, data);
406 int retval = FALSE; 440 int retval = FALSE;
407 441
408 if(work) 442 if(work.window)
409 { 443 {
410 if(event->button == 3) 444 if(event->button == 3)
411 { 445 {
412 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work->func; 446 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work.func;
413 char *text; 447 char *text;
414 int row, col; 448 int row, col;
415 449
416 gtk_clist_get_selection_info(GTK_CLIST(widget), event->x, event->y, &row, &col); 450 gtk_clist_get_selection_info(GTK_CLIST(widget), event->x, event->y, &row, &col);
417 451
418 text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), row); 452 text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), row);
419 retval = contextfunc(work->window, text, event->x, event->y, work->data, NULL); 453 retval = contextfunc(work.window, text, event->x, event->y, work.data, NULL);
420 } 454 }
421 } 455 }
422 return retval; 456 return retval;
423 } 457 }
424 458
425 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 459 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
426 { 460 {
427 SignalHandler *work = (SignalHandler *)data; 461 SignalHandler work = _get_signal_handler(widget, data);
428 int retval = FALSE; 462 int retval = FALSE;
429 463
430 if(work) 464 if(work.window)
431 { 465 {
432 if(event->button == 3) 466 if(event->button == 3)
433 { 467 {
434 #if GTK_MAJOR_VERSION > 1 468 #if GTK_MAJOR_VERSION > 1
435 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work->func; 469 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work.func;
436 char *text = NULL; 470 char *text = NULL;
437 void *itemdata = NULL; 471 void *itemdata = NULL;
438 472
439 if(widget && GTK_IS_TREE_VIEW(widget)) 473 if(widget && GTK_IS_TREE_VIEW(widget))
440 { 474 {
446 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_tree_store"); 480 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_tree_store");
447 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1); 481 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1);
448 } 482 }
449 } 483 }
450 484
451 retval = contextfunc(work->window, text, event->x, event->y, work->data, itemdata); 485 retval = contextfunc(work.window, text, event->x, event->y, work.data, itemdata);
452 #else 486 #else
453 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work->func; 487 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work.func;
454 char *text = (char *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_text"); 488 char *text = (char *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_text");
455 void *itemdata = (void *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_itemdata"); 489 void *itemdata = (void *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_itemdata");
456 490
457 if(widget != work->window) 491 if(widget != work.window)
458 { 492 {
459 GtkWidget *tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(work->window)); 493 GtkWidget *tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(work.window));
460 494
461 if(tree && GTK_IS_TREE(tree)) 495 if(tree && GTK_IS_TREE(tree))
462 { 496 {
463 GtkWidget *lastselect = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_lastselect"); 497 GtkWidget *lastselect = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_lastselect");
464 498
468 itemdata = (void *)gtk_object_get_data(GTK_OBJECT(lastselect), "_dw_itemdata"); 502 itemdata = (void *)gtk_object_get_data(GTK_OBJECT(lastselect), "_dw_itemdata");
469 } 503 }
470 } 504 }
471 } 505 }
472 506
473 retval = contextfunc(work->window, text, event->x, event->y, work->data, itemdata); 507 retval = contextfunc(work.window, text, event->x, event->y, work.data, itemdata);
474 #endif 508 #endif
475 } 509 }
476 } 510 }
477 return retval; 511 return retval;
478 } 512 }
479 513
480 #if GTK_MAJOR_VERSION > 1 514 #if GTK_MAJOR_VERSION > 1
481 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data) 515 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data)
482 { 516 {
483 SignalHandler *work = (SignalHandler *)data; 517 GtkWidget *item, *widget = (GtkWidget *)gtk_tree_selection_get_tree_view(sel);
518 SignalHandler work = _get_signal_handler(widget, data);
484 int retval = FALSE; 519 int retval = FALSE;
485 520
486 if(work) 521 if(widget && work.window)
487 { 522 {
488 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work->func; 523 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func;
489 GtkTreeIter iter; 524 GtkTreeIter iter;
490 char *text = NULL; 525 char *text = NULL;
491 void *itemdata = NULL; 526 void *itemdata = NULL;
492 GtkWidget *item, *widget = (GtkWidget *)gtk_tree_selection_get_tree_view(sel);
493 527
494 if(widget && gtk_tree_selection_get_selected(sel, NULL, &iter)) 528 if(gtk_tree_selection_get_selected(sel, NULL, &iter))
495 { 529 {
496 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_tree_store"); 530 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(widget), "_dw_tree_store");
497 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1); 531 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, 3, &item, -1);
498 retval = treeselectfunc(work->window, (HTREEITEM)item, text, work->data, itemdata); 532 retval = treeselectfunc(work.window, (HTREEITEM)item, text, work.data, itemdata);
499 } 533 }
500 } 534 }
501 return retval; 535 return retval;
502 } 536 }
503 #else 537 #else
504 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data) 538 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data)
505 { 539 {
506 SignalHandler *work = (SignalHandler *)data; 540 SignalHandler work = _get_signal_handler((GtkWidget *)tree, data);
507 GtkWidget *treeroot = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(child), "_dw_tree"); 541 GtkWidget *treeroot = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(child), "_dw_tree");
508 int retval = FALSE; 542 int retval = FALSE;
509 543
510 if(treeroot && GTK_IS_TREE(treeroot)) 544 if(treeroot && GTK_IS_TREE(treeroot))
511 { 545 {
513 if(lastselect && GTK_IS_TREE_ITEM(lastselect)) 547 if(lastselect && GTK_IS_TREE_ITEM(lastselect))
514 gtk_tree_item_deselect(GTK_TREE_ITEM(lastselect)); 548 gtk_tree_item_deselect(GTK_TREE_ITEM(lastselect));
515 gtk_object_set_data(GTK_OBJECT(treeroot), "_dw_lastselect", (gpointer)child); 549 gtk_object_set_data(GTK_OBJECT(treeroot), "_dw_lastselect", (gpointer)child);
516 } 550 }
517 551
518 if(work) 552 if(work.window)
519 { 553 {
520 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work->func; 554 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func;
521 char *text = (char *)gtk_object_get_data(GTK_OBJECT(child), "_dw_text"); 555 char *text = (char *)gtk_object_get_data(GTK_OBJECT(child), "_dw_text");
522 void *itemdata = (void *)gtk_object_get_data(GTK_OBJECT(child), "_dw_itemdata"); 556 void *itemdata = (void *)gtk_object_get_data(GTK_OBJECT(child), "_dw_itemdata");
523 retval = treeselectfunc(work->window, (HTREEITEM)child, text, work->data, itemdata); 557 retval = treeselectfunc(work.window, (HTREEITEM)child, text, work.data, itemdata);
524 } 558 }
525 return retval; 559 return retval;
526 } 560 }
527 #endif 561 #endif
528 562
529 static gint _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 563 static gint _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
530 { 564 {
531 SignalHandler *work = (SignalHandler *)data; 565 SignalHandler work = _get_signal_handler(widget, data);
532 int retval = FALSE; 566 int retval = FALSE;
533 567
534 if(work) 568 if(work.window)
535 { 569 {
536 if(event->button == 1 && event->type == GDK_2BUTTON_PRESS) 570 if(event->button == 1 && event->type == GDK_2BUTTON_PRESS)
537 { 571 {
538 int (*contextfunc)(HWND, char *, void *) = work->func; 572 int (*contextfunc)(HWND, char *, void *) = work.func;
539 char *text; 573 char *text;
540 int row, col; 574 int row, col;
541 575
542 gtk_clist_get_selection_info(GTK_CLIST(widget), event->x, event->y, &row, &col); 576 gtk_clist_get_selection_info(GTK_CLIST(widget), event->x, event->y, &row, &col);
543 577
544 text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), row); 578 text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), row);
545 retval = contextfunc(work->window, text, work->data); 579 retval = contextfunc(work.window, text, work.data);
546 gtk_object_set_data(GTK_OBJECT(widget), "_dw_double_click", (gpointer)1); 580 gtk_object_set_data(GTK_OBJECT(widget), "_dw_double_click", (gpointer)1);
547 } 581 }
548 } 582 }
549 return retval; 583 return retval;
550 } 584 }
568 } 602 }
569 603
570 604
571 static gint _switch_page_event(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data) 605 static gint _switch_page_event(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data)
572 { 606 {
573 SignalHandler *work = (SignalHandler *)data; 607 SignalHandler work = _get_signal_handler((GtkWidget *)notebook, data);
574 int retval = FALSE; 608 int retval = FALSE;
575 609
576 if(work) 610 if(work.window)
577 { 611 {
578 int (*switchpagefunc)(HWND, unsigned long, void *) = work->func; 612 int (*switchpagefunc)(HWND, unsigned long, void *) = work.func;
579 retval = switchpagefunc(work->window, _get_logical_page(GTK_WIDGET(notebook), page_num), work->data); 613 retval = switchpagefunc(work.window, _get_logical_page(GTK_WIDGET(notebook), page_num), work.data);
580 } 614 }
581 return retval; 615 return retval;
582 } 616 }
583 617
584 static gint _container_select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) 618 static gint _container_select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data)
585 { 619 {
586 SignalHandler *work = (SignalHandler *)data; 620 SignalHandler work = _get_signal_handler(widget, data);
587 char *rowdata = gtk_clist_get_row_data(GTK_CLIST(widget), row); 621 char *rowdata = gtk_clist_get_row_data(GTK_CLIST(widget), row);
588 int (*contextfunc)(HWND, HWND, char *, void *, void *) = work->func; 622 int (*contextfunc)(HWND, HWND, char *, void *, void *) = work.func;
623
624 if(!work.window)
625 return TRUE;
589 626
590 if(gtk_object_get_data(GTK_OBJECT(widget), "_dw_double_click")) 627 if(gtk_object_get_data(GTK_OBJECT(widget), "_dw_double_click"))
591 { 628 {
592 gtk_object_set_data(GTK_OBJECT(widget), "_dw_double_click", (gpointer)0); 629 gtk_object_set_data(GTK_OBJECT(widget), "_dw_double_click", (gpointer)0);
593 return TRUE; 630 return TRUE;
594 } 631 }
595 return contextfunc(work->window, 0, rowdata, work->data, 0);; 632 return contextfunc(work.window, 0, rowdata, work.data, 0);;
596 } 633 }
597 634
598 static int _round_value(gfloat val) 635 static int _round_value(gfloat val)
599 { 636 {
600 int newval = (int)val; 637 int newval = (int)val;
605 return newval; 642 return newval;
606 } 643 }
607 644
608 static gint _value_changed_event(GtkAdjustment *adjustment, gpointer data) 645 static gint _value_changed_event(GtkAdjustment *adjustment, gpointer data)
609 { 646 {
610 SignalHandler *work = (SignalHandler *)data; 647 int max = _round_value(adjustment->upper);
611 648 int val = _round_value(adjustment->value);
612 if(work) 649 GtkWidget *slider = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "_dw_slider");
613 { 650 GtkWidget *scrollbar = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "_dw_scrollbar");
614 int (*valuechangedfunc)(HWND, int, void *) = work->func; 651
615 int max = _round_value(adjustment->upper); 652 if(slider)
616 int val = _round_value(adjustment->value); 653 {
617 GtkWidget *slider = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "_dw_slider"); 654 SignalHandler work = _get_signal_handler((GtkWidget *)adjustment, data);
618 GtkWidget *scrollbar = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "_dw_scrollbar"); 655
619 656 if(work.window)
620 if(slider) 657 {
621 { 658 int (*valuechangedfunc)(HWND, int, void *) = work.func;
659
622 if(GTK_IS_VSCALE(slider)) 660 if(GTK_IS_VSCALE(slider))
623 valuechangedfunc(work->window, (max - val) - 1, work->data); 661 valuechangedfunc(work.window, (max - val) - 1, work.data);
624 else 662 else
625 valuechangedfunc(work->window, val, work->data); 663 valuechangedfunc(work.window, val, work.data);
626 } 664 }
627 else if(scrollbar) 665 }
628 { 666 else if(scrollbar)
629 valuechangedfunc(work->window, val, work->data); 667 {
668 SignalHandler work = _get_signal_handler((GtkWidget *)adjustment, data);
669
670 if(work.window)
671 {
672 int (*valuechangedfunc)(HWND, int, void *) = work.func;
673
674 valuechangedfunc(work.window, val, work.data);
630 } 675 }
631 } 676 }
632 return FALSE; 677 return FALSE;
633 } 678 }
634 679
3747 { 3792 {
3748 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); 3793 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent));
3749 if(!subtree) 3794 if(!subtree)
3750 { 3795 {
3751 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func"); 3796 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func");
3752 void *work = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data"); 3797 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data");
3798 SignalHandler work = _get_signal_handler(tree, mydata);
3753 3799
3754 subtree = gtk_tree_new(); 3800 subtree = gtk_tree_new();
3755 3801
3756 if(thisfunc && work) 3802 if(thisfunc && work.window)
3757 gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc), work); 3803 {
3804 gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc),
3805 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data));
3806 }
3758 3807
3759 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func"); 3808 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func");
3760 work = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data"); 3809 mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data");
3761 3810 work = _get_signal_handler(tree, mydata);
3762 if(thisfunc && work) 3811
3763 gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work); 3812 if(thisfunc && work.window)
3813 {
3814 gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc),
3815 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data));
3816 }
3764 3817
3765 gtk_object_set_user_data(GTK_OBJECT(parent), subtree); 3818 gtk_object_set_user_data(GTK_OBJECT(parent), subtree);
3766 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); 3819 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE);
3767 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); 3820 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
3768 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); 3821 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree);
3866 { 3919 {
3867 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); 3920 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent));
3868 if(!subtree) 3921 if(!subtree)
3869 { 3922 {
3870 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func"); 3923 void *thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_func");
3871 void *work = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data"); 3924 void *mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_select_child_data");
3925 SignalHandler work = _get_signal_handler(tree, mydata);
3872 3926
3873 subtree = gtk_tree_new(); 3927 subtree = gtk_tree_new();
3874 3928
3875 if(thisfunc && work) 3929 if(thisfunc && work.window)
3876 gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc), work); 3930 {
3931 gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc),
3932 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data));
3933 }
3877 3934
3878 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func"); 3935 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func");
3879 work = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data"); 3936 mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data");
3880 3937 work = _get_signal_handler(tree, mydata);
3881 if(thisfunc && work) 3938
3882 gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work); 3939 if(thisfunc && work.window)
3940 {
3941 gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc),
3942 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data));
3943 }
3883 3944
3884 gtk_object_set_user_data(GTK_OBJECT(parent), subtree); 3945 gtk_object_set_user_data(GTK_OBJECT(parent), subtree);
3885 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); 3946 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE);
3886 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); 3947 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
3887 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); 3948 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree);
7556 * sigfunc: The pointer to the function to be used as the callback. 7617 * sigfunc: The pointer to the function to be used as the callback.
7557 * data: User data to be passed to the handler function. 7618 * data: User data to be passed to the handler function.
7558 */ 7619 */
7559 void dw_signal_connect(HWND window, char *signame, void *sigfunc, void *data) 7620 void dw_signal_connect(HWND window, char *signame, void *sigfunc, void *data)
7560 { 7621 {
7561 SignalHandler *work = malloc(sizeof(SignalHandler));
7562 void *thisfunc = _findsigfunc(signame); 7622 void *thisfunc = _findsigfunc(signame);
7563 char *thisname = signame; 7623 char *thisname = signame;
7564 HWND thiswindow = window; 7624 HWND thiswindow = window;
7565 int _locked_by_me = FALSE; 7625 int _locked_by_me = FALSE;
7566 7626
7583 #if GTK_MAJOR_VERSION > 1 7643 #if GTK_MAJOR_VERSION > 1
7584 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0) 7644 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0)
7585 { 7645 {
7586 thisfunc = _findsigfunc("tree-context"); 7646 thisfunc = _findsigfunc("tree-context");
7587 7647
7588 work->window = window; 7648 gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc),
7589 work->data = data; 7649 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data));
7590 work->func = sigfunc; 7650 gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc),
7591 7651 (gpointer)_set_signal_handler(window, window, sigfunc, data));
7592 gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work);
7593 gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work);
7594 DW_MUTEX_UNLOCK; 7652 DW_MUTEX_UNLOCK;
7595 return; 7653 return;
7596 } 7654 }
7597 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) 7655 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0)
7598 { 7656 {
7599 work->window = window;
7600 work->data = data;
7601 work->func = sigfunc;
7602
7603 thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow)); 7657 thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow));
7604 thisname = "changed"; 7658 thisname = "changed";
7605 7659
7606 g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc, work); 7660 g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc,
7661 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data));
7607 DW_MUTEX_UNLOCK; 7662 DW_MUTEX_UNLOCK;
7608 return; 7663 return;
7609 } 7664 }
7610 #else 7665 #else
7611 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0) 7666 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0)
7612 { 7667 {
7668 int counter = (int)_set_signal_handler(thiswindow, window, sigfunc, data);
7669
7613 thisfunc = _findsigfunc("tree-context"); 7670 thisfunc = _findsigfunc("tree-context");
7614 7671
7615 work->window = window;
7616 work->data = data;
7617 work->func = sigfunc;
7618
7619 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_func", (gpointer)thisfunc); 7672 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_func", (gpointer)thisfunc);
7620 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_data", (gpointer)work); 7673 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_data", (gpointer)counter);
7621 gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work); 7674 gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), (gpointer)counter);
7622 gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), work); 7675 gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc),
7676 (gpointer)_set_signal_handler(window, window, sigfunc, data));
7623 DW_MUTEX_UNLOCK; 7677 DW_MUTEX_UNLOCK;
7624 return; 7678 return;
7625 } 7679 }
7626 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) 7680 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0)
7627 { 7681 {
7628 if(thisfunc) 7682 if(thisfunc)
7629 { 7683 {
7630 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_func", (gpointer)thisfunc); 7684 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_func", (gpointer)thisfunc);
7631 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_data", (gpointer)work); 7685 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_data",
7686 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data));
7632 } 7687 }
7633 thisname = "select-child"; 7688 thisname = "select-child";
7634 } 7689 }
7635 #endif 7690 #endif
7636 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0) 7691 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0)
7676 thisname = "switch-page"; 7731 thisname = "switch-page";
7677 } 7732 }
7678 7733
7679 if(!thisfunc || !thiswindow) 7734 if(!thisfunc || !thiswindow)
7680 { 7735 {
7681 free(work);
7682 DW_MUTEX_UNLOCK; 7736 DW_MUTEX_UNLOCK;
7683 return; 7737 return;
7684 } 7738 }
7685 7739
7686 work->window = window; 7740 gtk_signal_connect(GTK_OBJECT(thiswindow), thisname, GTK_SIGNAL_FUNC(thisfunc),
7687 work->data = data; 7741 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data));
7688 work->func = sigfunc;
7689
7690 gtk_signal_connect(GTK_OBJECT(thiswindow), thisname, GTK_SIGNAL_FUNC(thisfunc), work);
7691 DW_MUTEX_UNLOCK; 7742 DW_MUTEX_UNLOCK;
7692 } 7743 }
7693 7744
7694 /* 7745 /*
7695 * Removes callbacks for a given window with given name. 7746 * Removes callbacks for a given window with given name.