/*
 * NSWindow subclass for Mac OS X rootless X server
 */
/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/XWindow.m,v 1.5 2001/11/06 23:18:14 torrey Exp $ */

#import "XWindow.h"


@implementation XWindow

// XWindow MUST NOT autodisplay! Autodisplay can cause a deadlock.
// event thread - autodisplay: locks view hierarchy, then window
// X Server thread - window resize: locks window, then view hierarchy
// Deadlock occurs if each thread gets one lock and waits for the other.

// XWindow MUST defer! Otherwise an assertion fails in
// NSViewHierarchyLock sometimes.

- (id)initWithContentRect:(NSRect)aRect
                   isRoot:(BOOL)isRoot
{
    int style;
    NSRect viewRect = {{0, 0}, {aRect.size.width, aRect.size.height}};
    style = NSBorderlessWindowMask;

    self = [super initWithContentRect: aRect
                styleMask: style
                backing: NSBackingStoreBuffered
                defer: YES];
    if (! self) return NULL;

    [self setBackgroundColor:[NSColor clearColor]];  // erase transparent
    [self setAlphaValue:1.0];       // draw opaque
    [self setOpaque:YES];           // changed when window is shaped

    [self useOptimizedDrawing:YES]; // Has no overlapping sub-views
    [self setAutodisplay:NO];       // MUST NOT autodisplay! See comment above
    [self disableFlushWindow];      // We do all the flushing manually
    [self setHasShadow: !isRoot];   // All windows have shadows except root

    // [self setAcceptsMouseMovedEvents:YES]; // MUST be AFTER orderFront?

    mView = [[XView alloc] initWithFrame: viewRect];
    [self setContentView:mView];
    [self setInitialFirstResponder:mView];

    return self;
}

- (void)dealloc
{
    [mView release];
    [super dealloc];
}

- (char *)bits
{
    return [mView bits];
}

- (void)getBits:(char **)bits
       rowBytes:(int *)rowBytes
          depth:(int *)depth
   bitsPerPixel:(int *)bpp
{
    [mView getBits:bits rowBytes:rowBytes depth:depth bitsPerPixel:bpp];
}


// rects are X-flip and LOCAL coords
- (void)refreshRects:(fakeBoxRec *)rectList count:(int)count;
{
    [mView refreshRects:rectList count:count];
}


// Deferred windows don't handle mouse moved events very well.
- (void)orderWindow:(NSWindowOrderingMode)place
         relativeTo:(int)otherWindowNumber
{
    [super orderWindow:place relativeTo:otherWindowNumber];
    [self setAcceptsMouseMovedEvents:YES];
}

- (void)sendEvent:(NSEvent *)anEvent
{
    [super sendEvent:anEvent];
    [self setAcceptsMouseMovedEvents:YES];
}

// XWindow may be frameless, and frameless windows default to
// NO key and NO main.
// update: we *don't* want main or key status after all
- (BOOL)canBecomeMainWindow
{
    return NO;
}

- (BOOL)canBecomeKeyWindow
{
    return NO;
}

@end
