Some bugfixing and additional features (original zoom, keyboard shortcuts...)

This commit is contained in:
Pierre Pronchery 2012-08-31 20:26:39 +00:00
parent a176f36b0a
commit c63b4b2d51
4 changed files with 73 additions and 46 deletions

View File

@ -1,5 +1,6 @@
/* $Id$ */
/* Copyright (c) 2010 Sébastien Bocahu <zecrazytux@zecrazytux.net> */
/* Copyright (c) 2012 Pierre Pronchery <khorben@defora.org> */
/* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
@ -84,6 +85,15 @@ void on_view_fullscreen(gpointer data)
}
/* on_view_normal_size */
void on_view_normal_size(gpointer data)
{
PDFviewer * pdfviewer = data;
pdf_update_scale(pdfviewer, '=', 1.0);
}
/* on_view_zoom_in */
void on_view_zoom_in(gpointer data)
{

View File

@ -28,6 +28,7 @@ void on_file_open(gpointer data);
void on_file_properties(gpointer data);
void on_help_about(gpointer data);
void on_view_fullscreen(gpointer data);
void on_view_normal_size(gpointer data);
void on_view_zoom_in(gpointer data);
void on_view_zoom_out(gpointer data);
void pdf_render_area(GtkWidget * drawing_area, GdkEventExpose * event,

View File

@ -75,12 +75,14 @@ static char const * _authors[] =
static DesktopAccel _pdfviewer_accel[] =
{
{ G_CALLBACK(on_fullscreen), 0, GDK_KEY_F11 },
#ifdef EMBEDDED
{ G_CALLBACK(on_next), 0, GDK_KEY_Page_Down },
{ G_CALLBACK(on_next), GDK_CONTROL_MASK, GDK_KEY_N },
#ifdef EMBEDDED
{ G_CALLBACK(on_open), GDK_CONTROL_MASK, GDK_KEY_O },
{ G_CALLBACK(on_pdf_close), GDK_CONTROL_MASK, GDK_KEY_W },
{ G_CALLBACK(on_previous), GDK_CONTROL_MASK, GDK_KEY_P },
#endif
{ G_CALLBACK(on_previous), 0, GDK_KEY_Page_Up },
{ G_CALLBACK(on_previous), GDK_CONTROL_MASK, GDK_KEY_P },
{ NULL, 0, 0 }
};
@ -109,6 +111,8 @@ static DesktopMenu _pdfviewer_menu_view[] =
GDK_CONTROL_MASK, GDK_KEY_plus },
{ "Zoom _out", G_CALLBACK(on_view_zoom_out), "zoom-out",
GDK_CONTROL_MASK, GDK_KEY_minus },
{ "Normal size", G_CALLBACK(on_view_normal_size), "zoom-original",
GDK_CONTROL_MASK, GDK_KEY_0 },
{ "", NULL, NULL, 0, 0 },
#if GTK_CHECK_VERSION(2, 8, 0)
{ "_Fullscreen", G_CALLBACK(on_view_fullscreen), GTK_STOCK_FULLSCREEN,
@ -158,11 +162,13 @@ static DesktopToolbar _pdfviewer_toolbar[] =
};
/* prototypes */
static void _pdfviewer_set_title(PDFviewer * pdfviewer);
/* public */
/* functions */
/* pdfviewer_new */
static void _new_set_title(PDFviewer * pdfviewer);
PDFviewer * pdfviewer_new(void)
{
PDFviewer * pdfviewer;
@ -183,7 +189,7 @@ PDFviewer * pdfviewer_new(void)
pdfviewer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_add_accel_group(GTK_WINDOW(pdfviewer->window), group);
gtk_window_set_default_size(GTK_WINDOW(pdfviewer->window), 600, 400);
_new_set_title(pdfviewer);
_pdfviewer_set_title(pdfviewer);
#if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_icon_name(GTK_WINDOW(pdfviewer->window),
"gnome-mime-application-pdf");
@ -234,22 +240,6 @@ PDFviewer * pdfviewer_new(void)
return pdfviewer;
}
static void _new_set_title(PDFviewer * pdfviewer)
{
char const * title = "(Untitled)";
char * p = NULL;
char buf[256];
if(pdfviewer->pdf != NULL)
if((p = poppler_document_get_title(pdfviewer->pdf->document))
!= NULL)
/* FIXME use the filename instead */
title = p;
snprintf(buf, sizeof(buf), "%s%s", "PDF viewer - ", title);
gtk_window_set_title(GTK_WINDOW(pdfviewer->window), buf);
free(p);
}
/* pdfviewer_delete */
void pdfviewer_delete(PDFviewer * pdfviewer)
@ -378,19 +368,22 @@ void pdfviewer_fullscreen_toggle(PDFviewer * pdfviewer)
/* pdfviewer_open */
void pdfviewer_open(PDFviewer * pdfviewer, char const * uri)
int pdfviewer_open(PDFviewer * pdfviewer, char const * filename)
{
int ret;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
/* FIXME handle errors */
if(uri == NULL)
return;
if(filename == NULL)
return pdfviewer_open_dialog(pdfviewer);
if(pdfviewer->pdf != NULL)
pdf_close(pdfviewer);
if(pdf_open(pdfviewer, uri) != 0)
return;
_new_set_title(pdfviewer); /* XXX make it a generic private function */
if((ret = pdf_open(pdfviewer, filename)) != 0)
return ret;
_pdfviewer_set_title(pdfviewer);
return 0;
}
@ -554,8 +547,9 @@ int pdf_open(PDFviewer * pdfviewer, const char * filename)
/* pdfviewer_open_dialog */
void pdfviewer_open_dialog(PDFviewer * pdfviewer)
int pdfviewer_open_dialog(PDFviewer * pdfviewer)
{
int ret;
GtkWidget * dialog;
GtkFileFilter * filter;
char * filename = NULL;
@ -581,9 +575,10 @@ void pdfviewer_open_dialog(PDFviewer * pdfviewer)
dialog));
gtk_widget_destroy(dialog);
if(filename == NULL)
return;
pdfviewer_open(pdfviewer, filename);
return 0;
ret = pdfviewer_open(pdfviewer, filename);
g_free(filename);
return ret;
}
@ -619,8 +614,10 @@ void pdf_load_page(PDFviewer * pdfviewer)
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
page = poppler_document_get_page(pdfviewer->pdf->document,
pdfviewer->pdf->current);
if((page = poppler_document_get_page(pdfviewer->pdf->document,
pdfviewer->pdf->current)) == NULL)
/* FIXME prevent this from happening but keep the check in */
return;
poppler_page_get_size(page, &width, &height);
if(!pdfviewer->pdf->scale) {
@ -639,9 +636,6 @@ void pdf_load_page(PDFviewer * pdfviewer)
#endif
}
if (!page)
return;
gtk_statusbar_push(GTK_STATUSBAR(pdfviewer->statusbar),
gtk_statusbar_get_context_id(
GTK_STATUSBAR(pdfviewer->statusbar), "read-page"),
@ -734,13 +728,14 @@ void set_prevnext_sensitivity(PDFviewer * pdfviewer)
GtkToolbar * toolbar = GTK_TOOLBAR(pdfviewer->toolbar);
gboolean farbefore, prev, next, farafter;
if(pdfviewer->pdf) { /* XXX s/5/preferences/ */
if(pdfviewer->pdf != NULL) {
/* XXX s/5/preferences/ */
farbefore = (pdfviewer->pdf->current > 5) ? TRUE : FALSE;
prev = (pdfviewer->pdf->current > 0) ? TRUE : FALSE;
next = (pdfviewer->pdf->current+1 < pdfviewer->pdf->pages) ?
TRUE : FALSE;
farafter = (pdfviewer->pdf->current+5 < pdfviewer->pdf->pages) ?
TRUE : FALSE;
next = (pdfviewer->pdf->current + 1 < pdfviewer->pdf->pages)
? TRUE : FALSE;
farafter = (pdfviewer->pdf->current + 5 < pdfviewer->pdf->pages)
? TRUE : FALSE;
} else {
farbefore = FALSE;
prev = FALSE;
@ -748,13 +743,13 @@ void set_prevnext_sensitivity(PDFviewer * pdfviewer)
farafter = FALSE;
}
gtk_widget_set_sensitive(GTK_WIDGET(
gtk_toolbar_get_nth_item(toolbar, 1)), farbefore);
gtk_toolbar_get_nth_item(toolbar, 2)), farbefore);
gtk_widget_set_sensitive(GTK_WIDGET(
gtk_toolbar_get_nth_item(toolbar, 2)), prev);
gtk_toolbar_get_nth_item(toolbar, 3)), prev);
gtk_widget_set_sensitive(GTK_WIDGET(
gtk_toolbar_get_nth_item(toolbar, 3)), next);
gtk_toolbar_get_nth_item(toolbar, 4)), next);
gtk_widget_set_sensitive(GTK_WIDGET(
gtk_toolbar_get_nth_item(toolbar, 4)), farafter);
gtk_toolbar_get_nth_item(toolbar, 5)), farafter);
}
@ -780,3 +775,23 @@ void pdf_update_scale(PDFviewer * pdfviewer, const char op, double n)
}
pdf_load_page(pdfviewer);
}
/* private */
/* functions */
/* pdfviewer_set_title */
static void _pdfviewer_set_title(PDFviewer * pdfviewer)
{
char const * title = "(Untitled)";
char * p = NULL;
char buf[256];
if(pdfviewer->pdf != NULL)
if((p = poppler_document_get_title(pdfviewer->pdf->document))
!= NULL)
/* FIXME use the filename instead */
title = p;
snprintf(buf, sizeof(buf), "%s%s", "PDF viewer - ", title);
gtk_window_set_title(GTK_WINDOW(pdfviewer->window), buf);
free(p);
}

View File

@ -36,6 +36,7 @@ void pdfviewer_set_fullscreen(PDFviewer * pdfviewer, gboolean fullscreen);
/* useful */
int pdf_open(PDFviewer * pdfviewer, const char * filename);
void pdf_open_dialog(PDFviewer * pdfviewer);
void pdf_close(PDFviewer * pdfviewer);
void pdf_update_scale(PDFviewer * pdfviewer, const char op, double n);
@ -47,8 +48,8 @@ void pdfviewer_about(PDFviewer * pdfviewer);
int pdfviewer_error(PDFviewer * pdfviewer, char const * message, int ret);
gboolean pdfviewer_close(PDFviewer * pdfviewer);
void pdfviewer_open(PDFviewer * pdfviewer, char const * filename);
void pdfviewer_open_dialog(PDFviewer * pdfviewer);
int pdfviewer_open(PDFviewer * pdfviewer, char const * filename);
int pdfviewer_open_dialog(PDFviewer * pdfviewer);
void pdfviewer_properties(PDFviewer * pdfviewer);
void pdfviewer_fullscreen_toggle(PDFviewer * pdfviewer);