From 85570d136f664b3c75151e06e686723be95f00c0 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Fri, 21 Nov 2014 23:47:51 +0100 Subject: WIP on patching up SlideShow --- src/notes.c | 28 +++++++--------- src/presentation.c | 2 +- src/presentation.h | 3 -- src/sc_editor.c | 7 +++- src/sc_editor.h | 1 + src/slide_sorter.c | 6 ++-- src/slide_window.c | 60 ++++++++++++++++++++++++++-------- src/slide_window.h | 17 +++++++--- src/slideshow.c | 94 ++++++++++++++++++++++++++++++++---------------------- src/slideshow.h | 4 ++- 10 files changed, 141 insertions(+), 81 deletions(-) diff --git a/src/notes.c b/src/notes.c index 5c884df..78b138d 100644 --- a/src/notes.c +++ b/src/notes.c @@ -32,7 +32,7 @@ #include "presentation.h" - +#if 0 /* FIXME */ struct notes { GtkWidget *window; @@ -92,36 +92,31 @@ void grab_current_notes(struct presentation *p) } -void notify_notes_slide_changed(struct presentation *p, struct slide *np) +void notes_set_slide(struct notes *notes, struct slide *np) { - if ( p->notes == NULL ) return; - grab_current_notes(p); - p->notes->slide = np; - update_notes(p); + if ( notes == NULL ) return; + grab_current_notes(notes); + notes->slide = np; + update_notes(notes); } -static gint close_notes_sig(GtkWidget *w, struct presentation *p) +static gint close_notes_sig(GtkWidget *w, struct notes *notes) { - grab_current_notes(p); - p->notes = NULL; + grab_current_notes(notes); + notes->p->notes = NULL; return FALSE; } -void open_notes(struct presentation *p) +void open_notes(SlideWindow *sw) { struct notes *n; GtkWidget *sc; PangoFontDescription *desc; - if ( p->notes != NULL ) return; /* Already open */ - n = malloc(sizeof(struct notes)); if ( n == NULL ) return; - p->notes = n; - - p->notes->slide = p->cur_edit_slide; n->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(n->window), 800, 256); @@ -143,10 +138,11 @@ void open_notes(struct presentation *p) set_notes_title(p); gtk_widget_show_all(n->window); - update_notes(p); + update_notes(notes); } +#endif void attach_notes(struct slide *s) { SCBlock *bl = s->scblocks; diff --git a/src/presentation.c b/src/presentation.c index 1971671..69fa23b 100644 --- a/src/presentation.c +++ b/src/presentation.c @@ -245,7 +245,7 @@ int save_presentation(struct presentation *p, const char *filename) FILE *fh; char *old_fn; - grab_current_notes(p); + // FIXME grab_current_notes(p); fh = fopen(filename, "w"); if ( fh == NULL ) return 1; diff --git a/src/presentation.h b/src/presentation.h index 0fa7d71..197a298 100644 --- a/src/presentation.h +++ b/src/presentation.h @@ -68,9 +68,6 @@ struct presentation struct pr_clock *clock; struct slide_sorter *slide_sorter; - /* Pointers to the current "editing" slide */ - struct slide *cur_edit_slide; - /* This is the "native" size of the slide. It only exists to give * font size some meaning in the context of a somewhat arbitrary DPI */ double slide_width; diff --git a/src/sc_editor.c b/src/sc_editor.c index 70e1160..91db62d 100644 --- a/src/sc_editor.c +++ b/src/sc_editor.c @@ -73,7 +73,7 @@ static void rerender(SCEditor *e) /* Force a redraw of the editor window */ -void redraw_editor(SCEditor *e) +static void redraw_editor(SCEditor *e) { gint w, h; @@ -83,6 +83,11 @@ void redraw_editor(SCEditor *e) gtk_widget_queue_draw_area(GTK_WIDGET(e), 0, 0, w, h); } +/* Force a redraw of the editor window */ +void sc_editor_redraw(SCEditor *e) +{ + redraw_editor(e); +} static void move_cursor_back(SCEditor *e) { diff --git a/src/sc_editor.h b/src/sc_editor.h index 1d653d3..2617b1f 100644 --- a/src/sc_editor.h +++ b/src/sc_editor.h @@ -147,5 +147,6 @@ extern GtkWidget *sc_editor_get_widget(SCEditor *e); extern SCEditor *sc_editor_new(SCBlock *scblocks, SCBlock *stylesheet); extern void sc_editor_set_size(SCEditor *e, int w, int h); extern void sc_editor_set_logical_size(SCEditor *e, double w, double h); +extern void sc_editor_redraw(SCEditor *e); #endif /* SC_EDITOR_H */ diff --git a/src/slide_sorter.c b/src/slide_sorter.c index 54b6804..cdc5879 100644 --- a/src/slide_sorter.c +++ b/src/slide_sorter.c @@ -202,6 +202,7 @@ static gboolean motion_sig(GtkWidget *da, GdkEventMotion *event, /* If we are dragging the current editor or projector slide, * we'd better remember to update when we're finished. */ +#if 0 /* FIXME! */ if ( n->p->cur_edit_slide == n->selected_slide ) { n->dragging_cur_edit_slide = 1; } else { @@ -213,7 +214,7 @@ static gboolean motion_sig(GtkWidget *da, GdkEventMotion *event, } else { n->dragging_cur_proj_slide = 0; } - +#endif list = gtk_target_list_new(targets, 1); gtk_drag_begin(da, list, GDK_ACTION_COPY | GDK_ACTION_MOVE, 1, (GdkEvent *)event); @@ -438,6 +439,7 @@ static void dnd_delete(GtkWidget *widget, GdkDragContext *drag_context, if ( sn < n->drop_here ) n->drop_here--; +#if 0 /* FIXME ! */ if ( n->p->cur_edit_slide == n->selected_slide ) { if ( same ) { @@ -483,7 +485,7 @@ static void dnd_delete(GtkWidget *widget, GdkDragContext *drag_context, } } - +#endif delete_slide(n->p, n->selected_slide); } diff --git a/src/slide_window.c b/src/slide_window.c index 2ea595f..4269a23 100644 --- a/src/slide_window.c +++ b/src/slide_window.c @@ -330,7 +330,7 @@ static gint about_sig(GtkWidget *widget, SlideWindow *sw) static gint start_slideshow_sig(GtkWidget *widget, SlideWindow *sw) { - sw->p->slideshow = try_start_slideshow(sw->p); + sw->p->slideshow = try_start_slideshow(sw, sw->p); return FALSE; } @@ -344,7 +344,7 @@ void change_edit_slide(SlideWindow *sw, struct slide *np) sc_editor_set_scblock(sw->sceditor, np->scblocks); - notify_notes_slide_changed(sw->p, np); + // FIXME notify_notes_slide_changed(sw->p, np); if ( slideshow_linked(sw->p->slideshow) ) { change_proj_slide(sw->p->slideshow, np); @@ -369,50 +369,71 @@ static gint add_slide_sig(GtkWidget *widget, SlideWindow *sw) } -static gint first_slide_sig(GtkWidget *widget, SlideWindow *sw) +void change_slide_first(SlideWindow *sw) { change_edit_slide(sw, sw->p->slides[0]); - return FALSE; } -static gint prev_slide_sig(GtkWidget *widget, SlideWindow *sw) +void change_slide_backwards(SlideWindow *sw) { int cur_slide_number; cur_slide_number = slide_number(sw->p, sw->cur_slide); - if ( cur_slide_number == 0 ) return FALSE; + if ( cur_slide_number == 0 ) return; change_edit_slide(sw, sw->p->slides[cur_slide_number-1]); - - return FALSE; } -static gint next_slide_sig(GtkWidget *widget, SlideWindow *sw) +void change_slide_forwards(SlideWindow *sw) { int cur_slide_number; cur_slide_number = slide_number(sw->p, sw->cur_slide); - if ( cur_slide_number == sw->p->num_slides-1 ) return FALSE; + if ( cur_slide_number == sw->p->num_slides-1 ) return; change_edit_slide(sw, sw->p->slides[cur_slide_number+1]); +} + +void change_slide_last(SlideWindow *sw) +{ + change_edit_slide(sw, sw->p->slides[sw->p->num_slides-1]); +} + + +static gint first_slide_sig(GtkWidget *widget, SlideWindow *sw) +{ + change_slide_first(sw); return FALSE; } -static gint last_slide_sig(GtkWidget *widget, SlideWindow *sw) +static gint prev_slide_sig(GtkWidget *widget, SlideWindow *sw) { - change_edit_slide(sw, sw->p->slides[sw->p->num_slides-1]); + change_slide_backwards(sw); + return FALSE; +} + + +static gint next_slide_sig(GtkWidget *widget, SlideWindow *sw) +{ + change_slide_forwards(sw); + return FALSE; +} + +static gint last_slide_sig(GtkWidget *widget, SlideWindow *sw) +{ + change_slide_last(sw); return FALSE; } static gint open_notes_sig(GtkWidget *widget, SlideWindow *sw) { - open_notes(sw->p); + // FIXME open_notes(sw->p); return FALSE; } @@ -430,6 +451,7 @@ static gint open_slidesorter_sig(GtkWidget *widget, SlideWindow *sw) return FALSE; } + static gint delete_frame_sig(GtkWidget *widget, SlideWindow *sw) { #if 0 @@ -446,6 +468,18 @@ static gint delete_frame_sig(GtkWidget *widget, SlideWindow *sw) } +void slidewindow_redraw(SlideWindow *sw) +{ + sc_editor_redraw(sw->sceditor); +} + + +struct slide *slidewindow_get_slide(SlideWindow *sw) +{ + return sw->cur_slide; +} + + static void add_menu_bar(SlideWindow *sw, GtkWidget *vbox) { GError *error = NULL; diff --git a/src/slide_window.h b/src/slide_window.h index 51f9840..5b6bc69 100644 --- a/src/slide_window.h +++ b/src/slide_window.h @@ -1,7 +1,7 @@ /* - * presentation.h + * slide_window.h * - * Copyright © 2013 Thomas White + * Copyright © 2013-2014 Thomas White * * This file is part of Colloquium. * @@ -20,8 +20,8 @@ * */ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H +#ifndef SLIDEWINDOW_H +#define SLIDEWINDOW_H #ifdef HAVE_CONFIG_H #include @@ -33,5 +33,12 @@ extern SlideWindow *slide_window_open(struct presentation *p, GApplication *app) extern void change_edit_slide(SlideWindow *sw, struct slide *np); extern void update_titlebar(struct presentation *p); +extern void change_slide_first(SlideWindow *sw); +extern void change_slide_backwards(SlideWindow *sw); +extern void change_slide_forwards(SlideWindow *sw); +extern void change_slide_last(SlideWindow *sw); -#endif /* MAINWINDOW_H */ +extern struct slide *slidewindow_get_slide(SlideWindow *sw); +extern void slidewindow_redraw(SlideWindow *sw); + +#endif /* SLIDEWINDOW_H */ diff --git a/src/slideshow.c b/src/slideshow.c index 63c62cf..da15ad3 100644 --- a/src/slideshow.c +++ b/src/slideshow.c @@ -36,13 +36,14 @@ #include "render.h" #include "pr_clock.h" #include "inhibit_screensaver.h" - +#include "frame.h" struct _slideshow { struct presentation *p; + SlideWindow *slide_window; /* Slide window controlling us */ struct slide *cur_slide; - GtkWidget *slideshow; + GtkWidget *window; GtkWidget *drawingarea; GdkCursor *blank_cursor; int blank; @@ -52,6 +53,7 @@ struct _slideshow struct inhibit_sys *inhibit; int linked; cairo_surface_t *surface; + struct frame top; }; @@ -72,19 +74,21 @@ void slideshow_rerender(SlideShow *ss) int n; n = slide_number(ss->p, ss->cur_slide); + printf("rendering %p\n", ss->cur_slide->scblocks); + show_sc_blocks(ss->cur_slide->scblocks); ss->surface = render_sc(ss->cur_slide->scblocks, ss->slide_width, ss->slide_height, ss->p->slide_width, ss->p->slide_height, - ss->cur_slide->top, + &ss->top, ss->p->stylesheet, ss->p->is, ISZ_SLIDESHOW, n); } -static gint ss_destroy_sig(GtkWidget *widget, struct presentation *p) +static gint ss_destroy_sig(GtkWidget *widget, SlideShow *ss) { - p->slideshow = NULL; - g_object_unref(p->slideshow->blank_cursor); + g_object_unref(ss->p->slideshow->blank_cursor); + ss->p->slideshow = NULL; return FALSE; } @@ -131,28 +135,21 @@ void change_proj_slide(SlideShow *ss, struct slide *np) notify_clock_slide_changed(ss->p, np); - /* The slide is already rendered, because the editor always gets there - * first, so we only need to do this: */ + slideshow_rerender(ss); redraw_slideshow(ss); } static gint prev_slide_sig(GtkWidget *widget, SlideShow *ss) { - int cur_slide_number; - cur_slide_number = slide_number(ss->p, ss->p->cur_edit_slide); - if ( cur_slide_number == 0 ) return FALSE; - change_edit_slide(ss->p->slidewindow, ss->p->slides[cur_slide_number-1]); + change_slide_backwards(ss->slide_window); return FALSE; } static gint next_slide_sig(GtkWidget *widget, SlideShow *ss) { - int cur_slide_number; - cur_slide_number = slide_number(ss->p, ss->p->cur_edit_slide); - if ( cur_slide_number == ss->p->num_slides-1 ) return FALSE; - change_edit_slide(ss->p->slidewindow, ss->p->slides[cur_slide_number+1]); + change_slide_forwards(ss->slide_window); return FALSE; } @@ -161,10 +158,10 @@ void end_slideshow(SlideShow *ss) { if ( ss->inhibit != NULL ) do_inhibit(ss->inhibit, 0); gtk_widget_destroy(ss->drawingarea); - gtk_widget_destroy(ss->slideshow); - free(ss); + gtk_widget_destroy(ss->window); ss->p->slideshow = NULL; - redraw_editor(ss->p->slidewindow); + slidewindow_redraw(ss->slide_window); + free(ss); } @@ -172,9 +169,9 @@ void toggle_slideshow_link(SlideShow *ss) { ss->linked = 1 - ss->linked; if ( ss->linked ) { - change_proj_slide(ss, ss->p->cur_edit_slide); + change_proj_slide(ss, slidewindow_get_slide(ss->slide_window)); } - //redraw_editor(ss->p); FIXME + slidewindow_redraw(ss->slide_window); } @@ -200,7 +197,7 @@ void check_toggle_blank(SlideShow *ss) static gboolean ss_key_press_sig(GtkWidget *da, GdkEventKey *event, - SlideShow *ss) + SlideShow *ss) { switch ( event->keyval ) { @@ -240,6 +237,7 @@ static gboolean ss_realize_sig(GtkWidget *w, SlideShow *ss) gdk_window_set_cursor(GDK_WINDOW(win), ss->blank_cursor); gtk_window_parse_geometry(GTK_WINDOW(w), ss->geom); + slideshow_rerender(ss); return FALSE; } @@ -252,40 +250,59 @@ struct slide *slideshow_slide(SlideShow *ss) } -SlideShow *try_start_slideshow(struct presentation *p) +SlideShow *try_start_slideshow(SlideWindow *sw, struct presentation *p) { - GtkWidget *n; GdkScreen *screen; int n_monitors; int i; SlideShow *ss; - - /* Presentation already running? */ - if ( p->slideshow != NULL ) return p->slideshow; - + double slide_width = 1024.0; /* Logical slide size */ + double slide_height = 768.0; /* FIXME: Should come from slide */ ss = calloc(1, sizeof(SlideShow)); if ( ss == NULL ) return NULL; - ss->p = p; + ss->slide_window = sw; ss->blank = 0; + ss->p = p; + ss->cur_slide = slidewindow_get_slide(sw); if ( ss->inhibit == NULL ) { ss->inhibit = inhibit_prepare(); } - n = gtk_window_new(GTK_WINDOW_TOPLEVEL); + ss->top.children = NULL; + ss->top.num_children = 0; + ss->top.max_children = 0; + ss->top.lines = NULL; + ss->top.n_lines = 0; + ss->top.max_lines = 0; + ss->top.pad_l = 0; + ss->top.pad_r = 0; + ss->top.pad_t = 0; + ss->top.pad_b = 0; + ss->top.w = slide_width; + ss->top.h = slide_height; + ss->top.grad = GRAD_NONE; + ss->top.bgcol[0] = 1.0; + ss->top.bgcol[1] = 1.0; + ss->top.bgcol[2] = 1.0; + ss->top.bgcol[3] = 1.0; + + ss->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); ss->drawingarea = gtk_drawing_area_new(); - gtk_container_add(GTK_CONTAINER(n), ss->drawingarea); + gtk_container_add(GTK_CONTAINER(ss->window), ss->drawingarea); gtk_widget_set_can_focus(GTK_WIDGET(ss->drawingarea), TRUE); gtk_widget_add_events(GTK_WIDGET(ss->drawingarea), GDK_KEY_PRESS_MASK); g_signal_connect(G_OBJECT(ss->drawingarea), "key-press-event", - G_CALLBACK(ss_key_press_sig), p); - g_signal_connect(G_OBJECT(n), "destroy", G_CALLBACK(ss_destroy_sig), p); - g_signal_connect(G_OBJECT(n), "realize", G_CALLBACK(ss_realize_sig), ss); + G_CALLBACK(ss_key_press_sig), ss); + g_signal_connect(G_OBJECT(ss->window), "destroy", + G_CALLBACK(ss_destroy_sig), ss); + g_signal_connect(G_OBJECT(ss->window), "realize", + G_CALLBACK(ss_realize_sig), ss); g_signal_connect(G_OBJECT(ss->drawingarea), "draw", G_CALLBACK(ss_draw_sig), ss); @@ -303,20 +320,19 @@ SlideShow *try_start_slideshow(struct presentation *p) snprintf(ss->geom, 255, "%ix%i+%i+%i", rect.width, rect.height, rect.x, rect.y); - w = rect.height * p->slide_width/p->slide_height; + w = rect.height * slide_width/slide_height; if ( w > rect.width ) w = rect.width; ss->slide_width = w; } /* FIXME: Sensible (configurable) choice of monitor */ ss->linked = 1; - gtk_window_fullscreen(GTK_WINDOW(n)); - gtk_widget_show_all(GTK_WIDGET(n)); + gtk_window_fullscreen(GTK_WINDOW(ss->window)); + gtk_widget_show_all(GTK_WIDGET(ss->window)); if ( ss->inhibit != NULL ) do_inhibit(ss->inhibit, 1); - ss->cur_slide = p->cur_edit_slide; - notify_clock_slide_changed(p, ss->cur_slide); + //notify_clock_slide_changed(p, ss->cur_slide); FIXME return ss; } diff --git a/src/slideshow.h b/src/slideshow.h index 62a54e0..16bd6e0 100644 --- a/src/slideshow.h +++ b/src/slideshow.h @@ -27,10 +27,12 @@ #include #endif +#include "slide_window.h" + /* Opaque data structure representing a slideshow */ typedef struct _slideshow SlideShow; -extern SlideShow *try_start_slideshow(struct presentation *p); +extern SlideShow *try_start_slideshow(SlideWindow *sw, struct presentation *p); extern void end_slideshow(SlideShow *ss); extern void change_proj_slide(SlideShow *ss, struct slide *np); -- cgit v1.2.3