From 48e95ad2b3ede2b6170b635074bf0ee1010dfb39 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Mon, 2 Jan 2017 18:41:40 +0000 Subject: show/hide scrollbars as required move the sslcert scrollbars into the window as per the style guide --- frontends/amiga/corewindow.c | 159 +++++++++++++++++++++++++++++++++++++------ frontends/amiga/corewindow.h | 7 ++ frontends/amiga/gui.c | 10 +-- frontends/amiga/sslcert.c | 30 +++++--- 4 files changed, 173 insertions(+), 33 deletions(-) (limited to 'frontends') diff --git a/frontends/amiga/corewindow.c b/frontends/amiga/corewindow.c index 024e768b9..df2bc1d7c 100644 --- a/frontends/amiga/corewindow.c +++ b/frontends/amiga/corewindow.c @@ -47,9 +47,11 @@ #include #include +#include #include #include +#include #include #include #include @@ -62,6 +64,25 @@ #include "amiga/schedule.h" #include "amiga/utf8.h" +static void +ami_cw_scroller_top(struct ami_corewindow *ami_cw, ULONG *restrict x, ULONG *restrict y) +{ + ULONG xs = 0; + ULONG ys = 0; + + if(ami_cw->scroll_x_visible == true) { + GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_HSCROLL], (ULONG *)&xs); + } + + if(ami_cw->scroll_y_visible == true) { + GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_VSCROLL], (ULONG *)&ys); + } + + *x = xs; + *y = ys; +} + + /** * Convert co-ordinates relative to space.gadget * into document co-ordinates @@ -73,10 +94,10 @@ static void ami_cw_coord_amiga_to_ns(struct ami_corewindow *ami_cw, int *restrict x, int *restrict y) { - ULONG xs, ys; + ULONG xs = 0; + ULONG ys = 0; - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_HSCROLL], (ULONG *)&xs); - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_VSCROLL], (ULONG *)&ys); + ami_cw_scroller_top(ami_cw, &xs, &ys); *x = *x + xs; *y = *y + ys; @@ -109,8 +130,7 @@ ami_cw_mouse_pos(struct ami_corewindow *ami_cw, int *restrict x, int *restrict y if((xm < 0) || (ym < 0) || (xm > bbox->Width) || (ym > bbox->Height)) return false; - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_HSCROLL], (ULONG *)&xs); - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_VSCROLL], (ULONG *)&ys); + ami_cw_scroller_top(ami_cw, &xs, &ys); xm += xs; ym += ys; @@ -120,6 +140,60 @@ ami_cw_mouse_pos(struct ami_corewindow *ami_cw, int *restrict x, int *restrict y return true; } +static void +ami_cw_toggle_scrollbar(struct ami_corewindow *ami_cw, bool vert, bool visible) +{ + Object *scroller; + Object *layout; + ULONG tag; + + if(vert == true) { + if(visible == ami_cw->scroll_y_visible) { + return; + } else { + scroller = ami_cw->objects[GID_CW_VSCROLL]; + layout = ami_cw->objects[GID_CW_VSCROLLLAYOUT]; + tag = WINDOW_VertProp; + ami_cw->scroll_y_visible = visible; + } + } else { + if(visible == ami_cw->scroll_x_visible) { + return; + } else { + scroller = ami_cw->objects[GID_CW_HSCROLL]; + layout = ami_cw->objects[GID_CW_HSCROLLLAYOUT]; + tag = WINDOW_HorizProp; + ami_cw->scroll_x_visible = visible; + } + } + + if(visible == true) { + if(ami_cw->in_border_scroll == true) { + SetAttrs(ami_cw->objects[GID_CW_WIN], + tag, 1, + TAG_DONE); + } else { +#ifdef __amigaos4__ + IDoMethod(layout, LM_ADDCHILD, ami_cw->win, scroller, NULL); +#else + SetAttrs(layout, LAYOUT_AddChild, scroller, TAG_DONE); +#endif + } + } else { + if(ami_cw->in_border_scroll == true) { + SetAttrs(ami_cw->objects[GID_CW_WIN], + tag, -1, + TAG_DONE); + } else { +#ifdef __amigaos4__ + IDoMethod(layout, LM_REMOVECHILD, ami_cw->win, scroller); +#else + SetAttrs(layout, LAYOUT_RemoveChild, scroller, TAG_DONE); +#endif + } + } +} + /* handle keypress */ static void ami_cw_key(struct ami_corewindow *ami_cw, int nskey) @@ -176,8 +250,7 @@ ami_cw_redraw_rect(struct ami_corewindow *ami_cw, struct rect *r) return; } - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_HSCROLL], (ULONG *)&pos_x); - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_VSCROLL], (ULONG *)&pos_y); + ami_cw_scroller_top(ami_cw, &pos_x, &pos_y); glob = &ami_cw->gg; @@ -376,7 +449,7 @@ ami_cw_event(void *w) int nskey; int key_state = 0; struct timeval curtime; - int x, y; + int x = 0, y = 0; while((result = RA_HandleInput(ami_cw->objects[GID_CW_WIN], &code)) != WMHI_LASTMSG) { switch(result & WMHI_CLASSMASK) { @@ -524,12 +597,22 @@ static void ami_cw_update_size(struct core_window *cw, int width, int height) { struct ami_corewindow *ami_cw = (struct ami_corewindow *)cw; - - /* I'm assuming this is telling me the new page size, not wanting the window physically resized */ int win_w, win_h; + ami_cw_get_window_dimensions((struct core_window *)ami_cw, &win_w, &win_h); + if(width == -1) { + ami_cw_toggle_scrollbar(ami_cw, false, false); + return; + } + + if(height == -1) { + ami_cw_toggle_scrollbar(ami_cw, true, false); + return; + } + if(ami_cw->objects[GID_CW_VSCROLL]) { + ami_cw_toggle_scrollbar(ami_cw, true, true); RefreshSetGadgetAttrs((struct Gadget *)ami_cw->objects[GID_CW_VSCROLL], ami_cw->win, NULL, SCROLLER_Total, (ULONG)height, SCROLLER_Visible, win_h, @@ -537,11 +620,23 @@ ami_cw_update_size(struct core_window *cw, int width, int height) } if(ami_cw->objects[GID_CW_HSCROLL]) { + ami_cw_toggle_scrollbar(ami_cw, false, true); RefreshSetGadgetAttrs((struct Gadget *)ami_cw->objects[GID_CW_HSCROLL], ami_cw->win, NULL, SCROLLER_Total, (ULONG)width, SCROLLER_Visible, win_w, TAG_DONE); } + +#if 0 + /* in-window scrollbars aren't getting hidden until the window is resized + * this code should fix it, but it isn't working */ + FlushLayoutDomainCache((struct Gadget *)ami_cw->objects[GID_CW_WIN]); + RethinkLayout((struct Gadget *)ami_cw->objects[GID_CW_WIN], + ami_cw->win, NULL, TRUE); + + /* probably need to redraw here */ + ami_cw_redraw(ami_cw, NULL); +#endif } @@ -553,13 +648,12 @@ ami_cw_scroll_visible(struct core_window *cw, const struct rect *r) int scrollsetx; int scrollsety; int win_w = 0, win_h = 0; - int win_x0, win_x1; - int win_y0, win_y1; + ULONG win_x0, win_y0; + int win_x1, win_y1; ami_cw_get_window_dimensions((struct core_window *)ami_cw, &win_w, &win_h); - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_VSCROLL], (ULONG *)&win_y0); - GetAttr(SCROLLER_Top, ami_cw->objects[GID_CW_HSCROLL], (ULONG *)&win_x0); + ami_cw_scroller_top(ami_cw, &win_x0, &win_y0); win_x1 = win_x0 + win_w; win_y1 = win_y0 + win_h; @@ -569,13 +663,17 @@ ami_cw_scroll_visible(struct core_window *cw, const struct rect *r) if(r->x1 > win_x1) scrollsetx = r->x1 - win_w; if(r->x0 < win_x0) scrollsetx = r->x0; - RefreshSetGadgetAttrs((APTR)ami_cw->objects[GID_CW_VSCROLL], ami_cw->win, NULL, - SCROLLER_Top, scrollsety, - TAG_DONE); + if(ami_cw->scroll_y_visible == true) { + RefreshSetGadgetAttrs((APTR)ami_cw->objects[GID_CW_VSCROLL], ami_cw->win, NULL, + SCROLLER_Top, scrollsety, + TAG_DONE); + } - RefreshSetGadgetAttrs((APTR)ami_cw->objects[GID_CW_HSCROLL], ami_cw->win, NULL, - SCROLLER_Top, scrollsetx, - TAG_DONE); + if(ami_cw->scroll_x_visible == true) { + RefreshSetGadgetAttrs((APTR)ami_cw->objects[GID_CW_HSCROLL], ami_cw->win, NULL, + SCROLLER_Top, scrollsetx, + TAG_DONE); + } /* probably need to redraw here */ ami_cw_redraw(ami_cw, NULL); @@ -608,6 +706,9 @@ nserror ami_corewindow_init(struct ami_corewindow *ami_cw) ami_cw->mouse_state = BROWSER_MOUSE_HOVER; ami_cw->lastclick.tv_sec = 0; ami_cw->lastclick.tv_usec = 0; + ami_cw->scroll_x_visible = true; + ami_cw->scroll_y_visible = true; + ami_cw->in_border_scroll = false; /* allocate drawing area etc */ ami_init_layers(&ami_cw->gg, 0, 0, false); @@ -635,6 +736,8 @@ nserror ami_corewindow_init(struct ami_corewindow *ami_cw) GA_ID, GID_CW_HSCROLL, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); + + ami_cw->in_border_scroll = true; } if(ami_cw->objects[GID_CW_VSCROLL] == NULL) { @@ -645,6 +748,8 @@ nserror ami_corewindow_init(struct ami_corewindow *ami_cw) GA_ID, GID_CW_VSCROLL, ICA_TARGET, ICTARGET_IDCMP, TAG_DONE); + + ami_cw->in_border_scroll = true; } return NSERROR_OK; @@ -662,6 +767,20 @@ nserror ami_corewindow_fini(struct ami_corewindow *ami_cw) ami_cw->win = NULL; DisposeObject(ami_cw->objects[GID_CW_WIN]); +#if 0 + /* ensure our scrollbars are destroyed */ + /* it appears these are disposed anyway, + * even if the gadgets are no longer attached to the window */ + if(ami_cw->in_border_scroll == false) { + if(ami_cw->scroll_x_visible == false) { + DisposeObject(ami_cw->objects[GID_CW_HSCROLL]); + } + if(ami_cw->scroll_y_visible == false) { + DisposeObject(ami_cw->objects[GID_CW_VSCROLL]); + } + } +#endif + /* release off-screen bitmap stuff */ ami_plot_release_pens(ami_cw->gg.shared_pens); ami_free_layers(&ami_cw->gg); diff --git a/frontends/amiga/corewindow.h b/frontends/amiga/corewindow.h index 42c0f0367..ba754d6df 100644 --- a/frontends/amiga/corewindow.h +++ b/frontends/amiga/corewindow.h @@ -34,6 +34,8 @@ enum { GID_CW_DRAW, /* drawing area (space.gadget) */ GID_CW_HSCROLL, /* horizontal scroller */ GID_CW_VSCROLL, /* vertical scroller */ + GID_CW_HSCROLLLAYOUT, /* horizontal scroller container*/ + GID_CW_VSCROLLLAYOUT, /* vertical scroller container */ GID_CW_LAST }; @@ -57,6 +59,11 @@ struct ami_corewindow { APTR deferred_rects_pool; struct MinList *deferred_rects; + /** keep track of the scrollbar type we're using */ + bool in_border_scroll; + bool scroll_x_visible; + bool scroll_y_visible; + /** window title, must be allocated wth ami_utf8 function */ char *wintitle; diff --git a/frontends/amiga/gui.c b/frontends/amiga/gui.c index 1508135a1..f94090b75 100644 --- a/frontends/amiga/gui.c +++ b/frontends/amiga/gui.c @@ -1689,7 +1689,7 @@ static bool ami_gui_hscroll_remove(struct gui_window_2 *gwin) IDoMethod(gwin->objects[GID_HSCROLLLAYOUT], LM_REMOVECHILD, gwin->win, gwin->objects[GID_HSCROLL]); #else - SetAttrs(gwin->objects[GID_HSCROLLLAYOUT], LAYOUT_RemoveChild, gwin->objects[GID_HSCROLL]); + SetAttrs(gwin->objects[GID_HSCROLLLAYOUT], LAYOUT_RemoveChild, gwin->objects[GID_HSCROLL], TAG_DONE); #endif gwin->objects[GID_HSCROLL] = NULL; @@ -1734,7 +1734,7 @@ static bool ami_gui_vscroll_remove(struct gui_window_2 *gwin) IDoMethod(gwin->objects[GID_VSCROLLLAYOUT], LM_REMOVECHILD, gwin->win, gwin->objects[GID_VSCROLL]); #else - SetAttrs(gwin->objects[GID_VSCROLLLAYOUT], LAYOUT_RemoveChild, gwin->objects[GID_VSCROLL]); + SetAttrs(gwin->objects[GID_VSCROLLLAYOUT], LAYOUT_RemoveChild, gwin->objects[GID_VSCROLL], TAG_DONE); #endif gwin->objects[GID_VSCROLL] = NULL; @@ -3266,8 +3266,10 @@ static void ami_gui_hotlist_toolbar_remove(struct gui_window_2 *gwin) IDoMethod(gwin->objects[GID_HOTLISTLAYOUT], LM_REMOVECHILD, gwin->win, gwin->objects[GID_HOTLISTSEPBAR]); #else - SetAttrs(gwin->objects[GID_HOTLISTLAYOUT], LAYOUT_RemoveChild, gwin->objects[GID_HOTLIST]); - SetAttrs(gwin->objects[GID_HOTLISTLAYOUT], LAYOUT_RemoveChild, gwin->objects[GID_HOTLISTSEPBAR]); + SetAttrs(gwin->objects[GID_HOTLISTLAYOUT], + LAYOUT_RemoveChild, gwin->objects[GID_HOTLIST], TAG_DONE); + SetAttrs(gwin->objects[GID_HOTLISTLAYOUT], + LAYOUT_RemoveChild, gwin->objects[GID_HOTLISTSEPBAR], TAG_DONE); #endif FlushLayoutDomainCache((struct Gadget *)gwin->objects[GID_MAIN]); diff --git a/frontends/amiga/sslcert.c b/frontends/amiga/sslcert.c index b3d57efeb..4685caee0 100644 --- a/frontends/amiga/sslcert.c +++ b/frontends/amiga/sslcert.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -221,15 +222,13 @@ ami_crtvrfy_create_window(struct ami_crtvrfy_window *crtvrfy_win) WA_DragBar, TRUE, WA_CloseGadget, FALSE, WA_SizeGadget, TRUE, - WA_SizeBRight, TRUE, + WA_SizeBBottom, TRUE, WA_Height, scrn->Height / 2, WA_PubScreen, scrn, WA_ReportMouse, TRUE, WA_IDCMP, IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_NEWSIZE | IDCMP_RAWKEY | IDCMP_GADGETUP | IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE | IDCMP_SIZEVERIFY, - WINDOW_HorizProp, 1, - WINDOW_VertProp, 1, WINDOW_IDCMPHook, &ami_cw->idcmp_hook, WINDOW_IDCMPHookBits, IDCMP_IDCMPUPDATE | IDCMP_EXTENDEDMOUSE, WINDOW_SharedPort, sport, @@ -241,12 +240,25 @@ ami_crtvrfy_create_window(struct ami_crtvrfy_window *crtvrfy_win) LAYOUT_AddImage, LabelObj, LABEL_Text, crtvrfy_win->sslerr, LabelEnd, - LAYOUT_AddChild, ami_cw->objects[GID_CW_DRAW] = SpaceObj, - GA_ID, GID_CW_DRAW, - SPACE_Transparent, TRUE, - SPACE_BevelStyle, BVS_DISPLAY, - GA_RelVerify, TRUE, - SpaceEnd, + LAYOUT_AddChild, ami_cw->objects[GID_CW_HSCROLLLAYOUT] = LayoutVObj, + LAYOUT_AddChild, ami_cw->objects[GID_CW_VSCROLLLAYOUT] = LayoutHObj, + LAYOUT_AddChild, ami_cw->objects[GID_CW_DRAW] = SpaceObj, + GA_ID, GID_CW_DRAW, + SPACE_Transparent, TRUE, + SPACE_BevelStyle, BVS_DISPLAY, + GA_RelVerify, TRUE, + SpaceEnd, + LAYOUT_AddChild, ami_cw->objects[GID_CW_VSCROLL] = ScrollerObj, + GA_ID, GID_CW_VSCROLL, + GA_RelVerify, TRUE, + ScrollerEnd, + LayoutEnd, + LAYOUT_AddChild, ami_cw->objects[GID_CW_HSCROLL] = ScrollerObj, + GA_ID, GID_CW_HSCROLL, + GA_RelVerify, TRUE, + SCROLLER_Orientation, SORIENT_HORIZ, + ScrollerEnd, + LayoutEnd, LAYOUT_AddChild, LayoutHObj, LAYOUT_AddChild, crtvrfy_win->sslcert_objects[GID_SSLCERT_ACCEPT] = ButtonObj, GA_ID, GID_SSLCERT_ACCEPT, -- cgit v1.2.3