/* * Copyright (c) 1995, 2013, 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 * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ #ifndef _AWT_UTIL_H_ #define _AWT_UTIL_H_ #ifndef HEADLESS #ifndef XAWT #include #include #endif #include "gdefs.h" typedef struct ConvertEventTimeAndModifiers { jlong when; jint modifiers; } ConvertEventTimeAndModifiers; Boolean awt_util_focusIsOnMenu(Display *display); int32_t awt_util_sendButtonClick(Display *display, Window window); Widget awt_util_createWarningWindow(Widget parent, char *warning); void awt_util_show(Widget w); void awt_util_hide(Widget w); void awt_util_enable(Widget w); void awt_util_disable(Widget w); void awt_util_reshape(Widget w, jint x, jint y, jint wd, jint ht); void awt_util_mapChildren(Widget w, void (*func)(Widget,void *), int32_t applyToSelf, void *data); int32_t awt_util_setCursor(Widget w, Cursor c); void awt_util_convertEventTimeAndModifiers (XEvent *event, ConvertEventTimeAndModifiers *output); Widget awt_WidgetAtXY(Widget root, Position x, Position y); char *awt_util_makeWMMenuItem(char *target, Atom protocol); Cardinal awt_util_insertCallback(Widget w); void awt_util_consumeAllXEvents(Widget widget); void awt_util_cleanupBeforeDestroyWidget(Widget widget); void awt_util_debug_init(); Time awt_util_getCurrentServerTime(); jlong awt_util_nowMillisUTC(); jlong awt_util_nowMillisUTC_offset(Time server_offset); void awt_util_do_wheel_scroll(Widget scrolled_window, jint scrollType, jint scrollAmt, jint wheelAmt); Widget awt_util_get_scrollbar_to_scroll(Widget window); typedef struct _EmbeddedFrame { Widget embeddedFrame; Window frameContainer; jobject javaRef; Boolean eventSelectedPreviously; struct _EmbeddedFrame * next; struct _EmbeddedFrame * prev; } EmbeddedFrame; void awt_util_addEmbeddedFrame(Widget embeddedFrame, jobject javaRef); void awt_util_delEmbeddedFrame(Widget embeddedFrame); Boolean awt_util_processEventForEmbeddedFrame(XEvent *ev); /* * Expected types of arguments of the macro. * (JNIEnv*, const char*, const char*, jboolean, jobject) */ #define WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, \ handlerHasFlag, handlerRef) do { \ handlerRef = JNU_CallStaticMethodByName(env, NULL, handlerClassName, "getInstance", \ getInstanceSignature).l; \ if (handlerHasFlag == JNI_TRUE) { \ JNU_CallMethodByName(env, NULL, handlerRef, "setErrorOccurredFlag", "(Z)V", JNI_FALSE); \ } \ JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", "WITH_XERROR_HANDLER", \ "(Lsun/awt/X11/XErrorHandler;)V", handlerRef); \ } while (0) /* * Expected types of arguments of the macro. * (JNIEnv*, jboolean) */ #define RESTORE_XERROR_HANDLER(env, doXSync) do { \ JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", \ "RESTORE_XERROR_HANDLER", "(Z)V", doXSync); \ } while (0) /* * Expected types of arguments of the macro. * (JNIEnv*, const char*, const char*, jboolean, jobject, jboolean, No type - C expression) */ #define EXEC_WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, handlerHasFlag, \ handlerRef, errorOccurredFlag, code) do { \ handlerRef = NULL; \ WITH_XERROR_HANDLER(env, handlerClassName, getInstanceSignature, handlerHasFlag, handlerRef); \ do { \ code; \ } while (0); \ RESTORE_XERROR_HANDLER(env, JNI_TRUE); \ if (handlerHasFlag == JNI_TRUE) { \ errorOccurredFlag = GET_HANDLER_ERROR_OCCURRED_FLAG(env, handlerRef); \ } \ } while (0) /* * Expected types of arguments of the macro for jboolean expression. * (JNIEnv*, jobject) */ #define GET_HANDLER_ERROR_OCCURRED_FLAG(env, handlerRef) (handlerRef != NULL ? \ JNU_CallMethodByName(env, NULL, handlerRef, "getErrorOccurredFlag", "()Z").z : JNI_FALSE) /* * Expected types of arguments of the macro for jbyte expression. * (JNIEnv*, jobject) */ #define GET_XERROR_CODE(env, savedError) \ ((savedError = JNU_GetStaticFieldByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil", \ "saved_error", "Lsun/awt/X11/XErrorEvent;").l) != NULL ? \ JNU_CallMethodByName(env, NULL, savedError, "get_error_code", "()B").b : Success) #endif /* !HEADLESS */ #ifndef INTERSECTS #define INTERSECTS(r1_x1,r1_x2,r1_y1,r1_y2,r2_x1,r2_x2,r2_y1,r2_y2) \ !((r2_x2 <= r1_x1) ||\ (r2_y2 <= r1_y1) ||\ (r2_x1 >= r1_x2) ||\ (r2_y1 >= r1_y2)) #endif #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif struct DPos { int32_t x; int32_t y; int32_t mapped; void *data; void *peer; int32_t echoC; }; extern jobject awtJNI_GetCurrentThread(JNIEnv *env); extern void awtJNI_ThreadYield(JNIEnv *env); #ifndef HEADLESS extern Widget prevWidget; #endif /* !HEADLESS */ /* * Functions for accessing fields by name and signature */ JNIEXPORT jobject JNICALL JNU_GetObjectField(JNIEnv *env, jobject self, const char *name, const char *sig); JNIEXPORT jboolean JNICALL JNU_SetObjectField(JNIEnv *env, jobject self, const char *name, const char *sig, jobject val); JNIEXPORT jlong JNICALL JNU_GetLongField(JNIEnv *env, jobject self, const char *name); JNIEXPORT jint JNICALL JNU_GetIntField(JNIEnv *env, jobject self, const char *name); JNIEXPORT jboolean JNICALL JNU_SetIntField(JNIEnv *env, jobject self, const char *name, jint val); JNIEXPORT jboolean JNICALL JNU_SetLongField(JNIEnv *env, jobject self, const char *name, jlong val); JNIEXPORT jboolean JNICALL JNU_GetBooleanField(JNIEnv *env, jobject self, const char *name); JNIEXPORT jboolean JNICALL JNU_SetBooleanField(JNIEnv *env, jobject self, const char *name, jboolean val); JNIEXPORT jint JNICALL JNU_GetCharField(JNIEnv *env, jobject self, const char *name); #ifndef HEADLESS #ifdef __solaris__ extern Widget awt_util_getXICStatusAreaWindow(Widget w); #else #if defined(MACOSX) int32_t awt_util_getIMStatusHeight(Widget vw); Widget awt_util_getXICStatusAreaWindow(Widget w); #else int32_t awt_util_getIMStatusHeight(Widget vw); XVaNestedList awt_util_getXICStatusAreaList(Widget w); Widget awt_util_getXICStatusAreaWindow(Widget w); #endif #endif #if defined(__linux__) || defined(MACOSX) typedef struct _XmImRefRec { Cardinal num_refs; /* Number of referencing widgets. */ Cardinal max_refs; /* Maximum length of refs array. */ Widget* refs; /* Array of referencing widgets. */ XtPointer **callbacks; } XmImRefRec, *XmImRefInfo; typedef struct _PreeditBufferRec { unsigned short length; wchar_t *text; XIMFeedback *feedback; int32_t caret; XIMCaretStyle style; } PreeditBufferRec, *PreeditBuffer; typedef struct _XmImXICRec { struct _XmImXICRec *next; /* Links all have the same XIM. */ XIC xic; /* The XIC. */ Window focus_window; /* Cached information about the XIC. */ XIMStyle input_style; /* ...ditto... */ int32_t status_width; /* ...ditto... */ int32_t preedit_width; /* ...ditto... */ int32_t sp_height; /* ...ditto... */ Boolean has_focus; /* Does this XIC have keyboard focus. */ Boolean anonymous; /* Do we have exclusive rights to this XIC. */ XmImRefRec widget_refs; /* Widgets referencing this XIC. */ struct _XmImXICRec **source; /* Original source of shared XICs. */ PreeditBuffer preedit_buffer; } XmImXICRec, *XmImXICInfo; typedef struct _XmImShellRec { /* per-Shell fields. */ Widget im_widget; /* Dummy widget to make intrinsics behave. */ Widget current_widget; /* Widget whose visual we're matching. */ /* per fields. */ XmImXICInfo shell_xic; /* For PER_SHELL sharing policy. */ XmImXICInfo iclist; /* All known XICs for this . */ } XmImShellRec, *XmImShellInfo; typedef struct { /* per-Display fields. */ XContext current_xics; /* Map widget -> current XmImXICInfo. */ /* per-XIM fields. */ XIM xim; /* The XIM. */ XIMStyles *styles; /* XNQueryInputStyle result. */ XmImRefRec shell_refs; /* Shells referencing this XIM. */ } XmImDisplayRec, *XmImDisplayInfo; #endif #endif /* !HEADLESS */ #endif /* _AWT_UTIL_H_ */