aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/notes.c28
-rw-r--r--src/presentation.c2
-rw-r--r--src/presentation.h3
-rw-r--r--src/sc_editor.c7
-rw-r--r--src/sc_editor.h1
-rw-r--r--src/slide_sorter.c6
-rw-r--r--src/slide_window.c60
-rw-r--r--src/slide_window.h17
-rw-r--r--src/slideshow.c94
-rw-r--r--src/slideshow.h4
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 <taw@bitwiz.org.uk>
+ * Copyright © 2013-2014 Thomas White <taw@bitwiz.org.uk>
*
* 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 <config.h>
@@ -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 <config.h>
#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);