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