ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/lib/mg/ri/mgrinxwindow.c

This is mgrinxwindow.c in view mode; [Download] [Up]

#import <appkit/appkit.h>
#import <appkit/graphics.h>
#import <dpsclient/wraps.h>

#include "mgriP.h"

/* The MGView class is the class which handles drawing */
@interface MGView:View
{
    mgricontext *theContext;
}
- (BOOL)canBecomeMainWindow;
- (BOOL)canBecomeKeyWindow;
- windowDidResize:sender;
- windowWillClose:sender;
- windowDidExpose:sender; /* nonretained windows */
- windowWillMiniaturize:sender toMiniwindow:miniwindow;
- windowDidDeminiaturize:sender;
- windowDidBecomeKey:sender;
- windowDidBecomeMain:sender;
- drawSelf:(NXRect *)r :(int)c;

@end

@implementation MGView

- (BOOL)canBecomeMainWindow
{
  return YES;
}

- (BOOL)canBecomeKeyWindow
{
  return YES;
}

- windowDidResize:sender
{
    int xsize, ysize;
    mgricontext *thectx =  (mgricontext *)mgri_findctx((char *)sender );

    [window display];
    
    if(thectx!=NULL && thectx->callback!=NULL) {
    	thectx->callback(thectx, MG_RIWINDOWRESIZED);
    }
    return self;
}

- windowWillClose:sender
{
    mgricontext *thectx = (mgricontext *)mgri_findctx((char *)sender );
    if(thectx!=NULL && thectx->callback!=NULL) {
        thectx->dying=1;
    	thectx->callback(thectx, MG_RIWINDOWCLOSED);
	
    }
    return self;
}

- windowWillMiniaturize:sender toMiniwindow:miniwindow
{
    mgricontext *thectx =  (mgricontext *)mgri_findctx((char *)sender );
    if(thectx!=NULL && thectx->callback!=NULL) {
    	thectx->callback(thectx, MG_RIWINDOWICONIFIED);
    }
    return self;
}

- windowDidDeminiaturize:sender
{
    mgricontext *thectx =  (mgricontext *)mgri_findctx((char *)sender );
    if(thectx!=NULL && thectx->callback!=NULL) {
    	thectx->callback(thectx, MG_RIWINDOWDEICONIFIED);
    }
    return self;
}

- windowDidExpose:sender
{
    /* for use with non-retained windows. Is this valid? */
    mgricontext *thectx =  (mgricontext *)mgri_findctx((char *)sender );
    if(thectx!=NULL && thectx->callback!=NULL) {
    	thectx->callback(thectx, MG_RIWINDOWEXPOSED);
    }
    return self;
}

- windowDidBecomeKey:sender
{
    mgricontext *thectx =  (mgricontext *)mgri_findctx((char *)sender );
    if(thectx!=NULL && thectx->callback!=NULL) {
    	thectx->callback(thectx, MG_RIWINDOWBECAMEKEY);
    }
    return self;
}

- windowDidBecomeMain:sender
{
    mgricontext *thectx =  (mgricontext *)mgri_findctx((char *)sender );
    if(thectx!=NULL && thectx->callback!=NULL) {
    	thectx->callback(thectx, MG_RIWINDOWBECAMEMAIN);
    }
    return self;
}

- drawSelf:(NXRect *)r :(int)c
{
  register ColorA *bg;
  bg=&_mgc->background;
  PSsetrgbcolor(bg->r, bg->g, bg->b);
  NXRectFill(&bounds);
  return self;
}

@end

int
mgri_nxwindow(int x, int y, int xs, int ys, char *name,
	      int noborder, unsigned int *globalNum)
{
    NXRect r, win;
    NXPoint mgvorigin;
    id dwindow, dview;
    
    /* if the window already exists, return */
    if(_mgric->nxwindow) return 0;
    
    r.origin.x = x;
    r.origin.y = y;
    r.size.width = xs;
    r.size.height = ys;
    
    /* check for application object */
    if(NXApp==NULL) {
        /* we must create an 'application' object */
	/* this creates a connection with the window server */
        NXApp = [Application new];
	_mgric->standalone = 1;
    } else _mgric->standalone = 0;

    /* create the window */
    dwindow = (id)_mgric->nxwindow = (char *)[[Window alloc]
    	initContent:&r
	style:noborder ? NX_PLAINSTYLE : NX_RESIZEBARSTYLE
	backing:NX_BUFFERED
	buttonMask:NX_CLOSEBUTTONMASK
		   |NX_MINIATURIZEBUTTONMASK
	defer:NO];

    /* following used to create window resource */
    NXConvertWinNumToGlobal([dwindow windowNum], globalNum);

    r.origin.x = 0;
    r.origin.y = 0;
        
    dview = (id)_mgric->nxview = (char *)[[MGView alloc] initFrame:&r];
    [(id)_mgric->nxview allocateGState]; /* for faster (un)lockfocus */
    
    [[(id)_mgric->nxwindow contentView] addSubview:(id)_mgric->nxview];
    mgvorigin.x = 0;
    mgvorigin.y = r.size.height;
    [(id)_mgric->nxview convertPoint:&mgvorigin toView:nil];
    [(id)_mgric->nxwindow getFrame:&win];
    mgvorigin.y = win.size.height - mgvorigin.y;
    _mgric->mgvorigin[0] = (int)mgvorigin.x;
    _mgric->mgvorigin[1] = (int)mgvorigin.y;
    [(id)_mgric->nxwindow setDelegate:(id)_mgric->nxview];
    [(id)_mgric->nxwindow addToEventMask:NX_LMOUSEDRAGGEDMASK];
    [(id)_mgric->nxwindow addToEventMask:NX_RMOUSEDRAGGEDMASK];
    [(id)_mgric->nxwindow addToEventMask:NX_RMOUSEDOWNMASK];
    [(id)_mgric->nxwindow addToEventMask:NX_RMOUSEUPMASK];

    [[(id)_mgric->nxwindow contentView]  setAutoresizeSubviews:YES];
    [(id)_mgric->nxview setAutosizing:NX_WIDTHSIZABLE|NX_HEIGHTSIZABLE];
    [(id)_mgric->nxwindow setTitle:(const char *)name];
    [(id)_mgric->nxwindow display];
    //[(id)_mgric->nxwindow makeKeyAndOrderFront:(id)_mgric->nxwindow];
    return 1;
}


// MUST INCLUDE CONTEXT ON THIS ONE - CAN'T USE CURRENT CONTEXT!
void
mgri_closewindow(mgricontext *thectx)
{
    /* 
     * we must check to see if the window is 'dying', which
     * means the user is closing the window from the title
     * bar & we are in the middle of the windowWillClose method
     * so the window must stick around & will be closed later
     * by the appkit
     */
    if(!thectx->dying) {
	[(id)thectx->nxwindow performClose:(id)0];
    }
}

void
mgri_display()
{
    [(id)_mgric->nxview display];
}

void
mgri_getnxrect(float *f)
{
    NXRect theRect;
    [(id)_mgric->nxview getFrame:&theRect];
    // Convert camera view's frame from superview to window coords.
    [[(id)_mgric->nxview superview] convertRect:&theRect toView:nil];
    f[0]=theRect.origin.x;
    f[1]=theRect.origin.y;
    f[2]=theRect.size.width;
    f[3]=theRect.size.height;
}

void
mgri_clear()
{
  register ColorA *bg;
  register Color *eg;
  NXRect bounds;
  bg=&_mgc->background;
  [(id)_mgric->nxview lockFocus];
  [(id)_mgric->nxview getBounds:&bounds];
  PSsetrgbcolor(bg->r, bg->g, bg->b);
  NXRectFill(&bounds);
  [(id)_mgric->nxview unlockFocus];
  NXPing();
}

void
mgri_flush()
{
    [(id)_mgric->nxwindow flushWindow];
}

void mgri_processevents()
{
    NXEvent theEvent;
    while(DPSGetEvent(DPSGetCurrentContext(), &theEvent, NX_ALLEVENTS,
    	0.0, NX_BASETHRESHOLD))
	{
	    [NXApp sendEvent:&theEvent];
	}
}

void
mgri_errorhandler(RtInt type, RtInt severity, char *message,
                  RtToken routine, RtToken context)
{
    /* Warnings and Info are ignored. We could just ignore those
       troublesome warnings such as clip plane and anisometric xform, eh? */
       
    if(severity==2) {
        fprintf(stderr,"MGRI: QRMAN reports RIE_ERROR. type:%d message:%s\n",type,message);
	return;
    }
    if(severity==3) {
        fprintf(stderr,"MGRI: QRMAN reports RIE_SEVERE. type:%d message:%s\n",type,message);
	fprintf(stderr,"SUGGEST TERMINATION!\n");
    }
}

void mgri_startdebugcontext()
{
    /* if the context does not exists, create it */
    if(!_mgric->debugContext) {
	_mgric->debugContext = RiBegin(NULL, NULL);
	RiHider(RI_HIDDEN,RI_NULL);
        _mgric->debugResource = RiResource("File", RI_ARCHIVE, RI_NULL);
    }
	
}

void mgri_stopdebugcontext()
{
}

void mgri_debugcontext()
{
    /* toggel debug context */
    if(_mgric->debug) _mgric->debug = 0;
    else _mgric->debug = 1;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.