# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1612061680 0 # Node ID 7ac85e938b718ad80b25032c7194d4d499aafff8 # Parent bb0690c044132e3614b636bc97ada6dbf5e1237c GTK4: Don't try to link webkit on GTK4... it doesn't support it yet. Also fix various issues with fonts, signals and implement dialogs. diff -r bb0690c04413 -r 7ac85e938b71 configure --- a/configure Sat Jan 30 01:53:20 2021 +0000 +++ b/configure Sun Jan 31 02:54:40 2021 +0000 @@ -5515,20 +5515,22 @@ WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` fi else - WEBKIT_PKG="webkitgtk-3.0" - WEBKIT_CFLAGS=`$PKG_CFG --silence-errors --cflags $WEBKIT_PKG` - if test x"$WEBKIT_CFLAGS" = x; then - WEBKIT_PKG="webkitgtk-1.0" + if test $DW_DIR = "gtk3"; then + WEBKIT_PKG="webkitgtk-3.0" WEBKIT_CFLAGS=`$PKG_CFG --silence-errors --cflags $WEBKIT_PKG` if test x"$WEBKIT_CFLAGS" = x; then - $as_echo "#define USE_WEBKIT10 1" >>confdefs.h + WEBKIT_PKG="webkitgtk-1.0" + WEBKIT_CFLAGS=`$PKG_CFG --silence-errors --cflags $WEBKIT_PKG` + if test x"$WEBKIT_CFLAGS" = x; then + $as_echo "#define USE_WEBKIT10 1" >>confdefs.h + + WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` + fi + else + $as_echo "#define USE_WEBKIT11 1" >>confdefs.h WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` fi - else - $as_echo "#define USE_WEBKIT11 1" >>confdefs.h - - WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` fi fi else diff -r bb0690c04413 -r 7ac85e938b71 configure.in --- a/configure.in Sat Jan 30 01:53:20 2021 +0000 +++ b/configure.in Sun Jan 31 02:54:40 2021 +0000 @@ -249,18 +249,20 @@ WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` fi else - WEBKIT_PKG="webkitgtk-3.0" - WEBKIT_CFLAGS=`$PKG_CFG --silence-errors --cflags $WEBKIT_PKG` - if test x"$WEBKIT_CFLAGS" = x; then - WEBKIT_PKG="webkitgtk-1.0" + if test $DW_DIR = "gtk3"; then + WEBKIT_PKG="webkitgtk-3.0" WEBKIT_CFLAGS=`$PKG_CFG --silence-errors --cflags $WEBKIT_PKG` if test x"$WEBKIT_CFLAGS" = x; then - AC_DEFINE(USE_WEBKIT10) + WEBKIT_PKG="webkitgtk-1.0" + WEBKIT_CFLAGS=`$PKG_CFG --silence-errors --cflags $WEBKIT_PKG` + if test x"$WEBKIT_CFLAGS" = x; then + AC_DEFINE(USE_WEBKIT10) + WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` + fi + else + AC_DEFINE(USE_WEBKIT11) WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` fi - else - AC_DEFINE(USE_WEBKIT11) - WEBKIT_LIBS=`$PKG_CFG --silence-errors --libs $WEBKIT_PKG` fi fi else diff -r bb0690c04413 -r 7ac85e938b71 gtk4/dw.c --- a/gtk4/dw.c Sat Jan 30 01:53:20 2021 +0000 +++ b/gtk4/dw.c Sun Jan 31 02:54:40 2021 +0000 @@ -123,7 +123,7 @@ static gint _generic_event(GtkWidget *widget, gpointer data); static gint _configure_event(GtkWidget *widget, GdkEvent *event, gpointer data); static gint _activate_event(GtkWidget *widget, gpointer data); -static gint _container_enter_event(GtkWidget *widget, GdkEvent *event, gpointer data); +static gint _container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data); static gint _combobox_select_event(GtkWidget *widget, gpointer data); static gint _expose_event(GtkWidget *widget, cairo_t *cr, gpointer data); static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); @@ -796,17 +796,18 @@ return retval; } -static gint _container_enter_event(GtkWidget *widget, GdkEvent *event, gpointer data) +static gint _container_enter_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) { SignalHandler work = _get_signal_handler(data); int retval = FALSE; - if(work.window) - { + if(work.window && GTK_IS_WIDGET(work.window)) + { + GtkWidget *widget = work.window; + /* Handle both key and button events together */ - if(retval /* TODO: Fix this... - (event->type == GDK_2BUTTON_PRESS && buttonevent->button == 1) || - (event->type == GDK_KEY_PRESS && keyevent->keyval == VK_RETURN)*/) + if(/* TODO: Fix this...(event->type == GDK_2BUTTON_PRESS && buttonevent->button == 1) || */ + keyval == VK_RETURN) { int (*contextfunc)(HWND, char *, void *, void *) = work.func; char *text = NULL; @@ -947,13 +948,13 @@ return FALSE; } -static gint _default_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer data) +static gint _default_key_press_event(GtkEventControllerKey *controller, guint keyval, guint keycode, GdkModifierType state, gpointer data) { GtkWidget *next = (GtkWidget *)data; if(next) { - if(0 /* TODO: Fix this: event->keyval == GDK_KEY_Return*/) + if(keyval == GDK_KEY_Return) { if(GTK_IS_BUTTON(next)) g_signal_emit_by_name(G_OBJECT(next), "clicked"); @@ -964,6 +965,14 @@ return FALSE; } +static void _dw_dialog_response(GtkDialog *dialog, int response_id, gpointer data) +{ + DWDialog *dwdialog = (DWDialog *)data; + + if(dwdialog) + dw_dialog_dismiss(dwdialog, DW_INT_TO_POINTER(response_id)); +} + static GdkPixbuf *_dw_pixbuf_from_resource(unsigned int rid) { char resource_path[201] = {0}; @@ -1219,7 +1228,7 @@ else dw_event_post(dialog->eve); dialog->done = TRUE; - return 0; + return DW_ERROR_NONE; } /* @@ -1235,7 +1244,7 @@ if(!dialog) return NULL; - if(pthread_self() == _dw_thread) + if(_dw_thread == (pthread_t)-1 || pthread_self() == _dw_thread) { dialog->method = TRUE; g_main_loop_run(_DWMainLoop); @@ -1313,7 +1322,7 @@ if(flags & DW_MB_YESNOCANCEL) gtk_dialog_add_button(GTK_DIALOG(dialog), "Cancel", GTK_RESPONSE_CANCEL); gtk_widget_show(GTK_WIDGET(dialog)); - /* TODO: Implement signal handlers so this will return */ + g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(_dw_dialog_response), (gpointer)tmp); response = DW_POINTER_TO_INT(dw_dialog_wait(tmp)); if(GTK_IS_WINDOW(dialog)) gtk_window_destroy(GTK_WINDOW(dialog)); @@ -1690,8 +1699,8 @@ } gtk_widget_show(GTK_WIDGET(fd)); - - /* TODO: Connect signal handlers so this actually returns */ + g_signal_connect(G_OBJECT(fd), "response", G_CALLBACK(_dw_dialog_response), (gpointer)tmp); + if(DW_POINTER_TO_INT(dw_dialog_wait(tmp)) == GTK_RESPONSE_OK) { char *fontname = gtk_font_chooser_get_font(fd); @@ -1753,11 +1762,11 @@ handle2 = tmp; } - pcontext = gtk_widget_get_pango_context( handle2 ); - if ( pcontext ) - { - pfont = pango_context_get_font_description( pcontext ); - if ( pfont ) + pcontext = gtk_widget_get_pango_context(handle2); + if(pcontext) + { + pfont = pango_context_get_font_description(pcontext); + if(pfont) { int len, x; @@ -1785,7 +1794,7 @@ snprintf(retfont, len+1, "%d.%s", size, font); } } - g_free( font ); + g_free(font); } } return retfont; @@ -5426,6 +5435,7 @@ gtk_color_chooser_set_rgba(cd, &color); gtk_widget_show(GTK_WIDGET(cd)); + g_signal_connect(G_OBJECT(cd), "response", G_CALLBACK(_dw_dialog_response), (gpointer)tmp); if(DW_POINTER_TO_INT(dw_dialog_wait(tmp)) == GTK_RESPONSE_OK) { @@ -5894,7 +5904,7 @@ font = pango_font_description_from_string(fontname ? fontname : "monospace 10"); if(font) { - PangoContext *context = pango_context_new(); + PangoContext *context = gtk_widget_get_pango_context(pixmap ? pixmap->handle : handle); if(context) { @@ -7244,8 +7254,8 @@ gtk_widget_set_valign(item, vsize ? GTK_ALIGN_FILL : GTK_ALIGN_START); gtk_widget_set_hexpand(item, hsize); gtk_widget_set_halign(item, hsize ? GTK_ALIGN_FILL : GTK_ALIGN_START); - /* Use the margin property as padding */ - g_object_set(G_OBJECT(item), "margin", pad, NULL); + /* TODO: Use the margin property as padding + g_object_set(G_OBJECT(item), "margin", pad, NULL);*/ /* Add to the grid using insert... * rows for vertical boxes and columns for horizontal. */ @@ -8676,10 +8686,12 @@ */ void dw_window_click_default(HWND window, HWND next) { - if(!window) - return; - - g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(_default_key_press_event), next); + if(window && next && GTK_IS_WIDGET(window) && GTK_IS_WIDGET(next)) + { + GtkEventController *controller = gtk_event_controller_key_new(); + gtk_widget_add_controller(GTK_WIDGET(window), controller); + g_signal_connect(G_OBJECT(controller), "key-pressed", G_CALLBACK(_default_key_press_event), next); + } } @@ -8876,7 +8888,9 @@ } } - /* TODO: Connect signal handlers so this actually returns */ + gtk_widget_show(GTK_WIDGET(filew)); + g_signal_connect(G_OBJECT(filew), "response", G_CALLBACK(_dw_dialog_response), (gpointer)tmp); + if(DW_POINTER_TO_INT(dw_dialog_wait(tmp)) == GTK_RESPONSE_ACCEPT) { GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(filew)); @@ -9545,6 +9559,7 @@ #endif else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0) { + //GtkGesture *gesture = gtk_gesture_click_new(); sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc, discfunc); params[0] = GINT_TO_POINTER(sigid); params[2] = (void *)thiswindow; @@ -9580,10 +9595,12 @@ } else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0) { + GtkEventController *controller = gtk_event_controller_key_new(); sigid = _set_signal_handler(thiswindow, window, sigfunc, data, _container_enter_event, discfunc); params[0] = GINT_TO_POINTER(sigid); params[2] = (void *)thiswindow; - cid = g_signal_connect_data(G_OBJECT(thiswindow), "key_press_event", G_CALLBACK(_container_enter_event), params, _dw_signal_disconnect, 0); + gtk_widget_add_controller(GTK_WIDGET(thiswindow), controller); + cid = g_signal_connect_data(G_OBJECT(controller), "key-pressed", G_CALLBACK(_container_enter_event), params, _dw_signal_disconnect, 0); _set_signal_handler_id(thiswindow, sigid, cid); params = calloc(sizeof(void *), _DW_INTERNAL_CALLBACK_PARAMS);