diff options
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: + */ |