Mercurial > dwindows
comparison gtk4/dw.c @ 2271:1c52cd5a817f
GTK4: More refactoring, and started working on menus, but not entirely sure
how it is going to work yet.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Mon, 01 Feb 2021 04:07:22 +0000 |
parents | 819f2492c85f |
children | 2ce302c43f48 |
comparison
equal
deleted
inserted
replaced
2270:819f2492c85f | 2271:1c52cd5a817f |
---|---|
113 #define _DW_TREE_TYPE_TREE 2 | 113 #define _DW_TREE_TYPE_TREE 2 |
114 #define _DW_TREE_TYPE_LISTBOX 3 | 114 #define _DW_TREE_TYPE_LISTBOX 3 |
115 #define _DW_TREE_TYPE_COMBOBOX 4 | 115 #define _DW_TREE_TYPE_COMBOBOX 4 |
116 | 116 |
117 /* Signal forwarder prototypes */ | 117 /* Signal forwarder prototypes */ |
118 static gint _dw_button_press_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data); | 118 static gint _dw_button_press_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data); |
119 static gint _dw_button_release_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data); | 119 static gint _dw_button_release_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data); |
120 static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data); | 120 static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data); |
121 static gboolean _dw_delete_event(GtkWidget *window, gpointer data); | 121 static gboolean _dw_delete_event(GtkWidget *window, gpointer data); |
122 static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); | 122 static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); |
123 static gint _dw_generic_event(GtkWidget *widget, gpointer data); | 123 static gint _dw_generic_event(GtkWidget *widget, gpointer data); |
124 static gint _dw_configure_event(GtkWidget *widget, int width, int height, gpointer data); | 124 static gint _dw_configure_event(GtkWidget *widget, int width, int height, gpointer data); |
125 static gint _dw_container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); | 125 static gint _dw_container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); |
126 static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data); | 126 static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data); |
127 static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data); | 127 static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data); |
128 static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); | 128 static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); |
129 static gint _dw_tree_context_event(GtkWidget *widget, GdkEvent *event, gpointer data); | 129 static gint _dw_tree_context_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data); |
130 static gint _dw_value_changed_event(GtkWidget *widget, gpointer user_data); | 130 static gint _dw_value_changed_event(GtkWidget *widget, gpointer user_data); |
131 static gint _dw_tree_select_event(GtkTreeSelection *sel, gpointer data); | 131 static gint _dw_tree_select_event(GtkTreeSelection *sel, gpointer data); |
132 static gint _dw_tree_expand_event(GtkTreeView *treeview, GtkTreeIter *arg1, GtkTreePath *arg2, gpointer data); | 132 static gint _dw_tree_expand_event(GtkTreeView *treeview, GtkTreeIter *arg1, GtkTreePath *arg2, gpointer data); |
133 static gint _dw_switch_page_event(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data); | 133 static gint _dw_switch_page_event(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data); |
134 static gint _dw_column_click_event(GtkWidget *widget, gpointer data); | 134 static gint _dw_column_click_event(GtkWidget *widget, gpointer data); |
243 z++; | 243 z++; |
244 } | 244 } |
245 return empty; | 245 return empty; |
246 } | 246 } |
247 | 247 |
248 static SignalHandler _get_signal_handler(gpointer data) | 248 static SignalHandler _dw_get_signal_handler(gpointer data) |
249 { | 249 { |
250 SignalHandler sh = {0}; | 250 SignalHandler sh = {0}; |
251 | 251 |
252 if(data) | 252 if(data) |
253 { | 253 { |
268 sh.cid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), text)); | 268 sh.cid = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), text)); |
269 } | 269 } |
270 return sh; | 270 return sh; |
271 } | 271 } |
272 | 272 |
273 static void _remove_signal_handler(GtkWidget *widget, int counter) | 273 static void _dw_remove_signal_handler(GtkWidget *widget, int counter) |
274 { | 274 { |
275 char text[100]; | 275 char text[100]; |
276 gint cid; | 276 gint cid; |
277 | 277 |
278 sprintf(text, "_dw_sigcid%d", counter); | 278 sprintf(text, "_dw_sigcid%d", counter); |
287 g_object_set_data(G_OBJECT(widget), text, NULL); | 287 g_object_set_data(G_OBJECT(widget), text, NULL); |
288 sprintf(text, "_dw_sigdata%d", counter); | 288 sprintf(text, "_dw_sigdata%d", counter); |
289 g_object_set_data(G_OBJECT(widget), text, NULL); | 289 g_object_set_data(G_OBJECT(widget), text, NULL); |
290 } | 290 } |
291 | 291 |
292 static int _set_signal_handler(GObject *object, HWND window, void *func, gpointer data, void *intfunc, void *discfunc) | 292 static int _dw_set_signal_handler(GObject *object, HWND window, void *func, gpointer data, void *intfunc, void *discfunc) |
293 { | 293 { |
294 int counter = GPOINTER_TO_INT(g_object_get_data(object, "_dw_sigcounter")); | 294 int counter = GPOINTER_TO_INT(g_object_get_data(object, "_dw_sigcounter")); |
295 char text[100]; | 295 char text[100]; |
296 | 296 |
297 sprintf(text, "_dw_sigwindow%d", counter); | 297 sprintf(text, "_dw_sigwindow%d", counter); |
309 g_object_set_data(object, "_dw_sigcounter", GINT_TO_POINTER(counter)); | 309 g_object_set_data(object, "_dw_sigcounter", GINT_TO_POINTER(counter)); |
310 | 310 |
311 return counter - 1; | 311 return counter - 1; |
312 } | 312 } |
313 | 313 |
314 static void _set_signal_handler_id(GObject *object, int counter, gint cid) | 314 static void _dw_set_signal_handler_id(GObject *object, int counter, gint cid) |
315 { | 315 { |
316 char text[100]; | 316 char text[100]; |
317 | 317 |
318 sprintf(text, "_dw_sigcid%d", counter); | 318 sprintf(text, "_dw_sigcid%d", counter); |
319 g_object_set_data(object, text, GINT_TO_POINTER(cid)); | 319 g_object_set_data(object, text, GINT_TO_POINTER(cid)); |
320 } | 320 } |
321 | 321 |
322 #ifdef USE_WEBKIT | 322 #ifdef USE_WEBKIT |
323 static void _html_result_event(GObject *object, GAsyncResult *result, gpointer script_data) | 323 static void _dw_html_result_event(GObject *object, GAsyncResult *result, gpointer script_data) |
324 { | 324 { |
325 pthread_t saved_thread = _dw_thread; | 325 pthread_t saved_thread = _dw_thread; |
326 WebKitJavascriptResult *js_result; | 326 WebKitJavascriptResult *js_result; |
327 JSCValue *value; | 327 JSCValue *value; |
328 GError *error = NULL; | 328 GError *error = NULL; |
334 if(handlerdata) | 334 if(handlerdata) |
335 { | 335 { |
336 SignalHandler work; | 336 SignalHandler work; |
337 void *params[3] = { GINT_TO_POINTER(handlerdata-1), 0, object }; | 337 void *params[3] = { GINT_TO_POINTER(handlerdata-1), 0, object }; |
338 | 338 |
339 work = _get_signal_handler(params); | 339 work = _dw_get_signal_handler(params); |
340 | 340 |
341 if(work.window) | 341 if(work.window) |
342 { | 342 { |
343 htmlresultfunc = work.func; | 343 htmlresultfunc = work.func; |
344 user_data = work.data; | 344 user_data = work.data; |
373 htmlresultfunc((HWND)object, DW_ERROR_UNKNOWN, NULL, script_data, user_data); | 373 htmlresultfunc((HWND)object, DW_ERROR_UNKNOWN, NULL, script_data, user_data); |
374 webkit_javascript_result_unref (js_result); | 374 webkit_javascript_result_unref (js_result); |
375 _dw_thread = saved_thread; | 375 _dw_thread = saved_thread; |
376 } | 376 } |
377 | 377 |
378 static void _html_changed_event(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer data) | 378 static void _dw_html_changed_event(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer data) |
379 { | 379 { |
380 SignalHandler work = _get_signal_handler(data); | 380 SignalHandler work = _dw_get_signal_handler(data); |
381 char *location = (char *)webkit_web_view_get_uri(web_view); | 381 char *location = (char *)webkit_web_view_get_uri(web_view); |
382 int status = 0; | 382 int status = 0; |
383 | 383 |
384 switch (load_event) { | 384 switch (load_event) { |
385 case WEBKIT_LOAD_STARTED: | 385 case WEBKIT_LOAD_STARTED: |
404 } | 404 } |
405 #endif | 405 #endif |
406 | 406 |
407 static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data) | 407 static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data) |
408 { | 408 { |
409 SignalHandler work = _get_signal_handler(data); | 409 SignalHandler work = _dw_get_signal_handler(data); |
410 int retval = FALSE; | 410 int retval = FALSE; |
411 | 411 |
412 if(work.window) | 412 if(work.window) |
413 { | 413 { |
414 int (*setfocusfunc)(HWND, void *) = work.func; | 414 int (*setfocusfunc)(HWND, void *) = work.func; |
416 retval = setfocusfunc(work.window, work.data); | 416 retval = setfocusfunc(work.window, work.data); |
417 } | 417 } |
418 return retval; | 418 return retval; |
419 } | 419 } |
420 | 420 |
421 static gint _dw_button_press_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data) | 421 static gint _dw_button_press_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data) |
422 { | 422 { |
423 SignalHandler work = _get_signal_handler(data); | 423 SignalHandler work = _dw_get_signal_handler(data); |
424 int retval = FALSE; | 424 int retval = FALSE; |
425 | 425 |
426 if(work.window) | 426 if(work.window) |
427 { | 427 { |
428 int (*buttonfunc)(HWND, int, int, int, void *) = work.func; | 428 int (*buttonfunc)(HWND, int, int, int, void *) = work.func; |
429 /* TODO: Fill these in */ | 429 int mybutton = gtk_gesture_single_get_current_button(gesture); |
430 int mybutton = 1; | 430 |
431 | 431 if(mybutton == 3) |
432 #if GTK3 | |
433 if(event->button == 3) | |
434 mybutton = 2; | 432 mybutton = 2; |
435 else if(event->button == 2) | 433 else if(mybutton == 2) |
436 mybutton = 3; | 434 mybutton = 3; |
437 #endif | |
438 | 435 |
439 retval = buttonfunc(work.window, (int)x, (int)y, mybutton, work.data); | 436 retval = buttonfunc(work.window, (int)x, (int)y, mybutton, work.data); |
440 } | 437 } |
441 return retval; | 438 return retval; |
442 } | 439 } |
443 | 440 |
444 static gint _dw_button_release_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data) | 441 static gint _dw_button_release_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data) |
445 { | 442 { |
446 SignalHandler work = _get_signal_handler(data); | 443 SignalHandler work = _dw_get_signal_handler(data); |
447 int retval = FALSE; | 444 int retval = FALSE; |
448 | 445 |
449 if(work.window) | 446 if(work.window) |
450 { | 447 { |
451 int (*buttonfunc)(HWND, int, int, int, void *) = work.func; | 448 int (*buttonfunc)(HWND, int, int, int, void *) = work.func; |
452 /* TODO: Fill these in */ | 449 int mybutton = gtk_gesture_single_get_current_button(gesture); |
453 int mybutton = 1; | 450 |
454 | 451 if(mybutton == 3) |
455 #if GTK3 | |
456 if(event->button == 3) | |
457 mybutton = 2; | 452 mybutton = 2; |
458 else if(event->button == 2) | 453 else if(mybutton == 2) |
459 mybutton = 3; | 454 mybutton = 3; |
460 #endif | |
461 | 455 |
462 retval = buttonfunc(work.window, (int)x, (int)y, mybutton, work.data); | 456 retval = buttonfunc(work.window, (int)x, (int)y, mybutton, work.data); |
463 } | 457 } |
464 return retval; | 458 return retval; |
465 } | 459 } |
466 | 460 |
467 static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data) | 461 static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data) |
468 { | 462 { |
469 SignalHandler work = _get_signal_handler(data); | 463 SignalHandler work = _dw_get_signal_handler(data); |
470 int retval = FALSE; | 464 int retval = FALSE; |
471 | 465 |
472 if(work.window) | 466 if(work.window) |
473 { | 467 { |
474 int (*motionfunc)(HWND, int, int, int, void *) = work.func; | 468 int (*motionfunc)(HWND, int, int, int, void *) = work.func; |
488 return retval; | 482 return retval; |
489 } | 483 } |
490 | 484 |
491 static gboolean _dw_delete_event(GtkWidget *window, gpointer data) | 485 static gboolean _dw_delete_event(GtkWidget *window, gpointer data) |
492 { | 486 { |
493 SignalHandler work = _get_signal_handler(data); | 487 SignalHandler work = _dw_get_signal_handler(data); |
494 int retval = FALSE; | 488 int retval = FALSE; |
495 | 489 |
496 if(work.window) | 490 if(work.window) |
497 { | 491 { |
498 int (*closefunc)(HWND, void *) = work.func; | 492 int (*closefunc)(HWND, void *) = work.func; |
502 return retval; | 496 return retval; |
503 } | 497 } |
504 | 498 |
505 static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) | 499 static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) |
506 { | 500 { |
507 SignalHandler work = _get_signal_handler(data); | 501 SignalHandler work = _dw_get_signal_handler(data); |
508 int retval = FALSE; | 502 int retval = FALSE; |
509 | 503 |
510 if(work.window) | 504 if(work.window) |
511 { | 505 { |
512 int (*keypressfunc)(HWND, char, int, int, void *, char *) = work.func; | 506 int (*keypressfunc)(HWND, char, int, int, void *, char *) = work.func; |
521 return retval; | 515 return retval; |
522 } | 516 } |
523 | 517 |
524 static gint _dw_generic_event(GtkWidget *widget, gpointer data) | 518 static gint _dw_generic_event(GtkWidget *widget, gpointer data) |
525 { | 519 { |
526 SignalHandler work = _get_signal_handler(data); | 520 SignalHandler work = _dw_get_signal_handler(data); |
527 int retval = FALSE; | 521 int retval = FALSE; |
528 | 522 |
529 if(work.window) | 523 if(work.window) |
530 { | 524 { |
531 int (*genericfunc)(HWND, void *) = work.func; | 525 int (*genericfunc)(HWND, void *) = work.func; |
535 return retval; | 529 return retval; |
536 } | 530 } |
537 | 531 |
538 static gint _dw_configure_event(GtkWidget *widget, int width, int height, gpointer data) | 532 static gint _dw_configure_event(GtkWidget *widget, int width, int height, gpointer data) |
539 { | 533 { |
540 SignalHandler work = _get_signal_handler(data); | 534 SignalHandler work = _dw_get_signal_handler(data); |
541 int retval = FALSE; | 535 int retval = FALSE; |
542 | 536 |
543 if(work.window) | 537 if(work.window) |
544 { | 538 { |
545 int (*sizefunc)(HWND, int, int, void *) = work.func; | 539 int (*sizefunc)(HWND, int, int, void *) = work.func; |
549 return retval; | 543 return retval; |
550 } | 544 } |
551 | 545 |
552 static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data) | 546 static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data) |
553 { | 547 { |
554 SignalHandler work = _get_signal_handler(data); | 548 SignalHandler work = _dw_get_signal_handler(data); |
555 int retval = FALSE; | 549 int retval = FALSE; |
556 | 550 |
557 if(work.window) | 551 if(work.window) |
558 { | 552 { |
559 DWExpose exp; | 553 DWExpose exp; |
567 return retval; | 561 return retval; |
568 } | 562 } |
569 | 563 |
570 static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data) | 564 static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data) |
571 { | 565 { |
572 SignalHandler work = _get_signal_handler(data); | 566 SignalHandler work = _dw_get_signal_handler(data); |
573 int retval = FALSE; | 567 int retval = FALSE; |
574 | 568 |
575 if(g_object_get_data(G_OBJECT(widget), "_dw_recursing")) | 569 if(g_object_get_data(G_OBJECT(widget), "_dw_recursing")) |
576 return FALSE; | 570 return FALSE; |
577 | 571 |
611 } | 605 } |
612 | 606 |
613 #define _DW_DATA_TYPE_STRING 0 | 607 #define _DW_DATA_TYPE_STRING 0 |
614 #define _DW_DATA_TYPE_POINTER 1 | 608 #define _DW_DATA_TYPE_POINTER 1 |
615 | 609 |
616 static gint _dw_tree_context_event(GtkWidget *widget, GdkEvent *event, gpointer data) | 610 static gint _dw_tree_context_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data) |
617 { | 611 { |
618 SignalHandler work = _get_signal_handler(data); | 612 SignalHandler work = _dw_get_signal_handler(data); |
619 int retval = FALSE; | 613 int retval = FALSE; |
620 | 614 |
621 if(work.window) | 615 if(work.window) |
622 { | 616 { |
623 int button = 1; | 617 int button = gtk_gesture_single_get_current_button(gesture); |
624 | 618 |
625 if(button == 3) | 619 if(button == 3) |
626 { | 620 { |
627 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work.func; | 621 int (*contextfunc)(HWND, char *, int, int, void *, void *) = work.func; |
628 char *text = NULL; | 622 char *text = NULL; |
629 void *itemdata = NULL; | 623 void *itemdata = NULL; |
630 /* TODO: Fill these in */ | 624 GtkWidget *widget = work.window; |
631 int x = 0, y = 0; | |
632 | 625 |
633 if(widget && GTK_IS_TREE_VIEW(widget)) | 626 if(widget && GTK_IS_TREE_VIEW(widget)) |
634 { | 627 { |
635 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); | 628 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); |
636 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); | 629 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); |
671 gtk_tree_path_free(path); | 664 gtk_tree_path_free(path); |
672 } | 665 } |
673 } | 666 } |
674 } | 667 } |
675 | 668 |
676 retval = contextfunc(work.window, text, x, y, work.data, itemdata); | 669 retval = contextfunc(work.window, text, (int)x, (int)y, work.data, itemdata); |
677 if(text) | 670 if(text) |
678 g_free(text); | 671 g_free(text); |
679 } | 672 } |
680 } | 673 } |
681 return retval; | 674 return retval; |
686 GtkWidget *item = NULL, *widget = (GtkWidget *)gtk_tree_selection_get_tree_view(sel); | 679 GtkWidget *item = NULL, *widget = (GtkWidget *)gtk_tree_selection_get_tree_view(sel); |
687 int retval = FALSE; | 680 int retval = FALSE; |
688 | 681 |
689 if(widget) | 682 if(widget) |
690 { | 683 { |
691 SignalHandler work = _get_signal_handler(data); | 684 SignalHandler work = _dw_get_signal_handler(data); |
692 | 685 |
693 if(work.window) | 686 if(work.window) |
694 { | 687 { |
695 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func; | 688 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func; |
696 GtkTreeIter iter; | 689 GtkTreeIter iter; |
778 return retval; | 771 return retval; |
779 } | 772 } |
780 | 773 |
781 static gint _dw_tree_expand_event(GtkTreeView *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer data) | 774 static gint _dw_tree_expand_event(GtkTreeView *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer data) |
782 { | 775 { |
783 SignalHandler work = _get_signal_handler(data); | 776 SignalHandler work = _dw_get_signal_handler(data); |
784 int retval = FALSE; | 777 int retval = FALSE; |
785 | 778 |
786 if(!_dw_ignore_expand && work.window) | 779 if(!_dw_ignore_expand && work.window) |
787 { | 780 { |
788 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func; | 781 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func; |
791 return retval; | 784 return retval; |
792 } | 785 } |
793 | 786 |
794 static gint _dw_container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) | 787 static gint _dw_container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) |
795 { | 788 { |
796 SignalHandler work = _get_signal_handler(data); | 789 SignalHandler work = _dw_get_signal_handler(data); |
797 int retval = FALSE; | 790 int retval = FALSE; |
798 | 791 |
799 if(work.window && GTK_IS_WIDGET(work.window)) | 792 if(work.window && GTK_IS_WIDGET(work.window)) |
800 { | 793 { |
801 GtkWidget *widget = work.window; | 794 GtkWidget *widget = work.window; |
856 } | 849 } |
857 | 850 |
858 | 851 |
859 static gint _dw_switch_page_event(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data) | 852 static gint _dw_switch_page_event(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data) |
860 { | 853 { |
861 SignalHandler work = _get_signal_handler(data); | 854 SignalHandler work = _dw_get_signal_handler(data); |
862 int retval = FALSE; | 855 int retval = FALSE; |
863 | 856 |
864 if(work.window) | 857 if(work.window) |
865 { | 858 { |
866 int (*switchpagefunc)(HWND, unsigned long, void *) = work.func; | 859 int (*switchpagefunc)(HWND, unsigned long, void *) = work.func; |
882 if(handlerdata) | 875 if(handlerdata) |
883 { | 876 { |
884 SignalHandler work; | 877 SignalHandler work; |
885 | 878 |
886 params[0] = GINT_TO_POINTER(handlerdata-1); | 879 params[0] = GINT_TO_POINTER(handlerdata-1); |
887 work = _get_signal_handler(params); | 880 work = _dw_get_signal_handler(params); |
888 | 881 |
889 if(work.window) | 882 if(work.window) |
890 { | 883 { |
891 int column_num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "_dw_column")); | 884 int column_num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "_dw_column")); |
892 int (*clickcolumnfunc)(HWND, int, void *) = work.func; | 885 int (*clickcolumnfunc)(HWND, int, void *) = work.func; |
926 if(g_object_get_data(G_OBJECT(adjustment), "_dw_suppress_value_changed_event")) | 919 if(g_object_get_data(G_OBJECT(adjustment), "_dw_suppress_value_changed_event")) |
927 return FALSE; | 920 return FALSE; |
928 | 921 |
929 if(slider || spinbutton || scrollbar) | 922 if(slider || spinbutton || scrollbar) |
930 { | 923 { |
931 SignalHandler work = _get_signal_handler(data); | 924 SignalHandler work = _dw_get_signal_handler(data); |
932 | 925 |
933 if (work.window) | 926 if (work.window) |
934 { | 927 { |
935 int (*valuechangedfunc)(HWND, int, void *) = work.func; | 928 int (*valuechangedfunc)(HWND, int, void *) = work.func; |
936 | 929 |
2155 * id: An ID to be used for getting the resource from the | 2148 * id: An ID to be used for getting the resource from the |
2156 * resource file. | 2149 * resource file. |
2157 */ | 2150 */ |
2158 HMENUI dw_menu_new(unsigned long id) | 2151 HMENUI dw_menu_new(unsigned long id) |
2159 { | 2152 { |
2160 HMENUI tmp = NULL; | 2153 HMENUI tmp = gtk_popover_menu_new_from_model_full(NULL, GTK_POPOVER_MENU_NESTED); |
2161 | 2154 |
2162 #if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */ | |
2163 tmp = gtk_menu_new(); | |
2164 gtk_widget_show(tmp); | |
2165 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); | 2155 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); |
2166 #endif | |
2167 return tmp; | 2156 return tmp; |
2168 } | 2157 } |
2169 | 2158 |
2170 /* | 2159 /* |
2171 * Create a menubar on a window. | 2160 * Create a menubar on a window. |
2175 * so tell the user. | 2164 * so tell the user. |
2176 */ | 2165 */ |
2177 HMENUI dw_menubar_new(HWND location) | 2166 HMENUI dw_menubar_new(HWND location) |
2178 { | 2167 { |
2179 HMENUI tmp = 0; | 2168 HMENUI tmp = 0; |
2180 #if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */ | |
2181 GtkWidget *box; | 2169 GtkWidget *box; |
2182 | 2170 |
2183 if(GTK_IS_WINDOW(location) && | 2171 if(GTK_IS_WINDOW(location) && |
2184 (box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_grid"))) | 2172 (box = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_grid")))) |
2185 { | 2173 { |
2186 /* If there is an existing menu bar, remove it */ | 2174 /* If there is an existing menu bar, remove it */ |
2187 GtkWidget *oldmenu = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_menubar"); | 2175 GtkWidget *oldmenu = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_menubar")); |
2188 if(oldmenu && GTK_IS_WIDGET(oldmenu)) | 2176 if(oldmenu && GTK_IS_WIDGET(oldmenu)) |
2189 g_object_unref(G_OBJECT(oldmenu)); | 2177 gtk_grid_remove(GTK_GRID(box), tmp); |
2190 /* Create a new menu bar */ | 2178 /* Create a new menu bar */ |
2191 tmp = gtk_menu_bar_new(); | 2179 tmp = gtk_popover_menu_bar_new_from_model(NULL); |
2192 gtk_widget_show(tmp); | 2180 gtk_widget_show(tmp); |
2193 /* Save pointers to each other */ | 2181 /* Save pointers to each other */ |
2194 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); | 2182 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); |
2195 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location); | 2183 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location); |
2196 gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1); | 2184 gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1); |
2197 } | 2185 } |
2198 #endif | |
2199 return tmp; | 2186 return tmp; |
2200 } | 2187 } |
2201 | 2188 |
2202 /* | 2189 /* |
2203 * Destroys a menu created with dw_menubar_new or dw_menu_new. | 2190 * Destroys a menu created with dw_menubar_new or dw_menu_new. |
2204 * Parameters: | 2191 * Parameters: |
2205 * menu: Handle of a menu. | 2192 * menu: Handle of a menu. |
2206 */ | 2193 */ |
2207 void dw_menu_destroy(HMENUI *menu) | 2194 void dw_menu_destroy(HMENUI *menu) |
2208 { | 2195 { |
2209 #if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */ | |
2210 if(menu && *menu) | 2196 if(menu && *menu) |
2211 { | 2197 { |
2212 GtkWidget *window; | 2198 GtkWidget *window; |
2213 | 2199 |
2214 /* If it is a menu bar, try to delete the reference to it */ | 2200 /* If it is a menu bar, try to delete the reference to it */ |
2215 if(GTK_IS_MENU_BAR(*menu) && | 2201 if(GTK_IS_POPOVER_MENU_BAR(*menu) && |
2216 (window = (GtkWidget *)g_object_get_data(G_OBJECT(*menu), "_dw_window"))) | 2202 (window = GTK_WIDGET(g_object_get_data(G_OBJECT(*menu), "_dw_window")))) |
2217 g_object_set_data(G_OBJECT(window), "_dw_menubar", NULL); | 2203 g_object_set_data(G_OBJECT(window), "_dw_menubar", NULL); |
2218 /* Actually destroy the menu */ | 2204 /* Actually destroy the menu */ |
2219 if(GTK_IS_WIDGET(*menu)) | 2205 if(GTK_IS_WIDGET(*menu)) |
2220 g_object_unref(G_OBJECT(*menu)); | 2206 { |
2207 GtkWidget *box = GTK_WIDGET(g_object_get_data(G_OBJECT(window), "_dw_grid")); | |
2208 if(box && GTK_IS_GRID(box)) | |
2209 gtk_grid_remove(GTK_GRID(box), GTK_WIDGET(*menu)); | |
2210 else | |
2211 g_object_unref(G_OBJECT(*menu)); | |
2212 } | |
2221 *menu = NULL; | 2213 *menu = NULL; |
2222 } | 2214 } |
2223 #endif | |
2224 } | 2215 } |
2225 | 2216 |
2226 /* | 2217 /* |
2227 * Adds a menuitem or submenu to an existing menu. | 2218 * Adds a menuitem or submenu to an existing menu. |
2228 * Parameters: | 2219 * Parameters: |
9095 { | 9086 { |
9096 #ifdef USE_WEBKIT | 9087 #ifdef USE_WEBKIT |
9097 WebKitWebView *web_view; | 9088 WebKitWebView *web_view; |
9098 | 9089 |
9099 if((web_view = _dw_html_web_view(handle))) | 9090 if((web_view = _dw_html_web_view(handle))) |
9100 webkit_web_view_run_javascript(web_view, script, NULL, _html_result_event, scriptdata); | 9091 webkit_web_view_run_javascript(web_view, script, NULL, _dw_html_result_event, scriptdata); |
9101 return DW_ERROR_NONE; | 9092 return DW_ERROR_NONE; |
9102 #else | 9093 #else |
9103 return DW_ERROR_UNKNOWN; | 9094 return DW_ERROR_UNKNOWN; |
9104 #endif | 9095 #endif |
9105 } | 9096 } |
9480 void **params = (void **)data; | 9471 void **params = (void **)data; |
9481 void (*discfunc)(HWND, void *) = params[1]; | 9472 void (*discfunc)(HWND, void *) = params[1]; |
9482 | 9473 |
9483 if(discfunc) | 9474 if(discfunc) |
9484 { | 9475 { |
9485 SignalHandler work = _get_signal_handler(data); | 9476 SignalHandler work = _dw_get_signal_handler(data); |
9486 | 9477 |
9487 if(work.window) | 9478 if(work.window) |
9488 { | 9479 { |
9489 discfunc(work.window, work.data); | 9480 discfunc(work.window, work.data); |
9490 } | 9481 } |
9551 { | 9542 { |
9552 if(GTK_IS_DRAWING_AREA(object)) | 9543 if(GTK_IS_DRAWING_AREA(object)) |
9553 { | 9544 { |
9554 /* TODO: Might need to use the disconnect paramater since this isn't a normal signal handler */ | 9545 /* TODO: Might need to use the disconnect paramater since this isn't a normal signal handler */ |
9555 gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(object), signal->func, data, NULL); | 9546 gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(object), signal->func, data, NULL); |
9556 _set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); | 9547 _dw_set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); |
9557 return NULL; | 9548 return NULL; |
9558 } | 9549 } |
9559 return object; | 9550 return object; |
9560 } | 9551 } |
9561 | 9552 |
9566 if(strcmp(signal->name, DW_SIGNAL_COLUMN_CLICK) == 0) | 9557 if(strcmp(signal->name, DW_SIGNAL_COLUMN_CLICK) == 0) |
9567 { | 9558 { |
9568 /* We don't actually need a signal handler here... just need to assign the handler ID | 9559 /* We don't actually need a signal handler here... just need to assign the handler ID |
9569 * Since the handlers for the columns were already created in _dw_container_setup() | 9560 * Since the handlers for the columns were already created in _dw_container_setup() |
9570 */ | 9561 */ |
9571 int sigid = _set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); | 9562 int sigid = _dw_set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); |
9572 g_object_set_data(object, "_dw_column_click_id", GINT_TO_POINTER(sigid+1)); | 9563 g_object_set_data(object, "_dw_column_click_id", GINT_TO_POINTER(sigid+1)); |
9573 return NULL; | 9564 return NULL; |
9574 } | 9565 } |
9575 else if(strcmp(signal->name, DW_SIGNAL_ITEM_SELECT) == 0) | 9566 else if(strcmp(signal->name, DW_SIGNAL_ITEM_SELECT) == 0) |
9576 { | 9567 { |
9599 if(GTK_IS_COMBO_BOX(object) && strcmp(signal->name, DW_SIGNAL_SET_FOCUS) == 0) | 9590 if(GTK_IS_COMBO_BOX(object) && strcmp(signal->name, DW_SIGNAL_SET_FOCUS) == 0) |
9600 return G_OBJECT(gtk_combo_box_get_child(GTK_COMBO_BOX(object))); | 9591 return G_OBJECT(gtk_combo_box_get_child(GTK_COMBO_BOX(object))); |
9601 return object; | 9592 return object; |
9602 } | 9593 } |
9603 | 9594 |
9595 #ifdef USE_WEBKIT | |
9604 GObject *_dw_html_setup(struct _dw_signal_list *signal, GObject *object, void *params[], void *sigfunc, void *discfunc, void *data) | 9596 GObject *_dw_html_setup(struct _dw_signal_list *signal, GObject *object, void *params[], void *sigfunc, void *discfunc, void *data) |
9605 { | 9597 { |
9606 #ifdef USE_WEBKIT | |
9607 if(WEBKIT_IS_WEB_VIEW(object) && strcmp(signal->name, DW_SIGNAL_HTML_RESULT) == 0) | 9598 if(WEBKIT_IS_WEB_VIEW(object) && strcmp(signal->name, DW_SIGNAL_HTML_RESULT) == 0) |
9608 { | 9599 { |
9609 /* We don't actually need a signal handler here... just need to assign the handler ID | 9600 /* We don't actually need a signal handler here... just need to assign the handler ID |
9610 * Since the handler is created in dw_html_javasript_run() | 9601 * Since the handler is created in dw_html_javasript_run() |
9611 */ | 9602 */ |
9612 int sigid = _set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); | 9603 int sigid = _dw_set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); |
9613 g_object_set_data(object, "_dw_html_result_id", GINT_TO_POINTER(sigid+1)); | 9604 g_object_set_data(object, "_dw_html_result_id", GINT_TO_POINTER(sigid+1)); |
9614 return NULL; | 9605 return NULL; |
9615 } | 9606 } |
9607 return object; | |
9608 } | |
9616 #endif | 9609 #endif |
9617 return object; | |
9618 } | |
9619 | 9610 |
9620 /* | 9611 /* |
9621 * Add a callback to a window event with a closure callback. | 9612 * Add a callback to a window event with a closure callback. |
9622 * Parameters: | 9613 * Parameters: |
9623 * window: Window handle of signal to be called back. | 9614 * window: Window handle of signal to be called back. |
9659 { | 9650 { |
9660 free(params); | 9651 free(params); |
9661 return; | 9652 return; |
9662 } | 9653 } |
9663 | 9654 |
9664 sigid = _set_signal_handler(object, window, sigfunc, data, signal.func, discfunc); | 9655 sigid = _dw_set_signal_handler(object, window, sigfunc, data, signal.func, discfunc); |
9665 params[0] = DW_INT_TO_POINTER(sigid); | 9656 params[0] = DW_INT_TO_POINTER(sigid); |
9666 params[2] = DW_POINTER(object); | 9657 params[2] = DW_POINTER(object); |
9667 cid = g_signal_connect_data(object, signal.gname, G_CALLBACK(signal.func), params, _dw_signal_disconnect, 0); | 9658 cid = g_signal_connect_data(object, signal.gname, G_CALLBACK(signal.func), params, _dw_signal_disconnect, 0); |
9668 _set_signal_handler_id(object, sigid, cid); | 9659 _dw_set_signal_handler_id(object, sigid, cid); |
9669 } | 9660 } |
9670 } | 9661 } |
9671 | 9662 |
9672 /* | 9663 /* |
9673 * Removes callbacks for a given window with given name. | 9664 * Removes callbacks for a given window with given name. |
9689 for(z=0;z<count;z++) | 9680 for(z=0;z<count;z++) |
9690 { | 9681 { |
9691 SignalHandler sh; | 9682 SignalHandler sh; |
9692 | 9683 |
9693 params[0] = GINT_TO_POINTER(z); | 9684 params[0] = GINT_TO_POINTER(z); |
9694 sh = _get_signal_handler(params); | 9685 sh = _dw_get_signal_handler(params); |
9695 | 9686 |
9696 if(sh.intfunc == signal.func) | 9687 if(sh.intfunc == signal.func) |
9697 _remove_signal_handler((HWND)params[2], z); | 9688 _dw_remove_signal_handler((HWND)params[2], z); |
9698 } | 9689 } |
9699 } | 9690 } |
9700 } | 9691 } |
9701 | 9692 |
9702 /* | 9693 /* |
9711 | 9702 |
9712 thiswindow = _find_signal_window(window, NULL); | 9703 thiswindow = _find_signal_window(window, NULL); |
9713 count = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(thiswindow), "_dw_sigcounter")); | 9704 count = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(thiswindow), "_dw_sigcounter")); |
9714 | 9705 |
9715 for(z=0;z<count;z++) | 9706 for(z=0;z<count;z++) |
9716 _remove_signal_handler(thiswindow, z); | 9707 _dw_remove_signal_handler(thiswindow, z); |
9717 g_object_set_data(G_OBJECT(thiswindow), "_dw_sigcounter", NULL); | 9708 g_object_set_data(G_OBJECT(thiswindow), "_dw_sigcounter", NULL); |
9718 } | 9709 } |
9719 | 9710 |
9720 /* | 9711 /* |
9721 * Removes all callbacks for a given window with specified data. | 9712 * Removes all callbacks for a given window with specified data. |
9734 for(z=0;z<count;z++) | 9725 for(z=0;z<count;z++) |
9735 { | 9726 { |
9736 SignalHandler sh; | 9727 SignalHandler sh; |
9737 | 9728 |
9738 params[0] = GINT_TO_POINTER(z); | 9729 params[0] = GINT_TO_POINTER(z); |
9739 sh = _get_signal_handler(params); | 9730 sh = _dw_get_signal_handler(params); |
9740 | 9731 |
9741 if(sh.data == data) | 9732 if(sh.data == data) |
9742 _remove_signal_handler((HWND)params[2], z); | 9733 _dw_remove_signal_handler((HWND)params[2], z); |
9743 } | 9734 } |
9744 } | 9735 } |
9745 | 9736 |
9746 /* | 9737 /* |
9747 * Converts a UTF-8 encoded string into a wide string. | 9738 * Converts a UTF-8 encoded string into a wide string. |