1 |
james |
16 |
/* |
2 |
|
|
* gui.h -- portable gui library, platform independent header |
3 |
|
|
*/ |
4 |
|
|
|
5 |
|
|
#ifndef gui_H |
6 |
|
|
#define gui_H |
7 |
|
|
|
8 |
|
|
#include <setjmp.h> |
9 |
|
|
#include <stddef.h> |
10 |
|
|
#include <stdio.h> |
11 |
|
|
#include <stdlib.h> |
12 |
|
|
#include <string.h> |
13 |
|
|
#include <varargs.h> |
14 |
|
|
#include <wchar.h> |
15 |
|
|
|
16 |
|
|
#include "wstring.h" |
17 |
|
|
|
18 |
|
|
/* |
19 |
|
|
* user variables and functions |
20 |
|
|
*/ |
21 |
|
|
|
22 |
|
|
extern const char *task_name; |
23 |
|
|
extern void task_initialise(void); |
24 |
|
|
extern void task_finalise(void); |
25 |
|
|
|
26 |
|
|
/* |
27 |
|
|
* #include gui_<platform>.h |
28 |
|
|
*/ |
29 |
|
|
|
30 |
|
|
#ifdef riscos |
31 |
|
|
#include "gui_riscos.h" |
32 |
|
|
#elif defined gtk |
33 |
|
|
#include "gui_gtk.h" |
34 |
|
|
#else |
35 |
|
|
#error Unknown platform |
36 |
|
|
#endif |
37 |
|
|
|
38 |
|
|
/* |
39 |
|
|
* main_<platform>.c |
40 |
|
|
*/ |
41 |
|
|
|
42 |
|
|
extern char **gui_message; |
43 |
|
|
|
44 |
|
|
extern int main(int argc, char *argv[]); |
45 |
|
|
extern void gui_initialise(void); |
46 |
|
|
extern void gui_event_loop(void); |
47 |
|
|
|
48 |
|
|
/* |
49 |
|
|
* window_<platform>.c |
50 |
|
|
*/ |
51 |
|
|
|
52 |
|
|
#define gui_H_SCROLL_BAR 0x1 |
53 |
|
|
#define gui_V_SCROLL_BAR 0x2 |
54 |
|
|
#define gui_CLICK 1 |
55 |
|
|
#define gui_CLICK_MENU 2 |
56 |
|
|
#define gui_CLICK_RIGHT 3 |
57 |
|
|
#define gui_DRAG 4 |
58 |
|
|
#define gui_DRAG_RIGHT 5 |
59 |
|
|
|
60 |
|
|
extern gui_window_id gui_create_window(const unsigned int flags, |
61 |
|
|
char *title, |
62 |
|
|
const unsigned int width, const unsigned int height, |
63 |
|
|
void (*close_fn)(gui_window_id window_id), |
64 |
|
|
void (*redraw_fn)(gui_window_id window_id, unsigned int invalid[]), |
65 |
|
|
void (*click_fn)(gui_window_id window_id, unsigned int x, unsigned int y, |
66 |
|
|
unsigned int z), |
67 |
|
|
void (*resize_fn)(gui_window_id window_id, unsigned int width, unsigned int height), |
68 |
|
|
bool (*key_fn)(gui_window_id window_id, unsigned int key), |
69 |
|
|
void (*input_fn)(gui_window_id window_id, wchar_t key), |
70 |
|
|
void (*menu_fn)(gui_window_id window_id, unsigned int items[]), |
71 |
|
|
gui_menu_id menu, |
72 |
|
|
const char *bbar, |
73 |
|
|
const char *help); |
74 |
|
|
extern void gui_remove_window(const gui_window_id window_id); |
75 |
|
|
extern void gui_refresh_window(const gui_window_id window_id); |
76 |
|
|
extern void gui_refresh_box(const gui_window_id window_id, unsigned int x0, |
77 |
|
|
unsigned int y0, |
78 |
|
|
unsigned int x1, unsigned int y1); |
79 |
|
|
extern void gui_window_extent(const gui_window_id window_id, |
80 |
|
|
unsigned int width, unsigned int height); |
81 |
|
|
extern void gui_fill(unsigned int colour, unsigned int x0, unsigned int y0, |
82 |
|
|
unsigned int x1, unsigned int y1); |
83 |
|
|
extern void gui_move_box(const gui_window_id window_id, unsigned int x0, unsigned int y0, |
84 |
|
|
unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2); |
85 |
|
|
|
86 |
|
|
/* |
87 |
|
|
* dialog_<platform>.c |
88 |
|
|
*/ |
89 |
|
|
|
90 |
|
|
extern void gui_start_dialog(char *title, unsigned int width, |
91 |
|
|
bool close, const char *help); |
92 |
|
|
extern gui_window_id gui_create_dialog(void); |
93 |
|
|
extern void ensure_dialog_space(void); |
94 |
|
|
extern void gui_create_label(char *text, const char *help); |
95 |
|
|
extern gui_gadget_id gui_create_text_box(char *text, const char *mask, |
96 |
|
|
const char *help); |
97 |
|
|
extern gui_gadget_id gui_create_display_box(char *text, char *value, |
98 |
|
|
const char *help); |
99 |
|
|
extern void gui_create_button(char *text, void (*click_fn)(gui_window_id window_id, gui_gadget_id gadget_id), |
100 |
|
|
const char *help); |
101 |
|
|
|
102 |
|
|
/* |
103 |
|
|
* textarea.c |
104 |
|
|
*/ |
105 |
|
|
|
106 |
|
|
struct gui_ta; |
107 |
|
|
struct gui_ta_content; |
108 |
|
|
struct gui_ta_word; |
109 |
|
|
struct gui_ta_style; |
110 |
|
|
struct gui_ta_position; |
111 |
|
|
struct gui_ta_selection; |
112 |
|
|
|
113 |
|
|
struct gui_ta |
114 |
|
|
{ |
115 |
|
|
unsigned long width; |
116 |
|
|
unsigned long height; |
117 |
|
|
unsigned long contents; |
118 |
|
|
unsigned long styles; |
119 |
|
|
struct gui_ta_content *(*content)[]; |
120 |
|
|
struct gui_ta_style *(*style)[]; |
121 |
|
|
}; |
122 |
|
|
|
123 |
|
|
struct gui_ta_content |
124 |
|
|
{ |
125 |
|
|
enum { CONTENT_SPACE, CONTENT_PARAGRAPH } type; |
126 |
|
|
unsigned long y0; |
127 |
|
|
unsigned long y1; |
128 |
|
|
unsigned long leading; |
129 |
|
|
unsigned long base; |
130 |
|
|
unsigned long words; |
131 |
|
|
enum { ALIGN_LEFT, ALIGN_CENTRE, ALIGN_RIGHT, ALIGN_FULL } align; |
132 |
|
|
struct gui_ta_word *(*word)[]; |
133 |
|
|
}; |
134 |
|
|
|
135 |
|
|
struct gui_ta_word |
136 |
|
|
{ |
137 |
|
|
signed long x; /* real x coordinate */ |
138 |
|
|
unsigned long lx; /* left-align x coordinate */ |
139 |
|
|
unsigned long y; /* y coordinate */ |
140 |
|
|
unsigned long width; /* width of text */ |
141 |
|
|
unsigned long style; /* font style */ |
142 |
|
|
int start : 1; /* at start of a line */ |
143 |
|
|
int end : 1; /* at end of a line */ |
144 |
|
|
signed long box_x0; /* rubout box */ |
145 |
|
|
signed long box_x1; |
146 |
|
|
wchar_t text[1]; |
147 |
|
|
}; |
148 |
|
|
|
149 |
|
|
#define gui_SIZEOF_GUI_TA_WORD(n) (offsetof(struct gui_ta_word, text) + (n) * sizeof(wchar_t)) |
150 |
|
|
|
151 |
|
|
struct gui_ta_position |
152 |
|
|
{ |
153 |
|
|
unsigned long content; |
154 |
|
|
unsigned long word; |
155 |
|
|
unsigned long offset; |
156 |
|
|
unsigned long x; |
157 |
|
|
unsigned long y; |
158 |
|
|
}; |
159 |
|
|
|
160 |
|
|
struct gui_ta_selection |
161 |
|
|
{ |
162 |
|
|
struct gui_ta_position start; |
163 |
|
|
struct gui_ta_position end; |
164 |
|
|
}; |
165 |
|
|
|
166 |
|
|
extern struct gui_ta *gui_ta(unsigned long width); |
167 |
|
|
extern long gui_ta_add_space(struct gui_ta *doc, unsigned long height); |
168 |
|
|
extern int gui_ta_add_paragraph(struct gui_ta *doc, unsigned long leading, |
169 |
|
|
unsigned long base, wchar_t *text, unsigned long style, unsigned long align); |
170 |
|
|
extern unsigned long gui_ta_get_style(struct gui_ta *doc, unsigned long xsize, |
171 |
|
|
unsigned long ysize, unsigned long fcolour, unsigned long bcolour, char *font); |
172 |
|
|
extern void gui_ta_render(struct gui_ta *doc, unsigned long x, unsigned long y, |
173 |
|
|
unsigned int invalid[], struct gui_ta_selection *sel); |
174 |
|
|
extern void gui_ta_position_xy(struct gui_ta *doc, struct gui_ta_position *pos, |
175 |
|
|
signed long x, unsigned long y); |
176 |
|
|
extern void gui_ta_reformat(struct gui_ta *doc, unsigned long width); |
177 |
|
|
extern unsigned int gui_ta_reformat_paragraph(struct gui_ta *doc, |
178 |
|
|
struct gui_ta_content *con, unsigned long y, unsigned long width, |
179 |
|
|
unsigned long *y0_ret, unsigned long *y1_ret); |
180 |
|
|
extern void gui_ta_insert_char(struct gui_ta *doc, struct gui_ta_position *pos, |
181 |
|
|
wchar_t text, gui_window_id window_id, |
182 |
|
|
unsigned long x_offset, unsigned long y_offset); |
183 |
|
|
extern void gui_ta_insert_split(struct gui_ta *doc, struct gui_ta_position *pos, |
184 |
|
|
gui_window_id window_id, unsigned long x_offset, unsigned long y_offset); |
185 |
|
|
extern void gui_ta_insert_newline(struct gui_ta *doc, struct gui_ta_position *pos, |
186 |
|
|
gui_window_id window_id, unsigned long x_offset, unsigned long y_offset); |
187 |
|
|
extern void gui_ta_position_cwo(struct gui_ta *doc, struct gui_ta_position *pos); |
188 |
|
|
extern void gui_ta_delete(struct gui_ta *doc, struct gui_ta_position *start, |
189 |
|
|
struct gui_ta_position *end, gui_window_id window_id, |
190 |
|
|
unsigned long x_offset, unsigned long y_offset); |
191 |
|
|
extern void gui_ta_remove(struct gui_ta *doc); |
192 |
|
|
extern void gui_ta_align(struct gui_ta *doc, unsigned int content, unsigned int align, |
193 |
|
|
gui_window_id window_id, unsigned int x_offset, unsigned int y_offset); |
194 |
|
|
extern void gui_ta_export(struct gui_ta *doc, const char *path); |
195 |
|
|
|
196 |
|
|
/* |
197 |
|
|
* textarea_<platform>.c |
198 |
|
|
*/ |
199 |
|
|
|
200 |
|
|
extern unsigned long gui_ta_text_width(struct gui_ta *doc, const wchar_t *text, |
201 |
|
|
unsigned long s); |
202 |
|
|
extern void gui_ta_render_text(struct gui_ta *doc, wchar_t *text, unsigned long s, |
203 |
|
|
unsigned long x, unsigned long y, unsigned long box_x0, |
204 |
|
|
unsigned long box_y0, unsigned long box_x1, unsigned long box_y1, |
205 |
|
|
bool sel); |
206 |
|
|
extern unsigned long gui_ta_position_x(struct gui_ta *doc, wchar_t *text, unsigned long s, |
207 |
|
|
signed long *x); |
208 |
|
|
extern unsigned long gui_ta_position_o(struct gui_ta *doc, wchar_t *text, unsigned long s, |
209 |
|
|
unsigned long offset); |
210 |
|
|
extern void gui_ta_caret(gui_window_id window_id, struct gui_ta *doc, |
211 |
|
|
struct gui_ta_position *pos, unsigned long x, unsigned long y); |
212 |
|
|
extern void gui_ta_fill_style(struct gui_ta_style *style); |
213 |
|
|
extern void gui_ta_empty_style(struct gui_ta_style *style); |
214 |
|
|
|
215 |
|
|
/* |
216 |
|
|
* messages.c |
217 |
|
|
*/ |
218 |
|
|
|
219 |
|
|
extern char **gui_messages_read(const char *file_name); |
220 |
|
|
|
221 |
|
|
/* |
222 |
|
|
* menu_<platform>.c |
223 |
|
|
*/ |
224 |
|
|
|
225 |
|
|
extern gui_menu_id gui_menu(unsigned int base, unsigned int items); |
226 |
|
|
extern void gui_menu_attach(gui_menu_id menu, unsigned int item, gui_menu_id submenu); |
227 |
|
|
|
228 |
|
|
/* |
229 |
|
|
* log |
230 |
|
|
*/ |
231 |
|
|
|
232 |
|
|
#ifdef DEBUG |
233 |
|
|
#define gui_log(fmt, args...) { fprintf(stdout, fmt, ## args); fflush(stdout); } |
234 |
|
|
#else |
235 |
|
|
#define gui_log(fmt, args...) {} |
236 |
|
|
#endif |
237 |
|
|
|
238 |
|
|
|
239 |
|
|
#endif |