Added a fullscreen mode

This commit is contained in:
Pierre Pronchery 2011-05-27 11:40:39 +00:00
parent b45589f599
commit ae342aa6d0
4 changed files with 162 additions and 70 deletions

View File

@ -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)
{

View File

@ -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 */

View File

@ -1,6 +1,7 @@
/* $Id$ */
static char const _copyright[] =
"Copyright (c) 2010 Sébastien Bocahu <zecrazytux@zecrazytux.net>";
"Copyright (c) 2010 Sébastien Bocahu <zecrazytux@zecrazytux.net>\n"
"Copyright (c) 2011 Pierre Pronchery <khorben@defora.org>";
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)
{

View File

@ -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);