aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2012-06-14 16:02:15 +0100
committerThomas White <taw@bitwiz.org.uk>2012-06-14 16:02:15 +0100
commit34db1cd5f43ccd48cf672266413f608173eb838f (patch)
tree6faac72cd19c8ef3cf13211aaa900e73a118bc44
parent940337bb4e46463b794fd9779cc3e07e7e175cee (diff)
Simplify...
-rw-r--r--Makefile.am16
-rw-r--r--m4/gnulib-cache.m425
-rw-r--r--src/colloquium.c17
-rw-r--r--src/loadsave.c855
-rw-r--r--src/loadsave.h75
-rw-r--r--src/mainwindow.c851
-rw-r--r--src/mainwindow.h38
-rw-r--r--src/notes.c151
-rw-r--r--src/notes.h41
-rw-r--r--src/objects.c289
-rw-r--r--src/objects.h103
-rw-r--r--src/presentation.c371
-rw-r--r--src/presentation.h135
-rw-r--r--src/slideshow.c290
-rw-r--r--src/slideshow.h41
-rw-r--r--src/storycode.c241
-rw-r--r--src/storycode.h14
-rw-r--r--src/stylesheet-editor.c328
-rw-r--r--src/stylesheet-editor.h35
-rw-r--r--src/stylesheet.c580
-rw-r--r--src/stylesheet.h19
-rw-r--r--src/tool_image.c514
-rw-r--r--src/tool_image.h41
-rw-r--r--src/tool_select.c234
-rw-r--r--src/tool_select.h34
-rw-r--r--src/tool_text.c984
-rw-r--r--src/tool_text.h36
27 files changed, 39 insertions, 6319 deletions
diff --git a/Makefile.am b/Makefile.am
index c7379f5..aa364e6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -8,16 +8,11 @@ AM_CFLAGS = -Wall
AM_CPPFLAGS = -DDATADIR=\""$(datadir)"\" -I$(top_builddir)/lib -I$(top_srcdir)/lib
LDADD = $(top_builddir)/lib/libgnu.a @IGNORE_UNUSED_LIBRARIES_CFLAGS@
-src_colloquium_SOURCES = src/colloquium.c src/presentation.c src/mainwindow.c \
- src/storycode.c src/slideshow.c \
- src/stylesheet.c src/loadsave.c src/notes.c \
- src/stylesheet-editor.c
+src_colloquium_SOURCES = src/colloquium.c src/storycode.c src/render.c
INCLUDES = "-I$(top_srcdir)/data"
-EXTRA_DIST += src/presentation.h src/mainwindow.h src/storycode.h \
- src/slideshow.h src/stylesheet.h src/loadsave.h \
- src/notes.h src/stylesheet-editor.h
+EXTRA_DIST +=
colloquiumdir = $(datadir)/colloquium
colloquium_DATA = data/colloquium.ui
@@ -27,3 +22,10 @@ icons_DATA = data/colloquium-select.svg data/colloquium-text.svg \
data/colloquium-image.svg
EXTRA_DIST += $(colloquium_DATA)
+
+noinst_PROGRAMS = tests/storycode_test tests/render_test
+TESTS = tests/storycode_test tests/render_test
+
+tests_storycode_test_SOURCES = tests/storycode_test.c src/storycode.c
+
+tests_render_test_SOURCES = tests/render_test.c src/storycode.c src/render.c
diff --git a/m4/gnulib-cache.m4 b/m4/gnulib-cache.m4
index e09ed2c..fd17149 100644
--- a/m4/gnulib-cache.m4
+++ b/m4/gnulib-cache.m4
@@ -1,9 +1,21 @@
-# Copyright (C) 2002-2010 Free Software Foundation, Inc.
+# Copyright (C) 2002-2012 Free Software Foundation, Inc.
#
-# This file is free software, distributed under the terms of the GNU
-# General Public License. As a special exception to the GNU General
-# Public License, this file may be distributed as part of a program
-# that contains a configuration script generated by Autoconf, under
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file. If not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
@@ -15,7 +27,7 @@
# Specification in the form of a command-line invocation:
-# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-libtool --macro-prefix=gl lib-ignore strndup
+# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --no-libtool --macro-prefix=gl lib-ignore strndup
# Specification in the form of a few gnulib-tool.m4 macro invocations:
gl_LOCAL_DIR([])
@@ -33,3 +45,4 @@ gl_LIB([libgnu])
gl_MAKEFILE_NAME([])
gl_MACRO_PREFIX([gl])
gl_PO_DOMAIN([])
+gl_WITNESS_C_DOMAIN([])
diff --git a/src/colloquium.c b/src/colloquium.c
index b389e32..15836be 100644
--- a/src/colloquium.c
+++ b/src/colloquium.c
@@ -28,9 +28,6 @@
#include <gtk/gtk.h>
#include <getopt.h>
-#include "presentation.h"
-#include "mainwindow.h"
-
static void show_help(const char *s)
{
@@ -74,13 +71,13 @@ int main(int argc, char *argv[])
}
- p = new_presentation();
- p->cur_edit_slide = add_slide(p, 0);
- p->completely_empty = 1;
- if ( open_mainwindow(p) ) {
- fprintf(stderr, "Couldn't open main window.\n");
- return 1;
- }
+// p = new_presentation();
+// p->cur_edit_slide = add_slide(p, 0);
+// p->completely_empty = 1;
+// if ( open_mainwindow(p) ) {
+// fprintf(stderr, "Couldn't open main window.\n");
+// return 1;
+// }
gtk_main();
diff --git a/src/loadsave.c b/src/loadsave.c
deleted file mode 100644
index 4388953..0000000
--- a/src/loadsave.c
+++ /dev/null
@@ -1,855 +0,0 @@
-/*
- * loadsave.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <assert.h>
-
-#include "presentation.h"
-#include "objects.h"
-#include "stylesheet.h"
-#include "mainwindow.h"
-#include "notes.h"
-
-
-static int alloc_children(struct ds_node *node)
-{
- struct ds_node **new;
-
- new = realloc(node->children,
- node->max_children*sizeof(*node->children));
- if ( new == NULL ) return 1;
-
- node->children = new;
- return 0;
-}
-
-
-static struct ds_node *new_ds_node(const char *key)
-{
- struct ds_node *new;
-
- new = malloc(sizeof(*new));
- if ( new == NULL ) return NULL;
-
- new->key = strdup(key);
- if ( new->key == NULL ) {
- free(new);
- return NULL;
- }
-
- new->value = NULL;
- new->n_children = 0;
- new->max_children = 32;
- new->children = NULL;
-
- if ( alloc_children(new) ) {
- free(new);
- return NULL;
- }
-
- return new;
-}
-
-
-static struct ds_node *add_child(struct ds_node *node, const char *key)
-{
- struct ds_node *new;
-
- new = new_ds_node(key);
- if ( new == NULL ) return NULL;
-
- if ( node->n_children >= new->max_children ) {
- new->max_children += 32;
- if ( alloc_children(node) ) {
- free(new);
- return NULL;
- }
- }
-
- node->children[node->n_children++] = new;
-
- return new;
-}
-
-
-void show_tree(struct ds_node *root, const char *path)
-{
- char newpath[1024];
- int i;
-
- snprintf(newpath, 1023, "%s%s/", path, root->key);
-
- printf("%s\n", newpath);
- for ( i=0; i<root->n_children; i++ ) {
- printf(" %s => %s\n", root->children[i]->key,
- root->children[i]->value);
- }
-
- for ( i=0; i<root->n_children; i++ ) {
- if ( root->children[i]->n_children > 0 ) {
- printf("\n");
- show_tree(root->children[i], newpath);
- }
- }
-}
-
-
-struct ds_node *find_node(struct ds_node *root, const char *path, int cr)
-{
- size_t start, len;
- char element[1024];
- struct ds_node *cur = root;
-
- len = strlen(path);
-
- start = 0;
- while ( start < len ) {
-
- size_t pos, i;
- int child;
- int found = 0;
-
- pos = 0;
- for ( i=start; i<len; i++ ) {
-
- if ( path[i] == '/' ) break;
- element[pos++] = path[i];
-
- }
- element[pos++] = '\0';
- if ( element[0] == '\0' ) {
- goto out;
- }
- start = i+1;
-
- for ( child=0; child<cur->n_children; child++ ) {
-
- const char *this_key = cur->children[child]->key;
-
- if ( strcmp(this_key, element) == 0 ) {
- cur = cur->children[child];
- found = 1;
- break;
- }
-
- }
-
- if ( !found ) {
-
- if ( cr ) {
- cur = add_child(cur, element);
- if ( cur == NULL ) {
- return NULL; /* Error */
- }
- } else {
- return NULL;
- }
-
- }
-
- }
-
-out:
- return cur;
-}
-
-
-static void parse_line(struct ds_node *root, struct ds_node **cn,
- const char *line)
-{
- size_t i;
- size_t len, s_start;
- size_t s_equals = 0;
- size_t s_val = 0;
- size_t s_openbracket = 0;
- size_t s_closebracket = 0;
- int h_start = 0;
- int h_equals = 0;
- int h_val = 0;
- int h_openbracket = 0;
- int h_closebracket = 0;
- struct ds_node *cur_node = *cn;
-
- len = strlen(line);
-
- s_start = len;
-
- for ( i=0; i<len; i++ ) {
- if ( !h_start && !isspace(line[i]) ) {
- s_start = i;
- h_start = 1;
- }
- if ( !h_val && h_equals && !isspace(line[i]) ) {
- s_val = i;
- h_val = 1;
- }
- if ( !h_equals && (line[i] == '=') ) {
- s_equals = i;
- h_equals = 1;
- }
- if ( !h_openbracket && (line[i] == '[') ) {
- s_openbracket = i;
- h_openbracket = 1;
- }
- if ( h_openbracket && !h_closebracket
- && (line[i] == ']') )
- {
- s_closebracket = i;
- h_closebracket = 1;
- }
- }
-
- if ( (h_openbracket && !h_closebracket)
- || (!h_openbracket && h_closebracket) )
- {
- fprintf(stderr, "Mismatched square brackets: %s", line);
- return;
- }
-
- if ( !h_openbracket && !h_equals ) return;
-
- if ( !h_openbracket && (!h_start || !h_val || !h_equals) ) {
- fprintf(stderr, "Incomplete assignment: %s", line);
- return;
- }
-
- if ( h_equals && (h_openbracket || h_closebracket) ) {
- fprintf(stderr, "Brackets and equals: %s", line);
- return;
- }
-
- if ( !h_openbracket ) {
-
- size_t pos = 0;
- char *key;
- char *value;
- struct ds_node *node;
-
- key = malloc(len);
- value = malloc(len);
-
- for ( i=s_start; i<s_equals; i++ ) {
- if ( !isspace(line[i]) ) key[pos++] = line[i];
- }
- key[pos] = '\0';
-
- pos = 0;
- for ( i=s_val; i<len; i++ ) {
- if ( line[i] != '\n' ) value[pos++] = line[i];
- }
- value[pos] = '\0';
-
- node = find_node(cur_node, key, 1);
- node->value = strdup(value);
-
- free(key);
- free(value);
-
- } else {
-
- size_t pos = 0;
- char *path;
-
- path = malloc(len);
-
- for ( i=s_openbracket+1; i<s_closebracket; i++ ) {
- if ( !isspace(line[i]) ) path[pos++] = line[i];
- }
- path[pos] = '\0';
- cur_node = find_node(root, path, 1);
-
- free(path);
-
- }
-
- *cn = cur_node;
-}
-
-
-static char *fgets_long(FILE *fh)
-{
- char *line;
- size_t la, l;
-
- la = 1024;
- line = malloc(la);
- if ( line == NULL ) return NULL;
-
- do {
-
- int r;
-
- r = fgetc(fh);
- if ( r == EOF ) {
- free(line);
- return NULL;
- }
-
- if ( r == '\n' ) {
- line[l++] = '\0';
- return line;
- }
-
- line[l++] = r;
-
- if ( l == la ) {
-
- char *ln;
-
- la += 1024;
- ln = realloc(line, la);
- if ( ln == NULL ) {
- free(line);
- return NULL;
- }
-
- line = ln;
-
- }
-
- } while ( 1 );
-}
-
-
-static int deserialize_file(FILE *fh, struct ds_node *root)
-{
- char *line;
- struct ds_node *cur_node = root;
-
- line = NULL;
- do {
-
- line = fgets_long(fh);
- if ( line == NULL ) {
- if ( ferror(fh) ) printf("Read error!\n");
- continue;
- }
-
- parse_line(root, &cur_node, line);
-
- } while ( line != NULL );
-
- return 0;
-}
-
-
-static void free_ds_tree(struct ds_node *root)
-{
- int i;
-
- for ( i=0; i<root->n_children; i++ ) {
- if ( root->children[i]->n_children > 0 ) {
- free_ds_tree(root->children[i]);
- }
- }
-
- free(root->key);
- free(root->value); /* Might free(NULL), but that's fine */
- free(root);
-}
-
-
-char *escape_text(const char *a)
-{
- char *b;
- size_t l1, l, i;
-
- l1 = strlen(a);
-
- b = malloc(2*l1 + 1);
- l = 0;
-
- for ( i=0; i<l1; i++ ) {
-
- char c = a[i];
-
- /* Yes, this is horribly confusing */
- if ( c == '\n' ) {
- b[l++] = '\\'; b[l++] = 'n';
- } else if ( c == '\r' ) {
- b[l++] = '\\'; b[l++] = 'r';
- } else if ( c == '\"' ) {
- b[l++] = '\\'; b[l++] = '\"';
- } else if ( c == '\t' ) {
- b[l++] = '\\'; b[l++] = 't';
- } else {
- b[l++] = c;
- }
-
- }
- b[l++] = '\0';
-
- return realloc(b, l);
-}
-
-
-char *unescape_text(const char *a)
-{
- char *b;
- size_t l1, l, i;
- int escape;
-
- l1 = strlen(a);
-
- b = malloc(l1 + 1);
- l = 0;
- escape = 0;
-
- for ( i=0; i<l1; i++ ) {
-
- char c = a[i];
-
- if ( escape ) {
- if ( c == 'r' ) b[l++] = '\r';
- if ( c == 'n' ) b[l++] = '\n';
- if ( c == '\"' ) b[l++] = '\"';
- if ( c == 't' ) b[l++] = '\t';
- escape = 0;
- continue;
- }
-
- if ( c == '\\' ) {
- escape = 1;
- continue;
- }
-
- b[l++] = c;
-
- }
- b[l++] = '\0';
-
- return realloc(b, l);
-}
-
-
-
-int get_field_f(struct ds_node *root, const char *key, double *val)
-{
- struct ds_node *node;
- double v;
- char *check;
-
- node = find_node(root, key, 0);
- if ( node == NULL ) {
- fprintf(stderr, "Couldn't find field '%s'\n", key);
- return 1;
- }
-
- v = strtod(node->value, &check);
- if ( check == node->value ) {
- fprintf(stderr, "Invalid value for '%s'\n", key);
- return 1;
- }
-
- *val = v;
-
- return 0;
-}
-
-
-int get_field_i(struct ds_node *root, const char *key, int *val)
-{
- struct ds_node *node;
- int v;
- char *check;
-
- node = find_node(root, key, 0);
- if ( node == NULL ) {
- fprintf(stderr, "Couldn't find field '%s'\n", key);
- return 1;
- }
-
- v = strtol(node->value, &check, 0);
- if ( check == node->value ) {
- fprintf(stderr, "Invalid value for '%s'\n", key);
- return 1;
- }
-
- *val = v;
-
- return 0;
-}
-
-
-int get_field_s(struct ds_node *root, const char *key, char **val)
-{
- struct ds_node *node;
- char *v;
- size_t i, len, s1, s2;
- int hq;
-
- node = find_node(root, key, 0);
- if ( node == NULL ) {
- *val = NULL;
- return 1;
- }
-
- len = strlen(node->value);
- hq = 0;
- for ( i=0; i<len; i++ ) {
- if ( node->value[i] == '"' ) {
- s1 = i;
- hq = 1;
- break;
- }
- }
- if ( !hq ) {
- fprintf(stderr, "No quotes in '%s'\n", node->value);
- return 1;
- }
-
- for ( i=len-1; i>=0; i-- ) {
- if ( node->value[i] == '"' ) {
- s2 = i;
- break;
- }
- }
-
- if ( s1 == s2 ) {
- fprintf(stderr, "Mismatched quotes in '%s'\n", node->value);
- return 1;
- }
-
- v = malloc(s2-s1+1);
- if ( v == NULL ) {
- fprintf(stderr, "Failed to allocate space for '%s'\n", key);
- return 1;
- }
-
- strncpy(v, node->value+s1+1, s2-s1-1);
- v[s2-s1-1] = '\0';
-
- *val = unescape_text(v);
- free(v);
-
- return 0;
-}
-
-
-static struct frame *tree_to_frame(struct ds_node *root)
-{
- return NULL;
-}
-
-
-static struct slide *tree_to_slide(struct presentation *p, struct ds_node *root)
-{
- struct slide *s;
- int i;
-
- s = new_slide();
- s->parent = p;
-
- load_notes(root, s);
-
- /* Loop over objects */
- for ( i=0; i<root->n_children; i++ ) {
-
- struct frame *fr;
-
- fr = tree_to_frame(root->children[i]);
- if ( fr != NULL ) {
- add_frame_to_slide(s, fr);
- }
-
- }
-
- return s;
-}
-
-
-static int tree_to_slides(struct ds_node *root, struct presentation *p)
-{
- int i;
-
- for ( i=0; i<root->n_children; i++ ) {
-
- struct slide *s;
-
- s = tree_to_slide(p, root->children[i]);
- if ( s != NULL ) {
- insert_slide(p, s, p->num_slides-1);
- }
-
- }
-
- return 0;
-}
-
-
-int tree_to_presentation(struct ds_node *root, struct presentation *p)
-{
- struct ds_node *node;
- char *check;
- int i;
-
- p->cur_edit_slide = NULL;
- p->cur_proj_slide = NULL;
-
- node = find_node(root, "slide-properties/width", 0);
- if ( node == NULL ) return 1;
- p->slide_width = strtod(node->value, &check);
- if ( check == node->value ) {
- fprintf(stderr, "Invalid slide width\n");
- return 1;
- }
-
- node = find_node(root, "slide-properties/height", 0);
- if ( node == NULL ) return 1;
- p->slide_height = strtod(node->value, &check);
- if ( check == node->value ) {
- fprintf(stderr, "Invalid slide height\n");
- return 1;
- }
-
- node = find_node(root, "stylesheet", 0);
- if ( node != NULL ) {
- free_stylesheet(p->ss);
- p->ss = tree_to_stylesheet(node);
- if ( p->ss == NULL ) {
- fprintf(stderr, "Invalid style sheet\n");
- return 1;
- }
- }
-
- for ( i=0; i<p->num_slides; i++ ) {
- free_slide(p->slides[i]);
- p->num_slides = 0;
- }
-
- node = find_node(root, "slides", 0);
- if ( node != NULL ) {
- tree_to_slides(node, p);
- if ( p->num_slides == 0 ) {
- fprintf(stderr, "Failed to load any slides\n");
- p->cur_edit_slide = add_slide(p, 0);
- return 1;
- }
- }
-
- p->cur_edit_slide = p->slides[0];
-// redraw_slide(p->cur_edit_slide);
-
- return 0;
-}
-
-
-int load_presentation(struct presentation *p, const char *filename)
-{
- FILE *fh;
- struct ds_node *root;
- int r;
-
- assert(p->completely_empty);
-
- fh = fopen(filename, "r");
- if ( fh == NULL ) return 1;
-
- root = new_ds_node("root");
- if ( root == NULL ) return 1;
-
- if ( deserialize_file(fh, root) ) {
- fclose(fh);
- return 1;
- }
-
- r = tree_to_presentation(root, p);
- free_ds_tree(root);
-
- fclose(fh);
-
- if ( r ) {
- p->cur_edit_slide = new_slide();
- insert_slide(p, p->cur_edit_slide, 0);
- p->completely_empty = 1;
- return r; /* Error */
- }
-
- assert(p->filename == NULL);
- p->filename = strdup(filename);
- update_titlebar(p);
-
- p->cur_edit_slide = p->slides[0];
-
- return 0;
-}
-
-
-static void rebuild_prefix(struct serializer *ser)
-{
- int i;
- size_t sz = 1; /* Space for terminator */
-
- for ( i=0; i<ser->stack_depth; i++ ) {
- sz += strlen(ser->stack[i]) + 1;
- }
-
- free(ser->prefix);
- ser->prefix = malloc(sz);
- if ( ser->prefix == NULL ) return; /* Probably bad! */
-
- ser->prefix[0] = '\0';
- for ( i=0; i<ser->stack_depth; i++ ) {
- if ( i != 0 ) strcat(ser->prefix, "/");
- strcat(ser->prefix, ser->stack[i]);
- }
-}
-
-
-void serialize_start(struct serializer *ser, const char *id)
-{
- ser->stack[ser->stack_depth++] = strdup(id);
- rebuild_prefix(ser);
- ser->empty_set = 1;
-}
-
-
-static void check_prefix_output(struct serializer *ser)
-{
- if ( ser->empty_set ) {
- ser->empty_set = 0;
- if ( ser->prefix != NULL ) {
- fprintf(ser->fh, "\n");
- fprintf(ser->fh, "[%s]\n", ser->prefix);
- }
- }
-}
-
-
-void serialize_s(struct serializer *ser, const char *key, const char *val)
-{
- char *n;
-
- n = escape_text(val);
- if ( n == NULL ) {
- fprintf(stderr, "Failed to escape '%s'\n", val);
- return;
- }
-
- check_prefix_output(ser);
- fprintf(ser->fh, "%s = \"%s\"\n", key, n);
-
- free(n);
-}
-
-
-void serialize_f(struct serializer *ser, const char *key, double val)
-{
- check_prefix_output(ser);
- fprintf(ser->fh, "%s = %.2f\n", key, val);
-}
-
-
-void serialize_b(struct serializer *ser, const char *key, int val)
-{
- check_prefix_output(ser);
- fprintf(ser->fh, "%s = %i\n", key, val);
-}
-
-
-void serialize_end(struct serializer *ser)
-{
- free(ser->stack[--ser->stack_depth]);
- rebuild_prefix(ser);
- ser->empty_set = 1;
-}
-
-
-int save_presentation(struct presentation *p, const char *filename)
-{
- FILE *fh;
- int i;
- struct serializer ser;
- char *old_fn;
-
- grab_current_notes(p);
-
- fh = fopen(filename, "w");
- if ( fh == NULL ) return 1;
-
- /* Set up the serializer */
- ser.fh = fh;
- ser.stack_depth = 0;
- ser.prefix = NULL;
-
- fprintf(fh, "# Colloquium presentation file\n");
- serialize_f(&ser, "version", 0.1);
-
- serialize_start(&ser, "slide-properties");
- serialize_f(&ser, "width", p->slide_width);
- serialize_f(&ser, "height", p->slide_height);
- serialize_end(&ser);
-
- serialize_start(&ser, "stylesheet");
- write_stylesheet(p->ss, &ser);
- serialize_end(&ser);
-
- serialize_start(&ser, "slides");
- for ( i=0; i<p->num_slides; i++ ) {
-
- int j;
- struct slide *s;
- char s_id[32];
-
- s = p->slides[i];
-
- snprintf(s_id, 31, "%i", i);
- serialize_start(&ser, s_id);
- for ( j=0; j<s->num_frames; j++ ) {
-
- struct frame *fr = s->frames[j];
- char fr_id[32];
-
- if ( fr->empty ) continue;
- snprintf(fr_id, 31, "%i", j);
-
- serialize_start(&ser, fr_id);
- fr->serialize(fr, &ser);
- serialize_end(&ser);
-
- }
-
- write_notes(s, &ser);
-
- serialize_end(&ser);
-
- }
- serialize_end(&ser);
-
- /* Slightly fiddly because someone might
- * do save_presentation(p, p->filename) */
- old_fn = p->filename;
- p->filename = strdup(filename);
- if ( old_fn != NULL ) free(old_fn);
- update_titlebar(p);
-
- fclose(fh);
- return 0;
-}
diff --git a/src/loadsave.h b/src/loadsave.h
deleted file mode 100644
index 14fb6ff..0000000
--- a/src/loadsave.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * loadsave.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef LOADSAVE_H
-#define LOADSAVE_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-/* Forward declaration */
-struct presentation;
-
-struct ds_node
-{
- char *key;
- char *value;
- struct ds_node **children;
- int n_children;
- int max_children;
-};
-
-/* Would be opaque if I could be bothered to write the constructor */
-struct serializer
-{
- FILE *fh;
-
- char *stack[32];
- int stack_depth;
- char *prefix;
- int empty_set;
- int blank_written;
-};
-
-extern void show_tree(struct ds_node *root, const char *path);
-
-extern char *escape_text(const char *a);
-extern char *unescape_text(const char *a);
-
-extern void serialize_start(struct serializer *s, const char *id);
-extern void serialize_s(struct serializer *s, const char *key, const char *val);
-extern void serialize_f(struct serializer *s, const char *key, double val);
-extern void serialize_b(struct serializer *s, const char *key, int val);
-extern void serialize_end(struct serializer *s);
-
-extern int get_field_f(struct ds_node *root, const char *key, double *val);
-extern int get_field_i(struct ds_node *root, const char *key, int *val);
-extern int get_field_s(struct ds_node *root, const char *key, char **val);
-
-extern struct ds_node *find_node(struct ds_node *root, const char *path,
- int cr);
-
-extern int load_presentation(struct presentation *p, const char *filename);
-extern int save_presentation(struct presentation *p, const char *filename);
-
-#endif /* LOADSAVE_H */
diff --git a/src/mainwindow.c b/src/mainwindow.c
deleted file mode 100644
index 67d3374..0000000
--- a/src/mainwindow.c
+++ /dev/null
@@ -1,851 +0,0 @@
-/*
- * mainwindow.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-#include <assert.h>
-#include <gdk/gdkkeysyms.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "presentation.h"
-#include "mainwindow.h"
-#include "storycode.h"
-#include "objects.h"
-#include "slideshow.h"
-#include "stylesheet.h"
-#include "loadsave.h"
-#include "tool_select.h"
-#include "tool_text.h"
-#include "tool_image.h"
-#include "notes.h"
-
-
-static void add_ui_sig(GtkUIManager *ui, GtkWidget *widget,
- GtkContainer *container)
-{
- gtk_box_pack_start(GTK_BOX(container), widget, FALSE, FALSE, 0);
- if ( GTK_IS_TOOLBAR(widget) ) {
- gtk_toolbar_set_show_arrow(GTK_TOOLBAR(widget), TRUE);
- }
-}
-
-
-static gint quit_sig(GtkWidget *widget, struct presentation *p)
-{
- return 0;
-}
-
-
-static void show_error(struct presentation *p, const char *message)
-{
- GtkWidget *window;
-
- window = gtk_message_dialog_new(GTK_WINDOW(p->window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_WARNING,
- GTK_BUTTONS_CLOSE, message);
- gtk_window_set_title(GTK_WINDOW(window), "Error");
-
- g_signal_connect_swapped(window, "response",
- G_CALLBACK(gtk_widget_destroy), window);
- gtk_widget_show(window);
-}
-
-
-static void update_toolbar(struct presentation *p)
-{
- GtkWidget *d;
- int cur_slide_number;
-
- d = gtk_ui_manager_get_widget(p->ui, "/ui/displaywindowtoolbar/first");
- gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
- d = gtk_ui_manager_get_widget(p->ui, "/ui/displaywindowtoolbar/prev");
- gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
- d = gtk_ui_manager_get_widget(p->ui, "/ui/displaywindowtoolbar/next");
- gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
- d = gtk_ui_manager_get_widget(p->ui, "/ui/displaywindowtoolbar/last");
- gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
-
- cur_slide_number = slide_number(p, p->cur_edit_slide);
- if ( cur_slide_number == 0 ) {
-
- d = gtk_ui_manager_get_widget(p->ui,
- "/ui/displaywindowtoolbar/first");
- gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
- d = gtk_ui_manager_get_widget(p->ui,
- "/ui/displaywindowtoolbar/prev");
- gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
-
- }
-
- if ( cur_slide_number == p->num_slides-1 ) {
-
- d = gtk_ui_manager_get_widget(p->ui,
- "/ui/displaywindowtoolbar/next");
- gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
- d = gtk_ui_manager_get_widget(p->ui,
- "/ui/displaywindowtoolbar/last");
- gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
-
- }
-
-
-}
-
-
-static gint open_response_sig(GtkWidget *d, gint response,
- struct presentation *p)
-{
- if ( response == GTK_RESPONSE_ACCEPT ) {
-
- char *filename;
-
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
-
- if ( p->completely_empty ) {
-
- if ( load_presentation(p, filename) ) {
- show_error(p, "Failed to open presentation");
- }
- redraw_slide(p->cur_edit_slide);
- update_toolbar(p);
-
- } else {
-
- struct presentation *p;
-
- p = new_presentation();
- if ( load_presentation(p, filename) ) {
- show_error(p, "Failed to open presentation");
- } else {
- open_mainwindow(p);
- }
-
- }
-
- g_free(filename);
-
- }
-
- gtk_widget_destroy(d);
-
- return 0;
-}
-
-
-static gint open_sig(GtkWidget *widget, struct presentation *p)
-{
- GtkWidget *d;
-
- d = gtk_file_chooser_dialog_new("Open Presentation",
- GTK_WINDOW(p->window),
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- NULL);
-
- g_signal_connect(G_OBJECT(d), "response",
- G_CALLBACK(open_response_sig), p);
-
- gtk_widget_show_all(d);
-
- return 0;
-}
-
-
-static gint new_sig(GtkWidget *widget, struct presentation *pnn)
-{
- struct presentation *p;
-
- p = new_presentation();
- if ( p != NULL ) {
- p->cur_edit_slide = add_slide(p, 0);
- p->completely_empty = 1;
- open_mainwindow(p);
- }
-
- return 0;
-}
-
-
-static gint saveas_response_sig(GtkWidget *d, gint response,
- struct presentation *p)
-{
- if ( response == GTK_RESPONSE_ACCEPT ) {
-
- char *filename;
-
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
-
- if ( save_presentation(p, filename) ) {
- show_error(p, "Failed to save presentation");
- }
-
- g_free(filename);
-
- }
-
- gtk_widget_destroy(d);
-
- return 0;
-}
-
-
-static gint saveas_sig(GtkWidget *widget, struct presentation *p)
-{
- GtkWidget *d;
-
- d = gtk_file_chooser_dialog_new("Save Presentation",
- GTK_WINDOW(p->window),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(d),
- TRUE);
-
- g_signal_connect(G_OBJECT(d), "response",
- G_CALLBACK(saveas_response_sig), p);
-
- gtk_widget_show_all(d);
-
- return 0;
-}
-
-
-static gint save_sig(GtkWidget *widget, struct presentation *p)
-{
- if ( p->filename == NULL ) {
- return saveas_sig(widget, p);
- }
-
- save_presentation(p, p->filename);
-
- return 0;
-}
-
-
-static gint save_ss_response_sig(GtkWidget *d, gint response,
- struct presentation *p)
-{
- if ( response == GTK_RESPONSE_ACCEPT ) {
-
- char *filename;
-
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
-
- if ( save_stylesheet(p->ss, filename) ) {
- show_error(p, "Failed to save style sheet");
- }
-
- g_free(filename);
-
- }
-
- gtk_widget_destroy(d);
-
- return 0;
-}
-
-
-static gint save_ss_sig(GtkWidget *widget, struct presentation *p)
-{
- GtkWidget *d;
-
- d = gtk_file_chooser_dialog_new("Save Style sheet",
- GTK_WINDOW(p->window),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(d),
- TRUE);
-
- g_signal_connect(G_OBJECT(d), "response",
- G_CALLBACK(save_ss_response_sig), p);
-
- gtk_widget_show_all(d);
-
- return 0;
-}
-
-
-static gint export_pdf_response_sig(GtkWidget *d, gint response,
- struct presentation *p)
-{
- if ( response == GTK_RESPONSE_ACCEPT ) {
-
- char *filename;
-
- filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d));
-
- if ( export_pdf(p, filename) ) {
- show_error(p, "Failed to export as PDF");
- }
-
- g_free(filename);
-
- }
-
- gtk_widget_destroy(d);
-
- return 0;
-}
-
-
-static gint export_pdf_sig(GtkWidget *widget, struct presentation *p)
-{
- GtkWidget *d;
-
- d = gtk_file_chooser_dialog_new("Export PDF",
- GTK_WINDOW(p->window),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(d),
- TRUE);
-
- g_signal_connect(G_OBJECT(d), "response",
- G_CALLBACK(export_pdf_response_sig), p);
-
- gtk_widget_show_all(d);
-
- return 0;
-}
-
-
-static gint about_sig(GtkWidget *widget, struct presentation *p)
-{
- GtkWidget *window;
-
- const gchar *authors[] = {
- "Thomas White <taw@bitwiz.org.uk>",
- NULL
- };
-
- window = gtk_about_dialog_new();
- gtk_window_set_transient_for(GTK_WINDOW(window), GTK_WINDOW(p->window));
-
- gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(window), "Colloquium");
- gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window), PACKAGE_VERSION);
- gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(window),
- "(c) 2011 Thomas White <taw@bitwiz.org.uk>");
- gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),
- "A tiny presentation program");
- gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(window),
- "(c) 2011 Thomas White <taw@bitwiz.org.uk>\n");
- gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(window),
- "http://www.bitwiz.org.uk/");
- gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(window), authors);
-
- g_signal_connect(window, "response", G_CALLBACK(gtk_widget_destroy),
- NULL);
-
- gtk_widget_show_all(window);
-
- return 0;
-}
-
-
-static gint start_slideshow_sig(GtkWidget *widget, struct presentation *p)
-{
- try_start_slideshow(p);
- return FALSE;
-}
-
-
-void notify_slide_changed(struct presentation *p, struct slide *np)
-{
- if ( p->cur_edit_slide->rendered_edit != NULL ) {
- cairo_surface_destroy(p->cur_edit_slide->rendered_edit);
- p->cur_edit_slide->rendered_edit = NULL;
- }
- p->cur_edit_slide = np;
-
- p->cur_frame = NULL;
-
- redraw_slide(p->cur_edit_slide);
-
- if ( p->notes != NULL ) {
- notify_notes_slide_changed(p, np);
- }
-
- if ( (p->slideshow != NULL) && p->slideshow_linked ) {
- notify_slideshow_slide_changed(p, np);
- }
-}
-
-
-static gint add_slide_sig(GtkWidget *widget, struct presentation *p)
-{
- struct slide *new;
- int cur_slide_number;
-
- cur_slide_number = slide_number(p, p->cur_edit_slide);
-
- new = add_slide(p, cur_slide_number);
- notify_slide_changed(p, new);
-
- return FALSE;
-}
-
-
-static gint first_slide_sig(GtkWidget *widget, struct presentation *p)
-{
- notify_slide_changed(p, p->slides[0]);
- update_toolbar(p);
- return FALSE;
-}
-
-
-static gint prev_slide_sig(GtkWidget *widget, struct presentation *p)
-{
- int cur_slide_number;
-
- cur_slide_number = slide_number(p, p->cur_edit_slide);
- if ( cur_slide_number == 0 ) return FALSE;
-
- notify_slide_changed(p, p->slides[cur_slide_number-1]);
- update_toolbar(p);
-
- return FALSE;
-}
-
-
-static gint next_slide_sig(GtkWidget *widget, struct presentation *p)
-{
- int cur_slide_number;
-
- cur_slide_number = slide_number(p, p->cur_edit_slide);
- if ( cur_slide_number == p->num_slides-1 ) return FALSE;
-
- notify_slide_changed(p, p->slides[cur_slide_number+1]);
- update_toolbar(p);
-
- return FALSE;
-}
-
-
-static gint last_slide_sig(GtkWidget *widget, struct presentation *p)
-{
- notify_slide_changed(p, p->slides[p->num_slides-1]);
- update_toolbar(p);
-
- return FALSE;
-}
-
-
-static gint open_stylesheet_sig(GtkWidget *widget, struct presentation *p)
-{
- if ( p->stylesheetwindow == NULL ) {
- p->stylesheetwindow = open_stylesheet(p);
- } /* else already open */
-
- return FALSE;
-}
-
-
-static gint open_notes_sig(GtkWidget *widget, struct presentation *p)
-{
- open_notes(p);
- return FALSE;
-}
-
-
-static void add_menu_bar(struct presentation *p, GtkWidget *vbox)
-{
- GError *error = NULL;
- GtkWidget *toolbar;
- GtkWidget *menu;
- GtkWidget *item;
-// int i;
- GtkActionEntry entries[] = {
-
- { "FileAction", NULL, "_File", NULL, NULL, NULL },
- { "NewAction", GTK_STOCK_NEW, "_New",
- NULL, NULL, G_CALLBACK(new_sig) },
- { "OpenAction", GTK_STOCK_OPEN, "_Open...",
- NULL, NULL, G_CALLBACK(open_sig) },
- { "SaveAction", GTK_STOCK_SAVE, "_Save",
- NULL, NULL, G_CALLBACK(save_sig) },
- { "SaveAsAction", GTK_STOCK_SAVE_AS, "Save _As...",
- NULL, NULL, G_CALLBACK(saveas_sig) },
- { "SaveStyleAction", GTK_STOCK_SAVE_AS, "Save St_ylesheet",
- NULL, NULL, G_CALLBACK(save_ss_sig) },
- { "ExportPDFAction", GTK_STOCK_SAVE_AS, "Export PDF",
- NULL, NULL, G_CALLBACK(export_pdf_sig) },
- { "QuitAction", GTK_STOCK_QUIT, "_Quit",
- NULL, NULL, G_CALLBACK(quit_sig) },
-
- { "EditAction", NULL, "_Edit", NULL, NULL, NULL },
- { "UndoAction", GTK_STOCK_UNDO, "_Undo",
- NULL, NULL, NULL },
- { "RedoAction", GTK_STOCK_REDO, "_Redo",
- NULL, NULL, NULL },
- { "CutAction", GTK_STOCK_CUT, "Cut",
- NULL, NULL, NULL },
- { "CopyAction", GTK_STOCK_COPY, "Copy",
- NULL, NULL, NULL },
- { "PasteAction", GTK_STOCK_PASTE, "Paste",
- NULL, NULL, NULL },
- { "DeleteAction", GTK_STOCK_DELETE, "Delete",
- NULL, NULL, NULL },
- { "EditStyleAction", NULL, "Stylesheet...",
- NULL, NULL, G_CALLBACK(open_stylesheet_sig) },
-
- { "InsertAction", NULL, "_Insert", NULL, NULL, NULL },
- { "NewSlideAction", GTK_STOCK_ADD, "_New Slide",
- NULL, NULL, G_CALLBACK(add_slide_sig) },
-
- { "ToolsAction", NULL, "_Tools", NULL, NULL, NULL },
- { "TSlideshowAction", GTK_STOCK_FULLSCREEN, "_Start slideshow",
- "F5", NULL, G_CALLBACK(start_slideshow_sig) },
- { "NotesAction", NULL, "_Open slide notes",
- "F5", NULL, G_CALLBACK(open_notes_sig) },
- { "PrefsAction", GTK_STOCK_PREFERENCES, "_Preferences",
- NULL, NULL, NULL },
-
- { "HelpAction", NULL, "_Help", NULL, NULL, NULL },
- { "AboutAction", GTK_STOCK_ABOUT, "_About...",
- NULL, NULL, G_CALLBACK(about_sig) },
-
- { "SlideshowAction", GTK_STOCK_FULLSCREEN, "Start Presentation",
- NULL, NULL, G_CALLBACK(start_slideshow_sig) },
- { "AddSlideAction", GTK_STOCK_ADD, "Add Slide",
- NULL, NULL, G_CALLBACK(add_slide_sig) },
- { "ButtonFirstSlideAction", GTK_STOCK_GOTO_FIRST, "First Slide",
- NULL, NULL, G_CALLBACK(first_slide_sig) },
- { "ButtonPrevSlideAction", GTK_STOCK_GO_BACK, "Previous Slide",
- NULL, NULL, G_CALLBACK(prev_slide_sig) },
- { "ButtonNextSlideAction", GTK_STOCK_GO_FORWARD, "Next Slide",
- NULL, NULL, G_CALLBACK(next_slide_sig) },
- { "ButtonLastSlideAction", GTK_STOCK_GOTO_LAST, "Last Slide",
- NULL, NULL, G_CALLBACK(last_slide_sig) },
-
- };
- guint n_entries = G_N_ELEMENTS(entries);
-
- p->action_group = gtk_action_group_new("mainwindow");
- gtk_action_group_add_actions(p->action_group, entries, n_entries, p);
-
- p->ui = gtk_ui_manager_new();
- gtk_ui_manager_insert_action_group(p->ui, p->action_group, 0);
- g_signal_connect(p->ui, "add_widget", G_CALLBACK(add_ui_sig), vbox);
- if ( gtk_ui_manager_add_ui_from_file(p->ui,
- DATADIR"/colloquium/colloquium.ui", &error) == 0 ) {
- fprintf(stderr, "Error loading main window menu bar: %s\n",
- error->message);
- return;
- }
-
- gtk_window_add_accel_group(GTK_WINDOW(p->window),
- gtk_ui_manager_get_accel_group(p->ui));
- gtk_ui_manager_ensure_update(p->ui);
-
- toolbar = gtk_ui_manager_get_widget(p->ui, "/displaywindowtoolbar");
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar),
- gtk_separator_tool_item_new(), -1);
-
- /* Add the styles to the "Insert" menu */
- menu = gtk_ui_manager_get_widget(p->ui, "/displaywindow/insert");
- menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu));
- item = gtk_separator_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
-// for ( i=1; i<p->ss->n_frame_classes; i++ )
-// {
-// char *name;
-// name = p->ss->frame_classes[i]->name;
-// item = gtk_menu_item_new_with_label(name);
-// gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
-// g_signal_connect(G_OBJECT(item), "activate",
-// G_CALLBACK(add_furniture), p);
-//
-// }
- update_toolbar(p);
-}
-
-
-static gint close_sig(GtkWidget *window, struct presentation *p)
-{
- free_presentation(p);
- return 0;
-}
-
-
-static void redraw_frame(struct frame *o)
-{
- if ( o == NULL ) return;
-// gdk_window_invalidate_rect(o->parent->parent->drawingarea->window,
-// NULL, FALSE);
-}
-
-
-void redraw_overlay(struct presentation *p)
-{
- gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE);
-}
-
-
-static gboolean im_commit_sig(GtkIMContext *im, gchar *str,
- struct presentation *p)
-{
- if ( p->cur_frame == NULL ) {
- if ( str[0] == 'b' ) {
- check_toggle_blank(p);
- } else {
- printf("IM keypress: %s\n", str);
- }
- return FALSE;
- }
-
- return FALSE;
-}
-
-
-static gboolean key_press_sig(GtkWidget *da, GdkEventKey *event,
- struct presentation *p)
-{
- gboolean r;
-
- /* Throw the event to the IM context and let it sort things out */
- r = gtk_im_context_filter_keypress(GTK_IM_CONTEXT(p->im_context),
- event);
- if ( r ) return FALSE; /* IM ate it */
-
-// p->cur_tool->key_pressed(p->editing_object, event->keyval, p->cur_tool);
-
- switch ( event->keyval ) {
-
- case GDK_KEY_Page_Up :
- prev_slide_sig(NULL, p);
- break;
-
- case GDK_KEY_Page_Down :
- next_slide_sig(NULL, p);
- break;
-
- case GDK_KEY_Escape :
- if ( p->slideshow != NULL ) end_slideshow(p);
- redraw_frame(p->cur_frame);
- p->cur_frame = NULL;
- break;
-
- case GDK_KEY_Return :
- //p->cur_tool->im_commit(p->cur_frame, "\n", p->cur_tool);
- break;
-
- case GDK_KEY_B :
- case GDK_KEY_b :
- if ( p->slideshow != NULL ) {
- if ( p->prefs->b_splits ) {
- toggle_slideshow_link(p);
- } else {
- p->ss_blank = 1-p->ss_blank;
- gdk_window_invalidate_rect(
- p->ss_drawingarea->window,
- NULL, FALSE);
- }
- }
- break;
-
- }
-
- return FALSE;
-}
-
-
-static void draw_overlay(cairo_t *cr, struct presentation *p)
-{
- struct frame *fr = p->cur_frame;
-
- if ( fr != NULL ) {
- /* Draw margins */
- cairo_move_to(cr, fr->cl->margin_left, -p->border_offs_y);
- cairo_line_to(cr, fr->cl->margin_left,
- p->slide_height+p->border_offs_y);
-
- cairo_move_to(cr, p->slide_width-fr->cl->margin_right,
- -p->border_offs_y);
- cairo_line_to(cr, p->slide_width-fr->cl->margin_right,
- p->slide_height+p->border_offs_y);
-
- cairo_move_to(cr, -p->border_offs_x, fr->cl->margin_top);
- cairo_line_to(cr, p->slide_width+p->border_offs_x,
- fr->cl->margin_top);
-
- cairo_move_to(cr, -p->border_offs_x,
- p->slide_height-fr->cl->margin_bottom);
- cairo_line_to(cr, p->slide_width+p->border_offs_x,
- p->slide_height-fr->cl->margin_bottom);
-
- cairo_set_source_rgb(cr, 0.2, 0.2, 0.2);
- cairo_set_line_width(cr, 1.0);
- cairo_stroke(cr);
- }
-}
-
-
-static gboolean expose_sig(GtkWidget *da, GdkEventExpose *event,
- struct presentation *p)
-{
- cairo_t *cr;
- GtkAllocation allocation;
- double xoff, yoff;
-
- cr = gdk_cairo_create(da->window);
-
- /* Overall background */
- cairo_rectangle(cr, event->area.x, event->area.y,
- event->area.width, event->area.height);
- if ( (p->slideshow != NULL) && !p->slideshow_linked ) {
- cairo_set_source_rgb(cr, 1.0, 0.3, 0.2);
- } else {
- cairo_set_source_rgb(cr, 0.9, 0.9, 0.9);
- }
- cairo_fill(cr);
-
- /* Get the overall size */
- gtk_widget_get_allocation(da, &allocation);
- xoff = (allocation.width - p->slide_width)/2.0;
- yoff = (allocation.height - p->slide_height)/2.0;
- p->border_offs_x = xoff; p->border_offs_y = yoff;
-
- /* Draw the slide from the cache */
- cairo_rectangle(cr, event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_set_source_surface(cr, p->cur_edit_slide->rendered_edit,
- xoff, yoff);
- cairo_fill(cr);
-
- cairo_translate(cr, xoff, yoff);
-
- draw_overlay(cr, p);
-
- cairo_destroy(cr);
-
- return FALSE;
-}
-
-
-void update_titlebar(struct presentation *p)
-{
- get_titlebar_string(p);
-
- if ( p->window != NULL ) {
-
- char *title;
-
- title = malloc(strlen(p->titlebar)+14);
- sprintf(title, "%s - Colloquium", p->titlebar);
- gtk_window_set_title(GTK_WINDOW(p->window), title);
- free(title);
-
- }
-}
-
-
-int open_mainwindow(struct presentation *p)
-{
- GtkWidget *window;
- GtkWidget *vbox;
- GtkWidget *sw;
-// GtkTargetEntry targets[1];
-
- if ( p->window != NULL ) {
- fprintf(stderr, "Presentation window is already open!\n");
- return 1;
- }
-
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- p->window = window;
-
- update_titlebar(p);
-
- g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(close_sig), p);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(window), vbox);
-
- p->drawingarea = gtk_drawing_area_new();
- sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw),
- p->drawingarea);
- gtk_widget_set_size_request(GTK_WIDGET(p->drawingarea),
- p->slide_width + 20,
- p->slide_height + 20);
-
- realise_everything(p);
- add_menu_bar(p, vbox);
- gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
-
- gtk_widget_set_can_focus(GTK_WIDGET(p->drawingarea), TRUE);
- gtk_widget_add_events(GTK_WIDGET(p->drawingarea),
- GDK_POINTER_MOTION_HINT_MASK
- | GDK_BUTTON1_MOTION_MASK
- | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
- | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
-
-// g_signal_connect(G_OBJECT(p->drawingarea), "button-press-event",
-// G_CALLBACK(button_press_sig), p);
-// g_signal_connect(G_OBJECT(p->drawingarea), "button-release-event",
-// G_CALLBACK(button_release_sig), p);
- g_signal_connect(G_OBJECT(p->drawingarea), "key-press-event",
- G_CALLBACK(key_press_sig), p);
- g_signal_connect(G_OBJECT(p->drawingarea), "expose-event",
- G_CALLBACK(expose_sig), p);
-// g_signal_connect(G_OBJECT(p->drawingarea), "motion-notify-event",
-// G_CALLBACK(motion_sig), p);
-
- /* Input method */
- p->im_context = gtk_im_multicontext_new();
- gtk_im_context_set_client_window(GTK_IM_CONTEXT(p->im_context),
- p->drawingarea->window);
- g_signal_connect(G_OBJECT(p->im_context), "commit",
- G_CALLBACK(im_commit_sig), p);
-
- /* Default size */
- gtk_window_set_default_size(GTK_WINDOW(p->window), 1024+100, 768+100);
- gtk_window_set_resizable(GTK_WINDOW(p->window), TRUE);
-
- assert(p->num_slides > 0);
-
- gtk_widget_grab_focus(GTK_WIDGET(p->drawingarea));
-
- gtk_widget_show_all(window);
-
- p->edit_slide_width = 1024;
- p->proj_slide_width = 2048;
- p->thumb_slide_width = 320; /* FIXME: Completely made up */
- redraw_slide(p->cur_edit_slide);
-
- return 0;
-}
diff --git a/src/mainwindow.h b/src/mainwindow.h
deleted file mode 100644
index 3bfff44..0000000
--- a/src/mainwindow.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * presentation.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef MAINWINDOW_H
-#define MAINWINDOW_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-extern int open_mainwindow(struct presentation *p);
-extern void notify_slide_changed(struct presentation *p, struct slide *np);
-extern void update_titlebar(struct presentation *p);
-
-extern void redraw_overlay(struct presentation *p);
-
-
-#endif /* MAINWINDOW_H */
diff --git a/src/notes.c b/src/notes.c
deleted file mode 100644
index 270f753..0000000
--- a/src/notes.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * notes.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <gtk/gtk.h>
-
-#include "presentation.h"
-
-
-struct notes
-{
- GtkWidget *window;
- GtkWidget *v;
-};
-
-
-static void set_notes_title(struct presentation *p)
-{
- gtk_window_set_title(GTK_WINDOW(p->notes->window), "Colloquium notes");
-}
-
-
-static void update_notes(struct presentation *p)
-{
- GtkTextBuffer *tb;
-
- if ( p->notes == NULL ) return;
-
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(p->notes->v));
- gtk_text_buffer_set_text(tb, p->cur_edit_slide->notes, -1);
-}
-
-
-static void grab_notes(struct notes *n, struct slide *s)
-{
- gchar *text;
- GtkTextBuffer *tb;
- GtkTextIter i1, i2;
-
- if ( n == NULL ) return;
-
- tb = gtk_text_view_get_buffer(GTK_TEXT_VIEW(n->v));
- gtk_text_buffer_get_start_iter(tb, &i1);
- gtk_text_buffer_get_end_iter(tb, &i2);
- text = gtk_text_buffer_get_text(tb, &i1, &i2, TRUE);
-
- free(s->notes);
- s->notes = text;
-}
-
-
-void grab_current_notes(struct presentation *p)
-{
- grab_notes(p->notes, p->cur_notes_slide);
-}
-
-
-void notify_notes_slide_changed(struct presentation *p, struct slide *np)
-{
- grab_notes(p->notes, p->cur_notes_slide);
- p->cur_notes_slide = np;
- update_notes(p);
-}
-
-
-static gint close_notes_sig(GtkWidget *w, struct presentation *p)
-{
- grab_notes(p->notes, p->cur_notes_slide);
- p->notes = NULL;
- return FALSE;
-}
-
-
-void write_notes(struct slide *s, struct serializer *ser)
-{
- serialize_s(ser, "notes", s->notes);
-}
-
-
-void load_notes(struct ds_node *node, struct slide *s)
-{
- char *v;
-
- if ( get_field_s(node, "notes", &v) ) return;
-
- s->notes = v;
-}
-
-
-void open_notes(struct presentation *p)
-{
- 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->cur_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);
- sc = gtk_scrolled_window_new(NULL, NULL);
- gtk_container_add(GTK_CONTAINER(n->window), sc);
-
- n->v = gtk_text_view_new();
- desc = pango_font_description_from_string("Sans 24");
- gtk_widget_modify_font(n->v, desc);
- pango_font_description_free(desc);
- gtk_text_view_set_left_margin(GTK_TEXT_VIEW(n->v), 30);
- gtk_text_view_set_right_margin(GTK_TEXT_VIEW(n->v), 30);
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(n->v), GTK_WRAP_WORD_CHAR);
- gtk_container_add(GTK_CONTAINER(sc), n->v);
-
- g_signal_connect(G_OBJECT(n->v), "destroy",
- G_CALLBACK(close_notes_sig), p);
-
- set_notes_title(p);
- gtk_widget_show_all(n->window);
-
- update_notes(p);
-}
diff --git a/src/notes.h b/src/notes.h
deleted file mode 100644
index 82d1355..0000000
--- a/src/notes.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * notes.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef NOTES_H
-#define NOTES_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-struct notes;
-
-extern void open_notes(struct presentation *p);
-
-extern void notify_notes_slide_changed(struct presentation *p,
- struct slide *np);
-
-extern void write_notes(struct slide *s, struct serializer *ser);
-extern void load_notes(struct ds_node *node, struct slide *s);
-
-extern void grab_current_notes(struct presentation *p);
-#endif /* NOTES_H */
diff --git a/src/objects.c b/src/objects.c
deleted file mode 100644
index d2383c3..0000000
--- a/src/objects.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * objects.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
-
-#include "presentation.h"
-#include "objects.h"
-#include "mainwindow.h"
-
-
-struct image_store
-{
- int n_images;
- struct image **images;
-};
-
-
-static struct image *add_image_to_store(struct image_store *is, char *filename)
-{
- struct image **images_new;
- struct image *i_new;
- int idx;
- GError *error = NULL;
- int w, h;
-
- i_new = calloc(1, sizeof(struct image));
- if ( i_new == NULL ) return NULL;
-
- images_new = realloc(is->images,
- (is->n_images+1)*sizeof(struct image *));
- if ( images_new == NULL ) {
- fprintf(stderr, "Couldn't allocate memory for image.\n");
- return NULL;
- }
- is->images = images_new;
- idx = is->n_images++;
-
- gdk_pixbuf_get_file_info(filename, &w, &h);
-
- /* FIXME: If image is huge, load a smaller version */
- i_new->pb = gdk_pixbuf_new_from_file(filename, &error);
- if ( i_new->pb == NULL ) {
- fprintf(stderr, "Failed to load image '%s'\n", filename);
- is->n_images--;
- return NULL;
- }
- i_new->filename = strdup(filename);
- i_new->refcount = 1;
- i_new->width = w;
- i_new->height = h;
- i_new->parent = is;
-
- is->images[idx] = i_new;
-
- return i_new;
-}
-
-
-static struct image *find_filename(struct image_store *is, const char *filename)
-{
- int i;
-
- for ( i=0; i<is->n_images; i++ ) {
- if ( strcmp(is->images[i]->filename, filename) == 0 ) {
- return is->images[i];
- }
- }
-
- return NULL;
-}
-
-
-struct image *get_image(struct image_store *is, char *filename)
-{
- struct image *image;
-
- image = find_filename(is, filename);
- if ( image == NULL ) {
- image = add_image_to_store(is, filename);
- } else {
- image->refcount++;
- }
-
- return image;
-}
-
-
-void unref_image(struct image *i)
-{
- i->refcount--;
-
- if ( i->refcount == 0 ) {
-
- struct image_store *is;
- int j;
-
- g_object_unref(G_OBJECT(i->pb));
- free(i->filename);
- is = i->parent;
- free(i);
-
- for ( j=0; j<is->n_images; j++ ) {
- if ( is->images[j] == i ) {
- int k;
- for ( k=j+1; k<is->n_images; k++ ) {
- is->images[k-1] = is->images[k];
- }
- break;
- }
- }
- is->n_images--;
-
- }
-}
-
-
-struct image_store *image_store_new()
-{
- struct image_store *is;
-
- is = calloc(1, sizeof(*is));
- if ( is == NULL ) return NULL;
-
- is->images = NULL;
- is->n_images = 0;
-
- return is;
-}
-
-
-void notify_style_update(struct presentation *p, struct style *sty)
-{
- int i;
- int changed = 0;
-
- for ( i=0; i<p->num_slides; i++ ) {
-
- int j;
- struct slide *s;
-
- s = p->slides[i];
-
- for ( j=0; j<p->slides[i]->num_objects; j++ ) {
-
- if ( s->objects[j]->style != sty ) continue;
-
- s->objects[j]->update_object(s->objects[j]);
- if ( p->cur_edit_slide == s ) changed = 1;
-
- }
-
- }
-
- /* Trigger redraw etc */
- p->completely_empty = 0;
- if ( changed ) notify_slide_changed(p, p->cur_edit_slide);
-}
-
-
-static void check_references(struct slide *s, struct object *om)
-{
- /* FIXME: Should replace with previous useful one, not NULL */
- if ( s->roles[S_ROLE_PDATE_REF] == om ) {
- struct object *o;
- s->roles[S_ROLE_PDATE_REF] = NULL;
- o = s->roles[S_ROLE_PDATE];
- if ( o != NULL ) o->update_object(o);
- }
-
- if ( s->roles[S_ROLE_PAUTHOR_REF] == om ) {
- struct object *o;
- s->roles[S_ROLE_PAUTHOR_REF] = NULL;
- o = s->roles[S_ROLE_PAUTHOR];
- if ( o != NULL ) o->update_object(o);
- }
-
- if ( s->roles[S_ROLE_PTITLE_REF] == om ) {
- struct object *o;
- s->roles[S_ROLE_PTITLE_REF] = NULL;
- o = s->roles[S_ROLE_PTITLE];
- if ( o != NULL ) o->update_object(o);
- }
-
-}
-
-
-void delete_object(struct object *o)
-{
- int i;
-
- if ( o->parent != NULL ) remove_object_from_slide(o->parent, o);
- o->delete_object(o);
-
- /* If this object was any kind of special (for this slide),
- * check all the other slides for references */
- if ( (o->parent->roles[S_ROLE_PTITLE_REF] == o)
- || (o->parent->roles[S_ROLE_PAUTHOR_REF] == o)
- || (o->parent->roles[S_ROLE_PDATE_REF] == o) )
- {
- for ( i=0; i<o->parent->parent->num_slides; i++ ) {
- check_references(o->parent->parent->slides[i], o);
- }
- }
-
- for ( i=0; i<NUM_S_ROLES; i++ ) {
- if ( o->parent->roles[i] == o ) {
- o->parent->roles[i] = NULL;
- }
- }
-
- free(o);
-}
-
-
-void realise_everything(struct presentation *p)
-{
- int i;
-
- /* Realise all the tools */
- p->select_tool->realise(p->select_tool, p->drawingarea, p);
- p->text_tool->realise(p->text_tool, p->drawingarea, p);
- p->image_tool->realise(p->image_tool, p->drawingarea, p);
-
- for ( i=0; i<p->num_slides; i++ ) {
-
- int j;
- struct slide *s;
-
- s = p->slides[i];
-
- for ( j=0; j<p->slides[i]->num_objects; j++ ) {
- s->objects[j]->update_object(s->objects[j]);
- }
-
- }
-}
-
-
-enum corner which_corner(double xp, double yp, struct object *o)
-{
- double x, y; /* Relative to object position */
-
- x = xp - o->x;
- y = yp - o->y;
-
- if ( x < 0.0 ) return CORNER_NONE;
- if ( y < 0.0 ) return CORNER_NONE;
- if ( x > o->bb_width ) return CORNER_NONE;
- if ( y > o->bb_height ) return CORNER_NONE;
-
- /* Top left? */
- if ( (x<20.0) && (y<20.0) ) return CORNER_TL;
- if ( (x>o->bb_width-20.0) && (y<20.0) ) return CORNER_TR;
- if ( (x<20.0) && (y>o->bb_height-20.0) ) {
- return CORNER_BL;
- }
- if ( (x>o->bb_width-20.0) && (y>o->bb_height-20.0) ) {
- return CORNER_BR;
- }
-
- return CORNER_NONE;
-}
diff --git a/src/objects.h b/src/objects.h
deleted file mode 100644
index dba19da..0000000
--- a/src/objects.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * objects.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef OBJECTS_H
-#define OBJECTS_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-#include "loadsave.h"
-
-
-enum objtype
-{
- OBJ_UNKNOWN,
- OBJ_TEXT,
- OBJ_IMAGE,
-};
-
-
-struct object
-{
- enum objtype type;
- struct slide *parent;
- struct style *style;
-
- /* Position of corner of object */
- double x;
- double y;
-
- /* Side of rectangular bounding box of object */
- double bb_width;
- double bb_height;
-
- int empty;
-
- void (*render_object)(cairo_t *cr, struct object *o);
- void (*update_object)(struct object *o);
- void (*delete_object)(struct object *o);
- void (*serialize)(struct object *o, struct serializer *ser);
-};
-
-
-struct image_store;
-
-struct image
-{
- char *filename;
- GdkPixbuf *pb;
- int width;
- int height;
-
- int refcount;
-
- struct image_store *parent;
-};
-
-
-enum corner
-{
- CORNER_NONE,
- CORNER_TL,
- CORNER_TR,
- CORNER_BL,
- CORNER_BR
-};
-
-
-extern struct image *get_image(struct image_store *is, char *filename);
-extern struct image_store *image_store_new(void);
-extern void unref_image(struct image *i);
-
-extern void notify_style_update(struct presentation *p,
- struct style *sty);
-
-extern void delete_object(struct object *o);
-
-extern void realise_everything(struct presentation *p);
-
-extern enum corner which_corner(double xp, double yp, struct object *o);
-
-#endif /* OBJECTS_H */
diff --git a/src/presentation.c b/src/presentation.c
deleted file mode 100644
index 36e2abe..0000000
--- a/src/presentation.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * presentation.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <gtk/gtk.h>
-
-#include "presentation.h"
-#include "objects.h"
-#include "stylesheet.h"
-#include "tool_select.h"
-#include "tool_text.h"
-#include "tool_image.h"
-
-
-static int num_presentations = 0;
-
-
-void free_presentation(struct presentation *p)
-{
- int i;
- int final = 0;
-
- for ( i=0; i<p->num_slides; i++ ) {
- free_slide(p->slides[i]);
- }
-
- (*p->num_presentations)--;
- if ( *p->num_presentations == 0 ) final = 1;
-
- /* FIXME: Loads of stuff leaks here */
- free(p->filename);
- free(p);
-
- if ( final ) {
- gtk_main_quit();
- }
-}
-
-
-int insert_slide(struct presentation *p, struct slide *new, int pos)
-{
- struct slide **try;
-// int i;
-
- try = realloc(p->slides, (1+p->num_slides)*sizeof(struct slide *));
- if ( try == NULL ) {
- free(new);
- return 1;
- }
- p->slides = try;
- p->completely_empty = 0;
-
- /* Insert into list. Yuk yuk yuk etc. */
- if ( (p->num_slides>1) && (pos<p->num_slides-1) ) {
-
- int i;
-
- for ( i=p->num_slides; i>pos+1; i-- ) {
- p->slides[i] = p->slides[i-1];
- }
- p->slides[pos+1] = new;
-
- } else if ( pos == p->num_slides-1 ) {
-
- p->slides[pos+1] = new;
-
- } else {
- assert(pos == 0);
- p->slides[pos] = new;
- }
-
- new->parent = p;
- p->num_slides++;
-
- /* Update slide numbers for all subsequent slides */
-// for ( i=pos+1; i<p->num_slides; i++ ) {
-// struct object *o = p->slides[i]->roles[S_ROLE_SLIDENUMBER];
-// if ( o != NULL ) {
-// o->update_object(o);
-// }
-// }
-
- return 0;
-}
-
-
-struct slide *new_slide()
-{
- struct slide *new;
-
- new = calloc(1, sizeof(struct slide));
- if ( new == NULL ) return NULL;
-
- /* No frames to start with */
- new->num_frames = 0;
- new->frames = NULL;
-
- new->rendered_edit = NULL;
- new->rendered_proj = NULL;
- new->rendered_thumb = NULL;
-
- new->notes = strdup("");
-
- return new;
-}
-
-
-static void free_frame(struct frame *fr)
-{
- int i;
-
- for ( i=0; i<fr->num_children; i++ ) {
- free_frame(fr->children[i]);
- }
-
- free(fr->sc);
-
- free(fr);
-}
-
-
-void free_slide(struct slide *s)
-{
- int i;
-
- for ( i=0; i<s->num_frames; i++ ) {
- free_frame(s->frames[i]);
- }
-
- free(s);
-}
-
-
-struct slide *add_slide(struct presentation *p, int pos)
-{
- struct slide *s = new_slide();
- if ( insert_slide(p, s, pos) ) {
- free_slide(s);
- return NULL;
- }
-
-#if 0
- /* Copy roles and references to this slide as applicable */
- if ( pos >= 0 ) {
-
- struct slide *ex = p->slides[pos];
-
- s->roles[S_ROLE_PTITLE_REF] = ex->roles[S_ROLE_PTITLE_REF];
- s->roles[S_ROLE_PAUTHOR_REF] = ex->roles[S_ROLE_PAUTHOR_REF];
- s->roles[S_ROLE_PDATE_REF] = ex->roles[S_ROLE_PDATE_REF];
-
- if ( ex->roles[S_ROLE_PTITLE] != NULL ) {
- p->text_tool->create_default(p,
- ex->roles[S_ROLE_PTITLE]->style, s,
- p->text_tool);
- }
-
- if ( ex->roles[S_ROLE_SLIDENUMBER] != NULL ) {
- p->text_tool->create_default(p,
- ex->roles[S_ROLE_SLIDENUMBER]->style, s,
- p->text_tool);
- }
-
- if ( ex->roles[S_ROLE_PAUTHOR] != NULL ) {
- p->text_tool->create_default(p,
- ex->roles[S_ROLE_PAUTHOR]->style, s,
- p->text_tool);
- }
-
- if ( ex->roles[S_ROLE_PDATE] != NULL ) {
- p->text_tool->create_default(p,
- ex->roles[S_ROLE_PDATE]->style, s,
- p->text_tool);
- }
-
- }
-#endif
-
- return s;
-}
-
-
-int add_frame_to_slide(struct slide *s, struct frame *fr)
-{
- struct frame **try;
-
- try = realloc(s->frames, (1+s->num_frames)*sizeof(struct frame *));
- if ( try == NULL ) return 1;
- s->frames = try;
-
- s->frames[s->num_frames++] = fr;
-
- s->parent->completely_empty = 0;
-
- return 0;
-}
-
-
-void remove_frame_from_slide(struct slide *s, struct frame *fr)
-{
- int i;
- int found = 0;
-
- for ( i=0; i<s->num_frames; i++ ) {
-
- if ( s->frames[i] == fr ) {
- assert(!found);
- found = 1;
- }
-
- if ( found ) {
- if ( i == s->num_frames-1 ) {
- s->frames[i] = NULL;
- } else {
- s->frames[i] = s->frames[i+1];
- }
- }
-
- }
-
- s->num_frames--;
-}
-
-
-struct frame *find_frame_at_position(struct slide *s, double x, double y)
-{
- int i;
- struct frame *fr = NULL;
-
- for ( i=0; i<s->num_frames; i++ ) {
-
- if ( /* FIXME: implement */ 1 )
- {
- fr = s->frames[i];
- }
-
- }
-
- /* FIXME: Recurse */
-
- return fr;
-}
-
-
-static char *safe_basename(const char *in)
-{
- int i;
- char *cpy;
- char *res;
-
- cpy = strdup(in);
-
- /* Get rid of any trailing slashes */
- for ( i=strlen(cpy)-1; i>0; i-- ) {
- if ( cpy[i] == '/' ) {
- cpy[i] = '\0';
- } else {
- break;
- }
- }
-
- /* Find the base name */
- for ( i=strlen(cpy)-1; i>0; i-- ) {
- if ( cpy[i] == '/' ) {
- i++;
- break;
- }
- }
-
- res = strdup(cpy+i);
- /* If we didn't find a previous slash, i==0 so res==cpy */
-
- free(cpy);
-
- return res;
-}
-
-
-void get_titlebar_string(struct presentation *p)
-{
- free(p->titlebar);
-
- if ( p->filename == NULL ) {
- p->titlebar = strdup("(untitled)");
- } else {
- p->titlebar = safe_basename(p->filename);
- }
-}
-
-
-int slide_number(struct presentation *p, struct slide *s)
-{
- int i;
-
- for ( i=0; i<p->num_slides; i++ ) {
- if ( p->slides[i] == s ) return i;
- }
-
- return p->num_slides;
-}
-
-
-struct presentation *new_presentation()
-{
- struct presentation *new;
-
- new = calloc(1, sizeof(struct presentation));
-
- num_presentations++;
- new->num_presentations = &num_presentations;
-
- new->filename = NULL;
- new->titlebar = NULL;
- get_titlebar_string(new);
-
- /* FIXME: Should be just one of these */
- new->prefs = calloc(1, sizeof(struct prefs));
- new->prefs->b_splits = 1;
- new->prefs->open_notes = 0;
-
- new->window = NULL;
- new->ui = NULL;
- new->action_group = NULL;
- new->slideshow = NULL;
- new->notes = NULL;
-
- new->slide_width = 1024.0;
- new->slide_height = 768.0;
-
- /* Add one blank slide and view it */
- new->num_slides = 0;
- new->slides = NULL;
- new->cur_edit_slide = NULL;
- new->cur_proj_slide = NULL;
-
- new->cur_frame = NULL;
- new->completely_empty = 1;
- new->drag_status = DRAG_STATUS_NONE;
-
- new->ss = new_stylesheet();
- default_stylesheet(new->ss);
- new->image_store = image_store_new();
-
- return new;
-}
diff --git a/src/presentation.h b/src/presentation.h
index 1e0e787..423ea42 100644
--- a/src/presentation.h
+++ b/src/presentation.h
@@ -27,10 +27,7 @@
#include <config.h>
#endif
-#include <gtk/gtk.h>
-
-#include "stylesheet.h"
-#include "stylesheet-editor.h"
+#include <cairo.h>
struct slide
{
@@ -44,123 +41,18 @@ struct slide
/* This should always be present (and up to date). */
cairo_surface_t *rendered_thumb;
- int num_frames;
- struct frame **frames;
+ struct frame *top;
char *notes;
};
-enum drag_reason
-{
- DRAG_REASON_NONE,
- DRAG_REASON_CREATE,
- DRAG_REASON_IMPORT,
- DRAG_REASON_TOOL,
-};
-
-
-enum drag_status
-{
- DRAG_STATUS_NONE,
- DRAG_STATUS_COULD_DRAG,
- DRAG_STATUS_DRAGGING,
-};
-
-
-struct prefs
-{
- int b_splits;
- int open_notes;
-};
-
-
-struct presentation
-{
- char *titlebar;
- char *filename;
- int completely_empty;
- int *num_presentations;
-
- struct prefs *prefs;
-
- GtkWidget *window;
- GtkWidget *drawingarea;
- GtkUIManager *ui;
- GtkActionGroup *action_group;
- GtkIMContext *im_context;
- struct notes *notes;
-
- /* Pointers to the current "editing" and "projection" slides */
- struct slide *cur_edit_slide;
- struct slide *cur_proj_slide;
- struct slide *cur_notes_slide;
- int slideshow_linked;
-
- /* 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;
- double slide_height;
-
- /* Width of a slide in the editor, projector or thumbnail (pixels) */
- int edit_slide_width;
- int proj_slide_width;
- int thumb_slide_width;
-
- /* This is just to help with rendering the slides within the
- * editing window. */
- double border_offs_x;
- double border_offs_y;
-
- struct frame *cur_frame;
-
- /* Stylesheet */
- StyleSheet *ss;
-
- /* Dialogue boxes */
- StylesheetWindow *stylesheetwindow;
-
- /* Slideshow stuff */
- GtkWidget *slideshow;
- GtkWidget *ss_drawingarea;
- GdkCursor *blank_cursor;
- int ss_blank;
- char ss_geom[256];
-
- /* Rubber band boxes and related stuff */
- double start_corner_x;
- double start_corner_y;
- double drag_corner_x;
- double drag_corner_y;
- enum drag_reason drag_reason;
- enum drag_status drag_status;
-
- /* Stuff to do with drag and drop import of "content" */
- int drag_preview_pending;
- int have_drag_data;
- int drag_highlight;
- double import_width;
- double import_height;
- int import_acceptable;
-
- /* All the images used in the presentation */
- struct image_store *image_store;
-
- unsigned int num_slides;
- struct slide **slides;
-};
-
-
struct frame
{
struct frame_class *cl;
- struct frame **children;
- int num_children;
-
- int (*render_frame)(struct frame *this, cairo_t *cr);
- int (*serialize)(struct frame *this,
- struct serializer *ser);
+ struct frame **rendering_order;
+ int num_ro;
char *sc; /* Storycode */
@@ -168,23 +60,4 @@ struct frame
};
-extern struct presentation *new_presentation(void);
-extern void free_presentation(struct presentation *p);
-
-extern struct slide *new_slide(void);
-extern struct slide *add_slide(struct presentation *p, int pos);
-extern int insert_slide(struct presentation *p, struct slide *s, int pos);
-extern void free_slide(struct slide *s);
-
-extern int add_frame_to_slide(struct slide *s, struct frame *fr);
-
-extern void get_titlebar_string(struct presentation *p);
-
-extern struct frame *find_frame_at_position(struct slide *s,
- double x, double y);
-
-extern int slide_number(struct presentation *p, struct slide *s);
-
-#define UNUSED __attribute__((unused))
-
#endif /* PRESENTATION_H */
diff --git a/src/slideshow.c b/src/slideshow.c
deleted file mode 100644
index bcbf528..0000000
--- a/src/slideshow.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * slideshow.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "presentation.h"
-#include "storycode.h"
-#include "mainwindow.h"
-#include "notes.h"
-
-
-static gint ss_destroy_sig(GtkWidget *widget, struct presentation *p)
-{
- p->slideshow = NULL;
- gdk_cursor_unref(p->blank_cursor);
- return FALSE;
-}
-
-
-static gboolean ss_expose_sig(GtkWidget *da, GdkEventExpose *event,
- struct presentation *p)
-{
- cairo_t *cr;
- GtkAllocation allocation;
- double xoff, yoff;
-
- cr = gdk_cairo_create(da->window);
-
- /* Overall background */
- cairo_rectangle(cr, event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
- cairo_fill(cr);
-
- if ( !p->ss_blank ) {
-
- int h;
-
- h = p->proj_slide_width * p->slide_height / p->slide_width;
-
- /* Get the overall size */
- gtk_widget_get_allocation(da, &allocation);
- xoff = (allocation.width - p->proj_slide_width)/2.0;
- yoff = (allocation.height - h)/2.0;
-
- /* Draw the slide from the cache */
- cairo_rectangle(cr, event->area.x, event->area.y,
- event->area.width, event->area.height);
- cairo_set_source_surface(cr, p->cur_proj_slide->rendered_proj,
- xoff, yoff);
- cairo_fill(cr);
-
- }
-
- cairo_destroy(cr);
-
- return FALSE;
-}
-
-
-void notify_slideshow_slide_changed(struct presentation *p, struct slide *np)
-{
- if ( (p->cur_proj_slide != NULL)
- && (p->cur_proj_slide->rendered_edit != NULL) )
- {
- cairo_surface_destroy(p->cur_proj_slide->rendered_proj);
- p->cur_proj_slide->rendered_proj = NULL;
- }
- p->cur_proj_slide = np;
- redraw_slide(p->cur_proj_slide);
-}
-
-
-static void change_slide(struct presentation *p, signed int n)
-{
-
- int cur_slide_number;
-
- /* If linked, it doesn't matter whether we work from the editor or
- * slideshow position because they're showing the same thing. If not,
- * then we must use the editor's slide. */
- cur_slide_number = slide_number(p, p->cur_edit_slide);
-
- if ( cur_slide_number+n < 0 ) return;
- if ( cur_slide_number+n >= p->num_slides ) return;
-
- p->ss_blank = 0;
-
- if ( p->slideshow_linked ) {
-
- /* If we are currently "linked", update both. */
- notify_slideshow_slide_changed(p, p->slides[cur_slide_number+n]);
- notify_slide_changed(p, p->slides[cur_slide_number+n]);
-
- } else {
-
- /* If we are not linked, a slide change on the "slideshow"
- * actually affects the editor. */
- notify_slide_changed(p, p->slides[cur_slide_number+n]);
- /* p->cur_proj_slide not changed */
-
- }
-}
-
-
-static gint prev_slide_sig(GtkWidget *widget, struct presentation *p)
-{
- change_slide(p, -1);
- return FALSE;
-}
-
-
-static gint next_slide_sig(GtkWidget *widget, struct presentation *p)
-{
- change_slide(p, +1);
- return FALSE;
-}
-
-
-void end_slideshow(struct presentation *p)
-{
- gtk_widget_destroy(p->ss_drawingarea);
- gtk_widget_destroy(p->slideshow);
- p->slideshow = NULL;
-
- if ( (p->cur_proj_slide != NULL)
- && (p->cur_proj_slide->rendered_edit != NULL) )
- {
- cairo_surface_destroy(p->cur_proj_slide->rendered_proj);
- p->cur_proj_slide->rendered_proj = NULL;
- }
-
- p->cur_proj_slide = NULL;
- redraw_overlay(p);
-}
-
-
-void toggle_slideshow_link(struct presentation *p)
-{
- p->slideshow_linked = 1 - p->slideshow_linked;
- if ( p->slideshow_linked ) {
- p->cur_proj_slide = p->cur_edit_slide;
- notify_slideshow_slide_changed(p, p->cur_proj_slide);
- } else {
- redraw_overlay(p);
- }
-}
-
-
-void check_toggle_blank(struct presentation *p)
-{
- if ( p->slideshow != NULL ) {
- if ( p->prefs->b_splits ) {
- toggle_slideshow_link(p);
- } else {
- p->ss_blank = 1-p->ss_blank;
- gdk_window_invalidate_rect(p->ss_drawingarea->window,
- NULL, FALSE);
- }
- }
-}
-
-
-static gboolean ss_key_press_sig(GtkWidget *da, GdkEventKey *event,
- struct presentation *p)
-{
- switch ( event->keyval ) {
-
- case GDK_KEY_B :
- case GDK_KEY_b :
- check_toggle_blank(p);
- break;
-
- case GDK_KEY_Page_Up :
- case GDK_KEY_Up :
- prev_slide_sig(NULL, p);
- break;
-
- case GDK_KEY_Page_Down :
- case GDK_KEY_Down :
- next_slide_sig(NULL, p);
- break;
-
- case GDK_KEY_Escape :
- end_slideshow(p);
- break;
-
- }
-
- return FALSE;
-}
-
-
-static gboolean ss_realize_sig(GtkWidget *w, struct presentation *p)
-{
- p->blank_cursor = gdk_cursor_new(GDK_BLANK_CURSOR);
- gdk_window_set_cursor(GDK_WINDOW(p->slideshow->window),
- p->blank_cursor);
-
- gtk_window_parse_geometry(GTK_WINDOW(w), p->ss_geom);
-
- return FALSE;
-}
-
-
-void try_start_slideshow(struct presentation *p)
-{
- GtkWidget *n;
- GdkScreen *screen;
- int n_monitors;
- int i;
-
- /* Presentation already running? */
- if ( p->slideshow != NULL ) return;
-
- p->ss_blank = 0;
-
- n = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- p->ss_drawingarea = gtk_drawing_area_new();
- gtk_container_add(GTK_CONTAINER(n), p->ss_drawingarea);
-
- gtk_widget_set_can_focus(GTK_WIDGET(p->ss_drawingarea), TRUE);
- gtk_widget_add_events(GTK_WIDGET(p->ss_drawingarea),
- GDK_KEY_PRESS_MASK);
-
- g_signal_connect(G_OBJECT(p->ss_drawingarea), "key-press-event",
- G_CALLBACK(ss_key_press_sig), p);
- g_signal_connect(G_OBJECT(p->ss_drawingarea), "expose-event",
- G_CALLBACK(ss_expose_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), p);
-
- gtk_widget_grab_focus(GTK_WIDGET(p->ss_drawingarea));
-
- screen = gdk_screen_get_default();
- n_monitors = gdk_screen_get_n_monitors(screen);
- for ( i=0; i<n_monitors; i++ ) {
-
- GdkRectangle rect;
- int w;
-
- gdk_screen_get_monitor_geometry(screen, i, &rect);
- snprintf(p->ss_geom, 255, "%ix%i+%i+%i",
- rect.width, rect.height, rect.x, rect.y);
-
- w = rect.height * p->slide_width/p->slide_height;
- if ( w > rect.width ) w = rect.width;
- p->proj_slide_width = w;
-
- } /* FIXME: Sensible (configurable) choice of monitor */
-
- p->slideshow = n;
- p->slideshow_linked = 1;
- gtk_window_fullscreen(GTK_WINDOW(n));
- gtk_widget_show_all(GTK_WIDGET(n));
-
- if ( p->prefs->open_notes ) open_notes(p);
-
- p->cur_proj_slide = p->cur_edit_slide;
- redraw_slide(p->cur_proj_slide);
-}
diff --git a/src/slideshow.h b/src/slideshow.h
deleted file mode 100644
index fc0ab1b..0000000
--- a/src/slideshow.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * slideshow.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef SLIDESHOW_H
-#define SLIDESHOW_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-extern void try_start_slideshow(struct presentation *p);
-
-extern void notify_slideshow_slide_changed(struct presentation *p,
- struct slide *np);
-
-extern void toggle_slideshow_link(struct presentation *p);
-extern void check_toggle_blank(struct presentation *p);
-
-extern void end_slideshow(struct presentation *p);
-
-#endif /* SLIDESHOW_H */
diff --git a/src/storycode.c b/src/storycode.c
index d394f02..f3c2e27 100644
--- a/src/storycode.c
+++ b/src/storycode.c
@@ -25,247 +25,6 @@
#include <config.h>
#endif
-#include <cairo.h>
-#include <cairo-pdf.h>
-#include <pango/pangocairo.h>
#include <assert.h>
#include "storycode.h"
-#include "presentation.h"
-#include "objects.h"
-#include "stylesheet.h"
-
-
-static void render_bgblock(cairo_t *cr, struct bgblock *b)
-{
- GdkColor col1;
- GdkColor col2;
- cairo_pattern_t *patt = NULL;
- double cx, cy, r, r1, r2;
-
- cairo_rectangle(cr, b->min_x, b->min_y,
- b->max_x - b->min_x,
- b->max_y - b->min_y);
-
- switch ( b->type ) {
-
- case BGBLOCK_SOLID :
- gdk_color_parse(b->colour1, &col1);
- gdk_cairo_set_source_color(cr, &col1);
- /* FIXME: Honour alpha as well */
- cairo_fill(cr);
- break;
-
- case BGBLOCK_GRADIENT_CIRCULAR :
- cx = b->min_x + (b->max_x-b->min_x)/2.0;
- cy = b->min_y + (b->max_y-b->min_y)/2.0;
- r1 = (b->max_x-b->min_x)/2.0;
- r2 = (b->max_y-b->min_y)/2.0;
- r = r1 > r2 ? r1 : r2;
- patt = cairo_pattern_create_radial(cx, cy, r, cx, cy, 0.0);
- /* Fall-through */
-
- case BGBLOCK_GRADIENT_X :
- if ( patt == NULL ) {
- patt = cairo_pattern_create_linear(b->min_x, 0.0,
- b->max_y, 0.0);
- }
- /* Fall-through */
-
- case BGBLOCK_GRADIENT_Y :
- if ( patt == NULL ) {
- patt = cairo_pattern_create_linear(0.0, b->min_y,
- 0.0, b->max_y);
- }
-
- gdk_color_parse(b->colour1, &col1);
- gdk_color_parse(b->colour2, &col2);
- cairo_pattern_add_color_stop_rgba(patt, 0.0, col1.red/65535.0,
- col1.green/65535.0,
- col1.blue/65535.0,
- b->alpha1);
- cairo_pattern_add_color_stop_rgba(patt, 1.0, col2.red/65535.0,
- col2.green/65535.0,
- col2.blue/65535.0,
- b->alpha2);
- cairo_set_source(cr, patt);
- cairo_fill(cr);
- cairo_pattern_destroy(patt);
- break;
-
- case BGBLOCK_IMAGE :
- cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
- cairo_fill(cr);
-
- }
-}
-
-
-static void render_slide_bits(struct slide *s, cairo_t *cr)
-{
- int i;
- cairo_font_options_t *fopts;
-
- fopts = cairo_font_options_create();
- cairo_font_options_set_hint_style(fopts, CAIRO_HINT_STYLE_NONE);
- cairo_font_options_set_hint_metrics(fopts, CAIRO_HINT_METRICS_OFF);
- cairo_font_options_set_antialias(fopts, CAIRO_ANTIALIAS_SUBPIXEL);
- cairo_set_font_options(cr, fopts);
-
- for ( i=0; i<s->st->n_bgblocks; i++ ) {
- render_bgblock(cr, s->st->bgblocks[i]);
- }
-
- for ( i=0; i<s->num_frames; i++ ) {
-
- struct frame *fr = s->frames[i];
-
- fr->render_frame(fr, cr);
-
- }
-
- cairo_font_options_destroy(fopts);
-}
-
-
-static cairo_surface_t *render_slide(struct slide *s, int w, int h)
-{
- cairo_surface_t *surf;
- cairo_t *cr;
-
- surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);
-
- cr = cairo_create(surf);
- cairo_scale(cr, w/s->parent->slide_width, h/s->parent->slide_height);
-
- render_slide_bits(s, cr);
-
- cairo_destroy(cr);
-
- return surf;
-}
-
-
-void redraw_slide(struct slide *s)
-{
- int w, h;
-
- if ( s->rendered_thumb != NULL ) {
- cairo_surface_destroy(s->rendered_thumb);
- }
-
- w = s->parent->thumb_slide_width;
- h = (s->parent->slide_height/s->parent->slide_width) * w;
- s->rendered_thumb = render_slide(s, w, h);
- /* FIXME: Request redraw for slide sorter if open */
-
- /* Is this slide currently open in the editor? */
- if ( s == s->parent->cur_edit_slide ) {
-
- GtkWidget *da;
-
- if ( s->rendered_edit != NULL ) {
- cairo_surface_destroy(s->rendered_edit);
- }
-
- w = s->parent->edit_slide_width;
- h = (s->parent->slide_height/s->parent->slide_width) * w;
- s->rendered_edit = render_slide(s, w, h);
-
- da = s->parent->drawingarea;
- if ( da != NULL ) {
- gdk_window_invalidate_rect(da->window, NULL, FALSE);
- }
-
- }
-
- /* Is this slide currently being displayed on the projector? */
- if ( s == s->parent->cur_proj_slide ) {
-
- GtkWidget *da;
-
- if ( s->rendered_proj != NULL ) {
- cairo_surface_destroy(s->rendered_proj);
- }
-
- w = s->parent->proj_slide_width;
- h = (s->parent->slide_height/s->parent->slide_width) * w;
- s->rendered_proj = render_slide(s, w, h);
-
- da = s->parent->ss_drawingarea;
- if ( da != NULL ) {
- gdk_window_invalidate_rect(da->window, NULL, FALSE);
- }
-
- }
-}
-
-
-void draw_rubberband_box(cairo_t *cr, double x, double y,
- double width, double height)
-{
- cairo_new_path(cr);
- cairo_rectangle(cr, x, y, width, height);
- cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
- cairo_set_line_width(cr, 0.5);
- cairo_stroke(cr);
-}
-
-
-void draw_resize_handle(cairo_t *cr, double x, double y)
-{
- cairo_new_path(cr);
- cairo_rectangle(cr, x, y, 20.0, 20.0);
- cairo_set_source_rgba(cr, 0.9, 0.9, 0.9, 0.5);
- cairo_fill(cr);
-}
-
-
-void draw_editing_box(cairo_t *cr, double xmin, double ymin,
- double width, double height)
-{
- const double dash[] = {2.0, 2.0};
-
- cairo_new_path(cr);
- cairo_rectangle(cr, xmin-5.0, ymin-5.0, width+10.0, height+10.0);
- cairo_set_source_rgb(cr, 0.0, 0.69, 1.0);
- cairo_set_line_width(cr, 0.5);
- cairo_stroke(cr);
-
- cairo_new_path(cr);
- cairo_rectangle(cr, xmin, ymin, width, height);
- cairo_set_dash(cr, dash, 2, 0.0);
- cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
- cairo_set_line_width(cr, 0.1);
- cairo_stroke(cr);
-
- cairo_set_dash(cr, NULL, 0, 0.0);
-}
-
-
-int export_pdf(struct presentation *p, const char *filename)
-{
- int i;
- cairo_surface_t *surf;
- cairo_t *cr;
-
- surf = cairo_pdf_surface_create(filename, p->slide_width,
- p->slide_height);
-
- if ( cairo_surface_status(surf) != CAIRO_STATUS_SUCCESS ) {
- fprintf(stderr, "Couldn't create Cairo surface\n");
- return 1;
- }
-
- cr = cairo_create(surf);
-
- for ( i=0; i<p->num_slides; i++ ) {
- render_slide_bits(p->slides[i], cr);
- cairo_surface_show_page(surf);
- }
-
- cairo_surface_finish(surf);
- cairo_destroy(cr);
-
- return 0;
-}
diff --git a/src/storycode.h b/src/storycode.h
index bd33638..6e106e3 100644
--- a/src/storycode.h
+++ b/src/storycode.h
@@ -28,20 +28,6 @@
#endif
-#include "presentation.h"
-
-extern void redraw_slide(struct slide *s);
-
-extern void draw_rubberband_box(cairo_t *cr, double xmin, double ymin,
- double width, double height);
-
-extern void draw_resize_handle(cairo_t *cr, double x, double y);
-
-extern void draw_editing_box(cairo_t *cr, double xmin, double ymin,
- double width, double height);
-
-extern int export_pdf(struct presentation *p, const char *filename);
-
extern char *sc_get_final_font(const char *sc);
extern char *sc_get_final_text_colour(const char *sc);
diff --git a/src/stylesheet-editor.c b/src/stylesheet-editor.c
deleted file mode 100644
index c08271c..0000000
--- a/src/stylesheet-editor.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * stylesheet-editor.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-#include <assert.h>
-
-#include "presentation.h"
-#include "stylesheet.h"
-#include "objects.h"
-#include "loadsave.h"
-#include "storycode.h"
-
-
-struct _stylesheetwindow
-{
- struct presentation *p; /* Presentation to update when user alters
- * something in this window */
- GtkWidget *window;
- StyleSheet *ss; /* Style sheet this window corresponds to */
-
- GtkWidget *margin_left;
- GtkWidget *margin_right;
- GtkWidget *margin_top;
- GtkWidget *margin_bottom;
-
- GtkWidget *text_font;
- GtkWidget *text_colour;
-
- char *font;
- char *colour;
- double alpha;
-
- struct slide_template *cur_slide_template;
- struct frame_class *cur_frame_class;
-};
-
-
-static void text_font_set_sig(GtkFontButton *widget,
- struct _stylesheetwindow *s)
-{
- const gchar *font;
-
- font = gtk_font_button_get_font_name(widget);
- free(s->font);
- s->font = strdup(font);
-
-// notify_style_update(s->p, s->cur_frame_class);
-}
-
-
-static void text_colour_set_sig(GtkColorButton *widget,
- struct _stylesheetwindow *s)
-{
- GdkColor col;
- guint16 al;
-
- gtk_color_button_get_color(widget, &col);
- free(s->colour);
- s->colour = gdk_color_to_string(&col);
- al = gtk_color_button_get_alpha(widget);
- s->alpha = (double)al / 65535.0;
-
-// notify_style_update(s->p, s->cur_frame_class);
-}
-
-
-static void margin_left_changed_sig(GtkSpinButton *spin,
- struct _stylesheetwindow *s)
-{
- s->cur_frame_class->margin_left = gtk_spin_button_get_value(spin);
-// notify_style_update(s->p, s->cur_frame_class);
-}
-
-
-static void margin_right_changed_sig(GtkSpinButton *spin,
- struct _stylesheetwindow *s)
-{
- s->cur_frame_class->margin_right = gtk_spin_button_get_value(spin);
-// notify_style_update(s->p, s->cur_frame_class);
-}
-
-
-static void margin_top_changed_sig(GtkSpinButton *spin,
- struct _stylesheetwindow *s)
-{
- s->cur_frame_class->margin_top = gtk_spin_button_get_value(spin);
-// notify_style_update(s->p, s->cur_frame_class);
-}
-
-
-static void margin_bottom_changed_sig(GtkSpinButton *spin,
- struct _stylesheetwindow *s)
-{
- s->cur_frame_class->margin_bottom = gtk_spin_button_get_value(spin);
-// notify_style_update(s->p, s->cur_frame_class);
-}
-
-
-static void frame_class_changed_sig(GtkComboBox *combo,
- struct _stylesheetwindow *s)
-{
- int n;
- GdkColor col;
- char *font;
-
- n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
- s->cur_frame_class = s->cur_slide_template->frame_classes[n];
-
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_left),
- s->cur_frame_class->margin_left);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_right),
- s->cur_frame_class->margin_right);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_bottom),
- s->cur_frame_class->margin_bottom);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(s->margin_top),
- s->cur_frame_class->margin_top);
-
- font = sc_get_final_font(s->cur_frame_class->sc_prologue);
- gtk_font_button_set_font_name(GTK_FONT_BUTTON(s->text_font), font);
-
- s->colour = sc_get_final_text_colour(s->cur_frame_class->sc_prologue);
- gdk_color_parse(s->colour, &col);
- gtk_color_button_set_color(GTK_COLOR_BUTTON(s->text_colour), &col);
-}
-
-
-static void slide_template_changed_sig(GtkComboBox *combo,
- struct _stylesheetwindow *s)
-{
- for ( i=0; i<s->ss->n_styles; i++ ) {
- gtk_combo_box_append_text(GTK_COMBO_BOX(combo),
- s->ss->styles[i]->name);
- }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
-}
-
-
-static void do_layout(struct _stylesheetwindow *s, GtkWidget *b)
-{
- GtkWidget *table;
- GtkWidget *line;
- GtkWidget *label;
- GtkWidget *combo;
- GtkWidget *box;
- GtkWidget *vbox;
- int i;
-
- box = gtk_hbox_new(FALSE, 5);
- gtk_box_pack_start(GTK_BOX(b), box, FALSE, FALSE, 5);
- label = gtk_label_new("Top-level frame:");
- gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
- gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
- combo = gtk_combo_box_new_text();
- g_signal_connect(G_OBJECT(combo), "changed",
- G_CALLBACK(style_changed_sig), s);
- gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0);
-
- line = gtk_hseparator_new();
- gtk_box_pack_start(GTK_BOX(b), line, FALSE, FALSE, 5);
-
- box = gtk_hbox_new(TRUE, 30);
- gtk_box_pack_start(GTK_BOX(b), box, FALSE, FALSE, 5);
-
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(box), vbox, FALSE, FALSE, 0);
- label = gtk_label_new("Margins:");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
- table = gtk_table_new(3, 3, TRUE);
- gtk_table_set_row_spacings(GTK_TABLE(table), 5.0);
- gtk_table_set_col_spacings(GTK_TABLE(table), 5.0);
- gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
-
- /* Left */
- s->margin_left = gtk_spin_button_new_with_range(0.0, 1024.0, 1.0);
- gtk_table_attach_defaults(GTK_TABLE(table), s->margin_left,
- 0, 1, 1, 2);
- g_signal_connect(G_OBJECT(s->margin_left), "value-changed",
- G_CALLBACK(margin_left_changed_sig), s);
-
- /* Up */
- s->margin_top = gtk_spin_button_new_with_range(0.0, 1024.0, 1.0);
- gtk_table_attach_defaults(GTK_TABLE(table), s->margin_top,
- 1, 2, 0, 1);
- g_signal_connect(G_OBJECT(s->margin_top), "value-changed",
- G_CALLBACK(margin_top_changed_sig), s);
-
- /* Right */
- s->margin_right = gtk_spin_button_new_with_range(0.0, 1024.0, 1.0);
- gtk_table_attach_defaults(GTK_TABLE(table), s->margin_right,
- 2, 3, 1, 2);
- g_signal_connect(G_OBJECT(s->margin_right), "value-changed",
- G_CALLBACK(margin_right_changed_sig), s);
-
- /* Down */
- s->margin_bottom = gtk_spin_button_new_with_range(0.0, 1024.0, 1.0);
- gtk_table_attach_defaults(GTK_TABLE(table), s->margin_bottom,
- 1, 2, 2, 3);
- g_signal_connect(G_OBJECT(s->margin_bottom), "value-changed",
- G_CALLBACK(margin_bottom_changed_sig), s);
-
- /* Font/colour stuff */
- label = gtk_label_new("Font:");
- gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
- gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4);
- s->text_font = gtk_font_button_new_with_font("Sans 12");
- box = gtk_hbox_new(FALSE, 0);
- gtk_table_attach_defaults(GTK_TABLE(table), box, 1, 2, 3, 4);
- gtk_box_pack_start(GTK_BOX(box), s->text_font, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(s->text_font), "font-set",
- G_CALLBACK(text_font_set_sig), s);
-
- label = gtk_label_new("Colour:");
- gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
- gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 4, 5);
- s->text_colour = gtk_color_button_new();
- box = gtk_hbox_new(FALSE, 0);
- gtk_table_attach_defaults(GTK_TABLE(table), box, 1, 2, 4, 5);
- gtk_box_pack_start(GTK_BOX(box), s->text_colour, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(s->text_colour), "color-set",
- G_CALLBACK(text_colour_set_sig), s);
-
- /* Force first update */
- frame_class_changed_sig(GTK_COMBO_BOX(combo), s);
-}
-
-
-
-static gint destroy_stylesheet_sig(GtkWidget *w, struct _stylesheetwindow *s)
-{
- s->p->stylesheetwindow = NULL;
- free(s);
- return FALSE;
-}
-
-
-StylesheetWindow *open_stylesheet(struct presentation *p)
-{
- struct _stylesheetwindow *s;
- GtkWidget *nb;
- GtkWidget *text_box;
- GtkWidget *background_box;
- GtkWidget *box;
- GtkWidget *label;
- GtkWidget *combo;
-
- s = malloc(sizeof(*s));
- if ( s == NULL ) return NULL;
-
- s->p = p;
- s->ss = p->ss;
- s->cur_slide_template = NULL;
- s->cur_frame_class = NULL;
-
- s->window = gtk_dialog_new_with_buttons("Stylesheet",
- GTK_WINDOW(p->window), 0,
- GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_dialog_set_has_separator(GTK_DIALOG(s->window), TRUE);
-
- box = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(s->window)->vbox), box,
- TRUE, TRUE, 0);
-
- label = gtk_label_new("Slide template:");
- gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
- gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
- combo = gtk_combo_box_new_text();
-// for ( i=0; i<s->ss->n_styles; i++ ) {
-// gtk_combo_box_append_text(GTK_COMBO_BOX(combo),
-// s->ss->styles[i]->name);
-// }
- gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
-// g_signal_connect(G_OBJECT(combo), "changed",
-// G_CALLBACK(template_changed_sig), s);
- gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0);
-
- nb = gtk_notebook_new();
- gtk_notebook_set_tab_pos(GTK_NOTEBOOK(nb), GTK_POS_TOP);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(s->window)->vbox), nb,
- TRUE, TRUE, 0);
-
- text_box = gtk_vbox_new(FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(text_box), 12);
- gtk_notebook_append_page(GTK_NOTEBOOK(nb), text_box,
- gtk_label_new("Top Level Frames"));
- do_layout(s, text_box);
-
- background_box = gtk_vbox_new(FALSE, 0);
- gtk_container_set_border_width(GTK_CONTAINER(background_box), 12);
- gtk_notebook_append_page(GTK_NOTEBOOK(nb), background_box,
- gtk_label_new("Background"));
-
- g_signal_connect(G_OBJECT(s->window), "destroy",
- G_CALLBACK(destroy_stylesheet_sig), s);
- g_signal_connect(G_OBJECT(s->window), "response",
- G_CALLBACK(gtk_widget_destroy), NULL);
-
- gtk_widget_show_all(s->window);
-
- return s;
-}
diff --git a/src/stylesheet-editor.h b/src/stylesheet-editor.h
deleted file mode 100644
index a20dfb8..0000000
--- a/src/stylesheet-editor.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * stylesheet-editor.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef STYLESHEET_EDITOR_H
-#define STYLESHEET_EDITOR_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-typedef struct _stylesheetwindow StylesheetWindow;
-
-extern StylesheetWindow *open_stylesheet(struct presentation *p);
-
-#endif /* STYLESHEET_EDITOR_H */
diff --git a/src/stylesheet.c b/src/stylesheet.c
deleted file mode 100644
index eb959c1..0000000
--- a/src/stylesheet.c
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
- * stylesheet.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include "presentation.h"
-#include "stylesheet.h"
-#include "objects.h"
-#include "loadsave.h"
-
-
-struct _stylesheet
-{
- struct slide_template **slide_templates;
- int n_slide_templates;
-};
-
-
-struct slide_template *new_slide_template(StyleSheet *ss, const char *name)
-{
- struct slide_template *st;
- int n;
- struct slide_template **slide_templates_new;
-
- st = calloc(1, sizeof(*st));
- if ( st == NULL ) return NULL;
-
- st->name = strdup(name);
- st->frame_classes = NULL;
- st->n_frame_classes = 0;
- st->bgblocks = NULL;
- st->n_bgblocks = 0;
-
- n = ss->n_slide_templates;
-
- /* Resize to n_slide_templates * size of pointer */
- slide_templates_new = realloc(ss->slide_templates, (n+1)*sizeof(st));
- if ( slide_templates_new == NULL ) {
- free(st->name);
- free(st);
- return NULL;
- }
- ss->slide_templates = slide_templates_new;
- ss->slide_templates[n] = st;
- ss->n_slide_templates = n+1;
-
- return st;
-}
-
-
-struct frame_class *new_frame_class(struct slide_template *st, const char *name)
-{
- struct frame_class *fc;
- int n;
- struct frame_class **frame_classes_new;
-
- fc = calloc(1, sizeof(*fc));
- if ( fc == NULL ) return NULL;
-
- fc->name = strdup(name);
- fc->sc_prologue = NULL;
-
- n = st->n_frame_classes;
- frame_classes_new = realloc(st->frame_classes, (n+1)*sizeof(fc));
- if ( frame_classes_new == NULL ) {
- free(fc->name);
- free(fc);
- return NULL;
- }
- st->frame_classes = frame_classes_new;
- st->frame_classes[n] = fc;
- st->n_frame_classes = n+1;
-
- return fc;
-}
-
-
-static void free_frame_class(struct frame_class *fc)
-{
- free(fc->name);
- free(fc->sc_prologue);
-}
-
-
-static void free_bgblock(struct bgblock *bg)
-{
- free(bg->colour1);
- free(bg->colour2);
-}
-
-
-static void free_slide_template(struct slide_template *st)
-{
- int i;
-
- for ( i=0; i<st->n_frame_classes; i++ ) {
- free_frame_class(st->frame_classes[i]);
- }
- free(st->frame_classes);
-
- for ( i=0; i<st->n_bgblocks; i++ ) {
- free_bgblock(st->bgblocks[i]);
- }
- free(st->bgblocks);
-
- free(st->name);
-}
-
-
-void free_stylesheet(StyleSheet *ss)
-{
- int i;
-
- for ( i=0; i<ss->n_slide_templates; i++ ) {
- free_slide_template(ss->slide_templates[i]);
- }
-
- free(ss->slide_templates);
- free(ss);
-}
-
-
-void default_stylesheet(StyleSheet *ss)
-{
- struct slide_template *st;
- struct frame_class *fc;
-
- st = new_slide_template(ss, "Title page");
-
- fc = new_frame_class(st, "Presentation title");
- fc->margin_left = 20.0;
- fc->margin_right = 20.0;
- fc->margin_top = 20.0;
- fc->margin_bottom = 20.0;
- fc->sc_prologue = strdup("\\FF'Sans 50';\\FC'#000000000000';");
-
- fc = new_frame_class(st, "Author(s)");
- fc->margin_left = 20.0;
- fc->margin_right = 20.0;
- fc->margin_top = 20.0;
- fc->margin_bottom = 20.0;
- fc->sc_prologue = strdup("\\FF'Sans 30';\\FC'#000000000000';");
-
- fc = new_frame_class(st, "Date");
- fc->margin_left = 20.0;
- fc->margin_right = 20.0;
- fc->margin_top = 20.0;
- fc->margin_bottom = 20.0;
- fc->sc_prologue = strdup("\\FF'Sans 30';\\FC'#000000000000';");
-
- st->bgblocks = malloc(sizeof(struct bgblock));
- st->n_bgblocks = 1;
- st->bgblocks[0]->type = BGBLOCK_SOLID;
- st->bgblocks[0]->min_x = 0.0;
- st->bgblocks[0]->max_x = 1024.0;
- st->bgblocks[0]->min_y = 0.0;
- st->bgblocks[0]->max_y = 768.0;
- st->bgblocks[0]->colour1 = strdup("#eeeeeeeeeeee");
- st->bgblocks[0]->alpha1 = 1.0;
-
- st = new_slide_template(ss, "Slide");
-
- fc = new_frame_class(st, "Content");
- fc->margin_left = 20.0;
- fc->margin_right = 20.0;
- fc->margin_top = 20.0;
- fc->margin_bottom = 20.0;
- fc->sc_prologue = strdup("\\FF'Sans 18';\\FC'#000000000000';");
-
- fc = new_frame_class(st, "Title");
- fc->margin_left = 20.0;
- fc->margin_right = 20.0;
- fc->margin_top = 20.0;
- fc->margin_bottom = 20.0;
- fc->sc_prologue = strdup("\\FF'Sans 40';\\FC'#000000000000';");
-
- fc = new_frame_class(st, "Credit");
- fc->margin_left = 20.0;
- fc->margin_right = 20.0;
- fc->margin_top = 20.0;
- fc->margin_bottom = 35.0;
- fc->sc_prologue = strdup("\\FF'Sans 14';\\FC'#000000000000';");
-
- fc = new_frame_class(st, "Date");
- fc->margin_left = 600.0;
- fc->margin_right = 100.0;
- fc->margin_top = 745.0;
- fc->margin_bottom = 5.0;
- fc->sc_prologue = strdup("\\FF'Sans 12';\\FC'#999999999999';");
-
- fc = new_frame_class(st, "Slide number");
- fc->margin_left = 600.0;
- fc->margin_right = 5.0;
- fc->margin_top = 745.0;
- fc->margin_bottom = 5.0;
- fc->sc_prologue = strdup("\\FF'Sans 12';\\FC'#999999999999';\\JR");
-
- fc = new_frame_class(st, "Presentation title");
- fc->margin_left = 5.0;
- fc->margin_right = 600.0;
- fc->margin_top = 745.0;
- fc->margin_bottom = 5.0;
- fc->sc_prologue = strdup("\\FF'Sans 12';\\FC'#999999999999';\\JC\\VC");
-
- st->bgblocks = malloc(sizeof(struct bgblock));
- st->n_bgblocks = 1;
- st->bgblocks[0]->type = BGBLOCK_SOLID;
- st->bgblocks[0]->min_x = 0.0;
- st->bgblocks[0]->max_x = 1024.0;
- st->bgblocks[0]->min_y = 0.0;
- st->bgblocks[0]->max_y = 768.0;
- st->bgblocks[0]->colour1 = strdup("#ffffffffffff");
- st->bgblocks[0]->alpha1 = 1.0;
-}
-
-
-static const char *str_bgtype(enum bgblocktype t)
-{
- switch ( t ) {
- case BGBLOCK_SOLID : return "solid";
- case BGBLOCK_GRADIENT_X : return "gradient_x";
- case BGBLOCK_GRADIENT_Y : return "gradient_y";
- case BGBLOCK_GRADIENT_CIRCULAR : return "gradient_circular";
- case BGBLOCK_IMAGE : return "image";
- default : return "???";
- }
-}
-
-
-static enum bgblocktype str_to_bgtype(char *t)
-{
- if ( strcmp(t, "solid") == 0 ) return BGBLOCK_SOLID;
- if ( strcmp(t, "gradient_x") == 0 ) return BGBLOCK_GRADIENT_X;
- if ( strcmp(t, "gradient_y") == 0 ) return BGBLOCK_GRADIENT_Y;
- if ( strcmp(t, "gradient_ciruclar") == 0 ) {
- return BGBLOCK_GRADIENT_CIRCULAR;
- }
- if ( strcmp(t, "image") == 0 ) return BGBLOCK_IMAGE;
-
- return BGBLOCK_SOLID;
-}
-
-
-static int read_frame_class(struct frame_class *fc, struct ds_node *root)
-{
- get_field_f(root, "margin_left", &fc->margin_left);
- get_field_f(root, "margin_right", &fc->margin_right);
- get_field_f(root, "margin_top", &fc->margin_top);
- get_field_f(root, "margin_bottom", &fc->margin_bottom);
- get_field_s(root, "sc_prologue", &fc->sc_prologue);
-
- return 0;
-}
-
-
-static int read_bgblock(struct bgblock *b, struct ds_node *root)
-{
- char *type;
-
- get_field_s(root, "type", &type);
- b->type = str_to_bgtype(type);
-
- get_field_f(root, "min_x", &b->min_x);
- get_field_f(root, "max_x", &b->max_x);
- get_field_f(root, "min_y", &b->min_y);
- get_field_f(root, "max_y", &b->max_y);
-
- switch ( b->type ) {
-
- case BGBLOCK_SOLID :
- get_field_s(root, "colour1", &b->colour1);
- get_field_f(root, "alpha1", &b->alpha1);
- break;
-
- case BGBLOCK_GRADIENT_X :
- case BGBLOCK_GRADIENT_Y :
- case BGBLOCK_GRADIENT_CIRCULAR :
- get_field_s(root, "colour1", &b->colour1);
- get_field_f(root, "alpha1", &b->alpha1);
- get_field_s(root, "colour2", &b->colour2);
- get_field_f(root, "alpha2", &b->alpha2);
- break;
-
- default:
- break;
-
- }
-
- return 0;
-}
-
-
-struct slide_template *tree_to_slide_template(StyleSheet *ss,
- struct ds_node *root)
-{
- struct slide_template *st;
- int i;
- char *v;
- struct ds_node *node;
-
- get_field_s(root, "name", &v);
- if ( v == NULL ) {
- fprintf(stderr, "No name for slide template '%s'\n",
- root->key);
- return NULL;
- }
-
- st = new_slide_template(ss, v);
- if ( st == NULL ) return NULL;
-
- node = find_node(root, "frame_classes", 0);
- if ( node == NULL ) {
- fprintf(stderr, "Couldn't find frame classes\n");
- free_slide_template(st);
- return NULL;
- }
-
- st->frame_classes = malloc(node->n_children
- * sizeof(struct frame_class));
- if ( st->frame_classes == NULL ) {
- fprintf(stderr, "Couldn't allocate frame classes\n");
- free_slide_template(st);
- return NULL;
- }
- st->n_frame_classes = node->n_children;
-
- for ( i=0; i<node->n_children; i++ ) {
-
- struct frame_class *fc;
-
- fc = st->frame_classes[i];
-
- if ( read_frame_class(fc, node->children[i]) ) {
- fprintf(stderr, "Couldn't read frame class %i\n", i);
- continue;
- }
-
- }
-
- node = find_node(root, "bgblocks", 0);
- if ( node == NULL ) {
- fprintf(stderr, "Couldn't find bgblocks\n");
- free_stylesheet(ss);
- return NULL;
- }
-
- st->bgblocks = malloc(node->n_children * sizeof(struct bgblock));
- if ( st->bgblocks == NULL ) {
- fprintf(stderr, "Couldn't allocate bgblocks\n");
- free_slide_template(st);
- return NULL;
- }
- st->n_bgblocks = node->n_children;
-
- for ( i=0; i<node->n_children; i++ ) {
-
- struct bgblock *b;
-
- b = st->bgblocks[i];
-
- if ( read_bgblock(b, node->children[i]) ) {
- fprintf(stderr, "Couldn't read bgblock %i\n", i);
- continue;
- }
-
- }
-
- return st;
-}
-
-
-StyleSheet *tree_to_stylesheet(struct ds_node *root)
-{
- StyleSheet *ss;
- struct ds_node *node;
- int i;
-
- ss = new_stylesheet();
- if ( ss == NULL ) return NULL;
-
- node = find_node(root, "templates", 0);
- if ( node == NULL ) {
- fprintf(stderr, "Couldn't find slide templates\n");
- free_stylesheet(ss);
- return NULL;
- }
-
- for ( i=0; i<node->n_children; i++ ) {
-
- struct slide_template *st;
-
- st = tree_to_slide_template(ss, node->children[i]);
-
- }
-
- return ss;
-}
-
-
-StyleSheet *new_stylesheet()
-{
- StyleSheet *ss;
-
- ss = calloc(1, sizeof(struct _stylesheet));
- if ( ss == NULL ) return NULL;
-
- ss->n_slide_templates = 0;
- ss->slide_templates = NULL;
-
- return ss;
-}
-
-
-int save_stylesheet(StyleSheet *ss, const char *filename)
-{
- FILE *fh;
- struct serializer ser;
-
- fh = fopen(filename, "w");
- if ( fh == NULL ) return 1;
-
- /* Set up the serializer */
- ser.fh = fh;
- ser.stack_depth = 0;
- ser.prefix = NULL;
-
- fprintf(fh, "# Colloquium style sheet file\n");
- serialize_f(&ser, "version", 0.1);
-
- serialize_start(&ser, "stylesheet");
- write_stylesheet(ss, &ser);
- serialize_end(&ser);
-
- return 0;
-}
-
-
-StyleSheet *load_stylesheet(const char *filename)
-{
- StyleSheet *ss;
-
- ss = new_stylesheet();
- if ( ss == NULL ) return NULL;
-
- /* FIXME: Implement this */
-
- return ss;
-}
-
-
-void write_stylesheet(StyleSheet *ss, struct serializer *ser)
-{
- int i;
-
- serialize_start(ser, "templates");
- for ( i=0; i<ss->n_slide_templates; i++ ) {
-
- int j;
- struct slide_template *st;
-
- st = ss->slide_templates[i];
-
- serialize_start(ser, "bgblocks");
- for ( j=0; j<st->n_bgblocks; j++ ) {
-
- struct bgblock *b = st->bgblocks[j];
- char id[32];
-
- snprintf(id, 31, "%i", j);
-
- serialize_start(ser, id);
- serialize_s(ser, "type", str_bgtype(b->type));
- serialize_f(ser, "min_x", b->min_x);
- serialize_f(ser, "min_y", b->min_y);
- serialize_f(ser, "max_x", b->max_x);
- serialize_f(ser, "max_y", b->max_y);
-
- switch ( b->type ) {
-
- case BGBLOCK_SOLID :
- serialize_s(ser, "colour1", b->colour1);
- serialize_f(ser, "alpha1", b->alpha1);
- break;
-
- case BGBLOCK_GRADIENT_X :
- case BGBLOCK_GRADIENT_Y :
- case BGBLOCK_GRADIENT_CIRCULAR :
- serialize_s(ser, "colour1", b->colour1);
- serialize_f(ser, "alpha1", b->alpha1);
- serialize_s(ser, "colour2", b->colour2);
- serialize_f(ser, "alpha2", b->alpha2);
- break;
-
- default:
- break;
-
- }
-
- serialize_end(ser);
-
- }
- serialize_end(ser);
-
- serialize_start(ser, "frame_classes");
- for ( j=0; j<st->n_frame_classes; j++ ) {
-
- struct frame_class *fc = st->frame_classes[j];
- char id[32];
-
- snprintf(id, 31, "%i", j);
-
- serialize_start(ser, id);
- serialize_s(ser, "name", fc->name);
- serialize_f(ser, "margin_left", fc->margin_left);
- serialize_f(ser, "margin_right", fc->margin_right);
- serialize_f(ser, "margin_top", fc->margin_top);
- serialize_f(ser, "margin_bottom", fc->margin_bottom);
- serialize_s(ser, "sc_prologue", fc->sc_prologue);
- serialize_end(ser);
-
- }
- serialize_end(ser);
-
- }
-
- serialize_end(ser);
-}
-
-
-struct frame_class *find_frame_class(struct slide_template *st,
- const char *name)
-{
- int i;
- for ( i=0; i<st->n_frame_classes; i++ ) {
- if ( strcmp(st->frame_classes[i]->name, name) == 0 ) {
- return st->frame_classes[i];
- }
- }
-
- return NULL;
-}
-
-
-struct slide_template *find_slide_template(StyleSheet *ss, const char *name)
-{
- int i;
- for ( i=0; i<ss->n_slide_templates; i++ ) {
- if ( strcmp(ss->slide_templates[i]->name, name) == 0 ) {
- return ss->slide_templates[i];
- }
- }
-
- return NULL;
-}
diff --git a/src/stylesheet.h b/src/stylesheet.h
index 558c7c5..44230fb 100644
--- a/src/stylesheet.h
+++ b/src/stylesheet.h
@@ -27,8 +27,6 @@
#include <config.h>
#endif
-#include "loadsave.h"
-
struct frame_class
{
@@ -91,21 +89,4 @@ struct slide_template
typedef struct _stylesheet StyleSheet;
struct presentation;
-extern StyleSheet *new_stylesheet();
-extern StyleSheet *load_stylesheet(const char *filename);
-extern void free_stylesheet(StyleSheet *ss);
-extern void default_stylesheet(StyleSheet *ss);
-
-extern int save_stylesheet(StyleSheet *ss, const char *filename);
-
-/* Used during deserialization */
-extern struct slide_template *find_slide_template(StyleSheet *ss,
- const char *name);
-
-extern struct frame_class *find_frame_class(struct slide_template *st,
- const char *name);
-
-extern StyleSheet *tree_to_stylesheet(struct ds_node *root);
-extern void write_stylesheet(StyleSheet *ss, struct serializer *ser);
-
#endif /* STYLESHEET_H */
diff --git a/src/tool_image.c b/src/tool_image.c
deleted file mode 100644
index 2495b95..0000000
--- a/src/tool_image.c
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * tool_image.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <math.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "presentation.h"
-#include "objects.h"
-#include "mainwindow.h"
-#include "slide_render.h"
-
-
-enum image_drag_reason
-{
- IMAGE_DRAG_REASON_NONE,
- IMAGE_DRAG_REASON_RESIZE,
-};
-
-
-struct image_toolinfo
-{
- struct toolinfo base;
- enum image_drag_reason drag_reason;
- enum corner drag_corner;
- double box_x;
- double box_y;
- double box_width;
- double box_height;
- double drag_initial_x;
- double drag_initial_y;
-};
-
-
-struct image_object
-{
- struct object base;
-
- struct image *image;
- GdkPixbuf *scaled_pb;
- int scaled_w;
- int scaled_h;
- double diagonal_length;
-};
-
-
-static void update_image(struct image_object *o)
-{
- struct image *i = o->image;
- int w, h;
-
- /* Fit the width and calculate the height */
- w = o->base.bb_width;
- h = ((double)i->height / i->width) * o->base.bb_width;
- if ( h > o->base.bb_height ) {
- h = o->base.bb_height;
- w = ((double)i->width / i->height) * o->base.bb_height;
- }
-
- if ( (o->scaled_w != w) || (o->scaled_h != h) ) {
- if ( o->scaled_pb != NULL ) gdk_pixbuf_unref(o->scaled_pb);
- o->scaled_pb = gdk_pixbuf_scale_simple(i->pb, w, h,
- GDK_INTERP_BILINEAR);
- } /* else the size didn't change */
-}
-
-
-static void render_image_object(cairo_t *cr, struct object *op)
-{
- struct image_object *o = (struct image_object *)op;
-
- cairo_new_path(cr);
- cairo_rectangle(cr, op->x, op->y, op->bb_width, op->bb_height);
- gdk_cairo_set_source_pixbuf(cr, o->scaled_pb, op->x, op->y);
- cairo_fill(cr);
-}
-
-
-
-static void update_image_object(struct object *op)
-{
- struct image_object *o = (struct image_object *)op;
- update_image(o);
-}
-
-
-static void delete_image_object(struct object *op)
-{
- struct image_object *o = (struct image_object *)op;
- if ( o->scaled_pb != NULL ) gdk_pixbuf_unref(o->scaled_pb);
- unref_image(o->image);
-}
-
-
-static void serialize(struct object *op, struct serializer *ser)
-{
- struct image_object *o = (struct image_object *)op;
-
- serialize_f(ser, "x", op->x);
- serialize_f(ser, "y", op->y);
- serialize_f(ser, "w", op->bb_width);
- serialize_f(ser, "h", op->bb_height);
- serialize_s(ser, "filename", o->image->filename);
-}
-
-
-static struct image_object *new_image_object(double x, double y,
- double bb_width, double bb_height,
- char *filename, struct style *sty,
- struct image_store *is,
- struct image_toolinfo *ti)
-{
- struct image_object *new;
-
- new = calloc(1, sizeof(*new));
- if ( new == NULL ) return NULL;
-
- /* Base properties */
- new->base.x = x; new->base.y = y;
- new->base.bb_width = bb_width;
- new->base.bb_height = bb_height;
- new->base.type = OBJ_IMAGE;
- new->base.empty = 0;
- new->base.parent = NULL;
- new->base.style = sty;
-
- new->scaled_pb = NULL;
- new->image = get_image(is, filename);
- if ( new->image == NULL ) {
- free(new);
- printf("Failed to load or get image.\n");
- return NULL;
- }
-
- /* Methods for this object */
- new->base.render_object = render_image_object;
- new->base.delete_object = delete_image_object;
- new->base.update_object = update_image_object;
- new->base.serialize = serialize;
-
- return new;
-}
-
-
-struct object *add_image_object(struct slide *s, double x, double y,
- double bb_width, double bb_height,
- char *filename, struct style *sty,
- struct image_store *is,
- struct image_toolinfo *ti)
-{
- struct image_object *new;
-
- new = new_image_object(x, y, bb_width, bb_height,
- filename, sty, is, ti);
- if ( new == NULL ) return NULL;
-
- new->base.parent = s;
- if ( add_object_to_slide(s, (struct object *)new) ) {
- free(new);
- return NULL;
- }
-
- update_image(new);
- redraw_slide(s);
-
- return (struct object *)new;
-}
-
-
-static void calculate_box_size(struct object *o, double x, double y,
- struct image_toolinfo *ti)
-{
- double ddx, ddy, dlen, mult;
- double vx, vy, dbx, dby;
- struct image_object *to = (struct image_object *)o;
-
- ddx = x - ti->drag_initial_x;
- ddy = y - ti->drag_initial_y;
-
- switch ( ti->drag_corner ) {
-
- case CORNER_BR :
- vx = o->bb_width;
- vy = o->bb_height;
- break;
-
- case CORNER_BL :
- vx = -o->bb_width;
- vy = o->bb_height;
- break;
-
- case CORNER_TL :
- vx = -o->bb_width;
- vy = -o->bb_height;
- break;
-
- case CORNER_TR :
- vx = o->bb_width;
- vy = -o->bb_height;
- break;
-
- case CORNER_NONE :
- default:
- vx = 0.0;
- vy = 0.0;
- break;
-
- }
-
- dlen = (ddx*vx + ddy*vy) / to->diagonal_length;
- mult = (dlen+to->diagonal_length) / to->diagonal_length;
-
- ti->box_width = o->bb_width * mult;
- ti->box_height = o->bb_height * mult;
- dbx = ti->box_width - o->bb_width;
- dby = ti->box_height - o->bb_height;
-
- if ( ti->box_width < 40.0 ) {
- mult = 40.0 / o->bb_width;
- }
- if ( ti->box_height < 40.0 ) {
- mult = 40.0 / o->bb_height;
- }
- ti->box_width = o->bb_width * mult;
- ti->box_height = o->bb_height * mult;
- dbx = ti->box_width - o->bb_width;
- dby = ti->box_height - o->bb_height;
-
- switch ( ti->drag_corner ) {
-
- case CORNER_BR :
- ti->box_x = o->x;
- ti->box_y = o->y;
- break;
-
- case CORNER_BL :
- ti->box_x = o->x - dbx;
- ti->box_y = o->y;
- break;
-
- case CORNER_TL :
- ti->box_x = o->x - dbx;
- ti->box_y = o->y - dby;
- break;
-
- case CORNER_TR :
- ti->box_x = o->x;
- ti->box_y = o->y - dby;
- break;
-
- case CORNER_NONE :
- break;
-
- }
-
-}
-
-
-static void click_select(struct presentation *p, struct toolinfo *tip,
- double x, double y, GdkEventButton *event,
- enum drag_status *drag_status,
- enum drag_reason *drag_reason)
-{
- enum corner c;
- struct image_toolinfo *ti = (struct image_toolinfo *)tip;
- struct image_object *o = (struct image_object *)p->editing_object;
-
- assert(o->base.type == OBJ_IMAGE);
-
- /* Within the resizing region? */
- c = which_corner(x, y, &o->base);
- if ( c != CORNER_NONE )
- {
- ti->drag_reason = IMAGE_DRAG_REASON_RESIZE;
- ti->drag_corner = c;
-
- ti->drag_initial_x = x;
- ti->drag_initial_y = y;
- o->diagonal_length = pow(o->base.bb_width, 2.0);
- o->diagonal_length += pow(o->base.bb_height, 2.0);
- o->diagonal_length = sqrt(o->diagonal_length);
-
- calculate_box_size((struct object *)o, x, y, ti);
-
- /* Tell the MCP what we did, and return */
- *drag_status = DRAG_STATUS_DRAGGING;
- *drag_reason = DRAG_REASON_TOOL;
- return;
- }
-}
-
-
-static void drag(struct toolinfo *tip, struct presentation *p,
- struct object *o, double x, double y)
-{
- struct image_toolinfo *ti = (struct image_toolinfo *)tip;
-
- if ( ti->drag_reason == IMAGE_DRAG_REASON_RESIZE ) {
-
- calculate_box_size(o, x, y, ti);
- redraw_overlay(p);
-
- }
-}
-
-
-static void end_drag(struct toolinfo *tip, struct presentation *p,
- struct object *o, double x, double y)
-{
- struct image_toolinfo *ti = (struct image_toolinfo *)tip;
-
- calculate_box_size((struct object *)o, x, y, ti);
-
- o->x = ti->box_x;
- o->y = ti->box_y;
- o->bb_width = ti->box_width;
- o->bb_height = ti->box_height;
- update_image((struct image_object *)o);
- redraw_slide(o->parent);
-
- ti->drag_reason = IMAGE_DRAG_REASON_NONE;
-}
-
-
-static void create_region(struct toolinfo *tip, struct presentation *p,
- double x1, double y1, double x2, double y2)
-{
- //struct object *n;
- //struct image_toolinfo *ti = (struct image_toolinfo *)tip;
- //struct image_object *o;
-
- /* FIXME: Open an "Open file" dialogue box and use the result */
-}
-
-
-static void select_object(struct object *o, struct toolinfo *tip)
-{
- /* Do nothing */
-}
-
-
-static int deselect_object(struct object *o, struct toolinfo *tip)
-{
- if ( (o != NULL) && o->empty ) {
- delete_object(o);
- return 1;
- }
-
- return 0;
-}
-
-
-static void draw_overlay(struct toolinfo *tip, cairo_t *cr, struct object *n)
-{
- struct image_toolinfo *ti = (struct image_toolinfo *)tip;
- //struct image_object *o = (struct image_object *)n;
-
- if ( n != NULL ) {
-
- draw_editing_box(cr, n->x, n->y, n->bb_width, n->bb_height);
-
- /* Draw resize handles */
- draw_resize_handle(cr, n->x, n->y+n->bb_height-20.0);
- draw_resize_handle(cr, n->x+n->bb_width-20.0, n->y);
- draw_resize_handle(cr, n->x, n->y);
- draw_resize_handle(cr, n->x+n->bb_width-20.0,
- n->y+n->bb_height-20.0);
-
- }
-
- if ( ti->drag_reason == IMAGE_DRAG_REASON_RESIZE ) {
- draw_rubberband_box(cr, ti->box_x, ti->box_y,
- ti->box_width, ti->box_height);
- }
-
-}
-
-
-static void key_pressed(struct object *o, guint keyval, struct toolinfo *tip)
-{
- /* Do nothing */
-}
-
-
-static void im_commit(struct object *o, gchar *str, struct toolinfo *tip)
-{
- /* Do nothing */
-}
-
-
-static int valid_object(struct object *o)
-{
- if ( o->type == OBJ_IMAGE ) return 1;
- return 0;
-}
-
-
-static struct object *deserialize(struct presentation *p, struct ds_node *root,
- struct toolinfo *tip)
-{
- struct image_object *o;
- double x, y, w, h;
- char *filename;
- struct image_toolinfo *ti = (struct image_toolinfo *)tip;
-
- if ( get_field_f(root, "x", &x) ) {
- fprintf(stderr,
- "Couldn't find x position for object '%s'\n",
- root->key);
- return NULL;
- }
- if ( get_field_f(root, "y", &y) ) {
- fprintf(stderr,
- "Couldn't find y position for object '%s'\n",
- root->key);
- return NULL;
- }
- if ( get_field_f(root, "w", &w) ) {
- fprintf(stderr,
- "Couldn't find width for object '%s'\n",
- root->key);
- return NULL;
- }
- if ( get_field_f(root, "h", &h) ) {
- fprintf(stderr,
- "Couldn't find height for object '%s'\n",
- root->key);
- return NULL;
- }
- if ( get_field_s(root, "filename", &filename) ) {
- fprintf(stderr, "Couldn't find filename for object '%s'\n",
- root->key);
- return NULL;
- }
-
- o = new_image_object(x, y, w, h, filename,
- p->ss->styles[0], p->image_store, ti);
- free(filename);
-
- return (struct object *)o;
-}
-
-
-static gint prop_sig(GtkWidget *widget, struct presentation *p)
-{
- if ( p->editing_object == NULL ) return FALSE;
-
-
- return FALSE;
-}
-
-
-static void realise(struct toolinfo *ti, GtkWidget *w, struct presentation *p)
-{
- GtkWidget *prop;
-
- ti->tbox = gtk_hbox_new(FALSE, 0.0);
- prop = gtk_button_new_from_stock(GTK_STOCK_PROPERTIES);
- g_signal_connect(G_OBJECT(prop), "clicked", G_CALLBACK(prop_sig), p);
- gtk_box_pack_start(GTK_BOX(ti->tbox), prop, FALSE, FALSE, 0);
-
- g_object_ref(ti->tbox);
- gtk_widget_show_all(ti->tbox);
-}
-
-
-struct toolinfo *initialise_image_tool()
-{
- struct image_toolinfo *ti;
-
- ti = malloc(sizeof(*ti));
-
- ti->base.click_select = click_select;
- ti->base.create_default = NULL;
- ti->base.select = select_object;
- ti->base.deselect = deselect_object;
- ti->base.drag = drag;
- ti->base.end_drag = end_drag;
- ti->base.create_region = create_region;
- ti->base.draw_editing_overlay = draw_overlay;
- ti->base.key_pressed = key_pressed;
- ti->base.im_commit = im_commit;
- ti->base.valid_object = valid_object;
- ti->base.deserialize = deserialize;
- ti->base.realise = realise;
-
- return (struct toolinfo *)ti;
-}
diff --git a/src/tool_image.h b/src/tool_image.h
deleted file mode 100644
index d4d613b..0000000
--- a/src/tool_image.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * tool_image.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef TOOL_IMAGE_H
-#define TOOL_IMAGE_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtk.h>
-
-
-extern struct toolinfo *initialise_image_tool(void);
-
-extern struct object *add_image_object(struct slide *s, double x, double y,
- double bb_width, double bb_height,
- char *filename, struct style *sty,
- struct image_store *is,
- struct toolinfo *ti);
-
-#endif /* TOOL_IMAGE_H */
diff --git a/src/tool_select.c b/src/tool_select.c
deleted file mode 100644
index 1b9debb..0000000
--- a/src/tool_select.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * tool_sekect.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#include "presentation.h"
-#include "objects.h"
-#include "mainwindow.h"
-#include "slide_render.h"
-
-
-enum select_drag_reason
-{
- SELECT_DRAG_REASON_NONE,
- SELECT_DRAG_REASON_POTENTIAL_MOVE,
- SELECT_DRAG_REASON_MOVE,
-};
-
-
-struct select_toolinfo
-{
- struct toolinfo base;
- double drag_offs_x;
- double drag_offs_y;
- double box_x;
- double box_y;
- double box_width;
- double box_height;
- enum select_drag_reason drag_reason;
-};
-
-
-static void click_select(struct presentation *p, struct toolinfo *tip,
- double x, double y, GdkEventButton *event,
- enum drag_status *drag_status,
- enum drag_reason *drag_reason)
-{
- struct select_toolinfo *ti = (struct select_toolinfo *)tip;
- struct object *clicked = p->editing_object;
-
- ti->drag_offs_x = clicked->x - x;
- ti->drag_offs_y = clicked->y - y;
-
- *drag_status = DRAG_STATUS_COULD_DRAG;
- *drag_reason = DRAG_REASON_TOOL;
- ti->drag_reason = SELECT_DRAG_REASON_POTENTIAL_MOVE;
-}
-
-
-static void update_box(struct select_toolinfo *ti, double x, double y,
- struct object *o)
-{
- double nx, ny;
- double eright, ebottom;
-
- nx = x + ti->drag_offs_x;
- ny = y + ti->drag_offs_y;
-
- /* Enforce margins */
- eright = o->parent->parent->slide_width - o->style->margin_right;
- ebottom = o->parent->parent->slide_height - o->style->margin_bottom;
- if ( nx < o->style->margin_left ) nx = o->style->margin_left;
- if ( ny < o->style->margin_top ) ny = o->style->margin_top;
- if ( nx+o->bb_width > eright ) nx = eright - o->bb_width;
- if ( ny+o->bb_height > ebottom ) ny = ebottom - o->bb_height;
-
- ti->box_x = nx;
- ti->box_y = ny;
- ti->box_width = o->bb_width;
- ti->box_height = o->bb_height;
-}
-
-
-static void drag(struct toolinfo *tip, struct presentation *p,
- struct object *o, double x, double y)
-{
- struct select_toolinfo *ti = (struct select_toolinfo *)tip;
-
- if ( ti->drag_reason == SELECT_DRAG_REASON_POTENTIAL_MOVE ) {
- ti->drag_reason = SELECT_DRAG_REASON_MOVE;
- }
-
- if ( ti->drag_reason != SELECT_DRAG_REASON_MOVE ) return;
-
- update_box(ti, x, y, o);
-
- redraw_overlay(p);
-}
-
-
-static void end_drag(struct toolinfo *tip, struct presentation *p,
- struct object *o, double x, double y)
-{
- struct select_toolinfo *ti = (struct select_toolinfo *)tip;
-
- update_box(ti, x, y, o);
- o->x = ti->box_x;
- o->y = ti->box_y;
- ti->drag_reason = SELECT_DRAG_REASON_NONE;
- redraw_slide(o->parent);
-}
-
-
-static void create_region(struct toolinfo *tip, struct presentation *p,
- double x1, double y1, double x2, double y2)
-{
- /* FIXME: Select multiple objects */
-}
-
-
-static void select_object(struct object *o,struct toolinfo *tip)
-{
- /* Do nothing */
-}
-
-
-static int deselect_object(struct object *o,struct toolinfo *tip)
-{
- /* Do nothing */
- return 0;
-}
-
-
-static void draw_overlay(struct toolinfo *tip, cairo_t *cr, struct object *o)
-{
- struct select_toolinfo *ti = (struct select_toolinfo *)tip;
-
- if ( o != NULL ) {
- draw_editing_box(cr, o->x, o->y, o->bb_width, o->bb_height);
- }
-
- if ( ti->drag_reason == SELECT_DRAG_REASON_MOVE ) {
- draw_rubberband_box(cr, ti->box_x, ti->box_y,
- ti->box_width, ti->box_height);
- }
-}
-
-
-static void key_pressed(struct object *o, guint keyval, struct toolinfo *tip)
-{
- /* Do nothing */
-}
-
-
-static void im_commit(struct object *o, gchar *str, struct toolinfo *tip)
-{
- /* Do nothing */
-}
-
-
-static int valid_object(struct object *o)
-{
- return 1;
-}
-
-
-static gint delete_sig(GtkWidget *widget, struct presentation *p)
-{
- if ( p->editing_object == NULL ) return FALSE;
-
- delete_object(p->editing_object);
- p->editing_object = NULL;
- redraw_slide(p->cur_edit_slide);
-
- return FALSE;
-}
-
-
-static void realise(struct toolinfo *ti, GtkWidget *w, struct presentation *p)
-{
- GtkWidget *hbox;
- GtkWidget *del;
-
- hbox = gtk_hbox_new(FALSE, 0.0);
- ti->tbox = hbox;
-
- del = gtk_button_new_from_stock(GTK_STOCK_DELETE);
- g_signal_connect(G_OBJECT(del), "clicked", G_CALLBACK(delete_sig), p);
- gtk_box_pack_start(GTK_BOX(hbox), del, FALSE, FALSE, 0);
-
- g_object_ref(ti->tbox);
- gtk_widget_show_all(ti->tbox);
-}
-
-
-struct toolinfo *initialise_select_tool()
-{
- struct select_toolinfo *ti;
-
- ti = malloc(sizeof(*ti));
-
- ti->drag_reason = SELECT_DRAG_REASON_NONE;
-
- ti->base.click_select = click_select;
- ti->base.create_default = NULL;
- ti->base.select = select_object;
- ti->base.deselect = deselect_object;
- ti->base.drag = drag;
- ti->base.end_drag = end_drag;
- ti->base.create_region = create_region;
- ti->base.draw_editing_overlay = draw_overlay;
- ti->base.key_pressed = key_pressed;
- ti->base.im_commit = im_commit;
- ti->base.valid_object = valid_object;
- ti->base.realise = realise;
-
- return (struct toolinfo *)ti;
-}
diff --git a/src/tool_select.h b/src/tool_select.h
deleted file mode 100644
index 93aeb15..0000000
--- a/src/tool_select.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * tool_select.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef TOOL_SELECT_H
-#define TOOL_SELECT_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
-extern struct toolinfo *initialise_select_tool(void);
-
-
-#endif /* TOOL_SELECT_H */
diff --git a/src/tool_text.c b/src/tool_text.c
deleted file mode 100644
index 1b62f91..0000000
--- a/src/tool_text.c
+++ /dev/null
@@ -1,984 +0,0 @@
-/*
- * tool_text.c
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <math.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "presentation.h"
-#include "objects.h"
-#include "mainwindow.h"
-#include "slide_render.h"
-#include "loadsave.h"
-
-
-enum text_drag_reason
-{
- TEXT_DRAG_REASON_NONE,
- TEXT_DRAG_REASON_RESIZE,
-};
-
-
-struct text_toolinfo
-{
- struct toolinfo base;
- PangoContext *pc;
- enum text_drag_reason drag_reason;
- enum corner drag_corner;
- double box_x;
- double box_y;
- double box_width;
- double box_height;
- double drag_initial_x;
- double drag_initial_y;
-};
-
-
-struct text_object
-{
- struct object base;
-
- char *text;
- size_t text_len;
- int insertion_point;
- int insertion_trail;
- PangoLayout *layout;
- PangoFontDescription *fontdesc;
- double offs_x;
- double offs_y;
- int furniture;
-
- PangoContext **pc;
-};
-
-
-static void calculate_size_from_style(struct text_object *o,
- double *peright, double *pebottom,
- double *pmw, double *pmh)
-{
- double max_width, max_height;
- double ebottom, eright, mw, mh;
-
- eright = o->base.parent->parent->slide_width
- - o->base.style->margin_right;
- ebottom = o->base.parent->parent->slide_height
- - o->base.style->margin_bottom;
- mw = o->base.parent->parent->slide_width;
- mh = o->base.parent->parent->slide_height;
-
- *peright = eright; *pebottom = ebottom;
- *pmw = mw; *pmh = mh;
-
- max_width = mw - o->base.style->margin_left
- - o->base.style->margin_right;
-
-
- /* Use the provided maximum width if it exists and is smaller */
- if ( o->base.style->use_max_width
- && (o->base.style->max_width < max_width) )
- {
- max_width = o->base.style->max_width;
- }
-
- max_height = mh - o->base.style->margin_top
- - o->base.style->margin_bottom;
-
- pango_layout_set_width(o->layout, max_width*PANGO_SCALE);
- pango_layout_set_height(o->layout, max_height*PANGO_SCALE);
- pango_layout_set_wrap(o->layout, PANGO_WRAP_WORD_CHAR);
- pango_layout_set_ellipsize(o->layout, PANGO_ELLIPSIZE_MIDDLE);
-
- switch ( o->base.style->halign ) {
- case J_LEFT :
- pango_layout_set_alignment(o->layout, PANGO_ALIGN_LEFT);
- break;
- case J_RIGHT :
- pango_layout_set_alignment(o->layout, PANGO_ALIGN_RIGHT);
- break;
- case J_CENTER :
- pango_layout_set_alignment(o->layout, PANGO_ALIGN_CENTER);
- break;
- }
-}
-
-
-static void calculate_position_from_style(struct text_object *o,
- double eright, double ebottom,
- double mw, double mh)
-{
- double xo, yo;
-
- xo = o->base.bb_width; yo = o->base.bb_height;
-
- switch ( o->base.style->halign ) {
- case J_LEFT :
- o->base.x = o->base.style->margin_left;
- break;
- case J_RIGHT :
- o->base.x = eright - xo;
- break;
- case J_CENTER :
- o->base.x = mw/2.0 - xo/2.0 + o->base.style->offset_x;
- break;
- }
-
- /* Correct if centering crashes into opposite margin */
- if ( o->base.style->halign == J_CENTER )
- {
- if ( o->base.x < o->base.style->margin_left ) {
- o->base.x = o->base.style->margin_left;
- }
-
- if ( o->base.x + xo > eright ) {
- o->base.x = eright - xo;
- }
- }
-
- switch ( o->base.style->valign ) {
- case V_TOP :
- o->base.y = o->base.style->margin_top;
- break;
- case V_BOTTOM :
- o->base.y = ebottom - yo;
- break;
- case V_CENTER :
- o->base.y = mh/2.0 - yo/2.0 + o->base.style->offset_y;
- break;
- }
-
- if ( o->base.style->valign == V_CENTER ) {
-
- if ( o->base.y < o->base.style->margin_top ) {
- o->base.y = o->base.style->margin_top;
- }
-
- if ( o->base.y+yo + yo > ebottom )
- {
- o->base.y = ebottom - yo;
- }
- }
-}
-
-
-static void update_text(struct text_object *o, cairo_t *cr)
-{
- PangoRectangle logical;
- double eright = 0.0;
- double ebottom = 0.0;
- double mw = 0.0;
- double mh = 0.0;
- struct object *ex;
- struct text_object *ext;
-
- switch ( o->base.style->role ) {
-
- case S_ROLE_SLIDENUMBER:
- if ( o->text_len < 32 ) {
- free(o->text);
- o->text = malloc(32);
- o->text_len = 32;
- }
- snprintf(o->text, o->text_len-1, "Slide %i",
- 1+slide_number(o->base.parent->parent, o->base.parent));
- break;
-
- case S_ROLE_PTITLE:
- ex = o->base.parent->roles[S_ROLE_PTITLE_REF];
- ext = (struct text_object *)ex;
- if ( (ext != NULL) && (ext->text != NULL) ) {
- free(o->text);
- o->text = strdup(ext->text);
- o->text_len = strlen(o->text);
- }
- if ( ext == NULL ) {
- free(o->text);
- o->text = strdup("<presentation title>");
- o->text_len = strlen(o->text);
- }
- break;
-
- case S_ROLE_PDATE:
- ex = o->base.parent->roles[S_ROLE_PDATE_REF];
- ext = (struct text_object *)ex;
- if ( (ext != NULL) && (ext->text != NULL) ) {
- free(o->text);
- o->text = strdup(ext->text);
- o->text_len = strlen(o->text);
- }
- if ( ext == NULL ) {
- free(o->text);
- o->text = strdup("<date>");
- o->text_len = strlen(o->text);
- }
- break;
-
- default:
- break;
-
- }
-
- if ( o->layout == NULL ) {
- if ( *o->pc != NULL ) {
- o->layout = pango_layout_new(*o->pc);
- } else {
- /* Can't render yet */
- return;
- }
- }
-
- if ( cr != NULL ) pango_cairo_update_layout(cr, o->layout);
-
- o->furniture = o->base.style != o->base.parent->parent->ss->styles[0];
-
- pango_layout_set_text(o->layout, o->text, -1);
- o->fontdesc = pango_font_description_from_string(o->base.style->font);
- pango_layout_set_font_description(o->layout, o->fontdesc);
-
- if ( o->furniture ) {
-
- calculate_size_from_style(o, &eright, &ebottom, &mw, &mh);
-
- pango_layout_get_extents(o->layout, NULL, &logical);
-
- o->base.bb_width = logical.width / PANGO_SCALE;
- o->base.bb_height = logical.height / PANGO_SCALE;
- o->offs_x = logical.x / PANGO_SCALE;
- o->offs_y = logical.y / PANGO_SCALE;
-
- } else {
-
- pango_layout_set_width(o->layout,
- o->base.bb_width*PANGO_SCALE);
- pango_layout_set_height(o->layout,
- o->base.bb_height*PANGO_SCALE);
- pango_layout_set_wrap(o->layout, PANGO_WRAP_WORD_CHAR);
- pango_layout_set_ellipsize(o->layout, PANGO_ELLIPSIZE_MIDDLE);
-
- }
-
- if ( o->furniture ) {
- calculate_position_from_style(o, eright, ebottom, mw, mh);
- }
-}
-
-
-void insert_text(struct object *op, char *t)
-{
- struct text_object *o = (struct text_object *)op;
- char *tmp;
- size_t tlen, olen, offs;
- int i;
-
- assert(o->base.type == OBJ_TEXT);
- tlen = strlen(t);
- olen = strlen(o->text);
-
- if ( tlen + olen + 1 > o->text_len ) {
-
- char *try;
-
- try = realloc(o->text, o->text_len + tlen + 64);
- if ( try == NULL ) return; /* Failed to insert */
- o->text = try;
- o->text_len += 64;
- o->text_len += tlen;
-
- }
-
- tmp = malloc(o->text_len);
- if ( tmp == NULL ) return;
-
- offs = o->insertion_point + o->insertion_trail;
-
- for ( i=0; i<offs; i++ ) {
- tmp[i] = o->text[i];
- }
- for ( i=0; i<tlen; i++ ) {
- tmp[i+offs] = t[i];
- }
- for ( i=0; i<olen-o->insertion_point; i++ ) {
- tmp[i+offs+tlen] = o->text[i+offs];
- }
- tmp[olen+tlen] = '\0';
- memcpy(o->text, tmp, o->text_len);
- free(tmp);
-
- redraw_slide(op->parent);
- o->insertion_point += tlen;
- o->base.empty = 0;
-}
-
-
-void move_cursor(struct object *op, int dir)
-{
- struct text_object *o = (struct text_object *)op;
- int new_idx, new_trail;
-
- pango_layout_move_cursor_visually(o->layout, TRUE, o->insertion_point,
- o->insertion_trail,
- dir, &new_idx, &new_trail);
-
- if ( (new_idx >= 0) && (new_idx < G_MAXINT) ) {
- o->insertion_point = new_idx;
- o->insertion_trail = new_trail;
- }
-}
-
-
-void move_cursor_left(struct object *op)
-{
- move_cursor(op, -1);
- redraw_overlay(op->parent->parent);
-}
-
-
-void move_cursor_right(struct object *op)
-{
- move_cursor(op, +1);
- redraw_overlay(op->parent->parent);
-}
-
-
-void handle_text_backspace(struct object *op)
-{
- int old_idx, new_idx;
- struct text_object *o = (struct text_object *)op;
-
- assert(o->base.type == OBJ_TEXT);
-
- if ( o->insertion_point == 0 ) return; /* Nothing to delete */
-
- old_idx = o->insertion_point + o->insertion_trail;
- move_cursor_left(op);
- new_idx = o->insertion_point + o->insertion_trail;
-
- memmove(o->text+new_idx, o->text+old_idx,
- o->text_len-new_idx);
-
- if ( strlen(o->text) == 0 ) o->base.empty = 1;
-
- redraw_slide(op->parent);
-}
-
-
-static void render_text_object(cairo_t *cr, struct object *op)
-{
- struct text_object *o = (struct text_object *)op;
- GdkColor col;
-
- if ( o->layout == NULL ) {
- return;
- }
-
- update_text(o, cr);
-
- cairo_move_to(cr, o->base.x - o->offs_x, o->base.y - o->offs_y);
- gdk_color_parse(o->base.style->colour, &col);
- gdk_cairo_set_source_color(cr, &col); /* FIXME: Honour alpha as well */
- pango_cairo_show_layout(cr, o->layout);
-}
-
-
-static void draw_caret(cairo_t *cr, struct text_object *o)
-{
- double xposd, yposd, cx;
- double clow, chigh;
- PangoRectangle pos;
- const double t = 1.8;
-
- assert(o->base.type == OBJ_TEXT);
-
- pango_layout_get_cursor_pos(o->layout,
- o->insertion_point+o->insertion_trail,
- &pos, NULL);
-
- xposd = pos.x/PANGO_SCALE;
- cx = o->base.x - o->offs_x + xposd;
- yposd = pos.y/PANGO_SCALE;
- clow = o->base.y - o->offs_y + yposd;
- chigh = clow + (pos.height/PANGO_SCALE);
-
- cairo_move_to(cr, cx, clow);
- cairo_line_to(cr, cx, chigh);
-
- cairo_move_to(cr, cx-t, clow-t);
- cairo_line_to(cr, cx, clow);
- cairo_move_to(cr, cx+t, clow-t);
- cairo_line_to(cr, cx, clow);
-
- cairo_move_to(cr, cx-t, chigh+t);
- cairo_line_to(cr, cx, chigh);
- cairo_move_to(cr, cx+t, chigh+t);
- cairo_line_to(cr, cx, chigh);
-
- cairo_set_source_rgb(cr, 0.86, 0.0, 0.0);
- cairo_set_line_width(cr, 1.0);
- cairo_stroke(cr);
-}
-
-
-static void update_text_object(struct object *op)
-{
- struct text_object *o = (struct text_object *)op;
- update_text(o, NULL);
-}
-
-
-static void delete_text_object(struct object *op)
-{
- struct text_object *o = (struct text_object *)op;
-
- if ( o->layout != NULL ) g_object_unref(o->layout);
- if ( o->fontdesc != NULL ) pango_font_description_free(o->fontdesc);
-}
-
-
-static void serialize(struct object *op, struct serializer *ser)
-{
- struct text_object *o = (struct text_object *)op;
-
- serialize_s(ser, "style", op->style->name);
- if ( op->style == op->parent->parent->ss->styles[0] ) {
- serialize_f(ser, "x", op->x);
- serialize_f(ser, "y", op->y);
- serialize_f(ser, "w", op->bb_width);
- serialize_f(ser, "h", op->bb_height);
- }
-
- serialize_s(ser, "text", o->text);
-}
-
-
-static struct object *new_text_object(double x, double y, struct style *sty,
- struct text_toolinfo *ti)
-{
- struct text_object *new;
-
- new = calloc(1, sizeof(*new));
- if ( new == NULL ) return NULL;
-
- /* Base properties */
- new->base.x = x; new->base.y = y;
- new->base.bb_width = 10.0;
- new->base.bb_height = 40.0;
- new->base.type = OBJ_TEXT;
- new->base.empty = 1;
- new->base.parent = NULL;
- new->base.style = sty;
-
- /* Text-specific stuff */
- new->text = malloc(1);
- new->text[0] = '\0';
- new->text_len = 1;
- new->insertion_point = 0;
- new->insertion_trail = 0;
- if ( ti->pc != NULL ) {
- new->layout = pango_layout_new(ti->pc);
- new->pc = NULL;
- } else {
- new->layout = NULL;
- new->pc = &ti->pc;
- }
- new->fontdesc = NULL;
-
- /* Methods for this object */
- new->base.render_object = render_text_object;
- new->base.delete_object = delete_text_object;
- new->base.update_object = update_text_object;
- new->base.serialize = serialize;
-
- return (struct object *)new;
-}
-
-
-static struct object *add_text_object(struct slide *s, double x, double y,
- struct style *sty,
- struct text_toolinfo *ti)
-{
- struct object *o;
-
- o = new_text_object(x, y, sty, ti);
-
- if ( add_object_to_slide(s, o) ) {
- delete_object(o);
- return NULL;
- }
-
- redraw_slide(o->parent);
-
- return o;
-}
-
-
-static void calculate_box_size(struct object *o, double x, double y,
- struct text_toolinfo *ti)
-{
- double ddx, ddy;
-
- ddx = x - ti->drag_initial_x;
- ddy = y - ti->drag_initial_y;
-
- switch ( ti->drag_corner ) {
-
- case CORNER_BR :
- ti->box_x = o->x;
- ti->box_y = o->y;
- ti->box_width = o->bb_width + ddx;
- ti->box_height = o->bb_height + ddy;
- break;
-
- case CORNER_BL :
- ti->box_x = o->x + ddx;
- ti->box_y = o->y;
- ti->box_width = o->bb_width - ddx;
- ti->box_height = o->bb_height + ddy;
- break;
-
- case CORNER_TL :
- ti->box_x = o->x + ddx;
- ti->box_y = o->y + ddy;
- ti->box_width = o->bb_width - ddx;
- ti->box_height = o->bb_height - ddy;
- break;
-
- case CORNER_TR :
- ti->box_x = o->x;
- ti->box_y = o->y + ddy;
- ti->box_width = o->bb_width + ddx;
- ti->box_height = o->bb_height - ddy;
- break;
-
- case CORNER_NONE :
- break;
-
- }
-
- if ( ti->box_width < 20.0 ) ti->box_width = 20.0;
- if ( ti->box_height < 20.0 ) ti->box_height = 20.0;
-}
-
-
-static void click_select(struct presentation *p, struct toolinfo *tip,
- double x, double y, GdkEventButton *event,
- enum drag_status *drag_status,
- enum drag_reason *drag_reason)
-{
- int xp, yp;
- double xo, yo;
- gboolean v;
- enum corner c;
- struct text_toolinfo *ti = (struct text_toolinfo *)tip;
- struct text_object *o = (struct text_object *)p->editing_object;
- int idx, trail;
-
- assert(o->base.type == OBJ_TEXT);
-
- xo = x - o->base.x; yo = y - o->base.y;
-
- /* Within the resizing region? */
- c = which_corner(x, y, &o->base);
- if ( (c != CORNER_NONE) && !o->furniture )
- {
- ti->drag_reason = TEXT_DRAG_REASON_RESIZE;
- ti->drag_corner = c;
-
- ti->drag_initial_x = x;
- ti->drag_initial_y = y;
-
- calculate_box_size((struct object *)o, x, y, ti);
-
- /* Tell the MCP what we did, and return */
- *drag_status = DRAG_STATUS_DRAGGING;
- *drag_reason = DRAG_REASON_TOOL;
- return;
- }
-
- xp = (xo + o->offs_x)*PANGO_SCALE;
- yp = (yo + o->offs_y)*PANGO_SCALE;
-
- v = pango_layout_xy_to_index(o->layout, xp, yp, &idx, &trail);
-
- o->insertion_point = idx;
- o->insertion_trail = trail;
-}
-
-
-static void drag(struct toolinfo *tip, struct presentation *p,
- struct object *o, double x, double y)
-{
- struct text_toolinfo *ti = (struct text_toolinfo *)tip;
-
- if ( ti->drag_reason == TEXT_DRAG_REASON_RESIZE ) {
-
- calculate_box_size(o, x, y, ti);
- redraw_overlay(p);
-
- }
-}
-
-
-static void end_drag(struct toolinfo *tip, struct presentation *p,
- struct object *o, double x, double y)
-{
- struct text_toolinfo *ti = (struct text_toolinfo *)tip;
-
- calculate_box_size((struct object *)o, x, y, ti);
-
- o->x = ti->box_x;
- o->y = ti->box_y;
- o->bb_width = ti->box_width;
- o->bb_height = ti->box_height;
- update_text((struct text_object *)o, NULL);
- redraw_slide(o->parent);
-
- ti->drag_reason = TEXT_DRAG_REASON_NONE;
-}
-
-
-static void update_subsequent_refs(struct presentation *p, int start,
- enum object_role role, struct object *o)
-{
- int i;
-
- for ( i=start; i<p->num_slides; i++ )
- {
- struct slide *s = p->slides[i];
- s->roles[role] = o;
- }
-}
-
-
-static void create_default(struct presentation *p, struct style *sty,
- struct slide *s, struct toolinfo *tip)
-{
- struct object *n;
- struct text_object *o;
- struct text_toolinfo *ti = (struct text_toolinfo *)tip;
-
- n = add_text_object(s, 0.0, 0.0, sty, ti);
- o = (struct text_object *)n;
- o->furniture = 1;
- n->empty = 0;
-
- if ( sty->role != S_ROLE_NONE ) {
- s->roles[sty->role] = n;
- }
-
- switch ( sty->role )
- {
- case S_ROLE_SLIDENUMBER:
- case S_ROLE_PTITLE:
- case S_ROLE_PAUTHOR:
- case S_ROLE_PDATE:
- break;
-
- default:
- p->editing_object = n;
- break;
- }
-
- /* If we just created a new presentation title (etc), set this object as
- * the presentation title reference for all subsequent slides.
- * Any relevant objects will get updated when the current object gets
- * deselected. */
- if ( sty->role == S_ROLE_PTITLE_REF ) {
- update_subsequent_refs(p, slide_number(p, s)+1,
- S_ROLE_PTITLE_REF, n);
- }
- if ( sty->role == S_ROLE_PAUTHOR_REF ) {
- update_subsequent_refs(p, slide_number(p, s)+1,
- S_ROLE_PAUTHOR_REF, n);
- }
- if ( sty->role == S_ROLE_PDATE_REF ) {
- update_subsequent_refs(p, slide_number(p, s)+1,
- S_ROLE_PDATE_REF, n);
- }
-
- redraw_slide(((struct object *)o)->parent);
-}
-
-
-static void create_region(struct toolinfo *tip, struct presentation *p,
- double x1, double y1, double x2, double y2)
-{
- struct object *n;
- struct text_toolinfo *ti = (struct text_toolinfo *)tip;
- struct text_object *o;
-
- n = add_text_object(p->cur_edit_slide, 0.0, 0.0, p->ss->styles[0], ti);
- n->x = x1<x2 ? x1 : x2;
- n->y = y1<y2 ? y1 : y2;
- n->bb_width = fabs(x1-x2);
- n->bb_height = fabs(y1-y2);
-
- o = (struct text_object *)n;
- o->furniture = 0;
-
- redraw_slide(((struct object *)o)->parent);
- p->editing_object = n;
-}
-
-
-static void select_object(struct object *o, struct toolinfo *tip)
-{
- /* Do nothing */
-}
-
-
-static void update_subsequent(struct presentation *p, int start,
- enum object_role role, struct object *o)
-{
- int i;
-
- for ( i=start; i<p->num_slides; i++ ) {
-
- struct slide *s = p->slides[i];
-
- if ( s->roles[role] != NULL ) {
- s->roles[role]->update_object(s->roles[role]);
- }
- }
-}
-
-
-static int deselect_object(struct object *o, struct toolinfo *tip)
-{
- struct slide *s;
- struct presentation *p;
-
- if ( o == NULL ) return 0;
-
- s = o->parent;
- p = s->parent;
-
- if ( o->empty ) {
- delete_object(o);
- return 1;
- }
-
- if ( o->style->role == S_ROLE_PTITLE_REF ) {
- update_subsequent(p, slide_number(p, s)+1, S_ROLE_PTITLE, o);
- }
- if ( o->style->role == S_ROLE_PAUTHOR_REF ) {
- update_subsequent(p, slide_number(p, s)+1, S_ROLE_PAUTHOR, o);
- }
- if ( o->style->role == S_ROLE_PDATE_REF ) {
- update_subsequent(p, slide_number(p, s)+1, S_ROLE_PDATE, o);
- }
-
- return 0;
-}
-
-
-static void draw_overlay(struct toolinfo *tip, cairo_t *cr, struct object *n)
-{
- struct text_toolinfo *ti = (struct text_toolinfo *)tip;
- struct text_object *o = (struct text_object *)n;
-
- if ( n != NULL ) {
-
- draw_editing_box(cr, n->x, n->y, n->bb_width, n->bb_height);
-
- if ( !o->furniture ) {
-
- /* Draw resize handles */
- draw_resize_handle(cr, n->x, n->y+n->bb_height-20.0);
- draw_resize_handle(cr, n->x+n->bb_width-20.0, n->y);
- draw_resize_handle(cr, n->x, n->y);
- draw_resize_handle(cr, n->x+n->bb_width-20.0,
- n->y+n->bb_height-20.0);
-
- }
-
- draw_caret(cr, o);
- }
-
- if ( ti->drag_reason == TEXT_DRAG_REASON_RESIZE ) {
- draw_rubberband_box(cr, ti->box_x, ti->box_y,
- ti->box_width, ti->box_height);
- }
-
-}
-
-
-static void key_pressed(struct object *o, guint keyval, struct toolinfo *tip)
-{
- if ( o == NULL ) return;
-
- switch ( keyval ) {
-
- case GDK_KEY_BackSpace :
- handle_text_backspace(o);
- break;
-
- case GDK_KEY_Left :
- move_cursor_left(o);
- break;
-
- case GDK_KEY_Right :
- move_cursor_right(o);
- break;
-
- }
-}
-
-
-static void im_commit(struct object *o, gchar *str, struct toolinfo *tip)
-{
- insert_text(o, str);
-}
-
-
-static int valid_object(struct object *o)
-{
- if ( o->type == OBJ_TEXT ) return 1;
- return 0;
-}
-
-
-static void realise(struct toolinfo *ti, GtkWidget *w, struct presentation *p)
-{
- struct text_toolinfo *tip = (struct text_toolinfo *)ti;
- tip->pc = gtk_widget_get_pango_context(w);
-
- ti->tbox = gtk_label_new("Text tool");
- g_object_ref(ti->tbox);
- gtk_widget_show(ti->tbox);
-}
-
-
-static struct object *deserialize(struct presentation *p, struct ds_node *root,
- struct toolinfo *tip)
-{
- struct object *o;
- struct text_object *to;
- char *style;
- char *text;
- struct style *sty;
- double x, y, w, h;
- struct text_toolinfo *ti = (struct text_toolinfo *)tip;
-
- if ( get_field_s(root, "style", &style) ) {
- fprintf(stderr, "Couldn't find style for object '%s'\n",
- root->key);
- return NULL;
- }
-
- sty = find_style(p->ss, style);
- if ( sty == NULL ) {
- fprintf(stderr, "Style '%s' not found in style sheet.\n",
- style);
- free(style);
- return NULL;
- }
- free(style);
-
- if ( sty == p->ss->styles[0] ) {
-
- if ( get_field_f(root, "x", &x) ) {
- fprintf(stderr,
- "Couldn't find x position for object '%s'\n",
- root->key);
- return NULL;
- }
- if ( get_field_f(root, "y", &y) ) {
- fprintf(stderr,
- "Couldn't find y position for object '%s'\n",
- root->key);
- return NULL;
- }
- if ( get_field_f(root, "w", &w) ) {
- fprintf(stderr,
- "Couldn't find width for object '%s'\n",
- root->key);
- return NULL;
- }
- if ( get_field_f(root, "h", &h) ) {
- fprintf(stderr,
- "Couldn't find height for object '%s'\n",
- root->key);
- return NULL;
- }
-
- } else {
-
- /* Furniture */
- x = 0.0;
- y = 0.0;
- w = 0.0;
- h = 0.0;
-
- }
-
- o = new_text_object(x, y, sty, ti);
- o->bb_width = w;
- o->bb_height = h;
-
- /* Apply the correct text */
- if ( get_field_s(root, "text", &text) ) {
- fprintf(stderr, "Couldn't find text for object '%s'\n",
- root->key);
- return NULL;
- }
- to = (struct text_object *)o;
- free(to->text);
- to->text = text;
- to->text_len = strlen(text);
- o->empty = 0;
-
- return o;
-}
-
-
-struct toolinfo *initialise_text_tool(GtkWidget *w)
-{
- struct text_toolinfo *ti;
-
- ti = malloc(sizeof(*ti));
-
- ti->base.click_select = click_select;
- ti->base.create_default = create_default;
- ti->base.select = select_object;
- ti->base.deselect = deselect_object;
- ti->base.drag = drag;
- ti->base.end_drag = end_drag;
- ti->base.create_region = create_region;
- ti->base.draw_editing_overlay = draw_overlay;
- ti->base.key_pressed = key_pressed;
- ti->base.im_commit = im_commit;
- ti->base.valid_object = valid_object;
- ti->base.realise = realise;
- ti->base.deserialize = deserialize;
-
- ti->pc = NULL;
-
- ti->drag_reason = DRAG_REASON_NONE;
-
- return (struct toolinfo *)ti;
-}
diff --git a/src/tool_text.h b/src/tool_text.h
deleted file mode 100644
index aaca10a..0000000
--- a/src/tool_text.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * tool_text.h
- *
- * Colloquium - A tiny presentation program
- *
- * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef TOOL_TEXT_H
-#define TOOL_TEXT_H
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <gtk/gtk.h>
-
-
-extern struct toolinfo *initialise_text_tool();
-
-
-#endif /* TOOL_TEXT_H */