DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T g

⟦ed120385d⟧ TextFile

    Length: 8930 (0x22e2)
    Types: TextFile
    Names: »ginit.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/X/Xconq/ginit.c« 

TextFile

/* Copyright (c) 1987, 1988  Stanley T. Shebs, University of Utah. */
/* This program may be used, copied, modified, and redistributed freely */
/* for noncommercial purposes, so long as this notice remains intact. */

/* RCS $Header: ginit.c,v 1.1 88/06/21 12:30:10 shebs Exp $ */

/* Initialization and random routines for the display part of xconq. */

#include "config.h"
#include "misc.h"
#include "dir.h"
#include "period.h"
#include "side.h"
#include "unit.h"
#include "map.h"
#include "global.h"

/* Always use four lines for the unit info display, even on small screens. */

#define INFOLINES 4

int maxnamelen = 0;		/* length of longest side name+host */

/* Find a unit and put it at center (or close to it) of first view.  I guess */
/* can't use put_on_screen because not enough stuff is inited yet. */

init_curxy(side)
Side *side;
{
    Unit *unit;

    for_all_units(unit) {
	if (unit->side == side) {
	    side->cx = unit->x;  side->cy = unit->y;
	    side->vcx = unit->x;
	    side->vcy = max(unit->y, side->vw2+1);
	    side->vcy = min(side->vcy, (world.height-1) - side->vh2);
	    return;
	}
    }
    side->vcx = side->vw2;  side->vcy = side->vh2;
    side->cx = side->vcx;  side->cy = side->vcy;
}

/* The very first step in using X is to open up all the desired displays. */
/* In our case, there are many displays each with many windows.  If the */
/* display opens successfully, do an initial "redraw" to set the screen up. */

init_displays()
{
    int len;
    Side *side;

    for_all_sides(side) {
	len = 8 + strlen(side->name) + 1;
	maxnamelen = max(maxnamelen,
			 len + (side->host ? strlen(side->host) + 3 : 0));
    }
    for_all_sides(side) {
	if (side->host != NULL) {
	    init_display(side);
	    if (active_display(side)) {
		init_curxy(side);
		redraw(side);
	    }
	}
    }
}

/* Open display, create all the windows we'll need, do misc setup things, */
/* and initialize some globals to out-of-range values for recognition later. */

init_display(side)
Side *side;
{
    int i;

    if (Debug) printf("Will try to open display \"%s\" ...\n", side->host);

    if (!open_display(side)) {
	fprintf(stderr, "Display \"%s\" could not be opened!\n", side->host);
	exit_xconq();
    }
    active_display(side);   /* done for side effect */
    init_colors(side);
    init_misc(side);
    init_sizes(side);
    create_main_window(side);
    side->msg =
	create_window(side, 0, 0,
		      side->lw, side->nh * side->fh);
    side->info =
	create_window(side, 0, side->nh * side->fh + side->bd,
		      side->lw, INFOLINES * side->fh);
    side->prompt =
	create_window(side, 0, (side->nh + INFOLINES) * side->fh + 2*side->bd,
		      side->lw, side->fh);
    side->map =
	create_window(side, 0, side->th,
		      side->vw * side->hw,
		      side->vh * side->hch + (side->hh - side->hch));
    side->sides =
	create_window(side, side->lw + side->bd + 1, 0,
		      side->sw * side->fw, numsides * side->fh);
    side->timemode =
	create_window(side, side->lw + side->fw, side->th - 4 * side->fh,
		      2 * side->margin + 8 * side->fw, 2 * side->fh);
    side->clock =
	create_window(side, side->lw + 13 * side->fw, side->th - 2 * side->fh,
		      8 * side->fw, side->fh);
    side->state =
	create_window(side, side->lw + 1, side->th,
		      20 * side->fw, period.numutypes*max(side->hh, side->fh));
    if (world_display(side)) {
	side->world =
	    create_window(side,
			  side->lw+side->bd, side->mh-side->mm*world.height,
			  world.width * side->mm, world.height * side->mm);
    }
    create_help_window(side);
    fixup_windows(side);
    enable_input(side);
    for (i = 0; i < MAXNOTES; ++i) strcpy(side->noticebuf[i], " ");
    for (i = 0; i < MAXUTYPES; ++i) side->bvec[i] = 0;
    /* Flag some values as uninitialized */
    side->vcx = side->vcy = -1;
    side->lastvcx = side->lastvcy = -1;
    side->lastx = side->lasty = -1;
    if (Debug) printf("Successfully opened \"%s\"!\n", side->host);
}

/* Decide/compute all the sizes of things.  Our main problem here is that */
/* the display might be smaller than we really desire, so things have to */
/* be adjusted to fit. */

init_sizes(side)
Side *side;
{
    int alw, abh;

    alw = (3 * display_width(side)) / 4;
    side->vw = min(world.width, alw / side->hw);
    side->nw = min(BUFSIZE, alw / side->fw);
    side->sw = maxnamelen;
    abh = (2 * display_height(side)) / 3;
    side->vh = min(world.height, abh / side->hch);
    side->nh = max(1, min(abh/2 - 5, MAXNOTES));
    side->mm = min(5, (max(world.width, side->fw*side->sw) / world.width));
    set_sizes(side);
    if (side->vw < MINWIDTH || side->vh < MINHEIGHT) {
	fprintf(stderr, "Display \"%s\" is too small!\n", side->host);
	exit_xconq();
    }
}

/* This fn is a "ten-line horror"; effectively a mini tiled window manager */
/* that keeps the subwindows from overlapping no matter what the display and */
/* requested sizes are.  Siemens eat your heart out... */

set_sizes(side)
Side *side;
{
    int ulhgt, llhgt, urhgt, lrhgt;

    /* Make sure map window dimensions are OK */
    side->vw = min(world.width, side->vw);
    side->vh = min(world.height, side->vh);
    side->vw2 = side->vw / 2;  side->vh2 = side->vh / 2;
    /* Compute subregion sizes (left/right upper/lower width/height) */
    side->lw = max(side->nw * side->fw, side->hw * side->vw);
    side->rw = max((world_display(side) ? world.width * side->mm : 0),
		   side->sw * side->fw);
    urhgt = (numsides + 4) * side->fh + side->bd;
    ulhgt = side->fh * (side->nh + INFOLINES + 1) + 3 * side->bd;
    side->th = max(ulhgt, urhgt);
    lrhgt = period.numutypes * max(side->hh, side->fh);
    if (world_display(side)) lrhgt += side->mm * world.height + side->bd;
    llhgt = side->hch * side->vh + (side->hh - side->hch);
    side->bh = max(llhgt, lrhgt);
    side->mw = side->lw + side->bd + side->rw;
    side->mh = side->th + side->bd + side->bh;
    /* Only vcy needs adjustment, since vcx can never be close to an edge */
    side->vcy = min(max(side->vh2, side->vcy), (world.height-1)-side->vh2);
}

/* Acquire a set of colors.  There are too many to make it feasible to */
/* customize them via .Xdefaults, so we don't even try.  If there aren't */
/* enough colors, drop into monochrome mode.  This doesn't take the window */
/* manager into account - it may have grabbed some color space. */

init_colors(side)
Side *side;
{
    if (Debug) printf("%d colors available ...\n", display_colors(side));
    side->monochrome = (display_colors(side) == 2);
    side->bonw = (side->monochrome ? BLACKONWHITE : FALSE);
    set_colors(side);
}

/* This will set up the correct set of colors at any point in the game. */
/* Note that terrain colors get NO value if in monochrome mode. */
/* If the colors requested are not available, it is up to the graphics */
/* interface to supply a substitute. */

set_colors(side)
Side *side;
{
    int	t;
    long fg, bg;

    fg = (side->bonw ? black_color(side) : white_color(side));
    bg = (side->bonw ? white_color(side) : black_color(side));
    side->bgcolor = side->owncolor = side->altcolor = side->diffcolor = bg;
    side->fgcolor = side->bdcolor = side->graycolor = side->enemycolor = fg;
    side->neutcolor = side->goodcolor = side->badcolor = fg;
    if (!side->monochrome) {
	for_all_terrain_types(t) {
	    side->hexcolor[t] = request_color(side, ttypes[t].color);
	}
	side->owncolor = request_color(side, "black");
	side->altcolor = request_color(side, "blue");
	side->diffcolor = request_color(side, "maroon");
	side->bdcolor = request_color(side, "blue");
	side->graycolor = request_color(side, "light gray");
	side->enemycolor = request_color(side, "red");
	side->neutcolor = request_color(side, "light gray");
	side->goodcolor = request_color(side, "green");
	side->badcolor = request_color(side, "red");
    }
}

/* Move windows and change their sizes to correspond with the new sizes of */
/* viewports, etc. */

reconfigure_display(side)
Side *side;
{
    int sy, sdy;

    if (active_display(side)) {
	set_sizes(side);
	set_colors(side);
	reset_misc(side);
	sy = 0;  sdy = side->nh * side->fh;
	change_window(side, side->msg, 0, sy, side->lw, sdy);
	sy += sdy + side->bd;  sdy = INFOLINES * side->fh;
	change_window(side, side->info, 0, sy, side->lw, sdy);
	sy += sdy + side->bd;  sdy = 1 * side->fh;
	change_window(side, side->prompt, 0, sy, side->lw, sdy);
	change_window(side, side->map, 0, side->th,
		      side->vw * side->hw,
		      side->vh * side->hch + (side->hh - side->hch));
	change_window(side, side->timemode,
		      side->lw + side->fw, side->th - 4 * side->fh, -1, -1);
	change_window(side, side->sides, side->lw+1, 0, -1, -1);
	if (world_display(side)) {
	    change_window(side, side->world,
			  side->lw + 1, side->mh - world.height * side->mm,
			  world.width * side->mm, world.height * side->mm);
	}
	change_window(side, side->main, -1, -1, side->mw, side->mh);
	redraw(side);
    }
}