summaryrefslogtreecommitdiff
path: root/appl/wm/mpeg.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/wm/mpeg.b')
-rw-r--r--appl/wm/mpeg.b185
1 files changed, 185 insertions, 0 deletions
diff --git a/appl/wm/mpeg.b b/appl/wm/mpeg.b
new file mode 100644
index 00000000..619aa338
--- /dev/null
+++ b/appl/wm/mpeg.b
@@ -0,0 +1,185 @@
+implement WmMpeg;
+
+include "sys.m";
+ sys: Sys;
+
+include "draw.m";
+ draw: Draw;
+ Rect, Display, Image: import draw;
+ ctxt: ref Draw->Context;
+
+include "tk.m";
+ tk: Tk;
+ Toplevel: import tk;
+
+include "tkclient.m";
+ tkclient: Tkclient;
+
+include "mpeg.m";
+ mpeg: Mpeg;
+
+WmMpeg: module
+{
+ init: fn(ctxt: ref Draw->Context, argv: list of string);
+};
+
+Stopped, Playing: con iota;
+
+dx, dy: int;
+dw, dh: int;
+adjust: int;
+
+task_cfg := array[] of {
+ "canvas .c -background =5",
+ "frame .b",
+ "button .b.File -text File -command {send cmd file}",
+ "button .b.Stop -text Stop -command {send cmd stop}",
+ "button .b.Pause -text Pause -command {send cmd pause}",
+ "button .b.Play -text Play -command {send cmd play}",
+ "button .b.Picture -text Picture -command {send cmd pict}",
+ "frame .f",
+ "label .f.file -text {File:}",
+ "label .f.name",
+ "pack .f.file .f.name -side left",
+ "pack .b.File .b.Stop .b.Pause .b.Play .b.Picture -side left",
+ "pack .f -fill x",
+ "pack .b -anchor w",
+ "pack .c -side bottom -fill both -expand 1",
+ "pack propagate . 0",
+};
+
+init(xctxt: ref Draw->Context, nil: list of string)
+{
+ sys = load Sys Sys->PATH;
+ draw = load Draw Draw->PATH;
+ tk = load Tk Tk->PATH;
+ tkclient = load Tkclient Tkclient->PATH;
+ mpeg = load Mpeg Mpeg->PATH;
+
+ ctxt = xctxt;
+
+ tkclient->init();
+
+ (t, menubut) := tkclient->toplevel(ctxt.screen, "", "Mpeg Player", Tkclient->Appl);
+
+ cmd := chan of string;
+ tk->namechan(t, cmd, "cmd");
+
+ tkclient->tkcmds(t, task_cfg);
+
+ tk->cmd(t, "bind . <Configure> {send cmd resize}");
+ tk->cmd(t, "update");
+
+ fname := "";
+ ctl := chan of string;
+ state := Stopped;
+
+ for(;;) alt {
+ menu := <-menubut =>
+ if(menu == "exit") {
+ if(state == Playing) {
+ mpeg->ctl("stop");
+ <-ctl;
+ }
+ return;
+ }
+ tkclient->wmctl(t, menu);
+ press := <-cmd =>
+ case press {
+ "file" =>
+ pat := list of {
+ "*.mpg (MPEG movie file)"
+ };
+ fname = tkclient->filename(ctxt.screen, t, "Locate MPEG clip", pat, "");
+ if(fname != nil) {
+ tk->cmd(t, ".f.name configure -text {"+fname+"}");
+ tk->cmd(t, "update");
+ }
+ "play" =>
+ s := mpeg->play(ctxt.display, nil, 0, canvsize(t), fname, ctl);
+ if(s != nil) {
+ tkclient->dialog(t, "error -fg red", "Play MPEG",
+ "Media player error:\n"+s,
+ 0, "Stop Play"::nil);
+ break;
+ }
+ state = Playing;
+ "resize" =>
+ if(state != Playing)
+ break;
+ r := canvsize(t);
+ s := sys->sprint("window %d %d %d %d",
+ r.min.x, r.min.y, r.max.x, r.max.y);
+ mpeg->ctl(s);
+ "pict" =>
+ if(adjust)
+ break;
+ adjust = 1;
+ spawn pict(t);
+ * =>
+ # Stop & Pause
+ mpeg->ctl(press);
+ }
+ done := <-ctl =>
+ state = Stopped;
+ }
+}
+
+canvsize(t: ref Toplevel): Rect
+{
+ r: Rect;
+
+ r.min.x = int tk->cmd(t, ".c cget -actx") + dx;
+ r.min.y = int tk->cmd(t, ".c cget -acty") + dy;
+ r.max.x = r.min.x + int tk->cmd(t, ".c cget -width") + dw;
+ r.max.y = r.min.y + int tk->cmd(t, ".c cget -height") + dh;
+
+ return r;
+}
+
+pict_cfg := array[] of {
+ "scale .dx -orient horizontal -from -5 -to 5 -label {Origin X}"+
+ " -command { send c dx}",
+ "scale .dy -orient horizontal -from -5 -to 5 -label {Origin Y}"+
+ " -command { send c dy}",
+ "scale .dw -orient horizontal -from -5 -to 5 -label {Width}"+
+ " -command {send c dw}",
+ "scale .dh -orient horizontal -from -5 -to 5 -label {Height}"+
+ " -command {send c dh}",
+ "pack .Wm_t -fill x",
+ "pack .dx .dy .dw .dh -fill x",
+ "pack propagate . 0",
+ "update",
+};
+
+pict(parent: ref Toplevel)
+{
+ targ := +" -borderwidth 2 -relief raised";
+
+ (t, menubut) := tkclient->toplevel(ctxt.screen, tkclient->geom(parent), "Mpeg Picture", 0);
+
+ pchan := chan of string;
+ tk->namechan(t, pchan, "c");
+
+ tkclient->tkcmds(t, pict_cfg);
+
+ for(;;) alt {
+ menu := <-menubut =>
+ if(menu == "exit") {
+ adjust = 0;
+ return;
+ }
+ tkclient->wmctl(t, menu);
+ tcip := <-pchan =>
+ case tcip {
+ "dx" => dx = int tk->cmd(t, ".dx get");
+ "dy" => dy = int tk->cmd(t, ".dy get");
+ "dw" => dw = int tk->cmd(t, ".dw get");
+ "dh" => dh = int tk->cmd(t, ".dh get");
+ }
+ r := canvsize(parent);
+ s := sys->sprint("window %d %d %d %d",
+ r.min.x, r.min.y, r.max.x, r.max.y);
+ mpeg->ctl(s);
+ }
+}