1 |
/* |
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 |