aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2019-03-28 15:05:10 +0100
committerThomas White <taw@bitwiz.me.uk>2019-03-28 15:05:10 +0100
commit6b60cafe0c2689531459f1cffd704da16ed2aec3 (patch)
treee41af753bb798e8b955434696c843c04dccf6bc5
parent47764e46296e8c6921bbc00b95c05ff153699dc2 (diff)
Restore slideshow and clock
-rw-r--r--libstorycode/gtk/gtknarrativeview.c47
-rw-r--r--libstorycode/gtk/gtknarrativeview.h1
-rw-r--r--libstorycode/narrative.c14
-rw-r--r--libstorycode/narrative.h2
-rw-r--r--meson.build4
-rw-r--r--src/narrative_window.c245
-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 */