summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/darwin/bundle/XWindow.m
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/darwin/bundle/XWindow.m')
-rw-r--r--xc/programs/Xserver/hw/darwin/bundle/XWindow.m111
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