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
This commit is contained in:
Jordan K. Hubbard 1998-06-24 07:54:40 +00:00
parent 35cc4b025e
commit b39ac6d642
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=11502
4 changed files with 4082 additions and 0 deletions

706
mbone/vic/files/patch-al Normal file
View file

@ -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"

1335
mbone/vic/files/patch-am Normal file

File diff suppressed because it is too large Load diff

View file

@ -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"

File diff suppressed because it is too large Load diff