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 */ 35 JNIEXPORT void JNICALL 36 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyAndOrderFront 37 (JNIEnv *env, jclass cls, jlong windowPtr) 38 { 39 JNF_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 47 JNF_COCOA_EXIT(env); 48 } 49 50 /* 51 * Class: sun_lwawt_macosx_CWrapper$NSWindow 52 * Method: makeKeyWindow 53 * Signature: (J)V 54 */ 55 JNIEXPORT void JNICALL 56 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyWindow 57 (JNIEnv *env, jclass cls, jlong windowPtr) 58 { 59 JNF_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 67 JNF_COCOA_EXIT(env); 68 } 69 70 /* 71 * Class: sun_lwawt_macosx_CWrapper$NSWindow 72 * Method: makeMainWindow 73 * Signature: (J)V 74 */ 75 JNIEXPORT void JNICALL 76 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeMainWindow 77 (JNIEnv *env, jclass cls, jlong windowPtr) 78 { 79 JNF_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 87 JNF_COCOA_EXIT(env); 88 } 89 90 /* 91 * Class: sun_lwawt_macosx_CWrapper$NSWindow 92 * Method: canBecomeMainWindow 93 * Signature: (J)V 94 */ 95 JNIEXPORT jboolean JNICALL 96 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_canBecomeMainWindow 97 (JNIEnv *env, jclass cls, jlong windowPtr) 98 { 99 __block jboolean canBecomeMainWindow = JNI_FALSE; 100 101 JNF_COCOA_ENTER(env); 102 103 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 104 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 105 canBecomeMainWindow = [window canBecomeMainWindow]; 106 }]; 107 108 JNF_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 */ 118 JNIEXPORT jboolean JNICALL 119 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isKeyWindow 120 (JNIEnv *env, jclass cls, jlong windowPtr) 121 { 122 __block jboolean isKeyWindow = JNI_FALSE; 123 124 JNF_COCOA_ENTER(env); 125 126 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 127 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 128 isKeyWindow = [window isKeyWindow]; 129 }]; 130 131 JNF_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 */ 141 JNIEXPORT void JNICALL 142 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFront 143 (JNIEnv *env, jclass cls, jlong windowPtr) 144 { 145 JNF_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 153 JNF_COCOA_EXIT(env); 154 } 155 156 /* 157 * Class: sun_lwawt_macosx_CWrapper$NSWindow 158 * Method: orderOut 159 * Signature: (J)V 160 */ 161 JNIEXPORT void JNICALL 162 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderOut 163 (JNIEnv *env, jclass cls, jlong windowPtr) 164 { 165 JNF_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 173 JNF_COCOA_EXIT(env); 174 } 175 176 /* 177 * Class: sun_lwawt_macosx_CWrapper$NSWindow 178 * Method: close 179 * Signature: (J)V 180 */ 181 JNIEXPORT void JNICALL 182 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_close 183 (JNIEnv *env, jclass cls, jlong windowPtr) 184 { 185 JNF_COCOA_ENTER(env); 186 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 187 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 188 [window close]; 189 }]; 190 JNF_COCOA_EXIT(env); 191 } 192 193 /* 194 * Class: sun_lwawt_macosx_CWrapper$NSWindow 195 * Method: orderFrontRegardless 196 * Signature: (J)V 197 */ 198 JNIEXPORT void JNICALL 199 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFrontRegardless 200 (JNIEnv *env, jclass cls, jlong windowPtr) 201 { 202 JNF_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 210 JNF_COCOA_EXIT(env); 211 } 212 213 /* 214 * Class: sun_lwawt_macosx_CWrapper$NSWindow 215 * Method: orderWindow 216 * Signature: (JIJ)V 217 */ 218 JNIEXPORT void JNICALL 219 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderWindow 220 (JNIEnv *env, jclass cls, jlong windowPtr, jint order, jlong relativeToPtr) 221 { 222 JNF_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 230 JNF_COCOA_EXIT(env); 231 } 232 233 // Used for CWrapper.NSWindow.setLevel() (and level() which isn't implemented yet) 234 static NSInteger LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS]; 235 static 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 */ 251 JNIEXPORT void JNICALL 252 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setLevel 253 (JNIEnv *env, jclass cls, jlong windowPtr, jint level) 254 { 255 JNF_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 268 JNF_COCOA_EXIT(env); 269 } 270 271 /* 272 * Class: sun_lwawt_macosx_CWrapper$NSWindow 273 * Method: addChildWindow 274 * Signature: (JJI)V 275 */ 276 JNIEXPORT void JNICALL 277 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_addChildWindow 278 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr, jint order) 279 { 280 JNF_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 288 JNF_COCOA_EXIT(env); 289 } 290 291 /* 292 * Class: sun_lwawt_macosx_CWrapper$NSWindow 293 * Method: removeChildWindow 294 * Signature: (JJ)V 295 */ 296 JNIEXPORT void JNICALL 297 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_removeChildWindow 298 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr) 299 { 300 JNF_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 309 JNF_COCOA_EXIT(env); 310 } 311 312 /* 313 * Class: sun_lwawt_macosx_CWrapper$NSWindow 314 * Method: setAlphaValue 315 * Signature: (JF)V 316 */ 317 JNIEXPORT void JNICALL 318 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setAlphaValue 319 (JNIEnv *env, jclass cls, jlong windowPtr, jfloat alpha) 320 { 321 JNF_COCOA_ENTER(env); 322 323 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 324 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 325 [window setAlphaValue:(CGFloat)alpha]; 326 }]; 327 328 JNF_COCOA_EXIT(env); 329 } 330 331 /* 332 * Class: sun_lwawt_macosx_CWrapper$NSWindow 333 * Method: setOpaque 334 * Signature: (Z)V 335 */ 336 JNIEXPORT void JNICALL 337 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setOpaque 338 (JNIEnv *env, jclass cls, jlong windowPtr, jboolean opaque) 339 { 340 JNF_COCOA_ENTER(env); 341 342 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 343 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 344 [window setOpaque:(BOOL)opaque]; 345 }]; 346 347 JNF_COCOA_EXIT(env); 348 } 349 350 /* 351 * Class: sun_lwawt_macosx_CWrapper$NSWindow 352 * Method: setBackgroundColor 353 * Signature: (J)V 354 */ 355 JNIEXPORT void JNICALL 356 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor 357 (JNIEnv *env, jclass cls, jlong windowPtr, jint rgb) 358 { 359 JNF_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 372 JNF_COCOA_EXIT(env); 373 } 374 375 /* 376 * Class: sun_lwawt_macosx_CWrapper$NSWindow 377 * Method: miniaturize 378 * Signature: (J)V 379 */ 380 JNIEXPORT void JNICALL 381 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_miniaturize 382 (JNIEnv *env, jclass cls, jlong windowPtr) 383 { 384 JNF_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 392 JNF_COCOA_EXIT(env); 393 } 394 395 /* 396 * Class: sun_lwawt_macosx_CWrapper$NSWindow 397 * Method: deminiaturize 398 * Signature: (J)V 399 */ 400 JNIEXPORT void JNICALL 401 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_deminiaturize 402 (JNIEnv *env, jclass cls, jlong windowPtr) 403 { 404 JNF_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 412 JNF_COCOA_EXIT(env); 413 } 414 415 /* 416 * Class: sun_lwawt_macosx_CWrapper$NSWindow 417 * Method: isZoomed 418 * Signature: (J)Z 419 */ 420 JNIEXPORT jboolean JNICALL 421 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isZoomed 422 (JNIEnv *env, jclass cls, jlong windowPtr) 423 { 424 __block jboolean isZoomed = JNI_FALSE; 425 426 JNF_COCOA_ENTER(env); 427 428 NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr); 429 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 430 isZoomed = [window isZoomed]; 431 }]; 432 433 JNF_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 */ 443 JNIEXPORT void JNICALL 444 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_zoom 445 (JNIEnv *env, jclass cls, jlong windowPtr) 446 { 447 JNF_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 455 JNF_COCOA_EXIT(env); 456 } 457 458 /* 459 * Class: sun_lwawt_macosx_CWrapper$NSWindow 460 * Method: makeFirstResponder 461 * Signature: (JJ)V 462 */ 463 JNIEXPORT void JNICALL 464 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeFirstResponder 465 (JNIEnv *env, jclass cls, jlong windowPtr, jlong responderPtr) 466 { 467 JNF_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 476 JNF_COCOA_EXIT(env); 477 } 478 479 /* 480 * Class: sun_lwawt_macosx_CWrapper$NSView 481 * Method: addSubview 482 * Signature: (JJ)V 483 */ 484 JNIEXPORT void JNICALL 485 Java_sun_lwawt_macosx_CWrapper_00024NSView_addSubview 486 (JNIEnv *env, jclass cls, jlong viewPtr, jlong subviewPtr) 487 { 488 JNF_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 496 JNF_COCOA_EXIT(env); 497 } 498 499 /* 500 * Class: sun_lwawt_macosx_CWrapper$NSView 501 * Method: removeFromSuperview 502 * Signature: (J)V 503 */ 504 JNIEXPORT void JNICALL 505 Java_sun_lwawt_macosx_CWrapper_00024NSView_removeFromSuperview 506 (JNIEnv *env, jclass cls, jlong viewPtr) 507 { 508 JNF_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 516 JNF_COCOA_EXIT(env); 517 } 518 519 /* 520 * Class: sun_lwawt_macosx_CWrapper$NSView 521 * Method: setFrame 522 * Signature: (JIIII)V 523 */ 524 JNIEXPORT void JNICALL 525 Java_sun_lwawt_macosx_CWrapper_00024NSView_setFrame 526 (JNIEnv *env, jclass cls, jlong viewPtr, jint x, jint y, jint w, jint h) 527 { 528 JNF_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 535 JNF_COCOA_EXIT(env); 536 } 537 538 /* 539 * Class: sun_lwawt_macosx_CWrapper$NSView 540 * Method: window 541 * Signature: (J)J 542 */ 543 JNIEXPORT jlong JNICALL 544 Java_sun_lwawt_macosx_CWrapper_00024NSView_window 545 (JNIEnv *env, jclass cls, jlong viewPtr) 546 { 547 __block jlong windowPtr = 0L; 548 549 JNF_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 556 JNF_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 */ 566 JNIEXPORT void JNICALL 567 Java_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 */ 585 JNIEXPORT void JNICALL 586 Java_sun_lwawt_macosx_CWrapper_00024NSView_setToolTip 587 (JNIEnv *env, jclass cls, jlong viewPtr, jstring msg) 588 { 589 590 JNF_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 598 JNF_COCOA_EXIT(env); 599 }