URI: 
       tdevdraw: fix screen grabber, allocation warning - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 7479a49b90c0f5ece48b5fadcb5f5340512e5a98
   DIR parent c49b45ed3e1f7d163de0ffa4000b74e6b3999a11
  HTML Author: David Jeannot <djeannot24@gmail.com>
       Date:   Mon,  3 Oct 2011 18:16:09 -0400
       
       devdraw: fix screen grabber, allocation warning
       
       R=rsc
       CC=plan9port.codebot
       http://codereview.appspot.com/5170041
       
       Diffstat:
         M src/cmd/devdraw/cocoa-screen.m      |     175 ++++++++++++++++++++-----------
       
       1 file changed, 113 insertions(+), 62 deletions(-)
       ---
   DIR diff --git a/src/cmd/devdraw/cocoa-screen.m b/src/cmd/devdraw/cocoa-screen.m
       t@@ -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]];
       t@@ -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);
       t@@ -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);
        
       t@@ -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;
       t@@ -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
       t@@ -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
       t@@ -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];
       t@@ -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)
        {
       t@@ -315,7 +318,9 @@ static void
        resize(void)
        {
                makeimg();
       -        sendmouse(1);
       +
       +        mouseresized = 1;
       +        sendmouse();
        }
        
        void
       t@@ -332,6 +337,8 @@ _flushmemscreen(Rectangle r)
                        waitUntilDone:YES];
        }
        
       +static void drawresizehandle(void);
       +
        static void
        drawimg(void)
        {
       t@@ -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;
                }
       t@@ -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*);
       t@@ -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;
       t@@ -599,7 +653,7 @@ getmouse(NSEvent *e)
                default:
                        panic("getmouse: unexpected event type");
                }
       -        sendmouse(0);
       +        sendmouse();
        }
        
        static void sendswipe(int, int);
       t@@ -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;
       t@@ -859,8 +910,6 @@ setmouse(Point p)
        
        //        race condition
                in.mpos = p;
       -
       -//NSLog(@"setmouse %d %d", p.x, p.y);
        }
        
        static void
       t@@ -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)
       t@@ -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
       t@@ -990,7 +1043,6 @@ putsnarf(char *s)
                NSArray *t;
                NSPasteboard *pb;
                NSString *str;
       -        int r;
        
                if(strlen(s) >= SnarfSize)
                        return;
       t@@ -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
       t@@ -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