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"