From 4426e8a9eaa2fd180e88123f750e74ecb8b77625 Mon Sep 17 00:00:00 2001 From: Ole Loots Date: Sat, 21 Sep 2013 20:20:49 +0200 Subject: Added SSL Cert Inspector Window (based on treeview API) --- atari/Makefile.target | 1 + atari/certview.c | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++ atari/certview.h | 54 +++++++++ atari/cookies.c | 2 +- atari/gemtk/guiwin.c | 2 +- atari/gui.c | 48 +++++--- atari/gui.h | 1 + atari/history.c | 2 +- atari/hotlist.c | 8 +- atari/res/netsurf.rsc | Bin 34722 -> 34782 bytes atari/res/netsurf.rsh | 3 + atari/res/netsurf.rsm | 8 +- atari/toolbar.c | 2 +- atari/treeview.c | 69 ++++++++++- atari/treeview.h | 10 +- 15 files changed, 484 insertions(+), 38 deletions(-) create mode 100644 atari/certview.c create mode 100644 atari/certview.h diff --git a/atari/Makefile.target b/atari/Makefile.target index e47eb5d44..a8bc65ad8 100644 --- a/atari/Makefile.target +++ b/atari/Makefile.target @@ -79,6 +79,7 @@ S_ATARI := \ clipboard.c \ ctxmenu.c \ cookies.c \ + certview.c \ deskmenu.c \ download.c \ encoding.c \ diff --git a/atari/certview.c b/atari/certview.c new file mode 100644 index 000000000..066a428ae --- /dev/null +++ b/atari/certview.c @@ -0,0 +1,312 @@ +/* + * Copyright 2013 Ole Loots + * + * 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 +#include +#include +#include +#include +#include + +#include "desktop/browser.h" +#include "content/urldb.h" +#include "desktop/sslcert_viewer.h" +#include "desktop/gui.h" +#include "desktop/core_window.h" +#include "utils/nsoption.h" +#include "utils/log.h" +#include "utils/messages.h" +#include "utils/utils.h" + +#include "atari/gui.h" +#include "atari/misc.h" +#include "atari/treeview.h" +#include "atari/certview.h" +#include "atari/findfile.h" +#include "atari/gemtk/gemtk.h" +#include "atari/res/netsurf.rsh" + +extern GRECT desk_area; + + +/* Setup Atari Treeview Callbacks: */ +static nserror atari_sslcert_viewer_init_phase2(struct core_window *cw, + struct core_window_callback_table * default_callbacks); +static void atari_sslcert_viewer_finish(struct core_window *cw); +static void atari_sslcert_viewer_keypress(struct core_window *cw, + uint32_t ucs4); +static void atari_sslcert_viewer_mouse_action(struct core_window *cw, + browser_mouse_state mouse, + int x, int y); +static void atari_sslcert_viewer_draw(struct core_window *cw, int x, + int y, struct rect *clip, + const struct redraw_context *ctx); +static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8]); + +static struct atari_treeview_callbacks atari_sslcert_viewer_treeview_callbacks = { + .init_phase2 = atari_sslcert_viewer_init_phase2, + .finish = atari_sslcert_viewer_finish, + .draw = atari_sslcert_viewer_draw, + .keypress = atari_sslcert_viewer_keypress, + .mouse_action = atari_sslcert_viewer_mouse_action, + .gemtk_user_func = handle_event +}; + +/* static functions */ +static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin); + + +static nserror atari_sslcert_viewer_init_phase2(struct core_window *cw, + struct core_window_callback_table *cb_t) +{ + LOG(("")); + + struct atari_treeview_window *tv; + struct atari_sslcert_viewer_s *cvwin; + struct sslcert_session_data *ssl_d; + + tv = (struct atari_treeview_window *)cw; + cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(tv); + + assert(cvwin); + + ssl_d = cvwin->ssl_session_data; + + assert(ssl_d); + + return(sslcert_viewer_init(cb_t, cw, ssl_d)); +} + +static void atari_sslcert_viewer_finish(struct core_window *cw) +{ + struct atari_treeview_window *tv; + struct atari_sslcert_viewer_s *cvwin; + + assert(cw); + + tv = (struct atari_treeview_window *)cw; + cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(tv); + + /* This will also free the session data: */ + sslcert_viewer_fini(cvwin->ssl_session_data); + + LOG(("")); +} + +static void atari_sslcert_viewer_draw(struct core_window *cw, int x, + int y, struct rect *clip, + const struct redraw_context *ctx) +{ + struct atari_treeview_window *tv; + struct atari_sslcert_viewer_s *cvwin; + + assert(cw); + + tv = (struct atari_treeview_window *)cw; + cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(tv); + + assert(cvwin); + + sslcert_viewer_redraw(cvwin->ssl_session_data, x, y, clip, ctx); +} + +static void atari_sslcert_viewer_keypress(struct core_window *cw, uint32_t ucs4) +{ + struct atari_treeview_window *tv; + struct atari_sslcert_viewer_s *cvwin; + + assert(cw); + + tv = (struct atari_treeview_window *)cw; + cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(tv); + + LOG(("ucs4: %lu\n", ucs4)); + sslcert_viewer_keypress(cvwin->ssl_session_data, ucs4); +} + +static void atari_sslcert_viewer_mouse_action(struct core_window *cw, + browser_mouse_state mouse, + int x, int y) +{ + struct atari_treeview_window *tv; + struct atari_sslcert_viewer_s *cvwin; + + assert(cw); + + tv = (struct atari_treeview_window *)cw; + cvwin = (struct atari_sslcert_viewer_s *)atari_treeview_get_user_data(tv); + + if((mouse & BROWSER_MOUSE_HOVER)){ + sslcert_viewer_mouse_action(cvwin->ssl_session_data, mouse, x, y); + } else { + sslcert_viewer_mouse_action(cvwin->ssl_session_data, mouse, x, y); + } +} + + +static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8]) +{ + struct atari_treeview_window *tv=NULL; + GRECT tb_area; + GUIWIN * gemtk_win; + struct gui_window * gw; + struct atari_sslcert_viewer_s *cvwin = NULL; + char *cur_url = NULL; + char *cur_title = NULL; + OBJECT *toolbar; + + LOG(("")); + + if(ev_out->emo_events & MU_MESAG){ + switch (msg[0]) { + + case WM_TOOLBAR: + toolbar = gemtk_obj_get_tree(TOOLBAR_SSL_CERT); + LOG(("CERTVIEWER WM_TOOLBAR")); + tv = (struct atari_treeview_window*) gemtk_wm_get_user_data(win); + assert(tv); + cvwin = (struct atari_sslcert_viewer_s *) + atari_treeview_get_user_data(tv); + switch (msg[4]) { + + case TOOLBAR_SSL_CERT_TRUSTED: + + if (toolbar[msg[4]].ob_state & OS_SELECTED) { + + } else { + + } + break; + } + + + gemtk_win = atari_treeview_get_gemtk_window(tv); + assert(gemtk_win); + //gemtk_obj_get_tree(TOOLBAR_HOTLIST)[msg[4]].ob_state &= ~OS_SELECTED; + atari_treeview_get_grect(tv, TREEVIEW_AREA_TOOLBAR, &tb_area); + evnt_timer(150); + gemtk_wm_exec_redraw(gemtk_win, &tb_area); + + break; + + case WM_CLOSED: + // TODO set perrmissions + toolbar = gemtk_obj_get_tree(TOOLBAR_SSL_CERT); + tv = (struct atari_treeview_window*) gemtk_wm_get_user_data(win); + assert(tv); + cvwin = (struct atari_sslcert_viewer_s *) + atari_treeview_get_user_data(tv); + if (toolbar[TOOLBAR_SSL_CERT_TRUSTED].ob_state & OS_SELECTED) { + sslcert_viewer_accept(cvwin->ssl_session_data); + } else { + sslcert_viewer_reject(cvwin->ssl_session_data); + } + atari_sslcert_viewer_destroy(cvwin); + break; + + default: break; + } + } +} + +static void atari_sslcert_viewer_init(struct atari_sslcert_viewer_s * cvwin, + struct sslcert_session_data *ssl_d) +{ + assert(cvwin->init == false); + assert(cvwin->window == NULL); + assert(cvwin->tv == NULL); + + int flags = ATARI_TREEVIEW_WIDGETS; + short handle = -1; + GRECT desk; + OBJECT * tree = gemtk_obj_get_tree(TOOLBAR_SSL_CERT); + assert( tree ); + + handle = wind_create(flags, 0, 0, desk_area.g_w, desk_area.g_h); + cvwin->window = gemtk_wm_add(handle, + GEMTK_WM_FLAG_DEFAULTS, NULL); + if (cvwin->window == NULL ) { + gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, + "Failed to allocate Treeview:\nCertviewer"); + return; + } + wind_set_str(handle, WF_NAME, (char*)"SSL Certificate"); + gemtk_wm_set_toolbar(cvwin->window, tree, 0, 0); + gemtk_wm_unlink(cvwin->window); + + cvwin->ssl_session_data = ssl_d; + cvwin->tv = atari_treeview_create(cvwin->window, + &atari_sslcert_viewer_treeview_callbacks, + cvwin, flags); + + if (cvwin->tv == NULL) { + /* handle it properly, clean up previous allocs */ + LOG(("Failed to allocate treeview")); + return; + } + + cvwin->init = true; +} + +/* +* documented in certview.h +*/ +void atari_sslcert_viewer_open(struct sslcert_session_data *ssl_d) +{ + struct atari_sslcert_viewer_s * cvwin; + + cvwin = calloc(1, sizeof(struct atari_sslcert_viewer_s)); + + assert(cvwin); + + atari_sslcert_viewer_init(cvwin, ssl_d); + + if (atari_treeview_is_open(cvwin->tv) == false) { + + GRECT pos; + pos.g_x = desk_area.g_w - desk_area.g_w / 4; + pos.g_y = desk_area.g_y; + pos.g_w = desk_area.g_w / 4; + pos.g_h = desk_area.g_h; + + atari_treeview_open(cvwin->tv, &pos); + } else { + wind_set(gemtk_wm_get_handle(cvwin->window), WF_TOP, 1, 0, + 0, 0); + } +} + + +static void atari_sslcert_viewer_destroy(struct atari_sslcert_viewer_s * cvwin) +{ + assert(cvwin); + assert(cvwin->init); + assert(cvwin->window); + + LOG(("")); + + if (atari_treeview_is_open(cvwin->tv)) + atari_treeview_close(cvwin->tv); + wind_delete(gemtk_wm_get_handle(cvwin->window)); + gemtk_wm_remove(cvwin->window); + cvwin->window = NULL; + atari_treeview_delete(cvwin->tv); + free(cvwin); + LOG(("done")); +} + diff --git a/atari/certview.h b/atari/certview.h new file mode 100644 index 000000000..642e55ede --- /dev/null +++ b/atari/certview.h @@ -0,0 +1,54 @@ +/* + * Copyright 2013 Ole Loots + * + * 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 CERTVIEW_H_INCLUDED +#define CERTVIEW_H_INCLUDED + +#include +#include +#include + + +#include "assert.h" +#include "utils/nsoption.h" +#include "utils/log.h" +#include "desktop/sslcert_viewer.h" + +struct core_window; + +struct atari_sslcert_viewer_s { + GUIWIN * window; + struct atari_treeview_window *tv;/*< The hotlist treeview handle. */ + struct sslcert_session_data *ssl_session_data; + bool init; +}; + +/** + * Initializes and opens an certificate inspector window + * \param ssl_d ssl session data created by sslcert_viewer_create_session_data + * + * The window takes ownership of the session data and free's the memory on exit. + */ +void atari_sslcert_viewer_open(struct sslcert_session_data *ssl_d); +/* +void atari_sslcert_viewer_close(void); +void atari_sslcert_viewer_destroy(void); +void atari_sslcert_viewer_redraw(void); +*/ + +#endif // CERTVIEW_H_INCLUDED diff --git a/atari/cookies.c b/atari/cookies.c index 9ac1890d7..db45f3368 100644 --- a/atari/cookies.c +++ b/atari/cookies.c @@ -186,7 +186,7 @@ void atari_cookie_manager_init(void) atari_cookie_manager.tv = atari_treeview_create( atari_cookie_manager.window, &atari_cookie_manager_treeview_callbacks, - flags); + NULL, flags); if (atari_cookie_manager.tv == NULL) { /* handle it properly, clean up previous allocs */ diff --git a/atari/gemtk/guiwin.c b/atari/gemtk/guiwin.c index 4ad3561f2..b4020e0d9 100644 --- a/atari/gemtk/guiwin.c +++ b/atari/gemtk/guiwin.c @@ -686,7 +686,7 @@ void gemtk_wm_exit(void) GUIWIN * gemtk_wm_add(short handle, uint32_t flags, gemtk_wm_event_handler_f cb) { - GUIWIN *win = calloc(sizeof(GUIWIN),1); + GUIWIN *win = calloc(1, sizeof(GUIWIN)); assert(win!=NULL); DEBUG_PRINT(("gemtk_wm_add: %d, %p, cb: %p\n", handle, win, cb)); diff --git a/atari/gui.c b/atari/gui.c index c0b8cb2fb..427dd5498 100644 --- a/atari/gui.c +++ b/atari/gui.c @@ -64,6 +64,7 @@ #include "atari/toolbar.h" #include "atari/hotlist.h" #include "atari/cookies.h" +#include "atari/certview.h" #include "atari/history.h" #include "atari/login.h" #include "atari/encoding.h" @@ -123,8 +124,9 @@ void gui_poll(bool active) aes_event_in.emi_tlow = schedule_run(); - if(active || rendering) - aes_event_in.emi_tlow = 0; + if(active || rendering){ + aes_event_in.emi_tlow = 10; + } if(aes_event_in.emi_tlow < 0) { aes_event_in.emi_tlow = 10000; @@ -175,9 +177,7 @@ void gui_poll(bool active) // TODO: implement generic treeview redraw function // TODO: rename hl to atari_hotlist or create getter for it... - atari_hotlist_redraw(); - atari_cookie_manager_redraw(); - atari_global_history_redraw(); + atari_treeview_flush_redraws(); } @@ -191,7 +191,7 @@ gui_create_browser_window(struct browser_window *bw, (int)new_tab )); - gw = calloc( sizeof(struct gui_window), 1); + gw = calloc(1, sizeof(struct gui_window)); if (gw == NULL) return NULL; @@ -539,11 +539,6 @@ void gui_window_set_url(struct gui_window *w, const char *url) } } -struct gui_window * gui_window_get_input_window(void) -{ - return(input_window); -} - char * gui_window_get_url(struct gui_window *gw) { if (gw == NULL) { @@ -799,19 +794,31 @@ void gui_401login_open(nsurl *url, const char *realm, } void gui_cert_verify(nsurl *url, const struct ssl_cert_info *certs, - unsigned long num, - nserror (*cb)(bool proceed, void *pw), void *cbpw) + unsigned long num, nserror (*cb)(bool proceed, void *pw), + void *cbpw) { + struct sslcert_session_data *data; LOG(("")); bool bres; // TODO: localize string - int b = form_alert(1, "[2][SSL Verify failed, continue?][Continue|Abort]"); - bres = (b==1)? true : false; - LOG(("Trust: %d", bres )); - urldb_set_cert_permissions(url, bres); - cb(bres, cbpw); + int b = form_alert(1, "[2][SSL Verify failed, continue?][Continue|Abort|Details...]"); + if(b == 1){ + // Accept + urldb_set_cert_permissions(url, true); + cb(true, cbpw); + } else if(b == 2) { + // Reject + urldb_set_cert_permissions(url, false); + cb(false, cbpw); + } else if(b == 3) { + // Inspect + sslcert_viewer_create_session_data(num, url, cb, cbpw, certs, + &data); + atari_sslcert_viewer_open(data); + } + } void gui_set_input_gui_window(struct gui_window *gw) @@ -820,6 +827,11 @@ void gui_set_input_gui_window(struct gui_window *gw) input_window = gw; } +struct gui_window * gui_get_input_window(void) +{ + return(input_window); +} + void gui_quit(void) { LOG(("")); diff --git a/atari/gui.h b/atari/gui.h index c582d668b..a1135e2e9 100755 --- a/atari/gui.h +++ b/atari/gui.h @@ -160,6 +160,7 @@ extern struct gui_window *window_list; /* Public - non core gui window functions */ /* -------------------------------------------------------------------------- */ void gui_set_input_gui_window(struct gui_window *gw); +struct gui_window *gui_get_input_window(void); char *gui_window_get_url(struct gui_window *gw); char * gui_window_get_title(struct gui_window *gw); diff --git a/atari/history.c b/atari/history.c index c43b8296b..487030f65 100644 --- a/atari/history.c +++ b/atari/history.c @@ -211,7 +211,7 @@ void atari_global_history_init(void) atari_global_history.tv = atari_treeview_create( atari_global_history.window, &atari_global_history_treeview_callbacks, - flags); + NULL, flags); if (atari_global_history.tv == NULL) { /* handle it properly, clean up previous allocs */ diff --git a/atari/hotlist.c b/atari/hotlist.c index 016cbc458..8db18b0f8 100644 --- a/atari/hotlist.c +++ b/atari/hotlist.c @@ -137,14 +137,14 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8]) break; case TOOLBAR_HOTLIST_ADD: - gw = gui_window_get_input_window(); + gw = gui_get_input_window(); if(gw && gw->browser){ cur_url = gui_window_get_url(gw); cur_title = gui_window_get_title(gw); // TODO: read language string. - cur_title = (cur_title ? cur_title : "New bookmark"); + cur_title = (cur_title ? cur_title : (char*)"New bookmark"); } else { - cur_url = "http://www"; + cur_url = (char*)"http://www"; } atari_hotlist_add_page(cur_url, cur_title); break; @@ -214,7 +214,7 @@ void atari_hotlist_init(void) tree_hotlist_path = (const char*)&hl.path; hl.tv = atari_treeview_create(hl.window, &atari_hotlist_treeview_callbacks, - flags); + NULL, flags); if (hl.tv == NULL) { /* handle it properly, clean up previous allocs */ diff --git a/atari/res/netsurf.rsc b/atari/res/netsurf.rsc index 21373281c..b5ea38bbe 100755 Binary files a/atari/res/netsurf.rsc and b/atari/res/netsurf.rsc differ diff --git a/atari/res/netsurf.rsh b/atari/res/netsurf.rsh index 6797c054a..03968410a 100755 --- a/atari/res/netsurf.rsh +++ b/atari/res/netsurf.rsh @@ -214,3 +214,6 @@ #define TOOLBAR_COOKIES 16 /* form/dial */ #define TOOLBAR_HISTORY 17 /* form/dial */ + +#define TOOLBAR_SSL_CERT 18 /* form/dial */ +#define TOOLBAR_SSL_CERT_TRUSTED 1 /* BUTTON in tree TOOLBAR_SSL_CERT */ diff --git a/atari/res/netsurf.rsm b/atari/res/netsurf.rsm index 27df3d755..e279d4a3b 100755 --- a/atari/res/netsurf.rsm +++ b/atari/res/netsurf.rsm @@ -1,9 +1,9 @@ ResourceMaster v3.65 -#C 18@0@0@0@ +#C 19@0@0@0@ #N 99@32@AZAaza___ _@AZAaza090___ _@@_@ #FoC-Header@rsm2out@C-Header@rsh@@@[C-Header@0@ #R 0@0@1@1@2@1@ -#M 20010100@0@7728@643@ +#M 20010100@0@7728@646@ #T 0@1@MAINMENU@@64@@ #O 4@32@T_FILE@@ #O 5@32@T_EDIT@@ @@ -199,4 +199,6 @@ ResourceMaster v3.65 #O 2@28@FREETYPE@@ #T 16@2@TOOLBAR_COOKIES@@1@@ #T 17@2@TOOLBAR_HISTORY@@1@@ -#c 24594@ +#T 18@2@TOOLBAR_SSL_CERT@@2@@ +#O 1@26@TRUSTED@@ +#c 26341@ diff --git a/atari/toolbar.c b/atari/toolbar.c index 6c08428a1..4a63787ec 100644 --- a/atari/toolbar.c +++ b/atari/toolbar.c @@ -281,7 +281,7 @@ struct s_toolbar *toolbar_create(struct s_gui_win_root *owner) assert(init == true); - t = calloc(sizeof(struct s_toolbar), 1); + t = calloc(1, sizeof(struct s_toolbar)); assert(t); diff --git a/atari/treeview.c b/atari/treeview.c index 99711c0f4..bd82177cf 100644 --- a/atari/treeview.c +++ b/atari/treeview.c @@ -51,10 +51,10 @@ void atari_treeview_scroll_visible(struct core_window *cw, const struct rect *r); void atari_treeview_get_window_dimensions(struct core_window *cw, int *width, int *height); + // TODO: implement drag status! void atari_treeview_drag_status(struct core_window *cw, core_window_drag_status ds); - static struct core_window_callback_table cw_t = { .redraw_request = atari_treeview_redraw_request, .update_size = atari_treeview_update_size, @@ -65,6 +65,8 @@ static struct core_window_callback_table cw_t = { struct atari_treeview_window { + struct atari_treeview_window * prev_open; + struct atari_treeview_window * next_open; GUIWIN * window; bool disposing; bool redraw; @@ -74,8 +76,11 @@ struct atari_treeview_window { POINT click; POINT startdrag; struct atari_treeview_callbacks *io; + void * user_data; }; +static struct atari_treeview_window * treeviews_open; + /* native GUI event handlers: */ static void on_mbutton_event(struct atari_treeview_window *tvw, EVMULT_OUT *ev_out, short msg[8]); @@ -509,8 +514,7 @@ static void __CDECL on_mbutton_event(ATARI_TREEVIEW_PTR tptr, EVMULT_OUT *ev_out bool ignore=false; short cur_rel_x, cur_rel_y, dummy, mbut; - if(tv == NULL) - return; + assert(tv); gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, &work); slid = gemtk_wm_get_scroll_info(tv->window); @@ -593,14 +597,14 @@ static void __CDECL on_mbutton_event(ATARI_TREEVIEW_PTR tptr, EVMULT_OUT *ev_out struct atari_treeview_window * atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks, - uint32_t flags) + void * user_data, uint32_t flags) { /* allocate the core_window struct: */ struct atari_treeview_window * cw; struct gemtk_wm_scroll_info_s *slid; - cw = calloc(sizeof(struct atari_treeview_window), 1); + cw = calloc(1, sizeof(struct atari_treeview_window)); if (cw == NULL) { LOG(("calloc failed")); warn_user(messages_get_errorcode(NSERROR_NOMEM), 0); @@ -610,6 +614,7 @@ atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks, /* Store the window ref inside the new treeview: */ cw->window = win; cw->io = callbacks; + cw->user_data = user_data; // Setup gemtk event handler function: gemtk_wm_set_event_handler(win, handle_event); @@ -656,10 +661,24 @@ void atari_treeview_delete(struct atari_treeview_window * cw) void atari_treeview_open(struct atari_treeview_window *cw, GRECT *pos) { - if (cw->window != NULL) { + if (cw->window != NULL && cw->is_open == false) { cw->is_open = true; wind_open_grect(gemtk_wm_get_handle(cw->window), pos); gemtk_wm_link(cw->window); + if (treeviews_open == NULL) { + treeviews_open = cw; + treeviews_open->next_open = NULL; + treeviews_open->prev_open = NULL; + } else { + struct atari_treeview_window * tmp; + tmp = treeviews_open; + while(tmp->next_open != NULL){ + tmp = tmp->next_open; + } + tmp->next_open = cw; + cw->prev_open = tmp; + cw->next_open = NULL; + } } } @@ -668,12 +687,33 @@ bool atari_treeview_is_open(struct atari_treeview_window *cw) return(cw->is_open); } +void atari_treeview_set_user_data(struct atari_treeview_window * tv, + void *user_data_ptr) +{ + tv->user_data = user_data_ptr; +} + +void * atari_treeview_get_user_data(struct atari_treeview_window * tv) +{ + return(tv->user_data); +} + void atari_treeview_close(struct atari_treeview_window *cw) { if (cw->window != NULL) { cw->is_open = false; wind_close(gemtk_wm_get_handle(cw->window)); gemtk_wm_unlink(cw->window); + /* unlink the window: */ + struct atari_treeview_window *tmp = treeviews_open; + if (cw->prev_open != NULL) { + cw->prev_open->next_open = cw->next_open; + } else { + treeviews_open = cw->next_open; + } + if (cw->next_open != NULL) { + cw->next_open->prev_open = cw->prev_open; + } } } @@ -800,3 +840,20 @@ void atari_treeview_drag_status(struct core_window *cw, } +void atari_treeview_flush_redraws(void) +{ + struct atari_treeview_window *tmp; + + tmp = treeviews_open; + + if(tmp){ + while(tmp){ + assert(tmp->is_open); + if(tmp->redraw){ + atari_treeview_redraw(tmp); + } + tmp = tmp->next_open; + } + } +} + diff --git a/atari/treeview.h b/atari/treeview.h index bab20c435..d9defcce7 100644 --- a/atari/treeview.h +++ b/atari/treeview.h @@ -60,9 +60,9 @@ struct atari_treeview_callbacks { gemtk_wm_event_handler_f gemtk_user_func; }; -struct atari_treeview_window * -atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks, - uint32_t flags); +struct atari_treeview_window * atari_treeview_create(GUIWIN *win, + struct atari_treeview_callbacks * callbacks, + void * user_data, uint32_t flags); void atari_treeview_delete(struct atari_treeview_window * cw); void atari_treeview_open(struct atari_treeview_window * cw, GRECT *pos); bool atari_treeview_is_open(struct atari_treeview_window *cw); @@ -71,5 +71,9 @@ GUIWIN * atari_treeview_get_gemtk_window(struct atari_treeview_window *tv); void atari_treeview_get_grect(ATARI_TREEVIEW_PTR tptr, enum treeview_area_e mode, GRECT *dest); void atari_treeview_redraw(struct atari_treeview_window *tv); +void atari_treeview_set_user_data(struct atari_treeview_window * tv, + void *user_data_ptr); +void *atari_treeview_get_user_data(struct atari_treeview_window * tv); +void atari_treeview_flush_redraws(void); #endif //NSATARI_TREEVIEW_H -- cgit v1.2.3