summaryrefslogtreecommitdiff
path: root/amiga/gui.c
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2008-10-05 13:17:18 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2008-10-05 13:17:18 +0000
commitec72e05bdc268bf8e5967ca0856ae0c1d5c95666 (patch)
treee3f95474f492a5535bd3478ef45c9b9920fe410e /amiga/gui.c
parentbd94b1242239bce989c254071a31d38398365831 (diff)
downloadnetsurf-ec72e05bdc268bf8e5967ca0856ae0c1d5c95666.tar.gz
netsurf-ec72e05bdc268bf8e5967ca0856ae0c1d5c95666.tar.bz2
AmigaOS tabs implementation.
Two new strings: NewTab, CloseTab Two new options: always_open_tabs indicates to open tabs instead of windows by default new_tab_is_active makes any new tab the current one (default is to open tabs in background) svn path=/trunk/netsurf/; revision=5483
Diffstat (limited to 'amiga/gui.c')
-rwxr-xr-xamiga/gui.c151
1 files changed, 112 insertions, 39 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index a8c91fe6a..1ef533ae4 100755
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -551,17 +551,10 @@ void ami_handle_msg(void)
switch(result & WMHI_GADGETMASK) //gadaddr->GadgetID) //result & WMHI_GADGETMASK)
{
case GID_TABS:
- GetAttr(CLICKTAB_CurrentNode,gwin->gadgets[GID_TABS],(ULONG *)&tabnode);
- GetClickTabNodeAttrs(tabnode,
- TNA_UserData,&gwin->bw,
- TAG_DONE);
-
- ami_update_buttons(gwin);
-
- browser_window_update(gwin->bw,false);
+ ami_switch_tab(gwin,true);
- gwin->redraw_required = true;
- gwin->redraw_data = NULL;
+// gwin->redraw_required = true;
+// gwin->redraw_data = NULL;
break;
case GID_URL:
@@ -920,6 +913,29 @@ void gui_poll(bool active)
}
}
+void ami_switch_tab(struct gui_window_2 *gwin,bool redraw)
+{
+ struct Node *tabnode;
+
+ if(gwin->tabs == 0) return;
+
+ GetAttr(CLICKTAB_CurrentNode,gwin->gadgets[GID_TABS],(ULONG *)&tabnode);
+ GetClickTabNodeAttrs(tabnode,
+ TNA_UserData,&gwin->bw,
+ TAG_DONE);
+
+ ami_update_buttons(gwin);
+
+ if(redraw)
+ {
+ browser_window_update(gwin->bw,false);
+
+ RefreshSetGadgetAttrs(gwin->gadgets[GID_URL],gwin->win,NULL,
+ STRINGA_TextVal,gwin->bw->current_content->url,
+ TAG_DONE);
+ }
+}
+
void gui_quit(void)
{
int i;
@@ -1012,6 +1028,16 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
char reload[100],reload_s[100],reload_g[100];
char home[100],home_s[100],home_g[100];
+ if(option_force_tabs && (bw->browser_window_type == BROWSER_WINDOW_NORMAL))
+ {
+ /* option_force_tabs reverses the new_tab parameter.
+ * We can still open new windows by setting new_tab to true.
+ */
+
+ if(new_tab) new_tab = false;
+ else new_tab = true;
+ }
+
if(clone)
{
if(clone->window)
@@ -1042,7 +1068,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
return NULL;
}
- if(new_tab)
+ if(new_tab && clone && (bw->browser_window_type == BROWSER_WINDOW_NORMAL))
{
gwin->shared = clone->window->shared;
@@ -1051,7 +1077,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
TAG_DONE);
gwin->tab_node = AllocClickTabNode(TNA_Text,messages_get("NetSurf"),
- TNA_Number,gwin->shared->tabs,
+ TNA_Number,gwin->shared->next_tab,
TNA_UserData,bw,
TAG_DONE);
@@ -1063,9 +1089,19 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
CLICKTAB_Labels,&gwin->shared->tab_list,
TAG_DONE);
- RethinkLayout(gwin->shared->gadgets[GID_MAIN],gwin->shared->win,NULL,TRUE);
+ if(option_new_tab_active)
+ {
+ RefreshSetGadgetAttrs(gwin->shared->gadgets[GID_TABS],gwin->shared->win,NULL,
+ CLICKTAB_Current,gwin->shared->next_tab,
+ TAG_DONE);
+ }
+
+ RethinkLayout(gwin->shared->gadgets[GID_TABLAYOUT],gwin->shared->win,NULL,TRUE);
gwin->shared->tabs++;
+ gwin->shared->next_tab++;
+
+ if(option_new_tab_active) ami_switch_tab(gwin->shared,false);
return gwin;
}
@@ -1086,7 +1122,12 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
case BROWSER_WINDOW_IFRAME:
case BROWSER_WINDOW_FRAMESET:
case BROWSER_WINDOW_FRAME:
- gwin->shared->objects[OID_MAIN] = WindowObject,
+
+ gwin->tab = 0;
+ gwin->shared->tabs = 0;
+ gwin->tab_node = NULL;
+
+ gwin->shared->objects[OID_MAIN] = WindowObject,
WA_ScreenTitle,nsscreentitle,
// WA_Title, messages_get("NetSurf"),
WA_Activate, FALSE,
@@ -1103,7 +1144,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
WA_IDCMP,IDCMP_MENUPICK | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS |
IDCMP_NEWSIZE | IDCMP_VANILLAKEY | IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | IDCMP_INTUITICKS,
// WINDOW_IconifyGadget, TRUE,
- WINDOW_NewMenu,menu,
+// WINDOW_NewMenu,menu,
WINDOW_HorizProp,1,
WINDOW_VertProp,1,
WINDOW_IDCMPHook,&gwin->shared->scrollerhook,
@@ -1130,17 +1171,17 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
break;
case BROWSER_WINDOW_NORMAL:
+ menu = ami_create_menu(bw->browser_window_type);
- menu = ami_create_menu(bw->browser_window_type);
-
- NewList(&gwin->shared->tab_list);
- gwin->tab_node = AllocClickTabNode(TNA_Text,messages_get("NetSurf"),
- TNA_Number,0,
- TNA_UserData,bw,
- TAG_DONE);
- AddTail(&gwin->shared->tab_list,gwin->tab_node);
+ NewList(&gwin->shared->tab_list);
+ gwin->tab_node = AllocClickTabNode(TNA_Text,messages_get("NetSurf"),
+ TNA_Number,0,
+ TNA_UserData,bw,
+ TAG_DONE);
+ AddTail(&gwin->shared->tab_list,gwin->tab_node);
- gwin->shared->tabs=1;
+ gwin->shared->tabs=1;
+ gwin->shared->next_tab=1;
strcpy(nav_west,option_toolbar_images);
strcpy(nav_west_s,option_toolbar_images);
@@ -1290,13 +1331,16 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
CHILD_WeightedHeight,0,
LayoutEnd,
CHILD_WeightedHeight,0,
- LAYOUT_AddChild, gwin->shared->gadgets[GID_TABS] = ClickTabObject,
- GA_ID,GID_TABS,
- GA_RelVerify,TRUE,
- CLICKTAB_Labels,&gwin->shared->tab_list,
- CLICKTAB_LabelTruncate,TRUE,
- ClickTabEnd,
- CHILD_CacheDomain,FALSE,
+ LAYOUT_AddChild, gwin->shared->gadgets[GID_TABLAYOUT] = HGroupObject,
+ LAYOUT_AddChild, gwin->shared->gadgets[GID_TABS] = ClickTabObject,
+ GA_ID,GID_TABS,
+ GA_RelVerify,TRUE,
+ CLICKTAB_Labels,&gwin->shared->tab_list,
+ CLICKTAB_LabelTruncate,TRUE,
+ ClickTabEnd,
+ CHILD_CacheDomain,FALSE,
+ LayoutEnd,
+ CHILD_WeightedHeight,0,
LAYOUT_AddChild, gwin->shared->gadgets[GID_BROWSER] = SpaceObject,
GA_ID,GID_BROWSER,
SpaceEnd,
@@ -1392,28 +1436,50 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
void gui_window_destroy(struct gui_window *g)
{
+ struct Node *ptab;
+ ULONG ptabnum;
+
if(!g) return;
if(g->shared->tabs > 1)
{
-/* we need to remove the tab in question, but for the moment... */
+ SetGadgetAttrs(g->shared->gadgets[GID_TABS],g->shared->win,NULL,
+ CLICKTAB_Labels,~0,
+ TAG_DONE);
+
+ ptab = GetPred(g->tab_node);
+ if(!ptab) ptab = GetSucc(g->tab_node);
+
+ GetClickTabNodeAttrs(ptab,TNA_Number,(ULONG *)&ptabnum,TAG_DONE);
+ Remove(g->tab_node);
+ FreeClickTabNode(g->tab_node);
+ RefreshSetGadgetAttrs(g->shared->gadgets[GID_TABS],g->shared->win,NULL,
+ CLICKTAB_Labels,&g->shared->tab_list,
+ CLICKTAB_Current,ptabnum,
+ TAG_DONE);
+ RethinkLayout(g->shared->gadgets[GID_TABLAYOUT],g->shared->win,NULL,TRUE);
+
g->shared->tabs--;
- win_destroyed = true;
+ ami_switch_tab(g->shared,true);
+ FreeVec(g);
return;
}
-// DisposeDTObject(g->gadgets[GID_THROBBER]);
DisposeObject(g->shared->objects[OID_MAIN]);
DeleteLayer(0,g->shared->rp.Layer);
DisposeLayerInfo(g->shared->layerinfo);
-// ami_tte_cleanup(&g->rp);
p96FreeBitMap(g->shared->bm);
FreeVec(g->shared->rp.TmpRas);
FreeVec(g->shared->rp.AreaInfo);
FreeVec(g->shared->tmprasbuf);
FreeVec(g->shared->areabuf);
DelObject(g->shared->node);
-// FreeVec(g); should be freed by DelObject()
+ if(g->tab_node)
+ {
+ Remove(g->tab_node);
+ FreeClickTabNode(g->tab_node);
+ }
+ FreeVec(g); // g->shared should be freed by DelObject()
if(IsMinListEmpty(window_list))
{
@@ -1427,7 +1493,7 @@ void gui_window_destroy(struct gui_window *g)
void gui_window_set_title(struct gui_window *g, const char *title)
{
struct Node *node;
- WORD cur_tab;
+ ULONG cur_tab = 0;
if(!g) return;
if(g->tab_node)
@@ -1441,7 +1507,7 @@ void gui_window_set_title(struct gui_window *g, const char *title)
RefreshSetGadgetAttrs(g->shared->gadgets[GID_TABS],g->shared->win,NULL,
CLICKTAB_Labels,&g->shared->tab_list,
TAG_DONE);
- RethinkLayout(g->shared->gadgets[GID_MAIN],g->shared->win,NULL,TRUE);
+ RethinkLayout(g->shared->gadgets[GID_TABLAYOUT],g->shared->win,NULL,TRUE);
GetAttr(CLICKTAB_Current,g->shared->gadgets[GID_TABS],(ULONG *)&cur_tab);
}
@@ -1867,9 +1933,16 @@ void ami_init_mouse_pointers(void)
void gui_window_set_url(struct gui_window *g, const char *url)
{
+ ULONG cur_tab = 0;
+
if(!g) return;
- RefreshSetGadgetAttrs(g->shared->gadgets[GID_URL],g->shared->win,NULL,STRINGA_TextVal,url,TAG_DONE);
+ if(g->tab_node) GetAttr(CLICKTAB_Current,g->shared->gadgets[GID_TABS],(ULONG *)&cur_tab);
+
+ if((cur_tab == g->tab) || (g->shared->tabs == 0))
+ {
+ RefreshSetGadgetAttrs(g->shared->gadgets[GID_URL],g->shared->win,NULL,STRINGA_TextVal,url,TAG_DONE);
+ }
}
void gui_window_start_throbber(struct gui_window *g)