r3031 - in trunk/src/target/OM-2007.2/applications/openmoko-browser2: . src

zecke at sita.openmoko.org zecke at sita.openmoko.org
Sat Sep 22 00:53:46 CEST 2007


Author: zecke
Date: 2007-09-22 00:53:42 +0200 (Sat, 22 Sep 2007)
New Revision: 3031

Added:
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/browser-data.c
Modified:
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/ChangeLog
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/Makefile.am
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/browser-data.h
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.c
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.h
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/go-page.c
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/main.c
   trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/open-pages-page.c
Log:
2007-09-21  Holger 'Siddhartha' Freyther  <zecke at selfish.org>

        Make the "GO"-Page, "Open-Pages"-Page and the "Current"-Page
        share a GtkListStore. This avoids to recreate it in Open-Page on every
        activation, will keep the GtkTreeSelection and will help us to
        bind that to JavaScript.

        * src/Makefile.am:
        * src/browser-data.c: Copied from src/go-page.h.
        (browser_page_finalize):
        (browser_page_init):
        (browser_page_class_init):
        (browser_page_new):
        * src/browser-data.h:
        * src/current-page.c:
        (current_close_page):
        (clear_current_page):
        (update_current_page_from_iter):
        * src/current-page.h:
        * src/go-page.c:
        (create_new_page_clicked):
        * src/main.c:
        (main):
        * src/open-pages-page.c:
        (open_pages_page_cell_data_func):
        (selection_changed):
        (setup_open_pages_page):


Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/ChangeLog
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/ChangeLog	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/ChangeLog	2007-09-21 22:53:42 UTC (rev 3031)
@@ -1,5 +1,33 @@
 2007-09-21  Holger 'Siddhartha' Freyther  <zecke at selfish.org>
 
+        Make the "GO"-Page, "Open-Pages"-Page and the "Current"-Page
+        share a GtkListStore. This avoids to recreate it in Open-Page on every
+        activation, will keep the GtkTreeSelection and will help us to
+        bind that to JavaScript.
+
+        * src/Makefile.am:
+        * src/browser-data.c: Copied from src/go-page.h.
+        (browser_page_finalize):
+        (browser_page_init):
+        (browser_page_class_init):
+        (browser_page_new):
+        * src/browser-data.h:
+        * src/current-page.c:
+        (current_close_page):
+        (clear_current_page):
+        (update_current_page_from_iter):
+        * src/current-page.h:
+        * src/go-page.c:
+        (create_new_page_clicked):
+        * src/main.c:
+        (main):
+        * src/open-pages-page.c:
+        (open_pages_page_cell_data_func):
+        (selection_changed):
+        (setup_open_pages_page):
+
+2007-09-21  Holger 'Siddhartha' Freyther  <zecke at selfish.org>
+
         Place the asterisk right.
 
         * src/browser-data.h:

Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/Makefile.am
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/Makefile.am	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/Makefile.am	2007-09-21 22:53:42 UTC (rev 3031)
@@ -8,7 +8,7 @@
 bin_PROGRAMS = openmoko-browser2
 
 EXTRA_DIST = browser-data.h current-page.h go-page.h open-pages-page.h
-openmoko_browser2_SOURCES = main.c current-page.c go-page.c open-pages-page.c
+openmoko_browser2_SOURCES = main.c browser-data.c current-page.c go-page.c open-pages-page.c
 openmoko_browser2_LDADD = @OPENMOKO_LIBS@ @WEBKITGTK_LIBS@ @GTHREAD_LIBS@
 
 CLEANFILES = $(stamp_files)

Copied: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/browser-data.c (from rev 3030, trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.h)
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.h	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/browser-data.c	2007-09-21 22:53:42 UTC (rev 3031)
@@ -0,0 +1,60 @@
+/*
+ * A simple WebBrowser
+ *
+ *  Copyright (C) 2007 Holger Hans Peter Freyther
+ *
+ *  Permission is hereby granted, free of charge, to any person obtaining a
+ *  copy of this software and associated documentation files (the "Software"),
+ *  to deal in the Software without restriction, including without limitation
+ *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ *  and/or sell copies of the Software, and to permit persons to whom the
+ *  Software is furnished to do so, subject to the following conditions:
+ *
+ *  The above copyright notice and this permission notice shall be included
+ *  in all copies or substantial portions of the Software.
+ *
+ *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ *  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ *  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *  OTHER DEALINGS IN THE SOFTWARE.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+
+#include "config.h"
+#include "browser-data.h"
+
+G_DEFINE_TYPE(BrowserPage, browser_page, G_TYPE_OBJECT)
+
+static void
+browser_page_finalize (GObject* object)
+{
+    BrowserPage* page = BROWSER_PAGE (object);
+    g_object_unref (page->webKitPage);
+    page->webKitPage = 0;
+}
+
+static void
+browser_page_init (BrowserPage* self)
+{
+    self->webKitPage = NULL;
+}
+
+static void
+browser_page_class_init (BrowserPageClass *klass)
+{
+    G_OBJECT_CLASS(klass)->finalize = browser_page_finalize;
+}
+
+BrowserPage*
+browser_page_new (WebKitGtkPage* webKitPage)
+{
+    BrowserPage* page = BROWSER_PAGE (g_object_new (BROWSER_TYPE_PAGE, 0));
+    page->webKitPage = webKitPage;
+    g_object_ref (page->webKitPage);
+
+    return page;
+}

Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/browser-data.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/browser-data.h	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/browser-data.h	2007-09-21 22:53:42 UTC (rev 3031)
@@ -35,10 +35,27 @@
 /*
  * representation of one page
  */
-struct BrowserPage {
+#define BROWSER_TYPE_PAGE               (browser_page_get_type ())
+#define BROWSER_PAGE(obj)               (G_TYPE_CHECK_INSTANCE_CAST((obj), BROWSER_TYPE_PAGE, BrowserPage))
+#define BROWSER_PAGE_CLASS(klass)       (G_TYPE_CHECK_CLASS_CASS((klass),  BROWSER_TYPE_PAGE, BrowserPageClass))
+#define BROWSER_IS_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_TYPE((obj), BROWSER_TYPE_PAGE))
+#define BROWSER_IS_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE((klass),  BROWSER_TYPE_PAGE))
+#define BROWSER_PAGE_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS((obj),  BROWSER_TYPE_PAGE, BrowserPageClass))
+typedef struct _BrowserPage BrowserPage;
+typedef struct _BrowserPageClass BrowserPageClass;
+
+struct _BrowserPage {
+    GObject parent;
     WebKitGtkPage* webKitPage;
 };
 
+struct _BrowserPageClass {
+    GObjectClass parent_class;
+};
+
+GType browser_page_get_type (void);
+BrowserPage* browser_page_new (WebKitGtkPage* page);
+
 /*
  * The state of the Browser
  */
@@ -47,8 +64,9 @@
     GtkWidget* mainNotebook;
     GtkWidget* currentFingerScroll;
 
-    GList* browserPages;
-    struct BrowserPage* currentPage;
+    GtkListStore* browserPages;
+    BrowserPage* currentPage;
+    GtkTreeIter currentPageIter;
 
     /**
      * Two special views for the Browser. The Overview
@@ -82,7 +100,6 @@
      * Open-Pages-Page
      */
     GtkWidget* pagesBox;
-    GtkListStore* pagesStore;
     GtkTreeView* pagesView;
 };
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.c	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.c	2007-09-21 22:53:42 UTC (rev 3031)
@@ -77,17 +77,15 @@
     g_return_if_fail (data->currentPage);
 
     /* XXX FIXME TODO Select a better page, currently the first one is used */
-    /* To destroy the WebKitGtkPage we will g_object_unref it */
-    struct BrowserPage* oldCurrent = data->currentPage;
-    data->browserPages = g_list_remove (data->browserPages, oldCurrent);
-    set_current_page (NULL, data);
+    /*
+     * Remove the current page and switch to the Go page or to select another tab
+     */
+    gtk_list_store_remove (data->browserPages, &data->currentPageIter);
+    clear_current_page (data);
+
+    GtkTreeIter iter;
     gtk_notebook_set_current_page (GTK_NOTEBOOK (data->mainNotebook),
-                                   g_list_first(data->browserPages) ? 2 : 1);
-
-
-    g_object_unref (oldCurrent->webKitPage);
-    g_free (oldCurrent);
-
+                                   gtk_tree_model_get_iter_first (GTK_TREE_MODEL (data->browserPages), &iter) ? 2 : 1);
 }
 
 void setup_current_page(GtkBox* box, struct BrowserData* data)
@@ -135,11 +133,32 @@
     gtk_box_pack_start (box, data->currentFingerScroll, TRUE, TRUE, 0);
 }
 
+void clear_current_page (struct BrowserData* data)
+{
+    if (data->currentPage) {
+        gtk_container_remove (GTK_CONTAINER (data->currentFingerScroll), GTK_WIDGET (data->currentPage->webKitPage));
+        g_signal_handlers_disconnect_by_func(data->currentPage->webKitPage, (gpointer)current_progress_changed, data);
+    }
+
+    data->currentPage = NULL;
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentBack), FALSE);
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentForward), FALSE);
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentStop), FALSE);
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentAdd), FALSE);
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentClose), FALSE);
+}
+
 /*
  * The current page changed
  */
-void set_current_page(struct BrowserPage* page, struct BrowserData* data)
+void update_current_page_from_iter(struct BrowserData* data)
 {
+    g_assert (gtk_list_store_iter_is_valid (data->browserPages, &data->currentPageIter));
+
+    BrowserPage* page;
+    gtk_tree_model_get (GTK_TREE_MODEL (data->browserPages), &data->currentPageIter, 0, &page, -1);
+    g_object_unref (page);
+
     if (page == data->currentPage)
         return;
 
@@ -148,26 +167,17 @@
         g_signal_handlers_disconnect_by_func(data->currentPage->webKitPage, (gpointer)current_progress_changed, data);
     }
 
-    if (!page) {
-        data->currentPage = NULL;
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentBack), FALSE);
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentForward), FALSE);
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentStop), FALSE);
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentAdd), FALSE);
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentClose), FALSE);
-    } else {
-        data->currentPage = page;
-        g_signal_connect(data->currentPage->webKitPage, "load-progress-changed", G_CALLBACK(current_progress_changed), data);
-        gtk_container_add (GTK_CONTAINER (data->currentFingerScroll), GTK_WIDGET (data->currentPage->webKitPage));
-        gtk_widget_show (GTK_WIDGET (data->currentPage->webKitPage));
+    data->currentPage = page;
+    g_signal_connect(data->currentPage->webKitPage, "load-progress-changed", G_CALLBACK(current_progress_changed), data);
+    gtk_container_add (GTK_CONTAINER (data->currentFingerScroll), GTK_WIDGET (data->currentPage->webKitPage));
+    gtk_widget_show (GTK_WIDGET (data->currentPage->webKitPage));
 
-        /*
-         * Update the GtkToolItems
-         */
-        /* XXX ### FIXME TODO check if we should show stop/reload */
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentBack), webkit_gtk_page_can_go_backward (data->currentPage->webKitPage));
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentForward), webkit_gtk_page_can_go_forward (data->currentPage->webKitPage));
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentAdd), webkit_gtk_frame_get_title (webkit_gtk_page_get_main_frame (data->currentPage->webKitPage)) != NULL);
-        gtk_widget_set_sensitive (GTK_WIDGET (data->currentClose), TRUE);
-    }
+    /*
+     * Update the GtkToolItems
+     */
+    /* XXX ### FIXME TODO check if we should show stop/reload */
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentBack), webkit_gtk_page_can_go_backward (data->currentPage->webKitPage));
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentForward), webkit_gtk_page_can_go_forward (data->currentPage->webKitPage));
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentAdd), webkit_gtk_frame_get_title (webkit_gtk_page_get_main_frame (data->currentPage->webKitPage)) != NULL);
+    gtk_widget_set_sensitive (GTK_WIDGET (data->currentClose), TRUE);
 }

Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.h	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/current-page.h	2007-09-21 22:53:42 UTC (rev 3031)
@@ -30,6 +30,7 @@
 #include "browser-data.h"
 
 void setup_current_page(GtkBox* box, struct BrowserData* data);
-void set_current_page(struct BrowserPage* page, struct BrowserData* data);
+void update_current_page_from_iter(struct BrowserData* data);
+void clear_current_page(struct BrowserData* data);
 
 #endif

Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/go-page.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/go-page.c	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/go-page.c	2007-09-21 22:53:42 UTC (rev 3031)
@@ -138,13 +138,11 @@
     else
         url = autocorrect_url (gtk_entry_get_text (data->goUrlEntry));
 
-    struct BrowserPage* page = g_new(struct BrowserPage, 1);
-    page->webKitPage = WEBKIT_GTK_PAGE (webkit_gtk_page_new ());
-
-    data->browserPages = g_list_append (data->browserPages, page);
+    BrowserPage* page = browser_page_new (WEBKIT_GTK_PAGE (webkit_gtk_page_new ()));
+    gtk_list_store_append (data->browserPages, &data->currentPageIter);
+    gtk_list_store_set (data->browserPages, &data->currentPageIter, 0, page, -1);
     webkit_gtk_page_open (page->webKitPage, url);
-    set_current_page (page, data);
-    g_object_ref (page->webKitPage);
+    update_current_page_from_iter (data);
 
     gtk_notebook_set_current_page (GTK_NOTEBOOK (data->mainNotebook), 0);
 }

Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/main.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/main.c	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/main.c	2007-09-21 22:53:42 UTC (rev 3031)
@@ -64,6 +64,7 @@
 
     gtk_main ();
     gdk_threads_leave ();
+    g_object_unref (data->browserPages);
     g_free (data);
 
     return EXIT_SUCCESS;
@@ -76,6 +77,7 @@
 
 static void setup_ui (struct BrowserData* data)
 {
+    data->browserPages = GTK_LIST_STORE (gtk_list_store_new (1, BROWSER_TYPE_PAGE));
     data->mainWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     g_signal_connect (data->mainWindow, "delete-event", G_CALLBACK(window_delete_event), NULL);
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/open-pages-page.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/open-pages-page.c	2007-09-21 22:53:37 UTC (rev 3030)
+++ trunk/src/target/OM-2007.2/applications/openmoko-browser2/src/open-pages-page.c	2007-09-21 22:53:42 UTC (rev 3031)
@@ -34,9 +34,15 @@
 
 #include <glib/gi18n.h>
 
-static gint find_browser_page (struct BrowserPage* page, WebKitGtkPage* webKitPage)
+static void open_pages_page_cell_data_func(GtkTreeViewColumn* tree_column, GtkCellRenderer* ren, GtkTreeModel* tree_model, GtkTreeIter* iter, gpointer data)
 {
-    return !(page->webKitPage == webKitPage);
+    BrowserPage* page;
+    gtk_tree_model_get (tree_model, iter, 0, &page, -1);
+    g_assert (page);
+
+    /* XXX, FIXME, TODO check that we don't have any race conditions here. We might get a new title inside WebKit while using that string? */
+    g_object_set (G_OBJECT (ren), "text", webkit_gtk_frame_get_title (webkit_gtk_page_get_main_frame (page->webKitPage)), NULL);
+    g_object_unref (page);
 }
 
 /*
@@ -51,61 +57,24 @@
     if (!has_selection)
         return;
 
-    WebKitGtkPage* page = 0;
-    gtk_tree_model_get (model, &iter, 1, &page, -1);
-    g_assert (page);
-
-    /*
-     * now find a page a BrowserPage
-     */
-    GList* element = g_list_find_custom(data->browserPages, page, (GCompareFunc)find_browser_page);
-    if (element)
-        set_current_page ((struct BrowserPage*)element->data, data);
-    
-    g_object_unref (page);
+    data->currentPageIter = iter;
+    update_current_page_from_iter (data);
 }
 
 
-static void pages_add_to_list_store(struct BrowserPage* page, GtkListStore* store)
-{
-    GtkTreeIter iter;
-    gtk_list_store_append (store, &iter);
-    gtk_list_store_set (store, &iter,
-                        0, g_strdup (webkit_gtk_frame_get_title (webkit_gtk_page_get_main_frame (page->webKitPage))),
-                        1, page->webKitPage,
-                        -1);
-}
-
-/*
- * For now rebuild the GtkListStore
- *
- * XXX FIXME TODO Make Current, Go and Pages use the same GtkListStore
- * and share the code with the bookmarks.
- */
-static void switched_notebook_tab(GtkNotebook* notebook, GtkNotebookPage* page, guint page_num, struct BrowserData* data)
-{
-    if (gtk_notebook_get_nth_page (notebook, page_num) == data->pagesBox) {
-        gtk_list_store_clear (data->pagesStore);
-        g_list_foreach (data->browserPages, (GFunc)pages_add_to_list_store, data->pagesStore);
-    }
-}
-
 void setup_open_pages_page(GtkBox* box, struct BrowserData* data)
 {
     data->pagesBox = GTK_WIDGET (box);
-    g_signal_connect (data->mainNotebook, "switch-page", G_CALLBACK(switched_notebook_tab), data);
 
-    /* URL/title and WebKitGtkPage, as it is a GObject */
-    data->pagesStore = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_OBJECT);
-
     GtkContainer* scrolled = GTK_CONTAINER (moko_finger_scroll_new ());
     gtk_box_pack_start (box, GTK_WIDGET(scrolled), TRUE, TRUE, 0);
-    data->pagesView = GTK_TREE_VIEW (gtk_tree_view_new_with_model (GTK_TREE_MODEL (data->pagesStore)));
+    data->pagesView = GTK_TREE_VIEW (gtk_tree_view_new_with_model (GTK_TREE_MODEL (data->browserPages)));
     gtk_container_add (scrolled, GTK_WIDGET (data->pagesView));
     g_signal_connect (gtk_tree_view_get_selection (data->pagesView), "changed", G_CALLBACK(selection_changed), data);
 
     GtkCellRenderer* ren = GTK_CELL_RENDERER (gtk_cell_renderer_text_new ());
-    GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes (_("Title"), ren, "text", 0, NULL);
+    GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes (_("Title"), ren, NULL);
+    gtk_tree_view_column_set_cell_data_func (column, ren, open_pages_page_cell_data_func, NULL, NULL);
     gtk_tree_view_column_set_expand (column, TRUE);
     gtk_tree_view_append_column (data->pagesView, column);
 }





More information about the commitlog mailing list