Changeset 729

Show
Ignore:
Timestamp:
09/10/98 11:35:59 (16 years ago)
Author:
ucackha
Message:

Replaced trashed files with originals. Kris

Location:
vic/trunk
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • vic/trunk/Makefile.in

    r728 r729  
    4141 
    4242.cc.o: 
    43         $(C++) -o $@ -c $(CFLAGS) $*.cc 
     43        rm -f $@; $(C++) -o $@ -c $(CFLAGS) $*.cc 
    4444 
    4545.c.o: 
    46         $(CC) -o $@ -c $(CFLAGS) $*.c 
     46        rm -f $@; $(CC) -o $@ -c $(CFLAGS) $*.c 
    4747 
    4848ED_YBITS = 4 
     
    113113        iohandler.o timer.o idlecallback.o media-timer.o \ 
    114114        session.o session-rtpv1.o session-nv.o session-ivs.o \ 
    115         mbus.o mbus_engine.o \ 
    116115        decoder.o decoder-jpeg.o decoder-nv.o \ 
    117116        decoder-h261.o decoder-h261v1.o \ 
     
    129128        $(TCL_VIC:.tcl=.o) tk.o 
    130129SRC =   $(OBJ1:.o=.c) $(OBJ2:.o=.cc) $(BROKEN_OBJ:.o=.c) \ 
    131         $(RTIP_OBJ:.o=.c) $(SRC_GRABBER) $(OBJ_XIL:.o=.cc) $(OBJ_CRYPT:.o=.c) 
     130        $(RTIP_OBJ:.o=.c) $(SRC_GRABBER) $(OBJ_XIL:.o=.cc) $(OBJ_CRYPT:.o=.cc) 
    132131OBJ =   $(OBJ1) $(OBJ2) $(OBJ3) $(BROKEN_OBJ) $(RTIP_OBJ) 
    133132 
     
    159158OBJ_CB = cbAppInit.o cb.o confbus.o group-ipc.o iohandler.o \ 
    160159        net.o net-ip.o crypt.o crypt-dull.o $(OBJ_CRYPT) communicator.o \ 
    161         ppm.o Tcl.o Tcl2.o inet.o md5c.o  
     160        ppm.o Tcl.o Tcl2.o inet.o md5c.o 
    162161 
    163162OBJ_H261DUMP = h261_dump.o p64/p64.o p64/p64dump.o huffcode.o dct.o bv.o 
    164163 
    165 vic: $(OBJ) $(OBJ_GRABBER) $(JV_LIB) $(OBJ_CRYPT) 
     164vic:    $(OBJ) $(OBJ_GRABBER) $(JV_LIB) 
     165        rm -f $@ 
     166        $(C++) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(OBJ_GRABBER) $(LIB) $(STATIC) 
     167 
     168vic.des: $(OBJ) $(OBJ_GRABBER) $(JV_LIB) $(OBJ_CRYPT) 
    166169        rm -f $@ 
    167170        $(C++) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(OBJ_GRABBER) $(OBJ_CRYPT) $(LIB) $(STATIC) 
     
    319322 
    320323tags:   force 
    321         etags $(SRC) *.h  
     324        ctags -tdwC $(SRC) *.h $(TKSRC)/*.c $(TKSRC)/*.h \ 
     325                $(TCLSRC)/*.c $(TCLSRC)/*.h 
    322326 
    323327force: 
  • vic/trunk/cf-main.tcl

    r725 r729  
     1# 
     2# Copyright (c) 1995 Regents of the University of California. 
     3# All rights reserved. 
     4# 
     5# Redistribution and use in source and binary forms, with or without 
     6# modification, are permitted provided that the following conditions 
     7# are met: 
     8# 1. Redistributions of source code must retain the above copyright 
     9#    notice, this list of conditions and the following disclaimer. 
     10# 2. Redistributions in binary form must reproduce the above copyright 
     11#    notice, this list of conditions and the following disclaimer in the 
     12#    documentation and/or other materials provided with the distribution. 
     13# 3. All advertising materials mentioning features or use of this software 
     14#    must display the following acknowledgement: 
     15#       This product includes software developed by the Network Research 
     16#       Group at Lawrence Berkeley National Laboratory. 
     17# 4. Neither the name of the University nor of the Laboratory may be used 
     18#    to endorse or promote products derived from this software without 
     19#    specific prior written permission. 
     20# 
     21# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
     22# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
     23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
     24# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
     25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
     26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
     27# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
     28# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
     29# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
     30# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
     31# SUCH DAMAGE. 
     32# 
     33 
     34set rtp_type(22) bvc 
     35set rtp_type(25) cellb 
     36set rtp_type(26) jpeg 
     37set rtp_type(27) cuseeme 
     38set rtp_type(28) nv 
     39set rtp_type(29) picw 
     40set rtp_type(30) cpv 
     41set rtp_type(31) h261 
     42set rtp_type(32) mpeg 
     43set rtp_type(127) h261v1 
     44 
     45proc vic_main {} { 
     46        global V 
     47        set V(class) Vic     
     48        set V(app) vic 
     49        set V(media) video 
     50        init_local 
     51        init_confbus 
     52        init_network 
     53        init_gui 
     54        init_late 
     55        if [yesno transmitOnStartup] { 
     56                build.menu 
     57                global transmitButton 
     58                $transmitButton invoke 
     59        } 
     60} 
  • vic/trunk/main.cc

    r725 r729  
     1/*- 
     2 * Copyright (c) 1993-1994 The Regents of the University of California. 
     3 * All rights reserved. 
     4 * 
     5 * Redistribution and use in source and binary forms, with or without 
     6 * modification, are permitted provided that the following conditions 
     7 * are met: 
     8 * 1. Redistributions of source code must retain the above copyright 
     9 *    notice, this list of conditions and the following disclaimer. 
     10 * 2. Redistributions in binary form must reproduce the above copyright 
     11 *    notice, this list of conditions and the following disclaimer in the 
     12 *    documentation and/or other materials provided with the distribution. 
     13 * 3. All advertising materials mentioning features or use of this software 
     14 *    must display the following acknowledgement: 
     15 *      This product includes software developed by the University of 
     16 *      California, Berkeley and the Network Research Group at 
     17 *      Lawrence Berkeley Laboratory. 
     18 * 4. Neither the name of the University nor of the Laboratory may be used 
     19 *    to endorse or promote products derived from this software without 
     20 *    specific prior written permission. 
     21 * 
     22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
     23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
     24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
     25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
     26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
     27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
     28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
     29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
     30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
     31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
     32 * SUCH DAMAGE. 
     33 */ 
     34static const char rcsid[] = 
     35    "@(#) $Header$ (LBL)"; 
     36 
     37#include <stdio.h> 
     38#include <stdlib.h> 
     39#ifdef WIN32 
     40#include <windows.h> 
     41#else 
     42#include <unistd.h> 
     43#endif 
     44#include <errno.h> 
     45#include <signal.h> 
     46#include <string.h> 
     47#include <ctype.h> 
     48#ifdef WIN32 
     49#include <winsock.h> 
     50#include <process.h> 
     51#include <time.h> 
     52#else 
     53#include <sys/param.h> 
     54#include <netinet/in.h> 
     55#include <netdb.h> 
     56#include <sys/file.h> 
     57#include <sys/utsname.h> 
     58#endif 
     59#ifdef sgi 
     60#include <getopt.h> 
     61#include <math.h> 
     62#endif 
     63#include <X11/Xlib.h> 
     64#include <X11/Xutil.h> 
     65 
     66extern "C" { 
     67#include <tk.h> 
     68#ifdef USE_SHM 
     69#ifdef sgi 
     70#define XShmAttach __XShmAttach__ 
     71#endif 
     72#include <X11/extensions/XShm.h> 
     73#ifdef _AIX 
     74extern Bool XShmQueryExtension (Display *dpy); 
     75#endif 
     76#ifdef sgi 
     77#undef XShmAttach 
     78int XShmAttach(Display*, XShmSegmentInfo*); 
     79#endif 
     80#include <sys/ipc.h> 
     81#include <sys/shm.h> 
     82#if defined(sun) && !defined(__svr4__) 
     83int shmget(key_t, int, int); 
     84int shmctl(int shmid, int cmd, struct shmid_ds *); 
     85#endif 
     86#endif 
     87} 
     88 
     89#if defined(sun) && !defined(__svr4__) 
     90extern "C" int gettimeofday(struct timeval*, struct timezone*); 
     91extern "C" int nice(int incr); 
     92#endif 
     93#if defined(sun) || defined(__osf__) 
     94extern "C" int gethostname(char* name, int len); 
     95#endif 
     96 
     97#include "inet.h" 
     98#include "Tcl.h" 
     99#include "transmitter.h" 
     100 
     101/*XXX*/ 
     102#define PROTOTYPES 1  
     103#include "global.h" 
     104#include "md5.h" 
     105 
     106#if defined(sun) && defined(__svr4__) 
     107#include <sys/utsname.h> 
     108#define gethostname(name, len) { \ 
     109        struct utsname _uts_; \ 
     110\ 
     111        if (uname(&_uts_) < 0) { \ 
     112                perror("uname"); \ 
     113                exit(1); \ 
     114        }\ 
     115\ 
     116        strcpy((name), _uts_.nodename); \ 
     117} 
     118#endif 
     119  
     120static void 
     121usage() 
     122{ 
     123        fprintf(stderr, "\ 
     124Usage: vic [-HPs] [-A nv|ivs|rtp] [-B maxbps] [-C conf]\n\ 
     125\t[-c ed|gray|od|quantize] [-D device] [-d display]\n\ 
     126\t[-f bvc|cellb|h261|jpeg|nv] [-F maxfps] [-I channel]\n\ 
     127\t[-K key ] [-M colormap] [-m mtu] [-N session]\n\ 
     128\t[-n atm|ip|rtip] [-o clipfile] [-t ttl] [-U interval]\n\ 
     129\t[-u script] [-V visual] [-X resource=value] dest/port[/fmt/ttl]\n" 
     130        ); 
     131        exit(1); 
     132} 
     133 
     134static class UsageCommand : public TclObject { 
     135public: 
     136        UsageCommand() : TclObject("usage") {} 
     137        int command(int argc, const char*const* argv) { 
     138                usage(); 
     139                /*NOTREACHED*/ 
     140                return (0); 
     141        } 
     142} cmd_usage; 
     143 
     144#ifndef SIGARGS 
     145#ifdef __SUNPRO_CC 
     146#define SIGARGS int arg 
     147#else 
     148#define SIGARGS ...  
     149#endif 
     150#endif 
     151 
     152extern void adios(); 
     153 
     154static SIGRET 
     155ciao(SIGARGS) 
     156{ 
     157        adios(); 
     158} 
     159 
     160static class AdiosCommand : public TclObject { 
     161public: 
     162        AdiosCommand() : TclObject("adios") {} 
     163        int command(int argc, const char*const* argv) { 
     164                adios(); 
     165                /*NOTREACHED*/ 
     166                return (0); 
     167        } 
     168} cmd_adios; 
     169 
     170static class HaveFontCommand : public TclObject { 
     171public: 
     172        HaveFontCommand() : TclObject("havefont") {} 
     173        int command(int argc, const char*const* argv) { 
     174                Tcl& t = Tcl::instance(); 
     175                if (argc != 2) 
     176                        t.result("0"); 
     177                else { 
     178                        Tk_Window tk = t.tkmain(); 
     179                        Tk_Uid uid = Tk_GetUid((char*)argv[1]); 
     180                        XFontStruct* p = Tk_GetFontStruct(t.interp(), tk, uid); 
     181                        t.result(p != 0 ? "1" : "0"); 
     182                } 
     183                return (TCL_OK); 
     184        } 
     185} cmd_havefont; 
     186 
     187static class GetHostNameCommand : public TclObject { 
     188public: 
     189        GetHostNameCommand() : TclObject("gethostname") {} 
     190        int command(int argc, const char*const* argv) { 
     191                Tcl& tcl = Tcl::instance(); 
     192                char* bp = tcl.buffer(); 
     193                tcl.result(bp); 
     194                gethostname(bp, MAXHOSTNAMELEN); 
     195                return (TCL_OK); 
     196        } 
     197} cmd_gethostname; 
     198 
     199extern "C" char version[]; 
     200 
     201static class VersionCommand : public TclObject { 
     202public: 
     203        VersionCommand() : TclObject("version") {} 
     204        int command(int argc, const char*const* argv) { 
     205                Tcl::instance().result(version); 
     206                return (TCL_OK); 
     207        } 
     208} cmd_version; 
     209 
     210#ifndef USE_SHM 
     211int use_shm = 0; 
     212#else 
     213int use_shm = 1; 
     214 
     215#if defined(sgi) && !defined(IRIX6_2) 
     216Bool XShmQueryExtension(Display* dpy) 
     217{ 
     218        int mj, mn; 
     219        Bool sp; 
     220        return XShmQueryVersion(dpy, &mj, &mn, &sp); 
     221} 
     222#endif 
     223 
     224static int 
     225noXShm(ClientData, XErrorEvent*) 
     226{ 
     227        /* 
     228         * can get called twice, because on some systems the 
     229         * XShmDetach after a failed XShmAttach is an error 
     230         * (i.e., a second error), while on others (bsdi), the 
     231         * detach is necessary so we cannot omit it 
     232         */ 
     233        if (use_shm) 
     234                fprintf(stderr, "vic: warning: not using shared memory\n"); 
     235        use_shm = 0; 
     236        return (0); 
     237} 
     238 
     239/* 
     240 * XXX this is a hack to see if we can used shared memory. 
     241 * if the X server says we can, and we're on the same 
     242 * host as the X server, then we are golden. 
     243 */ 
     244static void 
     245checkXShm(Tk_Window tk, const char*) 
     246{ 
     247        Display* dpy = Tk_Display(tk); 
     248 
     249        if (XShmQueryExtension(dpy) == 0) { 
     250                fprintf(stderr, 
     251                        "vic: warning: server doesn't support shared memory\n"); 
     252                use_shm = 0; 
     253                return; 
     254        } 
     255        XShmSegmentInfo si; 
     256        if ((si.shmid = shmget(IPC_PRIVATE, 512, IPC_CREAT|0777)) < 0) { 
     257                if (use_shm) 
     258                        fprintf(stderr, 
     259                                "vic: warning: no shared memory available\n"); 
     260                use_shm = 0; 
     261                return; 
     262        } 
     263        si.readOnly = 1; 
     264        XSync(dpy, 0); 
     265        Tk_ErrorHandler handler = Tk_CreateErrorHandler(dpy, -1, -1, -1, 
     266                                                        noXShm, 0); 
     267        XShmAttach(dpy, &si); 
     268        XSync(dpy, 0); 
     269        XShmDetach(dpy, &si); 
     270        Tk_DeleteErrorHandler(handler); 
     271        (void)shmctl(si.shmid, IPC_RMID, 0); 
     272} 
     273#endif 
     274 
     275extern "C" char *optarg; 
     276extern "C" int optind; 
     277extern "C" int opterr; 
     278 
     279const char* 
     280disparg(int argc, const char** argv, const char* optstr) 
     281{ 
     282        const char* display = 0; 
     283        int op; 
     284        while ((op = getopt(argc, (char**)argv, (char*)optstr)) != -1) { 
     285                if (op == 'd') { 
     286                        display = optarg; 
     287                        break; 
     288                } 
     289                else if (op == '?') 
     290                        usage(); 
     291        } 
     292#ifdef linux 
     293        optind = 0; 
     294#else 
     295        optind = 1; 
     296#endif 
     297        return (display); 
     298} 
     299 
     300char* 
     301parse_assignment(char* cp) 
     302{ 
     303        cp = strchr(cp, '='); 
     304        if (cp != 0) { 
     305                *cp = 0; 
     306                return (cp + 1); 
     307        } else 
     308                return ("true"); 
     309} 
     310 
     311#ifdef __hpux 
     312#include <sys/socket.h> 
     313gethostid() 
     314{ 
     315        int id; 
     316        char hostname[256];             /* 255 is max legal DNS name */ 
     317        size_t hostname_size = 256; 
     318        struct hostent *hostp; 
     319        struct in_addr addru;           /* union for conversion */ 
     320 
     321        (void) gethostname(hostname, hostname_size); 
     322        hostname[hostname_size] = '\0'; /* make sure it is null-terminated */ 
     323 
     324        hostp = gethostbyname(hostname); 
     325        if(hostp == NULL) 
     326                /* our own name was not found!  punt. */ 
     327                id = 0; 
     328        else { 
     329                /* return first address of host */ 
     330                memcpy(&(addru.s_addr), hostp->h_addr_list[0], 4); 
     331                id = addru.s_addr; 
     332        } 
     333   
     334        return id; 
     335} 
     336#endif 
     337 
     338#ifdef __svr4__ 
     339#include <sys/systeminfo.h> 
     340#define gethostid xgethostid 
     341gethostid() 
     342{ 
     343        char wrk[32]; 
     344        if (sysinfo(SI_HW_SERIAL, wrk, sizeof(wrk)) > 0) 
     345                return (atoi(wrk)); 
     346        return (0); 
     347} 
     348#endif 
     349 
     350/* 
     351 * From the RTP spec. 
     352 */ 
     353u_int32_t 
     354heuristic_random() 
     355{ 
     356        struct { 
     357                struct  timeval tv; 
     358                clock_t cpu; 
     359                pid_t   pid; 
     360                u_long  hid; 
     361                uid_t   uid; 
     362                gid_t   gid; 
     363                struct  utsname name; 
     364        } s; 
     365 
     366        gettimeofday(&s.tv, 0); 
     367        uname(&s.name); 
     368        s.cpu  = clock(); 
     369        s.pid  = getpid(); 
     370        s.hid  = gethostid(); 
     371        s.uid  = getuid(); 
     372        s.gid  = getgid(); 
     373 
     374        MD5_CTX context; 
     375        MD5Init(&context); 
     376        MD5Update(&context, (u_char*)&s, sizeof(s)); 
     377        u_int32_t out[4]; 
     378        MD5Final((u_char *)out, &context); 
     379        return (out[0] ^ out[1] ^ out[2] ^ out[3]); 
     380} 
     381 
     382void loadbitmaps(Tcl_Interp* tcl) 
     383{ 
     384        static char rev[] = { 
     385                0x30, 0x78, 0x7c, 0x7e, 0x7f, 0x7f, 0x7e, 0x7c, 0x78, 0x30 
     386        }; 
     387        Tk_DefineBitmap(tcl, Tk_GetUid("rev"), rev, 7, 10); 
     388        static char fwd[] = { 
     389                0x06, 0x0f, 0x1f, 0x3f, 0x7f, 0x7f, 0x3f, 0x1f, 0x0f, 0x06 
     390        }; 
     391        Tk_DefineBitmap(tcl, Tk_GetUid("fwd"), fwd, 7, 10); 
     392} 
     393 
     394extern "C" int Tk_StripchartCmd(ClientData, Tcl_Interp*, int ac, char** av); 
     395#ifdef WIN32 
     396extern "C" int WinPutsCmd(ClientData, Tcl_Interp*, int ac, char** av); 
     397extern "C" int WinGetUserName(ClientData, Tcl_Interp*, int ac, char** av); 
     398extern "C" int WinPutRegistry(ClientData, Tcl_Interp*, int ac, char** av); 
     399extern "C" int WinGetRegistry(ClientData, Tcl_Interp*, int ac, char** av); 
     400#endif 
     401 
     402extern "C" { 
     403int 
     404TkPlatformInit(Tcl_Interp *interp) 
     405{ 
     406        Tcl_SetVar(interp, "tk_library", ".", TCL_GLOBAL_ONLY); 
     407#ifndef WIN32 
     408        extern void TkCreateXEventSource(void); 
     409        TkCreateXEventSource(); 
     410#endif 
     411        return (TCL_OK); 
     412} 
     413 
     414void *TkSetPlatformInit(int (*func)(Tcl_Interp *)); 
     415 
     416} 
     417 
     418int 
     419main(int argc, const char** argv) 
     420{ 
     421        srandom(heuristic_random()); 
     422 
     423#ifdef SIGHUP 
     424        signal(SIGHUP, ciao); 
     425#endif 
     426        signal(SIGINT, ciao); 
     427        signal(SIGTERM, ciao); 
     428 
     429#ifdef WIN32 
     430        TkSetPlatformInit(TkPlatformInit); 
     431#endif 
     432 
     433        opterr = 0; 
     434        const char* options =  
     435                "A:B:C:c:D:d:f:F:HI:K:M:m:N:n:o:Pq:sT:t:U:u:V:X:"; 
     436        const char* display = disparg(argc, (const char**)argv, options); 
     437 
     438        Tcl::init("vic"); 
     439        Tcl& tcl = Tcl::instance(); 
     440#ifdef WIN32 
     441        if (display == NULL) 
     442                display = "localhost:0"; 
     443#endif 
     444        tcl.evalf(display? 
     445                    "set argv \"-name vic -display %s\"" : 
     446                    "set argv \"-name vic\"", 
     447                  display); 
     448        Tk_Window tk = 0; 
     449        if (Tk_Init(tcl.interp()) == TCL_OK) 
     450                tk = Tk_MainWindow(tcl.interp()); 
     451        if (tk == 0) { 
     452                fprintf(stderr, "vic: %s\n", tcl.result()); 
     453                exit(1); 
     454        } 
     455        tcl.tkmain(tk); 
     456 
     457        loadbitmaps(tcl.interp()); 
     458        tcl.CreateCommand("stripchart", Tk_StripchartCmd, (ClientData)tk); 
     459#ifdef WIN32 
     460        tcl.CreateCommand("puts", WinPutsCmd, (ClientData)tk); 
     461        tcl.CreateCommand("getusername", WinGetUserName, (ClientData)tk); 
     462        tcl.CreateCommand("putregistry", WinPutRegistry, (ClientData)tk); 
     463        tcl.CreateCommand("getregistry", WinGetRegistry, (ClientData)tk); 
     464#endif 
     465        EmbeddedTcl::init(); 
     466        tcl.evalc("init_resources"); 
     467 
     468        int op; 
     469        while ((op = getopt(argc, (char**)argv, (char*)options)) != -1) { 
     470                switch (op) { 
     471 
     472                default: 
     473                        usage(); 
     474 
     475                case 'A': 
     476                        tcl.add_option("sessionType", optarg); 
     477                        if (strcasecmp(optarg, "nv") == 0) 
     478                                tcl.add_default("defaultFormat", "nv"); 
     479                        else if (strcasecmp(optarg, "ivs") == 0) 
     480                                tcl.add_default("defaultFormat", "h.261"); 
     481                        break; 
     482 
     483                case 'B': 
     484                        tcl.add_option("maxbw", optarg); 
     485                        break; 
     486 
     487                case 'C': 
     488                        tcl.add_option("conferenceName", optarg); 
     489                        break; 
     490 
     491                case 'c': 
     492                        tcl.add_option("dither", optarg); 
     493                        break; 
     494 
     495                case 'D': 
     496                        tcl.add_option("device", optarg); 
     497                        break; 
     498 
     499                case 'd': 
     500                        break; 
     501 
     502                case 'f': 
     503                        tcl.add_option("defaultFormat", optarg); 
     504                        break; 
     505 
     506                case 'F': 
     507                        tcl.add_option("maxfps", optarg); 
     508                        break; 
     509 
     510                case 'H': 
     511                        tcl.add_option("useHardwareDecode", "true"); 
     512                        break; 
     513 
     514                case 'I': 
     515                        tcl.add_option("confBusChannel", optarg); 
     516                        break; 
     517 
     518                case 'K': 
     519                        /*XXX probably do not want this in X server*/ 
     520                        tcl.add_option("sessionKey", optarg); 
     521                        break; 
     522 
     523                case 'M': 
     524                        tcl.add_option("colorFile", optarg); 
     525                        break; 
     526 
     527                case 'm': 
     528                        tcl.add_option("mtu", optarg); 
     529                        break; 
     530 
     531                case 'N': 
     532                        tcl.add_option("rtpName", optarg); 
     533                        break; 
     534 
     535                case 'n': 
     536                        tcl.add_option("network", optarg); 
     537                        break; 
     538 
     539                case 'o': 
     540                        tcl.add_option("outfile", optarg); 
     541                        break; 
     542 
     543                case 'P': 
     544                        tcl.add_option("privateColormap", "true"); 
     545                        break; 
     546 
     547                case 'q': 
     548                        tcl.add_option("jpegQfactor", optarg); 
     549                        break; 
     550 
     551                case 's': 
     552                        use_shm = 0; 
     553                        break; 
     554 
     555                case 't': 
     556                        tcl.add_option("defaultTTL", optarg); 
     557                        break; 
     558 
     559                case 'T': 
     560                        tcl.add_option("softJPEGthresh", optarg); 
     561                        break; 
     562 
     563                case 'u': 
     564                        tcl.add_option("startupScript", optarg); 
     565                        break; 
     566 
     567                case 'U': 
     568                        tcl.add_option("stampInterval", optarg); 
     569                        break; 
     570 
     571                case 'V': 
     572                        tcl.add_option("visual", optarg); 
     573                        break; 
     574 
     575                case 'X': 
     576                        { 
     577                                const char* value = parse_assignment(optarg); 
     578                                tcl.add_option(optarg, value); 
     579                        } 
     580                        break; 
     581                } 
     582        } 
     583#ifdef USE_SHM 
     584        if (use_shm) 
     585                checkXShm(tk, display); 
     586#endif 
     587 
     588        const char* dst; 
     589        if (optind < argc && argc > 1) { 
     590                dst = argv[optind]; 
     591                if (argc - optind > 1) { 
     592                        fprintf(stderr, 
     593                                "vic: extra arguments (starting with `%s')\n", 
     594                                argv[optind + 1]); 
     595                        exit(1); 
     596                } 
     597        } else if ((dst = tcl.attr("defaultHostSpec")) == 0) { 
     598                fprintf(stderr, "vic: destination address required\n"); 
     599                exit(1); 
     600        } 
     601        tcl.add_option("defaultHostSpec", dst); 
     602#ifdef notdef 
     603        const char* outfile = tcl.attr("outfile"); 
     604        if (outfile != 0) { 
     605                int fd = open(outfile, O_WRONLY|O_TRUNC|O_CREAT, 0644); 
     606                if (fd < 0) { 
     607                        fprintf(stderr, "vic: "); 
     608                        perror(outfile); 
     609                        exit(1); 
     610                } 
     611                Framer::dump(fd); 
     612        } 
     613#endif 
     614        tcl.evalc("vic_main"); 
     615 
     616        /* 
     617         * re-nice the vic process before we start processing video 
     618         * so that video processing won't screw up the local audio. 
     619         */ 
     620        int pri = atoi(tcl.attr("priority")); 
     621        if (pri > 0) 
     622                nice(pri); 
     623 
     624        /* 
     625         * Randomize start sequence number and media timestamp 
     626         * per in case we turn on encryption.(XXX should re-do 
     627         * this when changing keys). 
     628         */ 
     629        /*XXX*/ 
     630        Transmitter::seqno(random()); 
     631 
     632#ifdef DEBUG_X_SYNCRONOUSLY 
     633        XSynchronize(Tk_Display(tk), True); 
     634#endif 
     635 
     636        /* win32 needs the following to get the initial window painted */ 
     637        tcl.evalc("update idletasks"); 
     638#ifdef noyet 
     639        while (tk_NumMainWindows > 0) { 
     640                /* 
     641                 * Tk doesn't give priority to the X server so file handlers 
     642                 * (i.e., packets from the network) can starve the window 
     643                 * system (technically, tk lets one X event through per file 
     644                 * event, but a file event can trigger more than one X event 
     645                 * so the X server loses to a high-rate video source). 
     646                 * The solution is to let the X server go first by only 
     647                 * processing file handlers when their are no pending 
     648                 * X events. 
     649                 */ 
     650                if (Tk_DoOneEvent(TK_X_EVENTS|TK_IDLE_EVENTS| 
     651                                  TK_DONT_WAIT) == 0) 
     652                                Tk_DoOneEvent(0); 
     653        } 
     654#else 
     655        Tk_MainLoop(); 
     656#endif 
     657        adios(); 
     658        return (0); 
     659} 
     660 
  • vic/trunk/makefile.vc

    r726 r729  
     1# 
     2# Copyright (c) 1993-1994 The Regents of the University of California. 
     3# All rights reserved. 
     4# 
     5# Redistribution and use in source and binary forms, with or without 
     6# modification, are permitted provided that the following conditions 
     7# are met: 
     8# 1. Redistributions of source code must retain the above copyright 
     9#    notice, this list of conditions and the following disclaimer. 
     10# 2. Redistributions in binary form must reproduce the above copyright 
     11#    notice, this list of conditions and the following disclaimer in the 
     12#    documentation and/or other materials provided with the distribution. 
     13# 3. All advertising materials mentioning features or use of this software 
     14#    must display the following acknowledgement: 
     15#       This product includes software developed by the University of 
     16#       California, Berkeley and the Network Research Group at 
     17#       Lawrence Berkeley Laboratory. 
     18# 4. Neither the name of the University nor of the Laboratory may be used 
     19#    to endorse or promote products derived from this software without 
     20#    specific prior written permission. 
     21# 
     22# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
     23# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
     24# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
     25# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
     26# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
     27# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
     28# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
     29# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
     30# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
     31# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
     32# SUCH DAMAGE. 
     33# 
     34# @(#) $Header$ (LBL) 
     35# 
     36 
     37ZIP = c:\progra~1\winzip\winzip32 
     38 
     39# Uncomment this line to compile an optimized (with no debug symbols) 
     40# version of the program. 
     41NODEBUG=1 
     42 
     43APPVER=4.0 
     44TOOLS32       = c:\msdev 
     45cc32 = $(TOOLS32)\bin\cl -I$(TOOLS32)\include 
     46rc32 = $(TOOLS32)\bin\rc 
     47link32 = $(TOOLS32)\bin\link 
     48 
     49!include <ntwin32.mak> 
     50 
     51ALL = vic histtolut 
     52all:    vic 
     53 
     54.SUFFIXES : .cc 
     55 
     56.cc.obj: 
     57        $(cc32) $(cdebug) $(cflags) $(cvars) $(CFLAGS) -o $@ -FR$*.sbr -Tp $< 
     58 
     59.c.obj: 
     60        $(cc32) $(cdebug) $(cflags) $(cvars) $(CFLAGS) -o $@ -FR$*.sbr $< 
     61 
     62ED_YBITS = 4 
     63 
     64TK_DIR  = ../tk4.1 
     65TCL_DIR = ../tcl7.5 
     66 
     67INCLUDE_TK = -I$(TK_DIR)/win -I$(TK_DIR)/generic 
     68INCLUDE_TCL = -I$(TCL_DIR)/win -I$(TCL_DIR)/generic 
     69INCLUDE_X11 = -I$(TK_DIR)/xlib 
     70INCLUDE_MISC =  
     71 
     72LIB_TK = $(TK_DIR)/win/tk41.lib 
     73LIB_TCL = $(TCL_DIR)/win/tcl75.lib 
     74 
     75MKDEP = \mksnt\sh .\mkdep 
     76 
     77BSC32= bscmake 
     78BSC32_FLAGS=/nologo /n 
     79 
     80LIBRARY_TK = $(TK_DIR)/library 
     81LIBRARY_TCL = $(TCL_DIR)/library 
     82TK_LIBRARY_FILES = \ 
     83                $(LIBRARY_TCL)/init.tcl \ 
     84                $(LIBRARY_TK)/tk.tcl \ 
     85                $(LIBRARY_TK)/button.tcl \ 
     86                $(LIBRARY_TK)/dialog.tcl \ 
     87                $(LIBRARY_TK)/entry.tcl \ 
     88                $(LIBRARY_TK)/focus.tcl \ 
     89                $(LIBRARY_TK)/listbox.tcl \ 
     90                $(LIBRARY_TK)/menu.tcl \ 
     91                $(LIBRARY_TK)/palette.tcl \ 
     92                $(LIBRARY_TK)/scale.tcl \ 
     93                $(LIBRARY_TK)/tearoff.tcl \ 
     94                $(LIBRARY_TK)/text.tcl \ 
     95                $(LIBRARY_TK)/optMenu.tcl $(LIBRARY_TK)/scrlbar.tcl 
     96 
     97LIB_GRABBER =  
     98INCLUDE_GRABBER =  
     99OBJ_GRABBER =  
     100SRC_GRABBER = $(OBJ_GRABBER:.o=.cc)  
     101OBJ_XIL =  
     102LIBS = $(LIB_GRABBER) $(LIB_TK) $(LIB_TCL) $(guilibs) wsock32.lib 
     103INCLUDES = $(INCLUDE_MISC) $(INCLUDE_GRABBER) $(INCLUDE_TK) $(INCLUDE_TCL) \ 
     104        $(INCLUDE_X11) $(MD_INC) -I./jpeg -I./p64 -I. 
     105DEFINE = -DED_YBITS=$(ED_YBITS) -DSIGRET=void -DSIGARGS=int -D_Windows -DWIN32_LEAN_AND_MEAN  
     106BFLAGS = $(DEFINE) $(INCLUDES) 
     107CFLAGS = $(CCOPT) $(BFLAGS) 
     108 
     109# 
     110# Remember to add a dependency if you add any tcl sources here. 
     111# 
     112TCL_VIC = ui-ctrlmenu.tcl ui-main.tcl ui-resource.tcl \ 
     113        ui-srclist.tcl ui-stats.tcl ui-util.tcl ui-windows.tcl \ 
     114        ui-switcher.tcl ui-extout.tcl ui-grabber.tcl ui-win32.tcl \ 
     115        cf-main.tcl cf-tm.tcl cf-confbus.tcl cf-network.tcl cf-util.tcl \ 
     116        tkerror.tcl entry.tcl 
     117 
     118# 
     119# These modules are broken in libg++.  Rather than fix libg++ 
     120# every time I install it on a given system, just make them 
     121# here (these sources came from tcl's compat directory) 
     122# 
     123BROKEN_OBJ = strtol.obj strtoul.obj 
     124COLOR_OBJS = color-true.obj color-pseudo.obj color-dither.obj color-ed.obj \ 
     125        color-hi.obj color-quant.obj color-gray.obj color-mono.obj color-hist.obj 
     126 
     127OBJ0 =  getopt.obj win32.obj win32X.obj 
     128OBJ1 =  inet.obj cellb_tables.obj tkStripchart.obj md5c.obj random.obj 
     129OBJ2 =  main.obj net.obj net-ip.obj source.obj \ 
     130        iohandler.obj timer.obj idlecallback.obj media-timer.obj \ 
     131        session.obj session-rtpv1.obj session-nv.obj session-ivs.obj \ 
     132        decoder.obj decoder-jpeg.obj decoder-nv.obj \ 
     133        decoder-h261.obj decoder-h261v1.obj \ 
     134        decoder-cellb.obj \ 
     135        device.obj grabber.obj vw.obj Tcl.obj Tcl2.obj module.obj transmitter.obj \ 
     136        encoder-nv.obj encoder-cellb.obj encoder-h261.obj \ 
     137        transcoder-jpeg.obj framer-jpeg.obj \ 
     138        group-ipc.obj confbus.obj renderer.obj renderer-window.obj \ 
     139        color.obj $(COLOR_OBJS) \ 
     140        rgb-converter.obj jpeg.obj p64.obj dct.obj \ 
     141        compositor.obj rate-variable.obj crypt.obj crypt-dull.obj \ 
     142        grabber-still.obj 
     143OBJ3 =  cm0.obj cm1.obj huffcode.obj version.obj bv.obj \ 
     144        $(TCL_VIC:.tcl=.obj) tk.obj 
     145SRC =   $(OBJ1:.obj=.c) $(OBJ2:.obj=.cc) $(BROKEN_OBJ:.obj=.c) \ 
     146        $(RTIP_OBJ:.obj=.c) $(SRC_GRABBER) $(OBJ_XIL:.obj=.cc) 
     147OBJ =   $(OBJ0) $(OBJ1) $(OBJ2) $(OBJ3) $(BROKEN_OBJ) $(RTIP_OBJ) 
     148 
     149SBR =   $(OBJ:.obj=.sbr) $(OBJ_GRABBER:.obj=.sbr) 
     150 
     151OBJ_VDD = $(OBJ0) vdd.obj p64.obj p64dump.obj \ 
     152        module.obj renderer.obj renderer-window.obj color.obj \ 
     153        $(COLOR_OBJS) \ 
     154        Tcl.obj Tcl2.obj vw.obj cm0.obj cm1.obj \ 
     155        dct.obj huffcode.obj bv.obj iohandler.obj timer.obj \ 
     156        ui-vdd.obj tk.obj 
     157 
     158SBR_VDD = $(OBJ_VDD:.obj=.sbr) 
     159 
     160OBJ_H261PLAY = $(OBJ0) h261_play.obj p64.obj p64dump.obj \ 
     161        module.obj renderer.obj renderer-window.obj color.obj \ 
     162        $(COLOR_OBJS) \ 
     163        Tcl.obj Tcl2.obj vw.obj cm0.obj cm1.obj \ 
     164        dct.obj huffcode.obj bv.obj iohandler.obj random.obj timer.obj \ 
     165        ui-h261_play.obj tk.obj 
     166 
     167SBR_H261PLAY = $(OBJ_H261PLAY:.obj=.sbr) 
     168 
     169OBJ_JPEGPLAY = $(OBJ0) jpeg_play.obj jpeg/jpeg.obj \ 
     170        renderer.obj renderer-window.obj color.obj \ 
     171        $(COLOR_OBJS) \ 
     172        Tcl.obj Tcl2.obj vw.obj cm0.obj cm1.obj \ 
     173        dct.obj huffcode.obj jpeg_play_tcl.obj bv.obj iohandler.obj timer.obj \ 
     174        ui-jpeg_play.obj tk.obj 
     175 
     176SBR_JPEGPLAY = $(OBJ_JPEGPLAY:.obj=.sbr) 
     177 
     178LIB_CB =  
     179OBJ_CB = $(OBJ0) cbAppInit.obj cb.obj confbus.obj group-ipc.obj iohandler.obj \ 
     180        net.obj net-ip.obj crypt.obj crypt-des.obj communicator.obj \ 
     181        ppm.obj Tcl.obj Tcl2.obj inet.obj md5c.obj 
     182 
     183SBR_CB = $(OBJ_CB:.obj=.sbr) 
     184 
     185OBJ_H261DUMP = $(OBJ0) h261_dump.obj p64.obj p64dump.obj huffcode.obj dct.obj bv.obj 
     186 
     187SBR_H261DUMP = $(OBJ_H261DUMP:.obj=.sbr) 
     188 
     189#vic: vic.exe vic.bsc 
     190vic: vic.exe 
     191 
     192vic.exe:        $(OBJ) $(OBJ_GRABBER) 
     193        $(link) $(ldebug) $(guilflags) -out:$@ $(OBJ) $(OBJ_GRABBER) $(LIBS) 
     194 
     195vic.bsc : $(OUTDIR)  $(SBR) 
     196    $(BSC32) @<< 
     197  $(BSC32_FLAGS) /o$@ $(SBR) 
     198<< 
     199 
     200histtolut: histtolut.exe 
     201 
     202histtolut.exe: histtolut.obj convex_hull.obj getopt.obj 
     203        $(cc32) /nologo -o $@ $(CFLAGS) histtolut.obj convex_hull.obj getopt.obj 
     204 
     205vdd: vdd.exe vdd.bsc 
     206 
     207vdd.exe: $(OBJ_VDD) 
     208        $(cc32) /nologo -o $@ $(CFLAGS) $(LDFLAGS) $(OBJ_VDD) $(LIBS) 
     209 
     210vdd.bsc : $(OUTDIR)  $(SBR_VDD) 
     211    $(BSC32) @<< 
     212  $(BSC32_FLAGS) /o$@ $(SBR_VDD) 
     213<< 
     214 
     215cb_wish: cb_wish.exe cb_wish.bsc 
     216 
     217cb_wish.exe: $(OBJ_CB) 
     218        $(cc32) /nologo -o $@ $(CFLAGS) $(LDFLAGS) $(OBJ_CB) $(LIB_CB) 
     219 
     220cb_wish.bsc : $(OUTDIR)  $(SBR_CB) 
     221    $(BSC32) @<< 
     222  $(BSC32_FLAGS) /o$@ $(SBR_CB) 
     223<< 
     224 
     225jpeg_play: jpeg_play.exe jpeg_play.bsc 
     226 
     227jpeg_play.exe: $(OBJ_JPEGPLAY) 
     228        $(cc32) /nologo $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ_JPEGPLAY) $(LIBS) 
     229 
     230jpeg_play.bsc : $(OUTDIR)  $(SBR_JPEGPLAY) 
     231    $(BSC32) @<< 
     232  $(BSC32_FLAGS) /o$@ $(SBR_JPEGPLAY) 
     233<< 
     234 
     235h261_play: h261_play.exe h261_play.bsc 
     236 
     237h261_play.exe: $(OBJ_H261PLAY) 
     238        $(link) $(ldebug) $(guilflags) -out:$@ $(OBJ_H261PLAY) $(LIBS) 
     239 
     240h261_play.bsc : $(OUTDIR)  $(SBR_H261PLAY) 
     241    $(BSC32) @<< 
     242  $(BSC32_FLAGS) /o$@ $(SBR_H261PLAY) 
     243<< 
     244 
     245h261_dump: h261_dump.exe h261_dump.bsc 
     246 
     247h261_dump.exe: $(OBJ_H261DUMP) 
     248        $(cc32) /nologo -o $@ $(CFLAGS) $(OBJ_H261DUMP) 
     249 
     250h261_dump.bsc : $(OUTDIR)  $(SBR_H261DUMP) 
     251    $(BSC32) @<< 
     252  $(BSC32_FLAGS) /o$@ $(SBR_H261DUMP) 
     253<< 
     254 
     255h261tortp.exe: h261tortp.cc 
     256        $(cc32) /nologo -o $@ $(CFLAGS) h261tortp.cc 
     257 
     258# 
     259# pass-1 embedded tcl files 
     260# 
     261tk.obj: $(TK_LIBRARY_FILES) tcl2c++.exe 
     262        -del $@ 
     263        .\tcl2c++ 1 $(TK_LIBRARY_FILES) > tk.cc 
     264        $(cc32) $(cdebug) $(cflags) $(cvars) -o $@ -FR$*.sbr -c $(CFLAGS) -Tp $(@:.obj=).cc 
     265        del $(@:.obj=).cc 
     266 
     267# 
     268# pass-2 embedded tcl files 
     269# 
     270$(TCL_VIC:.tcl=.obj) ui-vdd.obj ui-h261_play.obj: tcl2c++.exe 
     271        -del $@ 
     272        .\tcl2c++ 2 $(@:.obj=).tcl > $(@:.obj=).cc 
     273        $(cc32) $(cdebug) $(cflags) $(cvars) -o $@ -c $(CFLAGS) -FR$*.sbr -Tp $(@:.obj=).cc 
     274        del $(@:.obj=).cc 
     275 
     276ui-ctrlmenu.obj: ui-ctrlmenu.tcl 
     277ui-extout.obj: ui-extout.tcl 
     278ui-grabber.obj: ui-grabber.tcl 
     279ui-main.obj: ui-main.tcl 
     280ui-resource.obj: ui-resource.tcl 
     281ui-srclist.obj: ui-srclist.tcl 
     282ui-stats.obj: ui-stats.tcl 
     283ui-switcher.obj: ui-switcher.tcl 
     284ui-util.obj: ui-util.tcl 
     285ui-windows.obj: ui-windows.tcl 
     286ui-win32.obj: ui-win32.tcl 
     287cf-main.obj: cf-main.tcl 
     288cf-util.obj: cf-util.tcl 
     289cf-network.obj: cf-network.tcl 
     290cf-tm.obj: cf-tm.tcl 
     291cf-confbus.obj: cf-confbus.tcl 
     292tkerror.obj: tkerror.tcl 
     293entry.obj: entry.tcl 
     294ui-vdd.obj: ui-vdd.tcl 
     295ui-h261_play.obj: ui-h261_play.tcl 
     296 
     297mkversion.exe: mkversion.obj 
     298        -del $@ 
     299        $(cc32) /nologo -o $@ $(CFLAGS) mkversion.obj 
     300 
     301version.c: mkversion.exe VERSION 
     302        -del version.c 
     303        .\mkversion < VERSION > version.c 
     304 
     305version.mak: mkversion.exe VERSION 
     306        -del version.mak 
     307        .\mkversion VICVERSION=%%s < VERSION > version.mak 
     308 
     309cm0.obj: cm0.c 
     310cm0.c: rgb-cube.ppm jv-cube-128.ppm ppmtolut.exe 
     311        -del $@ 
     312        .\ppmtolut -n cube rgb-cube.ppm >> $@ 
     313        .\ppmtolut -n jv_cube jv-cube-128.ppm >> $@ 
     314 
     315cm1.obj: cm1.c 
     316cm1.c: yuv-map.ppm cm170.ppm ppmtolut.exe 
     317        -del $@ 
     318        .\ppmtolut -n quant cm170.ppm >> $@ 
     319        .\ppmtolut -Y $(ED_YBITS) -n ed -e yuv-map.ppm >> $@ 
     320 
     321mkhuff.obj: p64/mkhuff.cc 
     322        $(cc32) $(cdebug) $(cflags) $(cvars) $(CFLAGS) -o $@ -FR$*.sbr -Tp p64/mkhuff.cc 
     323 
     324mkhuff.exe: mkhuff.obj getopt.obj 
     325        -del $@ 
     326        $(cc32) /nologo -o $@ $(CFLAGS) mkhuff.obj getopt.obj 
     327 
     328huffcode.c: mkhuff.exe 
     329        -del $@ 
     330        .\mkhuff -e > huffcode.c 
     331 
     332mkbv.exe: mkbv.obj 
     333        -del $@ 
     334        $(cc32) /nologo -o $@ $(CFLAGS) $*.obj 
     335 
     336bv.c: mkbv.exe 
     337        -del $@ 
     338        .\mkbv > $@ 
     339 
     340rgb-cube.ppm: mkcube.exe 
     341        .\mkcube rgb > $@ 
     342 
     343yuv-map.ppm: mkcube.exe 
     344        .\mkcube -Y $(ED_YBITS) -U 45 -V 45 yuv > $@ 
     345 
     346mkcube.exe: mkcube.obj getopt.obj 
     347        $(cc32) /nologo -o $@ $(CFLAGS) mkcube.obj getopt.obj 
     348 
     349ppmtolut.exe: ppmtolut.obj getopt.obj 
     350        $(cc32) /nologo -o $@ $(CFLAGS) ppmtolut.obj getopt.obj 
     351 
     352ppmtolut.obj: ppmtolut.c 
     353        $(cc32) $(cflags) $(cvars) $(CFLAGS) -o $@ -FRppmtolut.sbr ppmtolut.c 
     354 
     355p64.obj: p64/p64.cc 
     356        $(cc32) $(cdebug) $(cflags) $(cvars) $(CFLAGS) -o $@ -FR$*.sbr -Tp p64/p64.cc 
     357 
     358p64dump.obj: p64/p64dump.cc 
     359        $(cc32) $(cdebug) $(cflags) $(cvars) $(CFLAGS) -o $@ -FR$*.sbr -Tp p64/p64dump.cc 
     360 
     361jpeg.obj: jpeg/jpeg.cc 
     362        $(cc32) $(cdebug) $(cflags) $(cvars) $(CFLAGS) -o $@ -FR$*.sbr -Tp jpeg/jpeg.cc 
     363 
     364install: vic.exe histtolut.exe 
     365        -mkdir "\Program Files\MBone" 
     366        copy vic.exe "\Program Files\MBone\vic.exe" 
     367        copy histtolut.exe "\Program Files\MBone\histtolut.exe" 
     368        copy vic.1 "\Program Files\MBone\vic.1" 
     369 
     370tar:    vic.exe Changes.html README version.mak 
     371        type makefile.vc >> version.mak 
     372        nmake -f version.mak viczip 
     373        -del version.mak 
     374 
     375viczip: 
     376        -del Changes.htm 
     377        -del Readme.txt 
     378        copy Changes.html Changes.htm 
     379        copy README Readme.txt 
     380        -del vicbin-$(VICVERSION)-win95.zip 
     381        $(ZIP) -a c:.\vicbin-$(VICVERSION)-win95.zip Readme.txt Changes.htm vic.exe 
     382        -del Changes.htm 
     383        -del Readme.txt 
     384 
     385clean: 
     386        -del *.obj 
     387        -del *.sbr 
     388        -del tcl2c++.exe 
     389        -del mkbv.exe 
     390        -del mkversion.exe 
     391        -del bv.c 
     392        -del mkhuff.exe 
     393        -del mkversion.exe 
     394        -del huffcode.c 
     395        -del vic_tcl.c 
     396        -del h261_play_tcl.c 
     397        -del tmp.c 
     398        -del vic.exe 
     399        -del vic.bsc 
     400        -del h261_play.exe 
     401        -del h261_play.bsc 
     402        -del h261_dump.exe 
     403        -del h261_dump.bsc 
     404        -del jpeg_play.exe 
     405        -del jpeg_play.bsc 
     406        -del cb_wish.exe 
     407        -del mkcube.exe 
     408        -del rgb-cube.ppm 
     409        -del yuv-map.ppm 
     410        -del cm0.c 
     411        -del cm1.c 
     412        -del ppmtolut.exe 
     413        -del config.cache 
     414        -del config.log 
     415        -del domake.* 
     416        -del dotar.* 
     417 
     418realclean: 
     419        $(MAKE) clean 
     420        -del config.status 
     421 
     422tags:   force 
     423        ctags -tdwC $(SRC) *.h $(TK_DIR)/*/*.c $(TK_DIR)/*/*.h \ 
     424                $(TCL_DIR)/*/*.c $(TCL_DIR)/*/*.h 
     425 
     426force: 
     427 
     428depend: 
     429        $(MKDEP) $(INCLUDES) $(DEFINE) $(SRC) 
     430 
  • vic/trunk/ui-main.tcl

    r725 r729  
     1# 
     2# Copyright (c) 1993-1995 Regents of the University of California. 
     3# All rights reserved. 
     4# 
     5# Redistribution and use in source and binary forms, with or without 
     6# modification, are permitted provided that the following conditions 
     7# are met: 
     8# 1. Redistributions of source code must retain the above copyright 
     9#    notice, this list of conditions and the following disclaimer. 
     10# 2. Redistributions in binary form must reproduce the above copyright 
     11#    notice, this list of conditions and the following disclaimer in the 
     12#    documentation and/or other materials provided with the distribution. 
     13# 3. All advertising materials mentioning features or use of this software 
     14#    must display the following acknowledgement: 
     15#       This product includes software developed by the Network Research 
     16#       Group at Lawrence Berkeley National Laboratory. 
     17# 4. Neither the name of the University nor of the Laboratory may be used 
     18#    to endorse or promote products derived from this software without 
     19#    specific prior written permission. 
     20# 
     21# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
     22# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
     23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
     24# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
     25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
     26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
     27# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
     28# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
     29# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
     30# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
     31# SUCH DAMAGE. 
     32# 
     33# @(#) $Header$ (LBL) 
     34# 
     35 
     36 
     37proc session args { 
     38        global V 
     39        eval $V(session) $args 
     40} 
     41 
     42proc build.bar w { 
     43        global title 
     44        frame $w.bar -relief ridge -borderwidth 2 
     45        label $w.bar.title -text "VIC v[version]" -font [smallfont] \ 
     46                -relief flat -justify left 
     47        button $w.bar.quit -text Quit -relief raised \ 
     48                -font [smallfont] -command adios \ 
     49                -highlightthickness 1 
     50        button $w.bar.menu -text Menu -relief raised \ 
     51                -font [smallfont] -highlightthickness 1 \ 
     52                -command "toggle_window .menu" 
     53        button $w.bar.help -text Help -relief raised \ 
     54                -font [smallfont] -highlightthickness 1 \ 
     55                -command "toggle_window .help" 
     56 
     57        pack $w.bar.title -side left -fill both -expand 1 
     58        pack $w.bar.menu $w.bar.help $w.bar.quit -side left -padx 1 -pady 1 
     59} 
     60 
     61# 
     62# Look through the list of available visuals, and choose 
     63# the best one that vic supports. 
     64# 
     65proc lookup_visual {} { 
     66        set vlist [winfo visualsavailable .] 
     67        if { [lsearch -exact $vlist "truecolor 24"] >= 0 || \ 
     68                 [lsearch -exact $vlist "truecolor 32"] >= 0 } { 
     69                set visual "truecolor 24" 
     70        } elseif { [lsearch -exact $vlist "truecolor 16"] >= 0 } { 
     71                set visual "truecolor 16" 
     72        } elseif { [lsearch -exact $vlist "pseudocolor 8"] >= 0 } { 
     73                set visual "pseudocolor 8" 
     74        } elseif { [lsearch -exact $vlist "staticgray 1"] >= 0 } { 
     75                set visual "staticgray 1" 
     76        } else { 
     77                puts stderr "vic: no support for your display type" 
     78                exit 1 
     79        } 
     80} 
     81 
     82# 
     83# initialize the visual, colormap, and dither global variables 
     84# based on  X resources, available visuals, etc.  Create the 
     85# specified window as a frame widget and set its visual.  We pick 
     86# the visual only once and startup -- the user cannot change it 
     87# interactively.  The user can change the dithering algorithms 
     88# interactively constrained to the selected visual 
     89# Sets the colormap global variable to $w since this window 
     90# will always have the reference colormap. 
     91# 
     92proc init_visual w { 
     93        global V 
     94 
     95        set V(colormap) $w 
     96        set dither [option get . dither Vic] 
     97        if { $dither == "best" } { 
     98                set dither ed 
     99        }     
     100        set V(gamma) [option get . gamma Vic] 
     101        if { $dither == "dither" } { 
     102                set dither od 
     103        } 
     104        if { [lsearch -exact "od ed gray quantize" $dither] < 0 } { 
     105                puts stderr "vic: unknown dither: $dither" 
     106                exit 1 
     107        } 
     108        set visual [option get . visual Vic] 
     109        if { $visual == "" } { 
     110                set visual [lookup_visual] 
     111        } elseif { $visual == "pseudocolor" } { 
     112                set visual "pseudocolor 8" 
     113        } 
     114        set cmap "" 
     115        if [yesno privateColormap] { 
     116                set cmap "-colormap new" 
     117        } 
     118        if [catch "frame $w -visual {$visual} $cmap"] { 
     119                puts stderr "$V(app): bad visual: $visual" 
     120                exit 1 
     121        } 
     122        if { [winfo depth $w] == 8 } { 
     123                set V(dither) $dither 
     124        } 
     125        set V(visual) $visual 
     126} 
     127 
     128# 
     129# initialize the colormodel based on the visual, dither, and colormap 
     130# global variables.  if we run out of colors, free the colormodel 
     131# and return false (leaving it up to the caller to fix things) 
     132# otherwise, return true.  Set the global variable colorModel 
     133# to the corresponding tcl object. 
     134# 
     135proc init_color {} { 
     136        global V 
     137        if [info exists V(colorModel)] { 
     138                delete $V(colorModel) 
     139                unset V(colorModel) 
     140        } 
     141        set v [winfo visual $V(colormap)] 
     142        set d [winfo depth $V(colormap)] 
     143        if { $d == 8 } { 
     144                set id $v/$d/$V(dither) 
     145        } else { 
     146                set id $v/$d 
     147        } 
     148        set cm [new colormodel $id] 
     149        if { $cm == "" } { 
     150                puts stderr "vic: unsupported visual type: $v" 
     151                exit 1 
     152        } 
     153        $cm visual $V(colormap) 
     154        $cm gamma $V(gamma) 
     155        #XXX revert to gray? 
     156        if ![$cm alloc-colors] { 
     157                delete $cm 
     158                return 0 
     159        } 
     160        set V(colorModel) $cm 
     161        return 1 
     162} 
     163 
     164# 
     165# Build the user-interface. 
     166# 
     167proc init_gui {} { 
     168        global V 
     169        init_visual .top 
     170        if ![init_color] { 
     171                if { [winfo depth .top] != 8 } { 
     172                        puts stderr "vic: internal error: no colors" 
     173                        exit 2 
     174                } 
     175                puts stderr \ 
     176                    "vic: warning: ran out of colors; using private colormap" 
     177                destroy .top 
     178                frame .top -visual $V(visual) -colormap new 
     179                if ![init_color] { 
     180                        puts stderr "vic: internal error: no colors" 
     181                        exit 2 
     182                } 
     183        } 
     184     
     185        build.srclist 
     186 
     187        set_rate_vars $V(session) 
     188 
     189        # 
     190        # emulate implicit keyboard focus 
     191        # 
     192        bind . <Enter> { focus %W } 
     193        #wm focusmodel . active 
     194        bind . <q> { adios } 
     195        bind . <Control-c> { adios } 
     196        bind . <Control-d> { adios } 
     197 
     198        foreach i { 1 2 3 4 } { 
     199                bind . <Key-$i> "redecorate $i" 
     200        } 
     201 
     202        build.bar .top 
     203        pack .top.bar -fill x -side bottom 
     204        pack .top -expand 1 -fill both 
     205 
     206        label .top.label -text "Waiting for video..." 
     207        pack .top.label -before .top.bar -anchor c -expand 1 
     208 
     209        # 
     210        # Withdraw window so that user-placement is deferred 
     211        # until after initial geometry is computed 
     212        # 
     213        set geom [option get . geometry Vic] 
     214        wm withdraw . 
     215        wm geometry . $geom 
     216        update idletasks 
     217        set minwidth [winfo reqwidth .] 
     218        set minheight [winfo reqheight .] 
     219        #XXX 
     220        if { $minwidth < 200 } { 
     221                set minwidth 200 
     222        } 
     223        if { $minheight < 100 } { 
     224                set minheight 100 
     225        } 
     226        wm minsize . $minwidth $minheight 
     227        wm deiconify . 
     228 
     229        set V(curcol) 0 
     230        set V(currow) 0 
     231        set V(ncol) [option get . tile Vic] 
     232 
     233        set V(muteNewSources) [yesno muteNewSources] 
     234 
     235        after 1000 periodic_update 
     236} 
     237 
     238proc add_active src { 
     239        global active 
     240        set active($src) 1 
     241        if { [array size active] == 1 } { 
     242                pack forget .top.label 
     243 
     244                set w .top.grid 
     245                global V 
     246                set V(grid) $w 
     247                frame $w 
     248                pack $w -fill both -anchor n 
     249        } 
     250} 
     251 
     252proc rm_active src { 
     253        global active V 
     254        unset active($src) 
     255        if { [array size active] == 0 } { 
     256                pack forget $V(grid) 
     257                destroy $V(grid) 
     258                pack .top.label -before .top.bar -anchor c -expand 1 
     259        } 
     260} 
     261 
     262proc periodic_update { } { 
     263        if [have grabber] { 
     264                global V 
     265                update_rate $V(session) 
     266        } 
     267        update idletasks 
     268        after 1000 periodic_update 
     269} 
     270 
     271proc set_rate_vars src { 
     272        global fpshat bpshat lhat shat 
     273        if [info exists fpshat($src)] { 
     274                unset fpshat($src) 
     275                unset bpshat($src) 
     276                unset lhat($src) 
     277                unset shat($src) 
     278        } 
     279        set gain [option get . filterGain Vic] 
     280        set fpshat($src) 0 
     281        rate_variable fpshat($src) $gain 
     282        set bpshat($src) 0 
     283        rate_variable bpshat($src) $gain 
     284        set lhat($src) 0 
     285        rate_variable lhat($src) $gain 
     286        set shat($src) 0 
     287        rate_variable shat($src) $gain 
     288 
     289#XXX set guys in stat window too! 
     290} 
     291         
     292# 
     293# Called when use clicks on thumbnail video window. 
     294# Create a new window only if the window already 
     295# isn't being displayed (in locked mode).  In this 
     296# case, delete the existing window (i.e., clicking 
     297# on the thumbnail gives a toggle action, but not 
     298# for voice-switched or browse-mode windows). 
     299# 
     300proc select_thumbnail { w src } { 
     301        global win_src 
     302        set srcid [$src srcid] 
     303        foreach w [winfo children .] { 
     304                # this is fragile 
     305                set vw $w.frame.video 
     306                if { [winfo exists $vw] && $srcid == [$win_src($vw) srcid] && \ 
     307                        ![is_switched $vw] } { 
     308                        destroy_userwin $vw 
     309                        return 
     310                } 
     311        } 
     312        open_window $src 
     313} 
     314 
     315proc update_source_info src { 
     316        global src_info src_nickname src_name 
     317        # 
     318        # Figure out best presentation from available information. 
     319        # 
     320        set name [$src sdes name] 
     321        set cname [$src sdes cname] 
     322        set addr [$src addr] 
     323        if { $name == "" } { 
     324                if { $cname == "" } { 
     325                        set src_nickname($src) $addr 
     326                        set info $addr/[rtp_format $src] 
     327 
     328                } else { 
     329                        set src_nickname($src) $cname 
     330                        set info "$addr/[rtp_format $src]" 
     331                } 
     332        } elseif [cname_redundant $name $cname] { 
     333                set src_nickname($src) $name 
     334                set info $addr/[rtp_format $src] 
     335        } else { 
     336                set src_nickname($src) $name 
     337                set info $cname/[rtp_format $src] 
     338        } 
     339                set src_info($src) $cname/[rtp_format $src] 
     340 
     341        set msg [$src sdes note] 
     342        if { $msg != "" } { 
     343                set info $msg 
     344        } 
     345        set src_info($src) $info 
     346         
     347        # only call change_name when name really changes 
     348        if { ![info exists src_name($src)] || "$src_name($src)" != "$name" } { 
     349                set src_name($src) $name 
     350                change_name $src 
     351        } 
     352} 
     353 
     354# 
     355# This is a hack to get rid of ugly borer when displaying CIF sized 
     356# images in a NTSC sized windows. 
     357proc adjust_voff { win d } { 
     358        set ow [$win width] 
     359        set oh [$win height] 
     360        set iw [$d width] 
     361        set ih [$d height] 
     362        $win voff 0 
     363        if { $ow == 320 && $oh == 240 } { 
     364                if { $iw == 352 && $ih == 288 } { 
     365                        $win voff 8 
     366                } elseif { $iw == 176 && $ih == 144 } { 
     367                } 
     368        } elseif { $ow == 640 && $oh == 480 } { 
     369                if { $iw == 352 && $ih == 288 } { 
     370                        $win voff 16 
     371                } 
     372        } 
     373} 
     374 
     375# 
     376# create a renderer for window $w and attach it to $src 
     377# 
     378proc attach_renderer { src w } { 
     379        global win_target win_is_slow win_use_hw V 
     380        set d [$src handler] 
     381        set target "" 
     382        if { $win_use_hw($w) } { 
     383                set fmt [rtp_format $src] 
     384                if { $fmt == "jpeg" } { 
     385                        set fmt $fmt/[$d decimation] 
     386                } 
     387                set target [new assistor $fmt] 
     388                if { $target != "" } { 
     389                        $target window $w 
     390                } 
     391        } 
     392        if { $target == "" } { 
     393                set target [$V(colorModel) renderer $w [$d decimation]] 
     394        } 
     395        if $win_is_slow($w) { 
     396                $target update-interval [option get . stampInterval Vic] 
     397        } 
     398        adjust_voff $w $d 
     399        $d attach $target 
     400        set win_target($w) $target 
     401} 
     402 
     403proc detach_renderer { src w } { 
     404        global win_target 
     405        set d [$src handler] 
     406        $d detach $win_target($w) 
     407        delete $win_target($w) 
     408        unset win_target($w) 
     409} 
     410 
     411# 
     412# bind a source to a window so that the video stream from 
     413# source $src appears in window $w 
     414# 
     415proc attach_window { src w } { 
     416        attach_renderer $src $w 
     417        global win_src win_list 
     418        set win_src($w) $src 
     419        lappend win_list($src) $w 
     420        if [viewing_window $w] { 
     421                windowname [winfo toplevel $w] [getid $src] 
     422        } 
     423} 
     424 
     425proc detach_window { src w } { 
     426        global win_src win_list 
     427        detach_renderer $src $w 
     428        unset win_src($w) 
     429        # there must be an easier way to do this 
     430        set k [lsearch -exact $win_list($src) $w] 
     431        if { $k < 0 } { 
     432                puts "vic: detach_window: XXX" 
     433                exit 1 
     434        } 
     435        set win_list($src) [lreplace $win_list($src) $k $k] 
     436} 
     437 
     438proc window_highlight { w color } { 
     439        if { $w != "" } { 
     440                $w configure -background $color 
     441                foreach child [winfo children $w] { 
     442                        window_highlight $child $color 
     443                } 
     444        } 
     445} 
     446 
     447proc set_background { w color } { 
     448        $w configure -background $color 
     449} 
     450 
     451proc build.src { w src color } { 
     452        set f [smallfont] 
     453        set stamp $w.stamp 
     454        frame $stamp -relief ridge -borderwidth 2 
     455        bind $stamp <Enter> "%W configure -background gray90" 
     456        bind $stamp <Leave> "%W configure -background [resource background]" 
     457        create_video_widget $stamp.video 80 60 
     458        global win_is_slow 
     459        set win_is_slow($stamp.video) 1 
     460 
     461        attach_window $src $stamp.video 
     462        pack $stamp.video -side left -anchor c -padx 2 
     463        pack $stamp -side left -fill y 
     464         
     465        frame $w.r 
     466        frame $w.r.cw -relief groove -borderwidth 2 
     467 
     468        pack $w.r.cw -side left -expand 1 -fill both -anchor w -padx 0 
     469 
     470        label $w.r.cw.name -textvariable src_nickname($src) -font $f \ 
     471                -pady 1 -borderwidth 0 -anchor w  
     472        label $w.r.cw.addr -textvariable src_info($src) -font $f \ 
     473                -pady 1 -borderwidth 0 -anchor w 
     474 
     475        global ftext btext ltext 
     476        set ftext($src) "0.0 f/s" 
     477        set btext($src) "0.0 kb/s" 
     478        set ltext($src) "(0%)" 
     479        frame $w.r.cw.rateinfo 
     480        label $w.r.cw.rateinfo.fps -textvariable ftext($src) -width 6 \ 
     481                -font $f -pady 0 -borderwidth 0 
     482        label $w.r.cw.rateinfo.bps -textvariable btext($src) -width 8 \ 
     483                -font $f -pady 0 -borderwidth 0 
     484        label $w.r.cw.rateinfo.loss -textvariable ltext($src) -width 6 \ 
     485                -font $f -pady 0 -borderwidth 0 
     486 
     487        frame $w.r.ctrl -borderwidth 0 
     488 
     489        global mutebutton V 
     490        set mutebutton($src) $V(muteNewSources) 
     491        $src mute $mutebutton($src) 
     492        checkbutton $w.r.ctrl.mute -text mute -borderwidth 2 \ 
     493                -highlightthickness 1 \ 
     494                -relief groove -font $f -width 4 \ 
     495                -command "$src mute \$mutebutton($src)" \ 
     496                -variable mutebutton($src) 
     497 
     498        checkbutton $w.r.ctrl.color -text color -borderwidth 2 \ 
     499                -highlightthickness 1 \ 
     500                -relief groove -font $f -width 4 \ 
     501                -command "\[$src handler\] color \$colorbutton($src)" \ 
     502                -variable colorbutton($src) 
     503 
     504        set m $w.r.ctrl.info.menu$src 
     505        menubutton $w.r.ctrl.info -text info... -borderwidth 2 \ 
     506                -highlightthickness 1 \ 
     507                -relief groove -font $f -width 5 \ 
     508                -menu $m 
     509        build_info_menu $src $m 
     510 
     511        pack $w.r.ctrl.mute -side left -fill x -expand 1 
     512        pack $w.r.ctrl.color -side left -fill x -expand 1 
     513        pack $w.r.ctrl.info -side left -fill x -expand 1 
     514#       pack $w.r.ctrl.options -side left -fill x -expand 1 
     515 
     516        global colorbutton 
     517        set colorbutton($src) 1 
     518 
     519        pack $w.r.cw.rateinfo.fps $w.r.cw.rateinfo.bps $w.r.cw.rateinfo.loss \ 
     520                -side left -anchor w 
     521        pack $w.r.cw.name $w.r.cw.addr $w.r.cw.rateinfo -anchor w -fill x 
     522 
     523        pack $w.r.cw -fill x -side top 
     524        pack $w.r.ctrl -fill x -side top 
     525        pack $w.r -side left -expand 1 -fill x 
     526         
     527        bind $stamp.video <1> "select_thumbnail $w $src" 
     528        bind $stamp.video <Enter> { focus %W } 
     529        bind $stamp.video <d> "$src deactivate" 
     530 
     531        return $stamp.video 
     532} 
     533 
     534proc bump { } { 
     535        global V 
     536        incr V(curcol) 
     537        if { $V(curcol) == $V(ncol) } { 
     538                set V(curcol) 0 
     539                incr V(currow) 
     540        } 
     541} 
     542 
     543proc redecorate n { 
     544        global V 
     545        set V(curcol) 0 
     546        set V(currow) 0 
     547        set V(ncol) $n 
     548 
     549        if ![info exists V(grid)] { 
     550                return 
     551        } 
     552        set w $V(grid) 
     553        set list [session active] 
     554        foreach src $list { 
     555                grid $w.$src -row $V(currow) -column $V(curcol) -sticky we 
     556                grid columnconfigure $w $V(curcol) -weight 1 
     557                bump 
     558        } 
     559} 
     560 
     561proc create_decoder src { 
     562        set decoder [new decoder [rtp_format $src]] 
     563        if { $decoder == "" } { 
     564                # don't support this format 
     565                set decoder [new decoder null] 
     566        } 
     567        $src handler $decoder 
     568        return $decoder 
     569} 
     570 
     571proc set_busy src {} 
     572 
     573# 
     574# Add a src to the active senders list.  E.g., make a postage 
     575# stamp window appear, stats, etc. so that the user can select 
     576# the video stream. 
     577# 
     578proc activate src { 
     579        create_decoder $src 
     580        # 
     581        # give decoder a chance see a packet so it can 
     582        # determine the output geometry and color decimation. 
     583        # we shouldn't have to do this (e.g., resize will 
     584        # take care of a geomtry change), but currently 
     585        # decoders can't trigger a renderer realloation 
     586        # when the decimation changes.XXX fix this 
     587        # 
     588        after idle "really_activate $src" 
     589} 
     590 
     591proc really_activate src { 
     592 
     593        add_active $src 
     594 
     595        global V 
     596        set w $V(grid).$src 
     597        frame $w -relief groove -borderwidth 0 \ 
     598                -visual $V(visual) -colormap $V(colormap) 
     599        #XXX color 
     600        build.src $w $src 1 
     601        grid $w -row $V(currow) -column $V(curcol) -sticky we 
     602        grid columnconfigure $V(grid) $V(curcol) -weight 1 
     603 
     604        update_decoder $src 
     605        after 1000 "update_src $src" 
     606 
     607        bump 
     608} 
     609 
     610proc update_decoder src { 
     611        set_rate_vars $src 
     612        update_source_info $src 
     613} 
     614 
     615proc change_format src { 
     616        global win_list 
     617 
     618        if ![info exists win_list($src)] { 
     619                # 
     620                # if we get a change format before really_activate 
     621                # was called (i.e., so we don't even have a thumbnail yet), 
     622                # don't do anything 
     623                # 
     624                return 
     625        }     
     626        set L $win_list($src) 
     627        detach_renderers $src 
     628        set extoutList [extout_detach_src $src] 
     629        set d [$src handler] 
     630        delete $d 
     631        set d [create_decoder $src] 
     632        update_decoder $src 
     633        global colorbutton 
     634        $d color $colorbutton($src) 
     635 
     636        foreach w $L { 
     637                attach_renderer $src $w 
     638                $w redraw 
     639        } 
     640        extout_attach_src $src $extoutList 
     641} 
     642 
     643# 
     644# Called when the video stream state changes in a way that would 
     645# affect the choice of renderer.  For example, when a jpeg stream 
     646# changes from type-0 to type-1 we might have to revert from 
     647# hardware to software decoding, or we might have to reallocate 
     648# a 422 renderer as a 411 renderer.  This never needs to happen 
     649# for most stream types (i.e., because the decimation factor is fixed). 
     650# 
     651proc decoder_changed d { 
     652        foreach src [session active] { 
     653                if { [$src handler] == "$d" } { 
     654                        global active 
     655                        if ![info exists active($src)] { 
     656                                return 
     657                        } 
     658                        #XXX redundant with change_format 
     659                        global win_list 
     660                        set L $win_list($src) 
     661                        detach_renderers $src 
     662                        set extoutList [extout_detach_src $src] 
     663                        foreach w $L { 
     664                                attach_renderer $src $w 
     665                                $w redraw 
     666                        } 
     667                        extout_attach_src $src $extoutList 
     668 
     669                        return 
     670                } 
     671        } 
     672} 
     673 
     674#XXX 
     675proc detach_renderers src { 
     676        global win_list 
     677        foreach w $win_list($src) { 
     678                detach_renderer $src $w 
     679        } 
     680} 
     681 
     682proc change_name src { 
     683        global win_list nametag srclist 
     684        set name [$src sdes name] 
     685        # update viewing window names to reflect new name 
     686        if [info exists win_list($src)] { 
     687                foreach w $win_list($src) { 
     688                        if [viewing_window $w] { 
     689                                windowname [winfo toplevel $w] $name 
     690                        } 
     691                } 
     692        } 
     693        # change name in source list if it exists 
     694        if [info exists srclist] { 
     695                $srclist itemconfigure $nametag($src) -text $name 
     696        } 
     697} 
     698 
     699# 
     700# Remove a src from the active senders list.  
     701# 
     702proc deactivate src { 
     703        global ftext btext ltext fpshat bpshat lhat shat win_list V 
     704 
     705        if [info exists win_list($src)] { 
     706                foreach w $win_list($src) { 
     707                        if [viewing_window $w] { 
     708                                #XXX should check if we're voice-switched 
     709                                # and if so, bump window 
     710                                destroy_userwin $w 
     711                        } else { 
     712                                # thumbnail - just detach  
     713                                detach_window $src $w 
     714                        } 
     715                } 
     716        } 
     717 
     718        set w $V(grid).$src 
     719        if [winfo exists $w] { 
     720                grid forget $w 
     721                destroy $w 
     722                rm_active $src 
     723        } 
     724        destroy_decoder_stats $src 
     725 
     726        delete [$src handler] 
     727 
     728        unset ftext($src) 
     729        unset btext($src) 
     730        unset ltext($src) 
     731        unset fpshat($src) 
     732        unset bpshat($src) 
     733        unset lhat($src) 
     734        unset shat($src) 
     735} 
     736 
     737proc update_rate src { 
     738        global ftext btext ltext fpshat bpshat lhat shat V 
     739 
     740        set key $src 
     741        if { "$src" != "$V(session)" } { 
     742                # only compute loss statistic for network side 
     743                set p [$src np] 
     744                set s [$src ns] 
     745                set shat($key) $s 
     746                set lhat($key) [expr $s-$p] 
     747                if {$shat($key) <= 0.} { 
     748                        set loss 0 
     749                } else { 
     750                        set loss [expr 100*$lhat($key)/$shat($key)] 
     751                } 
     752                if {$loss < .1} { 
     753                        set ltext($key) (0%) 
     754                } elseif {$loss < 9.9} { 
     755                        set ltext($key) [format "(%.1f%%)" $loss] 
     756                } else { 
     757                        set ltext($key) [format "(%.0f%%)" $loss] 
     758                } 
     759        } 
     760        set bpshat($key) [$src nb] 
     761        set fpshat($key) [$src nf] 
     762 
     763        set fps $fpshat($key) 
     764        set bps $bpshat($key) 
     765         
     766        if { $fps < .1 } { 
     767                set fps "0 f/s" 
     768        } elseif { $fps < 10 } { 
     769                set fps [format "%.1f f/s" $fps] 
     770        } else { 
     771                set fps [format "%2.0f f/s" $fps] 
     772        } 
     773        if { $bps < 1 } { 
     774                set bps "0 bps" 
     775        } elseif { $bps < 1000 } { 
     776                set bps [format "%3.0f bps" $bps] 
     777        } elseif { $bps < 1000000 } { 
     778                set bps [format "%3.0f kb/s" [expr $bps / 1000]] 
     779        } else { 
     780                set bps [format "%.1f Mb/s" [expr $bps / 1000000]] 
     781        } 
     782        set ftext($key) $fps 
     783        set btext($key) $bps 
     784} 
     785 
     786proc update_src src { 
     787        global ftext 
     788        if ![info exists ftext($src)] { 
     789                return 
     790        } 
     791        update_rate $src 
     792        #XXX 
     793        update_source_info $src 
     794        after 1000 "update_src $src" 
     795} 
     796 
     797proc build.help { } { 
     798        create_help_window .help { 
     799"Transmit video by clicking on the ``Transmit'' button \ 
     800in the ``Menu'' window.  You need video capture hardware to do this." 
     801 
     802"Incoming video streams appear in the main vic window.  \ 
     803If you see the message ``Waiting for video...'', then no one is transmitting \ 
     804video to the conference address you're running on.  Otherwise, you'll \ 
     805see a thumbnail sized image and accompanying information for each source. \ 
     806Click on the thumbnail to open a larger viewing window.  You can tile the \ 
     807thumbnails in multiple columns using the ``Tile'' menu in the ``Menu'' window." 
     808"Clicking on the ``mute'' button for a given source will \ 
     809turn off decoding.  It is usually a good idea to do \ 
     810this for your own, looped-back transmission." 
     811 
     812"The transmission rate is controlled with the bit-rate \ 
     813and frame-rate sliders in the ``Transmission'' panel of the ``Menu'' window.  \ 
     814The more restrictive setting limits the transmission rate." 
     815 
     816"The video windows need not be fixed to a given source. \ 
     817The ``Mode...'' menu attached to a viewing window allows you to specify \ 
     818voice-switched and/or timer-switched modes.   In timer-switched mode, the \ 
     819window automatically cycles through (unmuted) sources, while in \ 
     820oice-switched mode, the window switches to whomever is talking \ 
     821(using cues from vat).  You can have more than one voice-switched window, \ 
     822which results in a simple LRU allocation of the windows to most recent \ 
     823speakers.  See the man page for more details." 
     824 
     825"If the user interface looks peculiar, you might \ 
     826have X resources that conflict with tk.  A common problem is \ 
     827defining ``*background'' and/or ``*foreground''." 
     828 
     829"Bugs and suggestions to vic@ee.lbl.gov.  Thanks." 
     830        } 
     831} 
     832 
     833# 
     834# what we want printed in the info window for our format etc. 
     835# (i.e., info window code is app independent but this info isn't, 
     836#  so we have this hackish callback) 
     837# 
     838proc info_text src { 
     839        set d [$src handler] 
     840        set fmt [rtp_format $src] 
     841        if { "$d" != "" } { 
     842                    set fmt "$fmt [$d info] ([$d width]x[$d height])" 
     843        } 
     844        return "$fmt" 
     845} 
  • vic/trunk/ui-relate.tcl

    r725 r729  
     1# 
     2# Copyright (c) 1998 University College London 
     3# All rights reserved. 
     4# 
     5# Redistribution and use in source and binary forms, with or without 
     6# modification, are permitted provided that the following conditions 
     7# are met: 
     8# 1. Redistributions of source code must retain the above copyright 
     9#    notice, this list of conditions and the following disclaimer. 
     10# 2. Redistributions in binary form must reproduce the above copyright 
     11#    notice, this list of conditions and the following disclaimer in the 
     12#    documentation and/or other materials provided with the distribution. 
     13# 3. All advertising materials mentioning features or use of this software 
     14#    must display the following acknowledgement: 
     15#      This product includes software developed by the Computer Science 
     16#      Department at University College London 
     17# 4. Neither the name of the University nor of the Department may be used 
     18#    to endorse or promote products derived from this software without 
     19#    specific prior written permission. 
     20# 
     21# THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND 
     22# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
     23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
     24# ARE DISCLAIMED.  IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE 
     25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
     26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
     27# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
     28# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
     29# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
     30# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
     31# SUCH DAMAGE. 
     32 
     33# K.Hasler.  01/03/98 
     34# Note: Procedures based on original VIC procedures are appended with 'relate' 
     35 
     36set updated 0 
     37 
     38# ------------------------------------------------- 
     39# relate_quit -- 
     40#       Setup the conference bus to receive a quit 
     41#       message from Relate.  Calls adios function to  
     42#       quit VIC. 
     43# ------------------------------------------------- 
     44 
     45set cb_dispatch(relate_quit) relate_quit 
     46proc relate_quit msg { 
     47        adios 
     48} 
     49 
     50# ------------------------------------------------- 
     51# relate_power -- 
     52#       Setup the conference bus to receive a power 
     53#       message from RAT.  The message consists of a 
     54#       cname and the power value. 
     55# ------------------------------------------------- 
     56 
     57set cb_dispatch(relate_power) relate_power 
     58proc relate_power msg { 
     59        foreach s [session active] { 
     60                # 
     61                # look up the site by cname.  (for backward compat 
     62                # with old vat's, try the IP address too) 
     63                # 
     64                set ipmsg [lindex $msg 0] 
     65                if { [$s addr] == $ipmsg || [$s sdes cname] == $ipmsg } { 
     66                        service_audio_power $s [lindex $msg 1] 
     67                        return 
     68                } 
     69        } 
     70} 
     71 
     72# ------------------------------------------------- 
     73# service_auido_power -- 
     74#       Given a window source and a power level, first 
     75#       find if this is a standard window or big window 
     76#       and then configure 'bar' to adjusted level.  
     77# ------------------------------------------------- 
     78 
     79proc service_audio_power { src level } { 
     80        global win_src V 
     81        set w 0 
     82        if {[info exists win_src(.top.big.frame.video)]} { 
     83                set w $win_src(.top.big.frame.video) 
     84        } 
     85        if {$w!=$src} { 
     86                set w $V(grid).$src.stamp.power.bar 
     87                set bar_length 114 
     88        } else { 
     89                set w .top.big.frame.power.bar 
     90                set bar_length 290 
     91        } 
     92   
     93  # calculate the absolute length of the  
     94  set length  [expr ($level * $bar_length) / 100]; 
     95 
     96  if ![winfo exists $w] { 
     97     return 
     98  } 
     99   
     100  if {$length>$bar_length} { 
     101      set length $bar_length 
     102  } 
     103  $w configure -height $length  
     104} 
     105 
     106# ------------------------------------------------- 
     107# redocorate_relate -- 
     108#       Deactivate all sources currently active.  If a  
     109#       big window exists destroy that as well.  New  
     110#       video windows will be created as new packets  
     111#       arrive.  Updated is set to 1 to remove old  
     112#       stats update in 'update_src' 
     113# ------------------------------------------------- 
     114 
     115proc redecorate_relate { } { 
     116        global V window_no updated 
     117        set updated 1 
     118        if ![info exists V(grid)] { 
     119                return 
     120        } 
     121        if {[winfo exists .top.big.frame]} {destroy_userwin_relate .top.big.frame} 
     122        set w $V(grid) 
     123        grid propagate $w 0 
     124        set list [session active] 
     125        foreach src $list { 
     126                if {"$src"!="$V(session)"} {$src deactivate}  
     127        } 
     128        repack_relate 
     129} 
     130 
     131# ------------------------------------------------- 
     132# rm_active_relate -- 
     133#       Remove video window from active list 
     134# ------------------------------------------------- 
     135 
     136proc rm_active_relate src { 
     137        global active V window_no 
     138        set window_no [expr $window_no-1] 
     139        unset active($src) 
     140} 
     141 
     142# ------------------------------------------------- 
     143# deactivate_relate -- 
     144#       Destroy video window and all related variables 
     145#       ie stats. 
     146# ------------------------------------------------- 
     147 
     148proc deactivate_relate src { 
     149        global ftext btext ltext fpshat bpshat lhat shat win_list V  
     150        unset ftext($src) 
     151                if [info exists win_list($src)] { 
     152                foreach w $win_list($src) { 
     153                        if [viewing_window $w] { 
     154                                #XXX should check if we're voice-switched 
     155                                # and if so, bump window 
     156                                destroy_userwin_relate $w 
     157                        } else { 
     158                                # thumbnail - just detach  
     159                                detach_window $src $w 
     160                        } 
     161                } 
     162        } 
     163 
     164        set w $V(grid).$src 
     165        if [winfo exists $w] { 
     166                grid forget $w 
     167                destroy $w 
     168                rm_active_relate $src 
     169        } 
     170        destroy_decoder_stats $src 
     171        destroy_rtp_stats $src 
     172        delete [$src handler] 
     173 
     174        unset btext($src) 
     175        unset ltext($src) 
     176        unset fpshat($src) 
     177        unset bpshat($src) 
     178        unset lhat($src) 
     179        unset shat($src) 
     180        repack_relate 
     181} 
     182 
     183# ------------------------------------------------- 
     184# rm_active_relate -- 
     185#       Remove big video window. 
     186# ------------------------------------------------- 
     187 
     188proc destroy_userwin_relate w { 
     189        global win_src 
     190        if {[winfo exists $w.video]==1} { 
     191                catch { 
     192                        set src $win_src($w.video) 
     193                        detach_window $src $w.video 
     194                } 
     195                destroy $w 
     196        } 
     197        repack_relate 
     198} 
     199 
     200# ------------------------------------------------- 
     201# add_active_relate -- 
     202#       Add a window source to the active list. 
     203# ------------------------------------------------- 
     204 
     205proc add_active_relate src { 
     206        global active 
     207        set active($src) 1 
     208} 
     209 
     210# ------------------------------------------------- 
     211# build.powerbars -- 
     212#       Create powerbars, stats and username for window 
     213# ------------------------------------------------- 
     214 
     215proc build.powerbars {stamp src} { 
     216        set f [smallfont] 
     217        # Create power bar 
     218        frame $stamp.power -width 20 -relief groove -bg grey -bd 3 
     219 
     220        pack $stamp -expand 1  -fill both 
     221        frame $stamp.power.bar -width 10 -height 1 -bg green -relief flat 
     222        pack $stamp.power.bar -side bottom  
     223 
     224        label $stamp.name -width 20 -textvariable src_nickname($src) -font $f  
     225        pack $stamp.name  -expand 1 -side top -fill x 
     226         
     227        global ftext btext ltext 
     228        set ftext($src) "0.0 f/s" 
     229        set btext($src) "0.0 kb/s" 
     230        set ltext($src) "(0%)" 
     231        frame $stamp.bar 
     232        label $stamp.bar.fps -textvariable ftext($src) -width 6 \ 
     233                -font $f -pady 0 -borderwidth 0 
     234        label $stamp.bar.bps -textvariable btext($src) -width 8 \ 
     235                -font $f -pady 0 -borderwidth 0 
     236        label $stamp.bar.loss -textvariable ltext($src) -width 6 \ 
     237                -font $f -pady 0 -borderwidth 0 
     238 
     239        global mutebutton V 
     240        set mutebutton($src) $V(muteNewSources) 
     241        $src mute $mutebutton($src) 
     242 
     243        checkbutton $stamp.bar.mute -bd 1 -relief flat  -text M -font $f -width 1\ 
     244          -variable mutebutton($src) -command "$src mute \$mutebutton($src)" 
     245        pack $stamp.bar.fps $stamp.bar.bps $stamp.bar.loss $stamp.bar.mute -side left -fill x -expand 1 
     246        pack $stamp.bar -side bottom -fill x -expand 1 
     247        pack $stamp.power -side right -fill y 
     248} 
     249 
     250# ------------------------------------------------- 
     251# open_window_relate -- 
     252#       Create a big video window with maximum update 
     253#       of 6 fps.  Name is bound to procedure to  
     254#       destory window. 
     255# ------------------------------------------------- 
     256 
     257proc open_window_relate src { 
     258        set w .top.big 
     259        frame $w.frame 
     260        create_video_widget $w.frame.video 342 294 
     261        global win_is_slow win_target 
     262        build.powerbars $w.frame $src 
     263        set v $w.frame.video 
     264        pack $v -anchor c 
     265        pack $v -expand 1 -fill both 
     266        bind $w.frame.name <1> "destroy_userwin_relate $w.frame" 
     267 
     268        # 
     269        # Finally, bind the source to the window. 
     270        # 
     271        attach_window $src $v 
     272        #set target $win_target($v)  
     273        #$target update-interval 6 
     274 
     275} 
     276 
     277# ------------------------------------------------- 
     278# select_thumbnail_relate -- 
     279#       Destroy current big window and create a new 
     280#       one given a video source.  
     281# ------------------------------------------------- 
     282 
     283proc select_thumbnail_relate { w src } { 
     284        global winstate 
     285        if {$winstate==1} { 
     286                set vw .top.big.frame 
     287                if {[winfo exists $vw]==1} { 
     288                        destroy_userwin_relate $vw 
     289                } 
     290                pack forget $w.stamp 
     291                open_window_relate $src 
     292        } 
     293} 
     294 
     295# ------------------------------------------------- 
     296# really_activate_relate -- 
     297#       Remove big video window. 
     298# ------------------------------------------------- 
     299 
     300proc really_activate_relate src { 
     301        add_active_relate $src 
     302        global V 
     303        set w $V(grid).$src 
     304        frame $w -relief groove -borderwidth 0 \ 
     305                -visual $V(visual) -colormap $V(colormap) 
     306        #XXX color 
     307        pack propagate $V(grid) 0 
     308        grid propagate $V(grid) 0 
     309        grid $w -row $V(currow) -column $V(curcol) -sticky nw 
     310        grid columnconfigure $V(grid) $V(curcol) -weight 1 
     311        grid rowconfigure $V(grid) $V(currow) -weight 1 
     312        if {[build.src.relate $w $src 1]==1} { 
     313                update_decoder $src 
     314                after 4000 "global updated; set updated 0; catch {update_src $src}" 
     315                bump 
     316        } 
     317} 
     318 
     319# ------------------------------------------------- 
     320# repack_relate -- 
     321#       Pack video windows into a grid with two rows 
     322#       and destroy big window. 
     323# ------------------------------------------------- 
     324 
     325proc repack_relate { } { 
     326        global V winstate window_no 
     327        set V(curcol) 0 
     328        set V(currow) 0 
     329        set V(ncol) 2 
     330        if ![info exists V(grid)] { 
     331                return 
     332        } 
     333        set window_no 0 
     334        if {[winfo exists .top.big.frame]} {destroy_userwin_relate .top.big.frame} 
     335        set w $V(grid) 
     336        grid propagate $w 0 
     337        set list [session active] 
     338        foreach src $list { 
     339                incr window_no 
     340                if {[expr $winstate == 1 && $window_no > 4]  || [expr $winstate == 0 && $window_no > 8]} { 
     341                pack forget $w.$src.stamp 
     342                } else { 
     343                grid $w.$src -row $V(currow) -column $V(curcol) -sticky nw 
     344                pack $w.$src.stamp 
     345                } 
     346                bump 
     347        } 
     348} 
     349 
     350# ------------------------------------------------- 
     351# build.src.relate -- 
     352#       Create a new small window with max fps of 1. 
     353#       If the maximum number of windows has been 
     354#       reached then hide window. 
     355# ------------------------------------------------- 
     356 
     357proc build.src.relate { w src color } { 
     358        global winstate window_no 
     359        incr window_no 
     360        set stamp $w.stamp 
     361        frame $stamp -relief ridge -borderwidth 2 
     362        create_video_widget $stamp.video 159 120 
     363        build.powerbars $stamp $src                      
     364        bind $stamp.name <1> "select_thumbnail_relate $w $src" 
     365        bind $stamp.video <Enter> { focus %W } 
     366 
     367        #global win_is_slow 
     368        #set win_is_slow($stamp.video) 1 
     369        attach_window $src $stamp.video 
     370        pack $stamp.video -anchor c 
     371        if {[expr $winstate == 1 && $window_no > 4]  || [expr $winstate == 0 && $window_no > 8]} { 
     372                pack forget $stamp 
     373        } else { 
     374                pack $stamp -side left  
     375        } 
     376        bind $stamp.video <d> "$src deactivate" 
     377        return 1 
     378} 
     379 
     380# ------------------------------------------------- 
     381# build.bar.relate -- 
     382#       Create controls at bottom of window. 
     383# ------------------------------------------------- 
     384 
     385proc build.bar.relate { w } { 
     386        global title winstate 
     387        frame $w.bar 
     388        set winstate 0 
     389        checkbutton $w.bar.send -font [smallfont] -text "Transmit" -borderwidth 2 \ 
     390                -relief raised -command transmit -variable transmitButtonState \ 
     391                -anchor w -state disabled 
     392 
     393        after 1000 { 
     394                global transmitButton 
     395                if {[$transmitButton cget -state]=="normal"} { 
     396                        .top.bar.send configure -state normal 
     397                        return 
     398                } 
     399        } 
     400 
     401        button $w.bar.release -font [smallfont] -text "Stop" -borderwidth 2 \ 
     402                -relief raised -command release_device 
     403 
     404        menubutton $w.bar.mb -menu $w.bar.mb.m -text Participants -relief raised 
     405        menu $w.bar.mb.m  
     406        $w.bar.mb.m add checkbutton -label "four" -command four_windows -variable winstate 
     407        $w.bar.mb.m add checkbutton -label "eight" -command eight_windows -onvalue 0 -offvalue 1 -variable winstate 
     408 
     409        label $w.bar.title -text "VIC [version]" -font [smallfont] 
     410        button $w.bar.quit -text Quit -borderwidth 2 -relief raised \ 
     411         -font [smallfont] -command adios 
     412        button $w.bar.refresh -font [smallfont] -text "Refresh" -borderwidth 2 -relief raised -command redecorate_relate 
     413        button $w.bar.menu -text Admin -borderwidth 2 -relief raised \ 
     414                -font [smallfont] \ 
     415                -command "toggle_window .menu" 
     416        button $w.bar.help -text Help -borderwidth 2 -relief raised \ 
     417                -font [smallfont] \ 
     418                -command "toggle_window .help" 
     419 
     420        # pack $w.bar.menu $w.bar.help $w.bar.quit -side left 
     421        pack $w.bar.send $w.bar.release -side left 
     422        pack $w.bar.title -side left -fill x -expand 1 
     423        pack $w.bar.mb -side left -fill y 
     424        pack $w.bar.refresh -side left 
     425        pack $w.bar.menu -side left 
     426} 
     427 
     428# ------------------------------------------------- 
     429# four_windows -- 
     430#       Configure window to hold four windows and one 
     431#       large window. 
     432# ------------------------------------------------- 
     433 
     434proc four_windows {} { 
     435global V winstate 
     436set winstate 1 
     437.top.big configure -height 344 
     438$V(grid) configure -height 340 
     439redecorate_relate 
     440} 
     441 
     442# ------------------------------------------------- 
     443# eight_windows -- 
     444#       Configure window to hold eight windows. 
     445# ------------------------------------------------- 
     446 
     447proc eight_windows {} { 
     448global V winstate 
     449set winstate 0 
     450.top.big configure -height 0 
     451$V(grid) configure -height 684 
     452repack_relate 
     453} 
     454 
     455# ------------------------------------------------- 
     456# build.new.interface -- 
     457#       Setup initial window 
     458# ------------------------------------------------- 
     459 
     460proc build.new.interface {} { 
     461        global V window_no 
     462        init_visual .top 
     463        if ![init_color] { 
     464                if { [winfo depth .top] != 8 } { 
     465                        puts stderr "vic: internal error: no colors" 
     466                        exit 2 
     467                } 
     468                puts stderr \ 
     469                    "vic: warning: ran out of colors; using private colormap" 
     470                destroy .top 
     471                frame .top -visual $V(visual) -colormap new 
     472                if ![init_color] { 
     473                        puts stderr "vic: internal error: no colors" 
     474                        exit 2 
     475                } 
     476        } 
     477     
     478        build.srclist 
     479        set window_no 0 
     480        set_rate_vars $V(session) 
     481 
     482        # 
     483        # emulate implicit keyboard focus 
     484        # 
     485        bind . <Enter> { focus %W } 
     486        #wm focusmodel . active 
     487        bind . <q> { adios } 
     488        bind . <Control-c> { adios } 
     489        bind . <Control-d> { adios } 
     490 
     491        set V(curcol) 0 
     492        set V(currow) 0 
     493        set V(ncol) 2 
     494        set V(muteNewSources) [yesno muteNewSources] 
     495        set w .top 
     496        .top configure -height 718 -width 362 
     497        pack propagate .top 0 
     498        set  V(grid) $w.thumbs 
     499  
     500        wm title . "ReLaTe" 
     501 
     502        frame $w.big -height 344 -width 362 -relief groove -bd 2 
     503        frame $V(grid) -relief groove -bd 2 -height 340 -width 362 
     504        build.bar.relate .top 
     505        pack propagate $w.big 0 
     506        pack $w.big -fill both -side top 
     507        pack $V(grid) -expand 1 -fill both -side top 
     508        pack .top.bar -fill x -side bottom 
     509        pack .top -expand 1 -fill both -side bottom 
     510        eight_windows 
     511        after 1000 periodic_update 
     512}