aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2011-05-29 15:09:25 +0200
committerThomas White <taw@bitwiz.org.uk>2011-05-29 15:09:25 +0200
commita445fa6c5db2bee21f3e64bb8fb108ea1363fd9b (patch)
tree33cd927d86526a19999b96b7f9aec76660ec1e26 /src
parent091dbe113cfde2135d3ed389f8057022294d9fc0 (diff)
Add slide show mode
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.c61
-rw-r--r--src/mainwindow.h2
-rw-r--r--src/presentation.c1
-rw-r--r--src/presentation.h2
-rw-r--r--src/slide_render.c9
-rw-r--r--src/slide_render.h1
-rw-r--r--src/slideshow.c162
-rw-r--r--src/slideshow.h34
8 files changed, 237 insertions, 35 deletions
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 <taw@bitwiz.org.uk>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+#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 <taw@bitwiz.org.uk>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef SLIDESHOW_H
+#define SLIDESHOW_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+extern void try_start_slideshow(struct presentation *p);
+
+
+#endif /* SLIDESHOW_H */