aboutsummaryrefslogtreecommitdiff
path: root/src/frame.h
blob: 832473c638578dd23e46a7e9d87193539dad3bd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 * frame.h
 *
 * Colloquium - A tiny presentation program
 *
 * Copyright (c) 2012 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 FRAME_H
#define FRAME_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <pango/pango.h>
#include <cairo.h>


typedef enum
{
	DIR_NONE,
	DIR_UL,
	DIR_U,
	DIR_UR,
	DIR_R,
	DIR_DR,
	DIR_D,
	DIR_DL,
	DIR_L
} Direction;


typedef enum
{
	UNITS_SLIDE,
	UNITS_FRAC
} LengthUnits;


struct layout_parameters
{
	double margin_l;
	double margin_r;
	double margin_t;
	double margin_b;

	double pad_l;
	double pad_r;
	double pad_t;
	double pad_b;

	double x;
	double y;

	double w;
	LengthUnits w_units;
	double h;
	LengthUnits h_units;
};


enum wrap_box_type
{
	WRAP_BOX_PANGO,
};


struct wrap_box
{
	enum wrap_box_type type;
	int width;  /* Pango units */

	/* For type == WRAP_BOX_PANGO */
	PangoGlyphItem *glyph_item;
	char *text;
};


struct wrap_line
{
	int width;
	int height;  /* Pango units */
	int ascent;  /* Pango units */

	int n_boxes;
	int max_boxes;
	struct wrap_box *boxes;
};


struct frame
{
	struct frame            **children;
	int                       num_children;
	int                       max_children;

	char                     *sc;  /* Storycode */
	size_t                    sc_len;  /* Space allocated for sc */

	cairo_surface_t          *contents;

	int                       n_lines;
	int                       max_lines;
	struct wrap_line         *lines;

	size_t                    pos;

	struct layout_parameters  lop;
	struct style             *style;  /* Non-NULL if 'lop' came from SS */

	/* The rectangle allocated to this frame, determined by the renderer */
	double                    x;
	double                    y;
	double                    w;
	double                    h;

	PangoLayout              *pl;

	/* True if this frame should be deleted on the next mouse click */
	int                       empty;
};


extern struct frame *frame_new(void);
extern struct frame *add_subframe(struct frame *fr);
extern struct frame *sc_unpack(const char *sc);

#endif	/* FRAME_H */