Started refactoring of global redraw handling.
This commit is contained in:
parent
fe0e2508e6
commit
ff7cf93762
|
@ -858,7 +858,6 @@ void browser_redraw( struct gui_window * gw )
|
|||
/* but because this is onscreen plotter, it doesn't */
|
||||
/* make much sense anyway... */
|
||||
}
|
||||
|
||||
}
|
||||
if (wind_get(aes_handle, WF_NEXTXYWH,
|
||||
&todo[0], &todo[1], &todo[2], &todo[3])==0) {
|
||||
|
|
30
atari/gui.c
30
atari/gui.c
|
@ -131,17 +131,21 @@ void gui_poll(bool active)
|
|||
|
||||
struct gui_window * g;
|
||||
|
||||
for( g = window_list; g != NULL; g=g->next ) {
|
||||
if( browser_redraw_required( g ) ) {
|
||||
browser_redraw(g);
|
||||
if(input_window->root->redraw_slots.areas_used > 0){
|
||||
window_process_redraws(input_window->root);
|
||||
}
|
||||
if(g->root->toolbar) {
|
||||
//if(g->root->toolbar->url.redraw ) {
|
||||
// TODO: implement toolbar redraw mechanism
|
||||
//tb_url_redraw( g );
|
||||
|
||||
// for( g = window_list; g != NULL; g=g->next ) {
|
||||
// if( browser_redraw_required( g ) ) {
|
||||
// browser_redraw(g);
|
||||
// }
|
||||
// if(g->root->toolbar) {
|
||||
// //if(g->root->toolbar->url.redraw ) {
|
||||
// // TODO: implement toolbar redraw mechanism
|
||||
// //tb_url_redraw( g );
|
||||
// //}
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
if( !active ) {
|
||||
/* this suits for stuff with lower priority */
|
||||
|
@ -179,6 +183,9 @@ void gui_poll(bool active)
|
|||
}
|
||||
} while ( gui_poll_repeat && !(active||rendering));
|
||||
|
||||
if(input_window->root->redraw_slots.areas_used > 0){
|
||||
window_process_redraws(input_window->root);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -313,6 +320,7 @@ void gui_window_set_title(struct gui_window *gw, const char *title)
|
|||
gw->title = realloc(gw->title, l);
|
||||
strncpy(gw->title, title, l);
|
||||
}
|
||||
gw->title[l] = 0;
|
||||
if(input_window == gw)
|
||||
window_set_title(gw->root, gw->title);
|
||||
}
|
||||
|
@ -336,7 +344,7 @@ void gui_window_set_status(struct gui_window *w, const char *text)
|
|||
w->status = realloc(w->status, l);
|
||||
|
||||
strncpy(w->status, text, l);
|
||||
w->status[l-1] = 0;
|
||||
w->status[l] = 0;
|
||||
|
||||
if(input_window == w)
|
||||
window_set_stauts(w->root, (char*)text);
|
||||
|
@ -534,7 +542,7 @@ void gui_window_set_url(struct gui_window *w, const char *url)
|
|||
w->url = realloc(w->url, l);
|
||||
}
|
||||
strncpy(w->url, url, l);
|
||||
|
||||
w->url[l] = 0;
|
||||
if(input_window == w->root->active_gui_window){
|
||||
toolbar_set_url(w->root->toolbar, url);
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#ifndef NS_ATARI_GUI_H_
|
||||
#define NS_ATARI_GUI_H_
|
||||
|
||||
#include "atari/redrawslots.h"
|
||||
#include "atari/gemtk/gemtk.h"
|
||||
|
||||
struct point_s {
|
||||
|
@ -104,6 +105,7 @@ struct s_gui_win_root
|
|||
char * title;
|
||||
struct bitmap * icon;
|
||||
struct gui_window *active_gui_window;
|
||||
struct s_redrw_slots redraw_slots;
|
||||
/* current size of window on screen: */
|
||||
GRECT loc;
|
||||
};
|
||||
|
|
|
@ -23,10 +23,16 @@
|
|||
|
||||
void redraw_slots_init(struct s_redrw_slots * slots, short size)
|
||||
{
|
||||
// TODO: allocate slots dynamically!
|
||||
slots->size = MIN( MAX_REDRW_SLOTS , size);
|
||||
slots->areas_used = 0;
|
||||
}
|
||||
|
||||
void redraw_slots_free(struct s_redrw_slots * slots)
|
||||
{
|
||||
// TOOD: free areas...
|
||||
}
|
||||
|
||||
|
||||
static inline bool rect_intersect( struct rect * box1, struct rect * box2 )
|
||||
{
|
||||
|
@ -44,10 +50,19 @@ static inline bool rect_intersect( struct rect * box1, struct rect * box2 )
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void redraw_slot_schedule_grect(struct s_redrw_slots * slots, GRECT *area)
|
||||
{
|
||||
redraw_slot_schedule(slots, area->g_x, area->g_y,
|
||||
area->g_x + area->g_w, area->g_y + area->g_h);
|
||||
}
|
||||
|
||||
/*
|
||||
schedule redraw coords, coords are relative.
|
||||
schedule redraw coords.
|
||||
*/
|
||||
void redraw_slot_schedule(struct s_redrw_slots * slots, short x0, short y0, short x1, short y1)
|
||||
void redraw_slot_schedule(struct s_redrw_slots * slots, short x0, short y0,
|
||||
short x1, short y1)
|
||||
{
|
||||
int i;
|
||||
struct rect area;
|
||||
|
@ -94,3 +109,12 @@ void redraw_slot_schedule(struct s_redrw_slots * slots, short x0, short y0, shor
|
|||
done:
|
||||
return;
|
||||
}
|
||||
|
||||
void redraw_slots_remove_area(struct s_redrw_slots * slots, int i)
|
||||
{
|
||||
int x;
|
||||
for(x = i+1; i<slots->areas_used; x++){
|
||||
slots->areas[x-1] = slots->areas[x];
|
||||
}
|
||||
slots->areas_used--;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,10 @@
|
|||
#ifndef ATARI_REDRAW_SLOTS_H
|
||||
#define ATARI_REDRAW_SLOTS_H
|
||||
|
||||
#include <mt_gem.h>
|
||||
#include "utils/types.h"
|
||||
|
||||
|
||||
/*
|
||||
MAX_REDRW_SLOTS
|
||||
This is the number of redraw requests that the slotlist can store.
|
||||
|
@ -40,7 +44,10 @@ struct s_redrw_slots
|
|||
};
|
||||
|
||||
void redraw_slots_init(struct s_redrw_slots * slots, short size);
|
||||
void redraw_slot_schedule(struct s_redrw_slots * slots, short x0, short y0, short x1, short y1);
|
||||
|
||||
void redraw_slot_schedule(struct s_redrw_slots * slots, short x0, short y0,
|
||||
short x1, short y1);
|
||||
void redraw_slot_schedule_grect(struct s_redrw_slots * slots, GRECT *area);
|
||||
void redraw_slots_remove_area(struct s_redrw_slots * slots, int i);
|
||||
void redraw_slots_free(struct s_redrw_slots * slots);
|
||||
|
||||
#endif
|
||||
|
|
139
atari/rootwin.c
139
atari/rootwin.c
|
@ -56,6 +56,7 @@
|
|||
#include "atari/search.h"
|
||||
#include "atari/osspec.h"
|
||||
#include "atari/encoding.h"
|
||||
#include "atari/redrawslots.h"
|
||||
#include "atari/toolbar.h"
|
||||
#include "atari/gemtk/gemtk.h"
|
||||
|
||||
|
@ -167,6 +168,7 @@ int window_create(struct gui_window * gw,
|
|||
int err = 0;
|
||||
bool tb, sb;
|
||||
int flags;
|
||||
short aes_handle;
|
||||
|
||||
tb = (inflags & WIDGET_TOOLBAR);
|
||||
sb = (inflags & WIDGET_STATUSBAR);
|
||||
|
@ -188,7 +190,8 @@ int window_create(struct gui_window * gw,
|
|||
memset( gw->root, 0, sizeof(struct s_gui_win_root) );
|
||||
gw->root->title = malloc(atari_sysinfo.aes_max_win_title_len+1);
|
||||
// TODO: use desk size
|
||||
short aes_handle = wind_create(flags, 40, 40, app.w, app.h);
|
||||
|
||||
aes_handle = wind_create(flags, 40, 40, app.w, app.h);
|
||||
if(aes_handle<0) {
|
||||
free(gw->root->title);
|
||||
free(gw->root);
|
||||
|
@ -215,11 +218,14 @@ int window_create(struct gui_window * gw,
|
|||
gw->root->statusbar = NULL;
|
||||
}
|
||||
|
||||
// Setup some window defaults:
|
||||
wind_set_str(aes_handle, WF_ICONTITLE, (char*)"NetSurf");
|
||||
wind_set(aes_handle, WF_OPTS, 1, WO0_FULLREDRAW, 0, 0);
|
||||
wind_set(aes_handle, WF_OPTS, 1, WO0_NOBLITW, 0, 0);
|
||||
wind_set(aes_handle, WF_OPTS, 1, WO0_NOBLITH, 0, 0);
|
||||
|
||||
redraw_slots_init(&gw->root->redraw_slots, 8);
|
||||
|
||||
guiwin_set_toolbar(gw->root->win, get_tree(TOOLBAR), 0, 0);
|
||||
struct rootwin_data_s * data = malloc(sizeof(struct rootwin_data_s));
|
||||
data->rootwin = gw->root;
|
||||
|
@ -250,6 +256,7 @@ void window_unref_gui_window(ROOTWIN *rootwin, struct gui_window *gw)
|
|||
}
|
||||
if(input_window == NULL){
|
||||
// the last gui window for this rootwin was removed:
|
||||
redraw_slots_free(&rootwin->redraw_slots);
|
||||
window_destroy(rootwin);
|
||||
}
|
||||
}
|
||||
|
@ -294,7 +301,7 @@ int window_destroy(ROOTWIN *rootwin)
|
|||
|
||||
void window_open(ROOTWIN *rootwin, GRECT pos)
|
||||
{
|
||||
GRECT br;
|
||||
GRECT br, g;
|
||||
|
||||
short aes_handle = guiwin_get_handle(rootwin->win);
|
||||
wind_open(aes_handle, pos.g_x, pos.g_y, pos.g_w, pos.g_h );
|
||||
|
@ -304,6 +311,8 @@ void window_open(ROOTWIN *rootwin, GRECT pos)
|
|||
if(rootwin->statusbar != NULL) {
|
||||
sb_attach(rootwin->statusbar, rootwin->active_gui_window);
|
||||
}
|
||||
guiwin_get_grect(rootwin->win, GUIWIN_AREA_TOOLBAR, &g);
|
||||
toolbar_set_dimensions(rootwin->toolbar, &g);
|
||||
/*TBD: get already present content and set size? */
|
||||
input_window = rootwin->active_gui_window;
|
||||
window_set_focus(rootwin, BROWSER, rootwin->active_gui_window->browser);
|
||||
|
@ -465,6 +474,67 @@ void window_redraw_favicon(ROOTWIN *rootwin, GRECT *clip)
|
|||
}
|
||||
}
|
||||
|
||||
void window_schedule_redraw_grect(ROOTWIN *rootwin, GRECT *area)
|
||||
{
|
||||
GRECT work;
|
||||
|
||||
guiwin_get_grect(rootwin->win, GUIWIN_AREA_WORK, &work);
|
||||
rc_intersect(area, &work);
|
||||
redraw_slot_schedule_grect(&rootwin->redraw_slots, &work);
|
||||
}
|
||||
|
||||
/*
|
||||
bool window_requires_redraw(ROOTWIN * rootwin)
|
||||
{
|
||||
if (rootwin->redraw_slots.areas_used > 0)
|
||||
return(true);
|
||||
|
||||
return(false);
|
||||
}
|
||||
*/
|
||||
|
||||
void window_process_redraws(ROOTWIN * rootwin)
|
||||
{
|
||||
GRECT work, visible_ro, tb_area = {0,0,0,0};
|
||||
short aes_handle, i;
|
||||
bool toolbar_rdrw_required;
|
||||
|
||||
aes_handle = guiwin_get_handle(rootwin->win);
|
||||
|
||||
guiwin_get_grect(rootwin->win, GUIWIN_AREA_TOOLBAR, &tb_area);
|
||||
|
||||
while(plot_lock() == false);
|
||||
|
||||
wind_get_grect(aes_handle, WF_FIRSTXYWH, &visible_ro);
|
||||
while (visible_ro.g_w > 0 && visible_ro.g_h > 0) {
|
||||
|
||||
// TODO: optimze the rectangle list -
|
||||
// remove rectangles which were completly inside the visible area.
|
||||
// that way we don't have to loop over again...
|
||||
for(i=0; i<rootwin->redraw_slots.areas_used; i++){
|
||||
|
||||
GRECT rdrw_area = {
|
||||
rootwin->redraw_slots.areas[i].x0,
|
||||
rootwin->redraw_slots.areas[i].y0,
|
||||
rootwin->redraw_slots.areas[i].x1 +
|
||||
rootwin->redraw_slots.areas[i].x0,
|
||||
rootwin->redraw_slots.areas[i].y1 +
|
||||
rootwin->redraw_slots.areas[i].y0
|
||||
};
|
||||
GRECT visible = visible_ro;
|
||||
|
||||
rc_intersect(&rdrw_area, &visible);
|
||||
if (rc_intersect(&tb_area, &visible)) {
|
||||
toolbar_redraw(rootwin->toolbar, &visible);
|
||||
}
|
||||
}
|
||||
wind_get_grect(aes_handle, WF_NEXTXYWH, &visible_ro);
|
||||
}
|
||||
rootwin->redraw_slots.areas_used = 0;
|
||||
|
||||
plot_unlock();
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* Event Handlers: */
|
||||
|
@ -632,54 +702,16 @@ static void redraw(GUIWIN *win, short msg[8])
|
|||
GRECT clip = {msg[4], msg[5], msg[6], msg[7]};
|
||||
window_redraw_favicon(rootwin, &clip);
|
||||
} else {
|
||||
GRECT content_area, tb_area;
|
||||
short pxy[8];
|
||||
window_schedule_redraw_grect(rootwin, &clip);
|
||||
|
||||
guiwin_get_grect(win, GUIWIN_AREA_CONTENT, &content_area);
|
||||
guiwin_get_grect(win, GUIWIN_AREA_TOOLBAR, &tb_area);
|
||||
|
||||
if (rc_intersect(&tb_area, &clip)) {
|
||||
toolbar_set_dimensions(rootwin->toolbar, &tb_area);
|
||||
toolbar_redraw(rootwin->toolbar, clip);
|
||||
}
|
||||
|
||||
CMP_BROWSER browser = rootwin->active_gui_window->browser;
|
||||
if (browser->reformat_pending == true) {
|
||||
browser_window_reformat(browser->bw, false, content_area.g_w,
|
||||
content_area.g_h );
|
||||
} else {
|
||||
if(rc_intersect(&content_area, &clip)){
|
||||
|
||||
GRECT lclip = content_area;
|
||||
|
||||
/* convert redraw coords to framebuffer coords: */
|
||||
lclip.g_x -= content_area.g_x;
|
||||
lclip.g_y -= content_area.g_y;
|
||||
|
||||
if( lclip.g_x < 0 ) {
|
||||
lclip.g_w = content_area.g_w + lclip.g_x;
|
||||
lclip.g_x = 0;
|
||||
}
|
||||
|
||||
if( lclip.g_y < 0 ) {
|
||||
lclip.g_h = content_area.g_h + lclip.g_y;
|
||||
lclip.g_y = 0;
|
||||
}
|
||||
|
||||
browser_schedule_redraw(rootwin->active_gui_window,
|
||||
lclip.g_x, lclip.g_y,
|
||||
lclip.g_x + lclip.g_w,
|
||||
lclip.g_y + lclip.g_h);
|
||||
}
|
||||
}
|
||||
|
||||
//guiwin_clear(win);
|
||||
// TODO: remove this call when browser redraw is implemented:
|
||||
guiwin_clear(win);
|
||||
}
|
||||
}
|
||||
|
||||
static void resized(GUIWIN *win)
|
||||
{
|
||||
short x,y,w,h;
|
||||
GRECT g;
|
||||
short handle;
|
||||
struct gui_window *gw;
|
||||
struct rootwin_data_s *data = guiwin_get_user_data(win);
|
||||
|
@ -700,22 +732,23 @@ static void resized(GUIWIN *win)
|
|||
return;
|
||||
//assert( gw != NULL );
|
||||
|
||||
wind_get(handle, WF_CURRXYWH, &x, &y, &w, &h);
|
||||
wind_get_grect(handle, WF_CURRXYWH, &g);
|
||||
|
||||
if (rootwin->loc.g_w != w || rootwin->loc.g_h != h) {
|
||||
if (rootwin->loc.g_w != g.g_w || rootwin->loc.g_h != g.g_h) {
|
||||
if ( gw->browser->bw->current_content != NULL ) {
|
||||
/* Reformat will happen when redraw is processed: */
|
||||
// TODO: call reformat directly, this was introduced because
|
||||
// of bad AES knowledge, it's ok to call it directly here...
|
||||
rootwin->active_gui_window->browser->reformat_pending = true;
|
||||
}
|
||||
}
|
||||
if (rootwin->loc.g_x != x || rootwin->loc.g_y != y) {
|
||||
// moved
|
||||
}
|
||||
// if (rootwin->loc.g_x != g.g_x || rootwin->loc.g_y != g.g_y) {
|
||||
// // moved
|
||||
// }
|
||||
|
||||
rootwin->loc.g_x = x;
|
||||
rootwin->loc.g_y = y;
|
||||
rootwin->loc.g_w = w;
|
||||
rootwin->loc.g_h = h;
|
||||
rootwin->loc = g;
|
||||
guiwin_get_grect(win, GUIWIN_AREA_TOOLBAR, &g);
|
||||
toolbar_set_dimensions(rootwin->toolbar, &g);
|
||||
}
|
||||
|
||||
static void __CDECL file_dropped(GUIWIN *win, short msg[8])
|
||||
|
|
|
@ -68,6 +68,8 @@ void window_set_stauts(struct s_gui_win_root * rootwin, char * text);
|
|||
void window_set_title(struct s_gui_win_root * rootwin, char * text);
|
||||
void window_set_icon(struct s_gui_win_root * rootwin, struct bitmap * bmp );
|
||||
void window_set_active_gui_window(ROOTWIN *rootwin, struct gui_window *gw);
|
||||
void window_schedule_redraw_grect(ROOTWIN *rootwin, GRECT *area);
|
||||
void window_process_redraws(ROOTWIN * rootwin);
|
||||
struct gui_window * window_get_active_gui_window(ROOTWIN * rootwin);
|
||||
void window_redraw_favicon(struct s_gui_win_root * rootwin, GRECT *clip);
|
||||
void window_unref_gui_window(ROOTWIN *rootwin, struct gui_window *gw);
|
||||
|
|
|
@ -182,7 +182,7 @@ void sb_destroy( CMP_STATUSBAR s )
|
|||
}
|
||||
}
|
||||
|
||||
void sb_set_text( CMP_STATUSBAR sb , char * text )
|
||||
void sb_set_text(CMP_STATUSBAR sb , const char * text)
|
||||
{
|
||||
|
||||
LGRECT work;
|
||||
|
@ -221,11 +221,11 @@ void sb_destroy( CMP_STATUSBAR s )
|
|||
|
||||
void sb_attach(CMP_STATUSBAR sb, struct gui_window * gw)
|
||||
{
|
||||
sb->aes_win = gw->root->handle->handle;
|
||||
sb->aes_win = guiwin_get_handle(gw->root->win);
|
||||
sb->attached = true;
|
||||
}
|
||||
|
||||
void sb_set_text(CMP_STATUSBAR sb, char * text )
|
||||
void sb_set_text(CMP_STATUSBAR sb, const char * text )
|
||||
{
|
||||
assert( sb != NULL );
|
||||
strncpy(sb->text, text, STATUSBAR_MAX_SLEN);
|
||||
|
|
|
@ -36,6 +36,6 @@ struct s_statusbar
|
|||
|
||||
CMP_STATUSBAR sb_create( struct gui_window * gw );
|
||||
void sb_destroy( CMP_STATUSBAR s );
|
||||
void sb_set_text( CMP_STATUSBAR sb , char * text );
|
||||
void sb_set_text( CMP_STATUSBAR sb , const char * text );
|
||||
void sb_attach(CMP_STATUSBAR sb, struct gui_window * gw);
|
||||
#endif
|
||||
|
|
|
@ -117,6 +117,7 @@ struct s_toolbar
|
|||
int btcnt;
|
||||
int style;
|
||||
bool redraw;
|
||||
bool reflow;
|
||||
};
|
||||
|
||||
extern char * option_homepage_url;
|
||||
|
@ -410,6 +411,8 @@ void toolbar_destroy(struct s_toolbar *tb)
|
|||
|
||||
static void toolbar_objc_reflow(struct s_toolbar *tb)
|
||||
{
|
||||
|
||||
// position toolbar areas:
|
||||
aes_toolbar->ob_x = tb->area.g_x;
|
||||
aes_toolbar->ob_y = tb->area.g_y;
|
||||
aes_toolbar->ob_width = tb->area.g_w;
|
||||
|
@ -421,13 +424,6 @@ static void toolbar_objc_reflow(struct s_toolbar *tb)
|
|||
aes_toolbar[TOOLBAR_URL_AREA].ob_width = tb->area.g_w
|
||||
- (aes_toolbar[TOOLBAR_NAVIGATION_AREA].ob_width
|
||||
+ aes_toolbar[TOOLBAR_THROBBER_AREA].ob_width);
|
||||
}
|
||||
|
||||
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
|
||||
{
|
||||
// position toolbar areas:
|
||||
toolbar_objc_reflow(tb);
|
||||
objc_draw_grect(aes_toolbar,0,8,clip);
|
||||
|
||||
// position throbber image:
|
||||
throbber_form[tb->throbber.index].ob_x = tb->area.g_x +
|
||||
|
@ -442,10 +438,17 @@ void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
|
|||
((aes_toolbar[TOOLBAR_THROBBER_AREA].ob_height
|
||||
- throbber_form[tb->throbber.index].ob_height) >> 1);
|
||||
|
||||
printf("x pos: %d, y pos: %d\n", throbber_form[tb->throbber.index].ob_x,
|
||||
throbber_form[tb->throbber.index].ob_y);
|
||||
objc_draw_grect(&throbber_form[tb->throbber.index], 0, 1, clip);
|
||||
tb->reflow = false;
|
||||
}
|
||||
|
||||
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip)
|
||||
{
|
||||
if(tb->reflow == true)
|
||||
toolbar_objc_reflow(tb);
|
||||
|
||||
objc_draw_grect(aes_toolbar,0,8,clip);
|
||||
|
||||
objc_draw_grect(&throbber_form[tb->throbber.index], 0, 1, clip);
|
||||
}
|
||||
|
||||
|
||||
|
@ -459,9 +462,7 @@ void toolbar_update_buttons(struct s_toolbar *tb, struct browser_window *bw,
|
|||
void toolbar_set_dimensions(struct s_toolbar *tb, GRECT *area)
|
||||
{
|
||||
tb->area = *area;
|
||||
if (img_toolbar != 0) {
|
||||
toolbar_reflow(tb);
|
||||
}
|
||||
tb->reflow = true;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ void toolbar_update_buttons(struct s_toolbar *tb, struct browser_window *bw,
|
|||
void toolbar_get_grect(struct s_toolbar *tb, short which, short opt, GRECT *g);
|
||||
struct text_area *toolbar_get_textarea(struct s_toolbar *tb,
|
||||
enum toolbar_textarea which);
|
||||
void toolbar_redraw(struct s_toolbar *tb, GRECT *clip);
|
||||
/* public events handlers: */
|
||||
void toolbar_back_click(struct s_toolbar *tb);
|
||||
void toolbar_reload_click(struct s_toolbar *tb);
|
||||
|
|
Loading…
Reference in New Issue