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