summaryrefslogtreecommitdiff
path: root/framebuffer/fb_gui.c
diff options
context:
space:
mode:
Diffstat (limited to 'framebuffer/fb_gui.c')
-rw-r--r--framebuffer/fb_gui.c760
1 files changed, 544 insertions, 216 deletions
diff --git a/framebuffer/fb_gui.c b/framebuffer/fb_gui.c
index 276aba62d..80fcc8c3d 100644
--- a/framebuffer/fb_gui.c
+++ b/framebuffer/fb_gui.c
@@ -34,15 +34,16 @@
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
+#include "desktop/textinput.h"
-#include "framebuffer/fb_bitmap.h"
#include "framebuffer/fb_gui.h"
+#include "framebuffer/fb_tk.h"
+#include "framebuffer/fb_bitmap.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 "framebuffer/fb_rootwindow.h"
#include "framebuffer/fb_image_data.h"
#include "framebuffer/fb_font.h"
@@ -53,6 +54,9 @@
char *default_stylesheet_url;
char *adblock_stylesheet_url;
char *options_file_location;
+
+fbtk_widget_t *fbtk;
+
struct gui_window *input_window = NULL;
struct gui_window *search_current_window;
struct gui_window *window_list = NULL;
@@ -61,141 +65,209 @@ bool redraws_pending = false;
framebuffer_t *framebuffer;
-static void fb_queue_redraw(struct gui_window *g, int x0, int y0, int x1, int y1);
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+/* private data for browser user widget */
+struct browser_widget_s {
+ struct browser_window *bw; /**< The browser window connected to this gui window */
+ int scrollx, scrolly; /**< scroll offsets. */
+
+ /* Pending window redraw state. */
+ bool redraw_required; /**< flag indicating the foreground loop
+ * needs to redraw the browser widget.
+ */
+ bbox_t redraw_box; /**< Area requiring redraw. */
+ bool pan_required; /**< flag indicating the foreground loop
+ * needs to pan the window.
+ */
+ int panx, pany; /**< Panning required. */
+};
-static void fb_pan(struct gui_window *g)
+
+/* queue a redraw operation, co-ordinates are relative to the window */
+static void
+fb_queue_redraw(struct fbtk_widget_s *widget, int x0, int y0, int x1, int y1)
+{
+ struct browser_widget_s *bwidget = fbtk_get_userpw(widget);
+
+ bwidget->redraw_box.x0 = MIN(bwidget->redraw_box.x0, x0);
+ bwidget->redraw_box.y0 = MIN(bwidget->redraw_box.y0, y0);
+ bwidget->redraw_box.x1 = MAX(bwidget->redraw_box.x1, x1);
+ bwidget->redraw_box.y1 = MAX(bwidget->redraw_box.y1, y1);
+
+ bwidget->redraw_required = true;
+
+ fbtk_request_redraw(widget);
+}
+
+static void fb_pan(fbtk_widget_t *widget,
+ struct browser_widget_s *bwidget,
+ struct browser_window *bw)
{
struct content *c;
+ int x;
+ int y;
+ int width;
+ int height;
- if (!g)
- return;
+ c = bw->current_content;
- c = g->bw->current_content;
+ if ((!c) || (c->locked))
+ return;
- if (!c) return;
- if (c->locked) return;
+ height = fbtk_get_height(widget);
+ width = fbtk_get_width(widget);
+ x = fbtk_get_x(widget);
+ y = fbtk_get_y(widget);
- 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;
+ if ((bwidget->scrolly + bwidget->pany) < 0)
+ bwidget->pany = - bwidget->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;
+ if ((bwidget->scrolly + bwidget->pany) > (c->height - height))
+ bwidget->pany = (c->height - height) - bwidget->scrolly;
/* dont pan off the left */
- if ((g->scrollx + g->panx) < 0)
- g->panx = - g->scrollx;
+ if ((bwidget->scrollx + bwidget->panx) < 0)
+ bwidget->panx = - bwidget->scrollx;
/* do not pan off the right of the content */
- if ((g->scrollx + g->panx) > (c->width - g->width))
- g->panx = (c->width - g->width) - g->scrollx;
+ if ((bwidget->scrollx + bwidget->panx) > (c->width - width))
+ bwidget->panx = (c->width - width) - bwidget->scrollx;
- LOG(("panning %d, %d",g->panx, g->pany));
+ LOG(("panning %d, %d",bwidget->panx, bwidget->pany));
/* pump up the volume. dance, dance! lets do it */
- if (g->pany < 0) {
+ if (bwidget->pany < 0) {
/* we cannot pan more than a window height at a time */
- if (g->pany < -g->height)
- g->pany = -g->height;
+ if (bwidget->pany < -height)
+ bwidget->pany = -height;
- LOG(("panning up %d", g->pany));
+ LOG(("panning up %d", bwidget->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, 0, 0,
- g->width, - g->pany);
+ fb_plotters_move_block(x, y,
+ width, height + bwidget->pany,
+ x, y - bwidget->pany);
+ bwidget->scrolly += bwidget->pany;
+ fb_queue_redraw(widget, 0, 0, width, - bwidget->pany);
}
- if (g->pany > 0) {
+
+ if (bwidget->pany > 0) {
/* we cannot pan more than a window height at a time */
- if (g->pany > g->height)
- g->pany = g->height;
+ if (bwidget->pany > height)
+ bwidget->pany = height;
- LOG(("panning down %d", g->pany));
+ LOG(("panning down %d", bwidget->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, 0, g->height - g->pany,
- g->width, g->height);
+ fb_plotters_move_block(x, y + bwidget->pany,
+ width, height - bwidget->pany,
+ x, y);
+ bwidget->scrolly += bwidget->pany;
+ fb_queue_redraw(widget, 0, height - bwidget->pany, width, height);
}
- if (g->panx < 0) {
+ if (bwidget->panx < 0) {
/* we cannot pan more than a window width at a time */
- if (g->panx < -g->width)
- g->panx = -g->width;
+ if (bwidget->panx < -width)
+ bwidget->panx = -width;
- LOG(("panning left %d", g->panx));
+ LOG(("panning left %d", bwidget->panx));
- fb_plotters_move_block(g->x, g->y,
- g->width + g->panx, g->height ,
- g->x - g->panx, g->y );
- g->scrollx += g->panx;
- fb_queue_redraw(g, 0, 0,
- - g->panx, g->height);
+ fb_plotters_move_block(x, y,
+ width + bwidget->panx, height ,
+ x - bwidget->panx, y );
+ bwidget->scrollx += bwidget->panx;
+ fb_queue_redraw(widget, 0, 0, -bwidget->panx, height);
}
- if (g->panx > 0) {
+ if (bwidget->panx > 0) {
/* we cannot pan more than a window width at a time */
- if (g->panx > g->width)
- g->panx = g->width;
+ if (bwidget->panx > width)
+ bwidget->panx = width;
- LOG(("panning right %d", g->panx));
+ LOG(("panning right %d", bwidget->panx));
- fb_plotters_move_block(g->x + g->panx, g->y,
- g->width - g->panx, g->height,
- g->x, g->y);
- g->scrollx += g->panx;
- fb_queue_redraw(g, g->width - g->panx, 0,
- g->width, g->height);
+ fb_plotters_move_block(x + bwidget->panx, y,
+ width - bwidget->panx, height,
+ x, y);
+ bwidget->scrollx += bwidget->panx;
+ fb_queue_redraw(widget, width - bwidget->panx, 0, width, height);
}
- g->pan_required = false;
- g->panx = 0;
- g->pany = 0;
+
+ bwidget->pan_required = false;
+ bwidget->panx = 0;
+ bwidget->pany = 0;
}
-static void fb_redraw(struct gui_window *g)
+static void fb_redraw(fbtk_widget_t *widget,
+ struct browser_widget_s *bwidget,
+ struct browser_window *bw)
{
struct content *c;
+ int x;
+ int y;
+ int width;
+ int height;
- if (!g)
- return;
+ c = bw->current_content;
- c = g->bw->current_content;
+ if ((!c) || (c->locked))
+ return;
- if (!c) return;
- if (c->locked) return;
+ height = fbtk_get_height(widget);
+ width = fbtk_get_width(widget);
+ x = fbtk_get_x(widget);
+ y = fbtk_get_y(widget);
/* adjust clipping co-ordinates according to window location */
- g->redraw_box.y0 += g->y;
- g->redraw_box.y1 += g->y;
- g->redraw_box.x0 += g->x;
- g->redraw_box.x1 += g->x;
+ bwidget->redraw_box.y0 += y;
+ bwidget->redraw_box.y1 += y;
+ bwidget->redraw_box.x0 += x;
+ bwidget->redraw_box.x1 += x;
/* redraw bounding box is relative to window */
content_redraw(c,
- g->x - g->scrollx,
- g->y - 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);
+ x - bwidget->scrollx, y - bwidget->scrolly,
+ width, height,
+ bwidget->redraw_box.x0, bwidget->redraw_box.y0,
+ bwidget->redraw_box.x1, bwidget->redraw_box.y1,
+ bw->scale, 0xFFFFFF);
- fb_os_redraw(&g->redraw_box);
+ fb_os_redraw(&bwidget->redraw_box);
+
+ bwidget->redraw_box.y0 = bwidget->redraw_box.x0 = INT_MAX;
+ bwidget->redraw_box.y1 = bwidget->redraw_box.x1 = -(INT_MAX);
+ bwidget->redraw_required = false;
+}
+
+static int
+fb_browser_window_redraw(fbtk_widget_t *widget, void *pw)
+{
+ struct gui_window *gw = pw;
+ struct browser_widget_s *bwidget;
- 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;
+ bwidget = fbtk_get_userpw(widget);
+
+ if (bwidget->pan_required) {
+ int pos;
+ fb_pan(widget, bwidget, gw->bw);
+ pos = (bwidget->scrollx * 100) / gw->bw->current_content->width;;
+ fbtk_set_scroll_pos(gw->hscroll, pos);
+
+ }
+
+ if (bwidget->redraw_required) {
+ fb_redraw(widget, bwidget, gw->bw);
+ }
+ return 0;
}
#ifdef WITH_HUBBUB
@@ -268,6 +340,7 @@ void gui_init(int argc, char** argv)
if (fb_font_init() == false)
die("Unable to initialise the font system");
+ fbtk = fbtk_init(framebuffer);
}
void gui_init2(int argc, char** argv)
@@ -282,8 +355,6 @@ void gui_init2(int argc, char** argv)
if (argc > 1) addr = argv[1];
- fb_rootwindow_create(framebuffer);
-
LOG(("calling browser_window_create"));
bw = browser_window_create(addr, 0, 0, true, false);
}
@@ -301,31 +372,12 @@ void gui_poll(bool active)
if (active)
fetch_poll();
- //LOG(("enter schedule run"));
active = schedule_run() | active | redraws_pending;
- fb_os_input(input_window, active);
-
- if (redraws_pending == true) {
- struct gui_window *g;
-
- fb_cursor_move(framebuffer,
- fb_cursor_x(framebuffer),
- fb_cursor_y(framebuffer));
+ fb_os_input(fbtk, active);
- redraws_pending = false;
+ fbtk_redraw(fbtk);
- 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)
@@ -340,162 +392,361 @@ void gui_quit(void)
/* called back when click in browser window */
static int
-fb_browser_window_click(struct gui_window *g, browser_mouse_state st, int x, int y)
+fb_browser_window_click(fbtk_widget_t *widget,
+ browser_mouse_state st,
+ int x, int y,
+ void *pw)
{
+ struct browser_window *bw = pw;
+ struct browser_widget_s *bwidget = fbtk_get_userpw(widget);
+
LOG(("browser window clicked at %d,%d",x,y));
- browser_window_mouse_click(g->bw,
+ browser_window_mouse_click(bw,
st,
- x + g->scrollx,
- y + g->scrolly);
+ x + bwidget->scrollx,
+ y + bwidget->scrolly);
+ return 0;
+}
+
+/* called back when movement in browser window */
+static int
+fb_browser_window_move(fbtk_widget_t *widget,
+ int x, int y,
+ void *pw)
+{
+ struct browser_window *bw = pw;
+ struct browser_widget_s *bwidget = fbtk_get_userpw(widget);
+
+ browser_window_mouse_track(bw,
+ 0,
+ x + bwidget->scrollx,
+ y + bwidget->scrolly);
+
return 0;
}
static int
-fb_browser_window_input(fb_widget_t *widget, struct gui_window *g, int value)
+fb_browser_window_input(fbtk_widget_t *widget, int value, void *pw)
{
+ struct gui_window *gw = pw;
+ int res = 0;
LOG(("got value %d",value));
- if (value >= 0)
- return browser_window_key_press(g->bw, value);
+ switch (value) {
+
+ case KEY_PAGE_UP:
+ fb_window_scroll(gw, 0, -fbtk_get_height(gw->browser));
+ break;
+
+ case KEY_PAGE_DOWN:
+ fb_window_scroll(gw, 0, fbtk_get_height(gw->browser));
+ break;
+
+ case KEY_RIGHT:
+ fb_window_scroll(gw, 100, 0);
+ break;
+
+ case KEY_LEFT:
+ fb_window_scroll(gw, -100, 0);
+ break;
+
+ case KEY_UP:
+ fb_window_scroll(gw, 0, -100);
+ break;
+
+ case KEY_DOWN:
+ fb_window_scroll(gw, 0, 100);
+ break;
+
+ default:
+ res = browser_window_key_press(gw->bw, value);
+ break;
+ }
+
return 0;
}
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+/* left icon click routine */
+static int
+fb_leftarrow_click(fbtk_widget_t *widget,
+ browser_mouse_state st,
+ int x, int y, void *pw)
{
- struct gui_window *g, *p;
- LOG(("bw %p, clone %p", bw, clone));
-
- g = calloc(1, sizeof(struct gui_window));
- if (g == NULL)
- return NULL;
+ struct browser_window *bw = pw;
- g->x = 0;
- g->y = 30;
- g->width = framebuffer->width;
- g->height = framebuffer->height - 50;
- g->bw = bw;
-
- if (window_list == NULL) {
- window_list = input_window = g;
- fb_add_window_widget(g, 0, fb_browser_window_click, fb_browser_window_input);
- } else {
- for (p = window_list; p->next != NULL; p = p->next);
- p->next = g;
- g->prev = p;
+ if (st == BROWSER_MOUSE_CLICK_1) {
+ if (history_back_available(bw->history))
+ history_back(bw, bw->history);
}
+ return 0;
- return g;
}
-void gui_window_destroy(struct gui_window *g)
+/* right arrow icon click routine */
+static int
+fb_rightarrow_click(fbtk_widget_t *widget, browser_mouse_state st, int x, int y, void *pw)
{
- LOG(("g %p", g));
+ struct browser_window *bw = pw;
- if (g->prev == NULL) {
- window_list = input_window = g->next;
- } else {
- g->prev->next = g->next;
+ if (st == BROWSER_MOUSE_CLICK_1) {
+ if (history_forward_available(bw->history))
+ history_forward(bw, bw->history);
}
- if (g->next != NULL)
- g->next->prev = g->prev;
+ return 0;
- free(g);
+}
- if (window_list == NULL)
- netsurf_quit = true;
+/* reload icon click routine */
+static int
+fb_reload_click(fbtk_widget_t *widget, browser_mouse_state st, int x, int y, void *pw)
+{
+ struct browser_window *bw = pw;
+ browser_window_reload(bw, true);
+ return 0;
+}
+/* stop icon click routine */
+static int
+fb_stop_click(fbtk_widget_t *widget, browser_mouse_state st, int x, int y, void *pw)
+{
+ struct browser_window *bw = pw;
+ browser_window_stop(bw);
+ return 0;
}
-void gui_window_set_title(struct gui_window *g, const char *title)
+/* left scroll icon click routine */
+static int
+fb_scrolll_click(fbtk_widget_t *widget, browser_mouse_state st, int x, int y, void *pw)
{
- LOG(("%s(%p, %s)", __func__, g, title));
+ fbtk_input(widget, KEY_LEFT);
+ return 0;
}
-#ifndef MIN
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-#endif
+static int
+fb_scrollr_click(fbtk_widget_t *widget, browser_mouse_state st, int x, int y, void *pw)
+{
+ fbtk_input(widget, KEY_RIGHT);
+ return 0;
+}
-#ifndef MAX
-#define MAX(a,b) (((a) > (b)) ? (a) : (b))
-#endif
+static int
+fb_url_enter(void *pw, char *text)
+{
+ struct browser_window *bw = pw;
+ browser_window_go(bw, text, 0, true);
+ return 0;
+}
-/* queue a redraw operation, co-ordinates are relative to the window */
-static void
-fb_queue_redraw(struct gui_window *g, int x0, int y0, int x1, int y1)
+static int
+fb_url_move(fbtk_widget_t *widget,
+ int x, int y,
+ void *pw)
{
- if (!g) return;
+ fb_cursor_set(framebuffer->cursor, &caret_image);
+ return 0;
+}
+
+static int
+set_ptr_default_move(fbtk_widget_t *widget,
+ int x, int y,
+ void *pw)
+{
+ fb_cursor_set(framebuffer->cursor, &pointer_image);
+ return 0;
+}
+
+static int
+set_ptr_hand_move(fbtk_widget_t *widget,
+ int x, int y,
+ void *pw)
+{
+ fb_cursor_set(framebuffer->cursor, &hand_image);
+ return 0;
+}
+
+struct gui_window *
+gui_create_browser_window(struct browser_window *bw,
+ struct browser_window *clone,
+ bool new_tab)
+{
+ struct gui_window *gw;
+ struct browser_widget_s *browser_widget;
+ fbtk_widget_t *widget;
+ int top = 0;
+ int bot = 0;
+
+ gw = calloc(1, sizeof(struct gui_window));
+
+ if (gw == NULL)
+ return NULL;
+
+ /* seems we need to associate the gui window with the underlying
+ * browser window
+ */
+ gw->bw = bw;
+
+
+ switch(bw->browser_window_type) {
+ case BROWSER_WINDOW_NORMAL:
+ gw->window = fbtk_create_window(fbtk, 0, 0, 0, 0);
+
+ top = 30;
+ bot = -50;
+
+ LOG(("Normal window"));
+
+ /* fill toolbar background */
+ widget = fbtk_create_fill(gw->window, 0, 0, 0, 30, FB_FRAME_COLOUR);
+ fbtk_set_handler_move(widget, set_ptr_default_move, bw);
+
+ /* back button */
+ widget = fbtk_create_button(gw->window, 5, 2, FB_FRAME_COLOUR, &left_arrow, fb_leftarrow_click, bw);
+ fbtk_set_handler_move(widget, set_ptr_hand_move, bw);
+
+ /* forward button */
+ widget = fbtk_create_button(gw->window, 35, 2, FB_FRAME_COLOUR, &right_arrow, fb_rightarrow_click, bw);
+ fbtk_set_handler_move(widget, set_ptr_hand_move, bw);
+
+ /* reload button */
+ widget = fbtk_create_button(gw->window, 65, 2, FB_FRAME_COLOUR, &stop_image, fb_stop_click, bw);
+ fbtk_set_handler_move(widget, set_ptr_hand_move, bw);
- LOG(("%p, %d, %d, %d, %d", g, x0 , y0, x1, y1));
+ /* reload button */
+ widget = fbtk_create_button(gw->window, 95, 2, FB_FRAME_COLOUR, &reload, fb_reload_click, bw);
+ fbtk_set_handler_move(widget, set_ptr_hand_move, bw);
- 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);
+ /* url widget */
+ gw->url = fbtk_create_writable_text(gw->window,
+ 125 , 3,
+ fbtk_get_width(gw->window) - 160, 24,
+ FB_COLOUR_WHITE,
+ FB_COLOUR_BLACK,
+ true,
+ fb_url_enter,
+ bw);
+ fbtk_set_handler_move(gw->url, fb_url_move, bw);
- redraws_pending = true;
- g->redraw_required = true;
+ gw->throbber = fbtk_create_bitmap(gw->window,
+ 130 + fbtk_get_width(gw->url),
+ 3,
+ FB_FRAME_COLOUR,
+ &throbber0);
+
+
+
+ /* add status area widget, width of framebuffer less some for
+ * scrollbar
+ */
+ gw->status = fbtk_create_text(gw->window,
+ 0 , fbtk_get_height(gw->window) - 20,
+ fbtk_get_width(gw->window) - 200, 20,
+ FB_FRAME_COLOUR, FB_COLOUR_BLACK,
+ false);
+
+ fbtk_set_handler_move(gw->status, set_ptr_default_move, bw);
+
+
+ fbtk_create_button(gw->window, fbtk_get_width(gw->window) - 200, fbtk_get_height(gw->window) - 20, FB_FRAME_COLOUR, &scrolll, fb_scrolll_click, bw);
+ fbtk_create_button(gw->window, fbtk_get_width(gw->window) - 20, fbtk_get_height(gw->window) - 20, FB_FRAME_COLOUR, &scrollr, fb_scrollr_click, bw);
+
+ gw->hscroll = fbtk_create_hscroll(gw->window,
+ fbtk_get_width(gw->window) - 180,
+ fbtk_get_height(gw->window) - 20,
+ 160,
+ 20,
+ FB_COLOUR_BLACK,
+ FB_FRAME_COLOUR);
+
+ break;
+
+ case BROWSER_WINDOW_FRAME:
+ gw->window = fbtk_create_window(bw->parent->window->window, 0, 0, 0, 0);
+ LOG(("create frame"));
+ break;
+
+ default:
+ gw->window = fbtk_create_window(bw->parent->window->window, 0, 0, 0, 0);
+ LOG(("unhandled type"));
+
+ }
+
+ browser_widget = calloc(1, sizeof(struct browser_widget_s));
+
+ gw->browser = fbtk_create_user(gw->window, 0, top, 0, bot, browser_widget);
+
+ fbtk_set_handler_click(gw->browser, fb_browser_window_click, bw);
+ fbtk_set_handler_input(gw->browser, fb_browser_window_input, gw);
+ fbtk_set_handler_redraw(gw->browser, fb_browser_window_redraw, gw);
+ fbtk_set_handler_move(gw->browser, fb_browser_window_move, bw);
+
+ return gw;
}
-static void fb_queue_pan(struct gui_window *g, int x, int y)
+void gui_window_destroy(struct gui_window *gw)
{
- if (!g) return;
+ fbtk_destroy_widget(gw->window);
- LOG(("%p, x %d, y %d", g, x , y));
+ free(gw);
- g->panx +=x;
- g->pany +=y;
- redraws_pending = true;
- g->pan_required = true;
}
+void gui_window_set_title(struct gui_window *g, const char *title)
+{
+ LOG(("%p, %s", g, title));
+}
+
+
+
void fb_window_scroll(struct gui_window *g, int x, int y)
{
- fb_queue_pan(g, x, y);
+ struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
+
+ bwidget->panx += x;
+ bwidget->pany += y;
+ bwidget->pan_required = true;
+
+ fbtk_request_redraw(g->browser);
}
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);
+ fb_queue_redraw(g->browser, 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);
+ fb_queue_redraw(g->browser, 0, 0, fbtk_get_width(g->browser),fbtk_get_height(g->browser) );
}
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);
+ fb_queue_redraw(g->browser,
+ 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;
+ struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
+
+ *sx = bwidget->scrollx;
+ *sy = bwidget->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;
+ struct browser_widget_s *bwidget = fbtk_get_userpw(g->browser);
+ LOG(("scroll %d",sx));
+ bwidget->panx = sx;
+ bwidget->pany = sy;
+ bwidget->pan_required = true;
+
+ fbtk_request_redraw(g->browser);
}
void gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
@@ -507,36 +758,49 @@ void gui_window_scroll_visible(struct gui_window *g, int x0, int y0,
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));
+ struct gui_window *parent;
+ int px, py;
+ int w, h;
+ LOG(("%s: %d, %d, %d, %d", g->bw->name, x0, y0, x1, y1));
+ parent = g->bw->parent->window;
+
+ if (parent->window == NULL)
+ return; /* doesnt have an fbtk widget */
+
+ px = fbtk_get_x(parent->browser) + x0;
+ py = fbtk_get_y(parent->browser) + y0;
+ w = x1 - x0;
+ h = y1 - y0;
+ if (w > (fbtk_get_width(parent->browser) - px))
+ w = fbtk_get_width(parent->browser) - px;
+
+ if (h > (fbtk_get_height(parent->browser) - py))
+ h = fbtk_get_height(parent->browser) - py;
+
+ fbtk_set_pos_and_size(g->window, px, py , w , h);
+
+ fbtk_request_redraw(parent->browser);
+
}
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;
-
+ *width = fbtk_get_width(g->browser);
+ *height = fbtk_get_height(g->browser);
}
void gui_window_update_extent(struct gui_window *g)
{
- LOG(("g %p", g));
+ int pct;
+
+ pct = (fbtk_get_width(g->browser) * 100) / g->bw->current_content->width;
+ fbtk_set_scroll(g->hscroll, pct);
}
void gui_window_set_status(struct gui_window *g, const char *text)
{
- static char *cur_text = NULL;
-
- if (cur_text != NULL) {
- if (strcmp(cur_text, text) == 0)
- return;
-
- free(cur_text);
- }
- cur_text = strdup(text);
-
- fb_rootwindow_status(text);
+ fbtk_set_text(g->status, text);
}
void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
@@ -561,15 +825,79 @@ void gui_window_hide_pointer(struct gui_window *g)
void gui_window_set_url(struct gui_window *g, const char *url)
{
- fb_rootwindow_url(url);
+ fbtk_set_text(g->url, url);
+}
+
+static void
+throbber_advance(void *pw)
+{
+ struct gui_window *g = pw;
+ struct bitmap *image;
+
+ switch (g->throbber_index) {
+ case 0:
+ image = &throbber1;
+ g->throbber_index = 1;
+ break;
+
+ case 1:
+ image = &throbber2;
+ g->throbber_index = 2;
+ break;
+
+ case 2:
+ image = &throbber3;
+ g->throbber_index = 3;
+ break;
+
+ case 3:
+ image = &throbber4;
+ g->throbber_index = 4;
+ break;
+
+ case 4:
+ image = &throbber5;
+ g->throbber_index = 5;
+ break;
+
+ case 5:
+ image = &throbber6;
+ g->throbber_index = 6;
+ break;
+
+ case 6:
+ image = &throbber7;
+ g->throbber_index = 7;
+ break;
+
+ case 7:
+ image = &throbber8;
+ g->throbber_index = 8;
+ break;
+
+ case 8:
+ image = &throbber0;
+ g->throbber_index = 0;
+ break;
+
+ }
+
+ if (g->throbber_index >= 0) {
+ fbtk_set_bitmap(g->throbber, image);
+ schedule(10, throbber_advance, g);
+ }
}
void gui_window_start_throbber(struct gui_window *g)
{
+ g->throbber_index = 0;
+ schedule(10, throbber_advance, g);
}
void gui_window_stop_throbber(struct gui_window *g)
{
+ g->throbber_index = -1;
+ fbtk_set_bitmap(g->throbber, &throbber0);
}
void gui_window_place_caret(struct gui_window *g, int x, int y, int height)