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.