From 8c29c675c4301c90f5038a27aa31fa640f47e5aa Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 10 Aug 2017 18:34:09 +0100 Subject: clean up atari treeview code, stop it including headers it does not need --- 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 a72d268cf..abc1fa780 100644 --- a/frontends/atari/treeview.c +++ b/frontends/atari/treeview.c @@ -16,21 +16,13 @@ * along with this program. If not, see . */ -#include -#include - #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,173 +257,125 @@ 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. * @@ -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 d10129eaa..fe267b122 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); /** -- cgit v1.2.3