aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2013-02-01 23:43:22 +0100
committerThomas White <taw@bitwiz.org.uk>2013-02-01 23:43:22 +0100
commit36191c9579ca94eedcd54d4127b08a684e670a0b (patch)
tree7a384952c59e92a25d2a32d343290d635c9f80e9 /src
parenta1f6a1a06287421ddee2a1e68f88f52fd6e161dd (diff)
Slide change logic
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.c141
-rw-r--r--src/mainwindow.h5
-rw-r--r--src/render.c13
-rw-r--r--src/render.h1
-rw-r--r--src/slideshow.c76
-rw-r--r--src/slideshow.h5
6 files changed, 171 insertions, 70 deletions
diff --git a/src/mainwindow.c b/src/mainwindow.c
index 0113d66..5edc7e1 100644
--- a/src/mainwindow.c
+++ b/src/mainwindow.c
@@ -39,6 +39,7 @@
#include "slideshow.h"
+/* Update a slide, once it's been edited in some way. */
static void rerender_slide(struct presentation *p, PangoContext *pc)
{
int w, h;
@@ -54,14 +55,38 @@ static void rerender_slide(struct presentation *p, PangoContext *pc)
h = (p->slide_height/p->slide_width) * w;
s->rendered_edit = render_slide(s, w, h);
- /* Is this slide currently being displayed on the projector? */
w = s->parent->proj_slide_width;
h = (s->parent->slide_height/s->parent->slide_width) * w;
s->rendered_proj = render_slide(s, w, h);
+ printf("rendered everything for %p\n", s);
}
-static void redraw(struct presentation *p)
+/* Ensure that "edit" and "proj" renderings are in order */
+static void render_edit_and_proj(struct presentation *p, PangoContext *pc)
+{
+ int w, h;
+ struct slide *s = p->cur_edit_slide;
+
+ if ( s->rendered_edit == NULL ) {
+ w = p->edit_slide_width;
+ h = (p->slide_height/p->slide_width) * w;
+ s->rendered_edit = render_slide(s, w, h);
+ printf("rendered edit for %p\n", s);
+ }
+
+ if ( s->rendered_proj == NULL ) {
+ w = s->parent->proj_slide_width;
+ h = (s->parent->slide_height/s->parent->slide_width) * w;
+ s->rendered_proj = render_slide(s, w, h);
+ printf("rendered proj for %p\n", s);
+ }
+}
+
+
+
+/* Force a redraw of the editor window */
+void redraw_editor(struct presentation *p)
{
gint w, h;
@@ -413,24 +438,29 @@ static gint start_slideshow_sig(GtkWidget *widget, struct presentation *p)
}
-void notify_slide_changed(struct presentation *p, struct slide *np)
+/* Change the editor's slide to "np" */
+void change_edit_slide(struct presentation *p, struct slide *np)
{
- free_render_buffers(p->cur_edit_slide);
+ /* If this slide is not being shown on the projector, we can free the
+ * buffers */
+ if ( p->cur_proj_slide != p->cur_edit_slide ) {
+ free_render_buffers_except_thumb(p->cur_edit_slide);
+ }
+
p->cur_edit_slide = np;
- rerender_slide(p, p->pc);
+ render_edit_and_proj(p, p->pc);
set_selection(p, NULL);
-
update_toolbar(p);
- redraw(p);
+ redraw_editor(p);
//if ( p->notes != NULL ) {
// notify_notes_slide_changed(p, np);
//}
if ( (p->slideshow != NULL) && p->slideshow_linked ) {
- notify_slideshow_slide_changed(p, np);
- }
+ change_proj_slide(p, np);
+ } /* else leave the slideshow alone */
}
@@ -442,7 +472,7 @@ static gint add_slide_sig(GtkWidget *widget, struct presentation *p)
cur_slide_number = slide_number(p, p->cur_edit_slide);
new = add_slide(p, cur_slide_number);
- notify_slide_changed(p, new);
+ change_edit_slide(p, new);
return FALSE;
}
@@ -450,7 +480,7 @@ static gint add_slide_sig(GtkWidget *widget, struct presentation *p)
static gint first_slide_sig(GtkWidget *widget, struct presentation *p)
{
- notify_slide_changed(p, p->slides[0]);
+ change_edit_slide(p, p->slides[0]);
return FALSE;
}
@@ -462,7 +492,7 @@ static gint prev_slide_sig(GtkWidget *widget, struct presentation *p)
cur_slide_number = slide_number(p, p->cur_edit_slide);
if ( cur_slide_number == 0 ) return FALSE;
- notify_slide_changed(p, p->slides[cur_slide_number-1]);
+ change_edit_slide(p, p->slides[cur_slide_number-1]);
return FALSE;
}
@@ -475,7 +505,7 @@ static gint next_slide_sig(GtkWidget *widget, struct presentation *p)
cur_slide_number = slide_number(p, p->cur_edit_slide);
if ( cur_slide_number == p->num_slides-1 ) return FALSE;
- notify_slide_changed(p, p->slides[cur_slide_number+1]);
+ change_edit_slide(p, p->slides[cur_slide_number+1]);
return FALSE;
}
@@ -483,7 +513,7 @@ static gint next_slide_sig(GtkWidget *widget, struct presentation *p)
static gint last_slide_sig(GtkWidget *widget, struct presentation *p)
{
- notify_slide_changed(p, p->slides[p->num_slides-1]);
+ change_edit_slide(p, p->slides[p->num_slides-1]);
return FALSE;
}
@@ -525,7 +555,7 @@ static gint add_furniture(GtkWidget *widget, struct presentation *p)
fr->sc = "Hello";
set_selection(p, fr);
rerender_slide(p, p->pc);
- redraw(p);
+ redraw_editor(p);
return 0;
}
@@ -844,11 +874,79 @@ static gint realise_sig(GtkWidget *da, struct presentation *p)
}
+static gboolean im_commit_sig(GtkIMContext *im, gchar *str,
+ struct presentation *p)
+{
+ if ( p->n_selection == 0 ) {
+ if ( str[0] == 'b' ) {
+ check_toggle_blank(p);
+ } else {
+ printf("IM keypress: %s\n", str);
+ }
+ return FALSE;
+ }
+
+ //im_commit(p->editing_object, str); FIXME!
+
+ return FALSE;
+}
+
+
+static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
+ struct presentation *p)
+{
+ gboolean r;
+
+ /* Throw the event to the IM context and let it sort things out */
+ r = gtk_im_context_filter_keypress(GTK_IM_CONTEXT(p->im_context),
+ event);
+ if ( r ) return FALSE; /* IM ate it */
+
+ 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 :
+ if ( p->slideshow != NULL ) end_slideshow(p);
+ set_selection(p, NULL);
+ redraw_editor(p);
+ break;
+
+ case GDK_KEY_Return :
+ //im_commit(p->editing_object, "\n"); FIXME!
+ break;
+
+ case GDK_KEY_B :
+ case GDK_KEY_b :
+ if ( p->slideshow != NULL ) {
+ //if ( p->prefs->b_splits ) {
+ toggle_slideshow_link(p);
+ //} else {
+ // p->ss_blank = 1-p->ss_blank;
+ // redraw_slideshow(p);
+ //}
+ }
+ break;
+
+ }
+
+ return FALSE;
+}
+
+
+
int open_mainwindow(struct presentation *p)
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *sw;
+ GdkWindow *win;
if ( p->window != NULL ) {
fprintf(stderr, "Presentation window is already open!\n");
@@ -895,13 +993,14 @@ int open_mainwindow(struct presentation *p)
g_signal_connect(G_OBJECT(p->drawingarea), "draw",
G_CALLBACK(draw_sig), p);
- /* Input method */
- /* FIXME */
+ /* Keyboard and input method stuff */
p->im_context = gtk_im_multicontext_new();
- //gtk_im_context_set_client_window(GTK_IM_CONTEXT(p->im_context),
- // p->drawingarea->window);
- //g_signal_connect(G_OBJECT(p->im_context), "commit",
- // G_CALLBACK(im_commit_sig), p);
+ win = gtk_widget_get_window(p->drawingarea);
+ gtk_im_context_set_client_window(GTK_IM_CONTEXT(p->im_context), win);
+ g_signal_connect(G_OBJECT(p->im_context), "commit",
+ G_CALLBACK(im_commit_sig), p);
+ g_signal_connect(G_OBJECT(p->drawingarea), "key-press-event",
+ G_CALLBACK(key_press_sig), p);
/* Default size */
gtk_window_set_default_size(GTK_WINDOW(p->window), 1024+100, 768+100);
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 3bfff44..9134df9 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -29,10 +29,9 @@
extern int open_mainwindow(struct presentation *p);
-extern void notify_slide_changed(struct presentation *p, struct slide *np);
+extern void change_edit_slide(struct presentation *p, struct slide *np);
+extern void redraw_editor(struct presentation *p);
extern void update_titlebar(struct presentation *p);
-extern void redraw_overlay(struct presentation *p);
-
#endif /* MAINWINDOW_H */
diff --git a/src/render.c b/src/render.c
index 2405c10..cd253c3 100644
--- a/src/render.c
+++ b/src/render.c
@@ -569,7 +569,6 @@ void recursive_buffer_free(struct frame *fr)
void free_render_buffers(struct slide *s)
{
- recursive_buffer_free(s->top);
if ( s->rendered_edit != NULL ) cairo_surface_destroy(s->rendered_edit);
if ( s->rendered_proj != NULL ) cairo_surface_destroy(s->rendered_proj);
if ( s->rendered_thumb != NULL ) {
@@ -582,6 +581,17 @@ void free_render_buffers(struct slide *s)
}
+void free_render_buffers_except_thumb(struct slide *s)
+{
+ if ( s->rendered_edit != NULL ) cairo_surface_destroy(s->rendered_edit);
+ if ( s->rendered_proj != NULL ) cairo_surface_destroy(s->rendered_proj);
+
+ s->rendered_edit = NULL;
+ s->rendered_proj = NULL;
+}
+
+
+
static void do_composite(struct frame *fr, cairo_t *cr)
{
if ( fr->contents == NULL ) return;
@@ -666,6 +676,7 @@ cairo_surface_t *render_slide(struct slide *s, int w, int h)
composite_slide(s, cr);
cairo_destroy(cr);
+ recursive_buffer_free(s->top);
return surf;
}
diff --git a/src/render.h b/src/render.h
index 7178fd1..1ce9176 100644
--- a/src/render.h
+++ b/src/render.h
@@ -31,5 +31,6 @@
extern cairo_surface_t *render_slide(struct slide *s, int w, int h);
extern void free_render_buffers(struct slide *s);
+extern void free_render_buffers_except_thumb(struct slide *s);
#endif /* RENDER_H */
diff --git a/src/slideshow.c b/src/slideshow.c
index bff8edd..0040580 100644
--- a/src/slideshow.c
+++ b/src/slideshow.c
@@ -33,6 +33,19 @@
#include "presentation.h"
#include "mainwindow.h"
+#include "render.h"
+
+
+/* Force a redraw of the slideshow */
+void redraw_slideshow(struct presentation *p)
+{
+ gint w, h;
+
+ w = gtk_widget_get_allocated_width(GTK_WIDGET(p->ss_drawingarea));
+ h = gtk_widget_get_allocated_height(GTK_WIDGET(p->ss_drawingarea));
+
+ gtk_widget_queue_draw_area(p->ss_drawingarea, 0, 0, w, h);
+}
static gint ss_destroy_sig(GtkWidget *widget, struct presentation *p)
@@ -80,60 +93,38 @@ static gboolean ss_draw_sig(GtkWidget *da, cairo_t *cr, struct presentation *p)
}
-void notify_slideshow_slide_changed(struct presentation *p, struct slide *np)
+void change_proj_slide(struct presentation *p, struct slide *np)
{
- if ( (p->cur_proj_slide != NULL)
- && (p->cur_proj_slide->rendered_edit != NULL) )
- {
- cairo_surface_destroy(p->cur_proj_slide->rendered_proj);
- p->cur_proj_slide->rendered_proj = NULL;
+ /* If this slide is not being shown on the editor, we can free the
+ * buffers */
+ if ( p->cur_proj_slide != p->cur_edit_slide ) {
+ free_render_buffers_except_thumb(p->cur_proj_slide);
}
- p->cur_proj_slide = np;
-}
+ p->cur_proj_slide = np;
-static void change_slide(struct presentation *p, signed int n)
-{
-
- int cur_slide_number;
-
- /* If linked, it doesn't matter whether we work from the editor or
- * slideshow position because they're showing the same thing. If not,
- * then we must use the editor's slide. */
- cur_slide_number = slide_number(p, p->cur_edit_slide);
-
- if ( cur_slide_number+n < 0 ) return;
- if ( cur_slide_number+n >= p->num_slides ) return;
-
- p->ss_blank = 0;
-
- if ( p->slideshow_linked ) {
-
- /* If we are currently "linked", update both. */
- notify_slideshow_slide_changed(p, p->slides[cur_slide_number+n]);
- notify_slide_changed(p, p->slides[cur_slide_number+n]);
-
- } else {
-
- /* If we are not linked, a slide change on the "slideshow"
- * actually affects the editor. */
- notify_slide_changed(p, p->slides[cur_slide_number+n]);
- /* p->cur_proj_slide not changed */
-
- }
+ /* The slide is already rendered, because the editor always gets there
+ * first, so we only need to do this: */
+ redraw_slideshow(p);
}
static gint prev_slide_sig(GtkWidget *widget, struct presentation *p)
{
- change_slide(p, -1);
+ int cur_slide_number;
+ cur_slide_number = slide_number(p, p->cur_edit_slide);
+ if ( cur_slide_number == 0 ) return FALSE;
+ change_edit_slide(p, p->slides[cur_slide_number-1]);
return FALSE;
}
static gint next_slide_sig(GtkWidget *widget, struct presentation *p)
{
- change_slide(p, +1);
+ int cur_slide_number;
+ cur_slide_number = slide_number(p, p->cur_edit_slide);
+ if ( cur_slide_number == p->num_slides-1 ) return FALSE;
+ change_edit_slide(p, p->slides[cur_slide_number+1]);
return FALSE;
}
@@ -152,7 +143,7 @@ void end_slideshow(struct presentation *p)
}
p->cur_proj_slide = NULL;
- /* FIXME: Update mainwindow */
+ redraw_editor(p);
}
@@ -160,10 +151,9 @@ void toggle_slideshow_link(struct presentation *p)
{
p->slideshow_linked = 1 - p->slideshow_linked;
if ( p->slideshow_linked ) {
- p->cur_proj_slide = p->cur_edit_slide;
- notify_slideshow_slide_changed(p, p->cur_proj_slide);
+ change_proj_slide(p, p->cur_proj_slide);
}
- /* FIXME: Update mainwindow */
+ redraw_editor(p);
}
diff --git a/src/slideshow.h b/src/slideshow.h
index fc0ab1b..ad1ef64 100644
--- a/src/slideshow.h
+++ b/src/slideshow.h
@@ -30,12 +30,13 @@
extern void try_start_slideshow(struct presentation *p);
-extern void notify_slideshow_slide_changed(struct presentation *p,
- struct slide *np);
+extern void change_proj_slide(struct presentation *p, struct slide *np);
extern void toggle_slideshow_link(struct presentation *p);
extern void check_toggle_blank(struct presentation *p);
+extern void redraw_slideshow(struct presentation *p);
+
extern void end_slideshow(struct presentation *p);
#endif /* SLIDESHOW_H */