mirror of
https://github.com/NishiOwO/arena.git
synced 2025-04-22 01:04:41 +00:00
2122 lines
61 KiB
C
2122 lines
61 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
|
|
#if 0
|
|
#include <X11/Xlib.h>
|
|
#include <X11/Xutil.h>
|
|
#include <X11/Xos.h>
|
|
#include <X11/Xatom.h>
|
|
#include <X11/keysym.h>
|
|
#include <X11/cursorfont.h>
|
|
|
|
#ifdef __hpux
|
|
#include <X11/HPkeysym.h>
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#ifndef NFDBITS
|
|
#define NFDBITS 0
|
|
#endif
|
|
|
|
#include "www.h"
|
|
#include "popup.h"
|
|
#include "style.h"
|
|
#include "neweditor.h"
|
|
|
|
#ifndef XK_DeleteChar
|
|
#define XK_DeleteChar XK_Delete
|
|
#endif
|
|
|
|
#define BITMAPDEPTH 1
|
|
|
|
/* values for window_size in main, is window big enough to be useful */
|
|
|
|
#define SMALL 1
|
|
#define OK 0
|
|
|
|
extern int statusHeight;
|
|
extern int sbar_width;
|
|
extern int ToolBarHeight;
|
|
extern long PixelOffset;
|
|
extern long buf_height;
|
|
extern int PixelIndent;
|
|
extern int buf_width;
|
|
extern char *buffer;
|
|
extern int hdrlen;
|
|
extern int Authorize;
|
|
extern int OpenURL;
|
|
extern int IsIndex;
|
|
extern int SaveFile;
|
|
extern int FindStr;
|
|
extern char *FindStrVal, *FindNextStr;
|
|
extern int font;
|
|
extern Field *focus;
|
|
extern Frame background;
|
|
extern Byte *paint;
|
|
extern Bool TextFieldFocus;
|
|
extern double lens_factor;
|
|
extern GC disp_gc, gc_fill;
|
|
|
|
int debug = 0; /* used to control reporting of errors */
|
|
int initialised = 0; /* avoid X output until this is true! */
|
|
int busy = 0; /* blocks hypertext links etc while receiving data */
|
|
int UseHTTP2 = 1; /* use new HTRQ/HTTP protocol */
|
|
int OpenSubnet = 0; /* if true host is on OpenSubnet */
|
|
int UsePaper = 1;
|
|
int fontsize = 0;
|
|
int NoTerminal = 0; /* howcome 5/11/94: can we ask for passwd? */
|
|
char *CacheRoot = "/tmp"; /* howcome 5/10/94: command line option to turn caching on */
|
|
char *Printer = NULL; /* howcome 5/10/94: command line option enables printing */
|
|
char *Editor = NULL; /* howcome 5/10/94: command line option turns the editor on */
|
|
int Badflags = 5; /* howcome 5/10/94: how many badflags do we want in the output */
|
|
char *Icon = NULL; /* howcome 5/10/94: command line option turns the use of icon */
|
|
double Gamma = 2.2; /* howcome 7/11/94: made into command line option */
|
|
int NoMailcap = 0; /* howcome 7/11/94 */
|
|
BOOL NoStyle = FALSE; /* howcome 2/3/95 */
|
|
BOOL Quiet = FALSE; /* howcome 10/8/95 */
|
|
BOOL OwnColorMap = FALSE; /* howcome 10/8/95 */
|
|
Atom ARENA_LOCATION;
|
|
Atom ARENA_COMMAND;
|
|
|
|
long main_stack[256];
|
|
long *stack;
|
|
|
|
int library_trace = 0; /* howcome 20/11/94 */
|
|
|
|
Doc *CurrentDoc;
|
|
Context *context;
|
|
|
|
|
|
/* Display and screen are used as arguments to nearly every Xlib
|
|
* routine, so it simplifies routine calls to declare them global.
|
|
* If there were additional source files, these variables would be
|
|
* declared `extern' in them.
|
|
*/
|
|
|
|
Display *display;
|
|
Visual *visual;
|
|
Colormap colormap;
|
|
int screen;
|
|
int depth;
|
|
Window win;
|
|
int ExposeCount; /* used to monitor GraphicsExpose events during scrolling */
|
|
char *prog; /* name of invoking program */
|
|
int default_pixmap_width, default_pixmap_height;
|
|
Pixmap background_pixmap, default_pixmap;
|
|
Pixmap icon_pixmap;
|
|
|
|
Cursor hourglass;
|
|
int shape;
|
|
|
|
unsigned long textColor, labelColor, windowColor, strikeColor, statusColor,
|
|
transparent, windowTopShadow, windowBottomShadow, windowShadow;
|
|
|
|
#ifdef SELECTION
|
|
unsigned long statusSelectColor; /* howcome */
|
|
static char *selectStr=NULL; /* howcome 2/8/94 */
|
|
#endif
|
|
|
|
int charWidth, charHeight, charAscent, lineHeight;
|
|
unsigned int win_width, win_height, tileWidth, tileHeight;
|
|
unsigned char *tileData;
|
|
|
|
/*int document;*/
|
|
int gadget;
|
|
int gatewayport = 3000; /* GATEWAYPORT; */
|
|
char *gateway; /* gateway if can't access server directly */
|
|
char *help;
|
|
/* char *printer; */ /* howcome 16/10/94 */
|
|
char *startwith; /* default initial document */
|
|
char *user;
|
|
|
|
int RepeatButtonDown = 0;
|
|
|
|
XFontStruct *fixed_font;
|
|
XFontStruct *Fonts[FONTS]; /* array of fonts */
|
|
char *FontsName[FONTS];
|
|
int LineSpacing[FONTS];
|
|
int BaseLine[FONTS];
|
|
int StrikeLine[FONTS];
|
|
int LineThickness[FONTS];
|
|
|
|
int ListIndent1, ListIndent2;
|
|
|
|
GC gc_fill;
|
|
static GC gc_scrollbar, gc_status, gc_text;
|
|
static char *display_name = NULL;
|
|
static int window_size = 0; /* OK or SMALL to display contents */
|
|
static int button_x, button_y;
|
|
static XSizeHints size_hints;
|
|
int ColorStyle;
|
|
|
|
unsigned int display_width, display_height;
|
|
double display_pt2px;
|
|
|
|
struct itimerval itimer, old_itimer;
|
|
|
|
|
|
void ShowBusy()
|
|
{
|
|
XDefineCursor(display, win, hourglass);
|
|
XFlush(display);
|
|
busy = 1;
|
|
}
|
|
|
|
void HideBusy()
|
|
{
|
|
XUndefineCursor(display, win);
|
|
XFlush(display);
|
|
busy = 0;
|
|
}
|
|
|
|
|
|
|
|
/* From Scott Nelson <snelson@canopus.llnl.gov> 24 bit color 1/12/94 */
|
|
/* these are here for speed reasons */
|
|
int RPixelShift=16, GPixelShift=8, BPixelShift=0;
|
|
int RPixelMask=0xff, GPixelMask=0xff, BPixelMask=0xff;
|
|
|
|
|
|
/* pause for delay milliseconds */
|
|
/* howcome moved this from tcp.c 20/9/94 */
|
|
|
|
void Pause(int delay)
|
|
{
|
|
struct timeval timer;
|
|
|
|
timer.tv_sec = 0;
|
|
timer.tv_usec = delay * 1000;
|
|
|
|
select(NFDBITS, 0, 0, 0, &timer);
|
|
}
|
|
|
|
|
|
void CatchCore()
|
|
{
|
|
fprintf(stderr,"CATCH_CORE %d%c\n",(int)getpid(),7);
|
|
Exit(1);
|
|
}
|
|
|
|
void CatchQuit()
|
|
{
|
|
fprintf(stderr,"CATCH_QUIT\n");
|
|
Exit(1);
|
|
}
|
|
|
|
void CatchX(Display * err_dpy_p, XErrorEvent *err_event)
|
|
{
|
|
fprintf(stderr,"catchX pid %d\n", (int)getpid());
|
|
}
|
|
|
|
/* howcome 4/10/94: need to clean the library cache.. */
|
|
int Exit(int i)
|
|
{
|
|
if (VERBOSE_TRACE)
|
|
printf("bridge.c: Exit\n");
|
|
libExit(0);
|
|
printf("\nThanks for using %s %s. The authors -- Dave, Hakon, Henrik \nand Yves -- can be reached at arena@w3.org. \nPlease check %s \nbefore reporting bugs.\n", BANNER, VERSION, HELP_URL);
|
|
exit(i);
|
|
}
|
|
|
|
|
|
|
|
/* find best visual for specified visual class */
|
|
Visual *BestVisual(int class, int *depth)
|
|
{
|
|
long visual_info_mask;
|
|
int number_visuals, i, best_depth;
|
|
XVisualInfo *visual_array, visual_info_template;
|
|
Visual *best_visual;
|
|
|
|
visual_info_template.class = class;
|
|
visual_info_template.screen = DefaultScreen(display);
|
|
visual_info_mask = VisualClassMask | VisualScreenMask;
|
|
|
|
visual_array = XGetVisualInfo(display, visual_info_mask,
|
|
&visual_info_template,
|
|
&number_visuals);
|
|
|
|
*depth = 0;
|
|
best_depth = 0; /* *depth */
|
|
best_visual = 0;
|
|
|
|
for (i = 0; i < number_visuals; ++i)
|
|
{
|
|
if (visual_array[i].depth > *depth)
|
|
{
|
|
best_visual = visual_array[i].visual;
|
|
*depth = visual_array[i].depth;
|
|
}
|
|
|
|
if (*depth == best_depth)
|
|
break;
|
|
}
|
|
|
|
XFree((void *)visual_array);
|
|
return best_visual;
|
|
}
|
|
|
|
|
|
#ifdef SELECTION
|
|
|
|
void SetSelection(char *s) /* howcome 2/8/94 */
|
|
{
|
|
Free(selectStr);
|
|
selectStr = strdup(s);
|
|
XSetSelectionOwner(display, XA_PRIMARY, win, CurrentTime);
|
|
XStoreBytes(display, selectStr, strlen(selectStr));
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
/* send myself an expose event to force redrawing of give rectangle */
|
|
|
|
void Redraw(int x, int y, int w, int h)
|
|
{
|
|
XExposeEvent event;
|
|
|
|
event.type = Expose;
|
|
event.serial = 0;
|
|
event.send_event = 1;
|
|
event.display = display;
|
|
event.window = win;
|
|
event.x = x;
|
|
event.y = y;
|
|
event.width = w;
|
|
event.height = h;
|
|
event.count = 0;
|
|
|
|
if (X_TRACE)
|
|
fprintf(stderr,"Redraw\n");
|
|
XSendEvent(display, win, 0, ExposureMask, (XEvent *)&event);
|
|
}
|
|
|
|
void SetBanner(char *title)
|
|
{
|
|
XTextProperty textprop;
|
|
|
|
/* Support multiple <TITLE>s in a document */
|
|
if(CurrentDoc->title)
|
|
free(CurrentDoc->title);
|
|
|
|
CurrentDoc->title = strdup(title);
|
|
XStoreName(display, win, title);
|
|
if(CurrentDoc->url)
|
|
{
|
|
char *v;
|
|
int v_size;
|
|
v_size = strlen(title)+strlen(CurrentDoc->url)+13; /* 13: 'URL='(string)\0'TITLE='(string)\0 \0 */
|
|
v = (char *)calloc(v_size, sizeof(char));
|
|
sprintf(v, "URL=%s%cTITLE=%s",CurrentDoc->url,0,title);
|
|
XChangeProperty(display, win, ARENA_LOCATION, XA_STRING, 8, PropModeReplace,
|
|
v, v_size);
|
|
free(v);
|
|
}
|
|
/*
|
|
if (strlen(title) > 8 && (p = strrchr(title, '/')))
|
|
{
|
|
if (p[1] != '\0')
|
|
++p;
|
|
|
|
title = p;
|
|
}
|
|
*/
|
|
textprop.value = (unsigned char *)title;
|
|
textprop.encoding = XA_STRING;
|
|
textprop.format = 8;
|
|
textprop.nitems = strlen(title);
|
|
|
|
XSetWMIconName(display, win, &textprop);
|
|
}
|
|
|
|
void LoadFont(int idx, char *font_name, char *fall_back)
|
|
{
|
|
int direction_hint, font_ascent, font_descent;
|
|
XFontStruct *font;
|
|
XCharStruct overall;
|
|
char *test = "Testing";
|
|
|
|
if ((Fonts[idx] = XLoadQueryFont(display, font_name)) == NULL)
|
|
{
|
|
(void) fprintf(stderr, "Cannot open %s font\n", font_name);
|
|
|
|
if ((Fonts[idx] = XLoadQueryFont(display, fall_back)) == NULL)
|
|
{
|
|
(void) fprintf(stderr, "Cannot open alternate font: %s\n", fall_back);
|
|
Exit(1);
|
|
}
|
|
|
|
fprintf(stderr, "Using alternate font: %s\n", fall_back);
|
|
}
|
|
|
|
font = Fonts[idx];
|
|
|
|
XTextExtents(font, test, strlen(test),
|
|
&direction_hint,
|
|
&font_ascent,
|
|
&font_descent,
|
|
&overall);
|
|
|
|
charWidth = overall.width/strlen(test);
|
|
charHeight = overall.ascent + overall.descent;
|
|
charAscent = overall.ascent;
|
|
lineHeight = charHeight + overall.ascent/4 + 2;
|
|
|
|
LineSpacing[idx] = SPACING(font);
|
|
BaseLine[idx] = BASELINE(font);
|
|
StrikeLine[idx] = STRIKELINE(font);
|
|
}
|
|
|
|
|
|
#if 0
|
|
janet 21/07/95: commented, function not used at all
|
|
|
|
static int hex(char *s)
|
|
{
|
|
int n, c;
|
|
|
|
n = toupper((unsigned char *)*s++) - '0';
|
|
n = toupper((int)*s++) - '0'; /* howcome changing cast 22/8/94 */
|
|
|
|
if (n > 9)
|
|
n += '0' - 'A' + 10;
|
|
|
|
c = toupper((unsigned char *)*s) - '0';
|
|
c = toupper((int)*s) - '0'; /* howcome changing cast 22/8/94 */
|
|
|
|
if (c > 9)
|
|
c += '0' - 'A' + 10;
|
|
|
|
return c + (n << 4);
|
|
}
|
|
#endif
|
|
|
|
|
|
/* From Scott Nelson <snelson@canopus.llnl.gov> 24bit color 1/12/94 Dec 1 1994 */
|
|
/*
|
|
For efficiency, these should be computed after the visual is
|
|
changed and then stored and reused, or stored in each routine
|
|
as a static variable, or as a global variable.
|
|
*/
|
|
/*
|
|
int RPixelShift(){
|
|
int i = 0;
|
|
long int maskval;
|
|
|
|
maskval = (*visual).red_mask;
|
|
|
|
while ((maskval & 1) == 0) { i++; maskval = maskval >> 1; }
|
|
|
|
return i;
|
|
}
|
|
int GPixelShift(){
|
|
int i = 0;
|
|
long int maskval;
|
|
|
|
maskval = (*visual).green_mask;
|
|
|
|
while ((maskval & 1) == 0) { i++; maskval = maskval >> 1; }
|
|
|
|
return i;
|
|
}
|
|
int BPixelShift(){
|
|
int i = 0;
|
|
long int maskval;
|
|
|
|
maskval = (*visual).blue_mask;
|
|
|
|
while ((maskval & 1) == 0) { i++; maskval = maskval >> 1; }
|
|
|
|
return i;
|
|
}
|
|
*/
|
|
|
|
void CalcPixelShift(){
|
|
/* this needs to be called after the visual has changed */
|
|
|
|
int i = 0;
|
|
long int maskval;
|
|
|
|
maskval = (*visual).red_mask;
|
|
|
|
while ((maskval & 1) == 0) { i++; maskval = maskval >> 1; }
|
|
|
|
RPixelShift = i;
|
|
|
|
|
|
i = 0;
|
|
|
|
maskval = (*visual).green_mask;
|
|
|
|
while ((maskval & 1) == 0) { i++; maskval = maskval >> 1; }
|
|
|
|
GPixelShift = i;
|
|
|
|
|
|
i = 0;
|
|
|
|
maskval = (*visual).blue_mask;
|
|
|
|
while ((maskval & 1) == 0) { i++; maskval = maskval >> 1; }
|
|
|
|
BPixelShift = i;
|
|
}
|
|
|
|
|
|
int Pixel4Color(XColor *color, unsigned long *pixel)
|
|
{
|
|
unsigned long r, g, b;
|
|
|
|
r = color->red >> 8;
|
|
g = color->green >> 8;
|
|
b = color->blue >> 8;
|
|
|
|
/* *pixel = (b | g << 8 | r << 16); */ /* From Scott Nelson <snelson@canopus.llnl.gov> 24bit color 1/12/94 Dec 1 1994 */
|
|
/* *pixel = (r | g << 8 | b << 16);*/ /* some systems use RGB masks, others use BGR masks */
|
|
*pixel = (b << BPixelShift | g << GPixelShift | r << RPixelShift );
|
|
|
|
return 1;
|
|
}
|
|
|
|
int Pixel2Color(XColor *color, unsigned long *pixel)
|
|
{
|
|
unsigned long r, g, b;
|
|
|
|
r = (color->red * (long)(RPixelMask+1)) >> 16;
|
|
g = (color->green *(long)(GPixelMask+1)) >> 16;
|
|
b = (color->blue *(long)(BPixelMask+1)) >> 16;
|
|
|
|
*pixel = (b << BPixelShift | g << GPixelShift | r << RPixelShift );
|
|
return 1;
|
|
}
|
|
|
|
int GetNamedColor(char *name, unsigned long *pix)
|
|
{
|
|
XColor color;
|
|
|
|
if (depth == 24)
|
|
{
|
|
if (XParseColor(display, colormap, name, &color) == 0)
|
|
{
|
|
if (X_TRACE)
|
|
fprintf(stderr, "www: can't allocate named color `%s'\n", name);
|
|
|
|
return 0;
|
|
}
|
|
|
|
return Pixel4Color(&color, pix);
|
|
}
|
|
if (depth == 16)
|
|
{
|
|
if (XParseColor(display, colormap, name, &color) == 0)
|
|
{
|
|
if (X_TRACE)
|
|
fprintf(stderr, "www: can't allocate named color `%s'\n", name);
|
|
|
|
return 0;
|
|
}
|
|
return Pixel2Color(&color, pix);
|
|
}
|
|
else if (XParseColor(display, colormap, name, &color) == 0 ||
|
|
XAllocColor(display, colormap, &color) == 0)
|
|
{
|
|
if (X_TRACE)
|
|
fprintf(stderr, "www: can't allocate named color `%s'\n", name);
|
|
|
|
return 0;
|
|
}
|
|
|
|
*pix = color.pixel;
|
|
return 1;
|
|
}
|
|
|
|
int GetColor(int red, int green, int blue, unsigned long *pix)
|
|
{
|
|
XColor color;
|
|
/*
|
|
if (red == 255 && green == 255 && blue == 255)
|
|
{
|
|
*pix = WhitePixel(display, screen);
|
|
return 1;
|
|
}
|
|
|
|
if (red == 0 && green == 0 && blue == 0)
|
|
{
|
|
*pix = BlackPixel(display, screen);
|
|
return 1;
|
|
}
|
|
*/
|
|
color.red = red << 8;
|
|
color.green = green << 8;
|
|
color.blue = blue << 8;
|
|
|
|
if (depth == 24)
|
|
return Pixel4Color(&color, pix);
|
|
else if (depth == 16)
|
|
return Pixel2Color(&color, pix);
|
|
else if (XAllocColor(display, colormap, &color) == 0)
|
|
{
|
|
/* if (X_TRACE)*/
|
|
fprintf(stderr, "www: can't allocate color %d:%d:%d\n", red, green, blue);
|
|
*pix = BlackPixel(display, screen);
|
|
return 0;
|
|
}
|
|
|
|
*pix = color.pixel;
|
|
return 1;
|
|
}
|
|
|
|
char *DetermineValue(char *prog, char *param, char *def)
|
|
{
|
|
char *value;
|
|
|
|
if ((value = XGetDefault(display, prog, param)) == NULL)
|
|
value = def;
|
|
|
|
return value;
|
|
}
|
|
|
|
int DetermineColor(char *prog, char *param,
|
|
int r, int g, int b,
|
|
unsigned long *pix)
|
|
{
|
|
char *colorname, *p1, *p2;
|
|
|
|
colorname = XGetDefault(display, prog, param);
|
|
|
|
if (colorname) /* parse and GetColor() or GetNamedColor() */
|
|
{
|
|
/* "red:green:blue" e.g."205:184:157" or named color */
|
|
|
|
p1 = strchr(colorname, ':');
|
|
p2 = strrchr(colorname, ':');
|
|
|
|
if (p1 && p2 && p1 != p2)
|
|
{
|
|
sscanf(colorname, "%d:", &r);
|
|
sscanf(p1+1, "%d:", &g);
|
|
sscanf(p2+1, "%d", &b);
|
|
|
|
return GetColor(r, g, b, pix);
|
|
}
|
|
|
|
return GetNamedColor(colorname, pix);
|
|
}
|
|
|
|
return GetColor(r, g, b, pix);
|
|
}
|
|
|
|
void ButtonDown(unsigned int button, unsigned int state, int x, int y, int x_root, int y_root)
|
|
{
|
|
if (X_TRACE)
|
|
fprintf(stderr, "ButtonDown %d %d\n",x,y);
|
|
|
|
|
|
if (y < WinTop){
|
|
if (y < StatusTop)
|
|
gadget = ToolBarButtonDown(x, y);
|
|
else
|
|
gadget = StatusButtonDown(button, x, y);
|
|
}
|
|
else if (x < WinRight && y < WinBottom)
|
|
#ifdef POPUP
|
|
if (button == Button3)
|
|
{
|
|
Popup(x_root, y_root);
|
|
}
|
|
else
|
|
#endif
|
|
if (button == Button2) /* spif -> button2 shows URL */
|
|
{
|
|
ShowLink(x, y);
|
|
}
|
|
else
|
|
gadget = WindowButtonDown(x, y);
|
|
else if ( (x >= WinRight && y < WinBottom) ||
|
|
(x <= WinRight && y >= WinBottom) )
|
|
{
|
|
button_x = x;
|
|
button_y = y;
|
|
gadget = ScrollButtonDown(x, y);
|
|
}
|
|
else
|
|
gadget = VOID;
|
|
}
|
|
|
|
void ButtonUp(unsigned int button, unsigned int state, int x, int y)
|
|
{
|
|
int shifted;
|
|
|
|
RepeatButtonDown = 0;
|
|
shifted = ShiftMask & state;
|
|
|
|
if (gadget == WINDOW)
|
|
WindowButtonUp(shifted, x, y);
|
|
else if (gadget == SCROLLBAR)
|
|
ScrollButtonUp(x, y);
|
|
else if (gadget == TOOLBAR)
|
|
ToolBarButtonUp(x, y);
|
|
else if (gadget == STATUS)
|
|
StatusButtonUp(x, y);
|
|
}
|
|
|
|
|
|
int GuiEvents(int s, HTRequest * rq, int f)
|
|
{
|
|
char keybuf[20];
|
|
int keybufsize = 20;
|
|
int count;
|
|
KeySym key;
|
|
XEvent event;
|
|
XComposeStatus cs;
|
|
int block = 0;
|
|
int w, h;
|
|
|
|
while (block || XEventsQueued(display, QueuedAfterReading) != 0)
|
|
{
|
|
/*
|
|
if (RepeatButtonDown) {
|
|
XButtonEvent e;
|
|
|
|
e.type = ButtonPress;
|
|
XSendEvent(event.xselectionrequest.display, event.xselectionrequest.requestor, False, 0, (XEvent *) &selEv);
|
|
*/
|
|
|
|
/*
|
|
if (RepeatButtonDown && !ExposeCount &&
|
|
XEventsQueued(display, QueuedAfterReading) == 0)
|
|
{
|
|
XFlush(display);
|
|
ButtonDown(event.xbutton.button, event.xbutton.state, button_x, button_y);
|
|
Pause(10);
|
|
continue;
|
|
}
|
|
*/
|
|
|
|
XNextEvent(display, &event);
|
|
|
|
switch(event.type)
|
|
{
|
|
case Expose:
|
|
/* the following commented by janet: redrawing won't work, you get a trail */
|
|
/* get rid of all other Expose events on the queue */
|
|
/* while (XCheckTypedEvent(display, Expose, &event)); */
|
|
|
|
if (event.xexpose.y < WinTop) /* janet: added check for whether to draw or not */
|
|
{
|
|
DisplayToolBar();
|
|
DisplayStatusBar();
|
|
DisplayIcon();
|
|
}
|
|
|
|
w = event.xexpose.x + event.xexpose.width; /* the real coordinate */
|
|
h = event.xexpose.y + event.xexpose.height; /* the real coordinate */
|
|
|
|
/* DisplayIcon(); */
|
|
/* DisplayDoc(WinLeft, WinTop, WinWidth, WinHeight); */
|
|
if ((h > WinTop && event.xexpose.x < WinWidth && /* checking whether to draw.. */
|
|
event.xexpose.y < (WinHeight+WinTop)))
|
|
{
|
|
|
|
/* only redraw pieces that were exposed */
|
|
DisplayDoc(event.xexpose.x, event.xexpose.y,
|
|
event.xexpose.width, event.xexpose.height);
|
|
}
|
|
/* we do the scrollbar last, to make sure DisplayDoc is not drawing on top of it */
|
|
if ((w > WinWidth || h > WinHeight + WinTop))
|
|
DisplayScrollBar();
|
|
|
|
break;
|
|
|
|
case GraphicsExpose:
|
|
/* if (event.xexpose.y < WinTop)
|
|
{*/
|
|
SetToolBarWin(win);
|
|
SetToolBarGC(gc_status);
|
|
DisplayToolBar();
|
|
|
|
SetStatusWin(win);
|
|
SetStatusGC(gc_status);
|
|
DisplayStatusBar();
|
|
|
|
SetIconWin(win);
|
|
SetIconGC(gc_status);
|
|
DisplayIcon();
|
|
/* };*/
|
|
|
|
SetScrollBarWin(win);
|
|
SetScrollBarGC(gc_scrollbar);
|
|
DisplayScrollBar();
|
|
|
|
SetDisplayGC(gc_text);
|
|
DisplayDoc(event.xgraphicsexpose.x,
|
|
event.xgraphicsexpose.y,
|
|
event.xgraphicsexpose.width,
|
|
event.xgraphicsexpose.height);
|
|
|
|
ExposeCount = event.xgraphicsexpose.count;
|
|
break;
|
|
|
|
case NoExpose:
|
|
ExposeCount = 0;
|
|
break;
|
|
|
|
case ConfigureNotify:
|
|
if (win_width == event.xconfigure.width &&
|
|
win_height == event.xconfigure.height)
|
|
break;
|
|
|
|
win_width = event.xconfigure.width;
|
|
win_height = event.xconfigure.height;
|
|
|
|
if ((win_width < size_hints.min_width) ||
|
|
(win_height < size_hints.min_height))
|
|
window_size = SMALL;
|
|
else
|
|
window_size = OK;
|
|
|
|
if (focus && focus->flags & CHECKED)
|
|
{
|
|
focus->flags &= ~CHECKED;
|
|
focus = NULL;
|
|
}
|
|
|
|
DisplaySizeChanged(1);
|
|
|
|
#ifdef RESIZE_BUG
|
|
/*
|
|
howcome 26/7/94: need to expose after redraw
|
|
this appears to be the case on suu4-sol2, and decstations??
|
|
*/
|
|
Redraw(0,0,WinWidth,WinHeight + WinTop); /* janet: changed height argument */
|
|
#endif
|
|
break;
|
|
|
|
case KeyPress:
|
|
if (X_TRACE)
|
|
fprintf(stderr, "KeyPress\n");
|
|
|
|
count = XLookupString((XKeyEvent*)&event, keybuf, keybufsize, &key, &cs);
|
|
keybuf[count] = 0;
|
|
|
|
if (key == XK_F8)
|
|
{
|
|
XCloseDisplay(display);
|
|
Exit(1);
|
|
}
|
|
else if (key == XK_F2)
|
|
count = 1;
|
|
/* else if (key == XK_F4)
|
|
ShowPaint(background.top-paint, 14); */
|
|
else if (key == XK_F6)
|
|
ReportVisuals();
|
|
else if (key == XK_F7)
|
|
{
|
|
ReportStandardColorMaps(XA_RGB_DEFAULT_MAP);
|
|
ReportStandardColorMaps(XA_RGB_BEST_MAP);
|
|
}
|
|
/*
|
|
else if (TextFieldFocus && key !=XK_Begin && key !=XK_End && key != XK_Prior && key != XK_Next) {
|
|
if (IsEditChar(*keybuf))
|
|
FormEditChar(*keybuf);
|
|
else
|
|
FormMoveCursor(key);
|
|
}
|
|
*/
|
|
else if (key == XK_v && (event.xkey.state & ControlMask))
|
|
MoveDownPage();
|
|
else if (key == XK_v && (event.xkey.state & Mod1Mask))
|
|
MoveUpPage();
|
|
/* 28-Nov-95 starting to play with the editor --Spif */
|
|
else if ((CurrentDoc->field_editor) && (key == XK_Left))
|
|
{
|
|
if(CurrentDoc->field_editor->pos)
|
|
{
|
|
CurrentDoc->field_editor->pos--;
|
|
PaintField(disp_gc, -1, Abs2Win(CurrentDoc->edited_field->baseline),CurrentDoc->edited_field );
|
|
PaintFieldCursorBuffer(disp_gc, strikeColor, CurrentDoc->field_editor, CurrentDoc->edited_field);
|
|
};
|
|
/* afficher le curseur */
|
|
}
|
|
else if ((CurrentDoc->field_editor) && (key == XK_Right))
|
|
{
|
|
if(CurrentDoc->field_editor->pos < CurrentDoc->field_editor->size)
|
|
{
|
|
CurrentDoc->field_editor->pos++;
|
|
PaintField(disp_gc, -1, Abs2Win(CurrentDoc->edited_field->baseline),CurrentDoc->edited_field );
|
|
PaintFieldCursorBuffer(disp_gc, strikeColor, CurrentDoc->field_editor, CurrentDoc->edited_field);
|
|
};
|
|
/* afficher le curseur */
|
|
}
|
|
else if ((CurrentDoc->field_editor) && (key == XK_Delete || key == XK_DeleteChar))
|
|
{
|
|
DeleteChar(CurrentDoc->field_editor, CurrentDoc->field_editor->pos);
|
|
free(CurrentDoc->edited_field->value);
|
|
CurrentDoc->edited_field->value = Buffer2Str(CurrentDoc->field_editor);
|
|
CurrentDoc->edited_field->buflen = CurrentDoc->field_editor->size;
|
|
PaintField(disp_gc, -1, Abs2Win(CurrentDoc->edited_field->baseline),CurrentDoc->edited_field );
|
|
PaintFieldCursorBuffer(disp_gc, strikeColor, CurrentDoc->field_editor, CurrentDoc->edited_field);
|
|
/* Afficher tout */
|
|
}
|
|
else if ((CurrentDoc->field_editor) && ((key < 255)||(key == XK_Return))) /* normal keypress... adding */
|
|
{
|
|
/* printf("adding [%c] [%d]\n",key, key); */
|
|
if(key == XK_Return)
|
|
InsertChar(CurrentDoc->field_editor, CurrentDoc->field_editor->pos , '\n');
|
|
else
|
|
InsertChar(CurrentDoc->field_editor, CurrentDoc->field_editor->pos , key);
|
|
CurrentDoc->field_editor->pos++;
|
|
free(CurrentDoc->edited_field->value);
|
|
CurrentDoc->edited_field->value = Buffer2Str(CurrentDoc->field_editor);
|
|
CurrentDoc->edited_field->buflen = CurrentDoc->field_editor->size;
|
|
PaintField(disp_gc, -1, Abs2Win(CurrentDoc->edited_field->baseline),CurrentDoc->edited_field );
|
|
PaintFieldCursorBuffer(disp_gc, strikeColor, CurrentDoc->field_editor, CurrentDoc->edited_field);
|
|
/* Afficher tout */
|
|
}
|
|
else if ((CurrentDoc->field_editor) && (key == XK_Up))
|
|
{
|
|
PrevLine(CurrentDoc->field_editor);
|
|
PaintField(disp_gc, -1, Abs2Win(CurrentDoc->edited_field->baseline),CurrentDoc->edited_field );
|
|
PaintFieldCursorBuffer(disp_gc, strikeColor, CurrentDoc->field_editor, CurrentDoc->edited_field);
|
|
}
|
|
else if ((CurrentDoc->field_editor) && (key == XK_Down))
|
|
{
|
|
NextLine(CurrentDoc->field_editor);
|
|
PaintField(disp_gc, -1, Abs2Win(CurrentDoc->edited_field->baseline),CurrentDoc->edited_field );
|
|
PaintFieldCursorBuffer(disp_gc, strikeColor, CurrentDoc->field_editor, CurrentDoc->edited_field);
|
|
}
|
|
else if ((Authorize|OpenURL|IsIndex|SaveFile|FindStr) && IsEditChar(*keybuf))
|
|
EditChar(*keybuf);
|
|
else if ((Authorize|OpenURL|IsIndex|SaveFile|FindStr) && (key == XK_Left || key == XK_Right))
|
|
MoveStatusCursor(key);
|
|
else if ((Authorize|OpenURL|IsIndex|SaveFile|FindStr) && (key == XK_Delete || key == XK_DeleteChar))
|
|
EditChar(127);
|
|
#ifdef _HPUX_SOURCE
|
|
else if ((Authorize|OpenURL|IsIndex|SaveFile|FindStr) && (key == XK_ClearLine || key == XK_DeleteLine))
|
|
{
|
|
ClearStatus();
|
|
SetStatusString(0); /* force refresh */
|
|
}
|
|
#endif
|
|
else if (key == XK_Up && !ExposeCount)
|
|
{
|
|
if (event.xkey.state & ControlMask)
|
|
MoveUpPage();
|
|
else
|
|
MoveUpLine();
|
|
XFlush(display); /* to avoid scrollbar flashing */
|
|
}
|
|
else if (key == XK_Down && !ExposeCount)
|
|
{
|
|
if (event.xkey.state & ControlMask)
|
|
MoveDownPage();
|
|
else
|
|
MoveDownLine();
|
|
XFlush(display); /* to avoid scrollbar flashing */
|
|
}
|
|
else if (key == XK_Left && !ExposeCount)
|
|
{
|
|
if (event.xkey.state & (Mod4Mask | ControlMask))
|
|
BackDoc();
|
|
else
|
|
MoveLeftLine();
|
|
XFlush(display); /* to avoid scrollbar flashing */
|
|
}
|
|
else if (key == XK_Right && !ExposeCount)
|
|
{
|
|
if (event.xkey.state & (Mod4Mask | ControlMask))
|
|
ForwardDoc();
|
|
else
|
|
MoveRightLine();
|
|
XFlush(display); /* to avoid scrollbar flashing */
|
|
}
|
|
else if (key == XK_Prior && !ExposeCount)
|
|
MoveUpPage();
|
|
else if (key == XK_Next && !ExposeCount)
|
|
MoveDownPage();
|
|
else if ((key == XK_Begin || key == XK_Home) && !ExposeCount)
|
|
{
|
|
if (event.xkey.state & ShiftMask)
|
|
MoveToEnd();
|
|
else
|
|
MoveToStart();
|
|
}
|
|
else if (key == XK_End && !ExposeCount)
|
|
MoveToEnd();
|
|
else if (key == XK_Escape)
|
|
{
|
|
if (Authorize)
|
|
HideAuthorizeWidget();
|
|
else if (busy)
|
|
Beep();
|
|
else if (OpenURL)
|
|
{
|
|
OpenURL = 0;
|
|
SetStatusString("");
|
|
}
|
|
else if (SaveFile)
|
|
{
|
|
SaveFile = 0;
|
|
SetStatusString("");
|
|
}
|
|
else if (FindStr)
|
|
{
|
|
FindStr = 0;
|
|
SetStatusString("");
|
|
}
|
|
}
|
|
else if (busy)
|
|
Beep();
|
|
else if (key == XK_F2)
|
|
BackDoc();
|
|
else if (key == XK_F3 && FindStrVal)
|
|
FindString(FindStrVal, &FindNextStr);
|
|
break;
|
|
|
|
case KeyRelease:
|
|
count = XLookupString((XKeyEvent*)&event, keybuf, keybufsize, &key, &cs);
|
|
keybuf[count] = 0;
|
|
break;
|
|
|
|
case ButtonRelease:
|
|
ButtonUp(event.xbutton.button, event.xbutton.state, event.xbutton.x, event.xbutton.y);
|
|
break;
|
|
|
|
case ButtonPress:
|
|
if (X_TRACE)
|
|
fprintf(stderr, "ButtonPress %d %d\n",event.xbutton.x, event.xbutton.y);
|
|
if(CurrentDoc->edited_field)
|
|
{
|
|
free(CurrentDoc->edited_field->value);
|
|
CurrentDoc->edited_field->value = Buffer2Str(CurrentDoc->field_editor);
|
|
CurrentDoc->edited_field->flags &= ~CHECKED;
|
|
TextFieldFocus = FALSE;
|
|
PaintField(disp_gc, -1, Abs2Win(CurrentDoc->edited_field->baseline),CurrentDoc->edited_field);
|
|
CurrentDoc->edited_field = NULL;
|
|
FreeBuffer(CurrentDoc->field_editor);
|
|
CurrentDoc->field_editor = NULL;
|
|
};
|
|
ButtonDown(event.xbutton.button, event.xbutton.state, event.xbutton.x, event.xbutton.y, event.xbutton.x_root, event.xbutton.y_root);
|
|
break;
|
|
|
|
case MotionNotify: /* only sent when Button1 is down! */
|
|
/* ignore event if still repairing holes from earlier copy operation*/
|
|
if (ExposeCount)
|
|
break;
|
|
|
|
/* get rid of all other MotionNotify events on the queue */
|
|
while (XCheckTypedEvent(display, MotionNotify, &event));
|
|
|
|
#ifdef SELECTION
|
|
SelectStatus(event.xbutton.x, event.xbutton.y);
|
|
#endif
|
|
ScrollButtonDrag(event.xbutton.x, event.xbutton.y);
|
|
break;
|
|
|
|
/* the following is a failed attempt to exit tidily when the user
|
|
forces an exit through the system menu - I need to do better ! */
|
|
|
|
case DestroyNotify:
|
|
if (event.xdestroywindow.window == win) {
|
|
if (X_TRACE)
|
|
fprintf(stderr, "DestroyNotify event received\n");
|
|
/* XCloseDisplay(display); */
|
|
Exit(1);
|
|
}
|
|
|
|
case MapNotify:
|
|
initialised = 1; /* allow status display now its safe */
|
|
break;
|
|
|
|
case UnmapNotify:
|
|
if (X_TRACE) /* howcome 31/10/94 */
|
|
fprintf(stderr, "UnmapNotify\n");
|
|
break;
|
|
|
|
case ReparentNotify:
|
|
break;
|
|
|
|
|
|
case PropertyNotify:
|
|
{
|
|
|
|
/* thanks to Colas Nahaboo */
|
|
|
|
Atom actual_type;
|
|
int actual_format;
|
|
unsigned long nitems;
|
|
unsigned long bytes_after;
|
|
unsigned char *buffer = 0;
|
|
|
|
if (Success == XGetWindowProperty(display, win, ARENA_COMMAND, 0, 8000, TRUE,
|
|
AnyPropertyType, &actual_type,
|
|
&actual_format, &nitems, &bytes_after,
|
|
&buffer))
|
|
{
|
|
if(buffer)
|
|
{
|
|
buffer[nitems] = '\0';
|
|
if (!(actual_type == XA_STRING && ((signed long)nitems >= 0)))
|
|
{
|
|
XFree(buffer);
|
|
buffer = 0;
|
|
} /* else ok */
|
|
} else {
|
|
if (buffer) XFree(buffer);
|
|
buffer = 0;
|
|
}
|
|
}
|
|
|
|
if(buffer)
|
|
{
|
|
ParseCommandLine(buffer, nitems);
|
|
}
|
|
}
|
|
break;
|
|
|
|
#ifdef SELECTION
|
|
|
|
/* selection event handling added by howcome 2/8/94 */
|
|
|
|
case SelectionClear:
|
|
ClearStatusSelection();
|
|
DisplayStatusBar();
|
|
break;
|
|
case SelectionNotify:
|
|
fprintf(stderr,"notify\n");
|
|
break;
|
|
case SelectionRequest:
|
|
{
|
|
XSelectionEvent selEv;
|
|
|
|
if (event.xselectionrequest.target != XA_STRING) {
|
|
selEv.property = None;
|
|
}
|
|
else {
|
|
selEv.property = event.xselectionrequest.property;
|
|
XChangeProperty(event.xselectionrequest.display,
|
|
event.xselectionrequest.requestor,
|
|
event.xselectionrequest.property,
|
|
event.xselectionrequest.target,
|
|
8, PropModeReplace, selectStr,
|
|
strlen(selectStr));
|
|
}
|
|
|
|
selEv.type = SelectionNotify;
|
|
selEv.display = event.xselectionrequest.display;
|
|
selEv.requestor = event.xselectionrequest.requestor;
|
|
selEv.selection = event.xselectionrequest.selection;
|
|
selEv.target = event.xselectionrequest.target;
|
|
selEv.time = event.xselectionrequest.time;
|
|
|
|
|
|
XSendEvent(event.xselectionrequest.display, event.xselectionrequest.requestor, False, 0, (XEvent *) &selEv);
|
|
}
|
|
break;
|
|
|
|
#endif /* SELECTION */
|
|
|
|
|
|
default: /* handle all other events */
|
|
if (X_TRACE)
|
|
fprintf(stderr, "Unexpected Event: %d\n", event.type);
|
|
break;
|
|
}
|
|
XFlush(display);
|
|
}
|
|
|
|
busy = 0;
|
|
return HT_WOULD_BLOCK; /* howcome 24/7/95: must do this to not insult library */
|
|
}
|
|
|
|
|
|
|
|
|
|
/* get font/colour resources */
|
|
|
|
void GetResources(void)
|
|
{
|
|
if (fontsize == 0)
|
|
{
|
|
LoadFont(IDX_H1FONT, DetermineValue(prog, "h1font", H1FONT), "variable");
|
|
LoadFont(IDX_H2FONT, DetermineValue(prog, "h2font", H2FONT), "variable");
|
|
LoadFont(IDX_H3FONT, DetermineValue(prog, "h3font", H3FONT), "variable");
|
|
LoadFont(IDX_H4FONT, DetermineValue(prog, "h4font", H4FONT), "variable");
|
|
LoadFont(IDX_LABELFONT, DetermineValue(prog, "labelfont", LABELFONT), "fixed");
|
|
LoadFont(IDX_NORMALFONT, DetermineValue(prog, "normalfont", NORMALFONT), "fixed");
|
|
LoadFont(IDX_INORMALFONT, DetermineValue(prog, "italicfont", ITALICFONT), "fixed");
|
|
LoadFont(IDX_BNORMALFONT, DetermineValue(prog, "boldfont", BOLDFONT), "fixed");
|
|
LoadFont(IDX_BINORMALFONT, DetermineValue(prog, "bolditalicfont", BINORMFONT), "fixed");
|
|
LoadFont(IDX_FIXEDFONT, DetermineValue(prog, "fixedfont", RFIXEDFONT), "fixed");
|
|
LoadFont(IDX_IFIXEDFONT, DetermineValue(prog, "ifixedfont", IFIXEDFONT), "fixed");
|
|
LoadFont(IDX_BFIXEDFONT, DetermineValue(prog, "bfixedfont", BFIXEDFONT), "fixed");
|
|
LoadFont(IDX_BIFIXEDFONT, DetermineValue(prog, "bifixedfont", BIFIXEDFONT), "fixed");
|
|
LoadFont(IDX_SYMBOLFONT, DetermineValue(prog, "symbolfont", SYMFONT), "grk-s30");
|
|
LoadFont(IDX_SUBSYMFONT, DetermineValue(prog, "subsymbolfont", SUBSYMFONT), "grk-s25");
|
|
LoadFont(IDX_SMALLFONT, DetermineValue(prog, "smallfont", SUBSCRFONT), "micro");
|
|
}
|
|
else if (fontsize == 1)
|
|
{
|
|
LoadFont(IDX_H1FONT, DetermineValue(prog, "h1font", H1FONTL), "vg-20");
|
|
LoadFont(IDX_H2FONT, DetermineValue(prog, "h2font", H2FONTL), "fg-16");
|
|
LoadFont(IDX_H3FONT, DetermineValue(prog, "h3font", H3FONTL), "variable");
|
|
LoadFont(IDX_H4FONT, DetermineValue(prog, "h4font", H4FONTL), "variable");
|
|
LoadFont(IDX_LABELFONT, DetermineValue(prog, "labelfont", LABELFONT), "fixed");
|
|
LoadFont(IDX_NORMALFONT, DetermineValue(prog, "normalfont", NORMALFONTL), "fixed");
|
|
LoadFont(IDX_INORMALFONT, DetermineValue(prog, "italicfont", ITALICFONTL), "fixed");
|
|
LoadFont(IDX_BNORMALFONT, DetermineValue(prog, "boldfont", BOLDFONTL), "fixed");
|
|
LoadFont(IDX_BINORMALFONT, DetermineValue(prog, "bolditalicfont", BINORMFONTL), "fixed");
|
|
LoadFont(IDX_FIXEDFONT, DetermineValue(prog, "fixedfont", RFIXEDFONTL), "fixed");
|
|
LoadFont(IDX_IFIXEDFONT, DetermineValue(prog, "ifixedfont", IFIXEDFONTL), "fixed");
|
|
LoadFont(IDX_BFIXEDFONT, DetermineValue(prog, "bfixedfont", BFIXEDFONTL), "fixed");
|
|
LoadFont(IDX_BIFIXEDFONT, DetermineValue(prog, "bifixedfont", BIFIXEDFONTL), "fixed");
|
|
LoadFont(IDX_SYMBOLFONT, DetermineValue(prog, "symbolfont", SYMFONTL), "grk-s30");
|
|
LoadFont(IDX_SUBSYMFONT, DetermineValue(prog, "subsymbolfont", SUBSYMFONTL), "grk-s25");
|
|
LoadFont(IDX_SMALLFONT, DetermineValue(prog, "smallfont", SUBSCRFONTL), "micro");
|
|
}
|
|
else if (fontsize >= 2)
|
|
{
|
|
LoadFont(IDX_H1FONT, DetermineValue(prog, "h1font", H1FONTG), "vg-20");
|
|
LoadFont(IDX_H2FONT, DetermineValue(prog, "h2font", H2FONTG), "fg-16");
|
|
LoadFont(IDX_H3FONT, DetermineValue(prog, "h3font", H3FONTG), "variable");
|
|
LoadFont(IDX_H4FONT, DetermineValue(prog, "h4font", H4FONTG), "variable");
|
|
LoadFont(IDX_LABELFONT, DetermineValue(prog, "labelfont", LABELFONT), "fixed");
|
|
LoadFont(IDX_NORMALFONT, DetermineValue(prog, "normalfont", NORMALFONTG), "fixed");
|
|
LoadFont(IDX_INORMALFONT, DetermineValue(prog, "italicfont", ITALICFONTG), "fixed");
|
|
LoadFont(IDX_BNORMALFONT, DetermineValue(prog, "boldfont", BOLDFONTG), "fixed");
|
|
LoadFont(IDX_BINORMALFONT, DetermineValue(prog, "bolditalicfont", BINORMFONTG), "fixed");
|
|
LoadFont(IDX_FIXEDFONT, DetermineValue(prog, "fixedfont", RFIXEDFONTG), "fixed");
|
|
LoadFont(IDX_IFIXEDFONT, DetermineValue(prog, "ifixedfont", IFIXEDFONTG), "fixed");
|
|
LoadFont(IDX_BFIXEDFONT, DetermineValue(prog, "bfixedfont", BFIXEDFONTG), "fixed");
|
|
LoadFont(IDX_BIFIXEDFONT, DetermineValue(prog, "bifixedfont", BIFIXEDFONTG), "fixed");
|
|
LoadFont(IDX_SYMBOLFONT, DetermineValue(prog, "symbolfont", SYMFONTG), "grk30s25");
|
|
LoadFont(IDX_SUBSYMFONT, DetermineValue(prog, "subsymbolfont", SUBSYMFONTG), "grk-s25");
|
|
LoadFont(IDX_SMALLFONT, DetermineValue(prog, "smallfont", SUBSCRFONTG), "micro");
|
|
}
|
|
|
|
fixed_font = Fonts[IDX_FIXEDFONT];
|
|
|
|
/* list indents for ordered/unordered lists */
|
|
|
|
ListIndent1 = XTextWidth(Fonts[IDX_NORMALFONT], "ABCabc", 6)/6;
|
|
ListIndent2 = ListIndent1;
|
|
ListIndent1 = 2 * ListIndent1;
|
|
|
|
/* check for monchrome displays */
|
|
|
|
if (DefaultDepth(display, screen) == 1)
|
|
{
|
|
strikeColor = labelColor = textColor = BlackPixel(display, screen);
|
|
transparent = statusColor = windowColor = WhitePixel(display, screen);
|
|
windowShadow = windowTopShadow = windowBottomShadow = textColor;
|
|
}
|
|
else /* try for color but degrade as sensibly as possible */
|
|
{
|
|
if (!DetermineColor(prog, "windowColor", 220, 209, 186, &windowColor))
|
|
{
|
|
if (GetNamedColor("gray", &windowColor))
|
|
{
|
|
windowBottomShadow = BlackPixel(display, screen);
|
|
|
|
if (!GetNamedColor("dim gray", &windowShadow))
|
|
windowShadow = windowColor;
|
|
|
|
if (!GetNamedColor("light gray", &windowTopShadow))
|
|
windowTopShadow = WhitePixel(display, screen);
|
|
|
|
strikeColor = textColor = labelColor = WhitePixel(display, screen);
|
|
}
|
|
else
|
|
{
|
|
labelColor = strikeColor = textColor = BlackPixel(display, screen);
|
|
windowShadow = windowColor = WhitePixel(display, screen);
|
|
windowShadow = windowTopShadow = windowBottomShadow = textColor;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DetermineColor(prog, "textColor", 0, 0, 100, &textColor);
|
|
DetermineColor(prog, "labelColor", 0, 100, 100, &labelColor);
|
|
DetermineColor(prog, "strikeColor", 170, 0, 0, &strikeColor);
|
|
|
|
DetermineColor(prog, "windowShadow", 200, 188, 169, &windowShadow);
|
|
DetermineColor(prog, "windowTopShadow", 255, 242, 216, &windowTopShadow);
|
|
DetermineColor(prog, "windowBottomShadow", 180, 170, 152, &windowBottomShadow);
|
|
|
|
if (windowTopShadow == windowColor)
|
|
windowTopShadow = WhitePixel(display, screen);
|
|
|
|
if (windowBottomShadow == windowColor)
|
|
windowBottomShadow = BlackPixel(display, screen);
|
|
|
|
if (windowColor == textColor)
|
|
{
|
|
windowShadow = windowColor = BlackPixel(display, screen);
|
|
strikeColor = windowTopShadow = windowBottomShadow = textColor;
|
|
}
|
|
}
|
|
|
|
transparent = windowColor;
|
|
statusColor = windowShadow;
|
|
}
|
|
}
|
|
|
|
void MakePaper()
|
|
{
|
|
XGCValues values;
|
|
unsigned int valuemask;
|
|
Pixmap pixmap;
|
|
XImage *image;
|
|
GC drawGC;
|
|
|
|
gc_fill = XCreateGC(display, win, 0, 0);
|
|
XSetFunction(display, gc_fill, GXcopy);
|
|
|
|
InitPaperRGB ();
|
|
|
|
if (! (UsePaper && (depth == 8 || depth == 16 || depth == 24)))
|
|
{
|
|
UsePaper = 0;
|
|
XSetForeground(display, gc_fill, windowColor);
|
|
}
|
|
else
|
|
{
|
|
tileWidth = tileHeight = 64;
|
|
|
|
/* howcome 15/3/95: commented out XQueryTile since it on some
|
|
platforms set tile* to 0. On other servers it returns a low
|
|
number which dosn't look good */
|
|
|
|
/* XQueryBestTile(display, win, tileWidth, tileHeight, &tileWidth, &tileHeight); */
|
|
|
|
tileData = CreateBackground(tileWidth, tileHeight, depth);
|
|
|
|
if (!tileData)
|
|
{
|
|
UsePaper = 0;
|
|
XSetForeground(display, gc_fill, windowColor);
|
|
return;
|
|
}
|
|
|
|
if ((pixmap = XCreatePixmap(display, win, tileWidth, tileHeight, depth)) == 0)
|
|
{
|
|
fprintf(stderr, "Failed to create Pixmap for background!\n");
|
|
Exit(1);
|
|
}
|
|
|
|
if ((image = XCreateImage(display, DefaultVisual(display, screen),
|
|
depth, ZPixmap, 0, (char *)tileData,
|
|
tileWidth, tileHeight, (depth == 24 ? 32 : (depth == 16 ? 16 : 8)), 0)) == 0)
|
|
{
|
|
/* Free(tileData); keep for transparent backgrounds */
|
|
XFreePixmap(display, pixmap);
|
|
fprintf(stderr, "Failed to create X Image for background!\n");
|
|
Exit(1);
|
|
}
|
|
|
|
/* howcome 22/2/95: do we need to set these?? */
|
|
|
|
image->byte_order = MSBFirst;
|
|
image->bitmap_bit_order = BitmapBitOrder(display); /* was MSBFirst*/ ;
|
|
|
|
drawGC = XCreateGC(display, pixmap, 0, 0);
|
|
XSetFunction(display, drawGC, GXcopy);
|
|
XPutImage(display, pixmap, drawGC, image, 0, 0, 0, 0, tileWidth, tileHeight);
|
|
XFreeGC(display, drawGC);
|
|
image->data = NULL; /* we don't want to free image data */
|
|
XDestroyImage(image); /* normally frees image data */
|
|
|
|
valuemask = GCTile|GCFillStyle;
|
|
values.tile = pixmap;
|
|
values.fill_style = FillTiled;
|
|
XChangeGC(display, gc_fill, valuemask, &values);
|
|
}
|
|
}
|
|
|
|
/* create clone of self by forking and duplicating resources
|
|
|
|
creates duplicate of history file and closes
|
|
all open files, then duplicates stdio ...
|
|
|
|
returns 0 for parent, and 1 for clone
|
|
*/
|
|
|
|
int CloneSelf(void)
|
|
{
|
|
|
|
#if 0
|
|
|
|
int childpid, tty;
|
|
int x = 0, y = 0; /* window position */
|
|
unsigned int border_width = 4; /* border four pixels wide */
|
|
/* unsigned int display_width, display_height;*/
|
|
char *window_name = BANNER;
|
|
char *icon_name = BANNER;
|
|
int i, fh, depth;
|
|
unsigned int class;
|
|
Visual *visual;
|
|
unsigned long valuemask, where;
|
|
XSetWindowAttributes attributes;
|
|
Pixmap icon_pixmap;
|
|
|
|
if ((tty = open("/dev/tty", 2)) == -1 && (tty = open("/dev/null", 2)) == -1)
|
|
{
|
|
Warn("Can't open /dev/tty");
|
|
return 0;
|
|
}
|
|
|
|
/* ensure that children won't become zombies */
|
|
|
|
#ifdef SIGCHLD
|
|
signal(SIGCHLD, SIG_IGN);
|
|
#else
|
|
signal(SIGCLD, SIG_IGN);
|
|
#endif
|
|
|
|
if ((childpid = fork()) < 0)
|
|
{
|
|
close(tty);
|
|
Warn("Can't fork new process");
|
|
return 0;
|
|
}
|
|
|
|
if (childpid != 0)
|
|
{
|
|
close(tty);
|
|
return 0;
|
|
}
|
|
|
|
/* ok child process - so dup stdio - this leaves other files open! */
|
|
|
|
fprintf(stderr,"CloneSelf: child\n");
|
|
|
|
close(0); dup(tty);
|
|
close(1); dup(tty);
|
|
close(2); dup(tty);
|
|
close(tty);
|
|
|
|
close(ConnectionNumber(display)); /* close TCP connection to X server */
|
|
|
|
/* now clone history file and close original */
|
|
|
|
initialised = 0; /* avoid X output until this is true! */
|
|
|
|
/* XCloseDisplay(display); */ /* close connection for parent display */
|
|
|
|
/* connect to X server */
|
|
|
|
if ( (display = XOpenDisplay(display_name)) == NULL )
|
|
{
|
|
(void) fprintf(stderr, "www: cannot connect to X server %s\n",
|
|
XDisplayName(display_name));
|
|
exit(-1);
|
|
}
|
|
|
|
/* free memory but not pixmaps which we no longer own! */
|
|
FreeImages(1);
|
|
FreeForms(); /* is this right? */
|
|
|
|
/* try to allocate 128 fixed colors + 16 grey scales */
|
|
if (InitImaging(ColorStyle) == MONO)
|
|
UsePaper = 0;
|
|
|
|
/* GetResources(); *//* load font and colour resources */
|
|
|
|
if (ColorStyle == MONO)
|
|
statusColor = windowColor;
|
|
|
|
/* get screen size from display structure macro */
|
|
|
|
screen = DefaultScreen(display);
|
|
|
|
depth = DisplayPlanes(display, screen);
|
|
class = InputOutput; /* window class*/
|
|
visual = DefaultVisual(display, screen);
|
|
valuemask = CWColormap | CWBorderPixel | CWBitGravity |
|
|
CWBackingStore | CWBackingPlanes;
|
|
attributes.colormap = colormap;
|
|
attributes.bit_gravity = ForgetGravity;
|
|
attributes.backing_planes = 0;
|
|
attributes.backing_store = NotUseful;
|
|
|
|
win = XCreateWindow(display, RootWindow(display, screen),
|
|
x,y, win_width, win_height, border_width,
|
|
depth, class, visual, valuemask, &attributes);
|
|
|
|
XSetWindowBackground(display, win, windowColor);
|
|
|
|
/* Create pixmap of depth 1 (bitmap) for icon */
|
|
|
|
icon_pixmap = XCreateBitmapFromData(display, win, www_bits,
|
|
www_width, www_height);
|
|
|
|
/* Create default pixmap for use when we can't load images */
|
|
|
|
default_pixmap = XCreatePixmapFromBitmapData(display, win, www_bits,
|
|
www_width, www_height, textColor, transparent, depth);
|
|
|
|
default_pixmap_width = www_width;
|
|
default_pixmap_height = www_height;
|
|
|
|
/* initialize size hint property for window manager */
|
|
|
|
size_hints.flags = PPosition | PSize | PMinSize;
|
|
size_hints.x = x;
|
|
size_hints.y = y;
|
|
size_hints.width = win_width;
|
|
size_hints.height = win_height;
|
|
size_hints.min_width = 440;
|
|
size_hints.min_height = 250;
|
|
|
|
/* set properties for window manager (always before mapping) */
|
|
|
|
XSetStandardProperties(display, win, window_name, icon_name,
|
|
icon_pixmap, (char **)0, 0, &size_hints);
|
|
|
|
/* select events wanted */
|
|
|
|
XSelectInput(display, win, ExposureMask | KeyPressMask | KeyReleaseMask |
|
|
Button1MotionMask | ButtonPressMask | ButtonReleaseMask | StructureNotifyMask |PropertyChangeMask);
|
|
|
|
/* create hourglass cursor */
|
|
|
|
hourglass = XCreateFontCursor(display, XC_watch);
|
|
|
|
/* create GCs for text and drawing: gc_scrollbar, gc_status, gc_text */
|
|
|
|
gc_scrollbar = XCreateGC(display, win, 0, 0);
|
|
gc_status = XCreateGC(display, win, 0, 0);
|
|
gc_text = XCreateGC(display, win, 0, 0);
|
|
MakePaper();
|
|
font = -1;
|
|
|
|
if (DocHTML(CurrentDoc))
|
|
SetBanner(CurrentDoc->url);
|
|
|
|
/* refresh paint buffer to ensure that images resources are created */
|
|
|
|
where = PixelOffset;
|
|
PixelOffset = 0;
|
|
ParseHTML(&i);
|
|
|
|
if (where > 0)
|
|
DeltaHTMLPosition(where);
|
|
|
|
/* Map Display Window */
|
|
|
|
XMapWindow(display, win);
|
|
|
|
return 1;
|
|
|
|
#endif
|
|
return 1;
|
|
|
|
}
|
|
|
|
Context *NewContext()
|
|
{
|
|
return ((Context *) calloc (sizeof(Context), 1));
|
|
}
|
|
|
|
|
|
void myAlarm()
|
|
{
|
|
fprintf(stderr,"myAlarm\n");
|
|
|
|
}
|
|
|
|
void Push(void *item)
|
|
{
|
|
*stack = (long)item;
|
|
stack += sizeof(long);
|
|
}
|
|
|
|
void *Pop()
|
|
{
|
|
if(stack == main_stack)
|
|
return NULL;
|
|
|
|
stack -= sizeof(long);
|
|
return((void *)*stack);
|
|
}
|
|
|
|
void main(int argc, char **argv)
|
|
{
|
|
int x = 0, y = 0; /* window position */
|
|
unsigned int border_width = 2; /* border four pixels wide */
|
|
char *window_name = BANNER;
|
|
char *icon_name = BANNER;
|
|
int best_depth;
|
|
/* unsigned long *pixels; janet 21/07/95: not used */
|
|
unsigned int class;
|
|
unsigned long valuemask;
|
|
XSetWindowAttributes attributes;
|
|
XClassHint class_hints;
|
|
mode_t cmask;
|
|
|
|
|
|
#ifdef SIGWAITING_IGN
|
|
signal(SIGWAITING, SIG_IGN); /* howcome: solaris binaries receive this signal, but why? */
|
|
#endif
|
|
signal(SIGABRT, SIG_IGN);
|
|
signal(SIGPIPE, SIG_IGN);
|
|
#if !defined __QNX__
|
|
signal(SIGINT, Exit); /* howcome 4/10/94: trap C-C so that we can delete cache */
|
|
#endif
|
|
signal(SIGIOT, CatchCore);
|
|
/* signal(SIGSEGV, CatchCore); */
|
|
cmask = umask(0000);
|
|
|
|
stack = main_stack;
|
|
|
|
UseHTTP2 = 1;
|
|
UsePaper = 1;
|
|
|
|
ColorStyle = COLOR888;
|
|
|
|
Editor = getenv("EDITOR"); /* howcome 16/10/94: has to do it before command line arg processing */
|
|
|
|
prog = argv[0];
|
|
|
|
while (argc > 1)
|
|
{
|
|
if (!strcasecmp(argv[1], "-help")||!strcasecmp(argv[1], "-h"))
|
|
{
|
|
printf("Usage: arena [-large][-giant][-mono][-grey][-color][-color8]\n");
|
|
printf(" [-plain][-nocache][-noterminal][-nomailcap][-nostyle]\n");
|
|
printf(" [-cm][-quiet][-display display][-editor editor]\n");
|
|
printf(" [-cache dir][-geometry geom] [URL]\n");
|
|
Exit(1);
|
|
}
|
|
|
|
if (strcmp(argv[1], "-large") == 0)
|
|
{
|
|
fontsize = 1;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-giant") == 0)
|
|
{
|
|
fontsize = 2;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-mono") == 0)
|
|
{
|
|
ColorStyle = MONO;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-grey") == 0 ||
|
|
strcmp(argv[1], "-gray") == 0)
|
|
{
|
|
ColorStyle = GREY4;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-color") == 0)
|
|
{
|
|
ColorStyle = COLOR888;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-color8") == 0)
|
|
{
|
|
ColorStyle = COLOR232;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-plain") == 0)
|
|
{
|
|
UsePaper = 0;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-nocache") == 0)
|
|
{
|
|
CacheRoot = NULL;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
else if (strcmp(argv[1], "-noterminal") == 0)
|
|
{
|
|
NoTerminal = 1;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
|
|
else if (strcmp(argv[1], "-nomailcap") == 0)
|
|
{
|
|
NoMailcap = 1;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
|
|
else if (strcmp(argv[1], "-nostyle") == 0)
|
|
{
|
|
NoStyle = 1;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
|
|
else if (strcmp(argv[1], "-cm") == 0)
|
|
{
|
|
OwnColorMap = 1;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
|
|
else if (strcmp(argv[1], "-quiet") == 0)
|
|
{
|
|
Quiet = 1;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
|
|
else if (strcmp(argv[1], "-display") == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
display_name = *argv;
|
|
if (OPTION_TRACE)
|
|
printf("cache dir = %s\n", CacheRoot);
|
|
}
|
|
}
|
|
|
|
/* howcome 5/10/94: added cache command line option */
|
|
else if (strcmp(argv[1], "-cache") == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
CacheRoot = *argv;
|
|
if (OPTION_TRACE)
|
|
printf("cache dir = %s\n", CacheRoot);
|
|
}
|
|
}
|
|
|
|
/* howcome 10/10/94: added editor command line option */
|
|
else if (strncmp(argv[1], "-editor",5) == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
Editor = *argv;
|
|
if (OPTION_TRACE)
|
|
printf("Editor = %s\n", Editor);
|
|
}
|
|
}
|
|
|
|
/* howcome 10/10/94: added badflags command line option */
|
|
else if (strcmp(argv[1], "-badflags") == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
Badflags = atoi(*argv);
|
|
if (OPTION_TRACE)
|
|
printf("Editor = %s\n", Editor);
|
|
}
|
|
}
|
|
|
|
/* howcome 13/10/94: added icon command line option */
|
|
else if (strcmp(argv[1], "-icon") == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
Icon = *argv;
|
|
if (OPTION_TRACE)
|
|
printf("Icon = %s\n", Icon);
|
|
}
|
|
}
|
|
|
|
/* howcome 10/10/94: added command line option */
|
|
else if (strncmp(argv[1], "-printer",6) == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
Printer = *argv;
|
|
if (OPTION_TRACE)
|
|
printf("Printer = %s\n", Printer);
|
|
}
|
|
}
|
|
|
|
/* howcome 7/11/94: added command line option */
|
|
else if (strncmp(argv[1], "-gamma",6) == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
Gamma = (double) atof (*argv);
|
|
if (OPTION_TRACE)
|
|
printf("Gamma = %f\n", Gamma);
|
|
}
|
|
}
|
|
|
|
else if (strcmp(argv[1], "-debug") == 0)
|
|
{
|
|
debug = 255;
|
|
library_trace = 255;
|
|
--argc;
|
|
++argv;
|
|
}
|
|
|
|
/* howcome 7/11/94: added command line option */
|
|
else if (strncmp(argv[1], "-ct",3) == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
debug = (int) atoi(*argv);
|
|
/* if (debug) */
|
|
printf("Client trace = %d\n", debug);
|
|
}
|
|
}
|
|
|
|
/* howcome 9/5/95: added command line option */
|
|
else if (strncmp(argv[1], "-lens",5) == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
lens_factor = (int) atof(*argv);
|
|
fontsize = (int) (lens_factor + 0.5);
|
|
/* if (debug) */
|
|
printf("Client trace = %d\n", debug);
|
|
}
|
|
}
|
|
|
|
|
|
/* howcome 7/11/94: added command line option */
|
|
else if (strncmp(argv[1], "-lt",3) == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
|
|
{
|
|
char *p = *argv;
|
|
library_trace = 0;
|
|
for(; *p; p++) {
|
|
switch (*p) {
|
|
case 'a': library_trace |= SHOW_ANCHOR_TRACE; break;
|
|
case 'b': library_trace |= SHOW_BIND_TRACE; break;
|
|
case 'c': library_trace |= SHOW_CACHE_TRACE; break;
|
|
case 'g': library_trace |= SHOW_SGML_TRACE; break;
|
|
case 'p': library_trace |= SHOW_PROTOCOL_TRACE; break;
|
|
case 's': library_trace |= SHOW_STREAM_TRACE; break;
|
|
case 't': library_trace |= SHOW_THREAD_TRACE; break;
|
|
case 'u': library_trace |= SHOW_URI_TRACE; break;
|
|
case 'v': library_trace = SHOW_ALL_TRACE; break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* library_trace = (int) atoi(*argv);*/
|
|
/* if (debug) */
|
|
printf("Library trace = %d\n", library_trace);
|
|
}
|
|
}
|
|
/* pdd 31/10/95: added crippled window position option */
|
|
else if (strcmp(argv[1], "-geometry") == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
if (argc > 1) {
|
|
--argc;
|
|
++argv;
|
|
sscanf(*argv,"+%d+%d", &x, &y);
|
|
/* this part may not be necessary... but can't hurt */
|
|
if (x < 0 || x >= 2048 || y < 0 || y >= 1536) {
|
|
fprintf(stderr,"-geometry: only supports +X+Y\n");
|
|
x = 0;
|
|
y = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* pdd 31/10/95: added option to force end of option parsing */
|
|
else if (strcmp(argv[1],"--") == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
break;
|
|
}
|
|
|
|
/* pdd 31/10/95: silently bypass invalid arguments */
|
|
else if (strncmp(argv[1],"-",1) == 0)
|
|
{
|
|
--argc;
|
|
++argv;
|
|
}
|
|
|
|
|
|
/* pdd 31/10/95: treat first argument not starting with a "-"
|
|
as a new starting URL */
|
|
else if (strncmp(argv[1],"-",1) != 0)
|
|
{
|
|
break;
|
|
}
|
|
} /* end of command line option parsing */
|
|
|
|
|
|
/* initialise ISO character entity definitions */
|
|
|
|
InitEntities();
|
|
|
|
/* connect to X server */
|
|
|
|
if ( (display=XOpenDisplay(display_name)) == NULL )
|
|
{
|
|
(void) fprintf(stderr, "www: cannot connect to X server %s\n",
|
|
XDisplayName(display_name));
|
|
Exit(-1);
|
|
}
|
|
|
|
/* XSetErrorHandler(CatchX);*/
|
|
|
|
|
|
/* for debuging - disable buffering of output queue */
|
|
|
|
/* XSynchronize(display, 0); */ /* 0 enable, 1 disable */
|
|
|
|
/* gateway = DetermineValue(prog, "gateway", GATEWAY_HOST); */
|
|
help = DetermineValue(prog, "help", HELP_URL);
|
|
|
|
/* printer = DetermineValue(prog, "printer", PRINTER);*/ /* howcome 16/10/94: best not to set this */
|
|
|
|
startwith = getenv("WWW_HOME");
|
|
if (!startwith)
|
|
startwith = DetermineValue(prog, "startwith", DEFAULT_URL);
|
|
|
|
/* get screen size from display structure macro */
|
|
|
|
screen = DefaultScreen(display);
|
|
depth = DisplayPlanes(display, screen);
|
|
|
|
if (depth == 1)
|
|
ColorStyle = MONO;
|
|
|
|
visual = BestVisual(TrueColor, &best_depth);
|
|
if (best_depth == 24){
|
|
|
|
/* From Scott Nelson <snelson@canopus.llnl.gov> 24bit color: 12/5/94 */
|
|
/* visual = BestVisual(DirectColor, &best_depth); */
|
|
visual=BestVisual(TrueColor, &best_depth);
|
|
CalcPixelShift();
|
|
} else {
|
|
visual = BestVisual(DirectColor, &best_depth);
|
|
}
|
|
|
|
if (ColorStyle != COLOR888 || best_depth <= depth)
|
|
{
|
|
colormap = DefaultColormap(display, screen);
|
|
visual = DefaultVisual(display, screen);
|
|
|
|
if ((ColorStyle = InitImaging(ColorStyle)) == MONO)
|
|
UsePaper = 0;
|
|
}
|
|
else
|
|
{
|
|
InitImaging(ColorStyle);
|
|
depth = best_depth;
|
|
colormap = XCreateColormap(display, RootWindow(display, screen),
|
|
visual, AllocNone);
|
|
}
|
|
|
|
display_width = DisplayWidth(display, screen);
|
|
display_height = DisplayHeight(display, screen);
|
|
display_pt2px = (25.4 / 72.0) *
|
|
(((double) DisplayWidth(display,screen)) / ((double) DisplayWidthMM(display, screen)));
|
|
|
|
GetResources(); /* load font and colour resources */
|
|
|
|
if (ColorStyle == MONO)
|
|
statusColor = windowColor;
|
|
|
|
/* size widow with enough room for text */
|
|
|
|
charWidth = XTextWidth(Fonts[IDX_NORMALFONT], "ABCabc", 6)/6;
|
|
charHeight = SPACING(Fonts[IDX_NORMALFONT]);
|
|
|
|
win_width = min ( (92 * charWidth), (display_width * 0.9) );
|
|
win_height = min ( (35 * charHeight + 7), (display_height) );
|
|
|
|
class = InputOutput; /* window class*/
|
|
valuemask = CWColormap | CWBorderPixel | CWBitGravity |
|
|
CWBackingStore | CWBackingPlanes;
|
|
attributes.colormap = colormap;
|
|
attributes.bit_gravity = ForgetGravity;
|
|
attributes.backing_planes = 0;
|
|
attributes.backing_store = NotUseful;
|
|
|
|
/* create opaque window */
|
|
|
|
win = XCreateWindow(display, RootWindow(display, screen),
|
|
x,y, win_width, win_height, border_width,
|
|
depth, class, visual, valuemask, &attributes);
|
|
|
|
class_hints.res_name = (char *)calloc(strlen("Browser")+1, sizeof(char));
|
|
strcpy(class_hints.res_name, "Browser");
|
|
class_hints.res_class = (char *)calloc(strlen(BANNER)+1, sizeof(char));
|
|
strcpy(class_hints.res_class, BANNER);
|
|
XSetClassHint(display, win, &class_hints);
|
|
|
|
ARENA_LOCATION = XInternAtom(display, "ARENA_LOCATION", False); /* inter client comm */
|
|
ARENA_COMMAND = XInternAtom(display, "ARENA_COMMAND" , False);
|
|
|
|
/* Create pixmap of depth 1 (bitmap) for icon */
|
|
/*
|
|
icon_pixmap = XCreateBitmapFromData(display, win, www_bits,
|
|
www_width, www_height);
|
|
*/
|
|
|
|
#if 0
|
|
/* Create default pixmap for use when we can't load images */
|
|
|
|
default_pixmap = XCreatePixmapFromBitmapData(display, win, www_bits,
|
|
www_width, www_height, textColor, transparent, depth);
|
|
|
|
default_pixmap_width = www_width;
|
|
default_pixmap_height = www_height;
|
|
|
|
default_image->pixmap = default_pixmap;
|
|
default_image->width = default_pixmap_width;
|
|
default_image->height = default_pixmap_height;
|
|
#endif
|
|
|
|
/* initialize size hint property for window manager */
|
|
|
|
size_hints.flags = PPosition | PSize | PMinSize;
|
|
size_hints.x = x;
|
|
size_hints.y = y;
|
|
size_hints.width = win_width;
|
|
size_hints.height = win_height;
|
|
|
|
size_hints.min_width = 100;
|
|
size_hints.min_height = 150;
|
|
/*
|
|
size_hints.min_width = 440;
|
|
size_hints.min_height = 350;
|
|
*/
|
|
/* before we can call XSetStandardProperties we need the
|
|
icon. Befor we can get the icon, we need to initialize the
|
|
library */
|
|
|
|
context = NewContext();
|
|
context->registered_anchors = HTList_new();
|
|
/* context->pending_docs = HTList_new();
|
|
context->pending_anchors = HTList_new(); */
|
|
context->style = StyleGetInit();
|
|
context->history = HTList_new();
|
|
context->conversions = HTList_new();
|
|
context->memory_leaks = HTList_new();
|
|
|
|
|
|
libEntry(); /* howcome: library init */
|
|
LoadIcon(); /* howcome 14/10/94 */
|
|
|
|
/* set properties for window manager (always before mapping) */
|
|
|
|
XSetStandardProperties(display, win, window_name, icon_name,
|
|
icon_pixmap, argv, argc, &size_hints);
|
|
|
|
/* select events wanted */
|
|
|
|
XSelectInput(display, win, ExposureMask | KeyPressMask | KeyReleaseMask |
|
|
Button1MotionMask | ButtonPressMask | ButtonReleaseMask |
|
|
StructureNotifyMask | SubstructureNotifyMask| PropertyChangeMask);
|
|
|
|
/* create hourglass cursor */
|
|
|
|
hourglass = XCreateFontCursor(display, XC_watch);
|
|
|
|
/* create GCs for text and drawing: gc_scrollbar, gc_status, gc_text */
|
|
|
|
gc_scrollbar = XCreateGC(display, win, 0, 0);
|
|
gc_status = XCreateGC(display, win, 0, 0);
|
|
gc_text = XCreateGC(display, win, 0, 0);
|
|
|
|
/* find user's name */
|
|
|
|
user = getenv("USER"); /* shell variable for user name */
|
|
|
|
|
|
/* InitCurrent(CurrentDirectory()); */ /* set current host to self etc. */
|
|
SetToolBarFont(Fonts[IDX_LABELFONT]);
|
|
SetStatusFont(Fonts[IDX_LABELFONT]);
|
|
|
|
SetToolBarWin(win);
|
|
SetToolBarGC(gc_status);
|
|
SetStatusWin(win);
|
|
SetStatusGC(gc_status);
|
|
SetScrollBarWin(win);
|
|
SetScrollBarGC(gc_scrollbar);
|
|
SetIconWin(win);
|
|
SetIconGC(gc_status);
|
|
SetToolBarGC(gc_status);
|
|
SetDisplayGC(gc_text);
|
|
#ifdef POPUP
|
|
initPopup(Fonts[IDX_LABELFONT]);
|
|
#endif
|
|
MakePaper(); /* create gc_fill for textured paper */
|
|
MakeIcons(depth); /* create images for icons */
|
|
|
|
/* create pixmap for testing initial <img> implementation */
|
|
|
|
/* Map Display Window */
|
|
|
|
XMapWindow(display, win);
|
|
|
|
/* get buffer with named file in it */
|
|
|
|
hdrlen = 0;
|
|
buffer = NULL;
|
|
|
|
|
|
if (argc != 1)
|
|
startwith = argv[1];
|
|
|
|
#if 0
|
|
signal(SIGALRM, myAlarm);
|
|
|
|
itimer.it_value.tv_sec = 10;
|
|
itimer.it_value.tv_usec = 0;
|
|
itimer.it_interval.tv_sec = 0;
|
|
itimer.it_interval.tv_usec = 500000;
|
|
|
|
setitimer (ITIMER_REAL, &itimer, &old_itimer);
|
|
#endif
|
|
|
|
libEventLoop(ConnectionNumber(display), startwith);
|
|
}
|