From ae342aa6d01eb2bb9347d4ee50a3f965fb46a895 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 27 May 2011 11:40:39 +0000 Subject: [PATCH] Added a fullscreen mode --- src/callbacks.c | 22 ++++++ src/callbacks.h | 11 ++- src/pdfviewer.c | 193 ++++++++++++++++++++++++++++++++---------------- src/pdfviewer.h | 6 +- 4 files changed, 162 insertions(+), 70 deletions(-) diff --git a/src/callbacks.c b/src/callbacks.c index 8eaacbd..8609379 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -66,6 +66,15 @@ void on_file_open(gpointer data) } +/* on_view_fullscreen */ +void on_view_fullscreen(gpointer data) +{ + PDFviewer * pdfviewer = data; + + on_fullscreen(pdfviewer); +} + + /* on_view_zoom_in */ void on_view_zoom_in(gpointer data) { @@ -99,6 +108,15 @@ void on_close(gpointer data) } +/* on_fullscreen */ +void on_fullscreen(gpointer data) +{ + PDFviewer * pdfviewer = data; + + pdfviewer_fullscreen_toggle(pdfviewer); +} + + /* on_new */ void on_new(gpointer data) { @@ -116,6 +134,7 @@ void on_open(gpointer data) pdfviewer_open_dialog(pdfviewer); } + /* on_preferences */ void on_preferences(gpointer data) { @@ -124,6 +143,7 @@ void on_preferences(gpointer data) on_edit_preferences(pdfviewer); } + /* on_previous */ void on_previous(gpointer data) { @@ -133,6 +153,7 @@ void on_previous(gpointer data) pdf_load_page(pdfviewer); } + /* on_next */ void on_next(gpointer data) { @@ -142,6 +163,7 @@ void on_next(gpointer data) pdf_load_page(pdfviewer); } + /* on_far_before */ void on_far_before(gpointer data) { diff --git a/src/callbacks.h b/src/callbacks.h index cff05e7..90dd192 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -24,20 +24,23 @@ gboolean on_closex(gpointer data); void on_file_close(gpointer data); void on_file_open(gpointer data); +void on_help_about(gpointer data); +void on_view_fullscreen(gpointer data); void on_view_zoom_in(gpointer data); void on_view_zoom_out(gpointer data); -void on_help_about(gpointer data); -void pdf_render_area(GtkWidget *drawing_area, GdkEventExpose *event, void *data); +void pdf_render_area(GtkWidget * drawing_area, GdkEventExpose * event, + void * data); void on_previous(gpointer data); void on_next(gpointer data); void on_far_before(gpointer data); void on_far_after(gpointer data); -void on_zoom_out(gpointer data); -void on_zoom_in(gpointer data); /* toolbar */ void on_close(gpointer data); +void on_fullscreen(gpointer data); void on_open(gpointer data); void on_pdf_close(gpointer data); +void on_zoom_in(gpointer data); +void on_zoom_out(gpointer data); #endif /* !PDFVIEWER_CALLBACKS_H */ diff --git a/src/pdfviewer.c b/src/pdfviewer.c index 15a59d0..118e695 100644 --- a/src/pdfviewer.c +++ b/src/pdfviewer.c @@ -1,6 +1,7 @@ /* $Id$ */ static char const _copyright[] = -"Copyright (c) 2010 Sébastien Bocahu "; +"Copyright (c) 2010 Sébastien Bocahu \n" +"Copyright (c) 2011 Pierre Pronchery "; static char const _license[] = "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by the\n" @@ -32,20 +33,7 @@ static char const _license[] = /* PDFviewer */ /* private */ /* types */ -struct _PDFviewer -{ - PDF * pdf; - - /* widgets */ - GtkWidget * window; - GtkWidget * view; - GtkWidget * statusbar; - GtkWidget * toolbar; - /* about */ - GtkWidget * ab_window; -}; - -struct _PDF +typedef struct _PDF { PopplerDocument *document; @@ -55,8 +43,24 @@ struct _PDF GtkWidget *area; cairo_surface_t *surface; double scale; -}; +} PDF; +struct _PDFviewer +{ + PDF * pdf; + + /* widgets */ + GtkWidget * window; +#ifndef MENUBAR + GtkWidget * menubar; +#endif + GtkWidget * view; + GtkWidget * statusbar; + GtkWidget * toolbar; + GtkToolItem * tb_fullscreen; + /* about */ + GtkWidget * ab_window; +}; /* variables */ @@ -67,16 +71,17 @@ static char const * _authors[] = NULL }; -#ifdef EMBEDDED static DesktopAccel _pdfviewer_accel[] = { - { G_CALLBACK(on_pdf_close), GDK_CONTROL_MASK, GDK_w }, - { G_CALLBACK(on_open), GDK_CONTROL_MASK, GDK_o }, - { G_CALLBACK(on_previous), GDK_CONTROL_MASK, GDK_p }, + { G_CALLBACK(on_fullscreen), 0, GDK_KEY_F11 }, +#ifdef EMBEDDED { G_CALLBACK(on_next), GDK_CONTROL_MASK, GDK_n }, + { G_CALLBACK(on_open), GDK_CONTROL_MASK, GDK_o }, + { G_CALLBACK(on_pdf_close), GDK_CONTROL_MASK, GDK_w }, + { G_CALLBACK(on_previous), GDK_CONTROL_MASK, GDK_p }, +#endif { NULL, 0, 0 } }; -#endif #ifndef EMBEDDED static DesktopMenu _pdfviewer_menu_file[] = @@ -100,6 +105,9 @@ 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 }, + { "", NULL, NULL, 0, 0 }, + { "Fullscreen", G_CALLBACK(on_view_fullscreen), GTK_STOCK_FULLSCREEN, + 0, GDK_KEY_F11 }, { NULL, NULL, NULL, 0, 0 } }; @@ -127,14 +135,15 @@ static DesktopMenubar _pdfviewer_menubar[] = static DesktopToolbar _pdfviewer_toolbar[] = { { "Open", G_CALLBACK(on_open), GTK_STOCK_OPEN, 0, 0, NULL }, - { "FarBefore", G_CALLBACK(on_far_before), GTK_STOCK_MEDIA_PREVIOUS, + { "Far before", G_CALLBACK(on_far_before), GTK_STOCK_MEDIA_PREVIOUS, 0, 0, NULL }, { "Previous", G_CALLBACK(on_previous), GTK_STOCK_GO_BACK, 0, 0, NULL }, { "Next", G_CALLBACK(on_next), GTK_STOCK_GO_FORWARD, 0, 0, NULL }, - { "FarAfter", G_CALLBACK(on_far_after), GTK_STOCK_MEDIA_NEXT, 0, 0, NULL }, - { "ZoomIn", G_CALLBACK(on_zoom_in), GTK_STOCK_ZOOM_IN, 0, 0, NULL }, - { "ZoomOut", G_CALLBACK(on_zoom_out), GTK_STOCK_ZOOM_OUT, 0, 0, NULL }, + { "Far after", G_CALLBACK(on_far_after), GTK_STOCK_MEDIA_NEXT, 0, 0, + NULL }, + { "Zoom in", G_CALLBACK(on_zoom_in), GTK_STOCK_ZOOM_IN, 0, 0, NULL }, + { "Zoom out", G_CALLBACK(on_zoom_out), GTK_STOCK_ZOOM_OUT, 0, 0, NULL }, { NULL, NULL, NULL, 0, 0, NULL } }; @@ -151,6 +160,7 @@ PDFviewer * pdfviewer_new(void) GtkSettings * settings; GtkWidget * vbox; GtkWidget * widget; + GtkToolItem * toolitem; if((pdfviewer = malloc(sizeof(*pdfviewer))) == NULL) return NULL; @@ -171,15 +181,24 @@ PDFviewer * pdfviewer_new(void) vbox = gtk_vbox_new(FALSE, 0); /* menubar */ #ifndef EMBEDDED - widget = desktop_menubar_create(_pdfviewer_menubar, pdfviewer, group); - gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); -#else - desktop_accel_create(_pdfviewer_accel, pdfviewer, group); + pdfviewer->menubar = desktop_menubar_create(_pdfviewer_menubar, + pdfviewer, group); + gtk_box_pack_start(GTK_BOX(vbox), pdfviewer->menubar, FALSE, FALSE, 0); #endif + desktop_accel_create(_pdfviewer_accel, pdfviewer, group); /* toolbar */ pdfviewer->toolbar = desktop_toolbar_create(_pdfviewer_toolbar, pdfviewer, group); set_prevnext_sensitivity(pdfviewer); +#if GTK_CHECK_VERSION(2, 8, 0) + toolitem = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_FULLSCREEN); +#else + toolitem = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_ZOOM_FIT); +#endif + pdfviewer->tb_fullscreen = toolitem; + g_signal_connect_swapped(G_OBJECT(toolitem), "toggled", G_CALLBACK( + on_fullscreen), pdfviewer); + gtk_toolbar_insert(GTK_TOOLBAR(pdfviewer->toolbar), toolitem, -1); gtk_box_pack_start(GTK_BOX(vbox), pdfviewer->toolbar, FALSE, FALSE, 0); /* view */ widget = gtk_scrolled_window_new(NULL, NULL); @@ -227,6 +246,18 @@ void pdfviewer_delete(PDFviewer * pdfviewer) free(pdfviewer); } + +/* accessors */ +/* pdfviewer_set_fullscreen */ +void pdfviewer_set_fullscreen(PDFviewer * pdfviewer, gboolean fullscreen) +{ + if(fullscreen == TRUE) + gtk_window_fullscreen(GTK_WINDOW(pdfviewer->window)); + else + gtk_window_unfullscreen(GTK_WINDOW(pdfviewer->window)); +} + + /* useful */ /* pdfviewer_about */ static gboolean _about_on_closex(GtkWidget * widget); @@ -293,6 +324,38 @@ gboolean pdfviewer_close(PDFviewer * pdfviewer) } +/* pdfviewer_fullscreen_toggle */ +void pdfviewer_fullscreen_toggle(PDFviewer * pdfviewer) +{ + GdkWindow * window; + +#if GTK_CHECK_VERSION(2, 14, 0) + window = gtk_widget_get_window(pdfviewer->window); +#else + window = pdfviewer->window->window; +#endif + if((gdk_window_get_state(window) & GDK_WINDOW_STATE_FULLSCREEN) + != GDK_WINDOW_STATE_FULLSCREEN) + { +#ifndef EMBEDDED + gtk_widget_hide(pdfviewer->menubar); +#endif + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON( + pdfviewer->tb_fullscreen), TRUE); + pdfviewer_set_fullscreen(pdfviewer, TRUE); + } + else + { +#ifndef EMBEDDED + gtk_widget_show(pdfviewer->menubar); +#endif + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON( + pdfviewer->tb_fullscreen), FALSE); + pdfviewer_set_fullscreen(pdfviewer, FALSE); + } +} + + /* pdfviewer_open */ void pdfviewer_open(PDFviewer * pdfviewer, char const * uri) { @@ -310,6 +373,32 @@ void pdfviewer_open(PDFviewer * pdfviewer, char const * uri) } +/* pdf_open */ +int pdf_open(PDFviewer * pdfviewer, const char * uri) +{ + GError * err = NULL; + PDF * pdf; + +#ifdef DEBUG + fprintf(stderr, "DEBUG: %s(\"%s\")\n", __func__, uri); +#endif + pdfviewer->pdf = g_new0(PDF, 1); + pdf = pdfviewer->pdf; + pdf->document = poppler_document_new_from_file(uri, NULL, &err); + if(err != NULL) + { + fprintf(stderr, "error: %s", err->message); + g_error_free(err); + return 1; + } + pdf->pages = poppler_document_get_n_pages(pdf->document); + pdf_update_current(pdfviewer, '=', 0); +/* pdfviewer->pdf->scale = 1.0; */ + pdf_load_page(pdfviewer); + return 0; +} + + /* pdfviewer_open_dialog */ void pdfviewer_open_dialog(PDFviewer * pdfviewer) { @@ -320,7 +409,6 @@ void pdfviewer_open_dialog(PDFviewer * pdfviewer) #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif - dialog = gtk_file_chooser_dialog_new("Open file...", GTK_WINDOW(pdfviewer->window), GTK_FILE_CHOOSER_ACTION_OPEN, @@ -330,6 +418,10 @@ void pdfviewer_open_dialog(PDFviewer * pdfviewer) gtk_file_filter_set_name(filter, "PDF documents"); gtk_file_filter_add_mime_type(filter, "application/pdf"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); + filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, "All files"); + gtk_file_filter_add_pattern(filter, "*"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER( dialog)); @@ -340,37 +432,6 @@ void pdfviewer_open_dialog(PDFviewer * pdfviewer) g_free(uri); } -/* pdf_open */ -int pdf_open(PDFviewer * pdfviewer, const char * uri) -{ - GError * err = NULL; - -#ifdef DEBUG - fprintf(stderr, "DEBUG: %s()\n", __func__); -#endif - - pdfviewer->pdf = g_new0(PDF, 1); - pdfviewer->pdf->document = - poppler_document_new_from_file(uri, NULL, &err); - - if(err != NULL) { - fprintf(stderr, "error: %s", err->message); - g_error_free (err); - return 1; - } - - pdfviewer->pdf->pages = - poppler_document_get_n_pages(pdfviewer->pdf->document); - - pdf_update_current(pdfviewer, '=', 0); - - -/* pdfviewer->pdf->scale = 1.0; -*/ - pdf_load_page(pdfviewer); - - return 0; -} /* pdf_close */ void pdf_close(PDFviewer * pdfviewer) @@ -384,6 +445,7 @@ void pdf_close(PDFviewer * pdfviewer) free(pdfviewer->pdf); } + /* pdf_load_page */ void pdf_load_page(PDFviewer * pdfviewer) { @@ -450,6 +512,7 @@ void pdf_load_page(PDFviewer * pdfviewer) gtk_widget_queue_draw(pdfviewer->view); } + /* pdf_render_area */ void pdf_render_area(GtkWidget *area, GdkEventExpose *event, void * data) { @@ -459,25 +522,24 @@ void pdf_render_area(GtkWidget *area, GdkEventExpose *event, void * data) #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif - gdk_window_clear(gtk_widget_get_window(area)); - if(pdf == NULL) return; - cr = gdk_cairo_create(gtk_widget_get_window(area)); cairo_set_source_surface(cr, pdf->surface, 0, 0); cairo_paint(cr); cairo_destroy(cr); } + /* pdf_update_current */ void pdf_update_current(PDFviewer * pdfviewer, const char op, int n) { #ifdef DEBUG fprintf(stderr, "DEBUG: %s()\n", __func__); #endif - switch(op) { + switch(op) + { case '=': if((n >= 0) && (n <= (pdfviewer->pdf->pages - 1))) pdfviewer->pdf->current = n; @@ -527,6 +589,7 @@ void set_prevnext_sensitivity(PDFviewer * pdfviewer) ), farafter); } + /* pdf_update_scale */ void pdf_update_scale(PDFviewer * pdfviewer, const char op, double n) { diff --git a/src/pdfviewer.h b/src/pdfviewer.h index 602fb82..1c83c96 100644 --- a/src/pdfviewer.h +++ b/src/pdfviewer.h @@ -23,7 +23,6 @@ /* PDFviewer */ /* types */ -typedef struct _PDF PDF; typedef struct _PDFviewer PDFviewer; @@ -31,6 +30,9 @@ typedef struct _PDFviewer PDFviewer; PDFviewer * pdfviewer_new(void); void pdfviewer_delete(PDFviewer * pdfviewer); +/* accessors */ +void pdfviewer_set_fullscreen(PDFviewer * pdfviewer, gboolean fullscreen); + /* useful */ int pdf_open(PDFviewer * pdfviewer, const char * filename); void pdf_close(PDFviewer * pdfviewer); @@ -47,6 +49,8 @@ gboolean pdfviewer_close(PDFviewer * pdfviewer); void pdfviewer_open(PDFviewer * pdfviewer, char const * filename); void pdfviewer_open_dialog(PDFviewer * pdfviewer); +void pdfviewer_fullscreen_toggle(PDFviewer * pdfviewer); + /* FIXME not implemented */ void pdfviewer_find(PDFviewer * pdfviewer, char const * text);