# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1612152442 0 # Node ID 1c52cd5a817fb3eddd1b6109fd56e7d054e8452a # Parent 819f2492c85febfce40d82c226197936bb994e55 GTK4: More refactoring, and started working on menus, but not entirely sure how it is going to work yet. diff -r 819f2492c85f -r 1c52cd5a817f dw.h --- a/dw.h Mon Feb 01 01:28:41 2021 +0000 +++ b/dw.h Mon Feb 01 04:07:22 2021 +0000 @@ -1301,7 +1301,7 @@ #endif } *HPIXMAP; -typedef GtkWidget *HMENUI; +typedef void *HMENUI; typedef void *HTREEITEM; typedef void *HSHM; typedef void *HICN; diff -r 819f2492c85f -r 1c52cd5a817f gtk4/dw.c --- a/gtk4/dw.c Mon Feb 01 01:28:41 2021 +0000 +++ b/gtk4/dw.c Mon Feb 01 04:07:22 2021 +0000 @@ -115,8 +115,8 @@ #define _DW_TREE_TYPE_COMBOBOX 4 /* Signal forwarder prototypes */ -static gint _dw_button_press_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data); -static gint _dw_button_release_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data); +static gint _dw_button_press_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data); +static gint _dw_button_release_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data); static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data); static gboolean _dw_delete_event(GtkWidget *window, gpointer data); static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); @@ -126,7 +126,7 @@ static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data); static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data); static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); -static gint _dw_tree_context_event(GtkWidget *widget, GdkEvent *event, gpointer data); +static gint _dw_tree_context_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data); static gint _dw_value_changed_event(GtkWidget *widget, gpointer user_data); static gint _dw_tree_select_event(GtkTreeSelection *sel, gpointer data); static gint _dw_tree_expand_event(GtkTreeView *treeview, GtkTreeIter *arg1, GtkTreePath *arg2, gpointer data); @@ -245,7 +245,7 @@ return empty; } -static SignalHandler _get_signal_handler(gpointer data) +static SignalHandler _dw_get_signal_handler(gpointer data) { SignalHandler sh = {0}; @@ -270,7 +270,7 @@ return sh; } -static void _remove_signal_handler(GtkWidget *widget, int counter) +static void _dw_remove_signal_handler(GtkWidget *widget, int counter) { char text[100]; gint cid; @@ -289,7 +289,7 @@ g_object_set_data(G_OBJECT(widget), text, NULL); } -static int _set_signal_handler(GObject *object, HWND window, void *func, gpointer data, void *intfunc, void *discfunc) +static int _dw_set_signal_handler(GObject *object, HWND window, void *func, gpointer data, void *intfunc, void *discfunc) { int counter = GPOINTER_TO_INT(g_object_get_data(object, "_dw_sigcounter")); char text[100]; @@ -311,7 +311,7 @@ return counter - 1; } -static void _set_signal_handler_id(GObject *object, int counter, gint cid) +static void _dw_set_signal_handler_id(GObject *object, int counter, gint cid) { char text[100]; @@ -320,7 +320,7 @@ } #ifdef USE_WEBKIT -static void _html_result_event(GObject *object, GAsyncResult *result, gpointer script_data) +static void _dw_html_result_event(GObject *object, GAsyncResult *result, gpointer script_data) { pthread_t saved_thread = _dw_thread; WebKitJavascriptResult *js_result; @@ -336,7 +336,7 @@ SignalHandler work; void *params[3] = { GINT_TO_POINTER(handlerdata-1), 0, object }; - work = _get_signal_handler(params); + work = _dw_get_signal_handler(params); if(work.window) { @@ -375,9 +375,9 @@ _dw_thread = saved_thread; } -static void _html_changed_event(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer data) -{ - SignalHandler work = _get_signal_handler(data); +static void _dw_html_changed_event(WebKitWebView *web_view, WebKitLoadEvent load_event, gpointer data) +{ + SignalHandler work = _dw_get_signal_handler(data); char *location = (char *)webkit_web_view_get_uri(web_view); int status = 0; @@ -406,7 +406,7 @@ static gint _dw_set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -418,46 +418,40 @@ return retval; } -static gint _dw_button_press_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data) -{ - SignalHandler work = _get_signal_handler(data); +static gint _dw_button_press_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data) +{ + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) { int (*buttonfunc)(HWND, int, int, int, void *) = work.func; - /* TODO: Fill these in */ - int mybutton = 1; - -#if GTK3 - if(event->button == 3) + int mybutton = gtk_gesture_single_get_current_button(gesture); + + if(mybutton == 3) mybutton = 2; - else if(event->button == 2) + else if(mybutton == 2) mybutton = 3; -#endif retval = buttonfunc(work.window, (int)x, (int)y, mybutton, work.data); } return retval; } -static gint _dw_button_release_event(GtkGestureClick *gesture, int n_press, double x, double y, gpointer data) -{ - SignalHandler work = _get_signal_handler(data); +static gint _dw_button_release_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data) +{ + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) { int (*buttonfunc)(HWND, int, int, int, void *) = work.func; - /* TODO: Fill these in */ - int mybutton = 1; - -#if GTK3 - if(event->button == 3) + int mybutton = gtk_gesture_single_get_current_button(gesture); + + if(mybutton == 3) mybutton = 2; - else if(event->button == 2) + else if(mybutton == 2) mybutton = 3; -#endif retval = buttonfunc(work.window, (int)x, (int)y, mybutton, work.data); } @@ -466,7 +460,7 @@ static gint _dw_motion_notify_event(GtkEventControllerMotion *controller, double x, double y, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -490,7 +484,7 @@ static gboolean _dw_delete_event(GtkWidget *window, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -504,7 +498,7 @@ static gint _dw_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -523,7 +517,7 @@ static gint _dw_generic_event(GtkWidget *widget, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -537,7 +531,7 @@ static gint _dw_configure_event(GtkWidget *widget, int width, int height, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -551,7 +545,7 @@ static gint _dw_expose_event(GtkWidget *widget, cairo_t *cr, int width, int height, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -569,7 +563,7 @@ static gint _dw_combobox_select_event(GtkWidget *widget, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(g_object_get_data(G_OBJECT(widget), "_dw_recursing")) @@ -613,22 +607,21 @@ #define _DW_DATA_TYPE_STRING 0 #define _DW_DATA_TYPE_POINTER 1 -static gint _dw_tree_context_event(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - SignalHandler work = _get_signal_handler(data); +static gint _dw_tree_context_event(GtkGestureSingle *gesture, int n_press, double x, double y, gpointer data) +{ + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) { - int button = 1; + int button = gtk_gesture_single_get_current_button(gesture); if(button == 3) { int (*contextfunc)(HWND, char *, int, int, void *, void *) = work.func; char *text = NULL; void *itemdata = NULL; - /* TODO: Fill these in */ - int x = 0, y = 0; + GtkWidget *widget = work.window; if(widget && GTK_IS_TREE_VIEW(widget)) { @@ -673,7 +666,7 @@ } } - retval = contextfunc(work.window, text, x, y, work.data, itemdata); + retval = contextfunc(work.window, text, (int)x, (int)y, work.data, itemdata); if(text) g_free(text); } @@ -688,7 +681,7 @@ if(widget) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); if(work.window) { @@ -780,7 +773,7 @@ static gint _dw_tree_expand_event(GtkTreeView *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(!_dw_ignore_expand && work.window) @@ -793,7 +786,7 @@ static gint _dw_container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window && GTK_IS_WIDGET(work.window)) @@ -858,7 +851,7 @@ static gint _dw_switch_page_event(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); int retval = FALSE; if(work.window) @@ -884,7 +877,7 @@ SignalHandler work; params[0] = GINT_TO_POINTER(handlerdata-1); - work = _get_signal_handler(params); + work = _dw_get_signal_handler(params); if(work.window) { @@ -928,7 +921,7 @@ if(slider || spinbutton || scrollbar) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); if (work.window) { @@ -2157,13 +2150,9 @@ */ HMENUI dw_menu_new(unsigned long id) { - HMENUI tmp = NULL; - -#if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */ - tmp = gtk_menu_new(); - gtk_widget_show(tmp); + HMENUI tmp = gtk_popover_menu_new_from_model_full(NULL, GTK_POPOVER_MENU_NESTED); + g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); -#endif return tmp; } @@ -2177,25 +2166,23 @@ HMENUI dw_menubar_new(HWND location) { HMENUI tmp = 0; -#if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */ GtkWidget *box; if(GTK_IS_WINDOW(location) && - (box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_grid"))) + (box = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_grid")))) { /* If there is an existing menu bar, remove it */ - GtkWidget *oldmenu = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_menubar"); + GtkWidget *oldmenu = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_menubar")); if(oldmenu && GTK_IS_WIDGET(oldmenu)) - g_object_unref(G_OBJECT(oldmenu)); + gtk_grid_remove(GTK_GRID(box), tmp); /* Create a new menu bar */ - tmp = gtk_menu_bar_new(); + tmp = gtk_popover_menu_bar_new_from_model(NULL); gtk_widget_show(tmp); /* Save pointers to each other */ g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location); gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1); } -#endif return tmp; } @@ -2206,21 +2193,25 @@ */ void dw_menu_destroy(HMENUI *menu) { -#if 0 /* TODO: Implement this with GMenuModel and GtkPopoverMenu */ if(menu && *menu) { GtkWidget *window; /* If it is a menu bar, try to delete the reference to it */ - if(GTK_IS_MENU_BAR(*menu) && - (window = (GtkWidget *)g_object_get_data(G_OBJECT(*menu), "_dw_window"))) + if(GTK_IS_POPOVER_MENU_BAR(*menu) && + (window = GTK_WIDGET(g_object_get_data(G_OBJECT(*menu), "_dw_window")))) g_object_set_data(G_OBJECT(window), "_dw_menubar", NULL); /* Actually destroy the menu */ if(GTK_IS_WIDGET(*menu)) - g_object_unref(G_OBJECT(*menu)); + { + GtkWidget *box = GTK_WIDGET(g_object_get_data(G_OBJECT(window), "_dw_grid")); + if(box && GTK_IS_GRID(box)) + gtk_grid_remove(GTK_GRID(box), GTK_WIDGET(*menu)); + else + g_object_unref(G_OBJECT(*menu)); + } *menu = NULL; } -#endif } /* @@ -9097,7 +9088,7 @@ WebKitWebView *web_view; if((web_view = _dw_html_web_view(handle))) - webkit_web_view_run_javascript(web_view, script, NULL, _html_result_event, scriptdata); + webkit_web_view_run_javascript(web_view, script, NULL, _dw_html_result_event, scriptdata); return DW_ERROR_NONE; #else return DW_ERROR_UNKNOWN; @@ -9482,7 +9473,7 @@ if(discfunc) { - SignalHandler work = _get_signal_handler(data); + SignalHandler work = _dw_get_signal_handler(data); if(work.window) { @@ -9553,7 +9544,7 @@ { /* TODO: Might need to use the disconnect paramater since this isn't a normal signal handler */ gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(object), signal->func, data, NULL); - _set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); + _dw_set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); return NULL; } return object; @@ -9568,7 +9559,7 @@ /* We don't actually need a signal handler here... just need to assign the handler ID * Since the handlers for the columns were already created in _dw_container_setup() */ - int sigid = _set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); + int sigid = _dw_set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); g_object_set_data(object, "_dw_column_click_id", GINT_TO_POINTER(sigid+1)); return NULL; } @@ -9601,21 +9592,21 @@ return object; } +#ifdef USE_WEBKIT GObject *_dw_html_setup(struct _dw_signal_list *signal, GObject *object, void *params[], void *sigfunc, void *discfunc, void *data) { -#ifdef USE_WEBKIT if(WEBKIT_IS_WEB_VIEW(object) && strcmp(signal->name, DW_SIGNAL_HTML_RESULT) == 0) { /* We don't actually need a signal handler here... just need to assign the handler ID * Since the handler is created in dw_html_javasript_run() */ - int sigid = _set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); + int sigid = _dw_set_signal_handler(object, (HWND)object, sigfunc, data, signal->func, discfunc); g_object_set_data(object, "_dw_html_result_id", GINT_TO_POINTER(sigid+1)); return NULL; } + return object; +} #endif - return object; -} /* * Add a callback to a window event with a closure callback. @@ -9661,11 +9652,11 @@ return; } - sigid = _set_signal_handler(object, window, sigfunc, data, signal.func, discfunc); + sigid = _dw_set_signal_handler(object, window, sigfunc, data, signal.func, discfunc); params[0] = DW_INT_TO_POINTER(sigid); params[2] = DW_POINTER(object); cid = g_signal_connect_data(object, signal.gname, G_CALLBACK(signal.func), params, _dw_signal_disconnect, 0); - _set_signal_handler_id(object, sigid, cid); + _dw_set_signal_handler_id(object, sigid, cid); } } @@ -9691,10 +9682,10 @@ SignalHandler sh; params[0] = GINT_TO_POINTER(z); - sh = _get_signal_handler(params); + sh = _dw_get_signal_handler(params); if(sh.intfunc == signal.func) - _remove_signal_handler((HWND)params[2], z); + _dw_remove_signal_handler((HWND)params[2], z); } } } @@ -9713,7 +9704,7 @@ count = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(thiswindow), "_dw_sigcounter")); for(z=0;z