void ami_history_redraw(struct history_window *hw) { struct IBox *bbox; ULONG xs,ys; struct redraw_context ctx = { .interactive = true, .background_images = true, .plot = &amiplot }; GetAttr(SPACE_AreaBox,hw->objects[GID_BROWSER],(ULONG *)&bbox); GetAttr(SCROLLER_Top,hw->objects[OID_HSCROLL],(ULONG *)&xs); GetAttr(SCROLLER_Top,hw->objects[OID_VSCROLL],(ULONG *)&ys); glob = &hw->gg; SetRPAttrs(glob->rp, RPTAG_APenColor, 0xffffffff, TAG_DONE); RectFill(glob->rp, 0, 0, bbox->Width - 1, bbox->Height - 1); history_redraw_rectangle(history_current, xs, ys, bbox->Width + xs, bbox->Height + ys, 0, 0, &ctx); glob = &browserglob; ami_clearclipreg(&hw->gg); ami_history_update_extent(hw); BltBitMapRastPort(hw->gg.bm, 0, 0, hw->win->RPort, bbox->Left, bbox->Top, bbox->Width, bbox->Height, 0x0C0); } /** * Handle mouse clicks in the history window. * * \return true if the event was handled, false to pass it on */ bool ami_history_click(struct history_window *hw,uint16 code) { int x, y; struct IBox *bbox; ULONG width,height,xs,ys; GetAttr(SPACE_AreaBox,hw->objects[GID_BROWSER],(ULONG *)&bbox); GetAttr(SCROLLER_Top,hw->objects[OID_HSCROLL],(ULONG *)&xs); x = hw->win->MouseX - bbox->Left +xs; GetAttr(SCROLLER_Top,hw->objects[OID_VSCROLL],(ULONG *)&ys); y = hw->win->MouseY - bbox->Top + ys; width=bbox->Width; height=bbox->Height; switch(code) { case SELECTUP: history_click(hw->bw,history_current,x,y,false); ami_history_redraw(hw); ami_do_redraw(hw->bw->window->shared); break; case MIDDLEUP: history_click(hw->bw,history_current,x,y,true); ami_history_redraw(hw); break; } return true; }
static void ami_history_redraw(struct history_window *hw) { struct IBox *bbox; ULONG xs,ys; struct redraw_context ctx = { .interactive = true, .background_images = true, .plot = &amiplot }; GetAttr(SCROLLER_Top,hw->objects[OID_HSCROLL],(ULONG *)&xs); GetAttr(SCROLLER_Top,hw->objects[OID_VSCROLL],(ULONG *)&ys); if(ami_gui_get_space_box(hw->objects[GID_BROWSER], &bbox) != NSERROR_OK) { amiga_warn_user("NoMemory", ""); return; } glob = hw->gg; SetRPAttrs(glob->rp, RPTAG_APenColor, 0xffffffff, TAG_DONE); RectFill(glob->rp, 0, 0, bbox->Width - 1, bbox->Height - 1); browser_window_history_redraw_rectangle(hw->gw->bw, xs, ys, bbox->Width + xs, bbox->Height + ys, 0, 0, &ctx); ami_gui_set_default_gg(); ami_clearclipreg(hw->gg); ami_history_update_extent(hw); BltBitMapRastPort(hw->gg->bm, 0, 0, hw->win->RPort, bbox->Left, bbox->Top, bbox->Width, bbox->Height, 0x0C0); ami_gui_free_space_box(bbox); } /* exported interface documented in amiga/history_local.h */ void ami_history_open(struct gui_window *gw) { struct history *history; int width, height; if (gw->bw == NULL) return; history = browser_window_get_history(gw->bw); if (history == NULL) return; if(!gw->hw) { gw->hw = ami_misc_allocvec_clear(sizeof(struct history_window), 0); gw->hw->gg = ami_misc_allocvec_clear(sizeof(struct gui_globals), 0); ami_init_layers(gw->hw->gg, scrn->Width, scrn->Height, false); gw->hw->gw = gw; browser_window_history_size(gw->bw, &width, &height); gw->hw->scrollerhook.h_Entry = (void *)ami_history_scroller_hook; gw->hw->scrollerhook.h_Data = gw->hw; gw->hw->objects[OID_MAIN] = WindowObj, WA_ScreenTitle, ami_gui_get_screen_title(), WA_Title, messages_get("History"), WA_Activate, TRUE, WA_DepthGadget, TRUE, WA_DragBar, TRUE, WA_CloseGadget, TRUE, WA_SizeGadget, TRUE, WA_PubScreen,scrn, WA_InnerWidth,width, WA_InnerHeight,height + 10, WINDOW_SharedPort,sport, WINDOW_UserData,gw->hw, WINDOW_IconifyGadget, FALSE, WINDOW_GadgetHelp, TRUE, WINDOW_Position, WPOS_CENTERSCREEN, WINDOW_HorizProp,1, WINDOW_VertProp,1, WINDOW_IDCMPHook,&gw->hw->scrollerhook, WINDOW_IDCMPHookBits,IDCMP_IDCMPUPDATE, // WA_ReportMouse,TRUE, WA_IDCMP,IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE, // | IDCMP_MOUSEMOVE, WINDOW_ParentGroup, gw->hw->objects[GID_MAIN] = LayoutVObj, LAYOUT_AddChild, gw->hw->objects[GID_BROWSER] = SpaceObj, GA_ID,GID_BROWSER, // SPACE_MinWidth,width, // SPACE_MinHeight,height, SpaceEnd, EndGroup, EndWindow; gw->hw->win = (struct Window *)RA_OpenWindow(gw->hw->objects[OID_MAIN]); gw->hw->node = AddObject(window_list,AMINS_HISTORYWINDOW); gw->hw->node->objstruct = gw->hw; GetAttr(WINDOW_HorizObject,gw->hw->objects[OID_MAIN],(ULONG *)&gw->hw->objects[OID_HSCROLL]); GetAttr(WINDOW_VertObject,gw->hw->objects[OID_MAIN],(ULONG *)&gw->hw->objects[OID_VSCROLL]); RefreshSetGadgetAttrs((APTR)gw->hw->objects[OID_VSCROLL],gw->hw->win,NULL, GA_ID,OID_VSCROLL, SCROLLER_Top,0, ICA_TARGET,ICTARGET_IDCMP, TAG_DONE); RefreshSetGadgetAttrs((APTR)gw->hw->objects[OID_HSCROLL],gw->hw->win,NULL, GA_ID,OID_HSCROLL, SCROLLER_Top,0, ICA_TARGET,ICTARGET_IDCMP, TAG_DONE); } ami_history_redraw(gw->hw); } /** * Handle mouse clicks in the history window. * * \return true if the event was handled, false to pass it on */ static bool ami_history_click(struct history_window *hw, uint16 code) { int x, y; struct IBox *bbox; ULONG xs, ys; if(ami_gui_get_space_box(hw->objects[GID_BROWSER], &bbox) != NSERROR_OK) { amiga_warn_user("NoMemory", ""); return false; } GetAttr(SCROLLER_Top,hw->objects[OID_HSCROLL],(ULONG *)&xs); x = hw->win->MouseX - bbox->Left +xs; GetAttr(SCROLLER_Top,hw->objects[OID_VSCROLL],(ULONG *)&ys); y = hw->win->MouseY - bbox->Top + ys; ami_gui_free_space_box(bbox); switch(code) { case SELECTUP: browser_window_history_click(hw->gw->bw, x, y, false); ami_history_redraw(hw); ami_schedule_redraw(hw->gw->shared, true); break; case MIDDLEUP: browser_window_history_click(hw->gw->bw, x, y, true); ami_history_redraw(hw); break; } return true; }
ULONG ami_unicode_text(struct RastPort *rp,const char *string,ULONG length,const plot_font_style_t *fstyle,ULONG dx, ULONG dy) { uint16 *utf16 = NULL, *outf16 = NULL; uint16 utf16charsc = 0, utf16nextsc = 0; uint16 utf16next = 0; int utf16charlen; struct OutlineFont *ofont, *ufont = NULL; ULONG i,gx,gy; UWORD posn; uint32 x=0; uint8 co = 0; int32 tempx = 0; ULONG emwidth = (ULONG)NSA_FONT_EMWIDTH(fstyle->size); if(!string || string[0]=='\0') return 0; if(!length) return 0; if(utf8_to_enc(string,"UTF-16",length,(char **)&utf16) != UTF8_CONVERT_OK) return 0; outf16 = utf16; if(!(ofont = ami_open_outline_font(fstyle, FALSE))) return 0; if(rp) SetRPAttrs(rp,RPTAG_APenColor,p96EncodeColor(RGBFB_A8B8G8R8,fstyle->foreground),TAG_DONE); while(*utf16 != 0) { if (*utf16 < 0xD800 || 0xDFFF < *utf16) utf16charlen = 1; else utf16charlen = 2; utf16next = utf16[utf16charlen]; if(fstyle->flags & FONTF_SMALLCAPS) { utf16charsc = ami_font_translate_smallcaps(*utf16); utf16nextsc = ami_font_translate_smallcaps(utf16next); tempx = ami_font_plot_glyph(ofont, rp, utf16charsc, utf16nextsc, dx + x, dy, emwidth); } else tempx = 0; if(tempx == 0) tempx = ami_font_plot_glyph(ofont, rp, *utf16, utf16next, dx + x, dy, emwidth); if(tempx == 0) { if(ufont == NULL) { ufont = ami_open_outline_font(fstyle, TRUE); } if(ufont) { tempx = ami_font_plot_glyph(ufont, rp, *utf16, utf16next, dx + x, dy, emwidth); } /* if(tempx == 0) { tempx = ami_font_plot_glyph(ofont, rp, 0xfffd, utf16next, dx + x, dy, emwidth); } */ } x += tempx; utf16 += utf16charlen; } free(outf16); return x; }