aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/devdraw
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/devdraw')
-rw-r--r--src/cmd/devdraw/cocoa-screen-metal.m25
-rw-r--r--src/cmd/devdraw/cocoa-screen.m6
-rw-r--r--src/cmd/devdraw/cocoa-srv.c8
-rw-r--r--src/cmd/devdraw/x11-srv.c1
4 files changed, 37 insertions, 3 deletions
diff --git a/src/cmd/devdraw/cocoa-screen-metal.m b/src/cmd/devdraw/cocoa-screen-metal.m
index 049d1c5c..5fc03172 100644
--- a/src/cmd/devdraw/cocoa-screen-metal.m
+++ b/src/cmd/devdraw/cocoa-screen-metal.m
@@ -153,6 +153,7 @@ threadmain(int argc, char **argv)
id<MTLLibrary> library;
MTLRenderPipelineDescriptor *pipelineDesc;
NSError *error;
+ NSArray *allDevices;
const NSWindowStyleMask Winstyle = NSWindowStyleMaskTitled
| NSWindowStyleMaskClosable
@@ -197,8 +198,18 @@ threadmain(int argc, char **argv)
[win setContentView:myContent];
[myContent setWantsLayer:YES];
[myContent setLayerContentsRedrawPolicy:NSViewLayerContentsRedrawOnSetNeedsDisplay];
-
- device = MTLCreateSystemDefaultDevice();
+
+ device = nil;
+ allDevices = MTLCopyAllDevices();
+ for(id mtlDevice in allDevices) {
+ if ([mtlDevice isLowPower] && ![mtlDevice isRemovable]) {
+ device = mtlDevice;
+ break;
+ }
+ }
+ if(!device)
+ device = MTLCreateSystemDefaultDevice();
+
commandQueue = [device newCommandQueue];
layer = (DrawLayer *)[myContent layer];
@@ -373,6 +384,11 @@ struct Cursors {
return YES;
}
+- (void)windowDidBecomeKey:(id)arg
+{
+ [myContent sendmouse:0];
+}
+
@end
@implementation DevDrawView
@@ -841,7 +857,6 @@ keycvt(uint code)
{
switch(code){
case '\r': return '\n';
- case '\b': return 127;
case 127: return '\b';
case NSUpArrowFunctionKey: return Kup;
case NSDownArrowFunctionKey: return Kdown;
@@ -982,6 +997,10 @@ void
_flushmemscreen(Rectangle r)
{
LOG(@"_flushmemscreen(%d,%d,%d,%d)", r.min.x, r.min.y, Dx(r), Dy(r));
+ if(!rectinrect(r, Rect(0, 0, texture.width, texture.height))){
+ LOG(@"Rectangle is out of bounds, return.");
+ return;
+ }
@autoreleasepool{
[texture
diff --git a/src/cmd/devdraw/cocoa-screen.m b/src/cmd/devdraw/cocoa-screen.m
index 2b804c2f..9b404c67 100644
--- a/src/cmd/devdraw/cocoa-screen.m
+++ b/src/cmd/devdraw/cocoa-screen.m
@@ -541,6 +541,11 @@ _flushmemscreen(Rectangle r)
return;
rect = NSMakeRect(r.min.x, r.min.y, Dx(r), Dy(r));
+
+ // This can get blocked behind responding to mouse events,
+ // which need to acquire the zlock, so let go of it during
+ // the flush. Perhaps the waitUntilDone:YES is wrong?
+ zunlock();
[appdelegate
performSelectorOnMainThread:@selector(callflushimg:)
withObject:[NSValue valueWithRect:rect]
@@ -548,6 +553,7 @@ _flushmemscreen(Rectangle r)
modes:[NSArray arrayWithObjects:
NSRunLoopCommonModes,
@"waiting image", nil]];
+ zlock();
}
static void drawimg(NSRect, uint);
diff --git a/src/cmd/devdraw/cocoa-srv.c b/src/cmd/devdraw/cocoa-srv.c
index 329dd71f..c1cf5983 100644
--- a/src/cmd/devdraw/cocoa-srv.c
+++ b/src/cmd/devdraw/cocoa-srv.c
@@ -165,6 +165,14 @@ runmsg(Wsysmsg *m)
if(m->arrowcursor)
setcursor(nil, nil);
else
+ setcursor(&m->cursor, nil);
+ replymsg(m);
+ break;
+
+ case Tcursor2:
+ if(m->arrowcursor)
+ setcursor(nil, nil);
+ else
setcursor(&m->cursor, &m->cursor2);
replymsg(m);
break;
diff --git a/src/cmd/devdraw/x11-srv.c b/src/cmd/devdraw/x11-srv.c
index 17563f41..81416482 100644
--- a/src/cmd/devdraw/x11-srv.c
+++ b/src/cmd/devdraw/x11-srv.c
@@ -332,6 +332,7 @@ runmsg(Wsysmsg *m)
break;
case Tcursor:
+ case Tcursor2:
if(m->arrowcursor)
_xsetcursor(nil);
else