diff options
author | Daniel Silverstone <dsilvers@netsurf-browser.org> | 2008-09-23 14:00:40 +0000 |
---|---|---|
committer | Daniel Silverstone <dsilvers@netsurf-browser.org> | 2008-09-23 14:00:40 +0000 |
commit | 3f5d902edd65ed2201f12914bc555872d3f45eb1 (patch) | |
tree | 272488db325e9a2fecb12c23eb0ae7b5c7deefcf /framebuffer/fb_gui.c | |
parent | 9de2adbdf1ed8310894de18992e10dc26b4ae160 (diff) | |
download | netsurf-3f5d902edd65ed2201f12914bc555872d3f45eb1.tar.gz netsurf-3f5d902edd65ed2201f12914bc555872d3f45eb1.tar.bz2 |
Merged revisions 5309-5406,5409-5422 via svnmerge from
svn://svn.netsurf-browser.org/branches/vince/netsurf-fb
........
r5309 | vince | 2008-09-13 10:59:10 +0100 (Sat, 13 Sep 2008) | 2 lines
first stab at framebuffer frontend
........
r5313 | vince | 2008-09-14 15:08:52 +0100 (Sun, 14 Sep 2008) | 2 lines
add line plotters
........
r5314 | vince | 2008-09-14 15:28:12 +0100 (Sun, 14 Sep 2008) | 2 lines
add rectangle plot to 16bpp plotters
........
r5315 | vince | 2008-09-14 19:58:57 +0100 (Sun, 14 Sep 2008) | 2 lines
improve 16bpp image plot
........
r5316 | vince | 2008-09-15 00:35:32 +0100 (Mon, 15 Sep 2008) | 2 lines
abstract the os specific framebuffer init
........
r5317 | vince | 2008-09-15 11:18:51 +0100 (Mon, 15 Sep 2008) | 2 lines
first cut of linux frontend
........
r5318 | vince | 2008-09-15 12:01:00 +0100 (Mon, 15 Sep 2008) | 2 lines
remove junk includes
........
r5319 | vince | 2008-09-15 12:09:02 +0100 (Mon, 15 Sep 2008) | 2 lines
make plotters OS agnostic again
........
r5322 | vince | 2008-09-15 15:55:01 +0100 (Mon, 15 Sep 2008) | 2 lines
Linux frontend operates
........
r5323 | vince | 2008-09-15 16:32:47 +0100 (Mon, 15 Sep 2008) | 2 lines
abstract out OS specific input
........
r5326 | vince | 2008-09-15 19:21:01 +0100 (Mon, 15 Sep 2008) | 2 lines
Improve linux mode setting
........
r5329 | vince | 2008-09-15 21:13:33 +0100 (Mon, 15 Sep 2008) | 2 lines
improve text clipping
........
r5339 | vince | 2008-09-16 00:07:57 +0100 (Tue, 16 Sep 2008) | 2 lines
possibly fix text clipping issue
........
r5342 | vince | 2008-09-16 00:39:36 +0100 (Tue, 16 Sep 2008) | 2 lines
consolidate polygon plotters
........
r5344 | dsilvers | 2008-09-16 10:21:06 +0100 (Tue, 16 Sep 2008) | 1 line
Fix up the framebuffer target makefile a bit more, add some config options for it
........
r5345 | dsilvers | 2008-09-16 10:22:19 +0100 (Tue, 16 Sep 2008) | 1 line
Ensure the appropriate frontend is selected when building framebuffer
........
r5346 | dsilvers | 2008-09-16 10:27:16 +0100 (Tue, 16 Sep 2008) | 1 line
Update build system to support targetting separate framebuffer frontends in different build trees, update executable to be nsfb-blah
........
r5350 | vince | 2008-09-16 17:15:04 +0100 (Tue, 16 Sep 2008) | 1 line
Add -g to provide symbols for framebuffer link
........
r5351 | vince | 2008-09-16 17:17:09 +0100 (Tue, 16 Sep 2008) | 1 line
framebuffer scheduler now works, plotters tweaked, gui tracks window redraw requirements better, keypresses not duplicated under linux fb
........
r5352 | dsilvers | 2008-09-16 17:38:53 +0100 (Tue, 16 Sep 2008) | 1 line
Ensure we only allow one fetcher at a time
........
r5361 | vince | 2008-09-17 11:48:44 +0100 (Wed, 17 Sep 2008) | 2 lines
initial cursor support
........
r5362 | vince | 2008-09-17 13:56:47 +0100 (Wed, 17 Sep 2008) | 2 lines
add mouse handling
........
r5363 | vince | 2008-09-17 14:14:44 +0100 (Wed, 17 Sep 2008) | 2 lines
add framebuffer resources
........
r5364 | vince | 2008-09-17 17:12:21 +0100 (Wed, 17 Sep 2008) | 2 lines
add reasonable pointer
........
r5366 | vince | 2008-09-17 17:17:25 +0100 (Wed, 17 Sep 2008) | 2 lines
fix pointer alpha
........
r5370 | vince | 2008-09-18 13:43:53 +0100 (Thu, 18 Sep 2008) | 2 lines
warning squash and cleanup ready for trunk merge
........
r5375 | vince | 2008-09-19 14:58:43 +0100 (Fri, 19 Sep 2008) | 2 lines
Working mouse navigation
........
r5377 | vince | 2008-09-20 14:06:22 +0100 (Sat, 20 Sep 2008) | 2 lines
Improve scrolling
........
r5378 | vince | 2008-09-20 14:46:46 +0100 (Sat, 20 Sep 2008) | 2 lines
fix redraw issues with scrolling
........
r5380 | vince | 2008-09-20 17:08:43 +0100 (Sat, 20 Sep 2008) | 3 lines
Alter panning to use its own flag so it doesnt cause invalid redraw
operations
........
r5381 | vince | 2008-09-20 21:52:45 +0100 (Sat, 20 Sep 2008) | 2 lines
add dummy framebuffer
........
r5383 | vince | 2008-09-21 00:00:15 +0100 (Sun, 21 Sep 2008) | 2 lines
fix segfault when cursor is off teh bottom of teh screen
........
r5384 | vince | 2008-09-21 00:06:08 +0100 (Sun, 21 Sep 2008) | 2 lines
fix off by one in pointer fix
........
r5385 | vince | 2008-09-21 00:25:09 +0100 (Sun, 21 Sep 2008) | 2 lines
when fixing bloody silly off by one errors remember to fix *both* references
........
r5387 | vince | 2008-09-21 00:38:13 +0100 (Sun, 21 Sep 2008) | 2 lines
last try at stopping the pointer segfault
........
r5388 | vince | 2008-09-21 16:24:18 +0100 (Sun, 21 Sep 2008) | 2 lines
improve vertical text clipping
........
r5392 | vince | 2008-09-21 23:11:51 +0100 (Sun, 21 Sep 2008) | 2 lines
Improve text plotters
........
r5393 | vince | 2008-09-21 23:34:38 +0100 (Sun, 21 Sep 2008) | 2 lines
fix 32bpp line plotting
........
r5394 | vince | 2008-09-22 00:00:03 +0100 (Mon, 22 Sep 2008) | 2 lines
Fix off by one error in line plotting clipping
........
r5397 | vince | 2008-09-22 13:46:22 +0100 (Mon, 22 Sep 2008) | 2 lines
Fix bitmap tileing
........
r5398 | vince | 2008-09-22 17:46:02 +0100 (Mon, 22 Sep 2008) | 2 lines
enable knockout renderer
........
r5399 | vince | 2008-09-22 18:43:48 +0100 (Mon, 22 Sep 2008) | 2 lines
ensure clipping region lies within window, caused by knockout renderer
........
r5400 | vince | 2008-09-22 19:20:25 +0100 (Mon, 22 Sep 2008) | 2 lines
update cursor to one swiped from X windows
........
r5405 | vince | 2008-09-23 09:09:05 +0100 (Tue, 23 Sep 2008) | 2 lines
fix vertical scroll limit
........
r5412 | dsilvers | 2008-09-23 10:53:14 +0100 (Tue, 23 Sep 2008) | 1 line
Revert noisy fetcher patch
........
r5413 | dsilvers | 2008-09-23 10:58:00 +0100 (Tue, 23 Sep 2008) | 1 line
Add header guards
........
r5414 | dsilvers | 2008-09-23 11:31:31 +0100 (Tue, 23 Sep 2008) | 1 line
Tidy the region clipping slightly
........
r5416 | dsilvers | 2008-09-23 12:05:00 +0100 (Tue, 23 Sep 2008) | 1 line
Rationalise how the framebuffer frontend finds resources and options
........
r5418 | dsilvers | 2008-09-23 13:59:00 +0100 (Tue, 23 Sep 2008) | 1 line
Ensure options are overridden after load, and squash an fb_gui.c warning
........
r5419 | dsilvers | 2008-09-23 14:20:07 +0100 (Tue, 23 Sep 2008) | 1 line
Support fb_mode and fb_device options
........
r5420 | dsilvers | 2008-09-23 14:21:48 +0100 (Tue, 23 Sep 2008) | 1 line
Support option_fb_device in the able frontend
........
r5421 | dsilvers | 2008-09-23 14:25:17 +0100 (Tue, 23 Sep 2008) | 1 line
Ensure target_blank is disabled
........
r5422 | dsilvers | 2008-09-23 14:39:00 +0100 (Tue, 23 Sep 2008) | 1 line
Rework linux fb frontend to support scanning and opening all event devices for input
........
svn path=/trunk/netsurf/; revision=5423
Diffstat (limited to 'framebuffer/fb_gui.c')
-rw-r--r-- | framebuffer/fb_gui.c | 554 |
1 files changed, 554 insertions, 0 deletions
diff --git a/framebuffer/fb_gui.c b/framebuffer/fb_gui.c new file mode 100644 index 000000000..04ae9a7df --- /dev/null +++ b/framebuffer/fb_gui.c @@ -0,0 +1,554 @@ +/* + * Copyright 2008 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/>. + */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <unistd.h> + +#include "desktop/gui.h" +#include "desktop/plotters.h" +#include "desktop/netsurf.h" +#include "desktop/options.h" +#include "utils/log.h" +#include "utils/messages.h" + +#include "framebuffer/fb_bitmap.h" +#include "framebuffer/fb_gui.h" +#include "framebuffer/fb_frontend.h" +#include "framebuffer/fb_plotters.h" +#include "framebuffer/fb_schedule.h" +#include "framebuffer/fb_cursor.h" +#include "framebuffer/fb_findfile.h" + +#include "content/urldb.h" +#include "desktop/history_core.h" +#include "content/fetch.h" + +char *default_stylesheet_url; +char *adblock_stylesheet_url; +struct gui_window *input_window = NULL; +struct gui_window *search_current_window; +struct gui_window *window_list = NULL; + +bool redraws_pending = false; + +framebuffer_t *framebuffer; + +static void fb_queue_redraw(struct gui_window *g, int x0, int y0, int x1, int y1); + +static void fb_pan(struct gui_window *g) +{ + struct content *c; + + if (!g) + return; + + c = g->bw->current_content; + + if (!c) return; + if (c->locked) return; + + LOG(("panning %d, %d from %d, %d in content %d,%d",g->panx, g->pany,g->scrollx,g->scrolly,c->width, c->height)); + /* dont pan off the top */ + if ((g->scrolly + g->pany) < 0) + g->pany = -g->scrolly; + + /* do not pan off the bottom of the content */ + if ((g->scrolly + g->pany) > (c->height - g->height)) + g->pany = (c->height - g->height) - g->scrolly; + + LOG(("panning %d, %d",g->panx, g->pany)); + + /* pump up the volume. dance, dance! lets do it */ + if (g->pany < 0) { + /* we cannot pan more than a window height at a time */ + if (g->pany < -g->height) + g->pany = -g->height; + + LOG(("panning up %d", g->pany)); + + fb_plotters_move_block(g->x, g->y, + g->width, g->height + g->pany, + g->x, g->y - g->pany); + g->scrolly += g->pany; + fb_queue_redraw(g, g->x, g->y, + g->x + g->width, g->y - g->pany); + } + if (g->pany > 0) { + /* we cannot pan more than a window height at a time */ + if (g->pany > g->height) + g->pany = g->height; + + LOG(("panning down %d", g->pany)); + + fb_plotters_move_block(g->x, g->y + g->pany, g->width, g->height - g->pany, g->x, g->y); + g->scrolly += g->pany; + fb_queue_redraw(g, g->x, g->y + g->height - g->pany, + g->x + g->width, g->y + g->height); + } + + g->pan_required = false; + g->panx = 0; + g->pany = 0; +} + +static void fb_redraw(struct gui_window *g) +{ + struct content *c; + + if (!g) + return; + + c = g->bw->current_content; + + if (!c) return; + if (c->locked) return; + + content_redraw(c, 0, -g->scrolly, g->width, g->height, + g->redraw_box.x0, g->redraw_box.y0, g->redraw_box.x1, g->redraw_box.y1, + g->bw->scale, 0xFFFFFF); + + g->redraw_required = false; + g->redraw_box.y0 = g->redraw_box.x0 = INT_MAX; + g->redraw_box.y1 = g->redraw_box.x1 = -(INT_MAX); + g->panx = 0; + g->pany = 0; + redraws_pending = false; +} + + +void gui_init(int argc, char** argv) +{ + LOG(("argc %d, argv %p", argc, argv)); + + /* load browser messages */ + messages_load(fb_findfile("messages")); + + /* load browser options */ + options_read(fb_findfile("Options")); + + default_stylesheet_url = fb_findfile_asurl("default.css"); + + framebuffer = fb_os_init(argc, argv); + + fb_os_option_override(); + + option_target_blank = false; + + switch (framebuffer->bpp) { + /* case 1: + plot = framebuffer_1bpp_plot; + break; + */ + case 8: + plot = framebuffer_8bpp_plot; + break; + + case 16: + plot = framebuffer_16bpp_plot; + break; + + case 32: + plot = framebuffer_32bpp_plot; + break; + + default: + LOG(("Unsupported bit depth (%d)", framebuffer->bpp)); + exit(1); + } + + framebuffer->cursor = fb_cursor_init(framebuffer); +} + +void gui_init2(int argc, char** argv) +{ + struct browser_window *bw; + const char *addr = NETSURF_HOMEPAGE; + + LOG(("%s(%d, %p)", __func__, argc, argv)); + + if (option_homepage_url != NULL && option_homepage_url[0] != '\0') + addr = option_homepage_url; + + if (argc > 1) addr = argv[1]; + + LOG(("%s: calling browser_window_create", __func__)); + bw = browser_window_create(addr, 0, 0, true, false); +} + + +void gui_multitask(void) +{ + // LOG(("gui_multitask")); +} + + +void gui_poll(bool active) +{ + // LOG(("enter fetch_poll")); + if (active) + fetch_poll(); + //LOG(("enter schedule run")); + schedule_run(); + + + fb_os_input(input_window); + + if (redraws_pending == true) { + struct gui_window *g; + + fb_cursor_move(framebuffer, 0,0); + + redraws_pending = false; + + for (g = window_list; g != NULL; g = g->next) { + if (g->pan_required == true) { + fb_pan(g); + } + if (g->redraw_required == true) { + fb_redraw(g); + } + } + } + + fb_cursor_plot(framebuffer); +} + +void gui_quit(void) +{ + LOG(("gui_quit")); + fb_os_quit(framebuffer); +} + + +struct gui_window *gui_create_browser_window(struct browser_window *bw, + struct browser_window *clone, + bool new_tab) +{ + struct gui_window *g, *p; + LOG(("bw %p, clone %p", bw, clone)); + + g = calloc(1, sizeof(struct gui_window)); + if (g == NULL) + return NULL; + + g->x = 0; + g->y = 0; + g->width = framebuffer->width; + g->height = framebuffer->height; + g->bw = bw; + + if (window_list == NULL) { + window_list = input_window = g; + } else { + for(p = window_list; p->next != NULL; p = p->next); + p->next = g; + g->prev = p; + } + + return g; +} + +void gui_window_destroy(struct gui_window *g) +{ + LOG(("g %p", g)); + + if (g->prev == NULL) { + window_list = input_window = g->next; + } else { + g->prev->next = g->next; + } + if (g->next != NULL) + g->next->prev = g->prev; + + free(g); + + if (window_list == NULL) + netsurf_quit = true; + +} + +void gui_window_set_title(struct gui_window *g, const char *title) +{ + LOG(("%s(%p, %s)", __func__, g, title)); +} + +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +static void fb_queue_redraw(struct gui_window *g, int x0, int y0, int x1, int y1) +{ + if (!g) return; + + LOG(("%p, %d, %d, %d, %d", g, x0 , y0, x1, y1)); + + g->redraw_box.x0 = MIN(g->redraw_box.x0, x0); + g->redraw_box.y0 = MIN(g->redraw_box.y0, y0); + g->redraw_box.x1 = MAX(g->redraw_box.x1, x1); + g->redraw_box.y1 = MAX(g->redraw_box.y1, y1); + + redraws_pending = true; + g->redraw_required = true; +} + +static void fb_queue_pan(struct gui_window *g, int x, int y) +{ + if (!g) return; + + LOG(("%p, x %d, y %d", g, x , y)); + + g->panx +=x; + g->pany +=y; + + redraws_pending = true; + g->pan_required = true; +} + +void fb_window_scroll(struct gui_window *g, int x, int y) +{ + fb_queue_pan(g, x, y); +} + +void gui_window_redraw(struct gui_window *g, int x0, int y0, int x1, int y1) +{ + if (!g) return; + + fb_queue_redraw(g, x0, y0, x1, y1); +} + +void gui_window_redraw_window(struct gui_window *g) +{ + if (!g) return; + + fb_queue_redraw(g, 0, 0, g->width, g->height); +} + +void gui_window_update_box(struct gui_window *g, + const union content_msg_data *data) +{ + struct content *c; + + if (!g) return; + + c = g->bw->current_content; + + if (c == NULL) return; + + gui_window_redraw(g, data->redraw.x, data->redraw.y, data->redraw.x + data->redraw.width, data->redraw.y + data->redraw.height); +} + +bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy) +{ + LOG(("g %p, sx %d, sy%d", g, *sx, *sy)); + *sx=0; + *sy=g->scrolly; + + return true; +} + +void gui_window_set_scroll(struct gui_window *g, int sx, int sy) +{ + LOG(("%s:(%p, %d, %d)", __func__, g, sx, sy)); + g->scrolly = sy; +} + +void gui_window_scroll_visible(struct gui_window *g, int x0, int y0, + int x1, int y1) +{ + LOG(("%s:(%p, %d, %d, %d, %d)", __func__, g, x0, y0, x1, y1)); +} + +void gui_window_position_frame(struct gui_window *g, int x0, int y0, + int x1, int y1) +{ + LOG(("%p, %d, %d, %d, %d", g, x0, y0, x1, y1)); +} + +void gui_window_get_dimensions(struct gui_window *g, int *width, int *height, + bool scaled) +{ + LOG(("%p, %d, %d, %d", g, *width, *height, scaled)); + *width = g->width; + *height = g->height; + +} + +void gui_window_update_extent(struct gui_window *g) +{ + LOG(("g %p", g)); +} + +void gui_window_set_status(struct gui_window *g, const char *text) +{ + LOG(("g %p, text %s", g, text)); + +} + +void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape) +{ +} + +void gui_window_hide_pointer(struct gui_window *g) +{ +} + +void gui_window_set_url(struct gui_window *g, const char *url) +{ +} + +void gui_window_start_throbber(struct gui_window *g) +{ +} + +void gui_window_stop_throbber(struct gui_window *g) +{ +} + +void gui_window_place_caret(struct gui_window *g, int x, int y, int height) +{ +} + +void gui_window_remove_caret(struct gui_window *g) +{ +} + +void gui_window_new_content(struct gui_window *g) +{ +} + +bool gui_window_scroll_start(struct gui_window *g) +{ + return true; +} + +bool gui_window_box_scroll_start(struct gui_window *g, + int x0, int y0, int x1, int y1) +{ + return true; +} + +bool gui_window_frame_resize_start(struct gui_window *g) +{ + printf("resize frame\n"); + return true; +} + +void gui_window_save_as_link(struct gui_window *g, struct content *c) +{ +} + +void gui_window_set_scale(struct gui_window *g, float scale) +{ + printf("set scale\n"); +} + +struct gui_download_window *gui_download_window_create(const char *url, + const char *mime_type, struct fetch *fetch, + unsigned int total_size, struct gui_window *gui) +{ + return NULL; +} + +void gui_download_window_data(struct gui_download_window *dw, const char *data, + unsigned int size) +{ +} + +void gui_download_window_error(struct gui_download_window *dw, + const char *error_msg) +{ +} + +void gui_download_window_done(struct gui_download_window *dw) +{ +} + +void gui_drag_save_object(gui_save_type type, struct content *c, + struct gui_window *g) +{ +} + +void gui_drag_save_selection(struct selection *s, struct gui_window *g) +{ +} + +void gui_start_selection(struct gui_window *g) +{ +} + +void gui_paste_from_clipboard(struct gui_window *g, int x, int y) +{ +} + +bool gui_empty_clipboard(void) +{ + return false; +} + +bool gui_add_to_clipboard(const char *text, size_t length, bool space) +{ + return false; +} + +bool gui_commit_clipboard(void) +{ + return false; +} + +bool gui_copy_to_clipboard(struct selection *s) +{ + return false; +} + +void gui_create_form_select_menu(struct browser_window *bw, + struct form_control *control) +{ +} + +void gui_launch_url(const char *url) +{ +} + +bool gui_search_term_highlighted(struct gui_window *g, + unsigned start_offset, unsigned end_offset, + unsigned *start_idx, unsigned *end_idx) +{ + return false; +} + + + +#ifdef WITH_SSL +void gui_cert_verify(struct browser_window *bw, struct content *c, + const struct ssl_cert_info *certs, unsigned long num) +{ +} +#endif + +/* + * Local Variables: + * c-basic-offset:8 + * End: + */ |