diff options
author | Shaun McCance <shaunm@src.gnome.org> | 2004-12-09 05:35:22 +0000 |
---|---|---|
committer | Shaun McCance <shaunm@src.gnome.org> | 2004-12-09 05:35:22 +0000 |
commit | 9b5a210f00d6aa82788adec7a7859e378ca5d253 (patch) | |
tree | a471dc980e4deee88d774f2c36bdf3f51bfb43e2 | |
parent | d3ce9c37cdeefc901e1e842fee16b84250843245 (diff) | |
download | yelp-9b5a210f00d6aa82788adec7a7859e378ca5d253.tar.gz |
- Hooked up reload, at least for DocBook
* src/yelp-db-pager.c:
* src/yelp-pager.c:
* src/yelp-utils.c:
* src/yelp-window.c:
- Hooked up reload, at least for DocBook
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | src/yelp-db-pager.c | 58 | ||||
-rw-r--r-- | src/yelp-pager.c | 4 | ||||
-rw-r--r-- | src/yelp-utils.c | 6 | ||||
-rw-r--r-- | src/yelp-window.c | 47 |
5 files changed, 106 insertions, 17 deletions
@@ -1,3 +1,11 @@ +2004-12-08 Shaun McCance <shaunm@gnome.org> + + * src/yelp-db-pager.c: + * src/yelp-pager.c: + * src/yelp-utils.c: + * src/yelp-window.c: + - Hooked up reload, at least for DocBook + 2004-12-05 Shaun McCance <shaunm@gnome.org> * src/yelp-window.c: diff --git a/src/yelp-db-pager.c b/src/yelp-db-pager.c index 41012829..a546595b 100644 --- a/src/yelp-db-pager.c +++ b/src/yelp-db-pager.c @@ -205,8 +205,9 @@ yelp_db_pager_new (YelpDocInfo *doc_info) "document-info", doc_info, NULL); - pager->priv->sects = - GTK_TREE_MODEL (gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING)); + if (!pager->priv->sects) + pager->priv->sects = + GTK_TREE_MODEL (gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING)); return (YelpPager *) pager; } @@ -276,7 +277,7 @@ db_pager_process (YelpPager *pager) id = xmlGetProp (walker->cur, "id"); if (id) - priv->root_id = (gchar *) id; + priv->root_id = g_strdup (id); else priv->root_id = g_strdup ("index"); @@ -424,11 +425,40 @@ db_pager_error (YelpPager *pager) static void db_pager_cancel (YelpPager *pager) { + YelpDBPagerPriv *priv = YELP_DB_PAGER (pager)->priv; + d (g_print ("db_pager_cancel\n")); + yelp_pager_set_state (pager, YELP_PAGER_STATE_INVALID); if (yelp_pager_get_state (pager) <= YELP_PAGER_STATE_RUNNING) yelp_toc_pager_unpause (yelp_toc_pager_get ()); - // FIXME: actually cancel + + gtk_tree_store_clear (GTK_TREE_STORE (priv->sects)); + g_hash_table_foreach_remove (priv->frags_hash, gtk_true, NULL); + + g_free (priv->root_id); + priv->root_id = NULL; + + if (priv->inputDoc) { + xmlFreeDoc (priv->inputDoc); + priv->inputDoc = NULL; + } + if (priv->outputDoc) { + xmlFreeDoc (priv->outputDoc); + priv->outputDoc = NULL; + } + if (priv->parserCtxt) { + xmlFreeParserCtxt (priv->parserCtxt); + priv->parserCtxt = NULL; + } + if (priv->stylesheet) { + xsltFreeStylesheet (priv->stylesheet); + priv->stylesheet = NULL; + } + if (priv->transformContext) { + xsltFreeTransformContext (priv->transformContext); + priv->transformContext = NULL; + } } static void @@ -497,9 +527,11 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, EVENTS_PENDING; CANCEL_CHECK; + d (g_print ("xslt_yelp_document\n")); + page_id = xsltEvalAttrValueTemplate (ctxt, inst, - (const xmlChar *) "href", - NULL); + (const xmlChar *) "href", + NULL); if (page_id == NULL) { xsltTransformError (ctxt, NULL, inst, _("No href attribute found on yelp:document")); @@ -507,6 +539,7 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, yelp_pager_error (pager, error); goto done; } + d (g_print (" page_id = \"%s\"\n", page_id)); old_outfile = ctxt->outputFile; old_doc = ctxt->output; @@ -551,7 +584,10 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, page = g_new0 (YelpPage, 1); - page->page_id = page_id; + page->page_id = g_strdup (page_id); + xmlFree (page_id); + page_id = NULL; + page->title = page_title; page->contents = page_buf; @@ -563,11 +599,11 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, xmlChar *rel = xmlGetProp (cur, "rel"); if (!xmlStrcmp (rel, (xmlChar *) "Previous")) - page->prev_id = xmlGetProp (cur, "href"); + page->prev_id = g_strdup (xmlGetProp (cur, "href")); else if (!xmlStrcmp (rel, (xmlChar *) "Next")) - page->next_id = xmlGetProp (cur, "href"); + page->next_id = g_strdup (xmlGetProp (cur, "href")); else if (!xmlStrcmp (rel, (xmlChar *) "Top")) - page->toc_id = xmlGetProp (cur, "href"); + page->toc_id = g_strdup (xmlGetProp (cur, "href")); xmlFree (rel); } @@ -579,7 +615,7 @@ xslt_yelp_document (xsltTransformContextPtr ctxt, CANCEL_CHECK; yelp_pager_add_page (pager, page); - g_signal_emit_by_name (pager, "page", page_id); + g_signal_emit_by_name (pager, "page", page->page_id); EVENTS_PENDING; CANCEL_CHECK; diff --git a/src/yelp-pager.c b/src/yelp-pager.c index e730a8b4..6d99f273 100644 --- a/src/yelp-pager.c +++ b/src/yelp-pager.c @@ -186,7 +186,7 @@ pager_init (YelpPager *pager) priv->page_hash = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, + NULL, /* Use page->page_id directly */ (GDestroyNotify) yelp_page_free); } @@ -380,7 +380,7 @@ yelp_pager_add_page (YelpPager *pager, g_return_if_fail (page->page_id != NULL); - g_hash_table_insert (pager->priv->page_hash, page->page_id, page); + g_hash_table_replace (pager->priv->page_hash, page->page_id, page); } void diff --git a/src/yelp-utils.c b/src/yelp-utils.c index 3a51bd63..39ac5b7b 100644 --- a/src/yelp-utils.c +++ b/src/yelp-utils.c @@ -238,7 +238,8 @@ yelp_doc_info_free (YelpDocInfo *doc) if (!doc) return; - g_object_unref (doc->pager); + if (doc->pager) + g_object_unref (doc->pager); g_free (doc->title); for (i = 0; i < doc->num_uris; i++) @@ -503,7 +504,8 @@ get_doc_type (gchar *uri) return YELP_DOC_TYPE_EXTERNAL; mime_type = gnome_vfs_get_mime_type (uri); - g_return_val_if_fail (mime_type != NULL, YELP_DOC_TYPE_ERROR); + if (mime_type == NULL) + return YELP_DOC_TYPE_ERROR; if (g_str_equal (mime_type, "text/xml")) type = YELP_DOC_TYPE_DOCBOOK_XML; diff --git a/src/yelp-window.c b/src/yelp-window.c index 224f6244..e36fba6f 100644 --- a/src/yelp-window.c +++ b/src/yelp-window.c @@ -66,6 +66,11 @@ #define BUFFER_SIZE 16384 typedef struct { + YelpWindow *window; + gchar *uri; +} YelpLoadData; + +typedef struct { YelpDocInfo *doc_info; gchar *frag_id; @@ -170,6 +175,8 @@ static void window_copy_link_cb (GtkAction *action, YelpWindow *window); static void window_open_link_cb (GtkAction *action, YelpWindow *window); static void window_open_link_new_cb (GtkAction *action, YelpWindow *window); +static gboolean window_load_async (YelpLoadData *data); + /** History Functions **/ static void history_push_back (YelpWindow *window); static void history_push_forward (YelpWindow *window); @@ -179,6 +186,8 @@ static YelpHistoryEntry * history_pop_back (YelpWindow *window); static YelpHistoryEntry * history_pop_forward (YelpWindow *window); static void history_entry_free (YelpHistoryEntry *entry); +static void load_data_free (YelpLoadData *data); + static void location_response_cb (GtkDialog *dialog, gint id, YelpWindow *window); @@ -611,6 +620,17 @@ history_entry_free (YelpHistoryEntry *entry) g_free (entry); } +static void +load_data_free (YelpLoadData *data) +{ + g_return_if_fail (data != NULL); + + g_object_unref (data->window); + g_free (data->uri); + + g_free (data); +} + /******************************************************************************/ GtkWidget * @@ -669,10 +689,10 @@ yelp_window_load (YelpWindow *window, gchar *uri) if (priv->current_doc && yelp_doc_info_equal (priv->current_doc, doc_info)) { if (priv->current_frag) { if (frag_id && g_str_equal (priv->current_frag, frag_id)) - goto done; + goto load; } else if (!frag_id) - goto done; + goto load; } if (priv->current_doc) @@ -687,6 +707,7 @@ yelp_window_load (YelpWindow *window, gchar *uri) priv->current_doc = yelp_doc_info_ref (doc_info); priv->current_frag = g_strdup (frag_id); + load: window_do_load (window, doc_info, frag_id); done: @@ -715,6 +736,8 @@ window_do_load (YelpWindow *window, g_return_if_fail (YELP_IS_WINDOW (window)); g_return_if_fail (doc_info != NULL); + d (g_print ("window_do_laod\n")); + priv = window->priv; switch (yelp_doc_info_get_type (doc_info)) { @@ -1767,15 +1790,35 @@ window_reload_cb (GtkAction *action, YelpWindow *window) d (g_print ("window_reload_cb\n")); if (window->priv->current_doc) { + YelpLoadData *data; + gchar *uri; pager = yelp_doc_info_get_pager (window->priv->current_doc); if (!pager) return; yelp_pager_cancel (pager); + + uri = yelp_doc_info_get_uri (window->priv->current_doc, + window->priv->current_frag, + YELP_URI_TYPE_ANY); + data = g_new0 (YelpLoadData, 1); + data->window = g_object_ref (window); + data->uri = uri; + g_idle_add ((GSourceFunc) window_load_async, data); } } +static gboolean +window_load_async (YelpLoadData *data) +{ + yelp_window_load (data->window, data->uri); + + load_data_free (data); + + return FALSE; +} + static void window_go_back_cb (GtkAction *action, YelpWindow *window) { |