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 w

⟦739a67ab5⟧ TextFile

    Length: 5392 (0x1510)
    Types: TextFile
    Names: »widget.c«

Derivation

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

TextFile

/* widget.c -- handle things that make the playing field behave as a widget. */

#include "roids.h"

void HandleFocus();
void HandleStruct();

static XtActionsRec actions[] = {
    {"grab-focus",	(XtActionProc) TakeFocus},
    {"rotate-left",	RotateLeft},
    {"rotate-right",	RotateRight},
    {"rotate-off",	RotateOff},
    {"thrust-on",	ThrustOn},
    {"thrust-off",	ThrustOff},
    {"rotate-to-point",	RotateToPoint},
    {"stop-rotate",	StopRotateToPoint},
    {"rotate-moved",	RotateMouseMoved},
    {"fire",		Fire},
    {"quit",		Quit},
};

static char defaultTranslation[] =
    "<Btn1Down>:	grab-focus() rotate-to-point()\n\
     Button1<PtrMoved>:	rotate-moved()\n\
     <Btn1Up>:		stop-rotate()\n\
     <Btn2Down>:	thrust-on()\n\
     <Btn2Up>:		thrust-off()\n\
     <Btn3Down>:	fire()\n\
     <KeyDown>z:	rotate-left()\n\
     <KeyUp>z:		rotate-off()\n\
     <KeyDown>x:	rotate-right()\n\
     <KeyUp>x:		rotate-off()\n\
     <KeyDown>\\,:	thrust-on()\n\
     <KeyUp>\\,:	thrust-off()\n\
     <KeyDown>.:	fire()\n\
     Shift<KeyDown>q:	quit()";






static void ClassInitialize() {}

static void Initialize(request, w)
Widget request, w;
{
    gamewidget = (RoidsWidget) w;
    XtAddEventHandler(toplevel, (EventMask) FocusChangeMask, FALSE,
		      HandleFocus, (Opaque) NULL);
    XtAddEventHandler(toplevel, (EventMask) StructureNotifyMask, FALSE,
		      HandleStruct, (Opaque) NULL);
}


static void Realize(w, valueMask, attributes)
Widget w;
Mask *valueMask;
XSetWindowAttributes *attributes;
{
    int i;
    XGCValues values;
    XtCreateWindow(w, (unsigned int) InputOutput, (Visual *) CopyFromParent,
		   *valueMask, attributes);
    gamewidth = w->core.width;
    gameheight = w->core.height;
    gamewindow = w->core.window;
    values.foreground = w->core.background_pixel;
    values.background = w->core.background_pixel;
    backgc = XtGetGC(w, (XtGCMask) GCForeground | GCBackground, &values);
    values.foreground = shippixel;
    shipgc = XtGetGC(w, (XtGCMask) GCForeground | GCBackground, &values);
    values.foreground = rockpixel;
    rockgc = XtGetGC(w, (XtGCMask) GCForeground | GCBackground, &values);
    values.foreground = shotpixel;
    shotgc = XtGetGC(w, (XtGCMask) GCForeground | GCBackground, &values);
    InitShip();
    InitRocks();
    InitShot();
    InitScore();
}


static void HandleExpose(w, event)
Widget w;
XEvent *event;
{
    if (event->xexpose.count) return;
    if (!shipdestroyed)
	PaintShip(shipgc);
    PaintAllRocks();
    PaintAllShots();
    XSync(dpy, 0);
}


static Boolean wason = TRUE;	/* Whether the user had autorepeat set. */

void Quit()
{
    if (wason) XAutoRepeatOn(dpy);
    XCloseDisplay(dpy);
    printf("Score: %d\n", score);
    exit(0);
}

static void HandleFocus(w, closure, event)
Widget w;
Opaque closure;
XEvent *event;
{
    XKeyboardState info;
    if (event->type == FocusIn) {
	XGetKeyboardControl(dpy, &info);
	wason = info.global_auto_repeat;
	XAutoRepeatOff(dpy);
	XSync(dpy, 0);
	if (shiptimerid == NULL)
	    shiptimerid = XtAddTimeOut(shipwait, MoveShip, (Opaque) MoveShip);
	if (rocktimerid == NULL)
	    rocktimerid = XtAddTimeOut(rockwait, MoveRocks,
				       (Opaque) MoveRocks);
	if (shottimerid == NULL)
	    shottimerid = XtAddTimeOut(shotwait, MoveShots,
				       (Opaque) MoveShots);
    } else if (event->type == FocusOut) {
	if (wason) XAutoRepeatOn(dpy);
	if (shiptimerid) 
	    XtRemoveTimeOut(shiptimerid);
	shiptimerid = NULL;
	if (rocktimerid)
	    XtRemoveTimeOut(rocktimerid);
	rocktimerid = NULL;
	if (shottimerid)
	    XtRemoveTimeOut(shottimerid);
	shottimerid = NULL;
    }
}

static void HandleStruct(w, closure, event)
Widget w;
Opaque closure;
XEvent *event;
{
}

static void Destroy() {}
static void Resize() {}
static Boolean SetValues() {}

static Boolean TakeFocus()
{
    XSetInputFocus(dpy, gamewindow, RevertToPointerRoot, CurrentTime);
    return TRUE;
}

RoidsClassRec roidsClassRec = {
  {
/* core_class fields      */
    /* superclass         */    (WidgetClass) &widgetClassRec,
    /* class_name         */    "Roids",
    /* widget_size        */    sizeof(RoidsRec),
    /* class_initialize   */    ClassInitialize,
    /* class_part_initiali*/	NULL,
    /* class_inited       */    FALSE,
    /* initialize         */    Initialize,
    /* initialize_hook	  */	NULL,
    /* realize            */    Realize,
    /* actions            */    actions,
    /* num_actions        */    XtNumber(actions),
    /* resources          */    NULL,
    /* num_resources      */    (Cardinal) 0,
    /* xrm_class          */    NULLQUARK,
    /* compress_motion    */    TRUE,
    /* compress_exposure  */    TRUE,
    /* compress_enterleave*/	TRUE,
    /* visible_interest   */    FALSE,
    /* destroy            */    Destroy,
    /* resize             */    Resize,
    /* expose             */    HandleExpose,
    /* set_values         */    SetValues,
    /* set_values_hook	  */	NULL,
    /* set_values_almost  */	NULL,
    /* get_values_hook	  */	NULL,
    /* accept_focus       */    TakeFocus,
    /* version		  */	XtVersion,
    /* callback_private	  */	NULL,
    /* tm_table		  */	defaultTranslation,
    /* query_geometry	  */	NULL,
    /* display_accelerator*/	NULL,
    /* extension`	  */	NULL,
  },{
    /* mumble             */    0       /* Make C compiler happy   */
  }
};

WidgetClass roidsWidgetClass = (WidgetClass)&roidsClassRec;