summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2014-06-18 20:06:52 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2014-06-18 20:06:52 +0100
commite7e914b6242a17abebb84ecfc5f0b1facaac4e94 (patch)
treefe427f61f8ef832a1cbd3fcaece661051014820b
parent43f21bc9a808f90e2fe1bce851ca04faed412c4a (diff)
parentcd159b6775b16cc8c2449422a4ed0d0e9f66df57 (diff)
downloadnetsurf-e7e914b6242a17abebb84ecfc5f0b1facaac4e94.tar.gz
netsurf-e7e914b6242a17abebb84ecfc5f0b1facaac4e94.tar.bz2
Merge branch 'master' of git://git.netsurf-browser.org/netsurf
-rw-r--r--amiga/gui.c110
-rwxr-xr-xamiga/gui.h3
-rwxr-xr-xamiga/gui_options.c55
-rwxr-xr-xamiga/gui_options.h6
-rw-r--r--framebuffer/font_internal.c29
-rw-r--r--framebuffer/font_internal.h5
-rw-r--r--framebuffer/framebuffer.c3
7 files changed, 112 insertions, 99 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index 1501a5f88..756ed63e2 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -113,6 +113,7 @@
#include <proto/bevel.h>
#include <proto/bitmap.h>
#include <proto/button.h>
+#include <proto/chooser.h>
#include <proto/clicktab.h>
#include <proto/layout.h>
#include <proto/space.h>
@@ -122,6 +123,7 @@
#include <classes/window.h>
#include <gadgets/button.h>
+#include <gadgets/chooser.h>
#include <gadgets/clicktab.h>
#include <gadgets/layout.h>
#include <gadgets/scroller.h>
@@ -197,8 +199,6 @@ void ami_try_quit(void);
void ami_quit_netsurf_delayed(void);
Object *ami_gui_splash_open(void);
void ami_gui_splash_close(Object *win_obj);
-static uint32 ami_set_search_ico_render_hook(struct Hook *hook, APTR space,
- struct gpRender *msg);
static uint32 ami_set_favicon_render_hook(struct Hook *hook, APTR space,
struct gpRender *msg);
static uint32 ami_set_throbber_render_hook(struct Hook *hook, APTR space,
@@ -1786,6 +1786,11 @@ void ami_handle_msg(void)
search_web_select_provider(-1);
break;
+ case GID_SEARCH_ICON:
+ GetAttr(CHOOSER_Selected, gwin->objects[GID_SEARCH_ICON], (ULONG *)&storage);
+ search_web_select_provider(storage);
+ break;
+
case GID_SEARCHSTRING:
{
nserror ret;
@@ -3241,9 +3246,6 @@ gui_window_create(struct browser_window *bw,
g->shared->scrollerhook.h_Entry = (void *)ami_scroller_hook;
g->shared->scrollerhook.h_Data = g->shared;
- g->shared->search_ico_hook.h_Entry = (void *)ami_set_search_ico_render_hook;
- g->shared->search_ico_hook.h_Data = g->shared;
-
g->shared->favicon_hook.h_Entry = (void *)ami_set_favicon_render_hook;
g->shared->favicon_hook.h_Data = g->shared;
@@ -3278,6 +3280,9 @@ gui_window_create(struct browser_window *bw,
TAG_DONE);
AddTail(&g->shared->tab_list,g->tab_node);
+ g->shared->web_search_list = ami_gui_opts_websearch();
+ g->shared->search_bm = NULL;
+
g->shared->tabs=1;
g->shared->next_tab=1;
@@ -3387,12 +3392,12 @@ gui_window_create(struct browser_window *bw,
}
g->shared->objects[OID_MAIN] = WindowObject,
- WA_ScreenTitle,nsscreentitle,
- WA_Activate, TRUE,
- WA_DepthGadget, TRUE,
- WA_DragBar, TRUE,
- WA_CloseGadget, TRUE,
- WA_SizeGadget, TRUE,
+ WA_ScreenTitle,nsscreentitle,
+ WA_Activate, TRUE,
+ WA_DepthGadget, TRUE,
+ WA_DragBar, TRUE,
+ WA_CloseGadget, TRUE,
+ WA_SizeGadget, TRUE,
WA_Top,cury,
WA_Left,curx,
WA_Width,curw,
@@ -3401,12 +3406,12 @@ gui_window_create(struct browser_window *bw,
WA_ReportMouse,TRUE,
refresh_mode, TRUE,
WA_SizeBBottom, TRUE,
- WA_IDCMP, IDCMP_MENUPICK | IDCMP_MOUSEMOVE |
- IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
- IDCMP_RAWKEY | idcmp_sizeverify |
- IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
- IDCMP_REFRESHWINDOW |
- IDCMP_ACTIVEWINDOW | IDCMP_EXTENDEDMOUSE,
+ WA_IDCMP, IDCMP_MENUPICK | IDCMP_MOUSEMOVE |
+ IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE |
+ IDCMP_RAWKEY | idcmp_sizeverify |
+ IDCMP_GADGETUP | IDCMP_IDCMPUPDATE |
+ IDCMP_REFRESHWINDOW |
+ IDCMP_ACTIVEWINDOW | IDCMP_EXTENDEDMOUSE,
WINDOW_IconifyGadget, iconifygadget,
WINDOW_NewMenu, g->shared->menu,
WINDOW_MenuUserData, WGUD_HOOK,
@@ -3419,8 +3424,8 @@ gui_window_create(struct browser_window *bw,
WINDOW_BuiltInScroll, TRUE,
WINDOW_GadgetHelp, TRUE,
WINDOW_UserData, g->shared,
- WINDOW_ParentGroup, g->shared->objects[GID_MAIN] = VGroupObject,
- LAYOUT_SpaceOuter, TRUE,
+ WINDOW_ParentGroup, g->shared->objects[GID_MAIN] = VGroupObject,
+ LAYOUT_SpaceOuter, TRUE,
LAYOUT_AddChild, g->shared->objects[GID_TOOLBARLAYOUT] = HGroupObject,
LAYOUT_VertAlignment, LALIGN_CENTER,
LAYOUT_AddChild, g->shared->objects[GID_BACK] = ButtonObject,
@@ -3532,13 +3537,13 @@ gui_window_create(struct browser_window *bw,
LAYOUT_WeightBar, TRUE,
LAYOUT_AddChild, HGroupObject,
LAYOUT_VertAlignment, LALIGN_CENTER,
- LAYOUT_AddChild, g->shared->objects[GID_SEARCH_ICON] = SpaceObject,
+ LAYOUT_AddChild, g->shared->objects[GID_SEARCH_ICON] = ChooserObject,
GA_ID, GID_SEARCH_ICON,
- SPACE_MinWidth, 16,
- SPACE_MinHeight, 16,
- SPACE_Transparent, FALSE,
- SPACE_RenderHook, &g->shared->search_ico_hook,
- SpaceEnd,
+ GA_RelVerify, TRUE,
+ CHOOSER_DropDown, TRUE,
+ CHOOSER_Labels, g->shared->web_search_list,
+ CHOOSER_MaxLabels, 40, /* Same as options GUI */
+ ChooserEnd,
CHILD_WeightedWidth,0,
CHILD_WeightedHeight,0,
LAYOUT_AddChild, g->shared->objects[GID_SEARCHSTRING] =StringObject,
@@ -3746,8 +3751,6 @@ gui_window_create(struct browser_window *bw,
if(locked_screen) UnlockPubScreen(NULL,scrn);
- /* set web search provider */
- search_web_select_provider(nsoption_int(search_provider));
refresh_search_ico = TRUE;
ScreenToFront(scrn);
@@ -3912,6 +3915,9 @@ static void gui_window_destroy(struct gui_window *g)
DisposeObject(g->shared->objects[GID_FAVE_ADD]);
DisposeObject(g->shared->objects[GID_FAVE_RMV]);
+ ami_gui_opts_websearch_free(g->shared->web_search_list);
+ if(g->shared->search_bm) DisposeObject(g->shared->search_bm);
+
ami_free_menulabs(g->shared);
free(g->shared->wintitle);
ami_utf8_free(g->shared->status);
@@ -4678,57 +4684,27 @@ static nserror gui_search_web_provider_update(const char *provider_name,
if(node->Type == AMINS_WINDOW)
{
- GetAttr(SPACE_AreaBox, gwin->objects[GID_SEARCH_ICON], (ULONG *)&bbox);
+ if(gwin->search_bm != NULL)
+ DisposeObject(gwin->search_bm);
+
+ gwin->search_bm = BitMapObject,
+ BITMAP_Screen, scrn,
+ BITMAP_Width, 16,
+ BITMAP_Height, 16,
+ BITMAP_BitMap, bm,
+ BitMapEnd;
RefreshSetGadgetAttrs((struct Gadget *)gwin->objects[GID_SEARCH_ICON],
gwin->win, NULL,
GA_HintInfo, provider_name,
+ GA_Image, gwin->search_bm,
TAG_DONE);
-
- EraseRect(gwin->win->RPort, bbox->Left, bbox->Top,
- bbox->Left+16, bbox->Top+16);
-
- if(bm)
- {
- ULONG tag, tag_data, minterm;
-
- if(ami_plot_screen_is_palettemapped() == false) {
- tag = BLITA_UseSrcAlpha;
- tag_data = !ico_bitmap->opaque;
- minterm = 0xc0;
- } else {
- tag = BLITA_MaskPlane;
- tag_data = (ULONG)ami_bitmap_get_mask(ico_bitmap, 16, 16, bm);
- minterm = (ABC|ABNC|ANBC);
- }
-
- BltBitMapTags(BLITA_SrcX, 0,
- BLITA_SrcY, 0,
- BLITA_DestX, bbox->Left,
- BLITA_DestY, bbox->Top,
- BLITA_Width, 16,
- BLITA_Height, 16,
- BLITA_Source, bm,
- BLITA_Dest, gwin->win->RPort,
- BLITA_SrcType, BLITT_BITMAP,
- BLITA_DestType, BLITT_RASTPORT,
- BLITA_Minterm, minterm,
- tag, tag_data,
- TAG_DONE);
- }
}
} while(node = nnode);
return NSERROR_OK;
}
-static uint32 ami_set_search_ico_render_hook(struct Hook *hook, APTR space,
- struct gpRender *msg)
-{
- refresh_search_ico = TRUE;
- return 0;
-}
-
static uint32 ami_set_throbber_render_hook(struct Hook *hook, APTR space,
struct gpRender *msg)
{
diff --git a/amiga/gui.h b/amiga/gui.h
index ad187500a..f5a9030c9 100755
--- a/amiga/gui.h
+++ b/amiga/gui.h
@@ -111,6 +111,8 @@ struct gui_window_2 {
ULONG hotlist_items;
char *hotlist_toolbar_lab[AMI_GUI_TOOLBAR_MAX];
struct List hotlist_toolbar_list;
+ struct List *web_search_list;
+ Object *search_bm;
char *svbuffer;
char *status;
char *wintitle;
@@ -120,7 +122,6 @@ struct gui_window_2 {
BOOL rmbtrapped;
struct AppIcon *appicon; /* iconify appicon */
struct DiskObject *dobj; /* iconify appicon */
- struct Hook search_ico_hook;
struct Hook favicon_hook;
struct Hook throbber_hook;
gui_drag_type drag_op;
diff --git a/amiga/gui_options.c b/amiga/gui_options.c
index 3a6451b97..50f7b7cfd 100755
--- a/amiga/gui_options.c
+++ b/amiga/gui_options.c
@@ -216,10 +216,7 @@ CONST_STRPTR nativebmopts[OPTS_MAX_NATIVEBM];
CONST_STRPTR ditheropts[OPTS_MAX_DITHER];
CONST_STRPTR fontopts[6];
CONST_STRPTR gadlab[OPTS_LAST];
-STRPTR *websearch_list;
-
-STRPTR *ami_gui_opts_websearch(void);
-void ami_gui_opts_websearch_free(STRPTR *websearchlist);
+struct List *websearch_list;
void ami_gui_opts_setup(void)
{
@@ -1312,7 +1309,7 @@ void ami_gui_opts_open(void)
GA_ID, GID_OPTS_SEARCH_PROV,
GA_RelVerify, TRUE,
CHOOSER_PopUp, TRUE,
- CHOOSER_LabelArray, websearch_list,
+ CHOOSER_Labels, websearch_list,
CHOOSER_Selected, nsoption_int(search_provider),
CHOOSER_MaxLabels, 40,
ChooserEnd,
@@ -2118,39 +2115,41 @@ BOOL ami_gui_opts_event(void)
return FALSE;
}
-STRPTR *ami_gui_opts_websearch(void)
+struct List *ami_gui_opts_websearch(void)
{
- char buf[300];
- ULONG ref = 0;
- STRPTR *websearchlist;
-
- websearchlist = AllocVecTagList(200, NULL); /* NB: Was not MEMF_PRIVATE */
+ struct List *list;
+ struct Node *node;
+ const char *name;
+ int iter;
- if (nsoption_charp(search_engines_file) == NULL) return websearchlist;
+ list = AllocVecTagList(sizeof(struct List), NULL);
+ NewList(list);
- FILE *f = fopen(nsoption_charp(search_engines_file), "r");
- if (f == NULL) return websearchlist;
+ if (nsoption_charp(search_engines_file) == NULL) return list;
- while (fgets(buf, sizeof(buf), f) != NULL) {
- if (buf[0] == '\0') continue;
- buf[strlen(buf)-1] = '\0';
- websearchlist[ref] = strdup(strtok(buf, "|"));
- ref++;
+ for (iter = search_web_iterate_providers(0, &name);
+ iter != -1;
+ iter = search_web_iterate_providers(iter, &name)) {
+ node = AllocChooserNode(CNA_Text, name, TAG_DONE);
+ AddTail(list, node);
}
- fclose(f);
- websearchlist[ref] = NULL;
- return websearchlist;
+ return list;
}
-void ami_gui_opts_websearch_free(STRPTR *websearchlist)
+void ami_gui_opts_websearch_free(struct List *websearchlist)
{
- ULONG ref = 0;
+ struct Node *node;
+ struct Node *nnode;
- while (websearchlist[ref] != NULL) {
- free(websearchlist[ref]);
- ref++;
- }
+ if(IsListEmpty(websearchlist)) return;
+ node = GetHead(websearchlist);
+
+ do {
+ nnode = GetSucc(node);
+ Remove(node);
+ } while(node = nnode);
FreeVec(websearchlist);
}
+
diff --git a/amiga/gui_options.h b/amiga/gui_options.h
index 2b57769ab..04c1be51e 100755
--- a/amiga/gui_options.h
+++ b/amiga/gui_options.h
@@ -18,9 +18,15 @@
#ifndef AMIGA_GUI_OPTIONS_H
#define AMIGA_GUI_OPTIONS_H
+/* Prefs GUI control */
void ami_gui_opts_open(void);
BOOL ami_gui_opts_event(void);
void ami_gui_opts_close(void);
+/* Web search list */
+struct List *ami_gui_opts_websearch(void);
+void ami_gui_opts_websearch_free(struct List *websearchlist);
+
char *current_user_options;
#endif
+
diff --git a/framebuffer/font_internal.c b/framebuffer/font_internal.c
index 5aada8f11..e514b12d9 100644
--- a/framebuffer/font_internal.c
+++ b/framebuffer/font_internal.c
@@ -287,11 +287,24 @@ static nserror utf8_from_local(const char *string,
return NSERROR_OK;
}
+
static bool nsfont_width(const plot_font_style_t *fstyle,
const char *string, size_t length,
int *width)
{
- *width = FB_FONT_WIDTH * utf8_bounded_length(string, length);
+ size_t nxtchr = 0;
+
+ *width = 0;
+ while (nxtchr < length) {
+ uint32_t ucs4;
+ ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr);
+ if (codepoint_displayable(ucs4)) {
+ *width += FB_FONT_WIDTH;
+ }
+
+ nxtchr = utf8_next(string, length, nxtchr);
+ }
+
return true;
}
@@ -315,10 +328,15 @@ static bool nsfont_position_in_string(const plot_font_style_t *fstyle,
int x_pos = 0;
while (nxtchr < length) {
+ uint32_t ucs4;
if (abs(x_pos - x) <= (FB_FONT_WIDTH / 2))
break;
- x_pos += FB_FONT_WIDTH;
+ ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr);
+ if (codepoint_displayable(ucs4)) {
+ x_pos += FB_FONT_WIDTH;
+ }
+
nxtchr = utf8_next(string, length, nxtchr);
}
@@ -363,13 +381,18 @@ static bool nsfont_split(const plot_font_style_t *fstyle,
*actual_x = 0;
while (nxtchr < length) {
+ uint32_t ucs4;
if (string[nxtchr] == ' ') {
last_space_x = *actual_x;
last_space_idx = nxtchr;
}
- *actual_x += FB_FONT_WIDTH;
+ ucs4 = utf8_to_ucs4(string + nxtchr, length - nxtchr);
+ if (codepoint_displayable(ucs4)) {
+ *actual_x += FB_FONT_WIDTH;
+ }
+
if (*actual_x > x && last_space_idx != 0) {
/* string has exceeded available width and we've
* found a space; return previous space */
diff --git a/framebuffer/font_internal.h b/framebuffer/font_internal.h
index 236183ace..ead179c99 100644
--- a/framebuffer/font_internal.h
+++ b/framebuffer/font_internal.h
@@ -19,6 +19,8 @@
#ifndef NETSURF_FB_FONT_INTERNAL_H
#define NETSURF_FB_FONT_INTERNAL_H
+#include <stdbool.h>
+
struct fb_font_desc {
const char *name;
int width, height, pitch;
@@ -39,5 +41,8 @@ enum fb_font_style fb_get_font_style(const plot_font_style_t *fstyle);
const uint8_t * fb_get_glyph(uint32_t ucs4, enum fb_font_style style);
+#define codepoint_displayable(u) \
+ (!(u >= 0x200b && u <= 0x200f))
+
#endif /* NETSURF_FB_FONT_INTERNAL_H */
diff --git a/framebuffer/framebuffer.c b/framebuffer/framebuffer.c
index 0115d838c..4cd064c34 100644
--- a/framebuffer/framebuffer.c
+++ b/framebuffer/framebuffer.c
@@ -140,6 +140,9 @@ static bool framebuffer_plot_text(int x, int y, const char *text, size_t length,
ucs4 = utf8_to_ucs4(text + nxtchr, length - nxtchr);
nxtchr = utf8_next(text, length, nxtchr);
+ if (!codepoint_displayable(ucs4))
+ continue;
+
loc.x0 = x;
loc.y0 = y;
loc.x1 = loc.x0 + FB_FONT_WIDTH;