void CVMouseMoveHand(CharView *cv, GEvent *event) { cv->xoff += event->u.mouse.x-cv->handscroll_base.x; cv->handscroll_base.x = event->u.mouse.x; cv->yoff -= event->u.mouse.y-cv->handscroll_base.y; cv->handscroll_base.y = event->u.mouse.y; cv->back_img_out_of_date = true; GScrollBarSetPos(cv->hsb,-cv->xoff); GScrollBarSetPos(cv->vsb,cv->yoff-cv->height); GDrawRequestExpose(cv->v,NULL,false); }
static void KPScrollTo(KPData *kpd, unichar_t uch, enum sortby sort) { int i; if ( sort==sb_first ) { for ( i=0; i<kpd->kcnt && kpd->kerns[i].first->unicodeenc<uch; ++i ); } else { for ( i=0; i<kpd->kcnt && kpd->kerns[i].second->unicodeenc<uch; ++i ); } if ( kpd->wh<=2 ) /* As is */; else if ( kpd->wh<5 ) --i; else i -= kpd->wh/5; if ( i>kpd->kcnt-kpd->wh ) i = kpd->kcnt-kpd->wh; if ( i<0 ) i = 0; if ( i!=kpd->off_top ) { int off = i-kpd->off_top; kpd->off_top = i; GScrollBarSetPos(GWidgetGetControl(kpd->gw,CID_ScrollBar),kpd->off_top); GDrawScroll(kpd->v,NULL,0,off*kpd->uh); } }
static void GListCheckSB(GDList *gl) { if ( gl->vsb==NULL ) { GGadgetData gd; memset(&gd,'\0',sizeof(gd)); gd.pos.y = gl->g.r.y; gd.pos.height = gl->g.r.height; gd.pos.width = GDrawPointsToPixels(gl->g.base,_GScrollBar_Width); gd.pos.x = gl->g.r.x+gl->g.r.width - gd.pos.width; gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert|gg_pos_use0; gd.handle_controlevent = glist_scroll; gl->vsb = (GScrollBar *) GScrollBarCreate(gl->g.base,&gd,gl); gl->vsb->g.contained = true; gd.pos.width += GDrawPointsToPixels(gl->g.base,1); gl->g.r.width -= gd.pos.width; gl->g.inner.width -= gd.pos.width; } if ( gl->always_show_sb || GListLinesInWindow(gl,0)<gl->ltot ) { if ( gl->vsb->g.state == gs_invisible ) { int wid = gl->vsb->g.r.width + GDrawPointsToPixels(gl->g.base,1); gl->vsb->g.state = gs_enabled; gl->g.r.width -= wid; gl->g.inner.width -= wid; } GScrollBarSetBounds(&gl->vsb->g,0,gl->ltot,GListLinesInWindow(gl,0)); GScrollBarSetPos(&gl->vsb->g,gl->loff); } else { if ( gl->vsb->g.state != gs_invisible ) { int wid = gl->vsb->g.r.width + GDrawPointsToPixels(gl->g.base,1); gl->vsb->g.state = gs_invisible; gl->g.r.width += wid; gl->g.inner.width += wid; } } }
static void GRowColCheckSB(GRowCol *grc) { if ( GRowColLinesInWindow(grc,0)<grc->ltot ) { if ( grc->vsb==NULL ) { GGadgetData gd; memset(&gd,'\0',sizeof(gd)); gd.pos.y = grc->g.r.y; gd.pos.height = grc->g.r.height; gd.pos.width = GDrawPointsToPixels(grc->g.base,_GScrollBar_Width); gd.pos.x = grc->g.r.x+grc->g.r.width - gd.pos.width; gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert|gg_pos_use0; gd.handle_controlevent = growcol_scroll; grc->vsb = (GScrollBar *) GScrollBarCreate(grc->g.base,&gd,grc); grc->vsb->g.contained = true; gd.pos.width += GDrawPointsToPixels(grc->g.base,1); grc->g.r.width -= gd.pos.width; grc->g.inner.width -= gd.pos.width; } GScrollBarSetBounds(&grc->vsb->g,0,grc->ltot-1,GRowColLinesInWindow(grc,0)); GScrollBarSetPos(&grc->vsb->g,grc->loff); } else { if ( grc->vsb!=NULL ) { int wid = grc->vsb->g.r.width + GDrawPointsToPixels(grc->g.base,1); (grc->vsb->g.funcs->destroy)(&grc->vsb->g); grc->vsb = NULL; grc->g.r.width += wid; grc->g.inner.width += wid; } } }
static void AnchorD_SetSB(AnchorDlg *a) { GScrollBarSetBounds(a->hsb,0,a->xlen,a->sb_width); if ( a->xoff+a->sb_width > a->xlen ) a->xoff = a->xlen - a->sb_width; if ( a->xoff<0 ) a->xoff = 0; GScrollBarSetPos(a->hsb,a->xoff); }
static int ErrChar(GEvent *e) { int newpos = errdata.offtop; switch( e->u.chr.keysym ) { case GK_Home: newpos = 0; break; case GK_End: newpos = errdata.cnt-errdata.linecnt; break; case GK_Page_Up: case GK_KP_Page_Up: newpos -= errdata.linecnt; break; case GK_Page_Down: case GK_KP_Page_Down: newpos += errdata.linecnt; break; case GK_Up: case GK_KP_Up: --newpos; break; case GK_Down: case GK_KP_Down: ++newpos; break; } if ( newpos>errdata.cnt-errdata.linecnt ) newpos = errdata.cnt-errdata.linecnt; if ( newpos<0 ) newpos =0; if ( newpos!=errdata.offtop ) { errdata.offtop = newpos; GScrollBarSetPos(errdata.vsb,errdata.offtop); GDrawRequestExpose(errdata.v,NULL,false); return( true ); } return( false ); }
static void QG_SetSb(QGData *qg) { if ( qg->loff_top + qg->vlcnt > qg->lcnt ) qg->loff_top = qg->lcnt-qg->vlcnt; if ( qg->loff_top<0 ) qg->loff_top = 0; GScrollBarSetBounds(qg->vsb,0,qg->lcnt,qg->vlcnt); GScrollBarSetPos(qg->vsb,qg->loff_top); }
static void BdfP_RefigureScrollbar(struct bdf_dlg *bd) { struct bdf_dlg_font *cur = bd->cur; int lines = bd->vheight/(bd->fh+1); /* allow for one extra line which will display "New" */ GScrollBarSetBounds(bd->vsb,0,cur->bdf->prop_cnt+1,lines); if ( cur->top_prop+lines>cur->bdf->prop_cnt+1 ) cur->top_prop = cur->bdf->prop_cnt+1-lines; if ( cur->top_prop < 0 ) cur->top_prop = 0; GScrollBarSetPos(bd->vsb,cur->top_prop); }
static void KP_ScrollTo(KPData *kpd,int where) { /* Make sure the line "where" is visible */ if ( where<kpd->off_top || where>=kpd->off_top+kpd->wh ) { where -= kpd->wh/4; if ( where>kpd->kcnt-kpd->wh ) where = kpd->kcnt-kpd->wh; if ( where<0 ) where = 0; kpd->off_top = where; GScrollBarSetPos(GWidgetGetControl(kpd->gw,CID_ScrollBar),where); GDrawRequestExpose(kpd->v,NULL,false); } }
void SFRestoreNearTop(SplineFont *sf) { FontView *fv; for ( fv=(FontView *) sf->fv; fv!=NULL; fv=(FontView *) (fv->b.nextsame) ) if ( fv->sc_near_top!=NULL ) { /* Note: For CID keyed fonts, we don't care if sc is in the currently */ /* displayed font, all we care about is the CID */ int enc = fv->b.map->backmap[fv->sc_near_top->orig_pos]; if ( enc!=-1 ) { fv->rowoff = enc/fv->colcnt; GScrollBarSetPos(fv->vsb,fv->rowoff); /* Don't ask for an expose event yet. We'll get one soon enough */ } } }
static void GListScrollToText(GGadget *g,const uint32_t *text,int32_t sel) { GDList *gl = (GDList *) g; int pos; pos = GListFindPosition(gl,(uint32_t *) text); if ( sel && pos<gl->ltot ) { GListClearSel(gl); if ( gl->exactly_one || u32_casecompare(text,gl->ti[pos]->text)==0 ) gl->ti[pos]->selected = true; } gl->loff = GListAdjustPos(g,pos); if ( gl->vsb!=NULL ) GScrollBarSetPos(&gl->vsb->g,gl->loff); _ggadget_redraw(g); }
static int warnings_e_h(GWindow gw, GEvent *event) { if (( event->type==et_mouseup || event->type==et_mousedown ) && (event->u.mouse.button>=4 && event->u.mouse.button<=7) ) { return( GGadgetDispatchEvent(errdata.vsb,event)); } switch ( event->type ) { case et_char: return( ErrChar(event)); break; case et_expose: break; case et_resize: { GRect size, sbsize; GDrawGetSize(gw,&size); GGadgetGetSize(errdata.vsb,&sbsize); GGadgetMove(errdata.vsb,size.width-sbsize.width,0); GGadgetResize(errdata.vsb,sbsize.width,size.height); GDrawResize(errdata.v,size.width-sbsize.width,size.height); errdata.linecnt = size.height/errdata.fh; GScrollBarSetBounds(errdata.vsb,0,errdata.cnt,errdata.linecnt); if ( errdata.offtop + errdata.linecnt > errdata.cnt ) { errdata.offtop = errdata.cnt-errdata.linecnt; if ( errdata.offtop < 0 ) errdata.offtop = 0; GScrollBarSetPos(errdata.vsb,errdata.offtop); } GDrawRequestExpose(errdata.v,NULL,false); } break; case et_controlevent: switch ( event->u.control.subtype ) { case et_scrollbarchange: ErrScroll(&event->u.control.u.sb); break; } break; case et_close: ErrHide(); break; case et_create: break; case et_destroy: break; } return( true ); }
static int QG_VScroll(GGadget *g, GEvent *e) { QGData *qg = GDrawGetUserData(GGadgetGetWindow(g)); int newpos = qg->loff_top; switch( e->u.control.u.sb.type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= 9*qg->vlcnt/10; break; case et_sb_up: newpos -= qg->vlcnt/15; break; case et_sb_down: newpos += qg->vlcnt/15; break; case et_sb_downpage: newpos += 9*qg->vlcnt/10; break; case et_sb_bottom: newpos = 0; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = e->u.control.u.sb.pos; break; case et_sb_halfup: newpos -= qg->vlcnt/30; break; case et_sb_halfdown: newpos += qg->vlcnt/30; break; } if ( newpos + qg->vlcnt > qg->lcnt ) newpos = qg->lcnt-qg->vlcnt; if ( newpos<0 ) newpos = 0; if ( qg->loff_top!=newpos ) { qg->loff_top = newpos; GScrollBarSetPos(qg->vsb,newpos); GDrawRequestExpose(qg->v,NULL,false); } return( true ); }
static void KPV_Resize(KPData *kpd) { GRect size; GGadget *sb; GDrawGetSize(kpd->v,&size); kpd->wh = size.height/kpd->uh; sb = GWidgetGetControl(kpd->gw,CID_ScrollBar); GScrollBarSetBounds(sb,0,kpd->kcnt,kpd->wh); if ( kpd->off_top>kpd->kcnt-kpd->wh ) kpd->off_top = kpd->kcnt-kpd->wh; if ( kpd->off_top<0 ) kpd->off_top = 0; GScrollBarSetPos(sb,kpd->off_top); kpd->vwidth = size.width; GDrawRequestExpose(kpd->v,NULL,false); GDrawRequestExpose(kpd->gw,NULL,false); }
static int KP_Scrolled(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_scrollbarchange ) { KPData *kpd = GDrawGetUserData(GGadgetGetWindow(g)); int newpos = kpd->off_top; switch( e->u.control.u.sb.type ) { case et_sb_top: newpos = 0; break; case et_sb_halfup: case et_sb_uppage: newpos -= kpd->wh==1?1:kpd->wh-1; break; case et_sb_up: newpos -= 1; break; case et_sb_halfdown: case et_sb_down: newpos += 1; break; case et_sb_downpage: newpos += kpd->wh==1?1:kpd->wh-1; break; case et_sb_bottom: newpos = kpd->kcnt-kpd->wh; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = e->u.control.u.sb.pos; break; } if ( newpos>kpd->kcnt-kpd->wh ) newpos = kpd->kcnt-kpd->wh; if ( newpos<0 ) newpos = 0; if ( newpos!=kpd->off_top ) { int off = newpos-kpd->off_top; kpd->off_top = newpos; GScrollBarSetPos(g,kpd->off_top); GDrawScroll(kpd->v,NULL,0,off*kpd->uh); } } return( true ); }
static void BdfP_VScroll(struct bdf_dlg *bd,struct sbevent *sb) { int newpos = bd->cur->top_prop; int page = bd->vheight/(bd->fh+1); switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= 9*page/10; break; case et_sb_up: newpos--; break; case et_sb_down: newpos++; break; case et_sb_downpage: newpos += 9*page/10; break; case et_sb_bottom: newpos = bd->cur->bdf->prop_cnt+1; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos + page > bd->cur->bdf->prop_cnt+1 ) newpos = bd->cur->bdf->prop_cnt+1 - page; if ( newpos<0 ) newpos = 0; if ( newpos!=bd->cur->top_prop ) { int diff = (newpos-bd->cur->top_prop)*(bd->fh+1); GRect r; bd->cur->top_prop = newpos; GScrollBarSetPos(bd->vsb,newpos); GGadgetGetSize(bd->tf,&r); GGadgetMove(bd->tf,r.x,r.y+diff); r.x = 0; r.y = 0; r.width = bd->vwidth; r.height = (bd->vheight/(bd->fh+1))*(bd->fh+1); GDrawScroll(bd->v,&r,0,diff); } }
static void AnchorD_HScroll(AnchorDlg *a,struct sbevent *sb) { int newpos = a->xoff; GRect rect; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= a->sb_width; break; case et_sb_up: newpos -= a->pixelsize*a->magfactor/2; break; case et_sb_down: newpos = a->pixelsize*a->magfactor/2; break; case et_sb_downpage: newpos += a->sb_width; break; case et_sb_bottom: newpos = a->xlen - a->sb_width; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos + a->sb_width >= a->xlen ) newpos = a->xlen - a->sb_width; if ( newpos < 0 ) newpos = 0; if ( newpos!=a->xoff ) { int diff = newpos-a->xoff; a->xoff = newpos; GScrollBarSetPos(a->hsb,newpos); if ( a->cnt!=0 ) { rect.x = a->apmatch[0].xstart+1; rect.y = 0; rect.width = a->sb_width; rect.height = a->sb_base; GDrawScroll(a->gw,&rect,-diff,0); } } }
static void AppendToErrorWindow(char *buffer) { int i,linecnt; char *pt,*end; if ( buffer[strlen(buffer)-1]=='\n' ) buffer[strlen(buffer)-1] = '\0'; for ( linecnt=1, pt=buffer; (pt=strchr(pt,'\n'))!=NULL; ++linecnt ) ++pt; if ( errdata.cnt + linecnt > MAX_ERR_LINES ) { int off = errdata.cnt + linecnt - MAX_ERR_LINES; for ( i=0; i<off; ++i ) free(errdata.errlines[i]); for ( /*i=off*/; i<errdata.cnt; ++i ) errdata.errlines[i-off] = errdata.errlines[i]; for ( ; i<MAX_ERR_LINES+off ; ++i ) errdata.errlines[i-off] = NULL; errdata.cnt -= off; if (( errdata.start_l -= off)< 0 ) errdata.start_l = errdata.start_c = 0; if (( errdata.end_l -= off)< 0 ) errdata.end_l = errdata.start_l = -1; } for ( i=errdata.cnt, pt=buffer; i<MAX_ERR_LINES; ++i ) { end = strchr(pt,'\n'); if ( end==NULL ) end = pt+strlen(pt); errdata.errlines[i] = copyn(pt,end-pt); pt = end; if ( *pt=='\0' ) { ++i; break; } ++pt; } errdata.cnt = i; errdata.offtop = errdata.cnt - errdata.linecnt; if ( errdata.offtop<0 ) errdata.offtop = 0; GScrollBarSetBounds(errdata.vsb,0,errdata.cnt,errdata.linecnt); GScrollBarSetPos(errdata.vsb,errdata.offtop); }
void GScrollBarSetMustShow(GGadget *g, int32 sb_min, int32 sb_max, int32 sb_pagesize, int32 sb_mustshow ) { GScrollBar *gsb = (GScrollBar *) g; if ( sb_min>sb_max || sb_pagesize<=0 ) { GDrawIError("Invalid scrollbar bounds min=%d max=%d, pagesize=%d", sb_min, sb_max, sb_pagesize ); return; } gsb->sb_min = sb_min; gsb->sb_max = sb_max; gsb->sb_pagesize = sb_pagesize; gsb->sb_mustshow = sb_mustshow; gsb->thumbsize = (gsb->g.vert?gsb->g.inner.height:gsb->g.inner.width); if ( sb_max-sb_min > sb_pagesize ) gsb->thumbsize = (gsb->thumbsize*gsb->sb_pagesize)/(sb_max-sb_min); if ( gsb->thumbsize<2*gsb->thumbborder+4 ) { gsb->thumbsize = 2*gsb->thumbborder+6; if ( gsb->thumbsize>(gsb->g.vert?gsb->g.inner.height:gsb->g.inner.width) ) gsb->thumbsize = (gsb->g.vert?gsb->g.inner.height:gsb->g.inner.width); } GScrollBarSetPos(g,gsb->sb_pos); }
static void GroupHScroll(struct groupdlg *grp,struct sbevent *sb) { int newpos = grp->off_left; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= grp->page_width; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += grp->page_width; break; case et_sb_bottom: newpos = grp->maxl-grp->page_width; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>grp->maxl-grp->page_width ) newpos = grp->maxl-grp->page_width; if ( newpos<0 ) newpos =0; if ( newpos!=grp->off_left ) { int diff = newpos-grp->off_left; grp->off_left = newpos; GScrollBarSetPos(grp->hsb,grp->off_left); GDrawScroll(grp->v,NULL,-diff,0); } }
static void GroupScroll(struct groupdlg *grp,struct sbevent *sb) { int newpos = grp->off_top; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= grp->lines_page; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += grp->lines_page; break; case et_sb_bottom: newpos = grp->open_cnt-grp->lines_page; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>grp->open_cnt-grp->lines_page ) newpos = grp->open_cnt-grp->lines_page; if ( newpos<0 ) newpos =0; if ( newpos!=grp->off_top ) { int diff = newpos-grp->off_top; grp->off_top = newpos; GScrollBarSetPos(grp->vsb,grp->off_top); GDrawScroll(grp->v,NULL,0,diff*grp->fh); } }
static void ErrScroll(struct sbevent *sb) { int newpos = errdata.offtop; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= errdata.linecnt; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += errdata.linecnt; break; case et_sb_bottom: newpos = errdata.cnt-errdata.linecnt; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>errdata.cnt-errdata.linecnt ) newpos = errdata.cnt-errdata.linecnt; if ( newpos<0 ) newpos =0; if ( newpos!=errdata.offtop ) { errdata.offtop = newpos; GScrollBarSetPos(errdata.vsb,errdata.offtop); GDrawRequestExpose(errdata.v,NULL,false); } }
static void GRowColScrollBy(GRowCol *grc,int loff,int xoff) { int top = GRowColTopInWindow(grc,grc->ltot-1); int ydiff, i; if ( grc->loff + loff < 0 ) loff = -grc->loff; else if ( grc->loff + loff > top ) loff = top-grc->loff; if ( xoff+grc->xoff<0 ) xoff = -grc->xoff; else if ( xoff+grc->xoff+grc->g.inner.width > grc->xmax ) { xoff = grc->xmax-grc->g.inner.width-grc->xoff; if ( xoff<0 ) xoff = 0; } if ( loff == 0 && xoff==0 ) return; ydiff = 0; if ( loff>0 ) { for ( i=0; i<loff && ydiff<grc->g.inner.height; ++i ) ydiff += GTextInfoGetHeight(grc->g.base,grc->ti[i+grc->loff],grc->font); } else if ( loff<0 ) { for ( i=loff; i<0 && -ydiff<grc->g.inner.height; ++i ) ydiff -= GTextInfoGetHeight(grc->g.base,grc->ti[i+grc->loff],grc->font); } if ( !GDrawIsVisible(grc->g.base)) return; GDrawForceUpdate(grc->g.base); grc->loff += loff; grc->xoff += xoff; if ( ydiff>=grc->g.inner.height || -ydiff >= grc->g.inner.height ) _ggadget_redraw(&grc->g); else if ( ydiff!=0 || xoff!=0 ) GDrawScroll(grc->g.base,&grc->g.inner,xoff,ydiff); if ( loff!=0 ) GScrollBarSetPos(&grc->vsb->g,grc->loff); }
static int growcol_key(GGadget *g, GEvent *event) { GRowCol *grc = (GRowCol *) g; uint16 keysym = event->u.chr.keysym; int sofar_pos = grc->sofar_pos; int loff, xoff, sel=-1; int refresh = false; if ( event->type == et_charup ) return( false ); if ( !g->takes_input || (g->state!=gs_enabled && g->state!=gs_active && g->state!=gs_focused )) return(false ); if ( grc->ispopup && event->u.chr.keysym == GK_Return ) { GRowColDoubleClick(grc); return( true ); } if ( event->u.chr.keysym == GK_Return || event->u.chr.keysym == GK_Tab || event->u.chr.keysym == GK_BackTab || event->u.chr.keysym == GK_Escape ) return( false ); GDrawCancelTimer(grc->enduser); grc->enduser = NULL; grc->sofar_pos = 0; loff = 0x80000000; xoff = 0x80000000; sel = -1; if ( keysym == GK_Home || keysym == GK_KP_Home || keysym == GK_Begin || keysym == GK_KP_Begin ) { loff = -grc->loff; xoff = -grc->xoff; sel = 0; } else if ( keysym == GK_End || keysym == GK_KP_End ) { loff = GRowColTopInWindow(grc,grc->ltot-1)-grc->loff; xoff = -grc->xoff; sel = grc->ltot-1; } else if ( keysym == GK_Up || keysym == GK_KP_Up ) { if (( sel = GRowColGetFirstSelPos(&grc->g)-1 )<0 ) { /*if ( grc->loff!=0 ) loff = -1; else loff = 0;*/ sel = 0; } } else if ( keysym == GK_Down || keysym == GK_KP_Down ) { if (( sel = GRowColGetFirstSelPos(&grc->g))!= -1 ) ++sel; else /*if ( grc->loff + GRowColLinesInWindow(grc,grc->loff)<grc->ltot ) loff = 1; else loff = 0;*/ sel = 0; } else if ( keysym == GK_Left || keysym == GK_KP_Left ) { xoff = -GDrawPointsToPixels(grc->g.base,6); } else if ( keysym == GK_Right || keysym == GK_KP_Right ) { xoff = GDrawPointsToPixels(grc->g.base,6); } else if ( keysym == GK_Page_Up || keysym == GK_KP_Page_Up ) { loff = GRowColTopInWindow(grc,grc->loff); if ( loff == grc->loff ) /* Normally we leave one line in window from before, except if only one line fits */ loff = GRowColTopInWindow(grc,grc->loff-1); loff -= grc->loff; if (( sel = GRowColGetFirstSelPos(&grc->g))!= -1 ) { if (( sel += loff )<0 ) sel = 0; } } else if ( keysym == GK_Page_Down || keysym == GK_KP_Page_Down ) { loff = GRowColLinesInWindow(grc,grc->loff)-1; if ( loff<=0 ) loff = 1; if ( loff + grc->loff >= grc->ltot ) loff = GRowColTopInWindow(grc,grc->ltot-1)-grc->loff; if (( sel = GRowColGetFirstSelPos(&grc->g))!= -1 ) { if (( sel += loff )>=grc->ltot ) sel = grc->ltot-1; } } else if ( keysym == GK_BackSpace && grc->orderer ) { /* ordered lists may be reversed by typing backspace */ grc->backwards = !grc->backwards; GRowColOrderIt(grc); sel = GRowColGetFirstSelPos(&grc->g); if ( sel!=-1 ) { int top = GRowColTopInWindow(grc,grc->ltot-1); grc->loff = sel-1; if ( grc->loff > top ) grc->loff = top; if ( sel-1<0 ) grc->loff = 0; } GScrollBarSetPos(&grc->vsb->g,grc->loff); _ggadget_redraw(&grc->g); return( true ); } else if ( event->u.chr.chars[0]!='\0' && grc->orderer ) { int len = u_strlen(event->u.chr.chars); if ( sofar_pos+len >= grc->sofar_max ) { if ( grc->sofar_max == 0 ) grc->sofar = galloc((grc->sofar_max = len+10) * sizeof(unichar_t)); else grc->sofar = grealloc(grc->sofar,(grc->sofar_max = sofar_pos+len+10)*sizeof(unichar_t)); } u_strcpy(grc->sofar+sofar_pos,event->u.chr.chars); grc->sofar_pos = sofar_pos + len; sel = GRowColFindPosition(grc,grc->sofar); grc->enduser = GDrawRequestTimer(grc->g.base,GRowColTypeTime,0,NULL); } if ( loff==0x80000000 && sel>=0 ) { if ( sel>=grc->ltot ) sel = grc->ltot-1; if ( sel<grc->loff ) loff = sel-grc->loff; else if ( sel>=grc->loff+GRowColLinesInWindow(grc,grc->loff) ) loff = sel-(grc->loff+GRowColLinesInWindow(grc,grc->loff)-1); } else sel = -1; if ( sel!=-1 ) { int wassel = grc->ti[sel]->selected; refresh = GRowColAnyOtherSels(grc,sel) || !wassel; GRowColSelectOne(&grc->g,sel); if ( refresh ) GRowColSelected(grc); } if ( loff!=0x80000000 || xoff!=0x80000000 ) { if ( loff==0x80000000 ) loff = 0; if ( xoff==0x80000000 ) xoff = 0; GRowColScrollBy(grc,loff,xoff); } if ( refresh ) _ggadget_redraw(g); if ( loff!=0x80000000 || xoff!=0x80000000 || sel!=-1 ) return( true ); return( false ); }
int32 GScrollBarAddToPos(GGadget *g,int32 pos) { return GScrollBarSetPos( g, GScrollBarGetPos(g) + pos ); }
void help(char *file) { char fullspec[1024], *temp, *pt; if ( browser[0]=='\0' ) findbrowser(); #ifndef __CygWin if ( browser[0]=='\0' ) { gwwv_post_error(_("No Browser"),_("Could not find a browser. Set the BROWSER environment variable to point to one")); return; } #endif if ( strstr(file,"http://")==NULL ) { fullspec[0] = 0; if ( ! GFileIsAbsolute(file) ) { if ( helpdir==NULL || *helpdir=='\0' ) { #ifdef DOCDIR strcpy(fullspec,DOCDIR "/"); #elif defined(SHAREDIR) strcpy(fullspec,SHAREDIR "/doc/fontforge/"); #else strcpy(fullspec,"/usr/local/share/doc/fontforge/"); #endif } else { strcpy(fullspec,helpdir); } } strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; if ( !GFileReadable( fullspec )) { if ( *file!='/' ) { strcpy(fullspec,"/usr/share/doc/fontforge/"); strcat(fullspec,file); if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; } } if ( !GFileReadable( fullspec )) { strcpy(fullspec,"http://fontforge.sf.net/"); AppendSupportedLocale(fullspec); strcat(fullspec,file); } else if ( pt!=NULL ) *pt = '#'; } else strcpy(fullspec,file); #if __CygWin if ( (strstrmatch(browser,"/cygdrive")!=NULL || browser[0]=='\0') && strstr(fullspec,":/")==NULL ) { /* It looks as though the browser is a windows application, so we */ /* should give it a windows file name */ char *pt, *tpt; temp = galloc(1024); cygwin_conv_to_full_win32_path(fullspec,temp); for ( pt = fullspec, tpt = temp; *tpt && pt<fullspec+sizeof(fullspec)-3; *pt++ = *tpt++ ) if ( *tpt=='\\' ) *pt++ = '\\'; *pt = '\0'; free(temp); } #endif #if __Mac if ( strcmp(browser,"open")==0 ) /* open doesn't want "file:" prepended */; else #endif if ( strstr(fullspec,":/")==NULL ) { char *t1 = galloc(strlen(fullspec)+strlen("file:")+20); #if __CygWin sprintf( t1, "file:\\\\\\%s", fullspec ); #else sprintf( t1, "file:%s", fullspec); #endif strcpy(fullspec,t1); free(t1); } #if 0 && __Mac /* Starting a Mac application is weird... system() can't do it */ /* Thanks to Edward H. Trager giving me an example... */ if ( strstr(browser,".app")!=NULL ) { *strstr(browser,".app") = '\0'; pt = strrchr(browser,'/'); if ( pt==NULL ) pt = browser-1; ++pt; temp = galloc(strlen(pt)+strlen(fullspec) + strlen( "osascript -l AppleScript -e \"Tell application \"\" to getURL \"\"\"" )+ 20); /* this doesn't work on Max OS X.0 (osascript does not support -e) */ sprintf( temp, "osascript -l AppleScript -e \"Tell application \"%s\" to getURL \"%s\"\"", pt, fullspec); system(temp); ff_post_notice(_("Leave X"),_("A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A")); } else { #elif __Mac /* This seems a bit easier... Thanks to riggle */ if ( strcmp(browser,"open")==0 ) { char *str = "DYLD_LIBRARY_PATH=\"\"; open "; temp = galloc(strlen(str) + strlen(fullspec) + 20); sprintf( temp, "%s \"%s\" &", str, fullspec ); system(temp); } else { #elif __CygWin if ( browser[0]=='\0' ) { do_windows_browser(fullspec); temp = NULL; } else { #else { #endif temp = galloc(strlen(browser) + strlen(fullspec) + 20); sprintf( temp, strcmp(browser,"kfmclient openURL")==0 ? "%s \"%s\" &" : "\"%s\" \"%s\" &", browser, fullspec ); system(temp); } free(temp); } #endif static void UI_IError(const char *format,...) { va_list ap; char buffer[300]; va_start(ap,format); vsnprintf(buffer,sizeof(buffer),format,ap); GDrawIError("%s",buffer); va_end(ap); } #define MAX_ERR_LINES 400 static struct errordata { char *errlines[MAX_ERR_LINES]; GFont *font; int fh, as; GGadget *vsb; GWindow gw, v; int cnt, linecnt; int offtop; int showing; int start_l, start_c, end_l, end_c; int down; } errdata; static void ErrHide(void) { GDrawSetVisible(errdata.gw,false); errdata.showing = false; } static void ErrScroll(struct sbevent *sb) { int newpos = errdata.offtop; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= errdata.linecnt; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += errdata.linecnt; break; case et_sb_bottom: newpos = errdata.cnt-errdata.linecnt; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>errdata.cnt-errdata.linecnt ) newpos = errdata.cnt-errdata.linecnt; if ( newpos<0 ) newpos =0; if ( newpos!=errdata.offtop ) { errdata.offtop = newpos; GScrollBarSetPos(errdata.vsb,errdata.offtop); GDrawRequestExpose(errdata.v,NULL,false); } }