From 944248ce3205881df9268d2c3f9f0cb52fc2f075 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Thu, 3 Sep 2015 00:24:04 +0100 Subject: Rough outline for Intuition-based context menu --- amiga/Makefile.target | 2 +- amiga/ctxmenu.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++ amiga/ctxmenu.h | 45 ++++++++++++++++++ amiga/gui.c | 8 +++- amiga/gui.h | 9 ++-- amiga/menu.c | 2 +- desktop/gui_window.h | 1 + 7 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 amiga/ctxmenu.c create mode 100644 amiga/ctxmenu.h diff --git a/amiga/Makefile.target b/amiga/Makefile.target index e704eb5f4..62c26b21d 100644 --- a/amiga/Makefile.target +++ b/amiga/Makefile.target @@ -70,7 +70,7 @@ MESSAGES_FILTER=ami S_AMIGA := gui.c tree.c history.c hotlist.c schedule.c file.c \ misc.c bitmap.c font.c filetype.c utf8.c login.c \ plotters.c object.c menu.c save_pdf.c arexx.c version.c \ - cookies.c context_menu.c clipboard.c help.c font_scan.c \ + cookies.c context_menu.c ctxmenu.c clipboard.c help.c font_scan.c \ launch.c search.c history_local.c download.c iff_dr2d.c \ sslcert.c gui_options.c print.c theme.c drag.c icon.c libs.c \ datatypes.c dt_picture.c dt_anim.c dt_sound.c plugin_hack.c \ diff --git a/amiga/ctxmenu.c b/amiga/ctxmenu.c new file mode 100644 index 000000000..2b7575321 --- /dev/null +++ b/amiga/ctxmenu.c @@ -0,0 +1,127 @@ +/* + * Copyright 2015 Chris Young + * + * 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 . + */ + +/** \file + * Intuition-based context menu operations + */ + +#ifdef __amigaos4__ +#include + +#include +#include +#include +#include +#include + +#include "amiga/ctxmenu.h" +#include "amiga/gui.h" +#include "amiga/libs.h" + +#include "utils/log.h" + +enum { + AMI_CTX_ID_TEST = 1, + 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]; + +/** Menu functions - called automatically by RA_HandleInput **/ +HOOKF(void, ami_ctxmenu_item_test, APTR, window, struct IntuiMessage *) +{ + printf("testing\n"); +} + +/** Hook function called by Intuition, creates context menu structure **/ +static uint32 ctxmenu_hook_func(struct Hook *hook, struct Window *window, struct ContextMenuMsg *msg) +{ + if(msg->State != CM_QUERY) return 0; + + 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(ctxmenu_obj != NULL) DisposeObject(ctxmenu_obj); + + ctxmenu_obj = MStrip, + MA_Type, T_ROOT, + MA_AddChild, 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, + MEnd, + MEnd; + + msg->Menu = ctxmenu_obj; + + return 0; +} + +/** Exported interface documented in ctxmenu.h **/ +struct Hook *ami_ctxmenu_get_hook(void) +{ + return &ctxmenu_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"); +} + +/** Exported interface documented in ctxmenu.h **/ +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]); + ctxmenu_item_label[i] = NULL; + } + if(ctxmenu_item_image[i] != NULL) { + free(ctxmenu_item_image[i]); + ctxmenu_item_image[i] = NULL; + } + } + + if(ctxmenu_obj != NULL) DisposeObject(ctxmenu_obj); + ctxmenu_obj = NULL; +} +#endif + diff --git a/amiga/ctxmenu.h b/amiga/ctxmenu.h new file mode 100644 index 000000000..e23c723f1 --- /dev/null +++ b/amiga/ctxmenu.h @@ -0,0 +1,45 @@ +/* + * Copyright 2015 Chris Young + * + * 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 . + */ + +/** \file + * Interface to Intuition-based context menu operations + */ + +#ifndef AMIGA_CTXMENU_H +#define AMIGA_CTXMENU_H 1 + +struct Hook; + +/** + * Initialise context menus code + */ +void ami_ctxmenu_init(void); + +/** + * Cleanup context menus code + */ +void ami_ctxmenu_free(void); + +/** + * Get a Hook for WA_ContextMenuHook + * + * \returns pointer to a struct Hook + */ +struct Hook *ami_ctxmenu_get_hook(void); +#endif + diff --git a/amiga/gui.c b/amiga/gui.c index 3de20bf88..46973f282 100644 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 Chris Young + * Copyright 2008-2015 Chris Young * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -121,6 +121,7 @@ #include "amiga/clipboard.h" #include "amiga/context_menu.h" #include "amiga/cookies.h" +#include "amiga/ctxmenu.h" #include "amiga/datatypes.h" #include "amiga/download.h" #include "amiga/drag.h" @@ -2944,6 +2945,7 @@ static void gui_quit(void) LOG("Freeing menu items"); ami_context_menu_free(); + ami_ctxmenu_free(); ami_menu_free_glyphs(); LOG("Freeing mouse pointers"); @@ -3755,7 +3757,7 @@ gui_window_create(struct browser_window *bw, } ami_NewMinList(&g->shared->shared_pens); - + g->shared->scrollerhook.h_Entry = (void *)ami_scroller_hook; g->shared->scrollerhook.h_Data = g->shared; @@ -3930,6 +3932,7 @@ gui_window_create(struct browser_window *bw, WA_ReportMouse,TRUE, refresh_mode, TRUE, WA_SizeBBottom, TRUE, + WA_ContextMenuHook, ami_ctxmenu_get_hook(), WA_IDCMP, IDCMP_MENUPICK | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | IDCMP_RAWKEY | idcmp_sizeverify | @@ -5430,6 +5433,7 @@ int main(int argc, char** argv) ami_amiupdate(); /* set env-vars for AmiUpdate */ ami_init_fonts(); ami_context_menu_init(); + ami_ctxmenu_init(); save_complete_init(); ami_theme_init(); ami_init_mouse_pointers(); diff --git a/amiga/gui.h b/amiga/gui.h index adad63d4f..7ac140b19 100755 --- a/amiga/gui.h +++ b/amiga/gui.h @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 Chris Young + * Copyright 2008-2015 Chris Young * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -18,15 +18,16 @@ #ifndef AMIGA_GUI_H #define AMIGA_GUI_H - +#include #include -#include "amiga/object.h" #include #include #include +#include "amiga/menu.h" +#include "amiga/object.h" #include "amiga/os3support.h" #include "amiga/plotters.h" -#include "amiga/menu.h" +#include "desktop/gui_window.h" #ifdef __amigaos4__ #define HOOKF(ret,func,type,ptr,msgtype) static ret func(struct Hook *hook, type ptr, msgtype msg) diff --git a/amiga/menu.c b/amiga/menu.c index 571f411fd..c4e0a51d7 100644 --- a/amiga/menu.c +++ b/amiga/menu.c @@ -561,7 +561,7 @@ static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, gwin->menulab[num] = ami_utf8_easy(messages_get(label)); } } - + gwin->menuicon[num] = NULL; if(key) gwin->menukey[num] = key; if(func) gwin->menu_hook[num].h_Entry = (HOOKFUNC)func; diff --git a/desktop/gui_window.h b/desktop/gui_window.h index 7ecd3c21d..7f542ff7b 100644 --- a/desktop/gui_window.h +++ b/desktop/gui_window.h @@ -63,6 +63,7 @@ struct hlcache_handle; struct nsurl; enum gui_pointer_shape; +enum nserror; /** * Graphical user interface window function table. -- cgit v1.2.3