summaryrefslogtreecommitdiff
path: root/appl/lib/titlebar.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/lib/titlebar.b')
-rw-r--r--appl/lib/titlebar.b111
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;
+}