jdk/src/solaris/native/sun/awt/awt_xembed.c
changeset 1192 715cf9378c53
parent 1051 90cf935adb35
parent 1191 f142c1da78c2
child 1193 41afb8ee8f45
--- a/jdk/src/solaris/native/sun/awt/awt_xembed.c	Wed Jul 05 16:40:31 2017 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,430 +0,0 @@
-/*
- * Copyright 2003-2005 Sun Microsystems, Inc.  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.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-#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>
-
-/* JNI headers */
-#include "java_awt_Frame.h"     /* for frame state constants */
-
-#include "awt_wm.h"
-#include "awt_util.h"           /* for X11 error handling macros */
-#include "awt_xembed.h"
-#include "awt_MToolkit.h"
-#include "awt_DataTransferer.h"   /* for DECLARE_XXX macros */
-
-#ifdef DOTRACE
-#define MTRACE(param) fprintf(myerr, param)
-#define MTRACEP1(format, p1) fprintf(myerr, format, p1)
-#define MTRACEP2(format, p1, p2) fprintf(myerr, format, p1, p2)
-#define MTRACEP3(format, p1, p2, p3) fprintf(myerr, format, p1, p2, p3)
-#define MTRACEP4(format, p1, p2, p3, p4) fprintf(myerr, format, p1, p2, p3, p4)
-#define MTRACEP5(format, p1, p2, p3, p4, p5) fprintf(myerr, format, p1, p2, p3, p4, p5)
-#define MTRACEP6(format, p1, p2, p3, p4, p5, p6) fprintf(myerr, format, p1, p2, p3, p4, p5, p6)
-#define MTRACEP7(format, p1, p2, p3, p4, p5, p6, p7) fprintf(myerr, 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
-
-#ifdef DOTRACE
-static FILE* myerr;
-#endif
-
-static Window getParent(Window window);
-static Window getEmbedder(Window client);
-static jmethodID handleFocusInMID;
-
-const char * error_msg = "UNKNOWN XEMBED MESSAGE";
-
-const char * xembed_strs[] = {
-    "EMBEDDED_NOTIFY",
-    "WINDOW_ACTIVATE",
-    "WINDOW_DEACTIVATE",
-    "REQUEST_FOCUS",
-    "FOCUS_IN",
-    "FOCUS_OUT",
-    "FOCUS_NEXT",
-    "FOCUS_PREV" ,
-    "GRAB_KEY",
-    "UNGRAB_KEY",
-    "MODALITY_ON" ,
-    "MODALITY_OFF",
-    "REGISTER_ACCELERATOR",
-    "UNREGISTER_ACCELERATOR",
-    "ACTIVATE_ACCELERATOR"
-};
-
-const char *
-msg_to_str(int msg) {
-    if (msg >= 0 && msg <= XEMBED_LAST_MSG) {
-        return xembed_strs[msg];
-    } else {
-        return error_msg;
-    }
-}
-
-DECLARE_JAVA_CLASS(MEmbeddedFramePeerClass, "sun/awt/motif/MEmbeddedFramePeer");
-
-typedef struct _xembed_info {
-    CARD32 version;
-    CARD32 flags;
-} xembed_info;
-
-typedef struct _xembed_data {
-    struct FrameData * wdata; // pointer to EmbeddedFrame wdata
-    Window client; // pointer to plugin intermediate widget, XEmbed client
-    Boolean active; // whether xembed is active for this client
-    Boolean applicationActive; // whether the embedding application is active
-    Window embedder; // Window ID of the embedder
-    struct _xembed_data * next;
-} xembed_data, * pxembed_data;
-
-static pxembed_data xembed_list = NULL;
-
-static pxembed_data
-getData(Window client) {
-    pxembed_data temp = xembed_list;
-    while (temp != NULL) {
-        if (temp->client == client) {
-            return temp;
-        }
-        temp = temp->next;
-    }
-    return NULL;
-}
-
-static pxembed_data
-getDataByFrame(struct FrameData* wdata) {
-    pxembed_data temp = xembed_list;
-    while (temp != NULL) {
-        if (temp->wdata == wdata) {
-            return temp;
-        }
-        temp = temp->next;
-    }
-    return NULL;
-}
-
-static pxembed_data
-addData(Window client) {
-    xembed_data * data = malloc(sizeof(xembed_data));
-    memset(data, 0, sizeof(xembed_data));
-    data->client = client;
-    data->next = xembed_list;
-    xembed_list = data;
-    return data;
-}
-
-static void
-removeData(Window client) {
-    pxembed_data * temp = &xembed_list;
-    while (*temp != NULL) {
-        if ((*temp)->client == client) {
-            xembed_data * data = *temp;
-            *temp = (*temp)->next;
-            free(data);
-            return;
-        }
-        temp = &(*temp)->next;
-    }
-}
-
-static Atom XA_XEmbedInfo;
-static Atom XA_XEmbed;
-
-void
-init_xembed() {
-    XA_XEmbedInfo = XInternAtom(awt_display, "_XEMBED_INFO", False);
-    XA_XEmbed = XInternAtom(awt_display, "_XEMBED", False);
-#ifdef DOTRACE
-    myerr = fopen("xembedclient.log","w");
-#endif
-}
-
-static Time
-getCurrentServerTime() {
-    return awt_util_getCurrentServerTime();
-}
-
-
-void
-sendMessageHelper(Window window, int message, long detail,
-                              long data1, long data2)
-{
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    XEvent ev;
-    XClientMessageEvent * req = (XClientMessageEvent*)&ev;
-    memset(&ev, 0, sizeof(ev));
-
-    req->type = ClientMessage;
-    req->window = window;
-    req->message_type = XA_XEmbed;
-    req->format = 32;
-    req->data.l[0] = getCurrentServerTime();
-    req->data.l[1] = message;
-    req->data.l[2] = detail;
-    req->data.l[3] = data1;
-    req->data.l[4] = data2;
-    AWT_LOCK();
-    XSendEvent(awt_display, window, False, NoEventMask, &ev);
-    AWT_UNLOCK();
-}
-
-void
-sendMessage(Window window, int message) {
-    sendMessageHelper(window, message, 0, 0, 0);
-}
-
-
-static Window
-getParent(Window window) {
-    Window root, parent = None, *children = NULL;
-    unsigned int count;
-    XQueryTree(awt_display, window, &root, &parent, &children, &count);
-    if (children != NULL) {
-        XFree(children);
-    }
-    return parent;
-}
-
-static Window
-getEmbedder(Window client) {
-    return getParent(client);
-}
-
-
-static void
-handleFocusIn(struct FrameData* wdata, int detail) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    struct WidgetInfo* winfo;
-    MTRACE("HandleFocusIn\n");
-    winfo = findWidgetInfo(wdata->winData.comp.widget);
-    if (winfo != NULL) {
-        jobject peer = winfo->peer;
-        if (handleFocusInMID == NULL) {
-            jclass clazz = (*env)->FindClass(env, "sun/awt/motif/MEmbeddedFramePeer");
-            DASSERT(clazz != NULL);
-            handleFocusInMID = (*env)->GetMethodID(env, clazz, "handleFocusIn", "(I)V");
-            DASSERT(handleFocusInMID != NULL);
-            if (clazz != NULL) {
-                (*env)->DeleteLocalRef(env, clazz);
-            }
-        }
-        if (handleFocusInMID != NULL) {
-            (*env)->CallVoidMethod(env, peer, handleFocusInMID, (jint)detail);
-        }
-    }
-}
-
-static void
-genWindowFocus(struct FrameData *wdata, Boolean gain) {
-    XEvent ev;
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    memset(&ev, 0, sizeof(ev));
-
-    ev.type = (gain?FocusIn:FocusOut);
-    ev.xany.send_event = True;
-    ev.xany.display = awt_display;
-    ev.xfocus.mode = NotifyNormal;
-    ev.xfocus.detail = NotifyNonlinear;
-    ev.xfocus.window = XtWindow(wdata->winData.shell);
-    awt_put_back_event(env, &ev);
-}
-
-extern Boolean skipNextFocusIn;
-
-static void
-callNotifyStarted(JNIEnv* env, jobject peer) {
-    DECLARE_VOID_JAVA_METHOD(notifyStartedMID, MEmbeddedFramePeerClass,
-                             "notifyStarted", "()V");
-
-    (*env)->CallVoidMethod(env, peer, notifyStartedMID);
-}
-
-void
-xembed_eventHandler(XEvent *event)
-{
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    struct FrameData *wdata;
-    xembed_data * data;
-
-    data = getData(event->xany.window);
-    if (data == NULL) {
-        MTRACEP1("No XEMBED client registered for this window %x\n", event->xany.window);
-        if (event->xany.type == ClientMessage) {
-            MTRACEP7("Unprocessed handleClientMessage: type=%d 0=%ld 1=%ld(%s) 2=%ld 3=%ld 4=%ld\n",
-                     event->xclient.message_type, event->xclient.data.l[0],
-                     event->xclient.data.l[1], msg_to_str(event->xclient.data.l[1]),
-                     event->xclient.data.l[2],
-                     event->xclient.data.l[3], event->xclient.data.l[4]);
-        }
-        return;
-    }
-
-    wdata = data->wdata;
-
-    if (event->xany.type == ClientMessage) {
-        MTRACEP6("handleClientMessage: type=%d 0=%ld 1=%ld 2=%ld 3=%ld 4=%ld\n",
-                 event->xclient.message_type, event->xclient.data.l[0],
-                 event->xclient.data.l[1], event->xclient.data.l[2],
-                 event->xclient.data.l[3], event->xclient.data.l[4]);
-        // Probably a message from embedder
-        if (event->xclient.message_type == XA_XEmbed) {
-            // XEmbed message, data[1] contains message
-            switch ((int)event->xclient.data.l[1]) {
-              case XEMBED_EMBEDDED_NOTIFY:
-                  MTRACE("EMBEDDED_NOTIFY\n");
-                  data->active = True;
-                  data->embedder = getEmbedder(data->client);
-                  // If Frame has not been reparented already we should "reparent"
-                  // it manually
-                  if (!(wdata->reparented)) {
-                      wdata->reparented = True;
-                      // in XAWT we also update WM_NORMAL_HINTS here.
-                  }
-                  {
-                      struct WidgetInfo* winfo =
-                          findWidgetInfo(wdata->winData.comp.widget);
-                      JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_4);
-                      if (winfo != NULL) {
-                          callNotifyStarted(env, winfo->peer);
-                      }
-                  }
-                  MTRACE("Embedded notify in client\n");
-                  break;
-              case XEMBED_WINDOW_DEACTIVATE:
-                  MTRACE("DEACTIVATE\n");
-                  data->applicationActive = False;
-                  break;
-              case XEMBED_WINDOW_ACTIVATE:
-                  MTRACE("ACTIVATE\n");
-                  data->applicationActive = True;
-                  break;
-              case XEMBED_FOCUS_IN:
-                  MTRACE("FOCUS IN\n");
-                  skipNextFocusIn = False;
-                  handleFocusIn(wdata, (int)(event->xclient.data.l[2]));
-                  genWindowFocus(wdata, True);
-                  break;
-              case XEMBED_FOCUS_OUT:
-                  MTRACE("FOCUS OUT\n");
-                  genWindowFocus(wdata, False);
-                  break;
-            }
-        }
-    } else if (event->xany.type == ReparentNotify) {
-        data->embedder = event->xreparent.parent;
-    }
-}
-
-void
-notify_ready(Window client) {
-    sendMessage(getEmbedder(client), _SUN_XEMBED_START);
-}
-
-void
-install_xembed(Widget client_widget, struct FrameData* wdata) {
-    JNIEnv      *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-    xembed_info info = {XEMBED_VERSION, XEMBED_MAPPED};
-    Window client = XtWindow(client_widget);
-    xembed_data * data;
-
-    AWT_LOCK();
-    data = addData(client);
-    data->wdata = wdata;
-
-    // Install event handler for messages from embedder
-    XSelectInput(awt_display, client, StructureNotifyMask);
-
-    // Install XEMBED_INFO information
-    XChangeProperty(awt_display, client, XA_XEmbedInfo,
-                    XA_XEmbedInfo, 32, PropModeReplace,
-                    (unsigned char*)&info, 2);
-    MTRACE("Installing xembed\n");
-
-    notify_ready(client);
-
-    AWT_UNLOCK();
-}
-
-void
-deinstall_xembed(struct FrameData* wdata) {
-    xembed_data * data = getDataByFrame(wdata);
-
-    if (data != NULL) {
-        removeData(data->client);
-    }
-}
-
-void
-requestXEmbedFocus(struct FrameData * wdata) {
-    xembed_data * data = getDataByFrame(wdata);
-
-    if (data != NULL) {
-        if (data->active && data->applicationActive) {
-            sendMessage(data->embedder, XEMBED_REQUEST_FOCUS);
-        }
-    }
-}
-
-Boolean
-isXEmbedActive(struct FrameData * wdata) {
-    xembed_data * data = getDataByFrame(wdata);
-    return (data != NULL && data->active);
-}
-
-Boolean
-isXEmbedActiveByWindow(Window client) {
-    xembed_data * data = getData(client);
-    return (data != NULL && data->active);
-}
-
-
-Boolean
-isXEmbedApplicationActive(struct FrameData * wdata) {
-    xembed_data * data = getDataByFrame(wdata);
-    return (data != NULL && data->applicationActive);
-}
-
-void
-xembed_traverse_out(struct FrameData * wdata, jboolean direction) {
-    xembed_data * data = getDataByFrame(wdata);
-    sendMessage(data->embedder, (direction == JNI_TRUE)?XEMBED_FOCUS_NEXT:XEMBED_FOCUS_PREV);
-}