static void blinkreset(Tk *tk) { TkEntry *e = TKobj(TkEntry, tk); if (!tkhaskeyfocus(tk) || tk->flag&Tkdisabled) return; e->flag |= Ecursoron; tkblinkreset(tk); }
char* tkdrawentry(Tk *tk, Point orig) { Point p; TkEnv *env; Rectangle r, s; Image *i; int xp, yp; env = tk->env; r.min = ZP; r.max.x = tk->act.width + 2*tk->borderwidth; r.max.y = tk->act.height + 2*tk->borderwidth; i = tkitmp(env, r.max, TkCbackgnd); if(i == nil) return nil; xp = tk->borderwidth + xinset(tk); yp = tk->borderwidth + yinset(tk); s = r; s.min.x += xp; s.max.x -= xp; s.min.y += yp; s.max.y -= yp; tkentrytext(i, s, tk, env); tkdrawrelief(i, tk, ZP, TkCbackgnd, tk->relief); if (tkhaskeyfocus(tk)) tkbox(i, insetrect(r, tk->borderwidth), tk->highlightwidth, tkgc(tk->env, TkChighlightfgnd)); p.x = tk->act.x + orig.x; p.y = tk->act.y + orig.y; r = rectaddpt(r, p); draw(tkimageof(tk), r, i, nil, ZP); return nil; }
char* tkdrawscale(Tk *tk, Point orig) { Point p; TkEnv *env; TkScale *tks; Rectangle r, fr; Image *i; tks = TKobj(TkScale, tk); env = tk->env; r.min = ZP; r.max.x = tk->act.width + 2*tk->borderwidth; r.max.y = tk->act.height + 2*tk->borderwidth; i = tkitmp(env, r.max, TkCbackgnd); if(i == nil) return nil; if(tks->orient == Tkvertical) tkscalevert(tk, i); else tkscalehoriz(tk, i); tkdrawrelief(i, tk, ZP, TkCbackgnd, tk->relief); if (tkhaskeyfocus(tk)) { fr = insetrect(r, tk->borderwidth); tkbox(i, fr, tk->highlightwidth, tkgc(env, TkChighlightfgnd)); } p.x = tk->act.x + orig.x; p.y = tk->act.y + orig.y; r = rectaddpt(r, p); draw(tkimageof(tk), r, i, nil, ZP); return nil; }
/* * draw TKlabel, TKseparator, and TKcascade (cascade should really be a button) */ char* tkdrawlabel(Tk *tk, Point orig) { TkEnv *e; TkLabel *tkl; Rectangle r, s, mainr, focusr; int dx, dy, h; Point p, u, v; Image *i, *dst, *ct, *img; int relief, bgnd, fgnd; e = tk->env; dst = tkimageof(tk); if(dst == nil) return nil; v.x = tk->act.width + 2*tk->borderwidth; v.y = tk->act.height + 2*tk->borderwidth; r.min = ZP; r.max = v; focusr = insetrect(r, tk->borderwidth); mainr = insetrect(focusr, tk->highlightwidth); relief = tk->relief; tkl = TKobj(TkLabel, tk); fgnd = TkCforegnd; bgnd = TkCbackgnd; if (tk->flag & Tkdisabled) fgnd = TkCdisablefgnd; else if (tk->flag & Tkactive) { fgnd = TkCactivefgnd; bgnd = TkCactivebgnd; } i = tkitmp(e, r.max, bgnd); if(i == nil) return nil; if(tk->flag & Tkactive) draw(i, r, tkgc(e, bgnd), nil, ZP); p = mainr.min; h = tkl->h - 2 * tk->highlightwidth; dx = tk->act.width - tkl->w - tk->ipad.x; dy = tk->act.height - tkl->h - tk->ipad.y; if((tkl->anchor & (Tknorth|Tksouth)) == 0) p.y += dy/2; else if(tkl->anchor & Tksouth) p.y += dy; if((tkl->anchor & (Tkeast|Tkwest)) == 0) p.x += dx/2; else if(tkl->anchor & Tkeast) p.x += dx; if(tk->type == TKcascade) { u.x = mainr.max.x - CheckButton - CheckButtonBW; /* TO DO: CheckButton etc is really the triangle/arrow */ u.y = p.y + ButtonBorder + (h-CheckSpace)/2; tktriangle(u, i, e); } p.x += tk->ipad.x/2; p.y += tk->ipad.y/2; u = ZP; img = nil; if(tkl->img != nil && tkl->img->img != nil) img = tkl->img->img; else if (tkl->bitmap != nil) img = tkl->bitmap; if(img != nil) { s.min.x = p.x + Bitpadx; s.min.y = p.y + Bitpady; s.max.x = s.min.x + Dx(img->r); s.max.y = s.min.y + Dy(img->r); s = rectaddpt(s, u); if(tkchanhastype(img->chan, CGrey)) draw(i, s, tkgc(e, fgnd), img, ZP); else draw(i, s, img, nil, ZP); } else if(tkl->text != nil) { u.x += Textpadx; u.y += Textpady; ct = tkgc(e, fgnd); p.y += (h - tkl->textheight) / 2; tkdrawstring(tk, i, addpt(u, p), tkl->text, tkl->ul, ct, tkl->justify); } if(tkhaskeyfocus(tk)) tkbox(i, focusr, tk->highlightwidth, tkgc(e, TkChighlightfgnd)); tkdrawrelief(i, tk, ZP, bgnd, relief); p.x = tk->act.x + orig.x; p.y = tk->act.y + orig.y; r = rectaddpt(r, p); draw(dst, r, i, nil, ZP); return nil; }