jdk/src/solaris/native/sun/awt/awt_xembed_server.c
changeset 11237 ff9cf1de21fa
parent 11236 0de47eef399c
parent 11235 3117d9a4bb02
child 11238 e2e56339976e
--- a/jdk/src/solaris/native/sun/awt/awt_xembed_server.c	Thu Dec 15 15:47:47 2011 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,969 +0,0 @@
-/*
- * Copyright (c) 2003, 2005, 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.
- */
-
-// TODO: Propogate applicationActive from Java
-
-#ifdef HEADLESS
-    #error This file should not be included in headless library
-#endif
-
-#include "awt_p.h"
-
-#include <X11/Xproto.h>
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#include <Xm/MwmUtil.h>
-#ifdef __linux__
-#include <execinfo.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-
-/* JNI headers */
-#include "java_awt_Frame.h"     /* for frame state constants */
-#include "java_awt_event_KeyEvent.h"
-#include "awt_wm.h"
-#include "awt_util.h"           /* for X11 error handling macros */
-#include "awt_xembed.h"
-#include "awt_Component.h"
-#include "awt_AWTEvent.h"
-#include "canvas.h"
-#include "sun_awt_motif_MEmbedCanvasPeer.h"
-
-#ifdef DOTRACE
-#define MTRACE(param) fprintf(stderr, param)
-#define MTRACEP1(format, p1) fprintf(stderr, format, p1)
-#define MTRACEP2(format, p1, p2) fprintf(stderr, format, p1, p2)
-#define MTRACEP3(format, p1, p2, p3) fprintf(stderr, format, p1, p2, p3)
-#define MTRACEP4(format, p1, p2, p3, p4) fprintf(stderr, format, p1, p2, p3, p4)
-#define MTRACEP5(format, p1, p2, p3, p4, p5) fprintf(stderr, format, p1, p2, p3, p4, p5)
-#define MTRACEP6(format, p1, p2, p3, p4, p5, p6) fprintf(stderr, format, p1, p2, p3, p4, p5, p6)
-#define MTRACEP7(format, p1, p2, p3, p4, p5, p6, p7) fprintf(stderr, format, p1, p2, p3, p4, p5, p6, p7)
-#else
-#define MTRACE(param)
-#define MTRACEP1(format, p1)
-#define MTRACEP2(format, p1, p2)
-#define MTRACEP3(format, p1, p2, p3)
-#define MTRACEP4(format, p1, p2, p3, p4)
-#define MTRACEP5(format, p1, p2, p3, p4, p5)
-#define MTRACEP6(format, p1, p2, p3, p4, p5, p6)
-#define MTRACEP7(format, p1, p2, p3, p4, p5, p6, p7)
-#endif
-
-/**************************** XEmbed server DnD support ***********************/
-extern Atom XA_XdndAware;
-extern Boolean
-register_xembed_drop_site(JNIEnv* env, Display* dpy, jobject server,
-                          Window serverHandle, Window clientHandle);
-extern Boolean
-unregister_xembed_drop_site(JNIEnv* env, Display* dpy, jobject server,
-                            Window serverHandle, Window clientHandle);
-extern void
-forward_event_to_embedded(Window embedded, jlong ctxt, jint eventID);
-
-extern const char * msg_to_str(int msg);
-
-void
-set_xembed_drop_target(JNIEnv* env, jobject server);
-void
-remove_xembed_drop_target(JNIEnv* env, jobject server);
-Boolean
-is_xembed_client(Window window);
-/******************************************************************************/
-extern struct MComponentPeerIDs mComponentPeerIDs;
-static jobject createRectangle(JNIEnv* env, int x, int y, int width, int height);
-static jobject createDimension(JNIEnv* env, int width, int height);
-static void processXEmbedInfo(JNIEnv* env, jobject this);
-static Atom XA_XEmbedInfo;
-static Atom XA_XEmbed;
-static jmethodID requestXEmbedFocusMID, focusNextMID, focusPrevMID,
-    registerAcceleratorMID, unregisterAcceleratorMID,
-    grabKeyMID, ungrabKeyMID, childResizedMID,
-    setXEmbedDropTargetMID, removeXEmbedDropTargetMID;
-static jfieldID keysymFID, modifiersFID, applicationActiveFID;
-
-typedef struct _xembed_server_data {
-    Window handle; // pointer to plugin intermediate widget, XEmbed client
-    Window serverHandle;
-    Widget serverWidget;
-    Boolean dispatching; // whether we dispatch messages for handle
-    int version;
-    jobject server;
-    struct _xembed_server_data * next;
-} xembed_server_data, * pxembed_server_data;
-
-static pxembed_server_data xembed_list = NULL;
-
-static pxembed_server_data
-getData(Window handle) {
-    pxembed_server_data temp = xembed_list;
-    while (temp != NULL) {
-        if (temp->handle == handle) {
-            return temp;
-        }
-        temp = temp->next;
-    }
-    return NULL;
-}
-
-static pxembed_server_data
-getDataByEmbedder(jobject server) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    pxembed_server_data temp = xembed_list;
-    DASSERT(server != NULL);
-    while (temp != NULL) {
-        if ((*env)->IsSameObject(env, temp->server, server)) {
-            return temp;
-        }
-        temp = temp->next;
-    }
-    return NULL;
-}
-
-static pxembed_server_data
-getDataByServerHandle(Window serverHandle) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    pxembed_server_data temp = xembed_list;
-    Widget serverWidget = NULL;
-    if (serverHandle == None) {
-        return NULL;
-    }
-    serverWidget = XtWindowToWidget(awt_display, serverHandle);
-    while (temp != NULL) {
-        if (temp->serverHandle == serverHandle || temp->serverWidget == serverWidget) {
-            temp->serverHandle = serverWidget;
-            return temp;
-        }
-        temp = temp->next;
-    }
-    return NULL;
-}
-
-static pxembed_server_data
-addData(jobject server) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    struct ComponentData *cdata;
-    xembed_server_data * data = malloc(sizeof(xembed_server_data));
-    DASSERT(server != NULL);
-    memset(data, 0, sizeof(xembed_server_data));
-    data->server = server;
-    cdata = (struct ComponentData *)
-        JNU_GetLongFieldAsPtr(env, server, mComponentPeerIDs.pData);
-    DASSERT(cdata != NULL);
-    data->serverHandle = XtWindow(cdata->widget);
-    data->serverWidget = cdata->widget;
-    data->next = xembed_list;
-    xembed_list = data;
-    return data;
-}
-
-static void
-removeData(jobject server) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    pxembed_server_data * temp = &xembed_list;
-    DASSERT(server != NULL);
-    while (*temp != NULL) {
-        if ((*env)->IsSameObject(env, (*temp)->server, server)) {
-            xembed_server_data * data = *temp;
-            *temp = (*temp)->next;
-            DASSERT(data->server != NULL);
-            (*env)->DeleteGlobalRef(env, data->server);
-            free(data);
-            return;
-        }
-        temp = &(*temp)->next;
-    }
-}
-
-void
-initXEmbedServerData() {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    jclass clazz;
-    MTRACE("initXEmbedServerData\n");
-    XA_XEmbedInfo = XInternAtom(awt_display, "_XEMBED_INFO", False);
-    XA_XEmbed = XInternAtom(awt_display, "_XEMBED", False);
-
-    clazz = (*env)->FindClass(env, "sun/awt/motif/MEmbedCanvasPeer");
-    DASSERT(clazz != NULL);
-    requestXEmbedFocusMID = (*env)->GetMethodID(env, clazz, "requestXEmbedFocus", "()V");
-    DASSERT(requestXEmbedFocusMID != NULL);
-    focusNextMID = (*env)->GetMethodID(env, clazz, "focusNext", "()V");
-    DASSERT(focusNextMID != NULL);
-    focusPrevMID = (*env)->GetMethodID(env, clazz, "focusPrev", "()V");
-    DASSERT(focusPrevMID != NULL);
-    registerAcceleratorMID = (*env)->GetMethodID(env, clazz, "registerAccelerator", "(JJJ)V");
-    DASSERT(registerAcceleratorMID != NULL);
-    unregisterAcceleratorMID = (*env)->GetMethodID(env, clazz, "unregisterAccelerator", "(J)V");
-    DASSERT(unregisterAcceleratorMID != NULL);
-    grabKeyMID = (*env)->GetMethodID(env, clazz, "grabKey", "(JJ)V");
-    DASSERT(grabKeyMID != NULL);
-    ungrabKeyMID = (*env)->GetMethodID(env, clazz, "ungrabKey", "(JJ)V");
-    DASSERT(ungrabKeyMID != NULL);
-    childResizedMID = (*env)->GetMethodID(env, clazz, "childResized", "()V");
-    DASSERT(childResizedMID != NULL);
-    setXEmbedDropTargetMID =
-        (*env)->GetMethodID(env, clazz, "setXEmbedDropTarget", "()V");
-    DASSERT(setXEmbedDropTargetMID != NULL);
-    removeXEmbedDropTargetMID =
-        (*env)->GetMethodID(env, clazz, "removeXEmbedDropTarget", "()V");
-    DASSERT(removeXEmbedDropTargetMID != NULL);
-
-    applicationActiveFID = (*env)->GetFieldID(env, clazz, "applicationActive", "Z");
-    DASSERT(applicationActiveFID != NULL);
-    (*env)->DeleteLocalRef(env, clazz);
-
-    clazz = (*env)->FindClass(env, "sun/awt/motif/GrabbedKey");
-    DASSERT(clazz != NULL);
-    keysymFID = (*env)->GetFieldID(env, clazz, "keysym", "J");
-    DASSERT(keysymFID != NULL);
-    modifiersFID = (*env)->GetFieldID(env, clazz, "modifiers", "J");
-    DASSERT(modifiersFID != NULL);
-    (*env)->DeleteLocalRef(env, clazz);
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    initXEmbedServer
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_initXEmbedServer(JNIEnv *env, jobject this) {
-    struct ComponentData *cdata;
-    AWT_LOCK();
-    MTRACE("initXEmbedServer\n");
-    addData((*env)->NewGlobalRef(env, this));
-    if (XA_XEmbedInfo == None) {
-        initXEmbedServerData();
-    }
-    cdata = (struct ComponentData *)
-        JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-/*     XSelectInput(awt_display, XtWindow(cdata->widget), SubstructureNotifyMask); */
-    XtAddEventHandler(cdata->widget,
-                      SubstructureNotifyMask,
-                      False, null_event_handler, NULL);
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    destroyXEmbedServer
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_destroyXEmbedServer(JNIEnv *env, jobject this) {
-    AWT_LOCK();
-    MTRACE("destroyXEmbedServer\n");
-    removeData(this);
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    isXEmbedActive
- * Signature: ()Z
- */
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_isXEmbedActive(JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    jboolean res = JNI_FALSE;
-    AWT_LOCK();
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        res = (sdata->handle != None)?JNI_TRUE:JNI_FALSE;
-    }
-    AWT_UNLOCK();
-    return res;
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    initDispatching
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_initDispatching (JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("initDispatching\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        XSelectInput(awt_display, sdata->handle, StructureNotifyMask | PropertyChangeMask);
-        sdata->dispatching = True;
-        register_xembed_drop_site(env, awt_display, sdata->server,
-                                  sdata->serverHandle, sdata->handle);
-    }
-    processXEmbedInfo(env, this);
-    Java_sun_awt_motif_MEmbedCanvasPeer_notifyChildEmbedded(env, this);
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    endDispatching
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_endDispatching (JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("endDispatching\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        unregister_xembed_drop_site(env, awt_display, sdata->server,
-                                    sdata->serverHandle, sdata->handle);
-        sdata->dispatching = False;
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    embedChild
- * Signature: (J)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_embedChild (JNIEnv * env, jobject this, jlong handle) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("embedChild\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        if (sdata->handle != None) {
-            Java_sun_awt_motif_MEmbedCanvasPeer_detachChild(env, this);
-        }
-        sdata->handle = (Window)handle;
-        Java_sun_awt_motif_MEmbedCanvasPeer_initDispatching(env, this);
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    childDestroyed
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_childDestroyed (JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("childDestroyed\n");
-    Java_sun_awt_motif_MEmbedCanvasPeer_endDispatching(env, this);
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        sdata->handle = None;
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    getEmbedPreferredSize
- * Signature: ()Ljava/awt/Dimension;
- */
-JNIEXPORT jobject JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedPreferredSize (JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    jobject res = NULL;
-    XSizeHints * hints;
-    long dummy;
-    AWT_LOCK();
-    MTRACE("getPreferredSize\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        hints = XAllocSizeHints();
-        DASSERT(hints != NULL);
-        DASSERT(sdata->handle != None);
-        if (XGetWMNormalHints(awt_display, sdata->handle, hints, &dummy) == Success) {
-            res = createDimension(env, hints->width, hints->height);
-        }
-        XFree(hints);
-    }
-    AWT_UNLOCK();
-    return res;
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    getEmbedMinimumSize
- * Signature: ()Ljava/awt/Dimension;
- */
-JNIEXPORT jobject JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedMinimumSize (JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    jobject res = NULL;
-    XSizeHints * hints;
-    long dummy;
-    AWT_LOCK();
-    MTRACE("getMinimumSize\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        hints = XAllocSizeHints();
-        DASSERT(hints != NULL);
-        DASSERT(sdata->handle != None);
-        if (XGetWMNormalHints(awt_display, sdata->handle, hints, &dummy) == Success) {
-            res = createDimension(env, hints->min_width, hints->min_height);
-        }
-        XFree(hints);
-    }
-    AWT_UNLOCK();
-    return res;
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    getClientBounds
- * Signature: ()Ljava/awt/Rectangle;
- */
-JNIEXPORT jobject JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_getClientBounds (JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    jobject res = NULL;
-    AWT_LOCK();
-    MTRACE("getClientBounds\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        XWindowAttributes attrs;
-        DASSERT(sdata->handle != None);
-        if (XGetWindowAttributes(awt_display, sdata->handle, &attrs) == Success) {
-            res = createRectangle(env, attrs.x, attrs.y, attrs.width, attrs.height);
-        }
-    }
-    AWT_UNLOCK();
-    return res;
-}
-
-Boolean
-isApplicationActive(JNIEnv * env, jobject this) {
-    return (*env)->GetBooleanField(env, this, applicationActiveFID);
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    notifyChildEmbedded
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_notifyChildEmbedded (JNIEnv *env, jobject this) {
-    struct ComponentData *cdata;
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("notifyChildEmbedded\n");
-    cdata = (struct ComponentData *)
-        JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        DASSERT(sdata->handle != None);
-        DASSERT(cdata != NULL);
-        DASSERT(XtWindow(cdata->widget) != None);
-        sendMessageHelper(sdata->handle, XEMBED_EMBEDDED_NOTIFY, XtWindow(cdata->widget), min(sdata->version, XEMBED_VERSION), 0);
-        if (isApplicationActive(env, this)) {
-            sendMessage(sdata->handle, XEMBED_WINDOW_ACTIVATE);
-        }
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    detachChild
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_detachChild (JNIEnv *env, jobject this) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("detachChild\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        /**
-         *  XEmbed specification:
-         *  "The embedder can unmap the client and reparent the client window to the root window. If the
-         *  client receives an ReparentNotify event, it should check the parent field of the XReparentEvent
-         *  structure. If this is the root window of the window's screen, then the protocol is finished and
-         *  there is no further interaction. If it is a window other than the root window, then the protocol
-         *  continues with the new parent acting as the embedder window."
-         */
-        DASSERT(sdata->handle != None);
-        XUnmapWindow(awt_display, sdata->handle);
-        XReparentWindow(awt_display, sdata->handle, DefaultRootWindow(awt_display), 0, 0);
-        Java_sun_awt_motif_MEmbedCanvasPeer_endDispatching(env, this);
-        sdata->handle = None;
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    forwardKeyEvent
- * Signature: (Ljava/awt/event/KeyEvent;)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_forwardKeyEvent (JNIEnv *env, jobject this, jobject event) {
-    pxembed_server_data sdata;
-    jbyteArray array;
-    XEvent *xevent;
-    AWT_LOCK();
-    MTRACE("forwardKeyEvent\n");
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        DASSERT(sdata->handle != None);
-        array = (jbyteArray)(*env)->GetObjectField(env, event, awtEventIDs.bdata);
-        if (array == NULL) {
-            MTRACE("array is null\n");
-            AWT_UNLOCK();
-            return;
-        }
-
-        xevent = (XEvent *)(*env)->GetByteArrayElements(env, array, NULL);
-        if (xevent == NULL) {
-            (*env)->DeleteLocalRef(env, array);
-            MTRACE("xevent is null\n");
-            AWT_UNLOCK();
-            return;
-        }
-        xevent->xany.window = sdata->handle;
-        XSendEvent(awt_display, sdata->handle, False, NoEventMask, xevent);
-        (*env)->DeleteLocalRef(env, array);
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    getAWTKeyCodeForKeySym
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_getAWTKeyCodeForKeySym (JNIEnv *env, jobject this, jint keysym) {
-    jint keycode = java_awt_event_KeyEvent_VK_UNDEFINED;
-    Boolean mapsToUnicodeChar;
-    jint keyLocation;
-    keysymToAWTKeyCode(keysym, &keycode, &mapsToUnicodeChar, &keyLocation);
-    return keycode;
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    sendMessage
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__I (JNIEnv *env, jobject this, jint msg) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACEP2("sendMessage %d(%s)\n", msg, msg_to_str(msg));
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        DASSERT(sdata->handle != None);
-        sendMessage(sdata->handle, msg);
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    sendMessage
- * Signature: (IJJJ)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__IJJJ (JNIEnv *env, jobject this, jint msg, jlong detail, jlong data1, jlong data2) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACEP5("sendMessage2 msg %d(%s) detail %d data: %d %d\n", msg, msg_to_str(msg), detail, data1, data2);
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        DASSERT(sdata->handle != None);
-        sendMessageHelper(sdata->handle, msg, detail, data1, data2);
-    }
-    AWT_UNLOCK();
-}
-
-static jobject
-createRectangle(JNIEnv* env, int x, int y, int width, int height) {
-    static jclass clazz;
-    static jmethodID mid;
-    jobject rect = NULL;
-    if (mid == 0) {
-        jclass l_clazz = (*env)->FindClass(env, "java/awt/Rectangle");
-        DASSERT(l_clazz != NULL);
-        mid = (*env)->GetMethodID(env, clazz, "<init>", "(IIII)V");
-        DASSERT(mid != NULL);
-        clazz = (*env)->NewGlobalRef(env, l_clazz);
-        (*env)->DeleteLocalRef(env, l_clazz);
-    }
-    if (mid != NULL) {
-        rect = (*env)->NewObject(env, clazz, mid, x, y, width, height);
-        if ((*env)->ExceptionOccurred(env)) {
-            return NULL;
-        }
-    }
-    return rect;
-}
-
-static jobject
-createDimension(JNIEnv* env, int width, int height) {
-    static jclass clazz;
-    static jmethodID mid;
-    jobject dim = NULL;
-    if (mid == 0) {
-        jclass l_clazz = (*env)->FindClass(env, "java/awt/Dimension");
-        DASSERT(l_clazz != NULL);
-        mid = (*env)->GetMethodID(env, clazz, "<init>", "(II)V");
-        DASSERT(mid != NULL);
-        clazz = (*env)->NewGlobalRef(env, l_clazz);
-        (*env)->DeleteLocalRef(env, l_clazz);
-    }
-    if (mid != NULL) {
-        dim = (*env)->NewObject(env, clazz, mid, width, height);
-        if ((*env)->ExceptionOccurred(env)) {
-            return NULL;
-        }
-    }
-    return dim;
-}
-
-Boolean isMapped(Window w) {
-    XWindowAttributes attr;
-    Status status = 0;
-    WITH_XERROR_HANDLER(xerror_ignore_bad_window);
-    status = XGetWindowAttributes(awt_display, w, &attr);
-    RESTORE_XERROR_HANDLER;
-    if (status == 0 || xerror_code != Success) {
-        return False;
-    }
-    return !(attr.map_state == IsUnmapped);
-}
-
-static void
-processXEmbedInfo(JNIEnv * env, jobject this) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("processXEmbedInfo\n");
-    sdata = getDataByEmbedder(this);
-    if (Java_sun_awt_motif_MEmbedCanvasPeer_isXEmbedActive(env, this)) {
-        Atom actual_type;
-        int actual_format;
-        unsigned long nitems;
-        unsigned long bytes_after;
-        CARD32 * data = NULL;
-        DASSERT(sdata->handle != None);
-        if (XGetWindowProperty(awt_display, sdata->handle, XA_XEmbedInfo,
-                           0, 2, False, XA_XEmbedInfo, &actual_type,
-                           &actual_format, &nitems, &bytes_after,
-                               (unsigned char**)&data) != Success)
-        {
-            AWT_UNLOCK();
-            return;
-        }
-        if (actual_type == XA_XEmbedInfo && actual_format == 32
-            && nitems == 2)
-        {
-            CARD32 flags;
-            Boolean new_mapped, currently_mapped;
-            sdata->version = *data;
-            flags = *(data+1);
-            new_mapped = (flags & XEMBED_MAPPED) != 0;
-            currently_mapped = isMapped(sdata->handle);
-            if (new_mapped != currently_mapped) {
-                if (new_mapped) {
-                    XMapWindow(awt_display, sdata->handle);
-                } else {
-                    XUnmapWindow(awt_display, sdata->handle);
-                }
-            }
-        }
-        if (data != NULL) {
-            XFree(data);
-        }
-    }
-    AWT_UNLOCK();
-}
-
-/**
- * Handles client message on embedder
- */
-static void
-handleClientMessage(JNIEnv* env, jobject this, XClientMessageEvent * ev) {
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACEP5("handleClientMessage: 0=%ld 1=%ld 2=%ld 3=%ld 4=%ld\n",
-            ev->data.l[0], ev->data.l[1], ev->data.l[2], ev->data.l[3], ev->data.l[4]);
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL && sdata->handle != None) {
-        switch ((int)ev->data.l[1]) {
-          case XEMBED_REQUEST_FOCUS:
-              MTRACE("REQUEST_FOCUS\n");
-              (*env)->CallVoidMethod(env, this, requestXEmbedFocusMID);
-              break;
-          case XEMBED_FOCUS_NEXT:
-              MTRACE("FOCUS_NEXT\n");
-              (*env)->CallVoidMethod(env, this, focusNextMID);
-              break;
-          case XEMBED_FOCUS_PREV:
-              MTRACE("FOCUS_PREV\n");
-              (*env)->CallVoidMethod(env, this, focusPrevMID);
-              break;
-          case XEMBED_REGISTER_ACCELERATOR:
-              MTRACE("REGISTER_ACCEL\n");
-              (*env)->CallVoidMethod(env, this, registerAcceleratorMID,
-                                     (jlong)ev->data.l[2],
-                                     (jlong)ev->data.l[3],
-                                     (jlong)ev->data.l[4]);
-              break;
-          case XEMBED_UNREGISTER_ACCELERATOR:
-              MTRACE("UNREGISTER_ACCEL\n");
-              (*env)->CallVoidMethod(env, this, unregisterAcceleratorMID,
-                                     (jlong)ev->data.l[2]);
-              break;
-          case NON_STANDARD_XEMBED_GTK_GRAB_KEY:
-              MTRACE("GRAB_KEY\n");
-              (*env)->CallVoidMethod(env, this, grabKeyMID,
-                                     (jlong)ev->data.l[3],
-                                     (jlong)ev->data.l[4]);
-              break;
-          case NON_STANDARD_XEMBED_GTK_UNGRAB_KEY:
-              MTRACE("UNGRAB_KEY\n");
-              (*env)->CallVoidMethod(env, this, ungrabKeyMID,
-                                     (jlong)ev->data.l[3],
-                                     (jlong)ev->data.l[4]);
-          case _SUN_XEMBED_START:
-              MTRACE("XEMBED_START\n");
-              processXEmbedInfo(env, this);
-              Java_sun_awt_motif_MEmbedCanvasPeer_notifyChildEmbedded(env, this);
-              break;
-        }
-    }
-    AWT_UNLOCK();
-}
-
-/**
- * Handles property changes on xembed client
- */
-static void
-handlePropertyNotify(XPropertyEvent * ev) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("handlePropertyNotify\n");
-    sdata = getData(ev->window);
-    if (sdata != NULL) {
-        if (ev->atom == XA_WM_NORMAL_HINTS) {
-            DASSERT(sdata->server != NULL);
-            (*env)->CallVoidMethod(env, sdata->server, childResizedMID);
-            MTRACE("NORMAL_HINTS have changed\n");
-        } else if (ev->atom == XA_XdndAware) {
-            unregister_xembed_drop_site(env, awt_display, sdata->server,
-                                        sdata->serverHandle, sdata->handle);
-            if (ev->state == PropertyNewValue) {
-                register_xembed_drop_site(env, awt_display, sdata->server,
-                                          sdata->serverHandle, sdata->handle);
-            }
-        } else if (ev->atom == XA_XEmbedInfo) {
-            DASSERT(sdata->server != NULL);
-            MTRACE("XEMBED_INFO has changed\n");
-            processXEmbedInfo(env, sdata->server);
-        }
-    }
-    AWT_UNLOCK();
-}
-
-static void
-handleConfigureNotify(XConfigureEvent * ev) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    MTRACE("handleConfigureNotify\n");
-    sdata = getData(ev->window);
-    if (sdata != NULL) {
-        DASSERT(sdata->server != NULL);
-        (*env)->CallVoidMethod(env, sdata->server, childResizedMID);
-    }
-    AWT_UNLOCK();
-}
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    sendMessage
- * Signature: (IJJJ)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_GrabbedKey_initKeySymAndModifiers (JNIEnv *env, jobject this, jobject keyevent) {
-    jbyteArray array;
-    XEvent *xevent;
-    int keysym, modifiers;
-    int keycode;
-    AWT_LOCK();
-    array = (jbyteArray)(*env)->GetObjectField(env, keyevent, awtEventIDs.bdata);
-    if (array == NULL) {
-        AWT_UNLOCK();
-        return;
-    }
-    xevent = (XEvent *)(*env)->GetByteArrayElements(env, array, NULL);
-    if (xevent == NULL) {
-        (*env)->DeleteLocalRef(env, array);
-        AWT_UNLOCK();
-        return;
-    }
-    keycode = (*env)->GetIntField(env, keyevent, keyEventIDs.keyCode);
-    keysym = awt_getX11KeySym(keycode);
-    modifiers = xevent->xkey.state;
-    (*env)->SetLongField(env, this, keysymFID, (jlong)keysym);
-    (*env)->SetLongField(env, this, modifiersFID, (jlong)modifiers);
-    (*env)->DeleteLocalRef(env, array);
-    AWT_UNLOCK();
-}
-
-#ifdef __linux__
-void
-print_stack (void)
-{
-  void *array[10];
-  size_t size;
-  char **strings;
-  size_t i;
-
-  size = backtrace (array, 10);
-  strings = backtrace_symbols (array, size);
-
-  fprintf (stderr, "Obtained %zd stack frames.\n", size);
-
-  for (i = 0; i < size; i++)
-     fprintf (stderr, "%s\n", strings[i]);
-
-  free (strings);
-}
-#endif
-
-extern int32_t  numEventsHandled;
-
-XCreateWindowEvent cr;
-
-void
-dispatchEmbedderEvent(jobject server, XEvent * ev) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    DASSERT(server != NULL);
-    DASSERT(ev != NULL);
-    AWT_LOCK();
-/*     MTRACE("dispatchEmebddedEvent\n"); */
-    switch (ev->type) {
-      case CreateNotify:
-
-          MTRACEP3("CreateNotify for %x, serial %d, num events %d\n", (ev->xcreatewindow.window), (ev->xany.serial), (numEventsHandled));
-          Java_sun_awt_motif_MEmbedCanvasPeer_embedChild(env, server, ev->xcreatewindow.window);
-          break;
-      case DestroyNotify:
-          MTRACE("DestroyNotify\n");
-          Java_sun_awt_motif_MEmbedCanvasPeer_childDestroyed(env, server);
-          break;
-      case ReparentNotify:
-          MTRACEP2("ReparentNotify for %x, parent %x\n", (ev->xreparent.window), (ev->xreparent.parent));
-          Java_sun_awt_motif_MEmbedCanvasPeer_embedChild(env, server, ev->xreparent.window);
-          break;
-      case ClientMessage:
-          MTRACE("ClientMessage\n");
-          handleClientMessage(env, server, &ev->xclient);
-          break;
-    }
-    AWT_UNLOCK();
-}
-
-void
-dispatchEmbeddingClientEvent(XEvent * ev) {
-    DASSERT(ev != NULL);
-    MTRACE("dispatchEmbeddingClientEvent\n");
-    switch (ev->type) {
-      case PropertyNotify:
-          handlePropertyNotify(&ev->xproperty);
-          break;
-      case ConfigureNotify:
-          handleConfigureNotify(&ev->xconfigure);
-          break;
-    }
-}
-
-void
-xembed_serverEventHandler(XEvent * ev) {
-    pxembed_server_data sdata;
-    sdata = getData(ev->xany.window);
-    if (sdata != NULL) { // Event on client
-        dispatchEmbeddingClientEvent(ev);
-    } else {
-        sdata = getDataByServerHandle(ev->xany.window);
-        if (sdata != NULL) {
-            DASSERT(sdata->server != NULL);
-            dispatchEmbedderEvent(sdata->server, ev);
-        }
-    }
-}
-
-/**************************** XEmbed server DnD support ***********************/
-void
-set_xembed_drop_target(JNIEnv* env, jobject server) {
-
-    (*env)->CallVoidMethod(env, server, setXEmbedDropTargetMID);
-}
-
-void
-remove_xembed_drop_target(JNIEnv* env, jobject server) {
-    (*env)->CallVoidMethod(env, server, removeXEmbedDropTargetMID);
-}
-
-Boolean
-is_xembed_client(Window window) {
-    return getData(window) != NULL;
-}
-/******************************************************************************/
-
-/*
- * Class:     sun_awt_motif_MEmbedCanvasPeer
- * Method:    getWindow
- * Signature: ()V
- */
-JNIEXPORT jlong JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_getWindow(JNIEnv *env, jobject this) {
-    struct ComponentData *cdata;
-    Window res = None;
-    AWT_LOCK();
-    cdata = (struct ComponentData *)
-        JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-    DASSERT(cdata != NULL);
-    res = XtWindow(cdata->widget);
-    AWT_UNLOCK();
-    return (jlong)res;
-}
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbedCanvasPeer_forwardEventToEmbedded(JNIEnv *env,
-                                                           jobject this,
-                                                           jlong ctxt,
-                                                           jint eventID){
-    pxembed_server_data sdata;
-    AWT_LOCK();
-    sdata = getDataByEmbedder(this);
-    if (sdata != NULL) {
-        forward_event_to_embedded(sdata->handle, ctxt, eventID);
-    }
-    AWT_UNLOCK();
-}