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$ */ /* $Id$ */
/* Copyright (c) 2010 Sébastien Bocahu <zecrazytux@zecrazytux.net> */ /* 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 /* 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License. * 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 */ /* on_view_zoom_in */
void on_view_zoom_in(gpointer data) 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_file_properties(gpointer data);
void on_help_about(gpointer data); void on_help_about(gpointer data);
void on_view_fullscreen(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_in(gpointer data);
void on_view_zoom_out(gpointer data); void on_view_zoom_out(gpointer data);
void pdf_render_area(GtkWidget * drawing_area, GdkEventExpose * event, void pdf_render_area(GtkWidget * drawing_area, GdkEventExpose * event,

View File

@ -75,12 +75,14 @@ static char const * _authors[] =
static DesktopAccel _pdfviewer_accel[] = static DesktopAccel _pdfviewer_accel[] =
{ {
{ G_CALLBACK(on_fullscreen), 0, GDK_KEY_F11 }, { 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 }, { 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_open), GDK_CONTROL_MASK, GDK_KEY_O },
{ G_CALLBACK(on_pdf_close), GDK_CONTROL_MASK, GDK_KEY_W }, { G_CALLBACK(on_pdf_close), GDK_CONTROL_MASK, GDK_KEY_W },
{ G_CALLBACK(on_previous), GDK_CONTROL_MASK, GDK_KEY_P },
#endif #endif
{ G_CALLBACK(on_previous), 0, GDK_KEY_Page_Up },
{ G_CALLBACK(on_previous), GDK_CONTROL_MASK, GDK_KEY_P },
{ NULL, 0, 0 } { NULL, 0, 0 }
}; };
@ -109,6 +111,8 @@ static DesktopMenu _pdfviewer_menu_view[] =
GDK_CONTROL_MASK, GDK_KEY_plus }, GDK_CONTROL_MASK, GDK_KEY_plus },
{ "Zoom _out", G_CALLBACK(on_view_zoom_out), "zoom-out", { "Zoom _out", G_CALLBACK(on_view_zoom_out), "zoom-out",
GDK_CONTROL_MASK, GDK_KEY_minus }, 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 }, { "", NULL, NULL, 0, 0 },
#if GTK_CHECK_VERSION(2, 8, 0) #if GTK_CHECK_VERSION(2, 8, 0)
{ "_Fullscreen", G_CALLBACK(on_view_fullscreen), GTK_STOCK_FULLSCREEN, { "_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 */ /* public */
/* functions */ /* functions */
/* pdfviewer_new */ /* pdfviewer_new */
static void _new_set_title(PDFviewer * pdfviewer);
PDFviewer * pdfviewer_new(void) PDFviewer * pdfviewer_new(void)
{ {
PDFviewer * pdfviewer; PDFviewer * pdfviewer;
@ -183,7 +189,7 @@ PDFviewer * pdfviewer_new(void)
pdfviewer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); pdfviewer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_add_accel_group(GTK_WINDOW(pdfviewer->window), group); gtk_window_add_accel_group(GTK_WINDOW(pdfviewer->window), group);
gtk_window_set_default_size(GTK_WINDOW(pdfviewer->window), 600, 400); 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) #if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_icon_name(GTK_WINDOW(pdfviewer->window), gtk_window_set_icon_name(GTK_WINDOW(pdfviewer->window),
"gnome-mime-application-pdf"); "gnome-mime-application-pdf");
@ -234,22 +240,6 @@ PDFviewer * pdfviewer_new(void)
return pdfviewer; 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 */ /* pdfviewer_delete */
void pdfviewer_delete(PDFviewer * pdfviewer) void pdfviewer_delete(PDFviewer * pdfviewer)
@ -378,19 +368,22 @@ void pdfviewer_fullscreen_toggle(PDFviewer * pdfviewer)
/* pdfviewer_open */ /* pdfviewer_open */
void pdfviewer_open(PDFviewer * pdfviewer, char const * uri) int pdfviewer_open(PDFviewer * pdfviewer, char const * filename)
{ {
int ret;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
/* FIXME handle errors */ /* FIXME handle errors */
if(uri == NULL) if(filename == NULL)
return; return pdfviewer_open_dialog(pdfviewer);
if(pdfviewer->pdf != NULL) if(pdfviewer->pdf != NULL)
pdf_close(pdfviewer); pdf_close(pdfviewer);
if(pdf_open(pdfviewer, uri) != 0) if((ret = pdf_open(pdfviewer, filename)) != 0)
return; return ret;
_new_set_title(pdfviewer); /* XXX make it a generic private function */ _pdfviewer_set_title(pdfviewer);
return 0;
} }
@ -554,8 +547,9 @@ int pdf_open(PDFviewer * pdfviewer, const char * filename)
/* pdfviewer_open_dialog */ /* pdfviewer_open_dialog */
void pdfviewer_open_dialog(PDFviewer * pdfviewer) int pdfviewer_open_dialog(PDFviewer * pdfviewer)
{ {
int ret;
GtkWidget * dialog; GtkWidget * dialog;
GtkFileFilter * filter; GtkFileFilter * filter;
char * filename = NULL; char * filename = NULL;
@ -581,9 +575,10 @@ void pdfviewer_open_dialog(PDFviewer * pdfviewer)
dialog)); dialog));
gtk_widget_destroy(dialog); gtk_widget_destroy(dialog);
if(filename == NULL) if(filename == NULL)
return; return 0;
pdfviewer_open(pdfviewer, filename); ret = pdfviewer_open(pdfviewer, filename);
g_free(filename); g_free(filename);
return ret;
} }
@ -619,8 +614,10 @@ void pdf_load_page(PDFviewer * pdfviewer)
fprintf(stderr, "DEBUG: %s()\n", __func__); fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif #endif
page = poppler_document_get_page(pdfviewer->pdf->document, if((page = poppler_document_get_page(pdfviewer->pdf->document,
pdfviewer->pdf->current); pdfviewer->pdf->current)) == NULL)
/* FIXME prevent this from happening but keep the check in */
return;
poppler_page_get_size(page, &width, &height); poppler_page_get_size(page, &width, &height);
if(!pdfviewer->pdf->scale) { if(!pdfviewer->pdf->scale) {
@ -639,9 +636,6 @@ void pdf_load_page(PDFviewer * pdfviewer)
#endif #endif
} }
if (!page)
return;
gtk_statusbar_push(GTK_STATUSBAR(pdfviewer->statusbar), gtk_statusbar_push(GTK_STATUSBAR(pdfviewer->statusbar),
gtk_statusbar_get_context_id( gtk_statusbar_get_context_id(
GTK_STATUSBAR(pdfviewer->statusbar), "read-page"), GTK_STATUSBAR(pdfviewer->statusbar), "read-page"),
@ -734,13 +728,14 @@ void set_prevnext_sensitivity(PDFviewer * pdfviewer)
GtkToolbar * toolbar = GTK_TOOLBAR(pdfviewer->toolbar); GtkToolbar * toolbar = GTK_TOOLBAR(pdfviewer->toolbar);
gboolean farbefore, prev, next, farafter; 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; farbefore = (pdfviewer->pdf->current > 5) ? TRUE : FALSE;
prev = (pdfviewer->pdf->current > 0) ? TRUE : FALSE; prev = (pdfviewer->pdf->current > 0) ? TRUE : FALSE;
next = (pdfviewer->pdf->current+1 < pdfviewer->pdf->pages) ? next = (pdfviewer->pdf->current + 1 < pdfviewer->pdf->pages)
TRUE : FALSE; ? TRUE : FALSE;
farafter = (pdfviewer->pdf->current+5 < pdfviewer->pdf->pages) ? farafter = (pdfviewer->pdf->current + 5 < pdfviewer->pdf->pages)
TRUE : FALSE; ? TRUE : FALSE;
} else { } else {
farbefore = FALSE; farbefore = FALSE;
prev = FALSE; prev = FALSE;
@ -748,13 +743,13 @@ void set_prevnext_sensitivity(PDFviewer * pdfviewer)
farafter = FALSE; farafter = FALSE;
} }
gtk_widget_set_sensitive(GTK_WIDGET( 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_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_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_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); 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 */ /* useful */
int pdf_open(PDFviewer * pdfviewer, const char * filename); int pdf_open(PDFviewer * pdfviewer, const char * filename);
void pdf_open_dialog(PDFviewer * pdfviewer);
void pdf_close(PDFviewer * pdfviewer); void pdf_close(PDFviewer * pdfviewer);
void pdf_update_scale(PDFviewer * pdfviewer, const char op, double n); 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); int pdfviewer_error(PDFviewer * pdfviewer, char const * message, int ret);
gboolean pdfviewer_close(PDFviewer * pdfviewer); gboolean pdfviewer_close(PDFviewer * pdfviewer);
void pdfviewer_open(PDFviewer * pdfviewer, char const * filename); int pdfviewer_open(PDFviewer * pdfviewer, char const * filename);
void pdfviewer_open_dialog(PDFviewer * pdfviewer); int pdfviewer_open_dialog(PDFviewer * pdfviewer);
void pdfviewer_properties(PDFviewer * pdfviewer); void pdfviewer_properties(PDFviewer * pdfviewer);
void pdfviewer_fullscreen_toggle(PDFviewer * pdfviewer); void pdfviewer_fullscreen_toggle(PDFviewer * pdfviewer);