summaryrefslogtreecommitdiff
path: root/frontends/amiga/gui.h
blob: 70f1c505eeade36313baaecff3a64adeb1538307 (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
/*
 * Copyright 2008-2019 Chris Young <chris@unsatisfactorysoftware.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 AMIGA_GUI_H
#define AMIGA_GUI_H

#include <stdbool.h>
#include <graphics/rastport.h>
#include <intuition/classusr.h>
#include <dos/dos.h>
#include <devices/inputevent.h>

#include "netsurf/window.h"
#include "netsurf/mouse.h"

#include "amiga/gui_menu.h"
#include "amiga/object.h"
#include "amiga/os3support.h"

#ifdef __amigaos4__
#define HOOKF(ret,func,type,ptr,msgtype) static ret func(struct Hook *hook, type ptr, msgtype msg)
#else
#define HOOKF(ret,func,type,ptr,msgtype) static ASM ret func(REG(a0, struct Hook *hook),REG(a2, type ptr), REG(a1, msgtype msg))
#endif

/* valid options for ami_gui_get_object */
enum {
	AMI_GAD_THROBBER = 0,
	AMI_GAD_TABS,
	AMI_GAD_URL,
	AMI_GAD_SEARCH,
	AMI_WIN_MAIN
};

struct find_window;
struct ami_history_local_window;
struct ami_menu_data;
struct gui_window;
struct gui_window_2;
struct IBox;

#define AMI_GUI_TOOLBAR_MAX 20

struct ami_win_event_table {
	/* callback to handle events when using a shared msgport
	 *
	 * @param pointer to our window structure (must start with ami_generic_window)
	 * @return TRUE if window was destroyed during event processing
	 */
	BOOL (*event)(void *w);

	/* callback for explicit window closure
	 * some windows are implicitly closed by the browser and should set this to NULL
	*/
	void (*close)(void *w);
};

struct ami_generic_window {
	struct nsObject *node;
	const struct ami_win_event_table *tbl;
};

#define IS_CURRENT_GW(GWIN,GW) (ami_gui2_get_gui_window(GWIN) == GW)

/* The return value for these functions must be deallocated using FreeVec() */
STRPTR ami_locale_langs(int *codeset);
char *ami_gui_get_cache_favicon_name(struct nsurl *url, bool only_if_avail);

/* Functions lacking documentation */
void ami_get_msg(void);
void ami_try_quit(void);
void ami_quit_netsurf(void);
void ami_schedule_redraw(struct gui_window_2 *gwin, bool full_redraw);
int ami_key_to_nskey(ULONG keycode, struct InputEvent *ie);
bool ami_text_box_at_point(struct gui_window_2 *gwin, ULONG *restrict x, ULONG *restrict y);
bool ami_mouse_to_ns_coords(struct gui_window_2 *gwin, int *restrict x, int *restrict y,
	int mouse_x, int mouse_y);
BOOL ami_gadget_hit(Object *obj, int x, int y);
void ami_gui_history(struct gui_window_2 *gwin, bool back);
void ami_gui_hotlist_update_all(void);
void ami_gui_tabs_toggle_all(void);
bool ami_locate_resource(char *fullpath, const char *file);
void ami_gui_update_hotlist_button(struct gui_window_2 *gwin);
nserror ami_gui_new_blank_tab(struct gui_window_2 *gwin);
int ami_gui_count_windows(int window, int *tabs);
void ami_gui_set_scale(struct gui_window *gw, float scale);
void ami_set_pointer(struct gui_window_2 *gwin, gui_pointer_shape shape, bool update);
void ami_reset_pointer(struct gui_window_2 *gwin);
void *ami_window_at_pointer(int type);

/**
 * Beep
 */
void ami_gui_beep(void);

/**
 * Close a window and all tabs attached to it.
 *
 * @param w gui_window_2 to act upon.
 */
void ami_gui_close_window(void *w);

/**
 * Close all tabs in a window except the active one.
 *
 * @param gwin gui_window_2 to act upon.
 */
void ami_gui_close_inactive_tabs(struct gui_window_2 *gwin);

/**
 * Compatibility function to get space.gadget render area.
 *
 * @param obj A space.gadget object.
 * @param bbox A pointer to a struct IBox *.
 * @return error status.
 */
nserror ami_gui_get_space_box(Object *obj, struct IBox **bbox);

/**
 * Free any data obtained via ami_gui_get_space_box().
 *
 * @param bbox A pointer to a struct IBox.
 */
void ami_gui_free_space_box(struct IBox *bbox);

/**
 * Get shared message port
 *
 * @return Pointer to an initialised MsgPort
 */
struct MsgPort *ami_gui_get_shared_msgport(void);

/**
 * Get the application.library ID NetSurf is registered as.
 *
 * @return App ID.
 */
uint32 ami_gui_get_app_id(void);

/**
 * Get a pointer to the screen NetSurf is running on.
 *
 * @return Pointer to struct Screen.
 */
struct Screen *ami_gui_get_screen(void);

/**
 * Get the string for NetSurf's screen titlebar.
 *
 * @return String to use as the screen's titlebar text.
 */
STRPTR ami_gui_get_screen_title(void);

/**
 * Switch to the most-recently-opened tab
 */
void ami_gui_switch_to_new_tab(struct gui_window_2 *gwin);

/**
 * Add a window to the NetSurf window list (to enable event processing)
 */
nserror ami_gui_win_list_add(void *win, int type, const struct ami_win_event_table *table);

/**
 * Remove a window from the NetSurf window list
 */
void ami_gui_win_list_remove(void *win);

/**
 * Get the window list.
 *
 *\TODO: Nothing should be poking around in this list, but we aren't
 *       assigning unique IDs to windows (ARexx interface needs this)
 *       ami_find_gwin_by_id() is close but not ARexx-friendly
 */
struct MinList *ami_gui_get_window_list(void);

/**
 * Get which qualifier keys are being pressed
 */
int ami_gui_get_quals(Object *win_obj);

/**
 * Check rect is not already queued for redraw
 */
bool ami_gui_window_update_box_deferred_check(struct MinList *deferred_rects,
				const struct rect *restrict new_rect, APTR mempool);

/**
 * Adjust scale by specified amount
 */
void ami_gui_adjust_scale(struct gui_window *gw, float adjustment);

/**
 * Get a pointer to the gui_window which NetSurf considers
 * to be the current/active one
 */
struct gui_window *ami_gui_get_active_gw(void);

/**
 * Get browser window from gui_window
 */
struct browser_window *ami_gui_get_browser_window(struct gui_window *gw);

/**
 * Get browser window from gui_window_2
 */
struct browser_window *ami_gui2_get_browser_window(struct gui_window_2 *gwin);

/**
 * Get gui_window_2 from gui_window
 */
struct gui_window_2 *ami_gui_get_gui_window_2(struct gui_window *gw);

/**
 * Get gui_window from gui_window_2
 */
struct gui_window *ami_gui2_get_gui_window(struct gui_window_2 *gwin);

/**
 * Get download list from gui_window
 */
struct List *ami_gui_get_download_list(struct gui_window *gw);

/**
 * Get tab title from gui_window
 */
const char *ami_gui_get_tab_title(struct gui_window *gw);

/**
 * Get window title from gui_window
 */
const char *ami_gui_get_win_title(struct gui_window *gw);

/**
 * Get tab node from gui_window
 */
struct Node *ami_gui_get_tab_node(struct gui_window *gw);

/**
 * Get tabs from gui_window_2
 */
ULONG ami_gui2_get_tabs(struct gui_window_2 *gwin);

/**
 * Get tab list from gui_window_2
 */
struct List *ami_gui2_get_tab_list(struct gui_window_2 *gwin);

/**
 * Get favicon from gui_window
 */
struct hlcache_handle *ami_gui_get_favicon(struct gui_window *gw);

/**
 * Get local history window from gui_window
 */
struct ami_history_local_window *ami_gui_get_history_window(struct gui_window *gw);

/**
 * Set local history window in gui_window
 */
void ami_gui_set_history_window(struct gui_window *gw, struct ami_history_local_window *hw);

/**
 * Set search window in gui_window
 */
void ami_gui_set_find_window(struct gui_window *gw, struct find_window *fw);

/**
 * Get throbbing status from gui_window
 */
bool ami_gui_get_throbbing(struct gui_window *gw);

/**
 * Get throbbing frame from gui_window
 */
int ami_gui_get_throbber_frame(struct gui_window *gw);

/**
 * Set throbbing frame in gui_window
 */
void ami_gui_set_throbber_frame(struct gui_window *gw, int frame);

/**
 * Set throbbing status in gui_window
 */
void ami_gui_set_throbbing(struct gui_window *gw, bool throbbing);

/**
 * Get object from gui_window
 */
Object *ami_gui2_get_object(struct gui_window_2 *gwin, int object_type);

/**
 * Get window from gui_window
 */
struct Window *ami_gui_get_window(struct gui_window *gw);

/**
 * Get window from gui_window_2
 */
struct Window *ami_gui2_get_window(struct gui_window_2 *gwin);

/**
 * Get imenu from gui_window
 */
struct Menu *ami_gui_get_menu(struct gui_window *gw);

/**
 * Set imenu to gui_window_2. A value of NULL will free the menu (and menu_data!)
 */
void ami_gui2_set_menu(struct gui_window_2 *gwin, struct Menu *menu);

/**
 * Get menu_data from gui_window_2
 */
struct ami_menu_data **ami_gui2_get_menu_data(struct gui_window_2 *gwin);

/**
 * Set ctxmenu history tmp in gui_window_2
 */
void ami_gui2_set_ctxmenu_history_tmp(struct gui_window_2 *gwin, int temp);

/**
 * Get ctxmenu history tmp from gui_window_2
 */
int ami_gui2_get_ctxmenu_history_tmp(struct gui_window_2 *gwin);

/**
 * Get ctxmenu history from gui_window_2
 */
Object *ami_gui2_get_ctxmenu_history(struct gui_window_2 *gwin, ULONG direction);

/**
 * Set ctxmenu history in gui_window_2
 */
void ami_gui2_set_ctxmenu_history(struct gui_window_2 *gwin, ULONG direction, Object *ctx_hist);

/**
 * Set closed in gui_window_2
 */
void ami_gui2_set_closed(struct gui_window_2 *gwin, bool closed);

/**
 * Set new_content in gui_window_2
 * Indicates the window needs redrawing
 */
void ami_gui2_set_new_content(struct gui_window_2 *gwin, bool new_content);

#endif