Rough outline for Intuition-based context menu

This commit is contained in:
Chris Young 2015-09-03 00:24:04 +01:00
parent 52d182e71e
commit 944248ce32
7 changed files with 186 additions and 8 deletions

View File

@ -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 \

127
amiga/ctxmenu.c Normal file
View File

@ -0,0 +1,127 @@
/*
* Copyright 2015 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/>.
*/
/** \file
* Intuition-based context menu operations
*/
#ifdef __amigaos4__
#include <string.h>
#include <proto/intuition.h>
#include <classes/window.h>
#include <images/bitmap.h>
#include <intuition/menuclass.h>
#include <reaction/reaction_macros.h>
#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

45
amiga/ctxmenu.h Normal file
View File

@ -0,0 +1,45 @@
/*
* Copyright 2015 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/>.
*/
/** \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

View File

@ -1,5 +1,5 @@
/*
* Copyright 2008-2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
* Copyright 2008-2015 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* 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();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2008-2014 Chris Young <chris@unsatisfactorysoftware.co.uk>
* Copyright 2008-2015 Chris Young <chris@unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@ -18,15 +18,16 @@
#ifndef AMIGA_GUI_H
#define AMIGA_GUI_H
#include <stdbool.h>
#include <graphics/rastport.h>
#include "amiga/object.h"
#include <intuition/classusr.h>
#include <dos/dos.h>
#include <devices/inputevent.h>
#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)

View File

@ -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;

View File

@ -63,6 +63,7 @@ struct hlcache_handle;
struct nsurl;
enum gui_pointer_shape;
enum nserror;
/**
* Graphical user interface window function table.