From a86f2c8dd35c0cd8ba2f87097a68ad32373c28b5 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Fri, 6 Jan 2017 18:27:09 +0000 Subject: Migrate global history to corewindow --- frontends/amiga/cookies.c | 2 +- frontends/amiga/file.c | 3 + frontends/amiga/file.h | 4 +- frontends/amiga/gui.c | 7 +- frontends/amiga/history.c | 405 ++++++++++++++++++++++++++++++++++++++++++++-- frontends/amiga/history.h | 16 +- frontends/amiga/menu.c | 2 +- 7 files changed, 409 insertions(+), 30 deletions(-) mode change 100755 => 100644 frontends/amiga/history.c mode change 100755 => 100644 frontends/amiga/history.h diff --git a/frontends/amiga/cookies.c b/frontends/amiga/cookies.c index 18ca425ec..f428881a4 100644 --- a/frontends/amiga/cookies.c +++ b/frontends/amiga/cookies.c @@ -258,7 +258,7 @@ static void ami_cookies_menulabs(struct ami_menu_data **md) ami_menu_alloc_item(md, AMI_COOKIE_M_SNAPSHOT, NM_ITEM, "SnapshotWindow", 0, "TBImages:list_hold", ami_cookies_menu_item_project_snapshot, NULL, 0); ami_menu_alloc_item(md, AMI_COOKIE_M_BAR_P2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); - ami_menu_alloc_item(md, AMI_COOKIE_M_CLOSE, NM_ITEM, "CloseWindow", 0, "TBImages:list_cancel", + ami_menu_alloc_item(md, AMI_COOKIE_M_CLOSE, NM_ITEM, "CloseWindow", 'K', "TBImages:list_cancel", ami_cookies_menu_item_project_close, NULL, 0); ami_menu_alloc_item(md, AMI_COOKIE_M_EDIT, NM_TITLE, "Edit", 0, NULL, NULL, NULL, 0); diff --git a/frontends/amiga/file.c b/frontends/amiga/file.c index 04f8e8aca..0fd43781d 100644 --- a/frontends/amiga/file.c +++ b/frontends/amiga/file.c @@ -46,6 +46,9 @@ static struct Hook aslhookfunc; +struct FileRequester *filereq; +struct FileRequester *savereq; + HOOKF(ULONG, ami_file_asl_mime_hook, struct FileRequester *, fr, struct AnchorPathOld *) { char fname[1024]; diff --git a/frontends/amiga/file.h b/frontends/amiga/file.h index 29a76c477..9120fff61 100644 --- a/frontends/amiga/file.h +++ b/frontends/amiga/file.h @@ -21,8 +21,8 @@ struct hlcache_object; struct selection; struct gui_window_2; -struct FileRequester *filereq; -struct FileRequester *savereq; +extern struct FileRequester *filereq; +extern struct FileRequester *savereq; enum { AMINS_SAVE_SOURCE, diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c index 9fce6813f..7c92a40d7 100644 --- a/frontends/amiga/gui.c +++ b/frontends/amiga/gui.c @@ -547,6 +547,11 @@ static void ami_set_screen_defaults(struct Screen *screen) nsoption_default_set_int(cookies_window_xsize, width); nsoption_default_set_int(cookies_window_ysize, height); + nsoption_default_set_int(history_window_ypos, top); + nsoption_default_set_int(history_window_xpos, left); + nsoption_default_set_int(history_window_xsize, width); + nsoption_default_set_int(history_window_ysize, height); + nsoption_default_set_int(window_x, 0); nsoption_default_set_int(window_y, screen->BarHeight + 1); nsoption_default_set_int(window_width, screen->Width); @@ -1014,7 +1019,6 @@ static void gui_init2(int argc, char** argv) /**/ ami_hotlist_initialise(nsoption_charp(hotlist_file)); - ami_global_history_initialise(); search_web_select_provider(nsoption_int(search_provider)); if (notalreadyrunning && @@ -3038,7 +3042,6 @@ static void gui_quit(void) urldb_save(nsoption_charp(url_file)); urldb_save_cookies(nsoption_charp(cookie_file)); ami_hotlist_free(nsoption_charp(hotlist_file)); - ami_global_history_free(); #ifdef __amigaos4__ if(IApplication && ami_appid) UnregisterApplication(ami_appid, NULL); diff --git a/frontends/amiga/history.c b/frontends/amiga/history.c old mode 100755 new mode 100644 index 2287c7069..0fea42042 --- a/frontends/amiga/history.c +++ b/frontends/amiga/history.c @@ -1,5 +1,5 @@ /* - * Copyright 2008, 2009 Chris Young + * Copyright 2017 Chris Young * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -16,28 +16,405 @@ * along with this program. If not, see . */ +/** + * \file + * Implementation of Amiga global history viewer using core windows. + */ + +#include +#include #include -#include +#include + +#include +#include +#include + +#include +#include +#include -#include "utils/errors.h" -#include "netsurf/mouse.h" -#include "netsurf/window.h" +#include +#include "desktop/global_history.h" +#include "netsurf/keypress.h" +#include "netsurf/plotters.h" +#include "utils/log.h" +#include "utils/messages.h" +#include "utils/nsoption.h" + +#include "amiga/corewindow.h" +#include "amiga/file.h" #include "amiga/history.h" -#include "amiga/tree.h" -#include "amiga/tree.h" +#include "amiga/libs.h" +#include "amiga/theme.h" +#include "amiga/utf8.h" + +enum { + /* Project menu */ + AMI_HISTORY_M_PROJECT = 0, + AMI_HISTORY_M_EXPORT, + AMI_HISTORY_M_BAR_P1, + AMI_HISTORY_M_EXPAND, + AMI_HISTORY_M_EXPAND_ALL, + AMI_HISTORY_M_EXPAND_FOLDERS, + AMI_HISTORY_M_EXPAND_LINKS, + AMI_HISTORY_M_COLLAPSE, + AMI_HISTORY_M_COLLAPSE_ALL, + AMI_HISTORY_M_COLLAPSE_FOLDERS, + AMI_HISTORY_M_COLLAPSE_LINKS, + AMI_HISTORY_M_BAR_P2, + AMI_HISTORY_M_SNAPSHOT, + AMI_HISTORY_M_BAR_P3, + AMI_HISTORY_M_CLOSE, + /* Edit menu */ + AMI_HISTORY_M_EDIT, + AMI_HISTORY_M_SELECTALL, + AMI_HISTORY_M_CLEAR, + AMI_HISTORY_M_BAR_E1, + AMI_HISTORY_M_DELETE, + AMI_HISTORY_M_LAST +}; + +/** + * Amiga history viewer window context + */ +struct ami_history_global_window { + /** Amiga core window context */ + struct ami_corewindow core; + + struct ami_menu_data *menu_data[AMI_HISTORY_M_LAST + 1]; + struct Menu *imenu; /* Intuition menu */ +}; + +static struct ami_history_global_window *history_window = NULL; + + +static void +ami_history_global_menu_free(struct ami_history_global_window *history_win) +{ + SetAttrs(history_win->core.objects[GID_CW_WIN], + WINDOW_MenuStrip, NULL, + TAG_DONE); + + ami_menu_free_menu(history_win->menu_data, AMI_HISTORY_M_LAST, history_win->imenu); +} + +/** + * destroy a previously created history view + */ +static void +ami_history_global_destroy(struct ami_corewindow *ami_cw) +{ + nserror res; + + if(history_window == NULL) + return; + + res = global_history_fini(); + if (res == NSERROR_OK) { + ami_history_global_menu_free(history_window); + res = ami_corewindow_fini(&history_window->core); /* closes the window for us, frees history_win */ + history_window = NULL; + } +} + + +/** + * callback for mouse action for history viewer on core window + * + * \param ami_cw The Amiga core window structure. + * \param mouse_state netsurf mouse state on event + * \param x location of event + * \param y location of event + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_history_global_mouse(struct ami_corewindow *ami_cw, + browser_mouse_state mouse_state, + int x, int y) +{ + global_history_mouse_action(mouse_state, x, y); + + return NSERROR_OK; +} + +/** + * callback for keypress for history viewer on core window + * + * \param ami_cw The Amiga core window structure. + * \param nskey The netsurf key code + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_history_global_key(struct ami_corewindow *ami_cw, uint32_t nskey) +{ + if (global_history_keypress(nskey)) { + return NSERROR_OK; + } + return NSERROR_NOT_IMPLEMENTED; +} + +/** + * callback on draw event for history viewer on core window + * + * \param ami_cw The Amiga core window structure. + * \param r The rectangle of the window that needs updating. + * \param ctx The drawing context + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_history_global_draw(struct ami_corewindow *ami_cw, int x, int y, struct rect *r, struct redraw_context *ctx) +{ + global_history_redraw(x, y, r, ctx); + + return NSERROR_OK; +} + +/** + * menu stuff + */ + + /* menu hook functions */ +HOOKF(void, ami_history_global_menu_item_project_export, APTR, window, struct IntuiMessage *) +{ + char fname[1024]; + struct ami_corewindow *ami_cw; + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw); + + if(AslRequestTags(savereq, + ASLFR_Window, ami_cw->win, + ASLFR_SleepWindow, TRUE, + ASLFR_TitleText, messages_get("NetSurf"), + ASLFR_Screen, scrn, + ASLFR_InitialFile, "history.html", + TAG_DONE)) { + strlcpy(fname, savereq->fr_Drawer, 1024); + AddPart(fname, savereq->fr_File, 1024); + ami_update_pointer(ami_cw->win, GUI_POINTER_WAIT); + global_history_export(fname, NULL); + ami_update_pointer(ami_cw->win, GUI_POINTER_DEFAULT); + } +} + +HOOKF(void, ami_history_global_menu_item_project_expand_all, APTR, window, struct IntuiMessage *) +{ + global_history_expand(false); +} + +HOOKF(void, ami_history_global_menu_item_project_expand_folders, APTR, window, struct IntuiMessage *) +{ + global_history_expand(true); +} + +HOOKF(void, ami_history_global_menu_item_project_expand_links, APTR, window, struct IntuiMessage *) +{ + global_history_expand(false); +} -struct treeview_window *global_history_window = NULL; +HOOKF(void, ami_history_global_menu_item_project_collapse_all, APTR, window, struct IntuiMessage *) +{ + global_history_contract(true); +} + +HOOKF(void, ami_history_global_menu_item_project_collapse_folders, APTR, window, struct IntuiMessage *) +{ + global_history_contract(true); +} -void ami_global_history_initialise(void) +HOOKF(void, ami_history_global_menu_item_project_collapse_links, APTR, window, struct IntuiMessage *) { - global_history_window = ami_tree_create(TREE_HISTORY, NULL); + global_history_contract(false); +} - if(!global_history_window) return; +HOOKF(void, ami_history_global_menu_item_project_snapshot, APTR, window, struct IntuiMessage *) +{ + struct ami_corewindow *ami_cw; + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw); + + nsoption_set_int(history_window_ypos, ami_cw->win->TopEdge); + nsoption_set_int(history_window_xpos, ami_cw->win->LeftEdge); + nsoption_set_int(history_window_xsize, ami_cw->win->Width); + nsoption_set_int(history_window_ysize, ami_cw->win->Height); +} + +HOOKF(void, ami_history_global_menu_item_project_close, APTR, window, struct IntuiMessage *) +{ + struct ami_corewindow *ami_cw; + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw); + + ami_cw->close_window = true; } -void ami_global_history_free() +HOOKF(void, ami_history_global_menu_item_edit_select_all, APTR, window, struct IntuiMessage *) { - ami_tree_destroy(global_history_window); - global_history_window = NULL; + global_history_keypress(NS_KEY_SELECT_ALL); +} + +HOOKF(void, ami_history_global_menu_item_edit_clear, APTR, window, struct IntuiMessage *) +{ + global_history_keypress(NS_KEY_CLEAR_SELECTION); +} + +HOOKF(void, ami_history_global_menu_item_edit_delete, APTR, window, struct IntuiMessage *) +{ + global_history_keypress(NS_KEY_DELETE_LEFT); +} + + +/* menu setup */ + +static void ami_history_global_menulabs(struct ami_menu_data **md) +{ + ami_menu_alloc_item(md, AMI_HISTORY_M_PROJECT, NM_TITLE, "Tree", 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_EXPORT, NM_ITEM, "TreeExport", 'S', "TBImages:list_save", + ami_history_global_menu_item_project_export, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_P1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND, NM_ITEM, "Expand", 0, "TBImages:list_folderunfold", NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND_ALL, NM_SUB, "All", '+', NULL, + ami_history_global_menu_item_project_expand_all, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND_FOLDERS, NM_SUB, "Folders", 0, NULL, + ami_history_global_menu_item_project_expand_folders, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_EXPAND_LINKS, NM_SUB, "Links", 0, NULL, + ami_history_global_menu_item_project_expand_links, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE, NM_ITEM, "Collapse", 0, "TBImages:list_folderfold", NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE_ALL, NM_SUB, "All", '-', NULL, + ami_history_global_menu_item_project_collapse_all, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE_FOLDERS, NM_SUB, "Folders", 0, NULL, + ami_history_global_menu_item_project_collapse_folders, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_COLLAPSE_LINKS, NM_SUB, "Links", 0, NULL, + ami_history_global_menu_item_project_collapse_links, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_P2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_SNAPSHOT, NM_ITEM, "SnapshotWindow", 0, "TBImages:list_hold", + ami_history_global_menu_item_project_snapshot, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_P3, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_CLOSE, NM_ITEM, "CloseWindow", 'K', "TBImages:list_cancel", + ami_history_global_menu_item_project_close, NULL, 0); + + ami_menu_alloc_item(md, AMI_HISTORY_M_EDIT, NM_TITLE, "Edit", 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_SELECTALL, NM_ITEM, "SelectAllNS", 'A', NSA_SPACE, + ami_history_global_menu_item_edit_select_all, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_CLEAR, NM_ITEM, "ClearNS", 0, NSA_SPACE, + ami_history_global_menu_item_edit_clear, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_BAR_E1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HISTORY_M_DELETE, NM_ITEM, "TreeDelete", 0, "TBImages:list_delete", + ami_history_global_menu_item_edit_delete, NULL, 0); + + ami_menu_alloc_item(md, AMI_HISTORY_M_LAST, NM_END, NULL, 0, NULL, NULL, NULL, 0); } + +static struct Menu * +ami_history_global_menu_create(struct ami_history_global_window *history_win) +{ + ami_history_global_menulabs(history_win->menu_data); + history_win->imenu = ami_menu_layout(history_win->menu_data, AMI_HISTORY_M_LAST); + if(history_win->imenu == NULL) return NULL; + + return history_win->imenu; +} + + +static nserror +ami_history_global_create_window(struct ami_history_global_window *history_win) +{ + struct ami_corewindow *ami_cw = (struct ami_corewindow *)&history_win->core; + + ami_cw->objects[GID_CW_WIN] = WindowObj, + WA_ScreenTitle, ami_gui_get_screen_title(), + WA_Title, ami_cw->wintitle, + WA_Activate, TRUE, + WA_DepthGadget, TRUE, + WA_DragBar, TRUE, + WA_CloseGadget, TRUE, + WA_SizeGadget, TRUE, + WA_SizeBRight, TRUE, + WA_Top, nsoption_int(history_window_ypos), + WA_Left, nsoption_int(history_window_xpos), + WA_Width, nsoption_int(history_window_xsize), + WA_Height, nsoption_int(history_window_ysize), + WA_PubScreen, scrn, + WA_ReportMouse, TRUE, + WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | + IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | + IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY, + WINDOW_IDCMPHook, &ami_cw->idcmp_hook, + WINDOW_IDCMPHookBits, IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE, + WINDOW_SharedPort, sport, + WINDOW_HorizProp, 1, + WINDOW_VertProp, 1, + WINDOW_UserData, history_win, + WINDOW_MenuStrip, ami_history_global_menu_create(history_win), + WINDOW_MenuUserData, WGUD_HOOK, + WINDOW_IconifyGadget, FALSE, + WINDOW_Position, WPOS_CENTERSCREEN, + WINDOW_ParentGroup, ami_cw->objects[GID_CW_MAIN] = LayoutVObj, + LAYOUT_AddChild, ami_cw->objects[GID_CW_DRAW] = SpaceObj, + GA_ID, GID_CW_DRAW, + SPACE_Transparent, TRUE, + SPACE_BevelStyle, BVS_DISPLAY, + GA_RelVerify, TRUE, + SpaceEnd, + EndGroup, + EndWindow; + + if(ami_cw->objects[GID_CW_WIN] == NULL) { + return NSERROR_NOMEM; + } + + return NSERROR_OK; +} + +/* exported interface documented in amiga/cookies.h */ +nserror ami_history_global_present(void) +{ + struct ami_history_global_window *ncwin; + nserror res; + + if(history_window != NULL) { + //windowtofront() + return NSERROR_OK; + } + + ncwin = calloc(1, sizeof(struct ami_history_global_window)); + if (ncwin == NULL) { + return NSERROR_NOMEM; + } + + ncwin->core.wintitle = ami_utf8_easy((char *)messages_get("GlobalHistory")); + + res = ami_history_global_create_window(ncwin); + if (res != NSERROR_OK) { + LOG("SSL UI builder init failed"); + ami_utf8_free(ncwin->core.wintitle); + free(ncwin); + return res; + } + + /* initialise Amiga core window */ + ncwin->core.draw = ami_history_global_draw; + ncwin->core.key = ami_history_global_key; + ncwin->core.mouse = ami_history_global_mouse; + ncwin->core.close = ami_history_global_destroy; + ncwin->core.event = NULL; + + res = ami_corewindow_init(&ncwin->core); + if (res != NSERROR_OK) { + ami_utf8_free(ncwin->core.wintitle); + DisposeObject(ncwin->core.objects[GID_CW_WIN]); + free(ncwin); + return res; + } + + res = global_history_init(ncwin->core.cb_table, (struct core_window *)ncwin); + if (res != NSERROR_OK) { + ami_utf8_free(ncwin->core.wintitle); + DisposeObject(ncwin->core.objects[GID_CW_WIN]); + free(ncwin); + return res; + } + + history_window = ncwin; + + return NSERROR_OK; +} + diff --git a/frontends/amiga/history.h b/frontends/amiga/history.h old mode 100755 new mode 100644 index 47e00ed10..67ab670b7 --- a/frontends/amiga/history.h +++ b/frontends/amiga/history.h @@ -1,5 +1,5 @@ /* - * Copyright 2008,2009 Chris Young + * Copyright 2017 Chris Young * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -16,14 +16,10 @@ * along with this program. If not, see . */ -#ifndef AMIGA_HISTORY_H -#define AMIGA_HISTORY_H -#include "amiga/desktop-tree.h" +#ifndef AMIGA_HISTORY_GLOBAL_H +#define AMIGA_HISTORY_GLOBAL_H -#define GLOBAL_HISTORY_RECENT_URLS 16 - -void ami_global_history_initialise(void); -void ami_global_history_free(void); - -extern struct treeview_window *global_history_window; +/** Open the global history viewer */ +nserror ami_history_global_present(void); #endif + diff --git a/frontends/amiga/menu.c b/frontends/amiga/menu.c index d88139d9f..83cfaa7df 100644 --- a/frontends/amiga/menu.c +++ b/frontends/amiga/menu.c @@ -362,7 +362,7 @@ HOOKF(void, ami_menu_item_browser_localhistory, APTR, window, struct IntuiMessag HOOKF(void, ami_menu_item_browser_globalhistory, APTR, window, struct IntuiMessage *) { - ami_tree_open(global_history_window,AMI_TREE_HISTORY); + ami_history_global_present(); } HOOKF(void, ami_menu_item_browser_cookies, APTR, window, struct IntuiMessage *) -- cgit v1.2.3 From 917a602dce32286260a34d61b7c0db4bee502ec0 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Fri, 6 Jan 2017 23:56:52 +0000 Subject: Conversion of Amiga hotlist manager to corewindow --- frontends/amiga/arexx.c | 4 +- frontends/amiga/gui.c | 16 +- frontends/amiga/hotlist.c | 457 +++++++++++++++++++++++++++++++++++++++++++--- frontends/amiga/hotlist.h | 22 ++- frontends/amiga/menu.c | 9 +- 5 files changed, 464 insertions(+), 44 deletions(-) mode change 100755 => 100644 frontends/amiga/hotlist.c mode change 100755 => 100644 frontends/amiga/hotlist.h diff --git a/frontends/amiga/arexx.c b/frontends/amiga/arexx.c index b9702287b..63e418a69 100644 --- a/frontends/amiga/arexx.c +++ b/frontends/amiga/arexx.c @@ -665,9 +665,9 @@ RXHOOKF(rx_hotlist) cmd->ac_RC = 0; if(strcasecmp((char *)cmd->ac_ArgList[0], "OPEN") == 0) { - ami_tree_open(hotlist_window, AMI_TREE_HOTLIST); + ami_hotlist_present(); } else if(strcasecmp((char *)cmd->ac_ArgList[0], "CLOSE") == 0) { - ami_tree_close(hotlist_window); + ami_hotlist_close(); } } diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c index 7c92a40d7..4e88a0e47 100644 --- a/frontends/amiga/gui.c +++ b/frontends/amiga/gui.c @@ -552,6 +552,12 @@ static void ami_set_screen_defaults(struct Screen *screen) nsoption_default_set_int(history_window_xsize, width); nsoption_default_set_int(history_window_ysize, height); + nsoption_default_set_int(hotlist_window_ypos, top); + nsoption_default_set_int(hotlist_window_xpos, left); + nsoption_default_set_int(hotlist_window_xsize, width); + nsoption_default_set_int(hotlist_window_ysize, height); + + nsoption_default_set_int(window_x, 0); nsoption_default_set_int(window_y, screen->BarHeight + 1); nsoption_default_set_int(window_width, screen->Width); @@ -1018,7 +1024,7 @@ static void gui_init2(int argc, char** argv) } /**/ - ami_hotlist_initialise(nsoption_charp(hotlist_file)); + hotlist_init(nsoption_charp(hotlist_file)); search_web_select_provider(nsoption_int(search_provider)); if (notalreadyrunning && @@ -3041,7 +3047,7 @@ static void gui_quit(void) urldb_save(nsoption_charp(url_file)); urldb_save_cookies(nsoption_charp(cookie_file)); - ami_hotlist_free(nsoption_charp(hotlist_file)); + hotlist_fini(nsoption_charp(hotlist_file)); #ifdef __amigaos4__ if(IApplication && ami_appid) UnregisterApplication(ami_appid, NULL); @@ -3185,7 +3191,7 @@ static bool ami_gui_hotlist_add(void *userdata, int level, int item, return true; } -static int ami_gui_hotlist_scan(struct tree *tree, struct List *speed_button_list, struct gui_window_2 *gwin) +static int ami_gui_hotlist_scan(struct List *speed_button_list, struct gui_window_2 *gwin) { struct ami_gui_tb_userdata userdata; userdata.gw = gwin; @@ -3207,7 +3213,7 @@ static void ami_gui_hotlist_toolbar_add(struct gui_window_2 *gwin) NewList(&gwin->hotlist_toolbar_list); - if(ami_gui_hotlist_scan(ami_tree_get_tree(hotlist_window), &gwin->hotlist_toolbar_list, gwin) > 0) { + if(ami_gui_hotlist_scan(&gwin->hotlist_toolbar_list, gwin) > 0) { gwin->objects[GID_HOTLIST] = SpeedBarObj, GA_ID, GID_HOTLIST, @@ -3306,7 +3312,7 @@ static void ami_gui_hotlist_toolbar_update(struct gui_window_2 *gwin) ami_gui_hotlist_toolbar_free(gwin, &gwin->hotlist_toolbar_list); - if(ami_gui_hotlist_scan(ami_tree_get_tree(hotlist_window), &gwin->hotlist_toolbar_list, gwin) > 0) { + if(ami_gui_hotlist_scan(&gwin->hotlist_toolbar_list, gwin) > 0) { SetGadgetAttrs((struct Gadget *)gwin->objects[GID_HOTLIST], gwin->win, NULL, SPEEDBAR_Buttons, &gwin->hotlist_toolbar_list, diff --git a/frontends/amiga/hotlist.c b/frontends/amiga/hotlist.c old mode 100755 new mode 100644 index fc2342d73..de8b6ac6a --- a/frontends/amiga/hotlist.c +++ b/frontends/amiga/hotlist.c @@ -1,5 +1,5 @@ /* - * Copyright 2008, 2009 Chris Young + * Copyright 2008, 2009, 2017 Chris Young * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -16,16 +16,82 @@ * along with this program. If not, see . */ +/** + * \file + * Implementation of Amiga hotlist viewer using core windows. + */ + +#include +#include +#include #include -#include -#include "utils/nsurl.h" +#include +#include +#include + +#include +#include +#include + +#include + #include "desktop/hotlist.h" -#include "netsurf/mouse.h" -#include "netsurf/window.h" +#include "netsurf/keypress.h" +#include "netsurf/plotters.h" +#include "utils/log.h" +#include "utils/messages.h" +#include "utils/nsoption.h" +#include "amiga/corewindow.h" +#include "amiga/file.h" #include "amiga/hotlist.h" -#include "amiga/tree.h" +#include "amiga/libs.h" +#include "amiga/theme.h" +#include "amiga/utf8.h" + +enum { + /* Project menu */ + AMI_HOTLIST_M_PROJECT = 0, + AMI_HOTLIST_M_EXPORT, + AMI_HOTLIST_M_BAR_P1, + AMI_HOTLIST_M_EXPAND, + AMI_HOTLIST_M_EXPAND_ALL, + AMI_HOTLIST_M_EXPAND_FOLDERS, + AMI_HOTLIST_M_EXPAND_LINKS, + AMI_HOTLIST_M_COLLAPSE, + AMI_HOTLIST_M_COLLAPSE_ALL, + AMI_HOTLIST_M_COLLAPSE_FOLDERS, + AMI_HOTLIST_M_COLLAPSE_LINKS, + AMI_HOTLIST_M_BAR_P2, + AMI_HOTLIST_M_SNAPSHOT, + AMI_HOTLIST_M_BAR_P3, + AMI_HOTLIST_M_CLOSE, + /* Edit menu */ + AMI_HOTLIST_M_EDIT, + AMI_HOTLIST_M_NEWFOLDER, + AMI_HOTLIST_M_NEWLINK, + AMI_HOTLIST_M_EDIT_EDIT, + AMI_HOTLIST_M_BAR_E1, + AMI_HOTLIST_M_SELECTALL, + AMI_HOTLIST_M_CLEAR, + AMI_HOTLIST_M_BAR_E2, + AMI_HOTLIST_M_DELETE, + AMI_HOTLIST_M_LAST +}; + +/** + * Amiga hotlist viewer window context + */ +struct ami_hotlist_window { + /** Amiga core window context */ + struct ami_corewindow core; + + struct ami_menu_data *menu_data[AMI_HOTLIST_M_LAST + 1]; + struct Menu *imenu; /* Intuition menu */ +}; + +static struct ami_hotlist_window *hotlist_window = NULL; struct ami_hotlist_ctx { void *userdata; @@ -37,22 +103,7 @@ struct ami_hotlist_ctx { bool (*cb)(void *userdata, int level, int item, const char *title, nsurl *url, bool folder); }; -struct treeview_window *hotlist_window = NULL; - -void ami_hotlist_initialise(const char *hotlist_file) -{ - tree_hotlist_path = hotlist_file; - hotlist_window = ami_tree_create(TREE_HOTLIST, NULL); - if(!hotlist_window) return; -} - -void ami_hotlist_free(const char *hotlist_file) -{ - ami_tree_destroy(hotlist_window); - hotlist_window = NULL; -} - - +/** hotlist scanner */ static nserror ami_hotlist_folder_enter_cb(void *ctx, const char *title) { struct ami_hotlist_ctx *menu_ctx = (struct ami_hotlist_ctx *)ctx; @@ -118,3 +169,365 @@ nserror ami_hotlist_scan(void *userdata, int first_item, const char *folder, return error; } + + +/** + * callback for mouse action for hotlist viewer on core window + * + * \param ami_cw The Amiga core window structure. + * \param mouse_state netsurf mouse state on event + * \param x location of event + * \param y location of event + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_hotlist_mouse(struct ami_corewindow *ami_cw, + browser_mouse_state mouse_state, + int x, int y) +{ + hotlist_mouse_action(mouse_state, x, y); + + return NSERROR_OK; +} + +/** + * callback for keypress for hotlist viewer on core window + * + * \param ami_cw The Amiga core window structure. + * \param nskey The netsurf key code + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_hotlist_key(struct ami_corewindow *ami_cw, uint32_t nskey) +{ + if (hotlist_keypress(nskey)) { + return NSERROR_OK; + } + return NSERROR_NOT_IMPLEMENTED; +} + +/** + * callback on draw event for hotlist viewer on core window + * + * \param ami_cw The Amiga core window structure. + * \param r The rectangle of the window that needs updating. + * \param ctx The drawing context + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_hotlist_draw(struct ami_corewindow *ami_cw, int x, int y, struct rect *r, struct redraw_context *ctx) +{ + hotlist_redraw(x, y, r, ctx); + + return NSERROR_OK; +} + + +/** + * menu stuff + */ + +static void +ami_hotlist_menu_free(struct ami_hotlist_window *hotlist_win) +{ + SetAttrs(hotlist_win->core.objects[GID_CW_WIN], + WINDOW_MenuStrip, NULL, + TAG_DONE); + + ami_menu_free_menu(hotlist_win->menu_data, AMI_HOTLIST_M_LAST, hotlist_win->imenu); +} + + /* menu hook functions */ +HOOKF(void, ami_hotlist_menu_item_project_export, APTR, window, struct IntuiMessage *) +{ + char fname[1024]; + struct ami_corewindow *ami_cw; + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw); + + if(AslRequestTags(savereq, + ASLFR_Window, ami_cw->win, + ASLFR_SleepWindow, TRUE, + ASLFR_TitleText, messages_get("NetSurf"), + ASLFR_Screen, scrn, + ASLFR_InitialFile, "hotlist.html", + TAG_DONE)) { + strlcpy(fname, savereq->fr_Drawer, 1024); + AddPart(fname, savereq->fr_File, 1024); + ami_update_pointer(ami_cw->win, GUI_POINTER_WAIT); + hotlist_export(fname, NULL); + ami_update_pointer(ami_cw->win, GUI_POINTER_DEFAULT); + } +} + +HOOKF(void, ami_hotlist_menu_item_project_expand_all, APTR, window, struct IntuiMessage *) +{ + hotlist_expand(false); +} + +HOOKF(void, ami_hotlist_menu_item_project_expand_folders, APTR, window, struct IntuiMessage *) +{ + hotlist_expand(true); +} + +HOOKF(void, ami_hotlist_menu_item_project_expand_links, APTR, window, struct IntuiMessage *) +{ + hotlist_expand(false); +} + +HOOKF(void, ami_hotlist_menu_item_project_collapse_all, APTR, window, struct IntuiMessage *) +{ + hotlist_contract(true); +} + +HOOKF(void, ami_hotlist_menu_item_project_collapse_folders, APTR, window, struct IntuiMessage *) +{ + hotlist_contract(true); +} + +HOOKF(void, ami_hotlist_menu_item_project_collapse_links, APTR, window, struct IntuiMessage *) +{ + hotlist_contract(false); +} + +HOOKF(void, ami_hotlist_menu_item_project_snapshot, APTR, window, struct IntuiMessage *) +{ + struct ami_corewindow *ami_cw; + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw); + + nsoption_set_int(hotlist_window_ypos, ami_cw->win->TopEdge); + nsoption_set_int(hotlist_window_xpos, ami_cw->win->LeftEdge); + nsoption_set_int(hotlist_window_xsize, ami_cw->win->Width); + nsoption_set_int(hotlist_window_ysize, ami_cw->win->Height); +} + +HOOKF(void, ami_hotlist_menu_item_project_close, APTR, window, struct IntuiMessage *) +{ + struct ami_corewindow *ami_cw; + GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&ami_cw); + + ami_cw->close_window = true; +} + +HOOKF(void, ami_hotlist_menu_item_edit_newfolder, APTR, window, struct IntuiMessage *) +{ + hotlist_add_folder(NULL, false, 0); +} + +HOOKF(void, ami_hotlist_menu_item_edit_newlink, APTR, window, struct IntuiMessage *) +{ + hotlist_add_entry(NULL, NULL, false, 0); +} + +HOOKF(void, ami_hotlist_menu_item_edit_edit, APTR, window, struct IntuiMessage *) +{ + hotlist_edit_selection(); +} + +HOOKF(void, ami_hotlist_menu_item_edit_select_all, APTR, window, struct IntuiMessage *) +{ + hotlist_keypress(NS_KEY_SELECT_ALL); +} + +HOOKF(void, ami_hotlist_menu_item_edit_clear, APTR, window, struct IntuiMessage *) +{ + hotlist_keypress(NS_KEY_CLEAR_SELECTION); +} + +HOOKF(void, ami_hotlist_menu_item_edit_delete, APTR, window, struct IntuiMessage *) +{ + hotlist_keypress(NS_KEY_DELETE_LEFT); +} + + +/* menu setup */ + +static void ami_hotlist_menulabs(struct ami_menu_data **md) +{ + ami_menu_alloc_item(md, AMI_HOTLIST_M_PROJECT, NM_TITLE, "Tree", 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPORT, NM_ITEM, "TreeExport", 'S', "TBImages:list_save", + ami_hotlist_menu_item_project_export, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_P1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND, NM_ITEM, "Expand", 0, "TBImages:list_folderunfold", NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND_ALL, NM_SUB, "All", '+', NULL, + ami_hotlist_menu_item_project_expand_all, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND_FOLDERS, NM_SUB, "Folders", 0, NULL, + ami_hotlist_menu_item_project_expand_folders, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_EXPAND_LINKS, NM_SUB, "Links", 0, NULL, + ami_hotlist_menu_item_project_expand_links, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE, NM_ITEM, "Collapse", 0, "TBImages:list_folderfold", NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE_ALL, NM_SUB, "All", '-', NULL, + ami_hotlist_menu_item_project_collapse_all, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE_FOLDERS, NM_SUB, "Folders", 0, NULL, + ami_hotlist_menu_item_project_collapse_folders, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_COLLAPSE_LINKS, NM_SUB, "Links", 0, NULL, + ami_hotlist_menu_item_project_collapse_links, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_P2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_SNAPSHOT, NM_ITEM, "SnapshotWindow", 0, "TBImages:list_hold", + ami_hotlist_menu_item_project_snapshot, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_P3, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_CLOSE, NM_ITEM, "CloseWindow", 'K', "TBImages:list_cancel", + ami_hotlist_menu_item_project_close, NULL, 0); + + ami_menu_alloc_item(md, AMI_HOTLIST_M_EDIT, NM_TITLE, "Edit", 0, NULL, NULL, NULL, 0); + + ami_menu_alloc_item(md, AMI_HOTLIST_M_NEWFOLDER, NM_ITEM, "TreeNewFolder", 'N', "TBImages:list_drawer", + ami_hotlist_menu_item_edit_newfolder, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_NEWLINK, NM_ITEM, "TreeNewLink", 0, "TBImages:list_favouriteadd", + ami_hotlist_menu_item_edit_newlink, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_EDIT_EDIT, NM_ITEM, "TreeEdit", 'E', "TBImages:list_edit", + ami_hotlist_menu_item_edit_edit, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_E1, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_SELECTALL, NM_ITEM, "SelectAllNS", 'A', NSA_SPACE, + ami_hotlist_menu_item_edit_select_all, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_CLEAR, NM_ITEM, "ClearNS", 0, NSA_SPACE, + ami_hotlist_menu_item_edit_clear, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_BAR_E2, NM_ITEM, NM_BARLABEL, 0, NULL, NULL, NULL, 0); + ami_menu_alloc_item(md, AMI_HOTLIST_M_DELETE, NM_ITEM, "TreeDelete", 0, "TBImages:list_delete", + ami_hotlist_menu_item_edit_delete, NULL, 0); + + ami_menu_alloc_item(md, AMI_HOTLIST_M_LAST, NM_END, NULL, 0, NULL, NULL, NULL, 0); +} + +static struct Menu * +ami_hotlist_menu_create(struct ami_hotlist_window *hotlist_win) +{ + ami_hotlist_menulabs(hotlist_win->menu_data); + hotlist_win->imenu = ami_menu_layout(hotlist_win->menu_data, AMI_HOTLIST_M_LAST); + if(hotlist_win->imenu == NULL) return NULL; + + return hotlist_win->imenu; +} + + +static nserror +ami_hotlist_create_window(struct ami_hotlist_window *hotlist_win) +{ + struct ami_corewindow *ami_cw = (struct ami_corewindow *)&hotlist_win->core; + + ami_cw->objects[GID_CW_WIN] = WindowObj, + WA_ScreenTitle, ami_gui_get_screen_title(), + WA_Title, ami_cw->wintitle, + WA_Activate, TRUE, + WA_DepthGadget, TRUE, + WA_DragBar, TRUE, + WA_CloseGadget, TRUE, + WA_SizeGadget, TRUE, + WA_SizeBRight, TRUE, + WA_Top, nsoption_int(hotlist_window_ypos), + WA_Left, nsoption_int(hotlist_window_xpos), + WA_Width, nsoption_int(hotlist_window_xsize), + WA_Height, nsoption_int(hotlist_window_ysize), + WA_PubScreen, scrn, + WA_ReportMouse, TRUE, + WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | + IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | + IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY, + WINDOW_IDCMPHook, &ami_cw->idcmp_hook, + WINDOW_IDCMPHookBits, IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE, + WINDOW_SharedPort, sport, + WINDOW_HorizProp, 1, + WINDOW_VertProp, 1, + WINDOW_UserData, hotlist_win, + WINDOW_MenuStrip, ami_hotlist_menu_create(hotlist_win), + WINDOW_MenuUserData, WGUD_HOOK, + WINDOW_IconifyGadget, FALSE, + WINDOW_Position, WPOS_CENTERSCREEN, + WINDOW_ParentGroup, ami_cw->objects[GID_CW_MAIN] = LayoutVObj, + LAYOUT_AddChild, ami_cw->objects[GID_CW_DRAW] = SpaceObj, + GA_ID, GID_CW_DRAW, + SPACE_Transparent, TRUE, + SPACE_BevelStyle, BVS_DISPLAY, + GA_RelVerify, TRUE, + SpaceEnd, + EndGroup, + EndWindow; + + if(ami_cw->objects[GID_CW_WIN] == NULL) { + return NSERROR_NOMEM; + } + + return NSERROR_OK; +} + +/** + * destroy a previously created hotlist view + */ +static void +ami_hotlist_destroy(struct ami_corewindow *ami_cw) +{ + nserror res; + + if(hotlist_window == NULL) + return; + + res = hotlist_manager_fini(); + if (res == NSERROR_OK) { + ami_hotlist_menu_free(hotlist_window); + res = ami_corewindow_fini(&hotlist_window->core); /* closes the window for us, frees hotlist_win */ + hotlist_window = NULL; + } + + ami_gui_hotlist_update_all(); +} + + +/* exported interface documented in amiga/hotlist.h */ +nserror ami_hotlist_present(void) +{ + struct ami_hotlist_window *ncwin; + nserror res; + + if(hotlist_window != NULL) { + //windowtofront() + return NSERROR_OK; + } + + ncwin = calloc(1, sizeof(struct ami_hotlist_window)); + if (ncwin == NULL) { + return NSERROR_NOMEM; + } + + ncwin->core.wintitle = ami_utf8_easy((char *)messages_get("Cookies")); + + res = ami_hotlist_create_window(ncwin); + if (res != NSERROR_OK) { + LOG("SSL UI builder init failed"); + ami_utf8_free(ncwin->core.wintitle); + free(ncwin); + return res; + } + + /* initialise Amiga core window */ + ncwin->core.draw = ami_hotlist_draw; + ncwin->core.key = ami_hotlist_key; + ncwin->core.mouse = ami_hotlist_mouse; + ncwin->core.close = ami_hotlist_destroy; + ncwin->core.event = NULL; + + res = ami_corewindow_init(&ncwin->core); + if (res != NSERROR_OK) { + ami_utf8_free(ncwin->core.wintitle); + DisposeObject(ncwin->core.objects[GID_CW_WIN]); + free(ncwin); + return res; + } + + res = hotlist_manager_init(ncwin->core.cb_table, (struct core_window *)ncwin); + if (res != NSERROR_OK) { + ami_utf8_free(ncwin->core.wintitle); + DisposeObject(ncwin->core.objects[GID_CW_WIN]); + free(ncwin); + return res; + } + + hotlist_window = ncwin; + + return NSERROR_OK; +} + +/* exported interface documented in amiga/hotlist.h */ +void ami_hotlist_close(void) +{ + ami_hotlist_destroy((struct ami_corewindow *)hotlist_window); +} + diff --git a/frontends/amiga/hotlist.h b/frontends/amiga/hotlist.h old mode 100755 new mode 100644 index 113a2d1c0..588a72de8 --- a/frontends/amiga/hotlist.h +++ b/frontends/amiga/hotlist.h @@ -1,5 +1,5 @@ /* - * Copyright 2008, 2009 Chris Young + * Copyright 2017 Chris Young * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -19,16 +19,18 @@ #ifndef AMIGA_HOTLIST_H #define AMIGA_HOTLIST_H -struct nsurl; -struct treeview_window; +#include "utils/nsurl.h" -extern struct treeview_window *hotlist_window; - -void ami_hotlist_initialise(const char *hotlist_file); - -void ami_hotlist_free(const char *hotlist_file); - -nserror ami_hotlist_scan(void *userdata, int first_item, const char *folder, bool (*cb_add_item)(void *userdata, int level, int item, const char *title, struct nsurl *url, bool folder)); +/** Open the hotlist viewer */ +nserror ami_hotlist_present(void); +/** Close the hotlist viewer + * normally this shouldn't be used; only exists for ARexx use + */ +void ami_hotlist_close(void); +/** Scan the hotlist */ +nserror ami_hotlist_scan(void *userdata, int first_item, const char *folder, + bool (*cb_add_item)(void *userdata, int level, int item, const char *title, nsurl *url, bool folder)); #endif + diff --git a/frontends/amiga/menu.c b/frontends/amiga/menu.c index 83cfaa7df..d8159323e 100644 --- a/frontends/amiga/menu.c +++ b/frontends/amiga/menu.c @@ -73,7 +73,6 @@ #include "amiga/print.h" #include "amiga/search.h" #include "amiga/theme.h" -#include "amiga/tree.h" #include "amiga/utf8.h" #include "amiga/schedule.h" @@ -106,7 +105,7 @@ static bool menu_glyphs_loaded = false; const char * const netsurf_version; const char * const verdate; -static nserror ami_menu_scan(struct tree *tree, struct ami_menu_data **md); +static nserror ami_menu_scan(struct ami_menu_data **md); void ami_menu_arexx_scan(struct ami_menu_data **md); void ami_menu_set_check_toggled(void) @@ -456,7 +455,7 @@ HOOKF(void, ami_menu_item_hotlist_add, APTR, window, struct IntuiMessage *) HOOKF(void, ami_menu_item_hotlist_show, APTR, window, struct IntuiMessage *) { - ami_tree_open(hotlist_window, AMI_TREE_HOTLIST); + ami_hotlist_present(); } HOOKF(void, ami_menu_item_hotlist_entries, APTR, window, struct IntuiMessage *) @@ -992,7 +991,7 @@ void ami_menu_free_menu(struct ami_menu_data **md, int max, struct Menu *imenu) struct Menu *ami_menu_create(struct gui_window_2 *gwin) { ami_init_menulabs(gwin->menu_data); - ami_menu_scan(ami_tree_get_tree(hotlist_window), gwin->menu_data); //\todo this needs to be MenuClass created + ami_menu_scan(gwin->menu_data); //\todo this needs to be MenuClass created ami_menu_arexx_scan(gwin->menu_data); gwin->imenu = ami_menu_layout(gwin->menu_data, AMI_MENU_AREXX_MAX); @@ -1092,7 +1091,7 @@ static bool ami_menu_hotlist_add(void *userdata, int level, int item, const char return true; } -static nserror ami_menu_scan(struct tree *tree, struct ami_menu_data **md) +static nserror ami_menu_scan(struct ami_menu_data **md) { return ami_hotlist_scan((void *)md, AMI_MENU_HOTLIST, messages_get("HotlistMenu"), ami_menu_hotlist_add); } -- cgit v1.2.3 From a4bedbbaebec62294bcf6e7210c4c2b0b64f936c Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 7 Jan 2017 00:26:15 +0000 Subject: Broken corewindow drag implementation --- frontends/amiga/corewindow.c | 94 +++++++++++++++++++++++++++++++++++++++++++- frontends/amiga/corewindow.h | 29 ++++++++++++++ frontends/amiga/history.c | 47 ++++++++++++++++++++++ frontends/amiga/hotlist.c | 68 +++++++++++++++++++++++++++++++- 4 files changed, 236 insertions(+), 2 deletions(-) diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c index 1bfc5375b..03ad509d8 100644 --- a/frontends/amiga/corewindow.c +++ b/frontends/amiga/corewindow.c @@ -59,6 +59,7 @@ #include #include "amiga/corewindow.h" +#include "amiga/drag.h" #include "amiga/memory.h" #include "amiga/misc.h" #include "amiga/object.h" @@ -451,6 +452,71 @@ HOOKF(void, ami_cw_idcmp_hook, Object *, object, struct IntuiMessage *) } } +/** + * Drag start + */ +static void +ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y) +{ + ami_cw->dragging = true; + ami_cw->drag_x_start = x; + ami_cw->drag_y_start = y; + + switch(ami_cw->drag_status) { + case CORE_WINDOW_DRAG_SELECTION: + break; + + case CORE_WINDOW_DRAG_MOVE: + ami_drag_icon_show(ami_cw->win, "project"); + break; + + default: + break; + } +} + +/** + * Drag progress + */ +static void +ami_cw_drag_progress(struct ami_corewindow *ami_cw, int x, int y) +{ + switch(ami_cw->drag_status) { + case CORE_WINDOW_DRAG_SELECTION: + break; + + case CORE_WINDOW_DRAG_MOVE: + ami_drag_icon_move(); + break; + + default: + break; + } +} + +/** + * Drag end + */ +static void +ami_cw_drag_end(struct ami_corewindow *ami_cw, int x, int y) +{ + ami_cw->dragging = false; + + switch(ami_cw->drag_status) { + case CORE_WINDOW_DRAG_SELECTION: + break; + + case CORE_WINDOW_DRAG_MOVE: + ami_drag_icon_close(ami_cw->win); + if((ami_cw != ami_window_at_pointer(AMINS_COREWINDOW)) && (ami_cw->drag_end != NULL)) { + ami_cw->drag_end(ami_cw, scrn->MouseX, scrn->MouseY); + } + break; + + default: + break; + } +} /** * Main event loop for our core window @@ -479,9 +545,31 @@ ami_cw_event(void *w) switch(result & WMHI_CLASSMASK) { case WMHI_MOUSEMOVE: - if(ami_cw_mouse_pos(ami_cw, &x, &y)) { + if(ami_cw->dragging == false) { + if(ami_cw_mouse_pos(ami_cw, &x, &y)) { + if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) { + /* Start button 1 drag */ + ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_1, x, y); + /* Replace PRESS with HOLDING and declare drag in progress */ + ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON; + } else if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) { + /* Start button 2 drag */ + ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_2, x, y); + /* Replace PRESS with HOLDING and declare drag in progress */ + ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON; + } + key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + + if ((ami_cw->drag_status == CORE_WINDOW_DRAG_SELECTION) || + (ami_cw->drag_status == CORE_WINDOW_DRAG_MOVE)) { + ami_cw_drag_start(ami_cw, x, y); + } + } + } else { key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + ami_cw_drag_progress(ami_cw, x, y); } break; @@ -539,6 +627,10 @@ ami_cw_event(void *w) break; } ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + + if((ami_cw->dragging == true) && (ami_cw->mouse_state & BROWSER_MOUSE_HOVER)) { + ami_cw_drag_end(ami_cw, x, y); + } break; case WMHI_RAWKEY: diff --git a/frontends/amiga/corewindow.h b/frontends/amiga/corewindow.h index 17af2498a..cfcd7fc5e 100644 --- a/frontends/amiga/corewindow.h +++ b/frontends/amiga/corewindow.h @@ -58,6 +58,10 @@ struct ami_corewindow { int mouse_y_click; int mouse_state; + bool dragging; + int drag_x_start; + int drag_y_start; + bool close_window; // set to true to close the window during event loop APTR deferred_rects_pool; @@ -128,6 +132,31 @@ struct ami_corewindow { */ BOOL (*event)(struct ami_corewindow *ami_cw, ULONG result); + /** + * callback for drag end on Amiga core window + * ie. a drag *from* this window to a different window + * + * \param ami_cw The Amiga core window structure. + * \param x mouse x position **in screen co-ordinates** + * \param y mouse y position **in screen co-ordinates** + * \return NSERROR_OK on success otherwise apropriate error code + */ + nserror (*drag_end)(struct ami_corewindow *ami_cw, int x, int y); + + /** + * callback for icon drop on Amiga core window + * ie. a drag has ended *above* this window + * \todo this may not be very flexible but serves our current purposes + * + * \param ami_cw The Amiga core window structure. + * \param url url of dropped icon + * \param title title of dropped icon + * \param x mouse x position **in screen co-ordinates** + * \param y mouse y position **in screen co-ordinates** + * \return NSERROR_OK on success otherwise apropriate error code + */ + nserror (*icon_drop)(struct ami_corewindow *ami_cw, struct nsurl *url, const char *title, int x, int y); + /** * callback to close an Amiga core window * diff --git a/frontends/amiga/history.c b/frontends/amiga/history.c index 0fea42042..2210301bd 100644 --- a/frontends/amiga/history.c +++ b/frontends/amiga/history.c @@ -37,6 +37,7 @@ #include #include "desktop/global_history.h" +#include "netsurf/browser_window.h" #include "netsurf/keypress.h" #include "netsurf/plotters.h" #include "utils/log.h" @@ -44,6 +45,7 @@ #include "utils/nsoption.h" #include "amiga/corewindow.h" +#include "amiga/drag.h" #include "amiga/file.h" #include "amiga/history.h" #include "amiga/libs.h" @@ -171,6 +173,49 @@ ami_history_global_draw(struct ami_corewindow *ami_cw, int x, int y, struct rect return NSERROR_OK; } +/** + * callback on drag end for history viewer + * + * \param ami_cw The Amiga core window structure. + * \param x mouse x co-ordinate + * \param y mouse y co-ordinate + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_history_global_drag_end(struct ami_corewindow *ami_cw, int x, int y) +{ + struct nsurl *url = NULL; + const char *title = NULL; + bool ok = false; + struct gui_window_2 *gwin; + struct ami_corewindow *cw; + + if(ami_cw == ami_window_at_pointer(AMINS_COREWINDOW)) + return NSERROR_OK; + + if(global_history_has_selection()) { + ok = global_history_get_selection(&url, &title); + } + + if((ok == false) || (url == NULL)) { + DisplayBeep(scrn); + } else if(url) { + if((gwin = ami_window_at_pointer(AMINS_WINDOW))) { + browser_window_navigate(gwin->gw->bw, + url, + NULL, + BW_NAVIGATE_HISTORY, + NULL, + NULL, + NULL); + } else if((cw = (struct ami_corewindow *)ami_window_at_pointer(AMINS_COREWINDOW)) && + (ami_cw->icon_drop != NULL)) { + cw->icon_drop(cw, url, title, x, y); + } + } + return NSERROR_OK; +} + /** * menu stuff */ @@ -396,6 +441,8 @@ nserror ami_history_global_present(void) ncwin->core.mouse = ami_history_global_mouse; ncwin->core.close = ami_history_global_destroy; ncwin->core.event = NULL; + ncwin->core.drag_end = ami_history_global_drag_end; + ncwin->core.icon_drop = NULL; res = ami_corewindow_init(&ncwin->core); if (res != NSERROR_OK) { diff --git a/frontends/amiga/hotlist.c b/frontends/amiga/hotlist.c index de8b6ac6a..422586a00 100644 --- a/frontends/amiga/hotlist.c +++ b/frontends/amiga/hotlist.c @@ -37,6 +37,7 @@ #include #include "desktop/hotlist.h" +#include "netsurf/browser_window.h" #include "netsurf/keypress.h" #include "netsurf/plotters.h" #include "utils/log.h" @@ -44,6 +45,7 @@ #include "utils/nsoption.h" #include "amiga/corewindow.h" +#include "amiga/drag.h" #include "amiga/file.h" #include "amiga/hotlist.h" #include "amiga/libs.h" @@ -222,6 +224,68 @@ ami_hotlist_draw(struct ami_corewindow *ami_cw, int x, int y, struct rect *r, st return NSERROR_OK; } +/** + * callback for drag end on Amiga core window + * ie. a drag *from* this window has ended + * + * \param ami_cw The Amiga core window structure. + * \param x mouse x co-ordinate + * \param y mouse y co-ordinate + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_hotlist_drag_end(struct ami_corewindow *ami_cw, int x, int y) +{ + nsurl *url = NULL; + const char *title = NULL; + bool ok = false; + struct gui_window_2 *gwin; + struct ami_corewindow *cw; + + if(ami_cw == ami_window_at_pointer(AMINS_COREWINDOW)) + return NSERROR_OK; + + if(hotlist_has_selection()) { + ok = hotlist_get_selection(&url, &title); + } + + if((ok == false) || (url == NULL)) { + DisplayBeep(scrn); + } else if(url) { + if((gwin = ami_window_at_pointer(AMINS_WINDOW))) { + browser_window_navigate(gwin->gw->bw, + url, + NULL, + BW_NAVIGATE_HISTORY, + NULL, + NULL, + NULL); + } else if((cw = (struct ami_corewindow *)ami_window_at_pointer(AMINS_COREWINDOW)) && + (ami_cw->icon_drop != NULL)) { + cw->icon_drop(cw, url, title, x, y); + } + } + return NSERROR_OK; +} + +/** + * callback for icon drop on Amiga core window + * ie. a drag has ended *above* this window + * \todo this may not be very flexible but serves our current purposes + * + * \param ami_cw The Amiga core window structure. + * \param url url of dropped icon + * \param title title of dropped icon + * \param x mouse x co-ordinate + * \param y mouse y co-ordinate + * \return NSERROR_OK on success otherwise apropriate error code + */ +static nserror +ami_hotlist_icon_drop(struct ami_corewindow *ami_cw, struct nsurl *url, const char *title, int x, int y) +{ + hotlist_add_entry(url, title, true, y); + return NSERROR_OK; +} /** * menu stuff @@ -487,7 +551,7 @@ nserror ami_hotlist_present(void) return NSERROR_NOMEM; } - ncwin->core.wintitle = ami_utf8_easy((char *)messages_get("Cookies")); + ncwin->core.wintitle = ami_utf8_easy((char *)messages_get("Hotlist")); res = ami_hotlist_create_window(ncwin); if (res != NSERROR_OK) { @@ -503,6 +567,8 @@ nserror ami_hotlist_present(void) ncwin->core.mouse = ami_hotlist_mouse; ncwin->core.close = ami_hotlist_destroy; ncwin->core.event = NULL; + ncwin->core.drag_end = ami_hotlist_drag_end; + ncwin->core.icon_drop = ami_hotlist_icon_drop; res = ami_corewindow_init(&ncwin->core); if (res != NSERROR_OK) { -- cgit v1.2.3 From 83840dca49ef6f720e825606555db19b2b659cc6 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 7 Jan 2017 17:43:45 +0000 Subject: Possibly slightly less but still definitely broken drag handling --- frontends/amiga/corewindow.c | 81 ++++++++++++++++++++++++++++---------------- frontends/amiga/history.c | 3 -- frontends/amiga/hotlist.c | 3 -- 3 files changed, 52 insertions(+), 35 deletions(-) diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c index 03ad509d8..1e880e9d7 100644 --- a/frontends/amiga/corewindow.c +++ b/frontends/amiga/corewindow.c @@ -107,13 +107,27 @@ ami_cw_coord_amiga_to_ns(struct ami_corewindow *ami_cw, int *restrict x, int *re /** * check if mouse has moved since position was stored + * @param ami_cw corewindow + * @param x current x position + * @param y current y position + * @param click true to check since last click, false since last drag (press) * @return true if it has, false otherwise */ static bool -ami_cw_mouse_moved(struct ami_corewindow *ami_cw, int x, int y) +ami_cw_mouse_moved(struct ami_corewindow *ami_cw, int x, int y, bool click) { - if(abs(x - ami_cw->mouse_x_click) > 5) return true; - if(abs(y - ami_cw->mouse_y_click) > 5) return true; + int mx, my; + + if(click == true) { + mx = ami_cw->mouse_x_click; + my = ami_cw->mouse_y_click; + } else { + mx = ami_cw->drag_x_start; + my = ami_cw->drag_y_start; + } + + if(abs(x - mx) > 5) return true; + if(abs(y - my) > 5) return true; return false; } @@ -545,47 +559,54 @@ ami_cw_event(void *w) switch(result & WMHI_CLASSMASK) { case WMHI_MOUSEMOVE: - if(ami_cw->dragging == false) { - if(ami_cw_mouse_pos(ami_cw, &x, &y)) { - if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) { - /* Start button 1 drag */ - ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_1, x, y); - /* Replace PRESS with HOLDING and declare drag in progress */ - ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON; - } else if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) { - /* Start button 2 drag */ - ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_2, x, y); - /* Replace PRESS with HOLDING and declare drag in progress */ - ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON; + if(ami_cw_mouse_pos(ami_cw, &x, &y)) { + if(ami_cw->dragging == false) { + if(ami_cw_mouse_moved(ami_cw, x, y, false)) { + if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) { + /* Start button 1 drag */ + ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_1, x, y); + /* Replace PRESS with HOLDING and declare drag in progress */ + ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON; + } else if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) { + /* Start button 2 drag */ + ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_2, x, y); + /* Replace PRESS with HOLDING and declare drag in progress */ + ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON; + } + key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + ami_cw_drag_start(ami_cw, x, y); + } else { + key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); } + } else { key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); - - if ((ami_cw->drag_status == CORE_WINDOW_DRAG_SELECTION) || - (ami_cw->drag_status == CORE_WINDOW_DRAG_MOVE)) { - ami_cw_drag_start(ami_cw, x, y); - } + ami_cw_drag_progress(ami_cw, x, y); } } else { - key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); - ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); - ami_cw_drag_progress(ami_cw, x, y); + if(ami_cw->dragging == true) { + ami_cw_drag_progress(ami_cw, x, y); + } } break; case WMHI_MOUSEBUTTONS: - if(ami_cw_mouse_pos(ami_cw, &x, &y) == false) - break; - + ami_cw_mouse_pos(ami_cw, &x, &y); key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); switch(code) { case SELECTDOWN: ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1; + ami_cw->drag_x_start = x; + ami_cw->drag_y_start = y; break; case MIDDLEDOWN: ami_cw->mouse_state = BROWSER_MOUSE_PRESS_2; + ami_cw->drag_x_start = x; + ami_cw->drag_y_start = y; break; case SELECTUP: @@ -595,7 +616,7 @@ ami_cw_event(void *w) ami_cw->mouse_state = BROWSER_MOUSE_CLICK_1; if(ami_cw->lastclick.tv_sec) { - if((ami_cw_mouse_moved(ami_cw, x, y) == false) && + if((ami_cw_mouse_moved(ami_cw, x, y, true) == false) && (DoubleClick(ami_cw->lastclick.tv_sec, ami_cw->lastclick.tv_usec, curtime.tv_sec, curtime.tv_usec))) @@ -626,11 +647,13 @@ ami_cw_event(void *w) ami_cw->mouse_state = BROWSER_MOUSE_HOVER; break; } - ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); - + if((ami_cw->dragging == true) && (ami_cw->mouse_state & BROWSER_MOUSE_HOVER)) { ami_cw_drag_end(ami_cw, x, y); + ami_cw->drag_status = CORE_WINDOW_DRAG_NONE; } + + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); break; case WMHI_RAWKEY: diff --git a/frontends/amiga/history.c b/frontends/amiga/history.c index 2210301bd..f326f917a 100644 --- a/frontends/amiga/history.c +++ b/frontends/amiga/history.c @@ -190,9 +190,6 @@ ami_history_global_drag_end(struct ami_corewindow *ami_cw, int x, int y) struct gui_window_2 *gwin; struct ami_corewindow *cw; - if(ami_cw == ami_window_at_pointer(AMINS_COREWINDOW)) - return NSERROR_OK; - if(global_history_has_selection()) { ok = global_history_get_selection(&url, &title); } diff --git a/frontends/amiga/hotlist.c b/frontends/amiga/hotlist.c index 422586a00..a0fd30333 100644 --- a/frontends/amiga/hotlist.c +++ b/frontends/amiga/hotlist.c @@ -242,9 +242,6 @@ ami_hotlist_drag_end(struct ami_corewindow *ami_cw, int x, int y) struct gui_window_2 *gwin; struct ami_corewindow *cw; - if(ami_cw == ami_window_at_pointer(AMINS_COREWINDOW)) - return NSERROR_OK; - if(hotlist_has_selection()) { ok = hotlist_get_selection(&url, &title); } -- cgit v1.2.3 From 0f58d92ab6b4fa13e971b0b07d7ee58e7493c4ee Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 7 Jan 2017 18:00:48 +0000 Subject: Dragging works internally (except it doesn't, as the hotlist window is broken and doesn't respond to the mouse until selecting random menu items) --- frontends/amiga/corewindow.c | 152 +++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 78 deletions(-) diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c index 1e880e9d7..eee4b74b2 100644 --- a/frontends/amiga/corewindow.c +++ b/frontends/amiga/corewindow.c @@ -559,101 +559,97 @@ ami_cw_event(void *w) switch(result & WMHI_CLASSMASK) { case WMHI_MOUSEMOVE: - if(ami_cw_mouse_pos(ami_cw, &x, &y)) { - if(ami_cw->dragging == false) { - if(ami_cw_mouse_moved(ami_cw, x, y, false)) { - if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) { - /* Start button 1 drag */ - ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_1, x, y); - /* Replace PRESS with HOLDING and declare drag in progress */ - ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON; - } else if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) { - /* Start button 2 drag */ - ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_2, x, y); - /* Replace PRESS with HOLDING and declare drag in progress */ - ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON; - } - key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); - ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + if(ami_cw_mouse_pos(ami_cw, &x, &y) == true) { + if(ami_cw_mouse_moved(ami_cw, x, y, false)) { + if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) { + /* Start button 1 drag */ + ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_1, x, y); + /* Replace PRESS with HOLDING and declare drag in progress */ + ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON; + } else if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) { + /* Start button 2 drag */ + ami_cw->mouse(ami_cw, BROWSER_MOUSE_DRAG_2, x, y); + /* Replace PRESS with HOLDING and declare drag in progress */ + ami_cw->mouse_state = BROWSER_MOUSE_HOLDING_2 | BROWSER_MOUSE_DRAG_ON; + } + key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + if(ami_cw->dragging == false) { ami_cw_drag_start(ami_cw, x, y); - } else { - key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); - ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); } } else { key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); - ami_cw_drag_progress(ami_cw, x, y); - } - } else { - if(ami_cw->dragging == true) { - ami_cw_drag_progress(ami_cw, x, y); } } + if(ami_cw->dragging == true) { + ami_cw_drag_progress(ami_cw, x, y); + } break; case WMHI_MOUSEBUTTONS: - ami_cw_mouse_pos(ami_cw, &x, &y); - key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); - - switch(code) { - case SELECTDOWN: - ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1; - ami_cw->drag_x_start = x; - ami_cw->drag_y_start = y; - break; - - case MIDDLEDOWN: - ami_cw->mouse_state = BROWSER_MOUSE_PRESS_2; - ami_cw->drag_x_start = x; - ami_cw->drag_y_start = y; - break; - - case SELECTUP: - if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) { - CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&curtime.tv_usec); - - ami_cw->mouse_state = BROWSER_MOUSE_CLICK_1; - - if(ami_cw->lastclick.tv_sec) { - if((ami_cw_mouse_moved(ami_cw, x, y, true) == false) && - (DoubleClick(ami_cw->lastclick.tv_sec, - ami_cw->lastclick.tv_usec, - curtime.tv_sec, curtime.tv_usec))) - ami_cw->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK; + if(ami_cw_mouse_pos(ami_cw, &x, &y) == true) { + key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); + + switch(code) { + case SELECTDOWN: + ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1; + ami_cw->drag_x_start = x; + ami_cw->drag_y_start = y; + break; + + case MIDDLEDOWN: + ami_cw->mouse_state = BROWSER_MOUSE_PRESS_2; + ami_cw->drag_x_start = x; + ami_cw->drag_y_start = y; + break; + + case SELECTUP: + if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_1) { + CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&curtime.tv_usec); + + ami_cw->mouse_state = BROWSER_MOUSE_CLICK_1; + + if(ami_cw->lastclick.tv_sec) { + if((ami_cw_mouse_moved(ami_cw, x, y, true) == false) && + (DoubleClick(ami_cw->lastclick.tv_sec, + ami_cw->lastclick.tv_usec, + curtime.tv_sec, curtime.tv_usec))) + ami_cw->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK; + } + + ami_cw->mouse_x_click = x; + ami_cw->mouse_y_click = y; + + if(ami_cw->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) { + ami_cw->lastclick.tv_sec = 0; + ami_cw->lastclick.tv_usec = 0; + } else { + ami_cw->lastclick.tv_sec = curtime.tv_sec; + ami_cw->lastclick.tv_usec = curtime.tv_usec; + } } - ami_cw->mouse_x_click = x; - ami_cw->mouse_y_click = y; - - if(ami_cw->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) { - ami_cw->lastclick.tv_sec = 0; - ami_cw->lastclick.tv_usec = 0; - } else { - ami_cw->lastclick.tv_sec = curtime.tv_sec; - ami_cw->lastclick.tv_usec = curtime.tv_usec; - } - } + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + ami_cw->mouse_state = BROWSER_MOUSE_HOVER; + break; - ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); - ami_cw->mouse_state = BROWSER_MOUSE_HOVER; - break; + case MIDDLEUP: + if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) + ami_cw->mouse_state = BROWSER_MOUSE_CLICK_2; - case MIDDLEUP: - if(ami_cw->mouse_state & BROWSER_MOUSE_PRESS_2) - ami_cw->mouse_state = BROWSER_MOUSE_CLICK_2; + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + ami_cw->mouse_state = BROWSER_MOUSE_HOVER; + break; + } - ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); - ami_cw->mouse_state = BROWSER_MOUSE_HOVER; - break; - } + if((ami_cw->dragging == true) && (ami_cw->mouse_state & BROWSER_MOUSE_HOVER)) { + ami_cw_drag_end(ami_cw, x, y); + ami_cw->drag_status = CORE_WINDOW_DRAG_NONE; + } - if((ami_cw->dragging == true) && (ami_cw->mouse_state & BROWSER_MOUSE_HOVER)) { - ami_cw_drag_end(ami_cw, x, y); - ami_cw->drag_status = CORE_WINDOW_DRAG_NONE; + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); } - - ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); break; case WMHI_RAWKEY: -- cgit v1.2.3 From 22e25971ed4bc23d742cff7823a9f8224f544db7 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sun, 8 Jan 2017 00:29:49 +0000 Subject: Working internal and tree-to-browser drags tree-to-tree drags don't work unless the source supports internal drag moves (so global history to hotlist won't work as it did before) --- frontends/amiga/corewindow.c | 46 ++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c index eee4b74b2..ea8cd52dd 100644 --- a/frontends/amiga/corewindow.c +++ b/frontends/amiga/corewindow.c @@ -152,11 +152,10 @@ ami_cw_mouse_pos(struct ami_corewindow *ami_cw, int *restrict x, int *restrict y xm -= bbox->Left; ym -= bbox->Top; - ami_gui_free_space_box(bbox); - if((xm < 0) || (ym < 0) || (xm > bbox->Width) || (ym > bbox->Height)) return false; + ami_gui_free_space_box(bbox); ami_cw_scroller_top(ami_cw, &xs, &ys); xm += xs; @@ -472,10 +471,14 @@ HOOKF(void, ami_cw_idcmp_hook, Object *, object, struct IntuiMessage *) static void ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y) { + if(ami_cw->dragging == true) return; + ami_cw->dragging = true; ami_cw->drag_x_start = x; ami_cw->drag_y_start = y; +printf("%ld\n", ami_cw->drag_status); + switch(ami_cw->drag_status) { case CORE_WINDOW_DRAG_SELECTION: break; @@ -495,6 +498,8 @@ ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y) static void ami_cw_drag_progress(struct ami_corewindow *ami_cw, int x, int y) { + if(ami_cw->dragging == false) return; + switch(ami_cw->drag_status) { case CORE_WINDOW_DRAG_SELECTION: break; @@ -514,8 +519,8 @@ ami_cw_drag_progress(struct ami_corewindow *ami_cw, int x, int y) static void ami_cw_drag_end(struct ami_corewindow *ami_cw, int x, int y) { - ami_cw->dragging = false; - + if(ami_cw->dragging == false) return; + switch(ami_cw->drag_status) { case CORE_WINDOW_DRAG_SELECTION: break; @@ -530,6 +535,9 @@ ami_cw_drag_end(struct ami_corewindow *ami_cw, int x, int y) default: break; } + + ami_cw->drag_status = CORE_WINDOW_DRAG_NONE; + ami_cw->dragging = false; } /** @@ -574,7 +582,7 @@ ami_cw_event(void *w) } key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); - if(ami_cw->dragging == false) { + if(ami_cw->mouse_state & BROWSER_MOUSE_DRAG_ON) { ami_cw_drag_start(ami_cw, x, y); } } else { @@ -582,15 +590,12 @@ ami_cw_event(void *w) ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); } } - if(ami_cw->dragging == true) { - ami_cw_drag_progress(ami_cw, x, y); - } + ami_cw_drag_progress(ami_cw, x, y); break; case WMHI_MOUSEBUTTONS: if(ami_cw_mouse_pos(ami_cw, &x, &y) == true) { key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); - switch(code) { case SELECTDOWN: ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1; @@ -643,12 +648,28 @@ ami_cw_event(void *w) break; } - if((ami_cw->dragging == true) && (ami_cw->mouse_state & BROWSER_MOUSE_HOVER)) { + if(ami_cw->mouse_state == BROWSER_MOUSE_HOVER) { ami_cw_drag_end(ami_cw, x, y); - ami_cw->drag_status = CORE_WINDOW_DRAG_NONE; } ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); + } else { + /* event is happening away from our corewindow area */ + switch(code) { + case SELECTUP: + case MIDDLEUP: + ami_cw->mouse_state = BROWSER_MOUSE_HOVER; + break; + + default: + break; + } + + if(ami_cw->mouse_state == BROWSER_MOUSE_HOVER) { + ami_cw_drag_end(ami_cw, x, y); + ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, + ami_cw->drag_x_start, ami_cw->drag_y_start); // placate core + } } break; @@ -833,9 +854,10 @@ nserror ami_corewindow_init(struct ami_corewindow *ami_cw) ami_cw->scroll_x_visible = true; ami_cw->scroll_y_visible = true; ami_cw->in_border_scroll = false; + ami_cw->dragging = false; /* allocate drawing area etc */ - ami_init_layers(&ami_cw->gg, 0, 0, false); + ami_init_layers(&ami_cw->gg, 100, 100, false); // force tiles to save memory ami_cw->gg.shared_pens = ami_AllocMinList(); ami_cw->deferred_rects = NewObjList(); -- cgit v1.2.3 From d885c79743a3169669d6400011ee667aa70e88d9 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sun, 8 Jan 2017 00:34:06 +0000 Subject: remove excessive logging --- frontends/amiga/bitmap.c | 1 - frontends/amiga/corewindow.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/frontends/amiga/bitmap.c b/frontends/amiga/bitmap.c index 5b5d6bb1e..5fc772ba3 100644 --- a/frontends/amiga/bitmap.c +++ b/frontends/amiga/bitmap.c @@ -706,7 +706,6 @@ struct BitMap *ami_bitmap_get_native(struct bitmap *bitmap, int width, int height, struct BitMap *friendbm) { if(bitmap == NULL) return NULL; - LOG("Getting native BitMap for %p", bitmap); if(__builtin_expect(ami_plot_screen_is_palettemapped() == true, 0)) { return ami_bitmap_get_palettemapped(bitmap, width, height, friendbm); diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c index ea8cd52dd..1bfd6c4c6 100644 --- a/frontends/amiga/corewindow.c +++ b/frontends/amiga/corewindow.c @@ -477,8 +477,6 @@ ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y) ami_cw->drag_x_start = x; ami_cw->drag_y_start = y; -printf("%ld\n", ami_cw->drag_status); - switch(ami_cw->drag_status) { case CORE_WINDOW_DRAG_SELECTION: break; -- cgit v1.2.3 From ae8959fa8b46fd21100b72669dcd4da03d91fd97 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sun, 8 Jan 2017 00:40:40 +0000 Subject: Remove old tree implementation --- frontends/amiga/Makefile | 4 +- frontends/amiga/arexx.c | 1 - frontends/amiga/desktop-tree.c | 353 ---------- frontends/amiga/desktop-tree.h | 88 --- frontends/amiga/gui.c | 2 - frontends/amiga/tree.c | 1484 ---------------------------------------- frontends/amiga/tree.h | 47 -- 7 files changed, 2 insertions(+), 1977 deletions(-) delete mode 100644 frontends/amiga/desktop-tree.c delete mode 100644 frontends/amiga/desktop-tree.h delete mode 100644 frontends/amiga/tree.c delete mode 100755 frontends/amiga/tree.h diff --git a/frontends/amiga/Makefile b/frontends/amiga/Makefile index 8115f2f74..b87cda1de 100644 --- a/frontends/amiga/Makefile +++ b/frontends/amiga/Makefile @@ -36,7 +36,7 @@ MESSAGES_FILTER=ami # ---------------------------------------------------------------------------- # sources purely for the Amiga build -S_FRONTEND := gui.c tree.c history.c hotlist.c schedule.c file.c \ +S_FRONTEND := gui.c history.c hotlist.c schedule.c file.c \ misc.c bitmap.c font.c filetype.c utf8.c login.c memory.c \ plotters.c object.c menu.c save_pdf.c arexx.c version.c \ cookies.c ctxmenu.c clipboard.c help.c font_scan.c \ @@ -46,7 +46,7 @@ S_FRONTEND := gui.c tree.c history.c hotlist.c schedule.c file.c \ stringview/stringview.c stringview/urlhistory.c rtg.c \ agclass/amigaguide_class.c os3support.c font_diskfont.c \ selectmenu.c hash/xxhash.c font_cache.c font_bullet.c \ - nsoption.c desktop-tree.c corewindow.c + nsoption.c corewindow.c # This is the final source build list # Note this is deliberately *not* expanded here as common and image diff --git a/frontends/amiga/arexx.c b/frontends/amiga/arexx.c index 63e418a69..7bb2f5882 100644 --- a/frontends/amiga/arexx.c +++ b/frontends/amiga/arexx.c @@ -40,7 +40,6 @@ #include "amiga/gui.h" #include "amiga/download.h" #include "amiga/hotlist.h" -#include "amiga/tree.h" #include "amiga/libs.h" #include "amiga/misc.h" #include "amiga/theme.h" diff --git a/frontends/amiga/desktop-tree.c b/frontends/amiga/desktop-tree.c deleted file mode 100644 index 3fb41edd5..000000000 --- a/frontends/amiga/desktop-tree.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright 2004 Richard Wilson - * Copyright 2009 Paul Blokus - * - * 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 - * deprecated compatibility layer for new treeview modules. Do not use. - */ - -#include -#include -#include -#include -#include - -#include "utils/log.h" -#include "utils/messages.h" -#include "utils/utils.h" -#include "utils/nsoption.h" -#include "netsurf/misc.h" -#include "netsurf/browser_window.h" -#include "netsurf/core_window.h" -#include "content/content.h" -#include "content/hlcache.h" -#include "desktop/gui_internal.h" -#include "desktop/treeview.h" -#include "desktop/hotlist.h" -#include "desktop/cookie_manager.h" -#include "desktop/global_history.h" -#include "desktop/sslcert_viewer.h" - -#include "amiga/desktop-tree.h" - -struct tree { - unsigned int flags; /* Tree flags */ - tree_drag_type drag; - const struct treeview_table *callbacks; - void *client_data; /* User assigned data for the callbacks */ -}; - - -struct sslcert_session_data *ssl_current_session = NULL; -const char *tree_hotlist_path = NULL; - -static void treeview_test_redraw_request(struct core_window *cw, - const struct rect *r) -{ - struct tree *tree = (struct tree *)cw; - - tree->callbacks->redraw_request(r->x0, r->y0, - r->x1 - r->x0, r->y1 - r->y0, - tree->client_data); -} - -static void treeview_test_update_size(struct core_window *cw, - int width, int height) -{ - struct tree *tree = (struct tree *)cw; - - tree->callbacks->resized(tree, width, height, tree->client_data); -} - -static void treeview_test_scroll_visible(struct core_window *cw, - const struct rect *r) -{ -} - -static void treeview_test_get_window_dimensions(struct core_window *cw, - int *width, int *height) -{ - struct tree *tree = (struct tree *)cw; - - tree->callbacks->get_window_dimensions(width, height, - tree->client_data); -} - -static void treeview_test_drag_status(struct core_window *cw, - core_window_drag_status ds) -{ - struct tree *tree = (struct tree *)cw; - - switch (ds) { - case CORE_WINDOW_DRAG_NONE: - tree->drag = TREE_NO_DRAG; - break; - - case CORE_WINDOW_DRAG_SELECTION: - tree->drag = TREE_SELECT_DRAG; - break; - - case CORE_WINDOW_DRAG_MOVE: - tree->drag = TREE_MOVE_DRAG; - break; - - case CORE_WINDOW_DRAG_TEXT_SELECTION: - tree->drag = TREE_TEXTAREA_DRAG; - break; - - default: - break; - } -} - -struct core_window_callback_table cw_t = { - .redraw_request = treeview_test_redraw_request, - .update_size = treeview_test_update_size, - .scroll_visible = treeview_test_scroll_visible, - .get_window_dimensions = treeview_test_get_window_dimensions, - .drag_status = treeview_test_drag_status -}; - -static bool treeview_test_init(struct tree *tree) -{ - nserror err; - - switch (tree->flags) { - case TREE_COOKIES: - err = cookie_manager_init(&cw_t, (struct core_window *)tree); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't init new cookie manager.", 0); - break; - case TREE_HISTORY: - err = global_history_init(&cw_t, (struct core_window *)tree); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't init new global history.", 0); - break; - case TREE_HOTLIST: - err = hotlist_init(tree_hotlist_path); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't init new hotlist.", 0); - err = hotlist_manager_init(&cw_t, (struct core_window *)tree); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't init hotlist manager.", 0); - break; - case TREE_SSLCERT: - assert(ssl_current_session == NULL && - "Call sslcert_viewer_init directly, " - "this compat. layer can't cope with simultanious " - "sslcert viewers"); - err = sslcert_viewer_init(&cw_t, (struct core_window *)tree, - ssl_current_session); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't init new sslcert viewer.", 0); - break; - } - - return true; -} - -static bool treeview_test_fini(struct tree *tree) -{ - nserror err; - - switch (tree->flags) { - case TREE_COOKIES: - err = cookie_manager_fini(); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't finalise cookie manager.", 0); - break; - case TREE_HISTORY: - err = global_history_fini(); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't finalise cookie manager.", 0); - break; - case TREE_HOTLIST: - err = hotlist_fini(tree_hotlist_path); - if (err != NSERROR_OK) - guit->misc->warning("Couldn't finalise hotlist.", 0); - break; - case TREE_SSLCERT: - assert(ssl_current_session != NULL && - "Can't use sslcert window after sslcert_viewer_fini()"); - err = sslcert_viewer_fini(ssl_current_session); - ssl_current_session = NULL; - if (err != NSERROR_OK) - guit->misc->warning("Couldn't finalise sslcert viewer.", 0); - break; - } - - return true; -} - -static bool treeview_test_redraw(struct tree *tree, int x, int y, - int clip_x, int clip_y, int clip_width, int clip_height, - const struct redraw_context *ctx) -{ - struct rect clip; - - clip.x0 = clip_x; - clip.y0 = clip_y; - clip.x1 = clip_x + clip_width; - clip.y1 = clip_y + clip_height; - - switch (tree->flags) { - case TREE_SSLCERT: - if (ssl_current_session != NULL) { - sslcert_viewer_redraw(ssl_current_session, x, y, &clip, ctx); - } - return true; - case TREE_COOKIES: - cookie_manager_redraw(x, y, &clip, ctx); - return true; - case TREE_HISTORY: - global_history_redraw(x, y, &clip, ctx); - return true; - case TREE_HOTLIST: - hotlist_redraw(x, y, &clip, ctx); - return true; - } - - return false; -} - -static bool treeview_test_mouse_action(struct tree *tree, - browser_mouse_state mouse, int x, int y) -{ - switch (tree->flags) { - case TREE_SSLCERT: - assert(ssl_current_session != NULL && - "Can't use sslcert window after sslcert_viewer_fini()"); - sslcert_viewer_mouse_action(ssl_current_session, mouse, x, y); - return true; - case TREE_COOKIES: - cookie_manager_mouse_action(mouse, x, y); - return true; - case TREE_HISTORY: - global_history_mouse_action(mouse, x, y); - return true; - case TREE_HOTLIST: - hotlist_mouse_action(mouse, x, y); - return true; - } - - return false; -} - -static bool treeview_test_keypress(struct tree *tree, uint32_t key) -{ - switch (tree->flags) { - case TREE_SSLCERT: - assert(ssl_current_session != NULL && - "Can't use sslcert window after sslcert_viewer_fini()"); - sslcert_viewer_keypress(ssl_current_session, key); - return true; - case TREE_COOKIES: - cookie_manager_keypress(key); - return true; - case TREE_HISTORY: - global_history_keypress(key); - return true; - case TREE_HOTLIST: - hotlist_keypress(key); - return true; - } - - return false; -} - -/* -------------------------------------------------------------------------- */ - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -struct tree *tree_create(unsigned int flags, - const struct treeview_table *callbacks, void *client_data) -{ - struct tree *tree; - - tree = calloc(sizeof(struct tree), 1); - if (tree == NULL) { - LOG("calloc failed"); - guit->misc->warning(messages_get_errorcode(NSERROR_NOMEM), 0); - return NULL; - } - - tree->flags = flags; - tree->drag = TREE_NO_DRAG; - tree->callbacks = callbacks; - tree->client_data = client_data; - - treeview_test_init(tree); - - return tree; -} - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -void tree_delete(struct tree *tree) -{ - treeview_test_fini(tree); - free(tree); -} - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -void tree_draw(struct tree *tree, int x, int y, - int clip_x, int clip_y, int clip_width, int clip_height, - const struct redraw_context *ctx) -{ - assert(tree != NULL); - - treeview_test_redraw(tree, x, y, clip_x, clip_y, - clip_width, clip_height, ctx); -} - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -bool tree_mouse_action(struct tree *tree, browser_mouse_state mouse, int x, - int y) -{ - assert(tree != NULL); - - if (treeview_test_mouse_action(tree, mouse, x, y)) { - return true; - } - - return false; -} - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -void tree_drag_end(struct tree *tree, browser_mouse_state mouse, int x0, int y0, - int x1, int y1) -{ - assert(tree != NULL); - - treeview_test_mouse_action(tree, BROWSER_MOUSE_HOVER, x1, y1); -} - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -bool tree_keypress(struct tree *tree, uint32_t key) -{ - if (treeview_test_keypress(tree, key)) { - return true; - } - - return false; -} - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -tree_drag_type tree_drag_status(struct tree *tree) -{ - assert(tree != NULL); - return tree->drag; -} diff --git a/frontends/amiga/desktop-tree.h b/frontends/amiga/desktop-tree.h deleted file mode 100644 index f8864e167..000000000 --- a/frontends/amiga/desktop-tree.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2004 Richard Wilson - * Copyright 2009 Paul Blokus - * - * 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 - * deprecated compatibility layer for new treeview modules. Do not use. - */ - -#ifndef _NETSURF_DESKTOP_TREE_H_ -#define _NETSURF_DESKTOP_TREE_H_ - -#include -#include - -#include "netsurf/mouse.h" - -struct sslcert_session_data; -struct tree; -struct redraw_context; - -/** - * Current ssl session data for treeview - * - * @todo FIXME global certificate treeview state must go away, this is - * just wrong. - */ -extern struct sslcert_session_data *ssl_current_session; -extern const char *tree_hotlist_path; - -/* Tree flags */ -enum tree_flags { - TREE_HISTORY, - TREE_COOKIES, - TREE_SSLCERT, - TREE_HOTLIST -}; - -typedef enum { - TREE_NO_DRAG = 0, - TREE_SELECT_DRAG, - TREE_MOVE_DRAG, - TREE_TEXTAREA_DRAG, /** < A drag that is passed to a textarea */ - TREE_UNKNOWN_DRAG /** < A drag the tree itself won't handle */ -} tree_drag_type; - -/** callbacks to perform necessary operations on treeview. */ -struct treeview_table { - void (*redraw_request)(int x, int y, int width, int height, - void *data); /**< request a redraw. */ - void (*resized)(struct tree *tree, int width, int height, - void *data); /**< resize treeview area. */ - void (*scroll_visible)(int y, int height, void *data); /**< scroll visible treeview area. */ - void (*get_window_dimensions)(int *width, int *height, void *data); /**< get dimensions of window */ -}; - -struct tree *tree_create(unsigned int flags, - const struct treeview_table *callbacks, - void *client_data); - -/** deprecated compatibility layer for new treeview modules. Do not use. */ -void tree_delete(struct tree *tree); -tree_drag_type tree_drag_status(struct tree *tree); -void tree_draw(struct tree *tree, int x, int y, - int clip_x, int clip_y, int clip_width, int clip_height, - const struct redraw_context *ctx); -bool tree_mouse_action(struct tree *tree, browser_mouse_state mouse, - int x, int y); -void tree_drag_end(struct tree *tree, browser_mouse_state mouse, int x0, int y0, - int x1, int y1); -bool tree_keypress(struct tree *tree, uint32_t key); - - -#endif diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c index 4e88a0e47..e27d10588 100644 --- a/frontends/amiga/gui.c +++ b/frontends/amiga/gui.c @@ -118,7 +118,6 @@ #include "desktop/searchweb.h" /* NetSurf Amiga platform includes */ -#include "amiga/desktop-tree.h" #include "amiga/gui.h" #include "amiga/arexx.h" #include "amiga/bitmap.h" @@ -151,7 +150,6 @@ #include "amiga/search.h" #include "amiga/selectmenu.h" #include "amiga/theme.h" -#include "amiga/tree.h" #include "amiga/utf8.h" #include "amiga/sslcert.h" diff --git a/frontends/amiga/tree.c b/frontends/amiga/tree.c deleted file mode 100644 index b9747c095..000000000 --- a/frontends/amiga/tree.c +++ /dev/null @@ -1,1484 +0,0 @@ -/* - * Copyright 2008 - 2013 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 . - */ - -#include "amiga/os3support.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef __amigaos4__ -#include -#endif - -#include -#include - -#include "utils/nsoption.h" -#include "utils/utils.h" -#include "utils/messages.h" -#include "netsurf/browser_window.h" -#include "netsurf/window.h" -#include "netsurf/keypress.h" -#include "content/llcache.h" -#include "desktop/cookie_manager.h" -#include "desktop/global_history.h" -#include "desktop/hotlist.h" -#include "desktop/sslcert_viewer.h" - -#include "amiga/gui.h" -#include "amiga/tree.h" -#include "amiga/file.h" -#include "amiga/libs.h" -#include "amiga/misc.h" -#include "amiga/utf8.h" -#include "amiga/sslcert.h" -#include "amiga/drag.h" /* drag icon stuff */ -#include "amiga/theme.h" /* pointers */ -#include "amiga/filetype.h" -#include "amiga/schedule.h" -#include "amiga/plotters.h" - -#define AMI_TREE_MENU_ITEMS 26 -#define AMI_TREE_MENU_NEWDIR FULLMENUNUM(1,0,0) -#define AMI_TREE_MENU_NEWURL FULLMENUNUM(1,1,0) -#define AMI_TREE_MENU_EDIT FULLMENUNUM(1,3,0) -#define AMI_TREE_MENU_DELETE FULLMENUNUM(1,5,0) -#define AMI_TREE_MENU_CLEAR FULLMENUNUM(1,8,0) - -enum { - GID_OPEN = GID_LAST, - GID_TREE_LAST -}; - - -struct treeview_window { - struct ami_generic_window w; - struct Window *win; - Object *objects[GID_TREE_LAST]; - int type; - struct NewMenu *menu; - char *menu_name[AMI_TREE_MENU_ITEMS]; - struct tree *tree; - struct Hook scrollerhook; - uint32 key_state; - uint32 mouse_state; - int drag_x; - int drag_y; - struct timeval lastclick; - int max_width; - int max_height; - struct gui_globals globals; - struct sslcert_session_data *ssl_data; - char *wintitle; - char *sslerr; - char *sslaccept; - char *sslreject; - struct MinList *shared_pens; -}; - -struct ami_tree_redraw_req { - int x; - int y; - int width; - int height; - struct treeview_window *twin; -}; - -static BOOL ami_tree_event(void *w); - -static const struct ami_win_event_table ami_tree_table = { - ami_tree_event, - ami_tree_close, -}; - -#if 0 -void ami_tree_draw(struct treeview_window *twin); -static void ami_tree_resized(struct tree *tree, int width, - int height, void *data); -static void ami_tree_scroll_visible(int y, int height, void *data); -static void ami_tree_get_window_dimensions(int *width, int *height, void *data); -#endif - -void ami_tree_destroy(struct treeview_window *twin) -{ - tree_delete(twin->tree); - free(twin->shared_pens); - free(twin); -} - -struct tree *ami_tree_get_tree(struct treeview_window *twin) -{ - return twin->tree; -} - -static void ami_tree_resized(struct tree *tree, int width, int height, void *data) -{ - struct treeview_window *twin = data; - struct IBox *bbox; - - twin->max_height = height; - twin->max_width = width; - - if(twin->win) - { - if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - return; - } - - if(height == -1) { - SetAttrs((APTR)twin->objects[OID_MAIN], - WINDOW_VertProp, -1, - TAG_DONE); - } else { - RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, - SCROLLER_Total, height, - SCROLLER_Visible, bbox->Height, - TAG_DONE); - } - - if(width == -1) { - SetAttrs((APTR)twin->objects[OID_MAIN], - WINDOW_HorizProp, -1, - TAG_DONE); - } else { - RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL, - SCROLLER_Total, width, - SCROLLER_Visible, bbox->Width, - TAG_DONE); - } - ami_gui_free_space_box(bbox); - } -} - -/** - * Retrieves the dimensions of the window with the tree - * - * \param data user data assigned to the tree on tree creation - * \param width will be updated to window width if not NULL - * \param height will be updated to window height if not NULL - */ -static void ami_tree_get_window_dimensions(int *width, int *height, void *data) -{ - struct treeview_window *twin = data; - struct IBox *bbox; - - if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - return; - } - - if(width) *width = bbox->Width; - if(height) *height = bbox->Height; - - ami_gui_free_space_box(bbox); -} - -static void ami_tree_redraw_req_dr(void *p) -{ - struct ami_tree_redraw_req *atrr_data = (struct ami_tree_redraw_req *)p; - int x = atrr_data->x; - int y = atrr_data->y; - int width = atrr_data->width; - int height = atrr_data->height; - struct treeview_window *twin = atrr_data->twin; - struct IBox *bbox; - int pos_x, pos_y; - struct RastPort *temprp; - struct redraw_context ctx = { - .interactive = true, - .background_images = true, - .plot = &amiplot - }; - - if(!twin->win) return; - - ami_update_pointer(twin->win, GUI_POINTER_WAIT); - - glob = &twin->globals; - temprp = glob->rp; - glob->rp = twin->win->RPort; - - GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&pos_x); - GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&pos_y); - - if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - free(atrr_data); - return; - } - - x += bbox->Left; - y += bbox->Top; - - if(x - pos_x + width > bbox->Width) width = bbox->Width - (x - pos_x); - if(y - pos_y + height > bbox->Height) height = bbox->Height - (y - pos_y); - - if(x < pos_x) { - width -= pos_x - x; - x = pos_x; - } - - if(y < pos_y) { - height -= pos_y - y; - y = pos_y; - } - - tree_draw(twin->tree, bbox->Left - pos_x, bbox->Top - pos_y, - atrr_data->x, atrr_data->y, - atrr_data->width, atrr_data->height, &ctx); - - free(atrr_data); - ami_gui_free_space_box(bbox); - ami_update_pointer(twin->win, GUI_POINTER_DEFAULT); - ami_clearclipreg(glob); - glob->rp = temprp; - ami_gui_set_default_gg(); -} - -static void ami_tree_redraw_req(void *p) -{ - struct ami_tree_redraw_req *atrr_data = (struct ami_tree_redraw_req *)p; - int x = atrr_data->x; - int y = atrr_data->y; - int width = atrr_data->width; - int height = atrr_data->height; - struct treeview_window *twin = atrr_data->twin; - struct IBox *bbox; - int pos_x, pos_y; - int tile_x, tile_y, tile_w, tile_h; - struct redraw_context ctx = { - .interactive = true, - .background_images = true, - .plot = &amiplot - }; - - free(atrr_data); - - if(!twin->win) return; - - ami_update_pointer(twin->win, GUI_POINTER_WAIT); - - glob = &twin->globals; - - GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&pos_x); - GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&pos_y); - - if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - return; - } - - if(x - pos_x + width > bbox->Width) width = bbox->Width - (x - pos_x); - if(y - pos_y + height > bbox->Height) height = bbox->Height - (y - pos_y); - - if(x < pos_x) { - width -= pos_x - x; - x = pos_x; - } - - if(y < pos_y) { - height -= pos_y - y; - y = pos_y; - } - - for(tile_y = y; tile_y < (y + height); tile_y += nsoption_int(redraw_tile_size_y)) { - tile_h = nsoption_int(redraw_tile_size_y); - if(((y + height) - tile_y) < nsoption_int(redraw_tile_size_y)) - tile_h = (y + height) - tile_y; - - for(tile_x = x; tile_x < (x + width); tile_x += nsoption_int(redraw_tile_size_x)) { - tile_w = nsoption_int(redraw_tile_size_x); - if(((x + width) - tile_x) < nsoption_int(redraw_tile_size_x)) - tile_w = (x + width) - tile_x; - - tree_draw(twin->tree, - tile_x, - tile_y, - tile_x, tile_y, tile_w, tile_h, &ctx); -#ifdef __amigaos4__ - BltBitMapTags(BLITA_SrcType, BLITT_BITMAP, - BLITA_Source, twin->globals.bm, - BLITA_SrcX, 0, - BLITA_SrcY, 0, - BLITA_DestType, BLITT_RASTPORT, - BLITA_Dest, twin->win->RPort, - BLITA_DestX, bbox->Left + tile_x - pos_x, - BLITA_DestY, bbox->Top + tile_y - pos_y, - BLITA_Width, tile_w, - BLITA_Height, tile_h, - TAG_DONE); -#else - BltBitMapRastPort(twin->globals.bm, 0, 0, - twin->win->RPort, bbox->Left + tile_x - pos_x, bbox->Top + tile_y - pos_y, - tile_w, tile_h, 0xC0); -#endif - } - } - - ami_gui_free_space_box(bbox); - ami_update_pointer(twin->win, GUI_POINTER_DEFAULT); - ami_clearclipreg(glob); - ami_gui_set_default_gg(); -} - -static void ami_tree_redraw_request(int x, int y, int width, int height, void *data) -{ - struct ami_tree_redraw_req *atrr_data = malloc(sizeof(struct ami_tree_redraw_req)); - - atrr_data->x = x; - atrr_data->y = y; - atrr_data->width = width; - atrr_data->height = height; - atrr_data->twin = (struct treeview_window *)data; - - /** /todo Queue these requests properly like the main browser code does - **/ - - if(nsoption_bool(direct_render) == false) - ami_schedule(0, ami_tree_redraw_req, atrr_data); - else - ami_schedule(0, ami_tree_redraw_req_dr, atrr_data); -} - -static void ami_tree_draw(struct treeview_window *twin) -{ - struct IBox *bbox; - int x, y; - - if(!twin) return; - - GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x); - GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y); - - if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - return; - } - - ami_tree_redraw_request(x, y, bbox->Width, bbox->Height, twin); - - ami_gui_free_space_box(bbox); -} - -/** - * Scrolls the tree to make an element visible - * - * \param y Y coordinate of the element - * \param height height of the element - * \param data user data assigned to the tree on tree creation - */ -static void ami_tree_scroll_visible(int y, int height, void *data) -{ - int sy, scrollset; - struct IBox *bbox; - struct treeview_window *twin = data; - - GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&sy); - if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - return; - } - - if((y > sy) && ((y + height) < (sy + bbox->Height))) { - ami_gui_free_space_box(bbox); - return; - } - - if((y <= sy) || (height > bbox->Height)) scrollset = (ULONG)y; - else scrollset = sy + (y + height) - (sy + bbox->Height); - - RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, - SCROLLER_Top, scrollset, - TAG_DONE); - - ami_gui_free_space_box(bbox); - ami_tree_draw(twin); -} - -static void ami_tree_scroll(struct treeview_window *twin, int sx, int sy) -{ - int x, y; - - if(!twin) return; - - GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&x); - GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&y); - - x += sx; - y += sy; - - if(y < 0) y = 0; - if(x < 0) x = 0; - - RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, - SCROLLER_Top, y, - TAG_DONE); - - RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL, - SCROLLER_Top, x, - TAG_DONE); - - ami_tree_draw(twin); -} - -static void ami_tree_drag_icon_show(struct treeview_window *twin) -{ - const char *type = "project"; - nsurl *url = NULL; - const char *title = NULL; - - if((twin->type == AMI_TREE_COOKIES) || - (twin->type == AMI_TREE_SSLCERT)) return; /* No permissable drag operations */ - - if((tree_drag_status(twin->tree) == TREE_SELECT_DRAG) || - (tree_drag_status(twin->tree) == TREE_TEXTAREA_DRAG)) - return; - - if((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) { - hotlist_get_selection(&url, &title); - } else if((twin->type == AMI_TREE_HISTORY) && (global_history_has_selection())) { - global_history_get_selection(&url, &title); - } - - if(title && (url == NULL)) - { - ami_drag_icon_show(twin->win, "drawer"); - } - else - { - ami_drag_icon_show(twin->win, type); - } -} - -static void ami_tree_drag_end(struct treeview_window *twin, int x, int y) -{ - struct gui_window_2 *gwin; - struct treeview_window *tw; - BOOL drag; - nsurl *url = NULL; - const char *title = NULL; - bool ok = false; - - if((drag = ami_drag_in_progress())) ami_drag_icon_close(twin->win); - - if(drag && (twin != ami_window_at_pointer(AMINS_TVWINDOW))) - { - if((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) { - ok = hotlist_get_selection(&url, &title); - } else if((twin->type == AMI_TREE_HISTORY) && (global_history_has_selection())) { - ok = global_history_get_selection(&url, &title); - } - - if((ok == false) || (url == NULL)) { - DisplayBeep(scrn); - } else if(url) { - if((gwin = ami_window_at_pointer(AMINS_WINDOW))) { - browser_window_navigate(gwin->gw->bw, - url, - NULL, - BW_NAVIGATE_HISTORY, - NULL, - NULL, - NULL); - } else if((tw = ami_window_at_pointer(AMINS_TVWINDOW)) && - (tw != twin) && (tw->type == AMI_TREE_HOTLIST)) { - hotlist_add_entry(url, title, true, y); - } - } - tree_mouse_action(twin->tree, twin->mouse_state | twin->key_state, - twin->drag_x, twin->drag_y); /* Keep the tree happy */ - tree_drag_end(twin->tree, twin->mouse_state, - twin->drag_x, twin->drag_y, - twin->drag_x, twin->drag_y); /* Keep the tree happier */ - } else { - if(tree_drag_status(twin->tree) == TREE_UNKNOWN_DRAG) - DisplayBeep(scrn); - - tree_drag_end(twin->tree, twin->mouse_state, - twin->drag_x, twin->drag_y, x, y); - } -} - -HOOKF(void, ami_tree_scroller_hook, Object *, object, struct IntuiMessage *) -{ - ULONG gid; - struct treeview_window *twin = hook->h_Data; - struct IntuiWheelData *wheel; - - switch(msg->Class) - { - case IDCMP_IDCMPUPDATE: - gid = GetTagData( GA_ID, 0, msg->IAddress ); - - switch( gid ) - { - case OID_HSCROLL: - case OID_VSCROLL: - ami_tree_draw(twin); - break; - } - break; -#ifdef __amigaos4__ - case IDCMP_EXTENDEDMOUSE: - if(msg->Code == IMSGCODE_INTUIWHEELDATA) - { - wheel = (struct IntuiWheelData *)msg->IAddress; - - ami_tree_scroll(twin, (wheel->WheelX * 20), (wheel->WheelY * 20)); - } - break; -#endif - } -} - -static void ami_tree_menu(struct treeview_window *twin) -{ - if(twin->menu) return; - - if((twin->menu = calloc(1, sizeof(struct NewMenu) * AMI_TREE_MENU_ITEMS))) { - twin->menu[0].nm_Type = NM_TITLE; - twin->menu_name[0] = ami_utf8_easy((char *)messages_get("Tree")); - twin->menu[0].nm_Label = twin->menu_name[0]; - - twin->menu[1].nm_Type = NM_ITEM; - twin->menu_name[1] = ami_utf8_easy((char *)messages_get("TreeExport")); - twin->menu[1].nm_Label = twin->menu_name[1]; - if(twin->type == AMI_TREE_COOKIES) - twin->menu[1].nm_Flags = NM_ITEMDISABLED; - twin->menu[1].nm_CommKey = "S"; - - twin->menu[2].nm_Type = NM_ITEM; - twin->menu[2].nm_Label = NM_BARLABEL; - - twin->menu[3].nm_Type = NM_ITEM; - twin->menu_name[3] = ami_utf8_easy((char *)messages_get("Expand")); - twin->menu[3].nm_Label = twin->menu_name[3]; - - twin->menu[4].nm_Type = NM_SUB; - twin->menu_name[4] = ami_utf8_easy((char *)messages_get("All")); - twin->menu[4].nm_Label = twin->menu_name[4]; - twin->menu[4].nm_CommKey = "+"; - - if(twin->type == AMI_TREE_COOKIES) - { - twin->menu_name[5] = ami_utf8_easy((char *)messages_get("Domains")); - twin->menu_name[6] = ami_utf8_easy((char *)messages_get("Cookies")); - } - else - { - twin->menu_name[5] = ami_utf8_easy((char *)messages_get("Folders")); - twin->menu_name[6] = ami_utf8_easy((char *)messages_get("Links")); - } - - twin->menu[5].nm_Type = NM_SUB; - twin->menu[5].nm_Label = twin->menu_name[5]; // tree-specific title - - twin->menu[6].nm_Type = NM_SUB; - twin->menu[6].nm_Label = twin->menu_name[6]; // tree-specific title - - twin->menu[7].nm_Type = NM_ITEM; - twin->menu_name[7] = ami_utf8_easy((char *)messages_get("Collapse")); - twin->menu[7].nm_Label = twin->menu_name[7]; - - twin->menu[8].nm_Type = NM_SUB; - twin->menu[8].nm_Label = twin->menu_name[4]; - twin->menu[8].nm_CommKey = "-"; - - twin->menu[9].nm_Type = NM_SUB; - twin->menu[9].nm_Label = twin->menu_name[5]; // tree-specific title - - twin->menu[10].nm_Type = NM_SUB; - twin->menu[10].nm_Label = twin->menu_name[6]; // tree-specific title - - twin->menu[11].nm_Type = NM_ITEM; - twin->menu[11].nm_Label = NM_BARLABEL; - - twin->menu[12].nm_Type = NM_ITEM; - twin->menu_name[12] = ami_utf8_easy((char *)messages_get("SnapshotWindow")); - twin->menu[12].nm_Label = twin->menu_name[12]; - - twin->menu[13].nm_Type = NM_ITEM; - twin->menu[13].nm_Label = NM_BARLABEL; - - twin->menu[14].nm_Type = NM_ITEM; - twin->menu_name[14] = ami_utf8_easy((char *)messages_get("CloseWindow")); - twin->menu[14].nm_Label = twin->menu_name[14]; - twin->menu[14].nm_CommKey = "K"; - - twin->menu[15].nm_Type = NM_TITLE; - twin->menu_name[15] = ami_utf8_easy((char *)messages_get("Edit")); - twin->menu[15].nm_Label = twin->menu_name[15]; - - twin->menu[16].nm_Type = NM_ITEM; - twin->menu_name[16] = ami_utf8_easy((char *)messages_get("TreeNewFolder")); - twin->menu[16].nm_Label = twin->menu_name[16]; - twin->menu[16].nm_CommKey = "N"; - - twin->menu[17].nm_Type = NM_ITEM; - twin->menu_name[17] = ami_utf8_easy((char *)messages_get("TreeNewLink")); - twin->menu[17].nm_Label = twin->menu_name[17]; - - twin->menu[18].nm_Type = NM_ITEM; - twin->menu[18].nm_Label = NM_BARLABEL; - - twin->menu[19].nm_Type = NM_ITEM; - twin->menu_name[19] = ami_utf8_easy((char *)messages_get("TreeEdit")); - twin->menu[19].nm_Label = twin->menu_name[19]; - twin->menu[19].nm_CommKey = "E"; - - twin->menu[20].nm_Type = NM_ITEM; - twin->menu[20].nm_Label = NM_BARLABEL; - - twin->menu[21].nm_Type = NM_ITEM; - twin->menu_name[21] = ami_utf8_easy((char *)messages_get("TreeDelete")); - twin->menu[21].nm_Label = twin->menu_name[21]; - twin->menu[21].nm_CommKey = "D"; - - twin->menu[22].nm_Type = NM_ITEM; - twin->menu[22].nm_Label = NM_BARLABEL; - - twin->menu[23].nm_Type = NM_ITEM; - twin->menu_name[23] = ami_utf8_easy((char *)messages_get("SelectAllNS")); - twin->menu[23].nm_Label = twin->menu_name[23]; - twin->menu[23].nm_CommKey = "A"; - - twin->menu[24].nm_Type = NM_ITEM; - twin->menu_name[24] = ami_utf8_easy((char *)messages_get("ClearNS")); - twin->menu[24].nm_Label = twin->menu_name[24]; - - twin->menu[25].nm_Type = NM_END; - twin->menu_name[25] = NULL; - } -} - -static void ami_tree_update_buttons(struct treeview_window *twin) -{ - if(twin->type == AMI_TREE_SSLCERT) return; - if(twin->menu == NULL) return; - - if(twin->type != AMI_TREE_HOTLIST) { - OffMenu(twin->win, AMI_TREE_MENU_NEWDIR); - OffMenu(twin->win, AMI_TREE_MENU_NEWURL); - } - - if((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) { - OnMenu(twin->win, AMI_TREE_MENU_EDIT); - } else { - OffMenu(twin->win, AMI_TREE_MENU_EDIT); - } - - if(((twin->type == AMI_TREE_HOTLIST) && (hotlist_has_selection())) || - ((twin->type == AMI_TREE_COOKIES) && (cookie_manager_has_selection())) || - ((twin->type == AMI_TREE_HISTORY) && (global_history_has_selection()))) { - OnMenu(twin->win, AMI_TREE_MENU_DELETE); - OnMenu(twin->win, AMI_TREE_MENU_CLEAR); - } else { - OffMenu(twin->win, AMI_TREE_MENU_DELETE); - OffMenu(twin->win, AMI_TREE_MENU_CLEAR); - } -} - -void ami_tree_open(struct treeview_window *twin,int type) -{ - if(twin->win) - { - WindowToFront(twin->win); - ActivateWindow(twin->win); - return; - } - - twin->type = type; - - switch(twin->type) - { - case AMI_TREE_HOTLIST: - twin->wintitle = ami_utf8_easy((char *)messages_get("Hotlist")); - break; - case AMI_TREE_COOKIES: - twin->wintitle = ami_utf8_easy((char *)messages_get("Cookies")); - break; - case AMI_TREE_HISTORY: - twin->wintitle = ami_utf8_easy((char *)messages_get("GlobalHistory")); - break; - case AMI_TREE_SSLCERT: - twin->wintitle = ami_utf8_easy((char *)messages_get("SSLCerts")); - twin->sslerr = ami_utf8_easy((char *)messages_get("SSLError")); - twin->sslaccept = ami_utf8_easy((char *)messages_get("SSL_Certificate_Accept")); - twin->sslreject = ami_utf8_easy((char *)messages_get("SSL_Certificate_Reject")); - break; - } - - twin->scrollerhook.h_Entry = (void *)ami_tree_scroller_hook; - twin->scrollerhook.h_Data = twin; - - ami_init_layers(&twin->globals, 0, 0, false); - ami_tree_menu(twin); - - if(type == AMI_TREE_SSLCERT) - { - twin->objects[OID_MAIN] = WindowObj, - WA_ScreenTitle, ami_gui_get_screen_title(), - WA_Title, twin->wintitle, - WA_Activate, TRUE, - WA_DepthGadget, TRUE, - WA_DragBar, TRUE, - WA_CloseGadget, TRUE, - WA_SizeGadget, TRUE, - WA_SizeBRight, TRUE, - WA_Height, scrn->Height / 2, - WA_PubScreen,scrn, - WA_ReportMouse,TRUE, - WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | - IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | - IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY, - WINDOW_HorizProp,1, - WINDOW_VertProp,1, - WINDOW_IDCMPHook,&twin->scrollerhook, - WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE, - WINDOW_SharedPort,sport, - WINDOW_UserData,twin, - /* WINDOW_NewMenu, twin->menu, -> No menu for SSL Cert */ - WINDOW_IconifyGadget, FALSE, - WINDOW_Position, WPOS_CENTERSCREEN, - WINDOW_ParentGroup, twin->objects[GID_MAIN] = LayoutVObj, - LAYOUT_AddImage, LabelObj, - LABEL_Text, twin->sslerr, - LabelEnd, - LAYOUT_AddChild, twin->objects[GID_BROWSER] = SpaceObj, - GA_ID, GID_BROWSER, - SPACE_Transparent,TRUE, - SPACE_BevelStyle, BVS_DISPLAY, - SpaceEnd, - LAYOUT_AddChild, LayoutHObj, - LAYOUT_AddChild, twin->objects[GID_OPEN] = ButtonObj, - GA_ID,GID_OPEN, - GA_Text, twin->sslaccept, - GA_RelVerify,TRUE, - ButtonEnd, - LAYOUT_AddChild, twin->objects[GID_CANCEL] = ButtonObj, - GA_ID,GID_CANCEL, - GA_Text, twin->sslreject, - GA_RelVerify,TRUE, - ButtonEnd, - EndGroup, - CHILD_WeightedHeight,0, - EndGroup, - EndWindow; - } - else - { - ULONG width = scrn->Width / 2; - ULONG height = scrn->Height / 2; - ULONG top = (scrn->Height / 2) - (height / 2); - ULONG left = (scrn->Width / 2) - (width / 2); - - if((type == AMI_TREE_HOTLIST) && (nsoption_int(hotlist_window_xsize) > 0)) - { - top = nsoption_int(hotlist_window_ypos); - left = nsoption_int(hotlist_window_xpos); - width = nsoption_int(hotlist_window_xsize); - height = nsoption_int(hotlist_window_ysize); - } - else if((type == AMI_TREE_HISTORY) && (nsoption_int(history_window_xsize) > 0)) - { - top = nsoption_int(history_window_ypos); - left = nsoption_int(history_window_xpos); - width = nsoption_int(history_window_xsize); - height = nsoption_int(history_window_ysize); - } - else if((type == AMI_TREE_COOKIES) && (nsoption_int(cookies_window_xsize) > 0)) - { - top = nsoption_int(cookies_window_ypos); - left = nsoption_int(cookies_window_xpos); - width = nsoption_int(cookies_window_xsize); - height = nsoption_int(cookies_window_ysize); - } - - twin->objects[OID_MAIN] = WindowObj, - WA_ScreenTitle, ami_gui_get_screen_title(), - WA_Title, twin->wintitle, - WA_Activate, TRUE, - WA_DepthGadget, TRUE, - WA_DragBar, TRUE, - WA_CloseGadget, TRUE, - WA_SizeGadget, TRUE, - WA_SizeBRight, TRUE, - WA_Top, top, - WA_Left, left, - WA_Width, width, - WA_Height, height, - WA_PubScreen,scrn, - WA_ReportMouse,TRUE, - WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | - IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | - IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY | IDCMP_INTUITICKS, - WINDOW_HorizProp,1, - WINDOW_VertProp,1, - WINDOW_IDCMPHook,&twin->scrollerhook, - WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE, - WINDOW_SharedPort,sport, - WINDOW_UserData,twin, - WINDOW_NewMenu, twin->menu, - WINDOW_IconifyGadget, FALSE, -// WINDOW_Position, WPOS_CENTERSCREEN, - WINDOW_ParentGroup, twin->objects[GID_MAIN] = LayoutVObj, - LAYOUT_AddChild, twin->objects[GID_BROWSER] = SpaceObj, - GA_ID, GID_BROWSER, - SPACE_Transparent,TRUE, - SPACE_BevelStyle, BVS_DISPLAY, - SpaceEnd, - EndGroup, - EndWindow; - } - - twin->win = (struct Window *)RA_OpenWindow(twin->objects[OID_MAIN]); - - GetAttr(WINDOW_HorizObject, twin->objects[OID_MAIN], - (ULONG *)&twin->objects[OID_HSCROLL]); - GetAttr(WINDOW_VertObject, twin->objects[OID_MAIN], - (ULONG *)&twin->objects[OID_VSCROLL]); - - RefreshSetGadgetAttrs((APTR)twin->objects[OID_VSCROLL], twin->win, NULL, - GA_ID,OID_VSCROLL, - ICA_TARGET,ICTARGET_IDCMP, - TAG_DONE); - - RefreshSetGadgetAttrs((APTR)twin->objects[OID_HSCROLL], twin->win, NULL, - GA_ID,OID_HSCROLL, - ICA_TARGET,ICTARGET_IDCMP, - TAG_DONE); - - ami_gui_win_list_add(twin, AMINS_TVWINDOW, &ami_tree_table); - - ami_tree_update_buttons(twin); - ami_tree_resized(twin->tree, twin->max_width, twin->max_height, twin); - ami_tree_draw(twin); -} - -void ami_tree_close(void *w) -{ - struct treeview_window *twin = (struct treeview_window *)w; - int i; - - twin->win = NULL; - DisposeObject(twin->objects[OID_MAIN]); - ami_gui_win_list_remove(twin); - ami_plot_release_pens(twin->shared_pens); - ami_free_layers(&twin->globals); - - for(i=0;imenu_name[i] && (twin->menu_name[i] != NM_BARLABEL)) - ami_utf8_free(twin->menu_name[i]); - twin->menu_name[i] = NULL; - } - - free(twin->menu); - twin->menu = NULL; - ami_utf8_free(twin->wintitle); - twin->wintitle = NULL; - if(twin->type == AMI_TREE_SSLCERT) { - ami_utf8_free(twin->sslerr); - ami_utf8_free(twin->sslaccept); - ami_utf8_free(twin->sslreject); - //ami_ssl_free(twin); - } - - if(twin->type == AMI_TREE_HOTLIST) - ami_gui_hotlist_update_all(); -} - -static void ami_tree_update_quals(struct treeview_window *twin) -{ - uint32 quals = 0; -#ifdef __amigaos4__ - GetAttr(WINDOW_Qualifier, twin->objects[OID_MAIN], (uint32 *)&quals); -#else -#warning FIXME not reading qualifiers on OS3 -#endif - twin->key_state = 0; - - if((quals & IEQUALIFIER_LSHIFT) || (quals & IEQUALIFIER_RSHIFT)) - { - twin->key_state |= BROWSER_MOUSE_MOD_1; - } - - if(quals & IEQUALIFIER_CONTROL) - { - twin->key_state |= BROWSER_MOUSE_MOD_2; - } - - if((quals & IEQUALIFIER_LALT) || (quals & IEQUALIFIER_RALT)) - { - twin->key_state |= BROWSER_MOUSE_MOD_3; - } -} - -static BOOL ami_tree_event(void *w) -{ - /* return TRUE if window destroyed */ - struct treeview_window *twin = (struct treeview_window *)w; - ULONG result,storage = 0; - uint16 code; - struct MenuItem *item; - ULONG menunum=0,itemnum=0,subnum=0; - int xs, ys, x, y; - struct IBox *bbox; - struct timeval curtime; - struct InputEvent *ie; - int nskey; - char fname[1024]; - static int drag_x_move = 0, drag_y_move = 0; - - while((result = RA_HandleInput(twin->objects[OID_MAIN],&code)) != WMHI_LASTMSG) - { - switch(result & WMHI_CLASSMASK) // class - { - case WMHI_GADGETUP: - switch(result & WMHI_GADGETMASK) - { - case GID_OPEN: - sslcert_viewer_accept(twin->ssl_data); - ami_tree_close(twin); - return TRUE; - break; - - case GID_CANCEL: - sslcert_viewer_reject(twin->ssl_data); - ami_tree_close(twin); - return TRUE; - break; - } - break; - - case WMHI_MOUSEMOVE: - drag_x_move = 0; - drag_y_move = 0; - - if(ami_gui_get_space_box(twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - break; - } - - GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&xs); - x = twin->win->MouseX - bbox->Left + xs; - - GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&ys); - y = twin->win->MouseY - bbox->Top + ys; - - if(twin->mouse_state & BROWSER_MOUSE_DRAG_ON) - { - ami_drag_icon_move(); - - if((twin->win->MouseX < bbox->Left) && - ((twin->win->MouseX - bbox->Left) > -AMI_DRAG_THRESHOLD)) - drag_x_move = twin->win->MouseX - bbox->Left; - if((twin->win->MouseX > (bbox->Left + bbox->Width)) && - ((twin->win->MouseX - (bbox->Left + bbox->Width)) < AMI_DRAG_THRESHOLD)) - drag_x_move = twin->win->MouseX - (bbox->Left + bbox->Width); - if((twin->win->MouseY < bbox->Top) && - ((twin->win->MouseY - bbox->Top) > -AMI_DRAG_THRESHOLD)) - drag_y_move = twin->win->MouseY - bbox->Top; - if((twin->win->MouseY > (bbox->Top + bbox->Height)) && - ((twin->win->MouseY - (bbox->Top + bbox->Height)) < AMI_DRAG_THRESHOLD)) - drag_y_move = twin->win->MouseY - (bbox->Top + bbox->Height); - - tree_mouse_action(twin->tree, twin->mouse_state | twin->key_state, x, y); - } - - if((x >= xs) && (y >= ys) && (x < bbox->Width + xs) && - (y < bbox->Height + ys)) - { - ami_tree_update_quals(twin); - - if(twin->mouse_state & BROWSER_MOUSE_PRESS_1) - { - if((abs(x - twin->drag_x) + abs(y - twin->drag_y)) > 2) - { - tree_mouse_action(twin->tree, - BROWSER_MOUSE_DRAG_1 | twin->key_state, x, y); - twin->mouse_state = BROWSER_MOUSE_HOLDING_1 | - BROWSER_MOUSE_DRAG_ON; - ami_tree_drag_icon_show(twin); - } - } - else if(twin->mouse_state & BROWSER_MOUSE_PRESS_2) - { - if((abs(x - twin->drag_x) + abs(y - twin->drag_y)) > 2) - { - tree_mouse_action(twin->tree, - BROWSER_MOUSE_DRAG_2 | twin->key_state, x, y); - twin->mouse_state = BROWSER_MOUSE_HOLDING_2 | - BROWSER_MOUSE_DRAG_ON; - ami_tree_drag_icon_show(twin); - } - } - } - ami_gui_free_space_box(bbox); - - twin->lastclick.tv_sec = 0; - twin->lastclick.tv_usec = 0; - break; - - case WMHI_MOUSEBUTTONS: - if(ami_gui_get_space_box((Object *)twin->objects[GID_BROWSER], &bbox) != NSERROR_OK) { - amiga_warn_user("NoMemory", ""); - break; - } - - GetAttr(SCROLLER_Top, twin->objects[OID_HSCROLL], (ULONG *)&xs); - x = twin->win->MouseX - bbox->Left + xs; - GetAttr(SCROLLER_Top, twin->objects[OID_VSCROLL], (ULONG *)&ys); - y = twin->win->MouseY - bbox->Top + ys; - - ami_tree_update_quals(twin); - - if((x >= xs) && (y >= ys) && (x < bbox->Width + xs) && - (y < bbox->Height + ys)) - { - switch(code) - { - case SELECTDOWN: - twin->mouse_state = BROWSER_MOUSE_PRESS_1; - if(twin->drag_x == 0) twin->drag_x = x; - if(twin->drag_y == 0) twin->drag_y = y; - break; - case MIDDLEDOWN: - twin->mouse_state = BROWSER_MOUSE_PRESS_2; - if(twin->drag_x == 0) twin->drag_x = x; - if(twin->drag_y == 0) twin->drag_y = y; - break; - case MENUDOWN: -#if 0 - if(tree_node_has_selection(tree_get_root(twin->tree)) == false) - { - tree_set_node_selected_at(twin->tree, x, y, true); - } - ami_context_menu_show_tree(twin->tree, twin->win, twin->type); -#endif - break; - } - } - - if(x < xs) x = xs; - if(y < ys) y = ys; - if(x >= bbox->Width + xs) x = bbox->Width + xs - 1; - if(y >= bbox->Height + ys) y = bbox->Height + ys - 1; - - ami_gui_free_space_box(bbox); - - switch(code) - { - case SELECTUP: - if(twin->mouse_state & BROWSER_MOUSE_PRESS_1) - { - CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&curtime.tv_usec); - - twin->mouse_state = BROWSER_MOUSE_CLICK_1; - - if(twin->lastclick.tv_sec) - { - if(DoubleClick(twin->lastclick.tv_sec, - twin->lastclick.tv_usec, - curtime.tv_sec, curtime.tv_usec)) - twin->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK; - } - tree_mouse_action(twin->tree, - twin->mouse_state | twin->key_state, x, y); - - if(twin->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) - { - twin->lastclick.tv_sec = 0; - twin->lastclick.tv_usec = 0; - } - else - { - twin->lastclick.tv_sec = curtime.tv_sec; - twin->lastclick.tv_usec = curtime.tv_usec; - } - } - else ami_tree_drag_end(twin, x, y); - - twin->mouse_state=0; - twin->drag_x = 0; - twin->drag_y = 0; - break; - - case MIDDLEUP: - if(twin->mouse_state & BROWSER_MOUSE_PRESS_2) - { - CurrentTime((ULONG *)&curtime.tv_sec, (ULONG *)&curtime.tv_usec); - - twin->mouse_state = BROWSER_MOUSE_CLICK_2; - - if(twin->lastclick.tv_sec) - { - if(DoubleClick(twin->lastclick.tv_sec, - twin->lastclick.tv_usec, - curtime.tv_sec, curtime.tv_usec)) - twin->mouse_state |= BROWSER_MOUSE_DOUBLE_CLICK; - } - tree_mouse_action(twin->tree, - twin->mouse_state | twin->key_state, x, y); - - if(twin->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) - { - twin->lastclick.tv_sec = 0; - twin->lastclick.tv_usec = 0; - } - else - { - twin->lastclick.tv_sec = curtime.tv_sec; - twin->lastclick.tv_usec = curtime.tv_usec; - } - } - else ami_tree_drag_end(twin, x, y); - - twin->mouse_state=0; - twin->drag_x = 0; - twin->drag_y = 0; - break; - - case SELECTDOWN: - case MIDDLEDOWN: - tree_mouse_action(twin->tree, - twin->mouse_state | twin->key_state, x, y); - break; - } - ami_tree_update_buttons(twin); - break; - - case WMHI_RAWKEY: - storage = result & WMHI_GADGETMASK; - - GetAttr(WINDOW_InputEvent,twin->objects[OID_MAIN],(ULONG *)&ie); - nskey = ami_key_to_nskey(storage, ie); - tree_keypress(twin->tree, nskey); - if(nskey == NS_KEY_COPY_SELECTION) { - /* if we've copied a selection we need to clear it - style guide rules */ - tree_keypress(twin->tree, NS_KEY_CLEAR_SELECTION); - } - break; - - case WMHI_MENUPICK: - item = ItemAddress(twin->win->MenuStrip,code); - while (code != MENUNULL) - { - menunum = MENUNUM(code); - itemnum = ITEMNUM(code); - subnum = SUBNUM(code); - - switch(menunum) - { - case 0: // tree - switch(itemnum) - { - case 0: // export - if(AslRequestTags(savereq, - ASLFR_Window, twin->win, - ASLFR_SleepWindow, TRUE, - ASLFR_TitleText,messages_get("NetSurf"), - ASLFR_Screen,scrn, - ASLFR_InitialFile,"tree_export.html", - TAG_DONE)) - { - strlcpy(fname,savereq->fr_Drawer,1024); - AddPart(fname,savereq->fr_File,1024); - ami_update_pointer(twin->win, GUI_POINTER_WAIT); - if(twin->type == AMI_TREE_HISTORY) - global_history_export(fname, NULL); - else if(twin->type == AMI_TREE_HOTLIST) - hotlist_export(fname, NULL); - ami_update_pointer(twin->win, GUI_POINTER_DEFAULT); - } - break; - - case 2: // expand - switch(subnum) - { - case 0: // all - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_expand(false); - break; - case AMI_TREE_COOKIES: - cookie_manager_expand(false); - break; - case AMI_TREE_HOTLIST: - hotlist_expand(false); - break; - } - break; - - case 1: // lev 1 - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_expand(true); - break; - case AMI_TREE_COOKIES: - cookie_manager_expand(true); - break; - case AMI_TREE_HOTLIST: - hotlist_expand(true); - break; - } - break; - - case 2: // lev 2 - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_expand(false); - break; - case AMI_TREE_COOKIES: - cookie_manager_expand(false); - break; - case AMI_TREE_HOTLIST: - hotlist_expand(false); - break; - } - break; - } - break; - - case 3: // collapse - switch(subnum) - { - case 0: // all - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_contract(true); - break; - case AMI_TREE_COOKIES: - cookie_manager_contract(true); - break; - case AMI_TREE_HOTLIST: - hotlist_contract(true); - break; - } - break; - - case 1: // lev 1 - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_contract(true); - break; - case AMI_TREE_COOKIES: - cookie_manager_contract(true); - break; - case AMI_TREE_HOTLIST: - hotlist_contract(true); - break; - } - break; - - case 2: // lev 2 - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_contract(false); - break; - case AMI_TREE_COOKIES: - cookie_manager_contract(false); - break; - case AMI_TREE_HOTLIST: - hotlist_contract(false); - break; - } - break; - } - break; - - case 5: // snapshot - switch(twin->type) - { - case AMI_TREE_HISTORY: - nsoption_set_int(history_window_ypos, twin->win->TopEdge); - nsoption_set_int(history_window_xpos, twin->win->LeftEdge); - nsoption_set_int(history_window_xsize, twin->win->Width); - nsoption_set_int(history_window_ysize, twin->win->Height); - break; - case AMI_TREE_COOKIES: - nsoption_set_int(cookies_window_ypos, twin->win->TopEdge); - nsoption_set_int(cookies_window_xpos, twin->win->LeftEdge); - nsoption_set_int(cookies_window_xsize, twin->win->Width); - nsoption_set_int(cookies_window_ysize, twin->win->Height); - break; - case AMI_TREE_HOTLIST: - nsoption_set_int(hotlist_window_ypos, twin->win->TopEdge); - nsoption_set_int(hotlist_window_xpos, twin->win->LeftEdge); - nsoption_set_int(hotlist_window_xsize, twin->win->Width); - nsoption_set_int(hotlist_window_ysize, twin->win->Height); - break; - } - break; - - case 7: // close - ami_tree_close(twin); - return TRUE; - break; - } - break; - - case 1: // edit - switch(itemnum) - { - case 0: // new folder - hotlist_add_folder(NULL, false, 0); - break; - - case 1: // new entry - hotlist_add_entry(NULL, NULL, false, 0); - break; - - case 3: // edit - hotlist_edit_selection(); - break; - - case 5: // delete - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_keypress(NS_KEY_DELETE_LEFT); - break; - case AMI_TREE_COOKIES: - cookie_manager_keypress(NS_KEY_DELETE_LEFT); - break; - case AMI_TREE_HOTLIST: - hotlist_keypress(NS_KEY_DELETE_LEFT); - break; - } - ami_tree_update_buttons(twin); - break; - - case 7: // select all - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_keypress(NS_KEY_SELECT_ALL); - break; - case AMI_TREE_COOKIES: - cookie_manager_keypress(NS_KEY_SELECT_ALL); - break; - case AMI_TREE_HOTLIST: - hotlist_keypress(NS_KEY_SELECT_ALL); - break; - } - ami_tree_update_buttons(twin); - break; - - case 8: // clear - switch(twin->type) - { - case AMI_TREE_HISTORY: - global_history_keypress(NS_KEY_CLEAR_SELECTION); - break; - case AMI_TREE_COOKIES: - cookie_manager_keypress(NS_KEY_CLEAR_SELECTION); - break; - case AMI_TREE_HOTLIST: - hotlist_keypress(NS_KEY_CLEAR_SELECTION); - break; - } - ami_tree_update_buttons(twin); - break; - } - break; - } - - code = item->NextSelect; - } - break; - - case WMHI_NEWSIZE: - ami_tree_resized(twin->tree, twin->max_width, twin->max_height, twin); - ami_tree_draw(twin); - break; - - case WMHI_CLOSEWINDOW: - if(twin->type == AMI_TREE_SSLCERT) - sslcert_viewer_reject(twin->ssl_data); - ami_tree_close(twin); - return TRUE; - break; - } - } - - if(drag_x_move || drag_y_move) - ami_tree_scroll(twin, drag_x_move, drag_y_move); - - return FALSE; -} - - - - - -const struct treeview_table ami_tree_callbacks = { - .redraw_request = ami_tree_redraw_request, - .resized = ami_tree_resized, - .scroll_visible = ami_tree_scroll_visible, - .get_window_dimensions = ami_tree_get_window_dimensions -}; - -struct treeview_window *ami_tree_create(int flags, - struct sslcert_session_data *ssl_data) -{ - struct treeview_window *twin; - - twin = calloc(1, sizeof(struct treeview_window)); - - if(!twin) - { - amiga_warn_user("NoMemory", 0); - return NULL; - } - - twin->shared_pens = ami_AllocMinList(); - twin->globals.shared_pens = twin->shared_pens; - - twin->ssl_data = ssl_data; - twin->tree = tree_create(flags, &ami_tree_callbacks, twin); - - return twin; -} - diff --git a/frontends/amiga/tree.h b/frontends/amiga/tree.h deleted file mode 100755 index a8cada58d..000000000 --- a/frontends/amiga/tree.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2008, 2009 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 . - */ - -#ifndef AMIGA_TREE_H -#define AMIGA_TREE_H - -#include -#include -#include "amiga/os3support.h" -#include "amiga/desktop-tree.h" - -struct treeview_window; - -enum -{ - AMI_TREE_HOTLIST, - AMI_TREE_HISTORY, - AMI_TREE_COOKIES, - AMI_TREE_SSLCERT -}; - -struct treeview_window *ami_tree_create(int flags, - struct sslcert_session_data *ssl_data); -void ami_tree_destroy(struct treeview_window *twin); -struct tree *ami_tree_get_tree(struct treeview_window *twin); - -void ami_tree_open(struct treeview_window *twin,int type); -void ami_tree_close(void *w); /* for Arexx interface only */ - -extern const struct treeview_table ami_tree_callbacks; - -#endif -- cgit v1.2.3 From 01e116ee1f5603ef6adeb365f403563a684a47b4 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sun, 8 Jan 2017 00:46:23 +0000 Subject: Clear pointer after free --- desktop/global_history.c | 1 + 1 file changed, 1 insertion(+) diff --git a/desktop/global_history.c b/desktop/global_history.c index b6f488228..a19349f51 100644 --- a/desktop/global_history.c +++ b/desktop/global_history.c @@ -803,6 +803,7 @@ nserror global_history_fini(void) /* Destroy the global history treeview */ err = treeview_destroy(gh_ctx.tree); + gh_ctx.tree = NULL; /* Free global history treeview entry fields */ for (i = 0; i < N_FIELDS; i++) -- cgit v1.2.3