aboutsummaryrefslogtreecommitdiff
path: root/multimedia/vic/files/patch-al
diff options
context:
space:
mode:
authorJordan K. Hubbard <jkh@FreeBSD.org>1998-06-24 07:54:40 +0000
committerJordan K. Hubbard <jkh@FreeBSD.org>1998-06-24 07:54:40 +0000
commitb39ac6d642143a74bf5bb26fac58f657db08b199 (patch)
tree1523ca6cffccae4139a05ac293033f80578138ed /multimedia/vic/files/patch-al
parent35cc4b025e6e52f19d9cbf1bd5f2a07517031ab8 (diff)
These patches implement the following features in vic:
* an x11 grabber similar to the one present in nv. Extremely useful for interactive work (i'd say better than a camera in many cases). * add video controls to the meteor grabber (brightness etc.) * add tuner control when used with the meteor grabber (require a small modification to the kernel to let tuner be controlled via the grabber fd); Submitted by: luigi PR: 6814
Notes
Notes: svn path=/head/; revision=11502
Diffstat (limited to 'multimedia/vic/files/patch-al')
-rw-r--r--multimedia/vic/files/patch-al706
1 files changed, 706 insertions, 0 deletions
diff --git a/multimedia/vic/files/patch-al b/multimedia/vic/files/patch-al
new file mode 100644
index 000000000000..668fefff59e4
--- /dev/null
+++ b/multimedia/vic/files/patch-al
@@ -0,0 +1,706 @@
+diff -ubwr ./grabber-meteor.cc /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/grabber-meteor.cc
+--- ./grabber-meteor.cc Fri May 29 17:06:00 1998
++++ /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/grabber-meteor.cc Mon Apr 13 20:47:54 1998
+@@ -59,6 +59,7 @@
+ #include "bsd-endian.h"
+
+ #include <machine/ioctl_meteor.h>
++#include <machine/ioctl_bt848.h>
+
+ /*XXX*/
+ #define NTSC_WIDTH 320
+@@ -92,6 +93,7 @@
+ u_int baseheight_; /* Width of frame to be captured */
+ u_int decimate_; /* division of base sizes */
+ volatile u_int* pyuv_; /* pointer to yuv data */
++ int tuner_ ; /* tuner device... */
+ };
+
+ class Meteor422Grabber : public MeteorGrabber {
+@@ -131,24 +133,16 @@
+
+ MeteorScanner::MeteorScanner(const int n)
+ {
+- char* devname_template = "/dev/meteor%d";
+- char* nickname_template = "Matrox Meteor %d";
+- char* devname_template1 = "/dev/bktr%d";
+- char* nickname_template1 = "BrookTree848 %d";
+-
+-
++ static char *d[] = { "/dev/bktr%d", "/dev/meteor%d", NULL };
++ char *nickname_template = "meteor-%d";
+
+ for(int i = 0; i < n; i++) {
+- char *devname = new char[strlen(devname_template) + 3];
++ for (int j = 0 ; d[j] != NULL ; j++) {
++ char *devname = new char[strlen(d[j]) + 3];
+ char *nickname = new char[strlen(nickname_template) + 3];
+- char *devname1 = new char[strlen(devname_template1) + 3];
+- char *nickname1 = new char[strlen(nickname_template1) + 3];
+
++ sprintf(devname, d[j], i);
+ sprintf(nickname, nickname_template, i + 1);
+- sprintf(devname, devname_template, i);
+-
+- sprintf(nickname1, nickname_template1, i + 1);
+- sprintf(devname1, devname_template1, i);
+ if(access(devname, R_OK) == 0) {
+ int fd = open(devname, O_RDONLY);
+ if(fd < 0) {
+@@ -161,29 +155,17 @@
+ delete nickname;
+ delete devname;
+ }
+-
+- if(access(devname1, R_OK) == 0) {
+- int fd = open(devname1, O_RDONLY);
+- if(fd < 0) {
+- new MeteorDevice(nickname1, devname1, 0);
+- } else {
+- (void)close(fd);
+- new MeteorDevice(nickname1, devname1, 1);
+ }
+- } else {
+- delete nickname1;
+- delete devname1;
+ }
+ }
+
+-}
+-
+ MeteorDevice::MeteorDevice(const char* nickname, const char *devname, int free):
+ InputDevice(nickname), name_(devname)
+ {
+ if(free)
+ attributes_ = "\
+ format {422 411} \
++type {pal ntsc secam auto} \
+ size {large normal small cif} \
+ port {RCA Port-1 Port-2 Port-3 S-Video RGB}";
+ else
+@@ -208,6 +190,7 @@
+
+ MeteorGrabber::MeteorGrabber(const char* name)
+ {
++ tuner_ = open("/dev/tuner", O_RDONLY);
+ dev_ = open(name, O_RDONLY);
+ if (dev_ == -1) {
+ status_ = -1;
+@@ -230,6 +213,8 @@
+ if (dev_ != -1) {
+ close(dev_);
+ }
++ if (tuner_ != -1)
++ close(tuner_);
+ }
+
+ void MeteorGrabber::set_size_meteor(int w, int h)
+@@ -245,23 +230,14 @@
+ * means do so.
+ */
+ unsigned short status;
+- ioctl(dev_, METEORSTATUS, &status);
+- if(status & METEOR_STATUS_HCLK) {
+- /* No source, assume ntsc */
++ // ioctl(dev_, METEORSTATUS, &status);
++ if ( video_format_ == METEOR_FMT_NTSC ) {
+ if(geom.rows <= NTSC_HEIGHT && geom.columns <= NTSC_WIDTH)
+ geom.oformat |= METEOR_GEO_EVEN_ONLY;
+ } else {
+- /* is it pal or ntsc? */
+- if(status & METEOR_STATUS_FIDT) {
+- /* 60 hz */
+- if(geom.rows<=NTSC_HEIGHT && geom.columns<=NTSC_WIDTH)
+- geom.oformat |= METEOR_GEO_EVEN_ONLY;
+- } else { /* 50 hz */
+ if(geom.rows<=PAL_HEIGHT && geom.columns<=PAL_WIDTH)
+ geom.oformat |= METEOR_GEO_EVEN_ONLY;
+ }
+- }
+-
+ if(ioctl(dev_, METEORSETGEO, &geom) < 0)
+ perror("vic: METERSETGEO: ");
+ }
+@@ -326,7 +302,7 @@
+ void MeteorGrabber::fps(int f)
+ {
+ u_short met_fps = (u_short)f;
+- (void)ioctl(dev_, METEORSFPS, &met_fps);
++ // (void)ioctl(dev_, METEORSFPS, &met_fps);
+
+ Grabber::fps(f);
+ }
+@@ -367,6 +343,28 @@
+ }
+ return (TCL_OK);
+ }
++ if (strcmp(argv[1], "freeze") == 0) {
++ int cmd = METEOR_CAP_CONTINOUS ;
++ if ( atoi(argv[2]) != 0 )
++ cmd = METEOR_CAP_STOP_CONT;
++ ioctl(dev_, METEORCAPTUR, (char*)&cmd);
++ return (TCL_OK);
++ }
++ if (strcmp(argv[1], "chan") == 0) {
++ int p = port_;
++ int c = atoi(argv[2]);
++ if (c > 0 && c < 199)
++ p = METEOR_INPUT_DEV1 ;
++ else
++ p = METEOR_INPUT_DEV0 ;
++ if (p != port_) {
++ port_ = p;
++ ioctl(dev_, METEORSINPUT, &port_);
++ }
++ if (p == METEOR_INPUT_DEV1)
++ ioctl(dev_, TVTUNER_SETCHNL, &c);
++ return (TCL_OK);
++ }
+ if (strcmp(argv[1], "format") == 0 ||
+ strcmp(argv[1], "type") == 0) {
+ if (strcmp(argv[2], "auto") == 0)
+@@ -437,7 +435,7 @@
+ if (strcmp(argv[1], "brightness") == 0) {
+ u_char val;
+ ioctl(dev_, METEORGBRIG, &val);
+- tcl.resultf("%d", (int)val);
++ tcl.resultf("%d", (unsigned int)val);
+ return (TCL_OK);
+ }
+ if (strcmp(argv[1], "contrast") == 0) {
+@@ -507,10 +505,10 @@
+ return 0;
+
+ int istride = inw_ * 2;
+- suppress((u_char*)pyuv_, istride);
+- saveblks((u_char*)pyuv_, istride);
++ suppress((u_char*)pyuv_, istride); // compute which ones to send
++ saveblks((u_char*)pyuv_, istride); // save copied blocks
+ u_int32_t ts = media_ts();
+- YuvFrame f(ts, frame_, crvec_, outw_, outh_);
++ YuvFrame f(ts, frame_, crvec_, outw_, outh_); // new obj.
+ return (target_->consume(&f));
+ }
+
+@@ -724,6 +722,7 @@
+ u_char* chm = lum + off;
+ off >>= 2;
+
++int to_send = 0 ;
+ crv += vstart_ * blkw_ + hstart_;
+ lum += vstart_ * outw_ * 16 + hstart_ * 16;
+ chm += vstart_ * (outw_ >> 1) * 8 + hstart_ * 8;
+@@ -734,9 +733,10 @@
+ const u_char* nin = in;
+ for (int x = hstart_; x < hstop_; ++x) {
+ int s = *crv++;
+- if ((s & CR_SEND) != 0)
++ if ((s & CR_SEND) != 0) {
+ saveblk(in, lum, chm, chm + off, outw_, is);
+-
++ to_send++ ;
++ }
+ in += 32;
+ lum += 16;
+ chm += 8;
+@@ -746,4 +746,5 @@
+ chm += 7 * (outw_ >> 1) + skip * 8;
+ in = nin + 16 * is;
+ }
++ // fprintf(stderr, "this time send %d\n", to_send);
+ }
+diff -ubwr ./grabber.cc /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/grabber.cc
+--- ./grabber.cc Tue Feb 6 00:02:00 1996
++++ /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/grabber.cc Fri Apr 10 15:36:42 1998
+@@ -69,6 +69,7 @@
+ hstart_(0), hstop_(0),
+ framebase_(0), frame_(0),
+ inw_(0), inh_(0), outw_(0), outh_(0),
++ threshold_(48),
+ target_(0), tx_(0)
+ {
+ bps(128);
+@@ -122,6 +123,10 @@
+ }
+ return (TCL_OK);
+ }
++ if (strcmp(argv[1], "threshold") == 0) {
++ threshold_ = 8*atoi(argv[2]);
++ return (TCL_OK);
++ }
+ if (strcmp(argv[1], "fps") == 0) {
+ /*XXX assume value in range */
+ fps(atoi(argv[2]));
+@@ -194,11 +199,14 @@
+ * favoring the more restrictive metric. If we're more than
+ * 200ms behind (e.g., the cpu is saturated or we've been
+ * suspended), give up and reset the frame clock.
++ * The argument passed is the number of bytes transmitted.
+ */
+ double Grabber::tick(int n)
+ {
++ // how much it took to send the data (microseconds)
+ double frametime = 8e6 * double(n) / double(bps_);
+ if (frametime < frametime_) {
++ // took less than one frame...
+ if (frametime * 2. < frametime_)
+ delta_ += (frametime - delta_) * .25;
+ else
+@@ -207,6 +215,7 @@
+ } else
+ delta_ = frametime;
+
++ // when to get next frame (not earlier than now!
+ frameclock_ += frametime;
+ double now = gettimeofday();
+ double delta = frameclock_ - now;
+diff -ubwr ./grabber.h /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/grabber.h
+--- ./grabber.h Tue Feb 6 00:02:00 1996
++++ /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/grabber.h Fri Apr 10 15:37:28 1998
+@@ -87,6 +87,7 @@
+ int vstop_;
+ int hstart_;
+ int hstop_;
++ int threshold_ ; // when a block is changed ? (was constant 48)
+
+ u_int framesize_;
+ u_char* framebase_;
+@@ -160,19 +161,19 @@
+ rb -= _rs << 3; \
+ \
+ int center = 0; \
+- if (left >= 48 && x > 0) { \
++ if (left >= threshold_ && x > 0) { \
+ crv[-1] = CR_MOTION|CR_SEND; \
+ center = 1; \
+ } \
+- if (right >= 48 && x < w - 1) { \
++ if (right >= threshold_ && x < w - 1) { \
+ crv[1] = CR_MOTION|CR_SEND; \
+ center = 1; \
+ } \
+- if (bottom >= 48 && y < blkh_ - 1) { \
++ if (bottom >= threshold_ && y < blkh_ - 1) { \
+ crv[w] = CR_MOTION|CR_SEND; \
+ center = 1; \
+ } \
+- if (top >= 48 && y > 0) { \
++ if (top >= threshold_ && y > 0) { \
+ crv[-w] = CR_MOTION|CR_SEND; \
+ center = 1; \
+ } \
+diff -ubwr ./ui-ctrlmenu.tcl /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-ctrlmenu.tcl
+--- ./ui-ctrlmenu.tcl Thu Jun 27 01:27:48 1996
++++ /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-ctrlmenu.tcl Fri Apr 10 16:39:04 1998
+@@ -124,6 +124,7 @@
+ catch "wm resizable $w false false"
+
+ frame $w.session
++ # luigi - move next 2 lines to ui-main
+ frame $w.cb
+ build.xmit $w.cb
+ frame $w.encoder
+@@ -139,9 +140,12 @@
+ -relief raised -anchor c \
+ -command "toggle_window $w" -font [mediumfont]
+
++ # luigi $w.cb goes into main menu
+ pack $w.cb $w.encoder $w.decoder $w.session -padx 6 -fill x
++ # pack $w.encoder $w.decoder $w.session -padx 6 -fill x
+ pack $w.dismiss -anchor c -pady 4
+
++ # luigi - move next 3 lines to ui-main (must check something)
+ if [have_transmit_permission] {
+ selectInitialDevice
+ }
+@@ -390,11 +394,15 @@
+ -relief raised -command transmit \
+ -anchor w -variable transmitButtonState -font $f \
+ -state disabled -highlightthickness 0
++ checkbutton $w.freeze -text "Freeze" \
++ -relief raised -command "grabber freeze \$freeze" \
++ -anchor w -variable freeze -font $f \
++ -highlightthickness 0
+ button $w.release -text "Release" \
+ -relief raised -command release_device \
+ -font $f -highlightthickness 0
+
+- pack $w.send $w.release -fill both
++ pack $w.send $w.release $w.freeze -fill both
+ }
+
+ proc doNothing { args } {
+@@ -434,8 +442,9 @@
+
+ frame $w.bps
+ scale $w.bps.scale -orient horizontal -font $f \
+- -showvalue 0 -from 10 -to [option get . maxbw Vic] \
++ -showvalue 0 -from 1 -to [option get . maxbw Vic] \
+ -command "set_bps $w.bps.value" -width 12 \
++ -sliderlength 20 \
+ -relief groove
+ label $w.bps.value -font $f -width 8 -anchor w
+
+@@ -443,6 +452,7 @@
+ scale $w.fps.scale -font $f -orient horizontal \
+ -showvalue 0 -from 1 -to 30 \
+ -command "set_fps $w.fps.value" -width 12 \
++ -sliderlength 20 \
+ -relief groove
+ label $w.fps.value -font $f -width 8 -anchor w
+
+@@ -564,7 +574,7 @@
+ proc select_device device {
+ global transmitButton sizeButtons portButton formatButtons \
+ videoFormat defaultFormat lastDevice defaultPort inputPort \
+- transmitButtonState
++ transmitButtonState typeButton
+
+ #
+ # Remember settings of various controls for previous device
+@@ -607,6 +617,11 @@
+ } else {
+ $portButton configure -state disabled
+ }
++ if [device_supports $device type *] {
++ $typeButton configure -state normal
++ } else {
++ $typeButton configure -state disabled
++ }
+
+ insert_grabber_panel [$device nickname]
+
+@@ -765,7 +780,7 @@
+ -value secam -variable inputType -font $f
+
+ global inputType typeButton
+- set inputType auto
++ set inputType pal ; # auto
+ set typeButton $w
+ }
+
+@@ -774,7 +789,8 @@
+ build.encoder_options $w.options
+ build.device $w.device
+ build.port $w.port
+- pack $w.device $w.port $w.options -fill x
++ build.type $w.type
++ pack $w.device $w.port $w.type $w.options -fill x
+ }
+
+ proc build.encoder_options w {
+@@ -1172,6 +1188,9 @@
+ global inputPort inputType portButton typeButton
+ if { [$portButton cget -state] == "normal" } {
+ $grabber port $inputPort
++ }
++ if { [$typeButton cget -state] == "normal" } {
++ $grabber type $inputType
+ }
+ setFillRate
+ update
+diff -ubwr ./ui-grabber.tcl /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-grabber.tcl
+--- ./ui-grabber.tcl Fri Jun 21 04:39:35 1996
++++ /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-grabber.tcl Fri Apr 10 13:54:42 1998
+@@ -39,65 +39,93 @@
+ # called foo-1, foo-2, etc. and you'll only need build.foo
+ #
+
++proc build.meteor w {
++#
++# The meteor has the same controls as the slicvideo, so just call that
++# routine to build the controls.
++
++ build.slicvideo $w
++}
++
++proc build.bktr w {
++ build.slicvideo $w
++}
++
+ proc build.slicvideo w {
+ set f [smallfont]
++# set f "-*-helvetica-medium-r-normal--*-100-75-75-*-*-*-*"
+ label $w.title -text "Grabber"
+ frame $w.f -relief sunken -borderwidth 2
+
+ frame $w.f.h -relief flat
+
+- label $w.f.h.label -font $f -anchor e -text "Hue"
+-
+- scale $w.f.h.scale -orient horizontal -width 12 -length 20 \
+- -relief groove -showvalue 0 -from -128 -to 127 \
+- -command "grabber set HUE"
+- pack $w.f.h.label $w.f.h.scale -side left -fill x -expand 1
+-
+- frame $w.f.ll -relief flat
+-
+- label $w.f.ll.label -font $f -text "Luma" -anchor s
+-
+- label $w.f.ll.clabel -font $f -text "Contrast" -anchor s
+-
+- label $w.f.ll.blabel -font $f -text "Brightness" -anchor s
+- pack $w.f.ll.clabel $w.f.ll.label $w.f.ll.blabel \
++ frame $w.f.h.c
++ label $w.f.h.c.l1 -font $f -anchor e -text "Chan:"
++ mk.entry $w.f.h.c do_chan "20"
++ $w.f.h.c.entry configure -relief sunken -width 5
++ bind $w.f.h.c.entry <Return> "grabber chan \[$w.f.h.c.entry get\]"
++ pack $w.f.h.c.l1 $w.f.h.c.entry -side top
++
++ global ths
++ scale $w.f.h.ths \
++-orient horizontal -width 12 -length 60 -relief groove -sliderlength 6 \
++ -showvalue 0 -from 1 -to 10 \
++ -command "grabber threshold" -label Thre
++ $w.f.h.ths set 6
++ # the actual scale is multiplied by 8
++ scale $w.f.h.scale \
++-orient horizontal -width 12 -length 100 -relief groove \
++ -showvalue 0 -from -128 -to 127 \
++ -command "grabber hue" -label Hue
++ pack $w.f.h.c \
++ $w.f.h.ths \
++ $w.f.h.scale \
+ -side left -fill x -expand 1
+
++# frame $w.f.ll -relief flat
++# label $w.f.ll.label -font $f -text "Luma" -anchor s
++# label $w.f.ll.clabel -font $f -text "Contrast" -anchor s
++# label $w.f.ll.blabel -font $f -text "Brightness" -anchor s
++# pack $w.f.ll.clabel $w.f.ll.label $w.f.ll.blabel \
++# -side left -fill x -expand 1
++
+ frame $w.f.l -relief flat
+
+- scale $w.f.l.cscale -orient horizontal -width 12 -relief groove \
++ scale $w.f.l.cscale \
++-orient horizontal -width 12 -length 100 -relief groove \
+ -showvalue 0 -from 0 -to 127 \
+- -command "grabber set LUMA_CONTRAST"
++ -label "Contrast" \
++ -command "grabber contrast"
+
+- scale $w.f.l.bscale -orient horizontal -width 12 -relief groove \
++ scale $w.f.l.bscale \
++-orient horizontal -width 12 -length 100 -relief groove \
+ -showvalue 0 -from 0 -to 255 \
+- -command "grabber set LUMA_BRIGHTNESS"
++ -command "grabber brightness" -label "Brightness"
+ pack $w.f.l.cscale $w.f.l.bscale -side left -fill x -expand 1
+
+- frame $w.f.cl -relief flat
+-
+- label $w.f.cl.label -font $f -text "Chroma" -anchor n
+-
+- label $w.f.cl.glabel -font $f -text "Gain" -anchor n
+-
+- label $w.f.cl.slabel -font $f -text "Saturation" -anchor n
+- pack $w.f.cl.glabel $w.f.cl.label $w.f.cl.slabel \
+- -side left -fill x -expand 1
++# frame $w.f.cl -relief flat
++# label $w.f.cl.label -font $f -text "Chroma" -anchor n
++# label $w.f.cl.glabel -font $f -text "Gain" -anchor n
++# label $w.f.cl.slabel -font $f -text "Saturation" -anchor n
++# pack $w.f.cl.glabel $w.f.cl.label $w.f.cl.slabel \
++# -side left -fill x -expand 1
+
+ frame $w.f.c -relief flat
+
+- scale $w.f.c.gscale -orient horizontal -width 12 -relief groove \
++ scale $w.f.c.gscale \
++-orient horizontal -width 12 -length 100 -relief groove \
+ -showvalue 0 -from 0 -to 255 \
+- -command "grabber set CHROMA_GAIN"
++ -command "grabber uvgain" -label "Chr. Gain"
+
+- scale $w.f.c.sscale -orient horizontal -width 12 -relief groove \
++ scale $w.f.c.sscale \
++-orient horizontal -width 12 -length 100 -relief groove \
+ -showvalue 0 -from 0 -to 127 \
+- -command "grabber set CHROMA_SATURATION"
++ -command "grabber saturation" -label "Saturation"
+ pack $w.f.c.gscale $w.f.c.sscale -side left -fill x -expand 1
+
+
+- pack $w.f.h $w.f.ll $w.f.l $w.f.c $w.f.cl \
+- -fill x -expand 1 -padx 1m
++ # pack $w.f.h $w.f.ll $w.f.l $w.f.c $w.f.cl
++ pack $w.f.h $w.f.l $w.f.c -fill x -expand 1 -padx 1m
+
+
+ pack $w.title $w.f -fill x -expand 1
+@@ -109,6 +137,10 @@
+ $w.f.c.sscale set 64
+ }
+
++#
++# STILL image-grabber (?)
++#
++
+ proc build.still w {
+
+ set f [smallfont]
+@@ -131,6 +163,10 @@
+ $lastDevice file $s
+ }
+
++#
++# quickcam grabber
++#
++
+ proc build.qcam {w} {
+ global qcamwindow
+
+@@ -190,3 +226,118 @@
+ set qcamwindow(setwbal) "$w.f.s.s.wbal.scale set"
+ set qcamwindow(setbpp) "set qcambpp"
+ }
++
++#
++# X11 Grabber controls
++#
++proc x11grabUpdatePos {x y w h} {
++
++ global x11grabcontrols
++ set w $x11grabcontrols
++
++ if {[string compare $x [$w.x11grab.row1.pos.x.e get]] != 0} {
++ $w.x11grab.row1.pos.x.e delete 0 end
++ $w.x11grab.row1.pos.x.e insert 0 $x
++ }
++ if {[string compare $y [$w.x11grab.row1.pos.y.e get]] != 0} {
++ $w.x11grab.row1.pos.y.e delete 0 end
++ $w.x11grab.row1.pos.y.e insert 0 $y
++ }
++ if {[string compare $w [$w.x11grab.row1.pos.w.e get]] != 0} {
++ $w.x11grab.row1.pos.w.e delete 0 end
++ $w.x11grab.row1.pos.w.e insert 0 $w
++ }
++ if {[string compare $h [$w.x11grab.row1.pos.h.e get]] != 0} {
++ $w.x11grab.row1.pos.h.e delete 0 end
++ $w.x11grab.row1.pos.h.e insert 0 $h
++ }
++}
++
++proc x11cmd.update.geo w {
++ grabber fixed [$w.row.x get] [$w.row.y get]
++}
++
++proc x11cmd.fixed {} {
++ global x11Source x11grabcontrols
++ set w $x11grabcontrols
++ $w.label configure -text "$x11Source"
++ if [winfo exists $w.row] {
++ destroy $w.row
++ }
++ frame $w.row
++ pack append $w.row \
++ [label $w.row.xl -text "X:" -width 2 -anchor e] {left filly} \
++ [entry $w.row.x -relief flat -width 4] {left filly} \
++ [label $w.row.yl -text "Y:" -width 2 -anchor e] {left filly} \
++ [entry $w.row.y -relief flat -width 4] {left filly}
++ bind $w.row.x <Return> "x11cmd.update.geo $w"
++ bind $w.row.y <Return> "x11cmd.update.geo $w"
++
++ pack $w.row -after $w.label
++}
++
++proc x11cmd.pointer {} {
++ global x11Source x11grabcontrols
++ set w $x11grabcontrols
++ $w.label configure -text "$x11Source"
++ if [winfo exists $w.row] {
++ destroy $w.row
++ }
++ frame $w.row
++ pack append $w.row \
++ [button $w.row.s -text "Follow pointer" ] { left filly }
++ pack $w.row -after $w.label
++}
++
++proc x11cmd.window {} {
++ global x11Source x11grabcontrols
++ puts "x11cmd -- x11Source $x11Source"
++ set w $x11grabcontrols
++ $w.label configure -text "$x11Source"
++ if [winfo exists $w.row] {
++ destroy $w.row
++ }
++ frame $w.row
++ pack append $w.row \
++ [button $w.row.s -text "Select window" ] { left filly }
++ pack $w.row -after $w.label
++}
++
++proc build.x11 w {
++ global x11grabcontrols x11Source
++ set f [smallfont]
++
++ label $w.title -text "X11 Grabber controls"
++ frame $w.x11grab -relief sunken -borderwidth 2
++ set x11grabcontrols $w.x11grab
++ set x11Source "Fixed"
++ set w1 $w.x11grab
++
++
++ # luigi
++ set m $w1.menu
++ set m1 $m.m1
++ menubutton $w1.menu -menu $m1 -text "Source:" \
++ -relief raised -width 7 -font $f
++ label $w1.label -width 6 -font $f
++ frame $w1.row
++ menu $m1
++ $m1 add radiobutton -label Fixed \
++ -state active \
++ -command "x11cmd.fixed" -font $f -variable x11Source
++# $m1 add radiobutton -label Pointer \
++# -command "x11cmd.pointer" -font $f -variable x11Source
++# $m1 add radiobutton -label Window \
++# -command "x11cmd.window" -font $f -variable x11Source
++
++ pack append $w1 \
++ $w1.menu {left} \
++ $w1.label {left} \
++ $w1.row {left}
++
++ pack $w $w.title $w1 -fill x -expand 1
++
++ x11cmd.fixed
++}
++
++### end of file ###
+diff -ubwr ./ui-resource.tcl /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-resource.tcl
+--- ./ui-resource.tcl Wed Apr 3 02:33:56 1996
++++ /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-resource.tcl Fri Apr 10 21:11:56 1998
+@@ -140,7 +140,7 @@
+ option add Vic.useHardwareDecode false startupFile
+ option add Vic.infoHighlightColor LightYellow2 startupFile
+ option add Vic.useJPEGforH261 false startupFile
+- option add Vic.stillGrabber false startupFile
++ option add Vic.stillGrabber true startupFile ; # XXX was false
+ option add Vic.siteDropTime "300" startupFile
+
+ #
+diff -ubwr ./ui-util.tcl /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-util.tcl
+--- ./ui-util.tcl Tue Feb 6 00:02:20 1996
++++ /home/old_wd0f/ports/mbone/vic/work.luigi/vic-2.8-luigi/ui-util.tcl Fri Apr 10 20:49:56 1998
+@@ -64,7 +64,7 @@
+ global created$w
+ if { ! [info exists created$w] } {
+ set created$w 1
+- wm transient $w .
++ # wm transient $w .
+ update idletasks
+ set x [winfo rootx .]
+ set y [winfo rooty .]
+@@ -103,7 +103,7 @@
+ }
+ set title [resource iconPrefix]$title
+ wm withdraw $w
+- wm transient $w .
++ # wm transient $w .
+ wm title $w $title
+ wm iconname $w $title
+ bind $w <Enter> "focus $w"