Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2005-03-31 15:34:35 (GMT)
committer Jonathan Blandford <jrb@src.gnome.org>2005-03-31 15:34:35 (GMT)
commite8096c18ba580156072e8c84103bee6f6d3f0bfc (patch)
tree4da3a4264a48a6830e7b12ec734ee4dc34de2b65 /shell
parent52ba586fff36cceccb753342a38deff970b18107 (diff)
Remove pixbuf backend for now
Thu Mar 31 01:21:58 2005 Jonathan Blandford <jrb@redhat.com> * Makefile.am: Remove pixbuf backend for now * configure.ac: Require poppler-glib instead of just poppler. * backend/ev-document-thumbnails.h: Add a comment * backend/ev-document.h: * backend/ev-document.c: (ev_document_class_init), (ev_document_load), (ev_document_get_link), (ev_document_get_links): Remove 3 methods and add get_links. Also, made 0 based. * backend/ev-jobs.c: (ev_job_render_new), (ev_job_render_run): * backend/ev-jobs.h: now EvJobRender can grab the links for a document. * backend/ev-link.c: (ev_link_set_title), (ev_link_mapping_free_foreach), (ev_link_mapping_free), (ev_link_mapping_find): * backend/ev-link.h: Allow NULL titles. Also, introduce a mapping link. * backend/ev-page-cache.c: (ev_page_cache_init), (_ev_page_cache_new), (ev_page_cache_set_current_page), (ev_page_cache_get_size), (ev_page_cache_next_page), (ev_page_cache_prev_page): Fix to be 0 based. * pdf/Makefile.am: * pdf/ev-poppler.h: * pdf/ev-poppler.cc: New backend. * ps/ps-document.c: (ps_document_init), (ps_document_set_page), (ps_document_get_page), (ps_document_document_iface_init): * shell/ev-pixbuf-cache.h: * shell/ev-pixbuf-cache.c: (ev_pixbuf_cache_init), (dispose_cache_job_info), (job_finished_cb), (move_one_job), (ev_pixbuf_cache_update_range), (copy_job_to_job_info), (add_job_if_needed), (ev_pixbuf_cache_set_page_range), (ev_pixbuf_cache_get_pixbuf), (ev_pixbuf_cache_get_link_mapping): Fix up code to grab a page cache per each doc. Also, fix to be 0 based. * shell/ev-sidebar-thumbnails.c: (ev_sidebar_tree_selection_changed), (page_changed_cb), (ev_sidebar_thumbnails_set_document): Fix to be 0 based. * shell/ev-view.c: (status_message_from_link), (find_page_at_location), (get_link_at_location), (ev_view_motion_notify_event), (ev_view_button_release_event), (ev_view_init): Use the new link code. Fix to be 0 based. * shell/ev-window.c: (update_action_sensitivity), (document_supports_sidebar): 0 based.
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-pixbuf-cache.c74
-rw-r--r--shell/ev-pixbuf-cache.h19
-rw-r--r--shell/ev-sidebar-thumbnails.c10
-rw-r--r--shell/ev-view.c75
-rw-r--r--shell/ev-window.c11
5 files changed, 140 insertions, 49 deletions
diff --git a/shell/ev-pixbuf-cache.c b/shell/ev-pixbuf-cache.c
index 7d076db..7200b37 100644
--- a/shell/ev-pixbuf-cache.c
+++ b/shell/ev-pixbuf-cache.c
@@ -6,6 +6,7 @@ typedef struct _CacheJobInfo
{
EvJob *job;
GdkPixbuf *pixbuf;
+ GList *link_mapping;
} CacheJobInfo;
struct _EvPixbufCache
@@ -50,14 +51,16 @@ static void job_finished_cb (EvJob *job,
EvPixbufCache *pixbuf_cache);
static CacheJobInfo *find_job_cache (EvPixbufCache *pixbuf_cache,
int page);
-
+static void copy_job_to_job_info (EvJobRender *job_render,
+ CacheJobInfo *job_info,
+ EvPixbufCache *pixbuf_cache);
/* These are used for iterating through the prev and next arrays */
#define FIRST_VISABLE_PREV(pixbuf_cache) \
(MAX (0, pixbuf_cache->preload_cache_size + 1 - pixbuf_cache->start_page))
#define VISIBLE_NEXT_LEN(pixbuf_cache, page_cache) \
- (MIN(pixbuf_cache->preload_cache_size, ev_page_cache_get_n_pages (page_cache) - pixbuf_cache->end_page))
+ (MIN(pixbuf_cache->preload_cache_size, ev_page_cache_get_n_pages (page_cache) - (1 + pixbuf_cache->end_page)))
#define PAGE_CACHE_LEN(pixbuf_cache) \
((pixbuf_cache->end_page - pixbuf_cache->start_page) + 1)
@@ -66,8 +69,8 @@ G_DEFINE_TYPE (EvPixbufCache, ev_pixbuf_cache, G_TYPE_OBJECT)
static void
ev_pixbuf_cache_init (EvPixbufCache *pixbuf_cache)
{
- pixbuf_cache->start_page = 1;
- pixbuf_cache->end_page = 1;
+ pixbuf_cache->start_page = 0;
+ pixbuf_cache->end_page = 0;
pixbuf_cache->job_list = g_new0 (CacheJobInfo, PAGE_CACHE_LEN (pixbuf_cache));
pixbuf_cache->preload_cache_size = 1;
@@ -123,6 +126,10 @@ dispose_cache_job_info (CacheJobInfo *job_info,
g_object_unref (G_OBJECT (job_info->pixbuf));
job_info->pixbuf = NULL;
}
+ if (job_info->link_mapping) {
+ ev_link_mapping_free (job_info->link_mapping);
+ job_info->link_mapping = NULL;
+ }
}
static void
@@ -177,6 +184,12 @@ job_finished_cb (EvJob *job,
g_object_unref (job_info->pixbuf);
job_info->pixbuf = pixbuf;
+ if (job_render->link_mapping) {
+ if (job_info->link_mapping)
+ ev_link_mapping_free (job_info->link_mapping);
+ job_info->link_mapping = job_render->link_mapping;
+ }
+
if (job_info->job == job)
job_info->job = NULL;
g_object_unref (job);
@@ -268,6 +281,7 @@ move_one_job (CacheJobInfo *job_info,
*target_page = *job_info;
job_info->job = NULL;
job_info->pixbuf = NULL;
+ job_info->link_mapping = NULL;
if (new_priority != priority && target_page->job) {
g_print ("FIXME: update priority \n");
@@ -303,7 +317,7 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache,
/* Start with the prev cache. */
page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size;
for (i = 0; i < pixbuf_cache->preload_cache_size; i++) {
- if (page < 1) {
+ if (page < 0) {
dispose_cache_job_info (pixbuf_cache->prev_job + i, pixbuf_cache);
} else {
move_one_job (pixbuf_cache->prev_job + i,
@@ -324,7 +338,7 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache,
}
for (i = 0; i < pixbuf_cache->preload_cache_size; i++) {
- if (page > ev_page_cache_get_n_pages (page_cache)) {
+ if (page >= ev_page_cache_get_n_pages (page_cache)) {
dispose_cache_job_info (pixbuf_cache->next_job + i, pixbuf_cache);
} else {
move_one_job (pixbuf_cache->next_job + i,
@@ -347,6 +361,22 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache,
pixbuf_cache->end_page = end_page;
}
+static void
+copy_job_to_job_info (EvJobRender *job_render,
+ CacheJobInfo *job_info,
+ EvPixbufCache *pixbuf_cache)
+{
+ GdkPixbuf *pixbuf;
+
+ pixbuf = g_object_ref (job_render->pixbuf);
+
+ dispose_cache_job_info (job_info, pixbuf_cache);
+
+ job_info->pixbuf = pixbuf;
+ if (job_render->link_mapping)
+ job_info->link_mapping = job_render->link_mapping;
+}
+
static CacheJobInfo *
find_job_cache (EvPixbufCache *pixbuf_cache,
int page)
@@ -426,7 +456,8 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache,
/* make a new job now */
job_info->job = ev_job_render_new (pixbuf_cache->document,
page, scale,
- width, height);
+ width, height,
+ (job_info->link_mapping == NULL)?TRUE:FALSE);
ev_job_queue_add_job (job_info->job, priority);
g_signal_connect (job_info->job, "finished", G_CALLBACK (job_finished_cb), pixbuf_cache);
}
@@ -484,8 +515,8 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache,
page_cache = ev_document_get_page_cache (pixbuf_cache->document);
- g_return_if_fail (start_page > 0 && start_page <= ev_page_cache_get_n_pages (page_cache));
- g_return_if_fail (end_page > 0 && end_page <= ev_page_cache_get_n_pages (page_cache));
+ g_return_if_fail (start_page >= 0 && start_page < ev_page_cache_get_n_pages (page_cache));
+ g_return_if_fail (end_page >= 0 && end_page < ev_page_cache_get_n_pages (page_cache));
g_return_if_fail (end_page >= start_page);
/* First, resize the page_range as needed. We cull old pages
@@ -514,12 +545,27 @@ ev_pixbuf_cache_get_pixbuf (EvPixbufCache *pixbuf_cache,
/* We don't need to wait for the idle to handle the callback */
if (job_info->job &&
EV_JOB (job_info->job)->finished) {
- GdkPixbuf *pixbuf;
-
- pixbuf = g_object_ref (EV_JOB_RENDER (job_info->job)->pixbuf);
- dispose_cache_job_info (job_info, pixbuf_cache);
- job_info->pixbuf = pixbuf;
+ copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
}
return job_info->pixbuf;
}
+
+GList *
+ev_pixbuf_cache_get_link_mapping (EvPixbufCache *pixbuf_cache,
+ gint page)
+{
+ CacheJobInfo *job_info;
+
+ job_info = find_job_cache (pixbuf_cache, page);
+ if (job_info == NULL)
+ return NULL;
+
+ /* We don't need to wait for the idle to handle the callback */
+ if (job_info->job &&
+ EV_JOB (job_info->job)->finished) {
+ copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
+ }
+
+ return job_info->link_mapping;
+}
diff --git a/shell/ev-pixbuf-cache.h b/shell/ev-pixbuf-cache.h
index e49faa0..0bd1cbc 100644
--- a/shell/ev-pixbuf-cache.h
+++ b/shell/ev-pixbuf-cache.h
@@ -37,14 +37,17 @@ G_BEGIN_DECLS
typedef struct _EvPixbufCache EvPixbufCache;
typedef struct _EvPixbufCacheClass EvPixbufCacheClass;
-GType ev_pixbuf_cache_get_type (void) G_GNUC_CONST;
-EvPixbufCache *ev_pixbuf_cache_new (EvDocument *document);
-void ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache,
- gint start_page,
- gint end_page,
- gfloat scale);
-GdkPixbuf *ev_pixbuf_cache_get_pixbuf (EvPixbufCache *pixbuf_cache,
- gint page);
+GType ev_pixbuf_cache_get_type (void) G_GNUC_CONST;
+EvPixbufCache *ev_pixbuf_cache_new (EvDocument *document);
+void ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache,
+ gint start_page,
+ gint end_page,
+ gfloat scale);
+GdkPixbuf *ev_pixbuf_cache_get_pixbuf (EvPixbufCache *pixbuf_cache,
+ gint page);
+GList *ev_pixbuf_cache_get_link_mapping (EvPixbufCache *pixbuf_cache,
+ gint page);
+
G_END_DECLS
diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c
index c548e29..7bbaa09 100644
--- a/shell/ev-sidebar-thumbnails.c
+++ b/shell/ev-sidebar-thumbnails.c
@@ -118,7 +118,7 @@ ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->list_store),
&iter);
- page = gtk_tree_path_get_indices (path)[0] + 1;
+ page = gtk_tree_path_get_indices (path)[0];
gtk_tree_path_free (path);
page_cache = ev_document_get_page_cache (priv->document);
@@ -189,7 +189,7 @@ page_changed_cb (EvPageCache *page_cache,
GtkTreePath *path;
GtkTreeSelection *selection;
- path = gtk_tree_path_new_from_indices (page - 1, -1);
+ path = gtk_tree_path_new_from_indices (page, -1);
selection = gtk_tree_view_get_selection
(GTK_TREE_VIEW (sidebar->priv->tree_view));
@@ -247,12 +247,12 @@ ev_sidebar_thumbnails_set_document (EvSidebarThumbnails *sidebar_thumbnails,
loading_icon = ev_document_misc_get_thumbnail_frame (width, height, NULL);
gtk_list_store_clear (priv->list_store);
- for (i = 1; i <= n_pages; i++) {
+ for (i = 0; i < n_pages; i++) {
EvJob *job;
/* FIXME: Bah. This is still -1 for some reason. Need to track it down.. */
- job = ev_job_thumbnail_new (priv->document, i - 1, THUMBNAIL_WIDTH);
- page = g_strdup_printf ("<i>%d</i>", i);
+ job = ev_job_thumbnail_new (priv->document, i, THUMBNAIL_WIDTH);
+ page = g_strdup_printf ("<i>%d</i>", i + 1); /* FIXME: replace with string. */
gtk_list_store_append (priv->list_store, &iter);
gtk_list_store_set (priv->list_store, &iter,
COLUMN_PAGE_STRING, page,
diff --git a/shell/ev-view.c b/shell/ev-view.c
index 9921ed4..97e0c54 100644
--- a/shell/ev-view.c
+++ b/shell/ev-view.c
@@ -704,14 +704,15 @@ static char *
status_message_from_link (EvLink *link)
{
EvLinkType type;
- char *msg;
+ char *msg = NULL;
int page;
type = ev_link_get_link_type (link);
switch (type) {
case EV_LINK_TYPE_TITLE:
- msg = g_strdup (ev_link_get_title (link));
+ if (ev_link_get_title (link))
+ msg = g_strdup (ev_link_get_title (link));
break;
case EV_LINK_TYPE_PAGE:
page = ev_link_get_page (link);
@@ -721,7 +722,7 @@ status_message_from_link (EvLink *link)
msg = g_strdup (ev_link_get_uri (link));
break;
default:
- msg = NULL;
+ break;
}
return msg;
@@ -799,6 +800,56 @@ ev_view_set_cursor (EvView *view, EvViewCursor new_cursor)
}
}
+
+static void
+find_page_at_location (EvView *view,
+ gdouble x,
+ gdouble y,
+ gint *page,
+ gint *x_offset,
+ gint *y_offset)
+{
+ GtkBorder border;
+ gint width, height;
+
+ ev_page_cache_get_size (view->page_cache,
+ view->current_page,
+ view->scale,
+ &width, &height);
+ ev_document_misc_get_page_border_size (width, height, &border);
+
+ x -= (border.left + view->spacing);
+ y -= (border.top + view->spacing);
+
+ if ((x < 0) || (y < 0) ||
+ (x >= width) || (y >= height)) {
+ *page = -1;
+ return;
+ }
+ *page = view->current_page;
+ *x_offset = (gint) x;
+ *y_offset = (gint) y;
+}
+
+static EvLink *
+get_link_at_location (EvView *view,
+ gdouble x,
+ gdouble y)
+{
+ gint page;
+ gint x_offset, y_offset;
+ GList *link_mapping;
+
+ find_page_at_location (view, x, y, &page, &x_offset, &y_offset);
+ if (page == -1)
+ return NULL;
+
+ link_mapping = ev_pixbuf_cache_get_link_mapping (view->pixbuf_cache, page);
+
+ return ev_link_mapping_find (link_mapping, x_offset /view->scale, y_offset /view->scale);
+}
+
+
static gboolean
ev_view_motion_notify_event (GtkWidget *widget,
GdkEventMotion *event)
@@ -816,13 +867,10 @@ ev_view_motion_notify_event (GtkWidget *widget,
view_rect_to_doc_rect (view, &selection, &view->selection);
gtk_widget_queue_draw (widget);
- } else if (FALSE && view->document) {
+ } else if (view->document) {
EvLink *link;
- g_mutex_lock (EV_DOC_MUTEX);
- link = ev_document_get_link (view->document, event->x, event->y);
- g_mutex_unlock (EV_DOC_MUTEX);
-
+ link = get_link_at_location (view, event->x, event->y);
if (link) {
char *msg;
@@ -830,8 +878,6 @@ ev_view_motion_notify_event (GtkWidget *widget,
ev_view_set_status (view, msg);
ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK);
g_free (msg);
-
- g_object_unref (link);
} else {
ev_view_set_status (view, NULL);
if (view->cursor == EV_VIEW_CURSOR_LINK) {
@@ -856,14 +902,9 @@ ev_view_button_release_event (GtkWidget *widget,
} else if (view->document) {
EvLink *link;
- g_mutex_lock (EV_DOC_MUTEX);
- link = ev_document_get_link (view->document,
- event->x,
- event->y);
- g_mutex_unlock (EV_DOC_MUTEX);
+ link = get_link_at_location (view, event->x, event->y);
if (link) {
ev_view_go_to_link (view, link);
- g_object_unref (link);
}
}
@@ -1089,7 +1130,7 @@ ev_view_init (EvView *view)
view->spacing = 10;
view->scale = 1.0;
- view->current_page = 1;
+ view->current_page = 0;
view->pressed_button = -1;
view->cursor = EV_VIEW_CURSOR_NORMAL;
}
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 849adaf..8b3044f 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -202,10 +202,10 @@ update_action_sensitivity (EvWindow *ev_window)
page = ev_page_cache_get_current_page (ev_window->priv->page_cache);
n_pages = ev_page_cache_get_n_pages (ev_window->priv->page_cache);
- set_action_sensitive (ev_window, "GoPreviousPage", page > 1);
- set_action_sensitive (ev_window, "GoNextPage", page < n_pages);
- set_action_sensitive (ev_window, "GoFirstPage", page > 1);
- set_action_sensitive (ev_window, "GoLastPage", page < n_pages);
+ set_action_sensitive (ev_window, "GoPreviousPage", page > 0);
+ set_action_sensitive (ev_window, "GoNextPage", page < n_pages - 1);
+ set_action_sensitive (ev_window, "GoFirstPage", page > 0);
+ set_action_sensitive (ev_window, "GoLastPage", page < n_pages - 1);
} else {
set_action_sensitive (ev_window, "GoFirstPage", FALSE);
set_action_sensitive (ev_window, "GoPreviousPage", FALSE);
@@ -495,7 +495,8 @@ update_total_pages (EvWindow *ev_window)
static gboolean
document_supports_sidebar (EvDocument *document)
{
- return (EV_IS_DOCUMENT_THUMBNAILS (document) && EV_IS_DOCUMENT_LINKS (document));
+ /* FIXME: Remove the (TRUE ||) after links are fixed in poppler-glib */
+ return (EV_IS_DOCUMENT_THUMBNAILS (document) && (EV_IS_DOCUMENT_LINKS (document)));
}
static void