diff options
Diffstat (limited to 'amiga/ctxmenu.c')
-rw-r--r-- | amiga/ctxmenu.c | 165 |
1 files changed, 133 insertions, 32 deletions
diff --git a/amiga/ctxmenu.c b/amiga/ctxmenu.c index 2b7575321..bf16e21b0 100644 --- a/amiga/ctxmenu.c +++ b/amiga/ctxmenu.c @@ -23,29 +23,43 @@ #ifdef __amigaos4__ #include <string.h> +#include <proto/exec.h> #include <proto/intuition.h> -#include <classes/window.h> + +#include <proto/bitmap.h> #include <images/bitmap.h> +#include <proto/window.h> +#include <classes/window.h> + #include <intuition/menuclass.h> #include <reaction/reaction_macros.h> #include "amiga/ctxmenu.h" #include "amiga/gui.h" #include "amiga/libs.h" +#include "amiga/theme.h" +#include "amiga/utf8.h" + +#include "desktop/browser.h" +#include "desktop/mouse.h" #include "utils/log.h" +#include "utils/messages.h" +#include "utils/nsoption.h" enum { AMI_CTX_ID_TEST = 1, + AMI_CTX_ID_URLOPEN, + AMI_CTX_ID_URLOPENWIN, + AMI_CTX_ID_URLOPENTAB, AMI_CTX_ID_MAX }; static Object *ctxmenu_obj = NULL; -static struct Hook ctxmenu_hook; static struct Hook ctxmenu_item_hook[AMI_CTX_ID_MAX]; static char *ctxmenu_item_label[AMI_CTX_ID_MAX]; -static char *ctxmenu_item_image[AMI_CTX_ID_MAX]; +static Object *ctxmenu_item_image[AMI_CTX_ID_MAX]; /** Menu functions - called automatically by RA_HandleInput **/ HOOKF(void, ami_ctxmenu_item_test, APTR, window, struct IntuiMessage *) @@ -53,57 +67,143 @@ HOOKF(void, ami_ctxmenu_item_test, APTR, window, struct IntuiMessage *) printf("testing\n"); } +HOOKF(void, ami_ctxmenu_item_urlopentab, APTR, window, struct IntuiMessage *) +{ + struct browser_window *bw; + nsurl *url = (nsurl *)hook->h_Data; + struct gui_window_2 *gwin; + + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin); + nserror error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY | BW_CREATE_TAB, + url, + browser_window_get_url(gwin->gw->bw), + gwin->gw->bw, + &bw); + + if (error != NSERROR_OK) + warn_user(messages_get_errorcode(error), 0); +} + +HOOKF(void, ami_ctxmenu_item_urlopenwin, APTR, window, struct IntuiMessage *) +{ + struct browser_window *bw; + nsurl *url = (nsurl *)hook->h_Data; + struct gui_window_2 *gwin; + + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin); + nserror error = browser_window_create(BW_CREATE_CLONE | BW_CREATE_HISTORY, + url, + browser_window_get_url(gwin->gw->bw), + gwin->gw->bw, + &bw); + + if (error != NSERROR_OK) + warn_user(messages_get_errorcode(error), 0); +} + + +/** Add an initialised item to a context menu **/ +static void ami_ctxmenu_add_item(Object *root_menu, int id, APTR data) +{ + ctxmenu_item_hook[id].h_Data = data; + + IDoMethod(root_menu, OM_ADDMEMBER, MStrip, + MA_Type, T_ITEM, + MA_Label, ctxmenu_item_label[id], + MA_ID, id, + MA_Image, ctxmenu_item_image[id], + MA_UserData, &ctxmenu_item_hook[id], + MEnd); +} + /** Hook function called by Intuition, creates context menu structure **/ -static uint32 ctxmenu_hook_func(struct Hook *hook, struct Window *window, struct ContextMenuMsg *msg) +static uint32 ami_ctxmenu_hook_func(struct Hook *hook, struct Window *window, struct ContextMenuMsg *msg) { - if(msg->State != CM_QUERY) return 0; + Object *root_menu; + bool ctxmenu_has_content = false; + struct gui_window_2 *gwin = hook->h_Data; + struct hlcache_handle *cc = browser_window_get_content(gwin->gw->bw); + struct browser_window_features ccdata; + int mx = window->MouseX; + int my = window->MouseY; + int x, y; - ctxmenu_item_hook[AMI_CTX_ID_TEST].h_Entry = (void *)ami_ctxmenu_item_test; - ctxmenu_item_hook[AMI_CTX_ID_TEST].h_Data = 0; + if(msg->State != CM_QUERY) return 0; + if(nsoption_bool(kiosk_mode) == true) return 0; +// check window is active if(ctxmenu_obj != NULL) DisposeObject(ctxmenu_obj); ctxmenu_obj = MStrip, MA_Type, T_ROOT, - MA_AddChild, MStrip, + MA_AddChild, root_menu = MStrip, MA_Type, T_MENU, MA_Label, NULL, //"NetSurf", - MA_AddChild, MStrip, - MA_Type, T_ITEM, - MA_Label, ctxmenu_item_label[AMI_CTX_ID_TEST], - MA_ID, AMI_CTX_ID_TEST, - MA_Image, BitMapObj, - IA_Scalable, TRUE, - BITMAP_SourceFile, ctxmenu_item_image[AMI_CTX_ID_TEST], - BITMAP_Screen, scrn, - BITMAP_Masking, TRUE, - BITMAP_Width, 16, - BITMAP_Height, 16, - BitMapEnd, - MA_UserData, &ctxmenu_item_hook[AMI_CTX_ID_TEST], - MEnd, + MA_EmbeddedKey, FALSE, + MA_FreeImage, FALSE, MEnd, MEnd; - msg->Menu = ctxmenu_obj; + if(ami_mouse_to_ns_coords(gwin, &x, &y, mx, my) == false) { + /* Outside browser render area */ + return 0; + } + + browser_window_get_features(gwin->gw->bw, x, y, &ccdata); + + if(ccdata.link) { + ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_URLOPENTAB, ccdata.link); + ami_ctxmenu_add_item(root_menu, AMI_CTX_ID_URLOPENWIN, ccdata.link); + ctxmenu_has_content = true; + } + + if(ctxmenu_has_content == true) { + msg->Menu = ctxmenu_obj; + ami_set_pointer(gwin, GUI_POINTER_DEFAULT, false); + } return 0; } +/** Initial menu item creation **/ +static void ami_ctxmenu_alloc_item(int id, const char *label, const char *image, void *func) +{ + ctxmenu_item_label[id] = ami_utf8_easy(messages_get(label)); + ctxmenu_item_image[id] = BitMapObj, + BITMAP_Screen, scrn, + BITMAP_SourceFile, image, + BITMAP_Masking, TRUE, + BitMapEnd; + + SetAttrs(ctxmenu_item_image[id], + BITMAP_Width, 16, + BITMAP_Height, 16, + TAG_DONE); + + ctxmenu_item_hook[id].h_Entry = func; + ctxmenu_item_hook[id].h_Data = 0; +} + +/** Exported interface documented in ctxmenu.h **/ +struct Hook *ami_ctxmenu_get_hook(APTR data) +{ + return AllocSysObjectTags(ASOT_HOOK, + ASOHOOK_Entry, (HOOKFUNC)ami_ctxmenu_hook_func, + ASOHOOK_Data, data, + TAG_DONE); +} + /** Exported interface documented in ctxmenu.h **/ -struct Hook *ami_ctxmenu_get_hook(void) +void ami_ctxmenu_release_hook(struct Hook *hook) { - return &ctxmenu_hook; + FreeSysObject(ASOT_HOOK, hook); } /** Exported interface documented in ctxmenu.h **/ void ami_ctxmenu_init(void) { - ctxmenu_hook.h_Entry = (HOOKFUNC)ctxmenu_hook_func; - ctxmenu_hook.h_Data = 0; - - ctxmenu_item_label[AMI_CTX_ID_TEST] = strdup("test item"); - ctxmenu_item_image[AMI_CTX_ID_TEST] = strdup("TBimages:list_info"); + ami_ctxmenu_alloc_item(AMI_CTX_ID_URLOPENWIN, "LinkNewWin", "TBImages:list_app", ami_ctxmenu_item_urlopenwin); + ami_ctxmenu_alloc_item(AMI_CTX_ID_URLOPENTAB, "LinkNewTab", "TBImages:list_add", ami_ctxmenu_item_urlopentab); } /** Exported interface documented in ctxmenu.h **/ @@ -111,11 +211,12 @@ void ami_ctxmenu_free(void) { for(int i = 1; i < AMI_CTX_ID_MAX; i++) { if(ctxmenu_item_label[i] != NULL) { - free(ctxmenu_item_label[i]); + ami_utf8_free(ctxmenu_item_label[i]); ctxmenu_item_label[i] = NULL; } + if(ctxmenu_item_image[i] != NULL) { - free(ctxmenu_item_image[i]); + DisposeObject(ctxmenu_item_image[i]); ctxmenu_item_image[i] = NULL; } } |