From 4cf69357612dd4cd92e7af7ec32180412a21d1d7 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 31 Jan 2009 23:45:25 +0000 Subject: [PATCH] Added context menu option to download the link target. Added SAVEAS/K to OPEN ARexx command to download a URL instead of displaying it. svn path=/trunk/netsurf/; revision=6326 --- amiga/arexx.c | 11 ++++-- amiga/context_menu.c | 11 +++++- amiga/context_menu.h | 1 + amiga/dist/NetSurf.guide | 2 +- amiga/gui.c | 82 +++++++++++++++++++++++++++++++++++----- amiga/gui.h | 3 +- 6 files changed, 94 insertions(+), 16 deletions(-) diff --git a/amiga/arexx.c b/amiga/arexx.c index 6d5251773..bef46cdf3 100755 --- a/amiga/arexx.c +++ b/amiga/arexx.c @@ -54,7 +54,7 @@ STATIC VOID rx_save(struct ARexxCmd *, struct RexxMsg *); STATIC struct ARexxCmd Commands[] = { - {"OPEN",RX_OPEN,rx_open,"URL/A,NEW=NEWWINDOW/S", 0, NULL, 0, 0, NULL }, + {"OPEN",RX_OPEN,rx_open,"URL/A,NEW=NEWWINDOW/S,SAVEAS/K", 0, NULL, 0, 0, NULL }, {"QUIT",RX_QUIT,rx_quit,NULL, 0, NULL, 0, 0, NULL }, {"TOFRONT",RX_TOFRONT,rx_tofront,NULL, 0, NULL, 0, 0, NULL }, {"GETURL",RX_GETURL,rx_geturl,NULL, 0, NULL, 0, 0, NULL }, @@ -79,7 +79,7 @@ BOOL ami_arexx_init(void) } else { -/* Create a temporary ARexx port so will can send commands to the NetSurf which +/* Create a temporary ARexx port so we can send commands to the NetSurf which * is already running */ arexx_obj = ARexxObject, AREXX_HostName,"NETSURF", @@ -109,7 +109,12 @@ void ami_arexx_cleanup(void) STATIC VOID rx_open(struct ARexxCmd *cmd, struct RexxMsg *rxm __attribute__((unused))) { - if(cmd->ac_ArgList[1]) + if(cmd->ac_ArgList[2]) + { + curbw->window->dlfilename = strdup(cmd->ac_ArgList[2]); + browser_window_download(curbw,(char *)cmd->ac_ArgList[0],NULL); + } + else if(cmd->ac_ArgList[1]) { browser_window_create((char *)cmd->ac_ArgList[0],NULL,NULL,true,false); } diff --git a/amiga/context_menu.c b/amiga/context_menu.c index c6e588458..44a8819a7 100755 --- a/amiga/context_menu.c +++ b/amiga/context_menu.c @@ -43,7 +43,7 @@ void ami_context_menu_init(void) ctxmenulab[CMID_SHOWOBJ] = ami_utf8_easy((char *)messages_get("ObjShow")); ctxmenulab[CMID_COPYOBJ] = ami_utf8_easy((char *)messages_get("CopyURL")); ctxmenulab[CMID_SAVEOBJ] = ami_utf8_easy((char *)messages_get("ObjSave")); - + ctxmenulab[CMID_SAVEURL] = ami_utf8_easy((char *)messages_get("LinkDload")); ctxmenulab[CMID_URLOPENWIN] = ami_utf8_easy((char *)messages_get("LinkNewWin")); ctxmenulab[CMID_URLOPENTAB] = ami_utf8_easy((char *)messages_get("LinkNewTab")); @@ -108,6 +108,11 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y) PMIA_ID,CMID_COPYURL, PMIA_UserData,curbox->href, TAG_DONE), + PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL, + PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEURL], + PMIA_ID,CMID_SAVEURL, + PMIA_UserData,curbox->href, + TAG_DONE), TAG_DONE), TAG_DONE), ~0); @@ -239,6 +244,10 @@ uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved) bw = browser_window_create(userdata,gwin->bw, gwin->bw->current_content->url, true, true); break; + case CMID_SAVEURL: + browser_window_download(gwin->bw,userdata,gwin->bw->current_content->url); + break; + case CMID_SHOWOBJ: browser_window_go(gwin->bw,userdata,gwin->bw->current_content->url,true); break; diff --git a/amiga/context_menu.h b/amiga/context_menu.h index 31f11ce16..2c13fe957 100755 --- a/amiga/context_menu.h +++ b/amiga/context_menu.h @@ -25,6 +25,7 @@ enum { CMID_COPYURL, CMID_URLOPENWIN, CMID_URLOPENTAB, + CMID_SAVEURL, CMID_SHOWOBJ, CMID_COPYOBJ, CMID_SAVEOBJ, diff --git a/amiga/dist/NetSurf.guide b/amiga/dist/NetSurf.guide index 2bb8e0678..7d8b36d8a 100755 --- a/amiga/dist/NetSurf.guide +++ b/amiga/dist/NetSurf.guide @@ -54,7 +54,7 @@ NetSurf's ARexx port is called NETSURF. Commands are: -@{b}OPEN URL/A,NEW=NEWWINDOW/S@{ub} Opens URL in current window or a new window if NEWWINDOW is specified. +@{b}OPEN URL/A,NEW=NEWWINDOW/S,SAVEAS/K@{ub} Opens URL in current window or a new window if NEWWINDOW is specified. Saves the location without displaying if SAVEAS and a filename is specified (SAVEAS available in 2.6325) @{b}SAVE FILENAME/A@{ub} (2.6027) Saves current page source to FILENAME @{b}QUIT@{ub} Quits NetSurf @{b}TOFRONT@{ub} Brings NetSurf's screen to the front diff --git a/amiga/gui.c b/amiga/gui.c index db03f2d64..39614eadc 100755 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -717,7 +717,7 @@ void ami_handle_msg(void) GetAttr(SPACE_AreaBox,gwin->gadgets[GID_BROWSER],(ULONG *)&bbox); GetAttr(SCROLLER_Top,gwin->objects[OID_HSCROLL],(ULONG *)&xs); - x = gwin->win->MouseX - bbox->Left +xs; + x = gwin->win->MouseX - bbox->Left +xs; // mousex should be in intuimessage GetAttr(SCROLLER_Top,gwin->objects[OID_VSCROLL],(ULONG *)&ys); y = gwin->win->MouseY - bbox->Top + ys; @@ -1971,6 +1971,57 @@ void gui_window_set_title(struct gui_window *g, const char *title) void gui_window_redraw(struct gui_window *g, int x0, int y0, int x1, int y1) { gui_window_redraw_window(g); // temporary +#if 0 +this doesn't actually redraw the section as it should... + struct content *c; + ULONG hcurrent,vcurrent,xoffset,yoffset,width=800,height=600; + struct IBox *bbox; + ULONG cur_tab = 0; + + if(!g) return; + + if(g->tab_node) GetAttr(CLICKTAB_Current,g->shared->gadgets[GID_TABS],(ULONG *)&cur_tab); + + if(!((cur_tab == g->tab) || (g->shared->tabs == 0))) + { + return; + } + + GetAttr(SPACE_AreaBox,g->shared->gadgets[GID_BROWSER],(ULONG *)&bbox); + GetAttr(SCROLLER_Top,g->shared->objects[OID_HSCROLL],(ULONG *)&hcurrent); + GetAttr(SCROLLER_Top,g->shared->objects[OID_VSCROLL],(ULONG *)&vcurrent); + + c = g->shared->bw->current_content; + + if(!c) return; + if (c->locked) return; + + current_redraw_browser = g->shared->bw; + + width=bbox->Width; + height=bbox->Height; + xoffset=bbox->Left+x0; + yoffset=bbox->Top+y0; + + plot=amiplot; + +// if (c->type == CONTENT_HTML) scale = 1; + + content_redraw(c, + xoffset-hcurrent, + yoffset-vcurrent, + x1, + y1, + 0,0,width,height, + g->shared->bw->scale, + 0xFFFFFF); + + current_redraw_browser = NULL; + + ami_update_buttons(g->shared); + + BltBitMapRastPort(glob.bm,0,0,g->shared->win->RPort,xoffset,yoffset,width,height,0x0C0); // this blit needs optimising +#endif } void gui_window_redraw_window(struct gui_window *g) @@ -1994,7 +2045,7 @@ void gui_window_update_box(struct gui_window *g, struct content *c; ULONG hcurrent,vcurrent,xoffset,yoffset,width=800,height=600; struct IBox *bbox; - ULONG cur_tab = 0; + ULONG cur_tab = 0,x0,y0,x1,y1; if(!g) return; @@ -2029,6 +2080,7 @@ void gui_window_update_box(struct gui_window *g, // if (c->type == CONTENT_HTML) scale = 1; +/* this needs fixing as it appears to be redrawing the entire page */ content_redraw(data->redraw.object, floorf((data->redraw.object_x * g->shared->bw->scale)-hcurrent), @@ -2124,6 +2176,7 @@ void ami_do_redraw(struct gui_window_2 *g,bool scroll) else { */ + content_redraw(c, -hcurrent /* * g->bw->scale */, -vcurrent /* * g->bw->scale */, width-hcurrent /* * g->bw->scale */, @@ -2597,16 +2650,25 @@ struct gui_download_window *gui_download_window_create(const char *url, struct gui_download_window *dw; APTR va[3]; - if(AslRequestTags(savereq, - ASLFR_TitleText,messages_get("NetSurf"), - ASLFR_Screen,scrn, - ASLFR_InitialFile,FilePart(url), - TAG_DONE)) + if(gui->dlfilename) { - strlcpy(&fname,savereq->fr_Drawer,1024); - AddPart((STRPTR)&fname,savereq->fr_File,1024); + strcpy(fname,gui->dlfilename); + free(gui->dlfilename); + gui->dlfilename = NULL; + } + else + { + if(AslRequestTags(savereq, + ASLFR_TitleText,messages_get("NetSurf"), + ASLFR_Screen,scrn, + ASLFR_InitialFile,FilePart(url), + TAG_DONE)) + { + strlcpy(&fname,savereq->fr_Drawer,1024); + AddPart((STRPTR)&fname,savereq->fr_File,1024); + } + else return NULL; } - else return NULL; dw = AllocVec(sizeof(struct gui_download_window),MEMF_PRIVATE | MEMF_CLEAR); diff --git a/amiga/gui.h b/amiga/gui.h index c1958299b..7ab824a5e 100755 --- a/amiga/gui.h +++ b/amiga/gui.h @@ -116,7 +116,8 @@ struct gui_window int c_h; int scrollx; int scrolly; - struct browser_window *bw; // not used + char *dlfilename; +// struct browser_window *bw; // not used }; struct gui_globals