summaryrefslogtreecommitdiff
path: root/framebuffer
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2010-10-04 15:50:39 +0000
committerVincent Sanders <vince@netsurf-browser.org>2010-10-04 15:50:39 +0000
commit02ab2db00f3ccd9e9e912877122fe32d8369e5e1 (patch)
tree8cd46d4c5ac5edacf35f1d9b7b8c5e06bade92ed /framebuffer
parentfb75227b77e023c7b7191717a57bac0fdc980bc9 (diff)
downloadnetsurf-02ab2db00f3ccd9e9e912877122fe32d8369e5e1.tar.gz
netsurf-02ab2db00f3ccd9e9e912877122fe32d8369e5e1.tar.bz2
Add flexible toolbar support and docuemnt it
svn path=/trunk/netsurf/; revision=10862
Diffstat (limited to 'framebuffer')
-rw-r--r--framebuffer/gui.c389
-rw-r--r--framebuffer/options.h5
2 files changed, 277 insertions, 117 deletions
diff --git a/framebuffer/gui.c b/framebuffer/gui.c
index 078c9e458..2d0598bc3 100644
--- a/framebuffer/gui.c
+++ b/framebuffer/gui.c
@@ -59,6 +59,8 @@
#include "desktop/history_core.h"
#include "content/fetch.h"
+#define NSFB_TOOLBAR_DEFAULT_LAYOUT "blfsrut"
+
char *default_stylesheet_url;
char *quirks_stylesheet_url;
char *adblock_stylesheet_url;
@@ -836,6 +838,16 @@ fb_osk_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
return 0;
}
+/* close browser window icon click routine */
+static int
+fb_close_click(fbtk_widget_t *widget, fbtk_callback_info *cbi)
+{
+ if (cbi->event->type != NSFB_EVENT_KEY_DOWN)
+ return 0;
+
+ netsurf_quit = true;
+ return 0;
+}
static int
fb_scroll_callback(fbtk_widget_t *widget, fbtk_callback_info *cbi)
@@ -893,121 +905,283 @@ fb_localhistory_btn_clik(fbtk_widget_t *widget, fbtk_callback_info *cbi)
}
-
-static void
-create_toolbar(struct gui_window *gw, int toolbar_height)
+/** Create a toolbar window and populate it with buttons.
+ *
+ * The toolbar layout uses a character to define buttons type and position:
+ * b - back
+ * l - local history
+ * f - forward
+ * s - stop
+ * r - refresh
+ * u - url bar expands to fit remaining space
+ * t - throbber/activity indicator
+ * c - close the current window
+ *
+ * The default layout is "blfsrut" there should be no more than a
+ * single url bar entry or behaviour will be undefined.
+ *
+ * @param gw Parent window
+ * @param toolbar_height The height in pixels of the toolbar
+ * @param padding The padding in pixels round each element of the toolbar
+ * @param frame_col Frame colour.
+ * @param toolbar_layout A string defining which buttons and controls
+ * should be added to the toolbar. May be empty
+ * string to disable the bar..
+ *
+ */
+static fbtk_widget_t *
+create_toolbar(struct gui_window *gw,
+ int toolbar_height,
+ int padding,
+ colour frame_col,
+ const char *toolbar_layout)
{
fbtk_widget_t *toolbar;
fbtk_widget_t *widget;
- int url_bar_height = 0;
- int xpos = 0;
- int spacing_width = 0;
-
- spacing_width = 2;
-
- xpos = spacing_width;
-
- url_bar_height = toolbar_height - 6;
-
- toolbar = fbtk_create_window(gw->window, 0, 0, 0, toolbar_height, FB_FRAME_COLOUR);
- fbtk_set_handler(toolbar, FBTK_CBT_POINTERENTER, set_ptr_default_move, NULL);
-
- /* back button */
- gw->back = fbtk_create_button(toolbar, xpos, spacing_width, left_arrow.width, -spacing_width, FB_FRAME_COLOUR, &left_arrow, fb_leftarrow_click, gw);
- xpos += left_arrow.width + spacing_width;
-
- /* history window */
- widget = fbtk_create_button(toolbar,
- xpos,
- spacing_width,
- history_image.width,
- -spacing_width,
- FB_FRAME_COLOUR,
- &history_image,
- fb_localhistory_btn_clik,
- gw);
- xpos += fbtk_get_width(widget) + spacing_width;
-
- /* forward button */
- gw->forward = fbtk_create_button(toolbar,
- xpos,
- spacing_width,
- right_arrow.width,
- -spacing_width,
- FB_FRAME_COLOUR,
- &right_arrow,
- fb_rightarrow_click,
- gw);
- xpos += right_arrow.width + spacing_width;
-
- /* stop button */
- widget = fbtk_create_button(toolbar,
- xpos,
- spacing_width,
- stop_image.width,
- -spacing_width,
- FB_FRAME_COLOUR,
- &stop_image,
- fb_stop_click,
- gw->bw);
- xpos += stop_image.width + spacing_width;
-
- /* reload button */
- widget = fbtk_create_button(toolbar,
- xpos,
- spacing_width,
- reload.width,
- -spacing_width,
- FB_FRAME_COLOUR,
- &reload,
- fb_reload_click,
- gw->bw);
- xpos += reload.width + spacing_width;
-
- /* url widget */
- xpos += spacing_width; /* extra spacing for url bar */
- gw->url = fbtk_create_writable_text(toolbar,
- xpos,
- spacing_width,
- -(2 * spacing_width + throbber0.width),
- -spacing_width,
- FB_COLOUR_WHITE,
- FB_COLOUR_BLACK,
- true,
- fb_url_enter,
- gw->bw);
- fbtk_set_handler(gw->url, FBTK_CBT_POINTERENTER, fb_url_move, gw->bw);
- xpos += fbtk_get_width(gw->url) + spacing_width;
-
- /* throbber */
- gw->throbber = fbtk_create_bitmap(toolbar,
- xpos,
- spacing_width,
- throbber0.width,
- -spacing_width,
- FB_FRAME_COLOUR, &throbber0);
+
+ int xpos; /* The position of the next widget. */
+ int xlhs; /* extent of the left hand side widgets */
+ int xdir = 1; /* the direction of movement + or - 1 */
+ const char *itmtype; /* type of the next item */
+
+ if (toolbar_layout == NULL) {
+ toolbar_layout = NSFB_TOOLBAR_DEFAULT_LAYOUT;
+ }
+
+ LOG(("Using toolbar layout %s", toolbar_layout));
+
+ itmtype = toolbar_layout;
+
+ if (*itmtype == 0) {
+ return NULL;
+ }
+
+ toolbar = fbtk_create_window(gw->window, 0, 0, 0,
+ toolbar_height,
+ frame_col);
+
+ if (toolbar == NULL) {
+ return NULL;
+ }
+
+ fbtk_set_handler(toolbar,
+ FBTK_CBT_POINTERENTER,
+ set_ptr_default_move,
+ NULL);
+
+
+ xpos = padding;
+
+ /* loop proceeds creating widget on the left hand side until
+ * it runs out of layout or encounters a url bar declaration
+ * wherupon it works backwards from the end of the layout
+ * untill the space left is for the url bar
+ */
+ while ((itmtype >= toolbar_layout) &&
+ (*itmtype != 0) &&
+ (xdir !=0)) {
+
+ LOG(("toolbar adding %c", *itmtype));
+
+
+ switch (*itmtype) {
+
+ case 'b': /* back */
+ widget = fbtk_create_button(toolbar,
+ (xdir == 1) ? xpos :
+ xpos - left_arrow.width,
+ padding,
+ left_arrow.width,
+ -padding,
+ frame_col,
+ &left_arrow,
+ fb_leftarrow_click,
+ gw);
+ gw->back = widget; /* keep reference */
+ break;
+
+ case 'l': /* local history */
+ widget = fbtk_create_button(toolbar,
+ (xdir == 1) ? xpos :
+ xpos - history_image.width,
+ padding,
+ history_image.width,
+ -padding,
+ frame_col,
+ &history_image,
+ fb_localhistory_btn_clik,
+ gw);
+ break;
+
+ case 'f': /* forward */
+ widget = fbtk_create_button(toolbar,
+ (xdir == 1)?xpos :
+ xpos - right_arrow.width,
+ padding,
+ right_arrow.width,
+ -padding,
+ frame_col,
+ &right_arrow,
+ fb_rightarrow_click,
+ gw);
+ gw->forward = widget;
+ break;
+
+ case 'c': /* close the current window */
+ widget = fbtk_create_button(toolbar,
+ (xdir == 1)?xpos :
+ xpos - stop_image_g.width,
+ padding,
+ stop_image_g.width,
+ -padding,
+ frame_col,
+ &stop_image_g,
+ fb_close_click,
+ gw->bw);
+ break;
+
+ case 's': /* stop */
+ widget = fbtk_create_button(toolbar,
+ (xdir == 1)?xpos :
+ xpos - stop_image.width,
+ padding,
+ stop_image.width,
+ -padding,
+ frame_col,
+ &stop_image,
+ fb_stop_click,
+ gw->bw);
+ break;
+
+ case 'r': /* reload */
+ widget = fbtk_create_button(toolbar,
+ (xdir == 1)?xpos :
+ xpos - reload.width,
+ padding,
+ reload.width,
+ -padding,
+ frame_col,
+ &reload,
+ fb_reload_click,
+ gw->bw);
+ break;
+
+ case 't': /* throbber/activity indicator */
+ widget = fbtk_create_bitmap(toolbar,
+ (xdir == 1)?xpos :
+ xpos - throbber0.width,
+ padding,
+ throbber0.width,
+ -padding,
+ frame_col,
+ &throbber0);
+ gw->throbber = widget;
+ break;
+
+
+ case 'u': /* url bar*/
+ if (xdir == -1) {
+ /* met the u going backwards add url
+ * now we know available extent
+ */
+
+ widget = fbtk_create_writable_text(toolbar,
+ xlhs,
+ padding,
+ xpos - xlhs,
+ -padding,
+ FB_COLOUR_WHITE,
+ FB_COLOUR_BLACK,
+ true,
+ fb_url_enter,
+ gw->bw);
+
+ fbtk_set_handler(widget,
+ FBTK_CBT_POINTERENTER,
+ fb_url_move, gw->bw);
+
+ gw->url = widget; /* keep reference */
+
+ /* toolbar is complete */
+ xdir = 0;
+ break;
+ }
+ /* met url going forwards, note position and
+ * reverse direction
+ */
+ itmtype = toolbar_layout + strlen(toolbar_layout);
+ xdir = -1;
+ xlhs = xpos;
+ xpos = (2 * fbtk_get_width(toolbar));
+ widget = toolbar;
+ break;
+
+ default:
+ xdir = 0;
+ LOG(("Unknown element %c in toolbar layout", *itmtype));
+ break;
+
+ }
+
+ xpos += (xdir * (fbtk_get_width(widget) + padding));
+
+ LOG(("xpos is %d",xpos));
+
+ itmtype += xdir;
+ }
fbtk_set_mapping(toolbar, true);
+ return toolbar;
}
static void
-create_normal_browser_window(struct gui_window *gw,
- int furniture_width,
- int toolbar_height)
+create_browser_widget(struct gui_window *gw, int toolbar_height, int furniture_width)
+{
+ struct browser_widget_s *browser_widget;
+ browser_widget = calloc(1, sizeof(struct browser_widget_s));
+
+ gw->browser = fbtk_create_user(gw->window,
+ 0,
+ toolbar_height,
+ -furniture_width,
+ -furniture_width,
+ browser_widget);
+
+ fbtk_set_handler(gw->browser, FBTK_CBT_REDRAW, fb_browser_window_redraw, gw);
+ fbtk_set_handler(gw->browser, FBTK_CBT_INPUT, fb_browser_window_input, gw);
+ fbtk_set_handler(gw->browser, FBTK_CBT_CLICK, fb_browser_window_click, gw);
+ fbtk_set_handler(gw->browser, FBTK_CBT_POINTERMOVE, fb_browser_window_move, gw);
+}
+
+static void
+create_normal_browser_window(struct gui_window *gw, int furniture_width)
{
fbtk_widget_t *widget;
+ fbtk_widget_t *toolbar;
int statusbar_width = 0;
+ int toolbar_height = option_fb_toolbar_size;
+
+ LOG(("Normal window"));
gw->window = fbtk_create_window(fbtk, 0, 0, 0, 0, 0);
statusbar_width = option_toolbar_status_width *
fbtk_get_width(gw->window) / 10000;
+ /* toolbar */
+ toolbar = create_toolbar(gw,
+ toolbar_height,
+ 2,
+ FB_FRAME_COLOUR,
+ option_fb_toolbar_layout);
- LOG(("Normal window"));
-
- create_toolbar(gw, toolbar_height);
+ /* set the actually created toolbar height */
+ if (toolbar != NULL) {
+ toolbar_height = fbtk_get_height(toolbar);
+ } else {
+ toolbar_height = 0;
+ }
/* status bar */
gw->status = fbtk_create_text(gw->window,
@@ -1065,27 +1239,11 @@ create_normal_browser_window(struct gui_window *gw,
fb_scroll_callback,
gw);
+ /* browser widget */
+ create_browser_widget(gw, toolbar_height, option_fb_furniture_size);
}
-static void
-create_browser_widget(struct gui_window *gw, int toolbar_height, int furniture_width)
-{
- struct browser_widget_s *browser_widget;
- browser_widget = calloc(1, sizeof(struct browser_widget_s));
-
- gw->browser = fbtk_create_user(gw->window,
- 0,
- toolbar_height,
- -furniture_width,
- -furniture_width,
- browser_widget);
-
- fbtk_set_handler(gw->browser, FBTK_CBT_REDRAW, fb_browser_window_redraw, gw);
- fbtk_set_handler(gw->browser, FBTK_CBT_INPUT, fb_browser_window_input, gw);
- fbtk_set_handler(gw->browser, FBTK_CBT_CLICK, fb_browser_window_click, gw);
- fbtk_set_handler(gw->browser, FBTK_CBT_POINTERMOVE, fb_browser_window_move, gw);
-}
struct gui_window *
gui_create_browser_window(struct browser_window *bw,
@@ -1107,9 +1265,8 @@ gui_create_browser_window(struct browser_window *bw,
switch(bw->browser_window_type) {
case BROWSER_WINDOW_NORMAL:
- create_normal_browser_window(gw, option_fb_furniture_size, option_fb_toolbar_size);
+ create_normal_browser_window(gw, option_fb_furniture_size);
gw->localhistory = fb_create_localhistory(bw, fbtk, option_fb_furniture_size);
- create_browser_widget(gw, option_fb_toolbar_size, option_fb_furniture_size);
/* map and request redraw of gui window */
fbtk_set_mapping(gw->window, true);
diff --git a/framebuffer/options.h b/framebuffer/options.h
index fff5fd192..00d5277f5 100644
--- a/framebuffer/options.h
+++ b/framebuffer/options.h
@@ -28,6 +28,7 @@ extern char *option_fb_input_devpath;
extern char *option_fb_input_glob;
extern int option_fb_furniture_size; /* toolkit furniture size */
extern int option_fb_toolbar_size; /* toolbar furniture size */
+extern char *option_fb_toolbar_layout; /* toolbar layout */
extern bool option_fb_osk; /* enable on screen keyboard */
extern bool option_fb_font_monochrome; /* render font monochrome */
@@ -47,6 +48,7 @@ extern char *option_fb_face_serif_bold; /* bold serif face */
char *option_fb_input_glob = 0; \
int option_fb_furniture_size = 18; \
int option_fb_toolbar_size = 30; \
+ char *option_fb_toolbar_layout; \
bool option_fb_osk = false; \
bool option_fb_font_monochrome = false; \
char *option_fb_face_sans_serif; \
@@ -65,7 +67,8 @@ extern char *option_fb_face_serif_bold; /* bold serif face */
{ "fb_input_glob", OPTION_STRING, &option_fb_input_glob }, \
{ "fb_furniture_size", OPTION_INTEGER, &option_fb_furniture_size }, \
{ "fb_toolbar_size", OPTION_INTEGER, &option_fb_toolbar_size }, \
- { "fb_font_osk", OPTION_BOOL, &option_fb_osk }, \
+ { "fb_toolbar_layout", OPTION_STRING, &option_fb_toolbar_layout }, \
+ { "fb_osk", OPTION_BOOL, &option_fb_osk }, \
{ "fb_font_monochrome", OPTION_BOOL, &option_fb_font_monochrome }, \
{ "fb_face_sans_serif", OPTION_STRING, &option_fb_face_sans_serif }, \
{ "fb_face_sans_serif_bold", OPTION_STRING, &option_fb_face_sans_serif_bold }, \