711e2520ad
Reviewed-by: dmarkov, iris
156 lines
4.2 KiB
Objective-C
156 lines
4.2 KiB
Objective-C
/*
|
|
* Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
#import <Cocoa/Cocoa.h>
|
|
#import <jni_util.h>
|
|
|
|
static NSWindow *testWindow;
|
|
static NSColorPanel *colorPanel;
|
|
|
|
#define JNI_COCOA_ENTER(env) \
|
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; \
|
|
@try {
|
|
|
|
#define JNI_COCOA_EXIT(env) \
|
|
} \
|
|
@catch (NSException *e) { \
|
|
NSLog(@"%@", [e callStackSymbols]); \
|
|
} \
|
|
@finally { \
|
|
[pool drain]; \
|
|
};
|
|
|
|
/*
|
|
* Pass the block to a selector of a class that extends NSObject
|
|
* There is no need to copy the block since this class always waits.
|
|
*/
|
|
@interface BlockRunner : NSObject { }
|
|
|
|
+ (void)invokeBlock:(void (^)())block;
|
|
@end
|
|
|
|
@implementation BlockRunner
|
|
|
|
+ (void)invokeBlock:(void (^)())block{
|
|
block();
|
|
}
|
|
|
|
+ (void)performBlock:(void (^)())block {
|
|
[self performSelectorOnMainThread:@selector(invokeBlock:) withObject:block waitUntilDone:YES];
|
|
}
|
|
|
|
@end
|
|
|
|
/*
|
|
* Class: TestMainKeyWindow
|
|
* Method: setup
|
|
* Signature: ()V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_TestMainKeyWindow_setup(JNIEnv *env, jclass cl)
|
|
{
|
|
JNI_COCOA_ENTER(env);
|
|
|
|
void (^block)() = ^(){
|
|
NSScreen *mainScreen = [[NSScreen screens] objectAtIndex:0];
|
|
NSRect screenFrame = [mainScreen frame];
|
|
NSRect frame = NSMakeRect(130, screenFrame.size.height - 280, 200, 100);
|
|
|
|
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 101200
|
|
NSWindowStyleMask style = NSWindowStyleMaskTitled;
|
|
#else
|
|
NSInteger style = NSTitledWindowMask;
|
|
#endif
|
|
|
|
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:style];
|
|
NSBackingStoreType bt = NSBackingStoreBuffered;
|
|
testWindow = [[[NSWindow alloc] initWithContentRect:rect styleMask:style backing:bt defer:NO] retain];
|
|
testWindow.title = @"NSWindow";
|
|
[testWindow setBackgroundColor:[NSColor blueColor]];
|
|
[testWindow makeKeyAndOrderFront:nil];
|
|
// Java coordinates are 100, 200
|
|
|
|
colorPanel = [[NSColorPanel sharedColorPanel] retain];
|
|
[colorPanel setReleasedWhenClosed: YES];
|
|
colorPanel.restorable = NO;
|
|
[colorPanel setFrame:NSMakeRect(130, screenFrame.size.height - 500, 200, 200) display:NO];
|
|
// Java coordinates are 100, 400
|
|
[colorPanel makeKeyAndOrderFront: nil];
|
|
};
|
|
|
|
if ([NSThread isMainThread]) {
|
|
block();
|
|
} else {
|
|
[BlockRunner performBlock:block];
|
|
}
|
|
|
|
JNI_COCOA_EXIT(env);
|
|
}
|
|
|
|
/*
|
|
* Class: TestMainKeyWindow
|
|
* Method: takedown
|
|
* Signature: ()V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_TestMainKeyWindow_takedown(JNIEnv *env, jclass cl)
|
|
{
|
|
JNI_COCOA_ENTER(env);
|
|
|
|
void (^block)() = ^(){
|
|
if (testWindow != nil) {
|
|
[testWindow close];
|
|
testWindow = nil;
|
|
}
|
|
if (colorPanel != nil) {
|
|
[colorPanel orderOut:nil];
|
|
colorPanel = nil;
|
|
}
|
|
};
|
|
|
|
if ([NSThread isMainThread]) {
|
|
block();
|
|
} else {
|
|
[BlockRunner performBlock:block];
|
|
}
|
|
|
|
JNI_COCOA_EXIT(env);
|
|
}
|
|
|
|
/*
|
|
* Class: TestMainKeyWindow
|
|
* Method: activateApplication
|
|
* Signature: ()V
|
|
*/
|
|
JNIEXPORT void JNICALL Java_TestMainKeyWindow_activateApplication
|
|
(JNIEnv *env, jclass cl)
|
|
{
|
|
JNI_COCOA_ENTER(env);
|
|
|
|
void (^block)() = ^(){
|
|
[NSApp activateIgnoringOtherApps:YES];
|
|
};
|
|
|
|
[BlockRunner performBlock:block];
|
|
|
|
JNI_COCOA_EXIT(env);
|
|
}
|