diff options
-rw-r--r-- | libstorycode/gtk/gtknarrativeview.c | 47 | ||||
-rw-r--r-- | libstorycode/gtk/gtknarrativeview.h | 1 | ||||
-rw-r--r-- | libstorycode/narrative.c | 14 | ||||
-rw-r--r-- | libstorycode/narrative.h | 2 | ||||
-rw-r--r-- | meson.build | 4 | ||||
-rw-r--r-- | src/narrative_window.c | 245 | ||||
-rw-r--r-- | src/pr_clock.c (renamed from src-old/pr_clock.c) | 3 | ||||
-rw-r--r-- | src/pr_clock.h (renamed from src-old/pr_clock.h) | 0 | ||||
-rw-r--r-- | src/slideshow.c (renamed from src-old/slideshow.c) | 124 | ||||
-rw-r--r-- | src/slideshow.h (renamed from src-old/slideshow.h) | 18 |
10 files changed, 252 insertions, 206 deletions
diff --git a/libstorycode/gtk/gtknarrativeview.c b/libstorycode/gtk/gtknarrativeview.c index 5bf45dd..1d0a1c2 100644 --- a/libstorycode/gtk/gtknarrativeview.c +++ b/libstorycode/gtk/gtknarrativeview.c @@ -487,11 +487,28 @@ static double para_top(Narrative *n, int pnum) static void draw_para_highlight(cairo_t *cr, Narrative *n, int cursor_para) { double cx, cy, cw, ch; + struct narrative_item *item; + + cx = 0.0; + cy = para_top(n, cursor_para); - cx = n->space_l; - cy = n->space_t + para_top(n, cursor_para); - cw = n->items[cursor_para].slide_w; - ch = n->items[cursor_para].slide_h; + item = &n->items[cursor_para]; + + if ( item->type == NARRATIVE_ITEM_SLIDE ) { + cw = item->slide_w; + ch = item->slide_h; + } else { + if ( item->layout != NULL ) { + PangoRectangle rect; + pango_layout_get_extents(item->layout, NULL, &rect); + cw = pango_units_to_double(rect.width) + item->space_r + item->space_l; + ch = pango_units_to_double(rect.height) + item->space_b + item->space_t; + } else { + cw = 0.0; + ch = 0.0; + fprintf(stderr, "No layout when drawing highlight box\n"); + } + } cairo_new_path(cr); cairo_rectangle(cr, cx, cy, cw, ch); @@ -1176,3 +1193,25 @@ GtkWidget *gtk_narrative_view_new(Presentation *p) return GTK_WIDGET(nview); } + + +void gtk_narrative_view_set_para_highlight(GtkNarrativeView *e, int para_highlight) +{ + e->para_highlight = para_highlight; + redraw(e); +} + + +int gtk_narrative_view_get_cursor_para(GtkNarrativeView *e) +{ + return e->cpos.para; +} + + +void gtk_narrative_view_set_cursor_para(GtkNarrativeView *e, signed int pos) +{ + e->cpos.para = pos; + e->cpos.pos = 0; + e->cpos.trail = 0; + redraw(e); +} diff --git a/libstorycode/gtk/gtknarrativeview.h b/libstorycode/gtk/gtknarrativeview.h index fdcfed6..9cbdcbd 100644 --- a/libstorycode/gtk/gtknarrativeview.h +++ b/libstorycode/gtk/gtknarrativeview.h @@ -100,6 +100,7 @@ struct _gtknarrativeviewclass typedef struct _gtknarrativeview GtkNarrativeView; typedef struct _gtknarrativeviewclass GtkNarrativeViewClass; +extern GType gtk_narrative_view_get_type(void); extern GtkWidget *gtk_narrative_view_new(Presentation *p); extern void gtk_narrative_view_set_logical_size(GtkNarrativeView *e, double w, double h); diff --git a/libstorycode/narrative.c b/libstorycode/narrative.c index 81b55f0..c0ae0d7 100644 --- a/libstorycode/narrative.c +++ b/libstorycode/narrative.c @@ -248,3 +248,17 @@ void narrative_split_item(Narrative *n, int i1, size_t o1) item2->type = NARRATIVE_ITEM_TEXT; } + + +int narrative_get_num_items(Narrative *n) +{ + return n->n_items; +} + + +Slide *narrative_get_slide(Narrative *n, int para) +{ + if ( para >= n->n_items ) return NULL; + if ( n->items[para].type != NARRATIVE_ITEM_SLIDE ) return NULL; + return n->items[para].slide; +} diff --git a/libstorycode/narrative.h b/libstorycode/narrative.h index 5b8af4a..3ee215f 100644 --- a/libstorycode/narrative.h +++ b/libstorycode/narrative.h @@ -41,6 +41,8 @@ extern void narrative_add_slide(Narrative *n, Slide *slide); extern void narrative_delete_block(Narrative *n, int i1, size_t o1, int i2, size_t o2); extern void narrative_split_item(Narrative *n, int i1, size_t o1); +extern int narrative_get_num_items(Narrative *n); +extern Slide *narrative_get_slide(Narrative *n, int para); #endif /* NARRATIVE_H */ diff --git a/meson.build b/meson.build index 6c3b29b..569b8bb 100644 --- a/meson.build +++ b/meson.build @@ -110,8 +110,8 @@ executable('pdfstorycode', executable('colloquium', ['src/colloquium.c', 'src/narrative_window.c', -# 'src/slideshow.c', -# 'src/pr_clock.c', + 'src/slideshow.c', + 'src/pr_clock.c', 'src/slide_window.c', 'src/testcard.c', # 'src/stylesheet_editor.c', diff --git a/src/narrative_window.c b/src/narrative_window.c index c51d3a3..a6e71af 100644 --- a/src/narrative_window.c +++ b/src/narrative_window.c @@ -40,11 +40,10 @@ #include "narrative_window.h" #include "slide_window.h" #include "testcard.h" -//#include "pr_clock.h" +#include "pr_clock.h" +#include "slideshow.h" //#include "print.h" //#include "stylesheet_editor.h" -typedef struct _ss SCSlideshow; /* FIXME placeholder */ -typedef struct _pc PRClock; /* FIXME placeholder */ struct _narrative_window { @@ -109,25 +108,25 @@ static void update_titlebar(NarrativeWindow *nw) static void update_toolbar(NarrativeWindow *nw) { -// int cur_para; + int cur_para, n_para; - /* FIXME */ -// cur_para = sc_editor_get_cursor_para(nw->nv); -// if ( cur_para == 0 ) { -// gtk_widget_set_sensitive(GTK_WIDGET(nw->bfirst), FALSE); -// gtk_widget_set_sensitive(GTK_WIDGET(nw->bprev), FALSE); -// } else { -// gtk_widget_set_sensitive(GTK_WIDGET(nw->bfirst), TRUE); -// gtk_widget_set_sensitive(GTK_WIDGET(nw->bprev), TRUE); -// } -// -// if ( cur_para == sc_editor_get_num_paras(nw->nv)-1 ) { -// gtk_widget_set_sensitive(GTK_WIDGET(nw->bnext), FALSE); -// gtk_widget_set_sensitive(GTK_WIDGET(nw->blast), FALSE); -// } else { -// gtk_widget_set_sensitive(GTK_WIDGET(nw->bnext), TRUE); -// gtk_widget_set_sensitive(GTK_WIDGET(nw->blast), TRUE); -// } + cur_para = gtk_narrative_view_get_cursor_para(GTK_NARRATIVE_VIEW(nw->nv)); + if ( cur_para == 0 ) { + gtk_widget_set_sensitive(GTK_WIDGET(nw->bfirst), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(nw->bprev), FALSE); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(nw->bfirst), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(nw->bprev), TRUE); + } + + n_para = narrative_get_num_items(presentation_get_narrative(nw->p)); + if ( cur_para == n_para - 1 ) { + gtk_widget_set_sensitive(GTK_WIDGET(nw->bnext), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(nw->blast), FALSE); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(nw->bnext), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(nw->blast), TRUE); + } } @@ -318,87 +317,98 @@ static void add_slide_sig(GSimpleAction *action, GVariant *parameter, static void first_para_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { -// NarrativeWindow *nw = vp; -// sc_editor_set_cursor_para(nw->nv, 0); -// pr_clock_set_pos(nw->pr_clock, sc_editor_get_cursor_para(nw->nv), -// sc_editor_get_num_paras(nw->nv)); -// update_toolbar(nw); + NarrativeWindow *nw = vp; + int n_paras = narrative_get_num_items(presentation_get_narrative(nw->p)); + gtk_narrative_view_set_cursor_para(GTK_NARRATIVE_VIEW(nw->nv), 0); + pr_clock_set_pos(nw->pr_clock, + gtk_narrative_view_get_cursor_para(GTK_NARRATIVE_VIEW(nw->nv)), + n_paras); + update_toolbar(nw); } static void ss_prev_para(SCSlideshow *ss, void *vp) { -// NarrativeWindow *nw = vp; -// if ( sc_editor_get_cursor_para(nw->nv) == 0 ) return; -// sc_editor_set_cursor_para(nw->nv, -// sc_editor_get_cursor_para(nw->nv)-1); -// pr_clock_set_pos(nw->pr_clock, sc_editor_get_cursor_para(nw->nv), -// sc_editor_get_num_paras(nw->nv)); -// update_toolbar(nw); + NarrativeWindow *nw = vp; + int n_paras = narrative_get_num_items(presentation_get_narrative(nw->p)); + if ( gtk_narrative_view_get_cursor_para(GTK_NARRATIVE_VIEW(nw->nv)) == 0 ) return; + gtk_narrative_view_set_cursor_para(GTK_NARRATIVE_VIEW(nw->nv), + gtk_narrative_view_get_cursor_para(GTK_NARRATIVE_VIEW(nw->nv))-1); + pr_clock_set_pos(nw->pr_clock, + gtk_narrative_view_get_cursor_para(GTK_NARRATIVE_VIEW(nw->nv)), + n_paras); + update_toolbar(nw); } static void prev_para_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { -// NarrativeWindow *nw = vp; -// ss_prev_para(nw->show, nw); + NarrativeWindow *nw = vp; + ss_prev_para(nw->show, nw); } static void ss_next_para(SCSlideshow *ss, void *vp) { -// NarrativeWindow *nw = vp; -// SCBlock *ns; -// -// sc_editor_set_cursor_para(nw->nv, -// sc_editor_get_cursor_para(nw->nv)+1); -// -// /* If we only have one monitor, don't try to do paragraph counting */ -// if ( ss->single_monitor && !nw->show_no_slides ) { -// int i, max; -// max = sc_editor_get_num_paras(nw->nv); -// for ( i=sc_editor_get_cursor_para(nw->nv); i<max; i++ ) { -// SCBlock *ns; -// sc_editor_set_cursor_para(nw->nv, i); -// ns = sc_editor_get_cursor_bvp(nw->nv); -// if ( ns != NULL ) break; -// } -// } -// -// pr_clock_set_pos(nw->pr_clock, sc_editor_get_cursor_para(nw->nv), -// sc_editor_get_num_paras(nw->nv)); -// ns = sc_editor_get_cursor_bvp(nw->nv); -// if ( ns != NULL ) { -// sc_slideshow_set_slide(nw->show, ns); -// } -// update_toolbar(nw); + NarrativeWindow *nw = vp; + Slide *ns; + Narrative *narr; + GtkNarrativeView *nv; + int n_paras; + + narr = presentation_get_narrative(nw->p); + n_paras = narrative_get_num_items(narr); + nv = GTK_NARRATIVE_VIEW(nw->nv); + + gtk_narrative_view_set_cursor_para(nv, gtk_narrative_view_get_cursor_para(nv)+1); + + /* If we only have one monitor, skip to next slide */ + if ( ss->single_monitor && !nw->show_no_slides ) { + int i; + for ( i=gtk_narrative_view_get_cursor_para(nv); i<n_paras; i++ ) + { + Slide *ns; + gtk_narrative_view_set_cursor_para(nv, i); + ns = narrative_get_slide(narr, i); + if ( ns != NULL ) break; + } + } + + pr_clock_set_pos(nw->pr_clock, gtk_narrative_view_get_cursor_para(nv), n_paras); + ns = narrative_get_slide(narr, gtk_narrative_view_get_cursor_para(nv)); + if ( ns != NULL ) { + sc_slideshow_set_slide(nw->show, ns); + } + update_toolbar(nw); } static void next_para_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { -// NarrativeWindow *nw = vp; -// ss_next_para(nw->show, nw); + NarrativeWindow *nw = vp; + ss_next_para(nw->show, nw); } static void last_para_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { -// NarrativeWindow *nw = vp; -// sc_editor_set_cursor_para(nw->nv, -1); -// pr_clock_set_pos(nw->pr_clock, sc_editor_get_cursor_para(nw->nv), -// sc_editor_get_num_paras(nw->nv)); -// update_toolbar(nw); + NarrativeWindow *nw = vp; + int n_paras = narrative_get_num_items(presentation_get_narrative(nw->p)); + gtk_narrative_view_set_cursor_para(GTK_NARRATIVE_VIEW(nw->nv), -1); + pr_clock_set_pos(nw->pr_clock, + gtk_narrative_view_get_cursor_para(GTK_NARRATIVE_VIEW(nw->nv)), + n_paras); + update_toolbar(nw); } static void open_clock_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { - //NarrativeWindow *nw = vp; -// nw->pr_clock = pr_clock_new(); + NarrativeWindow *nw = vp; + nw->pr_clock = pr_clock_new(); } @@ -547,7 +557,7 @@ static gboolean nw_key_press_sig(GtkWidget *da, GdkEventKey *event, static gboolean ss_destroy_sig(GtkWidget *da, NarrativeWindow *nw) { nw->show = NULL; - //sc_editor_set_para_highlight(nw->nv, 0); FIXME + gtk_narrative_view_set_para_highlight(GTK_NARRATIVE_VIEW(nw->nv), 0); gtk_widget_set_sensitive(GTK_WIDGET(nw->bfirst), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(nw->bprev), FALSE); @@ -561,74 +571,75 @@ static gboolean ss_destroy_sig(GtkWidget *da, NarrativeWindow *nw) static void start_slideshow_here_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { - //NarrativeWindow *nw = vp; - //void *bvp; + NarrativeWindow *nw = vp; + Slide *slide; - //if ( num_slides(nw->p) == 0 ) return; + if ( presentation_get_num_slides(nw->p) == 0 ) return; - //bvp = sc_editor_get_cursor_bvp(nw->nv); - //if ( bvp == NULL ) return; + slide = narrative_get_slide(presentation_get_narrative(nw->p), + gtk_narrative_view_get_cursor_para(GTK_NARRATIVE_VIEW(nw->nv))); + if ( slide == NULL ) return; - //nw->show = sc_slideshow_new(nw->p, GTK_APPLICATION(nw->app)); - //if ( nw->show == NULL ) return; + nw->show = sc_slideshow_new(nw->p, GTK_APPLICATION(nw->app)); + if ( nw->show == NULL ) return; - //nw->show_no_slides = 0; + nw->show_no_slides = 0; - //g_signal_connect(G_OBJECT(nw->show), "key-press-event", - // G_CALLBACK(nw_key_press_sig), nw); - //g_signal_connect(G_OBJECT(nw->show), "destroy", - // G_CALLBACK(ss_destroy_sig), nw); - //sc_slideshow_set_slide(nw->show, bvp); - //sc_editor_set_para_highlight(nw->nv, 1); - //gtk_widget_show_all(GTK_WIDGET(nw->show)); - //update_toolbar(nw); + g_signal_connect(G_OBJECT(nw->show), "key-press-event", + G_CALLBACK(nw_key_press_sig), nw); + g_signal_connect(G_OBJECT(nw->show), "destroy", + G_CALLBACK(ss_destroy_sig), nw); + sc_slideshow_set_slide(nw->show, slide); + gtk_narrative_view_set_para_highlight(GTK_NARRATIVE_VIEW(nw->nv), 1); + gtk_widget_show_all(GTK_WIDGET(nw->show)); + update_toolbar(nw); } static void start_slideshow_noslides_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { - //NarrativeWindow *nw = vp; + NarrativeWindow *nw = vp; - //if ( num_slides(nw->p) == 0 ) return; + if ( presentation_get_num_slides(nw->p) == 0 ) return; - //nw->show = sc_slideshow_new(nw->p, GTK_APPLICATION(nw->app)); - //if ( nw->show == NULL ) return; + nw->show = sc_slideshow_new(nw->p, GTK_APPLICATION(nw->app)); + if ( nw->show == NULL ) return; - //nw->show_no_slides = 1; + nw->show_no_slides = 1; - //g_signal_connect(G_OBJECT(nw->show), "key-press-event", - // G_CALLBACK(nw_key_press_sig), nw); - //g_signal_connect(G_OBJECT(nw->show), "destroy", - // G_CALLBACK(ss_destroy_sig), nw); - //sc_slideshow_set_slide(nw->show, first_slide(nw->p)); - //sc_editor_set_para_highlight(nw->nv, 1); - //sc_editor_set_cursor_para(nw->nv, 0); - //update_toolbar(nw); + g_signal_connect(G_OBJECT(nw->show), "key-press-event", + G_CALLBACK(nw_key_press_sig), nw); + g_signal_connect(G_OBJECT(nw->show), "destroy", + G_CALLBACK(ss_destroy_sig), nw); + sc_slideshow_set_slide(nw->show, presentation_get_slide_by_number(nw->p, 0)); + gtk_narrative_view_set_para_highlight(GTK_NARRATIVE_VIEW(nw->nv), 1); + gtk_narrative_view_set_cursor_para(GTK_NARRATIVE_VIEW(nw->nv), 0); + update_toolbar(nw); } static void start_slideshow_sig(GSimpleAction *action, GVariant *parameter, gpointer vp) { -// NarrativeWindow *nw = vp; -// -// if ( num_slides(nw->p) == 0 ) return; -// -// nw->show = sc_slideshow_new(nw->p, GTK_APPLICATION(nw->app)); -// if ( nw->show == NULL ) return; -// -// nw->show_no_slides = 0; -// -// g_signal_connect(G_OBJECT(nw->show), "key-press-event", -// G_CALLBACK(nw_key_press_sig), nw); -// g_signal_connect(G_OBJECT(nw->show), "destroy", -// G_CALLBACK(ss_destroy_sig), nw); -// sc_slideshow_set_slide(nw->show, first_slide(nw->p)); -// sc_editor_set_para_highlight(nw->nv, 1); -// sc_editor_set_cursor_para(nw->nv, 0); -// gtk_widget_show_all(GTK_WIDGET(nw->show)); -// update_toolbar(nw); + NarrativeWindow *nw = vp; + + if ( presentation_get_num_slides(nw->p) == 0 ) return; + + nw->show = sc_slideshow_new(nw->p, GTK_APPLICATION(nw->app)); + if ( nw->show == NULL ) return; + + nw->show_no_slides = 0; + + g_signal_connect(G_OBJECT(nw->show), "key-press-event", + G_CALLBACK(nw_key_press_sig), nw); + g_signal_connect(G_OBJECT(nw->show), "destroy", + G_CALLBACK(ss_destroy_sig), nw); + sc_slideshow_set_slide(nw->show, presentation_get_slide_by_number(nw->p, 0)); + gtk_narrative_view_set_para_highlight(GTK_NARRATIVE_VIEW(nw->nv), 1); + gtk_narrative_view_set_cursor_para(GTK_NARRATIVE_VIEW(nw->nv), 0); + gtk_widget_show_all(GTK_WIDGET(nw->show)); + update_toolbar(nw); } diff --git a/src-old/pr_clock.c b/src/pr_clock.c index 8085c89..aa1348e 100644 --- a/src-old/pr_clock.c +++ b/src/pr_clock.c @@ -29,10 +29,11 @@ #include <string.h> #include <assert.h> #include <gtk/gtk.h> +#include <libintl.h> +#define _(x) gettext(x) #include "presentation.h" #include "pr_clock.h" -#include "utils.h" struct pr_clock diff --git a/src-old/pr_clock.h b/src/pr_clock.h index 97d2d0d..97d2d0d 100644 --- a/src-old/pr_clock.h +++ b/src/pr_clock.h diff --git a/src-old/slideshow.c b/src/slideshow.c index 6e1c49d..1bd1930 100644 --- a/src-old/slideshow.c +++ b/src/slideshow.c @@ -30,13 +30,15 @@ #include <assert.h> #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> +#include <libintl.h> +#define _(x) gettext(x) +#include <presentation.h> + +#include "slide_render_cairo.h" +#include "slideshow.h" #include "colloquium.h" -#include "presentation.h" -#include "render.h" #include "pr_clock.h" -#include "frame.h" -#include "utils.h" G_DEFINE_TYPE_WITH_CODE(SCSlideshow, sc_slideshow, GTK_TYPE_WINDOW, NULL) @@ -51,27 +53,11 @@ void sc_slideshow_class_init(SCSlideshowClass *klass) } -static void slideshow_rerender(SCSlideshow *ss) +static void redraw(SCSlideshow *ss) { - int n; gint w, h; - - if ( ss->cur_slide == NULL ) return; - - if ( ss->surface != NULL ) { - cairo_surface_destroy(ss->surface); - } - - n = slide_number(ss->p, ss->cur_slide); - ss->surface = render_sc(ss->cur_slide, - ss->slide_width, ss->slide_height, - ss->p->slide_width, ss->p->slide_height, - ss->p->stylesheet, NULL, ss->p->is, n, - &ss->top, ss->p->lang); - w = gtk_widget_get_allocated_width(GTK_WIDGET(ss->drawingarea)); h = gtk_widget_get_allocated_height(GTK_WIDGET(ss->drawingarea)); - gtk_widget_queue_draw_area(ss->drawingarea, 0, 0, w, h); } @@ -81,9 +67,6 @@ static gint ssh_destroy_sig(GtkWidget *widget, SCSlideshow *ss) if ( ss->blank_cursor != NULL ) { g_object_unref(ss->blank_cursor); } - if ( ss->surface != NULL ) { - cairo_surface_destroy(ss->surface); - } if ( ss->inhibit_cookie ) { gtk_application_uninhibit(ss->app, ss->inhibit_cookie); } @@ -93,23 +76,57 @@ static gint ssh_destroy_sig(GtkWidget *widget, SCSlideshow *ss) static gboolean ss_draw_sig(GtkWidget *da, cairo_t *cr, SCSlideshow *ss) { - double width, height; + double dw, dh; /* Size of drawing area */ + double lw, lh; /* Logical size of slide */ + double sw, sh; /* Size of slide on screen */ + double xoff, yoff; - width = gtk_widget_get_allocated_width(GTK_WIDGET(da)); - height = gtk_widget_get_allocated_height(GTK_WIDGET(da)); + dw = gtk_widget_get_allocated_width(GTK_WIDGET(da)); + dh = gtk_widget_get_allocated_height(GTK_WIDGET(da)); /* Overall background */ - cairo_rectangle(cr, 0.0, 0.0, width, height); + cairo_rectangle(cr, 0.0, 0.0, dw, dh); cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_fill(cr); + slide_get_logical_size(ss->cur_slide, + presentation_get_stylesheet(ss->p), &lw, &lh); + + if ( lw/lh > (double)dw/dh ) { + /* Slide is too wide. Letterboxing top/bottom */ + sw = dw; + sh = dw * lh/lw; + } else { + /* Letterboxing at sides */ + sw = dh * lw/lh; + sh = dh; + } + + xoff = (dw - sw)/2.0; + yoff = (dh - sh)/2.0; + if ( !ss->blank ) { - /* Draw the slide from the cache */ - cairo_rectangle(cr, ss->xoff, ss->yoff, - ss->slide_width, ss->slide_height); - cairo_set_source_surface(cr, ss->surface, ss->xoff, ss->yoff); - cairo_fill(cr); + PangoContext *pc; + int n; + struct slide_pos sel; + + cairo_save(cr); + cairo_translate(cr, xoff, yoff); + cairo_scale(cr, sw/lw, sh/lh); + + sel.para = 0; sel.pos = 0; sel.trail = 0; + n = presentation_get_slide_number(ss->p, ss->cur_slide); + pc = pango_cairo_create_context(cr); + + slide_render_cairo(ss->cur_slide, cr, + presentation_get_imagestore(ss->p), + presentation_get_stylesheet(ss->p), + n, pango_language_get_default(), pc, + NULL, sel, sel); + + g_object_unref(pc); + cairo_restore(cr); } @@ -132,47 +149,18 @@ static gboolean ss_realize_sig(GtkWidget *w, SCSlideshow *ss) ss->blank_cursor = NULL; } - slideshow_rerender(ss); - return FALSE; } -static void ss_size_sig(GtkWidget *widget, GdkRectangle *rect, SCSlideshow *ss) -{ - const double sw = ss->p->slide_width; - const double sh = ss->p->slide_height; - - if ( sw/sh > (double)rect->width/rect->height ) { - /* Slide is too wide. Letterboxing top/bottom */ - ss->slide_width = rect->width; - ss->slide_height = rect->width * sh/sw; - } else { - /* Letterboxing at sides */ - ss->slide_width = rect->height * sw/sh; - ss->slide_height = rect->height; - } - - ss->xoff = (rect->width - ss->slide_width)/2.0; - ss->yoff = (rect->height - ss->slide_height)/2.0; - - printf("screen %i %i\n", rect->width, rect->height); - printf("slide %f %f\n", sw, sh); - printf("rendering slide at %i %i\n", ss->slide_width, ss->slide_height); - printf("offset %i %i\n", ss->xoff, ss->yoff); - - slideshow_rerender(ss); -} - - -void sc_slideshow_set_slide(SCSlideshow *ss, SCBlock *ns) +void sc_slideshow_set_slide(SCSlideshow *ss, Slide *ns) { ss->cur_slide = ns; - slideshow_rerender(ss); + redraw(ss); } -SCSlideshow *sc_slideshow_new(struct presentation *p, GtkApplication *app) +SCSlideshow *sc_slideshow_new(Presentation *p, GtkApplication *app) { GdkDisplay *display; int n_monitors; @@ -185,7 +173,6 @@ SCSlideshow *sc_slideshow_new(struct presentation *p, GtkApplication *app) ss->p = p; ss->cur_slide = NULL; ss->blank_cursor = NULL; - ss->surface = NULL; ss->app = app; ss->drawingarea = gtk_drawing_area_new(); @@ -199,9 +186,6 @@ SCSlideshow *sc_slideshow_new(struct presentation *p, GtkApplication *app) G_CALLBACK(ssh_destroy_sig), ss); g_signal_connect(G_OBJECT(ss), "realize", G_CALLBACK(ss_realize_sig), ss); - g_signal_connect(G_OBJECT(ss), "size-allocate", - G_CALLBACK(ss_size_sig), ss); - g_signal_connect(G_OBJECT(ss->drawingarea), "draw", G_CALLBACK(ss_draw_sig), ss); @@ -227,8 +211,6 @@ SCSlideshow *sc_slideshow_new(struct presentation *p, GtkApplication *app) gtk_window_move(GTK_WINDOW(ss), rect.x, rect.y); gtk_window_fullscreen(GTK_WINDOW(ss)); - ss->linked = 1; - if ( app != NULL ) { ss->inhibit_cookie = gtk_application_inhibit(app, GTK_WINDOW(ss), GTK_APPLICATION_INHIBIT_IDLE, diff --git a/src-old/slideshow.h b/src/slideshow.h index ff16d73..777b9f2 100644 --- a/src-old/slideshow.h +++ b/src/slideshow.h @@ -1,7 +1,7 @@ /* * slideshow.h * - * Copyright © 2013-2018 Thomas White <taw@bitwiz.org.uk> + * Copyright © 2013-2019 Thomas White <taw@bitwiz.org.uk> * * This file is part of Colloquium. * @@ -51,21 +51,16 @@ struct _scslideshow GtkWindow parent_instance; /* <private> */ - struct presentation *p; - SCBlock *cur_slide; + Presentation *p; + Slide *cur_slide; GtkWidget *drawingarea; GdkCursor *blank_cursor; int blank; - int slide_width; - int slide_height; int xoff; int yoff; - int linked; - cairo_surface_t *surface; - struct frame *top; int single_monitor; - uint inhibit_cookie; GtkApplication *app; + gint inhibit_cookie; }; @@ -77,7 +72,8 @@ struct _scslideshowclass typedef struct _scslideshow SCSlideshow; typedef struct _scslideshowclass SCSlideshowClass; -extern SCSlideshow *sc_slideshow_new(struct presentation *p, GtkApplication *app); -extern void sc_slideshow_set_slide(SCSlideshow *ss, SCBlock *ns); +extern SCSlideshow *sc_slideshow_new(Presentation *p, GtkApplication *app); +extern void sc_slideshow_set_slide(SCSlideshow *ss, Slide *ns); +extern Slide *sc_slideshow_get_slide(SCSlideshow *ss); #endif /* SLIDESHOW_H */ |