summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOle Loots <ole@monochrom.net>2012-11-20 01:41:42 +0100
committerOle Loots <ole@monochrom.net>2012-11-20 01:41:42 +0100
commit7e94f32e4c99ced99ab4efaef1e56ad96430fb40 (patch)
tree35d53a0b981b9200608dd44ec111a4fb5db9056a
parent5449303bd1bf27e4cc8baccb0985e4d52c563caf (diff)
downloadnetsurf-7e94f32e4c99ced99ab4efaef1e56ad96430fb40.tar.gz
netsurf-7e94f32e4c99ced99ab4efaef1e56ad96430fb40.tar.bz2
Initial work at making scrolling work
-rw-r--r--atari/gemtk/gemtk.h5
-rw-r--r--atari/gemtk/guiwin.c176
-rwxr-xr-xatari/gui.c2
-rwxr-xr-xatari/treeview.c30
4 files changed, 139 insertions, 74 deletions
diff --git a/atari/gemtk/gemtk.h b/atari/gemtk/gemtk.h
index 5e0f5c464..412871598 100644
--- a/atari/gemtk/gemtk.h
+++ b/atari/gemtk/gemtk.h
@@ -84,6 +84,7 @@ enum guwin_area_e {
};
short guiwin_init(void);
+void guiwin_exit(void);
GUIWIN * guiwin_add(short handle, uint32_t flags,
guiwin_event_handler_f handler);
GUIWIN *guiwin_find(short handle);
@@ -99,11 +100,13 @@ void guiwin_set_toolbar(GUIWIN *win, OBJECT *toolbar, short idx,
void guiwin_set_event_handler(GUIWIN *win,guiwin_event_handler_f cb);
void guiwin_set_user_data(GUIWIN *win, void *data);
void *guiwin_get_user_data(GUIWIN *win);
-struct guiwin_scroll_info_s *guiwin_get_scroll_info(GUIWIN *win);
+struct guiwin_scroll_info_s * guiwin_get_scroll_info(GUIWIN *win);
void guiwin_update_slider(GUIWIN *win, short mode);
+void guiwin_send_redraw(GUIWIN *win, GRECT *area);
VdiHdl guiwin_get_vdi_handle(GUIWIN *win);
+
/*
* AES Scroller Object
*/
diff --git a/atari/gemtk/guiwin.c b/atari/gemtk/guiwin.c
index fa496bf6b..e055abae9 100644
--- a/atari/gemtk/guiwin.c
+++ b/atari/gemtk/guiwin.c
@@ -27,64 +27,92 @@ static GUIWIN * winlist;
static VdiHdl v_vdi_h = -1;
static short work_out[57];
+static void move_screen( int vhandle, GRECT *screen, int dx, int dy) {
+ INT16 xy[ 8];
+ long dum = 0L;
+ GRECT g;
+
+ /* get intersection with screen area */
+ wind_get_grect(0, WF_CURRXYWH, &g);
+ rc_intersect(&g, screen);
+ xy[ 0] = screen -> g_x;
+ xy[ 1] = screen -> g_y;
+ xy[ 2] = xy[ 0] + screen -> g_w - 1;
+ xy[ 3] = xy[ 1] + screen -> g_h - 1;
+ xy[ 4] = xy[ 0] + dx;
+ xy[ 5] = xy[ 1] + dy;
+ xy[ 6] = xy[ 2] + dx;
+ xy[ 7] = xy[ 3] + dy;
+ vro_cpyfm( vhandle, S_ONLY, xy, (MFDB *)&dum, (MFDB *)&dum);
+}
+
static short preproc_wm(GUIWIN * gw, EVMULT_OUT *ev_out, short msg[8])
{
- GRECT g, tb_area, tb_area_ro;
+ GRECT g, g_ro, tb_area, tb_area_ro;
short retval = 1;
int val;
struct guiwin_scroll_info_s *slid;
switch(msg[0]) {
- case WM_ARROWED:
- if((gw->flag & GW_FLAG_CUSTOM_SCROLLING) == 0){
-
- slid = guiwin_get_scroll_info(win);
-
- switch(msg[4]){
- case WA_DNPAGE:
- guiwin_get_grect(win, GUIWIN_AREA_CONTENT, &g);
- val = g.g_h;
- // complete redraw
- // increase scroll val by page size...
- break;
-
- case WA_UPLINE:
- slid->g_y = MAX(0, slid->g_y-1);
- // partial redraw
- break;
-
- case WA_DNLINE:
- slid->g_y = MIN(slid->y_pos_max, slid->g_y+1);
- // move content up by unit size and sched redraw for the
- // bottom 16 px
- // partial redraw
- break;
-
- case WA_LFPAGE:
- // complete redraw
- // increase scroll val by page size...
- break;
-
- case WA_RTPAGE:
- // complete redraw
- // increase scroll val by page size...
- break;
-
- case WA_LFLINE:
- slid->g_x = MAX(0, slid->g_x-1);
- // partial redraw
- break;
-
- case WA_RTLINE:
- slid->g_x = MIN(slid->x_pos_max, slid->g_x+1);
- // partial redraw
- break;
-
- default: break;
- }
- }
- break;
+ case WM_ARROWED:
+ if((gw->flags & GW_FLAG_CUSTOM_SCROLLING) == 0) {
+
+ slid = guiwin_get_scroll_info(gw);
+ guiwin_get_grect(gw, GUIWIN_AREA_CONTENT, &g);
+ g_ro = g;
+
+ switch(msg[4]) {
+ case WA_DNPAGE:
+
+ val = g.g_h;
+ // complete redraw
+ // increase scroll val by page size...
+ break;
+
+ case WA_UPLINE:
+ slid->y_pos = MAX(0, slid->y_pos-1);
+ // partial redraw
+ break;
+
+ case WA_DNLINE:
+ slid->y_pos = MIN(slid->y_pos_max, slid->y_pos+1);
+ g.g_y += slid->y_unit_px;
+ g.g_h -= slid->y_unit_px;
+ move_screen(v_vdi_h, &g, 0, -slid->y_unit_px);
+ g.g_y = g_ro.g_y + g_ro.g_h - slid->y_unit_px;
+ g.g_h = slid->y_unit_px;
+ guiwin_send_redraw(gw, &g);
+ // move content up by unit size and sched redraw for the
+ // bottom 16 px
+ // partial redraw
+ break;
+
+ case WA_LFPAGE:
+ // complete redraw
+ // increase scroll val by page size...
+ break;
+
+ case WA_RTPAGE:
+ // complete redraw
+ // increase scroll val by page size...
+ break;
+
+ case WA_LFLINE:
+ slid->x_pos = MAX(0, slid->x_pos-1);
+ // partial redraw
+ break;
+
+ case WA_RTLINE:
+ slid->x_pos = MIN(slid->x_pos_max, slid->x_pos+1);
+ // partial redraw
+ break;
+
+ default:
+ break;
+ }
+ }
+ break;
case WM_TOPPED:
wind_set(gw->handle, WF_TOP, 1, 0, 0, 0);
@@ -248,17 +276,18 @@ short guiwin_dispatch_event(EVMULT_IN *ev_in, EVMULT_OUT *ev_out, short msg[8])
short guiwin_init(void)
{
- if(v_vdi_h == -1){
- short dummy;
- static short work_in[12] = {1,1,1,1,1,1,1,1,1,1,2,1};
- v_vdi_h=graf_handle(&dummy, &dummy, &dummy, &dummy);
- v_opnvwk(work_in, &v_vdi_h, work_out);
- }
+ if(v_vdi_h == -1) {
+ short dummy;
+ static short work_in[12] = {1,1,1,1,1,1,1,1,1,1,2,1};
+ v_vdi_h=graf_handle(&dummy, &dummy, &dummy, &dummy);
+ v_opnvwk(work_in, &v_vdi_h, work_out);
+ }
+ return(0);
}
void guiwin_exit(void)
{
- v_clsvwk(v_vdi_h);
+ v_clsvwk(v_vdi_h);
}
GUIWIN * guiwin_add(short handle, uint32_t flags, guiwin_event_handler_f cb)
@@ -368,9 +397,9 @@ void guiwin_update_slider(GUIWIN *win, short mode)
struct guiwin_scroll_info_s * slid;
unsigned long size, pos;
- short handle = guiwin_get_handle(win);
+ short handle = guiwin_get_handle(win);
guiwin_get_grect(win, GUIWIN_AREA_CONTENT, &viewport);
- slid = guiwin_get_scroll_info(win);
+ slid = guiwin_get_scroll_info(win);
if((mode & 1) && (slid->y_unit_px > 0)) {
if ( slid->y_pos_max < (long)viewport.g_h/slid->y_unit_px)
@@ -440,8 +469,35 @@ void *guiwin_get_user_data(GUIWIN *win)
struct guiwin_scroll_info_s *guiwin_get_scroll_info(GUIWIN *win)
{
- return(&win->scroll_info);
+ return(&win->scroll_info);
+}
+
+void guiwin_send_redraw(GUIWIN *win, GRECT *area)
+{
+ short msg[8];
+ GRECT work;
+
+ if(area == NULL){
+ guiwin_get_grect(win, GUIWIN_AREA_WORK, &work);
+ area = &work;
+ }
+
+ msg[0] = WM_REDRAW;
+ msg[1] = gl_apid;
+ msg[2] = 0;
+ msg[3] = win->handle;
+ msg[4] = area->g_x;
+ msg[5] = area->g_y;
+ msg[6] = area->g_w;
+ msg[7] = area->g_h;
+
+ appl_write(gl_apid, 16, &msg);
+}
+/*
+void guiwin_exec_redraw(){
+
}
+*/
diff --git a/atari/gui.c b/atari/gui.c
index fb412f376..7204705a0 100755
--- a/atari/gui.c
+++ b/atari/gui.c
@@ -1117,7 +1117,9 @@ int main(int argc, char** argv)
freopen("stdout.log", "a+", stdout);
freopen("stderr.log", "a+", stderr);
#endif
+ // todo: replace with appl_init
ApplInit();
+ gl_apid = _AESapid;
graf_mouse(BUSY_BEE, NULL);
init_os_info();
atari_find_resource((char*)&messages, "messages", "res/messages");
diff --git a/atari/treeview.c b/atari/treeview.c
index ab0afb515..4cddea417 100755
--- a/atari/treeview.c
+++ b/atari/treeview.c
@@ -86,6 +86,11 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
on_redraw_event(tv, ev_out, msg);
break;
+ case WM_SIZED:
+ case WM_FULLED:
+ guiwin_update_slider(win, 3);
+ break;
+
default:
break;
}
@@ -322,18 +327,16 @@ void atari_treeview_destroy( NSTREEVIEW tv )
bool atari_treeview_mevent( NSTREEVIEW tv, browser_mouse_state bms, int x, int y)
{
GRECT work;
+ struct guiwin_scroll_info_s *slid;
if( tv == NULL )
return ( false );
guiwin_get_grect(tv->window, GUIWIN_AREA_CONTENT, &work);
+ slid = guiwin_get_scroll_info(tv->window);
- //int rx = (x-work.g_x)+(tv->window->xpos*tv->window->w_u);
- //int ry = (y-work.g_y)+(tv->window->ypos*tv->window->h_u);
-
- // TODO: get slider values
- int rx = (x-work.g_x);
- int ry = (y-work.g_y);
+ int rx = (x-work.g_x)+(slid->x_pos*slid->x_unit_px);
+ int ry = (y-work.g_y)+(slid->y_pos*slid->y_unit_px);
tree_mouse_action(tv->tree, bms, rx, ry);
@@ -353,9 +356,11 @@ void atari_treeview_redraw( NSTREEVIEW tv)
short todo[4];
GRECT work;
- short handle = guiwin_get_handle(tv->window);
+ short handle = guiwin_get_handle(tv->window);
+ struct guiwin_scroll_info_s *slid;
guiwin_get_grect(tv->window, GUIWIN_AREA_CONTENT, &work);
+ slid = guiwin_get_scroll_info(tv->window);
struct redraw_context ctx = {
.interactive = true,
@@ -378,8 +383,8 @@ void atari_treeview_redraw( NSTREEVIEW tv)
/* convert screen to treeview coords: */
// TODO: get slider values:
- todo[0] = todo[0] - work.g_x;/*+ tv->window->xpos*tv->window->w_u;*/
- todo[1] = todo[1] - work.g_y;/*+ tv->window->ypos*tv->window->h_u;*/
+ 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;
@@ -389,10 +394,10 @@ void atari_treeview_redraw( NSTREEVIEW tv)
todo[1] = 0;
}
- // TODO: get slider values
+ // TODO: get slider values
if (rc_intersect((GRECT *)&tv->rdw_area,(GRECT *)&todo)) {
- tree_draw(tv->tree, 0/*-tv->window->xpos*16*/,
- 0 /*-tv->window->ypos*16*/,
+ tree_draw(tv->tree, -(slid->x_pos*slid->x_unit_px),
+ -(slid->y_pos*slid->y_unit_px),
todo[0], todo[1], todo[2], todo[3], &ctx
);
}
@@ -472,7 +477,6 @@ void atari_treeview_resized(struct tree *tree, int width, int height, void *pw)
struct guiwin_scroll_info_s *slid = guiwin_get_scroll_info(tv->window);
slid->x_pos_max = (width / slid->x_unit_px);
slid->y_pos_max = (height / slid->y_unit_px);
- printf("updating slider...\n");
guiwin_update_slider(tv->window, 3);
}
}