Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/8c29c675c4301c90f5038a27aa31fa640f47e5aa
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/8c29c675c4301c90f5038a27aa31fa640f47e5aa
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/8c29c675c4301c90f5038a27aa31fa640f47e5aa

The branch, master has been updated
       via  8c29c675c4301c90f5038a27aa31fa640f47e5aa (commit)
      from  a661fdf83bf63907a7a8ccc6d2ba0e67dd5ea902 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=8c29c675c4301c90f5038a27aa31fa640f47e5aa
commit 8c29c675c4301c90f5038a27aa31fa640f47e5aa
Author: Vincent Sanders <vi...@kyllikki.org>
Commit: Vincent Sanders <vi...@kyllikki.org>

    clean up atari treeview code, stop it including headers it does not need

diff --git a/frontends/atari/treeview.c b/frontends/atari/treeview.c
index a72d268..abc1fa7 100644
--- a/frontends/atari/treeview.c
+++ b/frontends/atari/treeview.c
@@ -16,21 +16,13 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <sys/types.h>
-#include <string.h>
-
 #include "assert.h"
-#include "cflib.h"
 
-#include "netsurf/inttypes.h"
-#include "utils/nsoption.h"
 #include "utils/log.h"
 #include "utils/messages.h"
-#include "utils/utils.h"
-#include "netsurf/plotters.h"
-#include "netsurf/mouse.h"
+#include "netsurf/inttypes.h"
 #include "netsurf/core_window.h"
-#include "desktop/treeview.h"
+#include "netsurf/plotters.h"
 
 #include "atari/gui.h"
 #include "atari/plot/plot.h"
@@ -40,29 +32,6 @@
 #include "atari/res/netsurf.rsh"
 
 
-/**
- * Declare Core Window Callbacks:
- */
-
-nserror atari_treeview_invalidate_area(struct core_window *cw, const struct 
rect *r);
-void atari_treeview_update_size(struct core_window *cw, int width, int height);
-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 = {
-       .invalidate = atari_treeview_invalidate_area,
-       .update_size = atari_treeview_update_size,
-       .scroll_visible = atari_treeview_scroll_visible,
-       .get_window_dimensions = atari_treeview_get_window_dimensions,
-       .drag_status = atari_treeview_drag_status
-};
-
-
 struct atari_treeview_window {
        struct atari_treeview_window * prev_open;
        struct atari_treeview_window * next_open;
@@ -80,23 +49,12 @@ struct atari_treeview_window {
 
 static struct atari_treeview_window * treeviews_open;
 
-/* native GUI event handlers: */
-static void on_mbutton_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8]);
-static void on_keybd_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8]);
-static void on_redraw_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8]);
-
-/* static utils: */
-//static void atari_treeview_dump_info(struct atari_treeview_window *tv, char 
*s);
-
 /**
  * Schedule a redraw of the treeview content
  *
  */
-static void atari_treeview_redraw_grect_request(struct core_window *cw,
-                                                                               
                GRECT *area)
+static void
+atari_treeview_redraw_grect_request(struct core_window *cw, GRECT *area)
 {
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
        if (cw != NULL) {
@@ -114,264 +72,77 @@ static void atari_treeview_redraw_grect_request(struct 
core_window *cw,
                        int oldy1 = tv->rdw_area.g_y + tv->rdw_area.g_h;
                        tv->rdw_area.g_x = MIN(tv->rdw_area.g_x, area->g_x);
                        tv->rdw_area.g_y = MIN(tv->rdw_area.g_y, area->g_y);
-                       tv->rdw_area.g_w = ( oldx1 > newx1 ) ? oldx1 - 
tv->rdw_area.g_x : newx1 - tv->rdw_area.g_x;
-                       tv->rdw_area.g_h = ( oldy1 > newy1 ) ? oldy1 - 
tv->rdw_area.g_y : newy1 - tv->rdw_area.g_y;
-               }
-               //dbg_grect("atari_treeview_request_redraw_grect", 
&tv->rdw_area);
-       }
-}
-
-
-void atari_treeview_get_grect(struct core_window *cw, enum treeview_area_e 
mode,
-                                                                       GRECT 
*dest)
-{
 
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+                       if ( oldx1 > newx1 ) {
+                               tv->rdw_area.g_w = oldx1 - tv->rdw_area.g_x;
+                       } else {
+                               tv->rdw_area.g_w = newx1 - tv->rdw_area.g_x;
+                       }
 
-       if (mode == TREEVIEW_AREA_CONTENT) {
-               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, dest);
-       }
-       else if (mode == TREEVIEW_AREA_TOOLBAR) {
-               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_TOOLBAR, dest);
+                       if ( oldy1 > newy1 ) {
+                               tv->rdw_area.g_h = oldy1 - tv->rdw_area.g_y;
+                       } else {
+                               tv->rdw_area.g_h = newy1 - tv->rdw_area.g_y;
+                       }
+               }
+               //dbg_grect("atari_treeview_request_redraw_grect", 
&tv->rdw_area);
        }
 }
 
-GUIWIN * atari_treeview_get_gemtk_window(struct core_window *cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-       return(tv->window);
-}
 
-/*
-static void atari_treeview_dump_info(struct atari_treeview_window *tv,
-                                                                       char * 
title)
+#ifdef ATARI_TREEVIEW_DUMP
+static void
+atari_treeview_dump_info(struct atari_treeview_window *tv, char * title)
 {
        printf("Treeview Dump (%s)\n", title);
        printf("=================================\n");
        gemtk_wm_dump_window_info(atari_treeview_get_gemtk_window((struct 
core_window *)tv));
        GEMTK_DBG_GRECT("Redraw Area: \n", &tv->rdw_area)
-       dbg_grect("Redraw Area2:      \n", &tv->rdw_area);
+               dbg_grect("Redraw Area2:      \n", &tv->rdw_area);
        printf("Extent: x: %d, y: %d\n", tv->extent.x, tv->extent.y);
 }
-*/
+#endif
 
-static bool atari_treeview_is_iconified(struct core_window *cw){
 
-    struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+static bool atari_treeview_is_iconified(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
 
-    return((gemtk_wm_get_state(tv->window)&GEMTK_WM_STATUS_ICONIFIED) != 0);
+       return((gemtk_wm_get_state(tv->window)&GEMTK_WM_STATUS_ICONIFIED) != 0);
 }
 
-static void atari_treeview_redraw_icon(struct core_window *cw, GRECT *clip)
-{
-    struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-    GRECT visible, work;
-    OBJECT * tree = gemtk_obj_get_tree(ICONIFY);
-    short aesh = gemtk_wm_get_handle(tv->window);
-
-    gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_WORK, &work);
-
-    tree->ob_x = work.g_x;
-    tree->ob_y = work.g_y;
-    tree->ob_width = work.g_w;
-    tree->ob_height = work.g_h;
-
-    wind_get_grect(aesh, WF_FIRSTXYWH, &visible);
-    while (visible.g_h > 0 && visible.g_w > 0) {
-
-        if (rc_intersect(&work, &visible)) {
-            objc_draw(tree, 0, 8, visible.g_x, visible.g_y, visible.g_w,
-                        visible.g_h);
-        } else {
-            //dbg_grect("redraw vis area outside", &visible);
-        }
-
-        wind_get_grect(aesh, WF_NEXTXYWH, &visible);
-    }
-}
 
-void atari_treeview_redraw(struct core_window *cw)
+static void atari_treeview_redraw_icon(struct core_window *cw, GRECT *clip)
 {
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-       short pxy[4];
-
-       if (tv != NULL && tv->is_open) {
-               if( tv->redraw && ((plot_get_flags() & PLOT_FLAG_OFFSCREEN) == 
0) ) {
-
-                       short todo[4];
-                       GRECT work;
-                       short handle = gemtk_wm_get_handle(tv->window);
-                       struct gemtk_wm_scroll_info_s *slid;
-
-                       gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, 
&work);
-                       slid = gemtk_wm_get_scroll_info(tv->window);
-
-//                     // Debug code: this 3 lines help to inspect the redraw
-//                     // areas...
-//                     pxy[0] = work.g_x;
-//                     pxy[1] = work.g_y;
-//                     pxy[2] = pxy[0] + work.g_w-1;
-//                     pxy[3] = pxy[1] + work.g_h-1;
-//
-//                     vsf_color(plot_get_vdi_handle(), 0);
-//                     v_bar(plot_get_vdi_handle(), (short*)&pxy);
-//                     evnt_timer(500);
-
-                       struct redraw_context ctx = {
-                               .interactive = true,
-                               .background_images = true,
-                               .plot = &atari_plotters
-                       };
-                       plot_set_dimensions(&ctx,
-                                           work.g_x,
-                                           work.g_y,
-                                           work.g_w,
-                                           work.g_h);
-                       if (plot_lock() == false)
-                               return;
-
-                       if( wind_get(handle, WF_FIRSTXYWH,
-                                                       &todo[0], &todo[1], 
&todo[2], &todo[3] )!=0 ) {
-                               while (todo[2] && todo[3]) {
-
-                                       if(!rc_intersect(&work, (GRECT*)&todo)){
-                                               if (wind_get(handle, 
WF_NEXTXYWH,
-                                                       &todo[0], &todo[1], 
&todo[2], &todo[3])==0) {
-                                                       break;
-                                               }
-                                               continue;
-                                       }
-                                       pxy[0] = todo[0];
-                                       pxy[1] = todo[1];
-                                       pxy[2] = todo[0] + todo[2]-1;
-                                       pxy[3] = todo[1] + todo[3]-1;
-                                       vs_clip(plot_get_vdi_handle(), 1, 
(short*)&pxy);
-
-                                       // Debug code: this 3 lines help to 
inspect the redraw
-                                       // areas...
-
-//                                     vsf_color(plot_get_vdi_handle(), 3);
-//                                     v_bar(plot_get_vdi_handle(), 
(short*)&pxy);
-//                                     evnt_timer(500);
-
+       GRECT visible, work;
+       OBJECT * tree = gemtk_obj_get_tree(ICONIFY);
+       short aesh = gemtk_wm_get_handle(tv->window);
 
-                                       /* convert screen to treeview coords: */
-                                       todo[0] = todo[0] - work.g_x ;//+ 
slid->x_pos*slid->x_unit_px;
-                                       todo[1] = todo[1] - work.g_y ;//+ 
slid->y_pos*slid->y_unit_px;
-                                       if( todo[0] < 0 ){
-                                               todo[2] = todo[2] + todo[0];
-                                               todo[0] = 0;
-                                       }
-                                       if( todo[1] < 0 ){
-                                               todo[3] = todo[3] + todo[1];
-                                               todo[1] = 0;
-                                       }
+       gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_WORK, &work);
 
-                                       if (rc_intersect((GRECT 
*)&tv->rdw_area,(GRECT *)&todo)) {
-                                                       struct rect clip;
+       tree->ob_x = work.g_x;
+       tree->ob_y = work.g_y;
+       tree->ob_width = work.g_w;
+       tree->ob_height = work.g_h;
 
-                                                       clip.x0 = 
todo[0]+(slid->x_pos*slid->x_unit_px);
-                                                       clip.y0 = 
todo[1]+(slid->y_pos*slid->y_unit_px);
-                                                       clip.x1 = clip.x0 + 
todo[2]+(slid->x_pos*slid->x_unit_px);
-                                                       clip.y1 = clip.y0 + 
todo[3]+(slid->y_pos*slid->y_unit_px);
+       wind_get_grect(aesh, WF_FIRSTXYWH, &visible);
+       while (visible.g_h > 0 && visible.g_w > 0) {
 
-                            tv->io->draw(cw, -(slid->x_pos*slid->x_unit_px),
-                                                                               
-(slid->y_pos*slid->y_unit_px),
-                                                                               
                &clip, &ctx);
-                                       }
-                                       vs_clip(plot_get_vdi_handle(), 0, 
(short*)&pxy);
-                                       if (wind_get(handle, WF_NEXTXYWH,
-                                                       &todo[0], &todo[1], 
&todo[2], &todo[3])==0) {
-                                               break;
-                                       }
-                               }
-                       } else {
-                               plot_unlock();
-                               return;
-                       }
-                       plot_unlock();
-                       tv->redraw = false;
-                       tv->rdw_area.g_x = 65000;
-                       tv->rdw_area.g_y = 65000;
-                       tv->rdw_area.g_w = -1;
-                       tv->rdw_area.g_h = -1;
+               if (rc_intersect(&work, &visible)) {
+                       objc_draw(tree, 0, 8, visible.g_x, visible.g_y, 
visible.g_w,
+                                 visible.g_h);
                } else {
-                       /* just copy stuff from the offscreen buffer */
+                       //dbg_grect("redraw vis area outside", &visible);
                }
-       }
-}
-
-
-/**
- * GEMTK (netsurf's GEM toolkit) event sink
- *
-*/
-static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
-{
-       short retval = 0;
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)
-                                                                               
        gemtk_wm_get_user_data(win);
-       struct core_window *cw = (struct core_window *)tv;
-
-    if( (ev_out->emo_events & MU_MESAG) != 0 ) {
-        // handle message
-        switch (msg[0]) {
-
-        case WM_REDRAW:
-                       on_redraw_event(cw, ev_out, msg);
-            break;
-
-        default:
-            break;
-        }
-    }
-    if( (ev_out->emo_events & MU_KEYBD) != 0 ) {
-        on_keybd_event(cw, ev_out, msg);
-    }
-    if( (ev_out->emo_events & MU_BUTTON) != 0 ) {
-        LOG("Treeview click at: %d,%d\n", ev_out->emo_mouse.p_x, 
ev_out->emo_mouse.p_y);
-        on_mbutton_event(cw, ev_out, msg);
-    }
-
-    if(tv != NULL && tv->io->gemtk_user_func != NULL){
-               tv->io->gemtk_user_func(win, ev_out, msg);
-    }
-
-       // TODO: evaluate return values of event handler functions and pass 
them on:
-    return(retval);
-}
 
-
-static void __CDECL on_keybd_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8])
-{
-       long kstate = 0;
-       long kcode = 0;
-       long ucs4;
-       long ik;
-       unsigned short nkc = 0;
-       unsigned char ascii;
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-
-       kstate = ev_out->emo_kmeta;
-       kcode = ev_out->emo_kreturn;
-       nkc= gem_to_norm( (short)kstate, (short)kcode );
-       ascii = (nkc & 0xFF);
-       ik = nkc_to_input_key(nkc, &ucs4);
-
-       if (ik == 0) {
-               if (ascii >= 9) {
-                       tv->io->keypress(cw, ucs4);
-               }
-       } else {
-               tv->io->keypress(cw, ik);
+               wind_get_grect(aesh, WF_NEXTXYWH, &visible);
        }
 }
 
 
-static void __CDECL on_redraw_event(struct core_window *cw,
-                                   EVMULT_OUT *ev_out,
-                                   short msg[8])
+static void __CDECL
+on_redraw_event(struct core_window *cw, EVMULT_OUT *ev_out, short msg[8])
 {
        GRECT work, clip;
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
@@ -428,9 +199,9 @@ static void __CDECL on_redraw_event(struct core_window *cw,
        }
 }
 
-static void __CDECL on_mbutton_event(struct core_window *cw,
-                                    EVMULT_OUT *ev_out,
-                                    short msg[8])
+
+static void __CDECL
+on_mbutton_event(struct core_window *cw, EVMULT_OUT *ev_out, short msg[8])
 {
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
        struct gemtk_wm_scroll_info_s *slid;
@@ -447,26 +218,26 @@ static void __CDECL on_mbutton_event(struct core_window 
*cw,
 
        /* mouse click relative origin: */
 
-       short origin_rel_x = (mx-work.g_x) +
-                                                       
(slid->x_pos*slid->x_unit_px);
-       short origin_rel_y = (my-work.g_y) +
-                                                       
(slid->y_pos*slid->y_unit_px);
+       short origin_rel_x = (mx-work.g_x) + (slid->x_pos*slid->x_unit_px);
+       short origin_rel_y = (my-work.g_y) + (slid->y_pos*slid->y_unit_px);
 
        /* Only pass on events in the content area: */
-       if( origin_rel_x >= 0 && origin_rel_y >= 0
-               && mx < work.g_x + work.g_w
-               && my < work.g_y + work.g_h )
-       {
+       if ((origin_rel_x >= 0) &&
+           (origin_rel_y >= 0) &&
+           (mx < work.g_x + work.g_w) &&
+           (my < work.g_y + work.g_h)) {
                if (ev_out->emo_mclicks == 2) {
                        tv->io->mouse_action(cw,
-                                                               
BROWSER_MOUSE_CLICK_1|BROWSER_MOUSE_DOUBLE_CLICK,
-                                                               origin_rel_x, 
origin_rel_y);
+                                            BROWSER_MOUSE_CLICK_1 |
+                                            BROWSER_MOUSE_DOUBLE_CLICK,
+                                            origin_rel_x,
+                                            origin_rel_y);
                        return;
                }
 
                graf_mkstate(&cur_rel_x, &cur_rel_y, &mbut, &dummy);
                /* check for click or hold: */
-               if( (mbut&1) == 0 ){
+               if ((mbut & 1) == 0 ) {
                        int bms;
                        bms = BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_PRESS_1;
                        if(ev_out->emo_mclicks == 2 ) {
@@ -486,174 +257,126 @@ static void __CDECL on_mbutton_event(struct core_window 
*cw,
                        tv->startdrag.x = origin_rel_x;
                        tv->startdrag.y = origin_rel_y;
                        /* First, report mouse press, to trigger entry 
selection */
-                       tv->io->mouse_action(cw, BROWSER_MOUSE_CLICK_1 | 
BROWSER_MOUSE_PRESS_1, cur_rel_x,
-                                                                       
cur_rel_y);
+                       tv->io->mouse_action(cw,
+                                            BROWSER_MOUSE_CLICK_1 |
+                                            BROWSER_MOUSE_PRESS_1,
+                                            cur_rel_x,
+                                            cur_rel_y);
                        atari_treeview_redraw(cw);
-                       tv->io->mouse_action(cw, BROWSER_MOUSE_DRAG_1 | 
BROWSER_MOUSE_DRAG_ON,
-                                                               cur_rel_x, 
cur_rel_y);
-                       do{
-                               if (abs(prev_x-cur_rel_x) > 5 || 
abs(prev_y-cur_rel_y) > 5) {
+                       tv->io->mouse_action(cw,
+                                            BROWSER_MOUSE_DRAG_1 |
+                                            BROWSER_MOUSE_DRAG_ON,
+                                            cur_rel_x,
+                                            cur_rel_y);
+                       do {
+                               if (abs(prev_x-cur_rel_x) > 5 ||
+                                   abs(prev_y-cur_rel_y) > 5) {
                                        tv->io->mouse_action(cw,
-                                                               
BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON,
-                                                               cur_rel_x, 
cur_rel_y);
+                                                            
BROWSER_MOUSE_HOLDING_1 |
+                                                            
BROWSER_MOUSE_DRAG_ON,
+                                                            cur_rel_x,
+                                                            cur_rel_y);
                                        prev_x = cur_rel_x;
                                        prev_y = cur_rel_y;
                                }
 
                                if (tv->redraw) {
                                        // TODO: maybe GUI poll would fit 
better here?
-                                       //               ... is gui_poll 
re-entrance save?
+                                       //               ... is gui_poll 
re-entrance save?
                                        atari_treeview_redraw(cw);
                                }
 
                                /* sample mouse button state: */
-                               graf_mkstate(&cur_rel_x, &cur_rel_y, &mbut, 
&dummy);
-                               cur_rel_x = 
(cur_rel_x-work.g_x)+(slid->x_pos*slid->x_unit_px);
-                               cur_rel_y = 
(cur_rel_y-work.g_y)+(slid->y_pos*slid->y_unit_px);
-                       } while( mbut & 1 );
+                               graf_mkstate(&cur_rel_x,
+                                            &cur_rel_y,
+                                            &mbut,
+                                            &dummy);
+                               cur_rel_x = (cur_rel_x-work.g_x) +
+                                       (slid->x_pos*slid->x_unit_px);
+                               cur_rel_y = (cur_rel_y-work.g_y) +
+                                       (slid->y_pos*slid->y_unit_px);
+                       } while (mbut & 1);
 
                        /* End drag: */
-                       tv->io->mouse_action(cw, BROWSER_MOUSE_HOVER, 
cur_rel_x, cur_rel_y);
+                       tv->io->mouse_action(cw,
+                                            BROWSER_MOUSE_HOVER,
+                                            cur_rel_x,
+                                            cur_rel_y);
                        gem_set_cursor(&gem_cursors.arrow);
                }
        }
 }
 
 
-struct core_window *
-atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks,
-                                       void * user_data, uint32_t flags)
+static void __CDECL
+on_keybd_event(struct core_window *cw, EVMULT_OUT *ev_out, short msg[8])
 {
+       long kstate = 0;
+       long kcode = 0;
+       long ucs4;
+       long ik;
+       unsigned short nkc = 0;
+       unsigned char ascii;
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
 
-       /* allocate the core_window struct: */
-       struct atari_treeview_window * tv;
-       struct gemtk_wm_scroll_info_s *slid;
+       kstate = ev_out->emo_kmeta;
+       kcode = ev_out->emo_kreturn;
+       nkc= gem_to_norm( (short)kstate, (short)kcode );
+       ascii = (nkc & 0xFF);
+       ik = nkc_to_input_key(nkc, &ucs4);
 
-       tv = calloc(1, sizeof(struct atari_treeview_window));
-       if (tv == NULL) {
-               LOG("calloc failed");
-               atari_warn_user(messages_get_errorcode(NSERROR_NOMEM), 0);
-               return NULL;
+       if (ik == 0) {
+               if (ascii >= 9) {
+                       tv->io->keypress(cw, ucs4);
+               }
+       } else {
+               tv->io->keypress(cw, ik);
        }
+}
 
-       /* Store the window ref inside the new treeview: */
-       tv->window = win;
-       tv->io = callbacks;
-       tv->user_data = user_data;
-
-       // Setup gemtk event handler function:
-       gemtk_wm_set_event_handler(win, handle_event);
 
-       // bind window user data to treeview ref:
-       gemtk_wm_set_user_data(win, (void*)tv);
+/**
+ * GEMTK (netsurf's GEM toolkit) event sink
+ *
+ */
+static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
+{
+       short retval = 0;
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)
+               gemtk_wm_get_user_data(win);
+       struct core_window *cw = (struct core_window *)tv;
 
-       // Get acces to the gemtk scroll info struct:
-       slid = gemtk_wm_get_scroll_info(tv->window);
+       if( (ev_out->emo_events & MU_MESAG) != 0 ) {
+               // handle message
+               switch (msg[0]) {
 
-       // Setup line and column height/width of the window,
-       // each scroll takes the configured steps:
-       slid->y_unit_px = 16;
-       slid->x_unit_px = 16;
+               case WM_REDRAW:
+                       on_redraw_event(cw, ev_out, msg);
+                       break;
 
-       assert(tv->io);
-       assert(tv->io->init_phase2);
+               default:
+                       break;
+               }
+       }
+       if ((ev_out->emo_events & MU_KEYBD) != 0 ) {
+               on_keybd_event(cw, ev_out, msg);
+       }
+       if ((ev_out->emo_events & MU_BUTTON) != 0 ) {
+               LOG("Treeview click at: %d,%d\n",
+                   ev_out->emo_mouse.p_x, ev_out->emo_mouse.p_y);
+               on_mbutton_event(cw, ev_out, msg);
+       }
 
-       /* Now that the window is configured for treeview content,              
        */
-       /* call init_phase2 which must create the treeview                      
                */
-       /* descriptor, and at least setup the the default                       
                */
-       /* event handlers of the treeview:                                      
                                */
-       /* It would be more simple to not pass around the callbacks             
        */
-       /* but the treeview constructor requires them for initialization...     
*/
-       nserror err = tv->io->init_phase2((struct core_window *)tv, &cw_t);
-       if (err != NSERROR_OK) {
-               free(tv);
-               tv = NULL;
+       if (tv != NULL && tv->io->gemtk_user_func != NULL){
+               tv->io->gemtk_user_func(win, ev_out, msg);
        }
 
-       return((struct core_window *)tv);
-}
-
-void atari_treeview_delete(struct core_window * cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-
-       assert(tv);
-       assert(tv->io->finish);
-
-       tv->io->finish(cw);
-
-       free(tv);
-}
-
-
-void atari_treeview_open(struct core_window *cw, GRECT *pos)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       if (tv->window != NULL && tv->is_open == false) {
-               tv->is_open = true;
-               wind_open_grect(gemtk_wm_get_handle(tv->window), pos);
-               gemtk_wm_link(tv->window);
-               if (treeviews_open == NULL) {
-                       treeviews_open = tv;
-                       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 = tv;
-                       tv->prev_open = tmp;
-                       tv->next_open = NULL;
-               }
-       }
-}
-
-bool atari_treeview_is_open(struct core_window *cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       return(tv->is_open);
-}
-
-void atari_treeview_set_user_data(struct core_window * cw,
-                                                               void 
*user_data_ptr)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       tv->user_data = user_data_ptr;
-}
-
-void * atari_treeview_get_user_data(struct core_window * cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       return(tv->user_data);
-}
-
-void atari_treeview_close(struct core_window *cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       if (tv->window != NULL) {
-               tv->is_open = false;
-               wind_close(gemtk_wm_get_handle(tv->window));
-               gemtk_wm_unlink(tv->window);
-               /* unlink the window: */
-               if (tv->prev_open != NULL) {
-                       tv->prev_open->next_open = tv->next_open;
-               } else {
-                       treeviews_open = tv->next_open;
-               }
-               if (tv->next_open != NULL) {
-                       tv->next_open->prev_open = tv->prev_open;
-               }
-       }
+       // TODO: evaluate return values of event handler functions and pass 
them on:
+       return(retval);
 }
 
 
 /**
- * Core Window Callbacks:
- */
-
-/**
  * callback from core to request an invalidation of a window area.
  *
  * The specified area of the window should now be considered
@@ -664,7 +387,9 @@ void atari_treeview_close(struct core_window *cw)
  * \param[in] r area to redraw or NULL for the entire window area.
  * \return NSERROR_OK on success or appropriate error code.
  */
-nserror atari_treeview_invalidate_area(struct core_window *cw, const struct 
rect *r)
+static nserror
+atari_treeview_invalidate_area(struct core_window *cw,
+                              const struct rect *r)
 {
        GRECT area;
        struct gemtk_wm_scroll_info_s * slid;
@@ -693,6 +418,7 @@ nserror atari_treeview_invalidate_area(struct core_window 
*cw, const struct rect
        return NSERROR_OK;
 }
 
+
 /**
  * Update the limits of the window
  *
@@ -700,7 +426,8 @@ nserror atari_treeview_invalidate_area(struct core_window 
*cw, const struct rect
  * \param width                the width in px, or negative if don't care
  * \param height       the height in px, or negative if don't care
  */
-void atari_treeview_update_size(struct core_window *cw, int width, int height)
+static void
+atari_treeview_update_size(struct core_window *cw, int width, int height)
 {
        GRECT area;
        struct gemtk_wm_scroll_info_s *slid;
@@ -732,8 +459,10 @@ void atari_treeview_update_size(struct core_window *cw, 
int width, int height)
                tv->extent.y = height;
 
 
-               /*printf("units content: %d, units viewport: %d\n", 
(height/slid->y_unit_px),
-                                       (area.g_h/slid->y_unit_px));*/
+               /* printf("units content: %d, units viewport: %d\n",
+                         (height/slid->y_unit_px),
+                         (area.g_h/slid->y_unit_px));
+                */
                gemtk_wm_update_slider(tv->window, GEMTK_WM_VH_SLIDER);
        }
 }
@@ -745,10 +474,11 @@ void atari_treeview_update_size(struct core_window *cw, 
int width, int height)
  * \param cw           the core window object
  * \param r            rectangle to make visible
  */
-void atari_treeview_scroll_visible(struct core_window *cw, const struct rect 
*r)
+static void
+atari_treeview_scroll_visible(struct core_window *cw, const struct rect *r)
 {
        /* atari frontend doesn't support dragging outside the treeview */
-       /* so there is no need to implement this?                               
                */
+       /* so there is no need to implement this? */
 }
 
 
@@ -759,10 +489,13 @@ void atari_treeview_scroll_visible(struct core_window 
*cw, const struct rect *r)
  * \param width                to be set to viewport width in px, if non NULL
  * \param height       to be set to viewport height in px, if non NULL
  */
-void atari_treeview_get_window_dimensions(struct core_window *cw,
-               int *width, int *height)
+static void
+atari_treeview_get_window_dimensions(struct core_window *cw,
+                                    int *width,
+                                    int *height)
 {
-       if (cw != NULL && (width != NULL || height != NULL)) {
+       if ((cw != NULL) &&
+           (width != NULL || height != NULL)) {
                GRECT work;
                atari_treeview_get_grect(cw, TREEVIEW_AREA_CONTENT, &work);
                *width = work.g_w;
@@ -777,33 +510,322 @@ void atari_treeview_get_window_dimensions(struct 
core_window *cw,
  * \param cw           the core window object
  * \param ds           the current drag status
  */
-void atari_treeview_drag_status(struct core_window *cw,
-               core_window_drag_status ds)
+static void
+atari_treeview_drag_status(struct core_window *cw, core_window_drag_status ds)
+{
+
+}
+
+
+/**
+ * Declare Core Window Callbacks:
+ */
+static struct core_window_callback_table cw_t = {
+       .invalidate = atari_treeview_invalidate_area,
+       .update_size = atari_treeview_update_size,
+       .scroll_visible = atari_treeview_scroll_visible,
+       .get_window_dimensions = atari_treeview_get_window_dimensions,
+       .drag_status = atari_treeview_drag_status
+};
+
+
+/* exported interface documented in atari/treeview.h */
+struct core_window *
+atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks,
+                     void * user_data, uint32_t flags)
+{
+
+       /* allocate the core_window struct: */
+       struct atari_treeview_window * tv;
+       struct gemtk_wm_scroll_info_s *slid;
+
+       tv = calloc(1, sizeof(struct atari_treeview_window));
+       if (tv == NULL) {
+               LOG("calloc failed");
+               atari_warn_user(messages_get_errorcode(NSERROR_NOMEM), 0);
+               return NULL;
+       }
+
+       /* Store the window ref inside the new treeview: */
+       tv->window = win;
+       tv->io = callbacks;
+       tv->user_data = user_data;
+
+       // Setup gemtk event handler function:
+       gemtk_wm_set_event_handler(win, handle_event);
+
+       // bind window user data to treeview ref:
+       gemtk_wm_set_user_data(win, (void*)tv);
+
+       // Get acces to the gemtk scroll info struct:
+       slid = gemtk_wm_get_scroll_info(tv->window);
+
+       // Setup line and column height/width of the window,
+       // each scroll takes the configured steps:
+       slid->y_unit_px = 16;
+       slid->x_unit_px = 16;
+
+       assert(tv->io);
+       assert(tv->io->init_phase2);
+
+       /* Now that the window is configured for treeview content, */
+       /* call init_phase2 which must create the treeview */
+       /* descriptor, and at least setup the the default */
+       /* event handlers of the treeview: */
+       /* It would be more simple to not pass around the callbacks */
+       /* but the treeview constructor requires them for initialization...  */
+       nserror err = tv->io->init_phase2((struct core_window *)tv, &cw_t);
+       if (err != NSERROR_OK) {
+               free(tv);
+               tv = NULL;
+       }
+
+       return((struct core_window *)tv);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void
+atari_treeview_get_grect(struct core_window *cw,
+                        enum treeview_area_e mode,
+                        GRECT *dest)
+{
+
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+
+       if (mode == TREEVIEW_AREA_CONTENT) {
+               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, dest);
+       }
+       else if (mode == TREEVIEW_AREA_TOOLBAR) {
+               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_TOOLBAR, dest);
+       }
+}
+
+
+/* exported interface documented in atari/treeview.h */
+GUIWIN * atari_treeview_get_gemtk_window(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+       return(tv->window);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_redraw(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+       short pxy[4];
+
+       if (tv != NULL && tv->is_open) {
+               if( tv->redraw && ((plot_get_flags() & PLOT_FLAG_OFFSCREEN) == 
0) ) {
+
+                       short todo[4];
+                       GRECT work;
+                       short handle = gemtk_wm_get_handle(tv->window);
+                       struct gemtk_wm_scroll_info_s *slid;
+
+                       gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, 
&work);
+                       slid = gemtk_wm_get_scroll_info(tv->window);
+
+//                     // Debug code: this 3 lines help to inspect the redraw
+//                     // areas...
+//                     pxy[0] = work.g_x;
+//                     pxy[1] = work.g_y;
+//                     pxy[2] = pxy[0] + work.g_w-1;
+//                     pxy[3] = pxy[1] + work.g_h-1;
+//
+//                     vsf_color(plot_get_vdi_handle(), 0);
+//                     v_bar(plot_get_vdi_handle(), (short*)&pxy);
+//                     evnt_timer(500);
+
+                       struct redraw_context ctx = {
+                               .interactive = true,
+                               .background_images = true,
+                               .plot = &atari_plotters
+                       };
+                       plot_set_dimensions(&ctx,
+                                           work.g_x,
+                                           work.g_y,
+                                           work.g_w,
+                                           work.g_h);
+                       if (plot_lock() == false)
+                               return;
+
+                       if( wind_get(handle, WF_FIRSTXYWH,
+                                    &todo[0], &todo[1], &todo[2], &todo[3] 
)!=0 ) {
+                               while (todo[2] && todo[3]) {
+
+                                       if(!rc_intersect(&work, (GRECT*)&todo)){
+                                               if (wind_get(handle, 
WF_NEXTXYWH,
+                                                            &todo[0], 
&todo[1], &todo[2], &todo[3])==0) {
+                                                       break;
+                                               }
+                                               continue;
+                                       }
+                                       pxy[0] = todo[0];
+                                       pxy[1] = todo[1];
+                                       pxy[2] = todo[0] + todo[2]-1;
+                                       pxy[3] = todo[1] + todo[3]-1;
+                                       vs_clip(plot_get_vdi_handle(), 1, 
(short*)&pxy);
+
+                                       // Debug code: this 3 lines help to 
inspect the redraw
+                                       // areas...
+
+//                                     vsf_color(plot_get_vdi_handle(), 3);
+//                                     v_bar(plot_get_vdi_handle(), 
(short*)&pxy);
+//                                     evnt_timer(500);
+
+
+                                       /* convert screen to treeview coords: */
+                                       todo[0] = todo[0] - work.g_x ;//+ 
slid->x_pos*slid->x_unit_px;
+                                       todo[1] = todo[1] - work.g_y ;//+ 
slid->y_pos*slid->y_unit_px;
+                                       if( todo[0] < 0 ){
+                                               todo[2] = todo[2] + todo[0];
+                                               todo[0] = 0;
+                                       }
+                                       if( todo[1] < 0 ){
+                                               todo[3] = todo[3] + todo[1];
+                                               todo[1] = 0;
+                                       }
+
+                                       if (rc_intersect((GRECT 
*)&tv->rdw_area,(GRECT *)&todo)) {
+                                               struct rect clip;
+
+                                               clip.x0 = 
todo[0]+(slid->x_pos*slid->x_unit_px);
+                                               clip.y0 = 
todo[1]+(slid->y_pos*slid->y_unit_px);
+                                               clip.x1 = clip.x0 + 
todo[2]+(slid->x_pos*slid->x_unit_px);
+                                               clip.y1 = clip.y0 + 
todo[3]+(slid->y_pos*slid->y_unit_px);
+
+                                               tv->io->draw(cw, 
-(slid->x_pos*slid->x_unit_px),
+                                                            
-(slid->y_pos*slid->y_unit_px),
+                                                            &clip, &ctx);
+                                       }
+                                       vs_clip(plot_get_vdi_handle(), 0, 
(short*)&pxy);
+                                       if (wind_get(handle, WF_NEXTXYWH,
+                                                    &todo[0], &todo[1], 
&todo[2], &todo[3])==0) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               plot_unlock();
+                               return;
+                       }
+                       plot_unlock();
+                       tv->redraw = false;
+                       tv->rdw_area.g_x = 65000;
+                       tv->rdw_area.g_y = 65000;
+                       tv->rdw_area.g_w = -1;
+                       tv->rdw_area.g_h = -1;
+               } else {
+                       /* just copy stuff from the offscreen buffer */
+               }
+       }
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_delete(struct core_window * cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+
+       assert(tv);
+       assert(tv->io->finish);
+
+       tv->io->finish(cw);
+
+       free(tv);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_open(struct core_window *cw, GRECT *pos)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       if (tv->window != NULL && tv->is_open == false) {
+               tv->is_open = true;
+               wind_open_grect(gemtk_wm_get_handle(tv->window), pos);
+               gemtk_wm_link(tv->window);
+               if (treeviews_open == NULL) {
+                       treeviews_open = tv;
+                       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 = tv;
+                       tv->prev_open = tmp;
+                       tv->next_open = NULL;
+               }
+       }
+}
+
+
+/* exported interface documented in atari/treeview.h */
+bool atari_treeview_is_open(struct core_window *cw)
 {
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       return(tv->is_open);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_set_user_data(struct core_window *cw, void *user_data_ptr)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       tv->user_data = user_data_ptr;
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void * atari_treeview_get_user_data(struct core_window * cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       return(tv->user_data);
+}
+
 
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_close(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       if (tv->window != NULL) {
+               tv->is_open = false;
+               wind_close(gemtk_wm_get_handle(tv->window));
+               gemtk_wm_unlink(tv->window);
+               /* unlink the window: */
+               if (tv->prev_open != NULL) {
+                       tv->prev_open->next_open = tv->next_open;
+               } else {
+                       treeviews_open = tv->next_open;
+               }
+               if (tv->next_open != NULL) {
+                       tv->next_open->prev_open = tv->prev_open;
+               }
+       }
 }
 
+
+/* exported interface documented in atari/treeview.h */
 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){
-                           if (atari_treeview_is_iconified((struct core_window 
*)tmp)) {
-                    /* No content redraw for iconified windows */
-                    /* because otherwise the icon draw function would */
-                    /* have to deal with plot canvas coords */
-                    continue;
-                           }
-
-                atari_treeview_redraw((struct core_window *)tmp);
-                       }
-                       tmp = tmp->next_open;
+       while (tmp != NULL) {
+               assert(tmp->is_open);
+               if (tmp->redraw &&
+                   (!atari_treeview_is_iconified((struct core_window *)tmp))) {
+                       /* Content redraw only for iconified windows
+                        *  because otherwise the icon draw function
+                        *  would have to deal with plot canvas coords
+                        */
+                       atari_treeview_redraw((struct core_window *)tmp);
                }
+               tmp = tmp->next_open;
        }
-}
 
+}
diff --git a/frontends/atari/treeview.h b/frontends/atari/treeview.h
index d10129e..fe267b1 100644
--- a/frontends/atari/treeview.h
+++ b/frontends/atari/treeview.h
@@ -68,7 +68,7 @@ struct atari_treeview_callbacks {
 /**
  * Initalize an window to be an treeview window.
  *
-*/
+ */
 struct core_window *atari_treeview_create(GUIWIN *win, struct 
atari_treeview_callbacks * callbacks, void * user_data, uint32_t flags);
 
 /**


-----------------------------------------------------------------------

Summary of changes:
 frontends/atari/treeview.c |  910 +++++++++++++++++++++++---------------------
 frontends/atari/treeview.h |    2 +-
 2 files changed, 467 insertions(+), 445 deletions(-)

diff --git a/frontends/atari/treeview.c b/frontends/atari/treeview.c
index a72d268..abc1fa7 100644
--- a/frontends/atari/treeview.c
+++ b/frontends/atari/treeview.c
@@ -16,21 +16,13 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <sys/types.h>
-#include <string.h>
-
 #include "assert.h"
-#include "cflib.h"
 
-#include "netsurf/inttypes.h"
-#include "utils/nsoption.h"
 #include "utils/log.h"
 #include "utils/messages.h"
-#include "utils/utils.h"
-#include "netsurf/plotters.h"
-#include "netsurf/mouse.h"
+#include "netsurf/inttypes.h"
 #include "netsurf/core_window.h"
-#include "desktop/treeview.h"
+#include "netsurf/plotters.h"
 
 #include "atari/gui.h"
 #include "atari/plot/plot.h"
@@ -40,29 +32,6 @@
 #include "atari/res/netsurf.rsh"
 
 
-/**
- * Declare Core Window Callbacks:
- */
-
-nserror atari_treeview_invalidate_area(struct core_window *cw, const struct 
rect *r);
-void atari_treeview_update_size(struct core_window *cw, int width, int height);
-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 = {
-       .invalidate = atari_treeview_invalidate_area,
-       .update_size = atari_treeview_update_size,
-       .scroll_visible = atari_treeview_scroll_visible,
-       .get_window_dimensions = atari_treeview_get_window_dimensions,
-       .drag_status = atari_treeview_drag_status
-};
-
-
 struct atari_treeview_window {
        struct atari_treeview_window * prev_open;
        struct atari_treeview_window * next_open;
@@ -80,23 +49,12 @@ struct atari_treeview_window {
 
 static struct atari_treeview_window * treeviews_open;
 
-/* native GUI event handlers: */
-static void on_mbutton_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8]);
-static void on_keybd_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8]);
-static void on_redraw_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8]);
-
-/* static utils: */
-//static void atari_treeview_dump_info(struct atari_treeview_window *tv, char 
*s);
-
 /**
  * Schedule a redraw of the treeview content
  *
  */
-static void atari_treeview_redraw_grect_request(struct core_window *cw,
-                                                                               
                GRECT *area)
+static void
+atari_treeview_redraw_grect_request(struct core_window *cw, GRECT *area)
 {
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
        if (cw != NULL) {
@@ -114,264 +72,77 @@ static void atari_treeview_redraw_grect_request(struct 
core_window *cw,
                        int oldy1 = tv->rdw_area.g_y + tv->rdw_area.g_h;
                        tv->rdw_area.g_x = MIN(tv->rdw_area.g_x, area->g_x);
                        tv->rdw_area.g_y = MIN(tv->rdw_area.g_y, area->g_y);
-                       tv->rdw_area.g_w = ( oldx1 > newx1 ) ? oldx1 - 
tv->rdw_area.g_x : newx1 - tv->rdw_area.g_x;
-                       tv->rdw_area.g_h = ( oldy1 > newy1 ) ? oldy1 - 
tv->rdw_area.g_y : newy1 - tv->rdw_area.g_y;
-               }
-               //dbg_grect("atari_treeview_request_redraw_grect", 
&tv->rdw_area);
-       }
-}
-
-
-void atari_treeview_get_grect(struct core_window *cw, enum treeview_area_e 
mode,
-                                                                       GRECT 
*dest)
-{
 
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+                       if ( oldx1 > newx1 ) {
+                               tv->rdw_area.g_w = oldx1 - tv->rdw_area.g_x;
+                       } else {
+                               tv->rdw_area.g_w = newx1 - tv->rdw_area.g_x;
+                       }
 
-       if (mode == TREEVIEW_AREA_CONTENT) {
-               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, dest);
-       }
-       else if (mode == TREEVIEW_AREA_TOOLBAR) {
-               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_TOOLBAR, dest);
+                       if ( oldy1 > newy1 ) {
+                               tv->rdw_area.g_h = oldy1 - tv->rdw_area.g_y;
+                       } else {
+                               tv->rdw_area.g_h = newy1 - tv->rdw_area.g_y;
+                       }
+               }
+               //dbg_grect("atari_treeview_request_redraw_grect", 
&tv->rdw_area);
        }
 }
 
-GUIWIN * atari_treeview_get_gemtk_window(struct core_window *cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-       return(tv->window);
-}
 
-/*
-static void atari_treeview_dump_info(struct atari_treeview_window *tv,
-                                                                       char * 
title)
+#ifdef ATARI_TREEVIEW_DUMP
+static void
+atari_treeview_dump_info(struct atari_treeview_window *tv, char * title)
 {
        printf("Treeview Dump (%s)\n", title);
        printf("=================================\n");
        gemtk_wm_dump_window_info(atari_treeview_get_gemtk_window((struct 
core_window *)tv));
        GEMTK_DBG_GRECT("Redraw Area: \n", &tv->rdw_area)
-       dbg_grect("Redraw Area2:      \n", &tv->rdw_area);
+               dbg_grect("Redraw Area2:      \n", &tv->rdw_area);
        printf("Extent: x: %d, y: %d\n", tv->extent.x, tv->extent.y);
 }
-*/
+#endif
 
-static bool atari_treeview_is_iconified(struct core_window *cw){
 
-    struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+static bool atari_treeview_is_iconified(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
 
-    return((gemtk_wm_get_state(tv->window)&GEMTK_WM_STATUS_ICONIFIED) != 0);
+       return((gemtk_wm_get_state(tv->window)&GEMTK_WM_STATUS_ICONIFIED) != 0);
 }
 
-static void atari_treeview_redraw_icon(struct core_window *cw, GRECT *clip)
-{
-    struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-    GRECT visible, work;
-    OBJECT * tree = gemtk_obj_get_tree(ICONIFY);
-    short aesh = gemtk_wm_get_handle(tv->window);
-
-    gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_WORK, &work);
-
-    tree->ob_x = work.g_x;
-    tree->ob_y = work.g_y;
-    tree->ob_width = work.g_w;
-    tree->ob_height = work.g_h;
-
-    wind_get_grect(aesh, WF_FIRSTXYWH, &visible);
-    while (visible.g_h > 0 && visible.g_w > 0) {
-
-        if (rc_intersect(&work, &visible)) {
-            objc_draw(tree, 0, 8, visible.g_x, visible.g_y, visible.g_w,
-                        visible.g_h);
-        } else {
-            //dbg_grect("redraw vis area outside", &visible);
-        }
-
-        wind_get_grect(aesh, WF_NEXTXYWH, &visible);
-    }
-}
 
-void atari_treeview_redraw(struct core_window *cw)
+static void atari_treeview_redraw_icon(struct core_window *cw, GRECT *clip)
 {
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-       short pxy[4];
-
-       if (tv != NULL && tv->is_open) {
-               if( tv->redraw && ((plot_get_flags() & PLOT_FLAG_OFFSCREEN) == 
0) ) {
-
-                       short todo[4];
-                       GRECT work;
-                       short handle = gemtk_wm_get_handle(tv->window);
-                       struct gemtk_wm_scroll_info_s *slid;
-
-                       gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, 
&work);
-                       slid = gemtk_wm_get_scroll_info(tv->window);
-
-//                     // Debug code: this 3 lines help to inspect the redraw
-//                     // areas...
-//                     pxy[0] = work.g_x;
-//                     pxy[1] = work.g_y;
-//                     pxy[2] = pxy[0] + work.g_w-1;
-//                     pxy[3] = pxy[1] + work.g_h-1;
-//
-//                     vsf_color(plot_get_vdi_handle(), 0);
-//                     v_bar(plot_get_vdi_handle(), (short*)&pxy);
-//                     evnt_timer(500);
-
-                       struct redraw_context ctx = {
-                               .interactive = true,
-                               .background_images = true,
-                               .plot = &atari_plotters
-                       };
-                       plot_set_dimensions(&ctx,
-                                           work.g_x,
-                                           work.g_y,
-                                           work.g_w,
-                                           work.g_h);
-                       if (plot_lock() == false)
-                               return;
-
-                       if( wind_get(handle, WF_FIRSTXYWH,
-                                                       &todo[0], &todo[1], 
&todo[2], &todo[3] )!=0 ) {
-                               while (todo[2] && todo[3]) {
-
-                                       if(!rc_intersect(&work, (GRECT*)&todo)){
-                                               if (wind_get(handle, 
WF_NEXTXYWH,
-                                                       &todo[0], &todo[1], 
&todo[2], &todo[3])==0) {
-                                                       break;
-                                               }
-                                               continue;
-                                       }
-                                       pxy[0] = todo[0];
-                                       pxy[1] = todo[1];
-                                       pxy[2] = todo[0] + todo[2]-1;
-                                       pxy[3] = todo[1] + todo[3]-1;
-                                       vs_clip(plot_get_vdi_handle(), 1, 
(short*)&pxy);
-
-                                       // Debug code: this 3 lines help to 
inspect the redraw
-                                       // areas...
-
-//                                     vsf_color(plot_get_vdi_handle(), 3);
-//                                     v_bar(plot_get_vdi_handle(), 
(short*)&pxy);
-//                                     evnt_timer(500);
-
+       GRECT visible, work;
+       OBJECT * tree = gemtk_obj_get_tree(ICONIFY);
+       short aesh = gemtk_wm_get_handle(tv->window);
 
-                                       /* convert screen to treeview coords: */
-                                       todo[0] = todo[0] - work.g_x ;//+ 
slid->x_pos*slid->x_unit_px;
-                                       todo[1] = todo[1] - work.g_y ;//+ 
slid->y_pos*slid->y_unit_px;
-                                       if( todo[0] < 0 ){
-                                               todo[2] = todo[2] + todo[0];
-                                               todo[0] = 0;
-                                       }
-                                       if( todo[1] < 0 ){
-                                               todo[3] = todo[3] + todo[1];
-                                               todo[1] = 0;
-                                       }
+       gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_WORK, &work);
 
-                                       if (rc_intersect((GRECT 
*)&tv->rdw_area,(GRECT *)&todo)) {
-                                                       struct rect clip;
+       tree->ob_x = work.g_x;
+       tree->ob_y = work.g_y;
+       tree->ob_width = work.g_w;
+       tree->ob_height = work.g_h;
 
-                                                       clip.x0 = 
todo[0]+(slid->x_pos*slid->x_unit_px);
-                                                       clip.y0 = 
todo[1]+(slid->y_pos*slid->y_unit_px);
-                                                       clip.x1 = clip.x0 + 
todo[2]+(slid->x_pos*slid->x_unit_px);
-                                                       clip.y1 = clip.y0 + 
todo[3]+(slid->y_pos*slid->y_unit_px);
+       wind_get_grect(aesh, WF_FIRSTXYWH, &visible);
+       while (visible.g_h > 0 && visible.g_w > 0) {
 
-                            tv->io->draw(cw, -(slid->x_pos*slid->x_unit_px),
-                                                                               
-(slid->y_pos*slid->y_unit_px),
-                                                                               
                &clip, &ctx);
-                                       }
-                                       vs_clip(plot_get_vdi_handle(), 0, 
(short*)&pxy);
-                                       if (wind_get(handle, WF_NEXTXYWH,
-                                                       &todo[0], &todo[1], 
&todo[2], &todo[3])==0) {
-                                               break;
-                                       }
-                               }
-                       } else {
-                               plot_unlock();
-                               return;
-                       }
-                       plot_unlock();
-                       tv->redraw = false;
-                       tv->rdw_area.g_x = 65000;
-                       tv->rdw_area.g_y = 65000;
-                       tv->rdw_area.g_w = -1;
-                       tv->rdw_area.g_h = -1;
+               if (rc_intersect(&work, &visible)) {
+                       objc_draw(tree, 0, 8, visible.g_x, visible.g_y, 
visible.g_w,
+                                 visible.g_h);
                } else {
-                       /* just copy stuff from the offscreen buffer */
+                       //dbg_grect("redraw vis area outside", &visible);
                }
-       }
-}
-
-
-/**
- * GEMTK (netsurf's GEM toolkit) event sink
- *
-*/
-static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
-{
-       short retval = 0;
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)
-                                                                               
        gemtk_wm_get_user_data(win);
-       struct core_window *cw = (struct core_window *)tv;
-
-    if( (ev_out->emo_events & MU_MESAG) != 0 ) {
-        // handle message
-        switch (msg[0]) {
-
-        case WM_REDRAW:
-                       on_redraw_event(cw, ev_out, msg);
-            break;
-
-        default:
-            break;
-        }
-    }
-    if( (ev_out->emo_events & MU_KEYBD) != 0 ) {
-        on_keybd_event(cw, ev_out, msg);
-    }
-    if( (ev_out->emo_events & MU_BUTTON) != 0 ) {
-        LOG("Treeview click at: %d,%d\n", ev_out->emo_mouse.p_x, 
ev_out->emo_mouse.p_y);
-        on_mbutton_event(cw, ev_out, msg);
-    }
-
-    if(tv != NULL && tv->io->gemtk_user_func != NULL){
-               tv->io->gemtk_user_func(win, ev_out, msg);
-    }
-
-       // TODO: evaluate return values of event handler functions and pass 
them on:
-    return(retval);
-}
 
-
-static void __CDECL on_keybd_event(struct core_window *cw, EVMULT_OUT *ev_out,
-                                                                       short 
msg[8])
-{
-       long kstate = 0;
-       long kcode = 0;
-       long ucs4;
-       long ik;
-       unsigned short nkc = 0;
-       unsigned char ascii;
-       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
-
-       kstate = ev_out->emo_kmeta;
-       kcode = ev_out->emo_kreturn;
-       nkc= gem_to_norm( (short)kstate, (short)kcode );
-       ascii = (nkc & 0xFF);
-       ik = nkc_to_input_key(nkc, &ucs4);
-
-       if (ik == 0) {
-               if (ascii >= 9) {
-                       tv->io->keypress(cw, ucs4);
-               }
-       } else {
-               tv->io->keypress(cw, ik);
+               wind_get_grect(aesh, WF_NEXTXYWH, &visible);
        }
 }
 
 
-static void __CDECL on_redraw_event(struct core_window *cw,
-                                   EVMULT_OUT *ev_out,
-                                   short msg[8])
+static void __CDECL
+on_redraw_event(struct core_window *cw, EVMULT_OUT *ev_out, short msg[8])
 {
        GRECT work, clip;
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
@@ -428,9 +199,9 @@ static void __CDECL on_redraw_event(struct core_window *cw,
        }
 }
 
-static void __CDECL on_mbutton_event(struct core_window *cw,
-                                    EVMULT_OUT *ev_out,
-                                    short msg[8])
+
+static void __CDECL
+on_mbutton_event(struct core_window *cw, EVMULT_OUT *ev_out, short msg[8])
 {
        struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
        struct gemtk_wm_scroll_info_s *slid;
@@ -447,26 +218,26 @@ static void __CDECL on_mbutton_event(struct core_window 
*cw,
 
        /* mouse click relative origin: */
 
-       short origin_rel_x = (mx-work.g_x) +
-                                                       
(slid->x_pos*slid->x_unit_px);
-       short origin_rel_y = (my-work.g_y) +
-                                                       
(slid->y_pos*slid->y_unit_px);
+       short origin_rel_x = (mx-work.g_x) + (slid->x_pos*slid->x_unit_px);
+       short origin_rel_y = (my-work.g_y) + (slid->y_pos*slid->y_unit_px);
 
        /* Only pass on events in the content area: */
-       if( origin_rel_x >= 0 && origin_rel_y >= 0
-               && mx < work.g_x + work.g_w
-               && my < work.g_y + work.g_h )
-       {
+       if ((origin_rel_x >= 0) &&
+           (origin_rel_y >= 0) &&
+           (mx < work.g_x + work.g_w) &&
+           (my < work.g_y + work.g_h)) {
                if (ev_out->emo_mclicks == 2) {
                        tv->io->mouse_action(cw,
-                                                               
BROWSER_MOUSE_CLICK_1|BROWSER_MOUSE_DOUBLE_CLICK,
-                                                               origin_rel_x, 
origin_rel_y);
+                                            BROWSER_MOUSE_CLICK_1 |
+                                            BROWSER_MOUSE_DOUBLE_CLICK,
+                                            origin_rel_x,
+                                            origin_rel_y);
                        return;
                }
 
                graf_mkstate(&cur_rel_x, &cur_rel_y, &mbut, &dummy);
                /* check for click or hold: */
-               if( (mbut&1) == 0 ){
+               if ((mbut & 1) == 0 ) {
                        int bms;
                        bms = BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_PRESS_1;
                        if(ev_out->emo_mclicks == 2 ) {
@@ -486,174 +257,126 @@ static void __CDECL on_mbutton_event(struct core_window 
*cw,
                        tv->startdrag.x = origin_rel_x;
                        tv->startdrag.y = origin_rel_y;
                        /* First, report mouse press, to trigger entry 
selection */
-                       tv->io->mouse_action(cw, BROWSER_MOUSE_CLICK_1 | 
BROWSER_MOUSE_PRESS_1, cur_rel_x,
-                                                                       
cur_rel_y);
+                       tv->io->mouse_action(cw,
+                                            BROWSER_MOUSE_CLICK_1 |
+                                            BROWSER_MOUSE_PRESS_1,
+                                            cur_rel_x,
+                                            cur_rel_y);
                        atari_treeview_redraw(cw);
-                       tv->io->mouse_action(cw, BROWSER_MOUSE_DRAG_1 | 
BROWSER_MOUSE_DRAG_ON,
-                                                               cur_rel_x, 
cur_rel_y);
-                       do{
-                               if (abs(prev_x-cur_rel_x) > 5 || 
abs(prev_y-cur_rel_y) > 5) {
+                       tv->io->mouse_action(cw,
+                                            BROWSER_MOUSE_DRAG_1 |
+                                            BROWSER_MOUSE_DRAG_ON,
+                                            cur_rel_x,
+                                            cur_rel_y);
+                       do {
+                               if (abs(prev_x-cur_rel_x) > 5 ||
+                                   abs(prev_y-cur_rel_y) > 5) {
                                        tv->io->mouse_action(cw,
-                                                               
BROWSER_MOUSE_HOLDING_1 | BROWSER_MOUSE_DRAG_ON,
-                                                               cur_rel_x, 
cur_rel_y);
+                                                            
BROWSER_MOUSE_HOLDING_1 |
+                                                            
BROWSER_MOUSE_DRAG_ON,
+                                                            cur_rel_x,
+                                                            cur_rel_y);
                                        prev_x = cur_rel_x;
                                        prev_y = cur_rel_y;
                                }
 
                                if (tv->redraw) {
                                        // TODO: maybe GUI poll would fit 
better here?
-                                       //               ... is gui_poll 
re-entrance save?
+                                       //               ... is gui_poll 
re-entrance save?
                                        atari_treeview_redraw(cw);
                                }
 
                                /* sample mouse button state: */
-                               graf_mkstate(&cur_rel_x, &cur_rel_y, &mbut, 
&dummy);
-                               cur_rel_x = 
(cur_rel_x-work.g_x)+(slid->x_pos*slid->x_unit_px);
-                               cur_rel_y = 
(cur_rel_y-work.g_y)+(slid->y_pos*slid->y_unit_px);
-                       } while( mbut & 1 );
+                               graf_mkstate(&cur_rel_x,
+                                            &cur_rel_y,
+                                            &mbut,
+                                            &dummy);
+                               cur_rel_x = (cur_rel_x-work.g_x) +
+                                       (slid->x_pos*slid->x_unit_px);
+                               cur_rel_y = (cur_rel_y-work.g_y) +
+                                       (slid->y_pos*slid->y_unit_px);
+                       } while (mbut & 1);
 
                        /* End drag: */
-                       tv->io->mouse_action(cw, BROWSER_MOUSE_HOVER, 
cur_rel_x, cur_rel_y);
+                       tv->io->mouse_action(cw,
+                                            BROWSER_MOUSE_HOVER,
+                                            cur_rel_x,
+                                            cur_rel_y);
                        gem_set_cursor(&gem_cursors.arrow);
                }
        }
 }
 
 
-struct core_window *
-atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks,
-                                       void * user_data, uint32_t flags)
+static void __CDECL
+on_keybd_event(struct core_window *cw, EVMULT_OUT *ev_out, short msg[8])
 {
+       long kstate = 0;
+       long kcode = 0;
+       long ucs4;
+       long ik;
+       unsigned short nkc = 0;
+       unsigned char ascii;
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
 
-       /* allocate the core_window struct: */
-       struct atari_treeview_window * tv;
-       struct gemtk_wm_scroll_info_s *slid;
+       kstate = ev_out->emo_kmeta;
+       kcode = ev_out->emo_kreturn;
+       nkc= gem_to_norm( (short)kstate, (short)kcode );
+       ascii = (nkc & 0xFF);
+       ik = nkc_to_input_key(nkc, &ucs4);
 
-       tv = calloc(1, sizeof(struct atari_treeview_window));
-       if (tv == NULL) {
-               LOG("calloc failed");
-               atari_warn_user(messages_get_errorcode(NSERROR_NOMEM), 0);
-               return NULL;
+       if (ik == 0) {
+               if (ascii >= 9) {
+                       tv->io->keypress(cw, ucs4);
+               }
+       } else {
+               tv->io->keypress(cw, ik);
        }
+}
 
-       /* Store the window ref inside the new treeview: */
-       tv->window = win;
-       tv->io = callbacks;
-       tv->user_data = user_data;
-
-       // Setup gemtk event handler function:
-       gemtk_wm_set_event_handler(win, handle_event);
 
-       // bind window user data to treeview ref:
-       gemtk_wm_set_user_data(win, (void*)tv);
+/**
+ * GEMTK (netsurf's GEM toolkit) event sink
+ *
+ */
+static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
+{
+       short retval = 0;
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)
+               gemtk_wm_get_user_data(win);
+       struct core_window *cw = (struct core_window *)tv;
 
-       // Get acces to the gemtk scroll info struct:
-       slid = gemtk_wm_get_scroll_info(tv->window);
+       if( (ev_out->emo_events & MU_MESAG) != 0 ) {
+               // handle message
+               switch (msg[0]) {
 
-       // Setup line and column height/width of the window,
-       // each scroll takes the configured steps:
-       slid->y_unit_px = 16;
-       slid->x_unit_px = 16;
+               case WM_REDRAW:
+                       on_redraw_event(cw, ev_out, msg);
+                       break;
 
-       assert(tv->io);
-       assert(tv->io->init_phase2);
+               default:
+                       break;
+               }
+       }
+       if ((ev_out->emo_events & MU_KEYBD) != 0 ) {
+               on_keybd_event(cw, ev_out, msg);
+       }
+       if ((ev_out->emo_events & MU_BUTTON) != 0 ) {
+               LOG("Treeview click at: %d,%d\n",
+                   ev_out->emo_mouse.p_x, ev_out->emo_mouse.p_y);
+               on_mbutton_event(cw, ev_out, msg);
+       }
 
-       /* Now that the window is configured for treeview content,              
        */
-       /* call init_phase2 which must create the treeview                      
                */
-       /* descriptor, and at least setup the the default                       
                */
-       /* event handlers of the treeview:                                      
                                */
-       /* It would be more simple to not pass around the callbacks             
        */
-       /* but the treeview constructor requires them for initialization...     
*/
-       nserror err = tv->io->init_phase2((struct core_window *)tv, &cw_t);
-       if (err != NSERROR_OK) {
-               free(tv);
-               tv = NULL;
+       if (tv != NULL && tv->io->gemtk_user_func != NULL){
+               tv->io->gemtk_user_func(win, ev_out, msg);
        }
 
-       return((struct core_window *)tv);
-}
-
-void atari_treeview_delete(struct core_window * cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-
-       assert(tv);
-       assert(tv->io->finish);
-
-       tv->io->finish(cw);
-
-       free(tv);
-}
-
-
-void atari_treeview_open(struct core_window *cw, GRECT *pos)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       if (tv->window != NULL && tv->is_open == false) {
-               tv->is_open = true;
-               wind_open_grect(gemtk_wm_get_handle(tv->window), pos);
-               gemtk_wm_link(tv->window);
-               if (treeviews_open == NULL) {
-                       treeviews_open = tv;
-                       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 = tv;
-                       tv->prev_open = tmp;
-                       tv->next_open = NULL;
-               }
-       }
-}
-
-bool atari_treeview_is_open(struct core_window *cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       return(tv->is_open);
-}
-
-void atari_treeview_set_user_data(struct core_window * cw,
-                                                               void 
*user_data_ptr)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       tv->user_data = user_data_ptr;
-}
-
-void * atari_treeview_get_user_data(struct core_window * cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       return(tv->user_data);
-}
-
-void atari_treeview_close(struct core_window *cw)
-{
-       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
-       if (tv->window != NULL) {
-               tv->is_open = false;
-               wind_close(gemtk_wm_get_handle(tv->window));
-               gemtk_wm_unlink(tv->window);
-               /* unlink the window: */
-               if (tv->prev_open != NULL) {
-                       tv->prev_open->next_open = tv->next_open;
-               } else {
-                       treeviews_open = tv->next_open;
-               }
-               if (tv->next_open != NULL) {
-                       tv->next_open->prev_open = tv->prev_open;
-               }
-       }
+       // TODO: evaluate return values of event handler functions and pass 
them on:
+       return(retval);
 }
 
 
 /**
- * Core Window Callbacks:
- */
-
-/**
  * callback from core to request an invalidation of a window area.
  *
  * The specified area of the window should now be considered
@@ -664,7 +387,9 @@ void atari_treeview_close(struct core_window *cw)
  * \param[in] r area to redraw or NULL for the entire window area.
  * \return NSERROR_OK on success or appropriate error code.
  */
-nserror atari_treeview_invalidate_area(struct core_window *cw, const struct 
rect *r)
+static nserror
+atari_treeview_invalidate_area(struct core_window *cw,
+                              const struct rect *r)
 {
        GRECT area;
        struct gemtk_wm_scroll_info_s * slid;
@@ -693,6 +418,7 @@ nserror atari_treeview_invalidate_area(struct core_window 
*cw, const struct rect
        return NSERROR_OK;
 }
 
+
 /**
  * Update the limits of the window
  *
@@ -700,7 +426,8 @@ nserror atari_treeview_invalidate_area(struct core_window 
*cw, const struct rect
  * \param width                the width in px, or negative if don't care
  * \param height       the height in px, or negative if don't care
  */
-void atari_treeview_update_size(struct core_window *cw, int width, int height)
+static void
+atari_treeview_update_size(struct core_window *cw, int width, int height)
 {
        GRECT area;
        struct gemtk_wm_scroll_info_s *slid;
@@ -732,8 +459,10 @@ void atari_treeview_update_size(struct core_window *cw, 
int width, int height)
                tv->extent.y = height;
 
 
-               /*printf("units content: %d, units viewport: %d\n", 
(height/slid->y_unit_px),
-                                       (area.g_h/slid->y_unit_px));*/
+               /* printf("units content: %d, units viewport: %d\n",
+                         (height/slid->y_unit_px),
+                         (area.g_h/slid->y_unit_px));
+                */
                gemtk_wm_update_slider(tv->window, GEMTK_WM_VH_SLIDER);
        }
 }
@@ -745,10 +474,11 @@ void atari_treeview_update_size(struct core_window *cw, 
int width, int height)
  * \param cw           the core window object
  * \param r            rectangle to make visible
  */
-void atari_treeview_scroll_visible(struct core_window *cw, const struct rect 
*r)
+static void
+atari_treeview_scroll_visible(struct core_window *cw, const struct rect *r)
 {
        /* atari frontend doesn't support dragging outside the treeview */
-       /* so there is no need to implement this?                               
                */
+       /* so there is no need to implement this? */
 }
 
 
@@ -759,10 +489,13 @@ void atari_treeview_scroll_visible(struct core_window 
*cw, const struct rect *r)
  * \param width                to be set to viewport width in px, if non NULL
  * \param height       to be set to viewport height in px, if non NULL
  */
-void atari_treeview_get_window_dimensions(struct core_window *cw,
-               int *width, int *height)
+static void
+atari_treeview_get_window_dimensions(struct core_window *cw,
+                                    int *width,
+                                    int *height)
 {
-       if (cw != NULL && (width != NULL || height != NULL)) {
+       if ((cw != NULL) &&
+           (width != NULL || height != NULL)) {
                GRECT work;
                atari_treeview_get_grect(cw, TREEVIEW_AREA_CONTENT, &work);
                *width = work.g_w;
@@ -777,33 +510,322 @@ void atari_treeview_get_window_dimensions(struct 
core_window *cw,
  * \param cw           the core window object
  * \param ds           the current drag status
  */
-void atari_treeview_drag_status(struct core_window *cw,
-               core_window_drag_status ds)
+static void
+atari_treeview_drag_status(struct core_window *cw, core_window_drag_status ds)
+{
+
+}
+
+
+/**
+ * Declare Core Window Callbacks:
+ */
+static struct core_window_callback_table cw_t = {
+       .invalidate = atari_treeview_invalidate_area,
+       .update_size = atari_treeview_update_size,
+       .scroll_visible = atari_treeview_scroll_visible,
+       .get_window_dimensions = atari_treeview_get_window_dimensions,
+       .drag_status = atari_treeview_drag_status
+};
+
+
+/* exported interface documented in atari/treeview.h */
+struct core_window *
+atari_treeview_create(GUIWIN *win, struct atari_treeview_callbacks * callbacks,
+                     void * user_data, uint32_t flags)
+{
+
+       /* allocate the core_window struct: */
+       struct atari_treeview_window * tv;
+       struct gemtk_wm_scroll_info_s *slid;
+
+       tv = calloc(1, sizeof(struct atari_treeview_window));
+       if (tv == NULL) {
+               LOG("calloc failed");
+               atari_warn_user(messages_get_errorcode(NSERROR_NOMEM), 0);
+               return NULL;
+       }
+
+       /* Store the window ref inside the new treeview: */
+       tv->window = win;
+       tv->io = callbacks;
+       tv->user_data = user_data;
+
+       // Setup gemtk event handler function:
+       gemtk_wm_set_event_handler(win, handle_event);
+
+       // bind window user data to treeview ref:
+       gemtk_wm_set_user_data(win, (void*)tv);
+
+       // Get acces to the gemtk scroll info struct:
+       slid = gemtk_wm_get_scroll_info(tv->window);
+
+       // Setup line and column height/width of the window,
+       // each scroll takes the configured steps:
+       slid->y_unit_px = 16;
+       slid->x_unit_px = 16;
+
+       assert(tv->io);
+       assert(tv->io->init_phase2);
+
+       /* Now that the window is configured for treeview content, */
+       /* call init_phase2 which must create the treeview */
+       /* descriptor, and at least setup the the default */
+       /* event handlers of the treeview: */
+       /* It would be more simple to not pass around the callbacks */
+       /* but the treeview constructor requires them for initialization...  */
+       nserror err = tv->io->init_phase2((struct core_window *)tv, &cw_t);
+       if (err != NSERROR_OK) {
+               free(tv);
+               tv = NULL;
+       }
+
+       return((struct core_window *)tv);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void
+atari_treeview_get_grect(struct core_window *cw,
+                        enum treeview_area_e mode,
+                        GRECT *dest)
+{
+
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+
+       if (mode == TREEVIEW_AREA_CONTENT) {
+               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, dest);
+       }
+       else if (mode == TREEVIEW_AREA_TOOLBAR) {
+               gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_TOOLBAR, dest);
+       }
+}
+
+
+/* exported interface documented in atari/treeview.h */
+GUIWIN * atari_treeview_get_gemtk_window(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+       return(tv->window);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_redraw(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window *)cw;
+       short pxy[4];
+
+       if (tv != NULL && tv->is_open) {
+               if( tv->redraw && ((plot_get_flags() & PLOT_FLAG_OFFSCREEN) == 
0) ) {
+
+                       short todo[4];
+                       GRECT work;
+                       short handle = gemtk_wm_get_handle(tv->window);
+                       struct gemtk_wm_scroll_info_s *slid;
+
+                       gemtk_wm_get_grect(tv->window, GEMTK_WM_AREA_CONTENT, 
&work);
+                       slid = gemtk_wm_get_scroll_info(tv->window);
+
+//                     // Debug code: this 3 lines help to inspect the redraw
+//                     // areas...
+//                     pxy[0] = work.g_x;
+//                     pxy[1] = work.g_y;
+//                     pxy[2] = pxy[0] + work.g_w-1;
+//                     pxy[3] = pxy[1] + work.g_h-1;
+//
+//                     vsf_color(plot_get_vdi_handle(), 0);
+//                     v_bar(plot_get_vdi_handle(), (short*)&pxy);
+//                     evnt_timer(500);
+
+                       struct redraw_context ctx = {
+                               .interactive = true,
+                               .background_images = true,
+                               .plot = &atari_plotters
+                       };
+                       plot_set_dimensions(&ctx,
+                                           work.g_x,
+                                           work.g_y,
+                                           work.g_w,
+                                           work.g_h);
+                       if (plot_lock() == false)
+                               return;
+
+                       if( wind_get(handle, WF_FIRSTXYWH,
+                                    &todo[0], &todo[1], &todo[2], &todo[3] 
)!=0 ) {
+                               while (todo[2] && todo[3]) {
+
+                                       if(!rc_intersect(&work, (GRECT*)&todo)){
+                                               if (wind_get(handle, 
WF_NEXTXYWH,
+                                                            &todo[0], 
&todo[1], &todo[2], &todo[3])==0) {
+                                                       break;
+                                               }
+                                               continue;
+                                       }
+                                       pxy[0] = todo[0];
+                                       pxy[1] = todo[1];
+                                       pxy[2] = todo[0] + todo[2]-1;
+                                       pxy[3] = todo[1] + todo[3]-1;
+                                       vs_clip(plot_get_vdi_handle(), 1, 
(short*)&pxy);
+
+                                       // Debug code: this 3 lines help to 
inspect the redraw
+                                       // areas...
+
+//                                     vsf_color(plot_get_vdi_handle(), 3);
+//                                     v_bar(plot_get_vdi_handle(), 
(short*)&pxy);
+//                                     evnt_timer(500);
+
+
+                                       /* convert screen to treeview coords: */
+                                       todo[0] = todo[0] - work.g_x ;//+ 
slid->x_pos*slid->x_unit_px;
+                                       todo[1] = todo[1] - work.g_y ;//+ 
slid->y_pos*slid->y_unit_px;
+                                       if( todo[0] < 0 ){
+                                               todo[2] = todo[2] + todo[0];
+                                               todo[0] = 0;
+                                       }
+                                       if( todo[1] < 0 ){
+                                               todo[3] = todo[3] + todo[1];
+                                               todo[1] = 0;
+                                       }
+
+                                       if (rc_intersect((GRECT 
*)&tv->rdw_area,(GRECT *)&todo)) {
+                                               struct rect clip;
+
+                                               clip.x0 = 
todo[0]+(slid->x_pos*slid->x_unit_px);
+                                               clip.y0 = 
todo[1]+(slid->y_pos*slid->y_unit_px);
+                                               clip.x1 = clip.x0 + 
todo[2]+(slid->x_pos*slid->x_unit_px);
+                                               clip.y1 = clip.y0 + 
todo[3]+(slid->y_pos*slid->y_unit_px);
+
+                                               tv->io->draw(cw, 
-(slid->x_pos*slid->x_unit_px),
+                                                            
-(slid->y_pos*slid->y_unit_px),
+                                                            &clip, &ctx);
+                                       }
+                                       vs_clip(plot_get_vdi_handle(), 0, 
(short*)&pxy);
+                                       if (wind_get(handle, WF_NEXTXYWH,
+                                                    &todo[0], &todo[1], 
&todo[2], &todo[3])==0) {
+                                               break;
+                                       }
+                               }
+                       } else {
+                               plot_unlock();
+                               return;
+                       }
+                       plot_unlock();
+                       tv->redraw = false;
+                       tv->rdw_area.g_x = 65000;
+                       tv->rdw_area.g_y = 65000;
+                       tv->rdw_area.g_w = -1;
+                       tv->rdw_area.g_h = -1;
+               } else {
+                       /* just copy stuff from the offscreen buffer */
+               }
+       }
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_delete(struct core_window * cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+
+       assert(tv);
+       assert(tv->io->finish);
+
+       tv->io->finish(cw);
+
+       free(tv);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_open(struct core_window *cw, GRECT *pos)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       if (tv->window != NULL && tv->is_open == false) {
+               tv->is_open = true;
+               wind_open_grect(gemtk_wm_get_handle(tv->window), pos);
+               gemtk_wm_link(tv->window);
+               if (treeviews_open == NULL) {
+                       treeviews_open = tv;
+                       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 = tv;
+                       tv->prev_open = tmp;
+                       tv->next_open = NULL;
+               }
+       }
+}
+
+
+/* exported interface documented in atari/treeview.h */
+bool atari_treeview_is_open(struct core_window *cw)
 {
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       return(tv->is_open);
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_set_user_data(struct core_window *cw, void *user_data_ptr)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       tv->user_data = user_data_ptr;
+}
+
+
+/* exported interface documented in atari/treeview.h */
+void * atari_treeview_get_user_data(struct core_window * cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       return(tv->user_data);
+}
+
 
+/* exported interface documented in atari/treeview.h */
+void atari_treeview_close(struct core_window *cw)
+{
+       struct atari_treeview_window *tv = (struct atari_treeview_window*)cw;
+       if (tv->window != NULL) {
+               tv->is_open = false;
+               wind_close(gemtk_wm_get_handle(tv->window));
+               gemtk_wm_unlink(tv->window);
+               /* unlink the window: */
+               if (tv->prev_open != NULL) {
+                       tv->prev_open->next_open = tv->next_open;
+               } else {
+                       treeviews_open = tv->next_open;
+               }
+               if (tv->next_open != NULL) {
+                       tv->next_open->prev_open = tv->prev_open;
+               }
+       }
 }
 
+
+/* exported interface documented in atari/treeview.h */
 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){
-                           if (atari_treeview_is_iconified((struct core_window 
*)tmp)) {
-                    /* No content redraw for iconified windows */
-                    /* because otherwise the icon draw function would */
-                    /* have to deal with plot canvas coords */
-                    continue;
-                           }
-
-                atari_treeview_redraw((struct core_window *)tmp);
-                       }
-                       tmp = tmp->next_open;
+       while (tmp != NULL) {
+               assert(tmp->is_open);
+               if (tmp->redraw &&
+                   (!atari_treeview_is_iconified((struct core_window *)tmp))) {
+                       /* Content redraw only for iconified windows
+                        *  because otherwise the icon draw function
+                        *  would have to deal with plot canvas coords
+                        */
+                       atari_treeview_redraw((struct core_window *)tmp);
                }
+               tmp = tmp->next_open;
        }
-}
 
+}
diff --git a/frontends/atari/treeview.h b/frontends/atari/treeview.h
index d10129e..fe267b1 100644
--- a/frontends/atari/treeview.h
+++ b/frontends/atari/treeview.h
@@ -68,7 +68,7 @@ struct atari_treeview_callbacks {
 /**
  * Initalize an window to be an treeview window.
  *
-*/
+ */
 struct core_window *atari_treeview_create(GUIWIN *win, struct 
atari_treeview_callbacks * callbacks, void * user_data, uint32_t flags);
 
 /**


-- 
NetSurf Browser

_______________________________________________
netsurf-commits mailing list
netsurf-commits@netsurf-browser.org
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to