summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOle Loots <ole@monochrom.net>2013-09-21 20:20:49 +0200
committerOle Loots <ole@monochrom.net>2013-09-21 20:20:49 +0200
commit4426e8a9eaa2fd180e88123f750e74ecb8b77625 (patch)
treeb49c007fc41665c4839ded6d91edbef495765451
parentff1f5a5fafd92baf239991043c28935a669765f7 (diff)
downloadnetsurf-4426e8a9eaa2fd180e88123f750e74ecb8b77625.tar.gz
netsurf-4426e8a9eaa2fd180e88123f750e74ecb8b77625.tar.bz2
Added SSL Cert Inspector Window
(based on treeview API)
-rw-r--r--atari/Makefile.target1
-rw-r--r--atari/certview.c312
-rw-r--r--atari/certview.h54
-rw-r--r--atari/cookies.c2
-rw-r--r--atari/gemtk/guiwin.c2
-rw-r--r--atari/gui.c48
-rwxr-xr-xatari/gui.h1
-rw-r--r--atari/history.c2
-rw-r--r--atari/hotlist.c8
-rwxr-xr-xatari/res/netsurf.rscbin34722 -> 34782 bytes
-rwxr-xr-xatari/res/netsurf.rsh3
-rwxr-xr-xatari/res/netsurf.rsm8
-rw-r--r--atari/toolbar.c2
-rw-r--r--atari/treeview.c69
-rw-r--r--atari/treeview.h10
15 files changed, 484 insertions, 38 deletions
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 <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#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 <ole@monochrom.net>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CERTVIEW_H_INCLUDED
+#define CERTVIEW_H_INCLUDED
+
+#include <inttypes.h>
+#include <sys/types.h>
+#include <string.h>
+
+
+#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
--- a/atari/res/netsurf.rsc
+++ b/atari/res/netsurf.rsc
Binary files 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