--- a/jdk/src/solaris/native/sun/awt/awt_TopLevel.c Thu Sep 11 11:25:48 2008 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5095 +0,0 @@
-/*
- * Copyright 1999-2007 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/Shell.h>
-#include <Xm/VendorS.h>
-#include <Xm/Form.h>
-#include <Xm/DialogS.h>
-#include <Xm/AtomMgr.h>
-#include <Xm/Protocols.h>
-#include <Xm/MenuShell.h>
-#include <Xm/MwmUtil.h>
-#include "VDrawingArea.h"
-
-#ifdef DEBUG
-# include <X11/Xmu/Editres.h>
-#endif
-
-#include <jni.h>
-#include <jni_util.h>
-
-/* JNI headers */
-#include "java_awt_Color.h"
-#include "java_awt_Component.h"
-#include "java_awt_Dialog.h"
-#include "java_awt_Font.h"
-#include "java_awt_Frame.h"
-#include "java_awt_Image.h"
-#include "java_awt_Insets.h"
-#include "java_awt_Insets.h"
-#include "java_awt_MenuBar.h"
-#include "java_awt_Window.h"
-#include "java_awt_event_FocusEvent.h"
-#include "java_awt_TrayIcon.h"
-#include "sun_awt_EmbeddedFrame.h"
-#include "sun_awt_motif_MComponentPeer.h"
-#include "sun_awt_motif_MDialogPeer.h"
-#include "sun_awt_motif_MEmbeddedFramePeer.h"
-#include "sun_awt_motif_MFramePeer.h"
-#include "sun_awt_motif_MMenuBarPeer.h"
-#include "sun_awt_motif_MWindowPeer.h"
-
-/* JNI field and method ids */
-#include "awt_Component.h"
-#include "awt_GraphicsEnv.h"
-#include "awt_Insets.h"
-#include "awt_MenuBar.h"
-#include "awt_Window.h"
-#include "awt_KeyboardFocusManager.h"
-#include "awt_MToolkit.h"
-#include "awt_Plugin.h"
-
-#include "color.h"
-#include "canvas.h"
-#include "awt_util.h"
-#include "img_util.h"
-#include "awt_wm.h"
-#include "awt_util.h"
-#include "awt_xembed.h"
-
-
-#ifdef __linux__
-void adjustStatusWindow(Widget shell);
-#endif
-/* For the moment only InputMethodWindow is taking advantage of
-** the posibility for different decor styles
-** values could be passed are the MWM_DECOR defines
-** for the moment we are full on or full off.
-*/
-#define AWT_NO_DECOR 0x0
-#define AWT_FULL_DECOR MWM_DECOR_ALL
-
-static void reshape(JNIEnv *env, jobject this, struct FrameData *wdata,
- jint x, jint y, jint w, jint h, Boolean setXY);
-Widget findTopLevelByShell(Widget widget);
-
-extern EmbeddedFrame *theEmbeddedFrameList;
-extern struct ComponentIDs componentIDs;
-extern struct MMenuBarPeerIDs mMenuBarPeerIDs;
-extern struct MComponentPeerIDs mComponentPeerIDs;
-struct WindowIDs windowIDs;
-struct MWindowPeerIDs mWindowPeerIDs;
-extern struct InsetsIDs insetsIDs;
-extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs;
-extern struct KeyboardFocusManagerIDs keyboardFocusManagerIDs;
-extern struct X11GraphicsDeviceIDs x11GraphicsDeviceIDs;
-
-#ifndef NOMODALFIX
-extern Boolean awt_isModal();
-extern Boolean awt_isWidgetModal(Widget w);
-extern void awt_shellPoppedUp(Widget shell, XtPointer c, XtPointer d);
-extern void awt_shellPoppedDown(Widget shell, XtPointer c, XtPointer d);
-#endif //NOMODALFIX
-
-static jclass inputMethodWindowClass = NULL;
-
-static int32_t globalTopGuess = 0;
-static int32_t globalLeftGuess = 0;
-static int32_t globalBottomGuess = 0;
-static int32_t globalRightGuess = 0;
-
-
-// Atom used for otlogenniy top-level disposal
-static Atom _XA_JAVA_DISPOSE_PROPERTY_ATOM = 0;
-
-/*
- * Fix for bug 4141361
- *
- * We keep a linked list of the FrameData information for
- * every top level window.
- */
-struct FrameDataList {
- struct FrameData* wdata;
- struct FrameDataList* next;
-};
-
-static struct FrameDataList* allTopLevel = NULL;
-
-extern void checkNewXineramaScreen(JNIEnv* env, jobject peer,
- struct FrameData* wdata,
- int32_t newX, int32_t newY,
- int32_t newWidth, int32_t newHeight);
-
-// Returns false if this Window is non-focusable
-// or its nearest decorated parent is non-focusable.
-Boolean isFocusableWindowByPeer(JNIEnv * env, jobject peer) {
- jobject target, decoratedParent;
- struct FrameData *wdata;
- Boolean focusable;
-
- wdata = (struct FrameData *)JNU_GetLongFieldAsPtr(env, peer, mComponentPeerIDs.pData);
- DASSERT(wdata != NULL);
-
- target = (*env)->GetObjectField(env, peer, mComponentPeerIDs.target);
- DASSERT(target != NULL);
-
- decoratedParent = getOwningFrameOrDialog(target, env);
- (*env)->DeleteLocalRef(env, target);
-
- if (decoratedParent == NULL) {
- return wdata->isFocusableWindow;
- } else {
- jobject parentPeer = (*env)->GetObjectField(env, decoratedParent, componentIDs.peer);
- DASSERT(parentPeer != NULL);
- focusable = wdata->isFocusableWindow && isFocusableWindowByPeer(env, parentPeer);
-
- (*env)->DeleteLocalRef(env, decoratedParent);
- (*env)->DeleteLocalRef(env, parentPeer);
- }
- return focusable;
-}
-
-// Returns false if this shell's Java Window is non-focusable
-// or its nearest decorated parent is non-focusable.
-// Returns true otherwise or if any of parameters is NULL
-Boolean isFocusableWindowByShell(JNIEnv* env, Widget shell) {
- Widget toplevel;
- jobject peer;
- Boolean focusable;
-
- DASSERT(shell != NULL && XtIsShell(shell));
- if (shell == NULL) return True;
- if (!XtIsShell(shell)) return True;
-
- toplevel = findTopLevelByShell(shell);
- if (toplevel == NULL) {
- return True;
- }
- peer = findPeer(&toplevel);
- DASSERT(peer != NULL);
-
- if (env == NULL) {
- env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- }
- return isFocusableWindowByPeer(env, peer);
-}
-
-
-// Returns Shell widget - the parent of this child
-Widget getShellWidget(Widget child) {
-
- while (child != NULL && !XtIsShell(child)) {
- child = XtParent(child);
- }
- return child;
-}
-
-// Returns false if the parent shell of this widget is non-focusable Java Window.
-// Returns false otherwise.
-// Doesn't accept NULL parameters.
-Boolean isFocusableComponentTopLevelByWidget(JNIEnv * env, Widget child) {
- Widget shell = NULL;
- shell = getShellWidget(child);
- DASSERT(shell);
- return isFocusableWindowByShell(env, shell);
-}
-
-
-/*
- * Add a new element into the top level window list
- */
-void addTopLevel(struct FrameData* wdata) {
- struct FrameDataList* newNode;
- newNode = (struct FrameDataList*)
- malloc(sizeof(struct FrameDataList));
- newNode->wdata = wdata;
- newNode->next = allTopLevel;
- allTopLevel = newNode;
-}
-
-/*
- * Remove an element from the top level window list
- * (recursive)
- */
-Boolean removeTopLevelR(struct FrameDataList** ptr,
- struct FrameData* wdata) {
- struct FrameDataList* node = *ptr;
- if (node == NULL) {
- return False;
- }
- if (node->wdata == wdata) {
- *ptr = node->next;
- free(node);
- return True;
- }
- return removeTopLevelR(&(node->next), wdata);
-}
-
-Boolean removeTopLevel(struct FrameData* wdata) {
- return removeTopLevelR(&allTopLevel, wdata);
-}
-
-/*
- * Return the Widget ID of the top level window underneath the
- * mouse pointer.
- */
-Widget awt_GetWidgetAtPointer() {
- struct FrameDataList* ptr = allTopLevel;
- Window rootWindow, childWindow, mainWindow;
- int32_t xw, yw, xr, yr;
- uint32_t keys;
- while (ptr != NULL) {
- mainWindow = XtWindow(ptr->wdata->mainWindow);
- XQueryPointer(awt_display, mainWindow,
- &rootWindow, &childWindow, &xr, &yr, &xw, &yw, &keys);
- if (childWindow != None) {
- return ptr->wdata->winData.comp.widget;
- }
- ptr = ptr->next;
- }
- return NULL;
-}
-
-Widget findFocusProxy(Widget widget) {
- struct FrameDataList* ptr = allTopLevel;
- for (ptr = allTopLevel; ptr != NULL; ptr = ptr->next) {
- if (ptr->wdata->winData.comp.widget == widget) {
- return ptr->wdata->focusProxy;
- }
- }
- return NULL;
-}
-
-Widget findTopLevelByShell(Widget widget) {
- struct FrameDataList* ptr;
- for (ptr = allTopLevel; ptr != NULL; ptr = ptr->next) {
- if (ptr->wdata->winData.shell == widget) {
- return ptr->wdata->winData.comp.widget;
- }
- }
- return NULL;
-}
-
-void
-awt_Frame_guessInsets(struct FrameData *wdata)
-{
- if (wdata->decor == AWT_NO_DECOR ) {
- wdata->top = wdata->topGuess = 0;
- wdata->left = wdata->leftGuess = 0;
- wdata->bottom = wdata->bottomGuess = 0;
- wdata->right = wdata->rightGuess = 0;
- return;
- }
-
- if (globalTopGuess == 0) {
- char *insets_env;
-
- if (wdata->top >= 0) {
- /* insets were set on wdata by System Properties */
- globalTopGuess = wdata->top;
- globalLeftGuess = wdata->left;
- globalBottomGuess = wdata->bottom;
- globalRightGuess = wdata->right;
- }
- else switch (awt_wm_getRunningWM()) {
- case ENLIGHTEN_WM:
- globalTopGuess = 19;
- globalLeftGuess = 4;
- globalBottomGuess = 4;
- globalRightGuess = 4;
- break;
-
- case CDE_WM:
- globalTopGuess = 28;
- globalLeftGuess = 6;
- globalBottomGuess = 6;
- globalRightGuess = 6;
- break;
-
- case MOTIF_WM:
- case OPENLOOK_WM:
- default:
- globalTopGuess = 25;
- globalLeftGuess = 5;
- globalBottomGuess = 5;
- globalRightGuess = 5;
- break;
- }
-
- if ((insets_env = getenv("AWT_INSETS")) != NULL) {
- int guess = atoi(insets_env);
- globalTopGuess = (guess & 0xff00) >> 8;
- globalLeftGuess = guess & 0x00ff;
- globalBottomGuess = wdata->leftGuess;
- globalRightGuess = wdata->leftGuess;
- }
-
- /* don't allow bizarly large insets */
- if ((globalTopGuess > 64) || (globalTopGuess < 0))
- globalTopGuess = 28;
- if ((globalLeftGuess > 32) || (globalLeftGuess < 0))
- globalLeftGuess = 6;
- if ((globalBottomGuess > 32) || (globalBottomGuess < 0))
- globalBottomGuess = 6;
- if ((globalRightGuess > 32) || (globalRightGuess < 0))
- globalRightGuess = 6;
- }
-
- wdata->top = wdata->topGuess = globalTopGuess;
- wdata->left = wdata->leftGuess = globalLeftGuess;
- wdata->bottom = wdata->bottomGuess = globalBottomGuess;
- wdata->right = wdata->rightGuess = globalRightGuess;
-}
-
-/*
- * To keep input method windows floating, maintain a list of all
- * input method windows here. When some top level window gets
- * activated, moved, or resized, these input method windows need
- * to be brought on top.
- */
-static struct FrameDataList* allInputMethodWindow = NULL;
-
-/*
- * Add a new element into the input method window list
- */
-void addInputMethodWindow(struct FrameData* wdata) {
- struct FrameDataList* newNode;
- newNode = (struct FrameDataList*)
- malloc(sizeof(struct FrameDataList));
- newNode->wdata = wdata;
- newNode->next = allInputMethodWindow;
- allInputMethodWindow = newNode;
-}
-
-/*
- * Remove an element from the top level window list
- * (recursive)
- */
-Boolean removeInputMethodWindowR(struct FrameDataList** ptr,
- struct FrameData* wdata) {
- struct FrameDataList* node = *ptr;
- if (node == NULL) {
- return False;
- }
- if (node->wdata == wdata) {
- *ptr = node->next;
- free(node);
- return True;
- }
- return removeInputMethodWindowR(&(node->next), wdata);
-}
-
-Boolean removeInputMethodWindow(struct FrameData* wdata) {
- return removeInputMethodWindowR(&allInputMethodWindow, wdata);
-}
-
-/*
- * Raise input method windows
- */
-void raiseInputMethodWindow(struct FrameData* wdata) {
- struct FrameDataList* node = allInputMethodWindow;
-
- if (wdata->isInputMethodWindow) {
- return;
- }
-
- while (node != NULL) {
- XRaiseWindow(awt_display, XtWindow(node->wdata->winData.shell));
- node = node->next;
- }
-}
-
-/* fieldIDs for Frame fields that may be accessed from C */
-static struct FrameIDs {
- jfieldID resizable;
- jfieldID state;
-} frameIDs;
-
-/*
- * Class: java_awt_Frame
- * Method: initIDs
- * Signature: ()V
- */
-
-/* This function gets called from the static initializer for Frame.java
- to initialize the fieldIDs for fields that may be accessed from C */
-JNIEXPORT void JNICALL
-Java_java_awt_Frame_initIDs
- (JNIEnv *env, jclass cls)
-{
- frameIDs.resizable = (*env)->GetFieldID(env, cls, "resizable", "Z");
- frameIDs.state = (*env)->GetFieldID(env, cls, "state", "I");
-}
-
-/* ******* */
-/* Dialogs */
-/* ******* */
-/* No longer have a need for unique fields for query */
-static struct DialogIDs {
- jfieldID modal;
- jfieldID resizable;
-} dialogIDs;
-
-JNIEXPORT void JNICALL
-Java_java_awt_Dialog_initIDs
- (JNIEnv *env, jclass cls)
-{
-#if 0
- dialogIDs.modal = (*env)->GetFieldID(env, cls, "modal", "Z");
- dialogIDs.resizable = (*env)->GetFieldID(env, cls, "resizable", "Z");
-#endif
-}
-
-/* ******* */
-/* Windows */
-/* ******* */
-
-JNIEXPORT void JNICALL
-Java_java_awt_Window_initIDs
- (JNIEnv *env, jclass cls)
-{
- windowIDs.warningString = (*env)->GetFieldID(env, cls, "warningString",
- "Ljava/lang/String;");
- windowIDs.resetGCMID = (*env)->GetMethodID(env, cls, "resetGC",
- "()V");
-
- windowIDs.locationByPlatform = (*env)->GetFieldID(env, cls, "locationByPlatform",
- "Z");
- windowIDs.isAutoRequestFocus = (*env)->GetFieldID(env, cls, "autoRequestFocus", "Z");
-
- DASSERT(windowIDs.resetGCMID);
-}
-
-/*
- * Class: sun_motif_awt_WindowAttributes
- * Method: initIDs
- * Signature: ()V
- */
-
-static struct MWindowAttributeIDs {
- jfieldID nativeDecor;
- jfieldID initialFocus;
- jfieldID isResizable;
- jfieldID initialState;
- jfieldID visibilityState;
- jfieldID decorations;
-} mWindowAttributeIDs;
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowAttributes_initIDs
- (JNIEnv *env, jclass cls)
-{
- mWindowAttributeIDs.nativeDecor =
- (*env)->GetFieldID(env, cls, "nativeDecor", "Z");
- mWindowAttributeIDs.initialFocus =
- (*env)->GetFieldID(env, cls, "initialFocus", "Z");
- mWindowAttributeIDs.isResizable =
- (*env)->GetFieldID(env, cls, "isResizable", "Z");
- mWindowAttributeIDs.initialState =
- (*env)->GetFieldID(env, cls, "initialState", "I");
- mWindowAttributeIDs.visibilityState =
- (*env)->GetFieldID(env, cls, "visibilityState", "I");
- mWindowAttributeIDs.decorations =
- (*env)->GetFieldID(env, cls, "decorations", "I");
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: initIDs
- * Signature: ()V
- */
-
-/* This function gets called from the static initializer for MWindowPeer.java
- to initialize the fieldIDs for fields that may be accessed from C */
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_initIDs
- (JNIEnv *env, jclass cls)
-{
- mWindowPeerIDs.insets =
- (*env)->GetFieldID(env, cls, "insets", "Ljava/awt/Insets;");
- mWindowPeerIDs.winAttr =
- (*env)->GetFieldID( env,
- cls,
- "winAttr",
- "Lsun/awt/motif/MWindowAttributes;"
- );
- mWindowPeerIDs.iconWidth =
- (*env)->GetFieldID(env, cls, "iconWidth", "I");
- mWindowPeerIDs.iconHeight =
- (*env)->GetFieldID(env, cls, "iconHeight", "I");
- mWindowPeerIDs.handleWindowFocusOut =
- (*env)->GetMethodID(env,
- cls,
- "handleWindowFocusOut",
- "(Ljava/awt/Window;)V");
- mWindowPeerIDs.handleWindowFocusIn =
- (*env)->GetMethodID(env,
- cls,
- "handleWindowFocusIn",
- "()V");
- mWindowPeerIDs.handleIconify =
- (*env)->GetMethodID(env,
- cls,
- "handleIconify",
- "()V");
- mWindowPeerIDs.handleDeiconify =
- (*env)->GetMethodID(env,
- cls,
- "handleDeiconify",
- "()V");
- mWindowPeerIDs.handleStateChange =
- (*env)->GetMethodID(env,
- cls,
- "handleStateChange",
- "(II)V");
-
- mWindowPeerIDs.draggedToScreenMID = (*env)->GetMethodID(env, cls,
- "draggedToNewScreen",
- "(I)V");
- DASSERT(mWindowPeerIDs.draggedToScreenMID);
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: wrapInSequenced
- * Signature: (Ljava/awt/AWTEvent;)Ljava/awt/SequencedEvent;
- */
-
-/* This method gets called from MWindowPeer to wrap a FocusEvent in
- a SequencedEvent. We have to do this in native code, because we
- don't want to make SequencedEvent a public class. */
-
-JNIEXPORT jobject JNICALL
-Java_sun_awt_motif_MWindowPeer_wrapInSequenced
- (JNIEnv *env, jobject this, jobject awtevent)
-{
- jobject global = awt_canvas_wrapInSequenced(awtevent);
- jobject local = (*env)->NewLocalRef(env, global);
- (*env)->DeleteGlobalRef(env, global);
- return local;
-}
-
-extern jobject findTopLevelOpposite();
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: findOpposite
- * Signature: (Ljava/awt/AWTEvent;)Ljava/awt/Window;
- */
-
-JNIEXPORT jobject JNICALL
-Java_sun_awt_motif_MWindowPeer_findOpposite
- (JNIEnv *env, jobject this, jint eventType)
-{
-#ifdef HEADLESS
- return NULL;
-#else
- if ((*env)->EnsureLocalCapacity(env, 1) < 0) {
- return NULL;
- }
-
- return findTopLevelOpposite(env, eventType);
-#endif
-}
-
-/* changeInsets() sets target's insets equal to X/Motif values. */
-
-static void
-awtJNI_ChangeInsets(JNIEnv * env, jobject this, struct FrameData *wdata)
-{
- jobject insets;
-
- if ((*env)->EnsureLocalCapacity(env, 1) < 0)
- return;
-
- insets = (*env)->GetObjectField(env, this, mWindowPeerIDs.insets);
-
- if (JNU_IsNull(env, insets)) {
- return;
- }
-
- (*env)->SetIntField(env, insets, insetsIDs.top, wdata->top);
- (*env)->SetIntField(env, insets, insetsIDs.left, wdata->left);
- (*env)->SetIntField(env, insets, insetsIDs.bottom, wdata->bottom);
- (*env)->SetIntField(env, insets, insetsIDs.right, wdata->right);
-
- /* Fix for 4106068: don't do it, rely on the window */
- /* manager maximizing policy instead */
-#if 0
- /* when the insets get set, make sure we set the proper */
- /* max window size (since it's dependent on inset size) */
- if (wdata->isResizable) {
- int32_t screenWidth = XWidthOfScreen( XDefaultScreenOfDisplay(awt_display));
- int32_t screenHeight= XHeightOfScreen(XDefaultScreenOfDisplay(awt_display));
- XtVaSetValues(wdata->winData.shell,
- XmNmaxWidth, screenWidth - (wdata->left + wdata->right),
- XmNmaxHeight, screenHeight - (wdata->top + wdata->bottom),
- NULL);
- }
-#endif
- (*env)->DeleteLocalRef(env, insets);
-}
-
-
-/* setMbAndWwHeightAndOffsets() attempts to establish the heights
- of frame's menu bar and warning window (if present in frame).
- setMbAndWwHeightAndOffsets() also adjusts appropriately the
- X/Motif offsets and calls changeInsets() to set target insets.
- A warning window, if present, is established during ...create().
- wdata->warningWindow is set there, wdata->wwHeight is set here.
- Routine pSetMenuBar() sets value of the wdata->menuBar field.
- This routine reads that value. If it is not null, a menubar
- has been added. In this case, calculate the current height
- of the menu bar. This may be a partial (incomplete) menubar
- because ths routine may be called before the X/Motif menubar
- is completely realized. In this case, the menubar height may
- be adjusted incrementally. This routine may be called from
- ...pSetMenuBar(), innerCanvasEH(), and ...pReshape(). It is
- designed to (eventually) obtain the correct menubar height.
- On the other hand, if wdata->menuBar is NULL and the stored
- menubar height is not zero, then we subtract off the height. */
-
-static void
-awtJNI_setMbAndWwHeightAndOffsets(JNIEnv * env,
- jobject this,
- struct FrameData *wdata )
-{
- Dimension warningHeight, /* Motif warning window height */
- labelHeight; /* Motif warning label's height */
-
- WidgetList warningChildrenWL; /* warning children widgets */
-
- Dimension menuBarWidth, /* Motif menubar width */
- menuBarHeight, /* Motif menubar height */
- menuBarBorderSize, /* Motif menubar border size */
- marginHeight, /* Motif menubar margin height */
- menuHeight, /* Motif menubar's menu height */
- menuBorderSize, /* Motif menu border size */
- actualHeight; /* height: menu+margins+borders */
-
- WidgetList menuBarChildrenWL; /* menubar children widgets */
- Cardinal numberChildren; /* number of menubar children */
-
-#ifdef _pauly_debug
- fprintf(stdout," ++ setMenuBar\n");
- fflush(stdout);
-#endif /* _pauly_debug */
-
- /* If warning window height not yet known, try to get it now.
- It will be added to top or bottom (iff NETSCAPE) offset. */
- if (wdata->warningWindow != NULL) {
- XtVaGetValues(wdata->warningWindow,
- XmNheight, &warningHeight,
- XmNchildren, &warningChildrenWL,
- XmNnumChildren, &numberChildren,
- NULL);
-
- /* We may be doing this before warning window is realized ! So,
- check for a child label in the warning. If its height is not
- yet accounted for in the warning height, then use it here. */
- if (numberChildren != 0) {
- XtVaGetValues(warningChildrenWL[0],
- XmNheight, &labelHeight,
- NULL);
-#ifdef _pauly_debug
- fprintf(stdout," setMenuBar.... warning label found with height: %d\n", labelHeight);
- fflush(stdout);
-#endif /* _pauly_debug */
- if (warningHeight < labelHeight) {
-#ifdef _pauly_debug
- fprintf(stdout," setMenuBar.... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
- fflush(stdout);
-#endif /* _pauly_debug */
- warningHeight = labelHeight;
- }
- }
-
- if (wdata->wwHeight < warningHeight) {
-#ifdef _pauly_debug
- fprintf(stdout, " setMenuBar.... adding warning height: %d\n", warningHeight);
- fflush(stdout);
-#endif /* _pauly_debug */
-#ifdef NETSCAPE
- wdata->bottom += (warningHeight - wdata->wwHeight);
-#else
- wdata->top += (warningHeight - wdata->wwHeight);
-#endif /* NETSCAPE */
- awtJNI_ChangeInsets(env, this, wdata);
- wdata->wwHeight = warningHeight;
- }
- }
-
- /* Now we adjust offsets for an added or removed menu bar */
- if (wdata->menuBar != NULL) {
-#ifdef _pauly_debug
- fprintf(stdout," setMenuBar. menu bar: %x\n", wdata->menuBar);
- fflush(stdout);
-#endif /* _pauly_debug */
- XtVaGetValues(wdata->menuBar,
- XmNwidth, &menuBarWidth,
- XmNheight, &menuBarHeight,
- XmNchildren, &menuBarChildrenWL,
- XmNnumChildren, &numberChildren,
- XmNborderWidth, &menuBarBorderSize,
- XmNmarginHeight, &marginHeight,
- NULL);
-
- /* We may be doing this before menu bar is realized ! Hence,
- check for a menu in the menu bar. If its height is not yet
- accounted for in the menu bar height, then add it in here. */
- if (numberChildren != 0) {
- XtVaGetValues(menuBarChildrenWL[0],
- XmNheight, &menuHeight,
- XmNborderWidth, &menuBorderSize,
- NULL);
-#ifdef _pauly_debug
- fprintf(stdout," setMenuBar.... menu found with height: %d, border: %d, margin: %d, bar border: %d\n", menuHeight, menuBorderSize, marginHeight, menuBarBorderSize);
- fflush(stdout);
-#endif /* _pauly_debug */
- /* Calculate real height of menu bar by adding height of its
- child menu and borders, margins, and the menu bar borders*/
- actualHeight = menuHeight + (2 * menuBorderSize) +
- (2 * marginHeight) + (2 * menuBarBorderSize);
-#ifdef __linux__
-#ifdef _pauly_debug
- fprintf(stdout," actual height: %d mb height %d\n", actualHeight, menuBarHeight);
- fflush(stdout);
-#endif /* _pauly_debug */
-#endif
- if (menuBarHeight < actualHeight) {
-#ifdef _pauly_debug
-fprintf(stdout," setMenuBar.... ****************************************\n");
-fflush(stdout);
-#endif /* _pauly_debug */
- menuBarHeight = actualHeight;
- }
- }
-
- if (wdata->mbHeight < menuBarHeight) {
- /* Adjust the (partially) added menu bar height, top offset.*/
-#ifdef _pauly_debug
- fprintf(stdout, " setMenuBar.... added menuBar height: %d\n", menuBarHeight);
- fflush(stdout);
-#endif /* _pauly_debug */
- wdata->top += (menuBarHeight - wdata->mbHeight);
- awtJNI_ChangeInsets(env, this, wdata);
- wdata->mbHeight = menuBarHeight;
- }
- } else if ((wdata->menuBar == NULL) && (wdata->mbHeight > 0)) {
- /* A menu bar has been removed; subtract height from top offset.*/
- wdata->top -= wdata->mbHeight;
-#ifdef _pauly_debug
- fprintf(stdout, " setMenuBar.... removed menuBar height: %d\n", wdata->mbHeight);
- fflush(stdout);
-#endif /* _pauly_debug */
- awtJNI_ChangeInsets(env, this, wdata);
- wdata->mbHeight = 0;
- }
-}
-
-
-/* outerCanvasResizeCB() is Motif resize callback for outer/child canvas.
- It reads width, height of Motif widget, sets java target accordingly,
- and then calls handleResize() to affect any changes.
- This call is only done for a shell resize or inner/parent resize;
- i.e., it may not be done for a ...pReshape() to avoid doing a loop.
-
- client_data is MWindowPeer instance
-*/
-static void
-outerCanvasResizeCB(Widget wd, XtPointer client_data, XtPointer call_data)
-{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject target;
- struct FrameData *wdata;
- Position screenX; /* x position of the canvas, screen */
- Position screenY; /* y position of the canvas, screen */
- Dimension width; /* width of the canvas, target */
- Dimension height; /* height of the canvas, target */
- jint oldWidth;
- jint oldHeight;
-
-#ifdef _pauly_debug
- fprintf(stdout," ++ WindowResize.\n");
- fflush(stdout);
-#endif /* _pauly_debug */
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, (jobject) client_data,
- mComponentPeerIDs.pData);
- if (wdata == NULL) {
- return;
- }
-
- if ((*env)->EnsureLocalCapacity(env, 1) < 0)
- return;
-
- target = (*env)->GetObjectField(env, (jobject) client_data,
- mComponentPeerIDs.target);
- XtVaGetValues(wd,
- XmNwidth, &width,
- XmNheight, &height,
- NULL);
-#ifdef _pauly_debug
- fprintf(stdout," outerCanvasResizeCB. width: %d, height: %d\n", width, height);
- fflush(stdout);
-#endif /* _pauly_debug */
-
-
- XtTranslateCoords(wd, 0, 0, &screenX, &screenY);
-
- if ((wdata->shellResized) || (wdata->canvasResized)) {
-#ifdef _pauly_debug
- fprintf(stdout," outerCanvasResizeCB\n");
- fflush(stdout);
-#endif /* _pauly_debug */
- wdata->shellResized = False;
- wdata->canvasResized = False;
- /*
- ** if you are not yet reparented, don't compute the size based on the
- ** widgets, as the window manager shell containg the insets is not yet
- ** there. Use the size the application has set.
- ** If not reparented, we got here because the application set the size,
- ** so just send them Component.RESIZED event with the size they set.
- **
- ** If the reparenting causes a resize ( only when inset guess is wrong ) ** the new size will be sent in a Component.RESIZED event at that time.
- */
- if (wdata->reparented)
- {
- (*env)->SetIntField(env, target, componentIDs.x, (jint) screenX);
- (*env)->SetIntField(env, target, componentIDs.y, (jint) screenY);
- }
-
- oldWidth = (*env)->GetIntField(env, target, componentIDs.width);
- oldHeight = (*env)->GetIntField(env, target, componentIDs.height);
-
- if (oldWidth != width || oldHeight != height || wdata->need_reshape)
- {
- wdata->need_reshape = False;
- (*env)->SetIntField(env, target, componentIDs.width, (jint)width);
- (*env)->SetIntField(env, target, componentIDs.height,
- (jint)height);
-
- /* only do this for Windows, not Canvases, btw */
- checkNewXineramaScreen(env, client_data, wdata, screenX, screenY, width, height);
-
- JNU_CallMethodByName(env, NULL, (jobject) client_data,
- "handleResize", "(II)V", width, height);
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
- }
- }
-
- (*env)->DeleteLocalRef(env, target);
-
-#ifdef _pauly_debug
- fprintf(stdout," WindowResize. Done.\n");
- fflush(stdout);
-#endif /* _pauly_debug */
-
-} /* outerCanvasResizeCB() */
-
-static void reconfigureOuterCanvas ( JNIEnv *env, jobject target,
- jobject this, struct FrameData *wdata )
-{
- Dimension innerDAWidth, /* width of inner Motif canvas */
- innerDAHeight, /* height of inner Motif canvas */
- outerDAWidth, /* width of outer Motif canvas */
- outerDAHeight; /* height of outer Motif canvas */
- int32_t targetWidth, /* java target object's width */
- targetHeight; /* java target's object height */
- Dimension width; /* width of the canvas, target */
- Dimension height; /* height of the canvas, target */
-
-
- Position innerX, /* x loc. of inner Motif canvas */
- innerY, /* y loc. of inner Motif canvas */
- x, y;
-
- /* canvasW is (visible) inner/parent drawing area (canvas) widget */
- XtVaGetValues(XtParent(wdata->winData.comp.widget),
- XmNwidth, &innerDAWidth,
- XmNheight, &innerDAHeight,
- XmNx, &innerX,
- XmNy, &innerY,
- NULL);
-
- /* This resize may be due to the insertion or removal of a menu bar.
- If so, we appropriately adjust the top offset in wdata, insets. */
- awtJNI_setMbAndWwHeightAndOffsets(env, this, wdata);
-
- outerDAWidth = innerDAWidth + wdata->left + wdata->right;
- outerDAHeight = innerDAHeight + wdata->top + wdata->bottom;
-
- /* If it's a menu bar reset, do not do resize of outer/child canvas.
- (Another thread problem; we arrest this now before damage done.) */
- if (wdata->menuBarReset)
- {
- targetWidth = (*env)->GetIntField(env, target, componentIDs.width);
- targetHeight = (*env)->GetIntField(env, target, componentIDs.height);
- if ((outerDAWidth != targetWidth) || (outerDAHeight != targetHeight))
- {
- return;
- }
- }
-
- wdata->canvasResized = True;
-
- /* The outer/child drawing area (canvas) needs to be configured too.
- If its size changes, its resize callback will thereby be invoked.*/
- x = -wdata->left;
- y = -wdata->top;
- width = innerDAWidth + wdata->left + wdata->right;
- height = innerDAHeight + wdata->top + wdata->bottom;
-
- XtConfigureWidget(wdata->winData.comp.widget, x, y, width, height, 0 );
-}
-
-
-
-/* innerCanvasEH() is event handler for inner/parent canvas. It handles
- map and configure notify events. It reads width and height, adjusts
- for menubar insertion / removal and configures outer/child canvas. */
-
-static void
-innerCanvasEH(Widget canvasW, XtPointer client_data, XEvent *event,
- Boolean* continueToDispatch)
-{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject this = (jobject) client_data;
- jobject target;
- struct FrameData *wdata;
-
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL) {
- return;
- }
-
- if ((*env)->EnsureLocalCapacity(env, 1) < 0)
- return;
-
- target = (*env)->GetObjectField(env, (jobject) client_data,
- mComponentPeerIDs.target);
-
- /* While inside ...pSetMenuBar(), don't react to incomplete resizing
- events supplied by Xt toolkit. Wait for completion of the routine. */
-
-
- /* For a map or resize, we need to check for the addition or deletion
- of a menu bar to the form which is the of this drawing area (canvas).
- We also must then configure the outer/child canvas appropriately. */
-
- if ( (event->xany.type == MapNotify) ||
- (event->xany.type == ConfigureNotify) )
- {
- reconfigureOuterCanvas( env, target, this, wdata );
- }
-
- (*env)->DeleteLocalRef(env, target);
-
-}
-
-/* syncTopLevelPos() is necessary to insure that the window manager has in
- * fact moved us to our final position relative to the reParented WM window.
- * We have noted a timing window which our shell has not been moved so we
- * screw up the insets thinking they are 0,0. Wait (for a limited period of
- * time to let the WM hava a chance to move us
- */
-void syncTopLevelPos( Display *d, Window w, XWindowAttributes *winAttr )
-{
- int32_t i = 0;
- memset(winAttr, 0, sizeof(*winAttr));
-
- do {
- if (!XGetWindowAttributes(d, w, winAttr)) {
- memset(winAttr, 0, sizeof(*winAttr));
- break;
- }
- /* Sometimes we get here before the WM has updated the
- ** window data struct with the correct position. Loop
- ** until we get a non-zero position.
- */
- if ((winAttr->x != 0) || (winAttr->y != 0)) {
- break;
- }
- else {
- /* What we really want here is to sync with the WM,
- ** but there's no explicit way to do this, so we
- ** call XSync for a delay.
- */
- XSync(d, False);
- }
- } while (i++ < 50);
-}
-
-typedef struct FocusOutInfo_str {
- XEvent * eventOut;
- Window inWin;
- Window inChild;
- Widget defChild;
- jobject childComp;
-} FocusOutInfo_t;
-
-#define IsCanvasTypeWidget(w) \
- (XtIsSubclass(w, xmDrawingAreaWidgetClass) ||\
- XtIsSubclass(w, vDrawingAreaClass))
-
-int isTopLevelPartWidget(Widget w) {
- if (XtIsShell(w)) {
- return TRUE;
- }
- if (XtIsSubclass(w, xmFormWidgetClass)) {
- return TRUE;
- }
- if (IsCanvasTypeWidget(w)) {
- Widget w1 = XtParent(w);
- if (w1 != NULL) {
- if (XtIsSubclass(w1, xmFormWidgetClass)) {
- return TRUE;
- }
- if (IsCanvasTypeWidget(w1)) {
- Widget w2 = XtParent(w1);
- if (w2 != NULL) {
- if (XtIsSubclass(w2, xmFormWidgetClass)) {
- return TRUE;
- }
- }
- }
-
- }
- }
- return FALSE;
-}
-
-void
-shellFocusEH(Widget w, XtPointer data, XEvent *event, Boolean *continueToDispatch)
-{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject this = (jobject) data;
- jobject target;
- struct FrameData *wdata;
-
- /* Any event handlers which take peer instance pointers as
- * client_data should check to ensure the widget has not been
- * marked as destroyed as a result of a dispose() call on the peer
- * (which can result in the peer instance pointer already haven
- * been gc'd by the time this event is processed)
- */
- if (w->core.being_destroyed) {
- return;
- }
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL) {
- return;
- }
-
- switch (event->xany.type) {
- case FocusOut:
- // Will be handled by proxy automaticall since he is focus owner
- break;
- case FocusIn:
- // Forward focus event to the proxy
- XSetInputFocus(awt_display, XtWindow(wdata->focusProxy), RevertToParent, CurrentTime);
- break;
- }
-}
-
-/**
- * Fix for Alt-Tab problem.
- * See coments on use semantics below.
- */
-Boolean skipNextNotifyWhileGrabbed = False;
-Boolean skipNextFocusIn = False;
-
-Boolean focusOnMapNotify = False;
-
-/* shellEH() is event handler for the Motif shell widget. It handles
- focus change, map notify, configure notify events for the shell.
- Please see internal comments pertaining to these specific events.
-
- data is MWindowPeer instance pointer
-*/
-void
-shellEH(Widget w, XtPointer data, XEvent *event, Boolean *continueToDispatch)
-{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- jobject this = (jobject) data;
- jobject target;
- struct FrameData *wdata;
- int32_t setTargetX,
- setTargetY,
- getTargetX,
- getTargetY;
- /* Changed long to int for 64-bit */
- int32_t wwHeight; /* height of any warning window present */
- int32_t topAdjust; /* adjust top offset for menu, warning */
- jclass clazz;
- int32_t x, y;
- int32_t width, height;
- enum wmgr_t runningWM;
- jobject winAttrObj;
- static jobject windowClass = NULL;
- /* Any event handlers which take peer instance pointers as
- * client_data should check to ensure the widget has not been
- * marked as destroyed as a result of a dispose() call on the peer
- * (which can result in the peer instance pointer already haven
- * been gc'd by the time this event is processed)
- */
- if (w->core.being_destroyed) {
- return;
- }
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL) {
- return;
- }
-
- switch (event->xany.type) {
-
- case FocusOut: {
- int32_t res = 0;
- int revert_to = 0;
- Widget defChild = NULL;
- Window focusOwner = None;
- jobject oppositeWindow = NULL;
- Widget oppositeShell = NULL;
- XEvent inEvent;
- Widget shell = NULL;
-#ifdef DEBUG_FOCUS
- fprintf(stderr, "Focusout on proxy; window = %x, mode %d, detail %d\n",
- event->xfocus.window, event->xfocus.mode, event->xfocus.detail);
-#endif
- shell = wdata->winData.shell;
-
- if ((*env)->EnsureLocalCapacity(env, 3) < 0) {
- break;
- }
-
- /**
- * Fix for Alt-Tab problem. We should process NotifyWhileGrabbed events
- * only if they are due to the switch between top-levels.
- * skipNextNotifyWhileGrabbed is set from Menu and PopupMenu code
- * to prevent generation of focus events when user interact with these
- * widget.
- */
- if (event->xfocus.mode == NotifyWhileGrabbed) {
- if (skipNextNotifyWhileGrabbed) {
- skipNextNotifyWhileGrabbed = False;
- break;
- }
- } else if (event->xfocus.mode != NotifyNormal) break;
-
- /**
- * Fix for Alt-Tab problem.
- * skipNextFocusIn is set in Choice code to avoid processing of
- * next focus-in or focus-out generated by Choice as it is a fake
- * event.
- */
- if (skipNextFocusIn && event->xfocus.detail == NotifyPointer) {
- break;
- }
-
- XGetInputFocus( awt_display, &focusOwner, &revert_to);
-
- if (focusOwner != None) {
- Widget inWidget = NULL;
- jobject wpeer = NULL;
- inWidget = XtWindowToWidget(awt_display, focusOwner);
- if (inWidget != NULL && inWidget != shell) {
- oppositeShell = getShellWidget(inWidget);
- wpeer = findPeer(&inWidget);
- if (wpeer == NULL) {
- inWidget = findTopLevelByShell(inWidget);
- if (inWidget != NULL) {
- wpeer = findPeer(&inWidget);
- }
- }
- if (wpeer != NULL) {
- jobject peerComp =
- (*env)->GetObjectField(env,
- wpeer,
- mComponentPeerIDs.target);
- if (peerComp != NULL) {
- // Check that peerComp is top-level
-
- // load class
- if (windowClass == NULL) {
- jobject localWindowClass = (*env)->FindClass(env, "java/awt/Window");
- windowClass = (*env)->NewGlobalRef(env, localWindowClass);
- (*env)->DeleteLocalRef(env, localWindowClass);
- }
- if ((*env)->IsInstanceOf(env, peerComp, windowClass)) {
- oppositeWindow = peerComp;
- } else { // Opposite object is not Window - there is no opposite window.
- (*env)->DeleteLocalRef(env, peerComp);
- peerComp = NULL;
- oppositeShell = NULL;
- }
- }
- }
- }
- } else {
- // If there is no opposite shell but we have active popup - this popup is actually
- // the oppposite. This should mean that this focus out is due to popup - and thus
- // should be skipped. Fix for 4478780.
- if (skipNextNotifyWhileGrabbed) {
- break;
- }
- }
-
- // If current window is not focusable and opposite window is not focusable - do nothing
- // If current window is focusable and opposite is not - do not clear focus variables like
- // focus didn't leave this window(but it will in terms of X). When we later switch to either
- // - back to this window: variables are already here
- // - another focusable window: variables point to focusable window and "focus lost" events
- // will be generated for it
- // - non-java window: variables point to focusable window and "focus lost" events
- // will be generated for it, not for non-focusable.
- // If current window is non-focusable and opposite is focusable then do not generate anything
- // as if we didn't leave previous focusable window so Java events will generated for it.
- //
- // Fix for 6547951.
- // Also do cleaning when switching to non-java window (opposite is null).
- if (isFocusableWindowByShell(env, shell) && shell != oppositeShell &&
- ((oppositeShell != NULL && isFocusableWindowByShell(env, oppositeShell)) ||
- oppositeShell == NULL))
- {
- // The necessary FOCUS_LOST event will be generated by DKFM.
- // So we need to process focus list like we received FocusOut
- // for the desired component - shell's current focus widget
- defChild = XmGetFocusWidget(shell);
- if (defChild != NULL) {
- jobject peer = findPeer(&defChild);
- if (peer == NULL) {
- defChild = findTopLevelByShell(defChild);
- if (defChild != NULL) {
- peer = findPeer(&defChild);
- }
- }
- if (peer != NULL) {
- jobject comp = (*env)->GetObjectField(env, peer, mComponentPeerIDs.target);
- if (focusList != NULL) {
- jobject last = (*env)->NewLocalRef(env, focusList->requestor);
- if ((*env)->IsSameObject(env, comp, last)) {
- FocusListElt * temp = focusList;
- forGained = focusList->requestor;
- focusList = focusList->next;
- free(temp);
- if (focusList == NULL) {
- focusListEnd = NULL;
- }
- }
- if (!JNU_IsNull(env, last)) {
- (*env)->DeleteLocalRef(env, last);
- }
- }
- (*env)->DeleteLocalRef(env, comp);
- }
- }
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
- processTree(defChild, findWindowsProxy(target, env), False);
- XtSetKeyboardFocus(shell, NULL);
- (*env)->DeleteLocalRef(env, target);
- }
-#ifndef NOMODALFIX
- if (!awt_isModal() || awt_isWidgetModal(shell)) {
-#endif //NOMODALFIX
- if ( oppositeShell != NULL
- && isFocusableWindowByShell(env, oppositeShell)
- && isFocusableWindowByShell(env, shell)
- || (oppositeShell == NULL))
- {
- /*
- * Fix for 5095117.
- * Check if current native focused window is the same as source.
- * Sometimes it is not - we must not however clean reference to
- * actual native focused window.
- */
- jobject currentFocusedWindow = awt_canvas_getFocusedWindowPeer();
- if ((*env)->IsSameObject(env, this, currentFocusedWindow)) {
- awt_canvas_setFocusedWindowPeer(NULL);
- }
- (*env)->DeleteLocalRef(env, currentFocusedWindow);
-
- JNU_CallMethodByName(env, NULL, this, "handleWindowFocusOut", "(Ljava/awt/Window;)V",
- oppositeWindow);
- if ((*env)->ExceptionCheck(env) == JNI_TRUE) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
- }
-#ifndef NOMODALFIX
- }
-#endif //NOMODALFIX
- if (oppositeWindow != NULL) {
- (*env)->DeleteLocalRef(env, oppositeWindow);
- }
-
- break;
- } /* FocusOut */
-
- case FocusIn: {
- Widget shell = wdata->winData.shell;
-#ifdef DEBUG_FOCUS
- fprintf(stderr, "FocusIn on proxy; window = %x, mode %d, detail %d\n", event->xfocus.window,
- event->xfocus.mode, event->xfocus.detail);
-#endif
- if (/* event->xfocus.mode == NotifyNormal */ 1) {
-
- /**
- * Fix for Alt-Tab problem. We should process NotifyWhileGrabbed events to detect
- * switch between top-levels using alt-tab, but avoid processing these type of event
- * when they are originated from other sources.
- */
- if (event->xfocus.mode == NotifyWhileGrabbed) {
- /**
- * skipNextNotifyWhileGrabbed is set from Menu and PopupMenu code to
- * skip next focus-in event with NotifyWhileGrabbed as it is generated
- * in result of closing of the Menu's shell.
- * Event will also have NotifyInferior if uses clicked on menu bar in the
- * space where there is not menu items.
- */
- if (skipNextNotifyWhileGrabbed || event->xfocus.detail == NotifyInferior) {
- skipNextNotifyWhileGrabbed = False;
- break;
- }
- } else if (event->xfocus.mode != NotifyNormal) {
- break;
- }
-
- /**
- * Fix for Alt-Tab problem.
- * skipNextFocusIn is set from Choice code to avoid processing next focus-in
- * as it is a fake event.
- */
- if (skipNextFocusIn == True) {
- /**
- * There could be the set of fake events, the last one
- * will have detail == NotifyPointer
- */
- if (event->xfocus.detail != NotifyPointer) {
- skipNextFocusIn = False;
- }
- break;
- }
-#ifndef NOMODALFIX
- if (!awt_isModal() || awt_isWidgetModal(shell)) {
-#endif //NOMODALFIX
- if (isFocusableWindowByShell(env, shell)) {
- jobject currentFocusedWindow = awt_canvas_getFocusedWindowPeer();
- // Check if focus variables already point to this window. If so,
- // it means there were transfer to non-focusable window and now we
- // are back to origianl focusable window. No need to generate Java events
- // in this case.
- if (!(*env)->IsSameObject(env, this, currentFocusedWindow)) {
- awt_canvas_setFocusedWindowPeer(this);
- awt_canvas_setFocusOwnerPeer(this);
-
- /*
- * Fix for 6465038.
- * Restore focus on the toplevel widget if it's broken.
- */
- Widget widgetToFocus = getFocusWidget(findTopLevelByShell(shell));
- Widget currentOwner = XmGetFocusWidget(shell);
-
- if (widgetToFocus != currentOwner) {
-#ifdef DEBUG_FOCUS
- fprintf(stderr, "Wrong Xm focus; resetting Xm focus from %x to toplevel %x...\n",
- currentOwner != NULL ? XtWindow(currentOwner) : 0,
- widgetToFocus != NULL ? XtWindow(widgetToFocus) : 0);
-#endif
- if ( !XmProcessTraversal(widgetToFocus, XmTRAVERSE_CURRENT) ) {
- XtSetKeyboardFocus(shell, widgetToFocus);
- }
-#ifdef DEBUG_FOCUS
- Widget _w = XmGetFocusWidget(shell);
- fprintf(stderr, " ...focus resulted on window %x\n", _w != NULL ? XtWindow(_w) : 0);
-#endif
- }
-
- JNU_CallMethodByName(env, NULL, this, "handleWindowFocusIn", "()V");
- if ((*env)->ExceptionCheck(env) == JNI_TRUE) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
- }
- (*env)->DeleteLocalRef(env, currentFocusedWindow);
- }
-#ifndef NOMODALFIX
- }
-#endif //NOMODALFIX
- }
- raiseInputMethodWindow(wdata);
- break;
- } /* FocusIn */
-
- case VisibilityNotify: {
- winAttrObj = (*env)->GetObjectField(env, this, mWindowPeerIDs.winAttr);
- (*env)->SetIntField(env, winAttrObj,
- mWindowAttributeIDs.visibilityState,
- event->xvisibility.state);
- if (event->xvisibility.state == VisibilityUnobscured) {
- raiseInputMethodWindow(wdata);
- }
- break;
- } /* VisibilityNotify */
-
- case MapNotify: {
- /* Your body seems to unfade */
- if (wdata->initialFocus == False) {
- XtVaSetValues(wdata->winData.shell, XmNinput, True, NULL);
-
- // We have to to evidently move the window to the front here.
- Window shellWindow;
- if ((shellWindow = XtWindow(wdata->winData.shell)) != None) {
- XRaiseWindow(awt_display, shellWindow);
- }
- }
- if (awt_wm_isStateNetHidden(XtWindow(wdata->winData.shell))) {
- focusOnMapNotify = True;
- }
- /*
- * TODO: perhaps we need this putback only for simple Window.
- * For Frame/Dialog XmNinput==True would be enough. The native
- * system will focus it itself.
- */
- if (wdata->isFocusableWindow && focusOnMapNotify) {
- XEvent ev;
- memset(&ev, 0, sizeof(ev));
-
- ev.type = FocusIn;
- 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);
- }
- focusOnMapNotify = False;
-
- break;
- }
-
- case UnmapNotify: {
- /* Gee! All of a sudden, you can't see yourself */
- if (wdata->initialFocus == False) {
- XtVaSetValues(wdata->winData.shell, XmNinput, False, NULL);
- }
- if (awt_wm_isStateNetHidden(XtWindow(wdata->winData.shell))) {
- focusOnMapNotify = True;
- }
- break;
- }
-
- case DestroyNotify: { /* Foul play! ICCCM forbids WM to do this! */
- /* Your window is killed by the WM */
- JNU_CallMethodByName(env, NULL, this, "handleDestroy", "()V");
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
- break;
- }
-
- case PropertyNotify: {
- jint state, old_state, changed;
-
- /*
- * Let's see if this is a window state protocol message, and
- * if it is - decode a new state in terms of java constants.
- */
- if (!awt_wm_isStateChange(wdata, (XPropertyEvent *)event, &state)) {
- /* Pakka Pakka seems not interested */
- break;
- }
-
- changed = wdata->state ^ state;
- if (changed == 0) {
- /* You feel dizzy for a moment, but nothing happens... */
- DTRACE_PRINTLN("TL: >>> state unchanged");
- break;
- }
-
- old_state = wdata->state;
- wdata->state = state;
-
-#ifdef DEBUG
- DTRACE_PRINT("TL: >>> State Changed:");
- if (changed & java_awt_Frame_ICONIFIED) {
- if (state & java_awt_Frame_ICONIFIED) {
- DTRACE_PRINT(" ICON");
- } else {
- DTRACE_PRINT(" !icon");
- }
- }
- if (changed & java_awt_Frame_MAXIMIZED_VERT) {
- if (state & java_awt_Frame_MAXIMIZED_VERT) {
- DTRACE_PRINT(" MAX_VERT");
- } else {
- DTRACE_PRINT(" !max_vert");
- }
- }
- if (changed & java_awt_Frame_MAXIMIZED_HORIZ) {
- if (state & java_awt_Frame_MAXIMIZED_HORIZ) {
- DTRACE_PRINT(" MAX_HORIZ");
- } else {
- DTRACE_PRINT(" !max_horiz");
- }
- }
- DTRACE_PRINTLN("");
-#endif
-
- if (changed & java_awt_Frame_ICONIFIED) {
- /* Generate window de/iconified event for old clients */
- if (state & java_awt_Frame_ICONIFIED) {
- DTRACE_PRINTLN("TL: ... handleIconify");
- JNU_CallMethodByName(env, NULL,
- this, "handleIconify", "()V");
- }
- else {
- DTRACE_PRINTLN("TL: ... handleDeiconify");
- JNU_CallMethodByName(env, NULL,
- this, "handleDeiconify", "()V");
- }
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
- }
-
- DTRACE_PRINTLN("TL: ... handleStateChange");
- JNU_CallMethodByName(env, NULL,
- this, "handleStateChange", "(II)V",
- old_state, state);
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
- break;
- } /* PropertyNotify */
-
- case ReparentNotify: {
- Window root = RootWindowOfScreen(XtScreen(wdata->winData.shell));
-
-#ifdef DEBUG
- DTRACE_PRINT2("TL: ReparentNotify(0x%x/0x%x) to ",
- wdata->winData.shell, XtWindow(wdata->winData.shell));
- if (event->xreparent.parent == root) {
- DTRACE_PRINTLN("root");
- } else {
- DTRACE_PRINTLN1("window 0x%x", event->xreparent.parent);
- }
-#endif
-
- if (wdata->winData.flags & W_IS_EMBEDDED) {
- DTRACE_PRINTLN("TL: embedded frame - nothing to do");
- break;
- }
-
-#ifdef __linux__
- if (!wdata->fixInsets) {
- DTRACE_PRINTLN("TL: insets already fixed");
- break;
- }
- else {
- wdata->fixInsets = False;
- }
-#endif
-
- if ((*env)->EnsureLocalCapacity(env, 1) < 0)
- break;
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- x = (*env)->GetIntField(env, target, componentIDs.x);
- y = (*env)->GetIntField(env, target, componentIDs.y);
- width = (*env)->GetIntField(env, target, componentIDs.width);
- height = (*env)->GetIntField(env, target, componentIDs.height);
-
- /* The insets were literally hardcoded in the MWindowPeer.
- But they are dependent upon both the window manager (WM)
- and the hardware display. So, these are usually wrong.
- This leads to problems with shell positioning and size.
- Furthermore, there is not a published interface or way
- to obtain from any given window manager the dimensions
- of its decoration windows (i.e., borders and title bar).
- So, given this problem in design, we must workaround.
- N.B. (0) This works. But there is one functional caveat:
- the frame.insets() function will usually return
- the wrong values until AFTER the frame is shown.
- It always did this before; it's just that now,
- the values will become correct after rendering,
- whereas before the values were never corrected.
- (I believe this unavoidable given this design.)
- (1) Note that we must/have to do this exactly once.
- (2) The hardcoded values of ...create() (25,5)
- are also utilized here and must be consistent.
- This of course could be reworked as desired.
- (3) Assume top border (title bar) is one width,
- and other three borders are another width.
- This, however, could be easily reworked below. */
-
- /*
- * The above comment is no longer completely true.
- * The insets are no longer hardcoded but are retrieved from
- * guessInsets(), either from a per-window manager default,
- * set in the awt.properties file, or overwritten by the
- * actual values determined from a previous frames
- * reparenting.
- */
-
- if (wdata->decor == AWT_NO_DECOR) {
- if (!wdata->isResizable && !wdata->isFixedSizeSet) {
- reshape(env, this, wdata, x, y, width, height, False);
- if (wdata->warningWindow != NULL)
- awtJNI_ChangeInsets(env, this, wdata);
- }
- }
- else if (event->xreparent.parent == root) {
- wdata->reparented = False;
- wdata->configure_seen = False;
-
- /*
- * We can be repareted to root for two reasons:
- * . setVisible(false)
- * . WM exited
- */
- if (wdata->isShowing) { /* WM exited */
- /* Work around 4775545 */
- awt_wm_unshadeKludge(wdata);
- }
- }
- else { /* reparented to WM frame, figure out our insets */
- XWindowAttributes winAttr, actualAttr;
- int32_t correctWMTop = -1;
- int32_t correctWMLeft = -1;
- int32_t correctWMBottom;
- int32_t correctWMRight;
- int32_t topCorrection;
- int32_t leftCorrection;
- int32_t bottomCorrection = 0;
- int32_t rightCorrection = 0;
- int32_t screenX, screenY;
- int32_t i;
- int32_t actualWidth, actualHeight;
- int32_t t, l, b, r;
- Window containerWindow;
-
- /* Dummies for XQueryTree */
- Window ignore_Window, *ignore_WindowPtr;
- uint32_t ignore_uint;
-
- Boolean setXY = True;
- XSizeHints* hints = XAllocSizeHints();
-
- wdata->reparented = True;
-
- if (hints != NULL) {
- long ignore = 0;
- XGetWMNormalHints(awt_display, XtWindow(wdata->winData.shell),
- hints, &ignore);
- setXY = (hints->flags & (USPosition|PPosition)) != 0;
- XFree(hints);
- }
-
- /*
- * Unfortunately the concept of "insets" borrowed to AWT
- * from Win32 is *absolutely*, *unbelievably* foreign to
- * X11. Few WMs provide the size of frame decor
- * (i.e. insets) in a property they set on the client
- * window, so we check if we can get away with just
- * peeking at it. [Future versions of wm-spec might add a
- * standardized hint for this].
- *
- * Otherwise we do some special casing. Actually the
- * fallback code ("default" case) seems to cover most of
- * the existing WMs (modulo Reparent/Configure order
- * perhaps?).
- *
- * Fallback code tries to account for the two most common cases:
- *
- * . single reparenting
- * parent window is the WM frame
- * [twm, olwm, sawfish]
- *
- * . double reparenting
- * parent is a lining exactly the size of the client
- * grandpa is the WM frame
- * [mwm, e!, kwin, fvwm2 ... ]
- */
-
- if (awt_wm_getInsetsFromProp(event->xreparent.window,
- &t, &l, &b, &r))
- {
- correctWMTop = t;
- correctWMLeft = l;
- correctWMBottom = b;
- correctWMRight = r;
- setXY = False;
- }
- else
- switch (awt_wm_getRunningWM()) {
-
- /* should've been done in awt_wm_getInsetsFromProp */
- case ENLIGHTEN_WM: {
- DTRACE_PRINTLN("TL: hmm, E! insets should have been read"
- " from _E_FRAME_SIZE");
- /* enlightenment does double reparenting */
- syncTopLevelPos(XtDisplay(wdata->winData.shell),
- event->xreparent.parent, &winAttr);
-
- XQueryTree(XtDisplay(wdata->winData.shell),
- event->xreparent.parent,
- &ignore_Window,
- &containerWindow, /* actual WM frame */
- &ignore_WindowPtr,
- &ignore_uint);
- if (ignore_WindowPtr)
- XFree(ignore_WindowPtr);
-
- correctWMLeft = winAttr.x;
- correctWMTop = winAttr.y;
-
- /*
- * Now get the actual dimensions of the parent window
- * resolve the difference. We can't rely on the left
- * to be equal to right or bottom... Enlightment
- * breaks that assumption.
- */
- XGetWindowAttributes(XtDisplay(wdata->winData.shell),
- containerWindow, &actualAttr);
- correctWMRight = actualAttr.width
- - (winAttr.width + correctWMLeft);
- correctWMBottom = actualAttr.height
- - (winAttr.height + correctWMTop) ;
- break;
- }
-
- case ICE_WM:
- case KDE2_WM: /* should've been done in awt_wm_getInsetsFromProp */
- case CDE_WM:
- case MOTIF_WM: {
- /* these are double reparenting too */
- syncTopLevelPos(XtDisplay(wdata->winData.shell),
- event->xreparent.parent, &winAttr);
-
- correctWMTop = winAttr.y;
- correctWMLeft = winAttr.x;
- correctWMRight = correctWMLeft;
- correctWMBottom = correctWMLeft;
-
- XTranslateCoordinates(awt_display, event->xreparent.window,
- root, 0,0, &screenX, &screenY,
- &containerWindow);
-
- if ((screenX != x + wdata->leftGuess)
- || (screenY != y + wdata->topGuess))
- {
- /*
- * looks like the window manager has placed us somewhere
- * other than where we asked for, lets respect the window
- * and go where he put us, not where we tried to put us
- */
- x = screenX - correctWMLeft;
- y = screenY - correctWMTop;
- }
- break;
- }
-
- case SAWFISH_WM:
- case OPENLOOK_WM: {
- /* single reparenting */
- syncTopLevelPos(XtDisplay(wdata->winData.shell),
- event->xreparent.window, &winAttr);
-
- correctWMTop = winAttr.y;
- correctWMLeft = winAttr.x;
- correctWMRight = correctWMLeft;
- correctWMBottom = correctWMLeft;
- break;
- }
-
- case OTHER_WM:
- default: { /* this is very similar to the E! case above */
- Display *dpy = event->xreparent.display;
- Window w = event->xreparent.window;
- Window parent = event->xreparent.parent;
- XWindowAttributes wattr, pattr;
-
- XGetWindowAttributes(dpy, w, &wattr);
- XGetWindowAttributes(dpy, parent, &pattr);
-
- DTRACE_PRINTLN5("TL: window attr +%d+%d+%dx%d (%d)",
- wattr.x, wattr.y, wattr.width, wattr.height,
- wattr.border_width);
- DTRACE_PRINTLN5("TL: parent attr +%d+%d+%dx%d (%d)",
- pattr.x, pattr.y, pattr.width, pattr.height,
- pattr.border_width);
-
- /*
- * Check for double-reparenting WM.
- *
- * If the parent is exactly the same size as the
- * top-level assume taht it's the "lining" window and
- * that the grandparent is the actual frame (NB: we
- * have already handled undecorated windows).
- *
- * XXX: what about timing issues that syncTopLevelPos
- * is supposed to work around?
- */
- if (wattr.x == 0 && wattr.y == 0
- && wattr.width + 2*wattr.border_width == pattr.width
- && wattr.height + 2*wattr.border_width == pattr.height)
- {
- Window ignore_root, grandparent, *children;
- unsigned int ignore_nchildren;
-
- DTRACE_PRINTLN("TL: double reparenting WM detected");
- XQueryTree(dpy, parent,
- &ignore_root,
- &grandparent,
- &children,
- &ignore_nchildren);
- if (children)
- XFree(children);
-
- /* take lining window into account */
- wattr.x = pattr.x;
- wattr.y = pattr.y;
- wattr.border_width += pattr.border_width;
-
- parent = grandparent;
- XGetWindowAttributes(dpy, parent, &pattr);
- DTRACE_PRINTLN5("TL: window attr +%d+%d+%dx%d (%d)",
- wattr.x, wattr.y,
- wattr.width, wattr.height,
- wattr.border_width);
- DTRACE_PRINTLN5("TL: parent attr +%d+%d+%dx%d (%d)",
- pattr.x, pattr.y,
- pattr.width, pattr.height,
- pattr.border_width);
- }
-
- /*
- * XXX: To be absolutely correct, we'd need to take
- * parent's border-width into account too, but the
- * rest of the code is happily unaware about border
- * widths and inner/outer distinction, so for the time
- * being, just ignore it.
- */
- correctWMTop = wattr.y + wattr.border_width;
- correctWMLeft = wattr.x + wattr.border_width;
- correctWMBottom = pattr.height
- - (wattr.y + wattr.height + 2*wattr.border_width);
- correctWMRight = pattr.width
- - (wattr.x + wattr.width + 2*wattr.border_width);
- DTRACE_PRINTLN4("TL: insets = top %d, left %d, bottom %d, right %d",
- correctWMTop, correctWMLeft,
- correctWMBottom, correctWMRight);
- break;
- } /* default */
-
- } /* switch (runningWM) */
-
-
- /*
- * Ok, now see if we need adjust window size because
- * initial insets were wrong (most likely they were).
- */
- topCorrection = correctWMTop - wdata->topGuess;
- leftCorrection = correctWMLeft - wdata->leftGuess;
- bottomCorrection = correctWMBottom - wdata->bottomGuess;
- rightCorrection = correctWMRight - wdata->rightGuess;
-
- DTRACE_PRINTLN3("TL: top: computed=%d, guess=%d, correction=%d",
- correctWMTop, wdata->topGuess, topCorrection);
- DTRACE_PRINTLN3("TL: left: computed=%d, guess=%d, correction=%d",
- correctWMLeft, wdata->leftGuess, leftCorrection);
- DTRACE_PRINTLN3("TL: bottom: computed=%d, guess=%d, correction=%d",
- correctWMBottom, wdata->bottomGuess, bottomCorrection);
- DTRACE_PRINTLN3("TL: right: computed=%d, guess=%d, correction=%d",
- correctWMRight, wdata->rightGuess, rightCorrection);
-
- if (topCorrection != 0 || leftCorrection != 0
- || bottomCorrection != 0 || rightCorrection != 0)
- {
- jboolean isPacked;
-
- DTRACE_PRINTLN("TL: insets need correction");
- wdata->need_reshape = True;
-
- globalTopGuess = correctWMTop;
- globalLeftGuess = correctWMLeft;
- globalBottomGuess = correctWMBottom;
- globalRightGuess = correctWMRight;
-
- /* guesses are for WM decor *only* */
- wdata->topGuess = correctWMTop;
- wdata->leftGuess = correctWMLeft;
- wdata->bottomGuess = correctWMBottom;
- wdata->rightGuess = correctWMRight;
-
- /*
- * Actual insets account for menubar/warning label,
- * so we can't assign directly but must adjust them.
- */
- wdata->top += topCorrection;
- wdata->left += leftCorrection;
- wdata->bottom += bottomCorrection;
- wdata->right += rightCorrection;
-
- awtJNI_ChangeInsets(env, this, wdata);
-
- /*
- * If this window has been sized by a pack() we need
- * to keep the interior geometry intact. Since pack()
- * computed width and height with wrong insets, we
- * must adjust the target dimensions appropriately.
- */
- isPacked = (*env)->GetBooleanField(env, target,
- componentIDs.isPacked);
- if (isPacked) {
- int32_t correctTargetW;
- int32_t correctTargetH;
-
- DTRACE_PRINTLN("TL: window is packed, "
- "adjusting size to preserve layout");
-
- correctTargetW = width + (leftCorrection + rightCorrection);
- correctTargetH = height +(topCorrection + bottomCorrection);
-
- (*env)->SetIntField(env, target, componentIDs.width,
- (jint) correctTargetW);
- (*env)->SetIntField(env, target, componentIDs.height,
- (jint) correctTargetH);
- /*
- ** Normally you only reconfigure the outerCanvas due to
- ** handling the ReconfigureNotify on the innerCanvas.
- ** However, in this case the innerCanvas may not have
- ** changed, but outterCanvas may still need to, since the
- ** insets have changed.
- */
- reshape(env, this, wdata, x, y,
- correctTargetW, correctTargetH, setXY);
- reconfigureOuterCanvas(env, target, this, wdata);
- } else {
- reshape(env, this, wdata, x, y, width, height, setXY);
- JNU_CallMethodByName(env, NULL, this,
- "handleResize", "(II)V", width, height);
- }
- }
-/* NEW for dialog */ /* XXX: what this comment is supposed to mean? */
- else {
- wdata->need_reshape = False;
- /* fix for 4976337 - son@sparc.spb.su */
- /* we should find better fix later if needed */
- if (wdata->isResizable || !wdata->isFixedSizeSet) {
- reshape(env, this, wdata, x, y, width, height, setXY);
- }
- }
- }
- (*env)->DeleteLocalRef(env, target);
- break;
- } /* ReparentNotify */
-
- case ConfigureNotify: {
- DTRACE_PRINTLN2("TL: ConfigureNotify(0x%x/0x%x)",
- wdata->winData.shell, XtWindow(wdata->winData.shell));
-
- /*
- * Some window managers configure before we are reparented and
- * the send event flag is set! ugh... (Enlighetenment for one,
- * possibly MWM as well). If we haven't been reparented yet
- * this is just the WM shuffling us into position. Ignore
- * it!!!! or we wind up in a bogus location.
- */
- runningWM = awt_wm_getRunningWM();
- if (!wdata->reparented && wdata->isShowing &&
- runningWM != NO_WM && wdata->decor != AWT_NO_DECOR) {
- break;
- }
-
- /*
- * Notice that we have seen a ConfigureNotify after being
- * reparented. We should really check for it being a
- * synthetic event, but metacity doesn't send one.
- */
- if (wdata->reparented)
- wdata->configure_seen = 1;
-
- if ((*env)->EnsureLocalCapacity(env, 1) < 0) {
- break;
- }
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- /*
- * We can detect the difference between a move and a resize by
- * checking the send_event flag on the event; if it's true,
- * then it's indeed a move, if it's false, then this is a
- * resize and we do not want to process it as a "move" (for
- * resizes the x,y values are misleadingly set to 0,0 and so
- * just checking for an x,y delta won't work).
- */
-
- getTargetX = (*env)->GetIntField(env, target, componentIDs.x);
- getTargetY = (*env)->GetIntField(env, target, componentIDs.y);
-
- DTRACE_PRINTLN2("TL: target thinks (%d, %d)",
- getTargetX, getTargetY);
- DTRACE_PRINTLN3("TL: event is (%d, %d)%s",
- event->xconfigure.x, event->xconfigure.y,
- (event->xconfigure.send_event ? " synthetic" : ""));
-
- /*
- * N.B. The wdata top offset is the offset from the outside of
- * the entire (bordered window) to the inner/parent drawing
- * area (canvas), NOT to the shell. Thus, if a menubar is
- * present and/or a warning window at the top (not NETSCAPE),
- * the top offset will also include space for these. In order
- * to position the abstract java window relative to the shell,
- * we must add back in the appropriate space for these when we
- * subtract off the wdata top field.
- */
-#ifdef NETSCAPE
- wwHeight = 0;
-#else /* NETSCAPE */
- if (wdata->warningWindow != NULL)
- wwHeight = wdata->wwHeight;
- else
- wwHeight = 0;
-#endif /* NETSCAPE */
- topAdjust = wdata->mbHeight + wwHeight;
-
- /*
- * Coordinates in Component.setLocation() are treated as the
- * upper-left corner of the outer shell. The x and y in the
- * ConfigureNotify event, however, are the upper-left corner
- * of the inset CLIENT window. Therefore, the coordinates
- * from the event are massaged using the inset values in order
- * to determine if the top-level shell has moved. In the
- * event of a user- generated move event (i.e. dragging the
- * window itself), these coordinates are written back into the
- * Window object.
- *
- * Neat X/CDE/Native bug:
- * If an attempt is made to move the shell in the y direction
- * by an amount equal to the top inset, the Window isn't
- * moved. This can be seen here by examining event->xconfigure.y
- * before and after such a request is made: the value remains
- * unchanged. This wrecks a little havoc here, as the x and y
- * in the Component have already been set to the new location
- * (in Component.reshape()), but the Window doesn't end up in
- * the new location. What's more, if a second request is
- * made, the window will be relocated by TWICE the requested
- * amount, sort of "catching up" it would seem.
- *
- * For a test case of this, see bug 4234645.
- */
- setTargetX = event->xconfigure.x - wdata->left;
- setTargetY = event->xconfigure.y - wdata->top + topAdjust;
-
- width = (*env)->GetIntField(env, target, componentIDs.width);
- height = (*env)->GetIntField(env, target, componentIDs.height);
- checkNewXineramaScreen(env, this, wdata, setTargetX, setTargetY,
- width, height);
-
- if ((getTargetX != setTargetX || getTargetY != setTargetY)
- && (event->xconfigure.send_event || runningWM == NO_WM))
- {
- (*env)->SetIntField(env, target, componentIDs.x, (jint)setTargetX);
- (*env)->SetIntField(env, target, componentIDs.y, (jint)setTargetY);
-#ifdef _pauly_debug
- fprintf(stdout, " ++ shell move. Xevent x,y: %d, %d.\n",
- event->xconfigure.x, event->xconfigure.y);
- fprintf(stdout, " shell move. left: %d, top: %d, but offset: %d\n", wdata->left, wdata->top, topAdjust);
- fprintf(stdout," shell move. target x: %d, target y: %d\n", setTargetX, setTargetY);
- fprintf(stdout," shell move. ww height: %d\n", wwHeight);
- fflush(stdout);
-#endif /* _pauly_debug */
-
- DTRACE_PRINTLN2("TL: handleMoved(%d, %d)",
- setTargetX, setTargetY);
- JNU_CallMethodByName(env, NULL,
- this, "handleMoved", "(II)V",
- setTargetX, setTargetY);
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
- }
- else if (event->xconfigure.send_event == False) {
-#ifdef _pauly_debug
- fprintf(stdout,
- " ++ shell resize. Xevent x,y,w,h: %d, %d, %d, %d.\n",
- event->xconfigure.x, event->xconfigure.y,
- event->xconfigure.width, event->xconfigure.height);
- fflush(stdout);
-#endif /* _pauly_debug */
-
- wdata->shellResized = True;
- }
-
-
- (*env)->DeleteLocalRef(env, target);
- raiseInputMethodWindow(wdata);
-#ifdef __linux__
- adjustStatusWindow(wdata->winData.shell);
-#endif
- break;
- } /* ConfigureNotify */
-
- default:
- break;
- }
-}
-
-
-static void
-Frame_quit(Widget w,
- XtPointer client_data,
- XtPointer call_data)
-{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-
- JNU_CallMethodByName(env, NULL, (jobject) client_data, "handleQuit", "()V");
- if ((*env)->ExceptionOccurred(env)) {
- (*env)->ExceptionDescribe(env);
- (*env)->ExceptionClear(env);
- }
-}
-
-
-static void
-setDeleteCallback(jobject this, struct FrameData *wdata)
-{
- Atom xa_WM_DELETE_WINDOW;
- Atom xa_WM_TAKE_FOCUS;
- Atom xa_WM_PROTOCOLS;
-
- XtVaSetValues(wdata->winData.shell,
- XmNdeleteResponse, XmDO_NOTHING,
- NULL);
- xa_WM_DELETE_WINDOW = XmInternAtom(XtDisplay(wdata->winData.shell),
- "WM_DELETE_WINDOW", False);
- xa_WM_TAKE_FOCUS = XmInternAtom(XtDisplay(wdata->winData.shell),
- "WM_TAKE_FOCUS", False);
- xa_WM_PROTOCOLS = XmInternAtom(XtDisplay(wdata->winData.shell),
- "WM_PROTOCOLS", False);
-
- XmAddProtocolCallback(wdata->winData.shell,
- xa_WM_PROTOCOLS,
- xa_WM_DELETE_WINDOW,
- Frame_quit, (XtPointer) this);
-}
-
-
-extern AwtGraphicsConfigDataPtr
-copyGraphicsConfigToPeer(JNIEnv *env, jobject this);
-
-extern AwtGraphicsConfigDataPtr
-getGraphicsConfigFromComponentPeer(JNIEnv *env, jobject this);
-
-// Returns true if this shell has some transient shell chidlren
-// which are either Dialogs or Windows.
-// Returns false otherwise.
-Boolean hasTransientChildren(Widget shell) {
- int childIndex;
-
- // Enumerate through the popups
- for (childIndex = 0; childIndex < shell->core.num_popups; childIndex++) {
- Widget childShell = shell->core.popup_list[childIndex];
- // Find all transient shell which are either Dialog or Window
- if (XtIsTransientShell(childShell)) {
- Widget toplevel = findTopLevelByShell(childShell);
- if (toplevel != NULL) {
- // It is Dialog or Window - return true.
- return True;
- }
- }
- }
- return False;
-}
-
-extern Widget grabbed_widget;
-/**
- * Disposes top-level component and its widgets
- */
-static
-void disposeTopLevel(JNIEnv * env, jobject this) {
-
- struct FrameData *wdata;
- Widget parentShell;
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL || wdata->mainWindow == NULL
- || wdata->winData.shell == NULL)
- {
- /* do nothing */
- return;
- }
-
- // Save parent shell for later disposal.
- parentShell = XtParent(wdata->winData.shell);
-
- removeTopLevel(wdata);
- if (wdata->isInputMethodWindow) {
- removeInputMethodWindow(wdata);
- }
-
- XtRemoveEventHandler(wdata->focusProxy, FocusChangeMask,
- False, shellEH, this);
- XtUnmanageChild(wdata->focusProxy);
- awt_util_consumeAllXEvents(wdata->focusProxy);
- awt_util_cleanupBeforeDestroyWidget(wdata->focusProxy);
- XtDestroyWidget(wdata->focusProxy);
-
- XtUnmanageChild(wdata->winData.comp.widget);
- awt_delWidget(wdata->winData.comp.widget);
- awt_util_consumeAllXEvents(wdata->winData.comp.widget);
- awt_util_cleanupBeforeDestroyWidget(wdata->winData.comp.widget);
- XtDestroyWidget(wdata->winData.comp.widget);
-
- XtUnmanageChild(wdata->mainWindow);
- awt_util_consumeAllXEvents(wdata->mainWindow);
- awt_util_consumeAllXEvents(wdata->winData.shell);
- XtDestroyWidget(wdata->mainWindow);
- XtDestroyWidget(wdata->winData.shell);
- if (wdata->iconPixmap) {
- XFreePixmap(awt_display, wdata->iconPixmap);
- }
-
- if (grabbed_widget == wdata->winData.shell) {
- XUngrabPointer(awt_display, CurrentTime);
- XUngrabKeyboard(awt_display, CurrentTime);
- grabbed_widget = NULL;
- }
-
- free((void *) wdata);
-
- (*env)->SetLongField(env, this, mComponentPeerIDs.pData, 0);
- awtJNI_DeleteGlobalRef(env, this);
-
- // Check if parent shell was scheduled for disposal.
- // If it doesn't have window then we have to dispose it
- // by ourselves right now.
- // We can dispose shell only if it doesn't have "transient" children.
- {
- struct FrameData *pdata;
- struct WidgetInfo* winfo;
- Widget toplevel = findTopLevelByShell(parentShell);
- if (toplevel == NULL) {
- // Has already been deleted or it is top shell
- return;
- }
- winfo = findWidgetInfo(toplevel);
- DASSERT(winfo != NULL);
- if (winfo == NULL) {
- // Huh - has already been deleted?
- return;
- }
- pdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, winfo->peer, mComponentPeerIDs.pData);
- DASSERT(pdata != NULL);
- if (pdata == NULL) {
- // Huh - has already been deleted?
- return;
- }
- // 1) scheduled 2) no children 3) no window
- if (pdata->isDisposeScheduled
- && !hasTransientChildren(parentShell)
- && XtWindow(parentShell) == None)
- {
- disposeTopLevel(env, winfo->peer);
- }
- }
-}
-
-
-/**
- * Property change listener. Listens to _XA_JAVA_DISPOSE_PROPERTY_ATOM,
- * disposes the top-level when this property has been changed.
- */
-static void
-shellDisposeNotifyHandler(Widget w, XtPointer client_data,
- XEvent* event, Boolean* continue_to_dispatch) {
- struct FrameData *wdata;
-
- *continue_to_dispatch = True;
-
- if (event->type == PropertyNotify &&
- event->xproperty.atom == _XA_JAVA_DISPOSE_PROPERTY_ATOM)
- {
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, (jobject)client_data,
- mComponentPeerIDs.pData);
- if (wdata != NULL && wdata->isDisposeScheduled) {
- disposeTopLevel(env, (jobject)client_data);
-
- // We've disposed top-level, no more actions on it
- *continue_to_dispatch = False;
- }
- }
-}
-
-/**
- * Schedules top-level for later dispose - when all events
- * on it will be processed.
- */
-static
-void scheduleDispose(JNIEnv * env, jobject peer) {
-
- struct FrameData *wdata;
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, peer, mComponentPeerIDs.pData);
-
- if (wdata->isDisposeScheduled) {
- return;
- }
-
- wdata->isDisposeScheduled = True;
- if (XtWindow(wdata->winData.shell) != None) {
- XChangeProperty(awt_display, XtWindow(wdata->winData.shell),
- _XA_JAVA_DISPOSE_PROPERTY_ATOM, XA_ATOM, 32, PropModeAppend,
- (unsigned char *)"", 0);
- XFlush(awt_display);
- XSync(awt_display, False);
- } else {
- // If this top-level has children which are still visible then
- // their disposal could have been scheduled. We shouldn't allow this widget
-// to destroy its children top-levels. For this purpose we postpone the disposal
- // of this toplevel until after all its children are disposed.
- if (!hasTransientChildren(wdata->winData.shell)) {
- disposeTopLevel(env, peer);
- }
- }
-}
-
-
-/* sun_awt_motif_MWindowPeer_pCreate() is native (X/Motif) create routine */
-static char* focusProxyName = "FocusProxy";
-
-Widget createFocusProxy(jobject globalRef, Widget parent) {
- Widget proxy;
-#define MAX_ARGC 20
- Arg args[MAX_ARGC];
- int32_t argc;
-
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
-
- if (parent == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- return NULL;
- }
- argc = 0;
- XtSetArg(args[argc], XmNwidth, 1);
- argc++;
- XtSetArg(args[argc], XmNheight, 1);
- argc++;
- XtSetArg(args[argc], XmNx, -1);
- argc++;
- XtSetArg(args[argc], XmNy, -1);
- argc++;
- XtSetArg(args[argc], XmNmarginWidth, 0);
- argc++;
- XtSetArg(args[argc], XmNmarginHeight, 0);
- argc++;
- XtSetArg(args[argc], XmNspacing, 0);
- argc++;
- XtSetArg(args[argc], XmNresizePolicy, XmRESIZE_NONE);
- argc++;
-
- DASSERT(!(argc > MAX_ARGC));
- proxy = XmCreateDrawingArea(parent, focusProxyName, args, argc);
- XtAddEventHandler(proxy,
- FocusChangeMask,
- False, shellEH, globalRef);
- XtManageChild(proxy);
-#undef MAX_ARGC
- return proxy;
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pCreate
- * Signature: (Lsun/awt/motif/MComponentPeer;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_pCreate(JNIEnv *env, jobject this,
- jobject parent, jstring target_class_name, jboolean isFocusableWindow)
-{
-#define MAX_ARGC 50
- Arg args[MAX_ARGC];
- int32_t argc;
- struct FrameData *wdata;
- struct FrameData *pdata = NULL;
- char *shell_name = NULL;
- WidgetClass shell_class;
- Widget parent_widget;
- jobject target;
- jobject insets;
- jobject winAttr;
- jstring warningString;
- jboolean resizable;
- jboolean isModal;
- jboolean initialFocus;
- jint state;
- jclass clazz;
- jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this);
-
- uint32_t runningWM; /* the running Window Manager */
- Widget innerCanvasW; /* form's child, parent of the
- outer canvas (drawing area) */
- Position x,y;
- Dimension w,h;
- AwtGraphicsConfigDataPtr adata;
- AwtGraphicsConfigDataPtr defConfig;
- jobject gd = NULL;
- jobject gc = NULL;
- char *cname = NULL;
- jstring jname;
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- if (JNU_IsNull(env, target)) {
- JNU_ThrowNullPointerException(env, "null target");
- AWT_UNLOCK();
- return;
- }
-
- wdata = ZALLOC(FrameData);
- JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, wdata);
- if (wdata == NULL) {
- JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
- AWT_UNLOCK();
- return;
- }
-
- adata = copyGraphicsConfigToPeer(env, this);
- defConfig = getDefaultConfig(adata->awt_visInfo.screen);
-
-
- /* Retrieve the specified characteristics for this window */
- winAttr = (*env)->GetObjectField(env, this, mWindowPeerIDs.winAttr);
- resizable = (*env)->GetBooleanField( env,
- winAttr,
- mWindowAttributeIDs.isResizable);
- state = (*env)->GetIntField( env,
- winAttr,
- mWindowAttributeIDs.initialState);
- initialFocus = (*env)->GetBooleanField( env,
- winAttr,
- mWindowAttributeIDs.initialFocus);
-
- /* As of today decor is either on or off... except the InputMethodWindow */
- if ((*env)->GetBooleanField(env, winAttr, mWindowAttributeIDs.nativeDecor)) {
- wdata->decor = (*env)->GetIntField(env, winAttr, mWindowAttributeIDs.decorations);
- } else {
- wdata->decor = AWT_NO_DECOR;
- }
-
- insets = (*env)->GetObjectField(env, this, mWindowPeerIDs.insets);
-
- /* The insets will be corrected upon the reparent
- event in shellEH(). For now, use bogus values. */
- wdata->top = (*env)->GetIntField(env, insets, insetsIDs.top);
- wdata->left = (*env)->GetIntField(env, insets, insetsIDs.left);
- wdata->bottom = (*env)->GetIntField(env, insets, insetsIDs.bottom);
- wdata->right = (*env)->GetIntField(env, insets, insetsIDs.right);
- awt_Frame_guessInsets(wdata);
- awtJNI_ChangeInsets(env, this, wdata);
- wdata->reparented = False;
- wdata->configure_seen = False;
- x = (*env)->GetIntField(env, target, componentIDs.x) + wdata->left;
- y = (*env)->GetIntField(env, target, componentIDs.y) + wdata->top;
-
- w = (*env)->GetIntField(env, target, componentIDs.width)
- - (wdata->left + wdata->right);
- h = (*env)->GetIntField(env, target, componentIDs.height)
- - (wdata->top + wdata->bottom);
- if (w < 0) w = 0;
- if (h < 0) h = 0;
-
- DTRACE_PRINTLN1("TL: pCreate: state = 0x%X", state);
-
- wdata->isModal = 0;
- wdata->initialFocus = (Boolean)initialFocus;
- wdata->isShowing = False;
- wdata->shellResized = False;
- wdata->canvasResized = False;
- wdata->menuBarReset = False;
- wdata->need_reshape = False;
- wdata->focusProxy = NULL;
-#ifdef __linux__
- wdata->fixInsets = True;
-#endif
- wdata->state = state;
-
- /* initialize screen to screen number in GraphicsConfig's device */
- /* can the Window's GC ever be null? */
- gc = (*env)->GetObjectField(env, target, componentIDs.graphicsConfig);
- DASSERT(gc);
-
- gd = (*env)->GetObjectField(env, gc, x11GraphicsConfigIDs.screen);
- DASSERT(gd);
-
- wdata->screenNum = (*env)->GetIntField(env, gd, x11GraphicsDeviceIDs.screen);
-
- wdata->isFocusableWindow = (Boolean)isFocusableWindow;
-
- /*
- * Create a top-level shell widget.
- */
- argc = 0;
- XtSetArg(args[argc], XmNsaveUnder, False); argc++;
- if (resizable) {
- XtSetArg(args[argc], XmNallowShellResize, True); argc++;
- } else {
- XtSetArg(args[argc], XmNallowShellResize, False); argc++;
- }
- XtSetArg(args[argc], XmNvisual, defConfig->awt_visInfo.visual); argc++;
- XtSetArg(args[argc], XmNcolormap, defConfig->awt_cmap); argc++;
- XtSetArg(args[argc], XmNdepth, defConfig->awt_depth); argc++;
- XtSetArg(args[argc], XmNmappedWhenManaged, False); argc++;
- XtSetArg(args[argc], XmNx, x); argc++;
- XtSetArg(args[argc], XmNy, y); argc++;
- XtSetArg(args[argc], XmNwidth, w); argc++;
- XtSetArg(args[argc], XmNheight, h); argc++;
-
- XtSetArg(args[argc], XmNbuttonFontList, getMotifFontList()); argc++;
- XtSetArg(args[argc], XmNlabelFontList, getMotifFontList()); argc++;
- XtSetArg(args[argc], XmNtextFontList, getMotifFontList()); argc++;
-
- XtSetArg(args[argc], XmNmwmDecorations, wdata->decor); argc++;
- XtSetArg(args[argc], XmNscreen,
- ScreenOfDisplay(awt_display, defConfig->awt_visInfo.screen)); argc++;
-
- if (wdata->initialFocus == False || !isFocusableWindowByPeer(env, this)) {
- XtSetArg(args[argc], XmNinput, False); argc++;
- }
-
- if (wdata->decor == AWT_NO_DECOR) {
- /* this is heinous but it can not be avoided for now.
- ** this is the only known way to eliminate all decorations
- ** for openlook, which btw, is a bug as ol theoretically
- ** supports MWM_HINTS
- */
-#ifndef DO_FULL_DECOR
- if (awt_wm_getRunningWM() == OPENLOOK_WM) {
- XtSetArg(args[argc], XmNoverrideRedirect, True);
- argc++;
- }
-#endif
- }
-
- /* 4334958: Widget name is set to the Java class name */
- shell_name =
- (char *)JNU_GetStringPlatformChars(env, target_class_name, NULL);
-
- if (parent) {
- pdata = (struct FrameData *)
- (*env)->GetLongField(env, parent, mComponentPeerIDs.pData);
- }
-
- /* Parenting tells us whether we wish to be transient or not */
- if (pdata == NULL) {
- if (!shell_name)
- shell_name = "AWTapp";
- shell_class = topLevelShellWidgetClass;
- parent_widget = awt_root_shell;
- }
- else {
- if (!shell_name)
- shell_name = "AWTdialog";
- shell_class = transientShellWidgetClass;
- parent_widget = pdata->winData.shell;
- XtSetArg(args[argc], XmNtransient, True); argc++;
- XtSetArg(args[argc], XmNtransientFor, parent_widget); argc++;
-
- /* Fix Forte Menu Bug. If Window name is "###overrideRedirect###",
- * then set XmNoverrideRedirect to prevent Menus from getting focus.
- * In JDK 1.2.2 we created Windows as xmMenuShellWidgetClass,
- * so we did not need to do this. Swing DefaultPopupFactory's
- * createHeavyWeightPopup sets Window name to "###overrideRedirect###".
- */
- /**
- * Fix for 4476629. Allow Swing to create heavyweight popups which will
- * not steal focus from Frame.
- */
- jname = (*env)->GetObjectField(env, target, componentIDs.name);
- if (!JNU_IsNull(env, jname)) {
- cname = (char *)JNU_GetStringPlatformChars(env, jname, NULL);
- }
- if ( (cname != NULL && strcmp(cname, "###overrideRedirect###") == 0)
- || (!isFrameOrDialog(target, env)
- && !isFocusableWindowByPeer(env, this)
- )
- )
- { /* mbron */
- XtSetArg(args[argc], XmNoverrideRedirect, True);
- argc++;
- }
- if (cname) {
- JNU_ReleaseStringPlatformChars(env, jname, (const char *) cname);
- }
- (*env)->DeleteLocalRef(env, jname);
- }
- DASSERT(!(argc > MAX_ARGC));
- wdata->winData.shell = XtCreatePopupShell(shell_name, shell_class,
- parent_widget, args, argc);
- if (shell_name) {
- JNU_ReleaseStringPlatformChars(env, target_class_name, shell_name);
- }
-
-#ifdef DEBUG
- /* Participate in EditRes protocol to facilitate debugging */
- XtAddEventHandler(wdata->winData.shell, (EventMask)0, True,
- _XEditResCheckMessages, NULL);
-#endif
-
- setDeleteCallback(globalRef, wdata);
-
- /* Establish resizability. For the case of not resizable, do not
- yet set a fixed size here; we must wait until in the routine
- sun_awt_motif_MWindowPeer_pReshape() after insets have been fixed.
- This is because correction of the insets may affect shell size.
- (See comments in shellEH() concerning correction of the insets. */
- /*
- * Fix for BugTraq ID 4313607.
- * Initial resizability will be set later in MWindowPeer_setResizable()
- * called from init().
- */
- wdata->isResizable = True;
- wdata->isFixedSizeSet = False;
-
- XtAddEventHandler(wdata->winData.shell,
- (StructureNotifyMask | PropertyChangeMask
- | VisibilityChangeMask),
- False, shellEH, globalRef);
-
- XtAddEventHandler(wdata->winData.shell,
- FocusChangeMask,
- False, shellFocusEH, globalRef);
-
-
- /**
- * Installing property change handler for DISPOSE property.
- * This property will be changed when we need to dispose the whole
- * top-level. The nature of PropertyNotify will guarantee that it is
- * the latest event on the top-level so we can freely dispose it.
- */
- wdata->isDisposeScheduled = False;
- if (_XA_JAVA_DISPOSE_PROPERTY_ATOM == 0) {
- _XA_JAVA_DISPOSE_PROPERTY_ATOM = XInternAtom(awt_display, "_SUNW_JAVA_AWT_DISPOSE", False);
- }
- XtAddEventHandler(wdata->winData.shell, PropertyChangeMask, False,
- shellDisposeNotifyHandler, globalRef);
-
- /*
- * Create "main" form.
- */
- argc = 0;
- XtSetArg(args[argc], XmNmarginWidth, 0); argc++;
- XtSetArg(args[argc], XmNmarginHeight, 0); argc++;
- XtSetArg(args[argc], XmNhorizontalSpacing, 0); argc++;
- XtSetArg(args[argc], XmNverticalSpacing, 0); argc++;
- XtSetArg(args[argc], XmNresizePolicy, XmRESIZE_NONE); argc++;
-
- XtSetArg(args[argc], XmNbuttonFontList, getMotifFontList()); argc++;
- XtSetArg(args[argc], XmNlabelFontList, getMotifFontList()); argc++;
- XtSetArg(args[argc], XmNtextFontList, getMotifFontList()); argc++;
-
- DASSERT(!(argc > MAX_ARGC));
- wdata->mainWindow = XmCreateForm(wdata->winData.shell, "main", args, argc);
-
- /* The widget returned by awt_canvas_create is a drawing area
- (i.e., canvas) which is the child of another drawing area
- parent widget. The parent is the drawing area within the
- form just created. The child is an drawing area layer over
- the entire frame window, including the form, any menu bar
- and warning windows present, and also window manager stuff.
- The top, bottom, left, and right fields in wdata maintain
- the respective offsets between these two drawing areas. */
-
- wdata->winData.comp.widget = awt_canvas_create((XtPointer)globalRef,
- wdata->mainWindow,
- "frame_",
- -1,
- -1,
- True,
- wdata,
- adata);
- XtAddCallback(wdata->winData.comp.widget,
- XmNresizeCallback, outerCanvasResizeCB,
- globalRef);
-
- innerCanvasW = XtParent(wdata->winData.comp.widget);
- XtVaSetValues(innerCanvasW,
- XmNleftAttachment, XmATTACH_FORM,
- XmNrightAttachment, XmATTACH_FORM,
- NULL);
-
- XtAddEventHandler(innerCanvasW, StructureNotifyMask, FALSE,
- innerCanvasEH, globalRef);
-
- wdata->focusProxy = createFocusProxy((XtPointer)globalRef,
- wdata->mainWindow);
-
- /* No menu bar initially */
- wdata->menuBar = NULL;
- wdata->mbHeight = 0;
-
- /* If a warning window (string) is needed, establish it now.*/
- warningString =
- (*env)->GetObjectField(env, target, windowIDs.warningString);
- if (!JNU_IsNull(env, warningString) ) {
- char *wString;
- /* Insert a warning window. It's height can't be set yet;
- it will later be set in setMbAndWwHeightAndOffsets().*/
- wString = (char *) JNU_GetStringPlatformChars(env, warningString, NULL);
- wdata->warningWindow = awt_util_createWarningWindow(wdata->mainWindow, wString);
- JNU_ReleaseStringPlatformChars(env, warningString, (const char *) wString);
-
- wdata->wwHeight = 0;
- XtVaSetValues(wdata->warningWindow,
- XmNleftAttachment, XmATTACH_FORM,
- XmNrightAttachment, XmATTACH_FORM,
- NULL);
-
-#ifdef NETSCAPE
- /* For NETSCAPE, warning window is at bottom of the form*/
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_FORM,
- NULL);
- XtVaSetValues(wdata->warningWindow,
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopWidget, innerCanvasW,
- XmNbottomAttachment, XmATTACH_FORM,
- NULL);
-#else /* NETSCAPE */
- /* Otherwise (not NETSCAPE), warning is at top of form */
- XtVaSetValues(wdata->warningWindow,
- XmNtopAttachment, XmATTACH_FORM,
- NULL);
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopWidget, wdata->warningWindow,
- XmNbottomAttachment, XmATTACH_FORM,
- NULL);
-#endif /* NETSCAPE */
-
- } else {
- /* No warning window present */
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_FORM,
- XmNbottomAttachment, XmATTACH_FORM,
- NULL);
- wdata->warningWindow = NULL;
- wdata->wwHeight = 0;
- }
-
- awt_util_show(wdata->winData.comp.widget);
-
- AWT_FLUSH_UNLOCK();
-
- addTopLevel(wdata);
-
- /* Check whether this is an instance of InputMethodWindow or not */
- if (inputMethodWindowClass == NULL) {
- jclass localClass = (*env)->FindClass(env, "sun/awt/im/InputMethodWindow");
- inputMethodWindowClass = (jclass)(*env)->NewGlobalRef(env, localClass);
- (*env)->DeleteLocalRef(env, localClass);
- }
- if ((*env)->IsInstanceOf(env, target, inputMethodWindowClass)) {
- wdata->isInputMethodWindow = True;
- addInputMethodWindow(wdata);
- }
-} /* MWindowPeer_pCreate() */
-
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pSetTitle
- * Signature: (Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_pSetTitle(JNIEnv *env, jobject this,
- jstring title)
-{
- char *ctitle;
- char *empty_string = " ";
- struct FrameData *wdata;
- XTextProperty text_prop;
- char *c[1];
- int32_t conv_result;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL || wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "null wdata or shell");
- AWT_UNLOCK();
- return;
- }
-
- /* TODO: uwe: set _NET_WM_NAME property to utf-8 name */
-
- ctitle = (JNU_IsNull(env, title)) ? empty_string
- : (char *) JNU_GetStringPlatformChars(env, title, NULL);
-
- if (strcmp(ctitle, "") == 0)
- ctitle = empty_string;
-
- c[0] = ctitle;
-
- /* need to convert ctitle to CompoundText */
- conv_result = XmbTextListToTextProperty(awt_display, c, 1,
- XStdICCTextStyle,
- &text_prop);
-
- /*
- * XmbTextListToTextProperty returns value that is greater
- * than Success if the supplied text is not fully convertible
- * to specified encoding. In this case, the return value is
- * the number of inconvertible characters. But convertibility
- * is guaranteed for XCompoundTextStyle, so it will actually
- * never be greater than Success. Errors handled below are
- * represented by values that are lower than Success.
- */
- if (conv_result >= Success) {
- XtVaSetValues(wdata->winData.shell,
- XmNtitle, text_prop.value,
- XmNtitleEncoding, text_prop.encoding,
- XmNiconName, text_prop.value,
- XmNiconNameEncoding, text_prop.encoding,
- XmNname, ctitle,
- NULL);
- }
-
- if (ctitle != empty_string)
- JNU_ReleaseStringPlatformChars(env, title, (const char *) ctitle);
-
- if (conv_result == XNoMemory) {
- JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
- AWT_UNLOCK();
- return;
- }
- if (conv_result == XLocaleNotSupported) {
- JNU_ThrowInternalError(env, "Current locale is not supported");
- AWT_UNLOCK();
- return;
- }
-
- XFree(text_prop.value);
- AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pToFront
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_pToFront(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
- jobject target;
- Window shellWindow;
- Boolean autoRequestFocus;
- Boolean isModal = FALSE;
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL
- || wdata->winData.comp.widget == NULL
- || wdata->winData.shell == NULL
- || wdata->mainWindow == NULL
- || JNU_IsNull(env, target))
- {
- JNU_ThrowNullPointerException(env, "null widget/target data");
- AWT_UNLOCK();
- return;
- }
-
- if ((shellWindow = XtWindow(wdata->winData.shell)) != None) {
- XRaiseWindow(awt_display, shellWindow);
-
- autoRequestFocus = (*env)->GetBooleanField(env, target, windowIDs.isAutoRequestFocus);
-
- if (isDialog(target, env)) {
- isModal = (*env)->GetBooleanField(env, target, dialogIDs.modal);
- }
-
- // In contrast to XToolkit/WToolkit modal dialog can be unfocused.
- // So we should also ask for modality in addition to 'autoRequestFocus'.
- if (wdata->isFocusableWindow && (autoRequestFocus || isModal)) {
- XSetInputFocus(awt_display, XtWindow(wdata->focusProxy), RevertToPointerRoot, CurrentTime);
- }
- }
-
- (*env)->DeleteLocalRef(env, target);
-
- AWT_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pShow
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_pShow(JNIEnv *env, jobject this)
-{
- Java_sun_awt_motif_MWindowPeer_pShowModal(env, this, JNI_FALSE);
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pShowModal
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_pShowModal(JNIEnv *env, jobject this,
- jboolean isModal)
-{
- struct FrameData *wdata;
- Boolean iconic;
- jobject target;
- Boolean locationByPlatform;
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL
- || wdata->winData.comp.widget == NULL
- || wdata->winData.shell == NULL
- || wdata->mainWindow == NULL
- || (wdata->winData.flags & W_IS_EMBEDDED)
- || JNU_IsNull(env, target))
- {
- JNU_ThrowNullPointerException(env, "null widget/target data");
- AWT_UNLOCK();
- return;
- }
-
- DTRACE_PRINTLN2("TL: pShowModal(modal = %s) state = 0x%X",
- isModal ? "true" : "false",
- wdata->state);
-
- wdata->isModal = isModal;
-
- /*
- * A workaround for bug 4062589 that is really a motif problem
- * (see bug 4064803). Before popping up a modal dialog, if a
- * pulldown menu has the input focus (i.e. user has pulled the
- * menu down), we send a fake click event and make sure the click
- * event is processed. With this simulation of user clicking, X
- * server will not get confused about the modality and a
- * subsequent click on the popup modal dialog will not cause
- * system lockup.
- */
- if (wdata->isModal && awt_util_focusIsOnMenu(awt_display)
- && awt_util_sendButtonClick(awt_display, InputFocus))
- {
- for (;;) {
- XEvent ev;
- XtAppPeekEvent(awt_appContext, &ev);
- if ((ev.type == ButtonRelease)
- && (*(XButtonEvent *)&ev).send_event)
- {
- XtAppProcessEvent(awt_appContext, XtIMAll);
- break;
- } else {
- XtAppProcessEvent(awt_appContext, XtIMAll);
- }
- }
- }
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- // 4488209: kdm@sparc.spb.su
- // wdata->isShowing is True when toFront calls pShow.
- // We do not need to do some things if wdata->isShowing is True.
- if (!wdata->isShowing) {
- XtVaSetValues(wdata->winData.comp.widget,
- XmNx, -(wdata->left),
- XmNy, -(wdata->top),
- NULL);
-
- /* But see below! */
- iconic = (wdata->state & java_awt_Frame_ICONIFIED) ? True : False;
- XtVaSetValues(wdata->winData.shell,
- XmNinitialState, iconic ? IconicState : NormalState,
- NULL);
-
- if (wdata->menuBar != NULL) {
- awt_util_show(wdata->menuBar);
- }
- XtManageChild(wdata->mainWindow);
- XtRealizeWidget(wdata->winData.shell); /* but not map it yet */
-
-/* fprintf(stderr, "*** proxy window %x\n", XtWindow(wdata->focusProxy)); */
- XStoreName(awt_display, XtWindow(wdata->focusProxy), "FocusProxy");
- /*
- * Maximization and other stuff that requires a live Window to set
- * properties on to communicate with WM.
- */
- awt_wm_setExtendedState(wdata, wdata->state);
- awt_wm_setShellDecor(wdata, wdata->isResizable);
-
- if (wdata->isModal) {
- removePopupMenus();
-#ifndef NOMODALFIX
- /*
- * Fix for 4078176 Modal dialogs don't act modal
- * if addNotify() is called before setModal(true).
- * Moved from Java_sun_awt_motif_MDialogPeer_create.
- */
- if (!wdata->callbacksAdded) {
- XtAddCallback(wdata->winData.shell,
- XtNpopupCallback, awt_shellPoppedUp,
- NULL);
- XtAddCallback(wdata->winData.shell,
- XtNpopdownCallback, awt_shellPoppedDown,
- NULL);
- wdata->callbacksAdded = True;
- }
-#endif /* !NOMODALFIX */
- /*
- * Set modality on the Shell, not the BB. The BB expects that
- * its parent is an xmDialogShell, which as the result of
- * coalescing is now a transientShell... This has resulted in
- * a warning message generated under fvwm. The shells are
- * virtually identical and a review of Motif src suggests that
- * setting dialog style on BB is a convenience not functional
- * for BB so set Modality on shell, not the BB(form) widget.
- */
- XtVaSetValues(wdata->winData.shell,
- XmNmwmInputMode, MWM_INPUT_FULL_APPLICATION_MODAL,
- NULL);
- XtManageChild(wdata->winData.comp.widget);
- }
- else { /* not modal */
- XtVaSetValues(wdata->winData.shell,
- XmNmwmInputMode, MWM_INPUT_MODELESS, NULL);
- XtManageChild(wdata->winData.comp.widget);
- XtSetMappedWhenManaged(wdata->winData.shell, True);
- }
- if (wdata->isResizable) {
- /* REMINDER: uwe: will need to revisit for setExtendedStateBounds */
- awt_wm_removeSizeHints(wdata->winData.shell, PMinSize|PMaxSize);
- }
- locationByPlatform =
- (*env)->GetBooleanField(env, target, windowIDs.locationByPlatform);
- if (locationByPlatform) {
- awt_wm_removeSizeHints(wdata->winData.shell, USPosition|PPosition);
- }
- }
-
- /*
- * 4261047: always pop up with XtGrabNone. Motif notices the
- * modal input mode and perform the grab for us, doing its
- * internal book-keeping as well.
- */
- XtPopup(wdata->winData.shell, XtGrabNone);
- wdata->isShowing = True;
-
- wdata->initialFocus = (*env)->GetBooleanField(env, target, windowIDs.isAutoRequestFocus);
-
- if (wdata->isFocusableWindow) {
- if (wdata->initialFocus || wdata->isModal) {
- focusOnMapNotify = True;
- } else {
- XtVaSetValues(wdata->winData.shell, XmNinput, False, NULL);
- }
- }
-
- (*env)->DeleteLocalRef(env, target);
-
- AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: getState
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL
-Java_sun_awt_motif_MWindowPeer_getState(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
- jint state;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL || wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return java_awt_Frame_NORMAL;
- }
-
- state = wdata->state;
-
- AWT_FLUSH_UNLOCK();
- return state;
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: setState
- * Signature: (I)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_setState(JNIEnv *env, jobject this,
- jint state)
-{
- struct FrameData *wdata;
- Widget shell;
- Window shell_win;
- jint changed;
- Boolean changeIconic, iconic;
-
- AWT_LOCK();
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL || wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- shell = wdata->winData.shell;
- shell_win = XtWindow(shell);
-
- DTRACE_PRINTLN4("TL: setState(0x%x/0x%x, 0x%X -> 0x%X)",
- shell, shell_win,
- wdata->state, state);
-
- if (!wdata->isShowing) {
- /*
- * Not showing, so just record requested state; pShow will set
- * initial state hints/properties appropriately before poping
- * us up again.
- */
- DTRACE_PRINTLN("TL: NOT showing (just record the new state)");
- wdata->state = state;
- AWT_UNLOCK();
- return;
- }
-
- /*
- * Request the state transition from WM here and do java upcalls
- * in shell event handler when WM actually changes our state.
- */
- changed = wdata->state ^ state;
-
- changeIconic = changed & java_awt_Frame_ICONIFIED;
- iconic = (state & java_awt_Frame_ICONIFIED) ? True : False;
-
- if (changeIconic && iconic) {
- DTRACE_PRINTLN("TL: set iconic = True");
- XIconifyWindow(XtDisplay(shell), shell_win,
- XScreenNumberOfScreen(XtScreen(shell)));
- }
-
- /*
- * If a change in both iconic and extended states requested, do
- * changes to extended state when we are in iconic state.
- */
- if ((changed & ~java_awt_Frame_ICONIFIED) != 0) {
- awt_wm_setExtendedState(wdata, state);
- }
-
- if (changeIconic && !iconic) {
- DTRACE_PRINTLN("TL: set iconic = False");
- XMapWindow(XtDisplay(shell), shell_win);
- }
-
- AWT_FLUSH_UNLOCK();
-}
-
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pHide
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_pHide(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
-
- AWT_LOCK();
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL
- || wdata->winData.comp.widget == NULL
- || wdata->winData.shell == NULL)
- {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- /**
- * Disable proxy mechanism when Window's shell is being hidden
- */
- clearFocusPath(wdata->winData.shell);
-
- wdata->isShowing = False; /* ignore window state events */
-
- if (XtIsRealized(wdata->winData.shell)) {
- /* XXX: uwe: this is bogus */
- /*
- * Make sure we withdraw a window in an unmaximized state, or
- * we'll lose out normal bounds (pShow will take care of
- * hinting maximization, so when the window is shown again it
- * will be correctly shown maximized).
- */
- if (wdata->state & java_awt_Frame_MAXIMIZED_BOTH) {
- awt_wm_setExtendedState(wdata,
- wdata->state & ~java_awt_Frame_MAXIMIZED_BOTH);
- }
- XtUnmanageChild(wdata->winData.comp.widget);
- XtPopdown(wdata->winData.shell);
- }
-
- AWT_FLUSH_UNLOCK();
-}
-
-
-/* sun_awt_motif_MWindowPeer_pReshape() is native (X/Motif) routine that
- is called to effect a reposition and / or resize of the target frame.
- The parameters x,y,w,h specify target's x, y position, width, height.*/
-
-/*
- * This functionality is invoked from both java and native code, and
- * we only want to lock when invoking it from java, so wrap the native
- * method version with the locking.
- */
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pReshape
- * Signature: (IIII)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_pReshape(JNIEnv *env, jobject this,
- jint x, jint y, jint w, jint h)
-{
- struct FrameData *wdata;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- // See if our new location is on a new screen
- if (wdata->reparented) {
- checkNewXineramaScreen(env, this, wdata, x, y, w, h);
- }
-
- /**
- * Fix for 4652685.
- * Avoid setting position for embedded frames, since this conflicts with the
- * fix for 4419207. We assume that the embedded frame never changes its
- * position relative to the parent.
- */
- if (wdata->winData.flags & W_IS_EMBEDDED) {
- x = 0;
- y = 0;
- }
-
- reshape(env, this, wdata, x, y, w, h, True);
-
- AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MEmbeddedFramePeer
- * Method: pReshapePrivate
- * Signature: (IIII)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_pReshapePrivate(JNIEnv *env, jobject this,
- jint x, jint y, jint w, jint h)
-{
- struct FrameData *wdata;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- reshape(env, this, wdata, x, y, w, h, True);
-
- AWT_FLUSH_UNLOCK();
-}
-
-static void
-reshape(JNIEnv *env, jobject this, struct FrameData *wdata,
- jint x, jint y, jint w, jint h, Boolean setXY)
-{
- int32_t topAdjust, /* top adjustment of offset */
- bottomAdjust; /* bottom adjustment of offset */
- int32_t width, /* of X/Motif shell and form */
- height; /* of X/Motif shell and form */
- int32_t w1, h1;
- enum wmgr_t wm; /* window manager */
- XWindowAttributes winAttr;
-
- DTRACE_PRINTLN7("TL: reshape(0x%x/0x%x,\n"/**/
- "TL: x = %d, y = %d, w = %d, h = %d, %s)",
- wdata->winData.shell, XtWindow(wdata->winData.shell),
- x, y, w, h,
- setXY ? "setXY" : "false");
-
- wm = awt_wm_getRunningWM();
-
- /* Make adjustments in case of a dynamically added/removed menu bar */
- awtJNI_setMbAndWwHeightAndOffsets(env, this, wdata);
-
-#ifdef _pauly_debug
- fprintf(stdout," reshape. offsets - top: %d, bottom: %d, left: %d, right: %d\n",
- wdata->top, wdata->bottom, wdata->left, wdata->right);
- fflush(stdout);
-#endif /* _pauly_debug */
-
- /* The abstract java (target) position coordinates (x,y)
- are for the bordered window. Eventually(!), the Motif
- (shell) coordinates (XmNx, XmNy) will exclude borders.
- (This is true only AFTER shell is massaged by the WM.) */
-
- /* The abstract java (target) width and height includes any WM
- borders. But the Motif width and height excludes WM borders.
- The wdata top and bottom fields may include space for menu bar,
- warning window, etc. We must adjust by these values for shell. */
- topAdjust = 0;
- bottomAdjust = 0;
- /* Surprise - do not(!) check for nonNull MenuBar because that can
- occur separately (in ...pSetMenubar()) from calculation of the
- menu bar height and offsets (in setMbAndWwHeightAndOffsets()).
- In any event, the offsets and wdata mbHeight field should jive. */
- topAdjust += wdata->mbHeight;
- if (wdata->warningWindow != NULL) {
-#ifdef NETSCAPE
- bottomAdjust += wdata->wwHeight;
-#else /* NETSCAPE */
- topAdjust += wdata->wwHeight;
-#endif /* NETSCAPE */
- }
- if (wdata->hasTextComponentNative) {
- bottomAdjust += wdata->imHeight;
- }
-#ifdef _pauly_debug
- fprintf(stdout," reshape. adjustments - top: %d, bottom: %d\n", topAdjust, bottomAdjust);
- fflush(stdout);
-#endif /* _pauly_debug */
-
- width = w - (wdata->left + wdata->right);
- height = h - (wdata->top + wdata->bottom) + (topAdjust + bottomAdjust);
-
- /*
- * Shell size.
- * 4033151. If nonpositive size specified (e.g., if no size
- * given), establish minimum allowable size. Note: Motif shell
- * can not be sized 0.
- */
- w1 = (width > 0) ? width : 1;
- h1 = (height > 0) ? height : 1;
-
- if (awt_wm_configureGravityBuggy() /* WM ignores window gravity */
- && wdata->reparented && wdata->isShowing)
- {
- /*
- * Buggy WM places client window at (x,y) ignoring the window
- * gravity. All our windows are NorthWestGravity, so adjust
- * (x,y) by insets appropriately.
- */
- x += wdata->left;
- y += wdata->top;
- DTRACE_PRINTLN2("TL: work around WM gravity bug: x += %d, y += %d",
- wdata->left, wdata->top);
- }
-
- if (wdata->imRemove) {
- XtVaSetValues(XtParent(wdata->winData.comp.widget),
- XmNheight, (((h - (wdata->top + wdata->bottom)) > 0) ?
- (h - (wdata->top + wdata->bottom)) : 1),
- NULL);
- wdata->imRemove = False;
- }
-
-#if 0 /* XXX: this screws insets calculation under KDE2 in the case of
- negative x, y */
- /*
- * Without these checks, kwm places windows slightly off the screen,
- * when there is a window underneath at (0,0) and empty space below,
- * but not to the right.
- */
- if (x < 0) x = 0;
- if (y < 0) y = 0;
-#endif
- if ((wdata->winData.flags & W_IS_EMBEDDED) == 0) {
- if ((wm == MOTIF_WM) || (wm == CDE_WM)) {
- /*
- * By default MWM has "usePPosition: nonzero" and so ignores
- * windows with PPosition (0,0). Work around (should we???).
- */
- if ((x == 0) && (y == 0)) {
- x = y = 1;
- }
- }
- }
-
- if ( wdata->decor == AWT_NO_DECOR ) {
- if (setXY)
- XtConfigureWidget(wdata->winData.shell, x, y, w1, h1, 0 );
- else
- XtResizeWidget(wdata->winData.shell, w1, h1, 0);
- }
- else {
- /*
- * 5006248, workaround for OpenLook WM.
- * Thread gets stuck at XtVaSetValues call awaiting for first
- * ConfigureNotify to come. For OpenLook it looks like a showstopper.
- * We put dummy ConfigureNotify to satisfy the requirements.
- */
- if (awt_wm_getRunningWM() == OPENLOOK_WM) {
- XEvent xev;
- xev.xconfigure.type = ConfigureNotify;
- xev.xconfigure.display = awt_display;
- xev.xconfigure.window = XtWindow(wdata->winData.shell);
- xev.xconfigure.event = xev.xconfigure.window;
- xev.xconfigure.x = x;
- xev.xconfigure.y = y;
- xev.xconfigure.height = h1;
- xev.xconfigure.width = w1;
- xev.xconfigure.serial = NextRequest(awt_display) + 1; // see isMine() Xt inner function code.
-
- XPutBackEvent(awt_display, &xev);
- }
-
- if (wdata->isResizable) {
- XtVaSetValues(wdata->winData.shell,
- XmNwidth, w1,
- XmNheight, h1,
- NULL);
- }
- else {
- /*
- * Fix for BugTraq ID 4313607 - call awt_wm_setShellNotResizable
- * regardless of wdata->isFixedSizeSet and wdata->reparented values.
- */
- DTRACE_PRINTLN("TL: set fixed size from reshape");
- awt_wm_setShellNotResizable(wdata, w1, h1, True);
- if (wdata->reparented && (w1 > 0) && (h1 > 0)) {
- wdata->isFixedSizeSet = True;
- }
- }
- if (setXY)
- XtVaSetValues(wdata->winData.shell,
- XmNx, x,
- XmNy, y,
- NULL);
- }
- /* inner/parent drawing area (parent is form) */
- h1 = h - (wdata->top + wdata->bottom);
- h1 = ( h1 > 0 ) ? h1 : 1;
-#if 0
- XtConfigureWidget(XtParent(wdata->winData.comp.widget),
- 0, topAdjust, w1, h1, 0 );
-#else
- XtVaSetValues(XtParent(wdata->winData.comp.widget),
- XmNx, 0,
- XmNy, topAdjust,
- XmNwidth, w1,
- XmNheight, h1,
- NULL);
-#endif
-
-#ifdef _pauly_debug
- fprintf(stdout," reshape. setting inner canvas to: %d,%d,%d,%d\n",
- 0, topAdjust, w1, h1 );
- fflush(stdout);
-#endif /* _pauly_debug */
-
- wdata->menuBarReset = False;
-
- /* DTRACE_PRINTLN("TL: reshape -> returning"); */
- return;
-}
-
-/*
- * Class: sun_awt_motif_MEmbeddedFramePeer
- * Method: getBoundsPrivate
- * Signature: ()Ljava/awt/Rectangle
- */
-JNIEXPORT jobject JNICALL Java_sun_awt_motif_MEmbeddedFramePeer_getBoundsPrivate
- (JNIEnv * env, jobject this)
-{
- jobject bounds = NULL;
- struct FrameData *cdata;
- XWindowAttributes attr;
-
- AWT_LOCK();
-
- cdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (cdata == NULL || cdata->mainWindow == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return NULL;
- }
- if (!XtIsRealized(cdata->mainWindow) || !XtIsRealized(cdata->winData.shell)) {
- JNU_ThrowInternalError(env, "widget not visible on screen");
- AWT_UNLOCK();
- return NULL;
- }
-
- memset(&attr, 0, sizeof(XWindowAttributes));
- XGetWindowAttributes(awt_display, XtWindow(cdata->winData.shell), &attr);
-
- bounds = JNU_NewObjectByName(env, "java/awt/Rectangle", "(IIII)V",
- (jint)attr.x, (jint)attr.y, (jint)attr.width, (jint)attr.height);
- if (((*env)->ExceptionOccurred(env)) || JNU_IsNull(env, bounds)) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return NULL;
- }
-
- AWT_UNLOCK();
-
- return bounds;
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pDispose
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_pDispose
-(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
-
- AWT_LOCK();
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL || wdata->mainWindow == NULL || wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
- if (wdata->winData.flags & W_IS_EMBEDDED) {
- awt_util_delEmbeddedFrame(wdata->winData.shell);
- deinstall_xembed(wdata);
- }
- scheduleDispose(env, this);
-
- AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MFramePeer
- * Method: pGetIconSize
- * Signature: (II)Z
- */
-JNIEXPORT jboolean JNICALL Java_sun_awt_motif_MFramePeer_pGetIconSize
-(JNIEnv *env, jobject this, jint widthHint, jint heightHint)
-{
- struct FrameData *wdata;
- uint32_t width, height, border_width, depth;
- Window win;
- int32_t x, y;
- uint32_t mask;
- XSetWindowAttributes attrs;
- uint32_t saveWidth = 0;
- uint32_t saveHeight = 0;
- uint32_t dist = 0xffffffff;
- int32_t diff = 0;
- int32_t closestWidth;
- int32_t closestHeight;
- int32_t newDist;
- int32_t found = 0;
- AwtGraphicsConfigDataPtr adata;
-
- AWT_LOCK();
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return FALSE;
- }
- XtVaGetValues(wdata->winData.shell,
- XmNiconWindow, &win,
- NULL);
- if (!win) {
- int32_t count;
- int32_t i;
- XIconSize *sizeList;
-
- adata = getGraphicsConfigFromComponentPeer(env, this);
-
- if (!XGetIconSizes(awt_display,
- RootWindow(awt_display, adata->awt_visInfo.screen),
- &sizeList, &count)) {
- /* No icon sizes so can't set it -- Should we throw an exception?*/
- /* [jk] I don't think so: simply fall back to 16x16 */
- saveWidth = saveHeight = 16;
- goto top;
- }
- for (i=0; i < count; i++) {
- if (widthHint >= sizeList[i].min_width &&
- widthHint <= sizeList[i].max_width &&
- heightHint >= sizeList[i].min_height &&
- heightHint <= sizeList[i].max_height) {
- found = 1;
- if ((((widthHint-sizeList[i].min_width)
- % sizeList[i].width_inc) == 0) &&
- (((heightHint-sizeList[i].min_height)
- % sizeList[i].height_inc) ==0)) {
- /* Found an exact match */
- saveWidth = widthHint;
- saveHeight = heightHint;
- dist = 0;
- break;
- }
- diff = widthHint - sizeList[i].min_width;
- if (diff == 0) {
- closestWidth = widthHint;
- } else {
- diff = diff%sizeList[i].width_inc;
- closestWidth = widthHint - diff;
- }
- diff = heightHint - sizeList[i].min_height;
- if (diff == 0) {
- closestHeight = heightHint;
- } else {
- diff = diff%sizeList[i].height_inc;
- closestHeight = heightHint - diff;
- }
- newDist = closestWidth*closestWidth +
- closestHeight*closestHeight;
- if (dist > newDist) {
- saveWidth = closestWidth;
- saveHeight = closestHeight;
- dist = newDist;
- }
- }
- }
-
- if (!found) {
-#if 1
- /* [sbb] this code should work better than the original Solaris
- code */
- if (widthHint >= sizeList[0].max_width ||
- heightHint >= sizeList[0].max_height) {
- /* determine which way to scale */
- int32_t wdiff = widthHint - sizeList[0].max_width;
- int32_t hdiff = heightHint - sizeList[0].max_height;
- if (wdiff >= hdiff) { /* need to scale width more */
- saveWidth = sizeList[0].max_width;
- saveHeight = (int32_t)(((double)sizeList[0].max_width/widthHint) *
- heightHint);
- } else {
- saveWidth = (int32_t)(((double)sizeList[0].max_height/heightHint) *
- widthHint);
- saveHeight = sizeList[0].max_height;
- }
- } else if (widthHint < sizeList[0].min_width ||
- heightHint < sizeList[0].min_height) {
- saveWidth = (sizeList[0].min_width+sizeList[0].max_width)/2;
- saveHeight = (sizeList[0].min_height+sizeList[0].max_height)/2;
- } else { /* it fits within the right size */
- saveWidth = widthHint;
- saveHeight = heightHint;
- }
-
-#else /* XXX: old Solaris code */
- /* REMIND: Aspect ratio */
- if (widthHint >= sizeList[0].max_width &&
- heightHint >= sizeList[0].max_height) {
- saveWidth = sizeList[0].max_width;
- saveHeight = sizeList[0].max_height;
- } else if (widthHint >= sizeList[0].min_width &&
- heightHint >= sizeList[0].min_height) {
- saveWidth = sizeList[0].min_width;
- saveHeight = sizeList[0].min_height;
- } else {
- saveWidth = (sizeList[0].min_width+sizeList[0].max_width)/2;
- saveHeight = (sizeList[0].min_height+sizeList[0].max_height)/2;
- }
-#endif
- }
- free((void *) sizeList);
- } else {
- Window root;
- if (XGetGeometry(awt_display,
- win,
- &root,
- &x,
- &y,
- (uint32_t *)&saveWidth,
- (uint32_t *)&saveHeight,
- (uint32_t *)&border_width,
- (uint32_t *)&depth)) {
- }
- }
-
- top:
- (*env)->SetIntField(env, this, mWindowPeerIDs.iconWidth, (jint)saveWidth);
- (*env)->SetIntField(env, this, mWindowPeerIDs.iconHeight, (jint)saveHeight);
-
- AWT_UNLOCK();
- return TRUE;
-}
-
-/*
- * Class: sun_awt_motif_MFramePeer
- * Method: pSetIconImage
- * Signature: ([B[I[SII)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MFramePeer_pSetIconImage___3B_3I_3SII
-(JNIEnv *env, jobject this,
- jbyteArray jbyteData, jintArray jintData, jshortArray jushortData,
- jint iconWidth, jint iconHeight)
-{
- struct FrameData *wdata;
- Window win;
- GC gc;
- int32_t x, y;
- XImage *dst;
- uint32_t mask;
- XSetWindowAttributes attrs;
- jobject jbuf = NULL;
- void *buf = NULL;
- int32_t len = 0;
- int32_t bpp, slp, bpsl;
- AwtGraphicsConfigDataPtr adata;
-
- if (JNU_IsNull(env, jbyteData)) {
- if (JNU_IsNull(env, jintData)) {
- if (JNU_IsNull(env, jushortData)) {
- /* [jk] Don't throw an exception here, it breaks
- * programs that run correctly on Windows
- * JNU_ThrowNullPointerException(env, "NullPointerException");
- */
- return;
- } else {
- jbuf = jushortData;
- }
- } else {
- jbuf = jintData;
- }
- } else {
- jbuf = jbyteData;
- len = (*env)->GetArrayLength(env, jbyteData);
- }
- AWT_LOCK();
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- /* REMIND: Need to figure out how to display image on a pixmap */
-
- if (wdata == NULL || wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- adata = getGraphicsConfigFromComponentPeer(env, this);
-
- /* [jk] we need a new pixmap everytime:
- * Test case: src/share/test/awt/FrameTest.html Look at the icon,
- * select Operations/Change IconImage, you should see a different
- * icon now.
- */
- if (wdata->iconPixmap) {
- XFreePixmap(awt_display, wdata->iconPixmap);
- wdata->iconPixmap = None;
- }
-
- if (wdata->iconPixmap == None) {
- if ((wdata->iconPixmap =
- XCreatePixmap(awt_display,
- RootWindow(awt_display, adata->awt_visInfo.screen),
- iconWidth, iconHeight,
- adata->awtImage->Depth)) == None) {
- /* REMIND: How to warn that there was a problem? */
- AWT_UNLOCK();
- return;
- }
- wdata->iconWidth = iconWidth;
- wdata->iconHeight = iconHeight;
- }
-
- buf = (void *) (*env)->GetPrimitiveArrayCritical(env, jbuf, NULL);
- if (jbyteData != NULL) {
- int32_t i;
- unsigned char *ubuf = (unsigned char *) buf;
- /* Need to map from ICM lut to cmap */
- for (i=0; i < len; i++) {
- ubuf[i] = (ubuf[i] >= adata->color_data->awt_numICMcolors)
- ? 0
- : adata->color_data->awt_icmLUT2Colors[ubuf[i]];
- }
- }
-
- bpp = adata->awtImage->wsImageFormat.bits_per_pixel;
- slp = adata->awtImage->wsImageFormat.scanline_pad;
- bpsl = paddedwidth(iconWidth * bpp, slp) >> 3;
- if (((bpsl << 3) / bpp) < iconWidth) {
- (*env)->ReleasePrimitiveArrayCritical(env, jbuf, buf, JNI_ABORT);
- AWT_UNLOCK();
- return;
- }
- dst = XCreateImage(awt_display, adata->awt_visInfo.visual,
- adata->awtImage->Depth, ZPixmap, 0,
- buf, iconWidth, iconHeight, 32, bpsl);
- if (dst == NULL) {
- /* REMIND: How to warn that there was a problem? */
- (*env)->ReleasePrimitiveArrayCritical(env, jbuf, buf, JNI_ABORT);
- AWT_UNLOCK();
- return;
- }
-
- if ((gc = XCreateGC(awt_display, wdata->iconPixmap, 0, 0)) == NULL) {
- XDestroyImage (dst);
- (*env)->ReleasePrimitiveArrayCritical(env, jbuf, buf, JNI_ABORT);
- AWT_UNLOCK();
- return;
- }
-
- XPutImage(awt_display, wdata->iconPixmap, gc, dst,
- 0, 0, 0, 0, iconWidth, iconHeight);
- (*env)->ReleasePrimitiveArrayCritical(env, jbuf, buf, JNI_ABORT);
- dst->data=NULL;
- XDestroyImage(dst);
- XFreeGC(awt_display, gc);
-
- XtVaGetValues(wdata->winData.shell,
- XmNiconWindow, &win,
- NULL);
- if (!win) {
- mask = CWBorderPixel | CWColormap | CWBackPixmap;
- attrs.border_pixel = awt_defaultFg;
- attrs.colormap = adata->awt_cmap;
- attrs.background_pixmap = wdata->iconPixmap;
- if (!(win = XCreateWindow(awt_display,
- RootWindow(awt_display,
- adata->awt_visInfo.screen),
- 0, 0, iconWidth, iconHeight,
- (uint32_t) 0,
- adata->awtImage->Depth,
- InputOutput,
- adata->awt_visInfo.visual,
- mask, &attrs))) {
- /* Still can't create the window so try setting iconPixmap */
- XtVaSetValues(wdata->winData.shell,
- XmNiconPixmap, wdata->iconPixmap,
- NULL);
- AWT_FLUSH_UNLOCK();
- return;
- }
- }
-
- XtVaSetValues(wdata->winData.shell,
- XmNiconPixmap, wdata->iconPixmap,
- XmNiconWindow, win,
- NULL);
-
- XSetWindowBackgroundPixmap(awt_display, win, wdata->iconPixmap);
- XClearWindow(awt_display, win);
- AWT_FLUSH_UNLOCK();
-}
-
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: setResizable
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MWindowPeer_setResizable(JNIEnv *env, jobject this,
- jboolean resizable)
-{
- struct FrameData *wdata;
- jobject target;
- int32_t targetWidth,
- targetHeight;
- int32_t width, /* fixed width if not resizable */
- height; /* fixed height if not resizable*/
- int32_t verticalAdjust; /* menubar, warning window, etc.*/
-
- if ((*env)->EnsureLocalCapacity(env, 1) < 0) {
- return;
- }
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL
- || wdata->winData.comp.widget == NULL
- || wdata->winData.shell == NULL
- || JNU_IsNull(env, target))
- {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- if (!JNU_IsNull(env, target))
- (*env)->DeleteLocalRef(env, target);
- AWT_UNLOCK();
- return;
- }
-
- DTRACE_PRINTLN3("TL: setResizable(0x%x/0x%x, %s)",
- wdata->winData.shell, XtWindow(wdata->winData.shell),
- resizable ? "true" : "false");
-
- if ((!wdata->isResizable) && (resizable)) {
- awt_wm_setShellResizable(wdata);
- wdata->isFixedSizeSet = False;
- }
- else if ((wdata->isResizable) && (!resizable)) {
- /*
- * To calculate fixed window width, height, we must subtract
- * off the window manager borders as stored in the wdata
- * structure. But note that the wdata top and bottom fields
- * may include space for warning window, menubar, IM status;
- * this IS part of shell.
- */
- verticalAdjust = wdata->mbHeight;
- if (wdata->warningWindow != NULL) {
- verticalAdjust += wdata->wwHeight;
- }
- if (wdata->hasTextComponentNative) {
- verticalAdjust += wdata->imHeight;
- }
-
- targetWidth = (*env)->GetIntField(env, target, componentIDs.width);
- targetHeight = (*env)->GetIntField(env, target, componentIDs.height);
- width = targetWidth - (wdata->left + wdata->right);
- height = targetHeight - (wdata->top + wdata->bottom) + verticalAdjust;
-#ifdef __linux__
- width = (width > 0) ? width : 1;
- height = (height > 0) ? height : 1;
-#endif
- DTRACE_PRINTLN2("TL: setting fixed size %ld x %ld", width, height);
- awt_wm_setShellNotResizable(wdata, width, height, False);
- if ((width > 0) && (height > 0)) {
- wdata->isFixedSizeSet = True;
- }
- }
-
- wdata->isResizable = (Boolean)resizable;
-
- (*env)->DeleteLocalRef(env, target);
- AWT_FLUSH_UNLOCK();
-}
-
-
-/* sun_awt_motif_MWindowPeer_pSetMenuBar() is native (X/Motif) routine
- which handles insertion or deletion of a menubar from this frame. */
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: pSetMenuBar
- * Signature: (Lsun/awt/motif/MMenuBarPeer;)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_pSetMenuBar
-(JNIEnv *env, jobject this, jobject mb)
-{
- struct FrameData *wdata;
- struct ComponentData *mdata;
- jobject target;
- Widget innerCanvasW; /* Motif inner canvas */
-#ifdef _pauly_debug
- Dimension mbHeight; /* Motif menubar height */
-#endif /* _pauly_debug */
-
-#ifdef _pauly_debug
- fprintf(stdout," ++ ...pSetMenuBar.\n");
- fflush(stdout);
-#endif /* _pauly_debug */
-
-
- if ((*env)->EnsureLocalCapacity(env, 1) < 0) {
- return;
- }
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (JNU_IsNull(env, target) || wdata == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- if (!JNU_IsNull(env, target)) {
- (*env)->DeleteLocalRef(env, target);
- }
- AWT_UNLOCK();
- return;
- }
-
- if (mb == NULL) {
-#ifdef _pauly_debug
- fprintf(stdout," ...pSetMenuBar. mb is null.\n");
- fflush(stdout);
-#endif /* _pauly_debug */
- if (wdata->menuBar != NULL) {
- /* Redo attachments of other form widgets appropriately now */
- innerCanvasW = XtParent(wdata->winData.comp.widget);
-
- if (wdata->warningWindow == NULL) {
- /* no warning window: canvas is now attached to form */
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_FORM,
- NULL);
- } else {
- /* warning window present - conditional on #define NETSCAPE:
- if NETSCAPE, warning window is at bottom, so canvas is
- attached to the form (as above); otherwise (not NETSCAPE),
- warning window itself is instead attached to form. */
-#ifdef NETSCAPE
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_FORM,
- NULL);
-#else /* NETSCAPE */
- XtVaSetValues(wdata->warningWindow,
- XmNtopAttachment, XmATTACH_FORM,
- NULL);
-#endif /* NETSCAPE */
- }
-
- wdata->menuBarReset = True;
- }
- wdata->menuBar = NULL;
- awtJNI_setMbAndWwHeightAndOffsets(env, this, wdata);
- (*env)->DeleteLocalRef(env, target);
- AWT_FLUSH_UNLOCK();
-#ifdef _pauly_debug
- fprintf(stdout," ...pSetMenuBar. Done.\n");
- fflush(stdout);
-#endif /* _pauly_debug */
- return;
- }
-
- mdata = (struct ComponentData *)
- JNU_GetLongFieldAsPtr(env, mb, mMenuBarPeerIDs.pData);
- if (mdata == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- (*env)->DeleteLocalRef(env, target);
- AWT_UNLOCK();
- return;
- }
-
- /* OK - insert the new menu bar into the form (at the top).
- Redo the attachments of other form widgets appropriately.*/
-
- if (wdata->menuBar == NULL)
- wdata->menuBarReset = True;
- wdata->menuBar = mdata->widget;
-
-#ifdef _pauly_debug
- XtVaGetValues(mdata->widget, XmNheight, &mbHeight, NULL);
- fprintf(stdout," ...pSetMenuBar. new menu bar (widget %x, parent: %x) - menu bar height: %d\n", wdata->menuBar, XtParent(wdata->menuBar), mbHeight);
- fflush(stdout);
-#endif /* _pauly_debug */
-
- XtVaSetValues(mdata->widget,
- XmNtopAttachment, XmATTACH_FORM,
- XmNleftAttachment, XmATTACH_FORM,
- XmNrightAttachment, XmATTACH_FORM,
- NULL);
-
- innerCanvasW = XtParent(wdata->winData.comp.widget);
-
- if (wdata->warningWindow == NULL) {
- /* no warning window: menu bar at top, canvas attached to it */
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopWidget, mdata->widget,
- NULL);
- } else {
- /* warning window present - conditional on #define NETSCAPE:
- if NETSCAPE, warning window is at bottom, so canvas is
- attached to menu bar (as above); otherwise (not NETSCAPE),
- the warning window is attached just below the menu bar. */
-#ifdef NETSCAPE
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopWidget, mdata->widget,
- NULL);
-#else /* NETSCAPE */
- XtVaSetValues(wdata->warningWindow,
- XmNtopAttachment, XmATTACH_WIDGET,
- XmNtopWidget, mdata->widget,
- NULL);
-#endif /* NETSCAPE */
- }
-
- XtManageChild(mdata->widget);
- XtMapWidget(mdata->widget);
- XSync(awt_display, False);
- awtJNI_setMbAndWwHeightAndOffsets(env, this, wdata);
-
-#ifdef _pauly_debug
- XtVaGetValues(mdata->widget, XmNheight, &mbHeight, NULL);
- fprintf(stdout," ...pSetMenuBar. with menu bar: menu bar height: %d, top offset: %d, bottom offset: %d\n", mbHeight, wdata->top, wdata->bottom);
- fflush(stdout);
-#endif /* _pauly_debug */
-
- (*env)->DeleteLocalRef(env, target);
-
- AWT_FLUSH_UNLOCK();
-
-#ifdef _pauly_debug
- fprintf(stdout," ...pSetMenuBar. Done\n");
- fflush(stdout);
-#endif /* _pauly_debug */
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: toBack
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_toBack
-(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL || wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
- if (XtWindow(wdata->winData.shell) != 0) {
- XLowerWindow(awt_display, XtWindow(wdata->winData.shell));
- }
- AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: updateAlwaysOnTop
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_updateAlwaysOnTop
-(JNIEnv *env, jobject this, jboolean isOnTop)
-{
- struct FrameData *wdata;
- AWT_LOCK();
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- awt_wm_updateAlwaysOnTop(wdata, isOnTop);
- AWT_FLUSH_UNLOCK();
-}
-
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_addTextComponentNative
-(JNIEnv *env, jobject this, jobject tc)
-{
- struct FrameData *wdata;
- jobject target;
-
- if (JNU_IsNull(env, this)) {
- return;
- }
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL ||
- wdata->winData.comp.widget==NULL ||
- wdata->winData.shell==NULL ||
- JNU_IsNull(env, target)) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
- if ( !wdata->hasTextComponentNative) {
- wdata->hasTextComponentNative = True;
- wdata->imHeight = awt_motif_getIMStatusHeight(wdata->winData.shell, tc);
- wdata->bottom += wdata->imHeight;
- awtJNI_ChangeInsets(env, this, wdata);
- reshape(env, this, wdata,
- (*env)->GetIntField(env, target, componentIDs.x),
- (*env)->GetIntField(env, target, componentIDs.y),
- (*env)->GetIntField(env, target, componentIDs.width),
- (*env)->GetIntField(env, target, componentIDs.height),
- True);
- }
- AWT_UNLOCK();
-}
-
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_removeTextComponentNative
-(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
- jobject target;
-
- if (JNU_IsNull(env, this)) {
- return;
- }
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL ||
- wdata->winData.comp.widget== NULL ||
- wdata->winData.shell== NULL ||
- JNU_IsNull(env, target)) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
- if (!wdata->hasTextComponentNative) {
- AWT_UNLOCK();
- return;
- }
-
- wdata->bottom -= wdata->imHeight;
- awtJNI_ChangeInsets(env, this, wdata);
- wdata->imRemove = True;
- reshape(env, this, wdata,
- (*env)->GetIntField(env, target, componentIDs.x),
- (*env)->GetIntField(env, target, componentIDs.y),
- (*env)->GetIntField(env, target, componentIDs.width),
- (*env)->GetIntField(env, target, componentIDs.height),
- True);
-
- wdata->hasTextComponentNative = False;
- wdata->imHeight = 0;
-
- AWT_UNLOCK();
-} /* ...removeTextComponentPeer() */
-
-static Atom java_protocol = None;
-static Atom motif_wm_msgs = None;
-
-static void im_callback(Widget shell, XtPointer client_data, XtPointer call_data)
-{
- JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
- JNU_CallMethodByName(env, NULL,
- (jobject)client_data,
- "notifyIMMOptionChange",
- "()V");
-}
-
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_pSetIMMOption
-(JNIEnv *env, jobject this, jstring option)
-{
- char *coption;
- char *empty = "InputMethod";
- char *menuItem;
- jobject globalRef;
- struct FrameData *wdata;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL || wdata->winData.shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- globalRef = (jobject)JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.jniGlobalRef);
- coption = (JNU_IsNull(env, option)) ? empty : (char *) JNU_GetStringPlatformChars(env, option, NULL);
- if (java_protocol == None || motif_wm_msgs == None) {
- java_protocol = XmInternAtom(awt_display, "_JAVA_IM_MSG", False);
- motif_wm_msgs = XmInternAtom(awt_display, "_MOTIF_WM_MESSAGES", False);
- }
- XmAddProtocols (wdata->winData.shell, motif_wm_msgs, &java_protocol, 1);
- XmAddProtocolCallback(wdata->winData.shell, motif_wm_msgs, java_protocol, im_callback, (XtPointer)globalRef);
-
- if ((menuItem = awt_util_makeWMMenuItem(coption, java_protocol))) {
- XtVaSetValues(wdata->winData.shell,
- XmNmwmMenu,
- menuItem,
- NULL);
- free(menuItem);
- }
- if (coption != empty)
- JNU_ReleaseStringPlatformChars(env, option, (const char *) coption);
- AWT_FLUSH_UNLOCK();
-}
-
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_synthesizeFocusInOut(JNIEnv *env, jobject this,
- jboolean b)
-{
- EmbeddedFrame *ef;
- Boolean dummy;
-
- AWT_LOCK();
- ef = theEmbeddedFrameList;
- while (ef != NULL) {
- if ((*env)->IsSameObject(env, ef->javaRef, this)) {
- XFocusChangeEvent xev;
- xev.display = awt_display;
- xev.serial = 0;
- xev.type = b ? FocusIn : FocusOut;
- xev.send_event = False;
- xev.window = XtWindow(ef->embeddedFrame);
- xev.mode = NotifyNormal;
- xev.detail = NotifyNonlinear;
- shellEH(ef->embeddedFrame, this, (XEvent*)&xev, &dummy);
- break;
- }
- ef = ef->next;
- }
- AWT_UNLOCK();
-}
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_traverseOut(JNIEnv *env, jobject this, jboolean direction)
-{
- struct FrameData *wdata;
-
- if (JNU_IsNull(env, this)) {
- return;
- }
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL ||
- wdata->winData.comp.widget== NULL ||
- wdata->winData.shell== NULL)
- {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
- xembed_traverse_out(wdata, direction);
- AWT_UNLOCK();
-}
-
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_NEFcreate(JNIEnv *env, jobject this,
- jobject parent, jlong handle)
-{
-#undef MAX_ARGC
-#define MAX_ARGC 40
- Arg args[MAX_ARGC];
- int32_t argc;
- struct FrameData *wdata;
- jobject target;
- jstring warningString;
- jboolean resizable;
- jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this);
- Widget innerCanvasW; /* form's child, parent of the outer canvas
- drawing area */
- AwtGraphicsConfigDataPtr adata;
- AwtGraphicsConfigDataPtr defConfig;
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- if (JNU_IsNull(env, target)) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- wdata = ZALLOC(FrameData);
- JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, wdata);
- if (wdata == NULL) {
- JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError");
- AWT_UNLOCK();
- return;
- }
-
- adata = getGraphicsConfigFromComponentPeer(env, this);
- defConfig = getDefaultConfig(adata->awt_visInfo.screen);
-
- /* A variation on Netscape's hack for embedded frames: the client area
- * of the browser is a Java Frame for parenting purposes, but really a
- * Motif child window
- */
- wdata->winData.flags |= W_IS_EMBEDDED;
-
- wdata->top = 0;
- wdata->left = 0;
- wdata->bottom = 0;
- wdata->right = 0;
- awtJNI_ChangeInsets(env, this, wdata);
-
-
- wdata->isModal = 0;
- wdata->isShowing = False;
- wdata->shellResized = False;
- wdata->canvasResized = False;
- wdata->menuBarReset = False;
-
- resizable = (*env)->GetBooleanField(env, target, frameIDs.resizable);
-
- wdata->winData.shell = (Widget)handle;
- awt_util_addEmbeddedFrame(wdata->winData.shell, globalRef);
-
- install_xembed((Widget)handle, wdata);
-
- setDeleteCallback(globalRef, wdata);
- /* Establish resizability. For the case of not resizable, do not
- yet set a fixed size here; we must wait until in the routine
- sun_awt_motif_MWindowPeer_pReshape() after insets have been fixed.
- This is because correction of the insets may affect shell size.
- (See comments in shellEH() concerning correction of the insets. */
- /*
- * Fix for BugTraq ID 4313607.
- * Initial resizability will be set later in MWindowPeer_setResizable()
- * called from init(). But the real changes will be made only if the new
- * and old resizability values are different at that point, so we
- * initialize isResizable with inverse value here to get the job done.
- */
- wdata->isResizable = !resizable;
- wdata->isFixedSizeSet = False;
-#if 0
- if (resizable) {
- awt_wm_setShellResizable(wdata);
- }
-#endif
-
- XtAddEventHandler(wdata->winData.shell, StructureNotifyMask | FocusChangeMask,
- FALSE, (XtEventHandler)shellEH, globalRef);
-
-
- argc = 0;
- XtSetArg(args[argc], XmNvisual, defConfig->awt_visInfo.visual); argc++;
- XtSetArg(args[argc], XmNcolormap, defConfig->awt_cmap); argc++;
- XtSetArg(args[argc], XmNdepth, defConfig->awt_depth); argc++;
- XtSetArg(args[argc], XmNmarginWidth, 0); argc++;
- XtSetArg(args[argc], XmNmarginHeight, 0); argc++;
- XtSetArg(args[argc], XmNhorizontalSpacing, 0); argc++;
- XtSetArg(args[argc], XmNverticalSpacing, 0); argc++;
- XtSetArg(args[argc], XmNscreen,
- ScreenOfDisplay(awt_display, defConfig->awt_visInfo.screen)); argc++;
-
-
- XtSetArg(args[argc], XmNresizePolicy, XmRESIZE_NONE); argc++;
-
- DASSERT(!(argc > MAX_ARGC));
- wdata->mainWindow = XmCreateForm(wdata->winData.shell, "main", args, argc);
-
- /* The widget returned by awt_canvas_create is a drawing area
- (i.e., canvas) which is the child of another drawing area
- parent widget. The parent is the drawing area within the
- form just created. The child is an drawing area layer over
- the entire frame window, including the form, any menu bar
- and warning windows present, and also window manager stuff.
- The top, bottom, left, and right fields in wdata maintain
- the respective offsets between these two drawing areas. */
-
- wdata->winData.comp.widget = awt_canvas_create((XtPointer)globalRef,
- wdata->mainWindow,
- "frame_",
- -1,
- -1,
- True,
- wdata,
- defConfig);
-
- XtAddCallback(wdata->winData.comp.widget,
- XmNresizeCallback,
- outerCanvasResizeCB,
- globalRef);
-
-
- innerCanvasW = XtParent(wdata->winData.comp.widget);
- XtVaSetValues(innerCanvasW,
- XmNleftAttachment, XmATTACH_FORM,
- XmNrightAttachment, XmATTACH_FORM,
- NULL);
-
-
- XtAddEventHandler(innerCanvasW, StructureNotifyMask, FALSE,
- (XtEventHandler)innerCanvasEH, globalRef);
-
- /* No menu bar initially */
- wdata->menuBar = NULL;
- wdata->mbHeight = 0;
-
- /* If a warning window (string) is needed, establish it now.*/
- warningString =
- (*env)->GetObjectField(env, target, windowIDs.warningString);
-
- /* No warning window present */
- XtVaSetValues(innerCanvasW,
- XmNtopAttachment, XmATTACH_FORM,
- XmNbottomAttachment, XmATTACH_FORM,
- NULL);
- wdata->warningWindow = NULL;
- wdata->wwHeight = 0;
-
-
- awt_util_show(wdata->winData.comp.widget);
-
- AWT_FLUSH_UNLOCK();
-} /* MEmbeddedFramePeer_NEFcreate() */
-
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_pShowImpl(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL ||
- wdata->mainWindow == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
- XtVaSetValues(wdata->winData.comp.widget,
- XmNx, -(wdata->left),
- XmNy, -(wdata->top), NULL);
-
- if (wdata->menuBar != 0) {
- awt_util_show(wdata->menuBar);
- }
-
- XtManageChild(wdata->mainWindow);
- if (XtWindow(wdata->winData.shell) == None) {
- XtRealizeWidget(wdata->winData.shell);
- }
- XtManageChild(wdata->winData.comp.widget);
- XtSetMappedWhenManaged(wdata->winData.shell, True);
- XtPopup(wdata->winData.shell, XtGrabNone);
- wdata->isShowing = True;
-
- AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Create a local managed widget inside a given X window.
- * We allocate a top-level shell and then reparent it into the
- * given window id.
- *
- * This is used to take the X11 window ID that has been passed
- * to us by our parent Navigator plugin and return a widget
- * that can be used as the base for our Java EmbeddeFrame.
- *
- * Note that the ordering of the various calls is tricky here as
- * we have to cope with the variations between 1.1.3, 1.1.6,
- * and 1.2.
- */
-JNIEXPORT jlong JNICALL
-Java_sun_awt_motif_MEmbeddedFrame_getWidget(
- JNIEnv *env, jclass clz, jlong winid)
-{
- Arg args[40];
- int argc;
- Widget w;
- Window child, parent;
- Visual *visual;
- Colormap cmap;
- int depth;
- int ncolors;
-
- /*
- * Create a top-level shell. Note that we need to use the
- * AWT's own awt_display to initialize the widget. If we
- * try to create a second X11 display connection the Java
- * runtimes get very confused.
- */
- AWT_LOCK();
-
- argc = 0;
- XtSetArg(args[argc], XtNsaveUnder, False); argc++;
- XtSetArg(args[argc], XtNallowShellResize, False); argc++;
-
- /* the awt initialization should be done by now (awt_GraphicsEnv.c) */
-
- getAwtData(&depth,&cmap,&visual,&ncolors,NULL);
-
- XtSetArg(args[argc], XtNvisual, visual); argc++;
- XtSetArg(args[argc], XtNdepth, depth); argc++;
- XtSetArg(args[argc], XtNcolormap, cmap); argc++;
-
- XtSetArg(args[argc], XtNwidth, 1); argc++;
- XtSetArg(args[argc], XtNheight, 1); argc++;
- /* The shell has to have relative coords of O,0? */
- XtSetArg(args[argc], XtNx, 0); argc++;
- XtSetArg(args[argc], XtNy, 0); argc++;
-
- /* The shell widget starts out as a top level widget.
- * Without intervention, it will be managed by the window
- * manager and will be its own widow. So, until it is reparented,
- * we don't map it.
- */
- XtSetArg(args[argc], XtNmappedWhenManaged, False); argc++;
-
- w = XtAppCreateShell("AWTapp","XApplication",
- vendorShellWidgetClass,
- awt_display,
- args,
- argc);
- XtRealizeWidget(w);
-
- /*
- * Now reparent our new Widget into our Navigator window
- */
- parent = (Window) winid;
- child = XtWindow(w);
- XReparentWindow(awt_display, child, parent, 0, 0);
- XFlush(awt_display);
- XSync(awt_display, False);
- XtVaSetValues(w, XtNx, 0, XtNy, 0, NULL);
- XFlush(awt_display);
- XSync(awt_display, False);
-
- AWT_UNLOCK();
-
- return (jlong)w;
-}
-
-/*
- * Make sure the given widget is mapped.
- *
- * This isn't necessary on JDK 1.1.5 but is needed on JDK 1.1.4
- */
-JNIEXPORT jint JNICALL
-Java_sun_awt_motif_MEmbeddedFrame_mapWidget(JNIEnv *env, jclass clz, jlong widget)
-{
- Widget w = (Widget)widget;
- /*
- * this is what JDK 1.1.5 does in MFramePeer.pShow.
- */
- AWT_LOCK();
- XtSetMappedWhenManaged(w, True);
- XtPopup(w, XtGrabNone);
- AWT_UNLOCK();
- return (jint) 1;
-}
-
-
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedActive(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
- Boolean res;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL ||
- wdata->mainWindow == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return False;
- }
-
- res = isXEmbedActive(wdata);
- AWT_UNLOCK();
- return res;
-
-}
-
-JNIEXPORT jboolean JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedApplicationActive(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
- Boolean res;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL ||
- wdata->mainWindow == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return False;
- }
-
- res = isXEmbedApplicationActive(wdata);
- AWT_UNLOCK();
- return res;
-
-}
-
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_MEmbeddedFramePeer_requestXEmbedFocus(JNIEnv *env, jobject this)
-{
- struct FrameData *wdata;
-
- AWT_LOCK();
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL ||
- wdata->mainWindow == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- requestXEmbedFocus(wdata);
- AWT_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: setSaveUnder
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_setSaveUnder
-(JNIEnv *env, jobject this, jboolean state)
-{
- struct FrameData *wdata;
- jobject target;
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL ||
- JNU_IsNull(env, target)) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- if (!JNU_IsNull(env, target))
- (*env)->DeleteLocalRef(env, target);
- AWT_UNLOCK();
- return;
- }
-
- XtVaSetValues(wdata->winData.shell, XmNsaveUnder, state, NULL);
-
- AWT_FLUSH_UNLOCK();
-}
-
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: setFocusableWindow
- * Signature: (Z)V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_setFocusableWindow
-(JNIEnv *env, jobject this, jboolean isFocusableWindow)
-{
- struct FrameData *wdata;
- jobject target;
-
- AWT_LOCK();
-
- target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target);
-
- wdata = (struct FrameData *)
- JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData);
-
- if (wdata == NULL ||
- wdata->winData.comp.widget == NULL ||
- wdata->winData.shell == NULL ||
- JNU_IsNull(env, target)) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- if (!JNU_IsNull(env, target))
- (*env)->DeleteLocalRef(env, target);
- AWT_UNLOCK();
- return;
- }
-
- wdata->isFocusableWindow = isFocusableWindow;
-
- AWT_FLUSH_UNLOCK();
-}
-
-/*
- * Class: sun_awt_motif_MWindowPeer
- * Method: resetTargetGC
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_sun_awt_motif_MWindowPeer_resetTargetGC
- (JNIEnv * env, jobject this, jobject target)
-{
- (*env)->CallVoidMethod(env, target, windowIDs.resetGCMID);
-}
-
-
-/*
- * Old, compatibility, backdoor for DT. This is a different
- * implementation. It keeps the signature, but acts on
- * awt_root_shell, not the frame passed as an argument. Note, that
- * the code that uses the old backdoor doesn't work correctly with
- * gnome session proxy that checks for WM_COMMAND when the window is
- * firts mapped, because DT code calls this old backdoor *after* the
- * frame is shown or it would get NPE with old AWT (previous
- * implementation of this backdoor) otherwise. Old style session
- * managers (e.g. CDE) that check WM_COMMAND only during session
- * checkpoint should work fine, though.
- *
- * NB: The function name looks deceptively like a JNI native method
- * name. It's not! It's just a plain function.
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_XsessionWMcommand(JNIEnv *env, jobject this,
- jobject frame, jstring jcommand)
-{
- const char *command;
- XTextProperty text_prop;
- char *c[1];
- int32_t status;
-
- AWT_LOCK();
-
- if (awt_root_shell == NULL) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- if (XtWindow(awt_root_shell) == None) {
- JNU_ThrowNullPointerException(env, "NullPointerException");
- AWT_UNLOCK();
- return;
- }
-
- /* need to convert ctitle to CompoundText */
- command = (char *) JNU_GetStringPlatformChars(env, jcommand, NULL);
- c[0] = (char *)command;
- status = XmbTextListToTextProperty(awt_display, c, 1,
- XStdICCTextStyle, &text_prop);
-
- if (status == Success || status > 0) {
- XSetTextProperty(awt_display, XtWindow(awt_root_shell),
- &text_prop, XA_WM_COMMAND);
- if (text_prop.value != NULL)
- XFree(text_prop.value);
- }
-
- JNU_ReleaseStringPlatformChars(env, jcommand, command);
-
- AWT_UNLOCK();
- return;
-}
-
-
-/*
- * New DT backdoor to set WM_COMMAND. New code should use this
- * backdoor and call it *before* the first frame is shown so that
- * gnome session proxy can correctly handle it.
- *
- * NB: The function name looks deceptively like a JNI native method
- * name. It's not! It's just a plain function.
- */
-JNIEXPORT void JNICALL
-Java_sun_awt_motif_XsessionWMcommand_New(JNIEnv *env, jobjectArray jargv)
-{
- static const char empty[] = "";
-
- int argc;
- const char **cargv;
- XTextProperty text_prop;
- int status;
- int i;
-
- AWT_LOCK();
-
- if (awt_root_shell == NULL) {
- JNU_ThrowNullPointerException(env, "AWT root shell");
- AWT_UNLOCK();
- return;
- }
-
- if (XtWindow(awt_root_shell) == None) {
- JNU_ThrowNullPointerException(env, "AWT root shell is unrealized");
- AWT_UNLOCK();
- return;
- }
-
- argc = (int)(*env)->GetArrayLength(env, jargv);
- if (argc == 0) {
- /* nothing to do */
- AWT_UNLOCK();
- return;
- }
-
- /* array of C strings */
- cargv = (const char **)calloc(argc, sizeof(char *));
- if (cargv == NULL) {
- JNU_ThrowOutOfMemoryError(env, "Unable to allocate cargv");
- AWT_UNLOCK();
- return;
- }
-
- /* fill C array with platform chars of java strings */
- for (i = 0; i < argc; ++i) {
- jstring js;
- const char *cs;
-
- cs = NULL;
- js = (*env)->GetObjectArrayElement(env, jargv, i);
- if (js != NULL) {
- cs = JNU_GetStringPlatformChars(env, js, NULL);
- }
- if (cs == NULL) {
- cs = empty;
- }
-
- cargv[i] = cs;
- (*env)->DeleteLocalRef(env, js);
- }
-
- /* grr, X prototype doesn't declare cargv as const, thought it really is */
- status = XmbTextListToTextProperty(awt_display, (char **)cargv, argc,
- XStdICCTextStyle, &text_prop);
- if (status < 0) {
- switch (status) {
- case XNoMemory:
- JNU_ThrowOutOfMemoryError(env,
- "XmbTextListToTextProperty: XNoMemory");
- break;
- case XLocaleNotSupported:
- JNU_ThrowInternalError(env,
- "XmbTextListToTextProperty: XLocaleNotSupported");
- break;
- case XConverterNotFound:
- JNU_ThrowNullPointerException(env,
- "XmbTextListToTextProperty: XConverterNotFound");
- break;
- default:
- JNU_ThrowInternalError(env,
- "XmbTextListToTextProperty: unknown error");
- }
- } else {
- /*
- * status == Success (i.e. 0) or
- * status > 0 - a number of unconvertible characters
- * (cannot happen for XStdICCTextStyle).
- */
- XSetTextProperty(awt_display, XtWindow(awt_root_shell),
- &text_prop, XA_WM_COMMAND);
- }
-
- /* release platform chars */
- for (i = 0; i < argc; ++i) {
- jstring js;
-
- if (cargv[i] == empty)
- continue;
-
- js = (*env)->GetObjectArrayElement(env, jargv, i);
- JNU_ReleaseStringPlatformChars(env, js, cargv[i]);
- (*env)->DeleteLocalRef(env, js);
- }
- if (text_prop.value != NULL)
- XFree(text_prop.value);
-
- AWT_UNLOCK();
- return;
-}
-
-/*
- * Class: java_awt_TrayIcon
- * Method: initIDs
- * Signature: ()V
- */
-JNIEXPORT void JNICALL Java_java_awt_TrayIcon_initIDs(JNIEnv *env , jclass clazz)
-{
-}