1 /*
   2  * Copyright (c) 2011, 2018, 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 #include <com_sun_glass_ui_gtk_GtkView.h>
  26 #include <com_sun_glass_events_ViewEvent.h>
  27 
  28 #include <cstdlib>
  29 #include <cstring>
  30 #include <cassert>
  31 
  32 #include "glass_general.h"
  33 #include "glass_view.h"
  34 #include "glass_window.h"
  35 
  36 #define JLONG_TO_GLASSVIEW(value) ((GlassView *) JLONG_TO_PTR(value))
  37 
  38 extern "C" {
  39 
  40 /*
  41  * Class:     com_sun_glass_ui_gtk_GtkView
  42  * Method:    _enableInputMethodEvents
  43  * Signature: (JZ)V
  44  */
  45 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkView_enableInputMethodEventsImpl
  46   (JNIEnv * env, jobject obj, jlong ptr, jboolean enable)
  47 {
  48     (void)env;
  49     (void)obj;
  50 
  51     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
  52     if (view->current_window) {
  53         if (enable) {
  54             view->current_window->enableOrResetIME();
  55         } else {
  56             view->current_window->disableIME();
  57         }
  58     }
  59 }
  60 
  61 /*
  62  * Class:     com_sun_glass_ui_gtk_GtkView
  63  * Method:    _create
  64  * Signature: (Ljava/util/Map;)J
  65  */
  66 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_gtk_GtkView__1create
  67   (JNIEnv * env, jobject obj, jobject caps)
  68 {
  69     (void)env;
  70     (void)obj;
  71     (void)caps;
  72 
  73     GlassView *view = new GlassView();
  74     return PTR_TO_JLONG(view);
  75 }
  76 
  77 /*
  78  * Class:     com_sun_glass_ui_gtk_GtkView
  79  * Method:    _getNativeView
  80  * Signature: (J)J
  81  */
  82 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_gtk_GtkView__1getNativeView
  83   (JNIEnv * env, jobject obj, jlong ptr)
  84 {
  85     (void)env;
  86     (void)obj;
  87     (void)ptr;
  88 
  89     return 0;
  90 }
  91 
  92 /*
  93  * Class:     com_sun_glass_ui_gtk_GtkView
  94  * Method:    _getX
  95  * Signature: (J)I
  96  */
  97 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_gtk_GtkView__1getX
  98   (JNIEnv * env, jobject obj, jlong ptr)
  99 {
 100     (void)env;
 101     (void)obj;
 102 
 103     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 104     if (view && view->current_window) {
 105         return view->current_window->get_frame_extents().left;
 106     }
 107     return 0;
 108 }
 109 
 110 /*
 111  * Class:     com_sun_glass_ui_gtk_GtkView
 112  * Method:    _getY
 113  * Signature: (J)I
 114  */
 115 JNIEXPORT jint JNICALL Java_com_sun_glass_ui_gtk_GtkView__1getY
 116   (JNIEnv * env, jobject obj, jlong ptr)
 117 {
 118     (void)env;
 119     (void)obj;
 120 
 121     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 122     if (view && view->current_window) {
 123         return view->current_window->get_frame_extents().top;
 124     }
 125     return 0;
 126 }
 127 
 128 /*
 129  * Class:     com_sun_glass_ui_gtk_GtkView
 130  * Method:    _setParent
 131  * Signature: (JJ)V
 132  */
 133 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkView__1setParent
 134   (JNIEnv * env, jobject obj, jlong ptr, jlong parent)
 135 {
 136     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 137     bool is_removing = view->current_window && !parent;
 138 
 139     view->current_window = (WindowContext*)JLONG_TO_PTR(parent);
 140 
 141     if (is_removing) {
 142         env->CallVoidMethod(obj, jViewNotifyView, com_sun_glass_events_ViewEvent_REMOVE);
 143     } else {
 144         env->CallVoidMethod(obj, jViewNotifyView, com_sun_glass_events_ViewEvent_ADD);
 145     }
 146     CHECK_JNI_EXCEPTION(env);
 147 }
 148 
 149 /*
 150  * Class:     com_sun_glass_ui_gtk_GtkView
 151  * Method:    _close
 152  * Signature: (J)Z
 153  */
 154 JNIEXPORT jboolean JNICALL Java_com_sun_glass_ui_gtk_GtkView__1close
 155   (JNIEnv * env, jobject obj, jlong ptr)
 156 {
 157     (void)env;
 158     (void)obj;
 159 
 160     delete JLONG_TO_GLASSVIEW(ptr);
 161     return JNI_TRUE;
 162 }
 163 
 164 /*
 165  * Class:     com_sun_glass_ui_gtk_GtkView
 166  * Method:    _scheduleRepaint
 167  * Signature: (J)V
 168  */
 169 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkView__1scheduleRepaint
 170   (JNIEnv * env, jobject obj, jlong ptr)
 171 {
 172     // Seems to be unused
 173     (void)env;
 174     (void)obj;
 175     (void)ptr;
 176 }
 177 
 178 /*
 179  * Class:     com_sun_glass_ui_gtk_GtkView
 180  * Method:    _uploadPixelsDirect
 181  * Signature: (JLjava/nio/Buffer;II)V
 182  */
 183 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkView__1uploadPixelsDirect
 184 (JNIEnv *env, jobject jView, jlong ptr, jobject buffer, jint width, jint height)
 185 {
 186     (void)jView;
 187 
 188     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 189     if (view->current_window) {
 190         void *data = env->GetDirectBufferAddress(buffer);
 191 
 192         view->current_window->paint(data, width, height);
 193     }
 194 }
 195 
 196 /*
 197  * Class:     com_sun_glass_ui_gtk_GtkView
 198  * Method:    _uploadPixelsIntArray
 199  * Signature:  (J[IIII)V
 200  */
 201 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkView__1uploadPixelsIntArray
 202   (JNIEnv * env, jobject obj, jlong ptr, jintArray array, jint offset, jint width, jint height)
 203 {
 204     (void)obj;
 205 
 206     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 207     if (view->current_window) {
 208         int *data = NULL;
 209         assert((width*height + offset) == env->GetArrayLength(array));
 210         data = (int*)env->GetPrimitiveArrayCritical(array, 0);
 211 
 212         view->current_window->paint(data + offset, width, height);
 213 
 214         env->ReleasePrimitiveArrayCritical(array, data, JNI_ABORT);
 215     }
 216 }
 217 
 218 /*
 219  * Class:     com_sun_glass_ui_gtk_GtkView
 220  * Method:    _uploadPixelsByteArray
 221  * Signature:  (J[BIII)V
 222  */
 223 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkView__1uploadPixelsByteArray
 224   (JNIEnv * env, jobject obj, jlong ptr, jbyteArray array, jint offset, jint width, jint height)
 225 {
 226     (void)obj;
 227 
 228     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 229     if (view->current_window) {
 230         unsigned char *data = NULL;
 231 
 232         assert((4*width*height + offset) == env->GetArrayLength(array));
 233         data = (unsigned char*)env->GetPrimitiveArrayCritical(array, 0);
 234 
 235         view->current_window->paint(data + offset, width, height);
 236 
 237         env->ReleasePrimitiveArrayCritical(array, data, JNI_ABORT);
 238     }
 239 }
 240 
 241 /*
 242  * Class:     com_sun_glass_ui_gtk_GtkView
 243  * Method:    _enterFullscreen
 244  * Signature: (JZZZ)Z
 245  */
 246 JNIEXPORT jboolean JNICALL Java_com_sun_glass_ui_gtk_GtkView__1enterFullscreen
 247   (JNIEnv * env, jobject obj, jlong ptr, jboolean animate, jboolean keepRation, jboolean hideCursor)
 248 {
 249     (void)animate;
 250     (void)keepRation;
 251     (void)hideCursor;
 252 
 253     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 254     if (view->current_window) {
 255         view->current_window->enter_fullscreen();
 256         env->CallVoidMethod(obj, jViewNotifyView, com_sun_glass_events_ViewEvent_FULLSCREEN_ENTER);
 257         CHECK_JNI_EXCEPTION_RET(env, JNI_FALSE)
 258     }
 259     return JNI_TRUE;
 260 }
 261 
 262 /*
 263  * Class:     com_sun_glass_ui_gtk_GtkView
 264  * Method:    _exitFullscreen
 265  * Signature: (JZ)V
 266  */
 267 JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkView__1exitFullscreen
 268   (JNIEnv * env, jobject obj, jlong ptr, jboolean animate)
 269 {
 270     (void)animate;
 271 
 272     GlassView* view = JLONG_TO_GLASSVIEW(ptr);
 273     if (view->current_window) {
 274         if (view->embedded_window) {
 275             view->embedded_window->exit_fullscreen();
 276         } else {
 277             view->current_window->exit_fullscreen();
 278         }
 279         env->CallVoidMethod(obj, jViewNotifyView, com_sun_glass_events_ViewEvent_FULLSCREEN_EXIT);
 280         CHECK_JNI_EXCEPTION(env)
 281     }
 282 
 283 }
 284 
 285 } // extern "C"