diff options
-rwxr-xr-x | amiga/gui.c | 101 | ||||
-rwxr-xr-x | amiga/gui.h | 7 | ||||
-rwxr-xr-x | amiga/login.c | 122 | ||||
-rwxr-xr-x | amiga/login.h | 35 | ||||
-rwxr-xr-x | amiga/object.h | 1 |
5 files changed, 241 insertions, 25 deletions
diff --git a/amiga/gui.c b/amiga/gui.c index 6a1573b59..a6d0eedc0 100755 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -80,7 +80,6 @@ struct browser_window *curbw; char *default_stylesheet_url; char *adblock_stylesheet_url; struct gui_window *search_current_window = NULL; -struct MinList *window_list; struct MsgPort *msgport; struct timerequest *tioreq; @@ -89,12 +88,10 @@ struct TimerIFace *ITimer; struct Library *PopupMenuBase = NULL; struct PopupMenuIFace *IPopupMenu = NULL; -struct Screen *scrn; bool win_destroyed = false; static struct RastPort dummyrp; struct FileRequester *filereq; struct IFFHandle *iffh = NULL; -STRPTR nsscreentitle = NULL; struct tree *hotlist; void ami_update_buttons(struct gui_window *); @@ -261,11 +258,11 @@ void gui_init2(int argc, char** argv) BMF_CLEAR | BMF_DISPLAYABLE | BMF_INTERLEAVED, NULL,RGBFB_A8R8G8B8); + if(!dummyrp.BitMap) die(messages_get("NoMemory")); + if ((!option_homepage_url) || (option_homepage_url[0] == '\0')) option_homepage_url = strdup(NETSURF_HOMEPAGE); -/* need some bestmodeid() in here, or grab modeid from options file */ - if(option_modeid) { id = option_modeid; @@ -442,6 +439,19 @@ void ami_get_msg(void) ami_update_buttons(gwin); break; + case GID_LOGIN: + ami_401login_login((struct gui_login_window *)gwin); + win_destroyed = true; + break; + + case GID_CANCEL: + if(gwin->node->Type == AMINS_LOGINWINDOW) + { + ami_401login_close((struct gui_login_window *)gwin); + win_destroyed = true; + } + break; + default: printf("GADGET: %ld\n",(result & WMHI_GADGETMASK)); break; @@ -752,26 +762,28 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw, struct gui_window *gwin = NULL; bool closegadg=TRUE; -/* if(bw->browser_window_type == BROWSER_WINDOW_IFRAME) { + if(option_no_iframes) return NULL; +/* gwin = bw->parent->window; printf("%lx\n",gwin); return gwin; - } */ + } - gwin = AllocVec(sizeof(struct gui_window),MEMF_CLEAR); - gwin->scrollerhook.h_Entry = ami_scroller_hook; - gwin->scrollerhook.h_Data = gwin; + gwin = AllocVec(sizeof(struct gui_window),MEMF_CLEAR); if(!gwin) { - printf(messages_get("NoMemory")); - return 0; + warn_user("NoMemory"); + return NULL; } + gwin->scrollerhook.h_Entry = ami_scroller_hook; + gwin->scrollerhook.h_Data = gwin; + menu = ami_create_menu(bw->browser_window_type); switch(bw->browser_window_type) @@ -944,17 +956,28 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw, gwin->win = (struct Window *)RA_OpenWindow(gwin->objects[OID_MAIN]); + if(!gwin->win) + { + warn_user("NoMemory"); + FreeVec(gwin); + return NULL; + } + gwin->bw = bw; -// curwin = gwin; //test -/* not needed - no rendering takes place here. */ currp = &gwin->rp; // WINDOW.CLASS: &gwin->rp; //gwin->win->RPort; -/* below needs to be allocated as big as the screen */ gwin->bm = p96AllocBitMap(scrn->Width,scrn->Height,32, BMF_CLEAR | BMF_DISPLAYABLE | BMF_INTERLEAVED, gwin->win->RPort->BitMap, RGBFB_A8R8G8B8); + if(!gwin->bm) + { + warn_user("NoMemory"); + browser_window_destroy(bw); + return NULL; + } + InitRastPort(&gwin->rp); gwin->rp.BitMap = gwin->bm; SetDrMd(currp,BGBACKFILL); @@ -964,9 +987,25 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw, gwin->areabuf = AllocVec(100,MEMF_CLEAR); gwin->rp.AreaInfo = AllocVec(sizeof(struct AreaInfo),MEMF_CLEAR); + + if((!gwin->areabuf) || (!gwin->rp.AreaInfo)) + { + warn_user("NoMemory"); + browser_window_destroy(bw); + return NULL; + } + InitArea(gwin->rp.AreaInfo,gwin->areabuf,100/5); gwin->rp.TmpRas = AllocVec(sizeof(struct TmpRas),MEMF_CLEAR); gwin->tmprasbuf = AllocVec(scrn->Width*scrn->Height,MEMF_CLEAR); + + if((!gwin->tmprasbuf) || (!gwin->rp.TmpRas)) + { + warn_user("NoMemory"); + browser_window_destroy(bw); + return NULL; + } + InitTmpRas(gwin->rp.TmpRas,gwin->tmprasbuf,scrn->Width*scrn->Height); GetRPAttrs(&gwin->rp,RPTAG_Font,&origrpfont,TAG_DONE); @@ -976,19 +1015,11 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw, RefreshSetGadgetAttrs((APTR)gwin->objects[OID_VSCROLL],gwin->win,NULL, -/* - GA_RelVerify,TRUE, - GA_Immediate,TRUE, -*/ GA_ID,OID_VSCROLL, ICA_TARGET,ICTARGET_IDCMP, TAG_DONE); RefreshSetGadgetAttrs((APTR)gwin->objects[OID_HSCROLL],gwin->win,NULL, -/* - GA_RelVerify,TRUE, - GA_Immediate,TRUE, -*/ GA_ID,OID_HSCROLL, ICA_TARGET,ICTARGET_IDCMP, TAG_DONE); @@ -1001,6 +1032,8 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw, void gui_window_destroy(struct gui_window *g) { + if(!g) return; + DisposeObject(g->objects[OID_MAIN]); DeleteLayer(0,g->rp.Layer); DisposeLayerInfo(g->layerinfo); @@ -1023,6 +1056,7 @@ void gui_window_destroy(struct gui_window *g) void gui_window_set_title(struct gui_window *g, const char *title) { + if(!g) return; if(g->win->Title) ami_utf8_free(g->win->Title); SetWindowTitles(g->win,ami_utf8_easy(title),nsscreentitle); } @@ -1034,6 +1068,8 @@ void gui_window_redraw(struct gui_window *g, int x0, int y0, int x1, int y1) void gui_window_redraw_window(struct gui_window *g) { + if(!g) return; + g->redraw_required = true; g->redraw_data = NULL; } @@ -1045,6 +1081,8 @@ void gui_window_update_box(struct gui_window *g, ULONG hcurrent,vcurrent,xoffset,yoffset,width=800,height=600; struct IBox *bbox; + if(!g) return; + GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox); GetAttr(SCROLLER_Top,g->objects[OID_HSCROLL],&hcurrent); GetAttr(SCROLLER_Top,g->objects[OID_VSCROLL],&vcurrent); @@ -1191,6 +1229,8 @@ bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy) void gui_window_set_scroll(struct gui_window *g, int sx, int sy) { + if(!g) return; + RefreshSetGadgetAttrs((APTR)g->objects[OID_VSCROLL],g->win,NULL, SCROLLER_Top,sy, TAG_DONE); @@ -1212,6 +1252,7 @@ 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) { + if(!g) return; ChangeWindowBox(g->win,x0,y0,x1-x0,y1-y0); } @@ -1219,6 +1260,7 @@ void gui_window_get_dimensions(struct gui_window *g, int *width, int *height, bool scaled) { struct IBox *bbox; + if(!g) return; GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox); @@ -1238,6 +1280,8 @@ void gui_window_update_extent(struct gui_window *g) { struct IBox *bbox; + if(!g) return; + GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox); /* @@ -1286,6 +1330,8 @@ void gui_window_hide_pointer(struct gui_window *g) void gui_window_set_url(struct gui_window *g, const char *url) { + if(!g) return; + RefreshSetGadgetAttrs(g->gadgets[GID_URL],g->win,NULL,STRINGA_TextVal,url,TAG_DONE); } @@ -1301,6 +1347,8 @@ void gui_window_place_caret(struct gui_window *g, int x, int y, int height) { struct IBox *bbox; + if(!g) return; + GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox); SetAPen(g->win->RPort,3); @@ -1315,6 +1363,8 @@ void gui_window_remove_caret(struct gui_window *g) { struct IBox *bbox; + if(!g) return; + GetAttr(SPACE_AreaBox,g->gadgets[GID_BROWSER],(ULONG *)&bbox); BltBitMapRastPort(g->bm,g->c_x,g->c_y,g->win->RPort,bbox->Left+g->c_x,bbox->Top+g->c_y,2,g->c_h,0x0C0); @@ -1395,6 +1445,7 @@ struct gui_download_window *gui_download_window_create(const char *url, WA_SizeGadget, TRUE, WA_CustomScreen,scrn, WINDOW_IconifyGadget, TRUE, + WINDOW_LockHeight,TRUE, WINDOW_Position, WPOS_CENTERSCREEN, WINDOW_ParentGroup, dw->gadgets[GID_MAIN] = VGroupObject, LAYOUT_AddChild, dw->gadgets[GID_STATUS] = FuelGaugeObject, @@ -1432,8 +1483,8 @@ void gui_download_window_data(struct gui_download_window *dw, const char *data, dw->downloaded = dw->downloaded + size; - va[0] = dw->downloaded; - va[1] = dw->size; + va[0] = (APTR)dw->downloaded; + va[1] = (APTR)dw->size; va[2] = 0; if(dw->size) diff --git a/amiga/gui.h b/amiga/gui.h index 0bb1a352b..1081b1e3b 100755 --- a/amiga/gui.h +++ b/amiga/gui.h @@ -38,6 +38,10 @@ enum GID_BACK, GID_FORWARD, GID_THROBBER, + GID_USER, + GID_PASS, + GID_LOGIN, + GID_CANCEL, GID_LAST }; @@ -86,4 +90,7 @@ struct gui_window { struct RastPort *currp; struct TextFont *origrpfont; +struct MinList *window_list; +struct Screen *scrn; +STRPTR nsscreentitle; #endif diff --git a/amiga/login.c b/amiga/login.c index 47e708e58..3c42ad4c8 100755 --- a/amiga/login.c +++ b/amiga/login.c @@ -17,8 +17,130 @@ */ #include "desktop/401login.h" +#include "amiga/gui.h" +#include "amiga/object.h" +#include "amiga/login.h" +#include <proto/exec.h> +#include <proto/intuition.h> +#include <proto/utility.h> +#include "utils/url.h" +#include "content/urldb.h" +#include "utils/messages.h" + +#include <proto/window.h> +#include <proto/layout.h> +#include <proto/string.h> +#include <proto/button.h> +#include <proto/label.h> +#include <classes/window.h> +#include <gadgets/layout.h> +#include <gadgets/string.h> +#include <gadgets/button.h> +#include <images/label.h> +#include <reaction/reaction_macros.h> void gui_401login_open(struct browser_window *bw, struct content *c, const char *realm) { + struct gui_login_window *lw = AllocVec(sizeof(struct gui_login_window),MEMF_CLEAR); + char *host; + + url_host(c->url, &host); + lw->host = host; + lw->url = c->url; + lw->realm = (char *)realm; + lw->bw = bw; + + lw->objects[OID_MAIN] = WindowObject, + WA_ScreenTitle,nsscreentitle, + WA_Title,lw->url, + WA_Activate, TRUE, + WA_DepthGadget, TRUE, + WA_DragBar, TRUE, + WA_CloseGadget, FALSE, + WA_SizeGadget, TRUE, + WA_CustomScreen,scrn, + WINDOW_IconifyGadget, FALSE, + WINDOW_LockHeight,TRUE, + WINDOW_Position, WPOS_CENTERSCREEN, + WINDOW_ParentGroup, lw->gadgets[GID_MAIN] = VGroupObject, + LAYOUT_AddChild, StringObject, + STRINGA_TextVal,lw->host, + GA_ReadOnly,TRUE, + StringEnd, + CHILD_Label, LabelObject, + LABEL_Text,messages_get("Host"), + LabelEnd, + CHILD_WeightedHeight,0, + LAYOUT_AddChild, StringObject, + STRINGA_TextVal,lw->realm, + GA_ReadOnly,TRUE, + StringEnd, + CHILD_Label, LabelObject, + LABEL_Text,messages_get("Realm"), + LabelEnd, + CHILD_WeightedHeight,0, + LAYOUT_AddChild, lw->gadgets[GID_USER] = StringObject, + GA_ID,GID_USER, + GA_TabCycle,TRUE, + StringEnd, + CHILD_Label, LabelObject, + LABEL_Text,messages_get("Username"), + LabelEnd, + CHILD_WeightedHeight,0, + LAYOUT_AddChild, lw->gadgets[GID_PASS] = StringObject, + GA_ID,GID_PASS, + STRINGA_HookType,SHK_PASSWORD, + GA_TabCycle,TRUE, + StringEnd, + CHILD_Label, LabelObject, + LABEL_Text,messages_get("Password"), + LabelEnd, + CHILD_WeightedHeight,0, + LAYOUT_AddChild, HGroupObject, + LAYOUT_AddChild, lw->gadgets[GID_LOGIN] = ButtonObject, + GA_ID,GID_LOGIN, + GA_RelVerify,TRUE, + GA_Text,messages_get("Login"), + GA_TabCycle,TRUE, + ButtonEnd, + CHILD_WeightedHeight,0, + LAYOUT_AddChild, lw->gadgets[GID_CANCEL] = ButtonObject, + GA_ID,GID_CANCEL, + GA_RelVerify,TRUE, + GA_Text,messages_get("Cancel"), + GA_TabCycle,TRUE, + ButtonEnd, + LayoutEnd, + CHILD_WeightedHeight,0, + EndGroup, + EndWindow; + + lw->win = (struct Window *)RA_OpenWindow(lw->objects[OID_MAIN]); + + lw->node = AddObject(window_list,AMINS_LOGINWINDOW); + lw->node->objstruct = lw; +} + +void ami_401login_close(struct gui_login_window *lw) +{ + DisposeObject(lw->objects[OID_MAIN]); + free(lw->host); + DelObject(lw->node); +} + +void ami_401login_login(struct gui_login_window *lw) +{ + ULONG *user,*pass; + STRPTR userpass; + + GetAttr(STRINGA_TextVal,lw->gadgets[GID_USER],(ULONG *)&user); + GetAttr(STRINGA_TextVal,lw->gadgets[GID_PASS],(ULONG *)&pass); + + userpass = ASPrintf("%s:%s",user,pass); + urldb_set_auth_details(lw->url,lw->realm,userpass); + FreeVec(userpass); + browser_window_go(lw->bw,lw->url,0,true); + + ami_401login_close(lw); } diff --git a/amiga/login.h b/amiga/login.h new file mode 100755 index 000000000..25aa57006 --- /dev/null +++ b/amiga/login.h @@ -0,0 +1,35 @@ +/* + * Copyright 2008 Chris Young <chris@unsatisfactorysoftware.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/>. + */ + +#ifndef AMIGA_LOGIN_H +#define AMIGA_LOGIN_H +struct gui_login_window { + struct Window *win; + Object *objects[OID_LAST]; + struct Gadget *gadgets[GID_LAST]; + struct nsObject *node; + ULONG pad[2]; + struct browser_window *bw; + char *url; + char *realm; + char *host; +}; + +void ami_401login_close(struct gui_login_window *lw); +void ami_401login_login(struct gui_login_window *lw); +#endif diff --git a/amiga/object.h b/amiga/object.h index 33e41b2be..ee6b611ba 100755 --- a/amiga/object.h +++ b/amiga/object.h @@ -25,6 +25,7 @@ #define AMINS_WINDOW 1 #define AMINS_FRAME 2 #define AMINS_DLWINDOW 3 +#define AMINS_LOGINWINDOW 3 struct nsObject { |