home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-12-09 | 43.2 KB | 1,618 lines |
- Path: wuarchive!julius.cs.uiuc.edu!apple!sun-barr!newstop!exodus!appserv!halibut.cis.upenn.edu
- From: bradley@halibut.cis.upenn.edu (John Bradley)
- Newsgroups: comp.sources.x
- Subject: v10i085: xv - display and manipulate images, Part07/10
- Message-ID: <323@appserv.Eng.Sun.COM>
- Date: 27 Nov 90 20:08:38 GMT
- References: <csx-10i079:xv@uunet.UU.NET>
- Sender: news@exodus.Eng.Sun.COM
- Lines: 1601
- Approved: argv@sun.com
-
- Submitted-by: bradley@halibut.cis.upenn.edu (John Bradley)
- Posting-number: Volume 10, Issue 85
- Archive-name: xv/part07
-
- #!/bin/sh
- # to extract, remove the header and type "sh filename"
- if `test ! -s ./xvbutt.c`
- then
- echo "writting ./xvbutt.c"
- cat > ./xvbutt.c << '\BARFOO\'
- /*
- * xvbutt.c - regular and 'radio' pushbuttons
- *
- * callable functions:
- *
- * BTCreate() - create a button
- * BTSetActive() - change 'active' status of button
- * BTRedraw() - redraw button
- * BTTrack() - clicked in button. track until mouse up
- *
- * RBCreate() - create an RBUTT and append to supplied list
- * RBRedraw() - redraw one or all RBUTTs in a list
- * RBSelect() - change selected item in list of RBUTTs
- * RBWhich() - returns index of selected RBUTT in list
- * RBCount() - returns # of RBUTTs in list
- * RBSetActive() - sets active status of an RBUTT
- * RBClick() - finds clicked-on rb in a list
- * RBTrack() - tracks rb after click, until release
- */
-
- /*
- * Copyright 1989, 1990 by the University of Pennsylvania
- *
- * Permission to use, copy, and distribute for non-commercial purposes,
- * is hereby granted without fee, providing that the above copyright
- * notice appear in all copies and that both the copyright notice and this
- * permission notice appear in supporting documentation.
- *
- * The software may be modified for your own purposes, but modified versions
- * may not be distributed.
- *
- * This software is provided "as is" without any express or implied warranty.
- */
-
-
- #include "xv.h"
- #include "bitmaps.h"
-
- static int rbpixmade = 0;
- static Pixmap rbon, rboff, rbon1, rboff1;
-
- #ifdef __STDC__
- static void drawRB(RBUTT *);
- #else
- static void drawRB();
- #endif
-
- /**********************************************/
- void BTCreate(bp,win,x,y,w,h,str,fg,bg)
- BUTT *bp;
- Window win;
- int x,y,w,h;
- char *str;
- unsigned long fg,bg;
- {
- bp->win = win;
- bp->x = x; bp->y = y; bp->w = w; bp->h = h;
- bp->str = str;
- bp->fg = fg; bp->bg = bg;
- bp->lit = 0;
- bp->active = 1;
- bp->toggle = 0;
- }
-
-
-
- /**********************************************/
- void BTSetActive(bp,act)
- BUTT *bp;
- int act;
- {
- if (bp->active != act) {
- bp->active = act;
- BTRedraw(bp);
- }
- }
-
-
-
- /**********************************************/
- void BTRedraw(bp)
- BUTT *bp;
- {
- int x,y,w,h,r;
- XPoint poly[9];
-
- x = bp->x; y=bp->y; w=bp->w; h=bp->h; r=3;
-
- /* set up the polygon */
- poly[0].x = x; poly[0].y = y+r;
- poly[1].x = x; poly[1].y = y+h-r;
- poly[2].x = x+r; poly[2].y = y+h;
- poly[3].x = x+w-r; poly[3].y = y+h;
- poly[4].x = x+w; poly[4].y = y+h-r;
- poly[5].x = x+w; poly[5].y = y+r;
- poly[6].x = x+w-r; poly[6].y = y;
- poly[7].x = x+r; poly[7].y = y;
- poly[8].x = x; poly[8].y = y+r;
-
-
- if (!bp->active) bp->lit = 0; /* sanity assertion */
-
- if (bp->lit) XSetForeground(theDisp, theGC, bp->fg);
- else XSetForeground(theDisp, theGC, bp->bg);
- XFillPolygon(theDisp,bp->win,theGC,poly,9,Convex,CoordModeOrigin);
-
- XSetForeground(theDisp, theGC, bp->fg);
- XDrawLines(theDisp,bp->win,theGC,poly,9,CoordModeOrigin);
-
- if (!bp->active) { /* stipple the text if not active */
- XSetFillStyle(theDisp, theGC, FillStippled);
- XSetStipple(theDisp, theGC, grayStip);
- }
-
- if (bp->lit) XSetForeground(theDisp, theGC, bp->bg);
- else XSetForeground(theDisp, theGC, bp->fg);
- XDrawString(theDisp, bp->win, theGC, CENTERX(mfinfo,x+w/2,bp->str),
- CENTERY(mfinfo,y+h/2), bp->str, strlen(bp->str));
-
- if (!bp->active) XSetFillStyle(theDisp,theGC,FillSolid); /* back to norm */
- }
-
-
-
- /**********************************************/
- int BTTrack(bp)
- BUTT *bp;
- {
- /* called when we've gotten a click inside 'bp'. returns 1 if button
- was still selected lit when mouse was released. */
-
- Window rW, cW;
- int x, y, rx, ry, rval, inval;
- unsigned int mask;
-
- if (!bp->active) return 0; /* inactive button */
-
- bp->lit = !bp->lit;
- inval = bp->lit;
-
- BTRedraw(bp); XFlush(theDisp);
- Timer(75); /* long enough for turn on to be visible */
-
- while (XQueryPointer(theDisp,bp->win,&rW,&cW,&rx,&ry,&x,&y,&mask)) {
- if (!(mask & Button1Mask)) break; /* button released */
-
- if (bp->lit!=inval && PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) {
- bp->lit = inval; BTRedraw(bp); XFlush(theDisp);
- }
-
- if (bp->lit==inval && !PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) {
- bp->lit = !inval; BTRedraw(bp); XFlush(theDisp);
- }
- }
-
- rval = (bp->lit == inval);
-
- if (bp->lit && !bp->toggle)
- { bp->lit = 0; BTRedraw(bp); XFlush(theDisp); }
-
- return(rval);
- }
-
-
-
-
-
-
-
-
- /***********************************************/
- RBUTT *RBCreate(rblist, win, x,y,str, fg, bg)
- RBUTT *rblist;
- Window win;
- int x,y;
- char *str;
- unsigned long fg,bg;
- {
- /* mallocs an RBUTT, fills in the fields, and appends it to rblist
- if rblist is NULL, this is the first rb in the list. It will
- be made the 'selected' one
-
- Note: no need to check return status. It'll fatal error if it
- can't malloc */
-
- RBUTT *rb, *rbptr;
-
- rb = (RBUTT *) malloc(sizeof(RBUTT));
- if (!rb) FatalError("couldn't malloc RBUTT");
-
- /* fill in the fields of the structure */
- rb->win = win;
- rb->x = x;
- rb->y = y;
- rb->str = str;
- rb->selected = 0;
- rb->active = 1;
- rb->next = (RBUTT *) NULL;
- rb->fg = fg;
- rb->bg = bg;
-
- if (rblist) { /* append to end of list */
- rbptr = rblist;
- while (rbptr->next) rbptr = rbptr->next;
- rbptr->next = rb;
- }
- else { /* this is the first one in the list. select it */
- rb->selected = 1;
- }
-
-
- /* and, on an unrelated note, if the RB pixmaps haven't been created yet,
- do so. We'll be needing them, y'see... */
-
- if (!rbpixmade) {
- rbon = XCreatePixmapFromBitmapData(theDisp, rootW, rb_on_bits,
- rb_on_width, rb_on_height, fg, bg, dispDEEP);
-
- rboff = XCreatePixmapFromBitmapData(theDisp, rootW, rb_off_bits,
- rb_off_width, rb_off_height, fg, bg, dispDEEP);
- rbon1 = XCreatePixmapFromBitmapData(theDisp, rootW, rb_on1_bits,
- rb_on1_width, rb_on1_height, fg, bg, dispDEEP);
- rboff1= XCreatePixmapFromBitmapData(theDisp, rootW, rb_off1_bits,
- rb_off1_width, rb_off1_height, fg, bg, dispDEEP);
-
- rbpixmade = 1;
- }
-
- return(rb);
- }
-
-
-
-
- /***********************************************/
- void RBRedraw(rblist, num)
- RBUTT *rblist;
- int num;
- {
- /* redraws the 'num-th' RB in the list. if num < 0, redraws entire list */
-
- RBUTT *rb;
- int i;
-
- /* point 'rb' at the appropriate RBUTT, *if* we're not drawing entire list */
- if (num>=0) {
- i=0; rb=rblist;
- while (i!=num && rb) { rb = rb->next; i++; }
- if (!rb) return; /* num is out of range. do nothing */
- drawRB(rb);
- }
-
- else { /* draw entire list */
- rb = rblist;
- while (rb) {
- drawRB(rb);
- rb = rb->next;
- }
- }
- }
-
-
- static void drawRB(rb)
- RBUTT *rb;
- {
- /* draws the rb being pointed at */
-
- if (!rb) return; /* rb = NULL */
-
- XSetForeground(theDisp, theGC, rb->fg);
- XSetBackground(theDisp, theGC, rb->bg);
-
- if (rb->selected)
- XCopyArea(theDisp, rbon, rb->win, theGC, 0, 0, rb_on_width, rb_on_height,
- rb->x, rb->y);
- else
- XCopyArea(theDisp, rboff, rb->win, theGC, 0, 0, rb_on_width, rb_on_height,
- rb->x, rb->y);
-
- XDrawString(theDisp, rb->win, theGC, rb->x+rb_on_width+4,
- rb->y+rb_on_height/2 - CHIGH/2 + ASCENT,rb->str,strlen(rb->str));
-
- /* if non-active, dim button and string */
- if (!rb->active) {
- /* stipple the RB by drawing 'bg' where there's 1's in the stipple */
- XSetFillStyle(theDisp, theGC, FillStippled);
- XSetStipple(theDisp, theGC, grayStip);
- XSetForeground(theDisp, theGC, rb->bg);
- XFillRectangle(theDisp,rb->win,theGC,rb->x,rb->y,rb_on_width,rb_on_height);
- XFillRectangle(theDisp,rb->win,theGC, rb->x + rb_on_width+4,
- rb->y+rb_on_height/2 - CHIGH/2, StringWidth(rb->str),CHIGH);
- XSetFillStyle(theDisp, theGC, FillSolid);
- }
- }
-
-
- /***********************************************/
- void RBSelect(rblist, n)
- RBUTT *rblist;
- int n;
- {
- RBUTT *rbold, *rb;
- int i;
-
- /* makes rb #n the selected rb in the list. Does all redrawing. Does
- nothing if rb already selected */
-
- /* get pointers to the currently selected rb and the desired rb */
- rbold = rblist;
- while (rbold && !rbold->selected) rbold = rbold->next;
- if (!rbold) return; /* no currently selected item. shouldn't happen */
-
- rb = rblist; i=0;
- while (rb && i!=n) {rb = rb->next; i++; }
- if (!rb) return; /* 'n' is out of range */
-
-
- if (rb == rbold) return; /* 'n' is already selected. do nothing */
-
- rbold->selected = 0;
- rb->selected = 1;
- drawRB(rbold);
- drawRB(rb);
- }
-
-
-
- /***********************************************/
- int RBWhich(rblist)
- RBUTT *rblist;
- {
- int i;
-
- /* returns index of currently selected rb. if none, returns -1 */
-
- i = 0;
- while (rblist && !rblist->selected) { rblist = rblist->next; i++; }
-
- if (!rblist) return -1; /* didn't find one */
- return i;
- }
-
-
- /***********************************************/
- int RBCount(rblist)
- RBUTT *rblist;
- {
- int i;
-
- /* returns # of rb's in the list */
-
- i = 0;
- while (rblist) { rblist = rblist->next; i++; }
- return i;
- }
-
-
- /***********************************************/
- void RBSetActive(rblist, n, act)
- RBUTT *rblist;
- int n,act;
- {
- RBUTT *rb;
- int i;
-
- /* sets 'active' status of rb #n. does redrawing */
-
- rb=rblist; i=0;
- while (rb && i!=n) { rb = rb->next; i++; }
- if (!rb) return; /* n out of range. do nothing */
-
- if (rb->active != act) {
- rb->active = act;
- drawRB(rb);
- }
- }
-
-
- /***********************************************/
- int RBClick(rblist, mx, my)
- RBUTT *rblist;
- int mx,my;
- {
- int i;
-
- /* searches through rblist to see if mouse click at mx,my is in the
- clickable region of any of the rb's. If it finds one, it returns
- it's index in the list. If not, returns -1 */
-
- i = 0;
- while (rblist) {
- if (PTINRECT(mx, my, rblist->x, rblist->y, rb_on_width, rb_on_height))
- break;
- rblist = rblist->next;
- i++;
- }
-
- if (!rblist) return -1;
- return(i);
- }
-
-
- /***********************************************/
- void RBTrack(rblist, n)
- RBUTT *rblist;
- int n;
- {
- RBUTT *rb;
- Window rW, cW;
- int i, x, y, rx, ry, lit;
- unsigned int mask;
- Pixmap litpix, darkpix;
-
- rb=rblist; i=0;
- while (rb && i!=n) { rb = rb->next; i++; }
- if (!rb) return; /* n out of range */
-
- /* called once we've figured out that the mouse clicked in 'rb' */
-
- if (!rb->active) return;
-
- if (rb->selected) { litpix = rbon1; darkpix = rbon; }
- else { litpix = rboff1; darkpix = rboff; }
-
- lit = 1;
- XCopyArea(theDisp, litpix, rb->win, theGC, 0, 0, rb_on_width, rb_on_height,
- rb->x, rb->y);
- XFlush(theDisp);
- Timer(75); /* give chance for 'turn on' to become visible */
-
- while (XQueryPointer(theDisp,rb->win,&rW,&cW,&rx,&ry,&x,&y,&mask)) {
- if (!(mask & Button1Mask)) break; /* button released */
-
- if (!lit && PTINRECT(x, y, rb->x, rb->y, rb_on_width, rb_on_height)) {
- lit=1;
- XCopyArea(theDisp, litpix, rb->win, theGC, 0,0,rb_on_width,rb_on_height,
- rb->x, rb->y);
- XFlush(theDisp);
- }
-
- if (lit && !PTINRECT(x, y, rb->x, rb->y, rb_on_width, rb_on_height)) {
- lit=0;
- XCopyArea(theDisp, darkpix,rb->win,theGC, 0,0,rb_on_width,rb_on_height,
- rb->x, rb->y);
- XFlush(theDisp);
- }
- }
-
- if (lit) {
- XCopyArea(theDisp, darkpix, rb->win, theGC, 0, 0,
- rb_on_width, rb_on_height, rb->x, rb->y);
- RBSelect(rblist, n);
- }
-
- XFlush(theDisp);
- }
- \BARFOO\
- else
- echo "will not over write ./xvbutt.c"
- fi
- if `test ! -s ./xvctrl.c`
- then
- echo "writting ./xvctrl.c"
- cat > ./xvctrl.c << '\BARFOO\'
- /*
- * xvctrl.c - Control box handling functions
- *
- * callable functions:
- *
- * CreateCtrl(geom) - creates the ctrlW window. Doesn't map it.
- * CtrlBox(vis) - random processing based on value of 'vis'
- * maps/unmaps window, etc.
- * RedrawCtrl(x,y,w,h) - called by 'expose' events
- * ClickCtrl(x,y)
- * DrawCtrlStr() - called to redraw 'ISTR_INFO' string in ctrlW
- * ScrollToCurrent() - called when 'curname' is changed
- *
- * LSCreate() - creates a listbox
- * LSRedraw() - redraws 'namelist' box
- * LSClick() - operates list box
- * LSNewData() - called when strings or number of them change
- *
- */
-
- /*
- * Copyright 1989, 1990 by the University of Pennsylvania
- *
- * Permission to use, copy, and distribute for non-commercial purposes,
- * is hereby granted without fee, providing that the above copyright
- * notice appear in all copies and that both the copyright notice and this
- * permission notice appear in supporting documentation.
- *
- * The software may be modified for your own purposes, but modified versions
- * may not be distributed.
- *
- * This software is provided "as is" without any express or implied warranty.
- */
-
-
- #include "xv.h"
- #include "bitmaps.h"
-
- #define DBLCLKTIME 500 /* double-click speed in milliseconds */
-
- #define INACTIVE(lptr, item) ((lptr)->filetypes && (lptr)->dirsonly && \
- (item) >= 0 && (item) < (lptr)->nstr && \
- (lptr)->str[(item)][0] != C_DIR && \
- (lptr)->str[(item)][0] != C_LNK)
-
- #define NLINES 9 /* # of lines in list control (keep odd) */
- #define LISTW 330
-
- #define BUTTW 60
- #define BUTTH 19
-
- static int listh; /* height of list/scrl controls */
- static int ptop; /* y-coord of top of button area in ctrlW */
-
- static Pixmap fifoPix, chrPix, dirPix, blkPix, lnkPix, sockPix, regPix;
-
- #ifdef __STDC__
- static void drawSel(LIST *, int);
- static void RedrawNList(void);
- #else
- static void drawSel(), RedrawNList();
- #endif
-
-
- /***************************************************/
- void CreateCtrl(geom)
- char *geom;
- {
- int i,b2wide;
-
- ctrlW = CreateWindow("xv controls", geom, CTRLWIDE,CTRLHIGH,infofg,infobg);
- if (!ctrlW) FatalError("can't create controls window!");
-
- grayTile = XCreatePixmapFromBitmapData(theDisp, ctrlW, gray25_bits,
- gray25_width, gray25_height, infofg, infobg, dispDEEP);
-
- grayStip = XCreatePixmapFromBitmapData(theDisp, ctrlW, gray50_bits,
- gray50_width, gray50_height, 1, 0, 1);
-
- fifoPix = XCreatePixmapFromBitmapData(theDisp, ctrlW, i_fifo_bits,
- i_fifo_width, i_fifo_height, 1, 0, 1);
-
- chrPix = XCreatePixmapFromBitmapData(theDisp, ctrlW, i_chr_bits,
- i_chr_width, i_chr_height, 1,0,1);
-
- dirPix = XCreatePixmapFromBitmapData(theDisp, ctrlW, i_dir_bits,
- i_dir_width, i_dir_height, 1,0,1);
-
- blkPix = XCreatePixmapFromBitmapData(theDisp, ctrlW, i_blk_bits,
- i_blk_width, i_blk_height, 1,0,1);
-
- lnkPix = XCreatePixmapFromBitmapData(theDisp, ctrlW, i_lnk_bits,
- i_lnk_width, i_lnk_height, 1,0,1);
-
- sockPix = XCreatePixmapFromBitmapData(theDisp, ctrlW, i_sock_bits,
- i_sock_width, i_sock_height, 1,0,1);
-
- regPix = XCreatePixmapFromBitmapData(theDisp, ctrlW, i_reg_bits,
- i_reg_width, i_reg_height, 1,0,1);
-
-
- XSetWindowBackgroundPixmap(theDisp, ctrlW, grayTile);
-
- /* create doo-wahs */
- listh = LINEHIGH * NLINES;
-
- LSCreate(&nList, ctrlW, 10, 10+CHIGH+3, LISTW, listh, NLINES, dispnames,
- numnames, infofg, infobg, RedrawNList, 0, 0);
-
- ptop = CTRLHIGH - (3*BUTTH + 4*8);
-
- i = listh-BUTTH;
-
- BTCreate(&but[BNEXT], ctrlW, 368, nList.y+(i*0)/4, 60,
- BUTTH, "Next", infofg, infobg);
- BTCreate(&but[BPREV], ctrlW, 368, nList.y+(i*1)/4, 60,
- BUTTH, "Previous", infofg, infobg);
- BTCreate(&but[BINFO], ctrlW, 368, nList.y+(i*2)/4, 60,
- BUTTH, "Info", infofg, infobg);
- BTCreate(&but[BSAVE], ctrlW, 368, nList.y+(i*3)/4, 60,
- BUTTH, "Save", infofg, infobg);
- BTCreate(&but[BQUIT], ctrlW, 368, nList.y+(i*4)/4, 60,
- BUTTH, "Quit", infofg, infobg);
-
- BTCreate(&but[BCROP], ctrlW, 10, ptop+8,
- BUTTW, BUTTH, "Crop", infofg, infobg);
- BTCreate(&but[BUNCROP], ctrlW, 10, ptop + BUTTH + 2*8,
- BUTTW, BUTTH, "UnCrop", infofg, infobg);
-
- BTCreate(&but[BMAX], ctrlW, 10+(CTRLWIDE-20-BUTTW)/5, ptop+8,
- BUTTW, BUTTH, "Max Size", infofg, infobg);
- BTCreate(&but[BNORM], ctrlW, 10+(CTRLWIDE-20-BUTTW)/5, ptop + BUTTH + 2*8,
- BUTTW, BUTTH, "Normal", infofg, infobg);
-
- BTCreate(&but[BUP2], ctrlW, 10+(2*(CTRLWIDE-20-BUTTW))/5, ptop+8,
- BUTTW, BUTTH, "Dbl Size", infofg, infobg);
- BTCreate(&but[BDN2], ctrlW, 10+(2*(CTRLWIDE-20-BUTTW))/5, ptop+BUTTH+2*8,
- BUTTW, BUTTH, "Half Size", infofg, infobg);
-
- BTCreate(&but[BUP10], ctrlW, 10+(3*(CTRLWIDE-20-BUTTW))/5, ptop+8,
- BUTTW, BUTTH, "+10%", infofg, infobg);
- BTCreate(&but[BDN10], ctrlW, 10+(3*(CTRLWIDE-20-BUTTW))/5, ptop+BUTTH+2*8,
- BUTTW, BUTTH, "-10%", infofg, infobg);
-
- BTCreate(&but[B4BY3], ctrlW, 10+(4*(CTRLWIDE-20-BUTTW))/5, ptop+8,
- BUTTW, BUTTH, "4x3", infofg, infobg);
- BTCreate(&but[BASPECT], ctrlW, 10+(4*(CTRLWIDE-20-BUTTW))/5, ptop+BUTTH+2*8,
- BUTTW, BUTTH, "Aspect", infofg, infobg);
-
- BTCreate(&but[BROTL], ctrlW, 10+(5*(CTRLWIDE-20-BUTTW))/5, ptop+8,
- BUTTW, BUTTH, "Turn L", infofg, infobg);
- BTCreate(&but[BROTR], ctrlW, 10+(5*(CTRLWIDE-20-BUTTW))/5, ptop+BUTTH+2*8,
- BUTTW, BUTTH, "Turn R", infofg, infobg);
-
- b2wide = (CTRLWIDE - 20 - 6*BUTTW)/5 + 2*BUTTW;
- BTCreate(&but[BACROP], ctrlW, 10 + (0*(CTRLWIDE-20-b2wide))/2,
- ptop + 2*BUTTH + 3*8, b2wide, BUTTH, "AutoCrop", infofg, infobg);
- BTCreate(&but[BMAXPECT], ctrlW, 10 + (1*(CTRLWIDE-20-b2wide))/2,
- ptop + 2*BUTTH + 3*8, b2wide, BUTTH, "Maxpect", infofg, infobg);
- BTCreate(&but[BGAMMA], ctrlW, 10 + (2*(CTRLWIDE-20-b2wide))/2,
- ptop + 2*BUTTH + 3*8, b2wide, BUTTH, "Gamma", infofg, infobg);
-
- XMapSubwindows(theDisp, ctrlW);
- }
-
-
- /***************************************************/
- void CtrlBox(vis)
- int vis;
- {
- if (vis) XMapRaised(theDisp, ctrlW);
- else XUnmapWindow(theDisp, ctrlW);
-
- ctrlUp = vis;
- }
-
-
- /***************************************************/
- void RedrawCtrl(x,y,w,h)
- int x,y,w,h;
- {
- char foo[40];
- int i;
- XRectangle xr;
-
- xr.x = x; xr.y = y; xr.width = w; xr.height = h;
- XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted);
-
- XSetForeground(theDisp, theGC, infofg);
- XSetBackground(theDisp, theGC, infobg);
-
- XDrawLine(theDisp, ctrlW, theGC, 0, ptop, CTRLWIDE, ptop);
-
- if (numnames>1) sprintf(foo,"%d files",numnames);
- else strcpy(foo,"1 file");
-
- XSetForeground(theDisp, theGC, infobg);
- XFillRectangle(theDisp,ctrlW, theGC, 10+1,5+1,StringWidth(foo)+4,CHIGH+2);
- XSetForeground(theDisp,theGC,infofg);
- XDrawRectangle(theDisp,ctrlW, theGC, 10,5,StringWidth(foo)+5,CHIGH+3);
- XDrawString(theDisp, ctrlW, theGC, 10+3, 5+ASCENT+2,
- foo, strlen(foo));
-
- for (i=0; i<NBUTTS; i++)
- BTRedraw(&but[i]);
-
- DrawCtrlStr();
-
- XSetClipMask(theDisp, theGC, None);
- }
-
-
- /***************************************************/
- void DrawCtrlStr()
- {
- int y;
- char *st;
-
- y = ptop - (CHIGH + 2);
- st = GetISTR(ISTR_INFO);
-
- XSetForeground(theDisp, theGC, infobg);
- XFillRectangle(theDisp, ctrlW, theGC, 0, y-1, CTRLWIDE, CHIGH+3);
-
- XSetForeground(theDisp, theGC, infofg);
- XDrawLine(theDisp, ctrlW, theGC, 0, y-2, CTRLWIDE, y-2);
-
- XDrawString(theDisp, ctrlW, theGC, 10, y+ASCENT, st, strlen(st));
- }
-
-
- /***************************************************/
- int ClickCtrl(x,y)
- int x,y;
- {
- BUTT *bp;
- int i;
-
- for (i=0; i<NBUTTS; i++) {
- bp = &but[i];
- if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break;
- }
-
- if (i<NBUTTS) { /* found one */
- if (BTTrack(bp)) return (i); /* and it was clicked */
- }
-
- return -1;
- }
-
-
-
- /***************************************************/
- void ScrollToCurrent()
- {
- /* called when 'curname' is changed by anything (next/prev buttons,
- wait timeout, whatever. IF curname is already visible, just redraws
- list to reflect changed selection. If not, trys to adjust 'liststart'
- so that curname will appear in the center of the list window */
-
- int halfway;
-
- nList.selected = curname;
- /* if (nList.selected >= nList.scrl.val &&
- nList.selected < nList.scrl.val + nList.nlines) LSRedraw(&nList); */
-
- if (nList.selected > nList.scrl.val &&
- nList.selected < nList.scrl.val + nList.nlines-1) LSRedraw(&nList);
- else {
- halfway = (nList.nlines)/2; /* offset to the halfway pt. of the list */
- SCSetVal(&nList.scrl, nList.selected - halfway);
- }
- }
-
-
- /***************************************************/
- static void RedrawNList()
- {
- LSRedraw(&nList);
- }
-
-
-
-
- /***************** LIST STUFF *********************/
-
- /***************************************************/
- void LSCreate(lp, win, x, y, w, h, nlines, strlist, nstr, fg, bg, fptr,
- typ, donly)
- LIST *lp;
- Window win;
- int x,y,w,h,nlines,nstr,typ,donly;
- unsigned long fg, bg;
- char **strlist; /* a pointer to a list of strings */
- void (*fptr)();
- {
- lp->win = XCreateSimpleWindow(theDisp,win,x,y,w,h,1,infofg,infobg);
- if (!lp->win) FatalError("can't create list window!");
-
- lp->x = x; lp->y = y;
- lp->w = w; lp->h = h;
- lp->fg = fg; lp->bg = bg;
- lp->str = strlist;
- lp->nstr = nstr;
- lp->selected = 0;
- lp->nlines = nlines;
- lp->filetypes= typ;
- lp->dirsonly = donly;
-
- XSelectInput(theDisp, lp->win, ExposureMask | ButtonPressMask);
-
- SCCreate(&lp->scrl, win, x+w, y, 1, h, 0, nstr-nlines, curname, nlines-1,
- fg, bg, fptr);
- }
-
-
-
- /***************************************************/
- void LSNewData(lp, strlist, nstr)
- LIST *lp;
- char **strlist;
- int nstr;
- {
- lp->str = strlist;
- lp->nstr = nstr;
- lp->selected = 0;
- SCSetRange(&lp->scrl, 0, nstr - lp->nlines, 0, lp->nlines-1);
- }
-
-
- /***************************************************/
- static void drawSel(lp,j)
- LIST *lp;
- int j;
- {
- int i, inactive;
- unsigned long fg, bg;
-
- inactive = INACTIVE(lp,j);
-
- i = j - lp->scrl.val;
- if (i<0 || i>=lp->nlines) return; /* off screen */
-
- if (j == lp->selected && !inactive && j<lp->nstr)
- { fg = lp->bg; bg = lp->fg; } /* invert */
- else { fg = lp->fg; bg = lp->bg; }
-
- XSetForeground(theDisp, theGC, bg);
- XFillRectangle(theDisp, lp->win, theGC, 0,i*LINEHIGH, lp->w, LINEHIGH);
-
- if (j>=0 && j<lp->nstr) { /* only draw string if valid */
- /* make non-dirs inactive, if dirsonly and filetypes */
- XSetForeground(theDisp, theGC, fg);
- XSetBackground(theDisp, theGC, bg);
-
- if (!lp->filetypes)
- XDrawString(theDisp, lp->win, theGC, 3, i*LINEHIGH + ASCENT + 1,
- lp->str[j], strlen(lp->str[j]));
- else {
- int ypos = i*LINEHIGH + (LINEHIGH - i_fifo_height)/2;
-
- if (lp->str[j][0] == C_FIFO)
- XCopyPlane(theDisp, fifoPix, lp->win, theGC, 0, 0,
- i_fifo_width, i_fifo_height, 3, ypos, 1L);
-
- else if (lp->str[j][0] == C_CHR)
- XCopyPlane(theDisp, chrPix, lp->win, theGC, 0, 0,
- i_chr_width, i_chr_height, 3, ypos, 1L);
-
- else if (lp->str[j][0] == C_DIR)
- XCopyPlane(theDisp, dirPix, lp->win, theGC, 0, 0,
- i_dir_width, i_dir_height, 3, ypos, 1L);
-
- else if (lp->str[j][0] == C_BLK)
- XCopyPlane(theDisp, blkPix, lp->win, theGC, 0, 0,
- i_blk_width, i_blk_height, 3, ypos, 1L);
-
- else if (lp->str[j][0] == C_LNK)
- XCopyPlane(theDisp, lnkPix, lp->win, theGC, 0, 0,
- i_lnk_width, i_lnk_height, 3, ypos, 1L);
-
- else if (lp->str[j][0] == C_SOCK)
- XCopyPlane(theDisp, sockPix, lp->win, theGC, 0, 0,
- i_sock_width, i_sock_height, 3, ypos, 1L);
-
- else /* lp->str[j][0] == C_REG */
- XCopyPlane(theDisp, regPix, lp->win, theGC, 0, 0,
- i_reg_width, i_reg_height, 3, ypos, 1L);
-
-
- XDrawString(theDisp, lp->win, theGC, 3 + i_fifo_width + 3,
- i*LINEHIGH + ASCENT + 1,
- lp->str[j]+1, strlen(lp->str[j]+1));
-
- #ifdef STIPPLE
- if (inactive) {
- /* stipple the icon by drawing 'bg' where there's 1's in the stipple */
- XSetFillStyle(theDisp, theGC, FillStippled);
- XSetStipple(theDisp, theGC, grayStip);
- XSetForeground(theDisp, theGC, bg);
- XSetBackground(theDisp, theGC, fg);
- XFillRectangle(theDisp,lp->win,theGC,3,i*LINEHIGH,lp->w,LINEHIGH);
- XSetForeground(theDisp, theGC, fg);
- XSetFillStyle(theDisp, theGC, FillSolid);
- }
- #endif
-
- }
- }
- }
-
-
- /***************************************************/
- void LSRedraw(lp)
- LIST *lp;
- {
- int i;
-
- for (i = lp->scrl.val; i < lp->scrl.val + lp->nlines; i++)
- drawSel(lp,i);
- }
-
-
- /***************************************************/
- int LSClick(lp,ev)
- LIST *lp;
- XButtonEvent *ev;
- {
- /* returns '-1' normally. returns 0 -> numnames-1 for a goto */
-
- Window rW, cW;
- int rx, ry, x, y, sel, oldsel;
- unsigned int mask;
- static Time lasttime=0;
- static int lastsel = -1;
-
- x = ev->x; y = ev->y;
- sel = lp->scrl.val + y/LINEHIGH;
- if (sel >= lp->nstr) sel = lp->selected;
-
- /* see if it's a double click */
- if (ev->time - lasttime < DBLCLKTIME && sel==lastsel
- && (lp->scrl.val + y/LINEHIGH) < lp->nstr
- && !INACTIVE(lp,sel)) {
- return (sel);
- }
-
- lasttime = ev->time; lastsel = sel;
-
- /* if not clicked on selected, turn off selected and select new one */
- if (sel != lp->selected) {
- oldsel = lp->selected;
- lp->selected = sel;
- drawSel(lp,sel); drawSel(lp,oldsel);
- XFlush(theDisp);
- }
-
- while (XQueryPointer(theDisp,lp->win,&rW,&cW,&rx,&ry,&x,&y,&mask)) {
- if (!(mask & Button1Mask)) break; /* button released */
-
- if (y<0) { /* scroll up in list */
- if (lp->scrl.val > lp->scrl.min) {
- lp->selected = lp->scrl.val - 1;
- SCSetVal(&lp->scrl, lp->scrl.val - 1);
- Timer(100);
- }
- }
-
- else if (y > lp->h) { /* scroll down in list */
- if (lp->scrl.val < lp->scrl.max) {
- lp->selected = lp->scrl.val + lp->nlines;
- if (lp->selected >= lp->nstr) lp->selected = lp->nstr - 1;
- SCSetVal(&lp->scrl, lp->scrl.val + 1);
- Timer(100);
- }
- }
-
- else {
- sel = lp->scrl.val + y/LINEHIGH;
- if (sel >= lp->nstr) sel = lp->nstr - 1;
-
- if (sel != lp->selected && sel >= lp->scrl.val &&
- sel < lp->scrl.val + lp->nlines) {
- /* dragged to another on current page */
- oldsel = lp->selected;
- lp->selected = sel;
- drawSel(lp, sel); drawSel(lp, oldsel);
- XFlush(theDisp);
- }
- }
- }
-
- return(-1);
- }
-
-
-
- \BARFOO\
- else
- echo "will not over write ./xvctrl.c"
- fi
- if `test ! -s ./xvdir.c`
- then
- echo "writting ./xvdir.c"
- cat > ./xvdir.c << '\BARFOO\'
- /*
- * xvdir.c - Directory changin', file i/o dialog box
- *
- * callable functions:
- *
- * CreateDirW(geom,bwidth)- creates the dirW window. Doesn't map it.
- * DirBox(vis) - random processing based on value of 'vis'
- * maps/unmaps window, etc.
- * RedrawDirW(x,y,w,h) - called by 'expose' events
- * ClickDirW() - handles mouse clicks in DirW
- * LoadCurrentDirectory() - loads up current dir information for dirW
- * DoSave() - calls appropriate save routines
- * SetDirFName() - sets the 'save-as' filename
- */
-
- /*
- * Copyright 1989, 1990 by the University of Pennsylvania
- *
- * Permission to use, copy, and distribute for non-commercial purposes,
- * is hereby granted without fee, providing that the above copyright
- * notice appear in all copies and that both the copyright notice and this
- * permission notice appear in supporting documentation.
- *
- * The software may be modified for your own purposes, but modified versions
- * may not be distributed.
- *
- * This software is provided "as is" without any express or implied warranty.
- */
-
-
- #define NEEDSDIR
- #include "xv.h"
-
- #define NLINES 9 /* # of lines in list control (keep odd) */
- #define LISTW 200
-
- #define BUTTW 60
- #define BUTTH 19
- #define DDWIDE LISTW-80+15
-
- #define MAXDEEP 30 /* maximum number of directories in cwd path */
- #define MAXFNLEN 40 /* max length of filename being entered */
-
- #define DEFFILENAME "" /* default filename filled in when program starts */
-
- #ifdef __STDC__
- static void RedrawDList(void);
- static int dnamcmp(char **, char **);
- #else
- static void RedrawDList();
- static int dnamcmp();
- #endif
-
- static int listh;
- static char *dirnames[MAXNAMES];
- static int numdirnames = 0, ndirs = 0;
- static char path[MAXPATHLEN+1];
- static char *dirs[MAXDEEP]; /* list of directory names */
- static char *lastdir; /* name of the directory we're in */
- static char filename[MAXFNLEN]; /* filename being entered */
- static RBUTT *formatRB, *colorRB, *sizeRB;
-
-
- /***************************************************/
- void CreateDirW(geom)
- char *geom;
- {
- int y;
-
- listh = LINEHIGH * NLINES;
-
- dirW = CreateWindow("xv save dialog",geom,DIRWIDE, DIRHIGH, infofg, infobg);
- if (!dirW) FatalError("couldn't create 'save' window!");
-
- /* create doo-wah's */
- ddirW = XCreateSimpleWindow(theDisp, dirW, 40, 5, DDWIDE, LINEHIGH,
- 2, infofg, infobg);
- if (!ddirW) FatalError("can't create path window");
- XSelectInput(theDisp, ddirW, ExposureMask | ButtonPressMask);
-
- dnamW = XCreateSimpleWindow(theDisp, dirW, 80, listh+75-ASCENT-4,
- 200, LINEHIGH+4, 1, infofg, infobg);
- if (!dnamW) FatalError("can't create name window");
- XSelectInput(theDisp, dnamW, ExposureMask);
-
-
- LSCreate(&dList, dirW, 10, 14+LINEHIGH, LISTW, listh, NLINES,
- dirnames, numdirnames,
- infofg, infobg, RedrawDList, 1, 0);
-
- BTCreate(&dbut[S_BOPEN], dirW, 233, dList.y-9+listh/5, 60, BUTTH,
- "Open", infofg, infobg);
- BTCreate(&dbut[S_BSAVE], dirW, 233, dList.y-9+(listh*2)/5, 60, BUTTH,
- "Save", infofg, infobg);
- BTCreate(&dbut[S_BCANC], dirW, 233, dList.y-9+(listh*3)/5, 60, BUTTH,
- "Cancel", infofg, infobg);
- BTCreate(&dbut[S_BQUIT], dirW, 233, dList.y-9+(listh*4)/5, 60, BUTTH,
- "Quit", infofg, infobg);
-
- y = listh + 110;
- formatRB = RBCreate(NULL, dirW, 26, y, "GIF", infofg, infobg);
- RBCreate(formatRB, dirW, 26, y+18, "PM", infofg, infobg);
- RBCreate(formatRB, dirW, 26, y+36, "PBM (raw)", infofg, infobg);
- RBCreate(formatRB, dirW, 26, y+54, "PBM (ascii)", infofg, infobg);
- RBCreate(formatRB, dirW, 26, y+72, "X11 Bitmap", infofg, infobg);
-
- colorRB = RBCreate(NULL, dirW, DIRWIDE/2, y, "Full Color", infofg, infobg);
- RBCreate(colorRB, dirW, DIRWIDE/2, y+18, "Greyscale", infofg, infobg);
- RBCreate(colorRB, dirW, DIRWIDE/2, y+36, "B/W Dithered", infofg, infobg);
-
- y = y + 115;
- sizeRB = RBCreate(NULL, dirW, 26, y, "Normal Size", infofg, infobg);
- RBCreate(sizeRB, dirW, 26, y+18, "At Current Expansion", infofg, infobg);
-
- SetDirFName(DEFFILENAME);
-
- LoadCurrentDirectory();
-
- XMapSubwindows(theDisp, dirW);
- }
-
-
- /***************************************************/
- void DirBox(vis)
- int vis;
- {
- if (vis) XMapRaised(theDisp, dirW);
- else XUnmapWindow(theDisp, dirW);
-
- BTSetActive(&but[BSAVE], !vis);
-
- dirUp = vis;
- }
-
-
- /***************************************************/
- void RedrawDirW(x,y,w,h)
- int x,y,w,h;
- {
- int i,ypos;
- char foo[30];
- XRectangle xr;
-
- xr.x = x; xr.y = y; xr.width = w; xr.height = h;
- XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted);
-
- if (dList.nstr==1) strcpy(foo,"1 file");
- else sprintf(foo,"%d files",dList.nstr);
-
- ypos = dList.y + dList.h + 5 + ASCENT;
- XSetForeground(theDisp, theGC, infobg);
- XFillRectangle(theDisp, dirW, theGC, 10, ypos-ASCENT, DIRWIDE, CHIGH);
- XSetForeground(theDisp, theGC, infofg);
- XDrawString(theDisp, dirW, theGC, 10, ypos, foo, strlen(foo));
-
- XDrawString(theDisp, dirW, theGC, 10, dList.h+75, "File name:",10);
-
- for (i=0; i<S_NBUTTS; i++) BTRedraw(&dbut[i]);
-
- RBRedraw(formatRB, -1);
- RBRedraw(colorRB, -1);
- RBRedraw(sizeRB, -1);
-
- ULineString(dirW, "Format", formatRB->x-16, formatRB->y-3-DESCENT);
- ULineString(dirW, "Colors", colorRB->x-16, colorRB->y-3-DESCENT);
- ULineString(dirW, "Size", sizeRB->x-16, sizeRB->y-3-DESCENT);
-
- XSetClipMask(theDisp, theGC, None);
- }
-
-
- /***************************************************/
- void RedrawDDirW()
- {
- XSetForeground(theDisp, theGC, infofg);
- XSetBackground(theDisp, theGC, infobg);
-
- XClearWindow(theDisp, ddirW);
- XDrawString(theDisp, ddirW, theGC, 3, ASCENT + 1,
- lastdir, strlen(lastdir));
- }
-
-
- /***************************************************/
- int ClickDirW(x,y)
- int x,y;
- {
- BUTT *bp;
- int bnum;
-
-
- /* check the RBUTTS first, since they don't DO anything */
- if ( (bnum=RBClick(formatRB, x,y)) >= 0) {
- RBTrack(formatRB, bnum);
- if (RBWhich(formatRB)==4) { /* turn off FULLCOLOR + GRAYSCALE */
- RBSetActive(colorRB,0,0);
- RBSetActive(colorRB,1,0);
- RBSelect(colorRB,2);
- }
- else { /* turn on FULLCOLOR + GRAYSCALE */
- RBSetActive(colorRB,0,1);
- RBSetActive(colorRB,1,1);
- }
- return -1;
- }
-
- if ( (bnum=RBClick(colorRB, x,y)) >= 0)
- { RBTrack(colorRB, bnum); return -1; }
-
- if ( (bnum=RBClick(sizeRB, x,y)) >= 0)
- { RBTrack(sizeRB, bnum); return -1; }
-
- for (bnum=0; bnum<S_NBUTTS; bnum++) {
- bp = &dbut[bnum];
- if (PTINRECT(x, y, bp->x, bp->y, bp->w, bp->h)) break;
- }
-
- if (bnum<S_NBUTTS) { /* found one */
- if (BTTrack(bp)) return (bnum);
- }
-
- return -1;
- }
-
-
- /***************************************************/
- void SelectDir(n)
- int n;
- {
- int pend;
-
- /* called when entry #n in the dir list was selected/double-clicked */
-
- if (dList.str[n][0] == C_DIR ||
- dList.str[n][0] == C_LNK) { /* it's cool, it's (possibly) a directory */
- pend = strlen(path);
- strcat(path,dList.str[n]+1); /* add to pathname */
- if (chdir(path)) {
- fprintf(stderr,"unable to cd to '%s'\n",path);
- path[pend] = '\0'; /* undo path modification */
- }
- else
- LoadCurrentDirectory();
- }
-
- else { /* not a directory */
- /* copy the clicked-on filename into the 'save-as' filename */
- SetDirFName(dList.str[n]+1);
- }
- }
-
-
- /***************************************************/
- void TrackDDirW(x,y)
- int x,y;
- {
- Window menuW, rW, cW;
- int rx, ry, i,j, sel, lastsel;
- unsigned int mask;
-
- XSetForeground(theDisp, theGC, infofg);
- XSetBackground(theDisp, theGC, infobg);
-
- menuW = XCreateSimpleWindow(theDisp, dirW, 40, 5, DDWIDE, ndirs*LINEHIGH,
- 2, infofg, infobg);
- if (!menuW) FatalError("can't create path window");
-
- XMapRaised(theDisp, menuW);
-
- for (i=ndirs-1, j=0; i>=0; i--,j++)
- XDrawString(theDisp, menuW, theGC, 3, j*LINEHIGH + ASCENT + 1,
- dirs[i], dirs[i+1]-dirs[i]);
-
- XFlush(theDisp);
- XSetFunction(theDisp, theGC, GXinvert);
- XSetPlaneMask(theDisp, theGC, infofg ^ infobg);
- lastsel = -1; sel = 0;
-
- while (XQueryPointer(theDisp, menuW, &rW, &cW, &rx, &ry, &x, &y, &mask)) {
- if (!(mask & Button1Mask)) break;
-
- /* see if mouse has left window */
-
- sel = y / LINEHIGH;
- if (sel>=ndirs) sel = ndirs-1;
- if (sel<0) sel = 0;
- if (sel != lastsel) {
- XFillRectangle(theDisp,menuW,theGC,0,lastsel*LINEHIGH,DDWIDE,LINEHIGH);
- XFillRectangle(theDisp,menuW,theGC,0,sel*LINEHIGH,DDWIDE,LINEHIGH);
- lastsel = sel;
- }
- }
-
- XSetFunction(theDisp, theGC, GXcopy);
- XSetPlaneMask(theDisp, theGC, AllPlanes);
- XDestroyWindow(theDisp, menuW);
-
- if (sel!=0) { /* changed directories */
- /* end 'path' by changing trailing '/' (of dir name) to a '\0' */
- *(dirs[(ndirs-1)-sel + 1] - 1) = '\0';
-
- /* special case: if cd to '/', fix path (it's currently "") */
- if (path[0] == '\0') strcpy(path,"/");
-
- if (chdir(path)) {
- fprintf(stderr,"unable to cd to '%s'\n",path);
- }
- else
- LoadCurrentDirectory();
- }
- }
-
-
- /***************************************************/
- static void RedrawDList()
- {
- LSRedraw(&dList);
- }
-
-
- /***************************************************/
- void LoadCurrentDirectory()
- {
- DIR *dirp;
- #ifdef DIRENT
- struct dirent *dp;
- #else
- struct direct *dp;
- #endif
- int i, ftype;
- struct stat st;
- char *dbeg, *dend;
-
- /* get rid of previous file names */
- for (i=0; i<numdirnames; i++) free(dirnames[i]);
-
- numdirnames = 0;
-
- #ifdef SYSV
- getcwd(path, sizeof(path));
- #else
- getwd(path);
- #endif
- if (path[strlen(path)-1] != '/')
- strcat(path,"/"); /* tack on a trailing '/' to make path consistent */
-
- /* path will be something like: "/u3/bradley/src/weiner/whatever/" */
- /* parse path into individual directory names */
- dbeg = dend = path;
- for (i=0; i<MAXDEEP && dend; i++) {
- dend = strchr(dbeg,'/'); /* find next '/' char */
- dirs[i] = dbeg;
- dbeg = dend+1;
- }
- ndirs = i-1;
-
- lastdir = dirs[ndirs-1];
- RedrawDDirW();
-
- dirp = opendir(".");
- if (!dirp) {
- fprintf(stderr,"unable to open current directory");
- return;
- }
-
- i=0;
- while ( (dp = readdir(dirp)) != NULL) {
- if (strcmp(dp->d_name, ".")==0 || strcmp(dp->d_name, "..")==0) {
- /* skip over '.' and '..' */
- }
- else {
- #ifdef DIRENT
- #ifdef i386
- /* Not 100% sure d_reclen is correct, but it works... MWS 10/18/90 */
- dirnames[i] = (char *) malloc(dp->d_reclen + 2); /* filetype + '\0'*/
- #else
- dirnames[i] = (char *) malloc(strlen(dp->d_name) + 3);
- #endif
- #else
- dirnames[i] = (char *) malloc(dp->d_namlen + 2); /* +2=filetype + '\0'*/
- #endif
- if (!dirnames[i]) FatalError("malloc error while reading directory");
- strcpy(dirnames[i]+1, dp->d_name);
-
- /* figure out what type of file the beastie is */
- dirnames[i][0] = C_REG; /* default to normal file, if lstat fails */
-
- #if defined(i386) || defined (SYSV)
- if (stat(dirnames[i]+1, &st)==0) {
- #else
- if (lstat(dirnames[i]+1, &st)==0) {
- #endif
- ftype = st.st_mode & S_IFMT; /* mask off uninteresting bits */
- if (ftype == S_IFDIR) dirnames[i][0] = C_DIR;
- else if (ftype == S_IFCHR) dirnames[i][0] = C_CHR;
- else if (ftype == S_IFBLK) dirnames[i][0] = C_BLK;
-
- #ifdef S_IFIFO
- else if (ftype == S_IFIFO) dirnames[i][0] = C_FIFO;
- #endif
-
- #ifdef S_IFLNK
- else if (ftype == S_IFLNK) dirnames[i][0] = C_LNK;
- #endif
-
- #ifdef S_IFSOCK
- else if (ftype == S_IFSOCK) dirnames[i][0] = C_SOCK;
- #endif
- }
- else {
- /* fprintf(stderr,"problems 'stat-ing' files\n");*/
- dirnames[i][0] = C_REG;
- }
- i++;
- }
- }
-
- closedir(dirp);
-
- numdirnames = i;
-
- qsort((char *) dirnames, numdirnames, sizeof(char *), dnamcmp);
- LSNewData(&dList, dirnames, numdirnames);
- DirOpenActive();
- RedrawDirW(0,0,DIRWIDE,DIRHIGH);
- }
-
-
- /***************************************************/
- static int dnamcmp(s1,s2)
- char **s1, **s2;
- {
- /* sort so that directories are at beginning of list */
-
- /* if both dirs or both not dirs, sort on name */
- if ( (**s1 == C_DIR && **s2 == C_DIR) || (**s1 != C_DIR && **s2 != C_DIR))
- return (strcmp((*s1)+1, (*s2)+1));
-
- else if (**s1==C_DIR) return -1; /* s1 is first */
- else return 1; /* s2 is first */
- }
-
-
-
-
-
- /***************************************************/
- int DirKey(c)
- int c;
- {
- /* got keypress in dirW. stick on end of filename */
- int len;
-
- len = strlen(filename);
-
- if (c>' ' && c<'\177') { /* printable characters */
- if (c=='/') return(-1); /* no directories in filename */
- if (len >= MAXFNLEN-1) return(-1); /* max length of string */
- filename[len]=c; filename[len+1]='\0';
- }
-
- else if (c=='\010' || c=='\177') { /* BS or DEL */
- if (len==0) return(-1); /* string already empty */
- filename[len-1]='\0';
- }
-
- else if (c=='\025' || c=='\013') { /* ^U or ^K clear line */
- filename[0] = '\0';
- }
-
- else if (c=='\012' || c=='\015') { /* CR or LF */
- FakeButtonPress(&dbut[S_BSAVE]);
- }
-
- else return(-1); /* unhandled character */
-
- SetDirFName(filename);
- return(0);
- }
-
-
- /***************************************************/
- void RedrawDNamW()
- {
- int width, len;
-
- len = strlen(filename);
- XSetForeground(theDisp, theGC, infofg);
- XDrawString(theDisp, dnamW, theGC, 3, ASCENT+3, filename, len);
- width = StringWidth(filename);
- XDrawLine(theDisp, dnamW, theGC, 3+width+1, 3, 3+width+1,
- 3+CHIGH);
- }
-
-
- /***************************************************/
- void DirOpenActive()
- {
- if (dList.selected>=dList.nstr || dList.selected<0)
- BTSetActive(&dbut[S_BOPEN],0);
-
- else if (dList.str[dList.selected][0] == C_DIR ||
- dList.str[dList.selected][0] == C_LNK)
- BTSetActive(&dbut[S_BOPEN],1);
-
- else
- BTSetActive(&dbut[S_BOPEN],0);
-
- XFlush(theDisp);
- }
-
-
-
- /***************************************************/
- int DoSave()
- {
- FILE *fp;
- byte *thepic, *bwpic;
- int w,h,rv,i;
-
- /* opens file, does appropriate color pre-processing, calls save routine
- based on chosen format. Returns '0' if successful */
-
- WaitCursor();
-
- bwpic = NULL;
-
- if (RBWhich(sizeRB)==1) { thepic = epic; w = eWIDE; h = eHIGH; }
- else { thepic = cpic; w = cWIDE; h = cHIGH; }
-
- if (RBWhich(colorRB)==2) {
- /* generate a FSDithered 1-byte per pixel image */
- bwpic = (byte *) malloc(w*h);
- if (!bwpic) FatalError("unable to malloc dithered picture (DoSave)");
- FSDither(thepic, w, h, bwpic);
- thepic = bwpic;
- }
-
- /* open file */
- fp = fopen(filename, "w");
- if (!fp) {
- SetISTR(ISTR_INFO,"Can't create '%s' - %s",filename,sys_errlist[errno]);
- Warning();
- if (bwpic) free(bwpic);
- SetCursors(-1);
- return -1;
- }
-
- if ((mono || ncols==0) && RBWhich(colorRB)==0) {
- /* if we're saving color, but we're viewing B/W we have to NOT do
- the 'monofication' of the colormap ... */
- for (i=0; i<numcols; i++) {
- r[i] = rorg[i]; g[i] = gorg[i]; b[i] = borg[i]; /* original */
-
- if (revvideo) {
- r[i] = 255-r[i]; g[i] = 255-g[i]; b[i] = 255-b[i];
- }
- }
-
- GammifyColors();
- }
-
- rv = 0;
- i = RBWhich(formatRB);
- switch (i) {
- case 0: rv = WriteGIF(fp,thepic,w, h, r, g, b, numcols, RBWhich(colorRB));
- break;
- case 1: rv = WritePM (fp,thepic,w, h, r, g, b, numcols, RBWhich(colorRB));
- break;
- case 2: rv = WritePBM(fp,thepic,w, h, r, g, b, numcols, RBWhich(colorRB),1);
- break;
- case 3: rv = WritePBM(fp,thepic,w, h, r, g, b, numcols, RBWhich(colorRB),0);
- break;
- case 4: rv = WriteXBM(fp,thepic,w, h, filename);
- break;
- }
-
- fclose(fp);
- if (rv) unlink(filename); /* couldn't properly write file: delete it */
-
- if (!rv) {
- SetISTR(ISTR_INFO,"Successfully wrote '%s'",filename);
- LoadCurrentDirectory(); /* wrote file: rescan directory */
- }
-
- if (bwpic) free(bwpic);
-
- if ((mono || ncols==0) && RBWhich(colorRB)==0) {
- /* restore normal colormap */
- DoMonoAndRV();
- GammifyColors();
- }
-
- SetCursors(-1);
-
- return rv;
- }
-
-
-
- /***************************************************/
- void SetDirFName(st)
- char *st;
- {
- strncpy(filename, st, MAXFNLEN-1);
- filename[MAXFNLEN-1] = '\0'; /* make sure it's terminated */
- XClearWindow(theDisp, dnamW);
- RedrawDNamW();
- BTSetActive(&dbut[S_BSAVE], strlen(filename)!=0);
- }
-
- \BARFOO\
- else
- echo "will not over write ./xvdir.c"
- fi
- echo "Finished archive 7 of 10"
- exit
-
- dan
- ----------------------------------------------------
- O'Reilly && Associates argv@sun.com / argv@ora.com
- Opinions expressed reflect those of the author only.
- --
- dan
- ----------------------------------------------------
- O'Reilly && Associates argv@sun.com / argv@ora.com
- Opinions expressed reflect those of the author only.
-