summaryrefslogtreecommitdiff
path: root/amiga/context_menu.c
diff options
context:
space:
mode:
authorChris Young <chris@unsatisfactorysoftware.co.uk>2011-02-28 19:31:35 +0000
committerChris Young <chris@unsatisfactorysoftware.co.uk>2011-02-28 19:31:35 +0000
commit4a174fd6706497b41007ad3c862286c926ef88b6 (patch)
treec30357c8f64698cc4603ef57be1b50c583b0c11b /amiga/context_menu.c
parentc03890339ecf69b577927e100b3fa69eb1227a53 (diff)
downloadnetsurf-4a174fd6706497b41007ad3c862286c926ef88b6.tar.gz
netsurf-4a174fd6706497b41007ad3c862286c926ef88b6.tar.bz2
Allow context menus in arbitrary positions outside the browsing area.
Add a Local History item to a new back button context menu, eventually this will give a recent history list. svn path=/trunk/netsurf/; revision=11858
Diffstat (limited to 'amiga/context_menu.c')
-rwxr-xr-xamiga/context_menu.c315
1 files changed, 193 insertions, 122 deletions
diff --git a/amiga/context_menu.c b/amiga/context_menu.c
index c8850ca5b..bab4aa74b 100755
--- a/amiga/context_menu.c
+++ b/amiga/context_menu.c
@@ -44,6 +44,30 @@ uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved);
bool ami_context_menu_copy_selection(const char *text, size_t length, struct box *box,
void *handle, const char *whitespace_text, size_t whitespace_length);
+enum {
+ CMID_SELECTFILE,
+ CMID_COPYURL,
+ CMID_URLOPENWIN,
+ CMID_URLOPENTAB,
+ CMID_SAVEURL,
+ CMID_SHOWOBJ,
+ CMID_COPYOBJ,
+ CMID_CLIPOBJ,
+ CMID_SAVEOBJ,
+ CMID_SAVEIFFOBJ,
+ CMID_SELALL,
+ CMID_SELCLEAR,
+ CMID_SELCUT,
+ CMID_SELCOPY,
+ CMID_SELPASTE,
+ CMID_SELSEARCH,
+ CMSUB_OBJECT,
+ CMSUB_URL,
+ CMSUB_SEL,
+ CMID_HISTORY,
+ CMID_LAST
+};
+
char *ctxmenulab[CMID_LAST];
struct ami_context_menu_selection
@@ -76,6 +100,9 @@ void ami_context_menu_init(void)
ctxmenulab[CMSUB_OBJECT] = ami_utf8_easy((char *)messages_get("Object"));
ctxmenulab[CMSUB_URL] = ami_utf8_easy((char *)messages_get("Link"));
ctxmenulab[CMSUB_SEL] = ami_utf8_easy((char *)messages_get("Selection"));
+
+ /* Back button */
+ ctxmenulab[CMID_HISTORY] = ami_utf8_easy((char *)messages_get("HistLocalNS"));
}
void ami_context_menu_free(void)
@@ -88,6 +115,28 @@ void ami_context_menu_free(void)
}
}
+BOOL ami_context_menu_mouse_trap(struct gui_window_2 *gwin, BOOL trap)
+{
+ int top, left, width, height;
+
+ if(option_context_menu == false) return;
+
+ if((option_kiosk_mode == false) && (trap == FALSE) &&
+ (gwin->bw->browser_window_type == BROWSER_WINDOW_NORMAL))
+ {
+ if(ami_gadget_hit(gwin->objects[GID_BACK],
+ gwin->win->MouseX, gwin->win->MouseY))
+ trap = TRUE;
+ }
+
+ if(gwin->rmbtrapped == trap) return;
+
+ SetWindowAttr(gwin->win, WA_RMBTrap, trap, 1);
+ gwin->rmbtrapped = trap;
+
+ return trap;
+}
+
void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
{
struct hlcache_handle *cc = gwin->bw->current_content;
@@ -108,147 +157,165 @@ void ami_context_menu_show(struct gui_window_2 *gwin,int x,int y)
PMA_MenuHandler, &gwin->popuphook,
TAG_DONE);
- curbox = html_get_box_tree(gwin->bw->current_content);
-
- while(curbox = box_at_point(curbox,x,y,&box_x,&box_y,&cc))
+ if(gwin->bw && gwin->bw->history &&
+ ami_gadget_hit(gwin->objects[GID_BACK],
+ gwin->win->MouseX, gwin->win->MouseY))
+ {
+ IDoMethod(gwin->objects[OID_MENU], PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_HISTORY],
+ PMIA_ID, CMID_HISTORY,
+ TAG_DONE),
+ ~0);
+
+ menuhascontent = true;
+ }
+ else
{
- if (curbox->style && css_computed_visibility(curbox->style) == CSS_VISIBILITY_HIDDEN) continue;
+ curbox = html_get_box_tree(gwin->bw->current_content);
- if(curbox->href)
+ while(curbox = box_at_point(curbox,x,y,&box_x,&box_y,&cc))
{
- IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_URL],
- PMSIMPLESUB,
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_URLOPENWIN],
- PMIA_ID,CMID_URLOPENWIN,
- PMIA_UserData,curbox->href,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_URLOPENTAB],
- PMIA_ID,CMID_URLOPENTAB,
- PMIA_UserData,curbox->href,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_COPYURL],
- 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,
+ if (curbox->style &&
+ css_computed_visibility(curbox->style) == CSS_VISIBILITY_HIDDEN)
+ continue;
+
+ if(curbox->href)
+ {
+ IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMSUB_URL],
+ PMSIMPLESUB,
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_URLOPENWIN],
+ PMIA_ID,CMID_URLOPENWIN,
+ PMIA_UserData,curbox->href,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_URLOPENTAB],
+ PMIA_ID,CMID_URLOPENTAB,
+ PMIA_UserData,curbox->href,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_COPYURL],
+ 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),
- TAG_DONE),
~0);
- menuhascontent = true;
- }
+ menuhascontent = true;
+ }
- if (curbox->object)
- {
- IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_OBJECT],
- PMSIMPLESUB,
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SHOWOBJ],
- PMIA_ID,CMID_SHOWOBJ,
- PMIA_UserData, content_get_url(curbox->object),
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_COPYOBJ],
- PMIA_ID,CMID_COPYOBJ,
- PMIA_UserData, content_get_url(curbox->object),
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_CLIPOBJ],
- PMIA_ID,CMID_CLIPOBJ,
- PMIA_UserData,curbox->object,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEOBJ],
- PMIA_ID,CMID_SAVEOBJ,
- PMIA_UserData,curbox->object,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEIFFOBJ],
- PMIA_ID,CMID_SAVEIFFOBJ,
- PMIA_UserData,curbox->object,
+ if (curbox->object)
+ {
+ IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMSUB_OBJECT],
+ PMSIMPLESUB,
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SHOWOBJ],
+ PMIA_ID,CMID_SHOWOBJ,
+ PMIA_UserData, content_get_url(curbox->object),
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_COPYOBJ],
+ PMIA_ID,CMID_COPYOBJ,
+ PMIA_UserData, content_get_url(curbox->object),
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_CLIPOBJ],
+ PMIA_ID,CMID_CLIPOBJ,
+ PMIA_UserData,curbox->object,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEOBJ],
+ PMIA_ID,CMID_SAVEOBJ,
+ PMIA_UserData,curbox->object,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SAVEIFFOBJ],
+ PMIA_ID,CMID_SAVEIFFOBJ,
+ PMIA_UserData,curbox->object,
+ TAG_DONE),
TAG_DONE),
TAG_DONE),
- TAG_DONE),
~0);
- menuhascontent = true;
- }
+ menuhascontent = true;
+ }
- if(curbox->text)
- {
- BOOL disabled_readonly = selection_read_only(gwin->bw->sel);
- BOOL disabled_noselection = !selection_defined(gwin->bw->sel);
-
- IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMSUB_SEL],
- PMIA_SubMenu, NewObject(POPUPMENU_GetClass(), NULL,
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELCUT],
- PMIA_ID,CMID_SELCUT,
- PMIA_Disabled, disabled_noselection && disabled_readonly,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELCOPY],
- PMIA_ID,CMID_SELCOPY,
- PMIA_Disabled, disabled_noselection,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELPASTE],
- PMIA_ID,CMID_SELPASTE,
- PMIA_Disabled, (gwin->bw->window->c_h == 0),
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELALL],
- PMIA_ID,CMID_SELALL,
- //PMIA_UserData,curbox->href,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELCLEAR],
- PMIA_ID,CMID_SELCLEAR,
- PMIA_Disabled, disabled_noselection,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, ~0,
- TAG_DONE),
- PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELSEARCH],
- PMIA_ID,CMID_SELSEARCH,
- PMIA_Disabled, disabled_noselection,
+ if(curbox->text)
+ {
+ BOOL disabled_readonly = selection_read_only(gwin->bw->sel);
+ BOOL disabled_noselection = !selection_defined(gwin->bw->sel);
+
+ IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMSUB_SEL],
+ PMIA_SubMenu, NewObject(POPUPMENU_GetClass(), NULL,
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SELCUT],
+ PMIA_ID,CMID_SELCUT,
+ PMIA_Disabled, disabled_noselection && disabled_readonly,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SELCOPY],
+ PMIA_ID,CMID_SELCOPY,
+ PMIA_Disabled, disabled_noselection,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SELPASTE],
+ PMIA_ID,CMID_SELPASTE,
+ PMIA_Disabled, (gwin->bw->window->c_h == 0),
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SELALL],
+ PMIA_ID,CMID_SELALL,
+ //PMIA_UserData,curbox->href,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SELCLEAR],
+ PMIA_ID,CMID_SELCLEAR,
+ PMIA_Disabled, disabled_noselection,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, ~0,
+ TAG_DONE),
+ PMA_AddItem,NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SELSEARCH],
+ PMIA_ID,CMID_SELSEARCH,
+ PMIA_Disabled, disabled_noselection,
+ TAG_DONE),
TAG_DONE),
TAG_DONE),
- TAG_DONE),
~0);
- menuhascontent = true;
- }
+ menuhascontent = true;
+ }
- if (curbox->gadget)
- {
- switch (curbox->gadget->type)
+ if (curbox->gadget)
{
- case GADGET_FILE:
- IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
- NewObject(POPUPMENU_GetItemClass(), NULL,
- PMIA_Title, (ULONG)ctxmenulab[CMID_SELECTFILE],
- PMIA_ID,CMID_SELECTFILE,
- PMIA_UserData,curbox,
- TAG_DONE),
- ~0);
-
- menuhascontent = true;
- break;
+ switch (curbox->gadget->type)
+ {
+ case GADGET_FILE:
+ IDoMethod(gwin->objects[OID_MENU],PM_INSERT,
+ NewObject(POPUPMENU_GetItemClass(), NULL,
+ PMIA_Title, (ULONG)ctxmenulab[CMID_SELECTFILE],
+ PMIA_ID,CMID_SELECTFILE,
+ PMIA_UserData,curbox,
+ TAG_DONE),
+ ~0);
+
+ menuhascontent = true;
+ break;
+ }
}
}
}
@@ -405,6 +472,10 @@ uint32 ami_context_menu_hook(struct Hook *hook,Object *item,APTR reserved)
}
break;
+ case CMID_HISTORY:
+ ami_history_open(gwin->bw, gwin->bw->history);
+ break;
+
case CMID_SELCUT:
browser_window_key_press(gwin->bw, KEY_CUT_SELECTION);
break;