From 684d452e9cf6620b8b22a4ea71a4894d30e2c11e Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sat, 13 Sep 2008 22:39:48 +0000 Subject: Improved throbber, works independently on multiple windows, stops when it should, no weird crashes, lock-ups etc. The format has changed, Resources/Throbber now needs to be in a picture.datatype format, as a "film strip" of frames with the first image the inactive (stopped throbber) and the rest the active animation. The number of frames needs to be set in the Options file throbber_frames variable (currently - will probably move to a tooltype of Resources/Throbber in the future for better theming ability) svn path=/trunk/netsurf/; revision=5310 --- amiga/gui.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++--------- amiga/gui.h | 4 ++- amiga/options.h | 5 ++- 3 files changed, 94 insertions(+), 17 deletions(-) (limited to 'amiga') diff --git a/amiga/gui.c b/amiga/gui.c index 6efff0b4d..460544ef7 100755 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include "desktop/selection.h" #include "utils/utf8.h" #include "amiga/utf8.h" @@ -95,7 +95,8 @@ struct TimerIFace *ITimer; struct Library *PopupMenuBase = NULL; struct PopupMenuIFace *IPopupMenu = NULL; -Object *throbber = NULL; +struct BitMap *throbber = NULL; +ULONG throbber_width,throbber_height; bool win_destroyed = false; static struct RastPort dummyrp; @@ -127,6 +128,7 @@ char *ptrs[AMI_LASTPOINTER+1] = { "Resources/Pointers/NotAllowed", "Resources/Pointers/Progress"}; +void ami_update_throbber(struct gui_window *g); void ami_update_buttons(struct gui_window *); void ami_scroller_hook(struct Hook *,Object *,struct IntuiMessage *); uint32 ami_popup_hook(struct Hook *hook,Object *item,APTR reserved); @@ -144,6 +146,7 @@ void gui_init(int argc, char** argv) BPTR lock=0; struct RastPort mouseptr; struct IFFHandle *mpiff = NULL; + Object *dto; /* ttengine.library if(!ami_open_tte()) @@ -191,14 +194,6 @@ void gui_init(int argc, char** argv) } } - throbber = NewDTObject("Resources/Throbber", - GA_ID,OID_THROBBER, - GA_ReadOnly,TRUE, - DTA_ControlPanel,FALSE, - DTA_Repeat,TRUE, - DTA_GroupID,GID_ANIMATION, - TAG_DONE); - InitRastPort(&mouseptr); for(i=0;i<=AMI_LASTPOINTER;i++) @@ -342,6 +337,44 @@ void gui_init(int argc, char** argv) hotlist = options_load_tree(option_hotlist_file); if(!hotlist) ami_hotlist_init(&hotlist); + + if(dto = NewDTObject("Resources/Throbber", + DTA_GroupID,GID_PICTURE, + PDTA_DestMode,PMODE_V43, + TAG_DONE)) + { + struct BitMapHeader *throbber_bmh; + struct RastPort throbber_rp; + + if(GetDTAttrs(dto,PDTA_BitMapHeader,&throbber_bmh,TAG_DONE)) + { + throbber_width = throbber_bmh->bmh_Width / option_throbber_frames; + throbber_height = throbber_bmh->bmh_Height; + + InitRastPort(&throbber_rp); + + if(throbber = p96AllocBitMap(throbber_bmh->bmh_Width, + throbber_height,32, + BMF_CLEAR | BMF_DISPLAYABLE | BMF_INTERLEAVED, + NULL,RGBFB_A8R8G8B8)) + { + struct RenderInfo ri; + UBYTE *throbber_tempmem = AllocVec(throbber_bmh->bmh_Width*throbber_height*4,MEMF_CLEAR); + throbber_rp.BitMap = throbber; + ri.Memory = throbber_tempmem; + ri.BytesPerRow = 4*throbber_bmh->bmh_Width; + ri.RGBFormat = RGBFB_A8R8G8B8; + + IDoMethod(dto,PDTM_READPIXELARRAY,ri.Memory,PBPAFMT_ARGB,ri.BytesPerRow,0,0,throbber_bmh->bmh_Width,throbber_height); + + p96WritePixelArray((struct RenderInfo *)&ri,0,0,&throbber_rp,0,0,throbber_bmh->bmh_Width,throbber_height); + + FreeVec(throbber_tempmem); + } + } + DisposeDTObject(dto); + } + } void gui_init2(int argc, char** argv) @@ -657,6 +690,9 @@ void ami_handle_msg(void) if(gwin->redraw_required) ami_do_redraw(gwin); + if(gwin->throbber_frame) + ami_update_throbber(gwin); + node = nnode; } } @@ -854,7 +890,7 @@ void gui_quit(void) { int i; - DisposeDTObject(throbber); + p96FreeBitMap(throbber); urldb_save(option_url_file); urldb_save_cookies(option_cookie_file); @@ -1166,8 +1202,13 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw, GA_ID,GID_URL, GA_RelVerify,TRUE, StringEnd, - LAYOUT_AddChild,throbber, - CHILD_NoDispose,TRUE, + LAYOUT_AddChild, gwin->gadgets[GID_THROBBER] = SpaceObject, + GA_ID,GID_THROBBER, + SPACE_MinWidth,throbber_width, + SPACE_MinHeight,throbber_height, + SpaceEnd, + CHILD_WeightedWidth,0, + CHILD_WeightedHeight,0, LayoutEnd, CHILD_WeightedHeight,0, LAYOUT_AddChild, gwin->gadgets[GID_BROWSER] = SpaceObject, @@ -1590,12 +1631,43 @@ void gui_window_set_url(struct gui_window *g, const char *url) void gui_window_start_throbber(struct gui_window *g) { - IDoMethod(throbber,ADTM_START,0); // g->objects[OID_THROBBER] + struct IBox *bbox; + GetAttr(SPACE_AreaBox,g->gadgets[GID_THROBBER],&bbox); + + g->throbber_frame=1; + + BltBitMapRastPort(throbber,throbber_width,0,g->win->RPort,bbox->Left,bbox->Top,throbber_width,throbber_height,0x0C0); } void gui_window_stop_throbber(struct gui_window *g) { - IDoMethod(throbber,ADTM_STOP,0); + struct IBox *bbox; + GetAttr(SPACE_AreaBox,g->gadgets[GID_THROBBER],&bbox); + + BltBitMapRastPort(throbber,0,0,g->win->RPort,bbox->Left,bbox->Top,throbber_width,throbber_height,0x0C0); + + g->throbber_frame = 0; +} + +void ami_update_throbber(struct gui_window *g) +{ + struct IBox *bbox; + + if(g->throbber_update_count < 1000) + { + g->throbber_update_count++; + return; + } + + g->throbber_update_count = 0; + + GetAttr(SPACE_AreaBox,g->gadgets[GID_THROBBER],&bbox); + + g->throbber_frame++; + if(g->throbber_frame > (option_throbber_frames-1)) + g->throbber_frame=1; + + BltBitMapRastPort(throbber,throbber_width*g->throbber_frame,0,g->win->RPort,bbox->Left,bbox->Top,throbber_width,throbber_height,0x0C0); } void gui_window_place_caret(struct gui_window *g, int x, int y, int height) diff --git a/amiga/gui.h b/amiga/gui.h index b91fd7424..e8c6481c4 100755 --- a/amiga/gui.h +++ b/amiga/gui.h @@ -37,6 +37,7 @@ enum GID_HOME, GID_BACK, GID_FORWARD, + GID_THROBBER, GID_USER, GID_PASS, GID_LOGIN, @@ -50,7 +51,6 @@ enum OID_VSCROLL, OID_HSCROLL, OID_MENU, - OID_THROBBER, OID_LAST }; @@ -84,6 +84,8 @@ struct gui_window { union content_msg_data *redraw_data; browser_mouse_state mouse_state; browser_mouse_state key_state; + int throbber_frame; + ULONG throbber_update_count; int c_x; int c_y; int c_h; diff --git a/amiga/options.h b/amiga/options.h index d6ab89f3a..40ad24d69 100644 --- a/amiga/options.h +++ b/amiga/options.h @@ -28,6 +28,7 @@ extern int option_modeid; extern char *option_toolbar_images; extern bool option_no_iframes; extern bool option_utf8_clipboard; +extern int option_throbber_frames; #define EXTRA_OPTION_DEFINE \ bool option_verbose_log = false; \ @@ -38,6 +39,7 @@ int option_modeid = 0; \ char *option_toolbar_images = 0; \ bool option_no_iframes = false; \ bool option_utf8_clipboard = false; \ +int option_throbber_frames = 1; #define EXTRA_OPTION_TABLE \ { "verbose_log", OPTION_BOOL, &option_verbose_log}, \ @@ -47,5 +49,6 @@ bool option_utf8_clipboard = false; \ { "screen_modeid", OPTION_INTEGER, &option_modeid}, \ { "toolbar_images", OPTION_STRING, &option_toolbar_images }, \ { "no_iframes", OPTION_BOOL, &option_no_iframes}, \ -{ "clipboard_write_utf8", OPTION_BOOL, &option_utf8_clipboard}, +{ "clipboard_write_utf8", OPTION_BOOL, &option_utf8_clipboard}, \ +{ "throbber_frames", OPTION_INTEGER, &option_throbber_frames}, #endif -- cgit v1.2.3