diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mainwindow.c | 141 | ||||
-rw-r--r-- | src/mainwindow.h | 5 | ||||
-rw-r--r-- | src/render.c | 13 | ||||
-rw-r--r-- | src/render.h | 1 | ||||
-rw-r--r-- | src/slideshow.c | 76 | ||||
-rw-r--r-- | src/slideshow.h | 5 |
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 */ |