diff options
Diffstat (limited to 'appl/lib/titlebar.b')
| -rw-r--r-- | appl/lib/titlebar.b | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/appl/lib/titlebar.b b/appl/lib/titlebar.b new file mode 100644 index 00000000..08c5b927 --- /dev/null +++ b/appl/lib/titlebar.b @@ -0,0 +1,111 @@ +implement Titlebar; +include "sys.m"; + sys: Sys; +include "draw.m"; + draw: Draw; + Point, Rect: import draw; +include "tk.m"; + tk: Tk; +include "titlebar.m"; + +title_cfg := array[] of { + "frame .Wm_t -bg #aaaaaa -borderwidth 1", + "label .Wm_t.title -anchor w -bg #aaaaaa -fg white", + "button .Wm_t.e -bitmap exit.bit -command {send wm_title exit} -takefocus 0", + "pack .Wm_t.e -side right", + "bind .Wm_t <Button-1> {send wm_title move %X %Y}", + "bind .Wm_t <Double-Button-1> {send wm_title lower .}", + "bind .Wm_t <Motion-Button-1> {}", + "bind .Wm_t <Motion> {}", + "bind .Wm_t.title <Button-1> {send wm_title move %X %Y}", + "bind .Wm_t.title <Double-Button-1> {send wm_title lower .}", + "bind .Wm_t.title <Motion-Button-1> {}", + "bind .Wm_t.title <Motion> {}", + "bind . <FocusIn> {.Wm_t configure -bg blue;"+ + ".Wm_t.title configure -bg blue;update}", + "bind . <FocusOut> {.Wm_t configure -bg #aaaaaa;"+ + ".Wm_t.title configure -bg #aaaaaa;update}", +}; + +init() +{ + sys = load Sys Sys->PATH; + draw = load Draw Draw->PATH; + tk = load Tk Tk->PATH; +} + +new(top: ref Tk->Toplevel, buts: int): chan of string +{ + ctl := chan of string; + tk->namechan(top, ctl, "wm_title"); + + if(buts & Plain) + return ctl; + + for(i := 0; i < len title_cfg; i++) + cmd(top, title_cfg[i]); + + if(buts & OK) + cmd(top, "button .Wm_t.ok -bitmap ok.bit"+ + " -command {send wm_title ok} -takefocus 0; pack .Wm_t.ok -side right"); + + if(buts & Hide) + cmd(top, "button .Wm_t.top -bitmap task.bit"+ + " -command {send wm_title task} -takefocus 0; pack .Wm_t.top -side right"); + + if(buts & Resize) + cmd(top, "button .Wm_t.m -bitmap maxf.bit"+ + " -command {send wm_title size} -takefocus 0; pack .Wm_t.m -side right"); + + if(buts & Help) + cmd(top, "button .Wm_t.h -bitmap help.bit"+ + " -command {send wm_title help} -takefocus 0; pack .Wm_t.h -side right"); + + # pack the title last so it gets clipped first + cmd(top, "pack .Wm_t.title -side left"); + cmd(top, "pack .Wm_t -fill x"); + + return ctl; +} + +title(top: ref Tk->Toplevel): string +{ + if(tk->cmd(top, "winfo class .Wm_t.title")[0] != '!') + return cmd(top, ".Wm_t.title cget -text"); + return nil; +} + +settitle(top: ref Tk->Toplevel, t: string): string +{ + s := title(top); + tk->cmd(top, ".Wm_t.title configure -text '" + t); + return s; +} + +sendctl(top: ref Tk->Toplevel, c: string) +{ + cmd(top, "send wm_title " + c); +} + +minsize(top: ref Tk->Toplevel): Point +{ + buts := array[] of {"e", "ok", "top", "m", "h"}; + r := tk->rect(top, ".", Tk->Border); + r.min.x = r.max.x; + r.max.y = r.min.y; + for(i := 0; i < len buts; i++){ + br := tk->rect(top, ".Wm_t." + buts[i], Tk->Border); + if(br.dx() > 0) + r = r.combine(br); + } + r.max.x += tk->rect(top, ".Wm_t." + buts[0], Tk->Border).dx(); + return r.size(); +} + +cmd(top: ref Tk->Toplevel, s: string): string +{ + e := tk->cmd(top, s); + if (e != nil && e[0] == '!') + sys->fprint(sys->fildes(2), "wmclient: tk error %s on '%s'\n", e, s); + return e; +} |
