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