From a82f00098daf0bd6caa5ab7ae8b376cb623d45ca Mon Sep 17 00:00:00 2001 From: Thomas White Date: Tue, 30 Oct 2018 22:32:08 +0100 Subject: Propagate stylesheet changes to slide windows --- src/narrative_window.c | 43 +++++++++++++++++++++++++++++++++++++++++-- src/narrative_window.h | 4 ++++ src/presentation.h | 1 - src/slide_window.c | 9 +++++++-- src/slide_window.h | 2 ++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/narrative_window.c b/src/narrative_window.c index e2365f8..246dc1a 100644 --- a/src/narrative_window.c +++ b/src/narrative_window.c @@ -57,6 +57,8 @@ struct _narrative_window SCSlideshow *show; int show_no_slides; PRClock *pr_clock; + SlideWindow *slidewindows[16]; + int n_slidewindows; }; @@ -277,11 +279,18 @@ static gint load_ss_response_sig(GtkWidget *d, gint response, static void stylesheet_changed_sig(GtkWidget *da, NarrativeWindow *nw) { + int i; + /* It might have changed (been created) since last time */ sc_editor_set_stylesheet(nw->sceditor, nw->p->stylesheet); /* Full rerender, first block may have changed */ sc_editor_set_scblock(nw->sceditor, nw->dummy_top); + + /* Full rerender of all slide windows */ + for ( i=0; in_slidewindows; i++ ) { + slide_window_update(nw->slidewindows[i]); + } } @@ -691,11 +700,17 @@ static int click_thumbnail(double x, double y, void *bvp, void *vp) { struct presentation *p = vp; SCBlock *scblocks = bvp; + NarrativeWindow *nw = p->narrative_window; if ( p->narrative_window->show != NULL ) { - sc_slideshow_set_slide(p->narrative_window->show, scblocks); + sc_slideshow_set_slide(nw->show, scblocks); } else { - slide_window_open(p, scblocks, p->narrative_window->app); + if ( nw->n_slidewindows >= 16 ) { + show_error(nw, _("Too many open slide windows")); + } else { + nw->slidewindows[nw->n_slidewindows++] = slide_window_open(p, scblocks, + p->narrative_window->app); + } } return 0; @@ -751,6 +766,29 @@ void update_titlebar(NarrativeWindow *nw) } +void narrative_window_sw_closed(NarrativeWindow *nw, SlideWindow *sw) +{ + int i; + int found = 0; + + for ( i=0; in_slidewindows; i++ ) { + if ( nw->slidewindows[i] == sw ) { + + int j; + for ( j=i; jn_slidewindows-1; j++ ) { + nw->slidewindows[j] = nw->slidewindows[j+1]; + } + nw->n_slidewindows--; + found = 1; + } + } + + if ( !found ) { + fprintf(stderr, "Couldn't find slide window in narrative record\n"); + } +} + + NarrativeWindow *narrative_window_new(struct presentation *p, GApplication *papp) { NarrativeWindow *nw; @@ -772,6 +810,7 @@ NarrativeWindow *narrative_window_new(struct presentation *p, GApplication *papp nw->app = papp; nw->p = p; + nw->n_slidewindows = 0; nw->window = gtk_application_window_new(GTK_APPLICATION(app)); p->narrative_window = nw; diff --git a/src/narrative_window.h b/src/narrative_window.h index f9f435c..24b4a4b 100644 --- a/src/narrative_window.h +++ b/src/narrative_window.h @@ -30,9 +30,13 @@ typedef struct _narrative_window NarrativeWindow; +#include "slide_window.h" + extern NarrativeWindow *narrative_window_new(struct presentation *p, GApplication *app); extern void update_titlebar(NarrativeWindow *nw); +extern void narrative_window_sw_closed(NarrativeWindow *nw, SlideWindow *sw); + #endif /* NARRATIVE_WINDOW_H */ diff --git a/src/presentation.h b/src/presentation.h index a3e10cc..b288d8e 100644 --- a/src/presentation.h +++ b/src/presentation.h @@ -49,7 +49,6 @@ struct presentation ImageStore *is; NarrativeWindow *narrative_window; - SlideWindow *slidewindow; struct pr_clock *clock; diff --git a/src/slide_window.c b/src/slide_window.c index 0f27b10..ed37a50 100644 --- a/src/slide_window.c +++ b/src/slide_window.c @@ -96,11 +96,16 @@ static void delete_frame_sig(GSimpleAction *action, GVariant *parameter, } +void slide_window_update(SlideWindow *sw) +{ + sc_editor_set_scblock(sw->sceditor, sw->scblocks); +} + + /* Change the editor's slide to "np" */ static void change_edit_slide(SlideWindow *sw, SCBlock *np) { sc_editor_set_slidenum(sw->sceditor, slide_number(sw->p, np)); - sc_editor_set_scblock(sw->sceditor, np); sw->scblocks = np; } @@ -170,7 +175,7 @@ static void last_slide_sig(GSimpleAction *action, GVariant *parameter, static gboolean sw_close_sig(GtkWidget *w, SlideWindow *sw) { - sw->p->slidewindow = NULL; + narrative_window_sw_closed(sw->p->narrative_window, sw); return FALSE; } diff --git a/src/slide_window.h b/src/slide_window.h index b1d39a8..681ec39 100644 --- a/src/slide_window.h +++ b/src/slide_window.h @@ -32,4 +32,6 @@ typedef struct _slidewindow SlideWindow; extern SlideWindow *slide_window_open(struct presentation *p, SCBlock *scblocks, GApplication *app); +extern void slide_window_update(SlideWindow *sw); + #endif /* SLIDEWINDOW_H */ -- cgit v1.2.3