From c63b4b2d51e20c2a3d8eeac5ef3487e24f6796ee Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 31 Aug 2012 20:26:39 +0000 Subject: [PATCH] Some bugfixing and additional features (original zoom, keyboard shortcuts...) --- src/callbacks.c | 10 +++++ src/callbacks.h | 1 + src/pdfviewer.c | 103 +++++++++++++++++++++++++++--------------------- src/pdfviewer.h | 5 ++- 4 files changed, 73 insertions(+), 46 deletions(-) diff --git a/src/callbacks.c b/src/callbacks.c index 95f70ca..e84b046 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -1,5 +1,6 @@ /* $Id$ */ /* Copyright (c) 2010 Sébastien Bocahu */ +/* Copyright (c) 2012 Pierre Pronchery */ /* 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) { diff --git a/src/callbacks.h b/src/callbacks.h index cf6869a..3e89a5c 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -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, diff --git a/src/pdfviewer.c b/src/pdfviewer.c index 53dbf5a..03cccaa 100644 --- a/src/pdfviewer.c +++ b/src/pdfviewer.c @@ -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); +} diff --git a/src/pdfviewer.h b/src/pdfviewer.h index 84d6aac..06845f2 100644 --- a/src/pdfviewer.h +++ b/src/pdfviewer.h @@ -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);