changeset 2267:7ac85e938b71

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.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 31 Jan 2021 02:54:40 +0000
parents bb0690c04413
children fefeb5b4e512
files configure configure.in gtk4/dw.c
diffstat 3 files changed, 67 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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);