|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T x
Length: 7340 (0x1cac)
Types: TextFile
Names: »xtail.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5
└─⟦2ca9b63e1⟧ »./contrib-1/contrib-1.00«
└─⟦a8392fb20⟧
└─⟦this⟧ »contrib/examples/i18n/xtail/xtail.c«
/*
* $XConsortium: xtail.c,v 1.9 91/05/01 11:01:52 rws Exp $
*/
/*
* Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
* and Nippon Telegraph and Telephone Corporation
* Copyright 1991 by the Massachusetts Institute of Technology
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the names of OMRON, NTT Software, NTT, and M.I.T.
* not be used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. OMRON, NTT Software,
* NTT, and M.I.T. make no representations about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
* OMRON, NTT SOFTWARE, NTT, AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD
* TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS, IN NO EVENT SHALL OMRON, NTT SOFTWARE, NTT, OR M.I.T. BE
* LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Author: Tatsuya Kato NTT Software Corporation
*
*/
/*
* xtail
*/
#include <X11/Xlocale.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <stdio.h>
#define RESTWIDTH 3
#define RESTHEIGHT 3
#define BUFSIZE 1024
#define MAXLINES 100
#define DEFLINES 20
#define COLUMNS 80
#define TABWIDTH 8
#define Masks (KeyPressMask | ButtonPressMask | ExposureMask)
char *malloc();
Window win;
Display *display;
int screen;
char *Lines[MAXLINES];
int NumofLines = DEFLINES;
int Index = 0;
char *FontList = "-*-fixed-*-r-*--14-*-*-*-c-*";
Bool Forever = False;
char *locale;
char *displayname = NULL, *geometry, *filename = NULL;
char *
strDupExtend(str)
char *str;
{
int pos = 0, i;
char buf[BUFSIZE];
char *src = str, *dst = buf;
while (*src) {
switch (*src) {
case '\t':
for (i = 0; i < (TABWIDTH - pos % TABWIDTH); i++) {
*dst++ = ' ';
}
pos += (TABWIDTH - pos % TABWIDTH);
break;
case '\n':
*src = '\0';
continue;
default:
*dst++ = *src;
pos++;
break;
}
src++;
}
*dst = '\0';
str = malloc(strlen(buf)+1);
strcpy(str, buf);
return str;
}
Syntax()
{
fprintf(stderr, "Usage: xtail [+|-<num>] [-f] [filename]");
}
ParseArg(argc, argv)
int argc;
char *argv[];
{
int i;
for (i = 1; i < argc; i++) {
char *arg = argv[i];
if (arg[0] == '-') {
if (strcmp("-help", arg) == 0) {
Syntax();
} else if (strcmp("-display", arg) == 0) {
if (++i >= argc)
Syntax();
displayname = argv[i];
continue;
} else if (strcmp("-geometry", arg) == 0) {
if (++i >= argc)
Syntax();
geometry = argv[i];
continue;
} else if (strcmp("-lc", arg) == 0) {
if (++i >= argc)
Syntax();
locale = argv[i];
continue;
} else if (strcmp("-fn", arg) == 0) {
if (++i >= argc)
Syntax();
FontList = argv[i];
continue;
} else if (strcmp("-f", arg) == 0) {
Forever = True;
continue;
} else {
if ((NumofLines = atoi(&arg[1])) == 0) {
Syntax();
}
continue;
}
} else if (arg[0] == '+') {
if ((NumofLines = atoi(&arg[1])) == 0) {
Syntax();
}
} else
filename = arg;
}
}
GetInput(fname)
char *fname;
{
char buf[BUFSIZE];
FILE *fp = stdin;
int loop = 0;
if (fname) {
if ((fp = fopen(fname, "r")) == NULL) {
perror(fname);
exit(1);
}
}
while (fgets(buf, BUFSIZE, fp)) {
if (loop > 0) {
free(Lines[Index]);
}
if ((Lines[Index] = strDupExtend(buf)) == NULL) {
perror(NULL);
exit(2);
}
Index++;
if (Index >= NumofLines) {
Index = 0;
loop++;
}
}
if (loop == 0) {
NumofLines = Index;
}
}
GC gcontext;
XFontSet fontset;
XFontSetExtents *fontsetext;
SetContext()
{
char *getenv();
char **missing_clist, *def_str;
int missing_count;
if (!locale)
locale = "";
if (!setlocale(LC_ALL, locale)) {
fprintf(stderr, "Can't setlocale to \"%s\".\n", locale);
exit(1);
}
fprintf(stderr, "Locale: %s\n", setlocale(LC_ALL, NULL));
if ((fontset = XCreateFontSet(display, FontList, &missing_clist,
&missing_count, &def_str)) == NULL) {
fprintf(stderr, "Can't allocate fontset.\n");
exit(1);
}
if (missing_count > 0) {
int i;
printf("missing charset:");
for (i = 0; i < missing_count; i++) {
printf(" %s", missing_clist[i]);
}
printf("\n");
}
fontsetext = XExtentsOfFontSet(fontset);
gcontext = XCreateGC(display, win, 0, NULL);
XSetForeground(display, gcontext, BlackPixel(display, screen));
}
CheckSize(width, height)
int *width, *height;
{
int i;
*height = fontsetext->max_logical_extent.height
* NumofLines + RESTHEIGHT * 2;
*width = 0;
for (i = 0; i < NumofLines; i++) {
int tmpw;
tmpw = XmbTextEscapement(fontset, Lines[i], strlen(Lines[i]));
if (tmpw > *width) {
*width = tmpw;
}
}
*width += RESTWIDTH * 2;
}
WriteText(width, height)
int width, height;
{
int i, y = fontsetext->max_logical_extent.height + RESTHEIGHT;
XClearArea(display, win, 0, 0, width, height, False);
for (i = 0; i < NumofLines; i++) {
if (Index >= NumofLines) {
Index = 0;
}
XmbDrawString(display, win, fontset, gcontext, RESTWIDTH, y,
Lines[Index], strlen(Lines[Index]));
Index++;
y += fontsetext->max_logical_extent.height;
}
}
main(argc, argv)
int argc;
char *argv[];
{
XEvent report;
XSizeHints hints;
int width, height;
ParseArg(argc, argv);
GetInput(filename);
if ((display = XOpenDisplay(displayname)) == NULL) {
fprintf(stderr, "Can not connect to display %s\n", XDisplayName(NULL));
exit(1);
}
win = XCreateSimpleWindow(display, RootWindow(display, screen),
0, 0, 100, 100, 2,
BlackPixel(display, screen), WhitePixel(display, screen));
XSelectInput(display, win, Masks);
SetContext();
CheckSize(&width, &height);
hints.width = width;
hints.height = height;
hints.flags = PSize | USSize;
XSetStandardProperties(display, win, "XTail", argv[0],
None, argv, argc, &hints);
XResizeWindow(display, win, width, height);
XMapWindow(display, win);
for (;;) {
XNextEvent(display, &report);
switch (report.type) {
case Expose:
if (report.xexpose.count == 0)
WriteText(width, height);
break;
case ButtonPress:
case KeyPress:
XFreeFontSet(display, fontset);
XCloseDisplay(display);
exit(0);
}
}
}