1/* 2 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26#import <JavaNativeFoundation/JavaNativeFoundation.h> 27#import "ThreadUtilities.h" 28#import "sun_lwawt_macosx_CWrapper_NSWindow.h" 29 30/* 31 * Class: sun_lwawt_macosx_CWrapper$NSWindow 32 * Method: makeKeyAndOrderFront 33 * Signature: (J)V 34 */ 35JNIEXPORT void JNICALL 36Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyAndOrderFront 37(JNIEnv *env, jclass cls, jlong windowPtr) 38{ 39JNF_COCOA_ENTER(env); 40 41 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 42 [ThreadUtilities performOnMainThread:@selector(makeKeyAndOrderFront:) 43 on:window 44 withObject:nil 45 waitUntilDone:NO]; 46 47JNF_COCOA_EXIT(env); 48} 49 50/* 51 * Class: sun_lwawt_macosx_CWrapper$NSWindow 52 * Method: makeKeyWindow 53 * Signature: (J)V 54 */ 55JNIEXPORT void JNICALL 56Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyWindow 57(JNIEnv *env, jclass cls, jlong windowPtr) 58{ 59JNF_COCOA_ENTER(env); 60 61 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 62 [ThreadUtilities performOnMainThread:@selector(makeKeyWindow) 63 on:window 64 withObject:nil 65 waitUntilDone:NO]; 66 67JNF_COCOA_EXIT(env); 68} 69 70/* 71 * Class: sun_lwawt_macosx_CWrapper$NSWindow 72 * Method: makeMainWindow 73 * Signature: (J)V 74 */ 75JNIEXPORT void JNICALL 76Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeMainWindow 77(JNIEnv *env, jclass cls, jlong windowPtr) 78{ 79JNF_COCOA_ENTER(env); 80 81 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 82 [ThreadUtilities performOnMainThread:@selector(makeMainWindow) 83 on:window 84 withObject:nil 85 waitUntilDone:NO]; 86 87JNF_COCOA_EXIT(env); 88} 89 90/* 91 * Class: sun_lwawt_macosx_CWrapper$NSWindow 92 * Method: canBecomeMainWindow 93 * Signature: (J)V 94 */ 95JNIEXPORT jboolean JNICALL 96Java_sun_lwawt_macosx_CWrapper_00024NSWindow_canBecomeMainWindow 97(JNIEnv *env, jclass cls, jlong windowPtr) 98{ 99 __block jboolean canBecomeMainWindow = JNI_FALSE; 100 101JNF_COCOA_ENTER(env); 102 103 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 104 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 105 canBecomeMainWindow = [window canBecomeMainWindow]; 106 }]; 107 108JNF_COCOA_EXIT(env); 109 110 return canBecomeMainWindow; 111} 112 113/* 114 * Class: sun_lwawt_macosx_CWrapper$NSWindow 115 * Method: isKeyWindow 116 * Signature: (J)Z 117 */ 118JNIEXPORT jboolean JNICALL 119Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isKeyWindow 120(JNIEnv *env, jclass cls, jlong windowPtr) 121{ 122 __block jboolean isKeyWindow = JNI_FALSE; 123 124JNF_COCOA_ENTER(env); 125 126 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 127 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 128 isKeyWindow = [window isKeyWindow]; 129 }]; 130 131JNF_COCOA_EXIT(env); 132 133 return isKeyWindow; 134} 135 136/* 137 * Class: sun_lwawt_macosx_CWrapper$NSWindow 138 * Method: orderFront 139 * Signature: (J)V 140 */ 141JNIEXPORT void JNICALL 142Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFront 143(JNIEnv *env, jclass cls, jlong windowPtr) 144{ 145JNF_COCOA_ENTER(env); 146 147 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 148 [ThreadUtilities performOnMainThread:@selector(orderFront:) 149 on:window 150 withObject:window 151 waitUntilDone:NO]; 152 153JNF_COCOA_EXIT(env); 154} 155 156/* 157 * Class: sun_lwawt_macosx_CWrapper$NSWindow 158 * Method: orderOut 159 * Signature: (J)V 160 */ 161JNIEXPORT void JNICALL 162Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderOut 163(JNIEnv *env, jclass cls, jlong windowPtr) 164{ 165JNF_COCOA_ENTER(env); 166 167 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 168 [ThreadUtilities performOnMainThread:@selector(orderOut:) 169 on:window 170 withObject:window 171 waitUntilDone:NO]; 172 173JNF_COCOA_EXIT(env); 174} 175 176/* 177 * Class: sun_lwawt_macosx_CWrapper$NSWindow 178 * Method: close 179 * Signature: (J)V 180 */ 181JNIEXPORT void JNICALL 182Java_sun_lwawt_macosx_CWrapper_00024NSWindow_close 183 (JNIEnv *env, jclass cls, jlong windowPtr) 184{ 185JNF_COCOA_ENTER(env); 186 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 187 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 188 [window close]; 189 }]; 190JNF_COCOA_EXIT(env); 191} 192 193/* 194 * Class: sun_lwawt_macosx_CWrapper$NSWindow 195 * Method: orderFrontRegardless 196 * Signature: (J)V 197 */ 198JNIEXPORT void JNICALL 199Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFrontRegardless 200(JNIEnv *env, jclass cls, jlong windowPtr) 201{ 202JNF_COCOA_ENTER(env); 203 204 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 205 [ThreadUtilities performOnMainThread:@selector(orderFrontRegardless) 206 on:window 207 withObject:nil 208 waitUntilDone:NO]; 209 210JNF_COCOA_EXIT(env); 211} 212 213/* 214 * Class: sun_lwawt_macosx_CWrapper$NSWindow 215 * Method: orderWindow 216 * Signature: (JIJ)V 217 */ 218JNIEXPORT void JNICALL 219Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderWindow 220(JNIEnv *env, jclass cls, jlong windowPtr, jint order, jlong relativeToPtr) 221{ 222JNF_COCOA_ENTER(env); 223 224 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 225 NSWindow *relativeTo = (NSWindow *)jlong_to_ptr(relativeToPtr); 226 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 227 [window orderWindow:(NSWindowOrderingMode)order relativeTo:[relativeTo windowNumber]]; 228 }]; 229 230JNF_COCOA_EXIT(env); 231} 232 233// Used for CWrapper.NSWindow.setLevel() (and level() which isn't implemented yet) 234static NSInteger LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS]; 235static void initLevels() 236{ 237 static dispatch_once_t pred; 238 239 dispatch_once(&pred, ^{ 240 LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSNormalWindowLevel] = NSNormalWindowLevel; 241 LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSFloatingWindowLevel] = NSFloatingWindowLevel; 242 LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSPopUpMenuWindowLevel] = NSPopUpMenuWindowLevel; 243 }); 244} 245 246/* 247 * Class: sun_lwawt_macosx_CWrapper$NSWindow 248 * Method: setLevel 249 * Signature: (JI)V 250 */ 251JNIEXPORT void JNICALL 252Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setLevel 253(JNIEnv *env, jclass cls, jlong windowPtr, jint level) 254{ 255JNF_COCOA_ENTER(env); 256 257 if (level >= 0 && level < sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS) { 258 initLevels(); 259 260 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 261 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 262 [window setLevel: LEVELS[level]]; 263 }]; 264 } else { 265 [JNFException raise:env as:kIllegalArgumentException reason:"unknown level"]; 266 } 267 268JNF_COCOA_EXIT(env); 269} 270 271/* 272 * Class: sun_lwawt_macosx_CWrapper$NSWindow 273 * Method: addChildWindow 274 * Signature: (JJI)V 275 */ 276JNIEXPORT void JNICALL 277Java_sun_lwawt_macosx_CWrapper_00024NSWindow_addChildWindow 278(JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr, jint order) 279{ 280JNF_COCOA_ENTER(env); 281 282 NSWindow *parent = (NSWindow *)jlong_to_ptr(parentPtr); 283 NSWindow *child = (NSWindow *)jlong_to_ptr(childPtr); 284 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 285 [parent addChildWindow:child ordered:order]; 286 }]; 287 288JNF_COCOA_EXIT(env); 289} 290 291/* 292 * Class: sun_lwawt_macosx_CWrapper$NSWindow 293 * Method: removeChildWindow 294 * Signature: (JJ)V 295 */ 296JNIEXPORT void JNICALL 297Java_sun_lwawt_macosx_CWrapper_00024NSWindow_removeChildWindow 298(JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr) 299{ 300JNF_COCOA_ENTER(env); 301 302 NSWindow *parent = (NSWindow *)jlong_to_ptr(parentPtr); 303 NSWindow *child = (NSWindow *)jlong_to_ptr(childPtr); 304 [ThreadUtilities performOnMainThread:@selector(removeChildWindow:) 305 on:parent 306 withObject:child 307 waitUntilDone:NO]; 308 309JNF_COCOA_EXIT(env); 310} 311 312/* 313 * Class: sun_lwawt_macosx_CWrapper$NSWindow 314 * Method: setAlphaValue 315 * Signature: (JF)V 316 */ 317JNIEXPORT void JNICALL 318Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setAlphaValue 319(JNIEnv *env, jclass cls, jlong windowPtr, jfloat alpha) 320{ 321JNF_COCOA_ENTER(env); 322 323 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 324 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 325 [window setAlphaValue:(CGFloat)alpha]; 326 }]; 327 328JNF_COCOA_EXIT(env); 329} 330 331/* 332 * Class: sun_lwawt_macosx_CWrapper$NSWindow 333 * Method: setOpaque 334 * Signature: (Z)V 335 */ 336JNIEXPORT void JNICALL 337Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setOpaque 338(JNIEnv *env, jclass cls, jlong windowPtr, jboolean opaque) 339{ 340JNF_COCOA_ENTER(env); 341 342 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 343 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 344 [window setOpaque:(BOOL)opaque]; 345 }]; 346 347JNF_COCOA_EXIT(env); 348} 349 350/* 351 * Class: sun_lwawt_macosx_CWrapper$NSWindow 352 * Method: setBackgroundColor 353 * Signature: (J)V 354 */ 355JNIEXPORT void JNICALL 356Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor 357(JNIEnv *env, jclass cls, jlong windowPtr, jint rgb) 358{ 359JNF_COCOA_ENTER(env); 360 361 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 362 CGFloat alpha = (((rgb >> 24) & 0xff) / 255.0); 363 CGFloat red = (((rgb >> 16) & 0xff) / 255.0); 364 CGFloat green = (((rgb >> 8) & 0xff) / 255.0); 365 CGFloat blue = (((rgb >> 0) & 0xff) / 255.0); 366 NSColor *color = [NSColor colorWithCalibratedRed:red green:green blue:blue 367 alpha:alpha]; 368 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 369 [window setBackgroundColor:color]; 370 }]; 371 372JNF_COCOA_EXIT(env); 373} 374 375/* 376 * Class: sun_lwawt_macosx_CWrapper$NSWindow 377 * Method: miniaturize 378 * Signature: (J)V 379 */ 380JNIEXPORT void JNICALL 381Java_sun_lwawt_macosx_CWrapper_00024NSWindow_miniaturize 382(JNIEnv *env, jclass cls, jlong windowPtr) 383{ 384JNF_COCOA_ENTER(env); 385 386 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 387 [ThreadUtilities performOnMainThread:@selector(miniaturize:) 388 on:window 389 withObject:nil 390 waitUntilDone:NO]; 391 392JNF_COCOA_EXIT(env); 393} 394 395/* 396 * Class: sun_lwawt_macosx_CWrapper$NSWindow 397 * Method: deminiaturize 398 * Signature: (J)V 399 */ 400JNIEXPORT void JNICALL 401Java_sun_lwawt_macosx_CWrapper_00024NSWindow_deminiaturize 402(JNIEnv *env, jclass cls, jlong windowPtr) 403{ 404JNF_COCOA_ENTER(env); 405 406 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 407 [ThreadUtilities performOnMainThread:@selector(deminiaturize:) 408 on:window 409 withObject:nil 410 waitUntilDone:NO]; 411 412JNF_COCOA_EXIT(env); 413} 414 415/* 416 * Class: sun_lwawt_macosx_CWrapper$NSWindow 417 * Method: isZoomed 418 * Signature: (J)Z 419 */ 420JNIEXPORT jboolean JNICALL 421Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isZoomed 422(JNIEnv *env, jclass cls, jlong windowPtr) 423{ 424 __block jboolean isZoomed = JNI_FALSE; 425 426JNF_COCOA_ENTER(env); 427 428 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 429 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 430 isZoomed = [window isZoomed]; 431 }]; 432 433JNF_COCOA_EXIT(env); 434 435 return isZoomed; 436} 437 438/* 439 * Class: sun_lwawt_macosx_CWrapper$NSWindow 440 * Method: zoom 441 * Signature: (J)V 442 */ 443JNIEXPORT void JNICALL 444Java_sun_lwawt_macosx_CWrapper_00024NSWindow_zoom 445(JNIEnv *env, jclass cls, jlong windowPtr) 446{ 447JNF_COCOA_ENTER(env); 448 449 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 450 [ThreadUtilities performOnMainThread:@selector(zoom:) 451 on:window 452 withObject:nil 453 waitUntilDone:NO]; 454 455JNF_COCOA_EXIT(env); 456} 457 458/* 459 * Class: sun_lwawt_macosx_CWrapper$NSWindow 460 * Method: makeFirstResponder 461 * Signature: (JJ)V 462 */ 463JNIEXPORT void JNICALL 464Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeFirstResponder 465(JNIEnv *env, jclass cls, jlong windowPtr, jlong responderPtr) 466{ 467JNF_COCOA_ENTER(env); 468 469 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 470 NSResponder *responder = (NSResponder *)jlong_to_ptr(responderPtr); 471 [ThreadUtilities performOnMainThread:@selector(makeFirstResponder:) 472 on:window 473 withObject:responder 474 waitUntilDone:NO]; 475 476JNF_COCOA_EXIT(env); 477} 478 479/* 480 * Class: sun_lwawt_macosx_CWrapper$NSView 481 * Method: addSubview 482 * Signature: (JJ)V 483 */ 484JNIEXPORT void JNICALL 485Java_sun_lwawt_macosx_CWrapper_00024NSView_addSubview 486(JNIEnv *env, jclass cls, jlong viewPtr, jlong subviewPtr) 487{ 488JNF_COCOA_ENTER(env); 489 490 NSView *view = (NSView *)jlong_to_ptr(viewPtr); 491 NSView *subview = (NSView *)jlong_to_ptr(subviewPtr); 492 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 493 [view addSubview:subview]; 494 }]; 495 496JNF_COCOA_EXIT(env); 497} 498 499/* 500 * Class: sun_lwawt_macosx_CWrapper$NSView 501 * Method: removeFromSuperview 502 * Signature: (J)V 503 */ 504JNIEXPORT void JNICALL 505Java_sun_lwawt_macosx_CWrapper_00024NSView_removeFromSuperview 506(JNIEnv *env, jclass cls, jlong viewPtr) 507{ 508JNF_COCOA_ENTER(env); 509 510 NSView *view = (NSView *)jlong_to_ptr(viewPtr); 511 [ThreadUtilities performOnMainThread:@selector(removeFromSuperview) 512 on:view 513 withObject:nil 514 waitUntilDone:NO]; 515 516JNF_COCOA_EXIT(env); 517} 518 519/* 520 * Class: sun_lwawt_macosx_CWrapper$NSView 521 * Method: setFrame 522 * Signature: (JIIII)V 523 */ 524JNIEXPORT void JNICALL 525Java_sun_lwawt_macosx_CWrapper_00024NSView_setFrame 526(JNIEnv *env, jclass cls, jlong viewPtr, jint x, jint y, jint w, jint h) 527{ 528JNF_COCOA_ENTER(env); 529 530 NSView *view = (NSView *)jlong_to_ptr(viewPtr); 531 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 532 [view setFrame:NSMakeRect(x, y, w, h)]; 533 }]; 534 535JNF_COCOA_EXIT(env); 536} 537 538/* 539 * Class: sun_lwawt_macosx_CWrapper$NSView 540 * Method: window 541 * Signature: (J)J 542 */ 543JNIEXPORT jlong JNICALL 544Java_sun_lwawt_macosx_CWrapper_00024NSView_window 545(JNIEnv *env, jclass cls, jlong viewPtr) 546{ 547 __block jlong windowPtr = 0L; 548 549JNF_COCOA_ENTER(env); 550 551 NSView *view = (NSView *)jlong_to_ptr(viewPtr); 552 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 553 windowPtr = ptr_to_jlong([view window]); 554 }]; 555 556JNF_COCOA_EXIT(env); 557 558 return windowPtr; 559} 560 561/* 562 * Class: sun_lwawt_macosx_CWrapper$NSView 563 * Method: setHidden 564 * Signature: (JZ)V 565 */ 566JNIEXPORT void JNICALL 567Java_sun_lwawt_macosx_CWrapper_00024NSView_setHidden 568(JNIEnv *env, jclass cls, jlong viewPtr, jboolean toHide) 569{ 570 JNF_COCOA_ENTER(env); 571 572 NSView *view = (NSView *)jlong_to_ptr(viewPtr); 573 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 574 [view setHidden:(BOOL)toHide]; 575 }]; 576 577 JNF_COCOA_EXIT(env); 578} 579 580/* 581 * Class: sun_lwawt_macosx_CWrapper$NSView 582 * Method: setToolTip 583 * Signature: (JLjava/lang/String;)V 584 */ 585JNIEXPORT void JNICALL 586Java_sun_lwawt_macosx_CWrapper_00024NSView_setToolTip 587(JNIEnv *env, jclass cls, jlong viewPtr, jstring msg) 588{ 589 590JNF_COCOA_ENTER(env); 591 592 NSView *view = (NSView *)jlong_to_ptr(viewPtr); 593 NSString* s = JNFJavaToNSString(env, msg); 594 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 595 [view setToolTip: s]; 596 }]; 597 598JNF_COCOA_EXIT(env); 599} 600