gimp r25913 - in trunk: . plug-ins/help-browser



Author: neo
Date: Tue Jun 10 15:55:28 2008
New Revision: 25913
URL: http://svn.gnome.org/viewvc/gimp?rev=25913&view=rev

Log:
2008-06-10  Sven Neumann  <sven gimp org>

	* configure.in: removed check for gtkhtml2 and added a check for
	wekbit instead.

	* INSTALL: document the changed dependency.

	* plug-ins/help-browser/Makefile.am
	* plug-ins/help-browser/dialog.[ch]: ported the help-browser to
	webkit. Offers the same functionality as before and some more.

	* plug-ins/help-browser/help-browser.c: some cleanup.


Modified:
   trunk/ChangeLog
   trunk/INSTALL
   trunk/configure.in
   trunk/plug-ins/help-browser/Makefile.am
   trunk/plug-ins/help-browser/dialog.c
   trunk/plug-ins/help-browser/dialog.h
   trunk/plug-ins/help-browser/help-browser.c

Modified: trunk/INSTALL
==============================================================================
--- trunk/INSTALL	(original)
+++ trunk/INSTALL	Tue Jun 10 15:55:28 2008
@@ -56,7 +56,7 @@
   7. You may want to install other third party libraries or programs
      that are needed for some of the available plugins. We recommend
      to check that the following libraries are installed: libpng,
-     libjpeg, libpoppler, libtiff, gtkhtml-2, libmng, librsvg, libwmf.
+     libjpeg, libpoppler, libtiff, webkit, libmng, librsvg, libwmf.
 
   8. The Python extension requires Python development headers to be
      present. You will also need PyGTK and the respective development
@@ -150,8 +150,8 @@
      use --without-mng to disable it expliticely. The same switch exists
      for aalib, use --without-aa if you run into problems.
 
-  --without-gtkhtml2.  If for some reason you don't want to build the 
-     helpbrowser plug-in, you can use --without-gtkhtml2 to disable 
+  --without-webkit.  If for some reason you don't want to build the 
+     helpbrowser plug-in, you can use --without-webkit to disable 
      it explicitly.
 
   --without-svg.  If for some reason you want to build GIMP without 

Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in	(original)
+++ trunk/configure.in	Tue Jun 10 15:55:28 2008
@@ -49,7 +49,7 @@
 m4_define([fontconfig_required_version], [2.2.0])
 m4_define([cairo_required_version], [1.4.10])
 m4_define([gtkdoc_required_version], [1.0])
-m4_define([gtkhtml2_required_version], [2.0.0])
+m4_define([webkit_required_version], [0.1])
 m4_define([alsa_required_version], [1.0.0])
 m4_define([rsvg_required_version], [2.14.0])
 m4_define([wmf_required_version], [0.2.8])
@@ -1202,23 +1202,29 @@
 AC_SUBST(LIBXPM)
 
 
-####################
-# Check for gtkhtml2
-####################
+######################
+# Check for webkit-1.0
+######################
 
-AC_ARG_WITH(gtkhtml2, [  --without-gtkhtml2      build without gtkhtml2 support])
+AC_ARG_WITH(webkit, [  --without-webkit        don't build the help-browser plug-in])
 
-have_gtkhtml2=no
-if test "x$with_gtkhtml2" != xno; then
-  PKG_CHECK_MODULES(GTKHTML2, libgtkhtml-2.0 >= gtkhtml2_required_version,
-    have_gtkhtml2=yes,
+have_webkit=no
+if test "x$with_webkit" != xno; then
+  PKG_CHECK_MODULES(WEBKIT, webkit-1.0 >= webkit_required_version,
+    have_webkit=yes,
     AC_MSG_RESULT([no])
-    have_gtkhtml2="no (GtkHtml2 not found)")
+    have_webkit="no (WebKit not found)")
 else
-  have_gtkhtml2="no (GtkHtml2 support disabled)"
+  have_webkit="no (WebKit support disabled)"
+fi
+
+if test "x$have_webkit" = xyes; then
+  AC_CHECK_LIB(webkit-1.0, webkit_web_view_set_zoom_level,
+               [AC_DEFINE(HAVE_WEBKIT_ZOOM_API, 1,
+	                  [Define to 1 if webkit has zoom API])])
 fi
 
-AM_CONDITIONAL(BUILD_HELP_BROWSER, test "x$have_gtkhtml2" = xyes)
+AM_CONDITIONAL(BUILD_HELP_BROWSER, test "x$have_webkit" = xyes)
 
 
 ###################
@@ -2095,7 +2101,7 @@
 
 Optional Plug-Ins:
   Ascii Art:           $have_libaa
-  Help Browser:        $have_gtkhtml2
+  Help Browser:        $have_webkit
   LCMS:                $have_lcms
   JPEG:                $jpeg_ok
   MNG:                 $have_libmng

Modified: trunk/plug-ins/help-browser/Makefile.am
==============================================================================
--- trunk/plug-ins/help-browser/Makefile.am	(original)
+++ trunk/plug-ins/help-browser/Makefile.am	Tue Jun 10 15:55:28 2008
@@ -1,13 +1,14 @@
 ## Process this file with automake to produce Makefile.in
 
-libgimphelp = $(top_builddir)/plug-ins/help/libgimphelp.a
-libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la
-libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la
-libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la
 libgimp = $(top_builddir)/libgimp/libgimp-$(GIMP_API_VERSION).la
-libgimpcolor = $(top_builddir)/libgimpcolor/libgimpcolor-$(GIMP_API_VERSION).la
 libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la
+libgimpcolor = $(top_builddir)/libgimpcolor/libgimpcolor-$(GIMP_API_VERSION).la
+libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la
 libgimpmath = $(top_builddir)/libgimpmath/libgimpmath-$(GIMP_API_VERSION).la
+libgimpui = $(top_builddir)/libgimp/libgimpui-$(GIMP_API_VERSION).la
+libgimpwidgets = $(top_builddir)/libgimpwidgets/libgimpwidgets-$(GIMP_API_VERSION).la
+
+libgimphelp = $(top_builddir)/plug-ins/help/libgimphelp.a
 
 if OS_WIN32
 mwindows = -mwindows
@@ -21,7 +22,7 @@
 
 INCLUDES = \
 	-I$(top_srcdir)		\
-	$(GTKHTML2_CFLAGS)	\
+	$(WEBKIT_CFLAGS)	\
 	-I$(includedir)
 
 LDADD = \
@@ -33,7 +34,7 @@
 	$(libgimpcolor)		\
 	$(libgimpmath)		\
 	$(libgimpbase)		\
-	$(GTKHTML2_LIBS)	\
+	$(WEBKIT_LIBS)		\
 	$(GIO_LIBS)		\
 	$(RT_LIBS)		\
 	$(INTLLIBS)
@@ -46,8 +47,6 @@
 	help-browser.c		\
 	dialog.c		\
 	dialog.h		\
-	queue.c			\
-	queue.h			\
 	uri.c			\
 	uri.h
 

Modified: trunk/plug-ins/help-browser/dialog.c
==============================================================================
--- trunk/plug-ins/help-browser/dialog.c	(original)
+++ trunk/plug-ins/help-browser/dialog.c	Tue Jun 10 15:55:28 2008
@@ -2,7 +2,7 @@
  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  *
  * GIMP Help Browser
- * Copyright (C) 1999-2005 Sven Neumann <sven gimp org>
+ * Copyright (C) 1999-2008 Sven Neumann <sven gimp org>
  *                         Michael Natterer <mitch gimp org>
  *
  * dialog.c
@@ -24,8 +24,10 @@
 
 #include "config.h"
 
+#include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -34,9 +36,7 @@
 
 #include <gtk/gtk.h>
 
-#undef GDK_PIXBUF_DISABLE_SINGLE_INCLUDES
-#include <libgtkhtml/gtkhtml.h>
-#define GDK_PIXBUF_DISABLE_SINGLE_INCLUDES
+#include <webkit/webkit.h>
 
 #include "libgimpwidgets/gimpwidgets.h"
 
@@ -53,7 +53,6 @@
 #include "gimpthrobberaction.h"
 
 #include "dialog.h"
-#include "queue.h"
 #include "uri.h"
 
 #include "logo-pixbuf.h"
@@ -84,14 +83,15 @@
 /*  local function prototypes  */
 
 static GtkUIManager * ui_manager_new (GtkWidget         *window);
-static void       browser_dialog_404 (HtmlDocument      *doc,
-                                      const gchar       *uri,
-                                      const gchar       *message);
 
 static void       back_callback      (GtkAction         *action,
                                       gpointer           data);
 static void       forward_callback   (GtkAction         *action,
                                       gpointer           data);
+static void       reload_callback    (GtkAction         *action,
+                                      gpointer           data);
+static void       stop_callback      (GtkAction         *action,
+                                      gpointer           data);
 static void       index_callback     (GtkAction         *action,
                                       gpointer           data);
 static void       zoom_in_callback   (GtkAction         *action,
@@ -100,10 +100,10 @@
                                       gpointer           data);
 static void       close_callback     (GtkAction         *action,
                                       gpointer           data);
-static void       online_callback    (GtkAction         *action,
+static void       website_callback   (GtkAction         *action,
                                       gpointer           data);
 
-static void       update_toolbar     (void);
+static void       update_actions     (void);
 
 static void       combo_changed      (GtkWidget         *widget,
                                       gpointer           data);
@@ -131,45 +131,33 @@
 static gboolean   view_button_press  (GtkWidget         *widget,
                                       GdkEventButton    *event);
 
-static void       title_changed      (HtmlDocument      *doc,
-                                      const gchar       *new_title,
-                                      gpointer           data);
-static void       link_clicked       (HtmlDocument      *doc,
-                                      const gchar       *uri,
-                                      gpointer           data);
-static gboolean   request_url        (HtmlDocument      *doc,
-                                      const gchar       *uri,
-                                      HtmlStream        *stream,
-                                      GError            **error);
-static gboolean   io_handler         (GIOChannel        *io,
-                                      GIOCondition       condition,
-                                      gpointer           data);
-static void       load_remote_page   (const gchar       *uri);
+static void       title_changed      (GtkWidget         *view,
+                                      WebKitWebFrame    *frame,
+                                      const gchar       *title,
+                                      GtkWidget         *combo);
+static void       load_started       (GtkWidget         *view,
+                                      WebKitWebFrame    *frame);
+static void       load_finished      (GtkWidget         *view,
+                                      WebKitWebFrame    *frame);
+
+static void       select_index       (const gchar       *uri);
 
 static void       history_add        (GtkComboBox       *combo,
                                       const gchar       *uri,
                                       const gchar       *title);
 
-static gboolean   has_case_prefix    (const gchar       *haystack,
-                                      const gchar       *needle);
-
-static gchar    * filename_from_uri  (const gchar       *uri);
 
 
 /*  private variables  */
 
-static const gchar   *eek_png_tag    = "<h1>Eeek!</h1>";
+static GHashTable   *uri_hash_table = NULL;
 
-static Queue         *queue          = NULL;
-static gchar         *current_uri    = NULL;
-static GHashTable    *uri_hash_table = NULL;
-
-static GtkWidget     *html           = NULL;
-static GtkWidget     *tree_view      = NULL;
-static GtkUIManager  *ui_manager     = NULL;
-static GtkWidget     *button_prev    = NULL;
-static GtkWidget     *button_next    = NULL;
-static GdkCursor     *busy_cursor    = NULL;
+static GtkWidget    *view           = NULL;
+static GtkWidget    *tree_view      = NULL;
+static GtkUIManager *ui_manager     = NULL;
+static GtkWidget    *button_prev    = NULL;
+static GtkWidget    *button_next    = NULL;
+static GdkCursor    *busy_cursor    = NULL;
 
 static const GtkTargetEntry help_dnd_target_table[] =
 {
@@ -188,7 +176,7 @@
   GtkWidget       *toolbar;
   GtkWidget       *paned;
   GtkWidget       *hbox;
-  GtkWidget       *scroll;
+  GtkWidget       *scrolled;
   GtkWidget       *drag_source;
   GtkWidget       *image;
   GtkWidget       *combo;
@@ -198,22 +186,12 @@
   GtkListStore    *history;
   GtkCellRenderer *cell;
   GdkPixbuf       *pixbuf;
-  gchar           *eek_png_path;
   DialogData       data = { 720, 560, 240, 1.0 };
 
   gimp_ui_init ("helpbrowser", TRUE);
 
   gimp_get_data (GIMP_HELP_BROWSER_DIALOG_DATA, &data);
 
-  eek_png_path = g_build_filename (gimp_data_directory (),
-                                   "themes", "Default", "images",
-                                   "stock-wilber-eek-64.png", NULL);
-
-  if (g_file_test (eek_png_path, G_FILE_TEST_EXISTS))
-    eek_png_tag = g_strdup_printf ("<img src=\"%s\">", eek_png_path);
-
-  g_free (eek_png_path);
-
   /*  the dialog window  */
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_window_set_title (GTK_WINDOW (window), _("GIMP Help Browser"));
@@ -266,7 +244,7 @@
   gtk_tool_item_set_expand (item, TRUE);
 
   button = gtk_ui_manager_get_widget (ui_manager,
-                                      "/help-browser-toolbar/online");
+                                      "/help-browser-toolbar/website");
   gimp_throbber_set_image (GIMP_THROBBER (button),
                            gtk_image_new_from_pixbuf (pixbuf));
 
@@ -275,16 +253,16 @@
   gtk_box_pack_start (GTK_BOX (vbox), paned, TRUE, TRUE, 0);
   gtk_widget_show (paned);
 
-  scroll = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+  scrolled = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_paned_add1 (GTK_PANED (paned), scroll);
+  gtk_paned_add1 (GTK_PANED (paned), scrolled);
   gtk_paned_set_position (GTK_PANED (paned), data.paned_position);
-  gtk_widget_show (scroll);
+  gtk_widget_show (scrolled);
 
   tree_view = gtk_tree_view_new ();
   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
-  gtk_container_add (GTK_CONTAINER (scroll), tree_view);
+  gtk_container_add (GTK_CONTAINER (scrolled), tree_view);
   gtk_widget_show (tree_view);
 
   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), -1,
@@ -350,176 +328,65 @@
                     NULL);
 
   /*  HTML view  */
-  html  = html_view_new ();
-  queue = queue_new ();
-
-  gtk_widget_set_size_request (html, 300, 200);
-
-  scroll =
-    gtk_scrolled_window_new (gtk_layout_get_hadjustment (GTK_LAYOUT (html)),
-                             gtk_layout_get_vadjustment (GTK_LAYOUT (html)));
-
-  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll),
+  scrolled = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-  gtk_box_pack_start (GTK_BOX (vbox), scroll, TRUE, TRUE, 0);
-  gtk_widget_show (scroll);
 
-  gtk_container_add (GTK_CONTAINER (scroll), html);
-  gtk_widget_show (html);
+  gtk_widget_set_size_request (scrolled, 300, 200);
+  gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0);
+  gtk_widget_show (scrolled);
+
+  view = webkit_web_view_new ();
+  webkit_web_view_set_maintains_back_forward_list (WEBKIT_WEB_VIEW (view),
+                                                   TRUE);
+  gtk_container_add (GTK_CONTAINER (scrolled), view);
+  gtk_widget_show (view);
 
-  g_signal_connect (html, "realize",
+  g_signal_connect (view, "realize",
                     G_CALLBACK (view_realize),
                     NULL);
-  g_signal_connect (html, "unrealize",
+  g_signal_connect (view, "unrealize",
                     G_CALLBACK (view_unrealize),
                     NULL);
 
-  g_signal_connect (html, "popup-menu",
+  g_signal_connect (view, "popup-menu",
                     G_CALLBACK (view_popup_menu),
                     NULL);
-  g_signal_connect (html, "button-press-event",
+  g_signal_connect (view, "button-press-event",
                     G_CALLBACK (view_button_press),
                     NULL);
 
-  html_view_set_magnification (HTML_VIEW (html), data.zoom);
-  html_view_set_document (HTML_VIEW (html), html_document_new ());
+#if HAVE_WEBKIT_ZOOM_API
+  webkit_web_view_set_zoom_level (WEBKIT_WEB_VIEW (view), data.zoom);
+#endif
 
-  g_signal_connect (HTML_VIEW (html)->document, "title-changed",
+  g_signal_connect (view, "title-changed",
                     G_CALLBACK (title_changed),
                     combo);
-  g_signal_connect (HTML_VIEW (html)->document, "link-clicked",
-                    G_CALLBACK (link_clicked),
+  g_signal_connect (view, "load-started",
+                    G_CALLBACK (load_started),
                     NULL);
-  g_signal_connect (HTML_VIEW (html)->document, "request-url",
-                    G_CALLBACK (request_url),
+  g_signal_connect (view, "load-finished",
+                    G_CALLBACK (load_finished),
                     NULL);
 
-  gtk_widget_grab_focus (html);
+  gtk_widget_grab_focus (view);
 
   g_signal_connect (window, "unmap",
                     G_CALLBACK (dialog_unmap),
                     paned);
 }
 
-static gboolean
-idle_jump_to_anchor (const gchar *anchor)
-{
-  if (html && anchor)
-    html_view_jump_to_anchor (HTML_VIEW (html), anchor);
-
-  return FALSE;
-}
-
-static gboolean
-idle_scroll_to_pos (gpointer data)
-{
-  gint offset = GPOINTER_TO_INT (data);
-
-  if (html)
-    {
-      GtkAdjustment *adj = gtk_layout_get_vadjustment (GTK_LAYOUT (html));
-
-      gtk_adjustment_set_value (adj,
-                                (gdouble) offset / (1 << 16) * adj->upper);
-    }
-
-  return FALSE;
-}
-
 void
-browser_dialog_load (const gchar *uri,
-                     gboolean     add_to_queue)
+browser_dialog_load (const gchar *uri)
 {
-  HtmlDocument  *doc = HTML_VIEW (html)->document;
-  GtkAdjustment *adj = gtk_layout_get_vadjustment (GTK_LAYOUT (html));
-  gchar         *abs;
-  gchar         *new_uri;
-  gchar         *anchor;
-  gchar         *tmp;
-
   g_return_if_fail (uri != NULL);
 
-  if (! current_uri)
-    {
-      gchar *slash;
-
-      current_uri = g_strdup (uri);
-
-      slash = strrchr (current_uri, '/');
-
-      if (slash)
-        *slash = '\0';
-    }
-
-  abs = uri_to_abs (uri, current_uri);
-  if (! abs)
-    return;
+  webkit_web_view_open (WEBKIT_WEB_VIEW (view), uri);
 
-  anchor = strchr (uri, '#');
-  if (anchor && anchor[0] && anchor[1])
-    {
-      new_uri = g_strconcat (abs, anchor, NULL);
-      anchor += 1;
-    }
-  else
-    {
-      new_uri = g_strdup (abs);
-      anchor = NULL;
-    }
+  select_index (uri);
 
-  if (uri_hash_table)
-    browser_dialog_goto_index (new_uri);
-
-  if (! has_case_prefix (abs, "file:/"))
-    {
-      load_remote_page (uri);
-      return;
-    }
-
-  tmp = uri_to_abs (current_uri, current_uri);
-  if (!tmp || strcmp (tmp, abs))
-    {
-      GError *error = NULL;
-
-      html_document_clear (doc);
-      html_document_open_stream (doc, "text/html");
-      gtk_adjustment_set_value (adj, 0.0);
-
-      if (anchor)
-        g_idle_add_full (G_PRIORITY_LOW,
-                         (GSourceFunc) idle_jump_to_anchor,
-                         g_strdup (anchor), (GDestroyNotify) g_free);
-
-      if (request_url (doc, abs, doc->current_stream, &error))
-        {
-          if (html->window)
-            gdk_window_set_cursor (html->window, busy_cursor);
-        }
-      else
-        {
-          browser_dialog_404 (doc, abs, error->message);
-          g_error_free (error);
-        }
-    }
-  else
-    {
-      if (anchor)
-        html_view_jump_to_anchor (HTML_VIEW (html), anchor);
-      else
-        gtk_adjustment_set_value (adj, 0.0);
-     }
-
-  g_free (tmp);
-
-  g_free (current_uri);
-  current_uri = new_uri;
-
-  if (add_to_queue)
-    queue_add (queue, new_uri);
-
-  update_toolbar ();
-
-  gtk_window_present (GTK_WINDOW (gtk_widget_get_toplevel (html)));
+  gtk_window_present (GTK_WINDOW (gtk_widget_get_toplevel (view)));
 }
 
 static void
@@ -657,25 +524,25 @@
       add_child (store, domain, locale, NULL, item);
     }
 
-  gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view),
-                           GTK_TREE_MODEL (store));
+  gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (store));
   g_object_unref (store);
 }
 
-void
-browser_dialog_goto_index (const gchar *ref)
+static void
+select_index (const gchar *uri)
 {
-  GtkTreeIter *iter = g_hash_table_lookup (uri_hash_table, ref);
+  GtkTreeSelection *selection;
+  GtkTreeIter      *iter;
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
+
+  iter = g_hash_table_lookup (uri_hash_table, uri);
 
   if (iter)
     {
-      GtkTreeSelection *selection;
-      GtkTreeModel     *model;
-      GtkTreePath      *path;
-      GtkTreePath      *scroll_path;
-
-      selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
-      model     = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
+      GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
+      GtkTreePath  *path;
+      GtkTreePath  *scroll_path;
 
       path = gtk_tree_model_get_path (model, iter);
       scroll_path = gtk_tree_path_copy (path);
@@ -690,6 +557,10 @@
 
       gtk_tree_selection_select_iter (selection, iter);
     }
+  else
+    {
+      gtk_tree_selection_unselect_all (selection);
+    }
 }
 
 
@@ -716,6 +587,16 @@
       G_CALLBACK (index_callback)
     },
     {
+      "reload", GTK_STOCK_REFRESH,
+       N_("Reload"), "<control>R", N_("Reload current page"),
+      G_CALLBACK (reload_callback)
+    },
+    {
+      "stop", GTK_STOCK_CANCEL,
+       N_("Stop"), "Escape", N_("Stop loading this page"),
+      G_CALLBACK (stop_callback)
+    },
+    {
       "zoom-in", GTK_STOCK_ZOOM_IN,
       NULL, "<control>plus", NULL,
       G_CALLBACK (zoom_in_callback)
@@ -745,12 +626,12 @@
   gtk_action_group_set_translation_domain (group, NULL);
   gtk_action_group_add_actions (group, actions, G_N_ELEMENTS (actions), NULL);
 
-  action = gimp_throbber_action_new ("online",
+  action = gimp_throbber_action_new ("website",
                                      "docs.gimp.org",
                                      _("Visit the GIMP documentation website"),
                                      GIMP_STOCK_WILBER);
   g_signal_connect_closure (action, "activate",
-                            g_cclosure_new (G_CALLBACK (online_callback),
+                            g_cclosure_new (G_CALLBACK (website_callback),
                                             NULL, NULL),
                             FALSE);
   gtk_action_group_add_action (group, action);
@@ -766,9 +647,11 @@
   gtk_ui_manager_add_ui_from_string (ui_manager,
                                      "<ui>"
                                      "  <toolbar name=\"help-browser-toolbar\">"
+                                     "    <toolitem action=\"reload\" />"
+                                     "    <toolitem action=\"stop\" />"
                                      "    <toolitem action=\"index\" />"
                                      "    <separator name=\"space\" />"
-                                     "    <toolitem action=\"online\" />"
+                                     "    <toolitem action=\"website\" />"
                                      "  </toolbar>"
                                      "  <accelerator action=\"close\" />"
                                      "  <accelerator action=\"quit\" />"
@@ -786,10 +669,14 @@
                                      "  <popup name=\"help-browser-popup\">"
                                      "    <menuitem action=\"back\" />"
                                      "    <menuitem action=\"forward\" />"
+                                     "    <menuitem action=\"reload\" />"
+                                     "    <menuitem action=\"stop\" />"
                                      "    <menuitem action=\"index\" />"
+#ifdef HAVE_WEBKIT_ZOOM_API
                                      "    <separator />"
                                      "    <menuitem action=\"zoom-in\" />"
                                      "    <menuitem action=\"zoom-out\" />"
+#endif
                                      "    <separator />"
                                      "    <menuitem action=\"close\" />"
                                      "  </popup>"
@@ -806,132 +693,120 @@
 }
 
 static void
-browser_dialog_404 (HtmlDocument *doc,
-                    const gchar  *uri,
-                    const gchar  *message)
-{
-  gchar *msg = g_strdup_printf
-    ("<html>"
-     "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />"
-     "<head><title>%s</title></head>"
-     "<body bgcolor=\"white\">"
-     "<div align=\"center\">"
-     "<div>%s</div>"
-     "<h3>%s</h3>"
-     "<tt>%s</tt>"
-     "<h3>%s</h3>"
-     "</div>"
-     "</body>"
-     "</html>",
-     _("Document not found"),
-     eek_png_tag,
-     _("The requested URL could not be loaded:"),
-     uri,
-     message);
-
-  html_document_write_stream (doc, msg, strlen (msg));
-
-  g_free (msg);
-}
-
-static void
 back_callback (GtkAction *action,
                gpointer   data)
 {
-  gdouble      pos;
-  const gchar *uri = queue_prev (queue, GPOINTER_TO_INT (data), &pos);
-
-  if (uri)
-    {
-      browser_dialog_load (uri, FALSE);
-
-      g_idle_add ((GSourceFunc) idle_scroll_to_pos,
-                  GINT_TO_POINTER ((gint) (pos * (1 << 16))));
-
-      queue_move_prev (queue, GPOINTER_TO_INT (data));
-    }
-
-  update_toolbar ();
+  webkit_web_view_go_back (WEBKIT_WEB_VIEW (view));
 }
 
 static void
 forward_callback (GtkAction *action,
                   gpointer   data)
 {
-  gdouble      pos;
-  const gchar *uri = queue_next (queue, GPOINTER_TO_INT (data), &pos);
-
-  if (uri)
-    {
-      browser_dialog_load (uri, FALSE);
-
-      g_idle_add ((GSourceFunc) idle_scroll_to_pos,
-                  GINT_TO_POINTER ((gint) (pos * (1 << 16))));
+  webkit_web_view_go_forward (WEBKIT_WEB_VIEW (view));
+}
 
-      queue_move_next (queue, GPOINTER_TO_INT (data));
-    }
+static void
+reload_callback (GtkAction *action,
+                 gpointer   data)
+{
+  webkit_web_view_reload (WEBKIT_WEB_VIEW (view));
+}
 
-  update_toolbar ();
+static void
+stop_callback (GtkAction *action,
+               gpointer   data)
+{
+  webkit_web_view_stop_loading (WEBKIT_WEB_VIEW (view));
 }
 
 static void
 index_callback (GtkAction *action,
                 gpointer   data)
 {
-  browser_dialog_load ("index.html", TRUE);
+  GtkTreeModel   *model  = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
+  GimpHelpDomain *domain = g_object_get_data (G_OBJECT (model), "domain");
+  GimpHelpLocale *locale = g_object_get_data (G_OBJECT (model), "locale");
+
+  if (domain && locale)
+    {
+      gchar *uri = g_strconcat (domain->help_uri,  "/",
+                                locale->locale_id, "/",
+                                gimp_help_locale_map (locale,
+                                                      GIMP_HELP_DEFAULT_ID),
+                                NULL);
+      browser_dialog_load (uri);
+      g_free (uri);
+    }
 }
 
 static void
 zoom_in_callback (GtkAction *action,
                   gpointer   data)
 {
-  html_view_zoom_in (HTML_VIEW (html));
+#ifdef HAVE_WEBKIT_ZOOM_API
+  webkit_web_view_zoom_in (WEBKIT_WEB_VIEW (view));
+#endif
 }
 
 static void
 zoom_out_callback (GtkAction *action,
                    gpointer   data)
 {
-  html_view_zoom_out (HTML_VIEW (html));
+#ifdef HAVE_WEBKIT_ZOOM_API
+  webkit_web_view_zoom_out (WEBKIT_WEB_VIEW (view));
+#endif
 }
 
 static void
-online_callback (GtkAction *action,
-                 gpointer   data)
+website_callback (GtkAction *action,
+                  gpointer   data)
 {
-  load_remote_page ("http://docs.gimp.org/";);
+  browser_dialog_load ("http://docs.gimp.org/";);
 }
 
 static void
 close_callback (GtkAction *action,
                 gpointer   data)
 {
-  gtk_widget_destroy (gtk_widget_get_toplevel (html));
+  gtk_widget_destroy (gtk_widget_get_toplevel (view));
 }
 
+static void
+menu_callback (GtkWidget            *menu,
+               WebKitWebHistoryItem *item)
+{
+  browser_dialog_load (webkit_web_history_item_get_uri (item));
+}
+
+/*  this function unrefs the items and frees the list  */
 static GtkWidget *
-build_menu (GList     *list,
-            GCallback  callback)
+build_menu (GList *list)
 {
   GtkWidget *menu;
-  gint       i;
 
   if (! list)
     return NULL;
 
   menu = gtk_menu_new ();
 
-  for (i = 0; list && i < 15; list = g_list_next (list), i++)
+  do
     {
-      GtkWidget *menu_item = gtk_menu_item_new_with_label (list->data);
+      WebKitWebHistoryItem *item = list->data;
+      GtkWidget            *menu_item;
+
+      menu_item = gtk_menu_item_new_with_label (webkit_web_history_item_get_title (item));
 
       gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
       gtk_widget_show (menu_item);
 
-      g_signal_connect (menu_item, "activate",
-                        G_CALLBACK (callback),
-                        GINT_TO_POINTER (i));
+      g_signal_connect_object (menu_item, "activate",
+                               G_CALLBACK (menu_callback),
+                               item, 0);
+
+      g_object_unref (item);
     }
+  while ((list = g_list_next (list)));
 
   g_list_free (list);
 
@@ -939,29 +814,55 @@
 }
 
 static void
-update_toolbar (void)
+update_actions (void)
 {
-  GtkAction *action;
+  GtkAction                *action;
+  WebKitWebBackForwardList *back_forward_list;
+
+  back_forward_list =
+    webkit_web_view_get_back_forward_list (WEBKIT_WEB_VIEW (view));
 
   /*  update the back button and its menu  */
 
   action = gtk_ui_manager_get_action (ui_manager,
                                       "/ui/help-browser-popup/back");
-  gtk_action_set_sensitive (action, queue_has_prev (queue));
+  gtk_action_set_sensitive (action,
+                            webkit_web_view_can_go_back (WEBKIT_WEB_VIEW (view)));
+
+  if (back_forward_list)
+    {
+      GList *list;
 
-  gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_prev),
-                                 build_menu (queue_list_prev (queue),
-                                             G_CALLBACK (back_callback)));
+      list = webkit_web_back_forward_list_get_back_list_with_limit (back_forward_list,
+                                                                    12);
+      gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_prev),
+                                     build_menu (list));
+    }
+  else
+    {
+      gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_prev), NULL);
+    }
 
   /*  update the forward button and its menu  */
 
   action = gtk_ui_manager_get_action (ui_manager,
                                       "/ui/help-browser-popup/forward");
-  gtk_action_set_sensitive (action, queue_has_next (queue));
+  gtk_action_set_sensitive (action,
+                            webkit_web_view_can_go_forward (WEBKIT_WEB_VIEW (view)));
 
-  gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_next),
-                                 build_menu (queue_list_next (queue),
-                                             G_CALLBACK (forward_callback)));
+  if (back_forward_list)
+    {
+      GList *list;
+
+      list = webkit_web_back_forward_list_get_forward_list_with_limit (back_forward_list,
+                                                                       12);
+      gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_next),
+                                     build_menu (list));
+    }
+  else
+    {
+      gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (button_next), NULL);
+    }
 }
 
 static void
@@ -975,10 +876,10 @@
     {
       GValue  value = { 0, };
 
-      gtk_tree_model_get_value (gtk_combo_box_get_model (combo),
-                                &iter, HISTORY_URI, &value);
+      gtk_tree_model_get_value (gtk_combo_box_get_model (combo), &iter,
+                                HISTORY_URI, &value);
 
-      browser_dialog_load (g_value_get_string (&value), TRUE);
+      browser_dialog_load (g_value_get_string (&value));
 
       g_value_unset (&value);
     }
@@ -1000,7 +901,13 @@
                guint             time,
                gpointer          data)
 {
-  if (! current_uri)
+  WebKitWebFrame *frame;
+  const gchar    *uri;
+
+  frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (view));
+  uri = webkit_web_frame_get_uri (frame);
+
+  if (! uri)
     return;
 
   if (selection_data->target ==
@@ -1008,7 +915,7 @@
     {
       gchar *uris[2];
 
-      uris[0] = current_uri;
+      uris[0] = (gchar *) uri;
       uris[1] = NULL;
 
       gtk_selection_data_set_uris (selection_data, uris);
@@ -1018,7 +925,7 @@
     {
       gtk_selection_data_set (selection_data,
                               selection_data->target,
-                              8, (guchar *) current_uri, strlen (current_uri));
+                              8, (guchar *) uri, strlen (uri));
     }
 }
 
@@ -1048,7 +955,7 @@
                      item->ref,
                      NULL);
 
-  browser_dialog_load (uri, TRUE);
+  browser_dialog_load (uri);
 
   g_free (uri);
 }
@@ -1063,7 +970,12 @@
 
   data.paned_position = gtk_paned_get_position (GTK_PANED (paned));
 
-  data.zoom = html ? html_view_get_magnification (HTML_VIEW (html)) : 1.0;
+#ifdef HAVE_WEBKIT_ZOOM_API
+  data.zoom = (view ?
+               webkit_web_view_get_zoom_level (WEBKIT_WEB_VIEW (view)) : 1.0);
+#else
+  data.zoom = 1.0;
+#endif
 
   gimp_set_data (GIMP_HELP_BROWSER_DIALOG_DATA, &data, sizeof (data));
 
@@ -1116,162 +1028,36 @@
 }
 
 static void
-title_changed (HtmlDocument *doc,
-               const gchar  *new_title,
-               gpointer      data)
+title_changed (GtkWidget      *view,
+               WebKitWebFrame *frame,
+               const gchar    *title,
+               GtkWidget      *combo)
 {
-  gchar *title = NULL;
-
-  if (new_title)
-    {
-      gchar *c;
-
-      title = g_strdup (new_title);
-
-      for (c = title; *c; c++)
-        {
-          if (*c == '\n' || *c == '\r')
-            *c = ' ';
-        }
-
-      title = g_strstrip (title);
-      if (! strlen (title))
-        {
-          g_free (title);
-          title = NULL;
-        }
-    }
-
-  history_add (GTK_COMBO_BOX (data),
-               current_uri, title ? title : _("Untitled"));
-
-  if (title)
-    queue_set_title (queue, title);
+  history_add (GTK_COMBO_BOX (combo),
+               webkit_web_frame_get_uri (frame),
+               title ? title : _("Untitled"));
 
-  g_free (title);
+  update_actions ();
 }
 
 static void
-link_clicked (HtmlDocument *doc,
-              const gchar  *uri,
-              gpointer      data)
+load_started (GtkWidget      *view,
+              WebKitWebFrame *frame)
 {
-  GtkAdjustment *adj = gtk_layout_get_vadjustment (GTK_LAYOUT (html));
-
-  if (adj->upper > 0.0)
-    queue_set_scroll_offset (queue, adj->value / adj->upper);
-
-  browser_dialog_load (uri, TRUE);
-}
-
-static gboolean
-request_url (HtmlDocument *doc,
-             const gchar  *uri,
-             HtmlStream   *stream,
-             GError      **error)
-{
-  gchar *abs;
-  gchar *filename;
-
-  g_return_val_if_fail (uri != NULL, TRUE);
-  g_return_val_if_fail (stream != NULL, TRUE);
-
-  abs = uri_to_abs (uri, current_uri);
-  if (! abs)
-    return TRUE;
-
-  filename = filename_from_uri (abs);
-  g_free (abs);
-
-  if (filename)
-    {
-      gint fd = g_open (filename, O_RDONLY | _O_BINARY, 0);
-
-      if (fd != -1)
-        {
-          GIOChannel *io = g_io_channel_unix_new (fd);
-
-          g_io_channel_set_close_on_unref (io, TRUE);
-          g_io_channel_set_encoding (io, NULL, NULL);
-
-          g_io_add_watch (io, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
-                          io_handler, stream);
-        }
-
-      g_free (filename);
-
-      if (fd == -1)
-        {
-          g_set_error (error,
-                       G_FILE_ERROR, g_file_error_from_errno (errno),
-                       g_strerror (errno));
-          return FALSE;
-        }
-    }
-
-  return TRUE;
-}
-
-static gboolean
-io_handler (GIOChannel   *io,
-            GIOCondition  condition,
-            gpointer      data)
-{
-  HtmlStream *stream = data;
-  gchar       buffer[8192];
-  gsize       bytes;
-
-  if (condition & G_IO_IN)
-    {
-      if (g_io_channel_read_chars (io, buffer, sizeof (buffer),
-                                   &bytes, NULL) != G_IO_STATUS_ERROR
-          && bytes > 0)
-        {
-          html_stream_write (stream, buffer, bytes);
-        }
-      else
-	{
-          goto error;
-	}
-
-      if (condition & G_IO_HUP)
-        {
-          while (g_io_channel_read_chars (io, buffer, sizeof (buffer),
-                                          &bytes, NULL) != G_IO_STATUS_ERROR
-                 && bytes > 0)
-            {
-              html_stream_write (stream, buffer, bytes);
-            }
-        }
-    }
-
-  if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
-    {
-    error:
-      html_stream_close (stream);
-      g_io_channel_unref (io);
-
-      if (html->window)
-        gdk_window_set_cursor (html->window, NULL);
-
-      return FALSE;
-    }
-
-  return TRUE;
+  GtkAction *action = gtk_ui_manager_get_action (ui_manager,
+                                                 "/ui/help-browser-popup/stop");
+  gtk_action_set_sensitive (action, TRUE);
 }
 
 static void
-load_remote_page (const gchar *uri)
+load_finished (GtkWidget      *view,
+               WebKitWebFrame *frame)
 {
-  GimpParam *return_vals;
-  gint       nreturn_vals;
+  GtkAction *action = gtk_ui_manager_get_action (ui_manager,
+                                                 "/ui/help-browser-popup/stop");
+  gtk_action_set_sensitive (action, FALSE);
 
-  /*  try to call the user specified web browser */
-  return_vals = gimp_run_procedure ("plug-in-web-browser",
-                                    &nreturn_vals,
-                                    GIMP_PDB_STRING, uri,
-                                    GIMP_PDB_END);
-  gimp_destroy_params (return_vals, nreturn_vals);
+  update_actions ();
 }
 
 static void
@@ -1313,58 +1099,3 @@
   gtk_combo_box_set_active_iter (combo, &iter);
   g_signal_handlers_unblock_by_func (combo, combo_changed, NULL);
 }
-
-/* Taken from glib/gconvert.c:
- * Test of haystack has the needle prefix, comparing case
- * insensitive. haystack may be UTF-8, but needle must
- * contain only ascii.
- */
-static gboolean
-has_case_prefix (const gchar *haystack, const gchar *needle)
-{
-  const gchar *h = haystack;
-  const gchar *n = needle;
-
-  while (*n && *h && g_ascii_tolower (*n) == g_ascii_tolower (*h))
-    {
-      n++;
-      h++;
-    }
-
-  return (*n == '\0');
-}
-
-static gchar *
-filename_from_uri (const gchar *uri)
-{
-  gchar *filename;
-  gchar *hostname;
-
-  g_return_val_if_fail (uri != NULL, NULL);
-
-  filename = g_filename_from_uri (uri, &hostname, NULL);
-
-  if (!filename)
-    return NULL;
-
-  if (hostname)
-    {
-      /*  we have a file: URI with a hostname                           */
-#ifdef G_OS_WIN32
-      /*  on Win32, create a valid UNC path and use it as the filename  */
-
-      gchar *tmp = g_build_filename ("//", hostname, filename, NULL);
-
-      g_free (filename);
-      filename = tmp;
-#else
-      /*  otherwise return NULL, caller should use URI then             */
-      g_free (filename);
-      filename = NULL;
-#endif
-
-      g_free (hostname);
-    }
-
-  return filename;
-}

Modified: trunk/plug-ins/help-browser/dialog.h
==============================================================================
--- trunk/plug-ins/help-browser/dialog.h	(original)
+++ trunk/plug-ins/help-browser/dialog.h	Tue Jun 10 15:55:28 2008
@@ -27,12 +27,10 @@
 
 
 void   browser_dialog_open       (void);
-void   browser_dialog_load       (const gchar    *ref,
-                                  gboolean        add_to_queue);
+void   browser_dialog_load       (const gchar    *uri);
 
 void   browser_dialog_make_index (GimpHelpDomain *domain,
                                   GimpHelpLocale *locale);
-void   browser_dialog_goto_index (const gchar    *ref);
 
 
 #endif /* ! __DIALOG_H__ */

Modified: trunk/plug-ins/help-browser/help-browser.c
==============================================================================
--- trunk/plug-ins/help-browser/help-browser.c	(original)
+++ trunk/plug-ins/help-browser/help-browser.c	Tue Jun 10 15:55:28 2008
@@ -46,19 +46,23 @@
 
 /*  forward declarations  */
 
-static void   query             (void);
-static void   run               (const gchar      *name,
-                                 gint              nparams,
-                                 const GimpParam  *param,
-                                 gint             *nreturn_vals,
-                                 GimpParam       **return_vals);
-
-static void   temp_proc_install (void);
-static void   temp_proc_run     (const gchar      *name,
-                                 gint              nparams,
-                                 const GimpParam  *param,
-                                 gint             *nreturn_vals,
-                                 GimpParam       **return_vals);
+static void      query                  (void);
+static void      run                    (const gchar      *name,
+                                         gint              nparams,
+                                         const GimpParam  *param,
+                                         gint             *nreturn_vals,
+                                         GimpParam       **return_vals);
+
+static void      temp_proc_install      (void);
+static void      temp_proc_run          (const gchar      *name,
+                                         gint              nparams,
+                                         const GimpParam  *param,
+                                         gint             *nreturn_vals,
+                                         GimpParam       **return_vals);
+
+static gboolean  help_browser_show_help (const gchar      *help_domain,
+                                         const gchar      *help_locales,
+                                         const gchar      *help_id);
 
 
 /*  local variables  */
@@ -110,7 +114,7 @@
      GimpParam       **return_vals)
 {
   GimpRunMode        run_mode = param[0].data.d_int32;
-  GimpPDBStatusType  status = GIMP_PDB_SUCCESS;
+  GimpPDBStatusType  status   = GIMP_PDB_SUCCESS;
 
   static GimpParam   values[1];
 
@@ -209,7 +213,6 @@
   /*  make sure all the arguments are there  */
   if (nparams == 3)
     {
-      GimpHelpDomain *domain;
       const gchar    *help_domain  = GIMP_HELP_DEFAULT_DOMAIN;
       const gchar    *help_locales = NULL;
       const gchar    *help_id      = GIMP_HELP_DEFAULT_ID;
@@ -223,36 +226,51 @@
       if (param[2].data.d_string && strlen (param[2].data.d_string))
         help_id = param[2].data.d_string;
 
-      domain = gimp_help_lookup_domain (help_domain);
-
-      if (domain)
+      if (! help_browser_show_help (help_domain, help_locales, help_id))
         {
-          GList          *locales = gimp_help_parse_locales (help_locales);
-          GimpHelpLocale *locale;
-          gchar          *full_uri;
-          gboolean        fatal_error;
+          gtk_main_quit ();
+        }
+    }
 
-          full_uri = gimp_help_domain_map (domain, locales, help_id, NULL,
-                                           &locale, &fatal_error);
+  values[0].type          = GIMP_PDB_STATUS;
+  values[0].data.d_status = status;
+}
 
-          if (full_uri)
-            {
-              browser_dialog_load (full_uri, TRUE);
-              browser_dialog_make_index (domain, locale);
-              browser_dialog_goto_index (full_uri);
+static gboolean
+help_browser_show_help (const gchar *help_domain,
+                        const gchar *help_locales,
+                        const gchar *help_id)
+{
+  GimpHelpDomain *domain;
+  gboolean        success = TRUE;
 
-              g_free (full_uri);
-            }
-          else if (fatal_error)
-            {
-              gtk_main_quit ();
-            }
+  domain = gimp_help_lookup_domain (help_domain);
 
-          g_list_foreach (locales, (GFunc) g_free, NULL);
-          g_list_free (locales);
+  if (domain)
+    {
+      GList          *locales = gimp_help_parse_locales (help_locales);
+      GimpHelpLocale *locale;
+      gchar          *uri;
+      gboolean        fatal_error;
+
+      uri = gimp_help_domain_map (domain, locales, help_id, NULL,
+                                  &locale, &fatal_error);
+
+      if (uri)
+        {
+          browser_dialog_make_index (domain, locale);
+          browser_dialog_load (uri);
+
+          g_free (uri);
         }
+      else if (fatal_error)
+        {
+          success = FALSE;
+        }
+
+      g_list_foreach (locales, (GFunc) g_free, NULL);
+      g_list_free (locales);
     }
 
-  values[0].type          = GIMP_PDB_STATUS;
-  values[0].data.d_status = status;
+  return success;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]