jdk/src/solaris/native/sun/xawt/XlibWrapper.c
changeset 4370 cc409c51b108
parent 3088 b0260407a050
child 5506 202f599c92aa
equal deleted inserted replaced
4369:18b883ed2b58 4370:cc409c51b108
    31 #include <X11/Xatom.h>
    31 #include <X11/Xatom.h>
    32 #include <X11/extensions/Xdbe.h>
    32 #include <X11/extensions/Xdbe.h>
    33 #include <X11/extensions/shape.h>
    33 #include <X11/extensions/shape.h>
    34 #include <string.h>
    34 #include <string.h>
    35 #include <stdlib.h>
    35 #include <stdlib.h>
       
    36 #include <X11/Sunkeysym.h>
    36 
    37 
    37 #include <jni.h>
    38 #include <jni.h>
    38 #include <jni_util.h>
    39 #include <jni_util.h>
    39 #include <jlong.h>
    40 #include <jlong.h>
    40 
    41 
  1212             return JNI_FALSE;
  1213             return JNI_FALSE;
  1213         }
  1214         }
  1214     }
  1215     }
  1215 }
  1216 }
  1216 
  1217 
       
  1218 
       
  1219 JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsSunKeyboard
       
  1220 (JNIEnv *env, jclass clazz, jlong display)
       
  1221 {
       
  1222     int xx;
       
  1223     AWT_CHECK_HAVE_LOCK();
       
  1224     xx = XKeysymToKeycode((Display*)jlong_to_ptr(display), SunXK_F37);
       
  1225     return (!xx) ? JNI_FALSE : JNI_TRUE;
       
  1226 }
       
  1227 
       
  1228 JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard
       
  1229 (JNIEnv *env, jclass clazz, jlong display)
       
  1230 {
       
  1231     int xx;
       
  1232     AWT_CHECK_HAVE_LOCK();
       
  1233     static jboolean result = JNI_FALSE;
       
  1234 
       
  1235     int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;
       
  1236     KeySym *keySyms, *keySymsStart, keySym;
       
  1237     int32_t i;
       
  1238     int32_t kanaCount = 0;
       
  1239 
       
  1240     // There's no direct way to determine whether the keyboard has
       
  1241     // a kana lock key. From available keyboard mapping tables, it looks
       
  1242     // like only keyboards with the kana lock key can produce keysyms
       
  1243     // for kana characters. So, as an indirect test, we check for those.
       
  1244     XDisplayKeycodes((Display*)jlong_to_ptr(display), &minKeyCode, &maxKeyCode);
       
  1245     keySyms = XGetKeyboardMapping((Display*)jlong_to_ptr(display), minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);
       
  1246     keySymsStart = keySyms;
       
  1247     for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {
       
  1248         keySym = *keySyms++;
       
  1249         if ((keySym & 0xff00) == 0x0400) {
       
  1250             kanaCount++;
       
  1251         }
       
  1252     }
       
  1253     XFree(keySymsStart);
       
  1254 
       
  1255     // use a (somewhat arbitrary) minimum so we don't get confused by a stray function key
       
  1256     result = kanaCount > 10;
       
  1257     return result ? JNI_TRUE : JNI_FALSE;
       
  1258 }
       
  1259 
  1217 JavaVM* jvm = NULL;
  1260 JavaVM* jvm = NULL;
  1218 static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
  1261 static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
  1219     if (jvm != NULL) {
  1262     if (jvm != NULL) {
  1220         JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
  1263         JNIEnv * env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
  1221         return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "globalErrorHandler", "(JJ)I",
  1264         return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XToolkit", "globalErrorHandler", "(JJ)I",
  1258 JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_CallErrorHandler
  1301 JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_CallErrorHandler
  1259 (JNIEnv *env, jclass clazz, jlong handler, jlong display, jlong event_ptr)
  1302 (JNIEnv *env, jclass clazz, jlong handler, jlong display, jlong event_ptr)
  1260 {
  1303 {
  1261     return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));
  1304     return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));
  1262 }
  1305 }
       
  1306 
  1263 
  1307 
  1264 /*
  1308 /*
  1265  * Class:     sun_awt_X11_XlibWrapper
  1309  * Class:     sun_awt_X11_XlibWrapper
  1266  * Method:    PrintXErrorEvent
  1310  * Method:    PrintXErrorEvent
  1267  * Signature: (JJ)V
  1311  * Signature: (JJ)V
  1851 Java_sun_awt_X11_XlibWrapper_XFreeModifiermap(JNIEnv *env, jclass clazz,
  1895 Java_sun_awt_X11_XlibWrapper_XFreeModifiermap(JNIEnv *env, jclass clazz,
  1852                                               jlong keymap) {
  1896                                               jlong keymap) {
  1853     AWT_CHECK_HAVE_LOCK();
  1897     AWT_CHECK_HAVE_LOCK();
  1854     XFreeModifiermap((XModifierKeymap*) jlong_to_ptr(keymap));
  1898     XFreeModifiermap((XModifierKeymap*) jlong_to_ptr(keymap));
  1855 }
  1899 }
       
  1900 /*
       
  1901  * Class:     sun_awt_X11_XlibWrapper
       
  1902  * Method:    XRefreshKeyboardMapping
       
  1903  * Signature: (J)V
       
  1904  */
       
  1905 JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping
       
  1906 (JNIEnv *env, jclass clazz, jlong event_ptr)
       
  1907 {
       
  1908     AWT_CHECK_HAVE_LOCK();
       
  1909     XRefreshKeyboardMapping((XMappingEvent*) jlong_to_ptr(event_ptr));
       
  1910 }
  1856 
  1911 
  1857 JNIEXPORT void JNICALL
  1912 JNIEXPORT void JNICALL
  1858 Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab(JNIEnv *env, jclass clazz,
  1913 Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab(JNIEnv *env, jclass clazz,
  1859                                                       jlong display, jint mask,
  1914                                                       jlong display, jint mask,
  1860                                                       jlong cursor, jlong time) {
  1915                                                       jlong cursor, jlong time) {