From a445fa6c5db2bee21f3e64bb8fb108ea1363fd9b Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sun, 29 May 2011 15:09:25 +0200 Subject: Add slide show mode --- src/mainwindow.c | 61 +++++++++----------- src/mainwindow.h | 2 +- src/presentation.c | 1 + src/presentation.h | 2 + src/slide_render.c | 9 +++ src/slide_render.h | 1 + src/slideshow.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/slideshow.h | 34 +++++++++++ 8 files changed, 237 insertions(+), 35 deletions(-) create mode 100644 src/slideshow.c create mode 100644 src/slideshow.h (limited to 'src') diff --git a/src/mainwindow.c b/src/mainwindow.c index cbc0014..6feaddc 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -35,6 +35,7 @@ #include "mainwindow.h" #include "slide_render.h" #include "objects.h" +#include "slideshow.h" static void add_ui_sig(GtkUIManager *ui, GtkWidget *widget, @@ -124,6 +125,21 @@ static void update_toolbar(struct presentation *p) } +static gint start_slideshow_sig(GtkWidget *widget, struct presentation *p) +{ + try_start_slideshow(p); + return FALSE; +} + + +void notify_slide_changed(struct presentation *p) +{ + p->editing_object = NULL; + update_toolbar(p); + gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE); +} + + static gint add_slide_sig(GtkWidget *widget, struct presentation *p) { struct slide *new; @@ -131,11 +147,7 @@ static gint add_slide_sig(GtkWidget *widget, struct presentation *p) new = add_slide(p, p->view_slide_number); p->view_slide = new; p->view_slide_number++; - p->editing_object = NULL; - - update_toolbar(p); - - gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE); + notify_slide_changed(p); return FALSE; } @@ -145,11 +157,7 @@ static gint first_slide_sig(GtkWidget *widget, struct presentation *p) { p->view_slide_number = 0; p->view_slide = p->slides[0]; - p->editing_object = NULL; - - update_toolbar(p); - - gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE); + notify_slide_changed(p); return FALSE; } @@ -161,11 +169,7 @@ static gint prev_slide_sig(GtkWidget *widget, struct presentation *p) p->view_slide_number--; p->view_slide = p->slides[p->view_slide_number]; - p->editing_object = NULL; - - update_toolbar(p); - - gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE); + notify_slide_changed(p); return FALSE; } @@ -177,11 +181,7 @@ static gint next_slide_sig(GtkWidget *widget, struct presentation *p) p->view_slide_number++; p->view_slide = p->slides[p->view_slide_number]; - p->editing_object = NULL; - - update_toolbar(p); - - gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE); + notify_slide_changed(p); return FALSE; } @@ -191,11 +191,7 @@ static gint last_slide_sig(GtkWidget *widget, struct presentation *p) { p->view_slide_number = p->num_slides-1; p->view_slide = p->slides[p->view_slide_number]; - p->editing_object = NULL; - - update_toolbar(p); - - gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE); + notify_slide_changed(p); return FALSE; } @@ -214,6 +210,8 @@ static void add_menu_bar(struct presentation *p, GtkWidget *vbox) { "AboutAction", GTK_STOCK_ABOUT, "_About...", NULL, NULL, G_CALLBACK(about_sig) }, + { "SlideshowAction", GTK_STOCK_FULLSCREEN, "Start Presentation", + NULL, NULL, G_CALLBACK(start_slideshow_sig) }, { "AddSlideAction", GTK_STOCK_ADD, "Add Slide", NULL, NULL, G_CALLBACK(add_slide_sig) }, { "ButtonFirstSlideAction", GTK_STOCK_GOTO_FIRST, "First Slide", @@ -224,6 +222,10 @@ static void add_menu_bar(struct presentation *p, GtkWidget *vbox) NULL, NULL, G_CALLBACK(next_slide_sig) }, { "ButtonLastSlideAction", GTK_STOCK_GOTO_LAST, "Last Slide", NULL, NULL, G_CALLBACK(last_slide_sig) }, + { "ButtonToolSelectAction", NULL, "Select", + NULL, NULL, NULL }, + { "ButtonToolTextAction", NULL, "Text", + NULL, NULL, NULL }, }; guint n_entries = G_N_ELEMENTS(entries); @@ -384,15 +386,6 @@ static void draw_editing_bits(cairo_t *cr, struct object *o) } -static void check_redraw_slide(struct slide *s) -{ - /* Update necessary? */ - if ( s->object_seq <= s->render_cache_seq ) return; - - render_slide(s); -} - - static gboolean expose_sig(GtkWidget *da, GdkEventExpose *event, struct presentation *p) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 9b653f9..3c1f1c4 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -29,6 +29,6 @@ extern int open_mainwindow(struct presentation *p); - +extern void notify_slide_changed(struct presentation *p); #endif /* MAINWINDOW_H */ diff --git a/src/presentation.c b/src/presentation.c index 4dc9e59..f9fe1f3 100644 --- a/src/presentation.c +++ b/src/presentation.c @@ -157,6 +157,7 @@ struct presentation *new_presentation() new->window = NULL; new->ui = NULL; new->action_group = NULL; + new->slideshow = NULL; new->slide_width = 1024.0; new->slide_height = 768.0; diff --git a/src/presentation.h b/src/presentation.h index a96d215..d9583fe 100644 --- a/src/presentation.h +++ b/src/presentation.h @@ -55,6 +55,8 @@ struct presentation GtkUIManager *ui; GtkActionGroup *action_group; GtkIMContext *im_context; + GtkWidget *slideshow; + GtkWidget *ss_drawingarea; double slide_width; double slide_height; diff --git a/src/slide_render.c b/src/slide_render.c index d0e5a5e..6dec16f 100644 --- a/src/slide_render.c +++ b/src/slide_render.c @@ -111,3 +111,12 @@ int render_slide(struct slide *s) return 0; } + + +void check_redraw_slide(struct slide *s) +{ + /* Update necessary? */ + if ( s->object_seq <= s->render_cache_seq ) return; + + render_slide(s); +} diff --git a/src/slide_render.h b/src/slide_render.h index 5beb353..0ec2c63 100644 --- a/src/slide_render.h +++ b/src/slide_render.h @@ -32,5 +32,6 @@ extern int render_slide(struct slide *s); extern void draw_caret(cairo_t *cr, struct object *o); +extern void check_redraw_slide(struct slide *s); #endif /* SLIDE_RENDER_H */ diff --git a/src/slideshow.c b/src/slideshow.c new file mode 100644 index 0000000..00b7dd7 --- /dev/null +++ b/src/slideshow.c @@ -0,0 +1,162 @@ +/* + * slideshow.c + * + * Colloquium - A tiny presentation program + * + * Copyright (c) 2011 Thomas White + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include "presentation.h" +#include "slide_render.h" +#include "mainwindow.h" + + +static gint ss_destroy_sig(GtkWidget *widget, struct presentation *p) +{ + p->slideshow = NULL; + return FALSE; +} + + +static gboolean ss_expose_sig(GtkWidget *da, GdkEventExpose *event, + struct presentation *p) +{ + cairo_t *cr; + GtkAllocation allocation; + double xoff, yoff; + + check_redraw_slide(p->view_slide); + + cr = gdk_cairo_create(da->window); + + /* Overall background */ + cairo_rectangle(cr, event->area.x, event->area.y, + event->area.width, event->area.height); + cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); + cairo_fill(cr); + + /* Get the overall size */ + gtk_widget_get_allocation(da, &allocation); + xoff = (allocation.width - p->slide_width)/2.0; + yoff = (allocation.height - p->slide_height)/2.0; + p->border_offs_x = xoff; p->border_offs_y = yoff; + + /* Draw the slide from the cache */ + cairo_rectangle(cr, event->area.x, event->area.y, + event->area.width, event->area.height); + cairo_set_source_surface(cr, p->view_slide->render_cache, xoff, yoff); + cairo_fill(cr); + + cairo_destroy(cr); + + return FALSE; +} + + +static gint prev_slide_sig(GtkWidget *widget, struct presentation *p) +{ + if ( p->view_slide_number == 0 ) return FALSE; + + p->view_slide_number--; + p->view_slide = p->slides[p->view_slide_number]; + + gdk_window_invalidate_rect(p->ss_drawingarea->window, NULL, FALSE); + + notify_slide_changed(p); + + return FALSE; +} + + +static gint next_slide_sig(GtkWidget *widget, struct presentation *p) +{ + if ( p->view_slide_number == p->num_slides-1 ) return FALSE; + + p->view_slide_number++; + p->view_slide = p->slides[p->view_slide_number]; + + gdk_window_invalidate_rect(p->ss_drawingarea->window, NULL, FALSE); + + notify_slide_changed(p); + + return FALSE; +} + + +static gboolean ss_key_press_sig(GtkWidget *da, GdkEventKey *event, + struct presentation *p) +{ + switch ( event->keyval ) { + + case GDK_KEY_Page_Up : + prev_slide_sig(NULL, p); + break; + + case GDK_KEY_Page_Down : + next_slide_sig(NULL, p); + break; + + case GDK_KEY_Escape : + gtk_widget_destroy(p->ss_drawingarea); + gtk_widget_destroy(p->slideshow); + break; + + } + + return FALSE; +} + + +void try_start_slideshow(struct presentation *p) +{ + GtkWidget *n; + + /* Presentation already running? */ + if ( p->slideshow != NULL ) return; + + n = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + p->ss_drawingarea = gtk_drawing_area_new(); + gtk_container_add(GTK_CONTAINER(n), p->ss_drawingarea); + + gtk_widget_set_can_focus(GTK_WIDGET(p->ss_drawingarea), TRUE); + gtk_widget_add_events(GTK_WIDGET(p->ss_drawingarea), + GDK_KEY_PRESS_MASK); + + g_signal_connect(G_OBJECT(p->ss_drawingarea), "key-press-event", + G_CALLBACK(ss_key_press_sig), p); + g_signal_connect(G_OBJECT(p->ss_drawingarea), "expose-event", + G_CALLBACK(ss_expose_sig), p); + g_signal_connect(G_OBJECT(n), "destroy", G_CALLBACK(ss_destroy_sig), p); + + gtk_widget_grab_focus(GTK_WIDGET(p->ss_drawingarea)); + + p->slideshow = n; + gtk_window_fullscreen(GTK_WINDOW(n)); + gtk_widget_show_all(GTK_WIDGET(n)); +} diff --git a/src/slideshow.h b/src/slideshow.h new file mode 100644 index 0000000..9fb0a16 --- /dev/null +++ b/src/slideshow.h @@ -0,0 +1,34 @@ +/* + * slideshow.h + * + * Colloquium - A tiny presentation program + * + * Copyright (c) 2011 Thomas White + * + * 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, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifndef SLIDESHOW_H +#define SLIDESHOW_H + +#ifdef HAVE_CONFIG_H +#include +#endif + + +extern void try_start_slideshow(struct presentation *p); + + +#endif /* SLIDESHOW_H */ -- cgit v1.2.3