< prev index next >
src/java.desktop/unix/native/libawt_xawt/awt/awt_InputMethod.c
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
*** 44,54 ****
struct X11InputMethodIDs {
jfieldID pData;
} x11InputMethodIDs;
! static void PreeditStartCallback(XIC, XPointer, XPointer);
static void PreeditDoneCallback(XIC, XPointer, XPointer);
static void PreeditDrawCallback(XIC, XPointer,
XIMPreeditDrawCallbackStruct *);
static void PreeditCaretCallback(XIC, XPointer,
XIMPreeditCaretCallbackStruct *);
--- 44,54 ----
struct X11InputMethodIDs {
jfieldID pData;
} x11InputMethodIDs;
! static int PreeditStartCallback(XIC, XPointer, XPointer);
static void PreeditDoneCallback(XIC, XPointer, XPointer);
static void PreeditDrawCallback(XIC, XPointer,
XIMPreeditDrawCallbackStruct *);
static void PreeditCaretCallback(XIC, XPointer,
XIMPreeditCaretCallbackStruct *);
*** 173,182 ****
--- 173,185 ----
static X11InputMethodData * getX11InputMethodData(JNIEnv *, jobject);
static void setX11InputMethodData(JNIEnv *, jobject, X11InputMethodData *);
static void destroyX11InputMethodData(JNIEnv *, X11InputMethodData *);
static void freeX11InputMethodData(JNIEnv *, X11InputMethodData *);
+ #if defined(__linux__) || defined(MACOSX)
+ static Window getParentWindow(Window);
+ #endif
#ifdef __solaris__
/* Prototype for this function is missing in Solaris X11R6 Xlib.h */
extern char *XSetIMValues(
#if NeedVarargsPrototypes
*** 1017,1043 ****
if (pX11IMData->ic_active != pX11IMData->ic_passive) {
XSetICValues (pX11IMData->ic_passive, XNCommitStringCallback, &cb, NULL);
}
}
/* Add the global reference object to X11InputMethod to the list. */
addToX11InputMethodGRefList(pX11IMData->x11inputmethod);
return True;
err:
if (preedit)
XFree((void *)preedit);
THROW_OUT_OF_MEMORY_ERROR();
return False;
}
! static void
PreeditStartCallback(XIC ic, XPointer client_data, XPointer call_data)
{
/*ARGSUSED*/
/* printf("Native: PreeditStartCallback\n"); */
}
static void
PreeditDoneCallback(XIC ic, XPointer client_data, XPointer call_data)
{
--- 1020,1066 ----
if (pX11IMData->ic_active != pX11IMData->ic_passive) {
XSetICValues (pX11IMData->ic_passive, XNCommitStringCallback, &cb, NULL);
}
}
+ // The code set the IC mode that the preedit state is not initialied
+ // at XmbResetIC. This attribute can be set at XCreateIC. I separately
+ // set the attribute to avoid the failure of XCreateIC at some platform
+ // which does not support the attribute.
+ if (pX11IMData->ic_active != 0)
+ XSetICValues(pX11IMData->ic_active,
+ XNResetState, XIMInitialState,
+ NULL);
+ if (pX11IMData->ic_passive != 0
+ && pX11IMData->ic_active != pX11IMData->ic_passive)
+ XSetICValues(pX11IMData->ic_passive,
+ XNResetState, XIMInitialState,
+ NULL);
+
/* Add the global reference object to X11InputMethod to the list. */
addToX11InputMethodGRefList(pX11IMData->x11inputmethod);
+ /* Unset focus to avoid unexpected IM on */
+ setXICFocus(pX11IMData->ic_active, False);
+ if (pX11IMData->ic_active != pX11IMData->ic_passive)
+ setXICFocus(pX11IMData->ic_passive, False);
+
return True;
err:
if (preedit)
XFree((void *)preedit);
THROW_OUT_OF_MEMORY_ERROR();
return False;
}
! static int
PreeditStartCallback(XIC ic, XPointer client_data, XPointer call_data)
{
/*ARGSUSED*/
/* printf("Native: PreeditStartCallback\n"); */
+ return -1;
}
static void
PreeditDoneCallback(XIC ic, XPointer client_data, XPointer call_data)
{
*** 1161,1170 ****
--- 1184,1216 ----
static void
StatusDoneCallback(XIC ic, XPointer client_data, XPointer call_data)
{
/*ARGSUSED*/
/*printf("StatusDoneCallback:\n"); */
+ JNIEnv *env = GetJNIEnv();
+ X11InputMethodData *pX11IMData = NULL;
+ StatusWindow *statusWindow;
+
+ AWT_LOCK();
+
+ if (!isX11InputMethodGRefInList((jobject)client_data)) {
+ if ((jobject)client_data == currentX11InputMethodInstance) {
+ currentX11InputMethodInstance = NULL;
+ }
+ goto finally;
+ }
+
+ if (NULL == (pX11IMData = getX11InputMethodData(env, (jobject)client_data))
+ || NULL == (statusWindow = pX11IMData->statusWindow)){
+ goto finally;
+ }
+ currentX11InputMethodInstance = (jobject)client_data;
+
+ onoffStatusWindow(pX11IMData, 0, False);
+
+ finally:
+ AWT_UNLOCK();
}
static void
StatusDrawCallback(XIC ic, XPointer client_data,
XIMStatusDrawCallbackStruct *status_draw)
*** 1550,1573 ****
JNIEXPORT jboolean JNICALL Java_sun_awt_X11InputMethodBase_setCompositionEnabledNative
(JNIEnv *env, jobject this, jboolean enable)
{
X11InputMethodData *pX11IMData;
char * ret = NULL;
AWT_LOCK();
pX11IMData = getX11InputMethodData(env, this);
if ((pX11IMData == NULL) || (pX11IMData->current_ic == NULL)) {
AWT_UNLOCK();
return JNI_FALSE;
}
! ret = XSetICValues(pX11IMData->current_ic, XNPreeditState,
! (enable ? XIMPreeditEnable : XIMPreeditDisable), NULL);
AWT_UNLOCK();
! if ((ret != 0) && (strcmp(ret, XNPreeditState) == 0)) {
JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "");
}
return (jboolean)(ret == 0);
}
--- 1596,1656 ----
JNIEXPORT jboolean JNICALL Java_sun_awt_X11InputMethodBase_setCompositionEnabledNative
(JNIEnv *env, jobject this, jboolean enable)
{
X11InputMethodData *pX11IMData;
char * ret = NULL;
+ XVaNestedList pr_atrb;
+ #if defined(__linux__) || defined(MACOSX)
+ Boolean calledXSetICFocus = False;
+ #endif
AWT_LOCK();
pX11IMData = getX11InputMethodData(env, this);
if ((pX11IMData == NULL) || (pX11IMData->current_ic == NULL)) {
AWT_UNLOCK();
return JNI_FALSE;
}
! #if defined(__linux__) || defined(MACOSX)
! if (NULL != pX11IMData->statusWindow) {
! Window focus = 0;
! int revert_to;
! #if defined(_LP64) && !defined(_LITTLE_ENDIAN)
! // The Window value which is used for XGetICValues must be 32bit on BigEndian XOrg's xlib
! unsigned int w = 0;
! #else
! Window w = 0;
! #endif
! XGetInputFocus(awt_display, &focus, &revert_to);
! XGetICValues(pX11IMData->current_ic, XNFocusWindow, &w, NULL);
! if (RevertToPointerRoot == revert_to
! && pX11IMData->ic_active != pX11IMData->ic_passive) {
! if (pX11IMData->current_ic == pX11IMData->ic_active) {
! if (getParentWindow(focus) == getParentWindow(w)) {
! XUnsetICFocus(pX11IMData->ic_active);
! calledXSetICFocus = True;
! }
! }
! }
! }
! #endif
! pr_atrb = XVaCreateNestedList(0,
! XNPreeditState, (enable ? XIMPreeditEnable : XIMPreeditDisable),
! NULL);
! ret = XSetICValues(pX11IMData->current_ic, XNPreeditAttributes, pr_atrb, NULL);
! XFree((void *)pr_atrb);
! #if defined(__linux__) || defined(MACOSX)
! if (calledXSetICFocus) {
! XSetICFocus(pX11IMData->ic_active);
! }
! #endif
AWT_UNLOCK();
! if ((ret != 0)
! && ((strcmp(ret, XNPreeditAttributes) == 0)
! || (strcmp(ret, XNPreeditState) == 0))) {
JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "");
}
return (jboolean)(ret == 0);
}
*** 1586,1609 ****
JNIEXPORT jboolean JNICALL Java_sun_awt_X11InputMethodBase_isCompositionEnabledNative
(JNIEnv *env, jobject this)
{
X11InputMethodData *pX11IMData = NULL;
char * ret = NULL;
! XIMPreeditState state;
AWT_LOCK();
pX11IMData = getX11InputMethodData(env, this);
if ((pX11IMData == NULL) || (pX11IMData->current_ic == NULL)) {
AWT_UNLOCK();
return JNI_FALSE;
}
! ret = XGetICValues(pX11IMData->current_ic, XNPreeditState, &state, NULL);
AWT_UNLOCK();
! if ((ret != 0) && (strcmp(ret, XNPreeditState) == 0)) {
JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "");
return JNI_FALSE;
}
return (jboolean)(state == XIMPreeditEnable);
--- 1669,1703 ----
JNIEXPORT jboolean JNICALL Java_sun_awt_X11InputMethodBase_isCompositionEnabledNative
(JNIEnv *env, jobject this)
{
X11InputMethodData *pX11IMData = NULL;
char * ret = NULL;
! #if defined(_LP64) && !defined(_LITTLE_ENDIAN)
! // XIMPreeditState value which is used for XGetICValues must be 32bit on BigEndian XOrg's xlib
! unsigned int state = XIMPreeditUnKnown;
! #else
! XIMPreeditState state = XIMPreeditUnKnown;
! #endif
!
! XVaNestedList pr_atrb;
AWT_LOCK();
pX11IMData = getX11InputMethodData(env, this);
if ((pX11IMData == NULL) || (pX11IMData->current_ic == NULL)) {
AWT_UNLOCK();
return JNI_FALSE;
}
! pr_atrb = XVaCreateNestedList(0, XNPreeditState, &state, NULL);
! ret = XGetICValues(pX11IMData->current_ic, XNPreeditAttributes, pr_atrb, NULL);
! XFree((void *)pr_atrb);
AWT_UNLOCK();
! if ((ret != 0)
! && ((strcmp(ret, XNPreeditAttributes) == 0)
! || (strcmp(ret, XNPreeditState) == 0))) {
JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", "");
return JNI_FALSE;
}
return (jboolean)(state == XIMPreeditEnable);
*** 1616,1620 ****
--- 1710,1731 ----
AWT_LOCK();
adjustStatusWindow(window);
AWT_UNLOCK();
#endif
}
+
+ #if defined(__linux__) || defined(MACOSX)
+ static Window getParentWindow(Window w)
+ {
+ Window root=None, parent=None, *ignore_children=NULL;
+ unsigned int ignore_uint=0;
+ Status status = 0;
+
+ if (w == None)
+ return None;
+ status = XQueryTree(dpy, w, &root, &parent, &ignore_children, &ignore_uint);
+ XFree(ignore_children);
+ if (status == 0)
+ return None;
+ return parent;
+ }
+ #endif
< prev index next >