summaryrefslogtreecommitdiff
path: root/framebuffer/fbtk.h
blob: 2098caf53dfb7140227998f1cc35bc023ec0cc3e (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
/*
 * Copyright 2008,2010 Vincent Sanders <vince@simtec.co.uk>
 *
 * This file is part of NetSurf, http://www.netsurf-browser.org/
 *
 * NetSurf 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; version 2 of the License.
 *
 * NetSurf 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 NETSURF_FB_FBTK_H
#define NETSURF_FB_FBTK_H


#define FB_SCROLL_COLOUR 0xFFAAAAAA
#define FB_FRAME_COLOUR 0xFFDDDDDD
#define FB_COLOUR_BLACK 0xFF000000
#define FB_COLOUR_WHITE 0xFFFFFFFF

typedef struct fbtk_widget_s fbtk_widget_t;

/* Widget Callback handling */
typedef enum fbtk_callback_type {
	FBTK_CBT_START = 0,
	FBTK_CBT_SCROLLX,
	FBTK_CBT_SCROLLY,
	FBTK_CBT_CLICK,
	FBTK_CBT_INPUT,
	FBTK_CBT_POINTERMOVE,
	FBTK_CBT_POINTERLEAVE,
	FBTK_CBT_POINTERENTER,
	FBTK_CBT_REDRAW,
	FBTK_CBT_DESTROY,
	FBTK_CBT_USER,
	FBTK_CBT_END,
} fbtk_callback_type;

typedef struct fbtk_callback_info {
	enum fbtk_callback_type type;
	void *context;
	nsfb_event_t *event;
	int x;
	int y;
	char *text;
	fbtk_widget_t *widget;
} fbtk_callback_info;

typedef int (*fbtk_callback)(fbtk_widget_t *widget, fbtk_callback_info *cbi);

/* enter pressed on writable icon */
typedef int (*fbtk_enter_t)(void *pw, char *text);


/************************ Core ****************************/


/** Initialise widget toolkit.
 *
 * Initialises widget toolkit against a framebuffer.
 *
 * @param fb The underlying framebuffer.
 * @return The root widget handle.
 */
fbtk_widget_t *fbtk_init(nsfb_t *fb);

/** Retrieve the framebuffer library handle from toolkit widget.
 *
 * @param widget A fbtk widget.
 * @return The underlying framebuffer.
 */
nsfb_t *fbtk_get_nsfb(fbtk_widget_t *widget);

/** Perform any pending widget redraws.
 *
 * @param widget A fbtk widget.
 */
int fbtk_redraw(fbtk_widget_t *widget);

/** Determine if there are any redraws pending for a widget.
 *
 * Mainly used by clients on the root widget to determine if they need
 * to call ::fbtk_redraw
 *
 * @param widget to check.
 */
bool fbtk_get_redraw_pending(fbtk_widget_t *widget);

/** clip a bounding box to a widgets area.
 */
bool fbtk_clip_to_widget(fbtk_widget_t *widget, bbox_t * restrict box);

/** clip one bounding box to another.
 */
bool fbtk_clip_rect(const bbox_t * restrict clip, bbox_t * restrict box);

/***************** Callback processing ********************/

/** Helper function to allow simple calling of callbacks with parameters.
 *
 * @param widget The fbtk widget to post the callback to.
 * @param cbt The type of callback to post
 * @param ... Parameters appropriate for the callback type.
 */
int fbtk_post_callback(fbtk_widget_t *widget, fbtk_callback_type cbt, ...);

/** Set a callback handler.
 *
 * Set a callback handler and the pointer to pass for a widget.
 *
 * @param widget The widget to set the handler for.
 * @param cbt The type of callback to set.
 * @param cb The callback.
 * @param pw The private pointer to pass when calling teh callback.
 * @return The previous callback handler for the type or NULL.
 */
fbtk_callback fbtk_set_handler(fbtk_widget_t *widget, fbtk_callback_type cbt, fbtk_callback cb, void *pw);

/** Get a callback handler.
 */
fbtk_callback fbtk_get_handler(fbtk_widget_t *widget, fbtk_callback_type cbt);


/******************* Event processing **********************/

/** Retrive events from the framebuffer input.
 *
 * Obtain events from the framebuffer input system with a
 * timeout. Some events may be used by the toolkit instead of being
 * returned to the caller.
 *
 * @param root An fbtk widget.
 * @param event an event structure to update.
 * @param timeout The number of miliseconds to wait for an event. 0
 *                means do not wait and -1 means wait foreevr.
 * @return wether \a event has been updated.
 */
bool fbtk_event(fbtk_widget_t *root, nsfb_event_t *event, int timeout);

/** Insert mouse button press into toolkit.
 */
void fbtk_click(fbtk_widget_t *widget, nsfb_event_t *event);

/** Insert input into toolkit.
 */
void fbtk_input(fbtk_widget_t *widget, nsfb_event_t *event);

/** Move pointer.
 *
 * Move the pointer cursor to a given location.
 *
 * @param widget any tookit widget.
 * @parm x movement in horizontal plane.
 * @parm y movement in vertical plane.
 * @parm relative Wheter the /a x and /a y should be considered relative to
 *                current pointer position.
 */
void fbtk_warp_pointer(fbtk_widget_t *widget, int x, int y, bool relative);

/** Toggle pointer grab.
 *
 * Toggles the movement grab for a widget.
 *
 * @param widget The widget trying to grab the movement.
 * @return true if the grab was ok, false if the grab failed (already grabbed).
 */
bool fbtk_tgrab_pointer(fbtk_widget_t *widget);

/** Convert a framebuffer keycode to ucs4.
 *
 * Character mapping between keycode with modifier state and ucs-4.
 */
int fbtk_keycode_to_ucs4(int code, uint8_t mods);


/******************* Widget Information **********************/

/** Obtain the widget at a point on screen.
 *
 * @param widget any tookit widget.
 * @parm x location in horizontal plane.
 * @parm y location in vertical plane.
 * @return widget or NULL.
 */
fbtk_widget_t *fbtk_get_widget_at(fbtk_widget_t *widget, int x, int y);

/** Get a widget's absolute horizontal screen co-ordinate.
 *
 * @param widget The widget to inspect.
 * @return The absolute screen co-ordinate.
 */
int fbtk_get_absx(fbtk_widget_t *widget);

/** Get a widget's absolute vertical screen co-ordinate.
 *
 * @param widget The widget to inspect.
 * @return The absolute screen co-ordinate.
 */
int fbtk_get_absy(fbtk_widget_t *widget);

/** Get a widget's width.
 *
 * @param widget The widget to inspect.
 * @return The widget width.
 */
int fbtk_get_width(fbtk_widget_t *widget);

/** Get a widget's height.
 *
 * @param widget The widget to inspect.
 * @return The widget height.
 */
int fbtk_get_height(fbtk_widget_t *widget);

/** Get a widget's bounding box in absolute screen co-ordinates.
 *
 * @param widget The widget to inspect.
 * @param bbox The bounding box structure to update.
 * @return If the \a bbox parameter has been updated.
 */
bool fbtk_get_bbox(fbtk_widget_t *widget, struct nsfb_bbox_s *bbox);


/******************* Widget Manipulation **********************/

/** Change the widget's position and size.
 *
 */
bool fbtk_set_pos_and_size(fbtk_widget_t *widget, int x, int y, int width, int height);

/** Map a widget and request it is redrawn.
 */
int fbtk_set_mapping(fbtk_widget_t *widget, bool mapped);

/** Set the z order of a widget.
 */
int fbtk_set_zorder(fbtk_widget_t *widget, int z);

/** Indicate a widget should be redrawn.
 */
void fbtk_request_redraw(fbtk_widget_t *widget);

/** Destroy a widget and all its descendants.
 *
 * Removes a widget from the hierachy and frees it and all its children.
 *
 * @param widget The widget to destroy.
 * @return 0 on success or -1 on error.
 */
int fbtk_destroy_widget(fbtk_widget_t *widget);



/********************************* Widgets *********************************/


/** Create a window widget.
 *
 * @param parent The parent window or the root widget for a top level window.
 * @param x The x location relative to the parent window.
 * @param y the y location relative to the parent window.
 * @param width The width of the window. 0 indicates parents width should be
 *              used. Negative value indicates parents width less the value
 *              should be used. The width is limited to lie within the parent
 *              window.
 * @param height The height of the window limited in a similar way to the
 *               /a width.
 * @param c The background colour.
 * @return new window widget handle or NULL on error.
 */
fbtk_widget_t *fbtk_create_window(fbtk_widget_t *parent, int x, int y, int width, int height, colour bg);



/** Create a filled rectangle
 *
 * Create a widget which is a filled rectangle, usually used for backgrounds.
 *
 * @param window The window to add the filled area widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *
fbtk_create_fill(fbtk_widget_t *window, int x, int y, int width, int height, colour c);




/** Create a horizontal scroll widget
 *
 * Create a horizontal scroll widget.
 *
 * @param window The window to add the filled area widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *
fbtk_create_hscroll(fbtk_widget_t *window, int x, int y, int width, int height, colour fg, colour bg, fbtk_callback callback, void *context);

/** Create a vertical scroll widget
 *
 * Create a vertical scroll widget.
 *
 * @param window The window to add the filled area widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *
fbtk_create_vscroll(fbtk_widget_t *window, int x, int y, int width, int height, colour fg, colour bg, fbtk_callback callback, void *context);

bool fbtk_set_scroll_parameters(fbtk_widget_t *widget, int min, int max, int thumb, int page);

bool fbtk_set_scroll_position(fbtk_widget_t *widget, int pos);





/** Create a user widget.
 *
 * Create a widget which is to be handled entirely by the calling application.
 *
 * @param window The window to add the user widget to.
 * @param pw The private pointer which can be read using ::fbtk_get_pw
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *fbtk_create_user(fbtk_widget_t *window, int x, int y, int width, int height, void *pw);

void *fbtk_get_userpw(fbtk_widget_t *widget);



/** Create a bitmap widget.
 *
 * Create a widget which shows a bitmap.
 *
 * @param window The window to add the bitmap widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *fbtk_create_bitmap(fbtk_widget_t *window, int x, int y, int width, int height, colour c,struct bitmap *image);

void fbtk_set_bitmap(fbtk_widget_t *widget, struct bitmap *image);

/** Create a button widget.
 *
 * Helper function which creates a bitmap widget and associate a handler for
 * when it is clicked.
 *
 * @param window The window to add the button widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *fbtk_create_button(fbtk_widget_t *window, int x, int y, int width, int height, colour c, struct bitmap *image, fbtk_callback click, void *pw);





/** Create a text widget.
 *
 * @param window The window to add the text widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *fbtk_create_text(fbtk_widget_t *window, int x, int y, int width, int height, colour bg, colour fg, bool outline);

/** Create a button with text.
 *
 * @param window The window to add the text widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *fbtk_create_text_button(fbtk_widget_t *window, int x, int y, int width, int height, colour bg, colour fg, fbtk_callback click, void *pw);

/** Create a writable text widget.
 *
 * Helper function which creates a text widget and configures an input handler
 * to create a writable text field. This call is equivalent to calling
 * ::fbtk_create_text followed by ::fbtk_writable_text
 *
 * @param window The window to add the text widget to.
 * @return new widget handle or NULL on error.
 */
fbtk_widget_t *fbtk_create_writable_text(fbtk_widget_t *window, int x, int y, int width, int height, colour bg, colour fg, bool outline, fbtk_enter_t enter, void *pw);

/** Alter a text widget to be writable.
 *
 * @param widget Text widget.
 * @param enter The routine to call when enter is pressed.
 * @param pw The context to pass to teh enter callback routine.
 */
void fbtk_writable_text(fbtk_widget_t *widget, fbtk_enter_t enter, void *pw);

/** Change the text of a text widget.
 *
 * @param widget Text widget.
 * @param text The new UTF-8 text to put in the widget.
 */
void fbtk_set_text(fbtk_widget_t *widget, const char *text);


/** Give widget input focus.
 *
 * @param widget Widget to be given input focus.
 */
void fbtk_set_focus(fbtk_widget_t *widget);




/** enable the on screen keyboard for input */
void fbtk_enable_oskb(fbtk_widget_t *widget);

/** show the osk. */
void map_osk(void);

#endif