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 "common.h"
  27 #import "com_sun_glass_ui_View.h"
  28 #import "com_sun_glass_ui_mac_MacView.h"
  29 #import "com_sun_glass_ui_View_Capability.h"
  30 #import "com_sun_glass_ui_Clipboard.h"
  31 #import "com_sun_glass_events_ViewEvent.h"
  32 
  33 #import "GlassMacros.h"
  34 #import "GlassWindow.h"
  35 #import "GlassView3D.h"
  36 #import "GlassHelper.h"
  37 
  38 //#define VERBOSE
  39 #ifndef VERBOSE
  40     #define LOG(MSG, ...)
  41 #else
  42     #define LOG(MSG, ...) GLASS_LOG(MSG, ## __VA_ARGS__);
  43 #endif
  44 
  45 //#define FORCE_NOISE
  46 #ifdef FORCE_NOISE
  47 static inline void *_GenerateNoise(int width, int height)
  48 {
  49     static int *pixels = NULL;
  50     pixels = realloc(pixels, width*height*4);
  51     
  52     int *src = pixels;
  53     for (int i=0; i<width*height; i++)
  54     {
  55         *src++ = random();
  56     }
  57     
  58     return (void*)pixels;
  59 }
  60 #endif
  61 
  62 static inline NSView<GlassView>* getGlassView(JNIEnv *env, jlong jPtr)
  63 {
  64     assert(jPtr != 0L);
  65 
  66     return (NSView<GlassView>*)jlong_to_ptr(jPtr);
  67 }
  68 
  69 #pragma mark --- JNI
  70 
  71 /*
  72  * Class:     com_sun_glass_ui_mac_MacView
  73  * Method:    _initIDs
  74  * Signature: ()V
  75  */
  76 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1initIDs
  77 (JNIEnv *env, jclass jClass)
  78 {
  79     LOG("Java_com_sun_glass_ui_mac_MacView__1initIDs");
  80     
  81     if (jViewClass == NULL)
  82     {
  83         jViewClass = (*env)->NewGlobalRef(env, jClass);
  84     }
  85     
  86     if (jIntegerClass == NULL)
  87     {
  88         jclass jcls = (*env)->FindClass(env, "java/lang/Integer");
  89         if ((*env)->ExceptionCheck(env)) return;
  90         jIntegerClass = (*env)->NewGlobalRef(env, jcls);
  91     }
  92     
  93     if (jMapClass == NULL)
  94     {
  95         jclass jcls = (*env)->FindClass(env, "java/util/Map");
  96         if ((*env)->ExceptionCheck(env)) return;
  97         jMapClass = (*env)->NewGlobalRef(env, jcls);
  98     }
  99     
 100     if (jBooleanClass == NULL)
 101     {
 102         jclass jcls = (*env)->FindClass(env, "java/lang/Boolean");
 103         if ((*env)->ExceptionCheck(env)) return;
 104         jBooleanClass = (*env)->NewGlobalRef(env, jcls);
 105     }
 106     
 107     if (jViewNotifyEvent == NULL)
 108     {
 109         jViewNotifyEvent = (*env)->GetMethodID(env, jViewClass, "notifyView", "(I)V");
 110         if ((*env)->ExceptionCheck(env)) return;
 111     }
 112     
 113     if (jViewNotifyRepaint == NULL)
 114     {
 115         jViewNotifyRepaint = (*env)->GetMethodID(env, jViewClass, "notifyRepaint", "(IIII)V");
 116         if ((*env)->ExceptionCheck(env)) return;
 117     }
 118     
 119     if (jViewNotifyResize == NULL)
 120     {
 121         jViewNotifyResize = (*env)->GetMethodID(env, jViewClass, "notifyResize", "(II)V");
 122         if ((*env)->ExceptionCheck(env)) return;
 123     }
 124     
 125     if (jViewNotifyKey == NULL)
 126     {
 127         jViewNotifyKey = (*env)->GetMethodID(env, jViewClass, "notifyKey", "(II[CI)V");
 128         if ((*env)->ExceptionCheck(env)) return;
 129     }
 130     
 131     if (jViewNotifyMenu == NULL)
 132     {
 133         jViewNotifyMenu = (*env)->GetMethodID(env, jViewClass, "notifyMenu", "(IIIIZ)V");
 134         if ((*env)->ExceptionCheck(env)) return;
 135     }
 136     
 137     if (jViewNotifyMouse == NULL)
 138     {
 139         jViewNotifyMouse = (*env)->GetMethodID(env, jViewClass, "notifyMouse", "(IIIIIIIZZ)V");
 140         if ((*env)->ExceptionCheck(env)) return;
 141     }
 142     
 143     if (jViewNotifyInputMethod == NULL)
 144     {
 145         jViewNotifyInputMethod = (*env)->GetMethodID(env, jViewClass, "notifyInputMethod", "(Ljava/lang/String;[I[I[BIII)V");
 146         if ((*env)->ExceptionCheck(env)) return;
 147     }
 148     
 149     if (jViewNotifyInputMethodMac == NULL)
 150     {
 151         jclass jMacViewClass = [GlassHelper ClassForName:"com.sun.glass.ui.mac.MacView" withEnv:env];
 152         jViewNotifyInputMethodMac = (*env)->GetMethodID(env, jMacViewClass, "notifyInputMethodMac", "(Ljava/lang/String;III)V");
 153         if ((*env)->ExceptionCheck(env)) return;
 154     }
 155     
 156     if(jViewNotifyInputMethodCandidatePosRequest == NULL)
 157     {
 158         jViewNotifyInputMethodCandidatePosRequest = (*env)->GetMethodID(env, jViewClass, "notifyInputMethodCandidatePosRequest", "(I)[D");
 159         if ((*env)->ExceptionCheck(env)) return;
 160     }
 161     
 162     if (jViewNotifyDragEnter == NULL)
 163     {
 164         jViewNotifyDragEnter = (*env)->GetMethodID(env, jViewClass, "notifyDragEnter", "(IIIII)I");
 165         if ((*env)->ExceptionCheck(env)) return;
 166     }
 167     
 168     if (jViewNotifyDragOver == NULL)
 169     {
 170         jViewNotifyDragOver = (*env)->GetMethodID(env, jViewClass, "notifyDragOver", "(IIIII)I");
 171         if ((*env)->ExceptionCheck(env)) return;
 172     }
 173     
 174     if (jViewNotifyDragLeave == NULL)
 175     {
 176         jViewNotifyDragLeave = (*env)->GetMethodID(env, jViewClass, "notifyDragLeave", "()V");
 177         if ((*env)->ExceptionCheck(env)) return;
 178     }
 179     
 180     if (jViewNotifyDragDrop == NULL)
 181     {
 182         jViewNotifyDragDrop = (*env)->GetMethodID(env, jViewClass, "notifyDragDrop", "(IIIII)I");
 183         if ((*env)->ExceptionCheck(env)) return;
 184     }
 185     
 186     if (jViewNotifyDragEnd == NULL)
 187     {
 188         jViewNotifyDragEnd = (*env)->GetMethodID(env, jViewClass, "notifyDragEnd", "(I)V");
 189         if ((*env)->ExceptionCheck(env)) return;
 190     }
 191 
 192     if (jViewGetAccessible == NULL)
 193     {
 194         jViewGetAccessible = (*env)->GetMethodID(env, jViewClass, "getAccessible", "()J");
 195         if ((*env)->ExceptionCheck(env)) return;
 196     }
 197     
 198     if (jMapGetMethod == NULL)
 199     {
 200         jMapGetMethod = (*env)->GetMethodID(env, jMapClass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
 201         if ((*env)->ExceptionCheck(env)) return;
 202     }
 203     
 204     if (jBooleanValueMethod == NULL)
 205     {
 206         jBooleanValueMethod = (*env)->GetMethodID(env, jBooleanClass, "booleanValue", "()Z");
 207         if ((*env)->ExceptionCheck(env)) return;
 208     }
 209     
 210     if (jIntegerInitMethod == NULL)
 211     {
 212         jIntegerInitMethod = (*env)->GetMethodID(env, jIntegerClass, "<init>", "(I)V");
 213         if ((*env)->ExceptionCheck(env)) return;
 214     }
 215     
 216     if (jIntegerValueMethod == NULL)
 217     {
 218         jIntegerValueMethod = (*env)->GetMethodID(env, jIntegerClass, "intValue", "()I");
 219         if ((*env)->ExceptionCheck(env)) return;
 220     }
 221         
 222     if (jLongClass == NULL)
 223     {
 224         jclass jcls = (*env)->FindClass(env, "java/lang/Long");
 225         if ((*env)->ExceptionCheck(env)) return;
 226         jLongClass = (*env)->NewGlobalRef(env, jcls);
 227     }
 228     
 229     if (jLongValueMethod == NULL)
 230     {
 231         jLongValueMethod = (*env)->GetMethodID(env, jLongClass, "longValue", "()J");
 232     }
 233 }
 234 
 235 /*
 236  * Class:     com_sun_glass_ui_mac_MacView
 237  * Method:    _getMultiClickTime_impl
 238  * Signature: ()J
 239  */
 240 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_mac_MacView__1getMultiClickTime_1impl
 241 (JNIEnv *env, jclass cls)
 242 {
 243     LOG("Java_com_sun_glass_ui_mac_MacView__1getMultiClickTime_1impl");
 244     
 245     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 246     
 247     // 10.6 API
 248     return (jlong)([NSEvent doubleClickInterval]*1000.0f);
 249 }
 250 
 251 /*
 252  * Class:     com_sun_glass_ui_mac_MacView
 253  * Method:    _getMultiClickMaxX_impl
 254  * Signature: ()I
 255  */
 256 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_mac_MacView__1getMultiClickMaxX_1impl
 257 (JNIEnv *env, jclass cls)
 258 {
 259     LOG("Java_com_sun_glass_ui_mac_MacView__1getMultiClickMaxX_1impl");
 260     
 261     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 262     
 263     // gznote: there is no way to get this value out of the system
 264     // Most of the Mac machines use the value 3, so we hardcode this value
 265     return (jint)3;
 266 }
 267 
 268 /*
 269  * Class:     com_sun_glass_ui_mac_MacView
 270  * Method:    _getMultiClickMaxY_impl
 271  * Signature: ()I
 272  */
 273 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_mac_MacView__1getMultiClickMaxY_1impl
 274 (JNIEnv *env, jclass cls)
 275 {
 276     LOG("Java_com_sun_glass_ui_mac_MacView__1getMultiClickMaxY_1impl");
 277     
 278     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 279     
 280     // gznote: there is no way to get this value out of the system
 281     // Most of the Mac machines use the value 3, so we hardcode this value
 282     return (jint)3;
 283 }
 284 
 285 /*
 286  * Class:     com_sun_glass_ui_mac_MacView
 287  * Method:    _create
 288  * Signature: (Ljava/util/Map;)J
 289  */
 290 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_mac_MacView__1create
 291 (JNIEnv *env, jobject jView, jobject jCapabilities)
 292 {
 293     LOG("Java_com_sun_glass_ui_mac_MacView__1create");
 294     
 295     jlong value = 0L;
 296     
 297     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 298     GLASS_POOL_ENTER;
 299     {
 300         jobject jViewRef = (*env)->NewGlobalRef(env, jView);
 301         jobject jCapabilitiesRef = NULL;
 302         if (jCapabilities != NULL)
 303         {
 304             jCapabilitiesRef = (*env)->NewGlobalRef(env, jCapabilities);
 305         }
 306 
 307         // embed ourselves into GlassHostView, so we can later swap our view between windows (ex. fullscreen mode)
 308         NSView *hostView = [[GlassHostView alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]; // alloc creates ref count of 1
 309         [hostView setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
 310         [hostView setAutoresizesSubviews:YES];
 311         
 312         NSView* view = [[GlassView3D alloc] initWithFrame:[hostView bounds] withJview:jView withJproperties:jCapabilities];
 313         [view setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
 314         
 315         [hostView addSubview:view];
 316         jfieldID jfID = (*env)->GetFieldID(env, jViewClass, "ptr", "J");
 317         GLASS_CHECK_EXCEPTION(env);
 318         (*env)->SetLongField(env, jView, jfID, ptr_to_jlong(view));
 319         
 320         value = ptr_to_jlong(view);
 321 
 322         if (jCapabilities != NULL)
 323         {
 324             (*env)->DeleteGlobalRef(env, jCapabilitiesRef);
 325         }
 326         (*env)->DeleteGlobalRef(env, jViewRef);
 327     }
 328     GLASS_POOL_EXIT;
 329     GLASS_CHECK_EXCEPTION(env);
 330     
 331     LOG("   view: %p", value);
 332     return value;
 333 }
 334 
 335 /*
 336  * Class:     com_sun_glass_ui_mac_MacView
 337  * Method:    _getNativeLayer
 338  * Signature: (J)J
 339  */
 340 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_mac_MacView__1getNativeLayer
 341 (JNIEnv *env, jobject jView, jlong jPtr)
 342 {
 343     LOG("Java_com_sun_glass_ui_mac_MacView__1_getNativeLayer");
 344     LOG("   view: %p", jPtr);
 345     if (!jPtr) return 0L;
 346     
 347     jlong ptr = 0L;
 348     
 349     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 350     GLASS_POOL_ENTER;
 351     {
 352         NSView<GlassView> *view = getGlassView(env, jPtr);
 353         ptr = ptr_to_jlong([view layer]);
 354     }
 355     GLASS_POOL_EXIT;
 356     GLASS_CHECK_EXCEPTION(env);
 357     
 358     return ptr;
 359 }
 360 
 361 /*
 362  * Class:     com_sun_glass_ui_mac_MacView
 363  * Method:    _getNativeRemoteLayerId
 364  * Signature: (JLjava/lang/String;)I
 365  */
 366 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_mac_MacView__1getNativeRemoteLayerId
 367 (JNIEnv *env, jobject jView, jlong jPtr, jstring jServerString)
 368 {
 369     LOG("Java_com_sun_glass_ui_mac_MacView__1_getNativeLayerId");
 370     LOG("   layer: %p", jPtr);
 371     if (!jPtr) return 0;
 372     
 373     jint layerId = 0;
 374     
 375     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 376     GLASS_POOL_ENTER;
 377     {
 378         NSView<GlassView> *view = getGlassView(env, jPtr);
 379         layerId = (jint)[view getRemoteLayerIdForServer:[GlassHelper nsStringWithJavaString:jServerString withEnv:env]];
 380     }
 381     GLASS_POOL_EXIT;
 382     GLASS_CHECK_EXCEPTION(env);
 383     
 384     LOG("   layerId: %d", layerId);
 385     return layerId;
 386 }
 387 
 388 /*
 389  * Class:     com_sun_glass_ui_mac_MacView
 390  * Method:    _hostRemoteLayerId
 391  * Signature: (JI)V
 392  */
 393 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1hostRemoteLayerId
 394 (JNIEnv *env, jobject jView, jlong jPtr, jint jRemoteLayerId)
 395 {
 396     LOG("Java_com_sun_glass_ui_mac_MacView__1hostRemoteLayerId");
 397     if (!jPtr) return;
 398     
 399     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 400     GLASS_POOL_ENTER;
 401     {
 402         if (jRemoteLayerId > 0)
 403         {
 404             NSView<GlassView> *view = getGlassView(env, jPtr);
 405             [view hostRemoteLayerId:(uint32_t)jRemoteLayerId];
 406         }
 407     }
 408     GLASS_POOL_EXIT;
 409     GLASS_CHECK_EXCEPTION(env);
 410 }
 411 
 412 /*
 413  * Class:     com_sun_glass_ui_mac_MacView
 414  * Method:    _getX
 415  * Signature: ()I
 416  */
 417 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_mac_MacView__1getX
 418 (JNIEnv *env, jobject jView, jlong jPtr)
 419 {
 420     LOG("Java_com_sun_glass_ui_mac_MacView__1getX");
 421     if (!jPtr) return 0;
 422     
 423     jint x = 0;
 424     
 425     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 426     GLASS_POOL_ENTER;
 427     {
 428         NSView<GlassView> *view = getGlassView(env, jPtr);
 429         NSWindow *window = [view window];
 430         if (window != nil)
 431         {
 432             NSRect frame = [window frame];
 433             NSRect contentRect = [window contentRectForFrameRect:frame];
 434             x = (jint)(contentRect.origin.x - frame.origin.x);
 435         }
 436     }
 437     GLASS_POOL_EXIT;
 438     GLASS_CHECK_EXCEPTION(env);
 439     
 440     return x;
 441 }
 442 
 443 /*
 444  * Class:     com_sun_glass_ui_mac_MacView
 445  * Method:    _getY
 446  * Signature: ()I
 447  */
 448 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_mac_MacView__1getY
 449 (JNIEnv *env, jobject jView, jlong jPtr)
 450 {
 451     LOG("Java_com_sun_glass_ui_mac_MacView__1getY");
 452     if (!jPtr) return 0;
 453     
 454     jint y = 0;
 455     
 456     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 457     GLASS_POOL_ENTER;
 458     {
 459         NSView<GlassView> *view = getGlassView(env, jPtr);
 460         NSWindow * window = [view window];
 461         if (window != nil)
 462         {
 463             NSRect frame = [window frame];
 464             NSRect contentRect = [window contentRectForFrameRect:frame];
 465             
 466             // Assume that the border in the bottom is zero-sized
 467             y = (jint)(frame.size.height - contentRect.size.height);
 468         }
 469     }
 470     GLASS_POOL_EXIT;
 471     GLASS_CHECK_EXCEPTION(env);
 472     
 473     return y;
 474 }
 475 
 476 /*
 477  * Class:     com_sun_glass_ui_mac_MacView
 478  * Method:    _setParent
 479  * Signature: (JJ)V
 480  */
 481 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1setParent
 482 (JNIEnv *env, jobject jView, jlong jPtr, jlong parentPtr)
 483 {
 484     LOG("Java_com_sun_glass_ui_mac_MacView__1setParent");
 485     LOG("   view: %p", jPtr);
 486     LOG("   parent: %p", parentPtr);
 487     if (!jPtr) return;
 488     
 489     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 490     // TODO: Java_com_sun_glass_ui_mac_MacView__1setParent
 491 }
 492 
 493 /*
 494  * Class:     com_sun_glass_ui_mac_MacView
 495  * Method:    _close
 496  * Signature: (J)Z
 497  */
 498 JNIEXPORT jboolean JNICALL Java_com_sun_glass_ui_mac_MacView__1close
 499 (JNIEnv *env, jobject jView, jlong jPtr)
 500 {
 501     LOG("Java_com_sun_glass_ui_mac_MacView__1close");
 502     if (!jPtr) return JNI_FALSE;
 503 
 504     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 505     GLASS_POOL_ENTER;
 506     {
 507         NSView<GlassView> *view = getGlassView(env, jPtr);
 508         NSView * host = [view superview];
 509         if (host != nil) {
 510             [view removeFromSuperview];
 511             [host release];
 512         }
 513         [view release];
 514     }
 515     GLASS_POOL_EXIT;
 516     GLASS_CHECK_EXCEPTION(env);
 517 
 518     return JNI_TRUE;
 519 }
 520 
 521 /*
 522  * Class:     com_sun_glass_ui_mac_MacView
 523  * Method:    _begin
 524  * Signature: ()V
 525  */
 526 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1begin
 527 (JNIEnv *env, jobject jView, jlong jPtr)
 528 {
 529     LOG("Java_com_sun_glass_ui_mac_MacView__1begin");
 530     if (!jPtr) return;
 531     
 532     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 533     NSView<GlassView> *view = getGlassView(env, jPtr);
 534     GLASS_POOL_PUSH; // it will be popped by "_end"
 535     {
 536         [view retain];
 537 //        [view lockFocus];
 538         [view begin];
 539     }
 540 }
 541 
 542 /*
 543  * Class:     com_sun_glass_ui_mac_MacView
 544  * Method:    _end
 545  * Signature: (Z)V
 546  */
 547 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1end
 548 (JNIEnv *env, jobject jView, jlong jPtr)
 549 {
 550     LOG("Java_com_sun_glass_ui_mac_MacView__1end");
 551     if (!jPtr) return;
 552     
 553     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 554     NSView<GlassView> *view = getGlassView(env, jPtr);
 555     {
 556         [view end];
 557 //        [view unlockFocus];
 558         [view release];
 559     }
 560     GLASS_POOL_POP; // it was pushed by "_begin"
 561 }
 562 
 563 /*
 564  * Class:     com_sun_glass_ui_mac_MacView
 565  * Method:    _scheduleRepaint
 566  * Signature: ()V
 567  */
 568 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1scheduleRepaint
 569 (JNIEnv *env, jobject jView, jlong jPtr)
 570 {
 571     LOG("Java_com_sun_glass_ui_mac_MacView__1scheduleRepaint");
 572     if (!jPtr) return;
 573     
 574     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 575     GLASS_POOL_ENTER;
 576     {
 577         NSView<GlassView> *view = getGlassView(env, jPtr);
 578         [view setNeedsDisplay:YES];
 579     }
 580     GLASS_POOL_EXIT;
 581     GLASS_CHECK_EXCEPTION(env);
 582 }
 583 
 584 /*
 585  * Class:     com_sun_glass_ui_mac_MacView
 586  * Method:    _enterFullscreen
 587  * Signature: (ZZZ)V
 588  */
 589 JNIEXPORT jboolean JNICALL Java_com_sun_glass_ui_mac_MacView__1enterFullscreen
 590 (JNIEnv *env, jobject jView, jlong jPtr, jboolean jAnimate, jboolean jKeepRatio, jboolean jHideCursor)
 591 {
 592     LOG("Java_com_sun_glass_ui_mac_MacView__1enterFullscreen");
 593     if (!jPtr) return JNI_FALSE;
 594     
 595     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 596     GLASS_POOL_ENTER;
 597     {
 598         NSView<GlassView> *view = getGlassView(env, jPtr);
 599         [view enterFullscreenWithAnimate:(jAnimate==JNI_TRUE) withKeepRatio:(jKeepRatio==JNI_TRUE) withHideCursor:(jHideCursor==JNI_TRUE)];
 600     }
 601     GLASS_POOL_EXIT;
 602     GLASS_CHECK_EXCEPTION(env);
 603     
 604     return JNI_TRUE; // gznote: remove this return value
 605 }
 606 
 607 /*
 608  * Class:     com_sun_glass_ui_mac_MacView
 609  * Method:    _exitFullscreen
 610  * Signature: (Z)V
 611  */
 612 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1exitFullscreen
 613 (JNIEnv *env, jobject jView, jlong jPtr, jboolean jAnimate)
 614 {
 615     LOG("Java_com_sun_glass_ui_mac_MacView__1exitFullscreen");
 616     if (!jPtr) return;
 617     
 618     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 619     GLASS_POOL_ENTER;
 620     {
 621         NSView<GlassView> *view = getGlassView(env, jPtr);
 622         [view exitFullscreenWithAnimate:(jAnimate==JNI_TRUE)];
 623     }
 624     GLASS_POOL_EXIT;
 625     GLASS_CHECK_EXCEPTION(env);
 626 }
 627 
 628 /*
 629  * Class:     com_sun_glass_ui_mac_MacView
 630  * Method:    _uploadPixelsDirect
 631  * Signature: (JLjava/nio/Buffer;II)V
 632  */
 633 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1uploadPixelsDirect
 634 (JNIEnv *env, jobject jView, jlong jPtr, jobject jBuffer, jint jWidth, jint jHeight)
 635 {
 636     LOG("Java_com_sun_glass_ui_mac_MacView__1uploadPixelsDirect");
 637     if (!jPtr) return;
 638     
 639     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 640     NSView<GlassView> *view = getGlassView(env, jPtr);
 641     
 642 #ifndef FORCE_NOISE
 643     void *pixels = (*env)->GetDirectBufferAddress(env, jBuffer);
 644 #else
 645     void *pixels = _GenerateNoise(jWidth, jHeight);
 646 #endif
 647     
 648     // must be in the middle of begin/end
 649     if ((jWidth > 0) && (jHeight > 0))
 650     {
 651         [view pushPixels:pixels withWidth:(GLuint)jWidth withHeight:(GLuint)jHeight withEnv:env];
 652     }
 653 }
 654 
 655 /*
 656  * Class:     com_sun_glass_ui_mac_MacView
 657  * Method:    _uploadPixelsByteArray
 658  * Signature: (J[BIII)V
 659  */
 660 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1uploadPixelsByteArray
 661 (JNIEnv *env, jobject jView, jlong jPtr, jbyteArray jArray, jint jOffset, jint jWidth, jint jHeight)
 662 {
 663     LOG("Java_com_sun_glass_ui_mac_MacView__1uploadPixelsByteArray");
 664     if (!jPtr) return;
 665     
 666     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 667     
 668     jboolean isCopy = JNI_FALSE;
 669     u_int8_t *data = (*env)->GetPrimitiveArrayCritical(env, jArray, &isCopy);
 670     {
 671         assert((4*jWidth*jHeight + jOffset) == (*env)->GetArrayLength(env, jArray));
 672         
 673         NSView<GlassView> *view = getGlassView(env, jPtr);
 674         
 675 #ifndef FORCE_NOISE
 676         void *pixels = (data+jOffset);
 677 #else
 678         void *pixels = _GenerateNoise(jWidth, jHeight);
 679 #endif
 680         
 681         // must be in the middle of begin/end
 682         if ((jWidth > 0) && (jHeight > 0))
 683         {
 684             [view pushPixels:pixels withWidth:(GLuint)jWidth withHeight:(GLuint)jHeight withEnv:env];
 685         }
 686     }
 687     (*env)->ReleasePrimitiveArrayCritical(env, jArray, data, JNI_ABORT);
 688 }
 689 
 690 /*
 691  * Class:     com_sun_glass_ui_mac_MacView
 692  * Method:    _uploadPixelsIntArray
 693  * Signature: (J[IIII)V
 694  */
 695 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1uploadPixelsIntArray
 696 (JNIEnv *env, jobject jView, jlong jPtr, jintArray jArray, jint jOffset, jint jWidth, jint jHeight)
 697 {
 698     LOG("Java_com_sun_glass_ui_mac_MacView__1uploadPixelsIntArray");
 699     if (!jPtr) return;
 700     
 701     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 702     
 703     jboolean isCopy = JNI_FALSE;
 704     u_int32_t *data = (*env)->GetPrimitiveArrayCritical(env, jArray, &isCopy);
 705     {
 706         assert((jWidth*jHeight + jOffset) == (*env)->GetArrayLength(env, jArray));
 707         
 708         NSView<GlassView> *view = getGlassView(env, jPtr);
 709         
 710 #ifndef FORCE_NOISE
 711         void *pixels = (data+jOffset);
 712 #else
 713         void *pixels = _GenerateNoise(jWidth, jHeight);
 714 #endif
 715         
 716         // must be in the middle of begin/end
 717         if ((jWidth > 0) && (jHeight > 0))
 718         {
 719             [view pushPixels:pixels withWidth:(GLuint)jWidth withHeight:(GLuint)jHeight withEnv:env];
 720         }
 721     }
 722     (*env)->ReleasePrimitiveArrayCritical(env, jArray, data, JNI_ABORT);
 723 }
 724 
 725 /*
 726  * Input methods callback
 727  */
 728 
 729 /*
 730  * Class:     com_sun_glass_ui_mac_MacView
 731  * Method:    _enableInputMethodEvents
 732  * Signature: (JZ)V
 733  */
 734 JNIEXPORT void JNICALL Java_com_sun_glass_ui_mac_MacView__1enableInputMethodEvents
 735 (JNIEnv *env, jobject jView, jlong ptr, jboolean enable)
 736 {
 737     LOG("Java_com_sun_glass_ui_mac_MacView__1enableInputMethodEvents");
 738     if (!ptr) return;
 739 
 740     GLASS_ASSERT_MAIN_JAVA_THREAD(env);
 741     GLASS_POOL_ENTER;
 742     {
 743         NSView<GlassView> *view = getGlassView(env, ptr);
 744         [view setInputMethodEnabled:(enable==JNI_TRUE)];
 745     }
 746     GLASS_POOL_EXIT;
 747     GLASS_CHECK_EXCEPTION(env);
 748 }