This is xvinfo.c in view mode; [Download] [Up]
/*
* xvinfo.c - 'Info' box handling functions
*
* callable functions:
*
* CreateInfo(geom) - creates the infoW window. Doesn't map it.
* InfoBox(vis) - random processing based on value of 'vis'
* maps/unmaps window, etc.
* RedrawInfo(x,y,w,h) - called by 'expose' events
* SetInfoMode(mode) - changes amount of info Info window shows
* SetISTR(st, fmt, args) - sprintf's into ISTR #st. Redraws it in window
* char *GetISTR(st) - returns pointer to ISTR #st, or NULL if st bogus
*/
/* Copyright Notice
* ================
* Copyright 1989, 1990, 1991, 1992, 1993 by John Bradley
*
* Permission to use, copy, and distribute XV in its entirety, for
* non-commercial purposes, is hereby granted without fee, provided that
* this license information and copyright notice appear in all copies.
*
* Note that distributing XV 'bundled' in with ANY product is considered
* to be a 'commercial purpose'.
*
* Also note that any copies of XV that are distributed MUST be built
* and/or configured to be in their 'unregistered copy' mode, so that it
* is made obvious to the user that XV is shareware, and that they should
* consider donating, or at least reading this License Info.
*
* The software may be modified for your own purposes, but modified
* versions may NOT be distributed without prior consent of the author.
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the author be held liable for any damages
* arising from the use of this software.
*
* If you would like to do something with XV that this copyright
* prohibits (such as distributing it with a commercial product,
* using portions of the source in some other program, etc.), please
* contact the author (preferably via email). Arrangements can
* probably be worked out.
*
* XV is shareware for PERSONAL USE only. You may use XV for your own
* amusement, and if you find it nifty, useful, generally cool, or of
* some value to you, your non-deductable donation would be greatly
* appreciated. $25 is the suggested donation, though, of course,
* larger donations are quite welcome. Folks who donate $25 or more
* can receive a Real Nice bound copy of the XV manual for no extra
* charge.
*
* Commercial, government, and institutional users MUST register their
* copies of XV, for the exceedingly REASONABLE price of just $25 per
* workstation/X terminal. Site licenses are available for those who
* wish to run XV on a large number of machines. Contact the author
* for more details.
*
* The author may be contacted via:
* US Mail: John Bradley
* 1053 Floyd Terrace
* Bryn Mawr, PA 19010
*
* Phone: (215) 898-8813
* EMail: bradley@cis.upenn.edu
*/
#define NEEDSARGS
#include "xv.h"
#include "bitmaps.h"
/* max length of an Info String */
#define ISTRLEN 80
/* baseline of top line of text */
#define TOPBASE (36 + penn_height/2 + 4 + 8 + ASCENT)
#define STLEFT 100 /* left edge of strings */
static Pixmap graspPix, pennPix;
static char istrs[NISTR][ISTRLEN];
#ifdef __STDC__
static void DrawStrings(void);
static void DrawFieldName(int);
static void RedrawString(int);
#else
static void DrawStrings(), DrawFieldName(), RedrawString();
#endif
/***************************************************/
void CreateInfo(geom)
char *geom;
{
infoW = CreateWindow("xv info", "XVinfo", geom,
INFOWIDE, INFOHIGH, infofg, infobg, 0);
if (!infoW) FatalError("can't create info window!");
pennPix = XCreatePixmapFromBitmapData(theDisp, infoW, penn_bits, penn_width,
penn_height, infofg, infobg, dispDEEP);
graspPix = XCreatePixmapFromBitmapData(theDisp,infoW,grasp_bits,grasp_width,
grasp_height, infofg, infobg, dispDEEP);
}
/***************************************************/
void InfoBox(vis)
int vis;
{
if (vis) XMapRaised(theDisp, infoW);
else XUnmapWindow(theDisp, infoW);
infoUp = vis;
}
/***************************************************/
void RedrawInfo(x,y,w,h)
int x,y,w,h;
{
int i;
XRectangle xr;
#ifdef CLIPRECT
xr.x = x; xr.y = y; xr.width = w; xr.height = h;
XSetClipRectangles(theDisp, theGC, 0,0, &xr, 1, Unsorted);
#endif
XSetForeground(theDisp, theGC, infofg);
XSetBackground(theDisp, theGC, infobg);
/* draw the two icons */
XCopyArea(theDisp, pennPix, infoW, theGC, 0, 0, penn_width, penn_height,
36 - penn_width/2, 36 - penn_height/2);
XCopyArea(theDisp, graspPix, infoW, theGC, 0, 0, grasp_width, grasp_height,
INFOWIDE - 36 - grasp_width/2, 36 - grasp_height/2);
/* draw the credits */
sprintf(str,"XV - %s",REVDATE);
CenterString(infoW, str, INFOWIDE/2, 36-LINEHIGH);
CenterString(infoW, "by John Bradley (bradley@cis.upenn.edu)"
, INFOWIDE/2, 36);
CenterString(infoW,
"Copyright 1993, John Bradley - All Rights Reserved",
INFOWIDE/2, 36+LINEHIGH);
/* draw the dividing lines */
i = 36 + penn_height/2 + 4;
XDrawLine(theDisp, infoW, theGC, 0, i, INFOWIDE, i);
XDrawLine(theDisp, infoW, theGC, 0, INFOHIGH-22, INFOWIDE, INFOHIGH-22);
XDrawLine(theDisp, infoW, theGC, 0, INFOHIGH-42, INFOWIDE, INFOHIGH-42);
if (ctrlColor) {
XSetForeground(theDisp, theGC, locol);
XDrawLine(theDisp, infoW, theGC, 0, i+1, INFOWIDE, i+1);
XDrawLine(theDisp, infoW, theGC, 0, INFOHIGH-21, INFOWIDE, INFOHIGH-21);
XDrawLine(theDisp, infoW, theGC, 0, INFOHIGH-41, INFOWIDE, INFOHIGH-41);
}
if (ctrlColor) XSetForeground(theDisp, theGC, hicol);
XDrawLine(theDisp, infoW, theGC, 0, i+2, INFOWIDE, i+2);
XDrawLine(theDisp, infoW, theGC, 0, INFOHIGH-20, INFOWIDE, INFOHIGH-20);
XDrawLine(theDisp, infoW, theGC, 0, INFOHIGH-40, INFOWIDE, INFOHIGH-40);
DrawStrings();
#ifdef CLIPRECT
XSetClipMask(theDisp, theGC, None);
#endif
}
/***************************************************/
static void DrawStrings()
{
int i;
for (i=0; i<6; i++) DrawFieldName(i); /* draw the field titles */
for (i=0; i<NISTR; i++) RedrawString(i); /* draw the field values */
XFlush(theDisp);
}
/***************************************************/
static void DrawFieldName(fnum)
int fnum;
{
static char *fname[6] = { "Filename:", "Format:", "Resolution:",
"Cropping:", "Expansion:", "Colors:" };
XSetForeground(theDisp, theGC, infofg);
XSetBackground(theDisp, theGC, infobg);
if (infoMode == INF_NONE || infoMode == INF_STR) return;
if (infoMode == INF_PART && fnum>=3) return;
XDrawString(theDisp, infoW, theGC, 10, TOPBASE + fnum*LINEHIGH,
fname[fnum], strlen(fname[fnum]));
}
/***************************************************/
static void RedrawString(st)
int st;
{
/* erase area of string, and draw it with new contents */
if (infoMode == INF_NONE) return;
if (infoMode == INF_STR && st > ISTR_WARNING) return;
if (infoMode == INF_PART && st > ISTR_RES) return;
if (st == ISTR_INFO) {
XSetForeground(theDisp, theGC, infobg);
XFillRectangle(theDisp, infoW, theGC, 0, INFOHIGH-39, INFOWIDE, 17);
XSetForeground(theDisp, theGC, infofg);
CenterString(infoW, istrs[st], INFOWIDE/2, INFOHIGH-31);
}
else if (st == ISTR_WARNING) {
XSetForeground(theDisp, theGC, infobg);
XFillRectangle(theDisp, infoW, theGC, 0, INFOHIGH-19, INFOWIDE, 17);
XSetForeground(theDisp, theGC, infofg);
CenterString(infoW, istrs[st], INFOWIDE/2, INFOHIGH-10);
}
else {
XSetForeground(theDisp, theGC, infobg);
XFillRectangle(theDisp, infoW, theGC,
STLEFT, TOPBASE - ASCENT + (st-ISTR_FILENAME)*LINEHIGH,
INFOWIDE-STLEFT, LINEHIGH);
XSetForeground(theDisp, theGC, infofg);
XDrawString(theDisp, infoW, theGC, STLEFT,TOPBASE
+ (st-ISTR_FILENAME)*LINEHIGH, istrs[st], strlen(istrs[st]));
}
}
/***************************************************/
void SetInfoMode(mode)
int mode;
{
int y1, y2;
infoMode = mode;
if (infoUp) { /* only do this if window is mapped */
y1 = TOPBASE - ASCENT;
y2 = INFOHIGH-43;
XSetForeground(theDisp, theGC, infobg);
XFillRectangle(theDisp, infoW, theGC, 0, y1, INFOWIDE, y2-y1);
XFillRectangle(theDisp, infoW, theGC, 0, INFOHIGH-39, INFOWIDE, 17);
XFillRectangle(theDisp, infoW, theGC, 0, INFOHIGH-19, INFOWIDE, 17);
DrawStrings();
}
}
/***************************************************/
/* SetISTR( ISTR, format, arg1, arg2, ...) */
#if defined(__STDC__) && !defined(NOSTDHDRS)
void SetISTR(int stnum, ...)
{
va_list args;
char *fmt;
va_start(args, stnum);
#else
/*VARARGS0*/
void SetISTR(va_alist)
va_dcl
{
va_list args;
char *fmt;
int stnum;
va_start(args);
stnum = va_arg(args, int);
#endif
if (stnum>=0 && stnum < NISTR) {
fmt = va_arg(args, char *);
if (fmt) vsprintf(istrs[stnum], fmt, args);
else istrs[stnum][0] = '\0';
}
va_end(args);
if (stnum == ISTR_COLOR) {
sprintf(istrs[ISTR_INFO], "%s %s", formatStr, istrs[ISTR_COLOR]);
}
if (infoUp) {
RedrawString(stnum);
if (stnum == ISTR_COLOR) RedrawString(ISTR_INFO);
XFlush(theDisp);
}
if (ctrlUp && (stnum == ISTR_INFO || stnum == ISTR_WARNING ||
stnum == ISTR_COLOR)) {
DrawCtrlStr();
XFlush(theDisp);
}
if (anyBrowUp && (stnum == ISTR_WARNING || stnum == ISTR_INFO)
&& strlen(istrs[stnum])) {
SetBrowStr(istrs[stnum]);
XFlush(theDisp);
}
if (stnum == ISTR_WARNING && !ctrlUp && !infoUp && !anyBrowUp &&
strlen(istrs[stnum])) {
OpenAlert(istrs[stnum]);
sleep(3);
CloseAlert();
}
}
/***************************************************/
char *GetISTR(stnum)
int stnum;
{
/* returns pointer to ISTR string */
if (stnum < 0 || stnum>=NISTR) return(NULL);
return (istrs[stnum]);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.