diff options
Diffstat (limited to 'xc/programs/Xserver/hw/darwin/bundle/XWindow.m')
-rw-r--r-- | xc/programs/Xserver/hw/darwin/bundle/XWindow.m | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/xc/programs/Xserver/hw/darwin/bundle/XWindow.m b/xc/programs/Xserver/hw/darwin/bundle/XWindow.m new file mode 100644 index 000000000..58ec17b58 --- /dev/null +++ b/xc/programs/Xserver/hw/darwin/bundle/XWindow.m @@ -0,0 +1,111 @@ +/* + * NSWindow subclass for Mac OS X rootless X server + */ +/* $XFree86: xc/programs/Xserver/hw/darwin/bundle/XWindow.m,v 1.2 2001/08/01 05:34:06 torrey Exp $ */ + +#import "XWindow.h" +#import "Xserver.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; + + // fixme! + // [self setBackgroundColor:[NSColor clearColor]]; // erase transparent + [self setAlphaValue:1.0]; // draw opaque + // [self setOpaque:NO]; + + [self setAutodisplay:FALSE]; // MUST NOT autodisplay! see comment above + [self setHasShadow: !isRoot]; // All windows have shadows except the root. + + // [self setAcceptsMouseMovedEvents:YES]; // MUST be AFTER orderFront? + [self setDelegate:self]; // fixme is this still needed? + + 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; +} + +// XWindow has no overlapping subviews +-(BOOL) useOptimizedDrawing +{ + return YES; +} + +@end |