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