aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Jeannot <djeannot24@gmail.com>2011-10-03 18:16:09 -0400
committerRuss Cox <rsc@swtch.com>2011-10-03 18:16:09 -0400
commit7479a49b90c0f5ece48b5fadcb5f5340512e5a98 (patch)
tree3041e6b8b7e5ea235b8e578c0694fa72f07c8954
parentc49b45ed3e1f7d163de0ffa4000b74e6b3999a11 (diff)
downloadplan9port-7479a49b90c0f5ece48b5fadcb5f5340512e5a98.tar.gz
plan9port-7479a49b90c0f5ece48b5fadcb5f5340512e5a98.tar.bz2
plan9port-7479a49b90c0f5ece48b5fadcb5f5340512e5a98.zip
devdraw: fix screen grabber, allocation warning
R=rsc CC=plan9port.codebot http://codereview.appspot.com/5170041
-rw-r--r--src/cmd/devdraw/cocoa-screen.m175
1 files changed, 113 insertions, 62 deletions
diff --git a/src/cmd/devdraw/cocoa-screen.m b/src/cmd/devdraw/cocoa-screen.m
index fd0b4006..57734f1e 100644
--- a/src/cmd/devdraw/cocoa-screen.m
+++ b/src/cmd/devdraw/cocoa-screen.m
@@ -72,6 +72,9 @@ main(int argc, char **argv)
if(usecopygesture)
reimplementswipe = 1;
+ if(OSX_VERSION < 100700)
+ [NSAutoreleasePool new];
+
[NSApplication sharedApplication];
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
[NSApp setDelegate:[appdelegate new]];
@@ -81,18 +84,17 @@ main(int argc, char **argv)
struct {
NSWindow *std;
- NSWindow *ofs;
+ NSWindow *ofs; /* old fullscreen */
NSWindow *p;
NSView *content;
Cursor *cursor;
- NSString *title;
- QLock titlel;
char *rectstr;
NSBitmapImageRep *img;
NSRect flushrect;
int needflush;
} win;
+static void autohide(int);
static void drawimg(void);
static void flushwin(void);
static void getmousepos(void);
@@ -100,7 +102,7 @@ static void makeicon(void);
static void makemenu(void);
static void makewin(void);
static void resize(void);
-static void sendmouse(int);
+static void sendmouse(void);
static void setcursor0(void);
static void togglefs(void);
@@ -116,12 +118,12 @@ static void togglefs(void);
- (void)windowDidBecomeKey:(id)arg
{
getmousepos();
- sendmouse(0);
+ sendmouse();
}
- (void)windowDidResize:(id)arg
{
getmousepos();
- sendmouse(0);
+ sendmouse();
if([win.p inLiveResize])
return;
@@ -142,8 +144,9 @@ static void togglefs(void);
}
- (void)windowDidChangeScreen:(id)arg
{
+ if(win.p == win.ofs)
+ autohide(1);
[win.ofs setFrame:[[win.p screen] frame] display:YES];
-
resize();
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(id)arg
@@ -204,6 +207,7 @@ attachscreen(char *label, char *winsize)
}
- (BOOL)canBecomeKeyWindow
{
+ // just keyboard? or all inputs?
return YES; // else no keyboard focus with NSBorderlessWindowMask
}
@end
@@ -245,8 +249,6 @@ makewin(void)
[win.std center];
#if OSX_VERSION >= 100700
[win.std setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
-#else
- [win.std setShowsResizeIndicator:YES];
#endif
[win.std setMinSize:NSMakeSize(128,128)];
[win.std setAcceptsMouseMovedEvents:YES];
@@ -266,6 +268,7 @@ makewin(void)
[win.p makeKeyAndOrderFront:nil];
}
+// explain the bottom-corner bug here (osx-screen-carbon.m:/^eresized)
static Memimage*
makeimg(void)
{
@@ -315,7 +318,9 @@ static void
resize(void)
{
makeimg();
- sendmouse(1);
+
+ mouseresized = 1;
+ sendmouse();
}
void
@@ -332,6 +337,8 @@ _flushmemscreen(Rectangle r)
waitUntilDone:YES];
}
+static void drawresizehandle(void);
+
static void
drawimg(void)
{
@@ -352,6 +359,10 @@ drawimg(void)
[win.img drawInRect:dr fromRect:sr
operation:NSCompositeCopy fraction:1
respectFlipped:YES hints:nil];
+
+ if(OSX_VERSION<100700 && win.p==win.std)
+ drawresizehandle();
+
[win.content unlockFocus];
win.needflush = 1;
}
@@ -366,6 +377,49 @@ flushwin(void)
}
}
+enum
+{
+ Pixel = 1,
+ Handlesize = 16*Pixel,
+};
+
+static void
+drawresizehandle(void)
+{
+ NSBezierPath *p;
+ NSRect r;
+ NSSize size;
+ Point o;
+
+ size = [win.img size];
+ o = Pt(size.width+1-Handlesize, size.height+1-Handlesize);
+ r = NSMakeRect(o.x, o.y, Handlesize, Handlesize);
+ if(NSIntersectsRect(r, win.flushrect) == 0)
+ return;
+
+ [[NSColor whiteColor] setFill];
+ [[NSColor lightGrayColor] setStroke];
+
+ [NSBezierPath fillRect:r];
+ [NSBezierPath strokeRect:r];
+
+
+ [[NSColor darkGrayColor] setStroke];
+
+ p = [NSBezierPath bezierPath];
+
+ [p moveToPoint:NSMakePoint(o.x+4, o.y+13)];
+ [p lineToPoint:NSMakePoint(o.x+13, o.y+4)];
+
+ [p moveToPoint:NSMakePoint(o.x+8, o.y+13)];
+ [p lineToPoint:NSMakePoint(o.x+13, o.y+8)];
+
+ [p moveToPoint:NSMakePoint(o.x+12, o.y+13)];
+ [p lineToPoint:NSMakePoint(o.x+13, o.y+12)];
+
+ [p stroke];
+}
+
static void getgesture(NSEvent*);
static void getkeyboard(NSEvent*);
static void getmouse(NSEvent*);
@@ -519,7 +573,7 @@ getkeyboard(NSEvent *e)
in.kbuttons |= 2;
if(m & NSCommandKeyMask)
in.kbuttons |= 4;
- sendmouse(0);
+ sendmouse();
}else
if(m & NSAlternateKeyMask){
in.kalting = 1;
@@ -599,7 +653,7 @@ getmouse(NSEvent *e)
default:
panic("getmouse: unexpected event type");
}
- sendmouse(0);
+ sendmouse();
}
static void sendswipe(int, int);
@@ -803,32 +857,29 @@ static void
sendclick(int b)
{
in.mbuttons = b;
- sendmouse(0);
+ sendmouse();
in.mbuttons = 0;
- sendmouse(0);
+ sendmouse();
}
static void
sendchord(int b1, int b2)
{
in.mbuttons = b1;
- sendmouse(0);
+ sendmouse();
in.mbuttons |= b2;
- sendmouse(0);
+ sendmouse();
in.mbuttons = 0;
- sendmouse(0);
+ sendmouse();
}
static void
-sendmouse(int resized)
+sendmouse(void)
{
NSSize size;
int b;
size = [win.img size];
-
- if(resized)
- mouseresized = 1;
mouserect = Rect(0, 0, size.width, size.height);
b = in.kbuttons | in.mbuttons | in.mscroll;
@@ -859,8 +910,6 @@ setmouse(Point p)
// race condition
in.mpos = p;
-
-//NSLog(@"setmouse %d %d", p.x, p.y);
}
static void
@@ -873,31 +922,47 @@ togglefs(void)
}
#endif
NSScreen *screen;
- int opt;
+ int willfs;
screen = [win.p screen];
+
+ willfs = !NSEqualRects([win.p frame], [screen frame]);
+
+ autohide(willfs);
+
[win.content retain];
[win.p orderOut:nil];
[win.p setContentView:nil];
- if(NSEqualRects([win.p frame], [screen frame])){
- opt = NSApplicationPresentationDefault;
- [NSApp setPresentationOptions:opt];
- win.p = win.std;
- }else{
- opt = NSApplicationPresentationAutoHideDock
- | NSApplicationPresentationAutoHideMenuBar;
- [NSApp setPresentationOptions:opt];
+
+ if(willfs)
win.p = win.ofs;
- }
+ else
+ win.p = win.std;
+
[win.p setContentView:win.content];
[win.p makeKeyAndOrderFront:nil];
[win.content release];
+
resize();
+}
- qlock(&win.titlel);
- [win.p setTitle:win.title];
- qunlock(&win.titlel);
-}
+static void
+autohide(int set)
+{
+ NSScreen *s,*s0;
+ int opt;
+
+ s = [win.p screen];
+ s0 = [[NSScreen screens] objectAtIndex:0];
+
+ if(set && s==s0)
+ opt = NSApplicationPresentationAutoHideDock
+ | NSApplicationPresentationAutoHideMenuBar;
+ else
+ opt = NSApplicationPresentationDefault;
+
+ [NSApp setPresentationOptions:opt];
+}
// Rewrite this function
// See ./osx-delegate.m implementation (NSLocalizedString)
@@ -962,26 +1027,14 @@ getsnarf(void)
pb = [NSPasteboard generalPasteboard];
-// use NSPasteboardTypeString instead of NSStringPboardType
qlock(&snarfl);
- s = [pb stringForType:NSStringPboardType];
+ s = [pb stringForType:NSPasteboardTypeString];
qunlock(&snarfl);
-// change the pastebuffer here to see if s is
-// altered. Move the lock accordingly.
-
if(s)
return strdup((char*)[s UTF8String]);
else
return nil;
-
-// "you should periodically drain and create
-// autorelease pools (like the Application Kit does
-// on the main thread); otherwise, autoreleased
-// objects accumulate and your memory footprint
-// grows."
-// Should we do it here?
-// Verify that we need it before.
}
void
@@ -990,7 +1043,6 @@ putsnarf(char *s)
NSArray *t;
NSPasteboard *pb;
NSString *str;
- int r;
if(strlen(s) >= SnarfSize)
return;
@@ -1001,26 +1053,25 @@ putsnarf(char *s)
qlock(&snarfl);
[pb declareTypes:t owner:nil];
- r = [pb setString:str forType:NSPasteboardTypeString];
+ [pb setString:str forType:NSPasteboardTypeString];
qunlock(&snarfl);
- if(!r)
- NSLog(@"putsnarf: setString failed");
+ [str release];
}
void
kicklabel(char *label)
{
+ NSString *s;
+
if(label == nil)
return;
- qlock(&win.titlel);
- if(win.title)
- [win.title release];
- win.title = [[NSString alloc] initWithUTF8String:label];
- [win.p setTitle:win.title];
- [[NSApp dockTile] setBadgeLabel:win.title];
- qunlock(&win.titlel);
+ s = [[NSString alloc] initWithUTF8String:label];
+ [win.std setTitle:s];
+ [win.ofs setTitle:s];
+ [[NSApp dockTile] setBadgeLabel:s];
+ [s release];
}
void
@@ -1028,7 +1079,7 @@ setcursor(Cursor *cursor)
{
win.cursor = cursor;
-// cursor change only if main thread
+// no cursor change unless in main thread
[appdelegate
performSelectorOnMainThread:@selector(callsetcursor0:)
withObject:nil