fd->exifdate = 0;
fd->rating = STAR_RATING_NOT_READ;
fd->format_class = filter_file_get_class(path_utf8);
+ fd->page_num = 0;
+ fd->page_total = 0;
user = getpwuid(st->st_uid);
if (!user)
{
g_hash_table_foreach(file_data_pool, marks_clear, NULL);
}
+
+void file_data_inc_page_num(FileData *fd)
+{
+ if (fd->page_total > 0 && fd->page_num < fd->page_total - 1)
+ {
+ fd->page_num = fd->page_num + 1;
+ }
+ else if (fd->page_total == 0)
+ {
+ fd->page_num = fd->page_num + 1;
+ }
+ file_data_send_notification(fd, NOTIFY_REREAD);
+}
+
+void file_data_dec_page_num(FileData *fd)
+{
+ if (fd->page_num > 0)
+ {
+ fd->page_num = fd->page_num - 1;
+ }
+ file_data_send_notification(fd, NOTIFY_REREAD);
+}
+
+void file_data_set_page_total(FileData *fd, gint page_total)
+{
+ fd->page_total = page_total;
+}
+
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
gboolean marks_list_load(const gchar *path);
void marks_clear_all();
void read_rating_data(FileData *file);
+
+void file_data_inc_page_num(FileData *fd);
+void file_data_dec_page_num(FileData *fd);
+void file_data_set_page_total(FileData *fd, gint page_total);
#endif
/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
image_loader_backend_set_default(&il->backend);
il->loader = il->backend.loader_new(image_loader_area_updated_cb, image_loader_size_cb, image_loader_area_prepared_cb, il);
+
+ if (il->fd->format_class == FORMAT_CLASS_PDF)
+ {
+ il->backend.set_page_num(il->loader, il->fd->page_num);
+ }
+
g_mutex_unlock(il->data_mutex);
}
return FALSE;
}
+ if (il->fd->format_class == FORMAT_CLASS_PDF)
+ {
+ gint i = il->backend.get_page_total(il->loader);
+ file_data_set_page_total(il->fd, i);
+ }
+
il->bytes_read += b;
/* read until size is known */
typedef void (*ImageLoaderBackendFuncFree)(gpointer loader);
typedef gchar* (*ImageLoaderBackendFuncGetFormatName)(gpointer loader);
typedef gchar** (*ImageLoaderBackendFuncGetFormatMimeTypes)(gpointer loader);
+typedef void (*ImageLoaderBackendFuncSetPageNum)(gpointer loader, gint page_num);
+typedef gint (*ImageLoaderBackendFuncGetPageTotal)(gpointer loader);
typedef struct _ImageLoaderBackend ImageLoaderBackend;
struct _ImageLoaderBackend
ImageLoaderBackendFuncFree free;
ImageLoaderBackendFuncGetFormatName get_format_name;
ImageLoaderBackendFuncGetFormatMimeTypes get_format_mime_types;
+ ImageLoaderBackendFuncSetPageNum set_page_num;
+ ImageLoaderBackendFuncGetPageTotal get_page_total;
};
guint requested_width;
guint requested_height;
gboolean abort;
+ gint page_num;
+ gint page_total;
};
static gboolean image_loader_pdf_load(gpointer loader, const guchar *buf, gsize count, GError **error)
GError *poppler_error = NULL;
PopplerPage *page;
PopplerDocument *document;
- gint page_num;
gdouble width, height;
cairo_surface_t *surface;
cairo_t *cr;
gboolean ret = FALSE;
+ gint page_total;
+DEBUG_0(" ");
- page_num = 0;
document = poppler_document_new_from_data((gchar *)buf, count, NULL, &poppler_error);
if (poppler_error)
}
else
{
- page = poppler_document_get_page(document, page_num);
+ page_total = poppler_document_get_n_pages(document);
+ if (page_total > 0)
+ {
+ ld->page_total = page_total;
+ }
+
+ page = poppler_document_get_page(document, ld->page_num);
poppler_page_get_size(page, &width, &height);
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
loader->size_cb = size_cb;
loader->area_prepared_cb = area_prepared_cb;
loader->data = data;
+ loader->page_num = 0;
return (gpointer) loader;
}
return g_strdupv(mime);
}
+static void image_loader_pdf_set_page_num(gpointer loader, gint page_num)
+{
+ ImageLoader *il = (ImageLoader *) loader;
+ ImageLoaderPDF *ld = (ImageLoaderPDF *) loader;
+
+ ld->page_num = page_num;
+}
+
+static gint image_loader_pdf_get_page_total(gpointer loader)
+{
+ ImageLoaderPDF *ld = (ImageLoaderPDF *) loader;
+
+ return ld->page_total;
+}
+
static gboolean image_loader_pdf_close(gpointer loader, GError **error)
{
return TRUE;
funcs->free = image_loader_pdf_free;
funcs->get_format_name = image_loader_pdf_get_format_name;
funcs->get_format_mime_types = image_loader_pdf_get_format_mime_types;
+ funcs->set_page_num = image_loader_pdf_set_page_num;
+ funcs->get_page_total = image_loader_pdf_get_page_total;
}
#endif
void layout_status_update_image(LayoutWindow *lw)
{
guint64 n;
+ FileData *fd;
+ gint page_total;
+ gint page_num;
if (!layout_valid(&lw) || !lw->image) return;
if (!lw->info_zoom || !lw->info_details) return; /*called from layout_style_set */
else
{
gint width, height;
-
+ fd = image_get_fd(lw->image);
+ page_total = fd->page_total;
+ page_num = fd->page_num + 1;
image_get_image_size(lw->image, &width, &height);
- text = g_strdup_printf(_("( %d x %d ) %s bytes"),
- width, height, b);
+
+ if (page_total > 0)
+ {
+ text = g_strdup_printf(_("( %d x %d ) %s bytes%s%d%s%d%s"), width, height, b, "[", page_num, "/", page_total, "]");
+ }
+ else
+ {
+ text = g_strdup_printf(_("( %d x %d ) %s bytes"), width, height, b);
+ }
}
g_signal_emit_by_name (lw->image->pr, "update-pixel");
layout_image_next(lw);
}
+static void layout_menu_page_next_cb(GtkAction *action, gpointer data)
+{
+ LayoutWindow *lw = data;
+ FileData *fd = layout_image_get_fd(lw);
+
+ file_data_inc_page_num(fd);
+}
+
+static void layout_menu_page_previous_cb(GtkAction *action, gpointer data)
+{
+ LayoutWindow *lw = data;
+ FileData *fd = layout_image_get_fd(lw);
+
+ file_data_dec_page_num(fd);
+}
+
static void layout_menu_split_pane_next_cb(GtkAction *action, gpointer data)
{
LayoutWindow *lw = data;
{ "PrevImageAlt2", GTK_STOCK_GO_UP, N_("_Previous Image"), "KP_Page_Up", N_("Previous Image"), CB(layout_menu_image_prev_cb) },
{ "NextImage", GTK_STOCK_GO_DOWN, N_("_Next Image"), "space", N_("Next Image"), CB(layout_menu_image_next_cb) },
{ "NextImageAlt1", GTK_STOCK_GO_DOWN, N_("_Next Image"), "Page_Down", N_("Next Image"), CB(layout_menu_image_next_cb) },
+
+ { "NextPage", NULL, N_("_Next Page"), "<control>Page_Down", N_("Next Page"), CB(layout_menu_page_next_cb) },
+ { "PrevPage", NULL, N_("_Previous Page"), "<control>Page_Up", N_("Previous Page"), CB(layout_menu_page_previous_cb) },
+
+
{ "NextImageAlt2", GTK_STOCK_GO_DOWN, N_("_Next Image"), "KP_Page_Down", N_("Next Image"), CB(layout_menu_image_next_cb) },
{ "LastImage", GTK_STOCK_GOTO_BOTTOM, N_("_Last Image"), "End", N_("Last Image"), CB(layout_menu_image_last_cb) },
{ "Back", GTK_STOCK_GO_BACK, N_("_Back"), NULL, N_("Back"), CB(layout_menu_back_cb) },
" <menuitem action='Up'/>"
" <menuitem action='Home'/>"
" <separator/>"
+" <menuitem action='NextPage'/>"
+" <menuitem action='PrevPage'/>"
" </menu>"
" <menu action='SelectMenu'>"
" <menuitem action='SelectAll'/>"
gchar *sym_link;
SelectionType selected; // Used by view_file_icon.
+
+ gint page_num;
+ gint page_total;
};
struct _LayoutOptions