# HG changeset patch # User lana # Date 1219697895 25200 # Node ID 715cf9378c53f883c72e260fd479ae0ef0f4a84d # Parent 90cf935adb353bb0af4b46fb0677e841fd24c000# Parent f142c1da78c2f5b018077df5edbf38d22980c206 Merge diff -r 90cf935adb35 -r 715cf9378c53 jdk/make/sun/awt/FILES_c_unix.gmk --- a/jdk/make/sun/awt/FILES_c_unix.gmk Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/make/sun/awt/FILES_c_unix.gmk Mon Aug 25 13:58:15 2008 -0700 @@ -142,59 +142,59 @@ # These files rely on motif to be built, and should not be included # in a headless build. -FILES_MOTIF_c = \ - awt_AWTEvent.c \ - awt_Button.c \ - awt_Canvas.c \ - awt_Checkbox.c \ - awt_Component.c \ - awt_Cursor.c \ - awt_DataTransferer.c \ - awt_DrawingSurface.c \ - awt_Event.c \ - awt_FileDialog.c \ - awt_GlobalCursorManager.c \ - awt_GraphicsEnv.c \ - awt_InputMethod.c \ - awt_Insets.c \ - awt_KeyboardFocusManager.c \ - awt_Label.c \ - awt_List.c \ - awt_Menu.c \ - awt_MenuBar.c \ - awt_MenuComponent.c \ - awt_MenuItem.c \ - awt_motif.c \ - awt_Plugin.c \ - awt_PopupMenu.c \ - awt_Robot.c \ - awt_Scrollbar.c \ - awt_ScrollPane.c \ - awt_Selection.c \ - awt_UNIXToolkit.c \ - awt_TextArea.c \ - awt_TextField.c \ - awt_TopLevel.c \ - awt_mgrsel.c \ - awt_util.c \ - awt_wm.c \ - awt_XmDnD.c \ - awt_dnd.c \ - awt_dnd_ds.c \ - awt_dnd_dt.c \ - canvas.c \ - cursor.c \ - multi_font.c \ - robot_common.c \ - list.c \ - multiVis.c \ - XDrawingArea.c \ - MouseInfo.c \ - awt_xembed.c \ - awt_xembed_server.c \ - gtk2_interface.c \ - swing_GTKEngine.c \ - swing_GTKStyle.c +#FILES_MOTIF_c = \ +#keep awt_AWTEvent.c \ +# awt_Button.c \ +# awt_Canvas.c \ +# awt_Checkbox.c \ +#keep .h awt_Component.c \ +#keep .h awt_Cursor.c \ +# awt_DataTransferer.c \ +# awt_DrawingSurface.c \ +# awt_Event.c \ +# awt_FileDialog.c \ +# awt_GlobalCursorManager.c \ +# awt_GraphicsEnv.c \ +# awt_InputMethod.c \ +#keep awt_Insets.c \ +# awt_KeyboardFocusManager.c \ +# awt_Label.c \ +# awt_List.c \ +# awt_Menu.c \ +# awt_MenuBar.c \ +# awt_MenuComponent.c \ +# awt_MenuItem.c \ +# awt_motif.c \ +# awt_Plugin.c \ +# awt_PopupMenu.c \ +# awt_Robot.c \ +# awt_Scrollbar.c \ +# awt_ScrollPane.c \ +# awt_Selection.c \ +# awt_UNIXToolkit.c \ +# awt_TextArea.c \ +# awt_TextField.c \ +# awt_TopLevel.c \ +# awt_mgrsel.c \ +# awt_util.c \ +# awt_wm.c \ +# awt_XmDnD.c \ +# awt_dnd.c \ +# awt_dnd_ds.c \ +# awt_dnd_dt.c \ +# canvas.c \ +# cursor.c \ +# multi_font.c \ +# robot_common.c \ +# list.c \ +# multiVis.c \ +# XDrawingArea.c \ +# MouseInfo.c \ +# awt_xembed.c \ +# awt_xembed_server.c \ +# gtk2_interface.c \ +# swing_GTKEngine.c \ +# swing_GTKStyle.c # These files are required to be built, with or without motif. Some of diff -r 90cf935adb35 -r 715cf9378c53 jdk/make/sun/awt/FILES_export_unix.gmk --- a/jdk/make/sun/awt/FILES_export_unix.gmk Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/make/sun/awt/FILES_export_unix.gmk Mon Aug 25 13:58:15 2008 -0700 @@ -60,48 +60,15 @@ sun/awt/image/DataBufferNative.java \ \ sun/awt/motif/X11FontMetrics.java \ - sun/awt/motif/X11Clipboard.java \ - sun/awt/motif/X11Selection.java \ - sun/awt/motif/X11SelectionHolder.java \ sun/awt/X11InputMethod.java \ - sun/awt/motif/MInputMethod.java \ - sun/awt/motif/MInputMethodControl.java \ - sun/awt/motif/MCustomCursor.java \ sun/awt/motif/MFontConfiguration.java \ sun/awt/motif/MFontPeer.java \ sun/awt/motif/MToolkit.java \ - sun/awt/motif/MComponentPeer.java \ - sun/awt/motif/MButtonPeer.java \ - sun/awt/motif/MCanvasPeer.java \ - sun/awt/motif/MCheckboxPeer.java \ - sun/awt/motif/MFileDialogPeer.java \ - sun/awt/motif/MGlobalCursorManager.java \ - sun/awt/motif/MTextFieldPeer.java \ - sun/awt/motif/MLabelPeer.java \ - sun/awt/motif/MListPeer.java \ - sun/awt/motif/MWindowPeer.java \ - sun/awt/motif/MMenuBarPeer.java \ - sun/awt/motif/MMenuPeer.java \ - sun/awt/motif/MPopupMenuPeer.java \ - sun/awt/motif/MDialogPeer.java \ - sun/awt/motif/MMenuItemPeer.java \ - sun/awt/motif/MCheckboxMenuItemPeer.java \ - sun/awt/motif/MChoicePeer.java \ - sun/awt/motif/MTextAreaPeer.java \ - sun/awt/motif/MScrollbarPeer.java \ - sun/awt/motif/MScrollPanePeer.java \ - sun/awt/motif/MFramePeer.java \ sun/awt/DebugSettings.java \ sun/awt/EmbeddedFrame.java \ - sun/awt/motif/MEmbeddedFramePeer.java \ sun/awt/PlatformFont.java \ sun/awt/FontDescriptor.java \ sun/awt/NativeLibLoader.java \ - sun/awt/motif/MDropTargetContextPeer.java \ - sun/awt/motif/MDragSourceContextPeer.java \ - sun/awt/motif/MRobotPeer.java \ - sun/awt/motif/X11DragSourceContextPeer.java \ - sun/awt/motif/X11DropTargetContextPeer.java \ sun/awt/X11GraphicsEnvironment.java \ sun/awt/X11GraphicsDevice.java \ sun/awt/X11GraphicsConfig.java \ @@ -124,7 +91,6 @@ sun/java2d/cmm/ColorTransform.java \ sun/awt/datatransfer/DataTransferer.java \ sun/awt/dnd/SunDragSourceContextPeer.java \ - sun/awt/motif/MDataTransferer.java \ sun/awt/motif/MToolkitThreadBlockedHandler.java \ sun/java2d/opengl/OGLBlitLoops.java \ sun/java2d/opengl/OGLContext.java \ @@ -220,6 +186,5 @@ java/awt/event/NativeLibLoader.java \ java/awt/peer/ComponentPeer.java \ java/awt/dnd/DnDConstants.java \ - sun/awt/CausedFocusEvent.java \ - sun/awt/motif/MEmbedCanvasPeer.java + sun/awt/CausedFocusEvent.java diff -r 90cf935adb35 -r 715cf9378c53 jdk/make/sun/awt/mapfile-mawt-vers --- a/jdk/make/sun/awt/mapfile-mawt-vers Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/make/sun/awt/mapfile-mawt-vers Mon Aug 25 13:58:15 2008 -0700 @@ -31,7 +31,7 @@ global: JNI_OnLoad; - Java_sun_awt_motif_MComponentPeer_restoreFocus; + #Java_sun_awt_motif_MComponentPeer_restoreFocus; Java_sun_awt_DefaultMouseInfoPeer_fillPointWithCoords; Java_sun_awt_DefaultMouseInfoPeer_isWindowUnderMouse; Java_java_awt_AWTEvent_nativeSetSource; @@ -56,163 +56,163 @@ Java_sun_awt_UNIXToolkit_load_1stock_1icon; Java_sun_awt_UNIXToolkit_load_1gtk_1icon; Java_sun_awt_UNIXToolkit_nativeSync; - Java_sun_awt_motif_MButtonPeer_create; - Java_sun_awt_motif_MButtonPeer_setLabel; - Java_sun_awt_motif_MPanelPeer_pEnsureIndex; - Java_sun_awt_motif_MPanelPeer_pRestack; - Java_sun_awt_motif_MCanvasPeer_create; - Java_sun_awt_motif_MCanvasPeer_initIDs; - Java_sun_awt_motif_MCanvasPeer_resetTargetGC; - Java_sun_awt_motif_MCheckboxMenuItemPeer_pSetState; - Java_sun_awt_motif_MCheckboxPeer_create; - Java_sun_awt_motif_MCheckboxPeer_setCheckboxGroup; - Java_sun_awt_motif_MCheckboxPeer_setLabel; - Java_sun_awt_motif_MCheckboxPeer_pSetState; - Java_sun_awt_motif_MCheckboxPeer_pGetState; - Java_sun_awt_motif_MChoicePeer_addItem; - Java_sun_awt_motif_MChoicePeer_appendItems; - Java_sun_awt_motif_MChoicePeer_create; - Java_sun_awt_motif_MChoicePeer_pReshape; - Java_sun_awt_motif_MChoicePeer_remove; - Java_sun_awt_motif_MChoicePeer_removeAll; - Java_sun_awt_motif_MChoicePeer_setBackground; - Java_sun_awt_motif_MChoicePeer_pSelect; - Java_sun_awt_motif_MChoicePeer_setFont; - Java_sun_awt_motif_MChoicePeer_setForeground; - Java_sun_awt_motif_MComponentPeer_addNativeDropTarget; - Java_sun_awt_motif_MComponentPeer_getNativeColor; - Java_sun_awt_motif_MComponentPeer_getWindow; - Java_sun_awt_motif_MComponentPeer_pDisable; - Java_sun_awt_motif_MComponentPeer_pDispose; - Java_sun_awt_motif_MComponentPeer_pEnable; - Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen; - Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen2; - Java_sun_awt_motif_MComponentPeer_pHide; - Java_sun_awt_motif_MComponentPeer_pInitialize; - Java_sun_awt_motif_MComponentPeer_pMakeCursorVisible; - Java_sun_awt_motif_MComponentPeer_pReshape; - Java_sun_awt_motif_MComponentPeer_pShow; - Java_sun_awt_motif_MComponentPeer_removeNativeDropTarget; - Java_sun_awt_motif_MComponentPeer_pSetBackground; - Java_sun_awt_motif_MComponentPeer_pSetFont; - Java_sun_awt_motif_MComponentPeer_processSynchronousLightweightTransfer; - Java_sun_awt_motif_MComponentPeer__1requestFocus; - Java_sun_awt_motif_MComponentPeer_getNativeFocusedWindow; - Java_sun_awt_motif_MCheckboxMenuItemPeer_getState; - Java_sun_awt_motif_MComponentPeer_pSetForeground; - Java_sun_awt_motif_MDragSourceContextPeer_startDrag; - Java_sun_awt_motif_MDragSourceContextPeer_setNativeCursor; - Java_sun_awt_motif_MDropTargetContextPeer_addTransfer; - Java_sun_awt_motif_MDropTargetContextPeer_dropDone; - Java_sun_awt_motif_MDropTargetContextPeer_startTransfer; - Java_sun_awt_motif_X11DragSourceContextPeer_startDrag; - Java_sun_awt_motif_X11DragSourceContextPeer_setNativeCursor; - Java_sun_awt_motif_X11DropTargetContextPeer_sendResponse; - Java_sun_awt_motif_X11DropTargetContextPeer_dropDone; - Java_sun_awt_motif_X11DropTargetContextPeer_getData; - Java_sun_awt_motif_MEmbeddedFramePeer_NEFcreate; - Java_sun_awt_motif_MEmbeddedFramePeer_pShowImpl; - Java_sun_awt_motif_MEmbeddedFramePeer_requestXEmbedFocus; - Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedApplicationActive; - Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedActive; - Java_sun_awt_motif_MEmbeddedFramePeer_synthesizeFocusInOut; - Java_sun_awt_motif_MEmbeddedFramePeer_pReshapePrivate; - Java_sun_awt_motif_MEmbeddedFramePeer_getBoundsPrivate; - Java_sun_awt_motif_MEmbeddedFrame_getWidget; - Java_sun_awt_motif_MEmbeddedFrame_mapWidget; - Java_sun_awt_motif_MEmbedCanvasPeer_forwardEventToEmbedded; - Java_sun_awt_motif_MFramePeer_pSetIconImage___3B_3I_3SII; - Java_sun_awt_motif_MFileDialogPeer_create; - Java_sun_awt_motif_MFileDialogPeer_pDispose; - Java_sun_awt_motif_MFileDialogPeer_pHide; - Java_sun_awt_motif_MFileDialogPeer_pReshape; - Java_sun_awt_motif_MFileDialogPeer_pShow; - Java_sun_awt_motif_MFileDialogPeer_setFileEntry; - Java_sun_awt_motif_MFileDialogPeer_setFont; - Java_sun_awt_motif_MFramePeer_pGetIconSize; - Java_sun_awt_motif_MGlobalCursorManager_cacheInit; - Java_sun_awt_motif_MGlobalCursorManager_findComponentAt; - Java_sun_awt_motif_MGlobalCursorManager_findHeavyweightUnderCursor; - Java_sun_awt_motif_MGlobalCursorManager_getCursorPos; - Java_sun_awt_motif_MGlobalCursorManager_getLocationOnScreen; - Java_sun_awt_motif_MLabelPeer_create; - Java_sun_awt_motif_MLabelPeer_setAlignment; - Java_sun_awt_motif_MLabelPeer_setText; - Java_sun_awt_motif_MListPeer_addItem; - Java_sun_awt_motif_MListPeer_create; - Java_sun_awt_motif_MListPeer_delItems; - Java_sun_awt_motif_MListPeer_deselect; - Java_sun_awt_motif_MListPeer_isSelected; - Java_sun_awt_motif_MListPeer_makeVisible; - Java_sun_awt_motif_MListPeer_nativeHandleMouseWheel; - Java_sun_awt_motif_MListPeer_select; - Java_sun_awt_motif_MListPeer_setMultipleSelections; - Java_sun_awt_motif_MMenuBarPeer_create; - Java_sun_awt_motif_MMenuItemPeer_createMenuItem; - Java_sun_awt_motif_MMenuItemPeer_pDisable; - Java_sun_awt_motif_MMenuItemPeer_pDispose; - Java_sun_awt_motif_MMenuItemPeer_pEnable; - Java_sun_awt_motif_MMenuItemPeer_pSetLabel; - Java_sun_awt_motif_MMenuPeer_createMenu; - Java_sun_awt_motif_MMenuPeer_createSubMenu; - Java_sun_awt_motif_MMenuPeer_pDispose; - Java_sun_awt_motif_MPopupMenuPeer_createMenu; - Java_sun_awt_motif_MPopupMenuPeer_pDispose; - Java_sun_awt_motif_MPopupMenuPeer_pShow; - Java_sun_awt_motif_MRobotPeer_getRGBPixelsImpl; - Java_sun_awt_motif_MRobotPeer_keyPressImpl; - Java_sun_awt_motif_MRobotPeer_keyReleaseImpl; - Java_sun_awt_motif_MRobotPeer_mouseMoveImpl; - Java_sun_awt_motif_MRobotPeer_mousePressImpl; - Java_sun_awt_motif_MRobotPeer_mouseReleaseImpl; - Java_sun_awt_motif_MRobotPeer_mouseWheelImpl; - Java_sun_awt_motif_MRobotPeer_setup; - Java_sun_awt_motif_MScrollbarPeer_create; - Java_sun_awt_motif_MScrollbarPeer_setLineIncrement; - Java_sun_awt_motif_MScrollbarPeer_setPageIncrement; - Java_sun_awt_motif_MScrollbarPeer_pSetValues; - Java_sun_awt_motif_MScrollPanePeer_create; - Java_sun_awt_motif_MScrollPanePeer_pGetBlockIncrement; - Java_sun_awt_motif_MScrollPanePeer_pGetScrollbarSpace; - Java_sun_awt_motif_MScrollPanePeer_pGetShadow; - Java_sun_awt_motif_MScrollPanePeer_pInsets; - Java_sun_awt_motif_MScrollPanePeer_pSetIncrement; - Java_sun_awt_motif_MScrollPanePeer_pSetScrollChild; - Java_sun_awt_motif_MScrollPanePeer_setScrollPosition; - Java_sun_awt_motif_MScrollPanePeer_setTypedValue; - Java_sun_awt_motif_MTextAreaPeer_initIDs; - Java_sun_awt_motif_MTextAreaPeer_pCreate; - Java_sun_awt_motif_MTextAreaPeer_getCaretPosition; - Java_sun_awt_motif_MTextAreaPeer_getExtraHeight; - Java_sun_awt_motif_MTextAreaPeer_getExtraWidth; - Java_sun_awt_motif_MTextAreaPeer_getSelectionEnd; - Java_sun_awt_motif_MTextAreaPeer_getSelectionStart; - Java_sun_awt_motif_MTextAreaPeer_getText; - Java_sun_awt_motif_MTextAreaPeer_insert; - Java_sun_awt_motif_MTextAreaPeer_nativeHandleMouseWheel; - Java_sun_awt_motif_MTextAreaPeer_pMakeCursorVisible; - Java_sun_awt_motif_MTextAreaPeer_pSetEditable; - Java_sun_awt_motif_MTextAreaPeer_pShow2; - Java_sun_awt_motif_MTextAreaPeer_replaceRange; - Java_sun_awt_motif_MTextAreaPeer_select; - Java_sun_awt_motif_MTextAreaPeer_setCaretPosition; - Java_sun_awt_motif_MTextAreaPeer_setFont; - Java_sun_awt_motif_MTextAreaPeer_setText; - Java_sun_awt_motif_MTextAreaPeer_setTextBackground; - Java_sun_awt_motif_MTextFieldPeer_initIDs; - Java_sun_awt_motif_MTextFieldPeer_pCreate; - Java_sun_awt_motif_MTextFieldPeer_getCaretPosition; - Java_sun_awt_motif_MTextFieldPeer_getSelectionEnd; - Java_sun_awt_motif_MTextFieldPeer_getSelectionStart; - Java_sun_awt_motif_MTextFieldPeer_getText; - Java_sun_awt_motif_MTextFieldPeer_insertReplaceText; - Java_sun_awt_motif_MTextFieldPeer_preDispose; - Java_sun_awt_motif_MTextFieldPeer_pSetEditable; - Java_sun_awt_motif_MTextFieldPeer_select; - Java_sun_awt_motif_MTextFieldPeer_setCaretPosition; - Java_sun_awt_motif_MTextFieldPeer_setEchoChar; - Java_sun_awt_motif_MTextFieldPeer_setFont; - Java_sun_awt_motif_MTextFieldPeer_setText; + #Java_sun_awt_motif_MButtonPeer_create; + #Java_sun_awt_motif_MButtonPeer_setLabel; + #Java_sun_awt_motif_MPanelPeer_pEnsureIndex; + #Java_sun_awt_motif_MPanelPeer_pRestack; + #Java_sun_awt_motif_MCanvasPeer_create; + #Java_sun_awt_motif_MCanvasPeer_initIDs; + #Java_sun_awt_motif_MCanvasPeer_resetTargetGC; + #Java_sun_awt_motif_MCheckboxMenuItemPeer_pSetState; + #Java_sun_awt_motif_MCheckboxPeer_create; + #Java_sun_awt_motif_MCheckboxPeer_setCheckboxGroup; + #Java_sun_awt_motif_MCheckboxPeer_setLabel; + #Java_sun_awt_motif_MCheckboxPeer_pSetState; + #Java_sun_awt_motif_MCheckboxPeer_pGetState; + #Java_sun_awt_motif_MChoicePeer_addItem; + #Java_sun_awt_motif_MChoicePeer_appendItems; + #Java_sun_awt_motif_MChoicePeer_create; + #Java_sun_awt_motif_MChoicePeer_pReshape; + #Java_sun_awt_motif_MChoicePeer_remove; + #Java_sun_awt_motif_MChoicePeer_removeAll; + #Java_sun_awt_motif_MChoicePeer_setBackground; + #Java_sun_awt_motif_MChoicePeer_pSelect; + #Java_sun_awt_motif_MChoicePeer_setFont; + #Java_sun_awt_motif_MChoicePeer_setForeground; + #Java_sun_awt_motif_MComponentPeer_addNativeDropTarget; + #Java_sun_awt_motif_MComponentPeer_getNativeColor; + #Java_sun_awt_motif_MComponentPeer_getWindow; + #Java_sun_awt_motif_MComponentPeer_pDisable; + #Java_sun_awt_motif_MComponentPeer_pDispose; + #Java_sun_awt_motif_MComponentPeer_pEnable; + #Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen; + #Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen2; + #Java_sun_awt_motif_MComponentPeer_pHide; + #Java_sun_awt_motif_MComponentPeer_pInitialize; + #Java_sun_awt_motif_MComponentPeer_pMakeCursorVisible; + #Java_sun_awt_motif_MComponentPeer_pReshape; + #Java_sun_awt_motif_MComponentPeer_pShow; + #Java_sun_awt_motif_MComponentPeer_removeNativeDropTarget; + #Java_sun_awt_motif_MComponentPeer_pSetBackground; + #Java_sun_awt_motif_MComponentPeer_pSetFont; + #Java_sun_awt_motif_MComponentPeer_processSynchronousLightweightTransfer; + #Java_sun_awt_motif_MComponentPeer__1requestFocus; + #Java_sun_awt_motif_MComponentPeer_getNativeFocusedWindow; + #Java_sun_awt_motif_MCheckboxMenuItemPeer_getState; + #Java_sun_awt_motif_MComponentPeer_pSetForeground; + #Java_sun_awt_motif_MDragSourceContextPeer_startDrag; + #Java_sun_awt_motif_MDragSourceContextPeer_setNativeCursor; + #Java_sun_awt_motif_MDropTargetContextPeer_addTransfer; + #Java_sun_awt_motif_MDropTargetContextPeer_dropDone; + #Java_sun_awt_motif_MDropTargetContextPeer_startTransfer; + #Java_sun_awt_motif_X11DragSourceContextPeer_startDrag; + #Java_sun_awt_motif_X11DragSourceContextPeer_setNativeCursor; + #Java_sun_awt_motif_X11DropTargetContextPeer_sendResponse; + #Java_sun_awt_motif_X11DropTargetContextPeer_dropDone; + #Java_sun_awt_motif_X11DropTargetContextPeer_getData; + #Java_sun_awt_motif_MEmbeddedFramePeer_NEFcreate; + #Java_sun_awt_motif_MEmbeddedFramePeer_pShowImpl; + #Java_sun_awt_motif_MEmbeddedFramePeer_requestXEmbedFocus; + #Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedApplicationActive; + #Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedActive; + #Java_sun_awt_motif_MEmbeddedFramePeer_synthesizeFocusInOut; + #Java_sun_awt_motif_MEmbeddedFramePeer_pReshapePrivate; + #Java_sun_awt_motif_MEmbeddedFramePeer_getBoundsPrivate; + #Java_sun_awt_motif_MEmbeddedFrame_getWidget; + #Java_sun_awt_motif_MEmbeddedFrame_mapWidget; + #Java_sun_awt_motif_MEmbedCanvasPeer_forwardEventToEmbedded; + #Java_sun_awt_motif_MFramePeer_pSetIconImage___3B_3I_3SII; + #Java_sun_awt_motif_MFileDialogPeer_create; + #Java_sun_awt_motif_MFileDialogPeer_pDispose; + #Java_sun_awt_motif_MFileDialogPeer_pHide; + #Java_sun_awt_motif_MFileDialogPeer_pReshape; + #Java_sun_awt_motif_MFileDialogPeer_pShow; + #Java_sun_awt_motif_MFileDialogPeer_setFileEntry; + #Java_sun_awt_motif_MFileDialogPeer_setFont; + #Java_sun_awt_motif_MFramePeer_pGetIconSize; + #Java_sun_awt_motif_MGlobalCursorManager_cacheInit; + #Java_sun_awt_motif_MGlobalCursorManager_findComponentAt; + #Java_sun_awt_motif_MGlobalCursorManager_findHeavyweightUnderCursor; + #Java_sun_awt_motif_MGlobalCursorManager_getCursorPos; + #Java_sun_awt_motif_MGlobalCursorManager_getLocationOnScreen; + #Java_sun_awt_motif_MLabelPeer_create; + #Java_sun_awt_motif_MLabelPeer_setAlignment; + #Java_sun_awt_motif_MLabelPeer_setText; + #Java_sun_awt_motif_MListPeer_addItem; + #Java_sun_awt_motif_MListPeer_create; + #Java_sun_awt_motif_MListPeer_delItems; + #Java_sun_awt_motif_MListPeer_deselect; + #Java_sun_awt_motif_MListPeer_isSelected; + #Java_sun_awt_motif_MListPeer_makeVisible; + #Java_sun_awt_motif_MListPeer_nativeHandleMouseWheel; + #Java_sun_awt_motif_MListPeer_select; + #Java_sun_awt_motif_MListPeer_setMultipleSelections; + #Java_sun_awt_motif_MMenuBarPeer_create; + #Java_sun_awt_motif_MMenuItemPeer_createMenuItem; + #Java_sun_awt_motif_MMenuItemPeer_pDisable; + #Java_sun_awt_motif_MMenuItemPeer_pDispose; + #Java_sun_awt_motif_MMenuItemPeer_pEnable; + #Java_sun_awt_motif_MMenuItemPeer_pSetLabel; + #Java_sun_awt_motif_MMenuPeer_createMenu; + #Java_sun_awt_motif_MMenuPeer_createSubMenu; + #Java_sun_awt_motif_MMenuPeer_pDispose; + #Java_sun_awt_motif_MPopupMenuPeer_createMenu; + #Java_sun_awt_motif_MPopupMenuPeer_pDispose; + #Java_sun_awt_motif_MPopupMenuPeer_pShow; + #Java_sun_awt_motif_MRobotPeer_getRGBPixelsImpl; + #Java_sun_awt_motif_MRobotPeer_keyPressImpl; + #Java_sun_awt_motif_MRobotPeer_keyReleaseImpl; + #Java_sun_awt_motif_MRobotPeer_mouseMoveImpl; + #Java_sun_awt_motif_MRobotPeer_mousePressImpl; + #Java_sun_awt_motif_MRobotPeer_mouseReleaseImpl; + #Java_sun_awt_motif_MRobotPeer_mouseWheelImpl; + #Java_sun_awt_motif_MRobotPeer_setup; + #Java_sun_awt_motif_MScrollbarPeer_create; + #Java_sun_awt_motif_MScrollbarPeer_setLineIncrement; + #Java_sun_awt_motif_MScrollbarPeer_setPageIncrement; + #Java_sun_awt_motif_MScrollbarPeer_pSetValues; + #Java_sun_awt_motif_MScrollPanePeer_create; + #Java_sun_awt_motif_MScrollPanePeer_pGetBlockIncrement; + #Java_sun_awt_motif_MScrollPanePeer_pGetScrollbarSpace; + #Java_sun_awt_motif_MScrollPanePeer_pGetShadow; + #Java_sun_awt_motif_MScrollPanePeer_pInsets; + #Java_sun_awt_motif_MScrollPanePeer_pSetIncrement; + #Java_sun_awt_motif_MScrollPanePeer_pSetScrollChild; + #Java_sun_awt_motif_MScrollPanePeer_setScrollPosition; + #Java_sun_awt_motif_MScrollPanePeer_setTypedValue; + #Java_sun_awt_motif_MTextAreaPeer_initIDs; + #Java_sun_awt_motif_MTextAreaPeer_pCreate; + #Java_sun_awt_motif_MTextAreaPeer_getCaretPosition; + #Java_sun_awt_motif_MTextAreaPeer_getExtraHeight; + #Java_sun_awt_motif_MTextAreaPeer_getExtraWidth; + #Java_sun_awt_motif_MTextAreaPeer_getSelectionEnd; + #Java_sun_awt_motif_MTextAreaPeer_getSelectionStart; + #Java_sun_awt_motif_MTextAreaPeer_getText; + #Java_sun_awt_motif_MTextAreaPeer_insert; + #Java_sun_awt_motif_MTextAreaPeer_nativeHandleMouseWheel; + #Java_sun_awt_motif_MTextAreaPeer_pMakeCursorVisible; + #Java_sun_awt_motif_MTextAreaPeer_pSetEditable; + #Java_sun_awt_motif_MTextAreaPeer_pShow2; + #Java_sun_awt_motif_MTextAreaPeer_replaceRange; + #Java_sun_awt_motif_MTextAreaPeer_select; + #Java_sun_awt_motif_MTextAreaPeer_setCaretPosition; + #Java_sun_awt_motif_MTextAreaPeer_setFont; + #Java_sun_awt_motif_MTextAreaPeer_setText; + #Java_sun_awt_motif_MTextAreaPeer_setTextBackground; + #Java_sun_awt_motif_MTextFieldPeer_initIDs; + #Java_sun_awt_motif_MTextFieldPeer_pCreate; + #Java_sun_awt_motif_MTextFieldPeer_getCaretPosition; + #Java_sun_awt_motif_MTextFieldPeer_getSelectionEnd; + #Java_sun_awt_motif_MTextFieldPeer_getSelectionStart; + #Java_sun_awt_motif_MTextFieldPeer_getText; + #Java_sun_awt_motif_MTextFieldPeer_insertReplaceText; + #Java_sun_awt_motif_MTextFieldPeer_preDispose; + #Java_sun_awt_motif_MTextFieldPeer_pSetEditable; + #Java_sun_awt_motif_MTextFieldPeer_select; + #Java_sun_awt_motif_MTextFieldPeer_setCaretPosition; + #Java_sun_awt_motif_MTextFieldPeer_setEchoChar; + #Java_sun_awt_motif_MTextFieldPeer_setFont; + #Java_sun_awt_motif_MTextFieldPeer_setText; Java_sun_awt_motif_MToolkit_beep; Java_sun_awt_motif_MToolkit_getLockingKeyStateNative; Java_sun_awt_motif_MToolkit_getMulticlickTime; @@ -236,30 +236,30 @@ Java_sun_awt_motif_MToolkit_nativeGrab; Java_sun_awt_motif_MToolkit_getWMName; Java_sun_awt_motif_MWindowAttributes_initIDs; - Java_sun_awt_motif_MWindowPeer_pDispose; - Java_sun_awt_motif_MWindowPeer_pHide; - Java_sun_awt_motif_MWindowPeer_pReshape; - Java_sun_awt_motif_MWindowPeer_pSetTitle; - Java_sun_awt_motif_MWindowPeer_pShow; - Java_sun_awt_motif_MWindowPeer_setResizable; - Java_sun_awt_motif_MWindowPeer_toBack; - Java_sun_awt_motif_MWindowPeer_addTextComponentNative; - Java_sun_awt_motif_MWindowPeer_getState; - Java_sun_awt_motif_MWindowPeer_pSetIMMOption; - Java_sun_awt_motif_MWindowPeer_pSetMenuBar; - Java_sun_awt_motif_MWindowPeer_pShowModal; - Java_sun_awt_motif_MWindowPeer_removeTextComponentNative; - Java_sun_awt_motif_MWindowPeer_setSaveUnder; - Java_sun_awt_motif_MWindowPeer_setState; - Java_sun_awt_motif_MWindowPeer_resetTargetGC; - Java_sun_awt_motif_MWindowPeer_registerX11DropTarget; - Java_sun_awt_motif_MWindowPeer_unregisterX11DropTarget; - Java_sun_awt_motif_MWindowPeer_updateAlwaysOnTop; - Java_sun_awt_motif_MWindowPeer_setFocusableWindow; - Java_sun_awt_motif_MWindowPeer_pToFront; - Java_sun_awt_motif_MCustomCursor_cacheInit; - Java_sun_awt_motif_MCustomCursor_createCursor; - Java_sun_awt_motif_MCustomCursor_queryBestCursor; + #Java_sun_awt_motif_MWindowPeer_pDispose; + #Java_sun_awt_motif_MWindowPeer_pHide; + #Java_sun_awt_motif_MWindowPeer_pReshape; + #Java_sun_awt_motif_MWindowPeer_pSetTitle; + #Java_sun_awt_motif_MWindowPeer_pShow; + #Java_sun_awt_motif_MWindowPeer_setResizable; + #Java_sun_awt_motif_MWindowPeer_toBack; + #Java_sun_awt_motif_MWindowPeer_addTextComponentNative; + #Java_sun_awt_motif_MWindowPeer_getState; + #Java_sun_awt_motif_MWindowPeer_pSetIMMOption; + #Java_sun_awt_motif_MWindowPeer_pSetMenuBar; + #Java_sun_awt_motif_MWindowPeer_pShowModal; + #Java_sun_awt_motif_MWindowPeer_removeTextComponentNative; + #Java_sun_awt_motif_MWindowPeer_setSaveUnder; + #Java_sun_awt_motif_MWindowPeer_setState; + #Java_sun_awt_motif_MWindowPeer_resetTargetGC; + #Java_sun_awt_motif_MWindowPeer_registerX11DropTarget; + #Java_sun_awt_motif_MWindowPeer_unregisterX11DropTarget; + #Java_sun_awt_motif_MWindowPeer_updateAlwaysOnTop; + #Java_sun_awt_motif_MWindowPeer_setFocusableWindow; + #Java_sun_awt_motif_MWindowPeer_pToFront; + #Java_sun_awt_motif_MCustomCursor_cacheInit; + #Java_sun_awt_motif_MCustomCursor_createCursor; + #Java_sun_awt_motif_MCustomCursor_queryBestCursor; Java_sun_awt_motif_X11FontMetrics_bytesWidth; Java_sun_awt_motif_X11FontMetrics_getMFCharsWidth; Java_sun_awt_motif_X11FontMetrics_init; @@ -268,18 +268,18 @@ Java_sun_awt_X11InputMethod_resetXIC; Java_sun_awt_X11InputMethod_setCompositionEnabledNative; Java_sun_awt_X11InputMethod_turnoffStatusWindow; - Java_sun_awt_motif_MInputMethod_openXIMNative; - Java_sun_awt_motif_MInputMethod_configureStatusAreaNative; - Java_sun_awt_motif_MInputMethod_createXICNative; - Java_sun_awt_motif_MInputMethod_reconfigureXICNative; - Java_sun_awt_motif_MInputMethod_setXICFocusNative; - Java_sun_awt_motif_X11Clipboard_getClipboardData; - Java_sun_awt_motif_X11Clipboard_getClipboardFormats; - Java_sun_awt_motif_X11Clipboard_registerClipboardViewer; - Java_sun_awt_motif_X11Clipboard_unregisterClipboardViewer; - Java_sun_awt_motif_X11Selection_init; - Java_sun_awt_motif_X11Selection_pGetSelectionOwnership; - Java_sun_awt_motif_X11Selection_clearNativeContext; + #Java_sun_awt_motif_MInputMethod_openXIMNative; + #Java_sun_awt_motif_MInputMethod_configureStatusAreaNative; + #Java_sun_awt_motif_MInputMethod_createXICNative; + #Java_sun_awt_motif_MInputMethod_reconfigureXICNative; + #Java_sun_awt_motif_MInputMethod_setXICFocusNative; + #Java_sun_awt_motif_X11Clipboard_getClipboardData; + #Java_sun_awt_motif_X11Clipboard_getClipboardFormats; + #Java_sun_awt_motif_X11Clipboard_registerClipboardViewer; + #Java_sun_awt_motif_X11Clipboard_unregisterClipboardViewer; + #Java_sun_awt_motif_X11Selection_init; + #Java_sun_awt_motif_X11Selection_pGetSelectionOwnership; + #Java_sun_awt_motif_X11Selection_clearNativeContext; Java_sun_awt_SunToolkit_closeSplashScreen; Java_sun_awt_PlatformFont_initIDs; Java_sun_awt_X11GraphicsConfig_init; @@ -311,25 +311,25 @@ Java_sun_awt_X11GraphicsEnvironment_initGLX; Java_sun_awt_X11GraphicsEnvironment_pRunningXinerama; Java_sun_awt_X11GraphicsEnvironment_getXineramaCenterPoint; - Java_sun_awt_motif_MEmbedCanvasPeer_initXEmbedServer; - Java_sun_awt_motif_MEmbedCanvasPeer_destroyXEmbedServer; - Java_sun_awt_motif_MEmbedCanvasPeer_isXEmbedActive; - Java_sun_awt_motif_MEmbedCanvasPeer_initDispatching; - Java_sun_awt_motif_MEmbedCanvasPeer_endDispatching; - Java_sun_awt_motif_MEmbedCanvasPeer_embedChild; - Java_sun_awt_motif_MEmbedCanvasPeer_childDestroyed; - Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedPreferredSize; - Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedMinimumSize; - Java_sun_awt_motif_MEmbedCanvasPeer_getClientBounds; - Java_sun_awt_motif_MEmbedCanvasPeer_notifyChildEmbedded; - Java_sun_awt_motif_MEmbedCanvasPeer_detachChild; - Java_sun_awt_motif_MEmbedCanvasPeer_forwardKeyEvent; - Java_sun_awt_motif_MEmbedCanvasPeer_getAWTKeyCodeForKeySym; - Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__I; - Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__IJJJ; - Java_sun_awt_motif_MEmbedCanvasPeer_getWindow; - Java_sun_awt_motif_GrabbedKey_initKeySymAndModifiers; - Java_sun_awt_motif_MEmbeddedFramePeer_traverseOut; + #Java_sun_awt_motif_MEmbedCanvasPeer_initXEmbedServer; + #Java_sun_awt_motif_MEmbedCanvasPeer_destroyXEmbedServer; + #Java_sun_awt_motif_MEmbedCanvasPeer_isXEmbedActive; + #Java_sun_awt_motif_MEmbedCanvasPeer_initDispatching; + #Java_sun_awt_motif_MEmbedCanvasPeer_endDispatching; + #Java_sun_awt_motif_MEmbedCanvasPeer_embedChild; + #Java_sun_awt_motif_MEmbedCanvasPeer_childDestroyed; + #Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedPreferredSize; + #Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedMinimumSize; + #Java_sun_awt_motif_MEmbedCanvasPeer_getClientBounds; + #Java_sun_awt_motif_MEmbedCanvasPeer_notifyChildEmbedded; + #Java_sun_awt_motif_MEmbedCanvasPeer_detachChild; + #Java_sun_awt_motif_MEmbedCanvasPeer_forwardKeyEvent; + #Java_sun_awt_motif_MEmbedCanvasPeer_getAWTKeyCodeForKeySym; + #Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__I; + #Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__IJJJ; + #Java_sun_awt_motif_MEmbedCanvasPeer_getWindow; + #Java_sun_awt_motif_GrabbedKey_initKeySymAndModifiers; + #Java_sun_awt_motif_MEmbeddedFramePeer_traverseOut; Java_java_awt_AWTEvent_initIDs; Java_java_awt_Button_initIDs; Java_java_awt_Container_initIDs; @@ -343,39 +343,39 @@ Java_java_awt_Insets_initIDs; Java_java_awt_TextField_initIDs; Java_java_awt_Window_initIDs; - Java_sun_awt_motif_MCheckboxPeer_getIndicatorSize; - Java_sun_awt_motif_MCheckboxPeer_getSpacing; - Java_sun_awt_motif_MChoicePeer_freeNativeData; - Java_sun_awt_motif_MComponentPeer_getComponents_1NoClientCode; - Java_sun_awt_motif_MComponentPeer_getParent_1NoClientCode; - Java_sun_awt_motif_MComponentPeer_initIDs; - Java_sun_awt_motif_MComponentPeer_nativeHandleEvent; - Java_sun_awt_motif_MComponentPeer_pSetCursor; - Java_sun_awt_motif_MComponentPeer_pSetInnerForeground; - Java_sun_awt_motif_MComponentPeer_pSetScrollbarBackground; - Java_sun_awt_motif_MComponentPeer_setTargetBackground; - Java_sun_awt_motif_MDataTransferer_dragQueryFile; - Java_sun_awt_motif_MDataTransferer_getAtomForTarget; - Java_sun_awt_motif_MDataTransferer_getTargetNameForAtom; - Java_sun_awt_motif_MFileDialogPeer_insertReplaceFileDialogText; + #Java_sun_awt_motif_MCheckboxPeer_getIndicatorSize; + #Java_sun_awt_motif_MCheckboxPeer_getSpacing; + #Java_sun_awt_motif_MChoicePeer_freeNativeData; + #Java_sun_awt_motif_MComponentPeer_getComponents_1NoClientCode; + #Java_sun_awt_motif_MComponentPeer_getParent_1NoClientCode; + #Java_sun_awt_motif_MComponentPeer_initIDs; + #Java_sun_awt_motif_MComponentPeer_nativeHandleEvent; + #Java_sun_awt_motif_MComponentPeer_pSetCursor; + #Java_sun_awt_motif_MComponentPeer_pSetInnerForeground; + #Java_sun_awt_motif_MComponentPeer_pSetScrollbarBackground; + #Java_sun_awt_motif_MComponentPeer_setTargetBackground; + #Java_sun_awt_motif_MDataTransferer_dragQueryFile; + #Java_sun_awt_motif_MDataTransferer_getAtomForTarget; + #Java_sun_awt_motif_MDataTransferer_getTargetNameForAtom; + #Java_sun_awt_motif_MFileDialogPeer_insertReplaceFileDialogText; Java_sun_awt_motif_MFontPeer_initIDs; - Java_sun_awt_motif_MListPeer_setBackground; - Java_sun_awt_motif_MMenuBarPeer_initIDs; - Java_sun_awt_motif_MMenuBarPeer_pDispose; - Java_sun_awt_motif_MMenuItemPeer_getParent_1NoClientCode; - Java_sun_awt_motif_MMenuItemPeer_initIDs; - Java_sun_awt_motif_MMenuItemPeer_pSetShortcut; - Java_sun_awt_motif_MPopupMenuPeer_initIDs; - Java_sun_awt_motif_MScrollbarPeer_initIDs; - Java_sun_awt_motif_MScrollPanePeer_initIDs; - Java_sun_awt_motif_MTextAreaPeer_pSetCursor; + #Java_sun_awt_motif_MListPeer_setBackground; + #Java_sun_awt_motif_MMenuBarPeer_initIDs; + #Java_sun_awt_motif_MMenuBarPeer_pDispose; + #Java_sun_awt_motif_MMenuItemPeer_getParent_1NoClientCode; + #Java_sun_awt_motif_MMenuItemPeer_initIDs; + #Java_sun_awt_motif_MMenuItemPeer_pSetShortcut; + #Java_sun_awt_motif_MPopupMenuPeer_initIDs; + #Java_sun_awt_motif_MScrollbarPeer_initIDs; + #Java_sun_awt_motif_MScrollPanePeer_initIDs; + #Java_sun_awt_motif_MTextAreaPeer_pSetCursor; Java_sun_awt_motif_MToolkit_shutdown; - Java_sun_awt_motif_MWindowPeer_initIDs; - Java_sun_awt_motif_MWindowPeer_pCreate; - Java_sun_awt_motif_MWindowPeer_wrapInSequenced; + #Java_sun_awt_motif_MWindowPeer_initIDs; + #Java_sun_awt_motif_MWindowPeer_pCreate; + #Java_sun_awt_motif_MWindowPeer_wrapInSequenced; Java_sun_awt_motif_X11FontMetrics_initIDs; - Java_sun_awt_X11InputMethod_initIDs; - Java_sun_awt_motif_X11Selection_initIDs; + #Java_sun_awt_X11InputMethod_initIDs; + #Java_sun_awt_motif_X11Selection_initIDs; Java_sun_awt_motif_MToolkitThreadBlockedHandler_enter; Java_sun_awt_motif_MToolkitThreadBlockedHandler_exit; Java_sun_awt_X11GraphicsConfig_init; diff -r 90cf935adb35 -r 715cf9378c53 jdk/make/sun/awt/mapfile-vers-linux --- a/jdk/make/sun/awt/mapfile-vers-linux Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/make/sun/awt/mapfile-vers-linux Mon Aug 25 13:58:15 2008 -0700 @@ -170,7 +170,7 @@ GrPrim_Sg2dGetPixel; GrPrim_Sg2dGetLCDTextContrast; - Java_sun_awt_motif_MComponentPeer_restoreFocus; + #Java_sun_awt_motif_MComponentPeer_restoreFocus; Java_sun_awt_DefaultMouseInfoPeer_fillPointWithCoords; Java_sun_awt_DefaultMouseInfoPeer_isWindowUnderMouse; Java_java_awt_AWTEvent_nativeSetSource; @@ -189,158 +189,158 @@ Java_java_awt_ScrollPane_initIDs; Java_java_awt_TextArea_initIDs; Java_sun_awt_FontDescriptor_initIDs; - Java_sun_awt_motif_MButtonPeer_create; - Java_sun_awt_motif_MButtonPeer_setLabel; - Java_sun_awt_motif_MCanvasPeer_create; - Java_sun_awt_motif_MCanvasPeer_initIDs; - Java_sun_awt_motif_MCanvasPeer_resetTargetGC; - Java_sun_awt_motif_MCheckboxMenuItemPeer_pSetState; - Java_sun_awt_motif_MCheckboxPeer_create; - Java_sun_awt_motif_MCheckboxPeer_setCheckboxGroup; - Java_sun_awt_motif_MCheckboxPeer_setLabel; - Java_sun_awt_motif_MCheckboxPeer_pSetState; - Java_sun_awt_motif_MCheckboxPeer_pGetState; - Java_sun_awt_motif_MChoicePeer_addItem; - Java_sun_awt_motif_MChoicePeer_appendItems; - Java_sun_awt_motif_MChoicePeer_create; - Java_sun_awt_motif_MChoicePeer_pReshape; - Java_sun_awt_motif_MChoicePeer_remove; - Java_sun_awt_motif_MChoicePeer_removeAll; - Java_sun_awt_motif_MChoicePeer_setBackground; - Java_sun_awt_motif_MChoicePeer_pSelect; - Java_sun_awt_motif_MChoicePeer_setFont; - Java_sun_awt_motif_MChoicePeer_setForeground; - Java_sun_awt_motif_MComponentPeer_addNativeDropTarget; - Java_sun_awt_motif_MComponentPeer_createBackBuffer; - Java_sun_awt_motif_MComponentPeer_destroyBackBuffer; - Java_sun_awt_motif_MComponentPeer_getNativeColor; - Java_sun_awt_motif_MComponentPeer_getWindow; - Java_sun_awt_motif_MComponentPeer_pDisable; - Java_sun_awt_motif_MComponentPeer_pDispose; - Java_sun_awt_motif_MComponentPeer_pEnable; - Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen; - Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen2; - Java_sun_awt_motif_MComponentPeer_pHide; - Java_sun_awt_motif_MComponentPeer_pInitialize; - Java_sun_awt_motif_MComponentPeer_pMakeCursorVisible; - Java_sun_awt_motif_MComponentPeer_pReshape; - Java_sun_awt_motif_MComponentPeer_pShow; - Java_sun_awt_motif_MComponentPeer_removeNativeDropTarget; - Java_sun_awt_motif_MComponentPeer_swapBuffers; - Java_sun_awt_motif_MComponentPeer_pSetBackground; - Java_sun_awt_motif_MComponentPeer_pSetFont; - Java_sun_awt_motif_MComponentPeer_processSynchronousLightweightTransfer; - Java_sun_awt_motif_MComponentPeer__1requestFocus; - Java_sun_awt_motif_MCheckboxMenuItemPeer_getState; - Java_sun_awt_motif_MComponentPeer_pSetForeground; - Java_sun_awt_motif_MDragSourceContextPeer_startDrag; - Java_sun_awt_motif_MDragSourceContextPeer_setNativeCursor; - Java_sun_awt_motif_MDropTargetContextPeer_addTransfer; - Java_sun_awt_motif_MDropTargetContextPeer_dropDone; - Java_sun_awt_motif_MDropTargetContextPeer_startTransfer; - Java_sun_awt_motif_X11DragSourceContextPeer_startDrag; - Java_sun_awt_motif_X11DragSourceContextPeer_setNativeCursor; - Java_sun_awt_motif_X11DropTargetContextPeer_sendResponse; - Java_sun_awt_motif_X11DropTargetContextPeer_dropDone; - Java_sun_awt_motif_X11DropTargetContextPeer_getData; - Java_sun_awt_motif_MEmbeddedFramePeer_NEFcreate; - Java_sun_awt_motif_MEmbeddedFramePeer_pShowImpl; - Java_sun_awt_motif_MEmbeddedFramePeer_pReshapePrivate; - Java_sun_awt_motif_MEmbeddedFramePeer_getBoundsPrivate; - Java_sun_awt_motif_MFramePeer_pSetIconImage___3B_3I_3SII; - Java_sun_awt_motif_MEmbeddedFramePeer_requestXEmbedFocus; - Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedApplicationActive; - Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedActive; - Java_sun_awt_motif_MEmbeddedFrame_getWidget; - Java_sun_awt_motif_MEmbeddedFrame_mapWidget; - Java_sun_awt_motif_MFileDialogPeer_create; - Java_sun_awt_motif_MFileDialogPeer_pDispose; - Java_sun_awt_motif_MFileDialogPeer_pHide; - Java_sun_awt_motif_MFileDialogPeer_pReshape; - Java_sun_awt_motif_MFileDialogPeer_pShow; - Java_sun_awt_motif_MFileDialogPeer_setFileEntry; - Java_sun_awt_motif_MFileDialogPeer_setFont; - Java_sun_awt_motif_MFramePeer_pGetIconSize; - Java_sun_awt_motif_MGlobalCursorManager_cacheInit; - Java_sun_awt_motif_MGlobalCursorManager_findComponentAt; - Java_sun_awt_motif_MGlobalCursorManager_findHeavyweightUnderCursor; - Java_sun_awt_motif_MGlobalCursorManager_getCursorPos; - Java_sun_awt_motif_MGlobalCursorManager_getLocationOnScreen; - Java_sun_awt_motif_MLabelPeer_create; - Java_sun_awt_motif_MLabelPeer_setAlignment; - Java_sun_awt_motif_MLabelPeer_setText; - Java_sun_awt_motif_MListPeer_addItem; - Java_sun_awt_motif_MListPeer_create; - Java_sun_awt_motif_MListPeer_delItems; - Java_sun_awt_motif_MListPeer_deselect; - Java_sun_awt_motif_MListPeer_isSelected; - Java_sun_awt_motif_MListPeer_makeVisible; - Java_sun_awt_motif_MListPeer_select; - Java_sun_awt_motif_MListPeer_setMultipleSelections; - Java_sun_awt_motif_MMenuBarPeer_create; - Java_sun_awt_motif_MMenuItemPeer_createMenuItem; - Java_sun_awt_motif_MMenuItemPeer_pDisable; - Java_sun_awt_motif_MMenuItemPeer_pDispose; - Java_sun_awt_motif_MMenuItemPeer_pEnable; - Java_sun_awt_motif_MMenuItemPeer_pSetLabel; - Java_sun_awt_motif_MMenuPeer_createMenu; - Java_sun_awt_motif_MMenuPeer_createSubMenu; - Java_sun_awt_motif_MMenuPeer_pDispose; - Java_sun_awt_motif_MPopupMenuPeer_createMenu; - Java_sun_awt_motif_MPopupMenuPeer_pDispose; - Java_sun_awt_motif_MPopupMenuPeer_pShow; - Java_sun_awt_motif_MRobotPeer_getRGBPixelsImpl; - Java_sun_awt_motif_MRobotPeer_keyPressImpl; - Java_sun_awt_motif_MRobotPeer_keyReleaseImpl; - Java_sun_awt_motif_MRobotPeer_mouseMoveImpl; - Java_sun_awt_motif_MRobotPeer_mousePressImpl; - Java_sun_awt_motif_MRobotPeer_mouseReleaseImpl; - Java_sun_awt_motif_MRobotPeer_mouseWheelImpl; - Java_sun_awt_motif_MRobotPeer_setup; - Java_sun_awt_motif_MScrollbarPeer_create; - Java_sun_awt_motif_MScrollbarPeer_setLineIncrement; - Java_sun_awt_motif_MScrollbarPeer_setPageIncrement; - Java_sun_awt_motif_MScrollbarPeer_pSetValues; - Java_sun_awt_motif_MScrollPanePeer_create; - Java_sun_awt_motif_MScrollPanePeer_pGetBlockIncrement; - Java_sun_awt_motif_MScrollPanePeer_pGetScrollbarSpace; - Java_sun_awt_motif_MScrollPanePeer_pGetShadow; - Java_sun_awt_motif_MScrollPanePeer_pInsets; - Java_sun_awt_motif_MScrollPanePeer_pSetIncrement; - Java_sun_awt_motif_MScrollPanePeer_pSetScrollChild; - Java_sun_awt_motif_MScrollPanePeer_setScrollPosition; - Java_sun_awt_motif_MTextAreaPeer_initIDs; - Java_sun_awt_motif_MTextAreaPeer_pCreate; - Java_sun_awt_motif_MTextAreaPeer_getCaretPosition; - Java_sun_awt_motif_MTextAreaPeer_getExtraHeight; - Java_sun_awt_motif_MTextAreaPeer_getExtraWidth; - Java_sun_awt_motif_MTextAreaPeer_getSelectionEnd; - Java_sun_awt_motif_MTextAreaPeer_getSelectionStart; - Java_sun_awt_motif_MTextAreaPeer_getText; - Java_sun_awt_motif_MTextAreaPeer_insert; - Java_sun_awt_motif_MTextAreaPeer_pMakeCursorVisible; - Java_sun_awt_motif_MTextAreaPeer_pSetEditable; - Java_sun_awt_motif_MTextAreaPeer_pShow2; - Java_sun_awt_motif_MTextAreaPeer_replaceRange; - Java_sun_awt_motif_MTextAreaPeer_select; - Java_sun_awt_motif_MTextAreaPeer_setCaretPosition; - Java_sun_awt_motif_MTextAreaPeer_setFont; - Java_sun_awt_motif_MTextAreaPeer_setText; - Java_sun_awt_motif_MTextAreaPeer_setTextBackground; - Java_sun_awt_motif_MTextFieldPeer_initIDs; - Java_sun_awt_motif_MTextFieldPeer_pCreate; - Java_sun_awt_motif_MTextFieldPeer_getCaretPosition; - Java_sun_awt_motif_MTextFieldPeer_getSelectionEnd; - Java_sun_awt_motif_MTextFieldPeer_getSelectionStart; - Java_sun_awt_motif_MTextFieldPeer_getText; - Java_sun_awt_motif_MTextFieldPeer_insertReplaceText; - Java_sun_awt_motif_MTextFieldPeer_preDispose; - Java_sun_awt_motif_MTextFieldPeer_pSetEditable; - Java_sun_awt_motif_MTextFieldPeer_select; - Java_sun_awt_motif_MTextFieldPeer_setCaretPosition; - Java_sun_awt_motif_MTextFieldPeer_setEchoChar; - Java_sun_awt_motif_MTextFieldPeer_setFont; - Java_sun_awt_motif_MTextFieldPeer_setText; + #Java_sun_awt_motif_MButtonPeer_create; + #Java_sun_awt_motif_MButtonPeer_setLabel; + #Java_sun_awt_motif_MCanvasPeer_create; + #Java_sun_awt_motif_MCanvasPeer_initIDs; + #Java_sun_awt_motif_MCanvasPeer_resetTargetGC; + #Java_sun_awt_motif_MCheckboxMenuItemPeer_pSetState; + #Java_sun_awt_motif_MCheckboxPeer_create; + #Java_sun_awt_motif_MCheckboxPeer_setCheckboxGroup; + #Java_sun_awt_motif_MCheckboxPeer_setLabel; + #Java_sun_awt_motif_MCheckboxPeer_pSetState; + #Java_sun_awt_motif_MCheckboxPeer_pGetState; + #Java_sun_awt_motif_MChoicePeer_addItem; + #Java_sun_awt_motif_MChoicePeer_appendItems; + #Java_sun_awt_motif_MChoicePeer_create; + #Java_sun_awt_motif_MChoicePeer_pReshape; + #Java_sun_awt_motif_MChoicePeer_remove; + #Java_sun_awt_motif_MChoicePeer_removeAll; + #Java_sun_awt_motif_MChoicePeer_setBackground; + #Java_sun_awt_motif_MChoicePeer_pSelect; + #Java_sun_awt_motif_MChoicePeer_setFont; + #Java_sun_awt_motif_MChoicePeer_setForeground; + #Java_sun_awt_motif_MComponentPeer_addNativeDropTarget; + #Java_sun_awt_motif_MComponentPeer_createBackBuffer; + #Java_sun_awt_motif_MComponentPeer_destroyBackBuffer; + #Java_sun_awt_motif_MComponentPeer_getNativeColor; + #Java_sun_awt_motif_MComponentPeer_getWindow; + #Java_sun_awt_motif_MComponentPeer_pDisable; + #Java_sun_awt_motif_MComponentPeer_pDispose; + #Java_sun_awt_motif_MComponentPeer_pEnable; + #Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen; + #Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen2; + #Java_sun_awt_motif_MComponentPeer_pHide; + #Java_sun_awt_motif_MComponentPeer_pInitialize; + #Java_sun_awt_motif_MComponentPeer_pMakeCursorVisible; + #Java_sun_awt_motif_MComponentPeer_pReshape; + #Java_sun_awt_motif_MComponentPeer_pShow; + #Java_sun_awt_motif_MComponentPeer_removeNativeDropTarget; + #Java_sun_awt_motif_MComponentPeer_swapBuffers; + #Java_sun_awt_motif_MComponentPeer_pSetBackground; + #Java_sun_awt_motif_MComponentPeer_pSetFont; + #Java_sun_awt_motif_MComponentPeer_processSynchronousLightweightTransfer; + #Java_sun_awt_motif_MComponentPeer__1requestFocus; + #Java_sun_awt_motif_MCheckboxMenuItemPeer_getState; + #Java_sun_awt_motif_MComponentPeer_pSetForeground; + #Java_sun_awt_motif_MDragSourceContextPeer_startDrag; + #Java_sun_awt_motif_MDragSourceContextPeer_setNativeCursor; + #Java_sun_awt_motif_MDropTargetContextPeer_addTransfer; + #Java_sun_awt_motif_MDropTargetContextPeer_dropDone; + #Java_sun_awt_motif_MDropTargetContextPeer_startTransfer; + #Java_sun_awt_motif_X11DragSourceContextPeer_startDrag; + #Java_sun_awt_motif_X11DragSourceContextPeer_setNativeCursor; + #Java_sun_awt_motif_X11DropTargetContextPeer_sendResponse; + #Java_sun_awt_motif_X11DropTargetContextPeer_dropDone; + #Java_sun_awt_motif_X11DropTargetContextPeer_getData; + #Java_sun_awt_motif_MEmbeddedFramePeer_NEFcreate; + #Java_sun_awt_motif_MEmbeddedFramePeer_pShowImpl; + #Java_sun_awt_motif_MEmbeddedFramePeer_pReshapePrivate; + #Java_sun_awt_motif_MEmbeddedFramePeer_getBoundsPrivate; + #Java_sun_awt_motif_MFramePeer_pSetIconImage___3B_3I_3SII; + #Java_sun_awt_motif_MEmbeddedFramePeer_requestXEmbedFocus; + #Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedApplicationActive; + #Java_sun_awt_motif_MEmbeddedFramePeer_isXEmbedActive; + #Java_sun_awt_motif_MEmbeddedFrame_getWidget; + #Java_sun_awt_motif_MEmbeddedFrame_mapWidget; + #Java_sun_awt_motif_MFileDialogPeer_create; + #Java_sun_awt_motif_MFileDialogPeer_pDispose; + #Java_sun_awt_motif_MFileDialogPeer_pHide; + #Java_sun_awt_motif_MFileDialogPeer_pReshape; + #Java_sun_awt_motif_MFileDialogPeer_pShow; + #Java_sun_awt_motif_MFileDialogPeer_setFileEntry; + #Java_sun_awt_motif_MFileDialogPeer_setFont; + #Java_sun_awt_motif_MFramePeer_pGetIconSize; + #Java_sun_awt_motif_MGlobalCursorManager_cacheInit; + #Java_sun_awt_motif_MGlobalCursorManager_findComponentAt; + #Java_sun_awt_motif_MGlobalCursorManager_findHeavyweightUnderCursor; + #Java_sun_awt_motif_MGlobalCursorManager_getCursorPos; + #Java_sun_awt_motif_MGlobalCursorManager_getLocationOnScreen; + #Java_sun_awt_motif_MLabelPeer_create; + #Java_sun_awt_motif_MLabelPeer_setAlignment; + #Java_sun_awt_motif_MLabelPeer_setText; + #Java_sun_awt_motif_MListPeer_addItem; + #Java_sun_awt_motif_MListPeer_create; + #Java_sun_awt_motif_MListPeer_delItems; + #Java_sun_awt_motif_MListPeer_deselect; + #Java_sun_awt_motif_MListPeer_isSelected; + #Java_sun_awt_motif_MListPeer_makeVisible; + #Java_sun_awt_motif_MListPeer_select; + #Java_sun_awt_motif_MListPeer_setMultipleSelections; + #Java_sun_awt_motif_MMenuBarPeer_create; + #Java_sun_awt_motif_MMenuItemPeer_createMenuItem; + #Java_sun_awt_motif_MMenuItemPeer_pDisable; + #Java_sun_awt_motif_MMenuItemPeer_pDispose; + #Java_sun_awt_motif_MMenuItemPeer_pEnable; + #Java_sun_awt_motif_MMenuItemPeer_pSetLabel; + #Java_sun_awt_motif_MMenuPeer_createMenu; + #Java_sun_awt_motif_MMenuPeer_createSubMenu; + #Java_sun_awt_motif_MMenuPeer_pDispose; + #Java_sun_awt_motif_MPopupMenuPeer_createMenu; + #Java_sun_awt_motif_MPopupMenuPeer_pDispose; + #Java_sun_awt_motif_MPopupMenuPeer_pShow; + #Java_sun_awt_motif_MRobotPeer_getRGBPixelsImpl; + #Java_sun_awt_motif_MRobotPeer_keyPressImpl; + #Java_sun_awt_motif_MRobotPeer_keyReleaseImpl; + #Java_sun_awt_motif_MRobotPeer_mouseMoveImpl; + #Java_sun_awt_motif_MRobotPeer_mousePressImpl; + #Java_sun_awt_motif_MRobotPeer_mouseReleaseImpl; + #Java_sun_awt_motif_MRobotPeer_mouseWheelImpl; + #Java_sun_awt_motif_MRobotPeer_setup; + #Java_sun_awt_motif_MScrollbarPeer_create; + #Java_sun_awt_motif_MScrollbarPeer_setLineIncrement; + #Java_sun_awt_motif_MScrollbarPeer_setPageIncrement; + #Java_sun_awt_motif_MScrollbarPeer_pSetValues; + #Java_sun_awt_motif_MScrollPanePeer_create; + #Java_sun_awt_motif_MScrollPanePeer_pGetBlockIncrement; + #Java_sun_awt_motif_MScrollPanePeer_pGetScrollbarSpace; + #Java_sun_awt_motif_MScrollPanePeer_pGetShadow; + #Java_sun_awt_motif_MScrollPanePeer_pInsets; + #Java_sun_awt_motif_MScrollPanePeer_pSetIncrement; + #Java_sun_awt_motif_MScrollPanePeer_pSetScrollChild; + #Java_sun_awt_motif_MScrollPanePeer_setScrollPosition; + #Java_sun_awt_motif_MTextAreaPeer_initIDs; + #Java_sun_awt_motif_MTextAreaPeer_pCreate; + #Java_sun_awt_motif_MTextAreaPeer_getCaretPosition; + #Java_sun_awt_motif_MTextAreaPeer_getExtraHeight; + #Java_sun_awt_motif_MTextAreaPeer_getExtraWidth; + #Java_sun_awt_motif_MTextAreaPeer_getSelectionEnd; + #Java_sun_awt_motif_MTextAreaPeer_getSelectionStart; + #Java_sun_awt_motif_MTextAreaPeer_getText; + #Java_sun_awt_motif_MTextAreaPeer_insert; + #Java_sun_awt_motif_MTextAreaPeer_pMakeCursorVisible; + #Java_sun_awt_motif_MTextAreaPeer_pSetEditable; + #Java_sun_awt_motif_MTextAreaPeer_pShow2; + #Java_sun_awt_motif_MTextAreaPeer_replaceRange; + #Java_sun_awt_motif_MTextAreaPeer_select; + #Java_sun_awt_motif_MTextAreaPeer_setCaretPosition; + #Java_sun_awt_motif_MTextAreaPeer_setFont; + #Java_sun_awt_motif_MTextAreaPeer_setText; + #Java_sun_awt_motif_MTextAreaPeer_setTextBackground; + #Java_sun_awt_motif_MTextFieldPeer_initIDs; + #Java_sun_awt_motif_MTextFieldPeer_pCreate; + #Java_sun_awt_motif_MTextFieldPeer_getCaretPosition; + #Java_sun_awt_motif_MTextFieldPeer_getSelectionEnd; + #Java_sun_awt_motif_MTextFieldPeer_getSelectionStart; + #Java_sun_awt_motif_MTextFieldPeer_getText; + #Java_sun_awt_motif_MTextFieldPeer_insertReplaceText; + #Java_sun_awt_motif_MTextFieldPeer_preDispose; + #Java_sun_awt_motif_MTextFieldPeer_pSetEditable; + #Java_sun_awt_motif_MTextFieldPeer_select; + #Java_sun_awt_motif_MTextFieldPeer_setCaretPosition; + #Java_sun_awt_motif_MTextFieldPeer_setEchoChar; + #Java_sun_awt_motif_MTextFieldPeer_setFont; + #Java_sun_awt_motif_MTextFieldPeer_setText; Java_sun_awt_motif_MToolkit_beep; Java_sun_awt_motif_MToolkit_getLockingKeyStateNative; Java_sun_awt_motif_MToolkit_getMulticlickTime; @@ -357,28 +357,28 @@ Java_sun_awt_motif_MToolkit_sync; Java_sun_awt_motif_MToolkit_isAlwaysOnTopSupported; Java_sun_awt_motif_MWindowAttributes_initIDs; - Java_sun_awt_motif_MWindowPeer_pDispose; - Java_sun_awt_motif_MWindowPeer_pHide; - Java_sun_awt_motif_MWindowPeer_pReshape; - Java_sun_awt_motif_MWindowPeer_pSetTitle; - Java_sun_awt_motif_MWindowPeer_pShow; - Java_sun_awt_motif_MWindowPeer_setResizable; - Java_sun_awt_motif_MWindowPeer_toBack; - Java_sun_awt_motif_MWindowPeer_addTextComponentNative; - Java_sun_awt_motif_MWindowPeer_getState; - Java_sun_awt_motif_MWindowPeer_pSetIMMOption; - Java_sun_awt_motif_MWindowPeer_pSetMenuBar; - Java_sun_awt_motif_MWindowPeer_pShowModal; - Java_sun_awt_motif_MWindowPeer_removeTextComponentNative; - Java_sun_awt_motif_MWindowPeer_setSaveUnder; - Java_sun_awt_motif_MWindowPeer_setState; - Java_sun_awt_motif_MWindowPeer_resetTargetGC; - Java_sun_awt_motif_MWindowPeer_registerX11DropTarget; - Java_sun_awt_motif_MWindowPeer_unregisterX11DropTarget; - Java_sun_awt_motif_MWindowPeer_updateAlwaysOnTop; - Java_sun_awt_motif_X11CustomCursor_cacheInit; - Java_sun_awt_motif_X11CustomCursor_createCursor; - Java_sun_awt_motif_X11CustomCursor_queryBestCursor; + #Java_sun_awt_motif_MWindowPeer_pDispose; + #Java_sun_awt_motif_MWindowPeer_pHide; + #Java_sun_awt_motif_MWindowPeer_pReshape; + #Java_sun_awt_motif_MWindowPeer_pSetTitle; + #Java_sun_awt_motif_MWindowPeer_pShow; + #Java_sun_awt_motif_MWindowPeer_setResizable; + #Java_sun_awt_motif_MWindowPeer_toBack; + #Java_sun_awt_motif_MWindowPeer_addTextComponentNative; + #Java_sun_awt_motif_MWindowPeer_getState; + #Java_sun_awt_motif_MWindowPeer_pSetIMMOption; + #Java_sun_awt_motif_MWindowPeer_pSetMenuBar; + #Java_sun_awt_motif_MWindowPeer_pShowModal; + #Java_sun_awt_motif_MWindowPeer_removeTextComponentNative; + #Java_sun_awt_motif_MWindowPeer_setSaveUnder; + #Java_sun_awt_motif_MWindowPeer_setState; + #Java_sun_awt_motif_MWindowPeer_resetTargetGC; + #Java_sun_awt_motif_MWindowPeer_registerX11DropTarget; + #Java_sun_awt_motif_MWindowPeer_unregisterX11DropTarget; + #Java_sun_awt_motif_MWindowPeer_updateAlwaysOnTop; + #Java_sun_awt_motif_X11CustomCursor_cacheInit; + #Java_sun_awt_motif_X11CustomCursor_createCursor; + #Java_sun_awt_motif_X11CustomCursor_queryBestCursor; Java_sun_awt_motif_X11FontMetrics_bytesWidth; Java_sun_awt_motif_X11FontMetrics_getMFCharsWidth; Java_sun_awt_motif_X11FontMetrics_init; @@ -387,18 +387,18 @@ Java_sun_awt_X11InputMethod_resetXIC; Java_sun_awt_X11InputMethod_setCompositionEnabledNative; Java_sun_awt_X11InputMethod_turnoffStatusWindow; - Java_sun_awt_motif_MInputMethod_openXIMNative; - Java_sun_awt_motif_MInputMethod_configureStatusAreaNative; - Java_sun_awt_motif_MInputMethod_createXICNative; - Java_sun_awt_motif_MInputMethod_reconfigureXICNative; - Java_sun_awt_motif_MInputMethod_setXICFocusNative; - Java_sun_awt_motif_X11Clipboard_getClipboardData; - Java_sun_awt_motif_X11Clipboard_getClipboardFormats; - Java_sun_awt_motif_X11Clipboard_registerClipboardViewer; - Java_sun_awt_motif_X11Clipboard_unregisterClipboardViewer; - Java_sun_awt_motif_X11Selection_init; - Java_sun_awt_motif_X11Selection_pGetSelectionOwnership; - Java_sun_awt_motif_X11Selection_clearNativeContext; + #Java_sun_awt_motif_MInputMethod_openXIMNative; + #Java_sun_awt_motif_MInputMethod_configureStatusAreaNative; + #Java_sun_awt_motif_MInputMethod_createXICNative; + #Java_sun_awt_motif_MInputMethod_reconfigureXICNative; + #Java_sun_awt_motif_MInputMethod_setXICFocusNative; + #Java_sun_awt_motif_X11Clipboard_getClipboardData; + #Java_sun_awt_motif_X11Clipboard_getClipboardFormats; + #Java_sun_awt_motif_X11Clipboard_registerClipboardViewer; + #Java_sun_awt_motif_X11Clipboard_unregisterClipboardViewer; + #Java_sun_awt_motif_X11Selection_init; + #Java_sun_awt_motif_X11Selection_pGetSelectionOwnership; + #Java_sun_awt_motif_X11Selection_clearNativeContext; Java_sun_awt_SunToolkit_closeSplashScreen; Java_sun_awt_PlatformFont_initIDs; Java_sun_awt_X11GraphicsConfig_init; @@ -442,40 +442,40 @@ Java_java_awt_Insets_initIDs; Java_java_awt_TextField_initIDs; Java_java_awt_Window_initIDs; - Java_sun_awt_motif_MCheckboxPeer_getIndicatorSize; - Java_sun_awt_motif_MCheckboxPeer_getSpacing; - Java_sun_awt_motif_MChoicePeer_freeNativeData; - Java_sun_awt_motif_MComponentPeer_getComponents_1NoClientCode; - Java_sun_awt_motif_MComponentPeer_getParent_1NoClientCode; - Java_sun_awt_motif_MComponentPeer_initIDs; - Java_sun_awt_motif_MComponentPeer_nativeHandleEvent; - Java_sun_awt_motif_MComponentPeer_pSetCursor; - Java_sun_awt_motif_MComponentPeer_pSetInnerForeground; - Java_sun_awt_motif_MComponentPeer_pSetScrollbarBackground; - Java_sun_awt_motif_MComponentPeer_setTargetBackground; - Java_sun_awt_motif_MDataTransferer_dragQueryFile; - Java_sun_awt_motif_MDataTransferer_getAtomForTarget; - Java_sun_awt_motif_MDataTransferer_getTargetNameForAtom; - Java_sun_awt_motif_MFileDialogPeer_insertReplaceFileDialogText; + #Java_sun_awt_motif_MCheckboxPeer_getIndicatorSize; + #Java_sun_awt_motif_MCheckboxPeer_getSpacing; + #Java_sun_awt_motif_MChoicePeer_freeNativeData; + #Java_sun_awt_motif_MComponentPeer_getComponents_1NoClientCode; + #Java_sun_awt_motif_MComponentPeer_getParent_1NoClientCode; + #Java_sun_awt_motif_MComponentPeer_initIDs; + #Java_sun_awt_motif_MComponentPeer_nativeHandleEvent; + #Java_sun_awt_motif_MComponentPeer_pSetCursor; + #Java_sun_awt_motif_MComponentPeer_pSetInnerForeground; + #Java_sun_awt_motif_MComponentPeer_pSetScrollbarBackground; + #Java_sun_awt_motif_MComponentPeer_setTargetBackground; + #Java_sun_awt_motif_MDataTransferer_dragQueryFile; + #Java_sun_awt_motif_MDataTransferer_getAtomForTarget; + #Java_sun_awt_motif_MDataTransferer_getTargetNameForAtom; + #Java_sun_awt_motif_MFileDialogPeer_insertReplaceFileDialogText; Java_sun_awt_motif_MFontPeer_initIDs; - Java_sun_awt_motif_MListPeer_setBackground; - Java_sun_awt_motif_MMenuBarPeer_initIDs; - Java_sun_awt_motif_MMenuBarPeer_pDispose; - Java_sun_awt_motif_MMenuItemPeer_getParent_1NoClientCode; - Java_sun_awt_motif_MMenuItemPeer_initIDs; - Java_sun_awt_motif_MMenuItemPeer_pSetShortcut; - Java_sun_awt_motif_MPopupMenuPeer_initIDs; - Java_sun_awt_motif_MScrollbarPeer_initIDs; - Java_sun_awt_motif_MScrollPanePeer_initIDs; - Java_sun_awt_motif_MTextAreaPeer_pSetCursor; + #Java_sun_awt_motif_MListPeer_setBackground; + #Java_sun_awt_motif_MMenuBarPeer_initIDs; + #Java_sun_awt_motif_MMenuBarPeer_pDispose; + #Java_sun_awt_motif_MMenuItemPeer_getParent_1NoClientCode; + #Java_sun_awt_motif_MMenuItemPeer_initIDs; + #Java_sun_awt_motif_MMenuItemPeer_pSetShortcut; + #Java_sun_awt_motif_MPopupMenuPeer_initIDs; + #Java_sun_awt_motif_MScrollbarPeer_initIDs; + #Java_sun_awt_motif_MScrollPanePeer_initIDs; + #Java_sun_awt_motif_MTextAreaPeer_pSetCursor; Java_sun_awt_motif_MToolkit_shutdown; - Java_sun_awt_motif_MWindowPeer_initIDs; - Java_sun_awt_motif_MWindowPeer_pCreate; - Java_sun_awt_motif_MWindowPeer_wrapInSequenced; + #Java_sun_awt_motif_MWindowPeer_initIDs; + #Java_sun_awt_motif_MWindowPeer_pCreate; + #Java_sun_awt_motif_MWindowPeer_wrapInSequenced; Java_sun_awt_motif_X11FontMetrics_initIDs; - Java_sun_awt_X11InputMethod_initIDs; + #Java_sun_awt_X11InputMethod_initIDs; Java_sun_awt_motif_X11OffScreenImage_updateBitmask; - Java_sun_awt_motif_X11Selection_initIDs; + #Java_sun_awt_motif_X11Selection_initIDs; Java_sun_awt_motif_MToolkitThreadBlockedHandler_enter; Java_sun_awt_motif_MToolkitThreadBlockedHandler_exit; Java_sun_awt_X11GraphicsConfig_init; @@ -503,26 +503,26 @@ Java_sun_awt_X11SurfaceData_isDgaAvailable; Java_sun_awt_X11SurfaceData_setInvalid; Java_sun_awt_X11SurfaceData_flushNativeSurface; - Java_sun_awt_motif_MEmbedCanvasPeer_initXEmbedServer; - Java_sun_awt_motif_MEmbedCanvasPeer_destroyXEmbedServer; - Java_sun_awt_motif_MEmbedCanvasPeer_isXEmbedActive; - Java_sun_awt_motif_MEmbedCanvasPeer_initDispatching; - Java_sun_awt_motif_MEmbedCanvasPeer_endDispatching; - Java_sun_awt_motif_MEmbedCanvasPeer_embedChild; - Java_sun_awt_motif_MEmbedCanvasPeer_childDestroyed; - Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedPreferredSize; - Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedMinimumSize; - Java_sun_awt_motif_MEmbedCanvasPeer_getClientBounds; - Java_sun_awt_motif_MEmbedCanvasPeer_notifyChildEmbedded; - Java_sun_awt_motif_MEmbedCanvasPeer_detachChild; - Java_sun_awt_motif_MEmbedCanvasPeer_forwardKeyEvent; - Java_sun_awt_motif_MEmbedCanvasPeer_getAWTKeyCodeForKeySym; - Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__I; - Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__IJJJ; - Java_sun_awt_motif_MEmbedCanvasPeer_getWindow; - Java_sun_awt_motif_MEmbedCanvasPeer_forwardEventToEmbedded; - Java_sun_awt_motif_GrabbedKey_initKeySymAndModifiers; - Java_sun_awt_motif_MEmbeddedFramePeer_traverseOut; + #Java_sun_awt_motif_MEmbedCanvasPeer_initXEmbedServer; + #Java_sun_awt_motif_MEmbedCanvasPeer_destroyXEmbedServer; + #Java_sun_awt_motif_MEmbedCanvasPeer_isXEmbedActive; + #Java_sun_awt_motif_MEmbedCanvasPeer_initDispatching; + #Java_sun_awt_motif_MEmbedCanvasPeer_endDispatching; + #Java_sun_awt_motif_MEmbedCanvasPeer_embedChild; + #Java_sun_awt_motif_MEmbedCanvasPeer_childDestroyed; + #Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedPreferredSize; + #Java_sun_awt_motif_MEmbedCanvasPeer_getEmbedMinimumSize; + #Java_sun_awt_motif_MEmbedCanvasPeer_getClientBounds; + #Java_sun_awt_motif_MEmbedCanvasPeer_notifyChildEmbedded; + #Java_sun_awt_motif_MEmbedCanvasPeer_detachChild; + #Java_sun_awt_motif_MEmbedCanvasPeer_forwardKeyEvent; + #Java_sun_awt_motif_MEmbedCanvasPeer_getAWTKeyCodeForKeySym; + #Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__I; + #Java_sun_awt_motif_MEmbedCanvasPeer_sendMessage__IJJJ; + #Java_sun_awt_motif_MEmbedCanvasPeer_getWindow; + #Java_sun_awt_motif_MEmbedCanvasPeer_forwardEventToEmbedded; + #Java_sun_awt_motif_GrabbedKey_initKeySymAndModifiers; + #Java_sun_awt_motif_MEmbeddedFramePeer_traverseOut; awt_display; awt_lock; awt_Lock; diff -r 90cf935adb35 -r 715cf9378c53 jdk/make/sun/awt/mawt.gmk --- a/jdk/make/sun/awt/mawt.gmk Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/make/sun/awt/mawt.gmk Mon Aug 25 13:58:15 2008 -0700 @@ -28,14 +28,6 @@ # INIT += $(LIB_LOCATION) -ifndef HEADLESS -ifeq ($(PLATFORM), linux) -ifeq ($(STATIC_MOTIF),false) -INIT += $(LIB_LOCATION)/libXm.so -endif -endif -endif - # # Files # @@ -52,13 +44,9 @@ ifdef HEADLESS FILES_c = $(FILES_NO_MOTIF_c) else - FILES_c = $(FILES_MOTIF_c) $(FILES_NO_MOTIF_c) - - ifeq ($(MOTIF_VERSION), 2) - FILES_c += awt_motif21.c - FILES_c += awt_Choice21.c - endif - +# FILES_c = $(FILES_MOTIF_c) $(FILES_NO_MOTIF_c) +# XXX if in FILES_MOTIF_c there are unrelated to motif stuff, create a separate list! + FILES_c = $(FILES_NO_MOTIF_c) endif ifeq ($(PLATFORM), solaris) @@ -93,15 +81,6 @@ $(LIB_LOCATION): $(MKDIR) -p $@ -ifeq ($(PLATFORM), linux) -ifeq ($(STATIC_MOTIF),false) -$(LIB_LOCATION)/libXm.so: - $(CP) $(MOTIF_LIB)/libXm.so $(LIB_LOCATION)/libXm.so -# Automounter problem makes the link fail on Redhat 6.1. -# $(LN) -s $(MOTIF_LIB)/libXm.so $(LIB_LOCATION)/libXm.so -endif -endif - clean:: # @@ -135,33 +114,49 @@ CPPFLAGS += -DHEADLESS=$(HEADLESS) OTHER_LDLIBS = else -CFLAGS += -DMOTIF_VERSION=$(MOTIF_VERSION) +#CFLAGS += -DMOTIF_VERSION=$(MOTIF_VERSION) -ifeq ($(STATIC_MOTIF),true) - LIBXM = $(MOTIF_LIB)/libXm.a -lXp -lXmu - ifeq ($(PLATFORM), linux) - ifeq ($(ARCH_DATA_MODEL), 64) - LIBXT = -lXt - else - # Allows for builds on Debian GNU Linux, X11 is in a different place - LIBXT = $(firstword $(wildcard /usr/X11R6/lib/libXt.a) \ - $(wildcard /usr/lib/libXt.a)) - LIBSM = $(firstword $(wildcard /usr/X11R6/lib/libSM.a) \ - $(wildcard /usr/lib/libSM.a)) - LIBICE = $(firstword $(wildcard /usr/X11R6/lib/libICE.a) \ - $(wildcard /usr/lib/libICE.a)) - endif - endif -else - LIBXM = -L$(MOTIF_LIB) -lXm -lXp - ifeq ($(PLATFORM), linux) - LIBXT = -lXt - LIBSM = - LIBICE = - endif -endif +#ifeq ($(STATIC_MOTIF),true) +# LIBXM = $(MOTIF_LIB)/libXm.a -lXp -lXmu +# ifeq ($(PLATFORM), linux) +# ifeq ($(ARCH_DATA_MODEL), 64) +# LIBXT = -lXt +# else +# # Allows for builds on Debian GNU Linux, X11 is in a different place +# LIBXT = $(firstword $(wildcard /usr/X11R6/lib/libXt.a) \ +# $(wildcard /usr/lib/libXt.a)) +# LIBSM = $(firstword $(wildcard /usr/X11R6/lib/libSM.a) \ +# $(wildcard /usr/lib/libSM.a)) +# LIBICE = $(firstword $(wildcard /usr/X11R6/lib/libICE.a) \ +# $(wildcard /usr/lib/libICE.a)) +# endif +# endif +#else +# LIBXM = -L$(MOTIF_LIB) -lXm -lXp +# ifeq ($(PLATFORM), linux) +# LIBXT = -lXt +# LIBSM = +# LIBICE = +# endif +#endif LIBXTST = -lXtst +ifeq ($(PLATFORM), linux) + ifeq ($(ARCH_DATA_MODEL), 64) + # XXX what about the rest of them? + LIBXT = -lXt + else + # Allows for builds on Debian GNU Linux, X11 is in a different place + LIBXT = $(firstword $(wildcard /usr/X11R6/lib/libXt.a) \ + $(wildcard /usr/lib/libXt.a)) + LIBSM = $(firstword $(wildcard /usr/X11R6/lib/libSM.a) \ + $(wildcard /usr/lib/libSM.a)) + LIBICE = $(firstword $(wildcard /usr/X11R6/lib/libICE.a) \ + $(wildcard /usr/lib/libICE.a)) + LIBXTST = $(firstword $(wildcard /usr/X11R6/lib/libXtst.a) \ + $(wildcard /usr/lib/libXtst.a)) + endif +endif # Use -lXmu for EditRes support LIBXMU_DBG = -lXmu @@ -169,14 +164,14 @@ LIBXMU = $(LIBXMU_$(VARIANT)) ifeq ($(PLATFORM), solaris) -OTHER_LDLIBS = $(LIBXM) -lXt -lXext $(LIBXTST) $(LIBXMU) -lX11 -lXi +OTHER_LDLIBS = -lXt -lXext $(LIBXTST) $(LIBXMU) -lX11 -lXi endif ifeq ($(PLATFORM), linux) OTHER_CFLAGS += -DMLIB_NO_LIBSUNMATH -OTHER_CFLAGS += -DMOTIF_VERSION=2 +# XXX what is this define below? Isn't it motif-related? OTHER_CFLAGS += -DXMSTRINGDEFINES=1 -OTHER_LDLIBS = $(LIBXM) $(LIBXMU) $(LIBXTST) -lXext $(LIBXT) $(LIBSM) $(LIBICE) -lX11 -lXi +OTHER_LDLIBS = $(LIBXMU) $(LIBXTST) -lXext $(LIBXT) $(LIBSM) $(LIBICE) -lX11 -lXi endif endif @@ -199,9 +194,8 @@ CPPFLAGS += -I$(CUPS_HEADERS_PATH) ifndef HEADLESS -CPPFLAGS += -I$(MOTIF_DIR)/include \ - -I$(OPENWIN_HOME)/include -LDFLAGS += -L$(MOTIF_LIB) -L$(OPENWIN_LIB) +CPPFLAGS += -I$(OPENWIN_HOME)/include +LDFLAGS += -L$(OPENWIN_LIB) endif # !HEADLESS diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Button.java --- a/jdk/src/share/classes/java/awt/Button.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Button.java Mon Aug 25 13:58:15 2008 -0700 @@ -213,8 +213,8 @@ } // This could change the preferred size of the Component. - if (testvalid && valid) { - invalidate(); + if (testvalid) { + invalidateIfValid(); } } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Checkbox.java --- a/jdk/src/share/classes/java/awt/Checkbox.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Checkbox.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1995-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 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 @@ -284,8 +284,8 @@ } // This could change the preferred size of the Component. - if (testvalid && valid) { - invalidate(); + if (testvalid) { + invalidateIfValid(); } } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Choice.java --- a/jdk/src/share/classes/java/awt/Choice.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Choice.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1995-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 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 @@ -207,9 +207,7 @@ } // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** @@ -269,9 +267,7 @@ } // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** @@ -299,9 +295,7 @@ } // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** @@ -323,9 +317,7 @@ } // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** @@ -367,9 +359,7 @@ } // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Component.java --- a/jdk/src/share/classes/java/awt/Component.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Component.java Mon Aug 25 13:58:15 2008 -0700 @@ -350,7 +350,7 @@ * @see #validate * @see #invalidate */ - volatile boolean valid = false; + private volatile boolean valid = false; /** * The DropTarget associated with this component. @@ -639,11 +639,21 @@ */ private PropertyChangeSupport changeSupport; - // Note: this field is considered final, though readObject() prohibits - // initializing final fields. - private transient Object changeSupportLock = new Object(); - private Object getChangeSupportLock() { - return changeSupportLock; + /* + * In some cases using "this" as an object to synchronize by + * can lead to a deadlock if client code also uses synchronization + * by a component object. For every such situation revealed we should + * consider possibility of replacing "this" with the package private + * objectLock object introduced below. So far there're 2 issues known: + * - CR 6708322 (the getName/setName methods); + * - CR 6608764 (the PropertyChangeListener machinery). + * + * Note: this field is considered final, though readObject() prohibits + * initializing final fields. + */ + private transient Object objectLock = new Object(); + Object getObjectLock() { + return objectLock; } boolean isPacked = false; @@ -816,7 +826,7 @@ */ public String getName() { if (name == null && !nameExplicitlySet) { - synchronized(this) { + synchronized(getObjectLock()) { if (name == null && !nameExplicitlySet) name = constructComponentName(); } @@ -833,7 +843,7 @@ */ public void setName(String name) { String oldName; - synchronized(this) { + synchronized(getObjectLock()) { oldName = this.name; this.name = name; nameExplicitlySet = true; @@ -1708,9 +1718,9 @@ // This could change the preferred size of the Component. // Fix for 6213660. Should compare old and new fonts and do not // call invalidate() if they are equal. - if (valid && f != oldFont && (oldFont == null || + if (f != oldFont && (oldFont == null || !oldFont.equals(f))) { - invalidate(); + invalidateIfValid(); } } @@ -1767,9 +1777,7 @@ firePropertyChange("locale", oldValue, l); // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** @@ -2078,8 +2086,8 @@ if (resized) { invalidate(); } - if (parent != null && parent.valid) { - parent.invalidate(); + if (parent != null) { + parent.invalidateIfValid(); } } if (needNotify) { @@ -2135,7 +2143,7 @@ Toolkit.getEventQueue().postEvent(e); } } else { - if (this instanceof Container && ((Container)this).ncomponents > 0) { + if (this instanceof Container && ((Container)this).countComponents() > 0) { boolean enabledOnToolkit = Toolkit.enabledOnToolkit(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK); if (resized) { @@ -2648,7 +2656,8 @@ public void validate() { synchronized (getTreeLock()) { ComponentPeer peer = this.peer; - if (!valid && peer != null) { + boolean wasValid = isValid(); + if (!wasValid && peer != null) { Font newfont = getFont(); Font oldfont = peerFont; if (newfont != oldfont && (oldfont == null @@ -2659,6 +2668,9 @@ peer.layout(); } valid = true; + if (!wasValid) { + mixOnValidating(); + } } } @@ -2687,9 +2699,17 @@ if (!isMaximumSizeSet()) { maxSize = null; } - if (parent != null && parent.valid) { - parent.invalidate(); - } + if (parent != null) { + parent.invalidateIfValid(); + } + } + } + + /** Invalidates the component unless it is already invalid. + */ + final void invalidateIfValid() { + if (isValid()) { + invalidate(); } } @@ -5794,7 +5814,7 @@ } } - transient EventQueueItem[] eventCache; + transient sun.awt.EventQueueItem[] eventCache; /** * @see #isCoalescingEnabled @@ -7545,9 +7565,7 @@ Container rootAncestor = getTraversalRoot(); Component comp = this; while (rootAncestor != null && - !(rootAncestor.isShowing() && - rootAncestor.isFocusable() && - rootAncestor.isEnabled())) + !(rootAncestor.isShowing() && rootAncestor.canBeFocusOwner())) { comp = rootAncestor; rootAncestor = comp.getFocusCycleRootAncestor(); @@ -7596,9 +7614,7 @@ Container rootAncestor = getTraversalRoot(); Component comp = this; while (rootAncestor != null && - !(rootAncestor.isShowing() && - rootAncestor.isFocusable() && - rootAncestor.isEnabled())) + !(rootAncestor.isShowing() && rootAncestor.canBeFocusOwner())) { comp = rootAncestor; rootAncestor = comp.getFocusCycleRootAncestor(); @@ -7777,7 +7793,7 @@ protected String paramString() { String thisName = getName(); String str = (thisName != null? thisName : "") + "," + x + "," + y + "," + width + "x" + height; - if (!valid) { + if (!isValid()) { str += ",invalid"; } if (!visible) { @@ -7905,7 +7921,7 @@ */ public void addPropertyChangeListener( PropertyChangeListener listener) { - synchronized (getChangeSupportLock()) { + synchronized (getObjectLock()) { if (listener == null) { return; } @@ -7931,7 +7947,7 @@ */ public void removePropertyChangeListener( PropertyChangeListener listener) { - synchronized (getChangeSupportLock()) { + synchronized (getObjectLock()) { if (listener == null || changeSupport == null) { return; } @@ -7954,7 +7970,7 @@ * @since 1.4 */ public PropertyChangeListener[] getPropertyChangeListeners() { - synchronized (getChangeSupportLock()) { + synchronized (getObjectLock()) { if (changeSupport == null) { return new PropertyChangeListener[0]; } @@ -7996,7 +8012,7 @@ public void addPropertyChangeListener( String propertyName, PropertyChangeListener listener) { - synchronized (getChangeSupportLock()) { + synchronized (getObjectLock()) { if (listener == null) { return; } @@ -8026,7 +8042,7 @@ public void removePropertyChangeListener( String propertyName, PropertyChangeListener listener) { - synchronized (getChangeSupportLock()) { + synchronized (getObjectLock()) { if (listener == null || changeSupport == null) { return; } @@ -8050,7 +8066,7 @@ */ public PropertyChangeListener[] getPropertyChangeListeners( String propertyName) { - synchronized (getChangeSupportLock()) { + synchronized (getObjectLock()) { if (changeSupport == null) { return new PropertyChangeListener[0]; } @@ -8071,7 +8087,7 @@ protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { PropertyChangeSupport changeSupport; - synchronized (getChangeSupportLock()) { + synchronized (getObjectLock()) { changeSupport = this.changeSupport; } if (changeSupport == null || @@ -8373,7 +8389,7 @@ private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException { - changeSupportLock = new Object(); + objectLock = new Object(); s.defaultReadObject(); @@ -8537,9 +8553,7 @@ firePropertyChange("componentOrientation", oldValue, o); // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** @@ -8575,6 +8589,14 @@ setComponentOrientation(orientation); } + final boolean canBeFocusOwner() { + // It is enabled, visible, focusable. + if (isEnabled() && isDisplayable() && isVisible() && isFocusable()) { + return true; + } + return false; + } + /** * Checks that this component meets the prerequesites to be focus owner: * - it is enabled, visible, focusable @@ -8584,9 +8606,9 @@ * this component as focus owner * @since 1.5 */ - final boolean canBeFocusOwner() { + final boolean canBeFocusOwnerRecursively() { // - it is enabled, visible, focusable - if (!(isEnabled() && isDisplayable() && isVisible() && isFocusable())) { + if (!canBeFocusOwner()) { return false; } @@ -9381,7 +9403,8 @@ */ private boolean areBoundsValid() { Container cont = getContainer(); - return cont == null || cont.isValid() || cont.getLayout() == null; + return cont == null || cont.isValid() + || cont.getLayout() == null; } /** @@ -9652,5 +9675,10 @@ } } + void mixOnValidating() { + // This method gets overriden in the Container. Obviously, a plain + // non-container components don't need to handle validation. + } + // ****************** END OF MIXING CODE ******************************** } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Container.java --- a/jdk/src/share/classes/java/awt/Container.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Container.java Mon Aug 25 13:58:15 2008 -0700 @@ -44,8 +44,6 @@ import java.util.Arrays; import java.util.EventListener; import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; import java.util.Set; import java.util.logging.*; @@ -90,21 +88,14 @@ private static final Logger log = Logger.getLogger("java.awt.Container"); private static final Logger eventLog = Logger.getLogger("java.awt.event.Container"); - /** - * The number of components in this container. - * This value can be null. - * @see #getComponent - * @see #getComponents - * @see #getComponentCount - */ - int ncomponents; + private static final Component[] EMPTY_ARRAY = new Component[0]; /** * The components in this container. * @see #add * @see #getComponents */ - Component component[] = new Component[0]; + private java.util.List component = new java.util.ArrayList(); /** * Layout manager for this container. @@ -290,7 +281,9 @@ */ @Deprecated public int countComponents() { - return ncomponents; + synchronized (getTreeLock()) { + return component.size(); + } } /** @@ -302,10 +295,10 @@ */ public Component getComponent(int n) { synchronized (getTreeLock()) { - if ((n < 0) || (n >= ncomponents)) { + if ((n < 0) || (n >= component.size())) { throw new ArrayIndexOutOfBoundsException("No such child: " + n); } - return component[n]; + return component.get(n); } } @@ -322,7 +315,7 @@ // DO NOT INVOKE CLIENT CODE ON THIS THREAD! final Component[] getComponents_NoClientCode() { synchronized (getTreeLock()) { - return Arrays.copyOf(component, ncomponents); + return component.toArray(EMPTY_ARRAY); } } // getComponents_NoClientCode() @@ -422,6 +415,29 @@ } /** + * Checks that the component + * isn't supposed to be added into itself. + */ + private void checkAddToSelf(Component comp){ + if (comp instanceof Container) { + for (Container cn = this; cn != null; cn=cn.parent) { + if (cn == comp) { + throw new IllegalArgumentException("adding container's parent to itself"); + } + } + } + } + + /** + * Checks that the component is not a Window instance. + */ + private void checkNotAWindow(Component comp){ + if (comp instanceof Window) { + throw new IllegalArgumentException("adding a window to a container"); + } + } + + /** * Checks that the component comp can be added to this container * Checks : index in bounds of container's size, * comp is not one of this container's parents, @@ -437,26 +453,18 @@ GraphicsConfiguration thisGC = getGraphicsConfiguration(); - if (index > ncomponents || index < 0) { + if (index > component.size() || index < 0) { throw new IllegalArgumentException("illegal component position"); } if (comp.parent == this) { - if (index == ncomponents) { + if (index == component.size()) { throw new IllegalArgumentException("illegal component position " + - index + " should be less then " + ncomponents); + index + " should be less then " + component.size()); } } - if (comp instanceof Container) { - for (Container cn = this; cn != null; cn=cn.parent) { - if (cn == comp) { - throw new IllegalArgumentException("adding container's parent to itself"); - } - } - - if (comp instanceof Window) { - throw new IllegalArgumentException("adding a window to a container"); - } - } + checkAddToSelf(comp); + checkNotAWindow(comp); + Window thisTopLevel = getContainingWindow(); Window compTopLevel = comp.getContainingWindow(); if (thisTopLevel != compTopLevel) { @@ -495,25 +503,17 @@ adjustDescendants(-(comp.countHierarchyMembers())); comp.parent = null; - System.arraycopy(component, index + 1, - component, index, - ncomponents - index - 1); - component[--ncomponents] = null; - - if (valid) { - invalidate(); - } + component.remove(index); + + invalidateIfValid(); } else { - if (newIndex > index) { // 2->4: 012345 -> 013425, 2->5: 012345 -> 013452 - if (newIndex-index > 0) { - System.arraycopy(component, index+1, component, index, newIndex-index); - } - } else { // 4->2: 012345 -> 014235 - if (index-newIndex > 0) { - System.arraycopy(component, newIndex, component, newIndex+1, index-newIndex); - } - } - component[newIndex] = comp; + // We should remove component and then + // add it by the newIndex without newIndex decrement if even we shift components to the left + // after remove. Consult the rules below: + // 2->4: 012345 -> 013425, 2->5: 012345 -> 013452 + // 4->2: 012345 -> 014235 + component.remove(index); + component.add(newIndex, comp); } if (comp.parent == null) { // was actually removed if (containerListener != null || @@ -779,17 +779,11 @@ // Check if moving between containers if (curParent != this) { - /* Add component to list; allocate new array if necessary. */ - if (ncomponents == component.length) { - component = Arrays.copyOf(component, ncomponents * 2 + 1); - } - if (index == -1 || index == ncomponents) { - component[ncomponents++] = comp; + //index == -1 means add to the end. + if (index == -1) { + component.add(comp); } else { - System.arraycopy(component, index, component, - index + 1, ncomponents - index); - component[index] = comp; - ncomponents++; + component.add(index, comp); } comp.parent = this; @@ -799,14 +793,12 @@ comp.numListening(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK)); adjustDescendants(comp.countHierarchyMembers()); } else { - if (index < ncomponents) { - component[index] = comp; + if (index < component.size()) { + component.set(index, comp); } } - if (valid) { - invalidate(); - } + invalidateIfValid(); if (peer != null) { if (comp.peer == null) { // Remove notify was called or it didn't have peer - create new one comp.addNotify(); @@ -860,11 +852,11 @@ // If component is focus owner or parent container of focus owner check that after reparenting // focus owner moved out if new container prohibit this kind of focus owner. - if (comp.isFocusOwner() && !comp.canBeFocusOwner()) { + if (comp.isFocusOwner() && !comp.canBeFocusOwnerRecursively()) { comp.transferFocus(); } else if (comp instanceof Container) { Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); - if (focusOwner != null && isParentOf(focusOwner) && !focusOwner.canBeFocusOwner()) { + if (focusOwner != null && isParentOf(focusOwner) && !focusOwner.canBeFocusOwnerRecursively()) { focusOwner.transferFocus(); } } @@ -901,14 +893,8 @@ if (comp.parent != this) { return -1; } - for (int i = 0; i < ncomponents; i++) { - if (component[i] == comp) { - return i; - } - } + return component.indexOf(comp); } - // To please javac - return -1; } /** @@ -1042,22 +1028,12 @@ */ GraphicsConfiguration thisGC = this.getGraphicsConfiguration(); - if (index > ncomponents || (index < 0 && index != -1)) { + if (index > component.size() || (index < 0 && index != -1)) { throw new IllegalArgumentException( "illegal component position"); } - if (comp instanceof Container) { - for (Container cn = this; cn != null; cn=cn.parent) { - if (cn == comp) { - throw new IllegalArgumentException( - "adding container's parent to itself"); - } - } - if (comp instanceof Window) { - throw new IllegalArgumentException( - "adding a window to a container"); - } - } + checkAddToSelf(comp); + checkNotAWindow(comp); if (thisGC != null) { comp.checkGD(thisGC.getDevice().getIDstring()); } @@ -1065,22 +1041,16 @@ /* Reparent the component and tidy up the tree's state. */ if (comp.parent != null) { comp.parent.remove(comp); - if (index > ncomponents) { + if (index > component.size()) { throw new IllegalArgumentException("illegal component position"); } } - /* Add component to list; allocate new array if necessary. */ - if (ncomponents == component.length) { - component = Arrays.copyOf(component, ncomponents * 2 + 1); - } - if (index == -1 || index == ncomponents) { - component[ncomponents++] = comp; + //index == -1 means add to the end. + if (index == -1) { + component.add(comp); } else { - System.arraycopy(component, index, component, - index + 1, ncomponents - index); - component[index] = comp; - ncomponents++; + component.add(index, comp); } comp.parent = this; @@ -1090,9 +1060,7 @@ comp.numListening(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK)); adjustDescendants(comp.countHierarchyMembers()); - if (valid) { - invalidate(); - } + invalidateIfValid(); if (peer != null) { comp.addNotify(); } @@ -1129,11 +1097,9 @@ * IllegalArgumentException. */ void checkGD(String stringID) { - Component tempComp; - for (int i = 0; i < component.length; i++) { - tempComp= component[i]; - if (tempComp != null) { - tempComp.checkGD(stringID); + for (Component comp : component) { + if (comp != null) { + comp.checkGD(stringID); } } } @@ -1163,10 +1129,10 @@ */ public void remove(int index) { synchronized (getTreeLock()) { - if (index < 0 || index >= ncomponents) { + if (index < 0 || index >= component.size()) { throw new ArrayIndexOutOfBoundsException(index); } - Component comp = component[index]; + Component comp = component.get(index); if (peer != null) { comp.removeNotify(); } @@ -1181,14 +1147,9 @@ adjustDescendants(-(comp.countHierarchyMembers())); comp.parent = null; - System.arraycopy(component, index + 1, - component, index, - ncomponents - index - 1); - component[--ncomponents] = null; - - if (valid) { - invalidate(); - } + component.remove(index); + + invalidateIfValid(); if (containerListener != null || (eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 || Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) { @@ -1229,14 +1190,9 @@ public void remove(Component comp) { synchronized (getTreeLock()) { if (comp.parent == this) { - /* Search backwards, expect that more recent additions - * are more likely to be removed. - */ - Component component[] = this.component; - for (int i = ncomponents; --i >= 0; ) { - if (component[i] == comp) { - remove(i); - } + int index = component.indexOf(comp); + if (index >= 0) { + remove(index); } } } @@ -1258,9 +1214,8 @@ -listeningBoundsChildren); adjustDescendants(-descendantsCount); - while (ncomponents > 0) { - Component comp = component[--ncomponents]; - component[ncomponents] = null; + while (!component.isEmpty()) { + Component comp = component.remove(component.size()-1); if (peer != null) { comp.removeNotify(); @@ -1286,9 +1241,7 @@ if (peer != null && layoutMgr == null && isVisible()) { updateCursorImmediately(); } - if (valid) { - invalidate(); - } + invalidateIfValid(); } } @@ -1300,8 +1253,8 @@ if (eventLog.isLoggable(Level.FINE)) { // Verify listeningChildren is correct int sum = 0; - for (int i = 0; i < ncomponents; i++) { - sum += component[i].numListening(mask); + for (Component comp : component) { + sum += comp.numListening(mask); } if (listeningChildren != sum) { eventLog.log(Level.FINE, "Assertion (listeningChildren == sum) failed"); @@ -1312,8 +1265,8 @@ if (eventLog.isLoggable(Level.FINE)) { // Verify listeningBoundsChildren is correct int sum = 0; - for (int i = 0; i < ncomponents; i++) { - sum += component[i].numListening(mask); + for (Component comp : component) { + sum += comp.numListening(mask); } if (listeningBoundsChildren != sum) { eventLog.log(Level.FINE, "Assertion (listeningBoundsChildren == sum) failed"); @@ -1375,8 +1328,8 @@ if (log.isLoggable(Level.FINE)) { // Verify descendantsCount is correct int sum = 0; - for (int i = 0; i < ncomponents; i++) { - sum += component[i].countHierarchyMembers(); + for (Component comp : component) { + sum += comp.countHierarchyMembers(); } if (descendantsCount != sum) { log.log(Level.FINE, "Assertion (descendantsCount == sum) failed"); @@ -1408,7 +1361,7 @@ int listeners = getListenersCount(id, enabledOnToolkit); for (int count = listeners, i = 0; count > 0; i++) { - count -= component[i].createHierarchyEvents(id, changed, + count -= component.get(i).createHierarchyEvents(id, changed, changedParent, changeFlags, enabledOnToolkit); } return listeners + @@ -1420,13 +1373,13 @@ boolean enabledOnToolkit) { assert Thread.holdsLock(getTreeLock()); - if (ncomponents == 0) { + if (component.isEmpty()) { return; } int listeners = getListenersCount(id, enabledOnToolkit); for (int count = listeners, i = 0; count > 0; i++) { - count -= component[i].createHierarchyEvents(id, this, parent, + count -= component.get(i).createHierarchyEvents(id, this, parent, changeFlags, enabledOnToolkit); } } @@ -1448,9 +1401,7 @@ */ public void setLayout(LayoutManager mgr) { layoutMgr = mgr; - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** @@ -1522,10 +1473,10 @@ */ public void validate() { /* Avoid grabbing lock unless really necessary. */ - if (!valid) { + if (!isValid()) { boolean updateCur = false; synchronized (getTreeLock()) { - if (!valid && peer != null) { + if (!isValid() && peer != null) { ContainerPeer p = null; if (peer instanceof ContainerPeer) { p = (ContainerPeer) peer; @@ -1534,7 +1485,6 @@ p.beginValidate(); } validateTree(); - valid = true; if (p != null) { p.endValidate(); updateCur = isVisible(); @@ -1557,17 +1507,16 @@ * @see #validate */ protected void validateTree() { - if (!valid) { + if (!isValid()) { if (peer instanceof ContainerPeer) { ((ContainerPeer)peer).beginLayout(); } doLayout(); - Component component[] = this.component; - for (int i = 0 ; i < ncomponents ; ++i) { - Component comp = component[i]; + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); if ( (comp instanceof Container) - && !(comp instanceof Window) - && !comp.valid) { + && !(comp instanceof Window) + && !comp.isValid()) { ((Container)comp).validateTree(); } else { comp.validate(); @@ -1577,7 +1526,7 @@ ((ContainerPeer)peer).endLayout(); } } - valid = true; + super.validate(); } /** @@ -1586,20 +1535,16 @@ */ void invalidateTree() { synchronized (getTreeLock()) { - for (int i = 0; i < ncomponents; ++i) { - Component comp = component[i]; + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); if (comp instanceof Container) { ((Container)comp).invalidateTree(); } else { - if (comp.valid) { - comp.invalidate(); - } + comp.invalidateIfValid(); } } - if (valid) { - invalidate(); - } + invalidateIfValid(); } } @@ -1838,7 +1783,7 @@ // super.paint(); -- Don't bother, since it's a NOP. GraphicsCallback.PaintCallback.getInstance(). - runComponents(component, g, GraphicsCallback.LIGHTWEIGHTS); + runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS); } } @@ -1893,7 +1838,7 @@ } GraphicsCallback.PrintCallback.getInstance(). - runComponents(component, g, GraphicsCallback.LIGHTWEIGHTS); + runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS); } } @@ -1906,7 +1851,7 @@ public void paintComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PaintAllCallback.getInstance(). - runComponents(component, g, GraphicsCallback.TWO_PASSES); + runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES); } } @@ -1928,7 +1873,7 @@ void paintHeavyweightComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PaintHeavyweightComponentsCallback.getInstance(). - runComponents(component, g, GraphicsCallback.LIGHTWEIGHTS | + runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS); } } @@ -1942,7 +1887,7 @@ public void printComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PrintAllCallback.getInstance(). - runComponents(component, g, GraphicsCallback.TWO_PASSES); + runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES); } } @@ -1964,7 +1909,7 @@ void printHeavyweightComponents(Graphics g) { if (isShowing()) { GraphicsCallback.PrintHeavyweightComponentsCallback.getInstance(). - runComponents(component, g, GraphicsCallback.LIGHTWEIGHTS | + runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS); } } @@ -2260,11 +2205,9 @@ boolean searchHeavyweightChildren, boolean searchHeavyweightDescendants) { synchronized (getTreeLock()) { - int ncomponents = this.ncomponents; - Component component[] = this.component; - - for (int i = 0 ; i < ncomponents ; i++) { - Component comp = component[i]; + + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); if (comp != null && comp.visible && ((!searchHeavyweightChildren && comp.peer instanceof LightweightPeer) || @@ -2415,8 +2358,8 @@ } synchronized (getTreeLock()) { // Two passes: see comment in sun.awt.SunGraphicsCallback - for (int i = 0 ; i < ncomponents ; i++) { - Component comp = component[i]; + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); if (comp != null && !(comp.peer instanceof LightweightPeer)) { if (comp.contains(x - comp.x, y - comp.y)) { @@ -2424,8 +2367,8 @@ } } } - for (int i = 0 ; i < ncomponents ; i++) { - Component comp = component[i]; + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); if (comp != null && comp.peer instanceof LightweightPeer) { if (comp.contains(x - comp.x, y - comp.y)) { @@ -2544,43 +2487,43 @@ if (!(contains(x, y) && visible && (ignoreEnabled || enabled))) { return null; } - int ncomponents = this.ncomponents; - Component component[] = this.component; // Two passes: see comment in sun.awt.SunGraphicsCallback - for (int i = 0 ; i < ncomponents ; i++) { - Component comp = component[i]; - if (comp != null && - !(comp.peer instanceof LightweightPeer)) { - if (comp instanceof Container) { - comp = ((Container)comp).findComponentAtImpl(x - comp.x, - y - comp.y, - ignoreEnabled); - } else { - comp = comp.locate(x - comp.x, y - comp.y); - } - if (comp != null && comp.visible && - (ignoreEnabled || comp.enabled)) - { - return comp; + synchronized (getTreeLock()) { + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null && + !(comp.peer instanceof LightweightPeer)) { + if (comp instanceof Container) { + comp = ((Container)comp).findComponentAtImpl(x - comp.x, + y - comp.y, + ignoreEnabled); + } else { + comp = comp.locate(x - comp.x, y - comp.y); + } + if (comp != null && comp.visible && + (ignoreEnabled || comp.enabled)) + { + return comp; + } } } - } - for (int i = 0 ; i < ncomponents ; i++) { - Component comp = component[i]; - if (comp != null && - comp.peer instanceof LightweightPeer) { - if (comp instanceof Container) { - comp = ((Container)comp).findComponentAtImpl(x - comp.x, - y - comp.y, - ignoreEnabled); - } else { - comp = comp.locate(x - comp.x, y - comp.y); - } - if (comp != null && comp.visible && - (ignoreEnabled || comp.enabled)) - { - return comp; + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null && + comp.peer instanceof LightweightPeer) { + if (comp instanceof Container) { + comp = ((Container)comp).findComponentAtImpl(x - comp.x, + y - comp.y, + ignoreEnabled); + } else { + comp = comp.locate(x - comp.x, y - comp.y); + } + if (comp != null && comp.visible && + (ignoreEnabled || comp.enabled)) + { + return comp; + } } } } @@ -2632,10 +2575,14 @@ if (! (peer instanceof LightweightPeer)) { dispatcher = new LightweightDispatcher(this); } - int ncomponents = this.ncomponents; - Component component[] = this.component; - for (int i = 0 ; i < ncomponents ; i++) { - component[i].addNotify(); + + // We shouldn't use iterator because of the Swing menu + // implementation specifics: + // the menu is being assigned as a child to JLayeredPane + // instead of particular component so always affect + // collection of component if menu is becoming shown or hidden. + for (int i = 0; i < component.size(); i++) { + component.get(i).addNotify(); } // Update stacking order if native platform allows ContainerPeer cpeer = (ContainerPeer)peer; @@ -2658,21 +2605,25 @@ */ public void removeNotify() { synchronized (getTreeLock()) { - int ncomponents = this.ncomponents; - Component component[] = this.component; - for (int i = ncomponents - 1; i >= 0; i--) { - if( component[i] != null ) { + // We shouldn't use iterator because of the Swing menu + // implementation specifics: + // the menu is being assigned as a child to JLayeredPane + // instead of particular component so always affect + // collection of component if menu is becoming shown or hidden. + for (int i = component.size()-1 ; i >= 0 ; i--) { + Component comp = component.get(i); + if (comp != null) { // Fix for 6607170. // We want to suppress focus change on disposal // of the focused component. But because of focus // is asynchronous, we should suppress focus change // on every component in case it receives native focus // in the process of disposal. - component[i].setAutoFocusTransferOnDisposal(false); - component[i].removeNotify(); - component[i].setAutoFocusTransferOnDisposal(true); - } - } + comp.setAutoFocusTransferOnDisposal(false); + comp.removeNotify(); + comp.setAutoFocusTransferOnDisposal(true); + } + } // If some of the children had focus before disposal then it still has. // Auto-transfer focus to the next (or previous) component if auto-transfer // is enabled. @@ -2683,7 +2634,7 @@ } if ( dispatcher != null ) { dispatcher.dispose(); - dispatcher = null; + dispatcher = null; } super.removeNotify(); } @@ -2873,12 +2824,12 @@ */ public void list(PrintStream out, int indent) { super.list(out, indent); - int ncomponents = this.ncomponents; - Component component[] = this.component; - for (int i = 0 ; i < ncomponents ; i++) { - Component comp = component[i]; - if (comp != null) { - comp.list(out, indent+1); + synchronized(getTreeLock()) { + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null) { + comp.list(out, indent+1); + } } } } @@ -2899,12 +2850,12 @@ */ public void list(PrintWriter out, int indent) { super.list(out, indent); - int ncomponents = this.ncomponents; - Component component[] = this.component; - for (int i = 0 ; i < ncomponents ; i++) { - Component comp = component[i]; - if (comp != null) { - comp.list(out, indent+1); + synchronized(getTreeLock()) { + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + if (comp != null) { + comp.list(out, indent+1); + } } } } @@ -3414,9 +3365,11 @@ */ public void applyComponentOrientation(ComponentOrientation o) { super.applyComponentOrientation(o); - - for (int i = 0 ; i < ncomponents ; ++i) { - component[i].applyComponentOrientation(o); + synchronized (getTreeLock()) { + for (int i = 0; i < component.size(); i++) { + Component comp = component.get(i); + comp.applyComponentOrientation(o); + } } } @@ -3534,8 +3487,8 @@ */ private void writeObject(ObjectOutputStream s) throws IOException { ObjectOutputStream.PutField f = s.putFields(); - f.put("ncomponents", ncomponents); - f.put("component", component); + f.put("ncomponents", component.size()); + f.put("component", component.toArray(EMPTY_ARRAY)); f.put("layoutMgr", layoutMgr); f.put("dispatcher", dispatcher); f.put("maxSize", maxSize); @@ -3574,8 +3527,12 @@ throws ClassNotFoundException, IOException { ObjectInputStream.GetField f = s.readFields(); - ncomponents = f.get("ncomponents", 0); - component = (Component[])f.get("component", new Component[0]); + Component [] tmpComponent = (Component[])f.get("component", EMPTY_ARRAY); + int ncomponents = (Integer) f.get("ncomponents", 0); + component = new java.util.ArrayList(ncomponents); + for (int i = 0; i < ncomponents; ++i) { + component.add(tmpComponent[i]); + } layoutMgr = (LayoutManager)f.get("layoutMgr", null); dispatcher = (LightweightDispatcher)f.get("dispatcher", null); // Old stream. Doesn't contain maxSize among Component's fields. @@ -3585,16 +3542,14 @@ focusCycleRoot = f.get("focusCycleRoot", false); containerSerializedDataVersion = f.get("containerSerializedDataVersion", 1); focusTraversalPolicyProvider = f.get("focusTraversalPolicyProvider", false); - - Component component[] = this.component; - for(int i = 0; i < ncomponents; i++) { - component[i].parent = this; + java.util.List component = this.component; + for(Component comp : component) { + comp.parent = this; adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK, - component[i].numListening(AWTEvent.HIERARCHY_EVENT_MASK)); + comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK)); adjustListeningChildren(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK, - component[i].numListening( - AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK)); - adjustDescendants(component[i].countHierarchyMembers()); + comp.numListening(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK)); + adjustDescendants(comp.countHierarchyMembers()); } Object keyOrNull; @@ -4111,6 +4066,21 @@ } } + @Override + void mixOnValidating() { + synchronized (getTreeLock()) { + if (mixingLog.isLoggable(Level.FINE)) { + mixingLog.fine("this = " + this); + } + + if (hasHeavyweightDescendants()) { + recursiveApplyCurrentShape(); + } + + super.mixOnValidating(); + } + } + // ****************** END OF MIXING CODE ******************************** } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java --- a/jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java Mon Aug 25 13:58:15 2008 -0700 @@ -556,8 +556,7 @@ * enabled, and focusable; false otherwise */ protected boolean accept(Component aComponent) { - if (!(aComponent.isVisible() && aComponent.isDisplayable() && - aComponent.isFocusable() && aComponent.isEnabled())) { + if (!aComponent.canBeFocusOwner()) { return false; } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java --- a/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Mon Aug 25 13:58:15 2008 -0700 @@ -154,7 +154,7 @@ private boolean doRestoreFocus(Component toFocus, Component vetoedComponent, boolean clearOnFailure) { - if (toFocus != vetoedComponent && toFocus.isShowing() && toFocus.isFocusable() && + if (toFocus != vetoedComponent && toFocus.isShowing() && toFocus.canBeFocusOwner() && toFocus.requestFocus(false, CausedFocusEvent.Cause.ROLLBACK)) { return true; @@ -500,8 +500,11 @@ } } - if (!(newFocusOwner.isFocusable() && newFocusOwner.isEnabled() - && newFocusOwner.isShowing())) + if (!(newFocusOwner.isFocusable() && newFocusOwner.isShowing() && + // Refuse focus on a disabled component if the focus event + // isn't of UNKNOWN reason (i.e. not a result of a direct request + // but traversal, activation or system generated). + (newFocusOwner.isEnabled() || cause.equals(CausedFocusEvent.Cause.UNKNOWN)))) { // we should not accept focus on such component, so reject it. dequeueKeyEvents(-1, newFocusOwner); @@ -742,8 +745,7 @@ public boolean dispatchKeyEvent(KeyEvent e) { Component focusOwner = (((AWTEvent)e).isPosted) ? getFocusOwner() : e.getComponent(); - if (focusOwner != null && focusOwner.isShowing() && - focusOwner.isFocusable() && focusOwner.isEnabled()) { + if (focusOwner != null && focusOwner.isShowing() && focusOwner.canBeFocusOwner()) { if (!e.isConsumed()) { Component comp = e.getComponent(); if (comp != null && comp.isEnabled()) { diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Dialog.java --- a/jdk/src/share/classes/java/awt/Dialog.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Dialog.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 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 @@ -1327,8 +1327,8 @@ // the insets of the Dialog. If we could, we'd call invalidate() // from the peer, but we need to guarantee that we're not holding // the Dialog lock when we call invalidate(). - if (testvalid && valid) { - invalidate(); + if (testvalid) { + invalidateIfValid(); } } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/EventQueue.java --- a/jdk/src/share/classes/java/awt/EventQueue.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/EventQueue.java Mon Aug 25 13:58:15 2008 -0700 @@ -42,6 +42,7 @@ import sun.awt.AWTAutoShutdown; import sun.awt.PeerEvent; import sun.awt.SunToolkit; +import sun.awt.EventQueueItem; /** * EventQueue is a platform-independent class @@ -359,7 +360,7 @@ entry != null; entry = entry.next) { // Give Component.coalesceEvents a chance - if (entry.event.getSource() == source && entry.id == id) { + if (entry.event.getSource() == source && entry.event.getID() == id) { AWTEvent coalescedEvent = source.coalesceEvents( entry.event, e); if (coalescedEvent != null) { @@ -499,7 +500,7 @@ for (EventQueueItem entry = queues[i].head, prev = null; entry != null; prev = entry, entry = entry.next) { - if (entry.id == id) { + if (entry.event.getID() == id) { if (prev == null) { queues[i].head = entry.next; } else { @@ -545,7 +546,7 @@ for (int i = NUM_PRIORITIES - 1; i >= 0; i--) { EventQueueItem q = queues[i].head; for (; q != null; q = q.next) { - if (q.id == id) { + if (q.event.getID() == id) { return q.event; } } @@ -1051,14 +1052,3 @@ EventQueueItem head; EventQueueItem tail; } - -class EventQueueItem { - AWTEvent event; - int id; - EventQueueItem next; - - EventQueueItem(AWTEvent evt) { - event = evt; - id = evt.getID(); - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Frame.java --- a/jdk/src/share/classes/java/awt/Frame.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Frame.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1995-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 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 @@ -590,9 +590,7 @@ if (peer != null) { mbManagement = true; menuBar.addNotify(); - if (valid) { - invalidate(); - } + invalidateIfValid(); peer.setMenuBar(menuBar); } } @@ -633,8 +631,8 @@ // the insets of the Frame. If we could, we'd call invalidate() // from the peer, but we need to guarantee that we're not holding // the Frame lock when we call invalidate(). - if (testvalid && valid) { - invalidate(); + if (testvalid) { + invalidateIfValid(); } firePropertyChange("resizable", oldResizable, resizable); } @@ -907,9 +905,7 @@ FramePeer peer = (FramePeer)this.peer; if (peer != null) { mbManagement = true; - if (valid) { - invalidate(); - } + invalidateIfValid(); peer.setMenuBar(null); m.removeNotify(); } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Label.java --- a/jdk/src/share/classes/java/awt/Label.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Label.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1995-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 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 @@ -257,8 +257,8 @@ } // This could change the preferred size of the Component. - if (testvalid && valid) { - invalidate(); + if (testvalid) { + invalidateIfValid(); } } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/ScrollPane.java --- a/jdk/src/share/classes/java/awt/ScrollPane.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/ScrollPane.java Mon Aug 25 13:58:15 2008 -0700 @@ -357,7 +357,7 @@ */ public void setScrollPosition(int x, int y) { synchronized (getTreeLock()) { - if (ncomponents <= 0) { + if (getComponentCount()==0) { throw new NullPointerException("child is null"); } hAdjustable.setValue(x); @@ -393,10 +393,12 @@ */ @Transient public Point getScrollPosition() { - if (ncomponents <= 0) { - throw new NullPointerException("child is null"); + synchronized (getTreeLock()) { + if (getComponentCount()==0) { + throw new NullPointerException("child is null"); + } + return new Point(hAdjustable.getValue(), vAdjustable.getValue()); } - return new Point(hAdjustable.getValue(), vAdjustable.getValue()); } /** @@ -486,26 +488,27 @@ */ @Deprecated public void layout() { - if (ncomponents > 0) { - Component c = getComponent(0); - Point p = getScrollPosition(); - Dimension cs = calculateChildSize(); - Dimension vs = getViewportSize(); - Insets i = getInsets(); + if (getComponentCount()==0) { + return; + } + Component c = getComponent(0); + Point p = getScrollPosition(); + Dimension cs = calculateChildSize(); + Dimension vs = getViewportSize(); + Insets i = getInsets(); - c.reshape(i.left - p.x, i.top - p.y, cs.width, cs.height); - ScrollPanePeer peer = (ScrollPanePeer)this.peer; - if (peer != null) { - peer.childResized(cs.width, cs.height); - } + c.reshape(i.left - p.x, i.top - p.y, cs.width, cs.height); + ScrollPanePeer peer = (ScrollPanePeer)this.peer; + if (peer != null) { + peer.childResized(cs.width, cs.height); + } - // update adjustables... the viewport size may have changed - // with the scrollbars coming or going so the viewport size - // is updated before the adjustables. - vs = getViewportSize(); - hAdjustable.setSpan(0, cs.width, vs.width); - vAdjustable.setSpan(0, cs.height, vs.height); - } + // update adjustables... the viewport size may have changed + // with the scrollbars coming or going so the viewport size + // is updated before the adjustables. + vs = getViewportSize(); + hAdjustable.setSpan(0, cs.width, vs.width); + vAdjustable.setSpan(0, cs.height, vs.height); } /** @@ -515,20 +518,21 @@ * @see Component#printAll */ public void printComponents(Graphics g) { - if (ncomponents > 0) { - Component c = component[0]; - Point p = c.getLocation(); - Dimension vs = getViewportSize(); - Insets i = getInsets(); + if (getComponentCount()==0) { + return; + } + Component c = getComponent(0); + Point p = c.getLocation(); + Dimension vs = getViewportSize(); + Insets i = getInsets(); - Graphics cg = g.create(); - try { - cg.clipRect(i.left, i.top, vs.width, vs.height); - cg.translate(p.x, p.y); - c.printAll(cg); - } finally { - cg.dispose(); - } + Graphics cg = g.create(); + try { + cg.clipRect(i.left, i.top, vs.width, vs.height); + cg.translate(p.x, p.y); + c.printAll(cg); + } finally { + cg.dispose(); } } @@ -589,7 +593,7 @@ default: sdpStr = "invalid display policy"; } - Point p = ncomponents > 0? getScrollPosition() : new Point(0,0); + Point p = (getComponentCount()>0)? getScrollPosition() : new Point(0,0); Insets i = getInsets(); return super.paramString()+",ScrollPosition=("+p.x+","+p.y+")"+ ",Insets=("+i.top+","+i.left+","+i.bottom+","+i.right+")"+ diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/SystemTray.java --- a/jdk/src/share/classes/java/awt/SystemTray.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/SystemTray.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 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 @@ -125,6 +125,8 @@ transient private SystemTrayPeer peer; + private static final TrayIcon[] EMPTY_TRAY_ARRAY = new TrayIcon[0]; + /** * Private SystemTray constructor. * @@ -201,17 +203,18 @@ * functionality is supported for the current platform */ public static boolean isSupported() { - initializeSystemTrayIfNeeded(); - - if (Toolkit.getDefaultToolkit() instanceof SunToolkit) { - - return ((SunToolkit)Toolkit.getDefaultToolkit()).isTraySupported(); - - } else if (Toolkit.getDefaultToolkit() instanceof HeadlessToolkit) { - - return ((HeadlessToolkit)Toolkit.getDefaultToolkit()).isTraySupported(); + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (toolkit instanceof SunToolkit) { + // connecting tray to native resource + initializeSystemTrayIfNeeded(); + return ((SunToolkit)toolkit).isTraySupported(); + } else if (toolkit instanceof HeadlessToolkit) { + // skip initialization as the init routine + // throws HeadlessException + return ((HeadlessToolkit)toolkit).isTraySupported(); + } else { + return false; } - return false; } /** @@ -323,7 +326,7 @@ if (icons != null) { return (TrayIcon[])icons.toArray(new TrayIcon[icons.size()]); } - return new TrayIcon[0]; + return EMPTY_TRAY_ARRAY; } /** @@ -475,7 +478,12 @@ synchronized void addNotify() { if (peer == null) { - peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createSystemTray(this); + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (toolkit instanceof SunToolkit) { + peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createSystemTray(this); + } else if (toolkit instanceof HeadlessToolkit) { + peer = ((HeadlessToolkit)Toolkit.getDefaultToolkit()).createSystemTray(this); + } } } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/TextField.java --- a/jdk/src/share/classes/java/awt/TextField.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/TextField.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1995-2008 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 @@ -296,9 +296,7 @@ super.setText(t); // This could change the preferred size of the Component. - if (valid) { - invalidate(); - } + invalidateIfValid(); } /** diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/TrayIcon.java --- a/jdk/src/share/classes/java/awt/TrayIcon.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/TrayIcon.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2005-2008 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 @@ -38,6 +38,7 @@ import java.awt.peer.TrayIconPeer; import sun.awt.AppContext; import sun.awt.SunToolkit; +import sun.awt.HeadlessToolkit; import java.util.EventObject; /** @@ -142,9 +143,6 @@ */ public TrayIcon(Image image) { this(); - if (image == null) { - throw new IllegalArgumentException("creating TrayIcon with null Image"); - } setImage(image); } @@ -433,7 +431,7 @@ * @see java.awt.event.MouseListener */ public synchronized MouseListener[] getMouseListeners() { - return (MouseListener[])(getListeners(MouseListener.class)); + return AWTEventMulticaster.getListeners(mouseListener, MouseListener.class); } /** @@ -494,7 +492,7 @@ * @see java.awt.event.MouseMotionListener */ public synchronized MouseMotionListener[] getMouseMotionListeners() { - return (MouseMotionListener[]) (getListeners(MouseMotionListener.class)); + return AWTEventMulticaster.getListeners(mouseMotionListener, MouseMotionListener.class); } /** @@ -581,7 +579,7 @@ * @see java.awt.event.ActionListener */ public synchronized ActionListener[] getActionListeners() { - return (ActionListener[])(getListeners(ActionListener.class)); + return AWTEventMulticaster.getListeners(actionListener, ActionListener.class); } /** @@ -635,7 +633,7 @@ TrayIconPeer peer = this.peer; if (peer != null) { - peer.displayMessage(caption, text, messageType.toString()); + peer.displayMessage(caption, text, messageType.name()); } } @@ -657,24 +655,17 @@ // **************************************************************** // **************************************************************** - T[] getListeners(Class listenerType) { - EventListener l = null; - if (listenerType == MouseListener.class) { - l = mouseListener; - } else if (listenerType == MouseMotionListener.class) { - l = mouseMotionListener; - } else if (listenerType == ActionListener.class) { - l = actionListener; - } - return AWTEventMulticaster.getListeners(l, listenerType); - } - void addNotify() throws AWTException { synchronized (this) { if (peer == null) { - peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this); + Toolkit toolkit = Toolkit.getDefaultToolkit(); + if (toolkit instanceof SunToolkit) { + peer = ((SunToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this); + } else if (toolkit instanceof HeadlessToolkit) { + peer = ((HeadlessToolkit)Toolkit.getDefaultToolkit()).createTrayIcon(this); + } } } peer.setToolTip(tooltip); diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/Window.java --- a/jdk/src/share/classes/java/awt/Window.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/Window.java Mon Aug 25 13:58:15 2008 -0700 @@ -3145,9 +3145,7 @@ Component previousComp = temporaryLostComponent; // Check that "component" is an acceptable focus owner and don't store it otherwise // - or later we will have problems with opposite while handling WINDOW_GAINED_FOCUS - if (component == null - || (component.isDisplayable() && component.isVisible() && component.isEnabled() && component.isFocusable())) - { + if (component == null || component.canBeFocusOwner()) { temporaryLostComponent = component; } else { temporaryLostComponent = null; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/java/awt/dnd/DragSourceContext.java --- a/jdk/src/share/classes/java/awt/dnd/DragSourceContext.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/java/awt/dnd/DragSourceContext.java Mon Aug 25 13:58:15 2008 -0700 @@ -486,6 +486,8 @@ Cursor c = null; switch (status) { + default: + targetAct = DnDConstants.ACTION_NONE; case ENTER: case OVER: case CHANGED: @@ -506,10 +508,6 @@ else c = DragSource.DefaultCopyDrop; } - break; - default: - targetAct = DnDConstants.ACTION_NONE; - } setCursorImpl(c); diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/javax/swing/Popup.java --- a/jdk/src/share/classes/javax/swing/Popup.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/Popup.java Mon Aug 25 13:58:15 2008 -0700 @@ -26,7 +26,9 @@ package javax.swing; import java.awt.*; + import sun.awt.ModalExclude; +import sun.awt.SunToolkit; /** * Popups are used to display a Component to the user, typically @@ -225,7 +227,12 @@ HeavyWeightWindow(Window parent) { super(parent); setFocusableWindowState(false); - setName("###overrideRedirect###"); + Toolkit tk = Toolkit.getDefaultToolkit(); + if (tk instanceof SunToolkit) { + // all the short-lived windows like Popups should be + // OverrideRedirect on X11 platforms + ((SunToolkit)tk).setOverrideRedirect(this); + } // Popups are typically transient and most likely won't benefit // from true double buffering. Turn it off here. getRootPane().setUseTrueDoubleBuffering(false); diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/sun/awt/EmbeddedFrame.java --- a/jdk/src/share/classes/sun/awt/EmbeddedFrame.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/sun/awt/EmbeddedFrame.java Mon Aug 25 13:58:15 2008 -0700 @@ -257,21 +257,27 @@ Set toTest; Component currentFocused = e.getComponent(); - Component last = getFocusTraversalPolicy().getLastComponent(this); toTest = getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); - if (toTest.contains(stroke) && (currentFocused == last || last == null)) { - if (traverseOut(FORWARD)) { - e.consume(); - return true; + if (toTest.contains(stroke)) { + // 6581899: performance improvement for SortingFocusTraversalPolicy + Component last = getFocusTraversalPolicy().getLastComponent(this); + if (currentFocused == last || last == null) { + if (traverseOut(FORWARD)) { + e.consume(); + return true; + } } } - Component first = getFocusTraversalPolicy().getFirstComponent(this); toTest = getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); - if (toTest.contains(stroke) && (currentFocused == first || first == null)) { - if (traverseOut(BACKWARD)) { - e.consume(); - return true; + if (toTest.contains(stroke)) { + // 6581899: performance improvement for SortingFocusTraversalPolicy + Component first = getFocusTraversalPolicy().getFirstComponent(this); + if (currentFocused == first || first == null) { + if (traverseOut(BACKWARD)) { + e.consume(); + return true; + } } } return false; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/sun/awt/EventQueueItem.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/sun/awt/EventQueueItem.java Mon Aug 25 13:58:15 2008 -0700 @@ -0,0 +1,37 @@ +/* + * Copyright 2008 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. + */ + +package sun.awt; + +import java.awt.AWTEvent; + +public class EventQueueItem { + public AWTEvent event; + public EventQueueItem next; + + public EventQueueItem(AWTEvent evt) { + event = evt; + } +} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/share/classes/sun/awt/SunToolkit.java --- a/jdk/src/share/classes/sun/awt/SunToolkit.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/share/classes/sun/awt/SunToolkit.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2008 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 @@ -852,6 +852,15 @@ return AccessController.doPrivileged(new GetBooleanAction("sun.awt.erasebackgroundonresize")); } + + /** + * Makes the window OverrideRedirect, on X11 platforms. See + * ICCCM specification for more details about OverrideRedirect + * windows. Implemented in XToolkit, no-op in WToolkit. + */ + public void setOverrideRedirect(Window target) { + } + static SoftCache imgCache = new SoftCache(); static synchronized Image getImageFromHash(Toolkit tk, URL url) { @@ -2039,12 +2048,3 @@ SunToolkit.wakeupEventQueue(eventQueue, event.getSource() == AWTAutoShutdown.getInstance()); } } // class PostEventQueue - -class EventQueueItem { - AWTEvent event; - EventQueueItem next; - - EventQueueItem(AWTEvent evt) { - event = evt; - } -} // class EventQueueItem diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/X11/XKeysym.java --- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Mon Aug 25 13:58:15 2008 -0700 @@ -101,10 +101,15 @@ // Otherwise, it is [1]. int ndx = XToolkit.isXsunServer() && ! XToolkit.isXKBenabled() ? 2 : 1; + // Even if XKB is enabled, we have another problem: some symbol tables (e.g. cz) force + // a regular comma instead of KP_comma for a decimal separator. Result is, + // bugs like 6454041. So, we will try for keypadness a keysym with ndx==0 as well. XToolkit.awtLock(); try { - return XlibWrapper.IsKeypadKey( - XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ) ); + return (XlibWrapper.IsKeypadKey( + XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ) ) || + XlibWrapper.IsKeypadKey( + XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), 0 ) )); } finally { XToolkit.awtUnlock(); } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java --- a/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java Mon Aug 25 13:58:15 2008 -0700 @@ -189,6 +189,8 @@ req.set_format(32); req.set_data(0, (!set) ? _NET_WM_STATE_REMOVE : _NET_WM_STATE_ADD); req.set_data(1, state.getAtom()); + // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed + req.set_data(2, 0); log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(set)}); XToolkit.awtLock(); try { diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/X11/XToolkit.java --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Mon Aug 25 13:58:15 2008 -0700 @@ -97,6 +97,11 @@ static int awt_multiclick_time; static boolean securityWarningEnabled; + // WeakSet should be used here, but there is no such class + // in JDK (at least in JDK6 and earlier versions) + private WeakHashMap overrideRedirectWindows = + new WeakHashMap(); + private static int screenWidth = -1, screenHeight = -1; // Dimensions of default screen static long awt_defaultFg; // Pixel private static XMouseInfoPeer xPeer; @@ -1248,6 +1253,19 @@ } } + @Override + public void setOverrideRedirect(Window target) { + synchronized (overrideRedirectWindows) { + overrideRedirectWindows.put(target, true); + } + } + + public boolean isOverrideRedirect(Window target) { + synchronized (overrideRedirectWindows) { + return overrideRedirectWindows.containsKey(target); + } + } + static void dumpPeers() { if (log.isLoggable(Level.FINE)) { log.fine("Mapped windows:"); diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java --- a/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindowPeer.java Mon Aug 25 13:58:15 2008 -0700 @@ -129,6 +129,7 @@ private static final int MAXIMUM_BUFFER_LENGTH_NET_WM_ICON = (2<<15) - 1; void preInit(XCreateWindowParams params) { + target = (Component)params.get(TARGET); params.put(REPARENTED, Boolean.valueOf(isOverrideRedirect() || isSimpleWindow())); super.preInit(params); @@ -1117,6 +1118,7 @@ boolean isOverrideRedirect() { return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) || + ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target) || XTrayIconPeer.isTrayIconStuffWindow((Window)target); } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h --- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Mon Aug 25 13:58:15 2008 -0700 @@ -139,10 +139,15 @@ tojava // Otherwise, it is [1]. tojava int ndx = XToolkit.isXsunServer() && tojava ! XToolkit.isXKBenabled() ? 2 : 1; +tojava // Even if XKB is enabled, we have another problem: some symbol tables (e.g. cz) force +tojava // a regular comma instead of KP_comma for a decimal separator. Result is, +tojava // bugs like 6454041. So, we will try for keypadness a keysym with ndx==0 as well. tojava XToolkit.awtLock(); tojava try { -tojava return XlibWrapper.IsKeypadKey( -tojava XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ) ); +tojava return (XlibWrapper.IsKeypadKey( +tojava XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx ) ) || +tojava XlibWrapper.IsKeypadKey( +tojava XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), 0 ) )); tojava } finally { tojava XToolkit.awtUnlock(); tojava } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MButtonPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MButtonPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* - * Copyright 1995-2001 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.ActionEvent; - -class MButtonPeer extends MComponentPeer implements ButtonPeer { - native void create(MComponentPeer peer); - public native void setLabel(String label); - - MButtonPeer(Button target) { - super(target); - } - - public Dimension getMinimumSize() { - FontMetrics fm = getFontMetrics(target.getFont()); - String label = ((Button)target).getLabel(); - if ( label == null ) { - label = ""; - } - return new Dimension(fm.stringWidth(label) + 14, - fm.getHeight() + 8); - } - - public boolean isFocusable() { - return true; - } - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void action(final long when, final int modifiers) { - MToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - postEvent(new ActionEvent(target, ActionEvent.ACTION_PERFORMED, - ((Button)target).getActionCommand(), - when, modifiers)); - } - }); - } - - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more accurate size and - * color information. - */ - public void print(Graphics g) { - Button b = (Button)target; - Dimension d = b.size(); - Color bg = b.getBackground(); - Color fg = b.getForeground(); - - g.setColor(bg); - g.fillRect(2, 2, d.width - 3, d.height - 3); - draw3DRect(g, bg, 1, 1, d.width - 2, d.height - 2, true); - - g.setColor(fg); - g.setFont(b.getFont()); - FontMetrics fm = g.getFontMetrics(); - String lbl = b.getLabel(); - g.drawString(lbl, (d.width - fm.stringWidth(lbl)) / 2, - (d.height + fm.getMaxAscent() - fm.getMaxDescent()) / 2); - - target.print(g); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MCanvasPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MCanvasPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,113 +0,0 @@ -/* - * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import sun.awt.DisplayChangedListener; -import sun.awt.X11GraphicsConfig; -import sun.awt.X11GraphicsDevice; -import sun.awt.X11GraphicsEnvironment; - -class MCanvasPeer extends MComponentPeer implements CanvasPeer, - DisplayChangedListener { - - native void create(MComponentPeer parent); - private static native void initIDs(); - static { - initIDs(); - } - - MCanvasPeer() {} - - MCanvasPeer(Component target) { - super(target); - } - - MCanvasPeer(Component target, Object arg) { - super(target, arg); - } - -/* --- DisplayChangedListener Stuff --- */ - public void displayChanged() {} - public void paletteChanged() {} - native void resetTargetGC(Component target); - - /* - * Called when the Window this - * Canvas is on is moved onto another Xinerama screen. - * - * Canvases can be created with a non-defulat GraphicsConfiguration. The - * GraphicsConfiguration needs to be changed to one on the new screen, - * preferably with the same visual ID. - * - * Up-called for other windows peer instances (WPanelPeer, WWindowPeer). - * - * Should only be called from the event thread. - */ - public void displayChanged(int screenNum) { - resetLocalGC(screenNum); - resetTargetGC(target); /* call Canvas.setGCFromPeer() via native */ - } - - /* Set graphicsConfig to a GraphicsConfig with the same visual on the new - * screen, which should be easy in Xinerama mode. - * - * Should only be called from displayChanged(), and therefore only from - * the event thread. - */ - void resetLocalGC(int screenNum) { - // Opt: Only need to do if we're not using the default GC - if (graphicsConfig != null) { - X11GraphicsConfig parentgc; - // save vis id of current gc - int visual = graphicsConfig.getVisual(); - - X11GraphicsDevice newDev = (X11GraphicsDevice) GraphicsEnvironment. - getLocalGraphicsEnvironment(). - getScreenDevices()[screenNum]; - - for (int i = 0; i < newDev.getNumConfigs(screenNum); i++) { - if (visual == newDev.getConfigVisualId(i, screenNum)) { - // use that - graphicsConfig = (X11GraphicsConfig)newDev.getConfigurations()[i]; - break; - } - } - // just in case... - if (graphicsConfig == null) { - graphicsConfig = (X11GraphicsConfig) GraphicsEnvironment. - getLocalGraphicsEnvironment(). - getScreenDevices()[screenNum]. - getDefaultConfiguration(); - } - } - } - - protected boolean shouldFocusOnClick() { - // Canvas should always be able to be focused by mouse clicks. - return true; - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MCheckboxMenuItemPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MCheckboxMenuItemPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,93 +0,0 @@ -/* - * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.awt.motif; - - -import java.awt.*; -import java.awt.event.*; -import java.awt.peer.*; - -class MCheckboxMenuItemPeer extends MMenuItemPeer - implements CheckboxMenuItemPeer { - private boolean inUpCall=false; - private boolean inInit=false; - - native void pSetState(boolean t); - native boolean getState(); - - void create(MMenuPeer parent) { - super.create(parent); - inInit=true; - setState(((CheckboxMenuItem)target).getState()); - inInit=false; - } - - MCheckboxMenuItemPeer(CheckboxMenuItem target) { - this.target = target; - isCheckbox = true; - MMenuPeer parent = (MMenuPeer) MToolkit.targetToPeer(getParent_NoClientCode(target)); - create(parent); - } - - public void setState(boolean t) { - if (!nativeCreated) { - return; - } - if (!inUpCall && (t != getState())) { - pSetState(t); - if (!inInit) { - // 4135725 : do not notify on programatic changes - // notifyStateChanged(t); - } - } - } - - void notifyStateChanged(boolean state) { - CheckboxMenuItem cb = (CheckboxMenuItem)target; - ItemEvent e = new ItemEvent(cb, - ItemEvent.ITEM_STATE_CHANGED, - cb.getLabel(), - state ? ItemEvent.SELECTED : ItemEvent.DESELECTED); - postEvent(e); - } - - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void action(long when, int modifiers, boolean state) { - final CheckboxMenuItem cb = (CheckboxMenuItem)target; - final boolean newState = state; - - MToolkit.executeOnEventHandlerThread(cb, new Runnable() { - public void run() { - cb.setState(newState); - notifyStateChanged(newState); - } - }); - //Fix for 5005195: MAWT: CheckboxMenuItem fires action events - //super.action() is not invoked - } // action() -} // class MCheckboxMenuItemPeer diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MCheckboxPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MCheckboxPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,187 +0,0 @@ -/* - * Copyright 1995-2000 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. - */ - -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.*; - -public class MCheckboxPeer extends MComponentPeer implements CheckboxPeer { - private boolean inUpCall = false; - private boolean inInit=false; - - native void create(MComponentPeer parent); - native void pSetState(boolean state); - native boolean pGetState(); - - public native void setLabel(String label); - public native void setCheckboxGroup(CheckboxGroup g); - - - void initialize() { - Checkbox t = (Checkbox)target; - inInit=true; - - setState(t.getState()); - setCheckboxGroup(t.getCheckboxGroup()); - super.initialize(); - inInit=false; - } - - public MCheckboxPeer(Checkbox target) { - super(target); - } - - public boolean isFocusable() { - return true; - } - - public void setState(boolean state) { - if (inInit) { - pSetState(state); - } else if (!inUpCall && (state != pGetState())) { - pSetState(state); - // 4135725 : do not notify on programatic changes - // notifyStateChanged(state); - } - } - private native int getIndicatorSize(); - private native int getSpacing(); - - public Dimension getMinimumSize() { - String lbl = ((Checkbox)target).getLabel(); - if (lbl == null) { - lbl = ""; - } - FontMetrics fm = getFontMetrics(target.getFont()); - /* - * Spacing (number of pixels between check mark and label text) is - * currently set to 0, but in case it ever changes we have to add - * it. 8 is a heuristic number. Indicator size depends on font - * height, so we don't need to include it in checkbox's height - * calculation. - */ - int wdth = fm.stringWidth(lbl) + getIndicatorSize() + getSpacing() + 8; - int hght = Math.max(fm.getHeight() + 8, 15); - return new Dimension(wdth, hght); - } - - - void notifyStateChanged(boolean state) { - Checkbox cb = (Checkbox) target; - ItemEvent e = new ItemEvent(cb, - ItemEvent.ITEM_STATE_CHANGED, - cb.getLabel(), - state ? ItemEvent.SELECTED : ItemEvent.DESELECTED); - postEvent(e); - } - - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - void action(boolean state) { - final Checkbox cb = (Checkbox)target; - final boolean newState = state; - MToolkit.executeOnEventHandlerThread(cb, new Runnable() { - public void run() { - CheckboxGroup cbg = cb.getCheckboxGroup(); - /* Bugid 4039594. If this is the current Checkbox in - * a CheckboxGroup, then return to prevent deselection. - * Otherwise, it's logical state will be turned off, - * but it will appear on. - */ - if ((cbg != null) && (cbg.getSelectedCheckbox() == cb) && - cb.getState()) { - inUpCall = false; - cb.setState(true); - return; - } - // All clear - set the new state - cb.setState(newState); - notifyStateChanged(newState); - } // run() - }); - } // action() - - - - static final int SIZE = 19; - static final int BORDER = 4; - static final int SIZ = SIZE - BORDER*2 - 1; - - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more accurate size and - * color information; need to render check mark. - */ - public void print(Graphics g) { - Checkbox cb = (Checkbox)target; - Dimension d = cb.size(); - Color bg = cb.getBackground(); - Color fg = cb.getForeground(); - Color shadow = bg.darker(); - int x = BORDER; - int y = ((d.height - SIZE) / 2) + BORDER; - - g.setColor(cb.getState()? shadow : bg); - - if (cb.getCheckboxGroup() != null) { - g.fillOval(x, y, SIZ, SIZ); - draw3DOval(g, bg, x, y, SIZ, SIZ, !(cb.getState())); - if (cb.getState()) { - g.setColor(fg); - g.fillOval(x + 3, y + 3, SIZ - 6, SIZ - 6); - } - } else { - g.fillRect(x, y, SIZ, SIZ); - draw3DRect(g, bg, x, y, SIZ, SIZ, !(cb.getState())); - if (cb.getState()) { - g.setColor(fg); - g.drawLine(x+1, y+1, x+SIZ-1, y+SIZ-1); - g.drawLine(x+1, y+SIZ-1, x+SIZ-1, y+1); - } - } - g.setColor(fg); - String lbl = cb.getLabel(); - if (lbl != null) { - // REMIND: align - g.setFont(cb.getFont()); - FontMetrics fm = g.getFontMetrics(); - g.drawString(lbl, SIZE, - (d.height + fm.getMaxAscent() - fm.getMaxDescent()) / 2); - } - - target.print(g); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MChoicePeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MChoicePeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/* - * Copyright 1995-2003 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. - */ - -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.ItemEvent; - -class MChoicePeer extends MComponentPeer implements ChoicePeer { - boolean inUpCall=false; - - native void create(MComponentPeer parent); - native void pReshape(int x, int y, int width, int height); - native void pSelect(int index, boolean init); - native void appendItems(String[] items); - - void initialize() { - Choice opt = (Choice)target; - int itemCount = opt.countItems(); - String[] items = new String[itemCount]; - for (int i=0; i < itemCount; i++) { - items[i] = opt.getItem(i); - } - if (itemCount > 0) { - appendItems(items); - pSelect(opt.getSelectedIndex(), true); - } - super.initialize(); - } - - public MChoicePeer(Choice target) { - super(target); - } - - public boolean isFocusable() { - return true; - } - - public Dimension getMinimumSize() { - FontMetrics fm = getFontMetrics(target.getFont()); - Choice c = (Choice)target; - int w = 0; - for (int i = c.countItems() ; i-- > 0 ;) { - w = Math.max(fm.stringWidth(c.getItem(i)), w); - } - return new Dimension(32 + w, Math.max(fm.getHeight() + 8, 15) + 5); - } - - public native void setFont(Font f); - - public void add(String item, int index) { - addItem(item, index); - // Adding an item can change the size of the Choice, so do - // a reshape, based on the font size. - Rectangle r = target.getBounds(); - reshape(r.x, r.y, 0, 0); - } - - public native void remove(int index); - - public native void removeAll(); - - /** - * DEPRECATED, but for now, called by add(String, int). - */ - public native void addItem(String item, int index); - - // public native void remove(int index); - - public native void setBackground(Color c); - - public native void setForeground(Color c); - - public void select(int index) { - if (!inUpCall) { - pSelect(index, false); - } - } - - void notifySelection(String item) { - Choice c = (Choice)target; - ItemEvent e = new ItemEvent(c, ItemEvent.ITEM_STATE_CHANGED, - item, ItemEvent.SELECTED); - postEvent(e); - } - - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - void action(final int index) { - final Choice c = (Choice)target; - inUpCall = false; /* Used to prevent native selection. */ - MToolkit.executeOnEventHandlerThread(c, new Runnable() { - public void run() { - String item; - synchronized(c) { - if (index >= c.getItemCount()) { - /* Nothing to do when the list is too short */ - return; - } - inUpCall = true; /* Prevent native selection. */ - c.select(index); /* set value in target */ - item = c.getItem(index); - inUpCall = false; - } - notifySelection(item); - } - }); - } - - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more accurate size and - * color information. - */ - public void print(Graphics g) { - Choice ch = (Choice)target; - Dimension d = ch.size(); - Color bg = ch.getBackground(); - Color fg = ch.getForeground(); - - g.setColor(bg); - g.fillRect(2, 2, d.width-1, d.height-1); - draw3DRect(g, bg, 1, 1, d.width-2, d.height-2, true); - draw3DRect(g, bg, d.width - 18, (d.height / 2) - 3, 10, 6, true); - - g.setColor(fg); - g.setFont(ch.getFont()); - FontMetrics fm = g.getFontMetrics(); - String lbl = ch.getSelectedItem(); - if (lbl == null){ - lbl = ""; - } - if (lbl != ""){ - g.drawString(lbl, 5, (d.height + fm.getMaxAscent()-fm.getMaxDescent())/2); - } - - target.print(g); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - - protected void disposeImpl() { - freeNativeData(); - super.disposeImpl(); - } - - private native void freeNativeData(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MComponentPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MComponentPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1185 +0,0 @@ -/* - * Copyright 1995-2008 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. - */ - -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.PaintEvent; -import java.awt.event.MouseEvent; -import java.awt.event.InputEvent; - -import sun.awt.*; -import sun.awt.image.ToolkitImage; -import sun.awt.image.SunVolatileImage; -import java.awt.image.ImageProducer; -import java.awt.image.ImageObserver; -import java.awt.image.ColorModel; -import java.awt.image.VolatileImage; - -import java.awt.dnd.DropTarget; -import java.awt.dnd.peer.DropTargetPeer; - -import sun.java2d.SunGraphics2D; -import sun.java2d.SurfaceData; - -import java.lang.reflect.Method; - -import java.util.logging.*; - -import sun.java2d.pipe.Region; - - -public /* REMIND: should not be public */ -abstract class MComponentPeer implements ComponentPeer, DropTargetPeer, X11ComponentPeer { - - private static final Logger log = Logger.getLogger("sun.awt.motif.MComponentPeer"); - private static final Logger focusLog = Logger.getLogger("sun.awt.motif.focus.MComponentPeer"); - - Component target; - long pData; - long jniGlobalRef; - protected X11GraphicsConfig graphicsConfig; - SurfaceData surfaceData; - int oldWidth = -1; - int oldHeight = -1; - - private RepaintArea paintArea; - - boolean isLayouting = false; - boolean paintPending = false; - - protected boolean disposed = false; - private static int JAWT_LOCK_ERROR=0x00000001; - private static int JAWT_LOCK_CLIP_CHANGED=0x00000002; - private static int JAWT_LOCK_BOUNDS_CHANGED=0x00000004; - private static int JAWT_LOCK_SURFACE_CHANGED=0x00000008; - private int drawState = JAWT_LOCK_CLIP_CHANGED | - JAWT_LOCK_BOUNDS_CHANGED | - JAWT_LOCK_SURFACE_CHANGED; - - /* These are the enumerated types in awt_p.h*/ - static final int MOTIF_NA = 0 ; - static final int MOTIF_V1 = 1 ; - static final int MOTIF_V2 = 2 ; - - private Font font; - private long backBuffer = 0; - private VolatileImage xBackBuffer = null; - - static { - initIDs(); - } - - /* initialize the fieldIDs of fields that may be accessed from C */ - private native static void initIDs(); - - - /* This will return the last state of a window. ie the specific - * "gotcha" is that if you iconify a window its obscurity remains - * unchanged. Current use of this is just in user-initiated scrolling. - * If that use expands to more cases you may need to "and" this with - * the value of the iconic state of a Frame. - * Note that de-iconifying an X11 window DOES generate a new event - * correctly notifying you of the new visibility of the window - */ - public boolean isObscured() { - - Container container = (target instanceof Container) ? - (Container)target : target.getParent(); - - if (container == null) { - return true; - } - - Container parent; - while ((parent = container.getParent()) != null) { - container = parent; - } - - if (container instanceof Window) { - MWindowPeer wpeer = (MWindowPeer)(container.getPeer()); - if (wpeer != null) { - return (wpeer.winAttr.visibilityState != - MWindowAttributes.AWT_UNOBSCURED); - } - } - return true; - } - - public boolean canDetermineObscurity() { - return true; - } - - abstract void create(MComponentPeer parent); - void create(MComponentPeer parent, Object arg) { - create(parent); - } - - void EFcreate(MComponentPeer parent, int x){} - - native void pInitialize(); - native void pShow(); - native void pHide(); - native void pEnable(); - native void pDisable(); - native void pReshape(int x, int y, int width, int height); - native void pDispose(); - native void pMakeCursorVisible(); - native Point pGetLocationOnScreen(); - native Point pGetLocationOnScreen2(Window win, MWindowPeer wpeer); - native void pSetForeground(Color c); - native void pSetBackground(Color c); - private native void pSetFont(Font f); - - //Added for bug 4175560 - //Returns the native representation for the Color argument, - //using the given GraphicsConfiguration. - native int getNativeColor(Color clr, GraphicsConfiguration gc); - - // Returns the parent of the component, without invoking client - // code. This must go through native code, because it invokes - // private methods in the java.awt package, which we cannot - // do from this package. - static native Container getParent_NoClientCode(Component component); - - // Returns the parent of the component, without invoking client - // code. This must go through native code, because it invokes - // private methods in the java.awt package, which we cannot - // do from this package. - static native Component[] getComponents_NoClientCode(Container container); - - void initialize() { - if (!target.isVisible()) { - hide(); - } - Color c; - Font f; - Cursor cursor; - - pInitialize(); - - if ((c = target.getForeground()) != null) { - setForeground(c); - } - if ((c = target.getBackground()) != null) { - setBackground(c); - } - if ((f = target.getFont()) != null) { - setFont(f); - } - pSetCursor(target.getCursor()); - if (!target.isEnabled()) { - disable(); - } - Rectangle r = target.getBounds(); - reshape(r.x, r.y, r.width, r.height); - if (target.isVisible()) { - show(); - } - - surfaceData = graphicsConfig.createSurfaceData(this); - } - - public void init(Component target, Object arg) { - this.target = target; - this.paintArea = new RepaintArea(); - - Container parent = MToolkit.getNativeContainer(target); - MComponentPeer parentPeer = (MComponentPeer) MToolkit.targetToPeer(parent); - create(parentPeer, arg); - - initialize(); - } - - MComponentPeer(Component target, Object arg) { - init(target, arg); - } - - MComponentPeer() {} - - public void init(Component target) { - this.target = target; - this.paintArea = new RepaintArea(); - - Container parent = MToolkit.getNativeContainer(target); - MComponentPeer parentPeer = (MComponentPeer) MToolkit.targetToPeer(parent); - create(parentPeer); - - if (parent != null && parent instanceof ScrollPane) { - MScrollPanePeer speer = (MScrollPanePeer) parentPeer; - speer.setScrollChild(this); - } - initialize(); - } - - MComponentPeer(Component target) { - init(target); - } - - protected void finalize() throws Throwable { - dispose(); - super.finalize(); - } - - public void setForeground(Color c) { - pSetForeground(c); - } - - public void setBackground(Color c) { - pSetBackground(c); - } - - public void updateCursorImmediately() { - MGlobalCursorManager.getCursorManager().updateCursorImmediately(); - } - - public void setFont(Font f) { - ComponentPeer peer; - if (f == null) { - f = defaultFont; - } - pSetFont(f); - if ( target instanceof Container ) { - Container container = (Container) target; - int count = container.getComponentCount(); - Component[] children = container.getComponents(); - for (int i=0; i>1)); - v2 = 7; - } - - int ctr = thickness/2; - int sbmin = ctr - w2/2; - int sbmax = ctr + w2/2; - - // paint the background slightly darker - { - Color d = new Color((int) (bg.getRed() * 0.85), - (int) (bg.getGreen() * 0.85), - (int) (bg.getBlue() * 0.85)); - - g.setColor(d); - if (horizontal) { - g.fillRect(0, 0, length, thickness); - } else { - g.fillRect(0, 0, thickness, length); - } - } - - // paint the thumb and arrows in the normal background color - g.setColor(bg); - if (v1 > 0) { - if (horizontal) { - g.fillRect(v1, 3, v2, thickness-3); - } else { - g.fillRect(3, v1, thickness-3, v2); - } - } - - tpts_x[0] = ctr; tpts_y[0] = 2; - tpts_x[1] = sbmin; tpts_y[1] = w2; - tpts_x[2] = sbmax; tpts_y[2] = w2; - if (horizontal) { - g.fillPolygon(tpts_y, tpts_x, 3); - } else { - g.fillPolygon(tpts_x, tpts_y, 3); - } - - tpts_y[0] = length-2; - tpts_y[1] = length-w2; - tpts_y[2] = length-w2; - if (horizontal) { - g.fillPolygon(tpts_y, tpts_x, 3); - } else { - g.fillPolygon(tpts_x, tpts_y, 3); - } - - Color highlight = bg.brighter(); - - // // // // draw the "highlighted" edges - g.setColor(highlight); - - // outline & arrows - if (horizontal) { - g.drawLine(1, thickness, length - 1, thickness); - g.drawLine(length - 1, 1, length - 1, thickness); - - // arrows - g.drawLine(1, ctr, w2, sbmin); - g.drawLine(length - w2, sbmin, length - w2, sbmax); - g.drawLine(length - w2, sbmin, length - 2, ctr); - - } else { - g.drawLine(thickness, 1, thickness, length - 1); - g.drawLine(1, length - 1, thickness, length - 1); - - // arrows - g.drawLine(ctr, 1, sbmin, w2); - g.drawLine(sbmin, length - w2, sbmax, length - w2); - g.drawLine(sbmin, length - w2, ctr, length - 2); - } - - // thumb - if (v1 > 0) { - if (horizontal) { - g.drawLine(v1, 2, v1 + v2, 2); - g.drawLine(v1, 2, v1, thickness-3); - } else { - g.drawLine(2, v1, 2, v1 + v2); - g.drawLine(2, v1, thickness-3, v1); - } - } - - Color shadow = bg.darker(); - - // // // // draw the "shadowed" edges - g.setColor(shadow); - - // outline && arrows - if (horizontal) { - g.drawLine(0, 0, 0, thickness); - g.drawLine(0, 0, length - 1, 0); - - // arrows - g.drawLine(w2, sbmin, w2, sbmax); - g.drawLine(w2, sbmax, 1, ctr); - g.drawLine(length-2, ctr, length-w2, sbmax); - - } else { - g.drawLine(0, 0, thickness, 0); - g.drawLine(0, 0, 0, length - 1); - - // arrows - g.drawLine(sbmin, w2, sbmax, w2); - g.drawLine(sbmax, w2, ctr, 1); - g.drawLine(ctr, length-2, sbmax, length-w2); - } - - // thumb - if (v1 > 0) { - if (horizontal) { - g.drawLine(v1 + v2, 2, v1 + v2, thickness-2); - g.drawLine(v1, thickness-2, v1 + v2, thickness-2); - } else { - g.drawLine(2, v1 + v2, thickness-2, v1 + v2); - g.drawLine(thickness-2, v1, thickness-2, v1 + v2); - } - } - g.setColor(c); - } - - public String toString() { - return getClass().getName() + "[" + target + "]"; - } - - /* New 1.1 API */ - public void setVisible(boolean b) { - if (b) { - Dimension s = target.getSize(); - oldWidth = s.width; - oldHeight = s.height; - pShow(); - } else { - pHide(); - } - } - - /* New 1.1 API */ - public void setEnabled(boolean b) { - if (b) { - pEnable(); - } else { - pDisable(); - } - } - - /* New 1.1 API */ - public Point getLocationOnScreen() { - synchronized (target.getTreeLock()) { - Component comp = target; - while (comp != null && !(comp instanceof Window)) { - comp = getParent_NoClientCode(comp); - } - - // applets, embedded, etc - translate directly - if (comp == null || comp instanceof sun.awt.EmbeddedFrame) { - return pGetLocationOnScreen(); - } - - MWindowPeer wpeer = (MWindowPeer)(MToolkit.targetToPeer(comp)); - if (wpeer == null) { - return pGetLocationOnScreen(); - } - return pGetLocationOnScreen2((Window)comp, wpeer); - } - } - - public int serialNum = 0; - - /* Returns the native paint should be posted after setting new size - */ - public boolean checkNativePaintOnSetBounds(int width, int height) { - return (width != oldWidth) || (height != oldHeight); - } - - void setBounds(int x, int y, int width, int height) { - setBounds(x, y, width, height, SET_BOUNDS); - } - - /* New 1.1 API */ - public void setBounds(int x, int y, int width, int height, int op) { - if (disposed) return; - - Container parent = getParent_NoClientCode(target); - - // Should set paintPending before reshape to prevent - // thread race between PaintEvent and setBounds - // This part of the 4267393 fix proved to be unstable under solaris, - // dissabled due to regressions 4418155, 4486762, 4490079 - paintPending = false; //checkNativePaintOnSetBounds(width, height); - - // Note: it would be ideal to NOT execute this if it's - // merely a Move which is occurring. - if (parent != null && parent instanceof ScrollPane) { - MScrollPanePeer speer = (MScrollPanePeer)parent.getPeer(); - if (!speer.ignore) { - pReshape(x, y, width, height); - speer.childResized(width, height); - } - } else { - pReshape(x, y, width, height); - } - - if ((width != oldWidth) || (height != oldHeight)) { - SurfaceData oldData = surfaceData; - if (oldData != null) { - surfaceData = graphicsConfig.createSurfaceData(this); - oldData.invalidate(); - } - oldWidth = width; - oldHeight = height; - } - validateSurface(width, height); - serialNum++; - } - - void validateSurface(int width, int height) { - SunToolkit.awtLock(); - try { - if (!disposed && (width != oldWidth || height != oldHeight)) { - SurfaceData oldData = surfaceData; - if (oldData != null) { - surfaceData = graphicsConfig.createSurfaceData(this); - oldData.invalidate(); - } - oldWidth = width; - oldHeight = height; - } - } finally { - SunToolkit.awtUnlock(); - } - } - - public void beginValidate() { - } - - native void restoreFocus(); - - public void endValidate() { - restoreFocus(); - } - - public void beginLayout() { - // Skip all painting till endLayout - isLayouting = true; - } - - public void endLayout() { - if (!paintPending && !paintArea.isEmpty() && - !((Component)target).getIgnoreRepaint()) { - // if not waiting for native painting repaint damaged area - postEvent(new PaintEvent((Component)target, PaintEvent.PAINT, - new Rectangle())); - } - isLayouting = false; - } - - /** - * DEPRECATED: Replaced by setVisible(boolean). - */ - public void show() { - setVisible(true); - } - - /** - * DEPRECATED: Replaced by setVisible(boolean). - */ - public void hide() { - setVisible(false); - } - - /** - * DEPRECATED: Replaced by setEnabled(boolean). - */ - public void enable() { - setEnabled(true); - } - - /** - * DEPRECATED: Replaced by setEnabled(boolean). - */ - public void disable() { - setEnabled(false); - } - - /** - * DEPRECATED: Replaced by setBounds(int, int, int, int). - */ - public void reshape(int x, int y, int width, int height) { - setBounds(x, y, width, height); - } - - /** - * DEPRECATED: Replaced by getMinimumSize(). - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - - /** - * DEPRECATED: Replaced by getPreferredSize(). - */ - public Dimension preferredSize() { - return getPreferredSize(); - } - - /** - * - */ - - public void addDropTarget(DropTarget dt) { - if (MToolkit.useMotifDnD()) { - addNativeDropTarget(dt); - } else { - Component comp = target; - while(!(comp == null || comp instanceof java.awt.Window)) { - comp = getParent_NoClientCode(comp); - } - - if (comp instanceof Window) { - MWindowPeer wpeer = (MWindowPeer)(comp.getPeer()); - if (wpeer != null) { - wpeer.addDropTarget(); - } - } - } - } - - /** - * - */ - - public void removeDropTarget(DropTarget dt) { - if (MToolkit.useMotifDnD()) { - removeNativeDropTarget(dt); - } else { - Component comp = target; - while(!(comp == null || comp instanceof java.awt.Window)) { - comp = getParent_NoClientCode(comp); - } - - if (comp instanceof Window) { - MWindowPeer wpeer = (MWindowPeer)(comp.getPeer()); - if (wpeer != null) { - wpeer.removeDropTarget(); - } - } - } - } - - public void notifyTextComponentChange(boolean add){ - Container parent = getParent_NoClientCode(target); - while(!(parent == null || - parent instanceof java.awt.Frame || - parent instanceof java.awt.Dialog)) { - parent = getParent_NoClientCode(parent); - } - - if (parent instanceof java.awt.Frame || - parent instanceof java.awt.Dialog) { - if (add) - ((MInputMethodControl)parent.getPeer()).addTextComponent((MComponentPeer)this); - else - ((MInputMethodControl)parent.getPeer()).removeTextComponent((MComponentPeer)this); - } - } - - native void addNativeDropTarget(DropTarget dt); - - native void removeNativeDropTarget(DropTarget dt); - - public GraphicsConfiguration getGraphicsConfiguration() { - GraphicsConfiguration ret = graphicsConfig; - if (ret == null) { - ret = target.getGraphicsConfiguration(); - } - return ret; - } - - // Returns true if we are inside begin/endLayout and - // are waiting for native painting - public boolean isPaintPending() { - return paintPending && isLayouting; - } - - public boolean handlesWheelScrolling() { - return false; - } - - /** - * The following multibuffering-related methods delegate to our - * associated GraphicsConfig (X11 or GLX) to handle the appropriate - * native windowing system specific actions. - */ - - private native long getWindow(long pData); - - public long getContentWindow() { - return getWindow(pData); - } - - public void createBuffers(int numBuffers, BufferCapabilities caps) - throws AWTException - { - backBuffer = graphicsConfig.createBackBuffer(this, numBuffers, caps); - xBackBuffer = graphicsConfig.createBackBufferImage(target, - backBuffer); - } - - public void flip(int x1, int y1, int x2, int y2, - BufferCapabilities.FlipContents flipAction) - { - if (backBuffer == 0) { - throw new IllegalStateException("Buffers have not been created"); - } - graphicsConfig.flip(this, target, xBackBuffer, - x1, y1, x2, y2, flipAction); - } - - public Image getBackBuffer() { - if (backBuffer == 0) { - throw new IllegalStateException("Buffers have not been created"); - } - return xBackBuffer; - } - - public void destroyBuffers() { - graphicsConfig.destroyBackBuffer(backBuffer); - backBuffer = 0; - xBackBuffer = null; - } - - /** - * @see java.awt.peer.ComponentPeer#isReparentSupported - */ - public boolean isReparentSupported() { - return false; - } - - /** - * @see java.awt.peer.ComponentPeer#reparent - */ - public void reparent(ContainerPeer newNativeParent) { - throw new UnsupportedOperationException(); - } - - /** - * Applies the shape to the native component window. - * @since 1.7 - */ - public void applyShape(Region shape) { - } - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MCustomCursor.java --- a/jdk/src/solaris/classes/sun/awt/motif/MCustomCursor.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Copyright 2003 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. - */ - -package sun.awt.motif; - -import sun.awt.X11CustomCursor; -import sun.awt.CustomCursor; -import java.awt.*; -import java.awt.image.*; -import sun.awt.image.ImageRepresentation; - -public class MCustomCursor extends X11CustomCursor { - - public MCustomCursor(Image cursor, Point hotSpot, String name) - throws IndexOutOfBoundsException { - super(cursor, hotSpot, name); - } - /** - * Returns the supported cursor size - */ - public static Dimension getBestCursorSize( - int preferredWidth, int preferredHeight) { - - // Fix for bug 4212593 The Toolkit.createCustomCursor does not - // check absence of the image of cursor - // We use XQueryBestCursor which accepts unsigned ints to obtain - // the largest cursor size that could be dislpayed - Dimension d = new Dimension(Math.abs(preferredWidth), Math.abs(preferredHeight)); - - queryBestCursor(d); - return d; - } - - private static native void queryBestCursor(Dimension d); - - protected native void createCursor(byte[] xorMask, byte[] andMask, - int width, int height, - int fcolor, int bcolor, - int xHotSpot, int yHotSpot); - - static { - cacheInit(); - } - - private native static void cacheInit(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MDataTransferer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MDataTransferer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,386 +0,0 @@ -/* - * Copyright 2000-2004 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. - */ - -package sun.awt.motif; - -import java.awt.Image; - -import java.awt.datatransfer.DataFlavor; - -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.WritableRaster; - -import java.io.InputStream; -import java.io.IOException; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.imageio.ImageIO; -import javax.imageio.ImageTypeSpecifier; -import javax.imageio.ImageWriter; -import javax.imageio.spi.ImageWriterSpi; - -import sun.awt.datatransfer.DataTransferer; -import sun.awt.datatransfer.ToolkitThreadBlockedHandler; - -/** - * Platform-specific support for the data transfer subsystem. - * - * @author Roger Brinkley - * @author Danila Sinopalnikov - * - * @since 1.3.1 - */ -public class MDataTransferer extends DataTransferer { - private static final long FILE_NAME_ATOM; - private static final long DT_NET_FILE_ATOM; - private static final long PNG_ATOM; - private static final long JFIF_ATOM; - - static { - FILE_NAME_ATOM = getAtomForTarget("FILE_NAME"); - DT_NET_FILE_ATOM = getAtomForTarget("_DT_NETFILE"); - PNG_ATOM = getAtomForTarget("PNG"); - JFIF_ATOM = getAtomForTarget("JFIF"); - } - - /** - * Singleton constructor - */ - private MDataTransferer() { - } - - private static MDataTransferer transferer; - - static MDataTransferer getInstanceImpl() { - if (transferer == null) { - synchronized (MDataTransferer.class) { - if (transferer == null) { - transferer = new MDataTransferer(); - } - } - } - return transferer; - } - - public String getDefaultUnicodeEncoding() { - return "iso-10646-ucs-2"; - } - - public boolean isLocaleDependentTextFormat(long format) { - return false; - } - - public boolean isTextFormat(long format) { - return super.isTextFormat(format) - || isMimeFormat(format, "text"); - } - - protected String getCharsetForTextFormat(Long lFormat) { - long format = lFormat.longValue(); - if (isMimeFormat(format, "text")) { - String nat = getNativeForFormat(format); - DataFlavor df = new DataFlavor(nat, null); - // Ignore the charset parameter of the MIME type if the subtype - // doesn't support charset. - if (!DataTransferer.doesSubtypeSupportCharset(df)) { - return null; - } - String charset = df.getParameter("charset"); - if (charset != null) { - return charset; - } - } - return super.getCharsetForTextFormat(lFormat); - } - - public boolean isFileFormat(long format) { - return format == FILE_NAME_ATOM || format == DT_NET_FILE_ATOM; - } - - public boolean isImageFormat(long format) { - return format == PNG_ATOM || format == JFIF_ATOM - || isMimeFormat(format, "image"); - } - - protected Long getFormatForNativeAsLong(String str) { - // Just get the atom. If it has already been retrived - // once, we'll get a copy so this should be very fast. - long atom = getAtomForTarget(str); - if (atom <= 0) { - throw new InternalError("Cannot register a target"); - } - return Long.valueOf(atom); - } - - protected String getNativeForFormat(long format) { - return getTargetNameForAtom(format); - } - - public ToolkitThreadBlockedHandler getToolkitThreadBlockedHandler() { - return MToolkitThreadBlockedHandler.getToolkitThreadBlockedHandler(); - } - - /** - * Gets an atom for a format name. - */ - static native long getAtomForTarget(String name); - - /** - * Gets an format name for a given format (atom) - */ - private static native String getTargetNameForAtom(long atom); - - protected byte[] imageToPlatformBytes(Image image, long format) - throws IOException { - String mimeType = null; - if (format == PNG_ATOM) { - mimeType = "image/png"; - } else if (format == JFIF_ATOM) { - mimeType = "image/jpeg"; - } else { - // Check if an image MIME format. - try { - String nat = getNativeForFormat(format); - DataFlavor df = new DataFlavor(nat); - String primaryType = df.getPrimaryType(); - if ("image".equals(primaryType)) { - mimeType = df.getPrimaryType() + "/" + df.getSubType(); - } - } catch (Exception e) { - // Not an image MIME format. - } - } - if (mimeType != null) { - return imageToStandardBytes(image, mimeType); - } else { - String nativeFormat = getNativeForFormat(format); - throw new IOException("Translation to " + nativeFormat + - " is not supported."); - } - } - - /** - * Translates either a byte array or an input stream which contain - * platform-specific image data in the given format into an Image. - */ - protected Image platformImageBytesOrStreamToImage(InputStream inputStream, - byte[] bytes, - long format) - throws IOException { - String mimeType = null; - if (format == PNG_ATOM) { - mimeType = "image/png"; - } else if (format == JFIF_ATOM) { - mimeType = "image/jpeg"; - } else { - // Check if an image MIME format. - try { - String nat = getNativeForFormat(format); - DataFlavor df = new DataFlavor(nat); - String primaryType = df.getPrimaryType(); - if ("image".equals(primaryType)) { - mimeType = df.getPrimaryType() + "/" + df.getSubType(); - } - } catch (Exception e) { - // Not an image MIME format. - } - } - if (mimeType != null) { - return standardImageBytesOrStreamToImage(inputStream, bytes, mimeType); - } else { - String nativeFormat = getNativeForFormat(format); - throw new IOException("Translation from " + nativeFormat + - " is not supported."); - } - } - - /** - * Returns true if and only if the name of the specified format Atom - * constitutes a valid MIME type with the specified primary type. - */ - private boolean isMimeFormat(long format, String primaryType) { - String nat = getNativeForFormat(format); - - if (nat == null) { - return false; - } - - try { - DataFlavor df = new DataFlavor(nat); - if (primaryType.equals(df.getPrimaryType())) { - return true; - } - } catch (Exception e) { - // Not a MIME format. - } - - return false; - } - - /* - * The XDnD protocol prescribes that the Atoms used as targets for data - * transfer should have string names that represent the corresponding MIME - * types. - * To meet this requirement we check if the passed native format constitutes - * a valid MIME and return a list of flavors to which the data in this MIME - * type can be translated by the Data Transfer subsystem. - */ - public List getPlatformMappingsForNative(String nat) { - List flavors = new ArrayList(); - - if (nat == null) { - return flavors; - } - - DataFlavor df = null; - - try { - df = new DataFlavor(nat); - } catch (Exception e) { - // The string doesn't constitute a valid MIME type. - return flavors; - } - - Object value = df; - final String primaryType = df.getPrimaryType(); - final String baseType = primaryType + "/" + df.getSubType(); - - // For text formats we map natives to MIME strings instead of data - // flavors to enable dynamic text native-to-flavor mapping generation. - // See SystemFlavorMap.getFlavorsForNative() for details. - if ("text".equals(primaryType)) { - value = primaryType + "/" + df.getSubType(); - } else if ("image".equals(primaryType)) { - Iterator readers = ImageIO.getImageReadersByMIMEType(baseType); - if (readers.hasNext()) { - flavors.add(DataFlavor.imageFlavor); - } - } - - flavors.add(value); - - return flavors; - } - - private static ImageTypeSpecifier defaultSpecifier = null; - - private ImageTypeSpecifier getDefaultImageTypeSpecifier() { - if (defaultSpecifier == null) { - ColorModel model = ColorModel.getRGBdefault(); - WritableRaster raster = - model.createCompatibleWritableRaster(10, 10); - - BufferedImage bufferedImage = - new BufferedImage(model, raster, model.isAlphaPremultiplied(), - null); - - defaultSpecifier = new ImageTypeSpecifier(bufferedImage); - } - - return defaultSpecifier; - } - - /* - * The XDnD protocol prescribes that the Atoms used as targets for data - * transfer should have string names that represent the corresponding MIME - * types. - * To meet this requirement we return a list of formats that represent - * MIME types to which the data in this flavor can be translated by the Data - * Transfer subsystem. - */ - public List getPlatformMappingsForFlavor(DataFlavor df) { - List natives = new ArrayList(1); - - if (df == null) { - return natives; - } - - String charset = df.getParameter("charset"); - String baseType = df.getPrimaryType() + "/" + df.getSubType(); - String mimeType = baseType; - - if (charset != null && DataTransferer.isFlavorCharsetTextType(df)) { - mimeType += ";charset=" + charset; - } - - // Add a mapping to the MIME native whenever the representation class - // doesn't require translation. - if (df.getRepresentationClass() != null && - (df.isRepresentationClassInputStream() || - df.isRepresentationClassByteBuffer() || - byteArrayClass.equals(df.getRepresentationClass()))) { - natives.add(mimeType); - } - - if (DataFlavor.imageFlavor.equals(df)) { - String[] mimeTypes = ImageIO.getWriterMIMETypes(); - if (mimeTypes != null) { - for (int i = 0; i < mimeTypes.length; i++) { - Iterator writers = - ImageIO.getImageWritersByMIMEType(mimeTypes[i]); - - while (writers.hasNext()) { - ImageWriter imageWriter = (ImageWriter)writers.next(); - ImageWriterSpi writerSpi = - imageWriter.getOriginatingProvider(); - - if (writerSpi != null && - writerSpi.canEncodeImage(getDefaultImageTypeSpecifier())) { - natives.add(mimeTypes[i]); - break; - } - } - } - } - } else if (DataTransferer.isFlavorCharsetTextType(df)) { - final Iterator iter = DataTransferer.standardEncodings(); - - // stringFlavor is semantically equivalent to the standard - // "text/plain" MIME type. - if (DataFlavor.stringFlavor.equals(df)) { - baseType = "text/plain"; - } - - while (iter.hasNext()) { - String encoding = (String)iter.next(); - if (!encoding.equals(charset)) { - natives.add(baseType + ";charset=" + encoding); - } - } - - // Add a MIME format without specified charset. - if (!natives.contains(baseType)) { - natives.add(baseType); - } - } - - return natives; - } - protected native String[] dragQueryFile(byte[] bytes); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MDialogPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MDialogPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/* - * Copyright 1995-2008 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. - */ -package sun.awt.motif; - -import java.util.Vector; -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.*; -import sun.awt.motif.MInputMethodControl; -import sun.awt.im.*; - -class MDialogPeer extends MWindowPeer implements DialogPeer, MInputMethodControl { - - static Vector allDialogs = new Vector(); - - MDialogPeer(Dialog target) { - - /* create MWindowPeer object */ - super(); - - winAttr.nativeDecor = !target.isUndecorated(); - winAttr.initialFocus = true; - winAttr.isResizable = target.isResizable(); - winAttr.initialState = MWindowAttributes.NORMAL; - winAttr.title = target.getTitle(); - winAttr.icon = null; - if (winAttr.nativeDecor) { - winAttr.decorations = winAttr.AWT_DECOR_ALL | - winAttr.AWT_DECOR_MINIMIZE | - winAttr.AWT_DECOR_MAXIMIZE; - } else { - winAttr.decorations = winAttr.AWT_DECOR_NONE; - } - /* create and init native component */ - init(target); - allDialogs.addElement(this); - } - - public void setTitle(String title) { - pSetTitle(title); - } - - protected void disposeImpl() { - allDialogs.removeElement(this); - super.disposeImpl(); - } - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleMoved(int x, int y) { - postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_MOVED)); - } - - public void show() { - pShowModal( ((Dialog)target).isModal() ); - updateAlwaysOnTop(alwaysOnTop); - } - - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleIconify() { -// Note: These routines are necessary for Coaleseing of native implementations -// As Dialogs do not currently send Iconify/DeIconify messages but -// Windows/Frames do. If this should be made consistent...to do so -// uncomment the postEvent. -// postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_ICONIFIED)); - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleDeiconify() { -// Note: These routines are necessary for Coaleseing of native implementations -// As Dialogs do not currently send Iconify/DeIconify messages but -// Windows/Frames do. If this should be made consistent...to do so -// uncomment the postEvent. -// postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_DEICONIFIED)); - } - - public void blockWindows(java.util.List toBlock) { - // do nothing - } - - @Override - final boolean isTargetUndecorated() { - return ((Dialog)target).isUndecorated(); - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MDragSourceContextPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MDragSourceContextPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.awt.motif; - -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Image; -import java.awt.Point; - -import java.awt.datatransfer.Transferable; - -import java.awt.dnd.DragSourceContext; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.InvalidDnDOperationException; - -import java.awt.event.InputEvent; - -import java.awt.peer.ComponentPeer; -import java.awt.peer.LightweightPeer; - -import java.util.Map; -import sun.awt.SunToolkit; -import sun.awt.dnd.SunDragSourceContextPeer; - -/** - *

- * TBC - *

- * - * @since JDK1.2 - * - */ - -final class MDragSourceContextPeer extends SunDragSourceContextPeer { - - private static final MDragSourceContextPeer theInstance = - new MDragSourceContextPeer(null); - - /** - * construct a new MDragSourceContextPeer - */ - - private MDragSourceContextPeer(DragGestureEvent dge) { - super(dge); - } - - static MDragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { - theInstance.setTrigger(dge); - return theInstance; - } - - protected void startDrag(Transferable transferable, - long[] formats, Map formatMap) { - try { - long nativeCtxtLocal = startDrag(getTrigger().getComponent(), - transferable, - getTrigger().getTriggerEvent(), - getCursor(), - getCursor() == null ? 0 : getCursor().getType(), - getDragSourceContext().getSourceActions(), - formats, - formatMap); - setNativeContext(nativeCtxtLocal); - } catch (Exception e) { - throw new InvalidDnDOperationException("failed to create native peer: " + e); - } - - if (getNativeContext() == 0) { - throw new InvalidDnDOperationException("failed to create native peer"); - } - - MDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(transferable); - } - - /** - * downcall into native code - */ - - private native long startDrag(Component component, - Transferable transferable, - InputEvent nativeTrigger, - Cursor c, int ctype, int actions, - long[] formats, Map formatMap); - - /** - * set cursor - */ - - public void setCursor(Cursor c) throws InvalidDnDOperationException { - SunToolkit.awtLock(); - super.setCursor(c); - SunToolkit.awtUnlock(); - } - - protected native void setNativeCursor(long nativeCtxt, Cursor c, int cType); - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MDropTargetContextPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MDropTargetContextPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.awt.motif; - -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.UnsupportedFlavorException; - -import java.awt.dnd.DnDConstants; -import java.awt.dnd.InvalidDnDOperationException; - -import java.io.InputStream; - -import java.util.Map; - -import java.io.IOException; -import sun.awt.dnd.SunDropTargetContextPeer; -import sun.awt.SunToolkit; - -/** - *

- * The MDropTargetContextPeer class is the class responsible for handling - * the interaction between the Motif DnD system and Java. - *

- * - * @since JDK1.2 - * - */ - -final class MDropTargetContextPeer extends SunDropTargetContextPeer { - - private long nativeDropTransfer; - - long nativeDataAvailable = 0; - Object nativeData = null; - - /** - * create the peer - */ - - static MDropTargetContextPeer createMDropTargetContextPeer() { - return new MDropTargetContextPeer(); - } - - /** - * create the peer - */ - - private MDropTargetContextPeer() { - super(); - } - - protected Object getNativeData(long format) { - SunToolkit.awtLock(); - if (nativeDropTransfer == 0) { - nativeDropTransfer = startTransfer(getNativeDragContext(), - format); - } else { - addTransfer (nativeDropTransfer, format); - } - - for (nativeDataAvailable = 0; - format != nativeDataAvailable;) { - try { - SunToolkit.awtLockWait(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - SunToolkit.awtUnlock(); - - return nativeData; - } - - /** - * signal drop complete - */ - - protected void doDropDone(boolean success, int dropAction, - boolean isLocal) { - dropDone(getNativeDragContext(), nativeDropTransfer, isLocal, - success, dropAction); - } - - /** - * notify transfer complete - */ - - private void newData(long format, String type, byte[] data) { - nativeDataAvailable = format; - nativeData = data; - - SunToolkit.awtLockNotifyAll(); - } - - /** - * notify transfer failed - */ - - private void transferFailed(long format) { - nativeDataAvailable = format; - nativeData = null; - - SunToolkit.awtLockNotifyAll(); - } - - /** - * schedule a native DnD transfer - */ - - private native long startTransfer(long nativeDragContext, long format); - - /** - * schedule a native DnD data transfer - */ - - private native void addTransfer(long nativeDropTransfer, long format); - - /** - * signal that drop is completed - */ - - private native void dropDone(long nativeDragContext, long nativeDropTransfer, - boolean localTx, boolean success, int dropAction); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MEmbedCanvasPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MEmbedCanvasPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,584 +0,0 @@ -/* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.awt.motif; - -import java.awt.*; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetListener; -import java.awt.event.*; -import java.awt.image.ColorModel; -import java.awt.image.ImageObserver; -import java.awt.image.ImageProducer; -import java.awt.image.VolatileImage; -import java.awt.peer.*; -import sun.awt.*; -import sun.awt.motif.X11FontMetrics; -import java.lang.reflect.*; -import java.util.logging.*; -import java.util.*; - -// FIXME: Add X errors handling -// FIXME: Add chaining of parameters to XEmbed-client if we are both(accelerators; XDND; focus already automatically) -public class MEmbedCanvasPeer extends MCanvasPeer implements WindowFocusListener, KeyEventPostProcessor, ModalityListener, WindowIDProvider { - private static final Logger xembedLog = Logger.getLogger("sun.awt.motif.xembed.MEmbedCanvasPeer"); - - final static int XEMBED_VERSION = 0, - XEMBED_MAPPED = (1 << 0); -/* XEMBED messages */ - final static int XEMBED_EMBEDDED_NOTIFY = 0; - final static int XEMBED_WINDOW_ACTIVATE = 1; - final static int XEMBED_WINDOW_DEACTIVATE = 2; - final static int XEMBED_REQUEST_FOCUS =3; - final static int XEMBED_FOCUS_IN = 4; - final static int XEMBED_FOCUS_OUT = 5; - final static int XEMBED_FOCUS_NEXT = 6; - final static int XEMBED_FOCUS_PREV = 7; -/* 8-9 were used for XEMBED_GRAB_KEY/XEMBED_UNGRAB_KEY */ - final static int XEMBED_GRAB_KEY = 8; - final static int XEMBED_UNGRAB_KEY = 9; - final static int XEMBED_MODALITY_ON = 10; - final static int XEMBED_MODALITY_OFF = 11; - final static int XEMBED_REGISTER_ACCELERATOR = 12; - final static int XEMBED_UNREGISTER_ACCELERATOR= 13; - final static int XEMBED_ACTIVATE_ACCELERATOR = 14; - - final static int NON_STANDARD_XEMBED_GTK_GRAB_KEY = 108; - final static int NON_STANDARD_XEMBED_GTK_UNGRAB_KEY = 109; - -// A detail code is required for XEMBED_FOCUS_IN. The following values are valid: -/* Details for XEMBED_FOCUS_IN: */ - final static int XEMBED_FOCUS_CURRENT = 0; - final static int XEMBED_FOCUS_FIRST = 1; - final static int XEMBED_FOCUS_LAST = 2; - -// Modifiers bits - final static int XEMBED_MODIFIER_SHIFT = (1 << 0); - final static int XEMBED_MODIFIER_CONTROL = (1 << 1); - final static int XEMBED_MODIFIER_ALT = (1 << 2); - final static int XEMBED_MODIFIER_SUPER = (1 << 3); - final static int XEMBED_MODIFIER_HYPER = (1 << 4); - - boolean applicationActive; // Whether the application is active(has focus) - Map accelerators = new HashMap(); // Maps accelerator ID into AWTKeyStroke - Map accel_lookup = new HashMap(); // Maps AWTKeyStroke into accelerator ID - Set grabbed_keys = new HashSet(); // A set of keys grabbed by client - Object ACCEL_LOCK = accelerators; // Lock object for working with accelerators; - Object GRAB_LOCK = grabbed_keys; // Lock object for working with keys grabbed by client - - MEmbedCanvasPeer() {} - - MEmbedCanvasPeer(Component target) { - super(target); - } - - void initialize() { - super.initialize(); - - installActivateListener(); - installAcceleratorListener(); - installModalityListener(); - - // XEmbed canvas should be non-traversable. - // FIXME: Probably should be removed and enforced setting of it by the users - target.setFocusTraversalKeysEnabled(false); - - initXEmbedServer(); - } - - void installModalityListener() { - ((SunToolkit)Toolkit.getDefaultToolkit()).addModalityListener(this); - } - - void deinstallModalityListener() { - ((SunToolkit)Toolkit.getDefaultToolkit()).removeModalityListener(this); - } - - void installAcceleratorListener() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(this); - } - - void deinstallAcceleratorListener() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventPostProcessor(this); - } - - void installActivateListener() { - // FIXME: should watch for hierarchy changes - Window toplevel = getTopLevel(target); - if (toplevel != null) { - toplevel.addWindowFocusListener(this); - applicationActive = toplevel.isFocused(); - } - } - - void deinstallActivateListener() { - Window toplevel = getTopLevel(target); - if (toplevel != null) { - toplevel.removeWindowFocusListener(this); - } - } - - native boolean isXEmbedActive(); - - boolean isApplicationActive() { - return applicationActive; - } - - native void initDispatching(); - - native void endDispatching(); - - native void embedChild(long child); - - native void childDestroyed(); - - public void handleEvent(AWTEvent e) { - super.handleEvent(e); - if (isXEmbedActive()) { - switch (e.getID()) { - case FocusEvent.FOCUS_GAINED: - canvasFocusGained((FocusEvent)e); - break; - case FocusEvent.FOCUS_LOST: - canvasFocusLost((FocusEvent)e); - break; - case KeyEvent.KEY_PRESSED: - case KeyEvent.KEY_RELEASED: - if (!((InputEvent)e).isConsumed()) { - forwardKeyEvent((KeyEvent)e); - } - break; - } - } - } - - public Dimension getPreferredSize() { - if (isXEmbedActive()) { - Dimension dim = getEmbedPreferredSize(); - if (dim == null) { - return super.getPreferredSize(); - } else { - return dim; - } - } else { - return super.getPreferredSize(); - } - } - native Dimension getEmbedPreferredSize(); - public Dimension getMinimumSize() { - if (isXEmbedActive()) { - Dimension dim = getEmbedMinimumSize(); - if (dim == null) { - return super.getMinimumSize(); - } else { - return dim; - } - } else { - return super.getMinimumSize(); - } - } - native Dimension getEmbedMinimumSize(); - protected void disposeImpl() { - if (isXEmbedActive()) { - detachChild(); - } - deinstallActivateListener(); - deinstallModalityListener(); - deinstallAcceleratorListener(); - - destroyXEmbedServer(); - super.disposeImpl(); - } - - public boolean isFocusable() { - return true; - } - - Window getTopLevel(Component comp) { - while (comp != null && !(comp instanceof Window)) { - comp = comp.getParent(); - } - return (Window)comp; - } - - native Rectangle getClientBounds(); - - void childResized() { - if (xembedLog.isLoggable(Level.FINER)) { - Rectangle bounds = getClientBounds(); - xembedLog.finer("Child resized: " + bounds); - // It is not required to update embedder's size when client size changes - // However, since there is no any means to get client size it seems to be the - // only way to provide it. However, it contradicts with Java layout concept - - // so it is disabled for now. -// Rectangle my_bounds = getBounds(); -// setBounds(my_bounds.x, my_bounds.y, bounds.width, bounds.height, SET_BOUNDS); - } - postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_RESIZED)); - } - - void focusNext() { - if (isXEmbedActive()) { - xembedLog.fine("Requesting focus for the next component after embedder"); - postEvent(new InvocationEvent(target, new Runnable() { - public void run() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent(target); - } - })); - } else { - xembedLog.fine("Application is not active - denying focus next"); - } - } - - void focusPrev() { - if (isXEmbedActive()) { - xembedLog.fine("Requesting focus for the next component after embedder"); - postEvent(new InvocationEvent(target, new Runnable() { - public void run() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().focusPreviousComponent(target); - } - })); - } else { - xembedLog.fine("Application is not active - denying focus prev"); - } - } - - void requestXEmbedFocus() { - if (isXEmbedActive()) { - xembedLog.fine("Requesting focus for client"); - postEvent(new InvocationEvent(target, new Runnable() { - public void run() { - target.requestFocusInWindow(); - } - })); - } else { - xembedLog.fine("Application is not active - denying request focus"); - } - } - - native void notifyChildEmbedded(); - - native void detachChild(); - - public void windowGainedFocus(WindowEvent e) { - applicationActive = true; - if (isXEmbedActive()) { - xembedLog.fine("Sending WINDOW_ACTIVATE"); - sendMessage(XEMBED_WINDOW_ACTIVATE); - } - } - - public void windowLostFocus(WindowEvent e) { - applicationActive = false; - if (isXEmbedActive()) { - xembedLog.fine("Sending WINDOW_DEACTIVATE"); - sendMessage(XEMBED_WINDOW_DEACTIVATE); - } - } - - void canvasFocusGained(FocusEvent e) { - if (isXEmbedActive()) { - xembedLog.fine("Forwarding FOCUS_GAINED"); - int flavor = XEMBED_FOCUS_CURRENT; - if (e instanceof CausedFocusEvent) { - CausedFocusEvent ce = (CausedFocusEvent)e; - if (ce.getCause() == CausedFocusEvent.Cause.TRAVERSAL_FORWARD) { - flavor = XEMBED_FOCUS_FIRST; - } else if (ce.getCause() == CausedFocusEvent.Cause.TRAVERSAL_BACKWARD) { - flavor = XEMBED_FOCUS_LAST; - } - } - sendMessage(XEMBED_FOCUS_IN, flavor, 0, 0); - } - } - - void canvasFocusLost(FocusEvent e) { - if (isXEmbedActive() && !e.isTemporary()) { - xembedLog.fine("Forwarding FOCUS_LOST"); - Component opp = e.getOppositeComponent(); - int num = 0; - try { - num = Integer.parseInt(opp.getName()); - } catch (NumberFormatException nfe) { - } - sendMessage(XEMBED_FOCUS_OUT, num, 0, 0); - } - } - - native void forwardKeyEvent(KeyEvent e); - - void grabKey(final long keysym, final long modifiers) { - postEvent(new InvocationEvent(target, new Runnable() { - public void run() { - GrabbedKey grab = new GrabbedKey(keysym, modifiers); - if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Grabbing key: " + grab); - synchronized(GRAB_LOCK) { - grabbed_keys.add(grab); - } - } - })); - } - - void ungrabKey(final long keysym, final long modifiers) { - postEvent(new InvocationEvent(target, new Runnable() { - public void run() { - GrabbedKey grab = new GrabbedKey(keysym, modifiers); - if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("UnGrabbing key: " + grab); - synchronized(GRAB_LOCK) { - grabbed_keys.remove(grab); - } - } - })); - } - - void registerAccelerator(final long accel_id, final long keysym, final long modifiers) { - postEvent(new InvocationEvent(target, new Runnable() { - public void run() { - AWTKeyStroke stroke = getKeyStrokeForKeySym(keysym, modifiers); - if (stroke != null) { - if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Registering accelerator " + accel_id + " for " + stroke); - synchronized(ACCEL_LOCK) { - accelerators.put(accel_id, stroke); - accel_lookup.put(stroke, accel_id); - } - } - // Propogate accelerators to the another embedder - propogateRegisterAccelerator(stroke); - } - })); - } - - void unregisterAccelerator(final long accel_id) { - postEvent(new InvocationEvent(target, new Runnable() { - public void run() { - AWTKeyStroke stroke = null; - synchronized(ACCEL_LOCK) { - stroke = accelerators.get(accel_id); - if (stroke != null) { - if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Unregistering accelerator: " + accel_id); - accelerators.remove(accel_id); - accel_lookup.remove(stroke); // FIXME: How about several accelerators with the same stroke? - } - } - // Propogate accelerators to the another embedder - propogateUnRegisterAccelerator(stroke); - } - })); - } - - void propogateRegisterAccelerator(AWTKeyStroke stroke) { - // Find the top-level and see if it is XEmbed client. If so, ask him to - // register the accelerator - MWindowPeer parent = getParentWindow(); - if (parent != null && parent instanceof MEmbeddedFramePeer) { - MEmbeddedFramePeer embedded = (MEmbeddedFramePeer)parent; - embedded.registerAccelerator(stroke); - } - } - - void propogateUnRegisterAccelerator(AWTKeyStroke stroke) { - // Find the top-level and see if it is XEmbed client. If so, ask him to - // register the accelerator - MWindowPeer parent = getParentWindow(); - if (parent != null && parent instanceof MEmbeddedFramePeer) { - MEmbeddedFramePeer embedded = (MEmbeddedFramePeer)parent; - embedded.unregisterAccelerator(stroke); - } - } - - public boolean postProcessKeyEvent(KeyEvent e) { - // Processing events only if we are in the focused window. - MWindowPeer parent = getParentWindow(); - if (parent == null || !((Window)parent.target).isFocused() || target.isFocusOwner()) { - return false; - } - - boolean result = false; - - if (xembedLog.isLoggable(Level.FINER)) xembedLog.finer("Post-processing event " + e); - - // Process ACCELERATORS - AWTKeyStroke stroke = AWTKeyStroke.getAWTKeyStrokeForEvent(e); - long accel_id = 0; - boolean exists = false; - synchronized(ACCEL_LOCK) { - exists = accel_lookup.containsKey(stroke); - if (exists) { - accel_id = accel_lookup.get(stroke).longValue(); - } - } - if (exists) { - if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Activating accelerator " + accel_id); - sendMessage(XEMBED_ACTIVATE_ACCELERATOR, accel_id, 0, 0); // FIXME: How about overloaded? - result = true; - } - - // Process Grabs, unofficial GTK feature - exists = false; - GrabbedKey key = new GrabbedKey(e); - synchronized(GRAB_LOCK) { - exists = grabbed_keys.contains(key); - } - if (exists) { - if (xembedLog.isLoggable(Level.FINE)) xembedLog.fine("Forwarding grabbed key " + e); - forwardKeyEvent(e); - result = true; - } - - return result; - } - - public void modalityPushed(ModalityEvent ev) { - sendMessage(XEMBED_MODALITY_ON); - } - - public void modalityPopped(ModalityEvent ev) { - sendMessage(XEMBED_MODALITY_OFF); - } - - int getModifiers(int state) { - int mods = 0; - if ((state & XEMBED_MODIFIER_SHIFT) != 0) { - mods |= InputEvent.SHIFT_DOWN_MASK; - } - if ((state & XEMBED_MODIFIER_CONTROL) != 0) { - mods |= InputEvent.CTRL_DOWN_MASK; - } - if ((state & XEMBED_MODIFIER_ALT) != 0) { - mods |= InputEvent.ALT_DOWN_MASK; - } - // FIXME: What is super/hyper? - // FIXME: Experiments show that SUPER is ALT. So what is Alt then? - if ((state & XEMBED_MODIFIER_SUPER) != 0) { - mods |= InputEvent.ALT_DOWN_MASK; - } -// if ((state & XEMBED_MODIFIER_HYPER) != 0) { -// mods |= InputEvent.DOWN_MASK; -// } - return mods; - } - - // Shouldn't be called on Toolkit thread. - AWTKeyStroke getKeyStrokeForKeySym(long keysym, long state) { - - int keycode = getAWTKeyCodeForKeySym((int)keysym); - int modifiers = getModifiers((int)state); - return AWTKeyStroke.getAWTKeyStroke(keycode, modifiers); - } - native int getAWTKeyCodeForKeySym(int keysym); - native void sendMessage(int msg); - native void sendMessage(int msg, long detail, long data1, long data2); - MWindowPeer getParentWindow() { - Component parent = target.getParent(); - synchronized(target.getTreeLock()) { - while (parent != null && !(parent.getPeer() instanceof MWindowPeer)) { - parent = parent.getParent(); - } - return (parent != null)?(MWindowPeer)parent.getPeer():null; - } - } - - private static class XEmbedDropTarget extends DropTarget { - public void addDropTargetListener(DropTargetListener dtl) - throws TooManyListenersException { - // Drop target listeners registered with this target will never be - // notified, since all drag notifications are routed to the XEmbed - // client. To avoid confusion we prohibit listeners registration - // by throwing TooManyListenersException as if there is a listener - // registered with this target already. - throw new TooManyListenersException(); - } - } - - public void setXEmbedDropTarget() { - // Register a drop site on the top level. - Runnable r = new Runnable() { - public void run() { - target.setDropTarget(new XEmbedDropTarget()); - } - }; - SunToolkit.executeOnEventHandlerThread(target, r); - } - - public void removeXEmbedDropTarget() { - // Unregister a drop site on the top level. - Runnable r = new Runnable() { - public void run() { - if (target.getDropTarget() instanceof XEmbedDropTarget) { - target.setDropTarget(null); - } - } - }; - SunToolkit.executeOnEventHandlerThread(target, r); - } - - public boolean processXEmbedDnDEvent(long ctxt, int eventID) { - if (target.getDropTarget() instanceof XEmbedDropTarget) { - forwardEventToEmbedded(ctxt, eventID); - return true; - } else { - return false; - } - } - - native void forwardEventToEmbedded(long ctxt, int eventID); - native void initXEmbedServer(); - native void destroyXEmbedServer(); - public native long getWindow(); -} -class GrabbedKey { - long keysym; - long modifiers; - GrabbedKey(long keysym, long modifiers) { - this.keysym = keysym; - this.modifiers = modifiers; - } - - GrabbedKey(KeyEvent ev) { - init(ev); - } - - native void initKeySymAndModifiers(KeyEvent e); - - private void init(KeyEvent e) { - initKeySymAndModifiers(e); - } - - public int hashCode() { - return (int)keysym & 0xFFFFFFFF; - } - - public boolean equals(Object o) { - if (!(o instanceof GrabbedKey)) { - return false; - } - GrabbedKey key = (GrabbedKey)o; - return (keysym == key.keysym && modifiers == key.modifiers); - } - - public String toString() { - return "Key combination[keysym=" + keysym + ", mods=" + modifiers + "]"; - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MEmbeddedFrame.java --- a/jdk/src/solaris/classes/sun/awt/motif/MEmbeddedFrame.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -/* - * Copyright 1996-2004 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. - */ - -package sun.awt.motif; - -import java.awt.Component; -import java.awt.peer.FramePeer; -import sun.awt.EmbeddedFrame; -import java.awt.peer.ComponentPeer; -import sun.awt.*; -import java.awt.*; - -public class MEmbeddedFrame extends EmbeddedFrame { - - /** - * Widget id of the shell widget - */ - long handle; - - public enum IDKind { - WIDGET, - WINDOW - }; - - public MEmbeddedFrame() { - } - - /** - * Backward-compatible implementation. This constructor takes widget which represents Frame's - * shell and uses it as top-level to build hierarchy of top-level widgets upon. It assumes that - * no XEmbed support is provided. - * @param widget a valid Xt widget pointer. - */ - public MEmbeddedFrame(long widget) { - this(widget, IDKind.WIDGET, false); - } - - /** - * New constructor, gets X Window id and allows to specify whether XEmbed is supported by parent - * X window. Creates hierarchy of top-level widgets under supplied window ID. - * @param winid a valid X window - * @param supportsXEmbed whether the host application supports XEMBED protocol - */ - public MEmbeddedFrame(long winid, boolean supportsXEmbed) { - this(winid, IDKind.WINDOW, supportsXEmbed); - } - - /** - * Creates embedded frame using ID as parent. - * @param ID parent ID - * @param supportsXEmbed whether the host application supports XEMBED protocol - * @param kind if WIDGET, ID represents a valid Xt widget pointer; if WINDOW, ID is a valid X Window - * ID - */ - public MEmbeddedFrame(long ID, IDKind kind, boolean supportsXEmbed) { - super(supportsXEmbed); - if (kind == IDKind.WIDGET) { - this.handle = ID; - } else { - this.handle = getWidget(ID); - } - MToolkit toolkit = (MToolkit)Toolkit.getDefaultToolkit(); - setPeer(toolkit.createEmbeddedFrame(this)); - /* - * addNotify() creates a LightweightDispatcher that propagates - * SunDropTargetEvents to subcomponents. - * NOTE: show() doesn't call addNotify() for embedded frames. - */ - addNotify(); - show(); - } - - public void synthesizeWindowActivation(boolean b) { - MEmbeddedFramePeer peer = (MEmbeddedFramePeer)getPeer(); - if (peer != null) { - if (peer.supportsXEmbed()) { - if (peer.isXEmbedActive()) { - // If XEmbed is active no synthetic focus events are allowed - everything - // should go through XEmbed - if (b) { - peer.requestXEmbedFocus(); - } - } - } else { - peer.synthesizeFocusInOut(b); - } - } - } - - public void show() { - if (handle != 0) { - mapWidget(handle); - } - super.show(); - } - - protected boolean traverseOut(boolean direction) { - MEmbeddedFramePeer xefp = (MEmbeddedFramePeer) getPeer(); - xefp.traverseOut(direction); - return true; - } - - // Native methods to handle widget <-> X Windows mapping - // - static native long getWidget(long winid); - static native int mapWidget(long widget); - public void registerAccelerator(AWTKeyStroke stroke) { - MEmbeddedFramePeer xefp = (MEmbeddedFramePeer) getPeer(); - if (xefp != null) { - xefp.registerAccelerator(stroke); - } - } - public void unregisterAccelerator(AWTKeyStroke stroke) { - MEmbeddedFramePeer xefp = (MEmbeddedFramePeer) getPeer(); - if (xefp != null) { - xefp.unregisterAccelerator(stroke); - } - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MEmbeddedFramePeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MEmbeddedFramePeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,213 +0,0 @@ -/* - * Copyright 1996-2008 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. - */ - -package sun.awt.motif; - -import sun.awt.EmbeddedFrame; -import java.util.logging.*; -import java.awt.Component; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Window; -import java.awt.AWTKeyStroke; -import java.awt.Component; -import java.awt.Container; -import sun.awt.SunToolkit; -import java.util.LinkedList; -import java.util.Iterator; - -import sun.java2d.SurfaceData; - -public class MEmbeddedFramePeer extends MFramePeer { - private static final Logger xembedLog = Logger.getLogger("sun.awt.motif.xembed.MEmbeddedFramePeer"); - -// A detail code is required for XEMBED_FOCUS_IN. The following values are valid: -/* Details for XEMBED_FOCUS_IN: */ - final static int XEMBED_FOCUS_CURRENT = 0; - final static int XEMBED_FOCUS_FIRST = 1; - final static int XEMBED_FOCUS_LAST = 2; - - LinkedList strokes = new LinkedList(); - - public MEmbeddedFramePeer(EmbeddedFrame target) { - super(target); - xembedLog.fine("Creating XEmbed-enabled motif embedded frame, frame supports XEmbed:" + supportsXEmbed()); - } - - void create(MComponentPeer parent) { - NEFcreate(parent, ((MEmbeddedFrame)target).handle); - } - native void NEFcreate(MComponentPeer parent, long handle); - native void pShowImpl(); - void pShow() { - pShowImpl(); - } - - boolean supportsXEmbed() { - EmbeddedFrame frame = (EmbeddedFrame)target; - if (frame != null) { - return frame.supportsXEmbed(); - } else { - return false; - } - } - - public void setVisible(boolean vis) { - super.setVisible(vis); - xembedLog.fine("Peer made visible"); - if (vis && !supportsXEmbed()) { - xembedLog.fine("Synthesizing FocusIn"); - // Fix for 4878303 - generate WINDOW_GAINED_FOCUS and update if we were focused - // since noone will do it for us(WM does it for regular top-levels) - synthesizeFocusInOut(true); - } - } - public native void synthesizeFocusInOut(boolean b); - - native boolean isXEmbedActive(); - native boolean isXEmbedApplicationActive(); - native void requestXEmbedFocus(); - - public boolean requestWindowFocus() { - xembedLog.fine("In requestWindowFocus"); - // Should check for active state of host application - if (isXEmbedActive()) { - if (isXEmbedApplicationActive()) { - xembedLog.fine("Requesting focus from embedding host"); - requestXEmbedFocus(); - return true; - } else { - xembedLog.fine("Host application is not active"); - return false; - } - } else { - xembedLog.fine("Requesting focus from X"); - return super.requestWindowFocus(); - } - } - - void registerAccelerator(AWTKeyStroke stroke) { -// if (stroke == null) return; -// strokes.add(stroke); -// if (isXEmbedActive()) { -// nativeRegisterAccelerator(stroke, strokes.size()-1); -// } - } - - void unregisterAccelerator(AWTKeyStroke stroke) { -// if (stroke == null) return; -// if (isXEmbedActive()) { -// int index = strokes.indexOf(stroke); -// nativeUnregisterAccelerator(index); -// } - } - - void notifyStarted() { - // Register accelerators -// int i = 0; -// Iterator iter = strokes.iterator(); -// while (iter.hasNext()) { -// nativeRegisterAccelerator(iter.next(), i++); -// } - - updateDropTarget(); - } - - native void traverseOut(boolean direction); - - void handleFocusIn(int detail) { - xembedLog.log(Level.FINE, "handleFocusIn {0}", new Object[]{Integer.valueOf(detail)}); - switch(detail) { - case XEMBED_FOCUS_CURRENT: - // Do nothing - just restore to the current value - break; - case XEMBED_FOCUS_FIRST: - SunToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - Component comp = ((Container)target).getFocusTraversalPolicy().getFirstComponent((Container)target); - if (comp != null) { - comp.requestFocusInWindow(); - } - }}); - break; - case XEMBED_FOCUS_LAST: - SunToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - Component comp = ((Container)target).getFocusTraversalPolicy().getLastComponent((Container)target); - if (comp != null) { - comp.requestFocusInWindow(); - } - }}); - break; - } - } - public void handleWindowFocusIn() { - super.handleWindowFocusIn(); - xembedLog.fine("windowFocusIn"); - } - public void handleWindowFocusOut(Window oppositeWindow) { - super.handleWindowFocusOut(oppositeWindow); - xembedLog.fine("windowFocusOut, opposite is null?:" + (oppositeWindow==null)); - } - - native void pReshapePrivate(int x, int y, int w, int h); - - public void setBoundsPrivate(int x, int y, int width, int height) - { - if (disposed) - { - return; - } - - // Should set paintPending before reshape to prevent - // thread race between PaintEvent and setBounds - // This part of the 4267393 fix proved to be unstable under solaris, - // dissabled due to regressions 4418155, 4486762, 4490079 - paintPending = false; //checkNativePaintOnSetBounds(width, height); - - pReshapePrivate(x, y, width, height); - - if ((width != oldWidth) || (height != oldHeight)) - { - SurfaceData oldData = surfaceData; - if (oldData != null) { - surfaceData = graphicsConfig.createSurfaceData(this); - oldData.invalidate(); - } - oldWidth = width; - oldHeight = height; - } - validateSurface(width, height); - serialNum++; - } - - public native Rectangle getBoundsPrivate(); - - @Override - Rectangle constrainBounds(int x, int y, int width, int height) { - // We don't constrain the bounds of the EmbeddedFrames - return new Rectangle(x, y, width, height); - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MFileDialogPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MFileDialogPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,300 +0,0 @@ -/* - * Copyright 1995-2003 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.io.*; -import java.awt.datatransfer.*; -import java.util.ArrayList; -import sun.awt.datatransfer.ToolkitThreadBlockedHandler; - -public class MFileDialogPeer extends MDialogPeer implements FileDialogPeer { - private FilenameFilter filter; - private String[] NativeFilteredFiles; - native void create(MComponentPeer parent); - void create(MComponentPeer parent, Object arg) { - create(parent); - } - public MFileDialogPeer(FileDialog target) { - super(target); - FileDialog fdialog = (FileDialog)target; - String dir = fdialog.getDirectory(); - String file = fdialog.getFile(); - FilenameFilter filter = fdialog.getFilenameFilter(); - - insets = new Insets(0, 0, 0, 0); - setDirectory(dir); - if (file != null) { - setFile(file); - } - setFilenameFilter(filter); - } - native void pReshape(int x, int y, int width, int height); - native void pDispose(); - native void pShow(); - native void pHide(); - native void setFileEntry(String dir, String file, String[] ffiles); - native void insertReplaceFileDialogText(String l); - public native void setFont(Font f); - - String getFilteredFile(String file) { - if (file == null) { - file = ((FileDialog)target).getFile(); - } - String dir = ((FileDialog)target).getDirectory(); - if (dir == null) { - dir = "./"; - } - if (file == null) { - file = ""; - } - if (filter != null && !filter.accept(new File(dir), file)) { - file = ""; - } - return file; - } - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleSelected(final String file) { - final FileDialog fileDialog = (FileDialog)target; - MToolkit.executeOnEventHandlerThread(fileDialog, new Runnable() { - public void run() { - int index = file.lastIndexOf(java.io.File.separatorChar);/*2509*//*ibm*/ - String dir; - - if (index == -1) { - dir = "."+java.io.File.separator; - fileDialog.setFile(file); - } else { - dir = file.substring(0, index + 1); - fileDialog.setFile(file.substring(index + 1)); - } - fileDialog.setDirectory(dir); - fileDialog.hide(); - } - }); - } // handleSelected() - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleCancel() { - final FileDialog fileDialog = (FileDialog)target; - MToolkit.executeOnEventHandlerThread(fileDialog, new Runnable() { - public void run() { - fileDialog.setFile(null); - fileDialog.hide(); - } - }); - } // handleCancel() - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleQuit() { - final FileDialog fileDialog = (FileDialog)target; - MToolkit.executeOnEventHandlerThread(fileDialog, new Runnable() { - public void run() { - fileDialog.hide(); - } - }); - } // handleQuit() - - public void setDirectory(String dir) { - String file = ((FileDialog)target).getFile(); - setFileEntry((dir != null) ? dir : "./", (file != null) ? file - : "", null); - } - - - public void setFile(String file) { - String dir = ((FileDialog)target).getDirectory(); - if (dir == null) { - dir = "./"; - } - setFileEntry((dir != null) ? dir : "./", getFilteredFile(null), null); - } - class DirectoryFilter implements FilenameFilter { - FilenameFilter userFilter; - DirectoryFilter(FilenameFilter userFilter) { - this.userFilter = userFilter; - } - public boolean accept(File parent, String name) { - File toTest = new File(parent, name); - if (toTest.isDirectory()) { - return false; - } else if (userFilter != null) { - return userFilter.accept(parent, name); - } else { - return true; - } - } - } - public void doFilter(FilenameFilter filter, String dir) { - String d = (dir == null) ? (((FileDialog)target).getDirectory()):(dir); - String f = getFilteredFile(null); - File df = new File((d != null) ? d : "."); - String[] files = df.list(new DirectoryFilter(filter)); - String[] nffiles = NativeFilteredFiles; - - // At this point we have two file lists. - // The first one is a filtered list of files that we retrieve - // by using Java code and Java filter. - // The second one is a filtered list of files that we retrieve - // by using the native code and native pattern. - // We should find an intersection of these two lists. The result - // will be exactly what we expect to see in setFileEntry. - // For more details please see 4784704. - if ( files != null ) { - ArrayList filearr = new ArrayList(); - if (nffiles != null) { - for (int j = 0; j < files.length; j++) { - for (int n = 0; n < nffiles.length; n++) { - if (files[j].equals(nffiles[n])) { - filearr.add(files[j]); - break; - } - } - } - } - files = new String[filearr.size()]; - for (int i = 0; i < files.length; i++) { - files[i] = (String)filearr.get(i); - } - } - if (files == null || files.length == 0) { - files = new String[1]; - files[0] = ""; - } - setFileEntry((d != null) ? d : ".", (f != null) ? f : "", files); - } - private boolean proceedFiltering(final String dir, String[] nffiles, - boolean isPrivileged) - { - // Transfer the native filtered file list to the doFilter method. - NativeFilteredFiles = nffiles; - // If we are not on the Toolkit thread we can call doFilter() directly. - // If the filter is null no user code will be invoked - if (!isPrivileged || filter == null) { - try { - doFilter(filter, dir); - return true; - } catch(Exception e) { - e.printStackTrace(); - return false; - } - } - // Otherwise we have to call user code on EvenDispatchThread - final ToolkitThreadBlockedHandler priveleged_lock = - MToolkitThreadBlockedHandler.getToolkitThreadBlockedHandler(); - final boolean[] finished = new boolean[1]; - final boolean[] result = new boolean[1]; - finished[0] = false; - result[0] = false; - - - // Use the same Toolkit blocking mechanism as in DnD. - priveleged_lock.lock(); - - MToolkit.executeOnEventHandlerThread((FileDialog)target, new Runnable() { - public void run() { - priveleged_lock.lock(); - try { - doFilter(filter, dir); - result[0] = true; - } catch (Exception e) { - e.printStackTrace(); - result[0] = false; - } finally { - finished[0] = true; - priveleged_lock.exit(); - priveleged_lock.unlock(); - } - } - }); - - while (!finished[0]) { - priveleged_lock.enter(); - } - - priveleged_lock.unlock(); - - return result[0]; - } - - public void setFilenameFilter(FilenameFilter filter) { - this.filter = filter; - FileDialog fdialog = (FileDialog)target; - String dir = fdialog.getDirectory(); - String file = fdialog.getFile(); - setFile(file); - doFilter(filter, null); - } - - // Called from native widget when paste key is pressed and we - // already own the selection (prevents Motif from hanging while - // waiting for the selection) - // - public void pasteFromClipboard() { - Clipboard clipboard = target.getToolkit().getSystemClipboard(); - - Transferable content = clipboard.getContents(this); - if (content != null) { - try { - String data = (String)(content.getTransferData(DataFlavor.stringFlavor)); - insertReplaceFileDialogText(data); - } catch (Exception e) { - } - } - } - -// CAVEAT: -// Peer coalescing code turned over the fact that the following functions -// were being inherited from Dialog and were not implemented in awt_FileDialog.c -// Five methods decribed by the peer interface are at fault (setResizable, setTitle, -// toFront, toBack and handleFocusTraversalEvent). Additionally show has to be overridden -// as it was necessary to add a show function in MDialogPeer for modality flag passing. -// As a result we were winding up in awt_Dialog.c (now coalesced into awt_TopLevel). -// As Filedialogs are modal and its unclear to me that any of these functions -// can be called while the FD is on-screen let it go. RJM. - public void show() { - // must have our own show or we wind up in pShow for Window. Bad. Very bad. - setVisible(true); - setFilenameFilter(filter); - } - - /** - * MFileDialogPeer doesn't have native pData so we don't do restack on it - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return false; - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MFramePeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MFramePeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,511 +0,0 @@ -/* - * Copyright 1995-2008 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. - */ -package sun.awt.motif; - -import java.util.Vector; -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.*; -import sun.awt.motif.MInputMethodControl; -import sun.awt.im.*; -import java.awt.image.ColorModel; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferInt; -import java.awt.image.DataBufferByte; -import java.awt.image.DataBufferUShort; -import java.awt.image.ImageObserver; -import java.awt.image.WritableRaster; -import sun.awt.image.ImageRepresentation; -import sun.awt.image.ToolkitImage; - -class MFramePeer extends MWindowPeer implements FramePeer, MInputMethodControl { - static Vector allFrames = new Vector(); - - // XXX: Stub out for now. Need to propagate to normal size hints. - public void setMaximizedBounds(Rectangle b) {} - - public void create(MComponentPeer parent, Object arg) { - super.create( parent ); - } - - MFramePeer(Frame target) { - super(); - // set the window attributes for this Frame - winAttr.nativeDecor = !target.isUndecorated(); - winAttr.initialFocus = true; - winAttr.isResizable = target.isResizable(); - winAttr.initialState = target.getState(); - winAttr.title = target.getTitle(); - winAttr.icon = target.getIconImage(); - if (winAttr.nativeDecor) { - winAttr.decorations = winAttr.AWT_DECOR_ALL; - } else { - winAttr.decorations = winAttr.AWT_DECOR_NONE; - } - - // for input method windows, use minimal decorations - if (target instanceof InputMethodWindow) { - winAttr.initialFocus = false; - winAttr.decorations = (winAttr.AWT_DECOR_TITLE | winAttr.AWT_DECOR_BORDER); - } - - // create and init native component - init( target); - if (winAttr.icon != null) { - setIconImage(winAttr.icon); - } - allFrames.addElement(this); - } - - public void setTitle(String title) { - pSetTitle(title); - } - - protected void disposeImpl() { - allFrames.removeElement(this); - super.disposeImpl(); - } - - public void setMenuBar(MenuBar mb) { - MMenuBarPeer mbpeer = (MMenuBarPeer) MToolkit.targetToPeer(mb); - pSetMenuBar(mbpeer); - - Rectangle r = target.bounds(); - - pReshape(r.x, r.y, r.width, r.height); - if (target.isVisible()) { - target.validate(); - } - } - - public void setIconImage(Image im) { - int width; - int height; - GraphicsConfiguration defaultGC; - if (im != null) { // 4633887 Avoid Null pointer exception. - if (im instanceof ToolkitImage) { - ImageRepresentation ir = ((ToolkitImage)im).getImageRep(); - ir.reconstruct(ImageObserver.ALLBITS); - width = ir.getWidth(); - height = ir.getHeight(); - } - else { - width = im.getWidth(null); - height = im.getHeight(null); - } - if (pGetIconSize(width, height)) { - //Icons are displayed using the default visual, so create image - //using default GraphicsConfiguration - defaultGC = getGraphicsConfiguration().getDevice(). - getDefaultConfiguration(); - ColorModel model = defaultGC.getColorModel(); - WritableRaster raster = - model.createCompatibleWritableRaster(iconWidth, iconHeight); - Image image = new BufferedImage(model, raster, - model.isAlphaPremultiplied(), - null); - - // ARGB BufferedImage to hunt for transparent pixels - BufferedImage bimage = - new BufferedImage(iconWidth, iconHeight, - BufferedImage.TYPE_INT_ARGB); - ColorModel alphaCheck = bimage.getColorModel(); - Graphics g = image.getGraphics(); - Graphics big = bimage.getGraphics(); - try { - g.drawImage(im, 0, 0, iconWidth, iconHeight, null); - big.drawImage(im, 0, 0, iconWidth, iconHeight, null); - } finally { - g.dispose(); - big.dispose(); - } - - DataBuffer db = ((BufferedImage)image).getRaster().getDataBuffer(); - DataBuffer bidb = bimage.getRaster().getDataBuffer(); - byte[] bytedata = null; - int[] intdata = null; - int bidbLen = bidb.getSize(); - int imgDataIdx; - //Get native RGB value for window background color - //Should work for byte as well as int - int bgRGB = getNativeColor(SystemColor.window, defaultGC); - - /* My first attempt at a solution to bug 4175560 was to use - * the iconMask and iconPixmap attributes of Windows. - * This worked fine on CDE/dtwm, however olwm displayed only - * single color icons (white on background). Instead, the - * fix gets the default background window color and replaces - * transparent pixels in the icon image with this color. This - * solutions works well with dtwm as well as olwm. - */ - - for (imgDataIdx = 0; imgDataIdx < bidbLen; imgDataIdx++) { - if (alphaCheck.getAlpha(bidb.getElem(imgDataIdx)) == 0 ) { - //Assuming single data bank - db.setElem(imgDataIdx, bgRGB); - } - } - short[] ushortdata = null; - if (db instanceof DataBufferByte) { - // Pseudocolor data - bytedata = ((DataBufferByte)db).getData(); - } - else if (db instanceof DataBufferInt) { - // Truecolor data - intdata = ((DataBufferInt) db).getData(); - } - else if (db instanceof DataBufferUShort) { - // Truecolor data - ushortdata = ((DataBufferUShort) db).getData(); - } - pSetIconImage(bytedata, intdata, ushortdata, - iconWidth, iconHeight); - } - } - } - - native boolean pGetIconSize(int widthHint, int heightHint); - - // [jk] added ushortData for 16-bpp displays - native void pSetIconImage(byte[] byteData, - int[] intData, - short[] ushortData, - int iconWidth, int iconHeight); - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleIconify() { - postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_ICONIFIED)); - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleDeiconify() { - postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_DEICONIFIED)); - } - - - /** - * Called to inform the Frame that it has moved. - */ - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleMoved(int x, int y) { - postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_MOVED)); - } - - static final int CROSSHAIR_INSET = 5; - - static final int BUTTON_Y = CROSSHAIR_INSET + 1; - static final int BUTTON_W = 17; - static final int BUTTON_H = 17; - - static final int SYS_MENU_X = CROSSHAIR_INSET + 1; - static final int SYS_MENU_CONTAINED_X = SYS_MENU_X + 5; - static final int SYS_MENU_CONTAINED_Y = BUTTON_Y + 7; - static final int SYS_MENU_CONTAINED_W = 8; - static final int SYS_MENU_CONTAINED_H = 3; - - static final int MAXIMIZE_X_DIFF = CROSSHAIR_INSET + BUTTON_W; - static final int MAXIMIZE_CONTAINED_X_DIFF = MAXIMIZE_X_DIFF - 5; - static final int MAXIMIZE_CONTAINED_Y = BUTTON_Y + 5; - static final int MAXIMIZE_CONTAINED_W = 8; - static final int MAXIMIZE_CONTAINED_H = 8; - - static final int MINIMIZE_X_DIFF = MAXIMIZE_X_DIFF + BUTTON_W; - static final int MINIMIZE_CONTAINED_X_DIFF = MINIMIZE_X_DIFF - 7; - static final int MINIMIZE_CONTAINED_Y = BUTTON_Y + 7; - static final int MINIMIZE_CONTAINED_W = 3; - static final int MINIMIZE_CONTAINED_H = 3; - - static final int TITLE_X = SYS_MENU_X + BUTTON_W; - static final int TITLE_W_DIFF = BUTTON_W * 3 + CROSSHAIR_INSET * 2 - 1; - static final int TITLE_MID_Y = BUTTON_Y + (BUTTON_H / 2); - - static final int MENUBAR_X = CROSSHAIR_INSET + 1; - static final int MENUBAR_Y = BUTTON_Y + BUTTON_H; - - static final int HORIZ_RESIZE_INSET = CROSSHAIR_INSET + BUTTON_H; - static final int VERT_RESIZE_INSET = CROSSHAIR_INSET + BUTTON_W; - - - /* - * Print the native component by rendering the Motif look ourselves. - * We also explicitly print the MenuBar since a MenuBar isn't a subclass - * of Component (and thus it has no "print" method which gets called by - * default). - */ - public void print(Graphics g) { - super.print(g); - - Frame f = (Frame)target; - Insets finsets = f.getInsets(); - Dimension fsize = f.getSize(); - - Color bg = f.getBackground(); - Color fg = f.getForeground(); - Color highlight = bg.brighter(); - Color shadow = bg.darker(); - - // Well, we could query for the currently running window manager - // and base the look on that, or we could just always do dtwm. - // aim, tball, and levenson all agree we'll just do dtwm. - - if (hasDecorations(MWindowAttributes.AWT_DECOR_BORDER)) { - - // top outer -- because we'll most likely be drawing on white paper, - // for aesthetic reasons, don't make any part of the outer border - // pure white - if (highlight.equals(Color.white)) { - g.setColor(new Color(230, 230, 230)); - } - else { - g.setColor(highlight); - } - g.drawLine(0, 0, fsize.width, 0); - g.drawLine(0, 1, fsize.width - 1, 1); - - // left outer - // if (highlight.equals(Color.white)) { - // g.setColor(new Color(230, 230, 230)); - // } - // else { - // g.setColor(highlight); - // } - g.drawLine(0, 0, 0, fsize.height); - g.drawLine(1, 0, 1, fsize.height - 1); - - // bottom cross-hair - g.setColor(highlight); - g.drawLine(CROSSHAIR_INSET + 1, fsize.height - CROSSHAIR_INSET, - fsize.width - CROSSHAIR_INSET, - fsize.height - CROSSHAIR_INSET); - - // right cross-hair - // g.setColor(highlight); - g.drawLine(fsize.width - CROSSHAIR_INSET, CROSSHAIR_INSET + 1, - fsize.width - CROSSHAIR_INSET, - fsize.height - CROSSHAIR_INSET); - - // bottom outer - g.setColor(shadow); - g.drawLine(1, fsize.height, fsize.width, fsize.height); - g.drawLine(2, fsize.height - 1, fsize.width, fsize.height - 1); - - // right outer - // g.setColor(shadow); - g.drawLine(fsize.width, 1, fsize.width, fsize.height); - g.drawLine(fsize.width - 1, 2, fsize.width - 1, fsize.height); - - // top cross-hair - // g.setColor(shadow); - g.drawLine(CROSSHAIR_INSET, CROSSHAIR_INSET, - fsize.width - CROSSHAIR_INSET, CROSSHAIR_INSET); - - // left cross-hair - // g.setColor(shadow); - g.drawLine(CROSSHAIR_INSET, CROSSHAIR_INSET, CROSSHAIR_INSET, - fsize.height - CROSSHAIR_INSET); - } - - if (hasDecorations(MWindowAttributes.AWT_DECOR_TITLE)) { - - if (hasDecorations(MWindowAttributes.AWT_DECOR_MENU)) { - - // system menu - g.setColor(bg); - g.fill3DRect(SYS_MENU_X, BUTTON_Y, BUTTON_W, BUTTON_H, true); - g.fill3DRect(SYS_MENU_CONTAINED_X, SYS_MENU_CONTAINED_Y, - SYS_MENU_CONTAINED_W, SYS_MENU_CONTAINED_H, true); - } - - // title bar - // g.setColor(bg); - g.fill3DRect(TITLE_X, BUTTON_Y, fsize.width - TITLE_W_DIFF, BUTTON_H, - true); - - if (hasDecorations(MWindowAttributes.AWT_DECOR_MINIMIZE)) { - - // minimize button - // g.setColor(bg); - g.fill3DRect(fsize.width - MINIMIZE_X_DIFF, BUTTON_Y, BUTTON_W, - BUTTON_H, true); - g.fill3DRect(fsize.width - MINIMIZE_CONTAINED_X_DIFF, - MINIMIZE_CONTAINED_Y, MINIMIZE_CONTAINED_W, - MINIMIZE_CONTAINED_H, true); - } - - if (hasDecorations(MWindowAttributes.AWT_DECOR_MAXIMIZE)) { - - // maximize button - // g.setColor(bg); - g.fill3DRect(fsize.width - MAXIMIZE_X_DIFF, BUTTON_Y, BUTTON_W, - BUTTON_H, true); - g.fill3DRect(fsize.width - MAXIMIZE_CONTAINED_X_DIFF, - MAXIMIZE_CONTAINED_Y, MAXIMIZE_CONTAINED_W, - MAXIMIZE_CONTAINED_H, true); - } - - // title bar text - g.setColor(fg); - Font sysfont = new Font(Font.SANS_SERIF, Font.PLAIN, 10); - g.setFont(sysfont); - FontMetrics sysfm = g.getFontMetrics(); - String ftitle = f.getTitle(); - g.drawString(ftitle, - ((TITLE_X + TITLE_X + fsize.width - TITLE_W_DIFF) / 2) - - (sysfm.stringWidth(ftitle) / 2), - TITLE_MID_Y + sysfm.getMaxDescent()); - } - - if (f.isResizable() && - hasDecorations(MWindowAttributes.AWT_DECOR_RESIZEH)) { - - // add resize cross hairs - - // upper-left horiz (shadow) - g.setColor(shadow); - g.drawLine(1, HORIZ_RESIZE_INSET, CROSSHAIR_INSET, - HORIZ_RESIZE_INSET); - // upper-left vert (shadow) - // g.setColor(shadow); - g.drawLine(VERT_RESIZE_INSET, 1, VERT_RESIZE_INSET, CROSSHAIR_INSET); - // upper-right horiz (shadow) - // g.setColor(shadow); - g.drawLine(fsize.width - CROSSHAIR_INSET + 1, HORIZ_RESIZE_INSET, - fsize.width, HORIZ_RESIZE_INSET); - // upper-right vert (shadow) - // g.setColor(shadow); - g.drawLine(fsize.width - VERT_RESIZE_INSET - 1, 2, - fsize.width - VERT_RESIZE_INSET - 1, CROSSHAIR_INSET + 1); - // lower-left horiz (shadow) - // g.setColor(shadow); - g.drawLine(1, fsize.height - HORIZ_RESIZE_INSET - 1, - CROSSHAIR_INSET, fsize.height - HORIZ_RESIZE_INSET - 1); - // lower-left vert (shadow) - // g.setColor(shadow); - g.drawLine(VERT_RESIZE_INSET, fsize.height - CROSSHAIR_INSET + 1, - VERT_RESIZE_INSET, fsize.height); - // lower-right horiz (shadow) - // g.setColor(shadow); - g.drawLine(fsize.width - CROSSHAIR_INSET + 1, - fsize.height - HORIZ_RESIZE_INSET - 1, fsize.width, - fsize.height - HORIZ_RESIZE_INSET - 1); - // lower-right vert (shadow) - // g.setColor(shadow); - g.drawLine(fsize.width - VERT_RESIZE_INSET - 1, - fsize.height - CROSSHAIR_INSET + 1, - fsize.width - VERT_RESIZE_INSET - 1, fsize.height); - - // upper-left horiz (highlight) - g.setColor(highlight); - g.drawLine(2, HORIZ_RESIZE_INSET + 1, CROSSHAIR_INSET, - HORIZ_RESIZE_INSET + 1); - // upper-left vert (highlight) - // g.setColor(highlight); - g.drawLine(VERT_RESIZE_INSET + 1, 2, VERT_RESIZE_INSET + 1, - CROSSHAIR_INSET); - // upper-right horiz (highlight) - // g.setColor(highlight); - g.drawLine(fsize.width - CROSSHAIR_INSET + 1, - HORIZ_RESIZE_INSET + 1, fsize.width - 1, - HORIZ_RESIZE_INSET + 1); - // upper-right vert (highlight) - // g.setColor(highlight); - g.drawLine(fsize.width - VERT_RESIZE_INSET, 2, - fsize.width - VERT_RESIZE_INSET, CROSSHAIR_INSET); - // lower-left horiz (highlight) - // g.setColor(highlight); - g.drawLine(2, fsize.height - HORIZ_RESIZE_INSET, CROSSHAIR_INSET, - fsize.height - HORIZ_RESIZE_INSET); - // lower-left vert (highlight) - // g.setColor(highlight); - g.drawLine(VERT_RESIZE_INSET + 1, - fsize.height - CROSSHAIR_INSET + 1, - VERT_RESIZE_INSET + 1, fsize.height - 1); - // lower-right horiz (highlight) - // g.setColor(highlight); - g.drawLine(fsize.width - CROSSHAIR_INSET + 1, - fsize.height - HORIZ_RESIZE_INSET, fsize.width - 1, - fsize.height - HORIZ_RESIZE_INSET); - // lower-right vert (highlight) - // g.setColor(highlight); - g.drawLine(fsize.width - VERT_RESIZE_INSET, - fsize.height - CROSSHAIR_INSET + 1, - fsize.width - VERT_RESIZE_INSET, fsize.height - 1); - } - - MenuBar mb = f.getMenuBar(); - if (mb != null) { - MMenuBarPeer peer = (MMenuBarPeer) MToolkit.targetToPeer(mb); - if (peer != null) { - Insets insets = getInsets(); - Graphics ng = g.create(); - int menubarX = 0; - int menubarY = 0; - if (hasDecorations(MWindowAttributes.AWT_DECOR_BORDER)) { - menubarX += CROSSHAIR_INSET + 1; - menubarY += CROSSHAIR_INSET + 1; - } - if (hasDecorations(MWindowAttributes.AWT_DECOR_TITLE)) { - menubarY += BUTTON_H; - } - try { - ng.translate(menubarX, menubarY); - peer.print(ng); - } finally { - ng.dispose(); - } - } - } - } - - // Saveunders are not done by Frame. - void setSaveUnder(boolean state) {} - - /* Returns the native paint should be posted after setting new size - */ - public boolean checkNativePaintOnSetBounds(int width, int height) { - // Fix for 4418155. Undecorated Frame does not repaint - // automticaly if shrinking. Should not wait for Expose - return ((Frame)target).isUndecorated() ? - ((width > oldWidth) || (height > oldHeight)): - ((width != oldWidth) || (height != oldHeight)); - } - - public void setBoundsPrivate(int x, int y, int width, int height) { - setBounds(x, y, width, height); - } - - public Rectangle getBoundsPrivate() { - return getBounds(); - } - - @Override - final boolean isTargetUndecorated() { - return ((Frame)target).isUndecorated(); - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MGlobalCursorManager.java --- a/jdk/src/solaris/classes/sun/awt/motif/MGlobalCursorManager.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -/* - * Copyright 1999-2004 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. - */ - -package sun.awt.motif; - -import java.awt.*; -import sun.awt.GlobalCursorManager; -import sun.awt.GlobalCursorManager.*; - -public final class MGlobalCursorManager extends GlobalCursorManager { - - static { - cacheInit(); - } - - private native static void cacheInit(); - - // cached nativeContainer - private Component nativeContainer; - - - /** - * The MGlobalCursorManager is a singleton. - */ - private static MGlobalCursorManager manager; - - - static GlobalCursorManager getCursorManager() { - if (manager == null) { - manager = new MGlobalCursorManager(); - } - return manager; - } - - /** - * Should be called in response to a native mouse enter or native mouse - * button released message. Should not be called during a mouse drag. - */ - static void nativeUpdateCursor(Component heavy) { - MGlobalCursorManager.getCursorManager().updateCursorLater(heavy); - } - - - protected void setCursor(Component comp, Cursor cursor, boolean useCache) { - if (comp == null) { - return; - } - - Cursor cur = useCache ? cursor : getCapableCursor(comp); - - Component nc = useCache ? nativeContainer : getNativeContainer(comp); - - // System.out.println(" set cursor="+cursor+" on "+comp+" new curs="+cur); - if (nc != null && nc.isDisplayable()) { - nativeContainer = nc; - ((MComponentPeer)nc.getPeer()).pSetCursor(cur); - } - } - - private Component getNativeContainer(Component comp) { - while (comp != null && comp.isLightweight()) { - comp = comp.getParent(); - } - return comp; - } - - protected native void getCursorPos(Point p); - protected native Component findHeavyweightUnderCursor(); - - /* - * two native methods to call corresponding methods in Container and - * Component - */ - protected native Component findComponentAt(Container con, int x, int y); - protected native Point getLocationOnScreen(Component com); - - protected Component findHeavyweightUnderCursor(boolean useCache) { - return findHeavyweightUnderCursor(); - } - - private Cursor getCapableCursor(Component comp) { - Component c = comp; - while ((c != null) && !(c instanceof Window) && - c.isEnabled() && c.isVisible() && c.isDisplayable()) { - c = c.getParent(); - } - if (c instanceof Window) { - return (c.isEnabled() && c.isVisible() && c.isDisplayable() && comp.isEnabled()) ? - comp.getCursor() : - Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); - } else if (c == null) { - return null; - } - return getCapableCursor(c.getParent()); - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MInputMethod.java --- a/jdk/src/solaris/classes/sun/awt/motif/MInputMethod.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.awt.motif; - -import java.awt.AWTException; -import java.awt.Component; -import java.awt.Container; -import java.awt.Window; -import java.awt.peer.ComponentPeer; -import sun.awt.X11InputMethod; -import sun.awt.SunToolkit; - -/** - * Input Method Adapter for XIM (with Motif) - * - * @author JavaSoft International - */ -public class MInputMethod extends X11InputMethod { - - public MInputMethod() throws AWTException { - super(); - } - - protected boolean openXIM() { - return openXIMNative(); - } - - protected boolean createXIC() { - MComponentPeer peer = (MComponentPeer)getPeer(clientComponentWindow); - if (peer == null) { - return false; - } - MComponentPeer tc = null; - if (peer instanceof MInputMethodControl) { - tc = ((MInputMethodControl)peer).getTextComponent(); - } - if (!createXICNative(peer, tc)) { - return false; - } - if (peer instanceof MInputMethodControl) { - ((MInputMethodControl)peer).addInputMethod(this); - } - return true; - } - - protected void setXICFocus(ComponentPeer peer, - boolean value, boolean active) { - setXICFocusNative((MComponentPeer)peer, value, active); - } - - protected Container getParent(Component client) { - // SECURITY: Use _NoClientCode(), because this thread may - // be privileged - return MComponentPeer.getParent_NoClientCode(client); - } - - /** - * Returns peer of the given client component. If the given client component - * doesn't have peer, peer of the native container of the client is returned. - */ - protected ComponentPeer getPeer(Component client) { - MComponentPeer peer = (MComponentPeer)MToolkit.targetToPeer(client); - if (peer != null) - return peer; - - Container nativeContainer = MToolkit.getNativeContainer(client); - peer = (MComponentPeer)MToolkit.targetToPeer(nativeContainer); - return peer; - } - - /** - * Changes the status area configuration that is to be requested - * by Frame or Dialog. - */ - void configureStatus() { - if (isDisposed()) { - return; - } - - MComponentPeer peer = (MComponentPeer)getPeer((Window) clientComponentWindow); - MComponentPeer tc = ((MInputMethodControl)peer).getTextComponent(); - if (tc != null) { - configureStatusAreaNative(tc); - } - } - - /* - * Subclasses should override disposeImpl() instead of dispose(). Client - * code should always invoke dispose(), never disposeImpl(). - */ - protected synchronized void disposeImpl() { - if (clientComponentWindow != null) { - MComponentPeer peer = (MComponentPeer)getPeer(clientComponentWindow); - if (peer instanceof MInputMethodControl) - ((MInputMethodControl)peer).removeInputMethod(this); - clientComponentWindow = null; - } - - super.disposeImpl(); - } - - /** - * @see java.awt.im.spi.InputMethod#removeNotify - */ - public synchronized void removeNotify() { - if (MToolkit.targetToPeer(getClientComponent()) != null) { - dispose(); - } else { - // We do not have to dispose XICs in case of lightweight component. - resetXIC(); - } - } - - /** - * Changes the internal XIC configurations. This is required the - * case that addition or elimination of text components has - * happened in the containment hierarchy. This method is invoked - * by Frame or Dialog. - */ - synchronized void reconfigureXIC(MInputMethodControl control) { - if (!isDisposed()) { - // Some IM servers require to reset XIC before destroying - // the XIC. I.e., Destroying XIC doesn't reset the internal - // state of the IM server. endComposition() takes care of - // resetting XIC and preedit synchronization. However, - // there is no client at this point. It is assumed that - // the previous client is still available for dispatching - // committed text which maintains client's composition - // context. - endComposition(); - resetXICifneeded(); - reconfigureXICNative((MComponentPeer) control, control.getTextComponent()); - } - } - - protected void awtLock() { - SunToolkit.awtLock(); - } - - protected void awtUnlock() { - SunToolkit.awtUnlock(); - } - - /* - * Native methods - */ - private native boolean openXIMNative(); - private native boolean createXICNative(MComponentPeer peer, MComponentPeer tc); - private native void reconfigureXICNative(MComponentPeer peer, - MComponentPeer tc); - private native void configureStatusAreaNative(MComponentPeer tc); - private native void setXICFocusNative(MComponentPeer peer, - boolean value, boolean active); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MInputMethodControl.java --- a/jdk/src/solaris/classes/sun/awt/motif/MInputMethodControl.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* - * Copyright 1997-2003 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. - */ - -package sun.awt.motif; - -import sun.awt.motif.MComponentPeer; -import sun.awt.motif.MInputMethod; - -/** - * An interface for controlling containment hierarchy configuration to - * keep track of existence of any TextArea or TextField and to manage - * input method status area. - * - * @auther JavaSoft International - */ -interface MInputMethodControl { - - /** - * Informs Frame or Dialog that a text component has been added to - * the hierarchy. - * @param textComponentPeer peer of the text component - */ - void addTextComponent(MComponentPeer textComponentPeer); - - /** - * Informs Frame or Dialog that a text component has been removed - * from the hierarchy. - * @param textComponentPeer peer of the text component - */ - void removeTextComponent(MComponentPeer textComponentPeer); - - /** - * Returns a text component peer in the containment hierarchy - * to obtain the Motif status area information - */ - MComponentPeer getTextComponent(); - - /** - * Inform Frame or Dialog that an MInputMethod has been - * constructed so that Frame and Dialog can invoke the method in - * MInputMethod to reconfigure XICs. - * @param inputMethod an MInputMethod instance - */ - void addInputMethod(MInputMethod inputMethod); - - /** - * Inform Frame or Dialog that an X11InputMethod is being destroyed. - * @param inputMethod an X11InputMethod instance - */ - void removeInputMethod(MInputMethod inputMethod); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MInputMethodDescriptor.java --- a/jdk/src/solaris/classes/sun/awt/motif/MInputMethodDescriptor.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/* - * Copyright 2003 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. - */ - - -package sun.awt.motif; - -import java.awt.im.spi.InputMethod; -import sun.awt.X11InputMethodDescriptor; - -/** - * Provides sufficient information about an input method - * to enable selection and loading of that input method. - * The input method itself is only loaded when it is actually used. - * - * @since JDK1.3 - */ - -class MInputMethodDescriptor extends X11InputMethodDescriptor { - - /** - * @see java.awt.im.spi.InputMethodDescriptor#createInputMethod - */ - public InputMethod createInputMethod() throws Exception { - return new MInputMethod(); - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MLabelPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MLabelPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,104 +0,0 @@ -/* - * Copyright 1995-1996 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; - -class MLabelPeer extends MComponentPeer implements LabelPeer { - native void create(MComponentPeer parent); - - public void initialize() { - Label l = (Label)target; - String txt; - int align; - - if ((txt = l.getText()) != null) { - setText(l.getText()); - } - if ((align = l.getAlignment()) != Label.LEFT) { - setAlignment(align); - } - super.initialize(); - } - - MLabelPeer(Label target) { - super(target); - } - - public Dimension getMinimumSize() { - FontMetrics fm = getFontMetrics(target.getFont()); - String label = ((Label)target).getText(); - if (label == null) label = ""; - return new Dimension(fm.stringWidth(label) + 14, - fm.getHeight() + 8); - } - - public native void setText(String label); - public native void setAlignment(int alignment); - - /* - * Print the native component by rendering the Motif look ourselves. - */ - public void print(Graphics g) { - Label l = (Label)target; - Dimension d = l.size(); - Color bg = l.getBackground(); - Color fg = l.getForeground(); - - g.setColor(bg); - g.fillRect(1, 1, d.width - 2, d.height - 2); - - g.setColor(fg); - g.setFont(l.getFont()); - FontMetrics fm = g.getFontMetrics(); - String lbl = l.getText(); - - switch (l.getAlignment()) { - case Label.LEFT: - g.drawString(lbl, 2, - (d.height + fm.getMaxAscent() - fm.getMaxDescent()) / 2); - break; - case Label.RIGHT: - g.drawString(lbl, d.width - (fm.stringWidth(lbl) + 2), - (d.height + fm.getMaxAscent() - fm.getMaxDescent()) / 2); - break; - case Label.CENTER: - g.drawString(lbl, (d.width - fm.stringWidth(lbl)) / 2, - (d.height + fm.getMaxAscent() - fm.getMaxDescent()) / 2); - break; - } - - target.print(g); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MListPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MListPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,390 +0,0 @@ -/* - * Copyright 1995-2004 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.ActionEvent; -import java.awt.event.ItemEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; - -class MListPeer extends MComponentPeer implements ListPeer { - native void create(MComponentPeer parent); - - void initialize() { - List li = (List)target; - - /* add any items that were already inserted in the target. */ - int nitems = li.countItems(); - for (int i = 0; i < nitems; i++) { - addItem(li.getItem(i), -1); - } - - /* set whether this list should allow multiple selections. */ - setMultipleSelections(li.allowsMultipleSelections()); - - /* make the visible position visible. */ - int index = li.getVisibleIndex(); - if (index >= 0) { - makeVisible(index); - } - - /* select the item if necessary. */ - int sel[] = li.getSelectedIndexes(); - for (int i = 0 ; i < sel.length ; i++) { - select(sel[i]); - } - - /* BugID 4060345 to avoid showing scrollbar in empty List */ - if (nitems == 0) { - addItem(" ", 0); - delItems(0, 0); - } - super.pSetScrollbarBackground(getParent_NoClientCode(li).getBackground()); - - if (!target.isBackgroundSet()) { - target.setBackground(SystemColor.text); - } - if (!target.isForegroundSet()) { - target.setForeground(SystemColor.textText); - } - - super.initialize(); - } - - MListPeer(List target) { - super(target); - } - - /* New method name for 1.1 */ - public void add(String item, int index) { - addItem(item, index); - } - - /* New method name for 1.1 */ - public void removeAll() { - clear(); - } - - /* New method name for 1.1 */ - public void setMultipleMode (boolean b) { - setMultipleSelections(b); - } - - /* New method name for 1.1 */ - public Dimension getPreferredSize(int rows) { - return preferredSize(rows); - } - - /* New method name for 1.1 */ - public Dimension getMinimumSize(int rows) { - return minimumSize(rows); - } - - public void setForeground(Color c) { - pSetInnerForeground(c); - } - - public native void setBackground(Color c); - public native void setMultipleSelections(boolean v); - public native boolean isSelected(int index); - public native void addItem(String item, int index); - public native void delItems(int start, int end); - public native void select(int index); - public native void deselect(int index); - public native void makeVisible(int index); - - public void clear() { - List l = (List)target; - int count = l.countItems(); - if (count > 0) { - delItems(0, count-1); - } - } - - public int[] getSelectedIndexes() { - List l = (List)target; - int len = l.countItems(); - int sel[] = new int[len]; - int nsel = 0; - for (int i = 0 ; i < len ; i++) { - if (isSelected(i)) { - sel[nsel++] = i; - } - } - int selected[] = new int[nsel]; - System.arraycopy(sel, 0, selected, 0, nsel); - return selected; - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void action(int index, final long when, final int modifiers) { - final List list = (List)target; - final int selectIndex = index; - - MToolkit.executeOnEventHandlerThread(list, new Runnable() { - public void run() { - list.select(selectIndex); - postEvent(new ActionEvent(target, ActionEvent.ACTION_PERFORMED, - list.getItem(selectIndex), when, - modifiers)); - } - }); - } // action() - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleListChanged(int index) { - final MListPeer listPeer = this; - final List list = (List)target; - final int listIndex = index; - - MToolkit.executeOnEventHandlerThread(list, new Runnable() { - public void run() { - int selected[] = listPeer.getSelectedIndexes(); - boolean isSelected = false; - - for (int i=0; i < selected.length; i++) { - if (listIndex == selected[i]) { - isSelected = true; - break; - } - } - postEvent(new ItemEvent(list, ItemEvent.ITEM_STATE_CHANGED, - Integer.valueOf(listIndex), - isSelected? ItemEvent.SELECTED : ItemEvent.DESELECTED)); - - } - }); - } // handleListChanged() - - public Dimension minimumSize() { - return minimumSize(4); - } - - public Dimension preferredSize(int v) { - return minimumSize(v); - } - - public Dimension minimumSize(int v) { - FontMetrics fm = getFontMetrics(((List)target).getFont()); - return new Dimension(SCROLLBAR + 2*MARGIN + - fm.stringWidth("0123456789abcde"), - ((fm.getHeight()+2*SPACE) * v) + - 2*MARGIN); - } - - public boolean isFocusable() { - return true; - } - - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more accurate size and - * color information, selected items, and item offset. - */ - final static int MARGIN = 2; - final static int SPACE = 1; - final static int SCROLLBAR = 16; - int fontHeight; - int fontAscent; - int fontLeading; - int vval; - int hval; - int vmax; - int hmax; - - public void print(Graphics g) { - List l = (List)target; - Dimension d = l.size(); - Color bg = l.getBackground(); - Color fg = l.getForeground(); - int numItems = l.getItemCount(); - FontMetrics fm = getFontMetrics(l.getFont()); - int w, h; - int vvis, hvis, vmin, hmin; - int max = 0; - - for (int i = 0; i < numItems; i++) { - int len = fm.stringWidth(l.getItem(i)); - max = Math.max(max, len); - } - - fontHeight = fm.getHeight(); - fontAscent = fm.getAscent(); - fontLeading = fm.getLeading(); - - hmin = vmin = 0; - - vvis = itemsInWindow(true); - vmax = Math.max(numItems - vvis, 0); - h = d.height - SCROLLBAR; - - if (vmax != 0) { - w = d.width - SCROLLBAR; - hvis = w - ((2 * SPACE) + (2 * MARGIN)); - hmax = Math.max(max - hvis, 0); - } else { - w = d.width; - hvis = w - ((2 * SPACE) + (2 * MARGIN)); - hmax = Math.max(max - hvis, 0); - } - if (hmax == 0) { - h = d.height; - vvis = itemsInWindow(false); - vmax = Math.max(numItems - vvis, 0); - } - if (vmax == 0) { - w = d.width; - hvis = w - ((2 * SPACE) + (2 * MARGIN)); - hmax = Math.max(max - hvis, 0); - } - - hval = 0; - vval = 0; - /* -System.out.println("print List: "+d.width+"x"+d.height+" numItems="+numItems+ -"max="+max+" vsb=("+vmin+".."+vmax+","+vval+","+vvis+ -") hsb=("+hmin+".."+hmax+","+hval+","+hvis+")"); -*/ - - g.setColor(bg); - g.fillRect(0, 0, w, h); - - if (hmax != 0) { - int sbw = d.width - ((vmax == 0) ? 0 : SCROLLBAR); - g.fillRect(1, d.height - SCROLLBAR - 3, sbw - 1, SCROLLBAR - 3); - Graphics ng = g.create(); - try { - ng.translate(0, d.height - (SCROLLBAR - 2)); - drawScrollbar(ng, bg, SCROLLBAR - 2, sbw, - hmin, hmax, hval, hvis, true); - } finally { - ng.dispose(); - } - } - if (vmax != 0) { - int sbh = d.height - ((hmax == 0) ? 0 : SCROLLBAR); - g.fillRect(d.width - SCROLLBAR - 3, 1, SCROLLBAR - 3, sbh - 1); - Graphics ng = g.create(); - try { - ng.translate(d.width - (SCROLLBAR - 2), 0); - drawScrollbar(ng, bg, SCROLLBAR - 2, sbh, - vmin, vmax, vval, vvis, false); - } finally { - ng.dispose(); - } - } - - draw3DRect(g, bg, 0, 0, w - 1, h - 1, false); - - if (numItems > 0) { - int n = itemsInWindow(hmax != 0); - int e = Math.min(numItems - 1, (vval + n) - 1); - paintItems(g, bg, fg, vval, e); - } - - target.print(g); - } - - int itemsInWindow(boolean scrollbarVisible) { - Dimension d = target.size(); - int h; - if (scrollbarVisible) { - h = d.height - ((2 * MARGIN) + SCROLLBAR); - } else { - h = d.height - 2*MARGIN; - } - int i = fontHeight - fontLeading; - return h / (i + (2 * SPACE)); - } - - void paintItem(Graphics g, Color bg, Color fg, int index, boolean isSelected) { - List l = (List)target; - Dimension d = l.size(); - int numItems = l.getItemCount(); - Color shadow = bg.darker(); - - if ((index < vval) || (index >= (vval + itemsInWindow(hmax != 0)))) { - return; - } - int w = d.width - ((2 * MARGIN) + ((vmax != 0)? SCROLLBAR : 0)); - int h = (fontHeight - fontLeading); - int htotal = h + (2 * SPACE); - int index2y = MARGIN + (index * htotal) + SPACE; - int y = index2y - (vval * htotal); - int x = MARGIN + SPACE; - Graphics ng = g.create(); - try { - if (index > numItems - 1) { - ng.setColor(bg); - ng.fillRect(x - 2, y - 2, w, h + 4); - return; - } - if (isSelected) { - ng.setColor(shadow); - ng.fillRect(x - 1, y - 1, w - 2, h + 2); - } else { - ng.setColor(bg); - ng.fillRect(x - 1, y - 1, w - 2, h + 2); - } - ng.setColor(bg); - - ng.drawRect(x - 2, y - 2, w - 1, h + 3); - ng.setColor(fg); - String str = (String)l.getItem(index); - ng.clipRect(x, y, w - (2 * SPACE), h); - ng.drawString(str, x - hval, y + fontAscent); - } finally { - ng.dispose(); - } - } - - void paintItems(Graphics g, Color bg, Color fg, int s, int e) { - for (int i = s ; i <= e ; i++) { - paintItem(g, bg, fg, i, false); - } - } - - public boolean handlesWheelScrolling() {return true;} - - public void handleEvent(AWTEvent e) { - if (e.getID() == MouseEvent.MOUSE_WHEEL) { - MouseWheelEvent mwe = (MouseWheelEvent)e; - nativeHandleMouseWheel(mwe.getScrollType(), - mwe.getScrollAmount(), - mwe.getWheelRotation()); - } - else { - super.handleEvent(e); - } - } - - native void nativeHandleMouseWheel(int scrollType, - int scrollAmount, - int wheelRotation); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MMenuBarPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MMenuBarPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/* - * Copyright 1995-2003 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import sun.awt.*; - -public class MMenuBarPeer implements MenuBarPeer { - long pData; - MenuBar target; - private X11GraphicsConfig graphicsConfig=null; - - private boolean disposed = false; - - static { - initIDs(); - } - - /** - * Initialize JNI field and method IDs for fields that may be accessed - from C. - */ - private static native void initIDs(); - - native void create(MFramePeer f); - - public MMenuBarPeer(MenuBar target) { - this.target = target; - MFramePeer parent = (MFramePeer) MToolkit.targetToPeer(MMenuItemPeer.getParent_NoClientCode(target)); - create(parent); - } - - protected void finalize() throws Throwable { - dispose(); - super.finalize(); - } - - /* - * Subclasses should override disposeImpl() instead of dispose(). Client - * code should always invoke dispose(), never disposeImpl(). - */ - private native void pDispose(); - protected void disposeImpl() { - MToolkit.targetDisposedPeer(target, this); - pDispose(); - } - public final void dispose() { - boolean call_disposeImpl = false; - - if (!disposed) { - synchronized (this) { - if (!disposed) { - disposed = call_disposeImpl = true; - } - } - } - - if (call_disposeImpl) { - disposeImpl(); - } - } - public void addMenu(Menu m) { - } - public void delMenu(int index) { - } - public void addHelpMenu(Menu m) { - } - - static final int GAP = 10; - static final int W_DIFF = (MFramePeer.CROSSHAIR_INSET + 1) * 2; - static final int H_DIFF = MFramePeer.BUTTON_Y + MFramePeer.BUTTON_H; - - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more appropriate size and - * color information. - */ - void print(Graphics g) { - MenuBar mb = (MenuBar)target; - Frame f = (Frame)MMenuItemPeer.getParent_NoClientCode(target); - Dimension fd = f.size(); - Insets insets = f.insets(); - - /* Calculate menubar dimension. */ - int width = fd.width; - int height = insets.top; - if (f.getPeer() instanceof MFramePeer) { - MFramePeer fpeer = (MFramePeer)f.getPeer(); - if (fpeer.hasDecorations(MWindowAttributes.AWT_DECOR_BORDER)) { - width -= W_DIFF; - height -= MFramePeer.BUTTON_Y; - } - if (fpeer.hasDecorations(MWindowAttributes.AWT_DECOR_MENU)) { - height -= MFramePeer.BUTTON_H; - } - } - Dimension d = new Dimension(width, height); - - Shape oldClipArea = g.getClip(); - g.clipRect(0, 0, d.width, d.height); - - Color bg = f.getBackground(); - Color fg = f.getForeground(); - Color highlight = bg.brighter(); - Color shadow = bg.darker(); - - // because we'll most likely be drawing on white paper, - // for aesthetic reasons, don't make any part of the outer border - // pure white - if (highlight.equals(Color.white)) { - g.setColor(new Color(230, 230, 230)); - } - else { - g.setColor(highlight); - } - g.drawLine(0, 0, d.width, 0); - g.drawLine(1, 1, d.width - 1, 1); - g.drawLine(0, 0, 0, d.height); - g.drawLine(1, 1, 1, d.height - 1); - g.setColor(shadow); - g.drawLine(d.width, 1, d.width, d.height); - g.drawLine(d.width - 1, 2, d.width - 1, d.height); - g.drawLine(1, d.height, d.width, d.height); - g.drawLine(2, d.height - 1, d.width, d.height - 1); - - int x = GAP; - int nitems = mb.countMenus(); - - Menu helpMenu = target.getHelpMenu(); - - for (int i = 0 ; i < nitems ; i++) { - Menu mn = target.getMenu(i); - String item = mn.getLabel(); - if (item == null) { - item = ""; - } - Font menuFont = mn.getFont(); - g.setFont(menuFont); - FontMetrics menuMetrics = g.getFontMetrics(); - int y = (d.height / 2) + menuMetrics.getMaxDescent(); - int w = menuMetrics.stringWidth(item) + GAP * 2; - - if (x >= d.width) { - break; - } - if (mn.isEnabled()) { - g.setColor(fg); - } - else { - // draw text as grayed out - g.setColor(shadow); - } - - if (helpMenu == mn) { - g.drawString(item, d.width - w + GAP, y); - } - else { - g.drawString(item, x, y); - x += w; - } - } - - g.setClip(oldClipArea); - } - - // Needed for MenuComponentPeer. - public void setFont(Font f) { - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MMenuItemPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MMenuItemPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -/* - * Copyright 1995-2003 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.ActionEvent; -import sun.awt.AppContext; - -class MMenuItemPeer implements MenuItemPeer { - long pData; - long jniGlobalRef; - boolean isCheckbox = false; - MenuItem target; - boolean nativeCreated = false; - - private boolean disposed = false; - - static { - initIDs(); - } - - /** - * Initialize JNI field and method IDs - */ - private static native void initIDs(); - - native void createMenuItem(MMenuPeer parent); - - void create(MMenuPeer parent) { - if (parent.nativeCreated) { - createMenuItem(parent); - nativeCreated = true; - setEnabled(target.isEnabled()); - } - } - - protected MMenuItemPeer() { - } - - MMenuItemPeer(MenuItem target) { - this.target = target; - MMenuPeer parent = (MMenuPeer) MToolkit.targetToPeer(getParent_NoClientCode(target)); - create(parent); - } - - static native MenuContainer getParent_NoClientCode(MenuComponent menuComponent); - - protected void finalize() throws Throwable { - dispose(); - super.finalize(); - } - - public void setEnabled(boolean b) { - if (b) { - enable(); - } else { - disable(); - } - } - - public void setLabel(String label) { - if (!nativeCreated) { - return; - } - pSetLabel(label); - // Fix for bug 4234266 AWT component : MenuItem throw NullPointer exception. - MenuShortcut sc = target.getShortcut(); - setShortcut(sc != null ? sc.toString() : null ); - } - - public void setShortcut(String shortCut) { - if (!nativeCreated) { - return; - } - pSetShortcut(shortCut); - } - - native void pSetLabel(String label); - native void pSetShortcut(String shortCut); - - /** - * DEPRECATED but, for now, called by setEnabled(boolean). - */ - public void enable() { - if (!nativeCreated) { - return; - } - pEnable(); - } - native void pEnable(); - - /** - * DEPRECATED but, for now, called by setEnabled(boolean). - */ - public void disable() { - if (!nativeCreated) { - return; - } - pDisable(); - } - native void pDisable(); - - private void destroyNativeWidgetImpl() { - if (nativeCreated) { - pDispose(); - nativeCreated = false; - } - } - - void destroyNativeWidget() { - // We do not need to synchronize this method because the caller - // always holds the tree lock - - destroyNativeWidgetImpl(); - } - - /* - * Subclasses should override disposeImpl() instead of dispose(). Client - * code should always invoke dispose(), never disposeImpl(). - */ - protected void disposeImpl() { - // Don't call destroyNativeWidget() because on a Menu, this will - // cause a traversal of all the menu's MenuItems. This traversal was - // already done once by java.awt.Menu.removeNotify(). - - destroyNativeWidgetImpl(); - MToolkit.targetDisposedPeer(target, this); - } - public final void dispose() { - boolean call_disposeImpl = false; - - if (!disposed) { - synchronized (this) { - if (!disposed) { - disposed = call_disposeImpl = true; - } - } - } - - if (call_disposeImpl) { - disposeImpl(); - } - } - - native void pDispose(); - - void postEvent(AWTEvent event) { - MToolkit.postEvent(MToolkit.targetToAppContext(target), event); - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void action(final long when, final int modifiers) { - - MToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - postEvent(new ActionEvent(target, ActionEvent.ACTION_PERFORMED, - target.getActionCommand(), when, - modifiers)); - } - }); - } - - // Needed for MenuComponentPeer. - public void setFont(Font f) { - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MMenuPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MMenuPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* - * Copyright 1995-1999 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; - -public class MMenuPeer extends MMenuItemPeer implements MenuPeer { - native void createMenu(MMenuBarPeer parent); - native void createSubMenu(MMenuPeer parent); - - void create(MMenuPeer parent) { - if (parent.nativeCreated) { - createSubMenu(parent); - nativeCreated = true; - } - } - - protected MMenuPeer() { - } - - public MMenuPeer(Menu target) { - this.target = target; - MenuContainer parent = getParent_NoClientCode(target); - - if (parent instanceof MenuBar) { - MMenuBarPeer mb = (MMenuBarPeer) MToolkit.targetToPeer(parent); - createMenu(mb); - nativeCreated = true; - } else if (parent instanceof Menu) { - MMenuPeer m = (MMenuPeer) MToolkit.targetToPeer(parent); - create(m); - } else { - throw new IllegalArgumentException("unknown menu container class"); - } - } - - public void addSeparator() { - } - public void addItem(MenuItem item) { - } - public void delItem(int index) { - } - - void destroyNativeWidget() { - // We do not need to synchronize this method because the caller - // always holds the tree lock - - if (nativeCreated) { - Menu menu = (Menu) target; - int nitems = menu.getItemCount(); - for (int i = 0 ; i < nitems ; i++) { - MMenuItemPeer mipeer = - (MMenuItemPeer) MToolkit.targetToPeer(menu.getItem(i)); - mipeer.destroyNativeWidget(); - } - super.destroyNativeWidget(); - } - } - native void pDispose(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MMouseDragGestureRecognizer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MMouseDragGestureRecognizer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,233 +0,0 @@ -/* - * Copyright 1998-2003 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. - */ - -package sun.awt.motif; - -import java.awt.Toolkit; -import java.awt.Component; - -import java.awt.Point; -import java.awt.dnd.DnDConstants; -import java.awt.dnd.DragSource; -import java.awt.dnd.MouseDragGestureRecognizer; -import java.awt.dnd.DragGestureListener; - -import java.awt.event.InputEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; - -import java.lang.reflect.*; - -import sun.awt.dnd.SunDragSourceContextPeer; - -/** - *

- * This subclass of MouseDragGestureRecognizer defines a DragGestureRecognizer - * for Mouse based gestures on OSF/Motif. - *

- * - * @author Laurence P. G. Cable - * - * @see java.awt.dnd.DragGestureListener - * @see java.awt.dnd.DragGestureEvent - * @see java.awt.dnd.DragSource - */ - -class MMouseDragGestureRecognizer extends MouseDragGestureRecognizer { - - private static final long serialVersionUID = -841711780352520383L; - - /* - * constant for number of pixels hysterisis before drag is determined - * to have started - */ - - protected static int motionThreshold; - - - protected static final int ButtonMask = InputEvent.BUTTON1_DOWN_MASK | - InputEvent.BUTTON2_DOWN_MASK | - InputEvent.BUTTON3_DOWN_MASK; - - /** - * construct a new MMouseDragGestureRecognizer - * - * @param ds The DragSource for the Component c - * @param c The Component to observe - * @param act The actions permitted for this Drag - * @param dgl The DragGestureRecognizer to notify when a gesture is detected - * - */ - - protected MMouseDragGestureRecognizer(DragSource ds, Component c, int act, DragGestureListener dgl) { - super(ds, c, act, dgl); - } - - /** - * construct a new MMouseDragGestureRecognizer - * - * @param ds The DragSource for the Component c - * @param c The Component to observe - * @param act The actions permitted for this Drag - */ - - protected MMouseDragGestureRecognizer(DragSource ds, Component c, int act) { - this(ds, c, act, null); - } - - /** - * construct a new MMouseDragGestureRecognizer - * - * @param ds The DragSource for the Component c - * @param c The Component to observe - */ - - protected MMouseDragGestureRecognizer(DragSource ds, Component c) { - this(ds, c, DnDConstants.ACTION_NONE); - } - - /** - * construct a new MMouseDragGestureRecognizer - * - * @param ds The DragSource for the Component c - */ - - protected MMouseDragGestureRecognizer(DragSource ds) { - this(ds, null); - } - - /** - * determine the drop action from the event - */ - - protected int mapDragOperationFromModifiers(MouseEvent e) { - int mods = e.getModifiersEx(); - int btns = mods & ButtonMask; - - // Do not allow right mouse button drag since Motif DnD does not - // terminate drag operation on right mouse button release. - if (!(btns == InputEvent.BUTTON1_DOWN_MASK || - btns == InputEvent.BUTTON2_DOWN_MASK)) { - return DnDConstants.ACTION_NONE; - } - - return - SunDragSourceContextPeer.convertModifiersToDropAction(mods, - getSourceActions()); - } - - /** - * Invoked when the mouse has been clicked on a component. - */ - - public void mouseClicked(MouseEvent e) { - // do nothing - } - - /** - * Invoked when a mouse button has been pressed on a component. - */ - - public void mousePressed(MouseEvent e) { - events.clear(); - - if (mapDragOperationFromModifiers(e) != DnDConstants.ACTION_NONE) { - try { - motionThreshold = DragSource.getDragThreshold(); - } catch (Exception exc) { - motionThreshold = 5; - } - appendEvent(e); - } - } - - /** - * Invoked when a mouse button has been released on a component. - */ - - public void mouseReleased(MouseEvent e) { - events.clear(); - } - - /** - * Invoked when the mouse enters a component. - */ - - public void mouseEntered(MouseEvent e) { - events.clear(); - } - - /** - * Invoked when the mouse exits a component. - */ - - public void mouseExited(MouseEvent e) { - if (!events.isEmpty()) { // gesture pending - int dragAction = mapDragOperationFromModifiers(e); - - if (dragAction == DnDConstants.ACTION_NONE) { - events.clear(); - } - } - } - - /** - * Invoked when a mouse button is pressed on a component. - */ - - public void mouseDragged(MouseEvent e) { - if (!events.isEmpty()) { // gesture pending - int dop = mapDragOperationFromModifiers(e); - - - if (dop == DnDConstants.ACTION_NONE) { - return; - } - - MouseEvent trigger = (MouseEvent)events.get(0); - - Point origin = trigger.getPoint(); - Point current = e.getPoint(); - - int dx = Math.abs(origin.x - current.x); - int dy = Math.abs(origin.y - current.y); - - if (dx > motionThreshold || dy > motionThreshold) { - fireDragGestureRecognized(dop, ((MouseEvent)getTriggerEvent()).getPoint()); - } else - appendEvent(e); - } - } - - /** - * Invoked when the mouse button has been moved on a component - * (with no buttons no down). - */ - - public void mouseMoved(MouseEvent e) { - // do nothing - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MPanelPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MPanelPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,201 +0,0 @@ -/* - * Copyright 1995-2003 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; - -import sun.awt.SunGraphicsCallback; - -class MPanelPeer extends MCanvasPeer implements PanelPeer { - - MPanelPeer() {} - - MPanelPeer(Component target) { - super(target); - } - - MPanelPeer(Component target, Object arg) { - super(target, arg); - } - - public Insets getInsets() { - return new Insets(0, 0, 0, 0); - } - - public void paint(Graphics g) { - super.paint(g); - SunGraphicsCallback.PaintHeavyweightComponentsCallback.getInstance(). - runComponents(((Container)target).getComponents(), g, - SunGraphicsCallback.LIGHTWEIGHTS | - SunGraphicsCallback.HEAVYWEIGHTS); - } - public void print(Graphics g) { - super.print(g); - SunGraphicsCallback.PrintHeavyweightComponentsCallback.getInstance(). - runComponents(((Container)target).getComponents(), g, - SunGraphicsCallback.LIGHTWEIGHTS | - SunGraphicsCallback.HEAVYWEIGHTS); - } - - public void setBackground(Color c) { - Component comp; - int i; - - Container cont = (Container) target; - synchronized(target.getTreeLock()) { - int n = cont.getComponentCount(); - for(i=0; i < n; i++) { - comp = cont.getComponent(i); - MComponentPeer peer = (MComponentPeer) MToolkit.targetToPeer(comp); - if (peer != null) { - Color color = comp.getBackground(); - if (color == null || color.equals(c)) { - peer.setBackground(c); - peer.pSetBackground(c); - } - if ((comp instanceof java.awt.List) || - (comp instanceof java.awt.TextArea) || - (comp instanceof java.awt.ScrollPane)) { - peer.pSetScrollbarBackground(c); - } - } - } - } - pSetBackground(c); - } - - public void setForeground(Color c) { - Component comp; - int i; - - Container cont = (Container) target; - synchronized(target.getTreeLock()) { - int n = cont.getComponentCount(); - for(i=0; i < n; i++) { - comp = cont.getComponent(i); - MComponentPeer peer = (MComponentPeer) MToolkit.targetToPeer(comp); - if (peer != null) { - Color color = comp.getForeground(); - if (color == null || color.equals(c)) { - peer.setForeground(c); - peer.pSetForeground(c); - } - if ((comp instanceof java.awt.List) || - (comp instanceof java.awt.TextArea) || - (comp instanceof java.awt.ScrollPane)) { - peer.pSetInnerForeground(c); - } - } - } - } - pSetForeground(c); - } - - /** - * DEPRECATED: Replaced by getInsets(). - */ - public Insets insets() { - return getInsets(); - } - - /** - * Recursive method that handles the propagation of the displayChanged - * event into the entire hierarchy of peers. - * Unlike on win32, on X we don't worry about handling on-the-fly - * display settings changes, only windows being dragged across Xinerama - * screens. Thus, we only need to tell MCanvasPeers, not all - * MComponentPeers. - */ - private void recursiveDisplayChanged(Component c, int screenNum) { - if (c instanceof Container) { - Component children[] = ((Container)c).getComponents(); - for (int i = 0; i < children.length; ++i) { - recursiveDisplayChanged(children[i], screenNum); - } - } - ComponentPeer peer = c.getPeer(); - if (peer != null && peer instanceof MCanvasPeer) { - MCanvasPeer mPeer = (MCanvasPeer)peer; - mPeer.displayChanged(screenNum); - } - } - - /* - * Often up-called from a MWindowPeer instance. - * Calls displayChanged() on all child canvas' peers. - * Recurses into Container children to ensure all canvases - * get the message. - */ - public void displayChanged(int screenNum) { - // Don't do super call because MWindowPeer has already updated its GC - - Component children[] = ((Container)target).getComponents(); - - for (int i = 0; i < children.length; i++) { - recursiveDisplayChanged(children[i], screenNum); - } - } - - protected boolean shouldFocusOnClick() { - // Return false if this container has children so in that case it won't - // be focused. Return true otherwise. - return ((Container)target).getComponentCount() == 0; - } - - private native void pEnsureIndex(ComponentPeer child, int index); - private native void pRestack(); - - private int restack(Container cont, int ind) { - for (int i = 0; i < cont.getComponentCount(); i++) { - Component comp = cont.getComponent(i); - if (!comp.isLightweight()) { - if (comp.getPeer() != null) { - pEnsureIndex(comp.getPeer(), ind++); - } - } - if (comp.isLightweight() && comp instanceof Container) { - ind = restack((Container)comp, ind); - } - } - return ind; - } - - /** - * @see java.awt.peer.ContainerPeer#restack - */ - public void restack() { - Container cont = (Container)target; - restack(cont, 0); - pRestack(); - } - - /** - * @see java.awt.peer.ContainerPeer#isRestackSupported - */ - public boolean isRestackSupported() { - return true; - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MPopupMenuPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MPopupMenuPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/* - * Copyright 1996-1998 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; - -public class MPopupMenuPeer extends MMenuPeer implements PopupMenuPeer { - - static { - initIDs(); - } - - /* initialize the methodIDs of methods that may be accessed from C */ - private native static void initIDs(); - - native void createMenu(MComponentPeer parent); - - void createPopupMenu() { - if (MMenuItemPeer.getParent_NoClientCode(target) instanceof Component) { - Component parent = (Component)getParent_NoClientCode(target); - MComponentPeer parentPeer = (MComponentPeer) MToolkit.targetToPeer(parent); - if (parentPeer == null) { - // because the menu isn't a component (sigh) we first have to wait - // for a failure to map the peer which should only happen for a - // lightweight container, then find the actual native parent from - // that component. - parent = MToolkit.getNativeContainer(parent); - parentPeer = (MComponentPeer) MToolkit.targetToPeer(parent); - } - createMenu(parentPeer); - nativeCreated = true; - createItems((Menu)target); - - } else { - throw new IllegalArgumentException("illegal popup menu container class"); - } - } - - void createItems(Menu target) { - int nitems = target.getItemCount(); - MMenuPeer parent = (MMenuPeer)MToolkit.targetToPeer(target); - for (int i = 0 ; i < nitems ; i++) { - MenuItem mitem = target.getItem(i); - MMenuItemPeer mipeer = (MMenuItemPeer)MToolkit.targetToPeer(mitem); - mipeer.create(parent); - if (mitem instanceof Menu) { - createItems((Menu)mitem); - } - } - } - - public MPopupMenuPeer(PopupMenu target) { - // Do NOT instantiate native widget until just before showing the - // menu, else right mouse click will cause display to lock up - // (because of passive grab in Motif) - // - this.target = target; - } - - native void pShow(Event evt, int x, int y, MComponentPeer origin); - - public void show(Event evt) { - - if (!nativeCreated) - createPopupMenu(); - - Component origin = (Component)evt.target; - MComponentPeer peer = (MComponentPeer) MToolkit.targetToPeer(origin); - int x = evt.x; - int y = evt.y; - if (peer == null) { - // A failure to map the peer should only happen for a - // lightweight component, then find the actual native parent from - // that component. The event coorinates are going to have to be - Component nativeOrigin = MToolkit.getNativeContainer(origin); - peer = (MComponentPeer) MToolkit.targetToPeer(nativeOrigin); - - // remove the event coordinates - for (Component c = origin; c != nativeOrigin; - c = MComponentPeer.getParent_NoClientCode(c)) { - Point p = c.getLocation(); - x += p.x; - y += p.y; - } - } - pShow(evt, x, y, peer); - } - - /** - * This is the callback function called on the Motif thread by - * Popup_popdownCB(Widget, XtPointer, XtPointer) in awt_PopupMenu.c. - */ - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - private void destroyNativeWidgetAfterGettingTreeLock() { - - MToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - - Object treeLock = new Button().getTreeLock(); - synchronized (treeLock) { - destroyNativeWidget(); - } - } - }); - } - - native void pDispose(); -} // class MPopupMenuPeer diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MRobotPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MRobotPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.security.*; -import sun.awt.X11GraphicsConfig; - -class MRobotPeer implements RobotPeer { - private X11GraphicsConfig xgc = null; - /* - * native implementation uses some static shared data (pipes, processes) - * so use a class lock to synchronize native method calls - */ - static Object robotLock = new Object(); - - MRobotPeer(GraphicsConfiguration gc) { - this.xgc = (X11GraphicsConfig)gc; - setup(); - } - - public void dispose() { - // does nothing - } - - public void mouseMove(int x, int y) { - mouseMoveImpl(xgc, x, y); - } - - public void mousePress(int buttons) { - mousePressImpl(buttons); - } - - public void mouseRelease(int buttons) { - mouseReleaseImpl(buttons); - } - - public void mouseWheel(int wheelAmt) { - mouseWheelImpl(wheelAmt); - } - - public void keyPress(int keycode) { - keyPressImpl(keycode); - } - - public void keyRelease(int keycode) { - keyReleaseImpl(keycode); - } - - public int getRGBPixel(int x, int y) { - int pixelArray[] = new int[1]; - getRGBPixelsImpl(xgc, x, y, 1, 1, pixelArray); - return pixelArray[0]; - } - - public int [] getRGBPixels(Rectangle bounds) { - int pixelArray[] = new int[bounds.width*bounds.height]; - getRGBPixelsImpl(xgc, bounds.x, bounds.y, bounds.width, bounds.height, pixelArray); - return pixelArray; - } - - private static native synchronized void setup(); - - private static native synchronized void mouseMoveImpl(X11GraphicsConfig xgc, int x, int y); - private static native synchronized void mousePressImpl(int buttons); - private static native synchronized void mouseReleaseImpl(int buttons); - private static native synchronized void mouseWheelImpl(int wheelAmt); - - private static native synchronized void keyPressImpl(int keycode); - private static native synchronized void keyReleaseImpl(int keycode); - - private static native synchronized void getRGBPixelsImpl(X11GraphicsConfig xgc, int x, int y, int width, int height, int pixelArray[]); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MScrollPanePeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MScrollPanePeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,411 +0,0 @@ -/* - * Copyright 1996-2003 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. - */ - -package sun.awt.motif; - -import java.awt.*; -import java.awt.event.AdjustmentEvent; -import java.awt.peer.ScrollPanePeer; - -import java.util.logging.*; - -import sun.awt.PeerEvent; - -class MScrollPanePeer extends MPanelPeer implements ScrollPanePeer { - - private static final Logger log = Logger.getLogger("sun.awt.motif.MScrollPanePeer"); - - final static int UNIT_INCREMENT = 0; - final static int BLOCK_INCREMENT = 1; - - boolean ignore; - - native void create(MComponentPeer parent); - - static { - initIDs(); - } - - /** - * Initialize JNI field and method IDs - */ - private static native void initIDs(); - - MScrollPanePeer(Component target) { - init(target); - scrollPaneInit(); - } - - MScrollPanePeer(Component target, Object arg) { - init(target, arg); - scrollPaneInit(); - } - - void scrollPaneInit() { - ignore = false; - ScrollPane sp = (ScrollPane)target; - Adjustable vadj, hadj; - if ((vadj = sp.getVAdjustable()) != null) { - pSetIncrement(Adjustable.VERTICAL, UNIT_INCREMENT, vadj.getUnitIncrement()); - } - if ((hadj = sp.getHAdjustable()) != null) { - pSetIncrement(Adjustable.HORIZONTAL, UNIT_INCREMENT, hadj.getUnitIncrement()); - } - super.pSetScrollbarBackground(sp.getBackground()); - } - - public void setScrollChild(MComponentPeer child) { - pSetScrollChild(child); - } - - public void setBackground(Color c) { - super.setBackground(c); - pSetScrollbarBackground(c); - } - - public void setForeground(Color c) { - super.setForeground(c); - pSetInnerForeground(c); - } - - native void pSetScrollChild(MComponentPeer child); - native void pSetIncrement(int orient, int type, int incr); - native int pGetScrollbarSpace(int orient); - native int pGetBlockIncrement(int orient); - native Insets pInsets(int w, int h, int childw, int childh); - native int pGetShadow(); - - public int getHScrollbarHeight() { - ScrollPane sp = (ScrollPane)target; - if (sp.getScrollbarDisplayPolicy() == ScrollPane.SCROLLBARS_NEVER) { - return 0; - } else { - return pGetScrollbarSpace(Adjustable.HORIZONTAL); - } - } - - public int getVScrollbarWidth() { - ScrollPane sp = (ScrollPane)target; - if (sp.getScrollbarDisplayPolicy() == ScrollPane.SCROLLBARS_NEVER) { - return 0; - } else { - return pGetScrollbarSpace(Adjustable.VERTICAL); - } - } - - public Insets insets() { - ScrollPane sp = (ScrollPane)target; - Dimension d = sp.size(); - Dimension cd; - Component c = getScrollChild(); - if (c != null) { - cd = c.size(); - } else { - cd = new Dimension(0, 0); - } - return pInsets(d.width, d.height, cd.width, cd.height); - } - - public void setUnitIncrement(Adjustable adj, int u) { - ScrollPane sp = (ScrollPane)target; - if (sp.getScrollbarDisplayPolicy() != ScrollPane.SCROLLBARS_NEVER) { - pSetIncrement(adj.getOrientation(), UNIT_INCREMENT, u); - } - } - - public void setValue(Adjustable adj, int v) { - if (! ignore) { - Point p; - Component c = getScrollChild(); - if (c == null) { - return; - } - p = c.getLocation(); - switch(adj.getOrientation()) { - case Adjustable.VERTICAL: - setScrollPosition(-(p.x), v); - break; - case Adjustable.HORIZONTAL: - setScrollPosition(v, -(p.y)); - break; - } - } - } - - public native void setScrollPosition(int x, int y); - - public void childResized(int w, int h) { - // REMIND AIM: May need to revisit this... - if (((ScrollPane)target).getScrollbarDisplayPolicy() != ScrollPane.SCROLLBARS_NEVER) { - ScrollPane sp = (ScrollPane)target; - Adjustable vAdj = sp.getVAdjustable(); - Adjustable hAdj = sp.getHAdjustable(); - pSetIncrement(Scrollbar.VERTICAL, UNIT_INCREMENT, vAdj.getUnitIncrement()); - pSetIncrement(Scrollbar.HORIZONTAL, UNIT_INCREMENT, hAdj.getUnitIncrement()); - pSetIncrement(Scrollbar.VERTICAL, BLOCK_INCREMENT, vAdj.getBlockIncrement()); - pSetIncrement(Scrollbar.HORIZONTAL, BLOCK_INCREMENT, hAdj.getBlockIncrement()); - } - - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - private void postScrollEvent(int orient, int type, - int pos, boolean isAdjusting) - { - Runnable adjustor = new Adjustor(orient, type, pos, isAdjusting); - MToolkit.executeOnEventHandlerThread(new ScrollEvent(target, adjustor)); - } - - /** - * This is used to change the adjustable on dispatch thread to - * represent a change made in the native scrollbar. Since the - * change was reflected immediately at the native level, - * notification from the adjustable is temporarily ignored. - */ - class ScrollEvent extends PeerEvent { - ScrollEvent(Object source, Runnable runnable) { - super(source, runnable, 0L); - } - - public PeerEvent coalesceEvents(PeerEvent newEvent) { - if (log.isLoggable(Level.FINEST)) { - log.log(Level.FINEST, "ScrollEvent coalesced " + newEvent); - } - if (newEvent instanceof ScrollEvent) { - return newEvent; - } - return null; - } - } - - native void setTypedValue(ScrollPaneAdjustable adjustable, int value, int type); - - /** - * Runnable for the ScrollEvent that performs the adjustment. - */ - class Adjustor implements Runnable { - int orient; // selects scrollbar - int type; // adjustment type - int pos; // new position (only used for absolute) - boolean isAdjusting; // isAdjusting status - - Adjustor(int orient, int type, int pos, boolean isAdjusting) { - this.orient = orient; - this.type = type; - this.pos = pos; - this.isAdjusting = isAdjusting; - } - - public void run() { - ScrollPane sp = (ScrollPane)MScrollPanePeer.this.target; - ScrollPaneAdjustable adj = null; - - // ScrollPaneAdjustable made public in 1.4, but - // get[HV]Adjustable can't be declared to return - // ScrollPaneAdjustable because it would break backward - // compatibility -- hence the cast - - if (orient == Adjustable.VERTICAL) { - adj = (ScrollPaneAdjustable)sp.getVAdjustable(); - } else if (orient == Adjustable.HORIZONTAL) { - adj = (ScrollPaneAdjustable)sp.getHAdjustable(); - } else { - if (log.isLoggable(Level.FINE)) { - log.log(Level.FINE, "Assertion failed: unknown orient"); - } - } - - if (adj == null) { - return; - } - - int newpos = adj.getValue(); - switch (type) { - case AdjustmentEvent.UNIT_DECREMENT: - newpos -= adj.getUnitIncrement(); - break; - case AdjustmentEvent.UNIT_INCREMENT: - newpos += adj.getUnitIncrement(); - break; - case AdjustmentEvent.BLOCK_DECREMENT: - newpos -= adj.getBlockIncrement(); - break; - case AdjustmentEvent.BLOCK_INCREMENT: - newpos += adj.getBlockIncrement(); - break; - case AdjustmentEvent.TRACK: - newpos = this.pos; - break; - default: - if (log.isLoggable(Level.FINE)) { - log.log(Level.FINE, "Assertion failed: unknown type"); - } - return; - } - - // keep scroll position in acceptable range - newpos = Math.max(adj.getMinimum(), newpos); - newpos = Math.min(adj.getMaximum(), newpos); - - // set value; this will synchronously fire an AdjustmentEvent - try { - MScrollPanePeer.this.ignore = true; - adj.setValueIsAdjusting(isAdjusting); - - // Fix for 4075484 - consider type information when creating AdjustmentEvent - // We can't just call adj.setValue() because it creates AdjustmentEvent with type=TRACK - // Instead, we call private method setTypedValue of ScrollPaneAdjustable. - // Because ScrollPaneAdjustable is in another package we should call it through native code. - setTypedValue(adj, newpos, type); - } finally { - MScrollPanePeer.this.ignore = false; - } - } - } // class Adjustor - - - private Component getScrollChild() { - ScrollPane sp = (ScrollPane)target; - Component child = null; - try { - child = sp.getComponent(0); - } catch (ArrayIndexOutOfBoundsException e) { - // do nothing. in this case we return null - } - return child; - } - - final static int MARGIN = 1; - final static int SCROLLBAR = 16; - int hsbSpace; - int vsbSpace; - int vval; - int hval; - int vmax; - int hmax; - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more accurate size and - * color information. - */ - public void print(Graphics g) { - ScrollPane sp = (ScrollPane)target; - Dimension d = sp.size(); - Color bg = sp.getBackground(); - Color fg = sp.getForeground(); - Point p = sp.getScrollPosition(); - Component c = getScrollChild(); - Dimension cd; - if (c != null) { - cd = c.size(); - } else { - cd = new Dimension(0, 0); - } - int sbDisplay = sp.getScrollbarDisplayPolicy(); - int vvis, hvis, vmin, hmin, vmax, hmax, vval, hval; - - switch (sbDisplay) { - case ScrollPane.SCROLLBARS_NEVER: - hsbSpace = vsbSpace = 0; - break; - case ScrollPane.SCROLLBARS_ALWAYS: - hsbSpace = vsbSpace = SCROLLBAR; - break; - case ScrollPane.SCROLLBARS_AS_NEEDED: - hsbSpace = (cd.width <= (d.width - 2*MARGIN)? 0 : SCROLLBAR); - vsbSpace = (cd.height <= (d.height - 2*MARGIN)? 0 : SCROLLBAR); - - if (hsbSpace == 0 && vsbSpace != 0) { - hsbSpace = (cd.width <= (d.width - SCROLLBAR - 2*MARGIN)? 0 : SCROLLBAR); - } - if (vsbSpace == 0 && hsbSpace != 0) { - vsbSpace = (cd.height <= (d.height - SCROLLBAR - 2*MARGIN)? 0 : SCROLLBAR); - } - } - - vvis = hvis = vmin = hmin = vmax = hmax = vval = hval = 0; - - if (vsbSpace > 0) { - vmin = 0; - vvis = d.height - (2*MARGIN) - hsbSpace; - vmax = Math.max(cd.height - vvis, 0); - vval = p.y; - } - if (hsbSpace > 0) { - hmin = 0; - hvis = d.width - (2*MARGIN) - vsbSpace; - hmax = Math.max(cd.width - hvis, 0); - hval = p.x; - } - - // need to be careful to add the margins back in here because - // we're drawing the margin border, after all! - int w = d.width - vsbSpace; - int h = d.height - hsbSpace; - - g.setColor(bg); - g.fillRect(0, 0, d.width, d.height); - - if (hsbSpace > 0) { - int sbw = d.width - vsbSpace; - g.fillRect(1, d.height - SCROLLBAR - 3, sbw - 1, SCROLLBAR - 3); - Graphics ng = g.create(); - try { - ng.translate(0, d.height - (SCROLLBAR - 2)); - drawScrollbar(ng, bg, SCROLLBAR - 2, sbw, - hmin, hmax, hval, hvis, true); - } finally { - ng.dispose(); - } - } - if (vsbSpace > 0) { - int sbh = d.height - hsbSpace; - g.fillRect(d.width - SCROLLBAR - 3, 1, SCROLLBAR - 3, sbh - 1); - Graphics ng = g.create(); - try { - ng.translate(d.width - (SCROLLBAR - 2), 0); - drawScrollbar(ng, bg, SCROLLBAR - 2, sbh, - vmin, vmax, vval, vvis, false); - } finally { - ng.dispose(); - } - } - - draw3DRect(g, bg, 0, 0, w - 1, h - 1, false); - - target.print(g); - sp.printComponents(g); - } - - /** - * @see ContainerPeer#restack - */ - public void restack() { - // Since ScrollPane can only have one child its restacking does nothing. - // Also, it is dangerous, since SP child is actually not a child of SP widget - // but the child of SP content widget. - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MScrollbarPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MScrollbarPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,187 +0,0 @@ -/* - * Copyright 1995-2002 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. - */ -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.AdjustmentEvent; - -class MScrollbarPeer extends MComponentPeer implements ScrollbarPeer { - static { - initIDs(); - } - - private boolean inUpCall = false; - - native void create(MComponentPeer parent); - - MScrollbarPeer(Scrollbar target) { - super(target); - } - - // Initialize JNI field and method IDs - private static native void initIDs(); - - public native void pSetValues(int value, int visible, int minimum, int maximum); - public native void setLineIncrement(int l); - public native void setPageIncrement(int l); - - /** - * Returns default size of Motif scrollbar on the platform - * Currently uses hardcoded values - */ - int getDefaultDimension() { - if (System.getProperty("os.name").equals("Linux")) { - return 15; - } else { - return 19; - } - } - - public Dimension getMinimumSize() { - if (((Scrollbar)target).getOrientation() == Scrollbar.VERTICAL) { - return new Dimension(getDefaultDimension(), 50); - } else { - return new Dimension(50, getDefaultDimension()); - } - } - - // NOTE: Callback methods are called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - - private void postAdjustmentEvent(final int type, final int value, - final boolean isAdjusting) - { - final Scrollbar sb = (Scrollbar)target; - MToolkit.executeOnEventHandlerThread(sb, new Runnable() { - public void run() { - inUpCall = true; - sb.setValueIsAdjusting(isAdjusting); - sb.setValue(value); - postEvent(new AdjustmentEvent(sb, - AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - type, value, isAdjusting)); - inUpCall = false; - } - }); - } - - void lineUp(int value) { - postAdjustmentEvent(AdjustmentEvent.UNIT_DECREMENT, value, false); - } - - void lineDown(int value) { - postAdjustmentEvent(AdjustmentEvent.UNIT_INCREMENT, value, false); - } - - void pageUp(int value) { - postAdjustmentEvent(AdjustmentEvent.BLOCK_DECREMENT, value, false); - } - - void pageDown(int value) { - postAdjustmentEvent(AdjustmentEvent.BLOCK_INCREMENT, value, false); - } - - // SB_TOP/BOTTOM are mapped to tracking - void warp(int value) { - postAdjustmentEvent(AdjustmentEvent.TRACK, value, false); - } - - private boolean dragInProgress = false; - - void drag(final int value) { - if (!dragInProgress) { - dragInProgress = true; - } - postAdjustmentEvent(AdjustmentEvent.TRACK, value, true); - } - - void dragEnd(final int value) { - final Scrollbar sb = (Scrollbar)target; - - if (!dragInProgress) { - return; - } - - dragInProgress = false; - MToolkit.executeOnEventHandlerThread(sb, new Runnable() { - public void run() { - // NB: notification only, no sb.setValue() - // last TRACK event will have done it already - inUpCall = true; - sb.setValueIsAdjusting(false); - postEvent(new AdjustmentEvent(sb, - AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - AdjustmentEvent.TRACK, value, false)); - inUpCall = false; - } - }); - } - - /** - * Set the value of the slider in the ScrollBar. - */ - public void setValues(int value, int visible, int minimum, int maximum) { - // Fix for BugTraq ID 4048060. Prevent unnecessary redrawing - // of the slider, when the slider is already in the correct - // position. Since the ScrollBar widget now receives the - // ButtonRelease X event before the Java Adjustor event is - // handled, the slider is already in the correct position and - // does not need to be set again and redrawn, when processing - // the Adjustor event. - if (!inUpCall) { - pSetValues(value, visible, minimum, maximum); - } - } - - public void print(Graphics g) { - Scrollbar sb = (Scrollbar)target; - Dimension d = sb.size(); - Color bg = sb.getBackground(); - - boolean horiz = (sb.getOrientation() == Scrollbar.HORIZONTAL); - - drawScrollbar(g, bg, horiz? d.height : d.width, - horiz? d.width : d.height, - sb.getMinimum(), sb.getMaximum(), - sb.getValue(), sb.getVisible(), - horiz); - - target.print(g); - } - - - /** - * DEPRECATED - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - - protected boolean shouldFocusOnClick() { - // Changed in 1.4 - scroll bars are made focusable by mouse clicks. - return true; - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MTextAreaPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MTextAreaPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,555 +0,0 @@ -/* - * Copyright 1995-2003 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. - */ - -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.TextEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; -import java.awt.datatransfer.*; -import java.io.BufferedReader; -import java.io.StringReader; -import java.io.IOException; -import java.util.Vector; -import java.awt.im.InputMethodRequests; - - -public class MTextAreaPeer extends MComponentPeer implements TextAreaPeer { - native void pCreate(MComponentPeer parent); - - private boolean firstChangeSkipped; - - /** - * Initialize JNI field and method IDs - */ - private static native void initIDs(); - - static { - initIDs(); - } - - void create(MComponentPeer parent) { - firstChangeSkipped = false; - pCreate(parent); - } - - void initialize() { - int start, end; - - TextArea txt = (TextArea)target; - String text; - - if ((text = txt.getText()) != null) { - setText(text); - } - - start = txt.getSelectionStart(); - end = txt.getSelectionEnd(); - - if (end > start) { - select(start, end); - } else { - setCaretPosition(start); - } - - super.pSetScrollbarBackground(getParent_NoClientCode(target).getBackground()); - - if (!target.isBackgroundSet()) { - // This is a way to set the background color of the TextArea - // without calling setBackground - go through native C code - setTargetBackground(SystemColor.text); - } - if (!target.isForegroundSet()) { - target.setForeground(SystemColor.textText); - } - - setEditable(txt.isEditable()); - -// oldSelectionStart = -1; // accessibility support -// oldSelectionEnd = -1; // accessibility support - - super.initialize(); - } - - public MTextAreaPeer(TextArea target) { - super(target); - } - - public void setEditable(boolean editable) { - pSetEditable(editable); - - /* 4136955 - Calling setBackground() here works around an Xt - * bug by forcing Xt to flush an internal widget cache - */ - setBackground(target.getBackground()); - } - public void setBackground(Color c) { - setTextBackground(c); - } - public void setForeground(Color c) { - pSetInnerForeground(c); - } - - native int getExtraWidth(); - native int getExtraHeight(); - public native void setTextBackground(Color c); - public native void pSetEditable(boolean e); - public native void select(int selStart, int selEnd); - public native int getSelectionStart(); - public native int getSelectionEnd(); - public native void setText(String txt); - public native String getText(); - public native void insert(String txt, int pos); - public native void replaceRange(String txt, int start, int end); - public native void setFont(Font f); - public native void setCaretPosition(int pos); - public native int getCaretPosition(); - public native void pSetCursor(Cursor c); - native void pShow2(); - native void pMakeCursorVisible(); - - - public Dimension getMinimumSize() { - return getMinimumSize(10, 60); - } - public Dimension getPreferredSize(int rows, int cols) { - return getMinimumSize(rows, cols); - } - public Dimension getMinimumSize(int rows, int cols) { - FontMetrics fm = getFontMetrics(target.getFont()); - - /* Calculate proper size for text area plus scrollbars. - * - Motif allows NO leading in its text areas ... - * - extra width and height counts everything outside the - * usable text space. - * (bug 4103248, 4120310): - * - Motif uses maxAscent + maxDescent, not ascent + descent. - */ - int colWidth = fm.charWidth('0'); - int rowHeight = fm.getMaxAscent() + fm.getMaxDescent(); - return new Dimension(cols * colWidth + getExtraWidth(), - rows * rowHeight + getExtraHeight()); - } - public boolean isFocusable() { - return true; - } - - // Called from native widget when paste key is pressed and we - // already own the selection (prevents Motif from hanging while - // waiting for the selection) - // - public void pasteFromClipboard() { - Clipboard clipboard = target.getToolkit().getSystemClipboard(); - - Transferable content = clipboard.getContents(this); - if (content != null) { - try { - String data = (String)(content.getTransferData(DataFlavor.stringFlavor)); - // fix for 4401853: to clear TextArea selection if null is pasted - data = (data == null ? "" : data); - replaceRange(data, getSelectionStart(), getSelectionEnd()); - - } catch (Exception e) { - } - } - } - - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more accurate size and - * color information, the top/left text offsets, and selected text. - */ - static final int MARGIN = 2; - static final int BORDER = 1; - static final int SCROLLBAR = 16; - int fontHeight; - int fontAscent; - int fontLeading; - int topLine = 0; - int numLines = 0; - int textLength = 0; - Vector lines; - int selStart = 0; - int selEnd = 0; - int movedRight = 0; - - // the following vars are assigned in print() method - transient boolean hscrollbar; - transient boolean vscrollbar; - - public void print(Graphics g) { - TextArea area = (TextArea)target; - Dimension d = area.size(); - Color bg = area.getBackground(); - Color fg = area.getForeground(); - FontMetrics fm = getFontMetrics(area.getFont()); - int vmin, vmax, vval, vvis; - int hmin, hmax, hval, hvis; - int max = 0; - - /* - Doesn't work right yet. - selStart = area.getSelectionStart(); - selEnd = area.getSelectionEnd(); - */ - - // Figure out number of lines and max line length - String text = area.getText(); - textLength = text.length(); - BufferedReader is = new BufferedReader(new StringReader(text)); - String line; - int pos = 0; - lines = new Vector(); - int sv = ((TextArea)target).getScrollbarVisibility(); - vscrollbar = (sv == TextArea.SCROLLBARS_BOTH || - sv == TextArea.SCROLLBARS_VERTICAL_ONLY); - hscrollbar = (sv == TextArea.SCROLLBARS_BOTH || - sv == TextArea.SCROLLBARS_HORIZONTAL_ONLY); - boolean wrap = !hscrollbar; - int w = d.width - (vscrollbar ? SCROLLBAR : 0); - int h = d.height - (hscrollbar ? SCROLLBAR : 0); - - try { - numLines = 0; - while((line = is.readLine()) != null) { - int len = fm.stringWidth(line); - if (len > w && wrap) { - // need to do line wrapping - int start = 0; - int end = 0; - int string_length = line.length(); - while (true) { - int line_width = 0; - end = start + 1; // at least one character per line - while (end < string_length) { - char c = line.charAt(end); - int cw = fm.charWidth(c); - if (line_width + cw + 10 > w) // +10? - break; - line_width += cw; - end++; - } - // form a line from start to end (not including end) - String substr = line.substring(start, end); - // System.out.println("wrap line: " + substr); - TextLine tline = new TextLine(); - tline.text = substr; - tline.pos = pos + start; - lines.addElement(tline); - start = end; - max = Math.max(max, len); - numLines ++; - if (end == string_length) { - // we have processed the whole string - pos += line.length() + 1; // +1 for the ending \n ? - break; - } - } - } else { - TextLine tline = new TextLine(); - tline.text = line; - tline.pos = pos; - lines.addElement(tline); - pos += line.length() + 1; - - max = Math.max(max, len); - numLines++; - } - } - is.close(); - - } catch (IOException e) { - } - - - fontHeight = fm.getHeight(); - fontAscent = fm.getAscent(); - fontLeading = fm.getLeading(); - - hmin = vmin = 0; - - vvis = linesInWindow(true); - vmax = Math.max(numLines - vvis, 0); - vval = 0; - - hvis = w - (2 * MARGIN); - hmax = Math.max(max - hvis, 0); - hval = 0; - - g.setColor(bg); - g.fillRect(BORDER, BORDER, w, h); - if (vscrollbar) - { - int sbh = d.height - (hscrollbar ? SCROLLBAR : 0); - g.fillRect(d.width - SCROLLBAR - 3, 1, SCROLLBAR - 3, sbh - 1); - Graphics ng = g.create(); - try { - ng.translate(d.width - (SCROLLBAR - 2), 0); - drawScrollbar(ng, bg, SCROLLBAR - 2, sbh, - vmin, vmax, vval, vvis, false); - } finally { - ng.dispose(); - } - } - if (hscrollbar) - { - int sbw = d.width - (vscrollbar ? SCROLLBAR : 0); - g.fillRect(1, d.height - SCROLLBAR - 3, sbw - 1, SCROLLBAR - 3); - Graphics ng = g.create(); - try { - ng.translate(0, d.height - (SCROLLBAR - 2)); - drawScrollbar(ng, bg, SCROLLBAR - 2, sbw, - hmin, hmax, hval, hvis, true); - } finally { - ng.dispose(); - } - } - - draw3DRect(g, bg, 0, 0, w - 1, h - 1, false); - - if (text != null) { - int l = linesInWindow(true); - h = d.height - ((2 * MARGIN) + SCROLLBAR); - int e = Math.min(numLines - 1, (topLine + l) - 1); - paintLines(g, bg, fg, topLine, e); - } - - - target.print(g); - } - - int linesInWindow(boolean horizScrollbar) { - Dimension d = target.size(); - int htotal = d.height - ((2 * MARGIN) + (horizScrollbar? SCROLLBAR : 0)); - return htotal / fontHeight; - } - - void paintLines(Graphics g, Color bg, Color fg, int s, int e) { - Dimension d = target.size(); - int w = d.width - ((2 * BORDER) + (vscrollbar ? SCROLLBAR : 0)); - int h = d.height - ((2 * BORDER) + (hscrollbar ? SCROLLBAR : 0)); - int lm = linesInWindow(true) + topLine; - s = Math.max(topLine, s); - e = Math.min(e, lm - 1); - Graphics ng = g.create(); - try { - ng.clipRect(BORDER + MARGIN, MARGIN + BORDER, w - (2*MARGIN), - h - (2*MARGIN)); - ng.setFont(target.getFont()); - for (int i = s ; i <= e; i++) { - paintLine(ng, bg, fg, i); - } - } finally { - ng.dispose(); - } - } - - void paintLine(Graphics g, Color bg, Color fg, int lnr) { - Dimension d = target.size(); - int l = linesInWindow(true); - - if((lnr < topLine) || (lnr >= l + topLine)) { - return; - } - int w = d.width - ((2 * BORDER) + (hscrollbar ? SCROLLBAR : 0)); - int y = MARGIN + fontLeading + ((lnr - topLine) * fontHeight); - String text = ((TextLine)lines.elementAt(lnr)).text; - int len = text.length(); - - if (lnr > numLines - 1) { - g.setColor(bg); - g.fillRect(BORDER, y - fontLeading, w, fontHeight); - return; - } - int s = 0; - int e = (lnr < numLines - 1) ? len : textLength; - int xs = pos2x(selStart) - movedRight; - int xe = pos2x(selEnd) - movedRight; - - Color highlight = bg.brighter(); - if ((selStart < s) && (selEnd > e)) { - g.setColor(highlight); - g.fillRect(BORDER, y - fontLeading, w, fontHeight); - } else { - g.setColor(bg); - g.fillRect(BORDER, y - fontLeading, w, fontHeight); - - if ((selStart >= s) && (selStart <= e)) { - g.setColor(highlight); - - if (selEnd > e) { - g.fillRect(xs, y - fontLeading, (w + BORDER) - xs, fontHeight); - } else if (selStart == selEnd) { - //g.fillRect(xs, y - fontLeading, 1, fontHeight); - } else { - g.fillRect(xs, y - fontLeading, xe - xs, fontHeight); - } - } else if ((selEnd >= s) && (selEnd <= e)) { - g.setColor(highlight); - g.fillRect(BORDER, y - fontLeading, xe - BORDER, fontHeight); - } - } - g.setColor(fg); - g.drawString(text, MARGIN - movedRight, y + fontAscent); - } - - int pos2x(int pos) { - FontMetrics fm = getFontMetrics(target.getFont()); - int widths[] = fm.getWidths(); - TextLine tl1 = (TextLine)lines.elementAt(0); - TextLine tl2; - int l = 0; - for (int i = 0; i < lines.size() - 1; i++) { - tl2 = (TextLine)lines.elementAt(i+1); - if (pos >= tl1.pos && pos < tl2.pos) { - l = i; - break; - } - tl1 = tl2; - } - int x = MARGIN; - for (int i = 0 ; i < (pos - tl1.pos - 1) ; i++) { - x += widths[tl1.text.charAt(i)]; - } - return x; - } - - /** - * DEPRECATED - */ - public void insertText(String txt, int pos) { - insert(txt, pos); - } - - /** - * DEPRECATED - */ - public void replaceText(String txt, int start, int end) { - replaceRange(txt, start, end); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - - /** - * DEPRECATED - */ - public Dimension preferredSize(int rows, int cols) { - return getPreferredSize(rows, cols); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize(int rows, int cols) { - return getMinimumSize(rows, cols); - } - - /* - * Post a new TextEvent when the value of a text component changes. - */ - public void valueChanged() { - postEvent(new TextEvent(target, TextEvent.TEXT_VALUE_CHANGED)); - } - - void pShow(){ - pShow2(); - notifyTextComponentChange(true); - } - - void pHide(){ - notifyTextComponentChange(false); - super.pHide(); - } - - void pDispose(){ - notifyTextComponentChange(false); - super.pDispose(); - } - - public boolean handlesWheelScrolling() {return true;} - - public void handleEvent(AWTEvent e) { - if (e.getID() == MouseEvent.MOUSE_WHEEL) { - MouseWheelEvent mwe = (MouseWheelEvent)e; - nativeHandleMouseWheel(mwe.getScrollType(), - mwe.getScrollAmount(), - mwe.getWheelRotation()); - } - else { - super.handleEvent(e); - } - } - - public InputMethodRequests getInputMethodRequests() { - return null; - } - - - - native void nativeHandleMouseWheel(int scrollType, - int scrollAmount, - int wheelRotation); - - // - // Accessibility support - // - - - // stub functions: to be fully implemented in a future release - public int getIndexAtPoint(int x, int y) { return -1; } - public Rectangle getCharacterBounds(int i) { return null; } - public long filterEvents(long mask) { return 0; } - -/* To be fully implemented in a future release - - int oldSelectionStart; - int oldSelectionEnd; - - public native int getIndexAtPoint(int x, int y); - public native Rectangle getCharacterBounds(int i); - public native long filterEvents(long mask); - - /** - * Handle a change in the text selection endpoints - * (Note: could be simply a change in the caret location) - * - public void selectionValuesChanged(int start, int end) { - return; // Need to write implementation of this. - } -*/ -} - - -class TextLine { - String text; - int pos; -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MTextFieldPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MTextFieldPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,356 +0,0 @@ -/* - * Copyright 1995-2003 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. - */ - -package sun.awt.motif; - -import java.awt.*; -import java.awt.peer.*; -import java.awt.datatransfer.*; -import java.awt.event.ActionEvent; -import java.awt.event.TextEvent; -import java.awt.im.InputMethodRequests; - - -public class MTextFieldPeer extends MComponentPeer implements TextFieldPeer { - native void pCreate(MComponentPeer parent); - - private boolean firstChangeSkipped; - - /** - * Initialize JNI field and method IDs - */ - private static native void initIDs(); - - static { - initIDs(); - } - - void create(MComponentPeer parent) { - firstChangeSkipped = false; - pCreate(parent); - } - - void initialize() { - int start, end; - - TextField txt = (TextField)target; - - setText(txt.getText()); - if (txt.echoCharIsSet()) { - setEchoChar(txt.getEchoChar()); - } - - start = txt.getSelectionStart(); - end = txt.getSelectionEnd(); - - if (end > start) { - select(start, end); - } else { - setCaretPosition(start); - } - - if (!target.isBackgroundSet()) { - // This is a way to set the background color of the TextArea - // without calling setBackground - go through native C code - setTargetBackground(SystemColor.text); - } - if (!target.isForegroundSet()) { - target.setForeground(SystemColor.textText); - } - - setEditable(txt.isEditable()); - -// oldSelectionStart = -1; // accessibility support -// oldSelectionEnd = -1; // accessibility support - - super.initialize(); - } - - public MTextFieldPeer(TextField target) { - super(target); - } - - public void setEditable(boolean editable) { - pSetEditable(editable); - - /* 4136955 - Calling setBackground() here works around an Xt - * bug by forcing Xt to flush an internal widget cache - */ - setBackground(target.getBackground()); - } - - public native void pSetEditable(boolean editable); - public native void select(int selStart, int selEnd); - public native int getSelectionStart(); - public native int getSelectionEnd(); - public native void setText(String l); - public native void insertReplaceText(String l); - public native void preDispose(); - public native String getText(); - public native void setEchoChar(char c); - public native void setFont(Font f); - public native void setCaretPosition(int pos); - public native int getCaretPosition(); - - // CDE/Motif defaults: margin=5, shadow=2, highlight=1 -- times 2. - // Should have asked the widgets for correct values (see MTextAreaPeer). - private static final int padding = 16; - - public Dimension getMinimumSize() { - FontMetrics fm = getFontMetrics(target.getFont()); - return new Dimension(fm.stringWidth(((TextField)target).getText())+20, - fm.getMaxDescent() + fm.getMaxAscent() + padding); - } - - public Dimension getPreferredSize(int cols) { - return getMinimumSize(cols); - } - - public Dimension getMinimumSize(int cols) { - FontMetrics fm = getFontMetrics(target.getFont()); - return new Dimension(fm.charWidth('0') * cols + 20, - fm.getMaxDescent() + fm.getMaxAscent() + padding); - } - - public boolean isFocusable() { - return true; - } - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void action(final long when, final int modifiers) { - MToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - postEvent(new ActionEvent(target, ActionEvent.ACTION_PERFORMED, - ((TextField)target).getText(), when, - modifiers)); - } - }); - } - - protected void disposeImpl() { - preDispose(); - super.disposeImpl(); - } - - /* - * Post a new TextEvent when the value of a text component changes. - */ - public void valueChanged() { - postEvent(new TextEvent(target, TextEvent.TEXT_VALUE_CHANGED)); - } - - // Called from native widget when paste key is pressed and we - // already own the selection (prevents Motif from hanging while - // waiting for the selection) - // - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void pasteFromClipboard() { - Clipboard clipboard = target.getToolkit().getSystemClipboard(); - - Transferable content = clipboard.getContents(this); - if (content != null) { - try { - String data = (String)(content.getTransferData(DataFlavor.stringFlavor)); - insertReplaceText(data); - - } catch (Exception e) { - } - } - } - - /* - * Print the native component by rendering the Motif look ourselves. - * ToDo(aim): needs to query native motif for more accurate size and - * color information, left text offset, and selected text. - */ - public final static int BORDER = 2; - public final static int MARGIN = 4; - - public void print(Graphics g) { - TextField txt = (TextField)target; - Dimension d = txt.size(); - int w = d.width - (2 * BORDER); - int h = d.height - (2 * BORDER); - Color bg = txt.getBackground(); - Color fg = txt.getForeground(); - Color highlight = bg.brighter(); - String text = txt.getText(); - int moved = 0; - int selStart = 0; - int selEnd = 0; - - g.setFont(txt.getFont()); - g.setColor(txt.isEditable() ? highlight : bg); - g.fillRect(BORDER, BORDER, w, h); - - g.setColor(bg); - //g.drawRect(0, 0, d.width-1, d.height-1); - draw3DRect(g, bg, 1, 1, d.width-3, d.height-3, false); - - if (text != null) { - g.clipRect(BORDER, MARGIN, w, d.height - (2 * MARGIN)); - FontMetrics fm = g.getFontMetrics(); - - w = d.width - BORDER; - h = d.height - (2 * MARGIN); - int xs = pos2x(selStart) - moved; - int xe = pos2x(selEnd) - moved; - - if ((xs < MARGIN) && (xe > w)) { - g.setColor(highlight); - g.fillRect(BORDER, MARGIN, w - BORDER, h); - } else { - g.setColor(bg); - //g.fillRect(BORDER, MARGIN, w - BORDER, h); - - if ((xs >= MARGIN) && (xs <= w)) { - g.setColor(highlight); // selected text - - if (xe > w) { - g.fillRect(xs, MARGIN, w - xs, h); - } else if (xs == xe) { - //g.fillRect(xs, MARGIN, 1, h); - } else { - g.fillRect(xs, MARGIN, xe - xs, h); - } - } else if ((xe >= MARGIN) && (xe <= w)) { - g.setColor(highlight); - g.fillRect(BORDER, MARGIN, xe - BORDER, h); - } - } - g.setColor(fg); - int x = MARGIN - moved; - char echoChar = txt.getEchoChar(); - if (echoChar == 0) { - g.drawString(text, x, BORDER + MARGIN + fm.getMaxAscent()); - } else { - char data[] = new char[text.length()]; - for (int i = 0 ; i < data.length ; i++) { - data[i] = echoChar; - } - g.drawChars(data, 0, data.length, x, - BORDER + MARGIN + fm.getMaxAscent()); - - } - } - - target.print(g); - } - - int pos2x(int pos) { - TextField txt = (TextField)target; - FontMetrics fm = getFontMetrics(txt.getFont()); - int x = MARGIN, widths[] = fm.getWidths(); - String text = txt.getText(); - char echoChar = txt.getEchoChar(); - if (echoChar == 0) { - for (int i = 0 ; i < pos ; i++) { - x += widths[text.charAt(i)]; - } - } else { - x += widths[echoChar] * pos; - } - return x; - } - - /** - * DEPRECATED - */ - public void setEchoCharacter(char c) { - setEchoChar(c); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize() { - return getMinimumSize(); - } - - /** - * DEPRECATED - */ - public Dimension minimumSize(int cols) { - return getMinimumSize(cols); - } - - /** - * DEPRECATED - */ - public Dimension preferredSize(int cols) { - return getPreferredSize(cols); - } - void pShow(){ - super.pShow(); - notifyTextComponentChange(true); - } - - void pHide(){ - notifyTextComponentChange(false); - super.pHide(); - } - - void pDispose(){ - notifyTextComponentChange(false); - super.pDispose(); - } - - public InputMethodRequests getInputMethodRequests() { - return null; - } - - - - // - // Accessibility support - // - - // stub functions: to be fully implemented in a future release - public int getIndexAtPoint(int x, int y) { return -1; } - public Rectangle getCharacterBounds(int i) { return null; } - public long filterEvents(long mask) { return 0; } - - -/* To be fully implemented in a future release - - int oldSelectionStart; - int oldSelectionEnd; - - public native int getIndexAtPoint(int x, int y); - public native Rectangle getCharacterBounds(int i); - public native long filterEvents(long mask); - - /** - * Handle a change in the text selection endpoints - * (Note: could be simply a change in the caret location) - * - public void selectionValuesChanged(int start, int end) { - return; // Need to write implemetation of this. - } -*/ - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MToolkit.java --- a/jdk/src/solaris/classes/sun/awt/motif/MToolkit.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/classes/sun/awt/motif/MToolkit.java Mon Aug 25 13:58:15 2008 -0700 @@ -60,12 +60,12 @@ import java.awt.dnd.InvalidDnDOperationException; import java.awt.dnd.peer.DragSourceContextPeer; -import sun.awt.motif.MInputMethod; +//import sun.awt.motif.MInputMethod; import sun.awt.X11GraphicsConfig; import sun.awt.X11GraphicsEnvironment; import sun.awt.XSettings; -import sun.awt.motif.MDragSourceContextPeer; +//import sun.awt.motif.MDragSourceContextPeer; import sun.print.PrintJob2D; @@ -79,9 +79,9 @@ private static final Logger log = Logger.getLogger("sun.awt.motif.MToolkit"); // the system clipboard - CLIPBOARD selection - X11Clipboard clipboard; + //X11Clipboard clipboard; // the system selection - PRIMARY selection - X11Clipboard selection; + //X11Clipboard selection; // Dynamic Layout Resize client code setting protected static boolean dynamicLayoutSetting = false; @@ -130,7 +130,7 @@ new GetBooleanAction("awt.dnd.motifdnd"))).booleanValue(); } - public static final String DATA_TRANSFERER_CLASS_NAME = "sun.awt.motif.MDataTransferer"; + //public static final String DATA_TRANSFERER_CLASS_NAME = "sun.awt.motif.MDataTransferer"; public MToolkit() { super(); @@ -150,7 +150,7 @@ } init(mainClassName); - SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME); + //SunToolkit.setDataTransfererClassName(DATA_TRANSFERER_CLASS_NAME); Thread toolkitThread = new Thread(this, "AWT-Motif"); toolkitThread.setPriority(Thread.NORM_PRIORITY + 1); @@ -197,131 +197,152 @@ */ public ButtonPeer createButton(Button target) { - ButtonPeer peer = new MButtonPeer(target); - targetCreatedPeer(target, peer); - return peer; + //ButtonPeer peer = new MButtonPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public TextFieldPeer createTextField(TextField target) { - TextFieldPeer peer = new MTextFieldPeer(target); - targetCreatedPeer(target, peer); - return peer; + //TextFieldPeer peer = new MTextFieldPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public LabelPeer createLabel(Label target) { - LabelPeer peer = new MLabelPeer(target); - targetCreatedPeer(target, peer); - return peer; + //LabelPeer peer = new MLabelPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public ListPeer createList(List target) { - ListPeer peer = new MListPeer(target); - targetCreatedPeer(target, peer); - return peer; + //ListPeer peer = new MListPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public CheckboxPeer createCheckbox(Checkbox target) { - CheckboxPeer peer = new MCheckboxPeer(target); - targetCreatedPeer(target, peer); - return peer; + //CheckboxPeer peer = new MCheckboxPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public ScrollbarPeer createScrollbar(Scrollbar target) { - ScrollbarPeer peer = new MScrollbarPeer(target); - targetCreatedPeer(target, peer); - return peer; + //ScrollbarPeer peer = new MScrollbarPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public ScrollPanePeer createScrollPane(ScrollPane target) { - ScrollPanePeer peer = new MScrollPanePeer(target); - targetCreatedPeer(target, peer); - return peer; + //ScrollPanePeer peer = new MScrollPanePeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public TextAreaPeer createTextArea(TextArea target) { - TextAreaPeer peer = new MTextAreaPeer(target); - targetCreatedPeer(target, peer); - return peer; + //TextAreaPeer peer = new MTextAreaPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public ChoicePeer createChoice(Choice target) { - ChoicePeer peer = new MChoicePeer(target); - targetCreatedPeer(target, peer); - return peer; + //ChoicePeer peer = new MChoicePeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public FramePeer createFrame(Frame target) { - FramePeer peer = new MFramePeer(target); - targetCreatedPeer(target, peer); - return peer; + //FramePeer peer = new MFramePeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public CanvasPeer createCanvas(Canvas target) { - CanvasPeer peer = (isXEmbedServerRequested() ? new MEmbedCanvasPeer(target) : new MCanvasPeer(target)); - targetCreatedPeer(target, peer); - return peer; + //CanvasPeer peer = (isXEmbedServerRequested() ? new MEmbedCanvasPeer(target) : new MCanvasPeer(target)); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public PanelPeer createPanel(Panel target) { - PanelPeer peer = new MPanelPeer(target); - targetCreatedPeer(target, peer); - return peer; + //PanelPeer peer = new MPanelPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public WindowPeer createWindow(Window target) { - WindowPeer peer = new MWindowPeer(target); - targetCreatedPeer(target, peer); - return peer; + //WindowPeer peer = new MWindowPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public DialogPeer createDialog(Dialog target) { - DialogPeer peer = new MDialogPeer(target); - targetCreatedPeer(target, peer); - return peer; + //DialogPeer peer = new MDialogPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public FileDialogPeer createFileDialog(FileDialog target) { - FileDialogPeer peer = new MFileDialogPeer(target); - targetCreatedPeer(target, peer); - return peer; + //FileDialogPeer peer = new MFileDialogPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public MenuBarPeer createMenuBar(MenuBar target) { - MenuBarPeer peer = new MMenuBarPeer(target); - targetCreatedPeer(target, peer); - return peer; + //MenuBarPeer peer = new MMenuBarPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public MenuPeer createMenu(Menu target) { - MenuPeer peer = new MMenuPeer(target); - targetCreatedPeer(target, peer); - return peer; + //MenuPeer peer = new MMenuPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public PopupMenuPeer createPopupMenu(PopupMenu target) { - PopupMenuPeer peer = new MPopupMenuPeer(target); - targetCreatedPeer(target, peer); - return peer; + //PopupMenuPeer peer = new MPopupMenuPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public MenuItemPeer createMenuItem(MenuItem target) { - MenuItemPeer peer = new MMenuItemPeer(target); - targetCreatedPeer(target, peer); - return peer; + //MenuItemPeer peer = new MMenuItemPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } public CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target) { - CheckboxMenuItemPeer peer = new MCheckboxMenuItemPeer(target); - targetCreatedPeer(target, peer); - return peer; + //CheckboxMenuItemPeer peer = new MCheckboxMenuItemPeer(target); + //targetCreatedPeer(target, peer); + //return peer; + return null; } - public MEmbeddedFramePeer createEmbeddedFrame(MEmbeddedFrame target) - { - MEmbeddedFramePeer peer = new MEmbeddedFramePeer(target); - targetCreatedPeer(target, peer); - return peer; - } + //public MEmbeddedFramePeer createEmbeddedFrame(MEmbeddedFrame target) + //{ + //MEmbeddedFramePeer peer = new MEmbeddedFramePeer(target); + //targetCreatedPeer(target, peer); + //return peer; + // return null; + //} public FontPeer getFontPeer(String name, int style){ @@ -438,29 +459,31 @@ public native void beep(); public Clipboard getSystemClipboard() { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - security.checkSystemClipboardAccess(); - } - synchronized (this) { - if (clipboard == null) { - clipboard = new X11Clipboard("System", "CLIPBOARD"); - } - } - return clipboard; + //SecurityManager security = System.getSecurityManager(); + //if (security != null) { + // security.checkSystemClipboardAccess(); + //} + //synchronized (this) { + // if (clipboard == null) { + // clipboard = new X11Clipboard("System", "CLIPBOARD"); + // } + //} + //return clipboard; + return null; } public Clipboard getSystemSelection() { - SecurityManager security = System.getSecurityManager(); - if (security != null) { - security.checkSystemClipboardAccess(); - } - synchronized (this) { - if (selection == null) { - selection = new X11Clipboard("Selection", "PRIMARY"); - } - } - return selection; + //SecurityManager security = System.getSecurityManager(); + //if (security != null) { + // security.checkSystemClipboardAccess(); + //} + //synchronized (this) { + // if (selection == null) { + // selection = new X11Clipboard("Selection", "PRIMARY"); + // } + //} + //return selection; + return null; } public boolean getLockingKeyState(int key) { @@ -492,11 +515,12 @@ } public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { - if (MToolkit.useMotifDnD()) { - return MDragSourceContextPeer.createDragSourceContextPeer(dge); - } else { - return X11DragSourceContextPeer.createDragSourceContextPeer(dge); - } + //if (MToolkit.useMotifDnD()) { + // return MDragSourceContextPeer.createDragSourceContextPeer(dge); + //} else { + // return X11DragSourceContextPeer.createDragSourceContextPeer(dge); + //} + return null; } public T @@ -504,9 +528,9 @@ DragSource ds, Component c, int srcActions, DragGestureListener dgl) { - if (MouseDragGestureRecognizer.class.equals(abstractRecognizerClass)) - return (T)new MMouseDragGestureRecognizer(ds, c, srcActions, dgl); - else + //if (MouseDragGestureRecognizer.class.equals(abstractRecognizerClass)) + // return (T)new MMouseDragGestureRecognizer(ds, c, srcActions, dgl); + //else return null; } @@ -514,14 +538,14 @@ * Returns a new input method adapter descriptor for native input methods. */ public InputMethodDescriptor getInputMethodAdapterDescriptor() throws AWTException { - return new MInputMethodDescriptor(); + return null; // return new MInputMethodDescriptor(); } /** * Returns a style map for the input method highlight. */ public Map mapInputMethodHighlight(InputMethodHighlight highlight) { - return MInputMethod.mapInputMethodHighlight(highlight); + return null; //return MInputMethod.mapInputMethodHighlight(highlight); } /** @@ -529,15 +553,15 @@ */ public Cursor createCustomCursor(Image cursor, Point hotSpot, String name) throws IndexOutOfBoundsException { - return new MCustomCursor(cursor, hotSpot, name); + return null; //return new MCustomCursor(cursor, hotSpot, name); } /** * Returns the supported cursor size */ public Dimension getBestCursorSize(int preferredWidth, int preferredHeight) { - return MCustomCursor.getBestCursorSize( - java.lang.Math.max(1,preferredWidth), java.lang.Math.max(1,preferredHeight)); + return null; //MCustomCursor.getBestCursorSize( + //java.lang.Math.max(1,preferredWidth), java.lang.Math.max(1,preferredHeight)); } public int getMaximumCursorColors() { @@ -621,7 +645,8 @@ public RobotPeer createRobot(Robot target, GraphicsDevice screen) { /* 'target' is unused for now... */ - return new MRobotPeer(screen.getDefaultConfiguration()); + //return new MRobotPeer(screen.getDefaultConfiguration()); + return null; } static boolean useMotifDnD() { diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/MWindowPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/MWindowPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,602 +0,0 @@ -/* - * Copyright 1995-2008 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. - */ -package sun.awt.motif; - -import java.util.Vector; -import java.awt.*; -import java.awt.peer.*; -import java.awt.event.*; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.DataBufferInt; -import java.awt.image.ImageObserver; -import sun.awt.image.ImageRepresentation; -import sun.awt.motif.MInputMethod; -import sun.awt.motif.MInputMethodControl; -import sun.awt.im.*; -import sun.awt.DisplayChangedListener; -import sun.awt.SunToolkit; -import sun.awt.X11GraphicsDevice; - -class MWindowPeer extends MPanelPeer implements WindowPeer, -DisplayChangedListener { - - Insets insets = new Insets( 0, 0, 0, 0 ); - MWindowAttributes winAttr; - static Vector allWindows = new Vector(); - int iconWidth = -1; - int iconHeight = -1; - - int dropTargetCount = 0; - boolean alwaysOnTop; - - native void pCreate(MComponentPeer parent, String targetClassName, boolean isFocusableWindow); - native void pShow(); - native void pToFront(); - native void pShowModal(boolean isModal); - native void pHide(); - native void pReshape(int x, int y, int width, int height); - native void pDispose(); - native void pSetTitle(String title); - public native void setState(int state); - public native int getState(); - - public native void setResizable(boolean resizable); - native void addTextComponentNative(MComponentPeer tc); - native void removeTextComponentNative(); - native void pSetIMMOption(String option); - native void pSetMenuBar(MMenuBarPeer mbpeer); - native void setSaveUnder(boolean state); - - native void registerX11DropTarget(Component target); - native void unregisterX11DropTarget(Component target); - native void updateAlwaysOnTop(boolean isAlwaysOnTop); - - private static native void initIDs(); - - static { - initIDs(); - } - - // this function is privileged! do not change it to public! - private static int getInset(final String name, final int def) { - Integer tmp = (Integer) java.security.AccessController.doPrivileged( - new sun.security.action.GetIntegerAction(name, def)); - return tmp.intValue(); - } - - MWindowPeer() { - insets = new Insets(0,0,0,0); - winAttr = new MWindowAttributes(); - } - - MWindowPeer(Window target) { - - this(); - init(target); - - allWindows.addElement(this); - } - - void create(MComponentPeer parent) { - pCreate(parent, target.getClass().getName(), ((Window)target).isFocusableWindow()); - } - - void init( Window target ) { - if ( winAttr.nativeDecor == true ) { - insets.top = getInset("awt.frame.topInset", -1); - insets.left = getInset("awt.frame.leftInset", -1); - insets.bottom = getInset("awt.frame.bottomInset", -1); - insets.right = getInset("awt.frame.rightInset", -1); - } - - Rectangle bounds = target.getBounds(); - sysX = bounds.x; - sysY = bounds.y; - sysW = bounds.width; - sysH = bounds.height; - - super.init(target); - InputMethodManager imm = InputMethodManager.getInstance(); - String menuString = imm.getTriggerMenuString(); - if (menuString != null) - { - pSetIMMOption(menuString); - } - pSetTitle(winAttr.title); - - /* - * For Windows and undecorated Frames and Dialogs this just - * disables/enables resizing functions in the system menu. - */ - setResizable(winAttr.isResizable); - - setSaveUnder(true); - - Font f = target.getFont(); - if (f == null) { - f = defaultFont; - target.setFont(f); - setFont(f); - } - Color c = target.getBackground(); - if (c == null) { - target.setBackground(SystemColor.window); - setBackground(SystemColor.window); - } - c = target.getForeground(); - if (c == null) { - target.setForeground(SystemColor.windowText); - setForeground(SystemColor.windowText); - } - alwaysOnTop = ((Window)target).isAlwaysOnTop() && ((Window)target).isAlwaysOnTopSupported(); - - GraphicsConfiguration gc = getGraphicsConfiguration(); - ((X11GraphicsDevice)gc.getDevice()).addDisplayChangedListener(this); - - } - - /* Support for multiple icons is not implemented in MAWT */ - public void updateIconImages() { - if (this instanceof MFramePeer) { - ((MFramePeer)this).setIconImage(((Frame)target).getIconImage()); - } - } - - - /* Not implemented in MAWT */ - public void updateMinimumSize() { - } - - protected void disposeImpl() { - allWindows.removeElement(this); - super.disposeImpl(); - } - - public native void toBack(); - - public void setAlwaysOnTop(boolean alwaysOnTop) { - this.alwaysOnTop = alwaysOnTop; - updateAlwaysOnTop(alwaysOnTop); - } - - public void toFront() { - if (target.isVisible()) { - updateFocusableWindowState(); - pToFront(); - } - } - - public void updateFocusableWindowState() { - setFocusableWindow(((Window)target).isFocusableWindow()); - } - native void setFocusableWindow(boolean value); - - public void setVisible( boolean b ) { - if (b) { - updateFocusableWindowState(); - } - super.setVisible(b); - updateAlwaysOnTop(alwaysOnTop); - } - - public Insets getInsets() { - return insets; - } - - public void handleQuit() { - postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_CLOSING)); - } - - // XXX: nasty WM, foul play. spank WM author. - public void handleDestroy() { - final Window target = (Window)this.target; - SunToolkit.executeOnEventHandlerThread(target, - new Runnable() { - public void run() { - // This seems like the only reasonable thing we - // could do in this situation as the native window - // is already dead. - target.dispose(); - } - }); - } - - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleIconify() { - postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_ICONIFIED)); - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleDeiconify() { - postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_DEICONIFIED)); - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleStateChange(int oldState, int newState) { - postEvent(new WindowEvent((Window)target, - WindowEvent.WINDOW_STATE_CHANGED, - oldState, newState)); - } - - /** - * Called to inform the Window that its size has changed and it - * should layout its children. - */ - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleResize(int width, int height) { - sysW = width; - sysH = height; - - // REMIND: Is this secure? Can client code subclass input method? - if (!tcList.isEmpty() && - !imList.isEmpty()){ - int i; - for (i = 0; i < imList.size(); i++){ - ((MInputMethod)imList.elementAt(i)).configureStatus(); - } - } - validateSurface(width, height); - postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_RESIZED)); - } - - - /** - * DEPRECATED: Replaced by getInsets(). - */ - public Insets insets() { - return getInsets(); - } - - public void handleMoved(int x, int y) { - sysX = x; - sysY = y; - postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_MOVED)); - } - - private native AWTEvent wrapInSequenced(AWTEvent event); - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleWindowFocusIn() { - WindowEvent we = new WindowEvent((Window)target, WindowEvent.WINDOW_GAINED_FOCUS); - /* wrap in Sequenced, then post*/ - postEvent(wrapInSequenced((AWTEvent) we)); - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void handleWindowFocusOut(Window oppositeWindow) { - WindowEvent we = new WindowEvent((Window)target, WindowEvent.WINDOW_LOST_FOCUS, - oppositeWindow); - /* wrap in Sequenced, then post*/ - postEvent(wrapInSequenced((AWTEvent) we)); - } - - -// relocation of Imm stuff - private Vector imList = new Vector(); - private Vector tcList = new Vector(); - - // NOTE: This method is called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - void notifyIMMOptionChange(){ - - // REMIND: IS THIS SECURE??? CAN USER CODE SUBCLASS INPUTMETHODMGR??? - InputMethodManager.getInstance().notifyChangeRequest(target); - } - - public void addInputMethod(MInputMethod im) { - if (!imList.contains(im)) - imList.addElement(im); - } - - public void removeInputMethod(MInputMethod im) { - if (imList.contains(im)) - imList.removeElement(im); - } - - public void addTextComponent(MComponentPeer tc) { - if (tcList.contains(tc)) - return; - if (tcList.isEmpty()){ - addTextComponentNative(tc); - if (!imList.isEmpty()) { - for (int i = 0; i < imList.size(); i++) { - ((MInputMethod)imList.elementAt(i)).reconfigureXIC((MInputMethodControl)this); - } - } - MToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - synchronized(target.getTreeLock()) { - target.doLayout(); - } - } - }); - } - tcList.addElement(tc); - - } - - public void removeTextComponent(MComponentPeer tc) { - if (!tcList.contains(tc)) - return; - tcList.removeElement(tc); - if (tcList.isEmpty()){ - removeTextComponentNative(); - if (!imList.isEmpty()) { - for (int i = 0; i < imList.size(); i++) { - ((MInputMethod)imList.elementAt(i)).reconfigureXIC((MInputMethodControl)this); - } - } - target.doLayout(); - } - } - - public MComponentPeer getTextComponent() { - if (!tcList.isEmpty()) { - return (MComponentPeer)tcList.firstElement(); - } else { - return null; - } - } - - boolean hasDecorations(int decor) { - if (!winAttr.nativeDecor) { - return false; - } - else { - int myDecor = winAttr.decorations; - boolean hasBits = ((myDecor & decor) == decor); - if ((myDecor & MWindowAttributes.AWT_DECOR_ALL) != 0) - return !hasBits; - else - return hasBits; - } - } - - /* Returns the native paint should be posted after setting new size - */ - public boolean checkNativePaintOnSetBounds(int width, int height) { - // Fix for 4418155. Window does not repaint - // automticaly if shrinking. Should not wait for Expose - return (width > oldWidth) || (height > oldHeight); - } - -/* --- DisplayChangedListener Stuff --- */ - - native void resetTargetGC(Component target); - - /* Xinerama - * called to update our GC when dragged onto another screen - */ - public void draggedToNewScreen(int screenNum) { - final int finalScreenNum = screenNum; - - SunToolkit.executeOnEventHandlerThread((Component)target, new Runnable() - { - public void run() { - displayChanged(finalScreenNum); - } - }); - } - - /* Xinerama - * called to update our GC when dragged onto another screen - */ - public void displayChanged(int screenNum) { - // update our GC - resetLocalGC(screenNum); /* upcall to MCanvasPeer */ - resetTargetGC(target); /* call Window.resetGC() via native */ - - //propagate to children - super.displayChanged(screenNum); /* upcall to MPanelPeer */ - } - - /** - * Helper method that executes the displayChanged(screen) method on - * the event dispatch thread. This method is used in the Xinerama case - * and after display mode change events. - */ - private void executeDisplayChangedOnEDT(int screenNum) { - final int finalScreenNum = screenNum; - Runnable dc = new Runnable() { - public void run() { - displayChanged(finalScreenNum); - } - }; - SunToolkit.executeOnEventHandlerThread((Component)target, dc); - } - - /** - * From the DisplayChangedListener interface; called from - * X11GraphicsDevice when the display mode has been changed. - */ - public void displayChanged() { - GraphicsConfiguration gc = getGraphicsConfiguration(); - int curScreenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen(); - executeDisplayChangedOnEDT(curScreenNum); - } - - /** - * From the DisplayChangedListener interface; top-levels do not need - * to react to this event. - */ - public void paletteChanged() { - } - - public synchronized void addDropTarget() { - if (dropTargetCount == 0) { - registerX11DropTarget(target); - } - dropTargetCount++; - } - - public synchronized void removeDropTarget() { - dropTargetCount--; - if (dropTargetCount == 0) { - unregisterX11DropTarget(target); - } - } - - protected synchronized void updateDropTarget() { - if (dropTargetCount > 0) { - unregisterX11DropTarget(target); - registerX11DropTarget(target); - } - } - - public boolean requestWindowFocus() { - return false; - } - - public void setModalBlocked(Dialog blocker, boolean blocked) { - // do nothing - } - - public void postUngrabEvent() { - postEvent(new sun.awt.UngrabEvent((Window)target)); - } - - boolean isOwnerOf(MComponentPeer child) { - if (child == null) return false; - - Component comp = child.target; - while (comp != null && !(comp instanceof Window)) { - comp = getParent_NoClientCode(comp); - } - if (!(comp instanceof Window)) { - return false; - } - - while (comp != null && !(comp == target) && !(comp instanceof Dialog)) { - comp = getParent_NoClientCode(comp); - } - return (comp == target); - } - - boolean processUngrabMouseEvent(MComponentPeer compPeer, int x_root, int y_root, int type) { - switch (type) { - case 4: // ButtonPress - // Check that the target is the child of the grabbed - // window or the child of one of the owned windows of - // the grabbed window - if (!isOwnerOf(compPeer)) { - postUngrabEvent(); - return true; - } - } - return false; - } - - private final boolean hasWarningWindow() { - return ((Window)target).getWarningString() != null; - } - - // This method is overriden at Dialog and Frame peers. - boolean isTargetUndecorated() { - return true; - } - - private volatile int sysX = 0; - private volatile int sysY = 0; - private volatile int sysW = 0; - private volatile int sysH = 0; - - Rectangle constrainBounds(int x, int y, int width, int height) { - // We don't restrict the setBounds() operation if the code is trusted. - if (!hasWarningWindow()) { - return new Rectangle(x, y, width, height); - } - - int newX = x; - int newY = y; - int newW = width; - int newH = height; - - GraphicsConfiguration gc = ((Window)target).getGraphicsConfiguration(); - Rectangle sB = gc.getBounds(); - Insets sIn = ((Window)target).getToolkit().getScreenInsets(gc); - - int screenW = sB.width - sIn.left - sIn.right; - int screenH = sB.height - sIn.top - sIn.bottom; - - // If it's undecorated or is not currently visible, - // then check each point is within the visible part of the screen - if (!target.isVisible() || isTargetUndecorated()) { - int screenX = sB.x + sIn.left; - int screenY = sB.y + sIn.top; - - // First make sure the size is withing the visible part of the screen - if (newW > screenW) { - newW = screenW; - } - - if (newH > screenH) { - newH = screenH; - } - - // Tweak the location if needed - if (newX < screenX) { - newX = screenX; - } else if (newX + newW > screenX + screenW) { - newX = screenX + screenW - newW; - } - - if (newY < screenY) { - newY = screenY; - } else if (newY + newH > screenY + screenH) { - newY = screenY + screenH - newH; - } - } else { - int maxW = Math.max(screenW, sysW); - int maxH = Math.max(screenH, sysH); - - // Make sure the size is withing the visible part of the screen - // OR is less that the current size of the window. - if (newW > maxW) { - newW = maxW; - } - - if (newH > maxH) { - newH = maxH; - } - } - - return new Rectangle(newX, newY, newW, newH); - } - - public void setBounds(int x, int y, int width, int height, int op) { - Rectangle newBounds = constrainBounds(x, y, width, height); - super.setBounds(newBounds.x, newBounds.y, newBounds.width, newBounds.height, op); - } - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/X11Clipboard.java --- a/jdk/src/solaris/classes/sun/awt/motif/X11Clipboard.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,151 +0,0 @@ -/* - * Copyright 1996-2003 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. - */ - -package sun.awt.motif; - -import java.awt.datatransfer.ClipboardOwner; -import java.awt.datatransfer.Transferable; - -import java.io.IOException; - -import java.security.AccessController; - -import sun.awt.datatransfer.SunClipboard; -import sun.awt.datatransfer.TransferableProxy; -import sun.awt.datatransfer.DataTransferer; - -import sun.security.action.GetIntegerAction; - - -/** - * A class which interfaces with the X11 selection service in order to support - * data transfer via Clipboard operations. Most of the work is provided by - * sun.awt.datatransfer.DataTransferer. - * - * @author Amy Fowler - * @author Roger Brinkley - * @author Danila Sinopalnikov - * @author Alexander Gerasimov - * - * @since JDK1.1 - */ -public class X11Clipboard extends SunClipboard implements X11SelectionHolder { - - private final X11Selection clipboardSelection; - - private static final Object classLock = new Object(); - - private static final int defaultPollInterval = 200; - - private static int pollInterval; - - private static int listenedClipboardsCount; - - /** - * Creates a system clipboard object. - */ - public X11Clipboard(String name, String selectionName) { - super(name); - clipboardSelection = new X11Selection(selectionName, this); - } - - protected void setContentsNative(Transferable contents) { - if (!clipboardSelection.getSelectionOwnership(contents, this)) { - // Need to figure out how to inform owner the request failed... - this.owner = null; - this.contents = null; - } - } - - public long getID() { - return clipboardSelection.atom; - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void lostSelectionOwnership() { - lostOwnershipImpl(); - } - - protected void clearNativeContext() { - clipboardSelection.clearNativeContext(); - } - - protected long[] getClipboardFormats() { - return getClipboardFormats(getID()); - } - private static native long[] getClipboardFormats(long clipboardID); - - protected byte[] getClipboardData(long format) - throws IOException { - return getClipboardData(getID(), format); - } - private static native byte[] getClipboardData(long clipboardID, long format) - throws IOException; - - - // Called on the toolkit thread under awtLock. - public void checkChange(long[] formats) { - if (!clipboardSelection.isOwner()) { - super.checkChange(formats); - } - } - - void checkChangeHere(Transferable contents) { - if (areFlavorListenersRegistered()) { - super.checkChange(DataTransferer.getInstance(). - getFormatsForTransferableAsArray(contents, flavorMap)); - } - } - - protected void registerClipboardViewerChecked() { - if (pollInterval <= 0) { - pollInterval = ((Integer)AccessController.doPrivileged( - new GetIntegerAction("awt.datatransfer.clipboard.poll.interval", - defaultPollInterval))).intValue(); - if (pollInterval <= 0) { - pollInterval = defaultPollInterval; - } - } - synchronized (X11Clipboard.classLock) { - if (listenedClipboardsCount++ == 0) { - registerClipboardViewer(pollInterval); - } - } - } - - private native void registerClipboardViewer(int pollInterval); - - protected void unregisterClipboardViewerChecked() { - synchronized (X11Clipboard.classLock) { - if (--listenedClipboardsCount == 0) { - unregisterClipboardViewer(); - } - } - } - - private native void unregisterClipboardViewer(); - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/X11DragSourceContextPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/X11DragSourceContextPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,131 +0,0 @@ -/* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.awt.motif; - -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Window; - -import java.awt.datatransfer.Transferable; - -import java.awt.dnd.DragSourceContext; -import java.awt.dnd.DragSourceDragEvent; -import java.awt.dnd.DragSourceDropEvent; -import java.awt.dnd.DragSourceEvent; -import java.awt.dnd.DragGestureEvent; -import java.awt.dnd.InvalidDnDOperationException; - -import java.awt.event.InputEvent; - -import java.util.Map; - -import sun.awt.SunToolkit; - -import sun.awt.dnd.SunDragSourceContextPeer; -import sun.awt.dnd.SunDropTargetContextPeer; - -/** - * The X11DragSourceContextPeer class is the class responsible for handling - * the interaction between the XDnD/Motif DnD subsystem and Java drag sources. - * - * @since 1.5 - */ -final class X11DragSourceContextPeer extends SunDragSourceContextPeer { - - private static final X11DragSourceContextPeer theInstance = - new X11DragSourceContextPeer(null); - - /** - * construct a new X11DragSourceContextPeer - */ - - private X11DragSourceContextPeer(DragGestureEvent dge) { - super(dge); - } - - static X11DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) throws InvalidDnDOperationException { - theInstance.setTrigger(dge); - return theInstance; - } - - protected void startDrag(Transferable transferable, - long[] formats, Map formatMap) { - Component component = getTrigger().getComponent(); - Component c = null; - MWindowPeer wpeer = null; - - for (c = component; c != null && !(c instanceof java.awt.Window); - c = MComponentPeer.getParent_NoClientCode(c)); - - if (c instanceof Window) { - wpeer = (MWindowPeer)c.getPeer(); - } - - if (wpeer == null) { - throw new InvalidDnDOperationException( - "Cannot find top-level for the drag source component"); - } - - startDrag(component, - wpeer, - transferable, - getTrigger().getTriggerEvent(), - getCursor(), - getCursor() == null ? 0 : getCursor().getType(), - getDragSourceContext().getSourceActions(), - formats, - formatMap); - - /* This implementation doesn't use native context */ - setNativeContext(0); - - SunDropTargetContextPeer.setCurrentJVMLocalSourceTransferable(transferable); - } - - /** - * downcall into native code - */ - - private native long startDrag(Component component, - MWindowPeer wpeer, - Transferable transferable, - InputEvent nativeTrigger, - Cursor c, int ctype, int actions, - long[] formats, Map formatMap); - - /** - * set cursor - */ - - public void setCursor(Cursor c) throws InvalidDnDOperationException { - SunToolkit.awtLock(); - super.setCursor(c); - SunToolkit.awtUnlock(); - } - - protected native void setNativeCursor(long nativeCtxt, Cursor c, int cType); - -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/X11DropTargetContextPeer.java --- a/jdk/src/solaris/classes/sun/awt/motif/X11DropTargetContextPeer.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,167 +0,0 @@ -/* - * Copyright 2003-2004 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. - */ - -package sun.awt.motif; - -import java.awt.Component; -import java.awt.peer.ComponentPeer; - -import sun.awt.AppContext; -import sun.awt.SunToolkit; - -import sun.awt.dnd.SunDropTargetContextPeer; -import sun.awt.dnd.SunDropTargetEvent; - -/** - * The X11DropTargetContextPeer class is the class responsible for handling - * the interaction between the XDnD/Motif DnD subsystem and Java drop targets. - * - * @since 1.5 - */ -final class X11DropTargetContextPeer extends SunDropTargetContextPeer { - - /* - * A key to store a peer instance for an AppContext. - */ - private static final Object DTCP_KEY = "DropTargetContextPeer"; - - private X11DropTargetContextPeer() {} - - public static X11DropTargetContextPeer getPeer(AppContext appContext) { - synchronized (_globalLock) { - X11DropTargetContextPeer peer = - (X11DropTargetContextPeer)appContext.get(DTCP_KEY); - if (peer == null) { - peer = new X11DropTargetContextPeer(); - appContext.put(DTCP_KEY, peer); - } - - return peer; - } - } - - /* - * Note: - * the method can be called on the toolkit thread while holding AWT_LOCK. - */ - private static void postDropTargetEventToPeer(final Component component, - final int x, final int y, - final int dropAction, - final int actions, - final long[] formats, - final long nativeCtxt, - final int eventID) { - - AppContext appContext = SunToolkit.targetToAppContext(component); - X11DropTargetContextPeer peer = getPeer(appContext); - - peer.postDropTargetEvent(component, x, y, dropAction, actions, formats, - nativeCtxt, eventID, - !SunDropTargetContextPeer.DISPATCH_SYNC); - } - - protected void eventProcessed(SunDropTargetEvent e, int returnValue, - boolean dispatcherDone) { - /* If the event was not consumed, send a response to the source. */ - long ctxt = getNativeDragContext(); - if (ctxt != 0) { - sendResponse(e.getID(), returnValue, ctxt, dispatcherDone, - e.isConsumed()); - } - } - - protected void doDropDone(boolean success, int dropAction, - boolean isLocal) { - dropDone(getNativeDragContext(), success, dropAction); - } - - protected Object getNativeData(long format) { - return getData(getNativeDragContext(), format); - } - - protected void processEnterMessage(SunDropTargetEvent event) { - if (!processSunDropTargetEvent(event)) { - super.processEnterMessage(event); - } - } - - protected void processExitMessage(SunDropTargetEvent event) { - if (!processSunDropTargetEvent(event)) { - super.processExitMessage(event); - } - } - - protected void processMotionMessage(SunDropTargetEvent event, - boolean operationChanged) { - if (!processSunDropTargetEvent(event)) { - super.processMotionMessage(event, operationChanged); - } - } - - protected void processDropMessage(SunDropTargetEvent event) { - if (!processSunDropTargetEvent(event)) { - super.processDropMessage(event); - } - } - - // If source is an XEmbedCanvasPeer, passes the event to it for processing and - // return true if the event is forwarded to the XEmbed child. - // Otherwise, does nothing and return false. - private boolean processSunDropTargetEvent(SunDropTargetEvent event) { - Object source = event.getSource(); - - if (source instanceof Component) { - ComponentPeer peer = ((Component)source).getPeer(); - if (peer instanceof MEmbedCanvasPeer) { - MEmbedCanvasPeer mEmbedCanvasPeer = (MEmbedCanvasPeer)peer; - /* The native context is the pointer to the XClientMessageEvent - structure. */ - long ctxt = getNativeDragContext(); - - /* If the event is not consumed, pass it to the - MEmbedCanvasPeer for processing. */ - if (!event.isConsumed()) { - // NOTE: ctxt can be zero at this point. - if (mEmbedCanvasPeer.processXEmbedDnDEvent(ctxt, - event.getID())) { - event.consume(); - return true; - } - } - } - } - - return false; - } - - private native void sendResponse(int eventID, int returnValue, - long nativeCtxt, boolean dispatcherDone, - boolean consumed); - - private native void dropDone(long nativeCtxt, boolean success, - int dropAction); - - private native Object getData(long nativeCtxt, long format); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/X11Selection.java --- a/jdk/src/solaris/classes/sun/awt/motif/X11Selection.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,203 +0,0 @@ -/* - * Copyright 1996-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -package sun.awt.motif; - -import java.awt.Toolkit; - -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.FlavorMap; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.SystemFlavorMap; - -import java.util.Map; -import java.util.SortedMap; -import java.util.Vector; - -import sun.awt.AppContext; -import sun.awt.SunToolkit; - -import sun.awt.datatransfer.DataTransferer; - -/* - * Implements a general interface to the X11 selection mechanism. - * - * @author Amy Fowler - * @author Roger Brinkley - * @author Danila Sinopalnikov - * @author Alexander Gerasimov - * - * @since JDK1.1 - */ -public class X11Selection { - - static FlavorMap flavorMap = SystemFlavorMap.getDefaultFlavorMap(); - - static Vector selections; - - long atom; - - private X11Clipboard clipboard; - private X11SelectionHolder holder; - private Transferable contents; - - private boolean disposed = false; - private byte[] data = null; - private boolean dataAvailable = false; - private static final Object source = new Object(); - - static { - // 4154170: Need to ensure the the toolkit is initialized prior - // to executing this initializer - Toolkit toolkit = Toolkit.getDefaultToolkit(); - - selections = new Vector(); - - initIDs(); - init(); - - } - - private static native void initIDs(); - static native void init(); - - public X11Selection(String name, X11Clipboard clipboard) { - atom = ((MDataTransferer)DataTransferer.getInstance()).getAtomForTarget(name); - selections.addElement(this); - this.clipboard = clipboard; - } - - private static Object[] getSelectionsArray() { - return selections.toArray(); - } - - /* - * methods for acting as selection provider - */ - native boolean pGetSelectionOwnership(Object source, - Transferable transferable, - long[] formats, - Map formatMap, - X11SelectionHolder holder); - - boolean getSelectionOwnership(Transferable contents, - X11SelectionHolder holder) { - SortedMap formatMap = - DataTransferer.getInstance().getFormatsForTransferable - (contents, DataTransferer.adaptFlavorMap(flavorMap)); - long[] formats = - DataTransferer.getInstance().keysToLongArray(formatMap); - SunToolkit.insertTargetMapping(source, AppContext.getAppContext()); - - /* - * Update 'contents' and 'holder' fields in the native code under - * AWTLock protection to prevent race with lostSelectionOwnership(). - */ - SunToolkit.awtLock(); - try { - boolean isOwnerSet = pGetSelectionOwnership(source, contents, formats, formatMap, - holder); - if (isOwnerSet) { - clipboard.checkChangeHere(contents); - } - return isOwnerSet; - } finally { - SunToolkit.awtUnlock(); - } - } - - // To be MT-safe this method should be called under awtLock. - boolean isOwner() { - return holder != null; - } - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - private void lostSelectionOwnership() { - if (holder != null) { - holder.lostSelectionOwnership(); - holder = null; - } - contents = null; - } - - native void clearNativeContext(); - - /* - * Subclasses should override disposeImpl() instead of dispose(). Client - * code should always invoke dispose(), never disposeImpl(). - */ - protected void disposeImpl() { - selections.removeElement(this); - } - - public final void dispose() { - boolean call_disposeImpl = false; - - if (!disposed) { - synchronized (this) { - if (!disposed) { - disposed = call_disposeImpl = true; - } - } - } - - if (call_disposeImpl) { - disposeImpl(); - } - } - - /** - * Finds out all selections that have flavor listeners registered - * and returns their atoms. - * Upcall from native code. - * - * @return an array of selection atoms - */ - private static long[] getSelectionAtomsToCheckChange() { - Object[] sels = getSelectionsArray(); - long[] idArray = new long[sels.length]; - int count = 0; - - for (int i = 0; i < sels.length; i++) { - X11Clipboard clipboard = ((X11Selection)sels[i]).clipboard; - if (clipboard.areFlavorListenersRegistered()) { - idArray[count++] = clipboard.getID(); - } - } - - long[] atomArray = new long[count]; - System.arraycopy(idArray, 0, atomArray, 0, atomArray.length); - - return atomArray; - } - - /** - * Upcall from native code. - */ - private void checkChange(long[] formats) { - clipboard.checkChange(formats); - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/classes/sun/awt/motif/X11SelectionHolder.java --- a/jdk/src/solaris/classes/sun/awt/motif/X11SelectionHolder.java Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright 1996-1998 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. - */ - -package sun.awt.motif; - -interface X11SelectionHolder { - - // NOTE: This method may be called by privileged threads. - // DO NOT INVOKE CLIENT CODE ON THIS THREAD! - public void lostSelectionOwnership(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Button.c --- a/jdk/src/solaris/native/sun/awt/awt_Button.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,276 +0,0 @@ -/* - * Copyright 1995-2001 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 -#include -#include "multi_font.h" - -#include "awt_Component.h" - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -/* - * When the -jni switch is thrown, these headers can be deleted. - */ -#include "java_awt_Button.h" -#include "sun_awt_motif_MButtonPeer.h" -#include "sun_awt_motif_MComponentPeer.h" - -/* fieldIDs for Button fields that may be accessed from C */ -static struct ButtonIDs { - jfieldID label; -} buttonIDs; - -static char emptyString[] = ""; - - -/* - * Class: java_awt_Button - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for Button.java - to initialize the fieldIDs for fields that may be accessed from C */ - -JNIEXPORT void JNICALL -Java_java_awt_Button_initIDs - (JNIEnv *env, jclass cls) -{ - buttonIDs.label = - (*env)->GetFieldID(env, cls, "label", "Ljava/lang/String;"); -} - -/* - * client_data is MButtonPeer instance - */ -static void -Button_callback (Widget w, - XtPointer client_data, - XmPushButtonCallbackStruct * call_data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - ConvertEventTimeAndModifiers converted; - - awt_util_convertEventTimeAndModifiers(call_data->event, &converted); - - JNU_CallMethodByName(env, NULL, (jobject)client_data, "action", "(JI)V", - converted.when, converted.modifiers); - if ((*env)->ExceptionOccurred (env)) { - (*env)->ExceptionDescribe (env); - (*env)->ExceptionClear (env); - } -} - -/* - * Class: sun_awt_motif_MButtonPeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MButtonPeer_create - (JNIEnv * env, jobject this, jobject parent) -{ - jobject target; - jobject label; - struct ComponentData *cdata; - struct ComponentData *wdata; - char *clabel; - Pixel bg; - XmString mfstr = NULL; - jobject globalRef = awtJNI_CreateAndSetGlobalRef (env, this); - jobject font = awtJNI_GetFont (env, this); - jboolean IsMultiFont = awtJNI_IsMultiFont (env, font); - AwtGraphicsConfigDataPtr adata; - - AWT_LOCK (); - - if (JNU_IsNull (env, parent)) { - JNU_ThrowNullPointerException (env, "NullPointerException"); - AWT_UNLOCK (); - - return; - } - target = (*env)->GetObjectField (env, this, mComponentPeerIDs.target); - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, parent, mComponentPeerIDs.pData); - - if (JNU_IsNull (env, target) || wdata == NULL) { - JNU_ThrowNullPointerException (env, "NullPointerException"); - AWT_UNLOCK (); - - return; - } - cdata = ZALLOC (ComponentData); - if (cdata == NULL) { - JNU_ThrowOutOfMemoryError (env, "OutOfMemoryError"); - AWT_UNLOCK (); - return; - } - JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, cdata); - - adata = copyGraphicsConfigToPeer(env, this); - - XtVaGetValues (wdata->widget, XmNbackground, &bg, NULL); - - label = - (*env)->GetObjectField (env, target, buttonIDs.label); - - if (IsMultiFont) { - /* - * We don't use makeCString() function here. - * We create Motif multi-font compound string to display - * unicode on the platform which is not spporting unicode. - */ - if (JNU_IsNull (env, label) || ((*env)->GetStringLength (env, label) == 0)) { - mfstr = XmStringCreateLocalized (""); - } else { - mfstr = awtJNI_MakeMultiFontString (env, label, font); - } - - cdata->widget = XtVaCreateManagedWidget - ("", xmPushButtonWidgetClass, - wdata->widget, - XmNlabelString, mfstr, - XmNrecomputeSize, False, - XmNbackground, bg, - XmNhighlightOnEnter, False, - XmNshowAsDefault, 0, - XmNdefaultButtonShadowThickness, 0, - XmNmarginTop, 0, - XmNmarginBottom, 0, - XmNmarginLeft, 0, - XmNmarginRight, 0, - XmNuserData, (XtPointer) globalRef, - XmNscreen, ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen), - NULL); - if (mfstr != NULL) { - XmStringFree(mfstr); - mfstr = NULL; - } - - } else { - if (JNU_IsNull (env, label)) { - clabel = emptyString; - } else { - clabel = (char *) JNU_GetStringPlatformChars (env, label, NULL); - if (clabel == NULL) { /* Exception? */ - AWT_UNLOCK (); - return; - } - } - - cdata->widget = XtVaCreateManagedWidget - (clabel, xmPushButtonWidgetClass, - wdata->widget, - XmNrecomputeSize, False, - XmNbackground, bg, - XmNhighlightOnEnter, False, - XmNshowAsDefault, 0, - XmNdefaultButtonShadowThickness, 0, - XmNmarginTop, 0, - XmNmarginBottom, 0, - XmNmarginLeft, 0, - XmNmarginRight, 0, - XmNuserData, (XtPointer) globalRef, - XmNscreen, ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen), - NULL); - - if (clabel != emptyString) { - JNU_ReleaseStringPlatformChars (env, label, (const char *) clabel);; - } - } - - XtSetMappedWhenManaged (cdata->widget, False); - XtAddCallback (cdata->widget, - XmNactivateCallback, - (XtCallbackProc) Button_callback, - (XtPointer) globalRef); - - AWT_UNLOCK (); -} - -/* - * Class: sun_awt_motif_MButtonPeer - * Method: setLabel - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MButtonPeer_setLabel - (JNIEnv * env, jobject this, jstring label) -{ - struct ComponentData *wdata; - char *clabel; - XmString xim; - - AWT_LOCK (); - - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (wdata == NULL) { - JNU_ThrowNullPointerException (env, "NullPointerException"); - AWT_UNLOCK (); - return; - } - if (JNU_IsNull (env, label) || ((*env)->GetStringLength (env, label) == 0)) { - xim = XmStringCreateLocalized (""); - } else { - jobject font = awtJNI_GetFont (env, this); - - if (awtJNI_IsMultiFont (env, font)) { - xim = awtJNI_MakeMultiFontString (env, label, font); - } else { - if (JNU_IsNull (env, label)) { - clabel = emptyString; - } else { - clabel = (char *) JNU_GetStringPlatformChars (env, label, NULL); - - if (clabel == NULL) { /* Exception? */ - AWT_UNLOCK (); - return; - } - } - - xim = XmStringCreate (clabel, "labelFont"); - - if (clabel != emptyString) { - JNU_ReleaseStringPlatformChars (env, label, (const char *) clabel);; - } - } - } - - XtVaSetValues (wdata->widget, XmNlabelString, xim, NULL); - XmStringFree (xim); - AWT_FLUSH_UNLOCK (); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Canvas.c --- a/jdk/src/solaris/native/sun/awt/awt_Canvas.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,130 +0,0 @@ -/* - * Copyright 1995-2002 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 "java_awt_Canvas.h" -#include "sun_awt_motif_MCanvasPeer.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "color.h" -#include "canvas.h" -#include "awt_util.h" - -#include "awt_Component.h" -#include "awt_GraphicsEnv.h" - -#include -#include -#include "multi_font.h" - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); -struct CanvasIDs mCanvasIDs; - -/* - * Class: sun_awt_motif_MCanvasPeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCanvasPeer_create - (JNIEnv * env, jobject this, jobject parent) -{ - AwtGraphicsConfigDataPtr awtData; - - struct CanvasData *wdata; - struct CanvasData *cdata; - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - - AWT_LOCK(); - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - cdata = (struct CanvasData *) - JNU_GetLongFieldAsPtr(env, parent, mComponentPeerIDs.pData); - if (cdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - wdata = ZALLOC(CanvasData); - if (wdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, wdata); - - awtData = copyGraphicsConfigToPeer(env, this); - - wdata->comp.widget = awt_canvas_create((XtPointer) globalRef, - cdata->comp.widget, - "", - 1, 1, False, NULL, awtData); - XtVaSetValues(wdata->comp.widget, - XmNinsertPosition, awt_util_insertCallback, - NULL); - - /* Add an event handler so that we can track focus change requests - which will be initiated by Motif in response to ButtonPress events */ - - wdata->flags = 0; - wdata->shell = cdata->shell; - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCanvasPeer - * Method: resetTargetGC - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCanvasPeer_resetTargetGC -(JNIEnv * env, jobject this, jobject target) -{ - (*env)->CallVoidMethod(env, target, mCanvasIDs.setGCFromPeerMID); -} - -/* - * Class: sun_awt_motif_MCanvasPeer - * Method: initIDs - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCanvasPeer_initIDs -(JNIEnv * env, jclass cls) -{ - jclass canvasCls = (*env)->FindClass(env, "java/awt/Canvas"); - mCanvasIDs.setGCFromPeerMID = - (*env)->GetMethodID(env, canvasCls, "setGCFromPeer","()V"); - - DASSERT(mCanvasIDs.setGCFromPeerMID); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Checkbox.c --- a/jdk/src/solaris/native/sun/awt/awt_Checkbox.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,428 +0,0 @@ -/* - * Copyright 1995-2002 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 "sun_awt_motif_MComponentPeer.h" -#include "sun_awt_motif_MCheckboxPeer.h" -#include "java_awt_Checkbox.h" -#include "java_awt_CheckboxGroup.h" - -#include "awt_Component.h" - -#include "multi_font.h" -#include -#include - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -/* fieldIDs for Checkbox fields that may be accessed from C */ -static struct CheckboxIDs { - jfieldID label; -} checkboxIDs; - -static char emptyString[] = ""; - - -/* - * Class: java_awt_Checkbox - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for Checkbox.java - to initialize the fieldIDs for fields that may be accessed from C */ - -JNIEXPORT void JNICALL -Java_java_awt_Checkbox_initIDs - (JNIEnv *env, jclass cls) -{ - checkboxIDs.label = - (*env)->GetFieldID(env, cls, "label", "Ljava/lang/String;"); -} - -/* - * client_data is MCheckboxPeer instance pointer - */ -static void -Toggle_callback(Widget w, - XtPointer client_data, - XmAnyCallbackStruct * call_data) -{ - Boolean state; - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - XtVaGetValues(w, XmNset, &state, NULL); - - JNU_CallMethodByName(env, NULL, (jobject) client_data, "action", "(Z)V", state); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -/* - * Class: sun_awt_motif_MCheckboxPeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCheckboxPeer_create - (JNIEnv * env, jobject this, jobject parent) -{ - jobject target; - struct ComponentData *bdata; - struct ComponentData *wdata; - char *clabel; -#define MAX_ARGC 10 - Arg args[MAX_ARGC]; - Cardinal argc; - jobject label; - XmString mfstr = NULL; - jobject font = awtJNI_GetFont(env, this); - jboolean isMultiFont = awtJNI_IsMultiFont(env, font); - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - XmFontList fontlist = NULL; - Dimension height; - Boolean labelIsEmpty = FALSE; - - AWT_LOCK(); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, parent, mComponentPeerIDs.pData); - - if (JNU_IsNull(env, target) || wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - bdata = ZALLOC(ComponentData); - if (bdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - - return; - } - JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, bdata); - - adata = copyGraphicsConfigToPeer(env, this); - - argc = 0; - XtSetArg(args[argc], XmNrecomputeSize, False); - argc++; - XtSetArg(args[argc], XmNvisibleWhenOff, True); - argc++; - XtSetArg(args[argc], XmNtraversalOn, True); - argc++; - XtSetArg(args[argc], XmNspacing, 0); - argc++; - XtSetArg(args[argc], XmNuserData, (XtPointer) globalRef); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen)); - argc++; - - label = (*env)->GetObjectField(env, target, checkboxIDs.label); - - // fix for 4383735. - // If the label is empty we need to set the indicator size - // proportional to the size of the font. - // kdm@sparc.spb.su - if (JNU_IsNull(env, label) || ((*env)->GetStringLength(env, label) == 0)) { - labelIsEmpty = TRUE; - if (!JNU_IsNull(env, font)) { - mfstr = XmStringCreateLocalized(" "); - if (mfstr != NULL) { - fontlist = awtJNI_GetFontList(env, font); - if (fontlist != NULL) { - height = XmStringHeight(fontlist, mfstr); - XtSetArg(args[argc], XmNindicatorSize, height); - argc++; - XmFontListFree(fontlist); - fontlist = NULL; - } - XmStringFree(mfstr); - mfstr = NULL; - } - } - } - - if (isMultiFont) { - /* - * We don't use makeCString() function here. - * We create Motif multi-font compound string to display - * unicode on the platform which is not spporting unicode. - */ - if (labelIsEmpty) { - mfstr = XmStringCreateLocalized(""); - } else { - mfstr = awtJNI_MakeMultiFontString(env, label, font); - } - - XtSetArg(args[argc], XmNlabelString, mfstr); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - bdata->widget = XmCreateToggleButton(wdata->widget, "", args, argc); - - if (mfstr != NULL) { - XmStringFree(mfstr); - mfstr = NULL; - } - } else { - if (labelIsEmpty) { - clabel = emptyString; - } else { - clabel = (char *) JNU_GetStringPlatformChars(env, label, NULL); - - if (clabel == NULL) { /* Exception? */ - AWT_UNLOCK(); - return; - } - } - - DASSERT(!(argc > MAX_ARGC)); - bdata->widget = XmCreateToggleButton(wdata->widget, clabel, args, argc); - - if (clabel != emptyString) { - JNU_ReleaseStringPlatformChars(env, label, (const char *) clabel);; - } - } - - XtAddCallback(bdata->widget, - XmNvalueChangedCallback, - (XtCallbackProc) Toggle_callback, - (XtPointer) globalRef); - - XtSetMappedWhenManaged(bdata->widget, False); - XtManageChild(bdata->widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCheckboxPeer - * Method: setLabel - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCheckboxPeer_setLabel - (JNIEnv * env, jobject this, jstring label) -{ - struct ComponentData *wdata; - char *clabel; - XmString xim; - jobject font; - - AWT_LOCK(); - - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (JNU_IsNull(env, label) || ((*env)->GetStringLength(env, label) == 0)) { - xim = XmStringCreateLocalized(""); - } else { - font = awtJNI_GetFont(env, this); - - if (awtJNI_IsMultiFont(env, font)) { - xim = awtJNI_MakeMultiFontString(env, label, font); - } else { - clabel = (char *) JNU_GetStringPlatformChars(env, label, NULL); - - if (clabel == NULL) { - AWT_UNLOCK(); - return; - } - xim = XmStringCreate(clabel, "labelFont"); - - JNU_ReleaseStringPlatformChars(env, label, (const char *) clabel);; - } - } - - XtVaSetValues(wdata->widget, XmNlabelString, xim, NULL); - XmStringFree(xim); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCheckboxPeer - * Method: pSetState - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCheckboxPeer_pSetState - (JNIEnv * env, jobject this, jboolean state) -{ - struct ComponentData *bdata; - - AWT_LOCK(); - - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(bdata->widget, XmNset, (Boolean) state, NULL); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCheckboxPeer - * Method: pGetState - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_sun_awt_motif_MCheckboxPeer_pGetState - (JNIEnv * env, jobject this) -{ - struct ComponentData *bdata; - Boolean state; - - AWT_LOCK(); - - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return JNI_FALSE; - } - XtVaGetValues(bdata->widget, XmNset, &state, NULL); - AWT_FLUSH_UNLOCK(); - return ((state) ? JNI_TRUE : JNI_FALSE); -} - - -/* - * Class: sun_awt_motif_MCheckboxPeer - * Method: setCheckboxGroup - * Signature: (Ljava/awt/CheckboxGroup;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCheckboxPeer_setCheckboxGroup - (JNIEnv * env, jobject this, jobject group) -{ - struct ComponentData *bdata; - - AWT_LOCK(); - - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (JNU_IsNull(env, group)) { - XtVaSetValues(bdata->widget, - XmNindicatorType, XmN_OF_MANY, - NULL); - } else { - XtVaSetValues(bdata->widget, - XmNindicatorType, XmONE_OF_MANY, - NULL); - } - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCheckboxPeer - * Method: getIndicatorSize - * Signature: (V)I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MCheckboxPeer_getIndicatorSize - (JNIEnv * env, jobject this) -{ - struct ComponentData *wdata; - Dimension size; - - AWT_LOCK(); - - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (wdata == NULL || wdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "Null pData"); - AWT_UNLOCK(); - return 0; - } - XtVaGetValues(wdata->widget, - XmNindicatorSize, &size, - NULL); - - AWT_FLUSH_UNLOCK(); - - return size; -} - -/* - * Class: sun_awt_motif_MCheckboxPeer - * Method: getSpacing - * Signature: (V)I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MCheckboxPeer_getSpacing - (JNIEnv * env, jobject this) -{ - struct ComponentData *wdata; - Dimension dim; - - AWT_LOCK(); - - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (wdata == NULL || wdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "Null pData"); - AWT_UNLOCK(); - return 0; - } - XtVaGetValues(wdata->widget, - XmNspacing, &dim, - NULL); - - AWT_FLUSH_UNLOCK(); - - return dim; -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Choice12.c --- a/jdk/src/solaris/native/sun/awt/awt_Choice12.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,843 +0,0 @@ -/* - * Copyright 1995-2001 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 "java_awt_Component.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "sun_awt_motif_MChoicePeer.h" - -#include "awt_Component.h" -#include "awt_MToolkit.h" - -#include "multi_font.h" -#include -#include -#include - -extern struct ComponentIDs componentIDs; -extern struct ContainerIDs containerIDs; -extern struct MComponentPeerIDs mComponentPeerIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -static void geometry_hook(Widget wid, Widget hooked_widget, XtGeometryHookData call_data) { - XtWidgetGeometry *request; - JNIEnv *env; - struct ChoiceData *cdata; - struct WidgetInfo *winfo = NULL; - - jobject target; - jobject parent; - jint y, height; - - if ((call_data->widget == hooked_widget) && - (call_data->type == XtHpostGeometry) && - (call_data->result == XtGeometryYes)) { - - request = call_data->request; - - env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - DASSERT(env != NULL); - - winfo=findWidgetInfo(hooked_widget); - - if (winfo != NULL && XmIsRowColumn(hooked_widget)) { - target = (*env)->GetObjectField(env, (jobject)winfo->peer, mComponentPeerIDs.target); - cdata = (struct ChoiceData *) JNU_GetLongFieldAsPtr(env, (jobject)winfo->peer, mComponentPeerIDs.pData); - DASSERT(target != NULL); - DASSERT(cdata != NULL && cdata->comp.widget != NULL) - if (request->request_mode & CWHeight) { - height = (*env)->GetIntField(env, target, componentIDs.height); - if (request->height > 0 && request->height != height) { - parent = (*env)->CallObjectMethod(env, target, componentIDs.getParent); - if ((parent != NULL) && ((*env)->GetObjectField(env, parent, containerIDs.layoutMgr) != NULL)) { - y = cdata->bounds_y; - if (request->height < cdata->bounds_height) { - y += (cdata->bounds_height - request->height) / 2; - } - XtVaSetValues(hooked_widget, XmNy, y, NULL); - (*env)->SetIntField(env, target, componentIDs.y, y); - } - if (parent != NULL) { - (*env)->DeleteLocalRef(env, parent); - } - } - (*env)->SetIntField(env, target, componentIDs.height, request->height); - } - if (request->request_mode & CWWidth) { - (*env)->SetIntField(env, target, componentIDs.width, request->width); - } - (*env)->DeleteLocalRef(env, target); - } - } -} - -static void -Choice_callback(Widget menu_item, - jobject this, - XmAnyCallbackStruct * cbs) -{ - intptr_t index; - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - XtVaGetValues(menu_item, XmNuserData, &index, NULL); - /* index stored in user-data is 1-based instead of 0-based because */ - /* of a bug in XmNuserData */ - index--; - - JNU_CallMethodByName(env, NULL, this, "action", "(I)V", (jint)index); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -static void addItems - (JNIEnv *env, jobject this, jstring *items, jsize nItems, jint index) -{ - char *citem = NULL; - struct ChoiceData *odata; - Widget bw; -#define MAX_ARGC 10 - Arg args[MAX_ARGC]; - Cardinal argc, argc1; - jsize i; - Pixel bg; - Pixel fg; - short cols; - int32_t sheight; - Dimension height; - Widget *firstNewItem = NULL; - - XmString mfstr = NULL; - XmFontList fontlist = NULL; - jobject font = awtJNI_GetFont(env, this); - Boolean IsMultiFont = awtJNI_IsMultiFont(env, font); - - if ((items == NULL) || (nItems == 0)) { - return; - } - - AWT_LOCK(); - - odata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (odata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - if (odata->maxitems == 0 || (index + nItems) > odata->maxitems) { - odata->maxitems = index + nItems + 20; - if (odata->n_items > 0) { - /* grow the list of items */ - odata->items = (Widget *) - realloc((void *) (odata->items) - ,sizeof(Widget) * odata->maxitems); - } else { - odata->items = (Widget *) malloc(sizeof(Widget) * odata->maxitems); - } - if (odata->items == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - } - XtVaGetValues(odata->comp.widget, XmNbackground, &bg, NULL); - XtVaGetValues(odata->comp.widget, XmNforeground, &fg, NULL); - - argc = 0; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - - firstNewItem = &(odata->items[index]); - for (i = 0; i < nItems; i++) { - argc1 = argc; - if (IsMultiFont) { - mfstr = awtJNI_MakeMultiFontString(env, items[i], font); - fontlist = awtJNI_GetFontList(env, font); - /* XXX: XmNuserData doesn't seem to work when passing in zero */ - /* so we increment the index before passing it in. */ - XtSetArg(args[argc1], XmNuserData, (XtPointer)((intptr_t)(index + i + 1))); - argc1++; - XtSetArg(args[argc1], XmNfontList, fontlist); - argc1++; - XtSetArg(args[argc1], XmNlabelString, mfstr); - argc1++; - - DASSERT(!(argc1 > MAX_ARGC)); - - bw = XmCreatePushButton(odata->menu, "", args, argc1); - - /* Free resurces */ - if ( fontlist != NULL ) - { - XmFontListFree(fontlist); - fontlist = NULL; - } - if (mfstr != NULL) { - XmStringFree(mfstr); - mfstr = NULL; - } - } else { - citem = (char *) JNU_GetStringPlatformChars(env, items[i], NULL); - /* XXX: XmNuserData doesn't seem to work when passing in zero */ - /* so we increment the index before passing it in. */ - XtSetArg(args[argc1], XmNuserData, (XtPointer)((intptr_t)(index + i + 1))); - argc1++; - DASSERT(!(argc1> MAX_ARGC)); - bw = XmCreatePushButton(odata->menu, citem, args, argc1); - JNU_ReleaseStringPlatformChars(env, items[i], (const char *) citem); - citem = NULL; - } - - XtAddCallback(bw, - XmNactivateCallback, - (XtCallbackProc) Choice_callback, - (XtPointer) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.jniGlobalRef)); - odata->items[index + i] = bw; - odata->n_items++; - } - - XtManageChildren(firstNewItem, nItems); - - sheight = DisplayHeight(awt_display, DefaultScreen(awt_display)); - - XtVaGetValues(odata->menu, XmNheight, &height, NULL); - - while ( height > sheight ) { - cols = ++odata->n_columns; - XtVaSetValues(odata->menu, XmNnumColumns, cols, NULL); - XtVaGetValues(odata->menu, XmNheight, &height, NULL); - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_create - (JNIEnv * env, jobject this, jobject parent) -{ - struct ChoiceData *odata; - struct ComponentData *wdata; -#undef MAX_ARGC -#define MAX_ARGC 30 - Arg args[MAX_ARGC]; - Cardinal argc; - Pixel bg; - Pixel fg; - Widget label; - Widget button; - Widget hookobj; - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - jobject target; - Dimension width = 0, height = 0; - jclass clsDimension; - jobject dimension; - jobject peer; - - AWT_LOCK(); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - - adata = copyGraphicsConfigToPeer(env, this); - - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData); - - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - - odata = ZALLOC(ChoiceData); - if (odata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,odata); - - odata->items = NULL; - odata->maxitems = 0; - odata->n_items = 0; - odata->n_columns = 1; - - XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL); - XtVaGetValues(wdata->widget, XmNforeground, &fg, NULL); - - argc = 0; - XtSetArg(args[argc], XmNx, 0); - argc++; - XtSetArg(args[argc], XmNy, 0); - argc++; - XtSetArg(args[argc], XmNvisual, adata->awt_visInfo.visual); - argc++; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - - XtSetArg(args[argc], XmNorientation, XmVERTICAL); - argc++; - XtSetArg(args[argc], XmNpacking, XmPACK_COLUMN); - argc++; - XtSetArg(args[argc], XmNnumColumns, (short)1); - argc++; - /* Fix for 4303064 by ibd@sparc.spb.su: pop-up shells will have - * ancestor_sensitive False if the parent was insensitive when the shell - * was created. Since XtSetSensitive on the parent will not modify the - * resource of the pop-up child, clients are advised to include a resource - * specification of the form '*TransientShell.ancestorSensitive: True' in - * the application defaults resource file or to otherwise ensure that the - * parent is sensitive when creating pop-up shells. - */ - XtSetArg(args[argc], XmNancestorSensitive, True); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - odata->menu = XmCreatePulldownMenu(wdata->widget, "pulldown", args, argc); - - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - clsDimension = (*env)->FindClass(env, "java/awt/Dimension"); - dimension = JNU_CallMethodByName(env, - NULL, - this, - "getPreferredSize", - "()Ljava/awt/Dimension;").l; - DASSERT(clsDimension != NULL); - width = (Dimension)((*env)->GetIntField(env, dimension, (*env)->GetFieldID(env, clsDimension, "width" , "I"))); - height = (Dimension)((*env)->GetIntField(env, dimension, (*env)->GetFieldID(env, clsDimension, "height", "I"))); - - argc = 0; - XtSetArg(args[argc], XmNx, 0); - argc++; - XtSetArg(args[argc], XmNy, 0); - argc++; - XtSetArg(args[argc], XmNwidth, width); - argc++; - XtSetArg(args[argc], XmNheight, height); - argc++; - XtSetArg(args[argc], XmNmarginHeight, 0); - argc++; - XtSetArg(args[argc], XmNmarginWidth, 0); - argc++; - XtSetArg(args[argc], XmNrecomputeSize, False); - argc++; - XtSetArg(args[argc], XmNresizeHeight, False); - argc++; - XtSetArg(args[argc], XmNresizeWidth, False); - argc++; - XtSetArg(args[argc], XmNspacing, False); - argc++; - XtSetArg(args[argc], XmNborderWidth, 0); - argc++; - XtSetArg(args[argc], XmNnavigationType, XmTAB_GROUP); - argc++; - XtSetArg(args[argc], XmNtraversalOn, True); - argc++; - XtSetArg(args[argc], XmNorientation, XmVERTICAL); - argc++; - XtSetArg(args[argc], XmNadjustMargin, False); - argc++; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - XtSetArg(args[argc], XmNsubMenuId, odata->menu); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, adata->awt_visInfo.screen)); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - odata->comp.widget = XmCreateOptionMenu(wdata->widget, "", args, argc); - - hookobj = XtHooksOfDisplay(XtDisplayOfObject(odata->comp.widget)); - XtAddCallback(hookobj, - XtNgeometryHook, - (XtCallbackProc) geometry_hook, - (XtPointer) odata->comp.widget); - - label = XmOptionLabelGadget(odata->comp.widget); - if (label != NULL) { - XtUnmanageChild(label); - } - XtSetMappedWhenManaged(odata->comp.widget, False); - XtManageChild(odata->comp.widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: addItem - * Signature: (Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_addItem - (JNIEnv *env, jobject this, jstring item, jint index) -{ - if (JNU_IsNull(env, item)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - addItems(env, this, &item, 1, index); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: pSelect - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_pSelect - (JNIEnv *env, jobject this, jint index, jboolean init) -{ - struct ChoiceData *odata; - - AWT_LOCK(); - - odata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (odata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (index > odata->n_items || index < 0) { - JNU_ThrowIllegalArgumentException(env, "IllegalArgumentException"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(odata->comp.widget, - XmNmenuHistory, odata->items[index], - NULL); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: setFont - * Signature: (Ljava/awt/Font;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_setFont - (JNIEnv *env, jobject this, jobject f) -{ - struct ChoiceData *cdata; - struct FontData *fdata; - XmFontList fontlist; - char *err; - - if (JNU_IsNull(env, f)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - - fdata = awtJNI_GetFontData(env, f, &err); - if (fdata == NULL) { - JNU_ThrowInternalError(env, err); - AWT_UNLOCK(); - return; - } - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (awtJNI_IsMultiFont(env, f)) { - fontlist = awtJNI_GetFontList(env, f); - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - - if (fontlist != NULL) { - jint i; - - XtVaSetValues(cdata->comp.widget, - XmNfontList, fontlist, - NULL); - XtVaSetValues(cdata->menu, - XmNfontList, fontlist, - NULL); - for (i = 0; i < cdata->n_items; i++) { - XtVaSetValues(cdata->items[i], - XmNfontList, fontlist, - NULL); - } - - XmFontListFree(fontlist); - } else { - JNU_ThrowNullPointerException(env, "NullPointerException"); - } - AWT_UNLOCK(); -} - -/* Fix for bug 4326619 */ -/* - * Class: sun_awt_motif_MChoicePeer - * Method: freeNativeData - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_freeNativeData - (JNIEnv *env, jobject this) -{ - struct ChoiceData *cdata; - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - cdata->n_items = 0; - free((void *)cdata->items); - cdata->items = NULL; - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: setBackground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_setBackground - (JNIEnv *env, jobject this, jobject c) -{ - struct ChoiceData *bdata; - Pixel bg; - Pixel fg; - WidgetList children; - Cardinal numChildren; - int32_t i; - - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException: null color"); - return; - } - AWT_LOCK(); - - bdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (bdata == NULL || bdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* Get background color */ - bg = awtJNI_GetColor(env, c); - - /* - XmChangeColor(), in addtion to changing the background and - selection colors, also changes the foreground color to be - what it thinks should be. However, we want to use the color - that gets set by setForeground() instead. We therefore need to - save the current foreground color here, and then set it again - after the XmChangeColor() occurs. - */ - XtVaGetValues(bdata->comp.widget, XmNforeground, &fg, NULL); - - /* Set color */ - XmChangeColor(bdata->comp.widget, bg); - XtVaSetValues(bdata->comp.widget, XmNforeground, fg, NULL); - - /* - * The following recursion fixes a bug in Motif 2.1 that caused - * black colored choice buttons (change has no effect on Motif 1.2). - */ - XtVaGetValues(bdata->comp.widget, - XmNchildren, &children, - XmNnumChildren, &numChildren, - NULL); - for (i = 0; i < numChildren; i++) { - XmChangeColor(children[i], bg); - XtVaSetValues(children[i], XmNforeground, fg, NULL); - } - - - XmChangeColor(bdata->menu, bg); - XtVaSetValues(bdata->menu, XmNforeground, fg, NULL); - - for (i = 0; i < bdata->n_items; i++) { - XmChangeColor(bdata->items[i], bg); - XtVaSetValues(bdata->items[i], XmNforeground, fg, NULL); - } - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: setForeground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_setForeground - (JNIEnv *env, jobject this, jobject c) -{ - struct ChoiceData *bdata; - Pixel color; - int32_t i; - - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException: null color"); - return; - } - AWT_LOCK(); - - bdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (bdata == NULL || bdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - color = awtJNI_GetColor(env, c); - - XtVaSetValues(bdata->comp.widget, XmNforeground, color, NULL); - - XtVaSetValues(bdata->menu, XmNforeground, color, NULL); - for (i = 0; i < bdata->n_items; i++) { - XtVaSetValues(bdata->items[i], XmNforeground, color, NULL); - } - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: pReshape - * Signature: (IIII)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_pReshape - (JNIEnv *env, jobject this, jint x, jint y, jint w, jint h) -{ - struct ChoiceData *cdata; - Widget button; - jobject target; - Dimension width=0, height=0; - Position new_y = 0; - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - button = XmOptionButtonGadget(cdata->comp.widget); - cdata->bounds_y = y; - cdata->bounds_height = h; - awt_util_reshape(cdata->comp.widget, x, y, w, h); - awt_util_reshape(button, x, y, w, h); - - /* Bug 4255631 Solaris: Size returned by Choice.getSize() does not match - * actual size - */ - XtVaGetValues(cdata->comp.widget, XmNy, &new_y, NULL); - XtVaGetValues(button, XmNwidth, &width, XmNheight, &height , NULL); - awt_util_reshape(cdata->comp.widget, x, new_y, width, height); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: remove - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_remove - (JNIEnv *env, jobject this, jint index) -{ - struct ChoiceData *cdata; - Widget selected; - jint i; - short cols; - int32_t sheight; - Dimension height; - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (index < 0 || index > cdata->n_items) { - JNU_ThrowIllegalArgumentException(env, "IllegalArgumentException"); - AWT_UNLOCK(); - return; - } - XtUnmanageChild(cdata->items[index]); - awt_util_consumeAllXEvents(cdata->items[index]); - awt_util_cleanupBeforeDestroyWidget(cdata->items[index]); - XtDestroyWidget(cdata->items[index]); - for (i = index; i < cdata->n_items-1; i++) { - cdata->items[i] = cdata->items[i + 1]; - /* need to reset stored index value, (adding 1 to disambiguate it */ - /* from an arg list terminator) */ - /* bug fix 4079027 robi.khan@eng */ - XtVaSetValues(cdata->items[i], XmNuserData, (XtPointer)((intptr_t)(i+1)), NULL); - } - cdata->items[cdata->n_items-1] = NULL; - cdata->n_items--; - - XtVaGetValues(cdata->menu, XmNheight, &height, NULL); - - sheight = DisplayHeight(awt_display, DefaultScreen(awt_display)); - cols = cdata->n_columns; - - if (cols >1) { - /* first try to remove a column */ - cols = --cdata->n_columns; - XtVaSetValues(cdata->menu, XmNnumColumns, cols, NULL); - - /* then see if it fits, if not add it back */ - XtVaGetValues(cdata->menu, XmNheight, &height, NULL); - if ( height > sheight ) { - cols = ++cdata->n_columns; - XtVaSetValues(cdata->menu, XmNnumColumns, cols, NULL); - } - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: removeAll - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_removeAll - (JNIEnv *env, jobject this) -{ - struct ChoiceData *cdata; - Widget selected; - jint i; - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - XtUnmanageChildren(cdata->items, cdata->n_items); - - for (i = cdata->n_items-1; i >= 0; i--) { - awt_util_consumeAllXEvents(cdata->items[i]); - awt_util_cleanupBeforeDestroyWidget(cdata->items[i]); - XtDestroyWidget(cdata->items[i]); - cdata->items[i] = NULL; - } - - cdata->n_items = 0; - - if (cdata->n_columns > 1) { - cdata->n_columns = 1; - XtVaSetValues(cdata->menu, XmNnumColumns, cdata->n_columns, NULL); - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: appendItems - * Signature: ([Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MChoicePeer_appendItems - (JNIEnv *env, jobject this, jarray items) -{ - struct ChoiceData *odata = NULL; - jstring *strItems = NULL; - jsize nItems, i; // MP - - if (JNU_IsNull(env, items)) { - return; - } - nItems = (*env)->GetArrayLength(env, items); - if (nItems == 0) { - return; - } - - AWT_LOCK(); - - odata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (odata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - goto cleanup; - } - - strItems = (jstring *) malloc(sizeof(jstring) * nItems); - if (strItems == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - goto cleanup; - } - - for (i = 0; i < nItems; i++) { - strItems[i] = (jstring)(*env)->GetObjectArrayElement(env, items, i); - if (JNU_IsNull(env, strItems[i])) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - goto cleanup; - } - } - - addItems(env, this, strItems, nItems, odata->n_items); - -cleanup: - if (strItems != NULL) { - free(strItems); - } - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Choice21.c --- a/jdk/src/solaris/native/sun/awt/awt_Choice21.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,764 +0,0 @@ -/* - * Copyright 2001-2003 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 - -#if MOTIF_VERSION!=2 - #error This file should only be compiled with motif 2.1 -#endif - -#include "awt_p.h" -#include "java_awt_Component.h" -#include "java_awt_AWTEvent.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "sun_awt_motif_MChoicePeer.h" - -#include "awt_Component.h" -#include "canvas.h" - -#include "multi_font.h" - -#include -#include -#include - -#define MAX_VISIBLE 10 - -extern struct ComponentIDs componentIDs; -extern struct ContainerIDs containerIDs; -extern struct MComponentPeerIDs mComponentPeerIDs; - -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -/* - setSelection - Set the selected text on the XmTextField of the XmComboBox. -*/ -static void -setSelection(JNIEnv *env, - jobject this, - Widget comboBox, - jint index) -{ - jstring item = NULL; - jobject target; - Widget text=NULL; - - AWT_LOCK(); - /* Get the java Choice component. */ - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - if (target == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* Get the XmTextField widget in the XmComboBox. */ - text = XtNameToWidget(comboBox, "*Text"); - /* Get the selected Unicode string from the java Choice component. */ - item = (jstring) JNU_CallMethodByName(env, NULL, - target, "getItem", "(I)Ljava/lang/String;", index).l; - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (!JNU_IsNull(env, item)) { - /* Convert the Unicode string to a multibyte string. */ - char *temp = (char *)JNU_GetStringPlatformChars(env, item, NULL); - /* Assign the multibyte string to the XmTextField of the XmComboBox. */ - XmTextSetString(text, temp); - JNU_ReleaseStringPlatformChars(env, item, (const char *)temp); - } - AWT_UNLOCK(); -} - -extern Boolean skipNextNotifyWhileGrabbed; -extern Boolean skipNextFocusIn; - -static void -GrabShellPopup(Widget grab_shell, - jobject this, - XmAnyCallbackStruct * call_data) -{ - skipNextNotifyWhileGrabbed = True; -} -static void -GrabShellPopdown(Widget grab_shell, - jobject this, - XmAnyCallbackStruct * call_data) -{ - skipNextNotifyWhileGrabbed = True; - skipNextFocusIn = True; -} - -static void -Choice_callback(Widget list, - jobject this, - XmAnyCallbackStruct * call_data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - XmListCallbackStruct *cbs = (XmListCallbackStruct *)call_data; - struct ChoiceData *cdata; - - - AWT_LOCK(); - /* Get the Choice data. */ - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - setSelection(env, this, cdata->comp.widget, cbs->item_position - 1); - /* Get the Choice data. */ - JNU_CallMethodByName(env, NULL, - this, "action", "(I)V", cbs->item_position - 1); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - AWT_UNLOCK(); -} - -static void -addItems(JNIEnv *env, jobject this, - jstring *items, int32_t nItems, jint index) -{ - struct ChoiceData *cdata; - int32_t i; - Widget list; - XmString mfstr = NULL; - XmFontList fontlist = NULL; - jobject font = awtJNI_GetFont(env, this); - Boolean IsMultiFont = awtJNI_IsMultiFont(env, font); - - if ((items == NULL) || (nItems == 0)) { - return; - } - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (cdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - for (i = 0; i < nItems; ++i) { - char *temp = (char *)JNU_GetStringPlatformChars(env, items[i], NULL); - mfstr = XmStringCreateLocalized(temp); - JNU_ReleaseStringPlatformChars(env, items[i], (const char *)temp); - XmComboBoxAddItem(cdata->comp.widget, mfstr, index + i + 1, FALSE); - - if (mfstr != NULL) { - XmStringFree(mfstr); - mfstr = NULL; - } - } - - cdata->n_items += nItems; - - list = XtNameToWidget(cdata->comp.widget, "*List"); - XtVaSetValues(list, - XmNvisibleItemCount, min(MAX_VISIBLE, cdata->n_items), - NULL); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_create(JNIEnv * env, jobject this, - jobject parent) -{ - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - - struct ComponentData *wdata; /* parent's peer data */ - struct ChoiceData *cdata; /* our own peer data */ - Widget list, text, list_shell; /* components of drop dowwn list widget */ - - AwtGraphicsConfigDataPtr adata; - Pixel fg, bg; /* colors inherited from parent */ - Dimension width = 0, height = 0; - jclass clsDimension; - jobject dimension; - -#undef MAX_ARGC -#define MAX_ARGC 30 - Arg args[MAX_ARGC]; - int32_t argc; - - AWT_LOCK(); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - - /* get parent's peer data */ - wdata = (struct ComponentData *)JNU_GetLongFieldAsPtr(env, - parent, mComponentPeerIDs.pData); - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - /* create our own peer data */ - cdata = ZALLOC(ChoiceData); - if (cdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, cdata); - - /* get desired size */ - clsDimension = (*env)->FindClass(env, "java/awt/Dimension"); - DASSERT(clsDimension != NULL); - - dimension = JNU_CallMethodByName(env, NULL, - this, "getPreferredSize", "()Ljava/awt/Dimension;").l; - width = (Dimension)((*env)->GetIntField(env, dimension, - (*env)->GetFieldID(env, clsDimension, - "width" , "I"))); - height = (Dimension)((*env)->GetIntField(env, dimension, - (*env)->GetFieldID(env, clsDimension, - "height", "I"))); - - /* Inherit visual/colors from parent component */ - XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL); - XtVaGetValues(wdata->widget, XmNforeground, &fg, NULL); - adata = copyGraphicsConfigToPeer(env, this); - - argc = 0; - XtSetArg(args[argc], XmNuserData, (XtPointer)globalRef); ++argc; - XtSetArg(args[argc], XmNx, 0); ++argc; - XtSetArg(args[argc], XmNy, 0); ++argc; - XtSetArg(args[argc], XmNmarginHeight, 2); ++argc; - XtSetArg(args[argc], XmNmarginWidth, 1); ++argc; - XtSetArg(args[argc], XmNvisibleItemCount, 0); ++argc; - XtSetArg(args[argc], XmNancestorSensitive, True); ++argc; - /* Don't ding on key press */ - XtSetArg(args[argc], XmNverifyBell, False); ++argc; - XtSetArg(args[argc], XmNvisual, adata->awt_visInfo.visual); ++argc; - XtSetArg(args[argc], XmNscreen, - ScreenOfDisplay(awt_display, adata->awt_visInfo.screen)); ++argc; - XtSetArg(args[argc], XmNbackground, bg); ++argc; - XtSetArg(args[argc], XmNforeground, fg); ++argc; - - DASSERT(!(argc > MAX_ARGC)); - cdata->comp.widget = XmCreateDropDownList(wdata->widget, - "combobox", args, argc); - cdata->n_items = 0; - - list = XtNameToWidget(cdata->comp.widget, "*List"); - text = XtNameToWidget(cdata->comp.widget, "*Text"); - list_shell = XtNameToWidget(cdata->comp.widget, "*GrabShell"); - XtAddCallback(list_shell, - XmNpopupCallback, - (XtCallbackProc)GrabShellPopup, - globalRef); - XtAddCallback(list_shell, - XmNpopdownCallback, - (XtCallbackProc)GrabShellPopdown, - globalRef); - - /* - * Bug 4477410: Setting the width of the XmComboBox made the XmTextField - * too small, cutting off the dropdown list knob on the right side. Set - * the width of the TextField because it is the widget actually seen. - */ - /* Set the width and height of the TextField widget. */ - XtVaSetValues(text, - XmNwidth, width, - XmNheight, height, - NULL); - - XtAddCallback(list, - XmNbrowseSelectionCallback, - (XtCallbackProc)Choice_callback, - (XtPointer)globalRef); - - XtAddEventHandler(text, FocusChangeMask, True, - awt_canvas_event_handler, globalRef); - - awt_addWidget(text, cdata->comp.widget, globalRef, - java_awt_AWTEvent_KEY_EVENT_MASK - | java_awt_AWTEvent_MOUSE_EVENT_MASK - | java_awt_AWTEvent_MOUSE_MOTION_EVENT_MASK); - - XtSetMappedWhenManaged(cdata->comp.widget, False); - XtManageChild(cdata->comp.widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: pSelect - * Signature: (I)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_pSelect(JNIEnv *env, jobject this, - jint index, jboolean init) -{ - struct ChoiceData *cdata; - Widget list; - - AWT_LOCK(); - - cdata = (struct ChoiceData *)JNU_GetLongFieldAsPtr(env, - this, mComponentPeerIDs.pData); - if (cdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - list = XtNameToWidget(cdata->comp.widget, "*List"); - - XmListDeselectAllItems(list); - XmListSelectPos(list, index + 1, False); - setSelection(env, this, cdata->comp.widget, index); - XmComboBoxUpdate(cdata->comp.widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: setFont - * Signature: (Ljava/awt/Font;)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_setFont(JNIEnv *env, jobject this, - jobject f) -{ - struct ChoiceData *cdata; - struct FontData *fdata; - XmFontList fontlist; - Widget list; - Widget text; - char *err; - XmFontListEntry fontentry; - Position x=0, y=0; - - if (JNU_IsNull(env, f)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - - fdata = awtJNI_GetFontData(env, f, &err); - if (fdata == NULL) { - JNU_ThrowInternalError(env, err); - AWT_UNLOCK(); - return; - } - - cdata = (struct ChoiceData *)JNU_GetLongFieldAsPtr(env, - this, mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - /* Make a fontset and set it. */ - if (awtJNI_IsMultiFont(env, f)) { - if (fdata->xfs == NULL) { - fdata->xfs = awtJNI_MakeFontSet(env, f); - } - if (fdata->xfs != NULL) { - fontentry = XmFontListEntryCreate("labelFont", - XmFONT_IS_FONTSET, - (XtPointer) (fdata->xfs)); - fontlist = XmFontListAppendEntry(NULL, fontentry); - /* - * Some versions of motif have a bug in - * XmFontListEntryFree() which causes it to free more than it - * should. Use XtFree() instead. See O'Reilly's - * Motif Reference Manual for more information. - */ - XmFontListEntryFree(&fontentry); - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - XtVaSetValues(cdata->comp.widget, - XmNfontList, fontlist, - NULL); - list = XtNameToWidget(cdata->comp.widget, "*List"); - XtVaSetValues(list, - XmNfontList, fontlist, - NULL); - - text = XtNameToWidget(cdata->comp.widget, "*Text"); - XtVaSetValues(text, - XmNfontList, fontlist, - NULL); - XmFontListFree(fontlist); - XtVaGetValues(cdata->comp.widget, - XmNx, &x, - XmNy, &y, - NULL); - Java_sun_awt_motif_MChoicePeer_pReshape(env, this, x, y, 0, 0); - AWT_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: freeNativeData - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_freeNativeData(JNIEnv *env, jobject this) -{ - /* - * Fix for bug 4326619 - not necessary for Motif 2.1 - */ -} - - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: setBackground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_setBackground(JNIEnv *env, jobject this, - jobject c) -{ - struct ChoiceData *cdata; - Pixel bg; - Pixel fg; - int32_t i; - - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException: null color"); - return; - } - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* Get background color */ - bg = awtJNI_GetColor(env, c); - - /* - XmChangeColor(), in addtion to changing the background and - selection colors, also changes the foreground color to be - what it thinks should be. However, we want to use the color - that gets set by setForeground() instead. We therefore need to - save the current foreground color here, and then set it again - after the XmChangeColor() occurs. - */ - XtVaGetValues(cdata->comp.widget, XmNforeground, &fg, NULL); - - /* Set color */ - XmChangeColor(cdata->comp.widget, bg); - XtVaSetValues(cdata->comp.widget, XmNforeground, fg, NULL); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: setForeground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_setForeground(JNIEnv *env, jobject this, - jobject c) -{ - struct ChoiceData *cdata; - Pixel color; - int32_t i; - - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException: null color"); - return; - } - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - color = awtJNI_GetColor(env, c); - - XtVaSetValues(cdata->comp.widget, XmNforeground, color, NULL); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: pReshape - * Signature: (IIII)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_pReshape(JNIEnv *env, jobject this, - jint x, jint y, jint w, jint h) -{ - struct ChoiceData *cdata; - Widget list; - Dimension width = 0, height = 0; - jclass clsDimension; - jobject dimension; - jobject target; - Widget text=NULL; - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - if (w == 0) { - /* Set the width and height of the TextField widget to the - * PreferredSize, based on the font size. - */ - clsDimension = (*env)->FindClass(env, "java/awt/Dimension"); - DASSERT(clsDimension != NULL); - dimension = JNU_CallMethodByName(env, NULL, - this, "getPreferredSize", "()Ljava/awt/Dimension;").l; - width = (Dimension)((*env)->GetIntField(env, dimension, - (*env)->GetFieldID(env, clsDimension, - "width" , "I"))); - height = (Dimension)((*env)->GetIntField(env, dimension, - (*env)->GetFieldID(env, clsDimension, - "height", "I"))); - } else { - /* Set the width and height of the TextField widget to the - * given values. BorderLayout passes these values, for example. - */ - width = w; - height = h; - } - text = XtNameToWidget(cdata->comp.widget, "*Text"); - /* - * Bug 4477410: Setting the width of the XmComboBox made the XmTextField - * too small, cutting off the dropdown list knob on the right side. Set - * the width of the TextField because it is the widget actually seen. - */ - XtVaSetValues(text, - XmNwidth, width, - XmNheight, height, - NULL); - - awt_util_reshape(cdata->comp.widget, x, y, width, height); - - list = XtNameToWidget(cdata->comp.widget, "*List"); - - XtVaSetValues(list, XmNwidth, width, NULL); - - /* Set the width and height of the Choice component. */ - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - if (target == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - (*env)->SetIntField(env, target, componentIDs.width, (jint)width); - (*env)->SetIntField(env, target, componentIDs.height, (jint)height); - - AWT_FLUSH_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: addItem - * Signature: (Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_addItem(JNIEnv *env, jobject this, - jstring item, jint index) -{ - if (JNU_IsNull(env, item)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - addItems(env, this, &item, 1, index); -} - - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: appendItems - * Signature: ([Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_appendItems(JNIEnv *env, jobject this, - jarray items) -{ - struct ChoiceData *cdata = NULL; - jstring *strItems = NULL; - int32_t nItems, i; - - if (JNU_IsNull(env, items)) { - return; - } - nItems = (*env)->GetArrayLength(env, items); - if (nItems == 0) { - return; - } - - AWT_LOCK(); - - cdata = (struct ChoiceData *)JNU_GetLongFieldAsPtr(env, - this, mComponentPeerIDs.pData); - if (cdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - goto cleanup; - } - - strItems = (jstring *)malloc(sizeof(jstring) * nItems); - if (strItems == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - goto cleanup; - } - - for (i = 0; i < nItems; ++i) { - strItems[i] = (jstring)(*env)->GetObjectArrayElement(env, - items, (jsize)i); - if (JNU_IsNull(env, strItems[i])) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - goto cleanup; - } - } - - addItems(env, this, strItems, nItems, (jint)cdata->n_items); - - cleanup: - if (strItems != NULL) { - free(strItems); - } - AWT_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: remove - * Signature: (I)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_remove(JNIEnv *env, jobject this, - jint index) -{ - struct ChoiceData *cdata; - Widget list; - Widget text=NULL; - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - XmComboBoxDeletePos(cdata->comp.widget, index + 1); - --(cdata->n_items); - - list = XtNameToWidget(cdata->comp.widget, "*List"); - XtVaSetValues(list, XmNvisibleItemCount, min(MAX_VISIBLE, cdata->n_items), NULL); - - if (cdata->n_items == 0) { - /* No item is selected, so clear the TextField. */ - text = XtNameToWidget(cdata->comp.widget, "*Text"); - XtVaSetValues(text, XmNvalue, "", NULL); - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MChoicePeer - * Method: removeAll - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MChoicePeer_removeAll(JNIEnv *env, jobject this) -{ - struct ChoiceData *cdata; - int32_t i; - Widget text=NULL; - Widget list; - - AWT_LOCK(); - - cdata = (struct ChoiceData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - for (i = cdata->n_items - 1; i >= 0; --i) { - XmComboBoxDeletePos(cdata->comp.widget, i); - } - cdata->n_items = 0; - - /* No item is selected, so clear the TextField. */ - text = XtNameToWidget(cdata->comp.widget, "*Text"); - XtVaSetValues(text, XmNvalue, "", NULL); - - /* should set XmNvisibleItemCount to 1 as 0 is invalid value */ - list = XtNameToWidget(cdata->comp.widget, "*List"); - XtVaSetValues(list, XmNvisibleItemCount, 1, NULL); - - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Component.c --- a/jdk/src/solaris/native/sun/awt/awt_Component.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1656 +0,0 @@ -/* - * Copyright 1995-2006 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 "canvas.h" -#include "awt_AWTEvent.h" -#include "VDrawingArea.h" -#include "awt_KeyboardFocusManager.h" -#include "awt_MToolkit.h" -#include "awt_TopLevel.h" -#include "java_awt_Color.h" -#include "java_awt_Cursor.h" -#include "java_awt_Font.h" -#include "java_awt_Point.h" -#include "java_awt_Component.h" -#include "java_awt_AWTEvent.h" -#include "java_awt_KeyboardFocusManager.h" -#include "java_awt_event_KeyEvent.h" -#include "java_awt_event_MouseEvent.h" -#include "sun_awt_motif_MComponentPeer.h" - -#include "multi_font.h" -#include "jni.h" -#include "jni_util.h" -#include -#include -#include -#include - -/* CanvasType widgets: Frame, Dialog, Window, Panel, Canvas, - * & all lightweights (Component, Container) - */ -#define IsCanvasTypeWidget(w) \ - XtIsSubclass(w, xmDrawingAreaWidgetClass) ||\ - XtIsSubclass(w, vDrawingAreaClass) - - -#include "awt_Component.h" -#include "awt_GraphicsEnv.h" - -#include "awt_AWTEvent.h" -#include "awt_Cursor.h" - -extern struct CursorIDs cursorIDs; -extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; -extern struct KeyboardFocusManagerIDs keyboardFocusManagerIDs; - -/* fieldIDs for Component fields that may be accessed from C */ -struct ComponentIDs componentIDs; - -/* - * Class: java_awt_Component - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for Component.java - to initialize the fieldIDs for fields that may be accessed from C */ - -JNIEXPORT void JNICALL -Java_java_awt_Component_initIDs -(JNIEnv *env, jclass cls) -{ - jclass keyclass = NULL; - - componentIDs.x = (*env)->GetFieldID(env, cls, "x", "I"); - componentIDs.y = (*env)->GetFieldID(env, cls, "y", "I"); - componentIDs.width = (*env)->GetFieldID(env, cls, "width", "I"); - componentIDs.height = (*env)->GetFieldID(env, cls, "height", "I"); - componentIDs.isPacked = (*env)->GetFieldID(env, cls, "isPacked", "Z"); - componentIDs.peer = - (*env)->GetFieldID(env, cls, "peer", "Ljava/awt/peer/ComponentPeer;"); - componentIDs.background = - (*env)->GetFieldID(env, cls, "background", "Ljava/awt/Color;"); - componentIDs.foreground = - (*env)->GetFieldID(env, cls, "foreground", "Ljava/awt/Color;"); - componentIDs.graphicsConfig = - (*env)->GetFieldID(env, cls, "graphicsConfig", - "Ljava/awt/GraphicsConfiguration;"); - componentIDs.name = - (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); - - /* Use _NoClientCode() methods for trusted methods, so that we - * know that we are not invoking client code on trusted threads - */ - componentIDs.getParent = - (*env)->GetMethodID(env, cls, "getParent_NoClientCode", - "()Ljava/awt/Container;"); - - componentIDs.getLocationOnScreen = - (*env)->GetMethodID(env, cls, "getLocationOnScreen_NoTreeLock", - "()Ljava/awt/Point;"); - - componentIDs.resetGCMID = - (*env)->GetMethodID(env, cls, "resetGC", "()V"); - - keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent"); - DASSERT (keyclass != NULL); - - componentIDs.isProxyActive = - (*env)->GetFieldID(env, keyclass, "isProxyActive", - "Z"); - - componentIDs.appContext = - (*env)->GetFieldID(env, cls, "appContext", - "Lsun/awt/AppContext;"); - - (*env)->DeleteLocalRef(env, keyclass); - - DASSERT(componentIDs.resetGCMID); -} - -/* fieldIDs for MComponentPeer fields that may be accessed from C */ -struct MComponentPeerIDs mComponentPeerIDs; - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MComponentPeer.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_initIDs -(JNIEnv *env, jclass cls) -{ - mComponentPeerIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J"); - mComponentPeerIDs.target = - (*env)->GetFieldID(env, cls, "target", "Ljava/awt/Component;"); - mComponentPeerIDs.jniGlobalRef = - (*env)->GetFieldID(env, cls, "jniGlobalRef", "J"); - mComponentPeerIDs.graphicsConfig = - (*env)->GetFieldID(env, cls, "graphicsConfig", - "Lsun/awt/X11GraphicsConfig;"); - mComponentPeerIDs.drawState = - (*env)->GetFieldID(env, cls, "drawState", "I"); - mComponentPeerIDs.isFocusableMID = - (*env)->GetMethodID(env, cls, "isFocusable", "()Z"); -} - -/* field and method IDs for java.awt.Container. */ -struct ContainerIDs containerIDs; - -/* - * Class: java_awt_Container - * Method: initIDs - * Signature: ()V - */ -/* This function gets called from the static initializer for java.awt.Container - to initialize the fieldIDs for fields that may be accessed from C */ -JNIEXPORT void JNICALL -Java_java_awt_Container_initIDs -(JNIEnv *env, jclass cls) -{ - containerIDs.layoutMgr = - (*env)->GetFieldID(env, cls, "layoutMgr", "Ljava/awt/LayoutManager;"); - - containerIDs.getComponents = - (*env)->GetMethodID(env, cls, "getComponents_NoClientCode", - "()[Ljava/awt/Component;"); - containerIDs.findComponentAt = - (*env)->GetMethodID(env, cls, "findComponentAt", - "(IIZ)Ljava/awt/Component;"); -} - -/* - * Fix for 4090493. When Motif computes indicator size, it uses - * (effectively) XmTextExtents, so the size of the indicator depends - * on the text of the label. The side effect is that if the label - * text is rendered using different platform fonts (for a single Java - * logical font) the display is inconsistent. E.g. for 12pt font - * English label will have a check mark, while Japanese label will - * not, because underlying X11 fonts have different metrics. - * - * The fix is to override Motif calculations for the indicatorSize and - * compute it ourselves based on the font metrics for all the platform - * fonts given Java font maps onto. Every time we set XmNfontList we - * should set XmNindicatorSize as well. - * - * The logic is in awt_computeIndicatorSize that just compute the - * arithmetic mean of platform fonts by now. HIE should take a look - * at this. - */ - -struct changeFontInfo { - XmFontList fontList; /* value to set */ - Boolean isMultiFont; /* only need to compute for multifont */ - struct FontData *fontData; /* need this to compute indicator size */ - Dimension indSize; /* computed once by changeFont */ - - Boolean initialized; - Boolean error; - JNIEnv *env; - jobject fObj; -}; - -static void -changeFont(Widget w, void *info) -{ - struct changeFontInfo *f = (struct changeFontInfo *)info; - WidgetClass widgetClass; - - if (f->error) - return; - - /* Some widgets use no fonts - skip them! */ - /* Also skip the Text widgets, since they each have their own setFont. */ - widgetClass = XtClass(w); - if (widgetClass == xmDrawingAreaWidgetClass || - widgetClass == xmScrollBarWidgetClass || - widgetClass == xmScrolledWindowWidgetClass || - widgetClass == xmComboBoxWidgetClass || - widgetClass == xmTextWidgetClass || - widgetClass == xmTextFieldWidgetClass) - return; - - if (!f->initialized) { - struct FontData *fdata; - char *err; - - f->initialized = TRUE; - - fdata = awtJNI_GetFontData(f->env, f->fObj, &err); - if (fdata == NULL) { - JNU_ThrowInternalError(f->env, err); - f->error = TRUE; - return; - } - - if (awtJNI_IsMultiFont(f->env, f->fObj)) { - f->fontList = awtJNI_GetFontList(f->env, f->fObj); - f->isMultiFont = TRUE; - } else { - f->fontList = XmFontListCreate(fdata->xfont, "labelFont"); - f->isMultiFont = FALSE; - } - - if (f->fontList == NULL) { - JNU_ThrowNullPointerException(f->env, "NullPointerException"); - f->error = TRUE; - return; - } - } - - /* Fix for 4090493. */ - if (f->isMultiFont && XmIsToggleButton(w)) { - Dimension indSize; - - /* Compute indicator size if first time through. Note that - ToggleButtons that are children of menus live in different - hierarchy (MenuComponent), so we don't check for this case - here. In fact, the only time the XmNfontList is set on - MCheckboxMenuItemPeer widget is when it is created. */ - if (f->indSize == 0) - f->indSize = awt_computeIndicatorSize(f->fontData); - - XtVaSetValues(w, XmNfontList, f->fontList, NULL); - if (f->indSize != MOTIF_XmINVALID_DIMENSION) - XtVaSetValues(w, XmNindicatorSize, f->indSize, NULL); - } - else { /* usual case */ - XtVaSetValues(w, XmNfontList, f->fontList, NULL); - } -} - -static void -changeForeground(Widget w, void *fg) -{ - XtVaSetValues(w, XmNforeground, fg, NULL); -} - -static void -changeBackground(Widget w, void *bg) -{ - Pixel fg; - - XtVaGetValues(w, XmNforeground, &fg, NULL); - XmChangeColor(w, (Pixel) bg); - XtVaSetValues(w, XmNforeground, fg, NULL); -} - -// Sets widget's traversalOn property into value 'value' -void setTraversal(Widget w, Boolean value) { - if (w == NULL) { - return; - } - if (XmIsPrimitive(w)) { - XmPrimitiveWidget prim = (XmPrimitiveWidget)w; - prim->primitive.traversal_on = value; - } else - if (XmIsManager(w)) { - XmManagerWidget man = (XmManagerWidget)w; - man->manager.traversal_on = value; - } -} - - -AwtGraphicsConfigDataPtr -getGraphicsConfigFromComponentPeer(JNIEnv *env, jobject this) { - AwtGraphicsConfigDataPtr adata; - jobject gc_object; - - /* GraphicsConfiguration object of MComponentPeer */ - gc_object = (*env)->GetObjectField(env, this, - mComponentPeerIDs.graphicsConfig); - - if (gc_object != NULL) { - adata = (AwtGraphicsConfigDataPtr) - JNU_GetLongFieldAsPtr(env, gc_object, - x11GraphicsConfigIDs.aData); - } else { - adata = getDefaultConfig(DefaultScreen(awt_display)); - } - - return adata; -} - -AwtGraphicsConfigDataPtr -copyGraphicsConfigToPeer(JNIEnv *env, jobject this) { - - jobject component_object, gc_object; - AwtGraphicsConfigDataPtr adata; - - /** - * Copy the GraphicsConfiguration object from Component object to - * MComponentPeer object. - */ - component_object = (*env)->GetObjectField(env, this, - mComponentPeerIDs.target); - /* GraphicsConfiguration object of Component */ - gc_object = (JNU_CallMethodByName(env, NULL, component_object, - "getGraphicsConfiguration", - "()Ljava/awt/GraphicsConfiguration;")).l; - - if (gc_object != NULL) { - /* Set graphicsConfig field of MComponentPeer */ - (*env)->SetObjectField (env, this, - mComponentPeerIDs.graphicsConfig, - gc_object); - adata = (AwtGraphicsConfigDataPtr) - JNU_GetLongFieldAsPtr(env, gc_object, - x11GraphicsConfigIDs.aData); - } else { - /* Component was not constructed with a GraphicsConfiguration - object */ - adata = getDefaultConfig(DefaultScreen(awt_display)); - } - - return adata; -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: getNativeColor - * Signature (Ljava/awt/Color;Ljava/awt/GraphicsConfiguration;)I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MComponentPeer_getNativeColor -(JNIEnv *env, jobject this, jobject color, jobject gc_object) { - AwtGraphicsConfigDataPtr adata; - adata = (AwtGraphicsConfigDataPtr) JNU_GetLongFieldAsPtr(env, gc_object, - x11GraphicsConfigIDs.aData); - return awtJNI_GetColorForVis(env, color, adata); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pInitialize - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pInitialize -(JNIEnv *env, jobject this) -{ - struct ComponentData *cdata; - Widget parent; - jobject target; - jobject globalRef; - EventMask xtMask; - jlong awtMask = (jlong) 0; - AwtGraphicsConfigDataPtr adata; - Boolean initialTraversal = False; - - globalRef = (jobject) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.jniGlobalRef); - - adata = copyGraphicsConfigToPeer(env, this); - - AWT_LOCK(); - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (JNU_IsNull(env, cdata) || (cdata == NULL)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* Allow FileDialog to have its own traversal policy because - * it doesn't interfer with our. - */ - if (XtIsSubclass(cdata->widget, xmFileSelectionBoxWidgetClass)) { - initialTraversal = True; - } - XtVaSetValues(cdata->widget, - XmNx, (*env)->GetIntField(env, target, componentIDs.x), - XmNy, (*env)->GetIntField(env, target, componentIDs.y), - XmNvisual, adata->awt_visInfo.visual, - XmNscreen, ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen), - /** - * From now we keep all but the focus owner widget unable - * to receive focus. This will prevent Motif from unexpected - * focus transfers. - */ - XmNtraversalOn, initialTraversal, - NULL); - - - /* For all but canvas-style components, pre-process - * mouse and keyboard events (which means posting them - * to the Java EventQueue before dispatching them to Xt). - * For canvas-style components ONLY pre-process mouse events - * because the input-method currently relies on key events - * being processed by Xt first. - */ - awtMask = java_awt_AWTEvent_MOUSE_EVENT_MASK | - java_awt_AWTEvent_MOUSE_MOTION_EVENT_MASK; - xtMask = ExposureMask | FocusChangeMask; - - if (!IsCanvasTypeWidget(cdata->widget)) { - awtMask |= java_awt_AWTEvent_KEY_EVENT_MASK; - } else { - xtMask |= (KeyPressMask | KeyReleaseMask); - } - XtAddEventHandler(cdata->widget, xtMask, - True, awt_canvas_event_handler, globalRef); - - awt_addWidget(cdata->widget, cdata->widget, globalRef, awtMask); - - cdata->repaintPending = RepaintPending_NONE; - - AWT_UNLOCK(); -} - -/** - * Updates stacking order of X windows according to the order of children widgets in - * parent widget - */ -void restack(Widget parent) { - WidgetList children; - int32_t num_children; - Window *windows; - int32_t num_windows = 0; - int32_t i; - XtVaGetValues(parent, - XmNnumChildren, &num_children, - XmNchildren, &children, - NULL); - - windows = (Window *) XtMalloc(num_children * sizeof(Window)); - for (i = 0; i < num_children; i++) { - if (XtIsRealized(children[i])) { - windows[num_windows++] = XtWindow(children[i]); - } - } - XRestackWindows(awt_display, windows, num_windows); - XtFree((char *) windows); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pShow - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pShow -(JNIEnv *env, jobject this) -{ - struct ComponentData *cdata; - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - awt_util_show(cdata->widget); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pHide - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pHide -(JNIEnv *env, jobject this) -{ - struct ComponentData *cdata; - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - awt_util_hide(cdata->widget); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pEnable - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pEnable -(JNIEnv *env, jobject this) -{ - struct ComponentData *cdata; - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - awt_util_enable(cdata->widget); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pDisable - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pDisable -(JNIEnv *env, jobject this) -{ - struct ComponentData *cdata; - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - awt_util_disable(cdata->widget); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pReshape - * Signature: (IIII)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pReshape -(JNIEnv *env, jobject this, jint x, jint y, jint w, jint h) -{ - struct ComponentData *cdata; - jint drawState; - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* Set the draw state */ - drawState = (*env)->GetIntField(env, this, - mComponentPeerIDs.drawState); - (*env)->SetIntField(env, this, - mComponentPeerIDs.drawState, - drawState | JAWT_LOCK_BOUNDS_CHANGED | JAWT_LOCK_CLIP_CHANGED); - awt_util_reshape(cdata->widget, x, y, w, h); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pDispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pDispose -(JNIEnv *env, jobject this) -{ - struct ComponentData *cdata; - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - XtUnmanageChild(cdata->widget); - - awt_delWidget(cdata->widget); - awt_util_consumeAllXEvents(cdata->widget); - awt_util_cleanupBeforeDestroyWidget(cdata->widget); - XtDestroyWidget(cdata->widget); - - free((void *) cdata); - (*env)->SetLongField(env,this,mComponentPeerIDs.pData, (int64_t) 0); - - awtJNI_DeleteGlobalRef(env, this); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pMakeCursorVisible - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pMakeCursorVisible -(JNIEnv *env, jobject this) -{ - struct ComponentData *cdata; - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - // need to change, may not be needed - // awt_util_setCursor(cdata->widget, cdata->cursor); - - AWT_FLUSH_UNLOCK(); -} - - -/* - * Call with AWT_LOCK held. - */ -static jobject -MComponentPeer_doGetLocationOnScreen(JNIEnv *env, jobject this) -{ - jobject point = NULL; - struct ComponentData *cdata; - int32_t x = 0, y = 0; - Screen *widget_screen = NULL; - Window child_ignored; - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return NULL; - } - if (!XtIsRealized(cdata->widget)) { - JNU_ThrowInternalError(env, "widget not visible on screen"); - return NULL; - } - - /* Translate the component to the screen coordinate system */ - XtVaGetValues(cdata->widget, XmNscreen, &widget_screen, NULL); - XTranslateCoordinates(awt_display, XtWindow(cdata->widget), - XRootWindowOfScreen(widget_screen), - 0, 0, &x, &y, - &child_ignored); - - point = JNU_NewObjectByName(env, "java/awt/Point", "(II)V", - (jint)x, (jint)y); - if (((*env)->ExceptionOccurred(env)) || JNU_IsNull(env, point)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return NULL; - } - - return point; -} - - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pGetLocationOnScreen - * Signature: ()Ljava/awt/Point; - */ -JNIEXPORT jobject JNICALL -Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen(JNIEnv *env, - jobject this) -{ - jobject point; - - AWT_LOCK(); - point = MComponentPeer_doGetLocationOnScreen(env, this); - AWT_UNLOCK(); - return point; -} - - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pGetLocationOnScreen - * Signature: (Ljava/awt/Window;Lsun/awt/motif/MWindowPeer;)Ljava/awt/Point; - */ -JNIEXPORT jobject JNICALL -Java_sun_awt_motif_MComponentPeer_pGetLocationOnScreen2( - JNIEnv *env, jobject this, jobject wtarget, jobject wpeer) -{ - jobject point; - struct ComponentData *cdata; - struct FrameData *wdata; - Screen *widget_screen = NULL; - Window child_ignored; - int32_t x = 0, y = 0; - - AWT_LOCK(); - - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, wpeer, mComponentPeerIDs.pData); - - if (wdata == NULL || wdata->winData.comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return NULL; - } - if (!XtIsRealized(wdata->winData.comp.widget)) { - JNU_ThrowInternalError(env, "widget not visible on screen"); - AWT_UNLOCK(); - return NULL; - } - - /* - * Translate directly if the parent window is already adopted by WM. - */ - if (wdata->configure_seen) { - point = MComponentPeer_doGetLocationOnScreen(env, this); - AWT_UNLOCK(); - return point; - } - - /* - * We are called while the parent window is still not adopted by - * WM (but may already be in the process of being reparented). - * Translate to the parent and add parent target's (x,y) to avoid - * racing with WM shuffling us into the final position. - */ - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (cdata == &wdata->winData.comp) { /* called for the window itself */ - x = y = 0; - } - else { - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return NULL; - } - if (!XtIsRealized(cdata->widget)) { - JNU_ThrowInternalError(env, "widget not visible on screen"); - AWT_UNLOCK(); - return NULL; - } - - /* Translate to the outer canvas coordinate system first */ - XtVaGetValues(cdata->widget, XmNscreen, &widget_screen, NULL); - XTranslateCoordinates(awt_display, XtWindow(cdata->widget), - XtWindow(wdata->winData.comp.widget), - 0, 0, &x, &y, - &child_ignored); - } - - x += (*env)->GetIntField(env, wtarget, componentIDs.x); - y += (*env)->GetIntField(env, wtarget, componentIDs.y); - - point = JNU_NewObjectByName(env, "java/awt/Point", "(II)V", - (jint)x, (jint)y); - if (((*env)->ExceptionOccurred(env)) || JNU_IsNull(env, point)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return NULL; - } - - AWT_UNLOCK(); - return point; -} - - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: getParent_NoClientCode - * Signature: (Ljava/awt/Component)Ljava/awt/Container; - * - * NOTE: This method may be called by privileged threads. - * DO NOT INVOKE CLIENT CODE ON THIS THREAD! - */ -JNIEXPORT jobject JNICALL Java_sun_awt_motif_MComponentPeer_getParent_1NoClientCode -(JNIEnv *env, jclass thisClass, jobject component) -{ - jobject parent = NULL; - - /* getParent is actually getParent_NoClientCode() */ - parent = (*env)->CallObjectMethod(env,component,componentIDs.getParent); - DASSERT(!((*env)->ExceptionOccurred(env))); - return parent; -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: getComponents_NoClientCode - * Signature: (Ljava/awt/Container)[Ljava/awt/Component; - * REMIND: Signature is incorrect for returned array value - * - * NOTE: This method may be called by privileged threads. - * DO NOT INVOKE CLIENT CODE ON THIS THREAD! - */ -JNIEXPORT jobjectArray JNICALL Java_sun_awt_motif_MComponentPeer_getComponents_1NoClientCode -(JNIEnv *env, jclass thisClass, jobject container) -{ - jobjectArray contents = NULL; - contents = (*env)->CallObjectMethod( - env, container, containerIDs.getComponents); - DASSERT(!((*env)->ExceptionOccurred(env))); - return contents; -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pSetForeground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pSetForeground -(JNIEnv *env, jobject this, jobject c) -{ - struct ComponentData *bdata; - Pixel color; - AwtGraphicsConfigDataPtr adata; - - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - adata = getGraphicsConfigFromComponentPeer(env, this); - - color = (Pixel) awtJNI_GetColorForVis (env, c, adata); - XtVaSetValues(bdata->widget, XmNforeground, color, NULL); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pSetBackground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pSetBackground -(JNIEnv *env, jobject this, jobject c) -{ - struct ComponentData *bdata; - Pixel color; - Pixel fg; - AwtGraphicsConfigDataPtr adata; - - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - adata = getGraphicsConfigFromComponentPeer(env, this); - - color = (Pixel) awtJNI_GetColorForVis (env, c, adata); - XtVaGetValues(bdata->widget, XmNforeground, &fg, NULL); - XmChangeColor(bdata->widget, color); - XtVaSetValues(bdata->widget, XmNforeground, fg, NULL); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pSetScrollbarBackground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pSetScrollbarBackground -(JNIEnv *env, jobject this, jobject c) -{ - struct ComponentData *bdata; - Pixel color; - Pixel fg; - int32_t i; - WidgetList wlist; - Cardinal wlen = 0; - - /* This method propagates the specified background color to the scrollbars in the composite widget. - * Used to set background scrollbar color in List, TextArea, ScrollPane to its parent. - */ - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (!XtIsComposite(bdata->widget)) { - AWT_UNLOCK(); - return; - } - color = (Pixel) awtJNI_GetColor(env, c); - - XtVaGetValues(bdata->widget, - XmNchildren, &wlist, - XmNnumChildren, &wlen, - NULL); - if (wlen > 0) { /* this test doesn't make much sense, since wlen - is a Cardinal and cardinal is unsigned int... */ - for (i=0; i < wlen; i++) { - if (XtIsSubclass(wlist[i], xmScrollBarWidgetClass)) { - XtVaGetValues(wlist[i], XmNforeground, &fg, NULL); - XmChangeColor(wlist[i], color); - XtVaSetValues(wlist[i], XmNforeground, fg, NULL); - } - } - XtVaGetValues(bdata->widget, XmNforeground, &fg, NULL); - XmChangeColor(bdata->widget, color); - XtVaSetValues(bdata->widget, XmNforeground, fg, NULL); - } - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pSetInnerForeground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pSetInnerForeground -(JNIEnv *env, jobject this, jobject c) -{ - struct ComponentData *bdata; - Pixel color; - - /* This method propagates the specified foreground color to all its children. - * It is called to set foreground color in List, TextArea, ScrollPane. - */ - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - color = awtJNI_GetColor(env, c); - awt_util_mapChildren(bdata->widget, changeForeground, 1, (void *) color); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pSetFont - * Signature: (Ljava/awt/Font;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pSetFont -(JNIEnv *env, jobject this, jobject f) -{ - struct ComponentData *cdata; - - struct changeFontInfo finfo = { NULL, FALSE, NULL, 0, - FALSE, FALSE, NULL, NULL }; - - if (JNU_IsNull(env, f)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - finfo.env = env; - finfo.fObj = f; - awt_util_mapChildren(cdata->widget, changeFont, 1, (void *)&finfo); - if (!finfo.error && finfo.fontList != NULL) { - XmFontListFree(finfo.fontList); - } - - AWT_FLUSH_UNLOCK(); -} /* MComponentPeer.pSetFont() */ - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: setTargetBackground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_setTargetBackground -(JNIEnv *env, jobject this, jobject c) -{ - jobject target = NULL; - - if ((*env)->EnsureLocalCapacity(env, 1) < 0) { - return; - } - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - (*env)->SetObjectField(env, target, componentIDs.background, c); - (*env)->DeleteLocalRef(env, target); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: pSetCursor - * Signature: (Ljava/awt/Cursor;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_pSetCursor -(JNIEnv *env, jobject this, jobject cursor) -{ - Cursor xcursor; - struct ComponentData *cdata; - - AWT_LOCK(); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL || JNU_IsNull(env, cursor)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - awt_util_setCursor(cdata->widget, getCursor(env, cursor)); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: nativeHandleEvent - * Signature: (Ljava/awt/AWTEvent;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_nativeHandleEvent -(JNIEnv *env, jobject this, jobject event) -{ - extern void awt_modify_KeyEvent(JNIEnv *env, XEvent * xevent, jobject jevent); - jbyteArray array; - XEvent *xevent; - Widget widget = NULL; - Boolean consumed; - - if (JNU_IsNull(env, event)) { - return; - } - AWT_LOCK(); - - consumed = (*env)->GetBooleanField(env, event, awtEventIDs.consumed); - - /* - * Fix for bug 4280561 - * - * If a menu is up, we must dispatch all XEvents, to allow - * mouse grabs to be released and prevent server hangs. - */ - consumed = consumed && !awt_util_focusIsOnMenu(awt_display); - - if (consumed) { - AWT_UNLOCK(); - return; - } - - array = (jbyteArray)(*env)->GetObjectField(env, event, awtEventIDs.bdata); - if (array == NULL) { - AWT_UNLOCK(); - return; - } - - xevent = (XEvent *)(*env)->GetByteArrayElements(env, array, NULL); - if (xevent == NULL) { - AWT_UNLOCK(); - return; - } - - switch ((*env)->GetIntField(env, event, awtEventIDs.id)) { - case java_awt_event_KeyEvent_KEY_RELEASED: - case java_awt_event_KeyEvent_KEY_PRESSED: - awt_modify_KeyEvent(env, xevent, event); - if ((*env)->GetBooleanField(env, event, componentIDs.isProxyActive) == JNI_TRUE) { - xevent->xany.send_event = SPECIAL_KEY_EVENT; - } - break; - default: - break; - } - widget = XtWindowToWidget(awt_display, xevent->xany.window); - - if (!((widget == NULL) || (!XtIsObject(widget)) || - (widget->core.being_destroyed))) { - /* Queue the event to be handled by the AWT-Motif thread */ - if (!IsCanvasTypeWidget(widget)) { - awt_put_back_event(env, xevent); - } - } - - (*env)->ReleaseByteArrayElements(env, array, (jbyte *)xevent, JNI_ABORT); - (*env)->DeleteLocalRef(env, array); - - AWT_UNLOCK(); - return; -} - -// Returns the widget from parent's hierarchy which should be -// used for focus operations. This widget is stored in WidgetInfo -// structure and should be prepared by the appropriate component -// type constructor -Widget getFocusWidget(Widget parent) { - struct WidgetInfo * winfo = NULL; - DASSERT(parent != NULL); - if (parent == NULL) { - return NULL; - } - winfo = findWidgetInfo(parent); - if (winfo == NULL) { - return NULL; - } - return winfo->widget; -} - - -// Returns value of widget's traversalOn property -Boolean getTraversal(Widget w) { - if (w == NULL) { - return False; - } - if (XmIsPrimitive(w)) { - XmPrimitiveWidget prim = (XmPrimitiveWidget)w; - return prim->primitive.traversal_on; - } - if (XmIsManager(w)) { - XmManagerWidget man = (XmManagerWidget)w; - return man->manager.traversal_on; - } - return False; -} - - -void processTree(Widget from, Widget to, Boolean action) { -// Workhorse function that makes sure that the only widgets -// which have traversalOn == true are the ones on the path from -// shell to current focus widget. Function uses two widgets - -// the one which is supposed to have focus currently(from) and -// the one which will receive focus(to). Function disables and -// enables the appropriate widgets so 'to' can become focus owner. - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - int32_t count_from = 0, count_to = 0; - Widget parent_from = NULL, parent_to = NULL; - Widget * parents_from = NULL, * parents_to = NULL; - int32_t index = 0; - - // Count amount of parents up the tree from widget - parent_from = from; - while (parent_from != NULL) { - parent_from = XtParent(parent_from); - count_from++; - } - parent_to = to; - while (parent_to != NULL) { - parent_to = XtParent(parent_to); - count_to++; - } - - // Store all the parents in the list. Both list wittingly - // have common parts starting from the beginning. We need - // to find the end of this common part. - parents_from = (Widget*)malloc(count_from*sizeof(Widget*)); - parents_to = (Widget*)malloc(count_to*sizeof(Widget*)); - parent_from = from; - index = count_from; - while (parent_from != NULL) { - parents_from[index-1] = parent_from; - parent_from = XtParent(parent_from); - index--; - } - parent_to = to; - index = count_to; - while (parent_to != NULL) { - parents_to[index-1] = parent_to; - parent_to = XtParent(parent_to); - index--; - } - - // Process parents list. Find common part which is usually doesn't - // require changes. At the exit of the cycle index will point - // to the first widget which requeires the change. - - if (from != NULL && to != NULL) { - do { - if (index >= count_from-1 || index >= count_to-1) { - break; - } - if (parents_from[index] == parents_to[index]) - { - if (XtIsShell(parents_from[index])) { - index++; - continue; - } - if (action) { - if (getTraversal(parents_from[index])) { - index++; - } else { - break; - } - } else { - index++; - } - } else { - break; - } - } while (True); - } - - - if (action) { // enable the tree starting from uncommon part till 'to' - if (to != NULL) { - while (index < count_to - 1) { - if (!getTraversal(parents_to[index])) { - XtVaSetValues(parents_to[index], XmNtraversalOn, True, NULL); - } - index++; - } - XtVaSetValues(to, XmNtraversalOn, True, NULL); - } - } else if (from != NULL) { - // disable the tree starting from uncommon part to 'from' - if (parents_from[index] == parents_to[index]) { - if (index == count_from - 1) { - // 'from' is one of the parents of 'to' - no need - // to disable 'from' - goto skip_disable; - } - index++; - } - while (index < count_from - 1) { - if (!XmIsGadget(parents_from[index]) && !XtIsShell(parents_from[index])) { - setTraversal(parents_from[index], False); - } - index++; - } - if (!XmIsGadget(from)) { - setTraversal(parents_from[index], False); - } - } - skip_disable: - free(parents_from); - free(parents_to); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: requestFocus - * Signature: (Ljava/awt/Component;ZZJ)Z - */ -JNIEXPORT jboolean JNICALL Java_sun_awt_motif_MComponentPeer__1requestFocus -(JNIEnv *env, jobject this, jobject lightweightChild, jboolean temporary, - jboolean focusedWindowChangeAllowed, jlong time, jobject cause) -{ - struct ComponentData *bdata; - Boolean result; - jobject target; - jint retval; - Widget currentOwner = NULL; - jobject curPeer = NULL; - Widget shell; - Widget widgetToFocus = NULL; - - AWT_LOCK(); - - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (bdata == NULL || bdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return JNI_FALSE; - } - if ((*env)->EnsureLocalCapacity(env, 1) < 0) { - AWT_UNLOCK(); - return JNI_FALSE; - } - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - /* Don't need to free target explicitly. That will happen automatically - when this function returns. */ - - if (target == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return JNI_FALSE; - } - - /* The X11 implementation does not permit cross-Window focus transfers, - so always pass JNI_FALSE for that parameter. */ - retval = (*env)->CallStaticIntMethod - (env, keyboardFocusManagerIDs.keyboardFocusManagerCls, - keyboardFocusManagerIDs.shouldNativelyFocusHeavyweightMID, - target, lightweightChild, temporary, JNI_FALSE, time, cause); - - if (retval == java_awt_KeyboardFocusManager_SNFH_SUCCESS_HANDLED) { - AWT_UNLOCK(); - (*env)->DeleteLocalRef(env, target); - return JNI_TRUE; - } - if (retval == java_awt_KeyboardFocusManager_SNFH_FAILURE) { - AWT_UNLOCK(); - (*env)->DeleteLocalRef(env, target); - return JNI_FALSE; - } - - DASSERT(retval == java_awt_KeyboardFocusManager_SNFH_SUCCESS_PROCEED); - - shell = getShellWidget(bdata->widget); - currentOwner = XmGetFocusWidget(shell); - - widgetToFocus = getFocusWidget(bdata->widget); - - globalClearFocusPath(shell); - - // Prepare widgets tree - processTree(currentOwner, widgetToFocus, False); - processTree(currentOwner, widgetToFocus, True); - - /* - Fix for bug 4157017: replace XmProcessTraversal with - XtSetKeyboardFocus because XmProcessTraversal does not allow - focus to go to non-visible widgets. - - (There is a corresponding change to awt_MToolkit.c:dispatchToWidget) - - I found a last minute problem with this fix i.e. it broke the test - case for bug 4053856. XmProcessTraversal does something else (that - XtSetKeyboardFocus does not do) that stops this test case from - failing. So, as I do not have time to investigate, and having - both XmProcessTraversal and XtSetKeyboardFocus fixes 4157017 and - 4053856 and should be harmless (reviewer agreed), we have both - below - XmProcessTraversal AND XtSetKeyboardFocus. - */ - result = XmProcessTraversal(widgetToFocus, XmTRAVERSE_CURRENT); - if (!result) - { - Widget w = widgetToFocus; - - shell = getShellWidget(w); - XtSetKeyboardFocus(shell, w); - } - /* end 4157017 */ - - // Because Motif focus callbacks are disabled we need to generate - // the required events by ourselves. - // First, check if the current focused widget has the entry in focus - // list. If not, add it because it is required for further processing - if (currentOwner != NULL) { - jobject last = NULL; - curPeer = findPeer(¤tOwner); - if (curPeer == NULL) { - currentOwner = findTopLevelByShell(currentOwner); - if (currentOwner != NULL) { - curPeer = findPeer(¤tOwner); - } - } - if (curPeer != NULL) { - curPeer = (*env)->GetObjectField(env, curPeer, mComponentPeerIDs.target); - if (focusList == NULL) { - awt_canvas_addToFocusListWithDuplicates(curPeer, JNI_TRUE); - } else { - last = (*env)->NewLocalRef(env, focusList->requestor); - if (!(*env)->IsSameObject(env, last, curPeer)) { - awt_canvas_addToFocusList(curPeer); - } - if (!JNU_IsNull(env, last)) { - (*env)->DeleteLocalRef(env, last); - } - } - (*env)->DeleteLocalRef(env, curPeer); - } - } - awt_canvas_addToFocusList(target); - - // If new and current focus owners are the same do not generate FOCUS_LOST - // event because we don't expect it, but generate FOCUS_GAIN because we - // wait for it. - if ( currentOwner != NULL && !JNU_IsNull(env, curPeer) && - !(*env)->IsSameObject(env, curPeer, target)) { - callFocusHandler(currentOwner, FocusOut, cause); - } - callFocusHandler(widgetToFocus, FocusIn, cause); - (*env)->DeleteLocalRef(env, target); - - AWT_FLUSH_UNLOCK(); - return JNI_TRUE; -} - -Dimension -awt_computeIndicatorSize(struct FontData *fdata) -{ - int32_t height; - int32_t acc; - int32_t i; - - if (fdata == (struct FontData *) NULL) - return MOTIF_XmINVALID_DIMENSION; - - /* - * If Java font maps into single platform font - there's no - * problem. Let Motif use its usual calculations in this case. - */ - if (fdata->charset_num == 1) - return MOTIF_XmINVALID_DIMENSION; - - acc = 0; - for (i = 0; i < fdata->charset_num; ++i) { - XFontStruct *xfont = fdata->flist[i].xfont; - acc += xfont->ascent + xfont->descent; - } - - height = acc / fdata->charset_num; - if (height < MOTIF_XmDEFAULT_INDICATOR_DIM) - height = MOTIF_XmDEFAULT_INDICATOR_DIM; - - return height; -} - -Dimension -awt_adjustIndicatorSizeForMenu(Dimension indSize) -{ - if (indSize == 0 || indSize == MOTIF_XmINVALID_DIMENSION) - return MOTIF_XmINVALID_DIMENSION; /* let motif do the job */ - - /* Indicators in menus are smaller. - 2/3 is a magic number from Motif internals. */ - indSize = indSize * 2 / 3; - if (indSize < MOTIF_XmDEFAULT_INDICATOR_DIM) - indSize = MOTIF_XmDEFAULT_INDICATOR_DIM; - - return indSize; -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: getWindow - * Signature: (J)J - */ -JNIEXPORT jlong JNICALL Java_sun_awt_motif_MComponentPeer_getWindow -(JNIEnv *env, jobject this, jlong pData) -{ - jlong ret = (jlong)0; - struct ComponentData* cdata; - cdata = (struct ComponentData*)pData; - AWT_LOCK(); - ret = (jlong)XtWindow(cdata->widget); - AWT_FLUSH_UNLOCK(); - return ret; -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: restore_Focus - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_restoreFocus -(JNIEnv *env, jobject this) -{ - jobject focus_peer; - AWT_LOCK(); - - focus_peer = awt_canvas_getFocusOwnerPeer(); - if (!JNU_IsNull(env, focus_peer)) { - struct ComponentData *bdata; - Boolean result; - - bdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, focus_peer, mComponentPeerIDs.pData); - if (bdata != NULL) { - Widget widgetToFocus = getFocusWidget(bdata->widget); - result = XmProcessTraversal(widgetToFocus, XmTRAVERSE_CURRENT); - if (!result) - { - XtSetKeyboardFocus(getShellWidget(widgetToFocus), widgetToFocus); - } - } - } - (*env)->DeleteLocalRef(env, focus_peer); - - AWT_UNLOCK(); -} - -JNIEXPORT jboolean JNICALL -Java_sun_awt_motif_MComponentPeer_processSynchronousLightweightTransfer( - JNIEnv * env, jclass cls, jobject heavyweight, jobject descendant, - jboolean temporary, jboolean focusedWindowChangeAllowed, jlong time) -{ - return (*env)->CallStaticBooleanMethod(env, keyboardFocusManagerIDs.keyboardFocusManagerCls, - keyboardFocusManagerIDs.processSynchronousTransferMID, - heavyweight, descendant, temporary, - focusedWindowChangeAllowed, time); -} -/* - * Class: sun_awt_motif_MComponentPeer - * Method: getNativeFocusedWindow - * Signature: ()Ljava/awt/Window; - */ -JNIEXPORT jobject JNICALL -Java_sun_awt_motif_MComponentPeer_getNativeFocusedWindow -(JNIEnv *env, jclass cls) -{ - jobject l_peer; - - AWT_LOCK(); - l_peer = awt_canvas_getFocusedWindowPeer(); - AWT_UNLOCK(); - - return (l_peer != NULL) - ? (*env)->GetObjectField(env, l_peer, mComponentPeerIDs.target) - : NULL; -} - -/** - * Makes sure that child has correct index inside parent - * Note: there was a short time when we were counting index in the - * opposite order when it seemed that X and Java z-order notions - * are different. Now we know they are not: last component is - * painted first and appears below all other components with - * smaller indices. - */ -void ensureIndex(Widget parent, Widget child, int index) { - WidgetList children; - int32_t num_children; - int32_t i; - - if (parent == NULL) { - return; - } - if (child == NULL) { - return; - } - XtVaGetValues(parent, - XmNnumChildren, &num_children, - XmNchildren, &children, - NULL); - if (index < 0 || index >= num_children) { - return; - } - if (children[index] != child) { - for (i = 0; i < num_children; i++) { - if (children[i] == child) { - break; - } - } - if (i < num_children) { - Widget temp = children[index]; - children[index] = child; - children[i] = temp; - } - } -} - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MPanelPeer_pEnsureIndex(JNIEnv * env, jobject this, jobject child, jint index) { - struct ComponentData *cdata; - Widget w_parent, w_child; - AWT_LOCK(); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - w_parent = cdata->widget; - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, child, mComponentPeerIDs.pData); - w_child = cdata->widget; - ensureIndex(w_parent, w_child, index); - AWT_UNLOCK(); -} - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MPanelPeer_pRestack(JNIEnv * env, jobject this) { - struct ComponentData *cdata; - Widget w_parent; - AWT_LOCK(); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - w_parent = cdata->widget; - restack(w_parent); - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Cursor.c --- a/jdk/src/solaris/native/sun/awt/awt_Cursor.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,216 +0,0 @@ -/* - * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#ifdef HEADLESS - #error This file should not be included in headless library -#endif - -#include -#include "awt_Component.h" -#include "awt_Cursor.h" -#include "java_awt_Cursor.h" -#include - -#include "jni.h" -#include "jni_util.h" - -/* fieldIDs for Cursor fields that may be accessed from C */ -struct CursorIDs cursorIDs; -extern struct MComponentPeerIDs mComponentPeerIDs; - -static jweak curComp = 0; - -/* - * Class: java_awt_Cursor - * Method: initIDs - * Signature: ()V - */ -/* - * This function gets called from the static initializer for Cursor.java - * to initialize the fieldIDs for fields that may be accessed from C - */ -JNIEXPORT void JNICALL -Java_java_awt_Cursor_initIDs(JNIEnv *env, jclass cls) -{ - cursorIDs.type = (*env)->GetFieldID(env, cls, "type", "I"); - cursorIDs.mSetPData = (*env)->GetMethodID(env, cls, "setPData", "(J)V"); - cursorIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J"); -} - -/* - * A utility to retrieve cursor from java.awt.Cursor - * Create and save the cursor first if it is not yet - */ -Cursor getCursor(JNIEnv *env, jobject jCur) -{ - int32_t cursorType = 0; - Cursor xcursor; - - xcursor = (Cursor)(*env)->GetLongField(env, jCur, cursorIDs.pData); - - if (xcursor != None) { - return xcursor; - } - - cursorType = (*env)->GetIntField(env, jCur, cursorIDs.type); - - DASSERT(cursorType != java_awt_Cursor_CUSTOM_CURSOR); - - switch (cursorType) { - case java_awt_Cursor_DEFAULT_CURSOR: - cursorType = XC_left_ptr; - break; - case java_awt_Cursor_CROSSHAIR_CURSOR: - cursorType = XC_crosshair; - break; - case java_awt_Cursor_TEXT_CURSOR: - cursorType = XC_xterm; - break; - case java_awt_Cursor_WAIT_CURSOR: - cursorType = XC_watch; - break; - case java_awt_Cursor_SW_RESIZE_CURSOR: - cursorType = XC_bottom_left_corner; - break; - case java_awt_Cursor_NW_RESIZE_CURSOR: - cursorType = XC_top_left_corner; - break; - case java_awt_Cursor_SE_RESIZE_CURSOR: - cursorType = XC_bottom_right_corner; - break; - case java_awt_Cursor_NE_RESIZE_CURSOR: - cursorType = XC_top_right_corner; - break; - case java_awt_Cursor_S_RESIZE_CURSOR: - cursorType = XC_bottom_side; - break; - case java_awt_Cursor_N_RESIZE_CURSOR: - cursorType = XC_top_side; - break; - case java_awt_Cursor_W_RESIZE_CURSOR: - cursorType = XC_left_side; - break; - case java_awt_Cursor_E_RESIZE_CURSOR: - cursorType = XC_right_side; - break; - case java_awt_Cursor_HAND_CURSOR: - cursorType = XC_hand2; - break; - case java_awt_Cursor_MOVE_CURSOR: - cursorType = XC_fleur; - break; - } - xcursor = XCreateFontCursor(awt_display, cursorType); - - (*env)->CallVoidMethod(env, jCur, cursorIDs.mSetPData, xcursor); - return xcursor; -} - -/* - * Class: java_awt_Cursor - * Method: finalizeImpl - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_java_awt_Cursor_finalizeImpl(JNIEnv *env, jclass clazz, jlong pData) -{ - Cursor xcursor; - - xcursor = (Cursor)pData; - if (xcursor != None) { - AWT_LOCK(); - XFreeCursor(awt_display, xcursor); - AWT_UNLOCK(); - } -} - -/* - * normal replace : CACHE_UDPATE => update curComp and updateCursor - * not replace : UPDATE_ONLY => intact curComp but updateCursor - * only replace : CACHE_ONLY => update curComp only, not updateCursor - * - * This function should only be called under AWT_LOCK(). Otherwise - * multithreaded access can corrupt the value of curComp variable. - */ -void updateCursor(XPointer client_data, int32_t replace) { - - static jclass globalCursorManagerClass = NULL; - static jmethodID updateCursorID = NULL; - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject peer = (jobject) client_data; - jobject target; - - if ((*env)->PushLocalFrame(env, 16) < 0) - return; - - target = (*env)->GetObjectField(env, peer, mComponentPeerIDs.target); - if (replace != UPDATE_ONLY) { - if (!JNU_IsNull(env, curComp)) { - (*env)->DeleteWeakGlobalRef(env, curComp); - } - curComp = (*env)->NewWeakGlobalRef(env, target); - if (replace == CACHE_ONLY) { - (*env)->PopLocalFrame(env, 0); - return; - } - } - - /* Initialize our java identifiers once. Checking before locking - * is a huge performance win. - */ - if (globalCursorManagerClass == NULL) { - jobject sysClass = (*env)->FindClass(env, "sun/awt/motif/MGlobalCursorManager"); - if (sysClass != NULL) { - /* Make this class 'sticky', we don't want it GC'd */ - globalCursorManagerClass = (*env)->NewGlobalRef(env, sysClass); - - updateCursorID = (*env)->GetStaticMethodID(env, - globalCursorManagerClass, - "nativeUpdateCursor", - "(Ljava/awt/Component;)V" - ); - } - if (JNU_IsNull(env, globalCursorManagerClass) || updateCursorID == NULL) { - JNU_ThrowClassNotFoundException(env, "sun/awt/motif/MGlobalCursorManager"); - (*env)->PopLocalFrame(env, 0); - return; - } - } /* globalCursorManagerClass == NULL*/ - - (*env)->CallStaticVoidMethod(env, globalCursorManagerClass, - updateCursorID, target); - DASSERT(!((*env)->ExceptionOccurred(env))); - (*env)->PopLocalFrame(env, 0); -} - -/* - * Only call this function under AWT_LOCK(). Otherwise multithreaded - * access can corrupt the value of curComp variable. - */ -jobject getCurComponent() { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - return (*env)->NewLocalRef(env, curComp); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_DataTransferer.c --- a/jdk/src/solaris/native/sun/awt/awt_DataTransferer.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1068 +0,0 @@ -/* - * Copyright 2000-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#ifdef HEADLESS - #error This file should not be included in headless library -#endif - -#include "awt_p.h" -#include -#include - -#include - -#include -#include - -#include "sun_awt_datatransfer_DataTransferer.h" -#include "sun_awt_motif_MDataTransferer.h" - -#include "awt_XmDnD.h" -#include "awt_DataTransferer.h" - -static jclass string; - -XContext awt_convertDataContext = 0; - -Atom XA_TARGETS; - -extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; - -typedef enum { - SelectionPending, - SelectionSuccess, - SelectionFailure, - SelectionOwnerTimedOut -} SelectionStatus; - -/* Should only be accessed by the current owner of AWT_LOCK. */ -static SelectionStatus globalSelectionStatus = SelectionPending; - -static SelectionStatus get_selection_status() { - return globalSelectionStatus; -} - -static void set_selection_status(SelectionStatus status) { - globalSelectionStatus = status; -} - -static void -selection_request_filter(Widget widget, XtPointer closure, XEvent *event, - Boolean *cont) { - if (event->type == SelectionRequest) { - Window awt_root_window = XtWindow(awt_root_shell); - Atom selection = event->xselectionrequest.selection; - Window owner = XGetSelectionOwner(event->xany.display, selection); - - if (owner != awt_root_window) { - XSelectionEvent notify; - - notify.type = SelectionNotify; - notify.display = event->xselectionrequest.display; - notify.requestor = event->xselectionrequest.requestor; - notify.selection = event->xselectionrequest.selection; - notify.time = event->xselectionrequest.time; - notify.target = event->xselectionrequest.target; - notify.property = None; - - XSendEvent(notify.display, notify.requestor, False, - (unsigned long)0, (XEvent*)¬ify); - *cont = False; - } - } -} - -/** - * global function to initialize this client as a Dynamic-only app. - * - * gets called once during toolkit initialization. - */ - -void awt_initialize_DataTransferer() { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jclass stringClassLocal = NULL; - - DASSERT(string == NULL); - - stringClassLocal = (*env)->FindClass(env, "java/lang/String"); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - DASSERT(False); - } - - if (JNU_IsNull(env, stringClassLocal)) return; - - string = (*env)->NewGlobalRef(env, stringClassLocal); /* never freed! */ - (*env)->DeleteLocalRef(env, stringClassLocal); - - if (JNU_IsNull(env, string)) { - JNU_ThrowOutOfMemoryError(env, ""); - return; - } - - DASSERT(awt_convertDataContext == 0); - awt_convertDataContext = XUniqueContext(); - DASSERT(awt_convertDataContext != 0); - - /* - * Fixes for 4513976 and 4818143. - */ - XtAppSetSelectionTimeout(awt_appContext, - JNU_CallStaticMethodByName(env, NULL, "sun/awt/UNIXToolkit", - "getDatatransferTimeout", "()I").i); - - /* - * Xt selection machinery doesn't respond to SelectionRequests if the - * event arrives on a widget that is not the current selection owner. - * This can happen if XtDisownSelection was called when SelectionRequest was - * already on the native queue. - * If the requestor is another JVM, it hangs for the selection timeout - * as SelectionNotify is never sent. - * We install an event handler that filters out SelectionRequests if the - * awt_root_shell is not the current selection owner. - */ - XtAddEventHandler(awt_root_shell, (EventMask)0, True, - selection_request_filter, NULL); - - XA_TARGETS = XInternAtom(awt_display, "TARGETS", False); -} - -/* - * Single routine to convert to target FILE_NAME or _DT_FILENAME - */ -Boolean -convertFileType(jbyteArray data, Atom * type, XtPointer * value, - unsigned long *length, int32_t *format) -{ - /* - * Convert the internal representation to an File Name. - * The data passed is an array of - * null separated bytes. Each series of bytes is a string - * that is then converted to an XString which are then put - * into an XStringList and put into an XTextProperty for - * usage in other programs. - * - * It would be desireable to have dataConvert to this conversion - * but it isn't possible to return a byte array that represents - * the XTextProperty. - */ - - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jboolean isCopy=JNI_FALSE; - XTextProperty tp; - jsize len; - jsize strings = 0; - jsize i; - char** stringList; - Status s; - jbyte* bytes; - char* start; - size_t slen; - char* utf; - - if ((*env)->PushLocalFrame(env, 16) < 0) { - return False; - } - - /* convert the data to an Array of Byte Elements */ - bytes = (*env)->GetByteArrayElements(env, data, &isCopy); - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - (*env)->PopLocalFrame(env, NULL); - return False; - } - - if (JNU_IsNull(env, bytes)) { - (*env)->PopLocalFrame(env, NULL); - return False; - } - - /* Get the length of the area */ - len = (*env)->GetArrayLength(env, data); - if (len == 0) { - (*env)->ReleaseByteArrayElements(env, data, bytes, JNI_ABORT); - (*env)->PopLocalFrame(env, NULL); - return False; - } - - /* - * determine the number of lists. The byteArray is null separated list of - * strings. - */ - for (i = 0; i < len; i++) { - if (bytes[i] == '\0') { - strings++; - } - } - - /* Allocate an X11 string list */ - stringList = (char **)XtCalloc(strings, sizeof(char *)); - if (stringList == (char**)NULL) { - (*env)->ReleaseByteArrayElements(env, data, bytes, JNI_ABORT); - (*env)->PopLocalFrame(env, NULL); - return False; - } - - for (i = 0; i < strings; i++) { - if (i == 0) { - start = (char*)bytes; - } else { - start = (char*)&bytes[slen]; - } - - /* - * if start is a NULL we're at the end of the list - * We'll just a have null entry on the end of the list - */ - if (start[0] == '\0') { - stringList[i] = NULL; - continue; - } - slen = strlen(start) + 1; - - stringList[i] = (char*)XtCalloc(slen, sizeof(char)); - - if (stringList[i] == (char *)NULL) { - jsize j; - - (*env)->ReleaseByteArrayElements(env, data, bytes, JNI_ABORT); - - for (j = 0; j < i; j++) { - XtFree((void *)stringList[j]); - } - - (*env)->PopLocalFrame(env, NULL); - - return False; - } - - memcpy((void *)stringList[i], (const void*)start, slen); - } - - (*env)->ReleaseByteArrayElements(env, data, bytes, JNI_ABORT); - s = XStringListToTextProperty(stringList, strings, &tp); - - /* free the strings that were created */ - for (i = 0; i < strings; i++) { - if (stringList[i] != NULL) { - XtFree((void*)stringList[i]); - } - } - - XtFree((void*)stringList); - - if (s == 0) { - (*env)->PopLocalFrame(env, NULL); - return False; - } - - *value = (XtPointer)XtCalloc(tp.nitems, sizeof(char)); - - if (*value == (XtPointer)NULL) { - XFree((void*)tp.value); - - (*env)->PopLocalFrame(env, NULL); - - return False; - } - - memcpy((void *)(*value), (const void *)tp.value, tp.nitems); - - XFree((void*)tp.value); - - *length = tp.nitems; - *type = tp.encoding; - *format = tp.format; - (*env)->PopLocalFrame(env, NULL); - return True; -} - -/* - * Class: sun_awt_motif_MDataTransferer - * Method: getAtomForTarget - * Signature: (Ljava/lang/String;)J - */ - -JNIEXPORT jlong JNICALL -Java_sun_awt_motif_MDataTransferer_getAtomForTarget(JNIEnv *env, - jclass cls, - jstring targetString) -{ - Atom target; - char *target_str; - - if (JNU_IsNull(env, targetString)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return -1; - } - target_str = (char *) JNU_GetStringPlatformChars(env, targetString, NULL); - - AWT_LOCK(); - - target = XInternAtom(awt_display, target_str, False); - - AWT_UNLOCK(); - - JNU_ReleaseStringPlatformChars(env, targetString, - (const char *) target_str); - return target; -} - -/* - * Class: sun_awt_motif_MDataTransferer - * Method: getTargetNameForAtom - * Signature: (J)Ljava/lang/String; - */ - -JNIEXPORT jstring JNICALL -Java_sun_awt_motif_MDataTransferer_getTargetNameForAtom(JNIEnv *env, - jclass cls, - jlong atom) -{ - jstring targetString; - char *name; - - AWT_LOCK(); - - name = XGetAtomName(awt_display, (Atom) atom); - - if (name == NULL) { - JNU_ThrowNullPointerException(env, "Failed to retrieve atom name."); - AWT_UNLOCK(); - return NULL; - } - - targetString = (*env)->NewStringUTF(env, (const char *)name); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - XFree (name); - AWT_UNLOCK(); - return NULL; - } - - if (JNU_IsNull(env, targetString)) { - JNU_ThrowNullPointerException(env, "Failed to create a string."); - XFree (name); - AWT_UNLOCK(); - return NULL; - } - - XFree (name); - - AWT_UNLOCK(); - return targetString; -} - -/* - * Class: sun_awt_datatransfer_DataTransferer - * Method: dragQueryFile - * Signature: ([B)[Ljava/lang/String; - * - * This method converts a byte array that came from File most likely from a - * drag operation into a String array. - */ - -JNIEXPORT jobjectArray JNICALL -Java_sun_awt_motif_MDataTransferer_dragQueryFile - (JNIEnv *env, jobject this, jbyteArray bytes) -{ - XTextProperty tp; - jbyte *value; - - char** strings = (char **)NULL; - int32_t nstrings = 0; - jobject filenames; - jobject ret = NULL; - int32_t i; - jsize len; - jboolean isCopy=JNI_FALSE; - - /* - * If the length of the byte array is 0 just return a null - */ - len = (*env)->GetArrayLength(env, bytes); - if (len == 0) { - return NULL; - } - - value = (*env)->GetByteArrayElements(env, bytes, &isCopy); - if (JNU_IsNull(env, value)) { - return NULL; - } - - AWT_LOCK(); - - tp.encoding = XInternAtom(awt_display, "STRING", False); - tp.value = (unsigned char *)value; - tp.nitems = len; - tp.format = 8; - - /* - * Convert the byte stream into a list of X11 strings - */ - if (XTextPropertyToStringList(&tp, &strings, &nstrings) == 0 || - nstrings == 0) - { - (*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT); - AWT_UNLOCK(); - return NULL; - } - - (*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT); - - filenames = (*env)->NewObjectArray(env, nstrings, string, NULL); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - goto wayout; - } - - if (JNU_IsNull(env, filenames)) { - goto wayout; - } - - /* - * Actuall conversion code per X11 String - */ - for (i = 0; i < nstrings; i++) { - jstring string = (*env)->NewStringUTF(env, - (const char *)strings[i]); - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - goto wayout; - } - - if (JNU_IsNull(env, string)) { - goto wayout; - } - - (*env)->SetObjectArrayElement(env, filenames, i, string); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - goto wayout; - } - - (*env)->DeleteLocalRef(env, string); - } - - ret = filenames; - wayout: - /* - * Clean up and return - */ - XFreeStringList(strings); - AWT_UNLOCK(); - return ret; -} - -DECLARE_JAVA_CLASS(dataTransfererClazz, "sun/awt/datatransfer/DataTransferer") - -/** - * Returns a local reference to the singleton DataTransferer instance. - * The caller should delete the reference when done. - */ -static jobject -get_data_transferer(JNIEnv* env) { - jobject transferer = NULL; - - DECLARE_STATIC_OBJECT_JAVA_METHOD(getInstanceMethodID, dataTransfererClazz, - "getInstance", - "()Lsun/awt/datatransfer/DataTransferer;"); - - transferer = (*env)->CallStaticObjectMethod(env, clazz, getInstanceMethodID); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - DASSERT(!JNU_IsNull(env, transferer)); - - return transferer; -} - -static jobject -call_convertData(JNIEnv* env, jobject source, jobject contents, jlong format, - jobject formatMap) { - jobject transferer = get_data_transferer(env); - jobject ret = NULL; - DECLARE_OBJECT_JAVA_METHOD(convertDataMethodID, dataTransfererClazz, - "convertData", - "(Ljava/lang/Object;Ljava/awt/datatransfer/Transferable;JLjava/util/Map;Z)[B"); - - ret = (*env)->CallObjectMethod(env, transferer, convertDataMethodID, - source, contents, format, formatMap, - awt_currentThreadIsPrivileged(env)); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - (*env)->DeleteLocalRef(env, transferer); - - return ret; -} - -static void -process_convert_data_requests() { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_4); - jobject transferer = get_data_transferer(env); - - DECLARE_VOID_JAVA_METHOD(processDataConversionRequestsMethodID, - dataTransfererClazz, - "processDataConversionRequests", - "()V"); - - (*env)->CallVoidMethod(env, transferer, - processDataConversionRequestsMethodID); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - (*env)->DeleteLocalRef(env, transferer); -} - -Boolean -awt_convertData(Widget w, Atom * selection, Atom * target, Atom * type, - XtPointer * value, unsigned long *length, int32_t *format) { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - Display* dpy = XtDisplay(w); - awt_convertDataCallbackStruct* structPtr = NULL; - - if (XFindContext(dpy, *selection, awt_convertDataContext, - (XPointer*)&structPtr) == XCNOMEM || structPtr == NULL) { - return False; - } - - if ((*env)->PushLocalFrame(env, 2) < 0) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - return False; - } - - if (*target == XA_TARGETS) { - jlongArray formats = structPtr->formats; - jsize count; - jlong* targets; - jboolean isCopy; - -#ifndef _LP64 /* Atom and jlong are different sizes in the 32-bit build */ - Atom* aValue; - jlong* saveTargets; - jsize i; -#endif - - if (JNU_IsNull(env, formats)) { - (*env)->PopLocalFrame(env, NULL); - return False; - } - - count = (*env)->GetArrayLength(env, formats); - if (count == 0) { - (*env)->PopLocalFrame(env, NULL); - return False; - } - - targets = (*env)->GetLongArrayElements(env, formats, &isCopy); - - *type = XA_ATOM; - *format = 32; - -#ifdef _LP64 - *value = XtMalloc(count * sizeof(Atom)); - memcpy((void *)*value, (void *)targets, count * sizeof(Atom)); -#else - *value = aValue = (Atom *)XtMalloc(count * sizeof(Atom)); - saveTargets = targets; - for (i = 0; i < count; i++, aValue++, targets++) { - *aValue = (Atom)*targets; - } - targets = saveTargets; -#endif - (*env)->ReleaseLongArrayElements(env, formats, targets, JNI_ABORT); - - *length = count; - - } else if (*target == XInternAtom(dpy, _XA_DELETE, False)) { - - /* - * acknowledge the DELETE target here ... the "delete" semantic - * of move will take place after the drop is complete. - */ - - *type = XInternAtom(dpy, _XA_NULL, False); - *length = 0; - *value = (XtPointer)NULL; - /* Uninitialized format can cause crash in Xt conversion code. */ - *format = 8; - } else if (*target == XInternAtom(dpy, _XA_HOSTNAME, False)) { - struct utsname name; - XTextProperty tp; - - uname(&name); - - if (!XStringListToTextProperty((char **)&name.nodename, 1, &tp)) { - (*env)->PopLocalFrame(env, NULL); - return False; - } - - *value = (XtPointer)XtCalloc(tp.nitems, sizeof(char)); - - memcpy((void *)*value, (const void *)tp.value, tp.nitems); - - XFree((void *)tp.value); - - *type = tp.encoding; - *length = tp.nitems + 1; - *format = tp.format; - } else if (*target == XInternAtom(dpy, _XA_FILENAME, False) || - *target == XInternAtom(dpy, _DT_FILENAME, False)) { - - /* - * Convert the internal representation to an File Name. - * The data returned from dataConvert is a an array of - * null separated bytes. Each series of bytes is a string - * that is then converted to an XString which are then put - * into an XStringList and put into an XTextProperty for - * usage in other programs. - * - * It would be desireable to have dataConvert to this conversion - * but it isn't possible to return a byte array that represents - * the XTextProperty. - */ - jbyteArray data; - - /* - * Fix for 4513976. - * Type None should be used instead of XT_CONVERT_FAIL - * to report conversion failure. - */ - /* assume forthcoming error */ - *type = None; - *value = (XtPointer)NULL; - *length = 0; - *format = 8; - - data = call_convertData(env, structPtr->source, structPtr->transferable, - (jlong)*target, structPtr->formatMap); - - /* error test */ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - (*env)->PopLocalFrame(env, NULL); - return False; - } - if (JNU_IsNull(env, data)) { - (*env)->PopLocalFrame(env, NULL); - return False; - } - - if (convertFileType(data, type, value, length, format) == False) { - (*env)->PopLocalFrame(env, NULL); - return False; - } - } else { - jbyteArray bytes = NULL; - jbyte* copy = NULL; - - /* - * Fix for 4513976. - * Type None should be used instead of XT_CONVERT_FAIL - * to report conversion failure. - */ - *type = None; /* assume forthcoming error */ - *value = (XtPointer)NULL; - *length = 0; - *format = 8; - - bytes = call_convertData(env, structPtr->source, structPtr->transferable, - (jlong)*target, structPtr->formatMap); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - (*env)->PopLocalFrame(env, NULL); - return False; - } - - if (bytes == NULL) { - (*env)->PopLocalFrame(env, NULL); - return False; - } else { - jsize len = (*env)->GetArrayLength(env, bytes); - - if (len == 0) { - *type = *target; - *format = 8; - (*env)->PopLocalFrame(env, NULL); - return True; - } - - copy = (jbyte*)XtCalloc(1, len * sizeof(jbyte)); - if (copy == (jbyte*)NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - (*env)->PopLocalFrame(env, NULL); - return False; - } - - (*env)->GetByteArrayRegion(env, (jbyteArray)bytes, 0, len, copy); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - XtFree((void *)copy); - (*env)->PopLocalFrame(env, NULL); - return False; - } - - *value = (XtPointer)copy; - *type = *target; - *length = len; - *format = 8; - } - } - - (*env)->PopLocalFrame(env, NULL); - return True; -} - - -jlongArray -getSelectionTargetsHelper(JNIEnv* env, XtPointer value, unsigned long length) -{ - Atom* targets = (Atom*)value; - jlongArray targetArray = NULL; - jlong* checkedTargets = NULL; - size_t count = 0, i = 0, j = 0; - - /* Get rid of zero atoms if there are any. */ - for (; i < length; i++) { - if (targets[i] != 0) { - count++; - } - } - checkedTargets = calloc(count, sizeof(jlong)); - if (checkedTargets == NULL) { - JNU_ThrowOutOfMemoryError(env, ""); - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } else { - for (i = 0; i < length; i++) { - if (targets[i] != 0) { - checkedTargets[j++] = targets[i]; - } - } - - DASSERT(j == count); - - if ((*env)->EnsureLocalCapacity(env, 1) >= 0) { - - targetArray = (*env)->NewLongArray(env, count); - - if (!JNU_IsNull(env, targetArray)) { - (*env)->SetLongArrayRegion(env, targetArray, 0, count, - checkedTargets); - - if ((*env)->ExceptionCheck(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - - (*env)->DeleteLocalRef(env, targetArray); - targetArray = NULL; - } - } - } - free(checkedTargets); - } - - return targetArray; -} - -static void -get_selection_targets_callback(Widget w, XtPointer client_data, Atom* selection, - Atom* type, XtPointer value, - unsigned long* length, int32_t* format) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject* pReturnArray = (jobject*)client_data; - SelectionStatus status = SelectionFailure; - - /* - * It is highly unlikely that TARGETS will ever be passed even though that - * was what was requested. However, XA_ATOM ("ATOM") is likely. - * Actually they are the same so treat them as such. See XToolKit - * Intrinsic Manual on XtSelectionCallbackProc for more details on type. - */ - if (*type == XA_TARGETS || *type == XA_ATOM) { - jlongArray targetArray = getSelectionTargetsHelper(env, value, *length); - if (!JNU_IsNull(env, targetArray)) { - *pReturnArray = (*env)->NewGlobalRef(env, targetArray); - status = SelectionSuccess; - (*env)->DeleteLocalRef(env, targetArray); - } - } else if (*type == XT_CONVERT_FAIL) { - status = SelectionOwnerTimedOut; - } else { - /* - * A part of the fix for 4259272. - * Actually Xt Intrinsics says about XtSelectionCallback that - * "if there is no owner for the specified selection, or that owner - * cannot convert the selected data to the requested type, then this - * callback is called with value NULL and length zero". - * But we report success if type is not TARGETS, XA_ATOM or XT_CONVERT_FAIL, - * and we should not change this behaviour. We just return zero-length - * array instead of null, because null denotes that we could not get - * selection targets at the time of tracking changes of available on - * the selection data flavors. - */ - jlongArray targetArray = (*env)->NewLongArray(env, 0); - *pReturnArray = (*env)->NewGlobalRef(env, targetArray); - /* - * Fix for 4655996. - * Report success if there is no owner for this selection or the owner - * fails to provide target types. - */ - status = SelectionSuccess; - (*env)->DeleteLocalRef(env, targetArray); - } - - if (value != NULL) { - XtFree(value); - value = NULL; - } - - set_selection_status(status); -} - -static void -get_selection_data_callback(Widget w, XtPointer client_data, Atom * selection, - Atom * type, XtPointer value, unsigned long *length, - int32_t *format) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject* pData = (jobject*)client_data; - SelectionStatus status = SelectionFailure; - - if (*type == XT_CONVERT_FAIL) { - status = SelectionOwnerTimedOut; - } else if (*type != None) { - if ((*env)->EnsureLocalCapacity(env, 1) >= 0) { - jsize size = (*length <= INT_MAX) ? *length : INT_MAX; - jbyteArray array = (*env)->NewByteArray(env, size); - - if (!JNU_IsNull(env, array)) { - (*env)->SetByteArrayRegion(env, array, 0, size, (jbyte*)value); - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } else { - *pData = (*env)->NewGlobalRef(env, array); - status = SelectionSuccess; - } - - (*env)->DeleteLocalRef(env, array); - } - } - } - - if (value != NULL) { - XtFree(value); - value = NULL; - } - - set_selection_status(status); -} - -static int32_t -wait_for_selection_event(void *data) { - process_convert_data_requests(); - return get_selection_status() != SelectionPending; -} - -jlongArray -get_selection_targets(JNIEnv *env, Atom selection, Time time_stamp) { - jlongArray ret = NULL; - jlongArray targets = NULL; - SelectionStatus status = SelectionPending; - - AWT_LOCK(); - - XtAppSetSelectionTimeout(awt_appContext, - JNU_CallStaticMethodByName(env, NULL, "sun/awt/UNIXToolkit", - "getDatatransferTimeout", "()I").i); - - set_selection_status(SelectionPending); - XtGetSelectionValue(awt_root_shell, selection, XA_TARGETS, - get_selection_targets_callback, (XtPointer)&targets, - time_stamp); - - awt_MToolkit_modalWait(wait_for_selection_event, NULL); - status = get_selection_status(); - - AWT_FLUSH_UNLOCK(); - - if (!JNU_IsNull(env, targets)) { - ret = (*env)->NewLocalRef(env, targets); - (*env)->DeleteGlobalRef(env, targets); - } - - switch (status) { - case SelectionSuccess: - break; - case SelectionFailure: - JNU_ThrowByName(env, "java/lang/IllegalStateException", - "Failed to get selection targets"); - break; - case SelectionOwnerTimedOut: - // return an empty array of targets if the selection owner timed out - ret = (*env)->NewLongArray(env, 0); - break; - default: - JNU_ThrowByName(env, "java/lang/IllegalStateException", - "Unexpected selection status"); - break; - } - - return ret; -} - -jbyteArray -get_selection_data(JNIEnv *env, Atom selection, Atom target, Time time_stamp) { - jbyteArray ret = NULL; - jbyteArray data = NULL; - SelectionStatus status = SelectionPending; - - AWT_LOCK(); - - XtAppSetSelectionTimeout(awt_appContext, - JNU_CallStaticMethodByName(env, NULL, "sun/awt/UNIXToolkit", - "getDatatransferTimeout", "()I").i); - - set_selection_status(SelectionPending); - XtGetSelectionValue(awt_root_shell, selection, target, - get_selection_data_callback, - (XtPointer)&data, time_stamp); - - awt_MToolkit_modalWait(wait_for_selection_event, NULL); - status = get_selection_status(); - - AWT_FLUSH_UNLOCK(); - - if (!JNU_IsNull(env, data)) { - ret = (*env)->NewLocalRef(env, data); - (*env)->DeleteGlobalRef(env, data); - } - - switch (status) { - case SelectionSuccess: - break; - case SelectionFailure: - JNU_ThrowIOException(env, "Failed to get selection data"); - break; - case SelectionOwnerTimedOut: - JNU_ThrowIOException(env, "Selection owner timed out"); - break; - default: - JNU_ThrowIOException(env, "Unexpected selection status"); - break; - } - - return ret; -} - -void -awt_cleanupConvertDataContext(JNIEnv *env, Atom selectionAtom) { - awt_convertDataCallbackStruct* structPtr = NULL; - - if (XFindContext(awt_display, selectionAtom, awt_convertDataContext, - (XPointer*)&structPtr) == 0 && structPtr != NULL) { - - (*env)->DeleteGlobalRef(env, structPtr->source); - (*env)->DeleteGlobalRef(env, structPtr->transferable); - (*env)->DeleteGlobalRef(env, structPtr->formatMap); - (*env)->DeleteGlobalRef(env, structPtr->formats); - free(structPtr); - } - /* - * Xlib Programming Manual says that it is better to erase - * the current entry with XDeleteContext() before XSaveContext(). - */ - XDeleteContext(awt_display, selectionAtom, awt_convertDataContext); - if (XSaveContext(awt_display, selectionAtom, awt_convertDataContext, - (XPointer)NULL) == XCNOMEM) { - JNU_ThrowInternalError(env, "XError"); - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -static Bool exitSecondaryLoop = True; - -/* - * This predicate procedure allows the Toolkit thread to process specific events - * while it is blocked waiting for the event dispatch thread to process - * a SunDropTargetEvent. We need this to prevent deadlock when the client code - * processing SunDropTargetEvent sets or gets the contents of the system - * clipboard/selection. In this case the event dispatch thread waits for the - * Toolkit thread to process PropertyNotify or SelectionNotify events. - */ -static Bool -secondary_loop_event(Display* dpy, XEvent* event, char* arg) { - return (event->type == SelectionNotify || - event->type == SelectionClear || - event->type == PropertyNotify) ? True : False; -} - - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MToolkitThreadBlockedHandler_enter(JNIEnv *env, jobject this) { - DASSERT(exitSecondaryLoop && awt_currentThreadIsPrivileged(env)); - exitSecondaryLoop = False; - while (!exitSecondaryLoop) { - XEvent event; - while (XCheckIfEvent(awt_display, &event, secondary_loop_event, NULL)) { - XtDispatchEvent(&event); - } - AWT_WAIT(AWT_DND_POLL_INTERVAL); - } -} - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MToolkitThreadBlockedHandler_exit(JNIEnv *env, jobject this) { - DASSERT(!exitSecondaryLoop && !awt_currentThreadIsPrivileged(env)); - exitSecondaryLoop = True; - AWT_NOTIFY_ALL(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_DataTransferer.h --- a/jdk/src/solaris/native/sun/awt/awt_DataTransferer.h Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,275 +0,0 @@ -/* - * Copyright 2000-2004 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. - */ - -#ifndef AWT_DATATRANSFERER_H -#define AWT_DATATRANSFERER_H - -#include -#include - -#define _XA_DELETE "DELETE" -#define _XA_FILENAME "FILE_NAME" -#define _XA_HOSTNAME "HOST_NAME" -#define _XA_NULL "NULL" -#define _DT_FILENAME "_DT_NETFILE" - -#define AWT_DND_POLL_INTERVAL ((unsigned long)250) /* milliseconds */ - -typedef struct { - jobject source; - jobject transferable; - jobject formatMap; - jlongArray formats; -} awt_convertDataCallbackStruct; - -extern XContext awt_convertDataContext; /* XContext is not 64 bits */ - -extern Atom XA_TARGETS; - -/* - * Single routine to convert to target FILE_NAME or _DT_FILENAME - */ -Boolean -convertFileType(jbyteArray data, Atom * type, XtPointer * value, - unsigned long *length, int32_t *format); - -Boolean -awt_convertData(Widget w, Atom * selection, Atom * target, Atom * type, - XtPointer * value, unsigned long *length, int32_t *format); - -jlongArray -get_selection_targets(JNIEnv *env, Atom selection, Time time_stamp); - -jlongArray -getSelectionTargetsHelper(JNIEnv* env, XtPointer value, unsigned long length); - -jbyteArray -get_selection_data(JNIEnv *env, Atom selection, Atom format, Time time_stamp); - -void -awt_cleanupConvertDataContext(JNIEnv *env, Atom selectionAtom); - -/* - * NOTE: You need these macros only if you take care of performance, since they - * provide proper caching. Otherwise you can use JNU_CallMethodByName etc. - */ - -/* - * This macro defines a function which returns the class for the specified - * class name with proper caching and error handling. - */ -#define DECLARE_JAVA_CLASS(javaclazz, name) \ -static jclass \ -get_ ## javaclazz(JNIEnv* env) { \ - static jclass javaclazz = NULL; \ - \ - if (JNU_IsNull(env, javaclazz)) { \ - jclass javaclazz ## Local = (*env)->FindClass(env, name); \ - \ - if (!JNU_IsNull(env, javaclazz ## Local)) { \ - javaclazz = (jclass)(*env)->NewGlobalRef(env, javaclazz ## Local); \ - (*env)->DeleteLocalRef(env, javaclazz ## Local); \ - if (JNU_IsNull(env, javaclazz)) { \ - JNU_ThrowOutOfMemoryError(env, ""); \ - } \ - } \ - \ - if (!JNU_IsNull(env, ((*env)->ExceptionOccurred(env)))) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - } \ - \ - DASSERT(!JNU_IsNull(env, javaclazz)); \ - \ - return javaclazz; \ -} - -/* - * The following macros defines blocks of code which retrieve a method of the - * specified class identified with the specified name and signature. - * The specified class should be previously declared with DECLARE_JAVA_CLASS. - * These macros should be placed at the beginning of a block, after definition - * of local variables, but before the code begins. - */ -#define DECLARE_VOID_JAVA_METHOD(method, javaclazz, name, signature) \ - static jmethodID method = NULL; \ - \ - if (JNU_IsNull(env, method)) { \ - jclass clazz = get_ ## javaclazz(env); \ - \ - if (JNU_IsNull(env, clazz)) { \ - return; \ - } \ - \ - method = (*env)->GetMethodID(env, clazz, name, signature); \ - \ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - DASSERT(False); \ - return; \ - } \ - } - -#define DECLARE_BOOLEAN_JAVA_METHOD(method, javaclazz, name, signature) \ - static jmethodID method = NULL; \ - \ - if (JNU_IsNull(env, method)) { \ - jclass clazz = get_ ## javaclazz(env); \ - \ - if (JNU_IsNull(env, clazz)) { \ - return False; \ - } \ - \ - method = (*env)->GetMethodID(env, clazz, name, signature); \ - \ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - DASSERT(False); \ - return False; \ - } \ - } - -#define DECLARE_JINT_JAVA_METHOD(method, javaclazz, name, signature) \ - static jmethodID method = NULL; \ - \ - if (JNU_IsNull(env, method)) { \ - jclass clazz = get_ ## javaclazz(env); \ - \ - if (JNU_IsNull(env, clazz)) { \ - return java_awt_dnd_DnDConstants_ACTION_NONE; \ - } \ - \ - method = (*env)->GetMethodID(env, clazz, name, signature); \ - \ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - DASSERT(False); \ - return java_awt_dnd_DnDConstants_ACTION_NONE; \ - } \ - } - -#define DECLARE_OBJECT_JAVA_METHOD(method, javaclazz, name, signature) \ - static jmethodID method = NULL; \ - \ - if (JNU_IsNull(env, method)) { \ - jclass clazz = get_ ## javaclazz(env); \ - \ - if (JNU_IsNull(env, clazz)) { \ - return NULL; \ - } \ - \ - method = (*env)->GetMethodID(env, clazz, name, signature); \ - \ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - DASSERT(False); \ - return NULL; \ - } \ - } - -#define DECLARE_STATIC_OBJECT_JAVA_METHOD(method, javaclazz, name, signature) \ - static jmethodID method = NULL; \ - jclass clazz = get_ ## javaclazz(env); \ - \ - if (JNU_IsNull(env, clazz)) { \ - return NULL; \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - method = (*env)->GetStaticMethodID(env, clazz, name, signature); \ - \ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - DASSERT(False); \ - return NULL; \ - } \ - } - -#define DECLARE_STATIC_VOID_JAVA_METHOD(method, javaclazz, name, signature) \ - static jmethodID method = NULL; \ - jclass clazz = get_ ## javaclazz(env); \ - \ - if (JNU_IsNull(env, clazz)) { \ - return; \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - method = (*env)->GetStaticMethodID(env, clazz, name, signature); \ - \ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - DASSERT(False); \ - return; \ - } \ - } - -#define DECLARE_STATIC_JINT_JAVA_METHOD(method, javaclazz, name, signature) \ - static jmethodID method = NULL; \ - jclass clazz = get_ ## javaclazz(env); \ - \ - if (JNU_IsNull(env, clazz)) { \ - return java_awt_dnd_DnDConstants_ACTION_NONE; \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - method = (*env)->GetStaticMethodID(env, clazz, name, signature); \ - \ - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { \ - (*env)->ExceptionDescribe(env); \ - (*env)->ExceptionClear(env); \ - } \ - \ - if (JNU_IsNull(env, method)) { \ - DASSERT(False); \ - return java_awt_dnd_DnDConstants_ACTION_NONE; \ - } \ - } - -#endif /* AWT_DATATRANSFERER_H */ diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_DrawingSurface.c --- a/jdk/src/solaris/native/sun/awt/awt_DrawingSurface.c Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/native/sun/awt/awt_DrawingSurface.c Mon Aug 25 13:58:15 2008 -0700 @@ -29,7 +29,7 @@ #include "awt_p.h" #include "java_awt_Component.h" -#include "sun_awt_motif_MComponentPeer.h" +//#include "sun_awt_motif_MComponentPeer.h" #include "awt_Component.h" diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_FileDialog.c --- a/jdk/src/solaris/native/sun/awt/awt_FileDialog.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,925 +0,0 @@ -/* - * Copyright 1995-2004 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 -#include -#include -#include -#include -#include "awt_p.h" -#include "java_awt_FileDialog.h" -#include "java_awt_event_MouseWheelEvent.h" -#include "sun_awt_motif_MFileDialogPeer.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "multi_font.h" - -#include "awt_Component.h" - -#include -#include -#include - -#define MAX_DIR_PATH_LEN 1024 - -extern void Text_handlePaste(Widget w, XtPointer client_data, XEvent * event, - Boolean * cont); - -extern struct MComponentPeerIDs mComponentPeerIDs; - -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -/* fieldIDs for FileDialog fields and methods that may be accessed from C */ -static struct FileDialogIDs { - jfieldID mode; - jfieldID file; -} fileDialogIDs; - -/* the field to store the default search procedure */ -static XmSearchProc DefaultSearchProc = NULL; - -/* mouse wheel handler for scrolling */ -void File_handleWheel(Widget w, XtPointer client_data, XEvent* event, Boolean* cont); - -/* - * Class: java_awt_FileDialog - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for FileDialog.java - to initialize the fieldIDs for fields that may be accessed from C */ - -JNIEXPORT void JNICALL -Java_java_awt_FileDialog_initIDs - (JNIEnv *env, jclass cls) -{ - fileDialogIDs.mode = (*env)->GetFieldID(env, cls, "mode", "I"); - fileDialogIDs.file = - (*env)->GetFieldID(env, cls, "file", "Ljava/lang/String;"); - - DASSERT(fileDialogIDs.mode != NULL); - DASSERT(fileDialogIDs.file != NULL); -} - -/* - * client_data is MFileDialogPeer instance pointer - */ -static void -FileDialog_OK(Widget w, - void *client_data, - XmFileSelectionBoxCallbackStruct * call_data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject) client_data; - struct FrameData *fdata; - char *file; - jstring jstr; - XmStringContext stringContext; - XmStringDirection direction; - XmStringCharSet charset; - Boolean separator; - - fdata = (struct FrameData *)JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if ((*env)->EnsureLocalCapacity(env, 1) < 0) - return; - - if (!XmStringInitContext(&stringContext, call_data->value)) - return; - - if (!XmStringGetNextSegment(stringContext, &file, &charset, - &direction, &separator)) - file = NULL; - - if (file == NULL) - jstr = NULL; - else - jstr = JNU_NewStringPlatform(env, (const char *) file); - - if (jstr != 0) { - JNU_CallMethodByName(env, NULL, this, "handleSelected", - "(Ljava/lang/String;)V", jstr); - (*env)->DeleteLocalRef(env, jstr); - } - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - XmStringFreeContext(stringContext); - if (file != NULL) - XtFree(file); -} - -/* - * client_data is MFileDialogPeer instance pointer - */ -static void -FileDialog_CANCEL(Widget w, - void *client_data, - XmFileSelectionBoxCallbackStruct * call_data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject) client_data; - struct FrameData *fdata; - - fdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - JNU_CallMethodByName(env, NULL, (jobject) client_data, "handleCancel", "()V"); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - - -/* - * client_data is MFileDialogPeer instance pointer - */ -static void -FileDialog_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_PROTOCOLS; - - XtVaSetValues(wdata->winData.shell, - XmNdeleteResponse, XmDO_NOTHING, - NULL); - xa_WM_DELETE_WINDOW = XmInternAtom(XtDisplay(wdata->winData.shell), - "WM_DELETE_WINDOW", False); - xa_WM_PROTOCOLS = XmInternAtom(XtDisplay(wdata->winData.shell), - "WM_PROTOCOLS", False); - - XmAddProtocolCallback(wdata->winData.shell, - xa_WM_PROTOCOLS, - xa_WM_DELETE_WINDOW, - FileDialog_quit, (XtPointer) this); -} - -void -setFSBDirAndFile(Widget w, char *dir, char *file, - XmString *ffiles, int count) -{ - Widget textField, list; - char dirbuf[MAX_DIR_PATH_LEN]; - XmString xim, item; - size_t lastSelect; - - dirbuf[0] = (char) '\0'; - - if (dir != NULL && strlen(dir) < MAX_DIR_PATH_LEN) - strcpy(dirbuf, dir); - - /* -----> make sure dir ends in '/' */ - if (dirbuf[0] != (char) '\0') { - if (dirbuf[strlen(dirbuf) - 1] != (char) '/') - strcat(dirbuf, "/"); - } else { - getcwd(dirbuf, MAX_DIR_PATH_LEN - 16); - strcat(dirbuf, "/"); - } - - strcat(dirbuf, "[^.]*"); - xim = XmStringCreate(dirbuf, XmSTRING_DEFAULT_CHARSET); - XtVaSetValues(w, XmNdirMask, xim, NULL); - - if (ffiles != NULL) - XtVaSetValues(w, - XmNfileListItems, (count > 0) ? ffiles : NULL, - XmNfileListItemCount, count, - XmNlistUpdated, True, NULL); - - XmStringFree(xim); - - /* - * Select the filename from the filelist if it exists. - */ - - textField = XmFileSelectionBoxGetChild(w, XmDIALOG_TEXT); - list = XmFileSelectionBoxGetChild(w, XmDIALOG_LIST); - - if (textField != 0 && file != 0) { - lastSelect = strlen(file); - XtVaSetValues(textField, XmNvalue, file, NULL); - XmTextFieldSetSelection(textField, 0, lastSelect, CurrentTime); - - item = XmStringCreateLocalized(file); - XmListSelectItem(list, item, NULL); - XmStringFree(item); - } -} - -static void -changeBackground(Widget w, void *bg) -{ - /* - ** This is a work-around for bug 4325443, caused by motif bug 4345559, - ** XmCombobox dosn't return all children, so give it some help ... - */ - Widget grabShell; - grabShell = XtNameToWidget(w, "GrabShell"); - if (grabShell != NULL) { - awt_util_mapChildren(grabShell, changeBackground, 0, (void *) bg); - } - - XmChangeColor(w, (Pixel) bg); -} - -void -ourSearchProc(Widget w, XtPointer p) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - struct FrameData *wdata; - XtPointer peer; - jobject this; - jboolean res; - char * dir = NULL; - jstring dir_o; - int32_t i, filecount = 0; - XmString * filelist = NULL; - jobjectArray nffiles = NULL; - jclass clazz = NULL; - jstring jfilename = NULL; - char * cfilename = NULL; - XmFileSelectionBoxCallbackStruct * vals = (XmFileSelectionBoxCallbackStruct *)p; - - XtVaGetValues(w, XmNuserData, &peer, NULL); - this = (jobject)peer; - if (JNU_IsNull(env, this) ) { - return; - } - wdata = (struct FrameData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (wdata == 0 || - wdata->winData.comp.widget == 0 || - wdata->winData.shell == 0 || p == NULL ) { - return; - } - - if ((*env)->EnsureLocalCapacity(env, 1) < 0) { - return; - } - - if (DefaultSearchProc != NULL) { - /* Unmap the widget temporary. If it takes a long time to generate - the list items some visual artifacts may be caused. However, - we need to do this to have the widget that works as we expect. - */ - XtSetMappedWhenManaged(w, False); - /* Call the default Motif search procedure to take the - native filtered file list. - */ - DefaultSearchProc(w, vals); - XtSetMappedWhenManaged(w, True); - XtVaGetValues(w, - XmNlistItemCount, &filecount, - XmNlistItems, &filelist, - NULL); - /* We need to construct the new String array to pass it to - the Java code. - */ - clazz = (*env)->FindClass(env, "java/lang/String"); - /* It is ok if filecount is 0. */ - nffiles = (*env)->NewObjectArray(env, filecount, clazz, NULL); - if (JNU_IsNull(env, nffiles)) { - nffiles = NULL; - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - } else { - for (i = 0; i < filecount; i++) { - DASSERT(filelist[i] != NULL); - - XmStringGetLtoR(filelist[i], XmFONTLIST_DEFAULT_TAG, &cfilename); - jfilename = JNU_NewStringPlatform(env, cfilename); - - if (JNU_IsNull(env, jfilename)) { - XtFree(cfilename); - nffiles = NULL; - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - break; - } - - (*env)->SetObjectArrayElement(env, nffiles, i, jfilename); - - (*env)->DeleteLocalRef(env, jfilename); - XtFree(cfilename); - } - } - } - - XmStringGetLtoR(vals->dir, XmFONTLIST_DEFAULT_TAG, &dir); - dir_o = JNU_NewStringPlatform(env, dir); - res = JNU_CallMethodByName(env, NULL, this, - "proceedFiltering", - "(Ljava/lang/String;[Ljava/lang/String;Z)Z", - dir_o, nffiles, - awt_currentThreadIsPrivileged(env)).z; - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - XtVaSetValues(w, - XmNlistUpdated, res, - NULL); - (*env)->DeleteLocalRef(env, dir_o); - free(dir); -} - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_create - (JNIEnv *env, jobject this, jobject parent) -{ - struct FrameData *fdata; - struct CanvasData *wdata; - int32_t argc; -#define MAX_ARGC 20 - Arg args[MAX_ARGC]; - Widget child, textField, dirList, fileList; - XmString xim; - Pixel bg; - jobject target; - jstring file; - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; -#ifndef NOMODALFIX - extern void awt_shellPoppedUp(Widget shell, XtPointer c, XtPointer d); - extern void awt_shellPoppedDown(Widget shell, XtPointer c, XtPointer d); -#endif NOMODALFIX - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if (JNU_IsNull(env, parent) || JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - - adata = copyGraphicsConfigToPeer(env, this); - - wdata = (struct CanvasData *) JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData); - - fdata = ZALLOC(FrameData); - JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,fdata); - - if (fdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - XtVaGetValues(wdata->comp.widget, XmNbackground, &bg, NULL); - - /* - * XXX: this code uses FrameData but doesn't bother to init a lot - * of its memebers. This confuses the hell out of the code in - * awt_TopLevel.c that gets passes such half-inited FrameData. - */ - fdata->decor = MWM_DECOR_ALL; - - argc = 0; - XtSetArg(args[argc], XmNmustMatch, False); - argc++; - XtSetArg(args[argc], XmNautoUnmanage, False); - argc++; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNvisual, adata->awt_visInfo.visual); - argc++; - XtSetArg(args[argc], XmNdialogStyle, XmDIALOG_FULL_APPLICATION_MODAL); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, adata->awt_visInfo.screen)); - argc++; - XtSetArg(args[argc], XmNuserData, (XtPointer)globalRef); - 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)); - - fdata->winData.comp.widget = XmCreateFileSelectionDialog(wdata->shell, - "", - args, - argc); - fdata->winData.shell = XtParent(fdata->winData.comp.widget); - awt_util_mapChildren(fdata->winData.shell, changeBackground, 0, - (void *) bg); - child = XmFileSelectionBoxGetChild(fdata->winData.comp.widget, - XmDIALOG_HELP_BUTTON); - - /* We should save a pointer to the default search procedure - to do some things that we cannot do else. For instance, - apply the native pattern. - */ - XtVaGetValues(fdata->winData.comp.widget, - XmNfileSearchProc, &DefaultSearchProc, - NULL); - XtVaSetValues(fdata->winData.comp.widget, - XmNfileSearchProc, ourSearchProc, - NULL); - - /* - * Get textfield in FileDialog. - */ - textField = XmFileSelectionBoxGetChild(fdata->winData.comp.widget, - XmDIALOG_TEXT); - if (child != NULL) { - /* - * Workaround for Bug Id 4415659. - * If the dialog child is unmanaged before the dialog is managed, - * the Motif drop site hierarchy may be broken if we associate - * a drop target with the dialog before it is shown. - */ - XtSetMappedWhenManaged(fdata->winData.shell, False); - XtManageChild(fdata->winData.comp.widget); - XtUnmanageChild(fdata->winData.comp.widget); - XtSetMappedWhenManaged(fdata->winData.shell, True); - XtUnmanageChild(child); - } - if (!awtJNI_IsMultiFont(env, awtJNI_GetFont(env, this))) { - /* This process should not be done other than English language - locale. */ - child = XmFileSelectionBoxGetChild(fdata->winData.comp.widget, - XmDIALOG_DEFAULT_BUTTON); - if (child != NULL) { - XmString xim; - - switch ((*env)->GetIntField(env, target, fileDialogIDs.mode)) { - case java_awt_FileDialog_LOAD: - xim = XmStringCreate("Open", "labelFont"); - XtVaSetValues(child, XmNlabelString, xim, NULL); - XmStringFree(xim); - break; - - case java_awt_FileDialog_SAVE: - xim = XmStringCreate("Save", "labelFont"); - XtVaSetValues(child, XmNlabelString, xim, NULL); - XmStringFree(xim); - break; - - default: - break; - } - } - } - XtAddCallback(fdata->winData.comp.widget, - XmNokCallback, - (XtCallbackProc) FileDialog_OK, - (XtPointer) globalRef); - XtAddCallback(fdata->winData.comp.widget, - XmNcancelCallback, - (XtCallbackProc) FileDialog_CANCEL, - (XtPointer) globalRef); - -#ifndef NOMODALFIX - XtAddCallback(fdata->winData.shell, - XtNpopupCallback, - awt_shellPoppedUp, - NULL); - XtAddCallback(fdata->winData.shell, - XtNpopdownCallback, - awt_shellPoppedDown, - NULL); -#endif NOMODALFIX - - setDeleteCallback(globalRef, fdata); - - if (textField != NULL) { - /* - * Insert event handler to correctly process cut/copy/paste keys - * such that interaction with our own clipboard mechanism will work - * properly. - * - * The Text_handlePaste() event handler is also used by both - * TextField/TextArea. - */ - XtInsertEventHandler(textField, - KeyPressMask, - False, Text_handlePaste, (XtPointer) globalRef, - XtListHead); - } - - /* To get wheel scrolling, we add an event handler to the directory list and - * file list widgets to handle mouse wheels */ - dirList = XmFileSelectionBoxGetChild(fdata->winData.comp.widget, XmDIALOG_DIR_LIST); - if (dirList != NULL) { - XtAddEventHandler(dirList, ButtonPressMask, False, File_handleWheel, - (XtPointer) globalRef); - } - - fileList = XmFileSelectionBoxGetChild(fdata->winData.comp.widget, XmDIALOG_LIST); - if (fileList != NULL) { - XtAddEventHandler(fileList, ButtonPressMask, False, File_handleWheel, - (XtPointer) globalRef); - } - - file = (*env)->GetObjectField(env, target, fileDialogIDs.file); - if (JNU_IsNull(env, file)) { - setFSBDirAndFile(fdata->winData.comp.widget, ".", "", NULL, -1); - } else { - char *fileString; - - fileString = (char *) JNU_GetStringPlatformChars(env, file, NULL); - setFSBDirAndFile(fdata->winData.comp.widget, ".", fileString, NULL, -1); - JNU_ReleaseStringPlatformChars(env, file, (const char *) fileString); - } - AWT_UNLOCK(); -} - -/* Event handler for making scrolling happen when the mouse wheel is rotated */ -void File_handleWheel(Widget w, XtPointer client_data, XEvent* event, Boolean* cont) { - unsigned int btn; - Widget scrolledWindow = NULL; - - /* only registered for ButtonPress, so don't need to check event type */ - btn = event->xbutton.button; - /* wheel up and wheel down show up as button 4 and 5, respectively */ - if (btn == 4 || btn == 5) { - scrolledWindow = XtParent(w); - if (scrolledWindow == NULL) { - return; - } - awt_util_do_wheel_scroll(scrolledWindow, - java_awt_event_MouseWheelEvent_WHEEL_UNIT_SCROLL, - 3, - btn == 4 ? -1 : 1); - } -} - - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: pReshape - * Signature: (IIII)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_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.shell == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* GES: AVH's hack from awt_util.c: - * Motif ignores attempts to move a toplevel window to 0,0. - * Instead we set the position to 1,1. The expected value is - * returned by Frame.getBounds() since it uses the internally - * held rectangle rather than querying the peer. - */ - - if ((x == 0) && (y == 0)) { - XtVaSetValues(wdata->winData.shell, XmNx, 1, XmNy, 1, NULL); - } - XtVaSetValues(wdata->winData.shell, - XtNx, (XtArgVal) x, - XtNy, (XtArgVal) y, - NULL); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: pDispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_pDispose - (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; - } - XtUnmanageChild(wdata->winData.shell); - awt_util_consumeAllXEvents(wdata->winData.shell); - XtDestroyWidget(wdata->winData.shell); - free((void *) wdata); - JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,NULL); - awtJNI_DeleteGlobalRef(env, this); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: pShow - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_pShow - (JNIEnv *env, jobject this) -{ - struct FrameData *wdata; - XmString dirMask = NULL; - - 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; - } - XtManageChild(wdata->winData.comp.widget); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: pHide - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_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; - } - if (XtIsManaged(wdata->winData.comp.widget)) { - XtUnmanageChild(wdata->winData.comp.widget); - } - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: setFileEntry - * Signature: (Ljava/lang/String;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_setFileEntry - (JNIEnv *env, jobject this, jstring dir, jstring file, jobjectArray ffiles) -{ - struct ComponentData *cdata; - char *cdir; - char *cfile; - char *cf; - struct FrameData *wdata; - int32_t length, i; - XmString * files = NULL; - jstring jf; - - AWT_LOCK(); - wdata = (struct FrameData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (wdata == NULL || wdata->winData.comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - - cdir = (JNU_IsNull(env, dir)) - ? NULL - : (char *) JNU_GetStringPlatformChars(env, dir, NULL); - - cfile = (JNU_IsNull(env, file)) - ? NULL - : (char *) JNU_GetStringPlatformChars(env, file, NULL); - - if (ffiles != NULL) { - length = (*env)->GetArrayLength(env, ffiles); - files = (XmString*)calloc(length, sizeof(XmString)); - - for (i = 0; i < length; i++) { - jf = (jstring)(*env)->GetObjectArrayElement(env, ffiles, i); - cf = (char *) JNU_GetStringPlatformChars(env, jf, NULL); - - if ((*env)->GetStringLength(env, jf) == 0 && length == 1) { - length = 0; - files[0] = NULL; - } - else - files[i] = XmStringCreateLocalized(cf); - - if (cf) - JNU_ReleaseStringPlatformChars(env, jf, (const char *) cf); - } - - setFSBDirAndFile(wdata->winData.comp.widget, (cdir) ? cdir : "", - (cfile) ? cfile : "", files, length); - while(i > 0) { - XmStringFree(files[--i]); - } - if (files != NULL) { - free(files); - } - } - else - setFSBDirAndFile(wdata->winData.comp.widget, (cdir) ? cdir : "", - (cfile) ? cfile : "", NULL, -1); - - if (cdir) { - JNU_ReleaseStringPlatformChars(env, dir, (const char *) cdir); - } - - if (cfile) { - JNU_ReleaseStringPlatformChars(env, file, (const char *) cfile); - } - - AWT_FLUSH_UNLOCK(); -} - -static void -changeFont(Widget w, void *fontList) -{ - XtVaSetValues(w, XmNfontList, fontList, NULL); -} - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: setFont - * Signature: (Ljava/awt/Font;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_setFont - (JNIEnv *env, jobject this, jobject f) -{ - struct ComponentData *tdata; - struct FontData *fdata; - XmFontListEntry fontentry; - XmFontList fontlist; - char *err; - - if (JNU_IsNull(env, f)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - fdata = awtJNI_GetFontData(env, f, &err); - if (fdata == NULL) { - JNU_ThrowInternalError(env, err); - AWT_UNLOCK(); - return; - } - tdata = (struct ComponentData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (awtJNI_IsMultiFont(env, f)) { - if (fdata->xfs == NULL) { - fdata->xfs = awtJNI_MakeFontSet(env, f); - } - if (fdata->xfs != NULL) { - fontentry = XmFontListEntryCreate("labelFont", - XmFONT_IS_FONTSET, - (XtPointer) (fdata->xfs)); - fontlist = XmFontListAppendEntry(NULL, fontentry); - /* - * Some versions of motif have a bug in - * XmFontListEntryFree() which causes it to free more than it - * should. Use XtFree() instead. See O'Reilly's - * Motif Reference Manual for more information. - */ - XmFontListEntryFree(&fontentry); - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - - if (fontlist != NULL) { - /* setting the fontlist in the FileSelectionBox is not good enough -- - you have to set the resource for all the descendants individually */ - awt_util_mapChildren(tdata->widget, changeFont, 1, (void *)fontlist); - XmFontListFree(fontlist); - } else { - JNU_ThrowNullPointerException(env, "NullPointerException"); - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MFileDialogPeer - * Method: insertReplaceFileDialogText - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MFileDialogPeer_insertReplaceFileDialogText - (JNIEnv *env, jobject this, jstring l) -{ - struct ComponentData *cdata; - char *cl; - XmTextPosition start, end; - Widget textField; - jobject font; - - /* - * Replaces the text in the FileDialog's textfield with the passed - * string. - */ - - AWT_LOCK(); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - textField = XmFileSelectionBoxGetChild(cdata->widget, XmDIALOG_TEXT); - - if (textField == NULL) { - JNU_ThrowNullPointerException(env, "Null TextField in FileDialog"); - AWT_UNLOCK(); - return; - } - - font = awtJNI_GetFont(env, this); - - if (JNU_IsNull(env, l)) { - cl = NULL; - } else { - /* - * We use makePlatformCString() to convert unicode to EUC here, - * although output only components (Label/Button/Menu..) - * is not using make/allocCString() functions anymore. - * Because Motif TextFiled widget does not support multi-font - * compound string. - */ - - cl = (char *) JNU_GetStringPlatformChars(env, l, NULL); - } - - if (!XmTextGetSelectionPosition(textField, &start, &end)) { - start = end = XmTextGetInsertionPosition(textField); - } - XmTextReplace(textField, start, end, cl); - - if (cl != NULL && cl !="") { - JNU_ReleaseStringPlatformChars(env, l, cl); - } - AWT_FLUSH_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_GlobalCursorManager.c --- a/jdk/src/solaris/native/sun/awt/awt_GlobalCursorManager.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* - * Copyright 1999-2001 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 "awt_Component.h" -#include "sun_awt_motif_MComponentPeer.h" - -#include "jni.h" -#include "jni_util.h" - -static jfieldID xID; -static jfieldID yID; - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct ComponentIDs componentIDs; -extern struct ContainerIDs containerIDs; -extern jobject getCurComponent(); - -/* - * Class: sun_awt_motif_MGlobalCursorManager - * Method: cacheInit - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MGlobalCursorManager_cacheInit - (JNIEnv *env, jclass cls) -{ - jclass clsDimension = (*env)->FindClass(env, "java/awt/Point"); - xID = (*env)->GetFieldID(env, clsDimension, "x", "I"); - yID = (*env)->GetFieldID(env, clsDimension, "y", "I"); -} - -/* - * Class: sun_awt_motif_MGlobalCursorManager - * Method: getCursorPos - * Signature: (Ljava/awt/Point;)Ljava/awt/Component - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MGlobalCursorManager_getCursorPos - (JNIEnv *env, jobject this, jobject point) -{ - Window root, rw, cw; - int32_t rx, ry, x, y; - uint32_t kbs; - - AWT_LOCK(); - root = RootWindow(awt_display, DefaultScreen(awt_display)); - XQueryPointer(awt_display, root, &rw, &cw, &rx, &ry, &x, &y, &kbs); - - (*env)->SetIntField(env, point, xID, rx); - (*env)->SetIntField(env, point, yID, ry); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MGlobalCursorManager - * Method: getCursorPos - * Signature: ()Ljava/awt/Component - */ -JNIEXPORT jobject JNICALL Java_sun_awt_motif_MGlobalCursorManager_findHeavyweightUnderCursor - (JNIEnv *env, jobject this) -{ - jobject target; - - AWT_LOCK(); - target = getCurComponent(); - AWT_FLUSH_UNLOCK(); - return target; -} - -/* - * Class: sun_awt_motif_MGlobalCursorManager - * Method: getLocationOnScreen - * Signature: (Ljava/awt/Component;)Ljava/awt/Point - */ -JNIEXPORT jobject JNICALL Java_sun_awt_motif_MGlobalCursorManager_getLocationOnScreen - (JNIEnv *env, jobject this, jobject component) -{ - jobject point = - (*env)->CallObjectMethod(env, component, - componentIDs.getLocationOnScreen); - return point; -} - -/* - * Class: sun_awt_motif_MGlobalCursorManager - * Method: findComponentAt - * Signature: (Ljava/awt/Container;II)Ljava/awt/Component - */ -JNIEXPORT jobject JNICALL -Java_sun_awt_motif_MGlobalCursorManager_findComponentAt - (JNIEnv *env, jobject this, jobject container, jint x, jint y) -{ - /* - * Call private version of Container.findComponentAt with the following - * flag set: ignoreEnabled = false (i.e., don't return or recurse into - * disabled Components). - * NOTE: it may return a JRootPane's glass pane as the target Component. - */ - jobject component = - (*env)->CallObjectMethod(env, container, containerIDs.findComponentAt, - x, y, JNI_FALSE); - return component; -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_KeyboardFocusManager.c --- a/jdk/src/solaris/native/sun/awt/awt_KeyboardFocusManager.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,175 +0,0 @@ -/* - * Copyright 2000-2003 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 "jni.h" -#include "jni_util.h" - -#include "awt_KeyboardFocusManager.h" -#include "java_awt_KeyboardFocusManager.h" -#include "java_awt_event_FocusEvent.h" -#include "awt_Component.h" -#include "canvas.h" -#include "awt_MToolkit.h" - -extern struct MComponentPeerIDs mComponentPeerIDs; - -struct KeyboardFocusManagerIDs keyboardFocusManagerIDs; - -/* - * Class: java_awt_KeyboardFocusManager - * Method: initIDs - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_java_awt_KeyboardFocusManager_initIDs - (JNIEnv *env, jclass cls) -{ - jclass keyclass = NULL; - - keyboardFocusManagerIDs.keyboardFocusManagerCls = (jclass) - (*env)->NewGlobalRef(env, cls); - keyboardFocusManagerIDs.shouldNativelyFocusHeavyweightMID = - (*env)->GetStaticMethodID(env, cls, "shouldNativelyFocusHeavyweight", - "(Ljava/awt/Component;Ljava/awt/Component;ZZJLsun/awt/CausedFocusEvent$Cause;)I"); - keyboardFocusManagerIDs.heavyweightButtonDownMID = - (*env)->GetStaticMethodID(env, cls, "heavyweightButtonDown", - "(Ljava/awt/Component;J)V"); - keyboardFocusManagerIDs.heavyweightButtonDownZMID = - (*env)->GetStaticMethodID(env, cls, "heavyweightButtonDown", - "(Ljava/awt/Component;JZ)V"); - keyboardFocusManagerIDs.markClearGlobalFocusOwnerMID = - (*env)->GetStaticMethodID(env, cls, "markClearGlobalFocusOwner", - "()Ljava/awt/Window;"); - - keyboardFocusManagerIDs.processSynchronousTransferMID = - (*env)->GetStaticMethodID(env, cls, "processSynchronousLightweightTransfer", - "(Ljava/awt/Component;Ljava/awt/Component;ZZJ)Z"); - - keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent"); - DASSERT (keyclass != NULL); - - keyboardFocusManagerIDs.isProxyActive = - (*env)->GetFieldID(env, keyclass, "isProxyActive", - "Z"); - - (*env)->DeleteLocalRef(env, keyclass); - - DASSERT(keyboardFocusManagerIDs.keyboardFocusManagerCls != NULL); - DASSERT(keyboardFocusManagerIDs.shouldNativelyFocusHeavyweightMID != - NULL); - DASSERT(keyboardFocusManagerIDs.heavyweightButtonDownMID != NULL); - DASSERT(keyboardFocusManagerIDs.heavyweightButtonDownZMID != NULL); - DASSERT(keyboardFocusManagerIDs.markClearGlobalFocusOwnerMID != NULL); - DASSERT(keyboardFocusManagerIDs.processSynchronousTransferMID != NULL); -} - -/* - * Class: java_awt_KeyboardFocusManager - * Method: getNativeFocusOwner - * Signature: ()Ljava/awt/Component; - */ -JNIEXPORT jobject JNICALL -Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusOwner - (JNIEnv *env, jclass cls) -{ - jobject l_peer; - - AWT_LOCK(); - l_peer = awt_canvas_getFocusOwnerPeer(); - AWT_UNLOCK(); - - return (l_peer != NULL) - ? (*env)->GetObjectField(env, l_peer, mComponentPeerIDs.target) - : NULL; -} - -/* - * Class: java_awt_KeyboardFocusManager - * Method: getNativeFocusedWindow - * Signature: ()Ljava/awt/Window; - */ -JNIEXPORT jobject JNICALL -Java_sun_awt_KeyboardFocusManagerPeerImpl_getNativeFocusedWindow - (JNIEnv *env, jclass cls) -{ - jobject l_peer; - - AWT_LOCK(); - l_peer = awt_canvas_getFocusedWindowPeer(); - AWT_UNLOCK(); - - return (l_peer != NULL) - ? (*env)->GetObjectField(env, l_peer, mComponentPeerIDs.target) - : NULL; -} - -/* - * Class: java_awt_KeyboardFocusManager - * Method: clearGlobalFocusOwner - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_KeyboardFocusManagerPeerImpl_clearNativeGlobalFocusOwner - (JNIEnv *env, jobject self, jobject activeWindow) -{ - /* Redirect focus to the focus proxy of the active Window. The effect - we want is for the active Window to remain active, but for none of - its children to be the focus owner. AWT maintains state to know - that any key events delivered after this call (but before focus is - re-established elsewhere) get ignored. */ - - Widget proxy; - - if ((*env)->EnsureLocalCapacity(env, 1) < 0) { - return; - } - - AWT_LOCK(); - - if (activeWindow != NULL) { - // Setting focus owner to proxy will be equivalent to having - // null focus owner in Java layer while we will still be - // able to receive key events. - proxy = findWindowsProxy(activeWindow, env); - - if (proxy != NULL) { - Widget curFocusWidget = XmGetFocusWidget(proxy); - if (curFocusWidget != NULL) { - callFocusHandler(curFocusWidget, FocusOut, NULL); - } - - // Disable all but proxy widgets - processTree(curFocusWidget, proxy, False); - - XmProcessTraversal(proxy, XmTRAVERSE_CURRENT); - } - } - - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Label.c --- a/jdk/src/solaris/native/sun/awt/awt_Label.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -/* - * Copyright 1995-2001 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 "java_awt_Color.h" -#include "java_awt_Font.h" -#include "java_awt_Label.h" -#include "sun_awt_motif_MLabelPeer.h" -#include "sun_awt_motif_MComponentPeer.h" - -#include "awt_Component.h" - -#include "multi_font.h" -#include -#include - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -static char emptyString[] = ""; - - -/* - * Class: sun_awt_motif_MLabelPeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MLabelPeer_create - (JNIEnv *env, jobject this, jobject parent) -{ - struct ComponentData *cdata; - struct ComponentData *wdata; - jobject target; - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - AWT_LOCK(); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, parent, mComponentPeerIDs.pData); - - if (JNU_IsNull(env, target) || wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - cdata = ZALLOC(ComponentData); - if (cdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData,cdata); - - adata = copyGraphicsConfigToPeer(env, this); - - cdata->widget = XtVaCreateManagedWidget("", - xmLabelWidgetClass, wdata->widget, - XmNhighlightThickness, 0, - XmNalignment, XmALIGNMENT_BEGINNING, - XmNrecomputeSize, False, - XmNuserData, (XtPointer) globalRef, - XmNtraversalOn, True, - XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen), - XmNfontList, getMotifFontList(), - NULL); - XtSetMappedWhenManaged(cdata->widget, False); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MLabelPeer - * Method: setText - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MLabelPeer_setText - (JNIEnv *env, jobject this, jstring label) -{ - char *clabel = NULL; - char *clabelEnd; - struct ComponentData *cdata; - XmString xim = NULL; - jobject font; - Boolean isMultiFont; - - AWT_LOCK(); - - font = awtJNI_GetFont(env, this); - isMultiFont = awtJNI_IsMultiFont(env, font); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (JNU_IsNull(env, label)) { - clabel = emptyString; - } else { - if (isMultiFont) { - if ((*env)->GetStringLength(env, label) <= 0) { - xim = XmStringCreateLocalized(""); - } else { - xim = awtJNI_MakeMultiFontString(env, label, font); - } - } else { - clabel = (char *) JNU_GetStringPlatformChars(env, label, NULL); - - /* scan for any \n's and terminate the string at that point */ - clabelEnd = strchr(clabel, '\n'); - if (clabelEnd != NULL) { - *clabelEnd = '\0'; - } - } - } - - if (!isMultiFont) { - xim = XmStringCreate(clabel, "labelFont"); - } - XtVaSetValues(cdata->widget, XmNlabelString, xim, NULL); - - if (!isMultiFont) { - /* Must test for "" too! */ - if (clabel != NULL && (*clabel != '\0')) { - JNU_ReleaseStringPlatformChars(env, label, (const char *) clabel); - } - } - XmStringFree(xim); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MLabelPeer - * Method: setAlignment - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MLabelPeer_setAlignment - (JNIEnv *env, jobject this, jint alignment) -{ - struct ComponentData *cdata; - - AWT_LOCK(); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - switch (alignment) { - case java_awt_Label_LEFT: - XtVaSetValues(cdata->widget, - XmNalignment, XmALIGNMENT_BEGINNING, - NULL); - break; - - case java_awt_Label_CENTER: - XtVaSetValues(cdata->widget, - XmNalignment, XmALIGNMENT_CENTER, - NULL); - break; - - case java_awt_Label_RIGHT: - XtVaSetValues(cdata->widget, - XmNalignment, XmALIGNMENT_END, - NULL); - break; - - default: - break; - } - - AWT_FLUSH_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_List.c --- a/jdk/src/solaris/native/sun/awt/awt_List.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,600 +0,0 @@ -/* - * Copyright 1995-2003 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 "java_awt_List.h" -#include "java_awt_AWTEvent.h" -#include "sun_awt_motif_MListPeer.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "java_awt_event_MouseWheelEvent.h" -#include "canvas.h" - -#include "awt_Component.h" - -#include "multi_font.h" -#include -#include - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct ComponentIDs componentIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - - -/* - * client_data = MListPeer instance - */ -static void -Slist_callback(Widget w, XtPointer client_data, XtPointer call_data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - XmListCallbackStruct *cbs = (XmListCallbackStruct *) call_data; - - switch (cbs->reason) { - case XmCR_DEFAULT_ACTION: { - ConvertEventTimeAndModifiers converted; - - awt_util_convertEventTimeAndModifiers(cbs->event, &converted); - - if (cbs->event->type == KeyPress) { - /* When Default action comes from keyboard, no notification - * is given by motif that a selection has been made, even - * though, internally, the item will now be selected regardless - * of whether or not it was previously selected. ( on mouse - * generated DEFAULT ACTIONS the XmCR_BROWSE_SELECT is - * generated first ). - */ - JNU_CallMethodByName(env, NULL, (jobject) client_data - ,"handleListChanged" - ,"(I)V" - ,(cbs->item_position - 1)); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } - - JNU_CallMethodByName(env, NULL, (jobject) client_data - ,"action" - ,"(IJI)V" - ,(cbs->item_position - 1) - ,converted.when - ,converted.modifiers); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - break; - } - case XmCR_BROWSE_SELECT: - JNU_CallMethodByName(env, NULL, (jobject) client_data - ,"handleListChanged" - ,"(I)V" - ,(cbs->item_position - 1)); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - break; - - case XmCR_MULTIPLE_SELECT: - JNU_CallMethodByName(env, NULL, (jobject) client_data - ,"handleListChanged" - ,"(I)V" - ,(cbs->item_position - 1)); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - break; - - default: - break; - } -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_create - (JNIEnv *env, jobject this, jobject parent) -{ - Cardinal argc; -#define MAX_ARGC 40 - Arg args[MAX_ARGC]; - struct ComponentData *wdata; - struct ListData *sdata; - Pixel bg; - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - - AWT_LOCK(); - - adata = copyGraphicsConfigToPeer(env, this); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - wdata = (struct ComponentData *) JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData); - - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - sdata = (struct ListData *) calloc(1, sizeof(struct ListData)); - - JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,sdata); - if (sdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL); - argc = 0; - XtSetArg(args[argc], XmNrecomputeSize, False); - argc++; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNlistSizePolicy, XmCONSTANT); - argc++; - XtSetArg(args[argc], XmNx, 0); - argc++; - XtSetArg(args[argc], XmNy, 0); - argc++; - XtSetArg(args[argc], XmNmarginTop, 0); - argc++; - XtSetArg(args[argc], XmNmarginBottom, 0); - argc++; - XtSetArg(args[argc], XmNmarginLeft, 0); - argc++; - XtSetArg(args[argc], XmNmarginRight, 0); - argc++; - XtSetArg(args[argc], XmNmarginHeight, 0); - argc++; - XtSetArg(args[argc], XmNmarginWidth, 0); - argc++; - XtSetArg(args[argc], XmNlistMarginHeight, 0); - argc++; - XtSetArg(args[argc], XmNlistMarginWidth, 0); - argc++; - XtSetArg(args[argc], XmNscrolledWindowMarginWidth, 0); - argc++; - XtSetArg(args[argc], XmNscrolledWindowMarginHeight, 0); - argc++; - XtSetArg(args[argc], XmNuserData, (XtPointer) globalRef); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen)); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - sdata->list = XmCreateScrolledList(wdata->widget, - "slist", - args, - argc); - - sdata->comp.widget = XtParent(sdata->list); - XtSetMappedWhenManaged(sdata->comp.widget, False); - XtAddCallback(sdata->list, - XmNdefaultActionCallback, - Slist_callback, - (XtPointer) globalRef); - XtAddEventHandler(sdata->list, FocusChangeMask, - True, awt_canvas_event_handler, globalRef); - - awt_addWidget(sdata->list, sdata->comp.widget, globalRef, - java_awt_AWTEvent_KEY_EVENT_MASK | - java_awt_AWTEvent_MOUSE_EVENT_MASK | - java_awt_AWTEvent_MOUSE_MOTION_EVENT_MASK); - - XtManageChild(sdata->list); - XtManageChild(sdata->comp.widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: setMultipleSelections - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_setMultipleSelections - (JNIEnv *env, jobject this, jboolean v) -{ - struct ListData *sdata; - jobject globalRef; - int32_t selPos; - Boolean selected; - - AWT_LOCK(); - - sdata = (struct ListData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - globalRef = (jobject) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.jniGlobalRef); - if (v == JNI_FALSE) { - XtVaSetValues(sdata->list, - XmNselectionPolicy, XmBROWSE_SELECT, - NULL); - XtRemoveCallback(sdata->list, - XmNmultipleSelectionCallback, - Slist_callback, - (XtPointer) globalRef); - XtAddCallback(sdata->list, - XmNbrowseSelectionCallback, - Slist_callback, - (XtPointer) globalRef); - - // If we change the selection mode from multiple to single - // we need to decide what the item should be selected: - // If a selected item has the location cursor, only that - // item will remain selected. If no selected item has the - // location cursor, all items will be deselected. - selPos = XmListGetKbdItemPos(sdata->list); - selected = XmListPosSelected(sdata->list, selPos); - XmListDeselectAllItems(sdata->list); - if (selected) { - Java_sun_awt_motif_MListPeer_select(env, this, selPos-1); - } - - } else { - XtVaSetValues(sdata->list, - XmNselectionPolicy, XmMULTIPLE_SELECT, - NULL); - XtRemoveCallback(sdata->list, - XmNbrowseSelectionCallback, - Slist_callback, - (XtPointer) globalRef); - XtAddCallback(sdata->list, - XmNmultipleSelectionCallback, - Slist_callback, - (XtPointer) globalRef); - } - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: setBackground - * Signature: (Ljava/awt/Color;)V - */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_setBackground - (JNIEnv *env, jobject this, jobject c) -{ - struct ListData *ldata; - Pixel color; - - if (JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - ldata = (struct ListData *) - JNU_GetLongFieldAsPtr(env,this, mComponentPeerIDs.pData); - if (ldata == NULL || ldata->list == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - color = awtJNI_GetColor(env, c); - XtVaSetValues(ldata->list, - XmNbackground, color, - NULL); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: isSelected - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_sun_awt_motif_MListPeer_isSelected - (JNIEnv *env, jobject this, jint pos) -{ - struct ListData *sdata; - - AWT_LOCK(); - - sdata = (struct ListData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return JNI_FALSE; - } - pos++; - if (XmListPosSelected(sdata->list, pos) == True) { - AWT_UNLOCK(); - return JNI_TRUE; - } else { - AWT_UNLOCK(); - return JNI_FALSE; - } -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: addItem - * Signature: (Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_addItem - (JNIEnv *env, jobject this, jstring item, jint index) -{ - XmString im; - struct ListData *sdata; - jobject font; - - /* - * Note: - * There used to be code in this function to fix: - * 4067355 size of listbox depends on when pack() is called (solaris) - * The fix (for jdk1.1.7) involved unmapping the List widget before the add - * is done and resizing/remapping it after the add. This causes significant - * performance degradation if addItem() is called a lot. A bug was filed - * on this performance problem: 4117288 - * The fix was backed out after testing that: - * - the problem reported in 4067355 was no longer reproducible - * - the performance problem is gone - */ - - AWT_LOCK(); - if (JNU_IsNull(env, item)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - sdata = (struct ListData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - font = awtJNI_GetFont(env, this); - - if (awtJNI_IsMultiFont(env, font)) { - im = awtJNI_MakeMultiFontString(env, item, font); - } else { - char *temp; - - temp = (char *) JNU_GetStringPlatformChars(env, item, NULL); - im = XmStringCreateLocalized(temp); - JNU_ReleaseStringPlatformChars(env, item, (const char *)temp); - } - - /* motif uses 1-based indeces for the list operations with 0 */ - /* referring to the last item on the list. Thus if index is -1 */ - /* then we'll get the right effect of adding to the end of the */ - /* list. */ - index++; - - XmListAddItemUnselected(sdata->list, im, index); - XmStringFree(im); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: delItems - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_delItems - (JNIEnv *env, jobject this, jint start, jint end) -{ - struct ListData *sdata; - Boolean was_mapped; - jobject target; - Position width, height; - int32_t itemCount; - - AWT_LOCK(); - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - if (JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - sdata = (struct ListData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* [jk] catch bogus indexes (Sun bug) */ - XtVaGetValues(sdata->list, XmNitemCount, &itemCount, NULL); - if (itemCount == 0) { - AWT_UNLOCK(); - return; - } - if (start > itemCount) { - start = itemCount; - } - if (end > itemCount) { - end = itemCount; - } - start++; - end++; - - XtVaGetValues(sdata->comp.widget, XmNmappedWhenManaged, &was_mapped, NULL); - - /* If it was visible, then make it invisible while we update */ - if (was_mapped) { - XtSetMappedWhenManaged(sdata->comp.widget, False); - } - - if (start == end) { - XmListDeletePos(sdata->list, start); - } else { - XmListDeleteItemsPos(sdata->list, end - start + 1, start); - } - - width = (*env)->GetIntField(env, target, componentIDs.width); - height = (*env)->GetIntField(env, target, componentIDs.height); - XtVaSetValues(sdata->comp.widget, - XmNwidth, (width > 1) ? width-1 : 1, - XmNheight, (height > 1) ? height-1 : 1, - NULL); - XtVaSetValues(sdata->comp.widget, - XmNwidth, (width > 0) ? width : 1, - XmNheight, (height > 0) ? height : 1, - NULL); - /* If it was visible, then make it visible again once updated */ - if (was_mapped) { - XtSetMappedWhenManaged(sdata->comp.widget, True); - } - - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: pSelect - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_select - (JNIEnv *env, jobject this, jint pos) -{ - struct ListData *sdata; - - AWT_LOCK(); - sdata = (struct ListData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - pos++; - XmListSelectPos(sdata->list, pos, False); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: pDeselect - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_deselect - (JNIEnv *env, jobject this, jint pos) -{ - struct ListData *sdata; - - AWT_LOCK(); - sdata = (struct ListData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - pos++; - XmListDeselectPos(sdata->list, pos); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: makeVisible - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_makeVisible - (JNIEnv *env, jobject this, jint pos) -{ - int32_t top, visible; - struct ListData *sdata; - - AWT_LOCK(); - sdata = (struct ListData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtVaGetValues(sdata->list, - XmNtopItemPosition, &top, - XmNvisibleItemCount, &visible, - NULL); - pos++; - if (pos < top) { - XmListSetPos(sdata->list, pos); - } else { - XmListSetBottomPos(sdata->list, pos); - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MListPeer - * Method: nativeHandleMouseWheel - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MListPeer_nativeHandleMouseWheel - (JNIEnv *env, jobject this, jint scrollType, jint scrollAmt, jint wheelAmt) -{ - struct ListData *ldata; - Widget list = NULL; - Widget scroll = NULL; - - AWT_LOCK(); - ldata = (struct ListData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (ldata == NULL || ldata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - // get the List widget - list = ldata->list; - if (list == NULL) { - AWT_UNLOCK(); - return; - } - - // get the ScrolledWindow - scroll = XtParent(list); - if (scroll == NULL) { - AWT_UNLOCK(); - return; - } - - awt_util_do_wheel_scroll(scroll, scrollType, scrollAmt, wheelAmt); - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_MToolkit.c --- a/jdk/src/solaris/native/sun/awt/awt_MToolkit.c Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/native/sun/awt/awt_MToolkit.c Mon Aug 25 13:58:15 2008 -0700 @@ -48,7 +48,7 @@ /* JNI field and method ids */ #include "awt_Component.h" -#include "awt_Cursor.h" +//#include "awt_Cursor.h" #include "awt_MenuComponent.h" #include "awt_TopLevel.h" #include "canvas.h" diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Menu.c --- a/jdk/src/solaris/native/sun/awt/awt_Menu.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,407 +0,0 @@ -/* - * Copyright 1995-2004 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 "color.h" -#include "java_awt_Menu.h" -#include "sun_awt_motif_MMenuPeer.h" -#include "java_awt_MenuBar.h" -#include "sun_awt_motif_MMenuBarPeer.h" - -#include "awt_MenuBar.h" -#include "awt_MenuComponent.h" -#include "awt_MenuItem.h" -#include "awt_Menu.h" - -#include "multi_font.h" -#include -#include -#include - -extern struct MenuComponentIDs menuComponentIDs; -extern struct MenuItemIDs menuItemIDs; -extern struct MMenuItemPeerIDs mMenuItemPeerIDs; -extern struct MMenuBarPeerIDs mMenuBarPeerIDs; - -struct MenuIDs menuIDs; - -/* - * Class: java_awt_Menu - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - Menu.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL Java_java_awt_Menu_initIDs - (JNIEnv *env, jclass cls) -{ - menuIDs.tearOff = (*env)->GetFieldID(env, cls, "tearOff", "Z"); - menuIDs.isHelpMenu = (*env)->GetFieldID(env, cls, "isHelpMenu", "Z"); -} - -/* - * Fix for Bug Traq 4251941 - segfault after double tear-off and close - * Removes the lost callback from menu item on tear-off control re-creation. - * Only for internal use, to be used from awtTearOffActivatedCallback - */ -static void awtTearOffShellDestroy(Widget widget, XtPointer closure, XtPointer data) { - if (widget != NULL ) { - XtSetKeyboardFocus(widget, NULL); - } -} - -/* - * Fix for Bug Traq 4251941 - segfault after double tear-off and close - * This callback is added to menu after the creation. - * It adds the destroy callback awtTearOffShellDestroy to remove the lost focus callback on destroy - */ -static void awtTearOffActivatedCallback(Widget widget, XtPointer closure, XtPointer data) { - Widget shell; - shell = XtParent(widget); - if (shell != NULL && XtClass(shell) == transientShellWidgetClass) { - XtAddCallback(shell, XtNdestroyCallback, awtTearOffShellDestroy, widget); - } -} - -extern Boolean skipNextNotifyWhileGrabbed; - -static void -Menu_popDownCB(Widget w, XtPointer client_data, XtPointer calldata) -{ - skipNextNotifyWhileGrabbed = True; -} - - - -/* - * this is a MMenuPeer instance - */ -static void -awtJNI_CreateMenu(JNIEnv * env, jobject this, Widget menuParent) -{ - int32_t argc; -#define MAX_ARGC 10 - Arg args[MAX_ARGC]; - char *ctitle = NULL; - struct MenuData *mdata; - struct FontData *fdata; - Pixel bg; - Pixel fg; - XmFontList fontlist = NULL; - Widget tearOff; - XmString mfstr = NULL; - XmString str = NULL; - jobject target; - jobject targetFont; - jobject label; - jobject font; - jboolean IsMultiFont; - jboolean isTearOff; - - /* perhaps this is unncessary, if awtJNI_CreateMenu is only called - * from a native method. - */ - if ((*env)->PushLocalFrame(env, (jint)16) < (jint)0) { - return; - } - - fdata = NULL; - - target = (*env)->GetObjectField(env, this, mMenuItemPeerIDs.target); - if (JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - (*env)->PopLocalFrame(env, NULL); - return; - } - font = JNU_CallMethodByName(env, NULL, target, "getFont_NoClientCode", - "()Ljava/awt/Font;").l; - - mdata = ZALLOC(MenuData); - JNU_SetLongFieldFromPtr(env, this, mMenuItemPeerIDs.pData, mdata); - if (mdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - (*env)->PopLocalFrame(env, NULL); - return; - } - targetFont = (*env)->GetObjectField(env, target, menuComponentIDs.font); - if (!JNU_IsNull(env, targetFont) && - (fdata = awtJNI_GetFontData(env, targetFont, NULL)) != NULL) { - IsMultiFont = awtJNI_IsMultiFont(env, targetFont); - } else { - IsMultiFont = awtJNI_IsMultiFont(env, font); - } - - label = (*env)->GetObjectField(env, target, menuItemIDs.label); - if (JNU_IsNull(env, label)) { - mfstr = XmStringCreateLocalized(""); - ctitle = ""; - } else { - if (IsMultiFont) { - mfstr = awtJNI_MakeMultiFontString(env, label, font); - } else { - ctitle = (char *) JNU_GetStringPlatformChars(env, label, NULL); - } - } - - XtVaGetValues(menuParent, XmNbackground, &bg, NULL); - XtVaGetValues(menuParent, XmNforeground, &fg, NULL); - - argc = 0; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - - XtSetArg(args[argc], XmNlabelFontList, getMotifFontList()); - argc++; - XtSetArg(args[argc], XmNbuttonFontList, getMotifFontList()); - argc++; - - isTearOff = (*env)->GetBooleanField(env, target, menuIDs.tearOff); - - if (isTearOff) { - XtSetArg(args[argc], XmNtearOffModel, XmTEAR_OFF_ENABLED); - argc++; - } - - if (IsMultiFont) { - DASSERT(!(argc > MAX_ARGC)); - mdata->itemData.comp.widget = XmCreatePulldownMenu(menuParent, - "", - args, - argc); - } else { - DASSERT(!(argc > MAX_ARGC)); - mdata->itemData.comp.widget = XmCreatePulldownMenu(menuParent, - ctitle, - args, - argc); - } - awt_addMenuWidget(mdata->itemData.comp.widget); - - if (isTearOff) { - tearOff = XmGetTearOffControl(mdata->itemData.comp.widget); - XtVaSetValues(tearOff, - XmNbackground, bg, - XmNforeground, fg, - XmNhighlightColor, fg, - NULL); - XtAddCallback(mdata->itemData.comp.widget, XmNtearOffMenuActivateCallback, - awtTearOffActivatedCallback, NULL); - } - argc = 0; - XtSetArg(args[argc], XmNsubMenuId, mdata->itemData.comp.widget); - argc++; - - if (IsMultiFont) { - XtSetArg(args[argc], XmNlabelString, mfstr); - } else { - str = XmStringCreate(ctitle, XmSTRING_DEFAULT_CHARSET); - XtSetArg(args[argc], XmNlabelString, str); - } - argc++; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - - if (!JNU_IsNull(env, targetFont) && (fdata != NULL)) { - if (IsMultiFont) { - fontlist = awtJNI_GetFontList(env, targetFont); - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - XtSetArg(args[argc], XmNfontList, fontlist); - argc++; - } else { - if (IsMultiFont) { - fontlist = awtJNI_GetFontList(env, font); - XtSetArg(args[argc], XmNfontList, fontlist); - argc++; - } - } - - if (IsMultiFont) { - DASSERT(!(argc > MAX_ARGC)); - mdata->comp.widget = XmCreateCascadeButton(menuParent, "", args, argc); - } else { - DASSERT(!(argc > MAX_ARGC)); - mdata->comp.widget = XmCreateCascadeButton(menuParent, ctitle, args, argc); - } - - if ((*env)->GetBooleanField(env, target, menuIDs.isHelpMenu)) { - XtVaSetValues(menuParent, - XmNmenuHelpWidget, mdata->comp.widget, - NULL); - } - - /** - * Add callback to MenuShell of the menu so we know when - * menu pops down. mdata->itemData.comp.widget is RowColumn, - * its parent - MenuShell. - */ - XtAddCallback(XtParent(mdata->itemData.comp.widget), XtNpopdownCallback, - Menu_popDownCB, - (XtPointer) - JNU_GetLongFieldAsPtr(env, this, - mMenuItemPeerIDs.jniGlobalRef)); - - /* - * Free resources - */ - if (!JNU_IsNull(env, targetFont)) { - XmFontListFree(fontlist); - } - - if (mfstr != NULL) { - XmStringFree(mfstr); - mfstr = NULL; - } - - if (str) { - XmStringFree(str); - str = NULL; - } - - XtManageChild(mdata->comp.widget); - XtSetSensitive(mdata->comp.widget, - (*env)->GetBooleanField(env, target, menuItemIDs.enabled) ? - True : False); - - if (ctitle != NULL && ctitle != "") { - JNU_ReleaseStringPlatformChars(env, label, (const char *) ctitle); - } - (*env)->PopLocalFrame(env, NULL); -} - - -/* - * Class: sun_awt_motif_MMenuPeer - * Method: createMenu - * Signature: (Lsun/awt/motif/MMenuBarPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuPeer_createMenu - (JNIEnv *env, jobject this, jobject parent) -{ - struct ComponentData *mbdata; - AwtGraphicsConfigDataPtr adata; - - AWT_LOCK(); - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - mbdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, parent, mMenuBarPeerIDs.pData); - if (mbdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - awtJNI_CreateMenu(env, this, mbdata->widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MMenuPeer - * Method: createSubMenu - * Signature: (Lsun/awt/motif/MMenuPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuPeer_createSubMenu -(JNIEnv *env, jobject this, jobject parent) -{ - struct MenuData *mpdata; - AwtGraphicsConfigDataPtr adata; - - AWT_LOCK(); - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - mpdata = (struct MenuData *) - JNU_GetLongFieldAsPtr(env, parent, mMenuItemPeerIDs.pData); - if (mpdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - awtJNI_CreateMenu(env, this, mpdata->itemData.comp.widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MMenuPeer - * Method: pDispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuPeer_pDispose - (JNIEnv *env, jobject this) -{ - struct MenuData *mdata; - Widget parent; - Boolean isParentManaged = False; - - AWT_LOCK(); - - mdata = (struct MenuData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - if (mdata == NULL) { - AWT_UNLOCK(); - return; - } - awt_delMenuWidget(mdata->itemData.comp.widget); - XtUnmanageChild(mdata->comp.widget); - awt_util_consumeAllXEvents(mdata->itemData.comp.widget); - awt_util_consumeAllXEvents(mdata->comp.widget); - - parent = XtParent(mdata->itemData.comp.widget); - if (parent != NULL && XtIsManaged(parent)) { - isParentManaged = True; - XtUnmanageChild(parent); - } - - XtDestroyWidget(mdata->itemData.comp.widget); - - if (isParentManaged) { - XtManageChild(parent); - } - - XtDestroyWidget(mdata->comp.widget); - free((void *) mdata); - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Menu.h --- a/jdk/src/solaris/native/sun/awt/awt_Menu.h Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -/* - * Copyright 1998 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. - */ - -#include - -/* fieldIDs for Menu fields that may be accessed from C */ -struct MenuIDs { - jfieldID tearOff; - jfieldID isHelpMenu; -}; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_MenuBar.c --- a/jdk/src/solaris/native/sun/awt/awt_MenuBar.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,198 +0,0 @@ -/* - * Copyright 1995-2004 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 "java_awt_MenuBar.h" -#include "sun_awt_motif_MMenuBarPeer.h" -#include "java_awt_Menu.h" -#include "java_awt_Frame.h" -#include "sun_awt_motif_MFramePeer.h" - -#include "awt_GraphicsEnv.h" -#include "awt_MenuBar.h" -#include "awt_Component.h" - -#include -#include - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; -struct MMenuBarPeerIDs mMenuBarPeerIDs; - -/* - * Class: sun_awt_motif_MMenuBarPeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for MMenuBarPeer.java - to initialize the fieldIDs fields that may be accessed from C */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MMenuBarPeer_initIDs - (JNIEnv *env, jclass cls) -{ - mMenuBarPeerIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J"); - mMenuBarPeerIDs.graphicsConfig = - (*env)->GetFieldID(env, cls, "graphicsConfig", - "Lsun/awt/X11GraphicsConfig;"); -} - -static AwtGraphicsConfigDataPtr -copyGraphicsConfigToMenuBarPeer( -JNIEnv *env, jobject frame, jobject thisMenuBar) { - - jobject gc_object; - AwtGraphicsConfigDataPtr adata; - - /* GraphicsConfiguration object of Component */ - gc_object = (*env)->GetObjectField(env, frame, - mComponentPeerIDs.graphicsConfig); - - if (gc_object != NULL) { - /* Set graphicsConfig field of MComponentPeer */ - (*env)->SetObjectField (env, thisMenuBar, - mMenuBarPeerIDs.graphicsConfig, - gc_object); - adata = (AwtGraphicsConfigDataPtr) - JNU_GetLongFieldAsPtr(env, gc_object, - x11GraphicsConfigIDs.aData); - } else { - /* Component was not constructed with a GraphicsConfiguration - object */ - adata = getDefaultConfig(DefaultScreen(awt_display)); - } - - return adata; -} - -AwtGraphicsConfigDataPtr -getGraphicsConfigFromMenuBarPeer(JNIEnv *env, jobject menubarPeer) { - - jobject gc_object; - AwtGraphicsConfigDataPtr adata; - - /* GraphicsConfiguration object of Component */ - gc_object = (*env)->GetObjectField(env, menubarPeer, - mMenuBarPeerIDs.graphicsConfig); - - if (gc_object != NULL) { - adata = (AwtGraphicsConfigDataPtr) - JNU_GetLongFieldAsPtr(env, gc_object, - x11GraphicsConfigIDs.aData); - } else { - adata = getDefaultConfig(DefaultScreen(awt_display)); - } - - return adata; -} - -/* - * Class: sun_awt_motif_MMenuBarPeer - * Method: create - * Signature: (Lsun/awt/motif/MFramePeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuBarPeer_create - (JNIEnv * env, jobject this, jobject frame) -{ -#define MAX_ARGC 20 - Arg args[MAX_ARGC]; - int32_t argc; - struct ComponentData *mdata; - struct FrameData *wdata; - Pixel bg; - Pixel fg; - AwtGraphicsConfigDataPtr adata; - - if (JNU_IsNull(env, frame)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - wdata = (struct FrameData *) - JNU_GetLongFieldAsPtr(env, frame, mComponentPeerIDs.pData); - mdata = ZALLOC(ComponentData); - - if (wdata == NULL || mdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - JNU_SetLongFieldFromPtr(env, this, mMenuBarPeerIDs.pData, mdata); - - adata = copyGraphicsConfigToMenuBarPeer(env, frame, this); - - XtVaGetValues(wdata->winData.comp.widget, - XmNbackground, &bg, - XmNforeground, &fg, - NULL); - - argc = 0; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen)); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - mdata->widget = XmCreateMenuBar(wdata->mainWindow, "menu_bar", args, argc); - awt_addMenuWidget(mdata->widget); - XtSetMappedWhenManaged(mdata->widget, False); - XtManageChild(mdata->widget); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MMenuBarPeer - * Method: dispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuBarPeer_pDispose - (JNIEnv * env, jobject this) -{ - struct ComponentData *mdata; - - AWT_LOCK(); - - /*hania LOOK HERE does this make sense? look at original code */ - mdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mMenuBarPeerIDs.pData); - if (mdata == NULL) { - AWT_UNLOCK(); - return; - } - awt_delMenuWidget(mdata->widget); - XtUnmanageChild(mdata->widget); - awt_util_consumeAllXEvents(mdata->widget); - XtDestroyWidget(mdata->widget); - free((void *) mdata); - (*env)->SetLongField(env, this, mMenuBarPeerIDs.pData, (jlong)0); - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_MenuBar.h --- a/jdk/src/solaris/native/sun/awt/awt_MenuBar.h Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright 1998-1999 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. - */ - -/* fieldIDs for MMenuBarPeer fields that may be accessed from C */ -struct MMenuBarPeerIDs { - jfieldID pData; - jfieldID graphicsConfig; -}; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_MenuComponent.c --- a/jdk/src/solaris/native/sun/awt/awt_MenuComponent.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/* - * Copyright 1998-2006 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 "java_awt_MenuComponent.h" -#include "jni_util.h" - -#include "awt_MenuComponent.h" - -struct MenuComponentIDs menuComponentIDs; - - -JNIEXPORT void JNICALL -Java_java_awt_MenuComponent_initIDs(JNIEnv *env, jclass cls) -{ - menuComponentIDs.font = - (*env)->GetFieldID(env, cls, "font", "Ljava/awt/Font;"); - menuComponentIDs.appContext = - (*env)->GetFieldID(env, cls, "appContext", "Lsun/awt/AppContext;"); - menuComponentIDs.getParent = - (*env)->GetMethodID( - env, cls, "getParent_NoClientCode", "()Ljava/awt/MenuContainer;"); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_MenuItem.c --- a/jdk/src/solaris/native/sun/awt/awt_MenuItem.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,654 +0,0 @@ -/* - * Copyright 1995-2004 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 -#include "java_awt_MenuItem.h" -#include "sun_awt_motif_MMenuItemPeer.h" -#include "sun_awt_motif_MCheckboxMenuItemPeer.h" -#include "java_awt_Menu.h" -#include "sun_awt_motif_MMenuPeer.h" - -#include "awt_MenuComponent.h" -#include "awt_MenuItem.h" - -#include "multi_font.h" -#include -#include -#include - -extern struct MenuComponentIDs menuComponentIDs; - -/* fieldIDs for MenuItem fields that may be accessed from C */ -struct MenuItemIDs menuItemIDs; - -/* - * Class: java_awt_MenuItem - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MenuItem.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL Java_java_awt_MenuItem_initIDs - (JNIEnv *env, jclass cls) -{ - menuItemIDs.label = - (*env)->GetFieldID(env, cls, "label", "Ljava/lang/String;"); - menuItemIDs.enabled = - (*env)->GetFieldID(env, cls, "enabled", "Z"); - menuItemIDs.shortcut = - (*env)->GetFieldID(env, cls, "shortcut", "Ljava/awt/MenuShortcut;"); -} - -/* fieldIDs for MMenuItemPeer fields that may be accessed from C */ -struct MMenuItemPeerIDs mMenuItemPeerIDs; - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MMenuItemPeer.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuItemPeer_initIDs - (JNIEnv *env, jclass cls) -{ - mMenuItemPeerIDs.target = - (*env)->GetFieldID(env, cls, "target", "Ljava/awt/MenuItem;"); - mMenuItemPeerIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J"); - mMenuItemPeerIDs.isCheckbox = - (*env)->GetFieldID(env, cls, "isCheckbox", "Z"); - mMenuItemPeerIDs.jniGlobalRef = - (*env)->GetFieldID(env, cls, "jniGlobalRef", "J"); -} - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: getParent_NoClientCode - * Signature: (Ljava/awt/MenuComponent;)Ljava/awt/MenuContainer; - * - * Gets the MenuContainer parent of this object, without executing client - * code (e.g., no code in subclasses will be executed). - */ -JNIEXPORT jobject JNICALL Java_sun_awt_motif_MMenuItemPeer_getParent_1NoClientCode - (JNIEnv *env, jclass thisClass, jobject menuComponent) -{ - jobject parent = NULL; - - /* getParent is actually getParent_NoClientCode() */ - parent = (*env)->CallObjectMethod( - env,menuComponent,menuComponentIDs.getParent); - DASSERT(!((*env)->ExceptionOccurred(env))); - return parent; -} - -/* - * client_data is MMenuItemPeer instance pointer - */ -static void -MenuItem_selected(Widget w, XtPointer client_data, XmAnyCallbackStruct * s) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject) client_data; - ConvertEventTimeAndModifiers converted; - - awt_util_convertEventTimeAndModifiers(s->event, &converted); - - if ((*env)->GetBooleanField(env, this, mMenuItemPeerIDs.isCheckbox)) { - jboolean state; - struct MenuItemData *mdata; - - mdata = (struct MenuItemData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - - if (mdata != NULL) { - XtVaGetValues(mdata->comp.widget, XmNset, &state, NULL); - - JNU_CallMethodByName(env, NULL, this - ,"action" - ,"(JIZ)V" - ,converted.when, converted.modifiers, - state); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } - } else { - JNU_CallMethodByName(env, NULL, this, "action", "(JI)V", - converted.when, converted.modifiers); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } -} - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: createMenuItem - * Signature: (Lsun/awt/motif/MMenuPeer;)V - * - * ASSUMES: This function is never called by a privileged thread - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuItemPeer_createMenuItem( -JNIEnv *env, jobject this, jobject parent) -{ - int32_t argc; -#define MAX_ARGC 20 - Arg args[MAX_ARGC]; - char *clabel; - struct MenuData *menuData; - struct MenuItemData *mdata; - struct FontData *fdata; - Pixel bg; - Pixel fg; - XmFontList fontlist = NULL; - jobject target; - jobject targetFont; - XmString mfstr = NULL; - XmString shortcut_str = NULL; - XmString str = NULL; - jobject font; - jobject shortcut; - jboolean IsMultiFont; - jboolean isCheckbox; - jstring label; - jobject globalRef = (*env)->NewGlobalRef(env, this); - const jchar *unicodeLabel = NULL; - jsize unicodeLabelLen = 0; - jboolean isCopy = JNI_FALSE; - - // We call client code on this thread, so it must *NOT* be privileged - DASSERT(!awt_currentThreadIsPrivileged(env)); - - JNU_SetLongFieldFromPtr(env, this, mMenuItemPeerIDs.jniGlobalRef, - globalRef); - - fdata = NULL; - - fflush(stderr); - target = - (*env)->GetObjectField(env, this, mMenuItemPeerIDs.target); - if (JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - font = JNU_CallMethodByName(env, NULL, target, "getFont_NoClientCode", - "()Ljava/awt/Font;").l; - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - menuData = (struct MenuData *) - JNU_GetLongFieldAsPtr(env, parent, mMenuItemPeerIDs.pData); - - targetFont = - (*env)->GetObjectField(env, target, menuComponentIDs.font); - if (!JNU_IsNull(env, targetFont) && - (fdata = awtJNI_GetFontData(env, targetFont, NULL)) != NULL) { - IsMultiFont = awtJNI_IsMultiFont(env, targetFont); - } else { - IsMultiFont = awtJNI_IsMultiFont(env, font); - } - - label = (*env)->GetObjectField(env, target, menuItemIDs.label); - if (JNU_IsNull(env, label) || ((*env)->GetStringLength (env, label) == 0)) { - mfstr = XmStringCreateLocalized(""); - clabel = ""; - } else { - if (IsMultiFont) { - mfstr = awtJNI_MakeMultiFontString(env, label, font); - } else { - mfstr = XmStringCreateLocalized(""); - } - clabel = (char *) JNU_GetStringPlatformChars(env, label, NULL); - } - - mdata = ZALLOC(MenuItemData); - JNU_SetLongFieldFromPtr(env, this, mMenuItemPeerIDs.pData, mdata); - - argc = 0; - XtSetArg(args[argc], XmNbackground, &bg); - argc++; - XtSetArg(args[argc], XmNforeground, &fg); - argc++; - XtGetValues(menuData->itemData.comp.widget, args, argc); - - argc = 0; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - - /* check if the label is "-" but don't use strcmp(clabel, "-") because - * the high-order bytes in the unicode characters are not present in - * the C string (bugid 4099695) - */ - if (!JNU_IsNull(env, label)) { - unicodeLabel = (*env)->GetStringChars(env, label, &isCopy); - unicodeLabelLen = (*env)->GetStringLength(env, label); - } - if ((unicodeLabel != NULL) && (unicodeLabel[0] == '-') && - (unicodeLabelLen == 1)) { - DASSERT(!(argc > MAX_ARGC)); - mdata->comp.widget = XmCreateSeparator(menuData->itemData.comp.widget, - "", args, argc); - } else { - if (IsMultiFont) { - XtSetArg(args[argc], XmNlabelString, mfstr); - } else { - str = XmStringCreate(clabel, XmSTRING_DEFAULT_CHARSET); - XtSetArg(args[argc], XmNlabelString, str); - } - argc++; - - shortcut = - (*env)->GetObjectField(env, target, menuItemIDs.shortcut); - if (!JNU_IsNull(env, shortcut)) { - jstring shortcutText; - char *text = ""; - - shortcutText = JNU_CallMethodByName(env, NULL, shortcut, - "toString", - "()Ljava/lang/String;").l; - - if (!JNU_IsNull(env, shortcutText)) { - text = (char *) JNU_GetStringPlatformChars(env, shortcutText, NULL); - } - shortcut_str = XmStringCreate(text, XmSTRING_DEFAULT_CHARSET); - XtSetArg(args[argc], XmNacceleratorText, shortcut_str); - - argc++; - - if (!JNU_IsNull(env, shortcutText)) { - JNU_ReleaseStringPlatformChars(env, shortcutText, (const char *) text); - } - } - if (!JNU_IsNull(env, targetFont) && (fdata != NULL)) { - if (IsMultiFont) { - fontlist = awtJNI_GetFontList(env, targetFont); - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - XtSetArg(args[argc], XmNfontList, fontlist); - argc++; - } else { - if (IsMultiFont) { - fontlist = awtJNI_GetFontList(env, font); - XtSetArg(args[argc], XmNfontList, fontlist); - argc++; - } - } - - isCheckbox = - (*env)->GetBooleanField(env, this, mMenuItemPeerIDs.isCheckbox); - if (isCheckbox) { - /* Fix for 4090493 */ - if (IsMultiFont) { - /* FontData that correspond to XmNfontList we just set */ - struct FontData *fdataForIndSize; - Dimension indSize; - if (!JNU_IsNull(env, targetFont) && (fdata != NULL)) { - fdataForIndSize = fdata; - } - else { - fdataForIndSize = awtJNI_GetFontData(env, font, NULL); - } - indSize = awt_adjustIndicatorSizeForMenu(awt_computeIndicatorSize(fdataForIndSize)); - if (indSize != MOTIF_XmINVALID_DIMENSION) { - XtSetArg(args[argc], XmNindicatorSize, indSize); argc++; - } - } - /* End of fix for 4090493 */ - XtSetArg(args[argc], XmNset, False); - argc++; - XtSetArg(args[argc], XmNvisibleWhenOff, True); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - mdata->comp.widget = XmCreateToggleButton(menuData->itemData.comp.widget, - clabel, - args, - argc); - } else { - DASSERT(!(argc > MAX_ARGC)); - mdata->comp.widget = XmCreatePushButton(menuData->itemData.comp.widget, - clabel, - args, - argc); - } - XtAddCallback(mdata->comp.widget, - ((isCheckbox) ? XmNvalueChangedCallback : XmNactivateCallback), - (XtCallbackProc) MenuItem_selected, - (XtPointer) globalRef); - - XtSetSensitive(mdata->comp.widget, - (*env)->GetBooleanField(env, target, menuItemIDs.enabled) ? - True : False); - - - if (!JNU_IsNull(env, targetFont)) { - XmFontListFree(fontlist); - } - } - - if (clabel && (clabel != "")) { - JNU_ReleaseStringPlatformChars(env, label, clabel); - } - - /* - * Free up resources after we have created the widget - */ - if (mfstr != NULL) { - XmStringFree(mfstr); - mfstr = NULL; - } - if (str) { - XmStringFree(str); - str = NULL; - } - if (shortcut_str) { - XmStringFree(shortcut_str); - shortcut_str = NULL; - } - if (isCopy == JNI_TRUE) { - (*env)->ReleaseStringChars(env, label, unicodeLabel); - } - - XtManageChild(mdata->comp.widget); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: pSetLabel - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuItemPeer_pSetLabel -(JNIEnv *env, jobject this, jstring label) -{ - struct ComponentData *wdata; - char *clabel; - XmString xim; - - AWT_LOCK(); - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (JNU_IsNull(env, label) || ((*env)->GetStringLength (env, label) == 0)) { - xim = XmStringCreateLocalized(""); - } else { - jobject font; - jobject target; - - target = (*env)->GetObjectField(env, this, mMenuItemPeerIDs.target); - if (JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - font = JNU_CallMethodByName(env, NULL, target, "getFont_NoClientCode", - "()Ljava/awt/Font;").l; - - if (awtJNI_IsMultiFont(env, font)) { - xim = awtJNI_MakeMultiFontString(env, label, font); - } else { - clabel = (char *) JNU_GetStringPlatformChars(env, label, NULL); - xim = XmStringCreate(clabel, "labelFont"); - JNU_ReleaseStringPlatformChars(env, label, clabel); - } - } - XtUnmanageChild(wdata->widget); - XtVaSetValues(wdata->widget, XmNlabelString, xim, NULL); - XtManageChild(wdata->widget); - XmStringFree(xim); - AWT_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: pSetShortCut - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuItemPeer_pSetShortcut -(JNIEnv *env, jobject this, jstring shortcut) -{ - struct ComponentData *wdata; - char *cshortcut; - XmString xim; - - - AWT_LOCK(); - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (JNU_IsNull(env, shortcut)) { - xim = XmStringCreateLocalized(""); - } else { - jobject font; - jobject target; - - target = (*env)->GetObjectField(env, this, mMenuItemPeerIDs.target); - if (JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - font = JNU_CallMethodByName(env, NULL, target, "getFont_NoClientCode", - "()Ljava/awt/Font;").l; - - if (awtJNI_IsMultiFont(env, font)) { - xim = awtJNI_MakeMultiFontString(env, shortcut, font); - } else { - cshortcut = (char *) JNU_GetStringPlatformChars(env, shortcut, NULL); - xim = XmStringCreate(cshortcut, "labelFont"); - JNU_ReleaseStringPlatformChars(env, shortcut, cshortcut); - } - } - - XtUnmanageChild(wdata->widget); - XtVaSetValues(wdata->widget, XmNacceleratorText, xim, NULL); - XtManageChild(wdata->widget); - XmStringFree(xim); - AWT_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: pEnable - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuItemPeer_pEnable -(JNIEnv *env, jobject this) -{ - struct MenuItemData *mdata; - - AWT_LOCK(); - - mdata = (struct MenuItemData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - - if (mdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtSetSensitive(mdata->comp.widget, True); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: pDisable - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuItemPeer_pDisable -(JNIEnv *env, jobject this) -{ - struct MenuItemData *mdata; - - AWT_LOCK(); - - mdata = (struct MenuItemData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - - if (mdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtSetSensitive(mdata->comp.widget, False); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MMenuItemPeer - * Method: pDispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuItemPeer_pDispose -(JNIEnv *env, jobject this) -{ - struct MenuItemData *mdata; - Widget parent; - Boolean isParentManaged = False; - - AWT_LOCK(); - - mdata = (struct MenuItemData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - - if (mdata != NULL) { - /* Fix for 4280561:Workspace freezes, does not respond to mouse clicks - ** - ** this really helps a lot of Fujitsu problems, take down a popup - ** menu when removing items, on windows you could never get here, since - ** the show() of a popup menu puts it in a menu loop where further - ** events are processed in that loop, its like a modal dialog show, - ** in that it dosn't return till it comes down. - ** in X - future xevents will be dispatched immeadiatly, but some - ** may be still waiting on the java queue - which can cause them to be - ** dispatched out of order (sometimes hanging system !) - */ - /* note: should realy only take down if XtParent(mdata->comp.widget) - ** is the activePopup (in awt_PopupMenu.c) but ... - */ - { - removePopupMenus(); - } - XtUnmanageChild(mdata->comp.widget); - awt_util_consumeAllXEvents(mdata->comp.widget); - - parent = XtParent(mdata->comp.widget); - if (parent != NULL && XtIsManaged(parent)) { - isParentManaged = True; - XtUnmanageChild(parent); - } - - XtDestroyWidget(mdata->comp.widget); - - if (isParentManaged) { - XtManageChild(parent); - } - - free((void *) mdata); - (*env)->SetLongField(env, this, mMenuItemPeerIDs.pData, (jlong)0); - awtJNI_DeleteGlobalMenuRef(env, this); - } - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCheckboxMenuItemPeer - * Method: pSetState - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCheckboxMenuItemPeer_pSetState - (JNIEnv *env, jobject this, jboolean state) -{ - struct MenuItemData *mdata; - - AWT_LOCK(); - - mdata = (struct MenuItemData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - - if (mdata == NULL) { - JNU_ThrowNullPointerException(env, "menuitem data is null"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(mdata->comp.widget, XmNset, (Boolean)state, NULL); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCheckboxMenuItemPeer - * Method: getState - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_sun_awt_motif_MCheckboxMenuItemPeer_getState - (JNIEnv *env, jobject this) -{ - struct MenuItemData *mdata; - Boolean state; - - AWT_LOCK(); - - mdata = (struct MenuItemData *) - (*env)->GetLongField(env, this, mMenuItemPeerIDs.pData); - - if (mdata == NULL) { - JNU_ThrowNullPointerException(env, "menuitem data is null"); - AWT_UNLOCK(); - return JNI_FALSE; - } - XtVaGetValues(mdata->comp.widget, XmNset, &state, NULL); - AWT_UNLOCK(); - return ((state) ? JNI_TRUE : JNI_FALSE); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_PopupMenu.c --- a/jdk/src/solaris/native/sun/awt/awt_PopupMenu.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,491 +0,0 @@ -/* - * Copyright 1996-2004 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 -#include -#include -#include "color.h" -#include "java_awt_PopupMenu.h" -#include "java_awt_Component.h" -#include "java_awt_Event.h" -#include "sun_awt_motif_MPopupMenuPeer.h" -#include "sun_awt_motif_MComponentPeer.h" - -#include "awt_PopupMenu.h" -#include "awt_MenuItem.h" -#include "awt_Component.h" -#include "awt_MenuComponent.h" -#include "awt_Menu.h" -#include "awt_Event.h" - -#include "multi_font.h" -#include -#include - -extern struct MMenuItemPeerIDs mMenuItemPeerIDs; -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct MenuComponentIDs menuComponentIDs; -extern struct MenuItemIDs menuItemIDs; -extern struct MenuIDs menuIDs; -extern AwtGraphicsConfigDataPtr -getGraphicsConfigFromComponentPeer(JNIEnv *env, jobject parentPeer); -extern Boolean keyboardGrabbed; -Boolean poppingDown = False; - -struct MPopupMenuPeerIDs mPopupMenuPeerIDs; - -static Widget activePopup; - -void removePopupMenus() { - if (activePopup != NULL && - XtIsManaged(activePopup)) - { - XtUnmanageChild(activePopup); - activePopup = NULL; - } -} - -Boolean awtMenuIsActive() { - return ((activePopup != NULL) || (awt_util_focusIsOnMenu(awt_display))); -} - -struct ClientDataStruct { - struct ComponentData *wdata; - jobject mMenuItemPeerIDs; -}; - -/* - * Class: sun_awt_motif_MPopupMenuPeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MPopupMenuPeer.java to initialize the methodIDs for methods that may - be accessed from C */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MPopupMenuPeer_initIDs - (JNIEnv *env, jclass cls) -{ - mPopupMenuPeerIDs.destroyNativeWidgetAfterGettingTreeLock = - (*env)->GetMethodID(env, cls, - "destroyNativeWidgetAfterGettingTreeLock", "()V"); -} - -extern Boolean skipNextNotifyWhileGrabbed; - -static void -Popup_popUpCB(Widget w, XtPointer client_data, XtPointer calldata) -{ - skipNextNotifyWhileGrabbed = True; -} -/* - * client_data is MPopupMenuPeer instance - */ -static void -Popup_popdownCB(Widget w, XtPointer client_data, XtPointer calldata) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject target = NULL; - - /* - * Fix for 4394847. Due to the race keyboard remains grabbed after menu - * was disposed. Clear the grab status here instead of processOneEvent. - */ - poppingDown = True; - keyboardGrabbed = False; - skipNextNotifyWhileGrabbed = True; - - XtRemoveCallback(w, XtNpopdownCallback, - Popup_popdownCB, (XtPointer) client_data); - - (*env)->CallVoidMethod(env, (jobject) client_data, - mPopupMenuPeerIDs.destroyNativeWidgetAfterGettingTreeLock); - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -/* - * Class: sun_awt_motif_MPopupMenuPeer - * Method: createMenu - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MPopupMenuPeer_createMenu - (JNIEnv *env, jobject this, jobject parent) -{ - struct ComponentData *wdata; - struct MenuData *mdata; - struct FontData *fdata; - char *ctitle = NULL; - int32_t argc; -#define MAX_ARGC 10 - Arg args[MAX_ARGC]; - Pixel bg; - Pixel fg; - XmFontList fontlist = NULL; - XmString mfstr = NULL; - jobject font; - jobject target; - jobject targetFont; - jobject label; - jboolean IsMultiFont; - jboolean tearOff; - jobject globalRef = (*env)->NewGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - - JNU_SetLongFieldFromPtr(env, this, - mMenuItemPeerIDs.jniGlobalRef, globalRef); - - - AWT_LOCK(); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - target = - (*env)->GetObjectField(env, this, mMenuItemPeerIDs.target); - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, parent, mComponentPeerIDs.pData); - - if (wdata == NULL || JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - mdata = ZALLOC(MenuData); - if (mdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - JNU_SetLongFieldFromPtr(env, this, mMenuItemPeerIDs.pData, mdata); - - adata = getGraphicsConfigFromComponentPeer(env, parent); - - /* - * Why are these different? - */ - font = JNU_CallMethodByName(env, NULL, target, "getFont_NoClientCode", - "()Ljava/awt/Font;").l; - targetFont = - (*env)->GetObjectField(env, target, menuComponentIDs.font); - if (!JNU_IsNull(env, targetFont) && - (fdata = awtJNI_GetFontData(env, targetFont, NULL)) != NULL) { - IsMultiFont = awtJNI_IsMultiFont(env, targetFont); - } else { - IsMultiFont = awtJNI_IsMultiFont(env, font); - } - - label = (*env)->GetObjectField(env, target, menuItemIDs.label); - if (JNU_IsNull(env, label)) { - mfstr = XmStringCreateLocalized(""); - ctitle = ""; - } else { - if (IsMultiFont) { - mfstr = awtJNI_MakeMultiFontString(env, label, font); - } else { - ctitle = (char *) JNU_GetStringPlatformChars(env, label, NULL); - } - } - - XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL); - XtVaGetValues(wdata->widget, XmNforeground, &fg, NULL); - - argc = 0; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNforeground, fg); - argc++; - tearOff = (*env)->GetBooleanField(env, target, menuIDs.tearOff); - if (tearOff) { - XtSetArg(args[argc], XmNtearOffModel, XmTEAR_OFF_ENABLED); - argc++; - } - if (!JNU_IsNull(env, targetFont) - && (fdata = awtJNI_GetFontData(env, targetFont, NULL)) != NULL) { - if (IsMultiFont) { - fontlist = awtJNI_GetFontList(env, targetFont); - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - - XtSetArg(args[argc], XmNfontList, fontlist); - argc++; - } else { - if (IsMultiFont) { - fontlist = awtJNI_GetFontList(env, font); - XtSetArg(args[argc], XmNfontList, fontlist); - argc++; - } - } - - XtSetArg(args[argc], XmNvisual, adata->awt_visInfo.visual); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen)); - argc++; - - if (IsMultiFont) { - DASSERT(!(argc > MAX_ARGC)); - mdata->itemData.comp.widget = XmCreatePopupMenu(wdata->widget, - "", - args, - argc); - } else { - DASSERT(!(argc > MAX_ARGC)); - mdata->itemData.comp.widget = XmCreatePopupMenu(wdata->widget, - ctitle, - args, - argc); - } - awt_addMenuWidget(mdata->itemData.comp.widget); - - /* - * Fix for bug 4180147 - - * screen can be frozen when interacting with MB3 using AWT on Motif - */ - XtUngrabButton(wdata->widget, AnyButton, AnyModifier); - XtUngrabPointer(wdata->widget, CurrentTime); - - /* fix for bug #4169155: Popup menus get a leading separator on Motif - system. - Additional check that title string is not empty*/ - if (!JNU_IsNull(env, label) && - (*env)->GetStringUTFLength( env, label) != (jsize)0 ) { - if (IsMultiFont) { - XtVaCreateManagedWidget("", - xmLabelWidgetClass, - mdata->itemData.comp.widget, - XmNfontList, fontlist, - XmNlabelString, mfstr, - XmNbackground, bg, - XmNforeground, fg, - XmNhighlightColor, fg, - NULL); - XmStringFree(mfstr); - } else { - XmString xmstr = XmStringCreateLocalized(ctitle); - - XtVaCreateManagedWidget(ctitle, - xmLabelWidgetClass, - mdata->itemData.comp.widget, - XmNlabelString, xmstr, - XmNbackground, bg, - XmNforeground, fg, - XmNhighlightColor, fg, - NULL); - XmStringFree(xmstr); - JNU_ReleaseStringPlatformChars(env, label, (const char *) ctitle); - } - /* Create separator */ - XtVaCreateManagedWidget("", - xmSeparatorWidgetClass, - mdata->itemData.comp.widget, - XmNbackground, bg, - XmNforeground, fg, - NULL); - } - if (tearOff) { - Widget tearOffWidget = XmGetTearOffControl(mdata->itemData.comp.widget); - - XtVaSetValues(tearOffWidget, - XmNbackground, bg, - XmNforeground, fg, - XmNhighlightColor, fg, - NULL); - } - mdata->comp.widget = mdata->itemData.comp.widget; - - if (!JNU_IsNull(env, targetFont)) { - XmFontListFree(fontlist); - } - XtSetSensitive(mdata->comp.widget, - ((*env)->GetBooleanField(env, target, menuItemIDs.enabled) ? - True : False)); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MPopupMenuPeer - * Method: pShow - * Signature: (Ljava/awt/Event;IILsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MPopupMenuPeer_pShow - (JNIEnv *env, jobject this, jobject event, jint x, jint y, jobject origin) -{ - struct MenuData *mdata; - struct ComponentData *wdata; - XButtonEvent *bevent; - XButtonEvent *newEvent = NULL; - void *data; - - AWT_LOCK(); - - mdata = (struct MenuData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - if (mdata == NULL || JNU_IsNull(env, event)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, origin, mComponentPeerIDs.pData); - - if ( wdata == NULL || wdata->widget == NULL ) { /* 425598 */ - JNU_ThrowNullPointerException(env, "NullPointerException"); /* 425598 */ - AWT_UNLOCK(); /* 425598 */ - return; /* 425598 */ - } /* 425598 */ - - if (!XtIsRealized(wdata->widget)) { - JNU_ThrowInternalError(env, "widget not visible on screen"); - AWT_UNLOCK(); - return; - } - - /* - * Fix for BugTraq ID 4186663 - Pural PopupMenus appear at the same time. - * If another popup is currently visible hide it. - */ - if (activePopup != NULL && - activePopup != mdata->comp.widget && - XtIsObject(activePopup) && - XtIsManaged(activePopup)) { - removePopupMenus(); - } - - /* If the raw x event is not available, then we must use an unfortunate - * round-trip call to XTranslateCoordiates to get the root coordinates. - */ - data = JNU_GetLongFieldAsPtr(env, event, eventIDs.data); - if (data == NULL || ((XEvent *) data)->type != ButtonPress) { - int32_t rx, ry; - Window root, win; - - root = RootWindowOfScreen(XtScreen(wdata->widget)); - XTranslateCoordinates(awt_display, - XtWindow(wdata->widget), - root, - (int32_t) x, (int32_t) y, - &rx, &ry, - &win); - /* - printf("translated coords %d,%d to root %d,%d\n", x, y, rx, ry); - */ - - newEvent = (XButtonEvent *) malloc(sizeof(XButtonEvent)); - newEvent->type = ButtonPress; - newEvent->display = awt_display; - newEvent->window = XtWindow(wdata->widget); - newEvent->time = awt_util_getCurrentServerTime(); - newEvent->x = (int32_t) x; - newEvent->y = (int32_t) y; - newEvent->x_root = rx; - newEvent->y_root = ry; - bevent = newEvent; - - } else { - bevent = (XButtonEvent *) data; - } - - XtAddCallback(XtParent(mdata->comp.widget), XtNpopdownCallback, - Popup_popdownCB, - (XtPointer) - JNU_GetLongFieldAsPtr(env, this, - mMenuItemPeerIDs.jniGlobalRef)); - - XtAddCallback(XtParent(mdata->comp.widget), XtNpopupCallback, - Popup_popUpCB, - (XtPointer) - JNU_GetLongFieldAsPtr(env, this, - mMenuItemPeerIDs.jniGlobalRef)); - - - XmMenuPosition(mdata->comp.widget, bevent); - XtManageChild(mdata->comp.widget); - - /* - * Fix for BugTraq ID 4186663 - Pural PopupMenus appear at the same time. - * Store the pointer to the currently showing popup. - */ - activePopup = mdata->comp.widget; - - if (newEvent) { - free((void *) newEvent); - } - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MPopupMenuPeer - * Method: pDispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MPopupMenuPeer_pDispose - (JNIEnv *env, jobject this) -{ - struct MenuData *mdata; - - AWT_LOCK(); - - mdata = (struct MenuData *) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.pData); - - if (mdata == NULL) { - AWT_UNLOCK(); - return; - } - /* - * Fix for BugTraq ID 4186663 - Pural PopupMenus appear at the same time. - * Clear the pointer to the currently showing popup. - */ - if (activePopup == mdata->comp.widget) { - activePopup = NULL; - } - awt_delMenuWidget(mdata->itemData.comp.widget); - XtUnmanageChild(mdata->comp.widget); - awt_util_consumeAllXEvents(mdata->comp.widget); - XtDestroyWidget(mdata->comp.widget); - free((void *) mdata); - (*env)->SetLongField(env, this, mMenuItemPeerIDs.pData, (jlong)0); - - awtJNI_DeleteGlobalMenuRef(env, this); - - poppingDown = False; - AWT_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Robot.c --- a/jdk/src/solaris/native/sun/awt/awt_Robot.c Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/native/sun/awt/awt_Robot.c Mon Aug 25 13:58:15 2008 -0700 @@ -204,14 +204,8 @@ /*********************************************************************************************/ -#ifdef XAWT -#define FUNC_NAME(name) Java_sun_awt_X11_XRobotPeer_ ## name -#else -#define FUNC_NAME(name) Java_sun_awt_motif_MRobotPeer_ ## name -#endif - JNIEXPORT void JNICALL -FUNC_NAME(setup) (JNIEnv * env, jclass cls) { +Java_sun_awt_X11_XRobotPeer_setup (JNIEnv * env, jclass cls) { int32_t xtestAvailable; DTRACE_PRINTLN("RobotPeer: setup()"); @@ -232,7 +226,7 @@ } JNIEXPORT void JNICALL -FUNC_NAME(getRGBPixelsImpl)( JNIEnv *env, +Java_sun_awt_X11_XRobotPeer_getRGBPixelsImpl( JNIEnv *env, jclass cls, jobject xgc, jint x, @@ -295,7 +289,7 @@ } JNIEXPORT void JNICALL -FUNC_NAME(keyPressImpl) (JNIEnv *env, +Java_sun_awt_X11_XRobotPeer_keyPressImpl (JNIEnv *env, jclass cls, jint keycode) { @@ -315,7 +309,7 @@ } JNIEXPORT void JNICALL -FUNC_NAME(keyReleaseImpl) (JNIEnv *env, +Java_sun_awt_X11_XRobotPeer_keyReleaseImpl (JNIEnv *env, jclass cls, jint keycode) { AWT_LOCK(); @@ -333,7 +327,7 @@ } JNIEXPORT void JNICALL -FUNC_NAME(mouseMoveImpl) (JNIEnv *env, +Java_sun_awt_X11_XRobotPeer_mouseMoveImpl (JNIEnv *env, jclass cls, jobject xgc, jint root_x, @@ -355,7 +349,7 @@ } JNIEXPORT void JNICALL -FUNC_NAME(mousePressImpl) (JNIEnv *env, +Java_sun_awt_X11_XRobotPeer_mousePressImpl (JNIEnv *env, jclass cls, jint buttonMask) { AWT_LOCK(); @@ -379,7 +373,7 @@ } JNIEXPORT void JNICALL -FUNC_NAME(mouseReleaseImpl) (JNIEnv *env, +Java_sun_awt_X11_XRobotPeer_mouseReleaseImpl (JNIEnv *env, jclass cls, jint buttonMask) { AWT_LOCK(); @@ -403,7 +397,7 @@ } JNIEXPORT void JNICALL -FUNC_NAME(mouseWheelImpl) (JNIEnv *env, +Java_sun_awt_X11_XRobotPeer_mouseWheelImpl (JNIEnv *env, jclass cls, jint wheelAmt) { /* Mouse wheel is implemented as a button press of button 4 and 5, so it */ diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_ScrollPane.c --- a/jdk/src/solaris/native/sun/awt/awt_ScrollPane.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,927 +0,0 @@ -/* - * Copyright 1996-2002 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 "java_awt_Adjustable.h" -#include "java_awt_Insets.h" -#include "java_awt_ScrollPane.h" -#include "java_awt_event_AdjustmentEvent.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "sun_awt_motif_MScrollPanePeer.h" -#include "java_awt_AWTEvent.h" - -#include "awt_Component.h" -#include "canvas.h" - -#include -#include -#include - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -/* fieldIDs for ScrollPane fields that may be accessed from C */ -static struct ScrollPaneIDs { - jfieldID scrollbarDisplayPolicy; -} scrollPaneIDs; - -/* - * Class: java_awt_ScrollPane - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - ScrollPane.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL Java_java_awt_ScrollPane_initIDs - (JNIEnv *env, jclass cls) -{ - scrollPaneIDs.scrollbarDisplayPolicy = - (*env)->GetFieldID(env, cls, "scrollbarDisplayPolicy", "I"); -} - -/* fieldIDs for MScrollPanePeer fields that may be accessed from C */ -static struct MScrollPanePeerIDs { - jmethodID postScrollEventID; -} mScrollPanePeerIDs; - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MScrollPanePeer.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MScrollPanePeer_initIDs - (JNIEnv *env, jclass cls) -{ - mScrollPanePeerIDs.postScrollEventID = - (*env)->GetMethodID(env, cls, "postScrollEvent", "(IIIZ)V"); -} - -static void -dump_scroll_attrs(Widget scrollbar) -{ - unsigned char orient; - int32_t value, size, incr, pIncr, max, min; - - XtVaGetValues(scrollbar, - XmNvalue, &value, - XmNincrement, &incr, - XmNpageIncrement, &pIncr, - XmNsliderSize, &size, - XmNmaximum, &max, - XmNminimum, &min, - XmNorientation, &orient, - NULL); - - jio_fprintf(stdout, "%s: min=%d max=%d slider-size=%d incr=%d pageIncr=%d value = %d\n", - orient == XmVERTICAL ? "VSB" : "HSB", min, max, size, - incr, pIncr, value); -} - - -/* - * client_data is MScrollPanePeer instance - */ -static void -postScrollEvent(jint jorient, jobject peer, XmScrollBarCallbackStruct *scroll) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - jint jscrollcode; - jboolean jadjusting = JNI_FALSE; - - switch (scroll->reason) { - case XmCR_DECREMENT: - jscrollcode = java_awt_event_AdjustmentEvent_UNIT_DECREMENT; - break; - case XmCR_INCREMENT: - jscrollcode = java_awt_event_AdjustmentEvent_UNIT_INCREMENT; - break; - case XmCR_PAGE_DECREMENT: - jscrollcode = java_awt_event_AdjustmentEvent_BLOCK_DECREMENT; - break; - case XmCR_PAGE_INCREMENT: - jscrollcode = java_awt_event_AdjustmentEvent_BLOCK_INCREMENT; - break; - case XmCR_DRAG: - jscrollcode = java_awt_event_AdjustmentEvent_TRACK; - jadjusting = JNI_TRUE; - break; - case XmCR_VALUE_CHANGED: /* drag finished */ - case XmCR_TO_TOP: - case XmCR_TO_BOTTOM: - jscrollcode = java_awt_event_AdjustmentEvent_TRACK; - break; - default: - DASSERT(FALSE); - return; - } - - (*env)->CallVoidMethod(env, peer, mScrollPanePeerIDs.postScrollEventID, - jorient, jscrollcode, (jint)scroll->value, jadjusting); - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -/* - * client_data is MScrollPanePeer instance - */ -static void -ScrollPane_scrollV(Widget w, XtPointer client_data, XtPointer call_data) -{ - postScrollEvent(java_awt_Adjustable_VERTICAL, (jobject)client_data, - (XmScrollBarCallbackStruct *)call_data); -} - -/* - * client_data is MScrollPanePeer instance - */ -static void -ScrollPane_scrollH(Widget w, XtPointer client_data, XtPointer call_data) -{ - postScrollEvent(java_awt_Adjustable_HORIZONTAL, (jobject)client_data, - (XmScrollBarCallbackStruct *)call_data); -} - - -typedef XmNavigability (*NavigableCallback) (Widget); - -NavigableCallback oldClipNavigable = NULL; -Boolean clipCallbackInitialized = False; -XmNavigability MyClipNavigable(Widget wid) { - // We've installed this function for ClipWindow - if (XmIsClipWindow(wid)) { - // To be able to request focus on ClipWindow by call - // XmProcessTraversal(, XmTRAVERSE_CURRENT) we need to make - // it return XmCONTROL_NAVIGABLE. Default implementation returns - // DESCENDANTS_TAB_NAVIGABLE which doesn't allow this. - return XmCONTROL_NAVIGABLE; - } - if (oldClipNavigable) { - return oldClipNavigable(wid); - } - // this will never happen - return XmCONTROL_NAVIGABLE; -} - -const char * ScrollPaneManagerName = "ScrolledWindowClipWindow"; -NavigableCallback oldManagerNavigable = NULL; -Boolean managerCallbackInitialized = False; -XmNavigability MyManagerNavigable(Widget wid) { - // We've installed this function for Manager - // with the name ScrollPaneManagerName - if (XmIsManager(wid) - && ( XtName(wid) != NULL && strcmp(XtName(wid), ScrollPaneManagerName) == 0) ) - { - // To be able to request focus on Manager by call - // XmProcessTraversal(, XmTRAVERSE_CURRENT) we need to make - // it return XmCONTROL_NAVIGABLE. Default implementation returns - // DESCENDANTS_TAB_NAVIGABLE which doesn't allow this. - return XmCONTROL_NAVIGABLE; - } - if (oldManagerNavigable) { - return oldManagerNavigable(wid); - } - // this will never happen - return XmCONTROL_NAVIGABLE; -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MScrollPanePeer_create - (JNIEnv *env, jobject this, jobject parent) -{ - int32_t argc; -#define MAX_ARGC 40 - Arg args[MAX_ARGC]; - struct ComponentData *wdata; - struct ComponentData *sdata; - jobject target; - Pixel bg; - Widget vsb, hsb; - jint sbDisplay; - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - - AWT_LOCK(); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData); - - if (JNU_IsNull(env, target) || wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - sdata = ZALLOC(ComponentData); - JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,sdata); - - if (sdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL); - - adata = copyGraphicsConfigToPeer(env, this); - - argc = 0; - - sbDisplay = - (*env)->GetIntField(env, target, scrollPaneIDs.scrollbarDisplayPolicy); - - XtSetArg(args[argc], XmNuserData, (XtPointer) globalRef); - argc++; - - - if (sbDisplay == java_awt_ScrollPane_SCROLLBARS_NEVER) { - DASSERT(!(argc > MAX_ARGC)); - sdata->widget = XtCreateWidget(ScrollPaneManagerName, - xmManagerWidgetClass, wdata->widget, - args, argc); - - { - // To be able to request focus on Manager by call - // XmProcessTraversal(, XmTRAVERSE_CURRENT) we need to make - // it return XmCONTROL_NAVIGABLE from widgetNavigable callback. - // Default implementation returns DESCENDANTS_TAB_NAVIGABLE - // which doesn't allow this. - if (!managerCallbackInitialized) { - XmBaseClassExt *er; - WidgetClass wc; - managerCallbackInitialized = True; - wc = (WidgetClass) &xmManagerClassRec; - er = _XmGetBaseClassExtPtr(wc, XmQmotif); - oldManagerNavigable = (*er)->widgetNavigable; - (*er)->widgetNavigable = MyManagerNavigable; - } - } - } - else - { - XtSetArg(args[argc], XmNscrollingPolicy, XmAUTOMATIC); - argc++; - XtSetArg(args[argc], XmNvisualPolicy, XmCONSTANT); - argc++; - if (sbDisplay == java_awt_ScrollPane_SCROLLBARS_ALWAYS) { - DASSERT(!(argc > MAX_ARGC)); - XtSetArg(args[argc], XmNscrollBarDisplayPolicy, XmSTATIC); - argc++; - } else { - XtSetArg(args[argc], XmNscrollBarDisplayPolicy, XmAS_NEEDED); - argc++; - } - - XtSetArg(args[argc], XmNspacing, 0); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen)); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - sdata->widget = XmCreateScrolledWindow(wdata->widget, "scroller", args, argc); - - XtVaGetValues(sdata->widget, - XmNverticalScrollBar, &vsb, - XmNhorizontalScrollBar, &hsb, - NULL); - - if (vsb != NULL) { - XtAddCallback(vsb, XmNincrementCallback, ScrollPane_scrollV, (XtPointer) globalRef); - XtAddCallback(vsb, XmNdecrementCallback, ScrollPane_scrollV, (XtPointer) globalRef); - XtAddCallback(vsb, XmNpageIncrementCallback, ScrollPane_scrollV, (XtPointer) globalRef); - XtAddCallback(vsb, XmNpageDecrementCallback, ScrollPane_scrollV, (XtPointer) globalRef); - XtAddCallback(vsb, XmNtoTopCallback, ScrollPane_scrollV, (XtPointer) globalRef); - XtAddCallback(vsb, XmNtoBottomCallback, ScrollPane_scrollV, (XtPointer) globalRef); - XtAddCallback(vsb, XmNvalueChangedCallback, ScrollPane_scrollV, (XtPointer) globalRef); - XtAddCallback(vsb, XmNdragCallback, ScrollPane_scrollV, (XtPointer) globalRef); - - XtVaSetValues(vsb, XmNhighlightThickness, 0, NULL); - } - if (hsb != NULL) { - XtAddCallback(hsb, XmNincrementCallback, ScrollPane_scrollH, (XtPointer) globalRef); - XtAddCallback(hsb, XmNdecrementCallback, ScrollPane_scrollH, (XtPointer) globalRef); - XtAddCallback(hsb, XmNpageIncrementCallback, ScrollPane_scrollH, (XtPointer) globalRef); - XtAddCallback(hsb, XmNpageDecrementCallback, ScrollPane_scrollH, (XtPointer) globalRef); - XtAddCallback(hsb, XmNtoTopCallback, ScrollPane_scrollH, (XtPointer) globalRef); - XtAddCallback(hsb, XmNtoBottomCallback, ScrollPane_scrollH, (XtPointer) globalRef); - XtAddCallback(hsb, XmNvalueChangedCallback, ScrollPane_scrollH, (XtPointer) globalRef); - XtAddCallback(hsb, XmNdragCallback, ScrollPane_scrollH, (XtPointer) globalRef); - - XtVaSetValues(hsb, XmNhighlightThickness, 0, NULL); - } - { - /** - * Fix for 4033837 - ScrollPane doesn't generate mouse, focus, key events - * If ScrollPane created with ALWAYS or AS_NEEDED scrollbars policy then - * the upper widget is ClipWindow. We should install callbacks on it to - * receive event notifications. - */ - Widget clip = XtNameToWidget(sdata->widget, "*ClipWindow"); - if (clip != NULL) { - // To be able to request focus on Manager by call - // XmProcessTraversal(, XmTRAVERSE_CURRENT) we need to make - // it return XmCONTROL_NAVIGABLE from widgetNavigable callback. - // Default implementation returns DESCENDANTS_TAB_NAVIGABLE - // which doesn't allow this. - if (!clipCallbackInitialized) { - XmBaseClassExt *er; - clipCallbackInitialized = True; - er = _XmGetBaseClassExtPtr(XtClass(clip), XmQmotif); - oldClipNavigable = (*er)->widgetNavigable; - (*er)->widgetNavigable = MyClipNavigable; - } - awt_addWidget(clip, sdata->widget, globalRef, java_awt_AWTEvent_MOUSE_EVENT_MASK | - java_awt_AWTEvent_MOUSE_MOTION_EVENT_MASK | java_awt_AWTEvent_KEY_EVENT_MASK); - } - } - { - /** - * Fix for 4033837 - ScrollPane with ALWAYS doesn't have scrollbars visible - * It seems to be the bug in Motif, the workaround is to add empty child. - * User child will replace it when needed. This doesn't work if child had been - * removed. - */ - if (sbDisplay == java_awt_ScrollPane_SCROLLBARS_ALWAYS) { - Widget darea = NULL; - argc = 0; - XtSetArg(args[argc], XmNwidth, 1); - argc++; - XtSetArg(args[argc], XmNheight, 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++; - darea = XmCreateDrawingArea(sdata->widget, "null_child", args, argc); - - XmScrolledWindowSetAreas(sdata->widget, NULL, NULL, darea); - XtSetMappedWhenManaged(darea, False); - XtManageChild(darea); - } - } - - } - - XtSetMappedWhenManaged(sdata->widget, False); - XtManageChild(sdata->widget); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: pSetScrollChild - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MScrollPanePeer_pSetScrollChild - (JNIEnv *env, jobject this, jobject child) -{ - struct ComponentData *cdata; - struct ComponentData *sdata; - jobject target; - - AWT_LOCK(); - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if (JNU_IsNull(env, child) || JNU_IsNull(env, target)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,child,mComponentPeerIDs.pData); - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (sdata == NULL || cdata == NULL || sdata->widget == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - - return; - } - if ((*env)->GetIntField(env, target, scrollPaneIDs.scrollbarDisplayPolicy) - == java_awt_ScrollPane_SCROLLBARS_NEVER) { - /* Do Nothing */ - } else { - XmScrolledWindowSetAreas(sdata->widget, NULL, NULL, cdata->widget); - /* - XtInsertEventHandler(cdata->widget, StructureNotifyMask, FALSE, - child_event_handler, sdata->widget, XtListHead); - */ - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: pSetIncrement - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MScrollPanePeer_pSetIncrement - (JNIEnv *env, jobject this, jint orient, jint incrType, jint incr) -{ - struct ComponentData *sdata; - Widget scrollbar = NULL; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (sdata == NULL || sdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (!XtIsSubclass(sdata->widget, xmScrolledWindowWidgetClass)) { - AWT_UNLOCK(); - return; - } - if (orient == java_awt_Adjustable_VERTICAL) { - XtVaGetValues(sdata->widget, - XmNverticalScrollBar, &scrollbar, - NULL); - } else { - XtVaGetValues(sdata->widget, - XmNhorizontalScrollBar, &scrollbar, - NULL); - } - - if (scrollbar != NULL) { - if (incrType == sun_awt_motif_MScrollPanePeer_UNIT_INCREMENT) { - XtVaSetValues(scrollbar, - XmNincrement, (XtArgVal) incr, - NULL); - - } else { - /* BLOCK_INCREMENT */ - XtVaSetValues(scrollbar, - XmNpageIncrement, (XtArgVal) incr, - NULL); - } - } - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: pGetScrollbarSpace - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MScrollPanePeer_pGetScrollbarSpace - (JNIEnv *env, jobject this, jint orient) -{ - struct ComponentData *sdata; - Widget scrollbar; - Dimension thickness = 0; - Dimension space = 0; - Dimension highlight = 0; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL || sdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - if (orient == java_awt_Adjustable_VERTICAL) { - XtVaGetValues(sdata->widget, - XmNverticalScrollBar, &scrollbar, - XmNspacing, &space, - NULL); - XtVaGetValues(scrollbar, - XmNwidth, &thickness, - XmNhighlightThickness, &highlight, - NULL); - } else { - XtVaGetValues(sdata->widget, - XmNhorizontalScrollBar, &scrollbar, - XmNspacing, &space, - NULL); - XtVaGetValues(scrollbar, - XmNheight, &thickness, - XmNhighlightThickness, &highlight, - NULL); - } - - AWT_UNLOCK(); - return (jint) (thickness + space + 2 * highlight); -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: pGetBlockIncrement - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MScrollPanePeer_pGetBlockIncrement - (JNIEnv *env, jobject this, jint orient) -{ - int32_t pageIncr = 0; - struct ComponentData *sdata; - Widget scrollbar; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (sdata == NULL || sdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - if (orient == java_awt_Adjustable_VERTICAL) { - - XtVaGetValues(sdata->widget, - XmNverticalScrollBar, &scrollbar, - NULL); - XtVaGetValues(scrollbar, - XmNpageIncrement, &pageIncr, - NULL); - } else { - - XtVaGetValues(sdata->widget, - XmNhorizontalScrollBar, &scrollbar, - NULL); - XtVaGetValues(scrollbar, - XmNpageIncrement, &pageIncr, - NULL); - } - - AWT_UNLOCK(); - return (jint) (pageIncr); -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: pInsets - * Signature: (IIII)Ljava/awt/Insets; - */ -JNIEXPORT jobject JNICALL Java_sun_awt_motif_MScrollPanePeer_pInsets - (JNIEnv *env, jobject this, jint width, jint height, jint childWidth, jint childHeight) -{ - struct ComponentData *sdata; - jobject target; - jobject insets = NULL; - Widget hsb, vsb; - Dimension hsbThickness, hsbHighlight, hsbSpace = 0, - vsbThickness, vsbHighlight, vsbSpace = 0, - space, border, shadow, hMargin, vMargin; - unsigned char placement; - Boolean hsbVisible, vsbVisible; - jint sbDisplay; - int32_t top, left, right, bottom; - jclass clazz; - jmethodID mid; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if (JNU_IsNull(env, target) || sdata == NULL || sdata->widget == NULL) - { - JNU_ThrowNullPointerException(env, "sdata is NULL"); - AWT_UNLOCK(); - return 0; - } - sbDisplay = - (*env)->GetIntField(env, target, scrollPaneIDs.scrollbarDisplayPolicy); - - /* REMIND: investigate caching these values rather than querying for - * them each time. - */ - - if (sbDisplay == java_awt_ScrollPane_SCROLLBARS_NEVER) { - XtVaGetValues(sdata->widget, - XmNshadowThickness, &shadow, - NULL); - space = border = hMargin = vMargin = 0; - - } else { - XtVaGetValues(sdata->widget, - XmNverticalScrollBar, &vsb, - XmNhorizontalScrollBar, &hsb, - XmNscrollBarPlacement, &placement, - XmNspacing, &space, - XmNshadowThickness, &shadow, - XmNscrolledWindowMarginHeight, &vMargin, - XmNscrolledWindowMarginWidth, &hMargin, - XmNborderWidth, &border, - NULL); - - XtVaGetValues(vsb, - XmNwidth, &vsbThickness, - XmNhighlightThickness, &vsbHighlight, - NULL); - - XtVaGetValues(hsb, - XmNheight, &hsbThickness, - XmNhighlightThickness, &hsbHighlight, - NULL); - - hsbSpace = hsbThickness + space + hsbHighlight; - vsbSpace = vsbThickness + space + vsbHighlight; - -/* - XtVaGetValues(clip, - XmNwidth, &clipw, XmNheight, &cliph, - XmNx, &clipx, XmNy, &clipy, - NULL); - printf("insets: spacing=%d shadow=%d swMarginH=%d swMarginW=%d border=%d ; \ - vsb=%d vsbHL=%d ; hsb=%d hsbHL=%d ; %dx%d ->clip=%d,%d %dx%d\n", - space, shadow, vMargin, hMargin, border, - vsbThickness, vsbHighlight, hsbThickness, hsbHighlight, - w, h, clipx, clipy, clipw, cliph); -*/ - } - - /* We unfortunately have to use the size parameters to determine - * whether or not "as needed" scrollbars are currently present or - * not because we can't necessarily rely on getting valid geometry - * values straight from the Motif widgets until they are mapped. :( - */ - switch (sbDisplay) { - case java_awt_ScrollPane_SCROLLBARS_NEVER: - vsbVisible = hsbVisible = FALSE; - break; - - case java_awt_ScrollPane_SCROLLBARS_ALWAYS: - vsbVisible = hsbVisible = TRUE; - break; - - case java_awt_ScrollPane_SCROLLBARS_AS_NEEDED: - default: - vsbVisible = hsbVisible = FALSE; - if (childWidth > width - 2 * shadow) { - hsbVisible = TRUE; - } - if (childHeight > height - 2 * shadow) { - vsbVisible = TRUE; - } - if (!hsbVisible && vsbVisible && childWidth > width - 2 * shadow - vsbSpace) { - hsbVisible = TRUE; - } else if (!vsbVisible && hsbVisible && childHeight > height - 2 * shadow - hsbSpace) { - vsbVisible = TRUE; - } - } - - top = bottom = shadow + vMargin; - left = right = shadow + hMargin; - - if (sbDisplay != java_awt_ScrollPane_SCROLLBARS_NEVER) { - switch (placement) { - case XmBOTTOM_RIGHT: - bottom += (hsbVisible ? hsbSpace : (vsbVisible ? vsbHighlight : 0)); - right += (vsbVisible ? vsbSpace : (hsbVisible ? hsbHighlight : 0)); - top += (vsbVisible ? vsbHighlight : 0); - left += (hsbVisible ? hsbHighlight : 0); - break; - - case XmBOTTOM_LEFT: - bottom += (hsbVisible ? hsbSpace : (vsbVisible ? vsbHighlight : 0)); - left += (vsbVisible ? hsbSpace : (hsbVisible ? hsbHighlight : 0)); - top += (vsbVisible ? vsbHighlight : 0); - right += (hsbVisible ? hsbHighlight : 0); - break; - - case XmTOP_RIGHT: - top += (hsbVisible ? hsbSpace : (vsbVisible ? vsbHighlight : 0)); - right += (vsbVisible ? vsbSpace : (hsbVisible ? hsbHighlight : 0)); - bottom += (vsbVisible ? vsbHighlight : 0); - left += (hsbVisible ? hsbHighlight : 0); - break; - - case XmTOP_LEFT: - top += (hsbVisible ? hsbSpace : (vsbVisible ? vsbHighlight : 0)); - left += (vsbVisible ? vsbSpace : (hsbVisible ? hsbHighlight : 0)); - bottom += (vsbVisible ? vsbHighlight : 0); - right += (hsbVisible ? hsbHighlight : 0); - } - } - /* Deadlock prevention: - * don't hold the toolkit lock while invoking constructor. - */ - AWT_UNLOCK(); - - clazz = (*env)->FindClass(env, "java/awt/Insets"); - mid = (*env)->GetMethodID(env, clazz, "", "(IIII)V"); - if (mid != NULL) { - insets = (*env)->NewObject(env, clazz, mid, - (jint) top, - (jint) left, - (jint) bottom, - (jint) right); - - } - /* This should catch both method not found and error exceptions */ - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (JNU_IsNull(env, insets)) { - JNU_ThrowNullPointerException(env, "NullPointerException: insets constructor failed"); - } - return insets; -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: setScrollPosition - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MScrollPanePeer_setScrollPosition - (JNIEnv *env, jobject this, jint x, jint y) -{ - struct ComponentData *sdata; - jobject target; - Widget hsb, vsb; - int32_t size, incr, pIncr; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if (JNU_IsNull(env, target) || sdata == NULL || sdata->widget == NULL) - { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if ((*env)->GetIntField(env, target, scrollPaneIDs.scrollbarDisplayPolicy) - == java_awt_ScrollPane_SCROLLBARS_NEVER) { - WidgetList children; - Cardinal numChildren; - - XtVaGetValues(sdata->widget, - XmNchildren, &children, - XmNnumChildren, &numChildren, - NULL); - - if (numChildren < 1) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtMoveWidget(children[0], (Position) -x, (Position) -y); - } else { - int32_t sb_min = 0; - int32_t sb_max = 0; - XtVaGetValues(sdata->widget, - XmNhorizontalScrollBar, &hsb, - XmNverticalScrollBar, &vsb, - NULL); - - if (vsb) { - XtVaGetValues(vsb, - XmNincrement, &incr, - XmNpageIncrement, &pIncr, - XmNsliderSize, &size, - XmNminimum, &sb_min, - XmNmaximum, &sb_max, - NULL); - /* Bug 4208972, 4275934 : Do range checking for scroll bar value. */ - if (y < sb_min) - y = sb_min; - if (y > (sb_max - size)) - y = sb_max - size; - XmScrollBarSetValues(vsb, (int32_t) y, size, incr, pIncr, TRUE); - } - if (hsb) { - XtVaGetValues(hsb, - XmNincrement, &incr, - XmNpageIncrement, &pIncr, - XmNsliderSize, &size, - XmNminimum, &sb_min, - XmNmaximum, &sb_max, - NULL); - /* Bug 4208972, 4275934 : Do range checking for scroll bar value. */ - if (x < sb_min) - x = sb_min; - if (x > (sb_max - size)) - x = sb_max - size; - XmScrollBarSetValues(hsb, (int32_t) x, size, incr, pIncr, TRUE); - } - } - AWT_FLUSH_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: pGetShadow - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MScrollPanePeer_pGetShadow( - JNIEnv *env, jobject this) { - struct ComponentData *sdata; - jobject target; - Dimension shadow=0 ; - - AWT_LOCK() ; - sdata = (struct ComponentData *) - (*env)->GetLongField(env,this,mComponentPeerIDs.pData); - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if (JNU_IsNull(env, target) || sdata == NULL || sdata->widget == NULL) - { - JNU_ThrowNullPointerException(env, "sdata is NULL"); - AWT_UNLOCK(); - return 0; - } - - XtVaGetValues(sdata->widget, - XmNshadowThickness, - &shadow, - NULL); - - AWT_UNLOCK() ; - - return((jint)shadow) ; -} - -/* - * Class: sun_awt_motif_MScrollPanePeer - * Method: setTypedValue - * Signature: (Ljava/awt/ScrollPaneAdjustable;II)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MScrollPanePeer_setTypedValue(JNIEnv *env, jobject peer, jobject adjustable, jint value, jint type) -{ - static jmethodID setTypedValueMID = 0; - if (setTypedValueMID == NULL) { - jclass clazz = (*env)->FindClass(env, "java/awt/ScrollPaneAdjustable"); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - return; - } - setTypedValueMID = (*env)->GetMethodID(env, clazz, "setTypedValue", "(II)V"); - (*env)->DeleteLocalRef(env, clazz); - - DASSERT(setTypedValueMID != NULL); - } - (*env)->CallVoidMethod(env, adjustable, setTypedValueMID, value, type); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Scrollbar.c --- a/jdk/src/solaris/native/sun/awt/awt_Scrollbar.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,440 +0,0 @@ -/* - * Copyright 1995-2004 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 "java_awt_Scrollbar.h" -#include "java_awt_event_MouseEvent.h" -#include "sun_awt_motif_MScrollbarPeer.h" -#include "sun_awt_motif_MComponentPeer.h" - -#include "awt_Component.h" -#include "canvas.h" - -#include -#include -#include "multi_font.h" - - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); - -/* fieldIDs for java.awt.Scrollbar fields that may be accessed from C */ -static struct ScrollbarIDs { - jfieldID orientation; - jfieldID visibleAmount; - jfieldID lineIncrement; - jfieldID pageIncrement; - jfieldID value; - jfieldID minimum; - jfieldID maximum; -} targetIDs; - -/* MScrollbarPeer callback methods */ -static struct { - jmethodID lineUp; - jmethodID lineDown; - jmethodID pageUp; - jmethodID pageDown; - jmethodID drag; - jmethodID dragEnd; - jmethodID warp; -} peerIDs; - - - -/* - * Class: java_awt_ScrollBar - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - Scrollbar.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL -Java_java_awt_Scrollbar_initIDs(JNIEnv *env, jclass cls) -{ - targetIDs.orientation = - (*env)->GetFieldID(env, cls, "orientation", "I"); - targetIDs.visibleAmount = - (*env)->GetFieldID(env, cls, "visibleAmount", "I"); - targetIDs.lineIncrement = - (*env)->GetFieldID(env, cls, "lineIncrement", "I"); - targetIDs.pageIncrement = - (*env)->GetFieldID(env, cls, "pageIncrement", "I"); - targetIDs.value = - (*env)->GetFieldID(env, cls, "value", "I"); - targetIDs.minimum = - (*env)->GetFieldID(env, cls, "minimum", "I"); - targetIDs.maximum = - (*env)->GetFieldID(env, cls, "maximum", "I"); -} - - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MScrollbarPeer to initialize the JNI ids for fields and methods - that may be accessed from C */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MScrollbarPeer_initIDs(JNIEnv *env, jclass cls) -{ - peerIDs.lineUp = - (*env)->GetMethodID(env, cls, "lineUp", "(I)V"); - peerIDs.lineDown = - (*env)->GetMethodID(env, cls, "lineDown", "(I)V"); - peerIDs.pageUp = - (*env)->GetMethodID(env, cls, "pageUp", "(I)V"); - peerIDs.pageDown = - (*env)->GetMethodID(env, cls, "pageDown", "(I)V"); - peerIDs.drag = - (*env)->GetMethodID(env, cls, "drag", "(I)V"); - peerIDs.dragEnd = - (*env)->GetMethodID(env, cls, "dragEnd", "(I)V"); - peerIDs.warp = - (*env)->GetMethodID(env, cls, "warp", "(I)V"); -} - -/* - * Call peer.jcallback(value) - */ -static void -DoJavaCallback(jobject peer, jmethodID jcallback, jint value) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - (*env)->CallVoidMethod(env, peer, jcallback, value); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - - -static void /* XtCallbackProc */ -decrementCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_DECREMENT); - DoJavaCallback(peer, peerIDs.lineUp, scroll->value); -} - -static void /* XtCallbackProc */ -incrementCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_INCREMENT); - DoJavaCallback(peer, peerIDs.lineDown, scroll->value); -} - -static void /* XtCallbackProc */ -pageDecrementCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_PAGE_DECREMENT); - DoJavaCallback(peer, peerIDs.pageUp, scroll->value); -} - -static void /* XtCallbackProc */ -pageIncrementCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_PAGE_INCREMENT); - DoJavaCallback(peer, peerIDs.pageDown, scroll->value); -} - -static void /* XtCallbackProc */ -dragCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_DRAG); - DoJavaCallback(peer, peerIDs.drag, scroll->value); -} - -static void /* XtCallbackProc */ -dragEndCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_VALUE_CHANGED); - DoJavaCallback(peer, peerIDs.dragEnd, scroll->value); -} - -static void /* XtCallbackProc */ -toTopCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_TO_TOP); - DoJavaCallback(peer, peerIDs.warp, scroll->value); -} - -static void /* XtCallbackProc */ -toBottomCallback(Widget w, jobject peer, - XmScrollBarCallbackStruct *scroll) -{ - DASSERT(scroll->reason == XmCR_TO_BOTTOM); - DoJavaCallback(peer, peerIDs.warp, scroll->value); -} - - -/* - * Class: sun_awt_motif_MScrollbarPeer - * Method: create - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MScrollbarPeer_create(JNIEnv *env, jobject this, - jobject parent) -{ - Widget w; - - jobject target; - XtPointer globalRef = (XtPointer) /* jobject */ - awtJNI_CreateAndSetGlobalRef(env, this); - - struct ComponentData *pdata; /* for parent */ - struct ComponentData *sdata; /* for scrollbar */ - AwtGraphicsConfigDataPtr adata; - - int32_t value, visible, minimum, maximum; - int32_t lineIncrement, pageIncrement; - Pixel bg; - -#define MAX_ARGC 20 - Arg args[MAX_ARGC]; - int32_t argc = 0; - - - AWT_LOCK(); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - pdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, parent, mComponentPeerIDs.pData); - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if (JNU_IsNull(env, target) || pdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - - switch ((*env)->GetIntField(env, target, targetIDs.orientation)) { - case java_awt_Scrollbar_HORIZONTAL: - XtSetArg(args[argc], XmNorientation, XmHORIZONTAL); - argc++; - break; - - case java_awt_Scrollbar_VERTICAL: - XtSetArg(args[argc], XmNorientation, XmVERTICAL); - argc++; - break; - - default: - JNU_ThrowIllegalArgumentException(env, "bad scrollbar orientation"); - AWT_UNLOCK(); - return; - } - - adata = copyGraphicsConfigToPeer(env, this); - XtVaGetValues(pdata->widget, XmNbackground, &bg, NULL); - - visible = (int32_t) (*env)->GetIntField(env, target, targetIDs.visibleAmount); - value = (int32_t) (*env)->GetIntField(env, target, targetIDs.value); - minimum = (int32_t) (*env)->GetIntField(env, target, targetIDs.minimum); - maximum = (int32_t) (*env)->GetIntField(env, target, targetIDs.maximum); - lineIncrement = - (int32_t) (*env)->GetIntField(env, target, targetIDs.lineIncrement); - pageIncrement = - (int32_t) (*env)->GetIntField(env, target, targetIDs.pageIncrement); - - /* - * Sanity check. Scrollbar.setValues should have taken care. - */ - DASSERT(maximum > minimum); - DASSERT(visible <= maximum - minimum); - DASSERT(visible >= 1); - DASSERT(value >= minimum); - DASSERT(value <= maximum - visible); - - XtSetArg(args[argc], XmNx, 0); argc++; - XtSetArg(args[argc], XmNy, 0); argc++; - XtSetArg(args[argc], XmNvalue, value); argc++; - XtSetArg(args[argc], XmNsliderSize, visible); argc++; - XtSetArg(args[argc], XmNminimum, minimum); argc++; - XtSetArg(args[argc], XmNmaximum, maximum); argc++; - XtSetArg(args[argc], XmNincrement, lineIncrement); argc++; - XtSetArg(args[argc], XmNpageIncrement, pageIncrement); argc++; - XtSetArg(args[argc], XmNbackground, bg); argc++; - XtSetArg(args[argc], XmNrecomputeSize, False); argc++; - XtSetArg(args[argc], XmNuserData, globalRef); argc++; - XtSetArg(args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen)); argc++; - - DASSERT(argc <= MAX_ARGC); /* sanity check */ - - sdata = ZALLOC(ComponentData); - if (sdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - - JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, sdata); - - sdata->widget = w = - XmCreateScrollBar(pdata->widget, "scrollbar", args, argc); - - XtAddCallback(w, XmNdecrementCallback, - (XtCallbackProc)decrementCallback, globalRef); - XtAddCallback(w, XmNincrementCallback, - (XtCallbackProc)incrementCallback, globalRef); - XtAddCallback(w, XmNpageDecrementCallback, - (XtCallbackProc)pageDecrementCallback, globalRef); - XtAddCallback(w, XmNpageIncrementCallback, - (XtCallbackProc)pageIncrementCallback, globalRef); - XtAddCallback(w, XmNtoTopCallback, - (XtCallbackProc)toTopCallback, globalRef); - XtAddCallback(w, XmNtoBottomCallback, - (XtCallbackProc)toBottomCallback, globalRef); - XtAddCallback(w, XmNdragCallback, - (XtCallbackProc)dragCallback, globalRef); - XtAddCallback(w, XmNvalueChangedCallback, - (XtCallbackProc)dragEndCallback, globalRef); - - /* Set up workaround for the continuous scrolling bug */ - XtAddEventHandler(w, ButtonReleaseMask, False, - awt_motif_Scrollbar_ButtonReleaseHandler, NULL); - - /* Fix for 4955950. ButtonRelease & MotionNotify should be handled as well */ - XtAddEventHandler(w, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, - False, awt_canvas_event_handler, globalRef); - - XtSetMappedWhenManaged(w, False); - XtManageChild(w); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MScrollbarPeer - * Method: pSetValues - * Signature: (IIII)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MScrollbarPeer_pSetValues(JNIEnv *env, jobject this, - jint value, jint visible, jint minimum, jint maximum) -{ - struct ComponentData *sdata; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - /* pass in visible for sliderSize since Motif will calculate the */ - /* slider's size for us. */ - XtVaSetValues(sdata->widget, - XmNminimum, minimum, - XmNmaximum, maximum, - XmNvalue, value, - XmNsliderSize, visible, - NULL); - AWT_FLUSH_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MScrollbarPeer - * Method: setLineIncrement - * Signature: (I)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MScrollbarPeer_setLineIncrement(JNIEnv *env, jobject this, - jint value) -{ - struct ComponentData *sdata; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(sdata->widget, - XmNincrement, value, - NULL); - AWT_FLUSH_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MScrollbarPeer - * Method: setPageIncrement - * Signature: (I)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MScrollbarPeer_setPageIncrement(JNIEnv *env, jobject this, - jint value) -{ - struct ComponentData *sdata; - - AWT_LOCK(); - - sdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (sdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(sdata->widget, - XmNpageIncrement, value, - NULL); - AWT_FLUSH_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_Selection.c --- a/jdk/src/solaris/native/sun/awt/awt_Selection.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,508 +0,0 @@ -/* - * Copyright 1996-2003 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 "awt_DataTransferer.h" -#include "java_awt_datatransfer_Transferable.h" -#include "java_awt_datatransfer_DataFlavor.h" -#include "sun_awt_motif_X11Selection.h" -#include "sun_awt_motif_X11Clipboard.h" -#include -#include -#include - -#include -#include - -/* fieldIDs for X11Selection fields that may be accessed from C */ -static struct X11SelectionIDs { - jfieldID holder; - jfieldID atom; - jfieldID contents; - jfieldID selections; -} x11SelectionIDs; - -DECLARE_JAVA_CLASS(selectionClazz, "sun/awt/motif/X11Selection") - -static jobject -call_getSelectionsArray(JNIEnv* env) { - DECLARE_STATIC_OBJECT_JAVA_METHOD(getSelectionsArray, selectionClazz, - "getSelectionsArray", "()[Ljava/lang/Object;") - DASSERT(!JNU_IsNull(env, getSelectionsArray)); - return (*env)->CallStaticObjectMethod(env, clazz, getSelectionsArray); -} - -static void -call_checkChange(JNIEnv* env, jobject jselection, jlongArray targetArray) -{ - DECLARE_VOID_JAVA_METHOD(checkChangeMID, selectionClazz, - "checkChange", "([J)V") - DASSERT(!JNU_IsNull(env, jselection)); - - (*env)->CallVoidMethod(env, jselection, checkChangeMID, targetArray); -} - -static jlongArray -call_getSelectionAtomsToCheckChange(JNIEnv* env) -{ - DECLARE_STATIC_OBJECT_JAVA_METHOD(getSelectionAtomsToCheckChangeMID, - selectionClazz, "getSelectionAtomsToCheckChange", "()[J") - - return (jlongArray)(*env)->CallStaticObjectMethod(env, - get_selectionClazz(env), getSelectionAtomsToCheckChangeMID); - -} - - -/* - * Class: sun_awt_motif_X11Selection - * Method: initIDs - * Signature: ()V - */ -/* This function gets called from the static initializer for - X11Selection.java to initialize the fieldIDs for fields that may - be accessed from C */ -JNIEXPORT void JNICALL Java_sun_awt_motif_X11Selection_initIDs - (JNIEnv *env, jclass cls) -{ - x11SelectionIDs.holder = (*env)-> - GetFieldID(env, cls, "holder","Lsun/awt/motif/X11SelectionHolder;"); - x11SelectionIDs.atom = (*env)->GetFieldID(env, cls, "atom", "J"); - x11SelectionIDs.contents = (*env)-> - GetFieldID(env, cls, "contents", - "Ljava/awt/datatransfer/Transferable;"); - x11SelectionIDs.selections = (*env)-> - GetStaticFieldID(env, cls, "selections", "Ljava/util/Vector;"); -} - -/* - * Class: sun_awt_motif_X11Selection - * Method: init - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_X11Selection_init - (JNIEnv *env, jclass this) -{ - AWT_LOCK(); - - AWT_UNLOCK(); -} - -static jobject -getX11Selection(JNIEnv * env, Atom atom) -{ - jobjectArray selections; - jsize selectionCount, i; - jobject selection; - jobject returnSelection = NULL; - - selections = (jobjectArray)call_getSelectionsArray(env); - - if (JNU_IsNull(env, selections)) { - return NULL; - } - - selectionCount = (*env)->GetArrayLength(env, selections); - - for (i = 0; i < selectionCount; i++) { - selection = (*env)->GetObjectArrayElement(env, selections, i); - if ((*env)->ExceptionCheck(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - break; - } - if (JNU_IsNull(env, selection)) { - break; - } - if ((*env)->GetLongField(env, selection, x11SelectionIDs.atom) == atom) { - returnSelection = selection; - } else { - (*env)->DeleteLocalRef(env, selection); - } - } - - (*env)->DeleteLocalRef(env, selections); - - return returnSelection; -} - -Boolean -awtJNI_isSelectionOwner(JNIEnv * env, char *sel_str) -{ - Atom selection; - jobject x11sel; - - selection = XInternAtom(awt_display, sel_str, False); - - x11sel = getX11Selection(env, selection); - if (!JNU_IsNull(env, x11sel)) { - jobject holder; - - holder = (*env)->GetObjectField(env, x11sel, x11SelectionIDs.holder); - if (!JNU_IsNull(env, holder)) { - return TRUE; - } - } - return FALSE; -} - -static void losingSelectionOwnership(Widget w, Atom * selection); - -void -awtJNI_notifySelectionLost(JNIEnv * env, char *sel_str) -{ - Atom selection; - - selection = XInternAtom(awt_display, sel_str, False); - losingSelectionOwnership(NULL, &selection); -} - -static void -losingSelectionOwnership(Widget w, Atom * selection) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = getX11Selection(env, *selection); - - /* - * SECURITY: OK to call this on privileged thread - peer does - * not call into client code - */ - JNU_CallMethodByName(env, NULL, this, "lostSelectionOwnership", "()V"); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - /* - * Fix for 4692059. - * The native context is cleaned up on the event dispatch thread after the - * references to the current contents and owner are cleared. - */ -} - -/* - * Class: sun_awt_motif_X11Selection - * Method: pGetSelectionOwnership - * Signature: (Ljava/lang/Object;Ljava/awt/datatransfer/Transferable;[JLjava/util/Map;Lsun/awt/motif/X11SelectionHolder;)Z - */ -JNIEXPORT jboolean JNICALL -Java_sun_awt_motif_X11Selection_pGetSelectionOwnership(JNIEnv *env, - jobject this, - jobject source, - jobject transferable, - jlongArray formats, - jobject formatMap, - jobject holder) -{ - Boolean gotit = False; - Atom selection = (Atom)(*env)->GetLongField(env, this, - x11SelectionIDs.atom); - awt_convertDataCallbackStruct* structPtr = NULL; - Time time = CurrentTime; - - AWT_LOCK(); - - time = awt_util_getCurrentServerTime(); - - (*env)->SetObjectField(env, this, x11SelectionIDs.holder, NULL); - (*env)->SetObjectField(env, this, x11SelectionIDs.contents, NULL); - - gotit = XtOwnSelection(awt_root_shell, selection, time, awt_convertData, - losingSelectionOwnership, NULL); - - if (gotit) { - if (XFindContext(awt_display, selection, awt_convertDataContext, - (XPointer*)&structPtr) == 0 && structPtr != NULL) { - (*env)->DeleteGlobalRef(env, structPtr->source); - (*env)->DeleteGlobalRef(env, structPtr->transferable); - (*env)->DeleteGlobalRef(env, structPtr->formatMap); - (*env)->DeleteGlobalRef(env, structPtr->formats); - memset(structPtr, 0, sizeof(awt_convertDataCallbackStruct)); - } else { - XDeleteContext(awt_display, selection, awt_convertDataContext); - - structPtr = calloc(1, sizeof(awt_convertDataCallbackStruct)); - - if (structPtr == NULL) { - XtDisownSelection(awt_root_shell, selection, time); - AWT_UNLOCK(); - JNU_ThrowOutOfMemoryError(env, ""); - return JNI_FALSE; - } - - if (XSaveContext(awt_display, selection, awt_convertDataContext, - (XPointer)structPtr) == XCNOMEM) { - XtDisownSelection(awt_root_shell, selection, time); - free(structPtr); - AWT_UNLOCK(); - JNU_ThrowInternalError(env, "Failed to save context data for selection."); - return JNI_FALSE; - } - } - - structPtr->source = (*env)->NewGlobalRef(env, source); - structPtr->transferable = (*env)->NewGlobalRef(env, transferable); - structPtr->formatMap = (*env)->NewGlobalRef(env, formatMap); - structPtr->formats = (*env)->NewGlobalRef(env, formats); - - if (JNU_IsNull(env, structPtr->source) || - JNU_IsNull(env, structPtr->transferable) || - JNU_IsNull(env, structPtr->formatMap) || - JNU_IsNull(env, structPtr->formats)) { - - if (!JNU_IsNull(env, structPtr->source)) { - (*env)->DeleteGlobalRef(env, structPtr->source); - } - if (!JNU_IsNull(env, structPtr->transferable)) { - (*env)->DeleteGlobalRef(env, structPtr->transferable); - } - if (!JNU_IsNull(env, structPtr->formatMap)) { - (*env)->DeleteGlobalRef(env, structPtr->formatMap); - } - if (!JNU_IsNull(env, structPtr->formats)) { - (*env)->DeleteGlobalRef(env, structPtr->formats); - } - XtDisownSelection(awt_root_shell, selection, time); - XDeleteContext(awt_display, selection, awt_convertDataContext); - free(structPtr); - AWT_UNLOCK(); - JNU_ThrowOutOfMemoryError(env, ""); - return JNI_FALSE; - } - - (*env)->SetObjectField(env, this, x11SelectionIDs.holder, holder); - (*env)->SetObjectField(env, this, x11SelectionIDs.contents, transferable); - } - AWT_UNLOCK(); - - return (gotit ? JNI_TRUE : JNI_FALSE); -} - -/* - * Class: sun_awt_motif_X11Selection - * Method: clearNativeContext - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_X11Selection_clearNativeContext(JNIEnv *env, jobject this) { - Atom selection = (Atom)(*env)->GetLongField(env, this, - x11SelectionIDs.atom); - - AWT_LOCK(); - - XtDisownSelection(awt_root_shell, selection, CurrentTime); - awt_cleanupConvertDataContext(env, selection); - - AWT_UNLOCK(); -} - - -static void -getSelectionTargetsToCheckChange(Widget w, XtPointer client_data, - Atom * selection, Atom * type, XtPointer value, unsigned long *length, - int32_t *format) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - size_t count = 0, i = 0, j = 0; - jlongArray targetArray = NULL; - - // Should keep this in sync with getSelectionTargets() so that - // this function yields non-null targetArray iff - // getSelectionTargets() yields SelectionSuccess. - if (*type == XA_TARGETS || *type == XA_ATOM) { - targetArray = getSelectionTargetsHelper(env, value, *length); - } else if (*type != XT_CONVERT_FAIL) { - targetArray = (*env)->NewLongArray(env, 0); - } - - if (value != NULL) { - XtFree(value); - value = NULL; - } - - { - jobject jselection = getX11Selection(env, *selection); - call_checkChange(env, jselection, targetArray); - if ((*env)->ExceptionCheck(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - (*env)->DeleteLocalRef(env, targetArray); - (*env)->DeleteLocalRef(env, jselection); - } -} - - -static Atom _XA_JAVA_TIME_PROPERTY_ATOM_CHECK_SELECTION_CHANGE_ON_TIMEOUT = 0; - -static void -checkSelectionChangeOnTimeout(XtPointer client_data, XtIntervalId* id) -{ - // We don't call XtGetSelectionValue(..., TARGETS, ..., awt_util_getCurrentServerTime()) - // here because awt_util_getCurrentServerTime() may block toolkit therad for a while - // whereas the current function is called very often at regular intervals. - // Instead we call XtGetSelectionValue(..., XtLastTimestampProcessed(awt_display)) - // in the property change event handler wherein we have got an up-to-date timestamp. - - XChangeProperty(awt_display, XtWindow(awt_root_shell), - _XA_JAVA_TIME_PROPERTY_ATOM_CHECK_SELECTION_CHANGE_ON_TIMEOUT, - XA_ATOM, 32, PropModeAppend, (unsigned char *)"", 0); - XFlush(awt_display); -} - - -static unsigned long selectionPollInterval; - -static void -propertyChangeEventHandlerToSelectionCheck -(Widget w, XtPointer client_data, XEvent* event, Boolean* continue_to_dispatch) -{ - JNIEnv *env; - jlongArray jselectionAtoms; - - if (event->type != PropertyNotify || event->xproperty.atom != - _XA_JAVA_TIME_PROPERTY_ATOM_CHECK_SELECTION_CHANGE_ON_TIMEOUT) { - return; - } - - env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jselectionAtoms = call_getSelectionAtomsToCheckChange(env); - - DASSERT(!JNU_IsNull(env, jselectionAtoms)); - if ((*env)->ExceptionCheck(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } else { - jsize len = (*env)->GetArrayLength(env, jselectionAtoms); - jlong* selectionAtomsNative = - (*env)->GetLongArrayElements(env, jselectionAtoms, NULL); - if (!JNU_IsNull(env, selectionAtomsNative)) { - jsize i = 0; - for (i = 0; i < len; i++) { - XtGetSelectionValue(awt_root_shell, (Atom)selectionAtomsNative[i], XA_TARGETS, - getSelectionTargetsToCheckChange, (XtPointer)NULL, - XtLastTimestampProcessed(awt_display)); - } - (*env)->ReleaseLongArrayElements(env, jselectionAtoms, - selectionAtomsNative, JNI_ABORT); - } - } - - // Reschedule the timer callback. - XtAppAddTimeOut(awt_appContext, selectionPollInterval, - checkSelectionChangeOnTimeout, client_data); -} - - -static BOOL isClipboardViewerRegistered = FALSE; - -/* - * Class: sun_awt_motif_X11Clipboard - * Method: registerClipboardViewer - * Signature: (I)V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_X11Clipboard_registerClipboardViewer(JNIEnv *env, jobject self, - jint pollInterval) -{ - AWT_LOCK(); - - if (isClipboardViewerRegistered) { - AWT_UNLOCK(); - return; - } - - if (_XA_JAVA_TIME_PROPERTY_ATOM_CHECK_SELECTION_CHANGE_ON_TIMEOUT == 0) { - _XA_JAVA_TIME_PROPERTY_ATOM_CHECK_SELECTION_CHANGE_ON_TIMEOUT = - XInternAtom(awt_display, - "_SUNW_JAVA_AWT_TIME_CHECK_SELECTION_CHANGE_ON_TIMEOUT", - False); - } - - XtAddEventHandler(awt_root_shell, PropertyChangeMask, False, - propertyChangeEventHandlerToSelectionCheck, NULL); - - selectionPollInterval = pollInterval; - - XtAppAddTimeOut(awt_appContext, selectionPollInterval, - checkSelectionChangeOnTimeout, (XtPointer)NULL); - - isClipboardViewerRegistered = TRUE; - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_X11Clipboard - * Method: unregisterClipboardViewer - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_X11Clipboard_unregisterClipboardViewer(JNIEnv *env, jobject self) -{ - AWT_LOCK(); - - if (!isClipboardViewerRegistered) { - AWT_UNLOCK(); - return; - } - - XtRemoveEventHandler(awt_root_shell, PropertyChangeMask, False, - propertyChangeEventHandlerToSelectionCheck, NULL); - - isClipboardViewerRegistered = FALSE; - - AWT_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_X11Clipboard - * Method: getClipboardFormats - * Signature: (J)[J - */ -JNIEXPORT jlongArray JNICALL -Java_sun_awt_motif_X11Clipboard_getClipboardFormats - (JNIEnv *env, jclass cls, jlong selectionAtom) -{ - Time time_stamp = awt_util_getCurrentServerTime(); - return get_selection_targets(env, selectionAtom, time_stamp); -} - -/* - * Class: sun_awt_motif_X11Clipboard - * Method: getClipboardData - * Signature: (JJ)[B - */ -JNIEXPORT jbyteArray JNICALL -Java_sun_awt_motif_X11Clipboard_getClipboardData - (JNIEnv *env, jclass cls, jlong selectionAtom, jlong format) -{ - Time time_stamp = awt_util_getCurrentServerTime(); - return get_selection_data(env, selectionAtom, format, time_stamp); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_TextArea.c --- a/jdk/src/solaris/native/sun/awt/awt_TextArea.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1003 +0,0 @@ -/* - * Copyright 1995-2003 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 "canvas.h" -#include "java_awt_TextArea.h" -#include "java_awt_Cursor.h" -#include "java_awt_Component.h" -#include "java_awt_Color.h" -#include "java_awt_AWTEvent.h" -#include "java_awt_Font.h" -#include "java_awt_event_MouseWheelEvent.h" -#include "sun_awt_motif_MTextAreaPeer.h" -#include "sun_awt_motif_MComponentPeer.h" - -#include "awt_Component.h" -#include "awt_Cursor.h" -#include "awt_TextArea.h" - -#include -#include -#include "multi_font.h" - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct CursorIDs cursorIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); -struct TextAreaIDs textAreaIDs; -struct MTextAreaPeerIDs mTextAreaPeerIDs; - -/* - * Class: java_awt_TextArea - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for TextArea.java - to initialize the fieldIDs for fields that may be accessed from C */ - -JNIEXPORT void JNICALL -Java_java_awt_TextArea_initIDs - (JNIEnv *env, jclass cls) -{ - textAreaIDs.scrollbarVisibility = - (*env)->GetFieldID(env, cls, "scrollbarVisibility", "I"); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MTextAreaPeer.java to initialize the fieldIDs for fields that may - be accessed from C */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_MTextAreaPeer_initIDs - (JNIEnv *env, jclass cls) -{ - mTextAreaPeerIDs.firstChangeSkipped = - (*env)->GetFieldID(env, cls, "firstChangeSkipped", "Z"); -} - -/* - * client_data is MTextAreaPeer instance - */ -void -TextArea_valueChanged(Widget w, XtPointer client_data, XtPointer call_data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jboolean skipped; - - skipped = (*env)->GetBooleanField(env, (jobject) client_data, - mTextAreaPeerIDs.firstChangeSkipped); - if (!(*env)->ExceptionOccurred(env)) { - if (skipped == JNI_FALSE) { - (*env)->SetBooleanField(env, (jobject) client_data, - mTextAreaPeerIDs.firstChangeSkipped, - JNI_TRUE); - } else { - JNU_CallMethodByName(env, NULL, (jobject) client_data, - "valueChanged", "()V"); - } - } - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -extern void Text_handlePaste(Widget w, XtPointer client_data, XEvent * event, - Boolean * cont); - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: pCreate - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pCreate - (JNIEnv *env, jobject this, jobject parent) -{ - struct TextAreaData *tdata; -#define MAX_ARGC 30 - Arg args[MAX_ARGC]; - int32_t argc; - struct ComponentData *wdata; - jobject target; - Pixel bg; - int32_t sbVisibility; - Boolean wordWrap = False, hsb = False, vsb = False; - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - char *nonEmptyText = "* will never be shown *"; - - AWT_LOCK(); - - adata = copyGraphicsConfigToPeer(env, this); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData); - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - tdata = ZALLOC(TextAreaData); - JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,tdata); - - if (tdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL); - - sbVisibility = (*env)->GetIntField(env, target, - textAreaIDs.scrollbarVisibility); - switch (sbVisibility) { - case java_awt_TextArea_SCROLLBARS_NONE: - wordWrap = True; - hsb = False; - vsb = False; - break; - - case java_awt_TextArea_SCROLLBARS_VERTICAL_ONLY: - wordWrap = True; - hsb = False; - vsb = True; - break; - - case java_awt_TextArea_SCROLLBARS_HORIZONTAL_ONLY: - wordWrap = False; - hsb = True; - vsb = False; - break; - - default: - case java_awt_TextArea_SCROLLBARS_BOTH: - wordWrap = False; - hsb = True; - vsb = True; - break; - } - - argc = 0; - XtSetArg(args[argc], XmNrecomputeSize, False); - argc++; - XtSetArg(args[argc], XmNx, 0); - argc++; - XtSetArg(args[argc], XmNy, 0); - argc++; - XtSetArg(args[argc], XmNbackground, bg); - argc++; - XtSetArg(args[argc], XmNeditMode, XmMULTI_LINE_EDIT); - argc++; - XtSetArg(args[argc], XmNwordWrap, wordWrap); - argc++; - XtSetArg(args[argc], XmNscrollHorizontal, hsb); - argc++; - XtSetArg(args[argc], XmNscrollVertical, vsb); - argc++; - XtSetArg(args[argc], XmNmarginHeight, 2); - argc++; - XtSetArg(args[argc], XmNmarginWidth, 2); - argc++; - XtSetArg(args[argc], XmNuserData, (XtPointer) globalRef); - argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen)); - argc++; - XtSetArg(args[argc], XmNfontList, getMotifFontList()); - argc++; - - /* Initialize with a non-empty text, so the - * TextArea_valueChanged callback will be called - * even if the following conditions are true: - * 1. TextArea constructed with an empty initial text. - * 2. setText() with an empty argument is called - * immediately after the TextArea component is created. - * For more details please see #4028580. - */ - XtSetArg(args[argc], XmNvalue, nonEmptyText); - argc++; - - DASSERT(!(argc > MAX_ARGC)); - tdata->txt = XmCreateScrolledText(wdata->widget, "textA", - args, argc); - tdata->comp.widget = XtParent(tdata->txt); - - /* Bug 4208972. Give the ScrolledWindow a minimum size. */ - XtVaSetValues(tdata->comp.widget, - XmNwidth, 1, - XmNheight, 1, NULL); - - XtSetMappedWhenManaged(tdata->comp.widget, False); - XtManageChild(tdata->txt); - XtManageChild(tdata->comp.widget); - - XtAddCallback(tdata->txt, - XmNvalueChangedCallback, - TextArea_valueChanged, - (XtPointer) globalRef); - - XtAddEventHandler(tdata->txt, FocusChangeMask, - True, awt_canvas_event_handler, globalRef); - - XtInsertEventHandler(tdata->txt, - KeyPressMask, - False, Text_handlePaste, (XtPointer) globalRef, - XtListHead); - - awt_addWidget(tdata->txt, tdata->comp.widget, globalRef, - java_awt_AWTEvent_KEY_EVENT_MASK | - java_awt_AWTEvent_MOUSE_EVENT_MASK | - java_awt_AWTEvent_MOUSE_MOTION_EVENT_MASK); - /* - * Fix for BugTraq ID 4349615. - * Unregister Motif drop site to prevent it from crash - * when dropping java objects. - */ - XmDropSiteUnregister(tdata->txt); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: getExtraWidth - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getExtraWidth - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - Dimension spacing, shadowThickness, textMarginWidth, sbWidth; - Widget verticalScrollBar; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - XtVaGetValues(tdata->txt, XmNmarginWidth, &textMarginWidth, NULL); - XtVaGetValues(tdata->comp.widget, - XmNspacing, &spacing, - XmNverticalScrollBar, &verticalScrollBar, - NULL); - if (verticalScrollBar != NULL) { - /* Assumption: shadowThickness same for scrollbars and text area */ - XtVaGetValues(verticalScrollBar, - XmNwidth, &sbWidth, - XmNshadowThickness, &shadowThickness, - NULL); - } else { - sbWidth = 0; - shadowThickness = 0; - } - - AWT_UNLOCK(); - - return (jint) (sbWidth + spacing + 2 * textMarginWidth + 4 * shadowThickness); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: getExtraHeight - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getExtraHeight - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - Dimension spacing, shadowThickness, textMarginHeight, sbHeight; - Dimension sbShadowThickness, highlightThickness, sbHighlightThickness; - int32_t height; - Widget horizontalScrollBar; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - - XtVaGetValues(tdata->txt, XmNmarginHeight, &textMarginHeight, - XmNshadowThickness, &shadowThickness, - XmNhighlightThickness, &highlightThickness, NULL); - height = 2 * (textMarginHeight + shadowThickness + highlightThickness); - - XtVaGetValues(tdata->comp.widget, - XmNspacing, &spacing, - XmNhorizontalScrollBar, &horizontalScrollBar, - NULL); - - if (horizontalScrollBar != NULL) { - XtVaGetValues(horizontalScrollBar, - XmNshadowThickness, &sbShadowThickness, - XmNhighlightThickness, &sbHighlightThickness, - XmNheight, &sbHeight, - NULL); - height += sbHeight + spacing - + 2 * (sbShadowThickness + sbHighlightThickness); - } - - AWT_UNLOCK(); - - return (jint)height; -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: setTextBackground - * Signature: (Ljava/awt/Color;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setTextBackground - (JNIEnv *env, jobject this, jobject c) -{ - struct TextAreaData *tdata; - Pixel color; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL || JNU_IsNull(env, c)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - color = awtJNI_GetColor(env, c); - XtVaSetValues(tdata->txt, - XmNbackground, color, - NULL); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: pSetEditable - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pSetEditable - (JNIEnv *env, jobject this, jboolean editable) -{ - struct TextAreaData *tdata; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(tdata->txt, - XmNeditable, (editable ? True : False), - XmNcursorPositionVisible, (editable ? True : False), - NULL); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: select - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_select - (JNIEnv *env, jobject this, jint start, jint end) -{ - struct TextAreaData *tdata; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XmTextSetSelection(tdata->txt, (XmTextPosition) start, (XmTextPosition) end, 0); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: getSelectionStart - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getSelectionStart - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - XmTextPosition start, end, pos; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - if (XmTextGetSelectionPosition(tdata->txt, &start, &end) && - (start != end)) { - pos = start; - } else { - pos = XmTextGetInsertionPosition(tdata->txt); - } - AWT_UNLOCK(); - - return (jint) pos; -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: getSelectionEnd - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getSelectionEnd - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - XmTextPosition start, end, pos; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - if (XmTextGetSelectionPosition(tdata->txt, &start, &end) && - (start != end)) { - pos = end; - } else { - pos = XmTextGetInsertionPosition(tdata->txt); - } - AWT_UNLOCK(); - - return (jint) pos; -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: setText - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setText - (JNIEnv *env, jobject this, jstring txt) -{ - struct TextAreaData *tdata; - char *cTxt; - jobject font = awtJNI_GetFont(env, this); - - if (JNU_IsNull(env, txt)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - cTxt = (char *) JNU_GetStringPlatformChars(env, txt, NULL); - - if (cTxt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(tdata->txt, XmNvalue, cTxt, NULL); - - if (cTxt != NULL) { - JNU_ReleaseStringPlatformChars(env, txt, cTxt); - } - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: getText - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_sun_awt_motif_MTextAreaPeer_getText - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - char *cTxt; - jstring rval; - jobject font = awtJNI_GetFont(env, this); - - AWT_LOCK(); - - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env,this, mComponentPeerIDs.pData); - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return NULL; - } - cTxt = XmTextGetString(tdata->txt); - - rval = JNU_NewStringPlatform(env, (const char *) cTxt); - - XtFree(cTxt); - - AWT_UNLOCK(); - - return rval; -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: insert - * Signature: (Ljava/lang/String;I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_insert - (JNIEnv *env, jobject this, jstring txt, jint pos) -{ - struct TextAreaData *tdata; - char *cTxt; - jobject font = awtJNI_GetFont(env, this); - - if (JNU_IsNull(env, txt)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - cTxt = (char *) JNU_GetStringPlatformChars(env, txt, NULL); - - if (cTxt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XmTextInsert(tdata->txt, (XmTextPosition) pos, cTxt); - - if (cTxt != NULL) { - JNU_ReleaseStringPlatformChars(env, txt, cTxt); - } - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: replaceRange - * Signature: (Ljava/lang/String;II)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_replaceRange - (JNIEnv *env, jobject this, jstring txt, jint start, jint end) -{ - struct TextAreaData *tdata; - char *cTxt; - jobject font = awtJNI_GetFont(env, this); - - if (JNU_IsNull(env, txt)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - cTxt = (char *) JNU_GetStringPlatformChars(env, txt, NULL); - - if (cTxt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XmTextReplace(tdata->txt, - (XmTextPosition) start, - (XmTextPosition) end, - cTxt); - - if (cTxt != NULL) { - JNU_ReleaseStringPlatformChars(env, txt, cTxt); - } - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: setFont - * Signature: (Ljava/awt/Font;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setFont - (JNIEnv *env, jobject this, jobject f) -{ - struct TextAreaData *tdata; - struct FontData *fdata; - XmFontList fontlist; - char *err; - XmFontListEntry fontentry; - - if (JNU_IsNull(env, f)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - AWT_LOCK(); - - fdata = awtJNI_GetFontData(env, f, &err); - if (fdata == NULL) { - JNU_ThrowInternalError(env, err); - AWT_UNLOCK(); - return; - } - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (awtJNI_IsMultiFont(env, f)) { - if (fdata->xfs == NULL) { - fdata->xfs = awtJNI_MakeFontSet(env, f); - } - if (fdata->xfs != NULL) { - fontentry = XmFontListEntryCreate("labelFont", - XmFONT_IS_FONTSET, - (XtPointer) (fdata->xfs)); - fontlist = XmFontListAppendEntry(NULL, fontentry); - /* - * Some versions of motif have a bug in - * XmFontListEntryFree() which causes it to free more than it - * should. Use XtFree() instead. See O'Reilly's - * Motif Reference Manual for more information. - */ - XmFontListEntryFree(&fontentry); - - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - - if (fontlist != NULL) { - Dimension textw, texth; - Dimension w, h; - - XtVaGetValues(tdata->txt, - XmNwidth, &textw, - XmNheight, &texth, - NULL); - XtVaGetValues(tdata->comp.widget, - XmNwidth, &w, - XmNheight, &h, - NULL); - - /* Must set width/height when we set the font, else - * Motif resets the text to a single row. - */ - XtVaSetValues(tdata->txt, - XmNfontList, fontlist, - XmNwidth, textw, - XmNheight, texth, - NULL); - XtVaSetValues(tdata->comp.widget, - XmNwidth, w, - XmNheight, h, - NULL); - - XmFontListFree(fontlist); - } else { - JNU_ThrowNullPointerException(env, "NullPointerException"); - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: setCaretPosition - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setCaretPosition - (JNIEnv *env, jobject this, jint pos) -{ - struct TextAreaData *tdata; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XmTextSetInsertionPosition(tdata->txt, (XmTextPosition) pos); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: getCaretPosition - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getCaretPosition - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - XmTextPosition pos; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - pos = XmTextGetInsertionPosition(tdata->txt); - - AWT_UNLOCK(); - - return (jint) pos; -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: pShow - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pShow2 - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - - AWT_LOCK(); - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - awt_util_show(tdata->comp.widget); - AWT_FLUSH_UNLOCK(); -} - - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: pMakeCursorVisible - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pMakeCursorVisible - (JNIEnv *env, jobject this) -{ - struct TextAreaData *tdata; - - AWT_LOCK(); - tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: pSetCursor - * Signature: (L/java/awt/Cursor;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pSetCursor - (JNIEnv *env, jobject this, jobject cursor) -{ - Cursor xcursor; - struct TextAreaData *tdata; - - AWT_LOCK(); - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL || JNU_IsNull(env, cursor)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - awt_util_setCursor(tdata->txt, getCursor(env, cursor)); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextAreaPeer - * Method: nativeHandleMouseWheel - * Signature: (III)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_nativeHandleMouseWheel - (JNIEnv *env, jobject this, jint scrollType, jint scrollAmt, jint wheelAmt) -{ - struct TextAreaData *tdata; - Widget text = NULL; - Widget scroll = NULL; - - AWT_LOCK(); - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - // get the Text widget - text = tdata->txt; - if (text == NULL) { - AWT_UNLOCK(); - return; - } - - // get the ScrolledWindow - scroll = XtParent(text); - if (scroll == NULL) { - AWT_UNLOCK(); - return; - } - - awt_util_do_wheel_scroll(scroll, scrollType, scrollAmt, wheelAmt); - AWT_UNLOCK(); -} - - - -/* To be fully implemented in a future release - * - * Class: sun_awt_windows_MTextAreaPeer - * Method: getIndexAtPoint - * Signature: (II)I - * -JNIEXPORT jint JNICALL -Java_sun_awt_motif_MTextAreaPeer_getIndexAtPoint(JNIEnv *env, jobject self, - jint x, jint y) -{ - struct TextAreaData *tdata; - XmTextPosition pos; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env,self,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return -1; - } - pos = XmTextXYToPos(tdata->txt, x, y); - AWT_UNLOCK(); - - return (jint) pos; -} -*/ - -/* To be fully implemented in a future release - * - * Class: sun_awt_windows_MTextAreaPeer - * Method: getCharacterBounds - * Signature: (I)Ljava/awt/Rectangle; - * -JNIEXPORT jobject JNICALL -Java_sun_awt_motif_MTextAreaPeer_getCharacterBounds(JNIEnv *env, jobject self, jint i) -{ -#define Text_FontAscent(tfg) (((XmTextWidget)(tfg)) -> \ - text.output->data->font_ascent) -#define Text_FontDescent(tfg) (((XmTextWidget)(tfg)) -> \ - text.output->data->font_descent) - - struct TextAreaData *tdata; - jobject rect=NULL; - Position x=0, y=0; - Position next_x=0, next_y=0; - int32_t w=0, h=0; - - AWT_LOCK(); - - tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env,self,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->txt == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return (jobject) NULL; - } - - XmTextPosToXY(tdata->txt, i, &x, &y); - y -= Text_FontAscent(tdata->txt); - XmTextPosToXY(tdata->txt, i+1, &next_x, &next_y); - w = next_x - x; - h = Text_FontAscent(tdata->txt) + Text_FontDescent(tdata->txt); - - AWT_UNLOCK(); - - if (w>0) { - jclass clazz; - jmethodID mid; - - clazz = (*env)->FindClass(env, "java/awt/Rectangle"); - mid = (*env)->GetMethodID(env, clazz, "", "(IIII)V"); - if (mid != NULL) { - rect = (*env)->NewObject(env, clazz, mid, x, y, w, h); - if ((*env)->ExceptionOccurred(env)) { - return (jobject) NULL; - } - } - } - return rect; -} -*/ diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_TextArea.h --- a/jdk/src/solaris/native/sun/awt/awt_TextArea.h Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Copyright 2003 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. - */ - -#include "jni_util.h" - -/* fieldIDs for TextArea fields that may be accessed from C */ -static struct TextAreaIDs { - jfieldID scrollbarVisibility; -}; - -/* fieldIDs for MTextAreaPeer fields that may be accessed from C */ -struct MTextAreaPeerIDs { - jfieldID firstChangeSkipped; -}; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_TextField.c --- a/jdk/src/solaris/native/sun/awt/awt_TextField.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,989 +0,0 @@ -/* - * Copyright 1995-2003 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 - -#include "awt_p.h" -#include "java_awt_TextField.h" -#include "java_awt_Color.h" -#include "java_awt_AWTEvent.h" -#include "java_awt_Font.h" -#include "java_awt_Canvas.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "sun_awt_motif_MCanvasPeer.h" -#include "sun_awt_motif_MTextFieldPeer.h" - -#include "awt_Component.h" -#include "awt_TextField.h" - -#include "multi_font.h" -#include -#include -#include -#include /* Motif TextField private header. */ - - -#define ECHO_BUFFER_LEN 1024 - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern AwtGraphicsConfigDataPtr - copyGraphicsConfigToPeer(JNIEnv *env, jobject this); -struct TextFieldIDs textFieldIDs; -struct MTextFieldPeerIDs mTextFieldPeerIDs; - -/* - * Class: java_awt_TextField - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for TextField.java - to initialize the fieldIDs for fields that may be accessed from C */ - -JNIEXPORT void JNICALL -Java_java_awt_TextField_initIDs - (JNIEnv *env, jclass cls) -{ - textFieldIDs.echoChar = - (*env)->GetFieldID(env, cls, "echoChar", "C"); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: initIDs - * Signature: ()V - */ - -/* This function gets called from the static initializer for - MTextFieldPeer.java to initialize the fieldIDs for fields that may - be accessed from C */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MTextFieldPeer_initIDs - (JNIEnv *env, jclass cls) -{ - mTextFieldPeerIDs.firstChangeSkipped = - (*env)->GetFieldID(env, cls, "firstChangeSkipped", "Z"); -} - -static void -echoChar(Widget text_w, XtPointer unused, XmTextVerifyCallbackStruct * cbs) -{ - size_t len; - int32_t c; - char *val; - struct DPos *dp; - int32_t ret; - jobject globalRef; - int32_t i, numbytes; - - struct TextFieldData *tdata; - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - /* - * Get the echoContextID from the globalRef which is stored in - * the XmNuserData resource for the widget. - */ - XtVaGetValues(text_w,XmNuserData,&globalRef,NULL); - - tdata = (struct TextFieldData *) - (*env)->GetLongField(env,globalRef,mComponentPeerIDs.pData); - - ret = XFindContext(XtDisplay(text_w), (XID)text_w, tdata->echoContextID, - (XPointer *)&dp); - if ((ret != 0) || (dp == NULL)) { - /* no context found or DPos is NULL - shouldn't happen */ - return; - } - - c = dp->echoC; - val = (char *) (dp->data); - - len = strlen(val); - if (cbs->text->ptr == NULL) { - if (cbs->text->length == 0 && cbs->startPos == 0) { - val[0] = '\0'; - return; - } else if (cbs->startPos == (len - 1)) { - /* handle deletion */ - cbs->endPos = strlen(val); - val[cbs->startPos] = '\0'; - return; - } else { - /* disable deletes anywhere but at the end */ - cbs->doit = False; - return; - } - } - if (cbs->startPos != len) { - /* disable "paste" or inserts into the middle */ - cbs->doit = False; - return; - } - /* append the value typed in */ - if ((cbs->endPos + cbs->text->length) > ECHO_BUFFER_LEN) { - val = realloc(val, cbs->endPos + cbs->text->length + 10); - } - strncat(val, cbs->text->ptr, cbs->text->length); - val[cbs->endPos + cbs->text->length] = '\0'; - - /* modify the output to be the echo character */ - for (len = 0, i = 0; len < cbs->text->length; i++) { - /* Write one echo character for each multibyte character. */ - numbytes = mblen(cbs->text->ptr + len, cbs->text->length - len); - cbs->text->ptr[i] = (char) c; - len += numbytes; - } - cbs->text->length = i; -} - -/* - * Event handler used by both TextField/TextArea to correctly process - * cut/copy/paste keys such that interaction with our own - * clipboard mechanism will work properly. - * - * client_data is MTextFieldPeer instance - */ -void -Text_handlePaste(Widget w, XtPointer client_data, XEvent * event, Boolean * cont) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - KeySym keysym; - Modifiers mods; - - /* 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 (event->type != KeyPress || w->core.being_destroyed) { - return; - } - - XtTranslateKeycode(event->xkey.display, (KeyCode) event->xkey.keycode, - event->xkey.state, &mods, &keysym); - - /* Should be a temporary fix for 4052132 if a cleaner fix is found later */ - if ((event->xkey.state & ControlMask) && (keysym == 'v' || keysym == 'V')) - keysym = osfXK_Paste; - if ((event->xkey.state & ShiftMask) && (keysym == osfXK_Insert)) - keysym = osfXK_Paste; - - switch (keysym) { - case osfXK_Paste: - /* If we own the selection, then paste the data directly */ - if (awtJNI_isSelectionOwner(env, "CLIPBOARD")) { - JNU_CallMethodByName(env, NULL, (jobject) client_data, - "pasteFromClipboard", "()V"); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - *cont = FALSE; - } - break; - - case osfXK_Cut: - case osfXK_Copy: - /* For some reason if we own the selection, our loseSelection - * callback is not automatically called on cut/paste from - * text widgets. - */ - if (awtJNI_isSelectionOwner(env, "CLIPBOARD")) { - awtJNI_notifySelectionLost(env, "CLIPBOARD"); - } - break; - default: - break; - } -} - -/* - * client_data is MTextFieldPeer instance - */ -void -TextField_valueChanged(Widget w, XtPointer client_data, XtPointer call_data) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jboolean skipped; - - skipped = (*env)->GetBooleanField(env, (jobject) client_data, - mTextFieldPeerIDs.firstChangeSkipped); - if (!(*env)->ExceptionOccurred(env)) { - if (skipped == JNI_FALSE) { - (*env)->SetBooleanField(env, (jobject) client_data, - mTextFieldPeerIDs.firstChangeSkipped, - JNI_TRUE); - } else { - JNU_CallMethodByName(env, NULL, (jobject) client_data, - "valueChanged", "()V"); - } - } - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -/* - * client_data is MTextFieldPeer instance - */ -static void -TextField_action(Widget w, XtPointer client_data, XmAnyCallbackStruct * s) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - ConvertEventTimeAndModifiers converted; - - awt_util_convertEventTimeAndModifiers(s->event, &converted); - - JNU_CallMethodByName(env, NULL, (jobject) client_data, "action", "(JI)V", - converted.when, converted.modifiers); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: pCreate - * Signature: (Lsun/awt/motif/MComponentPeer;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_pCreate - (JNIEnv *env, jobject this, jobject parent) -{ - struct ComponentData *wdata; - struct TextFieldData *tdata; - - jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); - AwtGraphicsConfigDataPtr adata; - - AWT_LOCK(); - - adata = copyGraphicsConfigToPeer(env, this); - - if (JNU_IsNull(env, parent)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - wdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData); - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - tdata = ZALLOC(TextFieldData); - if (tdata == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,tdata); - - tdata->comp.widget = XtVaCreateManagedWidget("textfield", - xmTextFieldWidgetClass, - wdata->widget, - XmNrecomputeSize, False, - XmNhighlightThickness, 1, - XmNshadowThickness, 2, - XmNuserData, (XtPointer) globalRef, - XmNscreen, - ScreenOfDisplay(awt_display, - adata->awt_visInfo.screen), - XmNfontList, getMotifFontList(), - NULL); - tdata->echoContextIDInit = FALSE; - - XtSetMappedWhenManaged(tdata->comp.widget, False); - XtAddCallback(tdata->comp.widget, - XmNactivateCallback, - (XtCallbackProc) TextField_action, - (XtPointer) globalRef); - XtAddCallback(tdata->comp.widget, - XmNvalueChangedCallback, - (XtCallbackProc) TextField_valueChanged, - (XtPointer) globalRef); - XtInsertEventHandler(tdata->comp.widget, - KeyPressMask, - False, Text_handlePaste, (XtPointer) globalRef, - XtListHead); - /* - * Fix for BugTraq ID 4349615. - * Unregister Motif drop site to prevent it from crash - * when dropping java objects. - */ - XmDropSiteUnregister(tdata->comp.widget); - - AWT_UNLOCK(); -} - -/* - * Class sun_awt_motif_MTextFieldPeer - * Method: pSetEditable - * Signature: (Z)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_pSetEditable - (JNIEnv *env, jobject this, jboolean editable) -{ - struct TextFieldData *tdata; - - AWT_LOCK(); - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XtVaSetValues(tdata->comp.widget, - XmNeditable, (editable ? True : False), - XmNcursorPositionVisible, (editable ? True : False), - NULL); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: select - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_select - (JNIEnv *env, jobject this, jint start, jint end) -{ - struct TextFieldData *tdata; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XmTextSetSelection(tdata->comp.widget, (XmTextPosition) start, (XmTextPosition) end, 0); - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: getSelectionStart - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextFieldPeer_getSelectionStart - (JNIEnv *env, jobject this) -{ - struct TextFieldData *tdata; - XmTextPosition start, end, pos; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - if (XmTextGetSelectionPosition(tdata->comp.widget, &start, &end) && - (start != end)) { - pos = start; - } else { - pos = XmTextGetInsertionPosition(tdata->comp.widget); - } - AWT_UNLOCK(); - - return (jint) pos; -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: getSelectionEnd - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextFieldPeer_getSelectionEnd - (JNIEnv *env, jobject this) -{ - struct TextFieldData *tdata; - XmTextPosition start, end, pos; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - if (XmTextGetSelectionPosition(tdata->comp.widget, &start, &end) && - (start != end)) { - pos = end; - } else { - pos = XmTextGetInsertionPosition(tdata->comp.widget); - } - AWT_UNLOCK(); - - return (jint) pos; -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: setText - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_setText - (JNIEnv *env, jobject this, jstring l) -{ - struct TextFieldData *tdata; - char *cl; - jobject target; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (JNU_IsNull(env, l)) { - cl = ""; - } else { - /* - * Note: Motif TextField widgets do not support multi-font - * compound strings. - */ - cl = (char *) JNU_GetStringPlatformChars(env, l, NULL); - } - - /* Fix for bug 4084454 : setText appears in clear */ - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - if ((*env)->GetCharField(env, target, textFieldIDs.echoChar) != 0) { - XtVaSetValues(tdata->comp.widget, - XmNvalue, "", NULL); - XmTextFieldInsert(tdata->comp.widget,0,cl); - XmTextSetInsertionPosition(tdata->comp.widget, - (XmTextPosition) strlen(cl)); - } - else { - XtVaSetValues(tdata->comp.widget, - XmNvalue, cl, - NULL); - } - /* - * Fix for BugTraq Id 4185654 - TextField.setText() incorrect justification - * Comment out the next line. - */ - /* XmTextSetInsertionPosition(tdata->comp.widget, - * (XmTextPosition) strlen(cl)); - */ - - if (cl != NULL && cl != "") { - JNU_ReleaseStringPlatformChars(env, l, cl); - } - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: insertReplaceText - * Signature: (Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_insertReplaceText - (JNIEnv *env, jobject this, jstring l) -{ - struct TextFieldData *tdata; - char *cl; - XmTextPosition start, end; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - if (JNU_IsNull(env, l)) { - cl = ""; - } else { - /* - * Note: Motif TextField widgets do not support multi-font - * compound strings. - */ - cl = (char *) JNU_GetStringPlatformChars(env, l, NULL); - } - - if (!XmTextGetSelectionPosition(tdata->comp.widget, &start, &end)) { - start = end = XmTextGetInsertionPosition(tdata->comp.widget); - } - XmTextReplace(tdata->comp.widget, start, end, cl); - - if (cl != NULL && cl != "") { - JNU_ReleaseStringPlatformChars(env, l, cl); - } - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: preDispose - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_preDispose - (JNIEnv *env, jobject this) -{ - struct TextFieldData *tdata; - struct DPos *dp; - jobject target; - int32_t ret; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if ((*env)->GetCharField(env, target, textFieldIDs.echoChar) != 0) { - ret = XFindContext(XtDisplay(tdata->comp.widget), (XID)(tdata->comp.widget), - tdata->echoContextID, (XPointer *)&dp); - if ((ret == 0) && dp != NULL) { - - /* Remove the X context associated with this textfield's - * echo character. BugId #4225734 - */ - XDeleteContext(XtDisplay(tdata->comp.widget), - (XID)(tdata->comp.widget), - tdata->echoContextID); - - tdata->echoContextIDInit = FALSE; - - /* Free up the space allocated for the echo character data. */ - if (dp->data) { - free(dp->data); - } - free(dp); - } - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: getText - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_sun_awt_motif_MTextFieldPeer_getText - (JNIEnv *env, jobject this) -{ - struct TextFieldData *tdata; - char *val; - struct DPos *dp; - jobject target; - int32_t ret; - jstring returnVal; - - AWT_LOCK(); - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return NULL; - } - - target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); - - if ((*env)->GetCharField(env, target, textFieldIDs.echoChar) != 0) { - ret = XFindContext(XtDisplay(tdata->comp.widget), (XID)tdata->comp.widget, - tdata->echoContextID, (XPointer *)&dp); - if ((ret == 0) && (dp != NULL)) { - val = (char *)(dp->data); - } else { - val = ""; - } - } else { - XtVaGetValues(tdata->comp.widget, XmNvalue, &val, NULL); - } - AWT_UNLOCK(); - - returnVal = JNU_NewStringPlatform(env, (const char *) val); - if ((*env)->GetCharField(env, target, textFieldIDs.echoChar) == 0) { - free(val); - } - return returnVal; -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: setEchoChar - * Signature: (C)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_setEchoChar - (JNIEnv *env, jobject this, jchar c) -{ - char *val; - char *cval; - struct TextFieldData *tdata; - struct DPos *dp; - int32_t i; - size_t len; - int32_t ret; - - AWT_LOCK(); - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - XtVaGetValues(tdata->comp.widget, - XmNvalue, &cval, - NULL); - - DASSERT(c != 0 || tdata->echoContextIDInit); - - if (!tdata->echoContextIDInit) { - tdata->echoContextID = XUniqueContext(); - tdata->echoContextIDInit = TRUE; - } - ret = XFindContext(XtDisplay(tdata->comp.widget), (XID)(tdata->comp.widget), - tdata->echoContextID, (XPointer *)&dp); - /* - * Fix for BugTraq ID 4307281. - * Special case for setting echo char to 0: - * - remove the callback and X context associated with echo character; - * - restore the original text. - */ - if (c == 0) { - XtRemoveCallback(tdata->comp.widget, XmNmodifyVerifyCallback, - (XtCallbackProc) echoChar, NULL); - if (ret == 0 && dp != NULL) { - - /* Remove the X context associated with echo character. */ - XDeleteContext(XtDisplay(tdata->comp.widget), - (XID)(tdata->comp.widget), - tdata->echoContextID); - - tdata->echoContextIDInit = FALSE; - - /* Restore the original text. */ - if (dp->data != NULL) { - val = (char *)(dp->data); - } else { - val = ""; - } - XtVaSetValues(tdata->comp.widget, - XmNvalue, val, - NULL); - - /* Free up the space allocated for the echo character data. */ - if (dp->data) { - free(dp->data); - } - free(dp); - } - AWT_UNLOCK(); - return; - } - if (ret != 0) { - dp = NULL; - } - - if (dp != NULL) { - /* Fix bug 4124697: cannot change setEchoChar twice on Motif */ - XtRemoveCallback(tdata->comp.widget, XmNmodifyVerifyCallback, - (XtCallbackProc) echoChar, NULL); - } else { - if ((int32_t) strlen(cval) > ECHO_BUFFER_LEN) { - val = (char *) malloc(strlen(cval) + 1); - } else { - val = (char *) malloc(ECHO_BUFFER_LEN + 1); - } - if (val == NULL) { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - AWT_UNLOCK(); - return; - } - if (cval != NULL) { - strcpy(val, cval); - } else { - *val = '\0'; - } - dp = (struct DPos *) malloc(sizeof(struct DPos)); - - dp->x = -1; - dp->data = (void *) val; - } - - dp->echoC = c; - len = strlen(cval); - for (i = 0; i < len; i++) { - cval[i] = (char) (c); - } - XtVaSetValues(tdata->comp.widget, - XmNvalue, cval, - NULL); - - ret = XSaveContext(XtDisplay(tdata->comp.widget), (XID)tdata->comp.widget, - tdata->echoContextID, (XPointer)dp); - if (ret == 0) { - XtAddCallback(tdata->comp.widget, XmNmodifyVerifyCallback, - (XtCallbackProc) echoChar, NULL); - } - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: setFont - * Signature: (Ljava/awt/Font;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_setFont - (JNIEnv *env, jobject this, jobject f) -{ - struct TextFieldData *tdata; - struct FontData *fdata; - XmFontListEntry fontentry; - XmFontList fontlist; - char *err; - - AWT_LOCK(); - if (JNU_IsNull(env, f)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - fdata = awtJNI_GetFontData(env, f, &err); - if (fdata == NULL) { - JNU_ThrowInternalError(env, err); - AWT_UNLOCK(); - return; - } - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - if (awtJNI_IsMultiFont(env, f)) { - if (fdata->xfs == NULL) { - fdata->xfs = awtJNI_MakeFontSet(env, f); - } - if (fdata->xfs != NULL) { - fontentry = XmFontListEntryCreate("labelFont", - XmFONT_IS_FONTSET, - (XtPointer) (fdata->xfs)); - fontlist = XmFontListAppendEntry(NULL, fontentry); - /* - * Some versions of motif have a bug in - * XmFontListEntryFree() which causes it to free more than it - * should. Use XtFree() instead. See O'Reilly's - * Motif Reference Manual for more information. - */ - XmFontListEntryFree(&fontentry); - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - } else { - fontlist = XmFontListCreate(fdata->xfont, "labelFont"); - } - - if (fontlist != NULL) { - XtVaSetValues(tdata->comp.widget, XmNfontList, fontlist, NULL); - XmFontListFree(fontlist); - } else { - JNU_ThrowNullPointerException(env, "NullPointerException"); - } - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: setCaretPosition - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MTextFieldPeer_setCaretPosition - (JNIEnv *env, jobject this, jint pos) -{ - struct TextFieldData *tdata; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - XmTextSetInsertionPosition(tdata->comp.widget, (XmTextPosition) pos); - - AWT_FLUSH_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MTextFieldPeer - * Method: getCaretPosition - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextFieldPeer_getCaretPosition - (JNIEnv *env, jobject this) -{ - struct TextFieldData *tdata; - XmTextPosition pos; - - AWT_LOCK(); - - tdata = (struct TextFieldData *) - JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return 0; - } - pos = XmTextGetInsertionPosition(tdata->comp.widget); - AWT_UNLOCK(); - - return (jint) pos; -} - - -/* To be fully implemented in a future release - * - * Class: sun_awt_windows_MTextFieldPeer - * Method: getIndexAtPoint - * Signature: (Ljava/awt/Point;)I - * -JNIEXPORT jint JNICALL -Java_sun_awt_motif_MTextFieldPeer_getIndexAtPoint(JNIEnv *env, jobject self, - jint x, jint y) -{ - struct ComponentData *tdata; - XmTextPosition pos; - - AWT_LOCK(); - - tdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,self,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return -1; - } - pos = XmTextFieldXYToPos(tdata->widget, x, y); - AWT_UNLOCK(); - - return (jint) pos; -} -*/ - -/* To be fully implemented in a future release - * - * Class: sun_awt_windows_MTextFieldPeer - * Method: getCharacterBounds - * Signature: (I)Ljava/awt/Rectangle; - * -JNIEXPORT jobject JNICALL -Java_sun_awt_motif_MTextFieldPeer_getCharacterBounds(JNIEnv *env, jobject self, jint i) -{ -#define TextF_FontAscent(tfg) (((XmTextFieldWidget)(tfg)) -> \ - text.font_ascent) -#define TextF_FontDescent(tfg) (((XmTextFieldWidget)(tfg)) -> \ - text.font_descent) - - struct ComponentData *tdata; - jobject rect=NULL; - Position x=0, y=0; - Position next_x=0, next_y=0; - int32_t w=0, h=0; - - AWT_LOCK(); - - tdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env,self,mComponentPeerIDs.pData); - - if (tdata == NULL || tdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return (jobject) NULL; - } - - XmTextFieldPosToXY(tdata->widget, i, &x, &y); - y -= TextF_FontAscent(tdata->widget); - XmTextFieldPosToXY(tdata->widget, i+1, &next_x, &next_y); - w = next_x - x; - h = TextF_FontAscent(tdata->widget) + TextF_FontDescent(tdata->widget); - - AWT_UNLOCK(); - - if (w>0) { - jclass clazz; - jmethodID mid; - - clazz = (*env)->FindClass(env, "java/awt/Rectangle"); - mid = (*env)->GetMethodID(env, clazz, "", "(IIII)V"); - if (mid != NULL) { - rect = (*env)->NewObject(env, clazz, mid, x, y, w, h); - if ((*env)->ExceptionOccurred(env)) { - return NULL; - } - } - } - return rect; -} -*/ diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_TextField.h --- a/jdk/src/solaris/native/sun/awt/awt_TextField.h Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Copyright 2003 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. - */ - -#include "jni_util.h" - -/* fieldIDs for TextField fields that may be accessed from C */ -static struct TextFieldIDs { - jfieldID echoChar; -}; - -/* fieldIDs for MTextFieldPeer fields that may be accessed from C */ -struct MTextFieldPeerIDs { - jfieldID firstChangeSkipped; -}; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_TopLevel.c --- a/jdk/src/solaris/native/sun/awt/awt_TopLevel.c Wed Jul 05 16:40:31 2017 +0200 +++ /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 -#include -#include -#include -#include -#include -#include -#include -#include "VDrawingArea.h" - -#ifdef DEBUG -# include -#endif - -#include -#include - -/* 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) -{ -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_XmDnD.c --- a/jdk/src/solaris/native/sun/awt/awt_XmDnD.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2282 +0,0 @@ -/* - * Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#ifdef HEADLESS - #error This file should not be included in headless library -#endif - -#include -#include - -#include "jvm.h" -#include "jni.h" -#include "jni_util.h" -#include "jlong.h" - -#include "awt_DataTransferer.h" -#include "awt_XmDnD.h" - -#include "awt_p.h" - -#include "java_awt_Cursor.h" -#include "java_awt_dnd_DnDConstants.h" -#include "java_awt_event_MouseEvent.h" -#include "sun_awt_dnd_SunDragSourceContextPeer.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "sun_awt_motif_MDragSourceContextPeer.h" -#include "sun_awt_motif_MDropTargetContextPeer.h" - -#include -#include -/* - * Fix for 4285634. - * Include the private Motif header to enable access to lastEventState. - */ -#include - -#include "awt_Component.h" -#include "awt_Cursor.h" -#include "awt_AWTEvent.h" - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct CursorIDs cursorIDs; -extern struct ContainerIDs containerIDs; - -/* globals */ - - -/* forwards */ - -static void awt_XmDropProc(Widget, XtPointer, XmDropProcCallbackStruct*); -static void awt_XmDragProc(Widget, XtPointer, XmDragProcCallbackStruct*); - -static void awt_XmTransferProc(Widget, XtPointer, Atom*, Atom*, XtPointer, - unsigned long*, int32_t*); - -/* for XmDragContext callbacks etc ... */ -static void awt_XmDragEnterProc(Widget, XtPointer, - XmDropSiteEnterCallbackStruct*); -static void awt_XmDragMotionProc(Widget, XtPointer, - XmDragMotionCallbackStruct*); -static void awt_XmDragLeaveProc(Widget, XtPointer, - XmDropSiteLeaveCallbackStruct*); -static void awt_XmDropOperationChangedProc(Widget, XtPointer, - XmDropStartCallbackStruct*); -static void awt_XmDropFinishProc(Widget, XtPointer, - XmDropFinishCallbackStruct*); - -static unsigned char DnDConstantsToXm(jint operations); -static jint XmToDnDConstants(unsigned char operations); -static unsigned char selectOperation(unsigned char operations); - -static void flush_cache(JNIEnv* env); -static void cacheDropDone(Boolean dropDone); -static Boolean isDropDone(); - -static void setCursor(JNIEnv* env, Display* d, jobject c, jint type, Time t); - -static Atom MOTIF_DROP_ATOM = None; - -/* in canvas.c */ -extern jint getModifiers(uint32_t state, jint button, jint keyCode); - -/** - * static cache of DropTarget related info. - */ - -static struct { - Widget w; /* if NULL, cache invalid */ - - jobject peer; - jobject component; - - jobject dtcpeer; - - Widget dt; - - jlongArray targets; - Cardinal nTargets; - - Boolean dropDone; - int32_t transfersPending; - Widget transfer; - - jint dropAction; /* used only on JVM transfers */ - - Boolean flushPending; - - Window win; - uint32_t state; -} _cache; - -uint32_t -buttonToMask(uint32_t button) { - switch (button) { - case Button1: - return Button1Mask; - case Button2: - return Button2Mask; - case Button3: - return Button3Mask; - case Button4: - return Button4Mask; - case Button5: - return Button5Mask; - default: - return 0; - } -} - -/* Fix for 4215643: extract the values cached on drag start and send - ButtonRelease event to the window which originated the drag */ - -void -dragsource_track_release(Widget w, XtPointer client_data, - XEvent * event, Boolean * cont) -{ - DASSERT (event != NULL); - - if (_cache.win != None && - (buttonToMask(event->xbutton.button) & _cache.state)) { - - JNIEnv *env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2); - Window win = event->xbutton.window; - event->xbutton.window = _cache.win; - awt_put_back_event(env, event); - event->xbutton.window = win; - _cache.win = None; - _cache.state = 0; - XtRemoveEventHandler(w, ButtonReleaseMask, False, - dragsource_track_release, NULL); - } -} - -static void -cancel_drag(XtPointer client_data, XtIntervalId* id) { - Time time = awt_util_getCurrentServerTime(); - Widget dc = XmGetDragContext(awt_root_shell, time); - - if (dc != NULL) { - Boolean sourceIsExternal = True; - XtVaGetValues(dc, XmNsourceIsExternal, &sourceIsExternal, NULL); - if (!sourceIsExternal) { - XEvent xevent; - XmDragCancel(dc); - - /* - * When running the internal drag-and-drop event loop - * (see DragC.c:InitiatorMainLoop) Motif DnD uses XtAppNextEvent, - * that processes all timer callbacks and then returns the next X - * event from the queue. Motif DnD doesn't check if the drag - * operation is cancelled after XtAppNextEvent returns and processes - * the returned event. When the drag operation is cancelled the - * XmDragContext widget is destroyed and Motif will crash if the new - * event is dispatched to the destroyed XmDragContext. - * We cancel the drag operation in the timer callback, so we putback - * a dummy X event. This event will be returned from XtAppNextEvent - * and Motif DnD will safely exit from the internal event loop. - */ - xevent.type = LASTEvent; - xevent.xany.send_event = True; - xevent.xany.display = awt_display; - xevent.xany.window = XtWindow(awt_root_shell); - XPutBackEvent(awt_display, &xevent); - } - } -} - -#define DONT_CARE -1 - -static void -awt_popupCallback(Widget shell, XtPointer closure, XtPointer call_data) { - XtGrabKind grab_kind = XtGrabNone; - - if (call_data != NULL) { - grab_kind = *((XtGrabKind*)call_data); - } - - if (XmIsVendorShell(shell)) { - int input_mode; - XtVaGetValues(shell, XmNmwmInputMode, &input_mode, NULL); - switch (input_mode) { - case DONT_CARE: - case MWM_INPUT_MODELESS: - grab_kind = XtGrabNonexclusive; break; - case MWM_INPUT_PRIMARY_APPLICATION_MODAL: - case MWM_INPUT_SYSTEM_MODAL: - case MWM_INPUT_FULL_APPLICATION_MODAL: - grab_kind = XtGrabExclusive; break; - } - } - - if (grab_kind == XtGrabExclusive) { - /* - * We should cancel the drag on the toolkit thread. Otherwise, it can be - * called while the toolkit thread is waiting inside some drag callback. - * In this case Motif will crash when the drag callback returns. - */ - XtAppAddTimeOut(awt_appContext, 0L, cancel_drag, NULL); - } -} - -static XtInitProc xt_shell_initialize = NULL; - -static void -awt_ShellInitialize(Widget req, Widget new, ArgList args, Cardinal *num_args) { - XtAddCallback(new, XtNpopupCallback, awt_popupCallback, NULL); - (*xt_shell_initialize)(req, new, args, num_args); -} - -/* - * Fix for 4484572. - * Modify the 'initialize' routine for all ShellWidget instances, so that it - * will install an XtNpopupCallback that cancels the current drag operation. - * It is needed, since AWT doesn't have full control over all ShellWidget - * instances (e.g. XmPopupMenu internally creates and popups an XmMenuShell). - */ -static void -awt_set_ShellInitialize() { - static Boolean inited = False; - - DASSERT(!inited); - if (inited) { - return; - } - - xt_shell_initialize = shellWidgetClass->core_class.initialize; - shellWidgetClass->core_class.initialize = (XtInitProc)awt_ShellInitialize; - inited = True; -} - -/** - * global function to initialize this client as a Dynamic-only app. - * - * gets called once during toolkit initialization. - */ - -void awt_initialize_Xm_DnD(Display* dpy) { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jclass clazz; - - XtVaSetValues(XmGetXmDisplay(dpy), - XmNdragInitiatorProtocolStyle, XmDRAG_DYNAMIC, - XmNdragReceiverProtocolStyle, XmDRAG_DYNAMIC, - NULL - ); - - MOTIF_DROP_ATOM = XInternAtom(dpy, _XA_MOTIF_DROP, False); - if (XSaveContext(dpy, MOTIF_DROP_ATOM, awt_convertDataContext, - (XPointer)NULL) == XCNOMEM) { - JNU_ThrowInternalError(env, ""); - return; - } - - /* No drop in progress. */ - cacheDropDone(True); - - /* - * Fix for BugTraq ID 4407057. - * Have to disable Motif default drag support, since it doesn't work - * reliably with our event dispatch mechanism. To do this we allow a drag - * operation only if it is registered on the awt_root_shell. - */ - awt_motif_enableSingleDragInitiator(awt_root_shell); - - awt_set_ShellInitialize(); - - /* - * load the Cursor stuff - */ - - clazz = (*env)->FindClass(env, "sun/awt/motif/MCustomCursor"); - - if (!JNU_IsNull(env, ((*env)->ExceptionOccurred(env)))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } -} - -typedef struct DSInfoRec { - Widget widget; - - Pixmap animation_mask; - Pixmap animation_pixmap; - int32_t animation_pixmap_depth; - unsigned char animation_style; - XtPointer client_data; - XtCallbackProc drag_proc; - XtCallbackProc drop_proc; - XRectangle *drop_rectangles; - unsigned char drop_site_activity; - unsigned char drop_site_operations; - unsigned char drop_site_type; - Atom *import_targets; - Cardinal num_drop_rectangles; - Cardinal num_import_targets; - - struct DSInfoRec* next; -} DSInfoRec, * DSInfoPtr; - -#define ARG_COUNT 14 - -/* - * Allocates DSInfoRect structure, retrieves all attributes of a Motif drop site - * registered on the specified widget and puts them into the allocated storage. - * The caller should free the storage after use. - */ -DSInfoPtr get_drop_site_info(Widget w) { - Arg arglist[ARG_COUNT]; - Cardinal argcount = 0; - DSInfoPtr info = ZALLOC(DSInfoRec); - - if (info == NULL) { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - return NULL; - } - - XtSetArg(arglist[argcount], XmNanimationMask, - (XtArgVal)&info->animation_mask); argcount++; - XtSetArg(arglist[argcount], XmNanimationPixmap, - (XtArgVal)&info->animation_pixmap); argcount++; - XtSetArg(arglist[argcount], XmNanimationPixmapDepth, - (XtArgVal)&info->animation_pixmap_depth); argcount++; - XtSetArg(arglist[argcount], XmNanimationStyle, - (XtArgVal)&info->animation_style); argcount++; - XtSetArg(arglist[argcount], XmNclientData, - (XtArgVal)&info->client_data); argcount++; - XtSetArg(arglist[argcount], XmNdragProc, - (XtArgVal)&info->drag_proc); argcount++; - XtSetArg(arglist[argcount], XmNdropProc, - (XtArgVal)&info->drop_proc); argcount++; - XtSetArg(arglist[argcount], XmNdropSiteActivity, - (XtArgVal)&info->drop_site_activity); argcount++; - XtSetArg(arglist[argcount], XmNdropSiteOperations, - (XtArgVal)&info->drop_site_operations); argcount++; - XtSetArg(arglist[argcount], XmNdropSiteType, - (XtArgVal)&info->drop_site_type); argcount++; - XtSetArg(arglist[argcount], XmNnumDropRectangles, - (XtArgVal)&info->num_drop_rectangles); argcount++; - XtSetArg(arglist[argcount], XmNnumImportTargets, - (XtArgVal)&info->num_import_targets); argcount++; - DASSERT(argcount == ARG_COUNT - 2); - - XmDropSiteRetrieve(w, arglist, argcount); - - if (info->num_import_targets > 0) { - Atom *targets = NULL; - - info->import_targets = malloc(info->num_import_targets * sizeof(Atom)); - - if (info->import_targets == NULL) { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - free(info); - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - return NULL; - } - - XtSetArg(arglist[0], XmNimportTargets, (XtArgVal)&targets); - XmDropSiteRetrieve(w, arglist, 1); - - memcpy(info->import_targets, targets, - info->num_import_targets * sizeof(Atom)); - } - - if (info->drop_site_type == XmDROP_SITE_SIMPLE && info->num_drop_rectangles > 0) { - XRectangle *rectangles = NULL; - info->drop_rectangles = - malloc(info->num_drop_rectangles * sizeof(XRectangle)); - - if (info->drop_rectangles == NULL) { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - if (info->import_targets != NULL) { - free(info->import_targets); - } - free(info); - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - return NULL; - } - - XtSetArg(arglist[0], XmNdropRectangles, (XtArgVal)&rectangles); - XmDropSiteRetrieve(w, arglist, 1); - - memcpy(info->drop_rectangles, rectangles, - info->num_drop_rectangles * sizeof(XRectangle)); - } else /* if (info->drop_site_type == XmDROP_SITE_COMPOSITE) */ { - info->num_drop_rectangles = 1; - info->drop_rectangles = NULL; - } - - info->widget = w; - return info; -} - -/* - * Registers a Motif drop site on a widget given the information - * in the passed DSInfoRec structure. - */ -void restore_drop_site(DSInfoPtr info) { - Arg arglist[ARG_COUNT]; - Cardinal argcount = 0; - - if (info->drop_site_type == XmDROP_SITE_COMPOSITE) { - info->num_drop_rectangles = 1; - info->drop_rectangles = NULL; - } - - XtSetArg(arglist[argcount], XmNanimationMask, - (XtArgVal)info->animation_mask); argcount++; - XtSetArg(arglist[argcount], XmNanimationPixmap, - (XtArgVal)info->animation_pixmap); argcount++; - XtSetArg(arglist[argcount], XmNanimationPixmapDepth, - (XtArgVal)info->animation_pixmap_depth); argcount++; - XtSetArg(arglist[argcount], XmNanimationStyle, - (XtArgVal)info->animation_style); argcount++; - XtSetArg(arglist[argcount], XmNclientData, - (XtArgVal)info->client_data); argcount++; - XtSetArg(arglist[argcount], XmNdragProc, - (XtArgVal)info->drag_proc); argcount++; - XtSetArg(arglist[argcount], XmNdropProc, - (XtArgVal)info->drop_proc); argcount++; - XtSetArg(arglist[argcount], XmNdropRectangles, - (XtArgVal)info->drop_rectangles); argcount++; - XtSetArg(arglist[argcount], XmNdropSiteActivity, - (XtArgVal)info->drop_site_activity); argcount++; - XtSetArg(arglist[argcount], XmNdropSiteOperations, - (XtArgVal)info->drop_site_operations); argcount++; - XtSetArg(arglist[argcount], XmNdropSiteType, - (XtArgVal)info->drop_site_type); argcount++; - XtSetArg(arglist[argcount], XmNimportTargets, - (XtArgVal)info->import_targets); argcount++; - XtSetArg(arglist[argcount], XmNnumDropRectangles, - (XtArgVal)info->num_drop_rectangles); argcount++; - XtSetArg(arglist[argcount], XmNnumImportTargets, - (XtArgVal)info->num_import_targets); argcount++; - DASSERT(argcount == ARG_COUNT); - - XmDropSiteUnregister(info->widget); - XmDropSiteRegister(info->widget, arglist, argcount); - XmDropSiteConfigureStackingOrder(info->widget, (Widget)NULL, XmABOVE); -} - -#undef ARG_COUNT - -/* - * This routine ensures that hierarchy of Motif drop sites is not broken - * when a new drop site is registered or an existing drop site is - * unregistered. It unregisters all drop sites registered on the descendants of - * the specified widget, then registers or unregisters a Motif drop site on the - * root widget depending on the value of registerNewSite. After that the routine - * restores all the drop sites on the descendants. - * The routine recursively traverses through the hierarchy of descendant Motif - * drop sites and stores the info for all drop sites in a list. Then this list - * is used to restore all descendant drop sites. - * @param w current widget in the hierarchy traversal - * @param top root widget of the traversed hierarchy - the one to be inserted or - * removed - * @param list a list of DSInfoRec structures which keep drop site info for - * child drop sites - * @param registerNewSite if True a new Motif drop site should be registered on - * the root widget. If False an existing drop site of the root widget - * should be unregistered. - * @param isDropSite if True the widget being currently traversed has an - * associated Motif drop site. - */ -static DSInfoPtr -update_drop_site_hierarchy(Widget w, Widget top, DSInfoPtr list, - Boolean registerNewSite, Boolean isDropSite) { - - Widget parent = NULL; - Widget *children = NULL; - Cardinal num_children = 0; - - if (w == NULL || !XtIsObject(w) || w->core.being_destroyed) { - return NULL; - } - - /* Get the child drop sites of the widget.*/ - if (XmDropSiteQueryStackingOrder(w, &parent, &children, - &num_children) == 0) { - /* - * The widget is declared to be a drop site, but the query fails. - * The drop site must be corrupted. Truncate traversal. - */ - if (isDropSite) { - return NULL; - } - } else { - /* The query succeded, so the widget is definitely a drop site. */ - isDropSite = True; - } - - /* Traverse descendants of the widget, if it is composite. */ - if (XtIsComposite(w)) { - Cardinal i = 0; - - /* If it is not a drop site, check all its children. */ - if (!isDropSite) { - XtVaGetValues(w, XmNchildren, &children, - XmNnumChildren, &num_children, NULL); - } - - for (i = 0; i < num_children; i++) { - list = update_drop_site_hierarchy(children[i], top, list, - registerNewSite, isDropSite); - } - } - - /* The storage allocated by XmDropSiteQueryStackingOrder must be freed.*/ - if (isDropSite && children != NULL) { - XtFree((void*)children); - } - - if (w != top) { - if (isDropSite) { - /* Prepend drop site info to the list and unregister a drop site.*/ - DSInfoPtr info = get_drop_site_info(w); - - if (info != NULL) { - info->next = list; - list = info; - } - XmDropSiteUnregister(w); - } - } else { - /* Traversal is complete.*/ - DSInfoPtr info = list; - - if (isDropSite) { - XmDropSiteUnregister(w); - } - - if (registerNewSite) { - Arg args[10]; - unsigned int nargs = 0; - -#define SetArg(n, v) args[nargs].name = n; args[nargs++].value = (XtArgVal)(v); - - SetArg(XmNanimationStyle, XmDRAG_UNDER_NONE); - SetArg(XmNdragProc, awt_XmDragProc); - SetArg(XmNdropProc, awt_XmDropProc); - SetArg(XmNdropSiteActivity, XmDROP_SITE_ACTIVE); - - SetArg(XmNdropSiteOperations, - XmDROP_LINK | XmDROP_MOVE | XmDROP_COPY); - - SetArg(XmNimportTargets, NULL); - SetArg(XmNnumImportTargets, 0); - - SetArg(XmNdropSiteType, XmDROP_SITE_COMPOSITE); - SetArg(XmNdropRectangles, (XRectangle*)NULL); -#undef SetArg - - XmDropSiteRegister(w, args, nargs); - XmDropSiteConfigureStackingOrder(w, (Widget)NULL, XmABOVE); - } - - /* Go through the list and restore all child drop sites.*/ - while (info != NULL) { - restore_drop_site(info); - - info = info->next; - list->next = NULL; - if (list->import_targets != NULL) { - free(list->import_targets); - } - if (list->drop_rectangles != NULL) { - free(list->drop_rectangles); - } - free(list); - list = info; - } - } - return list; -} - -void -register_drop_site(Widget w) { - update_drop_site_hierarchy(w, w, NULL, True, False); -} - -void -unregister_drop_site(Widget w) { - update_drop_site_hierarchy(w, w, NULL, False, True); -} - -DECLARE_JAVA_CLASS(dSCClazz, "sun/awt/motif/MDragSourceContextPeer") -DECLARE_JAVA_CLASS(dTCClazz, "sun/awt/motif/MDropTargetContextPeer") - -static void -call_dSCenter(JNIEnv* env, jobject this, jint targetActions, - jint modifiers, jint x, jint y) { - DECLARE_VOID_JAVA_METHOD(dSCenter, dSCClazz, "dragEnter", "(IIII)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dSCenter, targetActions, modifiers, x, y); -} - -static void -call_dSCmotion(JNIEnv* env, jobject this, jint targetActions, - jint modifiers, jint x, jint y) { - DECLARE_VOID_JAVA_METHOD(dSCmotion, dSCClazz, "dragMotion", "(IIII)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dSCmotion, targetActions, - modifiers, x, y); -} - -static void -call_dSCchanged(JNIEnv* env, jobject this, jint targetActions, - jint modifiers, jint x, jint y) { - DECLARE_VOID_JAVA_METHOD(dSCchanged, dSCClazz, "operationChanged", - "(IIII)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dSCchanged, targetActions, - modifiers, x, y); -} - -static void -call_dSCmouseMoved(JNIEnv* env, jobject this, jint targetActions, - jint modifiers, jint x, jint y) { - DECLARE_VOID_JAVA_METHOD(dSCmouseMoved, dSCClazz, "dragMouseMoved", - "(IIII)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dSCmouseMoved, targetActions, - modifiers, x, y); -} - -static void -call_dSCexit(JNIEnv* env, jobject this, jint x, jint y) { - DECLARE_VOID_JAVA_METHOD(dSCexit, dSCClazz, "dragExit", "(II)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dSCexit, x, y); -} - -static void -call_dSCddfinished(JNIEnv* env, jobject this, jboolean success, - jint operations, jint x, jint y) { - DECLARE_VOID_JAVA_METHOD(dSCddfinished, dSCClazz, "dragDropFinished", - "(ZIII)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dSCddfinished, success, operations, x, y); -} - -static jobject -call_dTCcreate(JNIEnv* env) { - DECLARE_STATIC_OBJECT_JAVA_METHOD(dTCcreate, dTCClazz, - "createMDropTargetContextPeer", - "()Lsun/awt/motif/MDropTargetContextPeer;"); - return (*env)->CallStaticObjectMethod(env, clazz, dTCcreate); -} - -static jint -call_dTCenter(JNIEnv* env, jobject this, jobject component, jint x, jint y, - jint dropAction, jint actions, jlongArray formats, - jlong nativeCtxt) { - DECLARE_JINT_JAVA_METHOD(dTCenter, dTCClazz, "handleEnterMessage", - "(Ljava/awt/Component;IIII[JJ)I"); - DASSERT(!JNU_IsNull(env, this)); - return (*env)->CallIntMethod(env, this, dTCenter, component, x, y, dropAction, - actions, formats, nativeCtxt); -} - -static void -call_dTCexit(JNIEnv* env, jobject this, jobject component, jlong nativeCtxt) { - DECLARE_VOID_JAVA_METHOD(dTCexit, dTCClazz, "handleExitMessage", - "(Ljava/awt/Component;J)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dTCexit, component, nativeCtxt); -} - -static jint -call_dTCmotion(JNIEnv* env, jobject this, jobject component, jint x, jint y, - jint dropAction, jint actions, jlongArray formats, - jlong nativeCtxt) { - DECLARE_JINT_JAVA_METHOD(dTCmotion, dTCClazz, "handleMotionMessage", - "(Ljava/awt/Component;IIII[JJ)I"); - DASSERT(!JNU_IsNull(env, this)); - return (*env)->CallIntMethod(env, this, dTCmotion, component, x, y, - dropAction, actions, formats, nativeCtxt); -} - -static void -call_dTCdrop(JNIEnv* env, jobject this, jobject component, jint x, jint y, - jint dropAction, jint actions, jlongArray formats, - jlong nativeCtxt) { - DECLARE_VOID_JAVA_METHOD(dTCdrop, dTCClazz, "handleDropMessage", - "(Ljava/awt/Component;IIII[JJ)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dTCdrop, component, x, y, - dropAction, actions, formats, nativeCtxt); -} - -static void -call_dTCnewData(JNIEnv* env, jobject this, jlong format, jobject type, - jbyteArray data) { - DECLARE_VOID_JAVA_METHOD(dTCnewData, dTCClazz, "newData", - "(JLjava/lang/String;[B)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dTCnewData, format, type, data); -} - -static void -call_dTCtxFailed(JNIEnv* env, jobject this, jlong format) { - DECLARE_VOID_JAVA_METHOD(dTCtxFailed, dTCClazz, "transferFailed", "(J)V"); - DASSERT(!JNU_IsNull(env, this)); - (*env)->CallVoidMethod(env, this, dTCtxFailed, format); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: addNativeDropTarget - * Signature: (Ljava/awt/dnd/DropTarget;)V - */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_addNativeDropTarget - (JNIEnv *env, jobject this, jobject droptarget) -{ - struct ComponentData* cdata = (struct ComponentData *)NULL; - DropSitePtr dropsite = (DropSitePtr)NULL; - - if (JNU_IsNull(env, droptarget)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - - AWT_LOCK(); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - /* introduce a new Component as a root of a set of DropTargets */ - - if ((dropsite = cdata->dsi) == (DropSitePtr)NULL) { - dropsite = cdata->dsi = (DropSitePtr)ZALLOC(DropSiteInfo); - - if (dropsite == (DropSitePtr)NULL) { - JNU_ThrowOutOfMemoryError (env, "OutOfMemoryError"); - AWT_UNLOCK (); - return; - } - - dropsite->component = (*env)->NewGlobalRef - (env, (*env)->GetObjectField(env, this, - mComponentPeerIDs.target)); - dropsite->isComposite = True; - - /* - * Fix for Bug Id 4389284. - * Revalidate drop site hierarchy so that this drop site doesn't obscure - * drop sites that are already registered on its children. - */ - register_drop_site(cdata->widget); - } - - dropsite->dsCnt++; - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MComponentPeer - * Method: removeNativeDropTarget - * Signature: (Ljava/awt/dnd/DropTarget;)V - */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MComponentPeer_removeNativeDropTarget - (JNIEnv *env, jobject this, jobject droptarget) -{ - struct ComponentData* cdata; - DropSitePtr dropsite; - - if (JNU_IsNull(env, droptarget)) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return; - } - - AWT_LOCK(); - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (cdata == NULL || cdata->widget == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - if ((dropsite = cdata->dsi) == (DropSitePtr)NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - AWT_UNLOCK(); - return; - } - - dropsite->dsCnt--; - if (dropsite->dsCnt == 0) { - /* - * Fix for Bug Id 4411368. - * Revalidate drop site hierarchy to prevent crash when a composite drop - * site is unregistered before its child drop sites. - */ - unregister_drop_site(cdata->widget); - - (*env)->DeleteGlobalRef(env, dropsite->component); - - free((void *)(cdata->dsi)); - cdata->dsi = (DropSitePtr)NULL; - } - - AWT_UNLOCK(); -} - -/** - * - */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MDragSourceContextPeer_setNativeCursor(JNIEnv *env, - jobject this, - jlong nativeCtxt, - jobject cursor, - jint type) { - /* - * NOTE: no need to synchronize on awt_lock here, since we should have - * already acquired it in MDragSourceContextPeer.setCursor(). - */ - setCursor(env, awt_display, cursor, type, CurrentTime); -} - -/** - * - */ - -JNIEXPORT jlong JNICALL -Java_sun_awt_motif_MDropTargetContextPeer_startTransfer(JNIEnv *env, - jobject this, - jlong dragContextVal, - jlong atom) { - XmDropTransferEntryRec trec; - Widget dropTransfer; - Arg args[3]; - Cardinal nargs = 0; - jboolean isCopy; - Widget dragContext = (Widget)jlong_to_ptr(dragContextVal); - - AWT_LOCK(); - - trec.target = (Atom) atom; - trec.client_data = (XtPointer)trec.target; - - -#define SetArg(n, v) args[nargs].name = n; args[nargs++].value = (XtArgVal)(v); - - SetArg(XmNdropTransfers, &trec); - SetArg(XmNnumDropTransfers, 1 ); - SetArg(XmNtransferProc, awt_XmTransferProc); - -#undef SetArg - - _cache.transfer = dropTransfer = - XmDropTransferStart(dragContext, args, nargs); - - _cache.transfersPending++; - - AWT_NOTIFY_ALL(); - AWT_UNLOCK(); - - return ptr_to_jlong(dropTransfer); -} - -/** - * - */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MDropTargetContextPeer_addTransfer(JNIEnv *env, - jobject this, - jlong dropTransferVal, - jlong atom) { - XmDropTransferEntryRec trec; - jboolean isCopy; - Widget dropTransfer=(Widget)jlong_to_ptr(dropTransferVal); - trec.target = (Atom)atom; - trec.client_data = (XtPointer)trec.target; - - AWT_LOCK(); - - XmDropTransferAdd(dropTransfer, &trec, 1); - - _cache.transfersPending++; - - AWT_NOTIFY_ALL(); - AWT_UNLOCK(); -} - -/** - * - */ - -JNIEXPORT void JNICALL Java_sun_awt_motif_MDropTargetContextPeer_dropDone - (JNIEnv *env, jobject this, jlong dragContextVal, jlong dropTransferVal, - jboolean isLocal, jboolean success, jint dropAction) -{ - Widget dropTransfer = (Widget)jlong_to_ptr(dropTransferVal); - Widget dragContext = (Widget)jlong_to_ptr(dragContextVal); - - AWT_LOCK(); - - if (_cache.w == (Widget)NULL) { - AWT_UNLOCK(); - return; - } - - if (!isDropDone()) { - if (dropTransfer != (jlong)NULL) { - XtVaSetValues(dropTransfer, - XmNtransferStatus, - success == JNI_TRUE - ? XmTRANSFER_SUCCESS : XmTRANSFER_FAILURE, - NULL - ); - } else { - /* - * start a transfer that notifies failure - * this causes src side callbacks to be processed. - * However, you cannot pass an a success, so the workaround is - * to set _cache.transferSuccess to the proper value and read it - * on the other side. - */ - - - Arg arg; - - /* - * this is the workaround code - */ - _cache.transfer = NULL; - _cache.dropAction = dropAction; - - /* - * End workaround code - */ - - arg.name = XmNtransferStatus; - arg.value = (XtArgVal)(success == JNI_TRUE ? XmTRANSFER_SUCCESS - : XmTRANSFER_FAILURE - ); - - XmDropTransferStart(dragContext, &arg, 1); - } - - /* - * bugid# 4146717 - * - * If this is a local tx, then we never exec the awt_XmTransferProc, - * thus we need to flush the cache here as it is our only chance, - * otherwise we leave a mess for the next operation to fail on .... - * - */ - - if (isLocal == JNI_TRUE) - flush_cache(env); /* flush now, last chance */ - else - _cache.flushPending = True; /* flush pending in transfer proc */ - } - - cacheDropDone(True); - - AWT_NOTIFY_ALL(); - AWT_UNLOCK(); -} - - -static Boolean exitIdleProc = False; -static int32_t x_root = -1, y_root = -1; - -extern void waitForEvents(JNIEnv *env, int32_t fdXPipe, int32_t fdAWTPipe); - -static jint convertModifiers(uint32_t modifiers) { - return getModifiers(modifiers, 0, 0); -} - -static void -checkMouseMoved(XtPointer client_data) { - Window rootWindow, childWindow; - int32_t xw, yw, xr, yr; - uint32_t modifiers; - - /* - * When dragging over the root window XmNdragMotionCallback is not called - * (Motif feature). - * Since there is no legal way to receive MotionNotify events during drag - * we have to query for mouse position periodically. - */ - if (XQueryPointer(awt_display, XDefaultRootWindow(awt_display), - &rootWindow, &childWindow, - &xr, &yr, &xw, &yw, &modifiers) && - childWindow == None && (xr != x_root || yr != y_root)) { - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject)client_data; - - call_dSCmouseMoved(env, this, XmDROP_NOOP, convertModifiers(modifiers), - xr, yr); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - x_root = xr; - y_root = yr; - } -} - -static void IdleProc(XtPointer client_data, XtIntervalId* id) { - if (!exitIdleProc) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - /* The pipe where X events arrive */ - int32_t fdXPipe = ConnectionNumber(awt_display) ; - - /* - * Motif DnD internal event loop doesn't process the events - * from the AWT putback event queue. So we pass -1 instead - * of the AWT read pipe descriptor to disable checking of - * the putback event queue. - */ - waitForEvents(env, fdXPipe, -1); - - checkMouseMoved(client_data); - /* Reschedule the timer callback */ - XtAppAddTimeOut(awt_appContext, AWT_DND_POLL_INTERVAL / 10, - IdleProc, client_data); - } -} - -static void RemoveIdleProc(Widget w, - XtPointer client_data, - XmDropFinishCallbackStruct* cbstruct) { - exitIdleProc = True; -} - -/** - * - */ - -JNIEXPORT jlong JNICALL -Java_sun_awt_motif_MDragSourceContextPeer_startDrag(JNIEnv *env, - jobject this, - jobject component, - jobject transferable, - jobject trigger, - jobject cursor, - jint ctype, - jint actions, - jlongArray formats, - jobject formatMap) { - Arg args[32]; - Cardinal nargs = 0; - jobject dscp = (*env)->NewGlobalRef(env, this); - jbyteArray bdata = - (jbyteArray)(*env)->GetObjectField(env, trigger, awtEventIDs.bdata); - Atom* targets = NULL; - jlong* jTargets; - jsize nTargets; - Widget dc; - XtCallbackRec dsecbr[2]; - XtCallbackRec dmcbr[2]; - XtCallbackRec occbr[2]; - XtCallbackRec dslcbr[2]; - XtCallbackRec dscbr[2]; - XtCallbackRec ddfcbr[2]; - XEvent* xevent; - unsigned char xmActions = DnDConstantsToXm(actions); - jboolean isCopy=JNI_TRUE; - awt_convertDataCallbackStruct* structPtr; - -#ifndef _LP64 /* Atom and jlong are different sizes in the 32-bit build */ - jsize i; - jlong* saveJTargets; - Atom* saveTargets; -#endif - - if (xmActions == XmDROP_NOOP) { - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Invalid source actions."); - return ptr_to_jlong(NULL); - } - - if (JNU_IsNull(env, formats)) { - JNU_ThrowNullPointerException(env, "formats"); - return ptr_to_jlong(NULL); - } - - if (JNU_IsNull(env, bdata)) { - JNU_ThrowNullPointerException(env, - "null native data for trigger event"); - return ptr_to_jlong(NULL); - } - - nTargets = (*env)->GetArrayLength(env, formats); - - /* - * In debug build GetLongArrayElements aborts with assertion on an empty - * array. - */ - if (nTargets > 0) { - jTargets = (*env)->GetLongArrayElements(env, formats, &isCopy); - if (!JNU_IsNull(env, ((*env)->ExceptionOccurred(env)))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (jTargets != NULL) { - targets = (Atom *)malloc(nTargets * sizeof(Atom)); - if (targets != NULL) { -#ifdef _LP64 - memcpy(targets, jTargets, nTargets * sizeof(Atom)); -#else - saveJTargets = jTargets; - saveTargets = targets; - for (i = 0; i < nTargets; i++, targets++, jTargets++) { - *targets = (Atom)*jTargets; - } - jTargets = saveJTargets; - targets = saveTargets; -#endif - } - (*env)->ReleaseLongArrayElements(env, formats, jTargets, JNI_ABORT); - } - } - if (targets == NULL) { - nTargets = 0; - } - -#define SetCB(cbr, cb, cl) cbr[0].callback = (XtCallbackProc)cb; cbr[0].closure = (XtPointer)cl; cbr[1].callback = (XtCallbackProc)NULL; cbr[1].closure = (XtPointer)NULL - -#define SetArg(n, v) args[nargs].name = n; args[nargs++].value = (XtArgVal)(v); - - SetCB(dsecbr, awt_XmDragEnterProc, dscp); - SetCB(dmcbr, awt_XmDragMotionProc, dscp); - SetCB(occbr, awt_XmDropOperationChangedProc, dscp); - SetCB(dslcbr, awt_XmDragLeaveProc, dscp); - SetCB(ddfcbr, awt_XmDropFinishProc, dscp); - - SetArg(XmNblendModel, XmBLEND_NONE ); - SetArg(XmNdragOperations, xmActions ); - /* No incremental transfer */ - SetArg(XmNconvertProc, awt_convertData ); - SetArg(XmNdropSiteEnterCallback, dsecbr ); - SetArg(XmNdragMotionCallback, dmcbr ); - SetArg(XmNoperationChangedCallback, occbr ); - SetArg(XmNdropSiteLeaveCallback, dslcbr ); - SetArg(XmNdropFinishCallback, ddfcbr ); - SetArg(XmNexportTargets, targets ); - SetArg(XmNnumExportTargets, (Cardinal)nTargets ); - - { - jsize len = (*env)->GetArrayLength(env, bdata); - if (len <= 0) { - free(targets); - return ptr_to_jlong(NULL); - } - - xevent = calloc(1, len); - - if (xevent == NULL) { - free(targets); - JNU_ThrowOutOfMemoryError(env, ""); - return ptr_to_jlong(NULL); - } - - (*env)->GetByteArrayRegion(env, bdata, 0, len, (jbyte *)xevent); - - DASSERT(JNU_IsNull(env, (*env)->ExceptionOccurred(env))); - } - - if (xevent->type != ButtonPress && - xevent->type != ButtonRelease && - xevent->type != KeyRelease && - xevent->type != KeyPress && - xevent->type != MotionNotify) { - - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "A drag can only be initiated in response to an InputEvent."); - free(xevent); - free(targets); - return ptr_to_jlong(NULL); - } - - /* This call causes an UnsatisfiedLinkError on Linux. - * This function is a no-op for Motif 2.1. - * Since Linux only links against Motif 2.1, we can safely remove - * this function altogether from the Linux build. - * bchristi 1/22/2001 - */ - -#ifdef __solaris__ - awt_motif_adjustDragTriggerEvent(xevent); -#endif - - AWT_LOCK(); - - /* - * Fix for BugTraq ID 4357905. - * Drop is processed asynchronously on the event dispatch thread. - * Reject all drag attempts until the current drop is done. - */ - if (!isDropDone()) { - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Drop transfer in progress."); - free(xevent); - free(targets); - AWT_UNLOCK(); - return ptr_to_jlong(NULL); - } - - if (XFindContext(awt_display, MOTIF_DROP_ATOM, awt_convertDataContext, - (XPointer*)&structPtr) == XCNOMEM || structPtr != NULL) { - free(xevent); - free(targets); - AWT_UNLOCK(); - return ptr_to_jlong(NULL); - } - - structPtr = calloc(1, sizeof(awt_convertDataCallbackStruct)); - if (structPtr == NULL) { - free(xevent); - free(targets); - JNU_ThrowOutOfMemoryError(env, ""); - AWT_UNLOCK(); - return ptr_to_jlong(NULL); - } - - structPtr->source = (*env)->NewGlobalRef(env, component); - structPtr->transferable = (*env)->NewGlobalRef(env, transferable); - structPtr->formatMap = (*env)->NewGlobalRef(env, formatMap); - structPtr->formats = (*env)->NewGlobalRef(env, formats); - - if (XSaveContext(awt_display, MOTIF_DROP_ATOM, awt_convertDataContext, - (XPointer)structPtr) == XCNOMEM) { - free(structPtr); - free(xevent); - free(targets); - AWT_UNLOCK(); - return ptr_to_jlong(NULL); - } - - dc = XmDragStart(awt_root_shell, xevent, args, nargs); - - /* Fix for 4215643: remember the window corresponding to the drag source - and the button mask after the event which triggered drag start */ - - if (xevent->type == ButtonPress || xevent->type == MotionNotify) { - _cache.win = xevent->xbutton.window; - if (xevent->type == ButtonPress) { - _cache.state = buttonToMask(xevent->xbutton.button); - } else { - _cache.state = xevent->xmotion.state & (Button1Mask | Button2Mask); - } - XtAddEventHandler(dc, ButtonReleaseMask, False, - dragsource_track_release, NULL); - } - - free(targets); - - if (dc != (Widget)NULL) { - setCursor(env, awt_display, cursor, ctype, xevent->xbutton.time); - } - - free(xevent); - - /* - * With the new synchronization model we don't release awt_lock - * in the DragContext callbacks. During drag-n-drop operation - * the events processing is performed not by our awt_MToolkit_loop, - * but by internal Motif InitiatorMainLoop, which returns only - * when the operation is completed. So our polling mechanism doesn't - * have a chance to execute and even if there are no events in - * the queue AWT_LOCK will still be held by the Toolkit thread - * and so other threads will likely be blocked on it. - * - * The solution is to schedule a timer callback which checks - * for events and if the queue is empty releases AWT_LOCK and polls - * the X pipe for some time, then acquires AWT_LOCK back again - * and reschedules itself. - */ - if (dc != NULL) { - exitIdleProc = False; - XtAddCallback(dc, XmNdragDropFinishCallback, - (XtCallbackProc)RemoveIdleProc, NULL); - XtAppAddTimeOut(awt_appContext, AWT_DND_POLL_INTERVAL / 10, - IdleProc, (XtPointer)dscp); - } - - AWT_UNLOCK(); - - return ptr_to_jlong(dc); - -#undef SetArg -#undef SetCB -} - -/*****************************************************************************/ - -/** - * - */ - -static void setCursor(JNIEnv* env, Display* dpy, jobject cursor, jint type, - Time time) -{ - Cursor xcursor = None; - - if (JNU_IsNull(env, cursor)) return; - - XChangeActivePointerGrab(dpy, - ButtonPressMask | - ButtonMotionMask | - ButtonReleaseMask | - EnterWindowMask | - LeaveWindowMask, - getCursor(env, cursor), - time - ); - - XSync(dpy, False); -} - -/** - * Update the cached targets for this widget - */ - -static Boolean updateCachedTargets(JNIEnv* env, Widget dt) { - Atom* targets = (Atom*)NULL; - Cardinal nTargets = (Cardinal)0; - Arg args[2]; - - /* - * Get the targets for this component - */ - args[0].name = XmNexportTargets; args[0].value = (XtArgVal)&targets; - args[1].name = XmNnumExportTargets; args[1].value = (XtArgVal)&nTargets; - XtGetValues(_cache.dt = dt, args, 2); - - /* - * Free the previous targets if there were any - */ - if (!JNU_IsNull(env, _cache.targets)) { - (*env)->DeleteGlobalRef(env, _cache.targets); - _cache.targets = (jlongArray)NULL; - } - - _cache.nTargets = nTargets; - - /* - * If the widget has targets (atoms) then copy them to the cache - */ - if (nTargets > 0) { - jboolean isCopy; - jlong* jTargets; - -#ifndef _LP64 /* Atom and jlong are different sizes in the 32-bit build */ - jlong* saveJTargets; - Cardinal i; -#endif - - _cache.targets = (*env)->NewLongArray(env, nTargets); - if (_cache.targets == NULL) { - _cache.nTargets = 0; - return False; - } - - _cache.targets = (*env)->NewGlobalRef(env, _cache.targets); - if (_cache.targets == NULL) { - _cache.nTargets = 0; - return False; - } - - jTargets = (*env)->GetLongArrayElements(env, _cache.targets, &isCopy); - if (jTargets == NULL) { - (*env)->DeleteGlobalRef(env, _cache.targets); - _cache.targets = NULL; - _cache.nTargets = 0; - return False; - } - -#ifdef _LP64 - memcpy(jTargets, targets, nTargets * sizeof(Atom)); -#else - saveJTargets = jTargets; - for (i = 0; i < nTargets; i++, jTargets++, targets++) { - *jTargets = (*targets & 0xFFFFFFFFLU); - } - jTargets = saveJTargets; -#endif - - (*env)->ReleaseLongArrayElements(env, _cache.targets, jTargets, 0); - return True; - } - - return False; -} - - -/** - * - */ - -static void flush_cache(JNIEnv* env) { - _cache.w = (Widget)NULL; - _cache.dt = (Widget)NULL; - - (*env)->DeleteGlobalRef(env, _cache.peer); - _cache.peer = (jobject)NULL; - - (*env)->DeleteGlobalRef(env, _cache.component); - _cache.component = (jobject)NULL; - - if (_cache.dtcpeer != (jobject)NULL) { - (*env)->DeleteGlobalRef(env, _cache.dtcpeer); - - _cache.dtcpeer = (jobject)NULL; - } - - _cache.nTargets = (Cardinal)0; - if (_cache.targets != (jlongArray)NULL) { - (*env)->DeleteGlobalRef(env, _cache.targets); - _cache.targets = (jlongArray)NULL; - } - - _cache.transfersPending = 0; - _cache.flushPending = False; - _cache.transfer = (Widget)NULL; - cacheDropDone(True); -} - -/** - * - */ - -static void update_cache(JNIEnv* env, Widget w, Widget dt) { - if(w != _cache.w) { - struct ComponentData* cdata = (struct ComponentData *)NULL; - Arg args[1] = - {{ XmNuserData, (XtArgVal)&_cache.peer}}; - - flush_cache(env); - - if (w == (Widget)NULL) return; - - XtGetValues(w, args, 1); - - if (JNU_IsNull(env, _cache.peer)) { - _cache.w = NULL; - - return; - } - - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, _cache.peer, mComponentPeerIDs.pData); - - if (cdata == NULL || - cdata->widget != w || - cdata->dsi == (DropSitePtr)NULL) { - _cache.w = NULL; - - return; - } - - _cache.w = w; - _cache.component = (*env)->NewGlobalRef(env, cdata->dsi->component); - _cache.peer = (*env)->NewGlobalRef(env, _cache.peer); - /* SECURITY: OK to call this on privileged thread - peer is secure */ - { - jobject dtcpeer = call_dTCcreate(env); - if (!JNU_IsNull(env, dtcpeer)) { - _cache.dtcpeer = (*env)->NewGlobalRef(env, dtcpeer); - (*env)->DeleteLocalRef(env, dtcpeer); - } else { - _cache.dtcpeer = NULL; - } - } - - _cache.transfersPending = 0; - cacheDropDone(True); - } - - if (_cache.w != (Widget)NULL) updateCachedTargets(env, dt); -} - - -/** - * - */ - -static void -cacheDropDone(Boolean dropDone) { - _cache.dropDone = dropDone; -} - -static Boolean -isDropDone() { - return _cache.dropDone; -} - -/** - * - */ - -static jint XmToDnDConstants(unsigned char operations) { - jint src = java_awt_dnd_DnDConstants_ACTION_NONE; - - if (operations & XmDROP_MOVE) src |= java_awt_dnd_DnDConstants_ACTION_MOVE; - if (operations & XmDROP_COPY) src |= java_awt_dnd_DnDConstants_ACTION_COPY; - if (operations & XmDROP_LINK) src |= java_awt_dnd_DnDConstants_ACTION_LINK; - - return src; -} - -static unsigned char selectOperation(unsigned char operations) { - if (operations & XmDROP_MOVE) return XmDROP_MOVE; - if (operations & XmDROP_COPY) return XmDROP_COPY; - if (operations & XmDROP_LINK) return XmDROP_LINK; - - return XmDROP_NOOP; -} - -/** - * - */ - -static unsigned char DnDConstantsToXm(jint actions) { - unsigned char ret = XmDROP_NOOP; - - if (actions & java_awt_dnd_DnDConstants_ACTION_COPY) ret |= XmDROP_COPY; - if (actions & java_awt_dnd_DnDConstants_ACTION_MOVE) ret |= XmDROP_MOVE; - if (actions & java_awt_dnd_DnDConstants_ACTION_LINK) ret |= XmDROP_LINK; - - return ret; -} - -/** - * - */ - -typedef struct DragExitProcStruct { - XtIntervalId timerId; - jobject dtcpeer; /* global reference */ - jobject component; /* global reference */ - jlong dragContext; /* pointer */ -} DragExitProcStruct; - -static DragExitProcStruct pending_drag_exit_data = - { (XtIntervalId)0, NULL, NULL, (jlong)0 }; - -static void drag_exit_proc(XtPointer client_data, XtIntervalId* id) { - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - DASSERT(!JNU_IsNull(env, pending_drag_exit_data.dtcpeer)); - DASSERT(!JNU_IsNull(env, pending_drag_exit_data.component)); - DASSERT(pending_drag_exit_data.dragContext != NULL); - - if (pending_drag_exit_data.timerId != (XtIntervalId)0) { - if (id == NULL) { - XtRemoveTimeOut(pending_drag_exit_data.timerId); - } - if (id == NULL || pending_drag_exit_data.timerId == *id) { - - /* SECURITY: OK to call this on privileged thread - - peer is secure */ - call_dTCexit(env, pending_drag_exit_data.dtcpeer, - pending_drag_exit_data.component, - pending_drag_exit_data.dragContext); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } - } - - /* cleanup */ - (*env)->DeleteGlobalRef(env, pending_drag_exit_data.dtcpeer); - (*env)->DeleteGlobalRef(env, pending_drag_exit_data.component); - - memset(&pending_drag_exit_data, 0, sizeof(DragExitProcStruct)); -} - -static void awt_XmDragProc(Widget w, XtPointer closure, - XmDragProcCallbackStruct* cbstruct) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject component = (jobject)NULL; - jint src = java_awt_dnd_DnDConstants_ACTION_NONE; - jint usrAction = java_awt_dnd_DnDConstants_ACTION_NONE; - jint ret = java_awt_dnd_DnDConstants_ACTION_NONE; - unsigned char srcOps = XmDROP_NOOP; - - /* - * Fix for BugTraq ID 4395290. - * We should dispatch any pending java upcall right now - * to keep the order of upcalls. - */ - if (pending_drag_exit_data.timerId != (XtIntervalId)0) { - drag_exit_proc(NULL, NULL); - } - - /* - * Fix for BugTraq ID 4357905. - * Drop is processed asynchronously on the event dispatch thread. - * We reject other drop attempts to protect the SunDTCP context - * from being overwritten by an upcall before the drop is done. - */ - if (!isDropDone()) { - cbstruct->operation = XmDROP_NOOP; - cbstruct->dropSiteStatus = XmINVALID_DROP_SITE; - return; - } - - if (cbstruct->dragContext == NULL) { - cbstruct->operation = XmDROP_NOOP; - cbstruct->dropSiteStatus = XmINVALID_DROP_SITE; - return; - } - - (*env)->PushLocalFrame(env, 0); - - /* - * Fix for BugTraq ID 4285634. - * If some modifier keys are pressed the Motif toolkit initializes - * cbstruct->operations this field to the bitwise AND of the - * XmDragOperations resource of the XmDragContext for this drag operation - * and the drop action corresponding to the current modifiers state. - * We need to determine the drag operations supported by the drag source, so - * we have to get XmNdragOperations value of the XmDragSource. - */ - XtVaGetValues(cbstruct->dragContext, XmNdragOperations, &srcOps, NULL); - src = XmToDnDConstants(srcOps); - usrAction = XmToDnDConstants(selectOperation(cbstruct->operations)); - - update_cache(env, w, cbstruct->dragContext); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - flush_cache(env); - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - goto wayout; - } - - switch (cbstruct->reason) { - case XmCR_DROP_SITE_ENTER_MESSAGE: { - - /* SECURITY: OK to call this on privileged thread - - peer is secure */ - ret = call_dTCenter(env, _cache.dtcpeer, _cache.component, - cbstruct->x, cbstruct->y, - usrAction, src, - _cache.targets,ptr_to_jlong(cbstruct->dragContext)); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - flush_cache(env); - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } - break; - - case XmCR_DROP_SITE_LEAVE_MESSAGE: { - - DASSERT(pending_drag_exit_data.timerId == (XtIntervalId)0); - DASSERT(JNU_IsNull(env, pending_drag_exit_data.dtcpeer)); - DASSERT(JNU_IsNull(env, pending_drag_exit_data.component)); - DASSERT(pending_drag_exit_data.dragContext == (jlong)0); - - DASSERT(!JNU_IsNull(env, _cache.dtcpeer)); - DASSERT(!JNU_IsNull(env, _cache.component)); - DASSERT(cbstruct->dragContext != NULL); - - pending_drag_exit_data.dtcpeer = - (*env)->NewGlobalRef(env, _cache.dtcpeer); - pending_drag_exit_data.component = - (*env)->NewGlobalRef(env, _cache.component); - pending_drag_exit_data.dragContext = - ptr_to_jlong(cbstruct->dragContext); - - /* - * Fix for BugTraq ID 4395290. - * Postpone upcall to java, so that we can abort it in case - * if drop immediatelly follows. - */ - if (!JNU_IsNull(env, pending_drag_exit_data.dtcpeer) && - !JNU_IsNull(env, pending_drag_exit_data.component)) { - pending_drag_exit_data.timerId = - XtAppAddTimeOut(awt_appContext, 0, drag_exit_proc, NULL); - DASSERT(pending_drag_exit_data.timerId != (XtIntervalId)0); - } else { - JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (!JNU_IsNull(env, pending_drag_exit_data.dtcpeer)) { - (*env)->DeleteGlobalRef(env, pending_drag_exit_data.dtcpeer); - } - if (!JNU_IsNull(env, pending_drag_exit_data.component)) { - (*env)->DeleteGlobalRef(env, pending_drag_exit_data.component); - } - memset(&pending_drag_exit_data, 0, sizeof(DragExitProcStruct)); - } - - ret = java_awt_dnd_DnDConstants_ACTION_NONE; - - /* now cleanup */ - - flush_cache(env); - } - break; - - case XmCR_DROP_SITE_MOTION_MESSAGE: { - - /* SECURITY: OK to call this on privileged thread - - peer is secure */ - ret = call_dTCmotion(env, _cache.dtcpeer, _cache.component, - cbstruct->x, cbstruct->y, - usrAction, src, - _cache.targets, - ptr_to_jlong(cbstruct->dragContext)); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - flush_cache(env); - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - } - break; - - case XmCR_OPERATION_CHANGED: { - - /* SECURITY: OK to call this on privileged thread - - peer is secure */ - ret = call_dTCmotion(env, _cache.dtcpeer, _cache.component, - cbstruct->x, cbstruct->y, - usrAction, src, - _cache.targets, - ptr_to_jlong(cbstruct->dragContext)); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - flush_cache(env); - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - } - break; - - default: break; - } - - wayout: - - /* - * Fix for BugTraq ID 4285634. - * If some modifier keys are pressed the Motif toolkit initializes - * cbstruct->operations this field to the bitwise AND of the - * XmDragOperations resource of the XmDragContext for this drag operation - * and the drop action corresponding to the current modifiers state. - * We should allow the drop target to select a drop action independent of - * the current modifiers state. - */ - cbstruct->operation = DnDConstantsToXm(ret); - - if (cbstruct->reason != XmCR_DROP_SITE_LEAVE_MESSAGE) { - Arg arg; - arg.name = XmNdropSiteOperations; - arg.value = (XtArgVal)cbstruct->operation; - - XmDropSiteUpdate(w, &arg, 1); - } - - if (ret != java_awt_dnd_DnDConstants_ACTION_NONE) { - cbstruct->dropSiteStatus = XmVALID_DROP_SITE; - } else { - cbstruct->dropSiteStatus = XmINVALID_DROP_SITE; - } - - (*env)->PopLocalFrame(env, NULL); -} - -static void drop_failure_cleanup(JNIEnv* env, Widget dragContext) { - Arg arg; - - DASSERT(dragContext != NULL); - _cache.transfer = NULL; - _cache.dropAction = XmDROP_NOOP; - - arg.name = XmNtransferStatus; - arg.value = (XtArgVal)XmTRANSFER_FAILURE; - XmDropTransferStart(dragContext, &arg, 1); - - /* Flush here, since awt_XmTransferProc won't be called. */ - flush_cache(env); -} - -/** - * - */ - -static void awt_XmDropProc(Widget w, XtPointer closure, - XmDropProcCallbackStruct* cbstruct) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jint src = java_awt_dnd_DnDConstants_ACTION_NONE; - unsigned char operation = selectOperation(cbstruct->operations); - unsigned char srcOps = XmDROP_NOOP; - unsigned char dstOps = XmDROP_NOOP; - Arg arg; - Boolean sourceIsExternal = False; - - arg.name = XmNdropSiteOperations; - arg.value = (XtArgVal)&dstOps; - XmDropSiteRetrieve(w, &arg, 1); - arg.value = (XtArgVal)(XmDROP_COPY | XmDROP_MOVE | XmDROP_LINK); - XmDropSiteUpdate(w, &arg, 1); - - /* - * Fix for BugTraq ID 4357905. - * Drop is processed asynchronously on the event dispatch thread. - * We reject other drop attempts to protect the SunDTCP context - * from being overwritten by an upcall before the drop is done. - */ - if (!isDropDone()) { - return; - } - - if (cbstruct->dragContext == NULL) { - cbstruct->operation = XmDROP_NOOP; - cbstruct->dropSiteStatus = XmINVALID_DROP_SITE; - return; - } - - /* - * Fix for BugTraq ID 4492640. - * Because of the Motif bug #4528191 XmNdragOperations resource is always - * equal to XmDROP_MOVE | XmDROP_COPY when the drag source is external. - * The workaround for this bug is to assume that an external drag source - * supports all drop actions. - */ - XtVaGetValues(cbstruct->dragContext, - XmNsourceIsExternal, &sourceIsExternal, NULL); - - if (sourceIsExternal) { - srcOps = XmDROP_LINK | XmDROP_MOVE | XmDROP_COPY; - } else { - /* - * Fix for BugTraq ID 4285634. - * If some modifier keys are pressed the Motif toolkit initializes - * cbstruct->operations to the bitwise AND of the - * XmDragOperations resource of the XmDragContext for this drag operation - * and the drop action corresponding to the current modifiers state. - * We need to determine the drag operations supported by the drag source, so - * we have to get XmNdragOperations value of the XmDragSource. - */ - XtVaGetValues(cbstruct->dragContext, XmNdragOperations, &srcOps, NULL); - } - - src = XmToDnDConstants(srcOps); - - if ((srcOps & dstOps) == 0) { - cbstruct->operation = XmDROP_NOOP; - cbstruct->dropSiteStatus = XmINVALID_DROP_SITE; - drop_failure_cleanup(env, cbstruct->dragContext); - return; - } - - (*env)->PushLocalFrame(env, 0); - - update_cache(env, w, cbstruct->dragContext); - - cacheDropDone(False); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - (*env)->PopLocalFrame(env, NULL); - drop_failure_cleanup(env, cbstruct->dragContext); - return; - } - - /* - * Fix for BugTraq ID 4395290. - * Abort a pending upcall to dragExit. - */ - pending_drag_exit_data.timerId = (XtIntervalId)0; - - /* SECURITY: OK to call this on privileged thread - peer is secure */ - call_dTCdrop(env, _cache.dtcpeer, _cache.component, - cbstruct->x, cbstruct->y, - XmToDnDConstants(operation), src, _cache.targets, - ptr_to_jlong(cbstruct->dragContext)); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - flush_cache(env); - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - (*env)->PopLocalFrame(env, NULL); -} - -/** - * - */ - -static void awt_XmTransferProc(Widget w, XtPointer closure, Atom* selection, - Atom* type, XtPointer value, - unsigned long* length, int32_t* format) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - Atom req = (Atom)closure; - Display* dpy = XtDisplayOfObject(w); - jobject tName = NULL; - - /* - * Note: this method is only called to transfer data between clients - * in different JVM's or native apps. For Intra-JVM transfers the peer - * code shares the sources Transferable with the destination. - */ - - if (_cache.w == (Widget)NULL || _cache.transfer != w) { - if (value != NULL) { - XtFree(value); - value = NULL; - } - /* we have already cleaned up ... */ - return; - } - - (*env)->PushLocalFrame(env, 0); - - if (*type == None || *type == XT_CONVERT_FAIL) { - /* SECURITY: OK to call this on privileged thread - peer is secure - */ - call_dTCtxFailed(env, _cache.dtcpeer, (jlong)req); - } else { - switch (*format) { - case 8: - case 16: - case 32: { - jsize size = (*length <= INT_MAX) ? (jsize)*length : INT_MAX; - jbyteArray arry = (*env)->NewByteArray(env, size); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - - /* SECURITY: OK to call this on privileged thread - - peer is secure */ - call_dTCtxFailed(env, _cache.dtcpeer, (jlong)req); - - goto wayout; - } - - (*env)->SetByteArrayRegion(env, arry, 0, size, (jbyte*)value); - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - - /* SECURITY: OK to call this on privileged thread - - peer is secure */ - call_dTCtxFailed(env, _cache.dtcpeer, (jlong)req); - goto wayout; - } - - arry = (*env)->NewGlobalRef(env, arry); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - { - char* tn = XGetAtomName(dpy, *type); - - tName = (*env)->NewStringUTF(env, (const char *)tn); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - XFree((void *)tn); - } - - /* SECURITY: OK to call this on privileged thread - peer is - secure */ - call_dTCnewData(env, _cache.dtcpeer, (jlong)req, tName, arry); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } - - default: - break; - } - } - - wayout: - if (value != NULL) { - XtFree(value); - value = NULL; - } - - _cache.transfersPending--; - while (_cache.transfersPending == 0 && !isDropDone()) { - AWT_WAIT(0); - } - - if (isDropDone() && _cache.flushPending) { - flush_cache(env); - } - - (*env)->PopLocalFrame(env, NULL); -} - -/** - * - */ - -static void awt_XmDragEnterProc(Widget w, XtPointer closure, - XmDropSiteEnterCallbackStruct* cbstruct) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject)closure; - - /* This should only be valid, but Im leaving this part of the old code */ - jboolean valid = cbstruct->dropSiteStatus == XmVALID_DROP_SITE - ? JNI_TRUE : JNI_FALSE; - - if (valid == JNI_TRUE) { - /* - * Workaround for Motif bug id #4457656. - * Pointer coordinates passed in cbstruct are incorrect. - * We have to make a round-trip query. - */ - Window rootWindow, childWindow; - int32_t xw, yw, xr, yr; - uint32_t modifiers; - - XQueryPointer(awt_display, XtWindow(w), - &rootWindow, &childWindow, &xr, &yr, &xw, &yw, &modifiers); - - (*env)->PushLocalFrame(env, 0); - - /* SECURITY: OK to call this on privileged thread - peer is secure */ - call_dSCenter(env, this, XmToDnDConstants(cbstruct->operation), - convertModifiers(modifiers), xr, yr); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - (*env)->PopLocalFrame(env, NULL); - } -} - -/** - * - */ - -static void awt_XmDragMotionProc(Widget w, XtPointer closure, - XmDragMotionCallbackStruct* cbstruct) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject)closure; - - /* This should only be valid, but Im leaving this part of the old code */ - jboolean valid = cbstruct->dropSiteStatus == XmVALID_DROP_SITE - ? JNI_TRUE : JNI_FALSE; - Window rootWindow, childWindow; - int32_t xw, yw, xr, yr; - uint32_t modifiers; - - XQueryPointer(awt_display, XtWindow(w), - &rootWindow, &childWindow, &xr, &yr, &xw, &yw, &modifiers); - /* - * Fix for 4285634. - * Use the cached modifiers state, since the directly queried state can - * differ from the one associated with this dnd notification. - */ - modifiers = ((XmDragContext)w)->drag.lastEventState; - if (xr != x_root || yr != y_root) { - call_dSCmouseMoved(env, this, XmToDnDConstants(cbstruct->operation), - convertModifiers(modifiers), xr, yr); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - x_root = xr; - y_root = yr; - } - - if (valid == JNI_TRUE) { - - (*env)->PushLocalFrame(env, 0); - - /* SECURITY: OK to call this on privileged thread - peer is secure */ - call_dSCmotion(env, this, XmToDnDConstants(cbstruct->operation), - convertModifiers(modifiers), xr, yr); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - (*env)->PopLocalFrame(env, NULL); - } else { - (*env)->PushLocalFrame(env, 0); - - /* SECURITY: OK to call this on privileged thread - peer is secure */ - call_dSCexit(env, this, xr, yr); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - (*env)->PopLocalFrame(env, NULL); - } -} - -/** - * - */ - -static void awt_XmDragLeaveProc(Widget w, XtPointer closure, - XmDropSiteLeaveCallbackStruct* cbstruct) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject)closure; - Window rootWindow, childWindow; - int32_t xw, yw, xr, yr; - uint32_t modifiers; - - XQueryPointer(XtDisplay(w), XtWindow(w), - &rootWindow, &childWindow, &xr, &yr, &xw, &yw, &modifiers); - - (*env)->PushLocalFrame(env, 0); - - /* SECURITY: OK to call this on privileged thread - peer is secure */ - call_dSCexit(env, this, xr, yr); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - (*env)->PopLocalFrame(env, NULL); -} - -/** - * - */ - -static void awt_XmDropOperationChangedProc(Widget w, XtPointer closure, - XmDropStartCallbackStruct* cbstruct) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject)closure; - Window rootWindow, childWindow; - int32_t xw, yw, xr, yr; - uint32_t modifiers; - - XQueryPointer(XtDisplay(w), XtWindow(w), - &rootWindow, &childWindow, &xr, &yr, &xw, &yw, &modifiers); - - (*env)->PushLocalFrame(env, 0); - - - /* SECURITY: OK to call this on privileged thread - peer is secure */ - call_dSCchanged(env, this, XmToDnDConstants(cbstruct->operation), - convertModifiers(modifiers), xr, yr); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - (*env)->PopLocalFrame(env, NULL); -} - -/** - * - */ - -static void awt_XmDropFinishProc(Widget w, XtPointer closure, - XmDropFinishCallbackStruct* cbstruct) -{ - JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject this = (jobject)closure; - unsigned char completionStatus = cbstruct->completionStatus; - jint dropAction = XmToDnDConstants(cbstruct->operation); - Window rootWindow, childWindow; - int32_t xw, yw, xr, yr; - uint32_t modifiers; - - XQueryPointer(XtDisplay(w), XtWindow(w), - &rootWindow, &childWindow, &xr, &yr, &xw, &yw, &modifiers); - - /* cleanup */ - - if (_cache.transfer == NULL) { - dropAction = _cache.dropAction; - } - - _cache.dropAction = java_awt_dnd_DnDConstants_ACTION_NONE; - _cache.win = None; - _cache.state = 0; - XtRemoveEventHandler(w, ButtonReleaseMask, False, - dragsource_track_release, NULL); - - /* SECURITY: OK to call this on privileged thread - peer is secure */ - call_dSCddfinished(env, this, completionStatus, dropAction, xr, yr); - - if (!JNU_IsNull(env, (*env)->ExceptionOccurred(env))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - - awt_cleanupConvertDataContext(env, MOTIF_DROP_ATOM); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_XmDnD.h --- a/jdk/src/solaris/native/sun/awt/awt_XmDnD.h Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/* - * Copyright 1997-2001 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. - */ - -#include -#include -#include -#include - -/** - * - */ - -typedef struct DropSiteInfo { - Widget tlw; - - jobject component; - Boolean isComposite; - uint32_t dsCnt; -} DropSiteInfo; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_dnd.c --- a/jdk/src/solaris/native/sun/awt/awt_dnd.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,887 +0,0 @@ -/* - * Copyright 2003-2006 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_dnd.h" - -#include "awt_p.h" - -#include "java_awt_dnd_DnDConstants.h" - -/* Shared atoms */ - -Atom XA_WM_STATE; -Atom XA_DELETE; - -/* XDnD atoms */ - -Atom XA_XdndAware; -Atom XA_XdndProxy; - -Atom XA_XdndEnter; -Atom XA_XdndPosition; -Atom XA_XdndLeave; -Atom XA_XdndDrop; -Atom XA_XdndStatus; -Atom XA_XdndFinished; - -Atom XA_XdndTypeList; -Atom XA_XdndSelection; - -Atom XA_XdndActionCopy; -Atom XA_XdndActionMove; -Atom XA_XdndActionLink; -Atom XA_XdndActionAsk; -Atom XA_XdndActionPrivate; -Atom XA_XdndActionList; - -/* Motif DnD atoms */ - -Atom _XA_MOTIF_DRAG_WINDOW; -Atom _XA_MOTIF_DRAG_TARGETS; -Atom _XA_MOTIF_DRAG_INITIATOR_INFO; -Atom _XA_MOTIF_DRAG_RECEIVER_INFO; -Atom _XA_MOTIF_DRAG_AND_DROP_MESSAGE; -Atom _XA_MOTIF_ATOM_0; -Atom XA_XmTRANSFER_SUCCESS; -Atom XA_XmTRANSFER_FAILURE; - -unsigned char MOTIF_BYTE_ORDER = 0; - -static Window awt_root_window = None; - -static Boolean -init_atoms(Display* display) { - struct atominit { - Atom *atomptr; - const char *name; - }; - - /* Add new atoms to this list */ - static struct atominit atom_list[] = { - /* Shared atoms */ - { &XA_WM_STATE, "WM_STATE" }, - { &XA_DELETE, "DELETE" }, - - /* XDnD atoms */ - { &XA_XdndAware, "XdndAware" }, - { &XA_XdndProxy, "XdndProxy" }, - { &XA_XdndEnter, "XdndEnter" }, - { &XA_XdndPosition, "XdndPosition" }, - { &XA_XdndLeave, "XdndLeave" }, - { &XA_XdndDrop, "XdndDrop" }, - { &XA_XdndStatus, "XdndStatus" }, - { &XA_XdndFinished, "XdndFinished" }, - { &XA_XdndTypeList, "XdndTypeList" }, - { &XA_XdndSelection, "XdndSelection" }, - { &XA_XdndActionCopy, "XdndActionCopy" }, - { &XA_XdndActionMove, "XdndActionMove" }, - { &XA_XdndActionLink, "XdndActionLink" }, - { &XA_XdndActionAsk, "XdndActionAsk" }, - { &XA_XdndActionPrivate, "XdndActionPrivate" }, - { &XA_XdndActionList, "XdndActionList" }, - - /* Motif DnD atoms */ - { &_XA_MOTIF_DRAG_WINDOW, "_MOTIF_DRAG_WINDOW" }, - { &_XA_MOTIF_DRAG_TARGETS, "_MOTIF_DRAG_TARGETS" }, - { &_XA_MOTIF_DRAG_INITIATOR_INFO, "_MOTIF_DRAG_INITIATOR_INFO" }, - { &_XA_MOTIF_DRAG_RECEIVER_INFO, "_MOTIF_DRAG_RECEIVER_INFO" }, - { &_XA_MOTIF_DRAG_AND_DROP_MESSAGE, "_MOTIF_DRAG_AND_DROP_MESSAGE" }, - { &_XA_MOTIF_ATOM_0, "_MOTIF_ATOM_0" }, - { &XA_XmTRANSFER_SUCCESS, "XmTRANSFER_SUCCESS" }, - { &XA_XmTRANSFER_FAILURE, "XmTRANSFER_FAILURE" } - }; - -#define ATOM_LIST_LENGTH (sizeof(atom_list)/sizeof(atom_list[0])) - - const char *names[ATOM_LIST_LENGTH]; - Atom atoms[ATOM_LIST_LENGTH]; - Status status; - size_t i; - - /* Fill the array of atom names */ - for (i = 0; i < ATOM_LIST_LENGTH; ++i) { - names[i] = atom_list[i].name; - } - - DTRACE_PRINT2("%s:%d initializing atoms ... ", __FILE__, __LINE__); - - status = XInternAtoms(awt_display, (char**)names, ATOM_LIST_LENGTH, - False, atoms); - if (status == 0) { - DTRACE_PRINTLN("failed"); - return False; - } - - /* Store returned atoms into corresponding global variables */ - DTRACE_PRINTLN("ok"); - for (i = 0; i < ATOM_LIST_LENGTH; ++i) { - *atom_list[i].atomptr = atoms[i]; - } - - return True; -#undef ATOM_LIST_LENGTH -} - -/* - * NOTE: must be called after awt_root_shell is created and realized. - */ -Boolean -awt_dnd_init(Display* display) { - static Boolean inited = False; - - if (!inited) { - Boolean atoms_inited = False; - Boolean ds_inited = False; - unsigned int value = 1; - MOTIF_BYTE_ORDER = (*((char*)&value) != 0) ? 'l' : 'B'; - - /* NOTE: init_atoms() should be called before the rest of initialization - so that atoms can be used. */ - inited = init_atoms(display); - - if (inited) { - if (XtIsRealized(awt_root_shell)) { - awt_root_window = XtWindow(awt_root_shell); - } else { - inited = False; - } - } - - inited = inited && awt_dnd_ds_init(display); - } - - return inited; -} - -/* - * Returns a window of awt_root_shell. - */ -Window -get_awt_root_window() { - return awt_root_window; -} - -static unsigned char local_xerror_code = Success; - -static int -xerror_handler(Display *dpy, XErrorEvent *err) { - local_xerror_code = err->error_code; - return 0; -} - -/**************** checked_X* wrappers *****************************************/ -#undef NO_SYNC -#undef SYNC_TRACE - -unsigned char -checked_XChangeProperty(Display* display, Window w, Atom property, Atom type, - int format, int mode, unsigned char* data, - int nelements) { - XErrorHandler xerror_saved_handler; - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 1\n"); -#endif -#endif - local_xerror_code = Success; - xerror_saved_handler = XSetErrorHandler(xerror_handler); - - XChangeProperty(display, w, property, type, format, mode, data, nelements); - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 2\n"); -#endif -#endif - XSetErrorHandler(xerror_saved_handler); - - return local_xerror_code; -} - -unsigned char -checked_XGetWindowProperty(Display* display, Window w, Atom property, long long_offset, - long long_length, Bool delete, Atom req_type, - Atom* actual_type_return, int* actual_format_return, - unsigned long* nitems_return, unsigned long* bytes_after_return, - unsigned char** prop_return) { - - XErrorHandler xerror_saved_handler; - int ret_val = Success; - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 3\n"); -#endif -#endif - local_xerror_code = Success; - xerror_saved_handler = XSetErrorHandler(xerror_handler); - - ret_val = XGetWindowProperty(display, w, property, long_offset, long_length, - delete, req_type, actual_type_return, - actual_format_return, nitems_return, - bytes_after_return, prop_return); - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 4\n"); -#endif -#endif - XSetErrorHandler(xerror_saved_handler); - - return ret_val != Success ? local_xerror_code : Success; -} - -unsigned char -checked_XSendEvent(Display* display, Window w, Bool propagate, long event_mask, - XEvent* event_send) { - - XErrorHandler xerror_saved_handler; - Status ret_val = 0; - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 5\n"); -#endif -#endif - local_xerror_code = Success; - xerror_saved_handler = XSetErrorHandler(xerror_handler); - - ret_val = XSendEvent(display, w, propagate, event_mask, event_send); - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 6\n"); -#endif -#endif - XSetErrorHandler(xerror_saved_handler); - - return ret_val == 0 ? local_xerror_code : Success; -} - -/* - * NOTE: returns Success even if the two windows aren't on the same screen. - */ -unsigned char -checked_XTranslateCoordinates(Display* display, Window src_w, Window dest_w, - int src_x, int src_y, int* dest_x_return, - int* dest_y_return, Window* child_return) { - - XErrorHandler xerror_saved_handler; - Bool ret_val = True; - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 7\n"); -#endif -#endif - local_xerror_code = Success; - xerror_saved_handler = XSetErrorHandler(xerror_handler); - - ret_val = XTranslateCoordinates(display, src_w, dest_w, src_x, src_y, - dest_x_return, dest_y_return, child_return); - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 8\n"); -#endif -#endif - XSetErrorHandler(xerror_saved_handler); - - return local_xerror_code; -} - -unsigned char -checked_XSelectInput(Display* display, Window w, long event_mask) { - XErrorHandler xerror_saved_handler; - Bool ret_val = True; - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 7\n"); -#endif -#endif - local_xerror_code = Success; - xerror_saved_handler = XSetErrorHandler(xerror_handler); - - XSelectInput(display, w, event_mask); - -#ifndef NO_SYNC - XSync(display, False); -#ifdef SYNC_TRACE - fprintf(stderr,"XSync 8\n"); -#endif -#endif - XSetErrorHandler(xerror_saved_handler); - - return local_xerror_code; -} -/******************************************************************************/ - -jint -xdnd_to_java_action(Atom action) { - if (action == XA_XdndActionCopy) { - return java_awt_dnd_DnDConstants_ACTION_COPY; - } else if (action == XA_XdndActionMove) { - return java_awt_dnd_DnDConstants_ACTION_MOVE; - } else if (action == XA_XdndActionLink) { - return java_awt_dnd_DnDConstants_ACTION_LINK; - } else if (action == None) { - return java_awt_dnd_DnDConstants_ACTION_NONE; - } else { - /* XdndActionCopy is the default. */ - return java_awt_dnd_DnDConstants_ACTION_COPY; - } -} - -Atom -java_to_xdnd_action(jint action) { - switch (action) { - case java_awt_dnd_DnDConstants_ACTION_COPY: return XA_XdndActionCopy; - case java_awt_dnd_DnDConstants_ACTION_MOVE: return XA_XdndActionMove; - case java_awt_dnd_DnDConstants_ACTION_LINK: return XA_XdndActionLink; - default: return None; - } -} - -void -write_card8(void** p, CARD8 value) { - CARD8** card8_pp = (CARD8**)p; - **card8_pp = value; - (*card8_pp)++; -} - -void -write_card16(void** p, CARD16 value) { - CARD16** card16_pp = (CARD16**)p; - **card16_pp = value; - (*card16_pp)++; -} - -void -write_card32(void** p, CARD32 value) { - CARD32** card32_pp = (CARD32**)p; - **card32_pp = value; - (*card32_pp)++; -} - -CARD8 -read_card8(char* data, size_t offset) { - return *((CARD8*)(data + offset)); -} - -CARD16 -read_card16(char* data, size_t offset, char byte_order) { - CARD16 card16 = *((CARD16*)(data + offset)); - - if (byte_order != MOTIF_BYTE_ORDER) { - SWAP2BYTES(card16); - } - - return card16; -} - -CARD32 -read_card32(char* data, size_t offset, char byte_order) { - CARD32 card32 = *((CARD32*)(data + offset)); - - if (byte_order != MOTIF_BYTE_ORDER) { - SWAP4BYTES(card32); - } - - return card32; -} - -static Window -read_motif_window(Display* dpy) { - Window root_window = DefaultRootWindow(dpy); - Window motif_window = None; - - unsigned char ret; - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - ret = checked_XGetWindowProperty(dpy, root_window, _XA_MOTIF_DRAG_WINDOW, - 0, 0xFFFF, False, AnyPropertyType, &type, - &format, &nitems, &after, &data); - - if (ret != Success) { - DTRACE_PRINTLN2("%s:%d Failed to read _MOTIF_DRAG_WINDOW.", - __FILE__, __LINE__); - return None; - } - - - if (type == XA_WINDOW && format == 32 && nitems == 1) { - motif_window = *((Window*)data); - } - - XFree ((char *)data); - - return motif_window; -} - -static Window -create_motif_window(Display* dpy) { - Window root_window = DefaultRootWindow(dpy); - Window motif_window = None; - Display* display = NULL; - XSetWindowAttributes swa; - - display = XOpenDisplay(XDisplayString(dpy)); - if (display == NULL) { - return None; - } - - XGrabServer(display); - - XSetCloseDownMode(display, RetainPermanent); - - swa.override_redirect = True; - swa.event_mask = PropertyChangeMask; - motif_window = XCreateWindow(display, root_window, - -10, -10, 1, 1, 0, 0, - InputOnly, CopyFromParent, - (CWOverrideRedirect|CWEventMask), - &swa); - XMapWindow(display, motif_window); - - XChangeProperty(display, root_window, _XA_MOTIF_DRAG_WINDOW, XA_WINDOW, 32, - PropModeReplace, (unsigned char *)&motif_window, 1); - - XUngrabServer(display); - - XCloseDisplay(display); - - return motif_window; -} - -Window -get_motif_window(Display* dpy) { - /* - * Note: it is unsafe to cache the motif drag window handle, as another - * client can change the _MOTIF_DRAG_WINDOW property on the root, the handle - * becomes out-of-sync and all subsequent drag operations will fail. - */ - Window motif_window = read_motif_window(dpy); - if (motif_window == None) { - motif_window = create_motif_window(dpy); - } - - return motif_window; -} - -typedef struct { - CARD16 num_targets; - Atom* targets; -} TargetsTableEntry; - -typedef struct { - CARD16 num_entries; - TargetsTableEntry* entries; -} TargetsTable; - -typedef struct { - CARD8 byte_order; - CARD8 protocol_version; - CARD16 num_entries B16; - CARD32 heap_offset B32; -} TargetsPropertyRec; - -static TargetsTable* -get_target_list_table(Display* dpy) { - Window motif_window = get_motif_window(dpy); - TargetsTable* targets_table = NULL; - TargetsPropertyRec* targets_property_rec_ptr; - char* bufptr; - - unsigned char ret; - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - unsigned int i, j; - - ret = checked_XGetWindowProperty(dpy, motif_window, _XA_MOTIF_DRAG_TARGETS, - 0L, 100000L, False, _XA_MOTIF_DRAG_TARGETS, - &type, &format, &nitems, &after, - (unsigned char**)&targets_property_rec_ptr); - - if (ret != Success || type != _XA_MOTIF_DRAG_TARGETS || - targets_property_rec_ptr == NULL) { - - DTRACE_PRINT2("%s:%d Cannot read _XA_MOTIF_DRAG_TARGETS", __FILE__, __LINE__); - return NULL; - } - - if (targets_property_rec_ptr->protocol_version != - MOTIF_DND_PROTOCOL_VERSION) { - DTRACE_PRINT2("%s:%d incorrect protocol version", __FILE__, __LINE__); - return NULL; - } - - if (targets_property_rec_ptr->byte_order != MOTIF_BYTE_ORDER) { - SWAP2BYTES(targets_property_rec_ptr->num_entries); - SWAP4BYTES(targets_property_rec_ptr->heap_offset); - } - - targets_table = (TargetsTable*)malloc(sizeof(TargetsTable)); - if (targets_table == NULL) { - DTRACE_PRINT2("%s:%d malloc failed", __FILE__, __LINE__); - return NULL; - } - targets_table->num_entries = targets_property_rec_ptr->num_entries; - targets_table->entries = - (TargetsTableEntry*)malloc(sizeof(TargetsTableEntry) * - targets_property_rec_ptr->num_entries); - if (targets_table->entries == NULL) { - DTRACE_PRINT2("%s:%d malloc failed", __FILE__, __LINE__); - free(targets_table); - return NULL; - } - - bufptr = (char *)targets_property_rec_ptr + sizeof(TargetsPropertyRec); - for (i = 0; i < targets_table->num_entries; i++) { - CARD16 num_targets; - Atom* targets; - memcpy(&num_targets, bufptr, 2 ); - bufptr += 2; - if (targets_property_rec_ptr->byte_order != MOTIF_BYTE_ORDER) { - SWAP2BYTES(num_targets); - } - - targets = (Atom*)malloc(sizeof(Atom) * num_targets); - if (targets == NULL) { - DTRACE_PRINT2("%s:%d malloc failed", __FILE__, __LINE__); - free(targets_table->entries); - free(targets_table); - return NULL; - } - for (j = 0; j < num_targets; j++) { - CARD32 target; - memcpy(&target, bufptr, 4 ); - bufptr += 4; - if (targets_property_rec_ptr->byte_order != MOTIF_BYTE_ORDER) { - SWAP4BYTES(target); - } - targets[j] = (Atom)target; - } - - targets_table->entries[i].num_targets = num_targets; - targets_table->entries[i].targets = targets; - } - - free(targets_property_rec_ptr); - - return targets_table; -} - -static void -put_target_list_table(Display* dpy, TargetsTable* table) { - Window motif_window = get_motif_window(dpy); - TargetsPropertyRec* targets_property_rec_ptr; - size_t table_size = sizeof(TargetsPropertyRec); - unsigned char ret; - int i, j; - char* buf; - - for (i = 0; i < table->num_entries; i++) { - table_size += table->entries[i].num_targets * sizeof(Atom) + 2; - } - - targets_property_rec_ptr = (TargetsPropertyRec*)malloc(table_size); - if (targets_property_rec_ptr == NULL) { - DTRACE_PRINT2("%s:%d malloc failed", __FILE__, __LINE__); - return; - } - targets_property_rec_ptr->byte_order = MOTIF_BYTE_ORDER; - targets_property_rec_ptr->protocol_version = MOTIF_DND_PROTOCOL_VERSION; - targets_property_rec_ptr->num_entries = table->num_entries; - targets_property_rec_ptr->heap_offset = table_size; - - buf = (char*)targets_property_rec_ptr + sizeof(TargetsPropertyRec); - - for (i = 0; i < table->num_entries; i++) { - CARD16 num_targets = table->entries[i].num_targets; - memcpy(buf, &num_targets, 2); - buf += 2; - - for (j = 0; j < num_targets; j++) { - CARD32 target = table->entries[i].targets[j]; - memcpy(buf, &target, 4); - buf += 4; - } - } - - ret = checked_XChangeProperty(dpy, motif_window, _XA_MOTIF_DRAG_TARGETS, - _XA_MOTIF_DRAG_TARGETS, 8, PropModeReplace, - (unsigned char*)targets_property_rec_ptr, - (int)table_size); - - if (ret != Success) { - DTRACE_PRINT2("%s:%d XChangeProperty failed", __FILE__, __LINE__); - } - - XtFree((char*)targets_property_rec_ptr); -} - -static int -_compare(const void* p1, const void* p2) { - long diff = *(Atom*)p1 - *(Atom*)p2; - - if (diff > 0) { - return 1; - } else if (diff < 0) { - return -1; - } else { - return 0; - } -} - -/* - * Returns the index for the specified target list or -1 on failure. - */ -int -get_index_for_target_list(Display* dpy, Atom* targets, unsigned int num_targets) { - TargetsTable* targets_table = NULL; - Atom* sorted_targets = NULL; - int i, j; - int ret = -1; - - if (targets == NULL && num_targets > 0) { - DTRACE_PRINT4("%s:%d targets=%X num_targets=%d", - __FILE__, __LINE__, targets, num_targets); - return -1; - } - - if (num_targets > 0) { - sorted_targets = (Atom*)malloc(sizeof(Atom) * num_targets); - if (sorted_targets == NULL) { - DTRACE_PRINT2("%s:%d malloc failed.", __FILE__, __LINE__); - return -1; - } - - memcpy(sorted_targets, targets, sizeof(Atom) * num_targets); - qsort ((void *)sorted_targets, (size_t)num_targets, (size_t)sizeof(Atom), - _compare); - } - - XGrabServer(dpy); - targets_table = get_target_list_table(dpy); - - if (targets_table != NULL) { - for (i = 0; i < targets_table->num_entries; i++) { - TargetsTableEntry* entry_ptr = &targets_table->entries[i]; - Boolean equals = True; - if (num_targets == entry_ptr->num_targets) { - for (j = 0; j < entry_ptr->num_targets; j++) { - if (sorted_targets[j] != entry_ptr->targets[j]) { - equals = False; - break; - } - } - } else { - equals = False; - } - - if (equals) { - XUngrabServer(dpy); - /* Workaround for bug 5039226 */ - XSync(dpy, False); - free((char*)sorted_targets); - return i; - } - } - } else { - targets_table = (TargetsTable*)malloc(sizeof(TargetsTable)); - targets_table->num_entries = 0; - targets_table->entries = NULL; - } - - /* Index not found - expand the table. */ - targets_table->entries = - (TargetsTableEntry*)realloc((char*)targets_table->entries, - sizeof(TargetsTableEntry) * - (targets_table->num_entries + 1)); - if (targets_table->entries == NULL) { - DTRACE_PRINT2("%s:%d realloc failed.", __FILE__, __LINE__); - XUngrabServer(dpy); - /* Workaround for bug 5039226 */ - XSync(dpy, False); - free((char*)sorted_targets); - return -1; - } - - /* Fill in the new entry */ - { - TargetsTableEntry* new_entry = - &targets_table->entries[targets_table->num_entries]; - - new_entry->num_targets = num_targets; - if (num_targets > 0) { - new_entry->targets = (Atom*)malloc(sizeof(Atom) * num_targets); - if (new_entry->targets == NULL) { - DTRACE_PRINT2("%s:%d malloc failed.", __FILE__, __LINE__); - XUngrabServer(dpy); - /* Workaround for bug 5039226 */ - XSync(dpy, False); - free((char*)sorted_targets); - return -1; - } - memcpy(new_entry->targets, sorted_targets, - sizeof(Atom) * num_targets); - } else { - new_entry->targets = NULL; - } - } - - targets_table->num_entries++; - - put_target_list_table(dpy, targets_table); - - XUngrabServer(dpy); - /* Workaround for bug 5039226 */ - XSync(dpy, False); - - ret = targets_table->num_entries - 1; - - free((char*)sorted_targets); - - for (i = 0; i < targets_table->num_entries; i++) { - free((char*)targets_table->entries[i].targets); - } - - free((char*)targets_table->entries); - free((char*)targets_table); - return ret; -} - -/* - * Retrieves the target list for the specified index. - * Stores the number of targets in the list to 'num_targets' and the targets - * to 'targets'. On failure stores 0 and NULL respectively. - * The caller should free the allocated array when done with it. - */ -void -get_target_list_for_index(Display* dpy, int index, Atom** targets, unsigned int* num_targets) { - TargetsTable* table = get_target_list_table(dpy); - TargetsTableEntry* entry = NULL; - - if (table == NULL) { - DTRACE_PRINT2("%s:%d No target table.", __FILE__, __LINE__); - *targets = NULL; - *num_targets = 0; - return; - } - - if (table->num_entries <= index) { - DTRACE_PRINT4("%s:%d index out of bounds idx=%d entries=%d", - __FILE__, __LINE__, index, table->num_entries); - *targets = NULL; - *num_targets = 0; - return; - } - - entry = &table->entries[index]; - - *targets = (Atom*)malloc(entry->num_targets * sizeof(Atom)); - - if (*targets == NULL) { - DTRACE_PRINT2("%s:%d malloc failed.", __FILE__, __LINE__); - *num_targets = 0; - return; - } - - memcpy(*targets, entry->targets, entry->num_targets * sizeof(Atom)); - *num_targets = entry->num_targets; -} - -jint -motif_to_java_actions(unsigned char motif_action) { - jint java_action = java_awt_dnd_DnDConstants_ACTION_NONE; - - if (motif_action & MOTIF_DND_COPY) { - java_action |= java_awt_dnd_DnDConstants_ACTION_COPY; - } - - if (motif_action & MOTIF_DND_MOVE) { - java_action |= java_awt_dnd_DnDConstants_ACTION_MOVE; - } - - if (motif_action & MOTIF_DND_LINK) { - java_action |= java_awt_dnd_DnDConstants_ACTION_LINK; - } - - return java_action; -} - -unsigned char -java_to_motif_actions(jint java_action) { - unsigned char motif_action = MOTIF_DND_NOOP; - - if (java_action & java_awt_dnd_DnDConstants_ACTION_COPY) { - motif_action |= MOTIF_DND_COPY; - } - - if (java_action & java_awt_dnd_DnDConstants_ACTION_MOVE) { - motif_action |= MOTIF_DND_MOVE; - } - - if (java_action & java_awt_dnd_DnDConstants_ACTION_LINK) { - motif_action |= MOTIF_DND_LINK; - } - - return motif_action; -} - -Boolean -awt_dnd_process_event(XEvent* event) { - Boolean ret = awt_dnd_ds_process_event(event) || - awt_dnd_dt_process_event(event); - - /* Extract the event from the queue if it is processed. */ - if (ret) { - XNextEvent(event->xany.display, event); - } - - return ret; -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_dnd.h --- a/jdk/src/solaris/native/sun/awt/awt_dnd.h Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,242 +0,0 @@ -/* - * Copyright 2003-2004 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 - -#include "awt_p.h" - -/* For definition of MComponentPeerIDs */ -#include "awt_Component.h" - -extern struct MComponentPeerIDs mComponentPeerIDs; - -/* DnD protocols */ - -typedef enum { - NO_PROTOCOL, - XDND_PROTOCOL, - MOTIF_DND_PROTOCOL -} Protocol; - -/* XDnD constants */ - -#define XDND_PROTOCOL_VERSION 5 -/* XDnD compliance only requires supporting version 3 and up. */ -#define XDND_MIN_PROTOCOL_VERSION 3 - -#define XDND_PROTOCOL_MASK 0xFF000000 -#define XDND_PROTOCOL_SHIFT 24 -#define XDND_DATA_TYPES_BIT 0x1 -#define XDND_ACCEPT_DROP_FLAG 0x1 - -/* Motif DnD constants */ - -#define MOTIF_DND_PROTOCOL_VERSION 0 - -/* Suuported protocol styles */ -#define MOTIF_PREFER_PREREGISTER_STYLE 2 -#define MOTIF_PREFER_DYNAMIC_STYLE 4 -#define MOTIF_DYNAMIC_STYLE 5 -#define MOTIF_PREFER_RECEIVER_STYLE 6 - -#define MOTIF_MESSAGE_REASON_MASK 0x7F -#define MOTIF_MESSAGE_SENDER_MASK 0x80 -#define MOTIF_MESSAGE_FROM_RECEIVER 0x80 -#define MOTIF_MESSAGE_FROM_INITIATOR 0 - -/* Info structure sizes */ -#define MOTIF_INITIATOR_INFO_SIZE 8 -#define MOTIF_RECEIVER_INFO_SIZE 16 - -/* Message flags masks and shifts */ -#define MOTIF_DND_ACTION_MASK 0x000F -#define MOTIF_DND_ACTION_SHIFT 0 -#define MOTIF_DND_STATUS_MASK 0x00F0 -#define MOTIF_DND_STATUS_SHIFT 4 -#define MOTIF_DND_ACTIONS_MASK 0x0F00 -#define MOTIF_DND_ACTIONS_SHIFT 8 - -/* message type constants */ -#define TOP_LEVEL_ENTER 0 -#define TOP_LEVEL_LEAVE 1 -#define DRAG_MOTION 2 -#define DROP_SITE_ENTER 3 -#define DROP_SITE_LEAVE 4 -#define DROP_START 5 -#define DROP_FINISH 6 -#define DRAG_DROP_FINISH 7 -#define OPERATION_CHANGED 8 - -/* drop action constants */ -#define MOTIF_DND_NOOP 0L -#define MOTIF_DND_MOVE (1L << 0) -#define MOTIF_DND_COPY (1L << 1) -#define MOTIF_DND_LINK (1L << 2) - -/* drop site status constants */ -#define MOTIF_NO_DROP_SITE 1 -#define MOTIF_INVALID_DROP_SITE 2 -#define MOTIF_VALID_DROP_SITE 3 - -/* Shared atoms */ - -extern Atom XA_WM_STATE; -extern Atom XA_DELETE; - -/* XDnD atoms */ - -extern Atom XA_XdndAware; -extern Atom XA_XdndProxy; - -extern Atom XA_XdndEnter; -extern Atom XA_XdndPosition; -extern Atom XA_XdndLeave; -extern Atom XA_XdndDrop; -extern Atom XA_XdndStatus; -extern Atom XA_XdndFinished; - -extern Atom XA_XdndTypeList; -extern Atom XA_XdndSelection; - -extern Atom XA_XdndActionCopy; -extern Atom XA_XdndActionMove; -extern Atom XA_XdndActionLink; -extern Atom XA_XdndActionAsk; -extern Atom XA_XdndActionPrivate; -extern Atom XA_XdndActionList; - -/* Motif DnD atoms */ - -extern Atom _XA_MOTIF_DRAG_WINDOW; -extern Atom _XA_MOTIF_DRAG_TARGETS; -extern Atom _XA_MOTIF_DRAG_INITIATOR_INFO; -extern Atom _XA_MOTIF_DRAG_RECEIVER_INFO; -extern Atom _XA_MOTIF_DRAG_AND_DROP_MESSAGE; -extern Atom XA_XmTRANSFER_SUCCESS; -extern Atom XA_XmTRANSFER_FAILURE; -extern Atom _XA_MOTIF_ATOM_0; - -extern unsigned char MOTIF_BYTE_ORDER; - -/* Motif DnD macros */ - -#define SWAP4BYTES(l) {\ - struct {\ - unsigned t :32;\ - } bit32;\ - char n, *tp = (char *) &bit32;\ - bit32.t = l;\ - n = tp[0]; tp[0] = tp[3]; tp[3] = n;\ - n = tp[1]; tp[1] = tp[2]; tp[2] = n;\ - l = bit32.t;\ -} - -#define SWAP2BYTES(s) {\ - struct {\ - unsigned t :16;\ - } bit16;\ - char n, *tp = (char *) &bit16;\ - bit16.t = s;\ - n = tp[0]; tp[0] = tp[1]; tp[1] = n;\ - s = bit16.t;\ -} - -typedef struct DropSiteInfo { - Widget tlw; - jobject component; - Boolean isComposite; - uint32_t dsCnt; -} DropSiteInfo; - -Boolean awt_dnd_init(Display* display); -Boolean awt_dnd_ds_init(Display* display); - -Window get_awt_root_window(); - -/**************** checked_X* wrappers *****************************************/ -unsigned char -checked_XChangeProperty(Display* display, Window w, Atom property, Atom type, - int format, int mode, unsigned char* data, - int nelements); - -unsigned char -checked_XGetWindowProperty(Display* display, Window w, Atom property, - long long_offset, long long_length, Bool delete, - Atom req_type, Atom* actual_type_return, - int* actual_format_return, - unsigned long* nitems_return, - unsigned long* bytes_after_return, - unsigned char** prop_return); - -unsigned char -checked_XSendEvent(Display* display, Window w, Bool propagate, long event_mask, - XEvent* event_send); - -unsigned char -checked_XTranslateCoordinates(Display* display, Window src_w, Window dest_w, - int src_x, int src_y, int* dest_x_return, - int* dest_y_return, Window* child_return); - -unsigned char -checked_XSelectInput(Display* display, Window w, long event_mask); -/******************************************************************************/ - -jint xdnd_to_java_action(Atom action); -Atom java_to_xdnd_action(jint action); - -jint motif_to_java_actions(unsigned char action); -unsigned char java_to_motif_actions(jint action); - -void write_card8(void** p, CARD8 value); -void write_card16(void** p, CARD16 value); -void write_card32(void** p, CARD32 value); - -CARD8 read_card8(char* data, size_t offset); -CARD16 read_card16(char* data, size_t offset, char byte_order); -CARD32 read_card32(char* data, size_t offset, char byte_order); - -Window get_motif_window(Display* dpy); - -/*************************** TARGET LIST SUPPORT ***************************************/ - -int get_index_for_target_list(Display* dpy, Atom* targets, unsigned int num_targets); -void get_target_list_for_index(Display* dpy, int index, Atom** targets, unsigned - int* num_targets); - -/***************************************************************************************/ - -Boolean awt_dnd_process_event(XEvent* event); -Boolean awt_dnd_ds_process_event(XEvent* event); -Boolean awt_dnd_dt_process_event(XEvent* event); - -Window awt_dnd_ds_get_source_window(); - -/**************************** XEmbed server DnD support ***********************/ -void set_proxy_mode_source_window(Window window); -/******************************************************************************/ diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_dnd_ds.c --- a/jdk/src/solaris/native/sun/awt/awt_dnd_ds.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1796 +0,0 @@ -/* - * Copyright 2003-2006 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_dnd.h" - -/* Declares getCursor(JNIEnv, jobject) */ -#include "awt_Cursor.h" - -/* Define java constants */ -#include "java_awt_dnd_DnDConstants.h" -#include "sun_awt_dnd_SunDragSourceContextPeer.h" - -/* Define DECLARE_* macros */ -#include "awt_DataTransferer.h" - -#define GRAB_EVENT_MASK \ - (ButtonPressMask | ButtonMotionMask | ButtonReleaseMask) - -/* Events selected on the root window during drag. */ -#define ROOT_EVENT_MASK \ - (ButtonMotionMask | KeyPressMask | KeyReleaseMask) - -/* Events selected on registered receiver windows during drag. */ -#define RECEIVER_EVENT_MASK \ - (StructureNotifyMask) - - -/* in canvas.c */ -extern jint getModifiers(uint32_t state, jint button, jint keyCode); - -typedef struct { - CARD8 byte_order; - CARD8 protocol_version; - CARD16 index; - CARD32 selection_atom; -} InitiatorInfo; - -typedef enum { - /* - * Communicate with receivers of both protocols. - * If the receiver supports both protocols, - * choose Motif DnD for communication. - */ - DS_POLICY_PREFER_MOTIF, - /* - * Communicate with receivers of both protocols. - * If the receiver supports both protocols, - * choose XDnD for communication. [default] - */ - DS_POLICY_PREFER_XDND, - /* Communicate only with Motif DnD receivers. */ - DS_POLICY_ONLY_MOTIF, - /* Communicate only with XDnD receivers. */ - DS_POLICY_ONLY_XDND -} DragSourcePolicy; - - -/* The drag source policy. */ -static DragSourcePolicy drag_source_policy = DS_POLICY_PREFER_XDND; - -static Boolean dnd_in_progress = False; -static Boolean drag_in_progress = False; -static jobject source_peer = NULL; -static Atom* data_types = NULL; -static unsigned int data_types_count = 0; -static Window drag_root_window = None; -static EventMask your_root_event_mask = NoEventMask; -static Time latest_time_stamp = CurrentTime; - -/* The child of the root which is currently under the mouse. */ -static Window target_root_subwindow = None; - -static Window target_window = None; -static long target_window_mask = 0; -static Window target_proxy_window = None; -static Protocol target_protocol = NO_PROTOCOL; -static unsigned int target_protocol_version = 0; -/* - * The server time when the pointer entered the current target - - * needed on Motif DnD to filter out messages from the previous - * target. - * It is updated whenever the target_window is updated. - * If the target_window is set to non-None, it is set to the time stamp - * of the X event that trigger the update. Otherwise, it is set to CurrentTime. - */ -static Time target_enter_server_time = CurrentTime; - -static int x_root = 0; -static int y_root = 0; -static unsigned int event_state = 0; - -static jint source_action = java_awt_dnd_DnDConstants_ACTION_NONE; -static jint source_actions = java_awt_dnd_DnDConstants_ACTION_NONE; -static jint target_action = java_awt_dnd_DnDConstants_ACTION_NONE; - -/* Forward declarations */ -static void cleanup_drag(Display* dpy, Time time); -static Boolean process_proxy_mode_event(XEvent* xev); - -/**************************** XEmbed server DnD support ***********************/ -static Window proxy_mode_source_window = None; -/******************************************************************************/ - -/**************************** JNI stuff ***************************************/ - -DECLARE_JAVA_CLASS(dscp_clazz, "sun/awt/dnd/SunDragSourceContextPeer") - -static void -ds_postDragSourceDragEvent(JNIEnv* env, jint targetAction, unsigned int state, - int x, int y, jint dispatch_type) { - DECLARE_VOID_JAVA_METHOD(dscp_postDragSourceDragEvent, dscp_clazz, - "postDragSourceDragEvent", "(IIIII)V"); - - DASSERT(!JNU_IsNull(env, source_peer)); - if (JNU_IsNull(env, source_peer)) { - return; - } - - (*env)->CallVoidMethod(env, source_peer, dscp_postDragSourceDragEvent, - targetAction, getModifiers(state, 0, 0), x, y, - dispatch_type); -} - -static jint -ds_convertModifiersToDropAction(JNIEnv* env, unsigned int state) { - jint action; - DECLARE_STATIC_JINT_JAVA_METHOD(dscp_convertModifiersToDropAction, dscp_clazz, - "convertModifiersToDropAction", "(II)I"); - action = (*env)->CallStaticIntMethod(env, clazz, dscp_convertModifiersToDropAction, - getModifiers(state, 0, 0), source_actions); - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - return java_awt_dnd_DnDConstants_ACTION_NONE; - } - return action; -} - -static void -ds_postDragSourceEvent(JNIEnv* env, int x, int y) { - DECLARE_VOID_JAVA_METHOD(dscp_dragExit, dscp_clazz, - "dragExit", "(II)V"); - - DASSERT(!JNU_IsNull(env, source_peer)); - if (JNU_IsNull(env, source_peer)) { - return; - } - - (*env)->CallVoidMethod(env, source_peer, dscp_dragExit, x, y); -} - -static void -ds_postDragSourceDropEvent(JNIEnv* env, jboolean success, jint targetAction, - int x, int y) { - DECLARE_VOID_JAVA_METHOD(dscp_dragDropFinished, dscp_clazz, - "dragDropFinished", "(ZIII)V"); - - DASSERT(!JNU_IsNull(env, source_peer)); - if (JNU_IsNull(env, source_peer)) { - return; - } - - (*env)->CallVoidMethod(env, source_peer, dscp_dragDropFinished, - success, targetAction, x, y); -} - -/******************************************************************************/ - -static void -cancel_drag(XtPointer client_data, XtIntervalId* id) { - Time time_stamp = awt_util_getCurrentServerTime(); - - cleanup_drag(awt_display, time_stamp); -} - -#define DONT_CARE -1 - -static void -awt_popupCallback(Widget shell, XtPointer closure, XtPointer call_data) { - XtGrabKind grab_kind = XtGrabNone; - - if (call_data != NULL) { - grab_kind = *((XtGrabKind*)call_data); - } - - if (XmIsVendorShell(shell)) { - int input_mode; - XtVaGetValues(shell, XmNmwmInputMode, &input_mode, NULL); - switch (input_mode) { - case DONT_CARE: - case MWM_INPUT_MODELESS: - grab_kind = XtGrabNonexclusive; break; - case MWM_INPUT_PRIMARY_APPLICATION_MODAL: - case MWM_INPUT_SYSTEM_MODAL: - case MWM_INPUT_FULL_APPLICATION_MODAL: - grab_kind = XtGrabExclusive; break; - } - } - - if (grab_kind == XtGrabExclusive) { - /* - * We should cancel the drag on the toolkit thread. Otherwise, it can be - * called while the toolkit thread is waiting inside some drag callback. - * In this case Motif will crash when the drag callback returns. - */ - XtAppAddTimeOut(awt_appContext, 0L, cancel_drag, NULL); - } -} - -static XtInitProc xt_shell_initialize = NULL; - -static void -awt_ShellInitialize(Widget req, Widget new, ArgList args, Cardinal *num_args) { - XtAddCallback(new, XtNpopupCallback, awt_popupCallback, NULL); - (*xt_shell_initialize)(req, new, args, num_args); -} - -/* - * Fix for 4484572 (copied from awt_XmDnD.c). - * Modify the 'initialize' routine for all ShellWidget instances, so that it - * will install an XtNpopupCallback that cancels the current drag operation. - * It is needed, since AWT doesn't have full control over all ShellWidget - * instances (e.g. XmPopupMenu internally creates and popups an XmMenuShell). - */ -static void -awt_set_ShellInitialize() { - static Boolean inited = False; - - DASSERT(!inited); - if (inited) { - return; - } - - xt_shell_initialize = shellWidgetClass->core_class.initialize; - shellWidgetClass->core_class.initialize = (XtInitProc)awt_ShellInitialize; - inited = True; -} - -/* - * Returns True if initialization completes successfully. - */ -Boolean -awt_dnd_ds_init(Display* display) { - if (XSaveContext(display, XA_XdndSelection, awt_convertDataContext, - (XPointer)NULL) == XCNOMEM) { - return False; - } - - if (XSaveContext(display, _XA_MOTIF_ATOM_0, awt_convertDataContext, - (XPointer)NULL) == XCNOMEM) { - return False; - } - - { - char *ev = getenv("_JAVA_DRAG_SOURCE_POLICY"); - - /* By default XDnD protocol is preferred. */ - drag_source_policy = DS_POLICY_PREFER_XDND; - - if (ev != NULL) { - if (strcmp(ev, "PREFER_XDND") == 0) { - drag_source_policy = DS_POLICY_PREFER_XDND; - } else if (strcmp(ev, "PREFER_MOTIF") == 0) { - drag_source_policy = DS_POLICY_PREFER_MOTIF; - } else if (strcmp(ev, "ONLY_MOTIF") == 0) { - drag_source_policy = DS_POLICY_ONLY_MOTIF; - } else if (strcmp(ev, "ONLY_XDND") == 0) { - drag_source_policy = DS_POLICY_ONLY_XDND; - } - } - } - - awt_set_ShellInitialize(); - - return True; -} - -/* - * Returns a handle of the window used as a drag source. - */ -Window -awt_dnd_ds_get_source_window() { - return get_awt_root_window(); -} - -/* - * Returns True if a drag operation initiated by this client - * is still in progress. - */ -Boolean -awt_dnd_ds_in_progress() { - return dnd_in_progress; -} - -static void -ds_send_event_to_target(XClientMessageEvent* xclient) { - /* Shortcut if the source is in the same JVM. */ - if (XtWindowToWidget(xclient->display, target_proxy_window) != NULL) { - awt_dnd_dt_process_event((XEvent*)xclient); - } else { - XSendEvent(xclient->display, target_proxy_window, False, NoEventMask, - (XEvent*)xclient); - } -} - -static void -xdnd_send_enter(Display* dpy, Time time) { - XClientMessageEvent enter; - - enter.display = dpy; - enter.type = ClientMessage; - enter.window = target_window; - enter.format = 32; - enter.message_type = XA_XdndEnter; - enter.data.l[0] = awt_dnd_ds_get_source_window(); - enter.data.l[1] = target_protocol_version << XDND_PROTOCOL_SHIFT; - enter.data.l[1] |= data_types_count > 3 ? XDND_DATA_TYPES_BIT : 0; - enter.data.l[2] = data_types_count > 0 ? data_types[0] : None; - enter.data.l[3] = data_types_count > 1 ? data_types[1] : None; - enter.data.l[4] = data_types_count > 2 ? data_types[2] : None; - - ds_send_event_to_target(&enter); -} - -static void -motif_send_enter(Display* dpy, Time time) { - XClientMessageEvent enter; - - enter.display = dpy; - enter.type = ClientMessage; - enter.window = target_window; - enter.format = 8; - enter.message_type = _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - { - void* p = &enter.data.b[0]; - int flags = 0; - - flags |= java_to_motif_actions(source_action) << MOTIF_DND_ACTION_SHIFT; - flags |= java_to_motif_actions(source_actions) << MOTIF_DND_ACTIONS_SHIFT; - - write_card8(&p, TOP_LEVEL_ENTER | MOTIF_MESSAGE_FROM_INITIATOR); - write_card8(&p, MOTIF_BYTE_ORDER); - write_card16(&p, flags); - write_card32(&p, time); - write_card32(&p, awt_dnd_ds_get_source_window()); - write_card32(&p, _XA_MOTIF_ATOM_0); - } - - ds_send_event_to_target(&enter); -} - -static void -send_enter(Display* dpy, Time time) { - switch (target_protocol) { - case XDND_PROTOCOL: - xdnd_send_enter(dpy, time); - break; - case MOTIF_DND_PROTOCOL: - motif_send_enter(dpy, time); - break; - case NO_PROTOCOL: - default: - DTRACE_PRINTLN2("%s:%d send_enter: unknown DnD protocol.", __FILE__, __LINE__); - break; - } -} - -static void -xdnd_send_move(XMotionEvent* event) { - XClientMessageEvent move; - - move.display = event->display; - move.type = ClientMessage; - move.window = target_window; - move.format = 32; - move.message_type = XA_XdndPosition; - move.data.l[0] = awt_dnd_ds_get_source_window(); - move.data.l[1] = 0; /* flags */ - move.data.l[2] = event->x_root << 16 | event->y_root; - move.data.l[3] = event->time; - move.data.l[4] = java_to_xdnd_action(source_action); - - ds_send_event_to_target(&move); -} - -static void -motif_send_move(XMotionEvent* event) { - XClientMessageEvent move; - - move.display = event->display; - move.type = ClientMessage; - move.window = target_window; - move.format = 8; - move.message_type = _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - { - void* p = move.data.b; - int flags = 0; - - flags |= java_to_motif_actions(source_action) << MOTIF_DND_ACTION_SHIFT; - flags |= java_to_motif_actions(source_actions) << MOTIF_DND_ACTIONS_SHIFT; - - write_card8(&p, DRAG_MOTION | MOTIF_MESSAGE_FROM_INITIATOR); - write_card8(&p, MOTIF_BYTE_ORDER); - write_card16(&p, flags); - write_card32(&p, event->time); - write_card16(&p, event->x_root); - write_card16(&p, event->y_root); - } - - ds_send_event_to_target(&move); -} - -static void -send_move(XMotionEvent* event) { - switch (target_protocol) { - case XDND_PROTOCOL: - xdnd_send_move(event); - break; - case MOTIF_DND_PROTOCOL: - motif_send_move(event); - break; - case NO_PROTOCOL: - default: - DTRACE_PRINTLN2("%s:%d send_move: unknown DnD protocol.", __FILE__, __LINE__); - break; - } -} - -static void -xdnd_send_leave(Display* dpy, Time time) { - XClientMessageEvent leave; - - leave.display = dpy; - leave.type = ClientMessage; - leave.window = target_window; - leave.format = 32; - leave.message_type = XA_XdndLeave; - leave.data.l[0] = awt_dnd_ds_get_source_window(); - leave.data.l[1] = 0; - leave.data.l[2] = 0; - leave.data.l[3] = 0; - leave.data.l[4] = 0; - - ds_send_event_to_target(&leave); -} - -static void -motif_send_leave(Display* dpy, Time time) { - XClientMessageEvent leave; - - leave.display = dpy; - leave.type = ClientMessage; - leave.window = target_window; - leave.format = 8; - leave.message_type = _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - { - void* p = &leave.data.b[0]; - - write_card8(&p, TOP_LEVEL_LEAVE | MOTIF_MESSAGE_FROM_INITIATOR); - write_card8(&p, MOTIF_BYTE_ORDER); - write_card16(&p, 0); - write_card32(&p, time); - write_card32(&p, awt_dnd_ds_get_source_window()); - } - - ds_send_event_to_target(&leave); -} - -static void -send_leave(Display* dpy, Time time) { - switch (target_protocol) { - case XDND_PROTOCOL: - xdnd_send_leave(dpy, time); - break; - case MOTIF_DND_PROTOCOL: - motif_send_leave(dpy, time); - break; - case NO_PROTOCOL: - default: - DTRACE_PRINTLN2("%s:%d send_leave: unknown DnD protocol.", __FILE__, __LINE__); - break; - } -} - - -static void -xdnd_send_drop(XButtonEvent* event) { - XClientMessageEvent drop; - - drop.display = event->display; - drop.type = ClientMessage; - drop.window = target_window; - drop.format = 32; - drop.message_type = XA_XdndDrop; - drop.data.l[0] = awt_dnd_ds_get_source_window(); - drop.data.l[1] = 0; /* flags */ - drop.data.l[2] = event->time; /* ### */ - drop.data.l[3] = 0; - drop.data.l[4] = 0; - - ds_send_event_to_target(&drop); -} - -static void -motif_send_drop(XButtonEvent* event) { - XClientMessageEvent drop; - - /* - * Motif drop sites expect TOP_LEVEL_LEAVE before DROP_START. - */ - motif_send_leave(event->display, event->time); - - drop.display = event->display; - drop.type = ClientMessage; - drop.window = target_window; - drop.format = 8; - drop.message_type = _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - { - void* p = &drop.data.b[0]; - int flags = 0; - - flags |= java_to_motif_actions(source_action) << MOTIF_DND_ACTION_SHIFT; - flags |= java_to_motif_actions(source_actions) << MOTIF_DND_ACTIONS_SHIFT; - - write_card8(&p, DROP_START | MOTIF_MESSAGE_FROM_INITIATOR); - write_card8(&p, MOTIF_BYTE_ORDER); - write_card16(&p, flags); - write_card32(&p, event->time); - write_card16(&p, event->x_root); - write_card16(&p, event->y_root); - write_card32(&p, _XA_MOTIF_ATOM_0); - write_card32(&p, awt_dnd_ds_get_source_window()); - } - - ds_send_event_to_target(&drop); -} - -static void -send_drop(XButtonEvent* event) { - switch (target_protocol) { - case XDND_PROTOCOL: - xdnd_send_drop(event); - break; - case MOTIF_DND_PROTOCOL: - motif_send_drop(event); - break; - case NO_PROTOCOL: - default: - DTRACE_PRINTLN2("%s:%d send_drop: unknown DnD protocol.", __FILE__, __LINE__); - break; - } -} - -static void -remove_dnd_grab(Display* dpy, Time time) { - XUngrabPointer(dpy, time); - XUngrabKeyboard(dpy, time); - - /* Restore the root event mask if it was changed. */ - if ((your_root_event_mask | ROOT_EVENT_MASK) != your_root_event_mask && - drag_root_window != None) { - - XSelectInput(dpy, drag_root_window, your_root_event_mask); - - drag_root_window = None; - your_root_event_mask = NoEventMask; - } -} - -static void -cleanup_target_info(Display* dpy) { - target_root_subwindow = None; - - target_window = None; - target_proxy_window = None; - target_protocol = NO_PROTOCOL; - target_protocol_version = 0; - target_enter_server_time = CurrentTime; - target_action = java_awt_dnd_DnDConstants_ACTION_NONE; -} - -static void -cleanup_drag(Display* dpy, Time time) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - - if (dnd_in_progress) { - if (target_window != None) { - send_leave(dpy, time); - } - - if (target_action != java_awt_dnd_DnDConstants_ACTION_NONE) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - ds_postDragSourceEvent(env, x_root, y_root); - } - - ds_postDragSourceDropEvent(env, JNI_FALSE, - java_awt_dnd_DnDConstants_ACTION_NONE, - x_root, y_root); - } - - /* Cleanup the global state */ - dnd_in_progress = False; - drag_in_progress = False; - data_types_count = 0; - if (data_types != NULL) { - free(data_types); - data_types = NULL; - } - if (!JNU_IsNull(env, source_peer)) { - (*env)->DeleteGlobalRef(env, source_peer); - source_peer = NULL; - } - - cleanup_target_info(dpy); - - remove_dnd_grab(dpy, time); - - XDeleteProperty(awt_display, awt_dnd_ds_get_source_window(), _XA_MOTIF_ATOM_0); - XDeleteProperty(awt_display, awt_dnd_ds_get_source_window(), XA_XdndTypeList); - XDeleteProperty(awt_display, awt_dnd_ds_get_source_window(), XA_XdndActionList); - XtDisownSelection(awt_root_shell, _XA_MOTIF_ATOM_0, time); - XtDisownSelection(awt_root_shell, XA_XdndSelection, time); - - awt_cleanupConvertDataContext(env, _XA_MOTIF_ATOM_0); - awt_cleanupConvertDataContext(env, XA_XdndSelection); -} - -static void -process_drop(XButtonEvent* event) { - unsigned char ret; - XWindowAttributes xwa; - - DASSERT(target_window != None); - - XGetWindowAttributes(event->display, target_window, &xwa); - - target_window_mask = xwa.your_event_mask; - - /* Select for DestoyNotify to cleanup if the target crashes. */ - ret = checked_XSelectInput(event->display, target_window, - (target_window_mask | StructureNotifyMask)); - - if (ret == Success) { - send_drop(event); - } else { - DTRACE_PRINTLN2("%s:%d drop rejected - invalid window.", - __FILE__, __LINE__); - cleanup_drag(event->display, event->time); - } -} - -static Window -find_client_window(Display* dpy, Window window) { - Window root, parent, *children; - unsigned int nchildren, idx; - - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - Status ret; - - if (XGetWindowProperty(dpy, window, XA_WM_STATE, 0, 0, False, - AnyPropertyType, &type, &format, &nitems, - &after, &data) == Success) { - XFree(data); - } - - if (type != None) { - return window; - } - - if (!XQueryTree(dpy, window, &root, &parent, &children, &nchildren)) { - return None; - } - - if (children == NULL) { - return None; - } - - for (idx = 0; idx < nchildren; idx++) { - Window win = find_client_window(dpy, children[idx]); - if (win != None) { - XFree(children); - return win; - } - } - - XFree(children); - return None; -} - -static void -do_update_target_window(Display* dpy, Window subwindow, Time time) { - Window client_window = None; - Window proxy_window = None; - Protocol protocol = NO_PROTOCOL; - unsigned int protocol_version = 0; - Boolean is_receiver = False; - - client_window = find_client_window(dpy, subwindow); - - if (client_window != None) { - /* Request status */ - int status; - - /* Returns of XGetWindowProperty */ - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - /* - * No need for checked_XGetWindowProperty, since we check the returned - * property type anyway. - */ - if (drag_source_policy != DS_POLICY_ONLY_XDND) { - - data = NULL; - status = XGetWindowProperty(dpy, client_window, - _XA_MOTIF_DRAG_RECEIVER_INFO, - 0, 0xFFFF, False, AnyPropertyType, - &type, &format, &nitems, &after, &data); - - if (status == Success && data != NULL && type != None && format == 8 - && nitems >= MOTIF_RECEIVER_INFO_SIZE) { - unsigned char byte_order = read_card8((char*)data, 0); - unsigned char drag_protocol_style = read_card8((char*)data, 2); - - switch (drag_protocol_style) { - case MOTIF_PREFER_PREREGISTER_STYLE : - case MOTIF_PREFER_DYNAMIC_STYLE : - case MOTIF_DYNAMIC_STYLE : - case MOTIF_PREFER_RECEIVER_STYLE : - proxy_window = read_card32((char*)data, 4, byte_order); - protocol = MOTIF_DND_PROTOCOL; - protocol_version = read_card8((char*)data, 1); - is_receiver = True; - break; - default: - DTRACE_PRINTLN3("%s:%d unsupported protocol style (%d).", - __FILE__, __LINE__, (int)drag_protocol_style); - } - } - - if (status == Success) { - XFree(data); - data = NULL; - } - } - - if (drag_source_policy != DS_POLICY_ONLY_MOTIF && - (drag_source_policy != DS_POLICY_PREFER_MOTIF || !is_receiver)) { - - data = NULL; - status = XGetWindowProperty(dpy, client_window, XA_XdndAware, 0, 1, - False, AnyPropertyType, &type, &format, - &nitems, &after, &data); - - if (status == Success && data != NULL && type == XA_ATOM) { - unsigned int target_version = *((unsigned int*)data); - - if (target_version >= XDND_MIN_PROTOCOL_VERSION) { - proxy_window = None; - protocol = XDND_PROTOCOL; - protocol_version = target_version < XDND_PROTOCOL_VERSION ? - target_version : XDND_PROTOCOL_VERSION; - is_receiver = True; - } - } - - /* Retrieve the proxy window handle and check if it is valid. */ - if (protocol == XDND_PROTOCOL) { - if (status == Success) { - XFree(data); - } - - data = NULL; - status = XGetWindowProperty(dpy, client_window, XA_XdndProxy, 0, - 1, False, XA_WINDOW, &type, &format, - &nitems, &after, &data); - - if (status == Success && data != NULL && type == XA_WINDOW) { - proxy_window = *((Window*)data); - } - - if (proxy_window != None) { - if (status == Success) { - XFree(data); - } - - data = NULL; - status = XGetWindowProperty(dpy, proxy_window, XA_XdndProxy, - 0, 1, False, XA_WINDOW, &type, - &format, &nitems, &after, &data); - - if (status != Success || data == NULL || type != XA_WINDOW || - *((Window*)data) != proxy_window) { - proxy_window = None; - } else { - if (status == Success) { - XFree(data); - } - - data = NULL; - status = XGetWindowProperty(dpy, proxy_window, - XA_XdndAware, 0, 1, False, - AnyPropertyType, &type, - &format, &nitems, &after, - &data); - - if (status != Success || data == NULL || type != XA_ATOM) { - proxy_window = None; - } - } - } - } - - XFree(data); - } - - if (proxy_window == None) { - proxy_window = client_window; - } - } - - if (is_receiver) { - target_window = client_window; - target_proxy_window = proxy_window; - target_protocol = protocol; - target_protocol_version = protocol_version; - } else { - target_window = None; - target_proxy_window = None; - target_protocol = NO_PROTOCOL; - target_protocol_version = 0; - } - - target_action = java_awt_dnd_DnDConstants_ACTION_NONE; - - if (target_window != None) { - target_enter_server_time = time; - } else { - target_enter_server_time = CurrentTime; - } - - target_root_subwindow = subwindow; -} - -static void -update_target_window(XMotionEvent* event) { - Display* dpy = event->display; - int x = event->x_root; - int y = event->x_root; - Time time = event->time; - Window subwindow = event->subwindow; - - /* - * If this event had occurred before the pointer was grabbed, - * query the server for the current root subwindow. - */ - if (event->window != event->root) { - int xw, yw, xr, yr; - unsigned int modifiers; - XQueryPointer(dpy, event->root, &event->root, &subwindow, - &xr, &yr, &xw, &yw, &modifiers); - } - - if (target_root_subwindow != subwindow) { - if (target_window != None) { - send_leave(dpy, time); - - /* - * Neither Motif DnD nor XDnD provide a mean for the target - * to notify the source that the pointer exits the drop site - * that occupies the whole top level. - * We detect this situation and post dragExit. - */ - if (target_action != java_awt_dnd_DnDConstants_ACTION_NONE) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - ds_postDragSourceEvent(env, x, y); - } - } - - /* Update the global state. */ - do_update_target_window(dpy, subwindow, time); - - if (target_window != None) { - send_enter(dpy, time); - } - } -} - -/* - * Updates the source action based on the specified event state. - * Returns True if source action changed, False otherwise. - */ -static Boolean -update_source_action(unsigned int state) { - JNIEnv* env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - jint action = ds_convertModifiersToDropAction(env, state); - if (source_action == action) { - return False; - } - source_action = action; - return True; -} - -static void -handle_mouse_move(XMotionEvent* event) { - if (!drag_in_progress) { - return; - } - - if (x_root != event->x_root || y_root != event->y_root) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - ds_postDragSourceDragEvent(env, target_action, event->state, - event->x_root, event->y_root, - sun_awt_dnd_SunDragSourceContextPeer_DISPATCH_MOUSE_MOVED); - - x_root = event->x_root; - y_root = event->y_root; - } - - if (event_state != event->state) { - if (update_source_action(event->state) && target_window != None) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - ds_postDragSourceDragEvent(env, target_action, event->state, - event->x_root, event->y_root, - sun_awt_dnd_SunDragSourceContextPeer_DISPATCH_CHANGED); - } - event_state = event->state; - } - - update_target_window(event); - - if (target_window != None) { - send_move(event); - } -} - -static Boolean -handle_xdnd_status(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - long* event_data = event->data.l; - Window target_win = None; - jint action = java_awt_dnd_DnDConstants_ACTION_NONE; - - DTRACE_PRINTLN4("%s:%d XdndStatus target_window=%ld target_protocol=%d.", - __FILE__, __LINE__, target_window, target_protocol); - - if (target_protocol != XDND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d XdndStatus rejected - invalid state.", - __FILE__, __LINE__); - return True; - } - - target_win = event_data[0]; - - /* Ignore XDnD messages from all other windows. */ - if (target_window != target_win) { - DTRACE_PRINTLN4("%s:%d XdndStatus rejected - invalid target window cur=%ld this=%ld.", - __FILE__, __LINE__, target_window, target_win); - return True; - } - - if (event_data[1] & XDND_ACCEPT_DROP_FLAG) { - /* This feature is new in XDnD version 2, but we can use it as XDnD - compliance only requires supporting version 3 and up. */ - action = xdnd_to_java_action(event_data[4]); - } - - if (action == java_awt_dnd_DnDConstants_ACTION_NONE && - target_action != java_awt_dnd_DnDConstants_ACTION_NONE) { - ds_postDragSourceEvent(env, x_root, y_root); - } else if (action != java_awt_dnd_DnDConstants_ACTION_NONE) { - jint type = 0; - - if (target_action == java_awt_dnd_DnDConstants_ACTION_NONE) { - type = sun_awt_dnd_SunDragSourceContextPeer_DISPATCH_ENTER; - } else { - type = sun_awt_dnd_SunDragSourceContextPeer_DISPATCH_MOTION; - } - - ds_postDragSourceDragEvent(env, action, event_state, - x_root, y_root, type); - } - - target_action = action; - - return True; -} - -static Boolean -handle_xdnd_finished(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - long* event_data = event->data.l; - Window target_win = None; - jboolean success = JNI_TRUE; - jint action = java_awt_dnd_DnDConstants_ACTION_NONE; - - if (target_protocol != XDND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d XdndStatus rejected - invalid state.", - __FILE__, __LINE__); - return True; - } - - target_win = event_data[0]; - - /* Ignore XDnD messages from all other windows. */ - if (target_window != target_win) { - DTRACE_PRINTLN4("%s:%d XdndStatus rejected - invalid target window cur=%ld this=%ld.", - __FILE__, __LINE__, target_window, target_win); - return True; - } - - if (target_protocol_version >= 5) { - success = (event_data[1] & XDND_ACCEPT_DROP_FLAG) != 0 ? - JNI_TRUE : JNI_FALSE; - action = xdnd_to_java_action(event_data[2]); - } else { - /* Assume that the drop was successful and the performed drop action is - the drop action accepted with the latest XdndStatus message. */ - success = JNI_TRUE; - action = target_action; - } - - ds_postDragSourceDropEvent(env, success, action, x_root, y_root); - - dnd_in_progress = False; - - XSelectInput(event->display, target_win, target_window_mask); - - cleanup_drag(event->display, CurrentTime); - - return True; -} - -static Boolean -handle_motif_client_message(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - int reason = (int)(event->data.b[0] & MOTIF_MESSAGE_REASON_MASK); - int origin = (int)(event->data.b[0] & MOTIF_MESSAGE_SENDER_MASK); - unsigned char byte_order = event->data.b[1]; - jint action = java_awt_dnd_DnDConstants_ACTION_NONE; - Time time = CurrentTime; - int x = 0, y = 0; - - /* Only receiver messages should be handled. */ - if (origin != MOTIF_MESSAGE_FROM_RECEIVER) { - return False; - } - - if (target_protocol != MOTIF_DND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d _MOTIF_DRAG_AND_DROP_MESSAGE rejected - invalid state.", - __FILE__, __LINE__); - return True; - } - - switch (reason) { - case DROP_SITE_ENTER: - case DROP_SITE_LEAVE: - case DRAG_MOTION: - case OPERATION_CHANGED: - break; - default: - return False; - } - - time = read_card32(event->data.b, 4, byte_order); - - /* Discard events from the previous receiver. */ - if (target_enter_server_time == CurrentTime || - time < target_enter_server_time) { - DTRACE_PRINTLN2("%s:%d _MOTIF_DRAG_AND_DROP_MESSAGE rejected - invalid time.", - __FILE__, __LINE__); - return True; - } - - if (reason != DROP_SITE_LEAVE) { - CARD16 flags = read_card16(event->data.b, 2, byte_order); - unsigned char status = (flags & MOTIF_DND_STATUS_MASK) >> - MOTIF_DND_STATUS_SHIFT; - unsigned char motif_action = (flags & MOTIF_DND_ACTION_MASK) >> - MOTIF_DND_ACTION_SHIFT; - - if (status == MOTIF_VALID_DROP_SITE) { - action = motif_to_java_actions(motif_action); - } else { - action = java_awt_dnd_DnDConstants_ACTION_NONE; - } - - x = read_card16(event->data.b, 8, byte_order); - y = read_card16(event->data.b, 10, byte_order); - } - - /* - * We should derive the type of java event to post not from the message - * reason, but from the combination of the current and previous target - * actions: - * Even if the reason is DROP_SITE_LEAVE we shouldn't post dragExit - * if the drag was rejected earlier. - * Even if the reason is DROP_SITE_ENTER we shouldn't post dragEnter - * if the drag is not accepted. - */ - if (target_action != java_awt_dnd_DnDConstants_ACTION_NONE && - action == java_awt_dnd_DnDConstants_ACTION_NONE) { - - ds_postDragSourceEvent(env, x, y); - } else if (action != java_awt_dnd_DnDConstants_ACTION_NONE) { - jint type = 0; - - if (target_action == java_awt_dnd_DnDConstants_ACTION_NONE) { - type = sun_awt_dnd_SunDragSourceContextPeer_DISPATCH_ENTER; - } else { - type = sun_awt_dnd_SunDragSourceContextPeer_DISPATCH_MOTION; - } - - ds_postDragSourceDragEvent(env, action, event_state, x, y, type); - } - - target_action = action; - - return True; -} - -/* - * Handles client messages. - * Returns True if the event is processed, False otherwise. - */ -static Boolean -handle_client_message(XClientMessageEvent* event) { - if (event->message_type == XA_XdndStatus) { - return handle_xdnd_status(event); - } else if (event->message_type == XA_XdndFinished) { - return handle_xdnd_finished(event); - } else if (event->message_type == _XA_MOTIF_DRAG_AND_DROP_MESSAGE) { - return handle_motif_client_message(event); - } - return False; -} - -/* - * Similar to XtLastTimestampProcessed(). We cannot use Xt time stamp, as it is - * updated in XtDispatchEvent that may not be called if a java event is - * consumed. This can make Xt time stamp out-of-date and cause XGrab* failures - * with GrabInvalidTime reason. - */ -static Time -get_latest_time_stamp() { - return latest_time_stamp; -} - -static void -update_latest_time_stamp(XEvent* event) { - Time time = latest_time_stamp; - - switch (event->type) { - case KeyPress: - case KeyRelease: time = event->xkey.time; break; - case ButtonPress: - case ButtonRelease: time = event->xbutton.time; break; - case MotionNotify: time = event->xmotion.time; break; - case EnterNotify: - case LeaveNotify: time = event->xcrossing.time; break; - case PropertyNotify: time = event->xproperty.time; break; - case SelectionClear: time = event->xselectionclear.time; break; - } - - latest_time_stamp = time; -} - -Boolean -awt_dnd_ds_process_event(XEvent* event) { - Display* dpy = event->xany.display; - - update_latest_time_stamp(event); - - if (process_proxy_mode_event(event)) { - return True; - } - - if (!dnd_in_progress) { - return False; - } - - /* Process drag and drop messages. */ - switch (event->type) { - case ClientMessage: - return handle_client_message(&event->xclient); - case DestroyNotify: - /* Target crashed during drop processing - cleanup. */ - if (!drag_in_progress && - event->xdestroywindow.window == target_window) { - cleanup_drag(dpy, CurrentTime); - return True; - } - /* Pass along */ - return False; - } - - if (!drag_in_progress) { - return False; - } - - /* Process drag-only messages. */ - switch (event->type) { - case KeyRelease: - case KeyPress: { - KeySym keysym = XKeycodeToKeysym(dpy, event->xkey.keycode, 0); - switch (keysym) { - case XK_Escape: { - if (keysym == XK_Escape) { - remove_dnd_grab(dpy, event->xkey.time); - cleanup_drag(dpy, event->xkey.time); - } - break; - } - case XK_Control_R: - case XK_Control_L: - case XK_Shift_R: - case XK_Shift_L: { - Window subwindow; - int xw, yw, xr, yr; - unsigned int modifiers; - XQueryPointer(event->xkey.display, event->xkey.root, &event->xkey.root, &subwindow, - &xr, &yr, &xw, &yw, &modifiers); - event->xkey.state = modifiers; - //It's safe to use key event as motion event since we use only their common fields. - handle_mouse_move(&event->xmotion); - break; - } - } - return True; - } - case ButtonPress: - return True; - case MotionNotify: - handle_mouse_move(&event->xmotion); - return True; - case ButtonRelease: - /* - * On some X servers it could happen that ButtonRelease coordinates - * differ from the latest MotionNotify coordinates, so we need to - * process it as a mouse motion. - * MotionNotify differs from ButtonRelease only in is_hint member, but - * we never use it, so it is safe to cast to MotionNotify. - */ - handle_mouse_move(&event->xmotion); - if (event->xbutton.button == Button1 || event->xbutton.button == Button2) { - // drag is initiated with Button1 or Button2 pressed and - // ended on release of either of these buttons (as the same - // behavior was with our old Motif DnD-based implementation) - remove_dnd_grab(dpy, event->xbutton.time); - drag_in_progress = False; - if (target_window != None && target_action != java_awt_dnd_DnDConstants_ACTION_NONE) { - /* - * ACTION_NONE indicates that either the drop target rejects the - * drop or it haven't responded yet. The latter could happen in - * case of fast drag, slow target-server connection or slow - * drag notifications processing on the target side. - */ - process_drop(&event->xbutton); - } else { - cleanup_drag(dpy, event->xbutton.time); - } - } - return True; - default: - return False; - } -} - -static Boolean -motif_convert_proc(Widget w, Atom* selection, Atom* target, Atom* type, - XtPointer* value, unsigned long* length, int32_t* format) { - - if (*target == XA_XmTRANSFER_SUCCESS || - *target == XA_XmTRANSFER_FAILURE) { - - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - jboolean success = - (*target == XA_XmTRANSFER_SUCCESS) ? JNI_TRUE : JNI_FALSE; - - ds_postDragSourceDropEvent(env, success, target_action, - x_root, y_root); - - dnd_in_progress = False; - - XSelectInput(XtDisplay(w), target_window, target_window_mask); - - cleanup_drag(XtDisplay(w), CurrentTime); - - *type = *target; - *length = 0; - *format = 32; - *value = NULL; - - return True; - } else { - return awt_convertData(w, selection, target, type, value, length, - format); - } -} - -static Boolean -set_convert_data_context(JNIEnv* env, Display* dpy, XID xid, jobject component, - jobject transferable, jobject formatMap, - jlongArray formats) { - awt_convertDataCallbackStruct* structPtr = NULL; - - if (XFindContext(awt_display, xid, awt_convertDataContext, - (XPointer*)&structPtr) == XCNOMEM || structPtr != NULL) { - return False; - } - - structPtr = calloc(1, sizeof(awt_convertDataCallbackStruct)); - if (structPtr == NULL) { - return False; - } - - structPtr->source = (*env)->NewGlobalRef(env, component); - structPtr->transferable = (*env)->NewGlobalRef(env, transferable); - structPtr->formatMap = (*env)->NewGlobalRef(env, formatMap); - structPtr->formats = (*env)->NewGlobalRef(env, formats); - - if (JNU_IsNull(env, structPtr->source) || - JNU_IsNull(env, structPtr->transferable) || - JNU_IsNull(env, structPtr->formatMap) || - JNU_IsNull(env, structPtr->formats)) { - - if (!JNU_IsNull(env, structPtr->source)) { - (*env)->DeleteGlobalRef(env, structPtr->source); - } - if (!JNU_IsNull(env, structPtr->transferable)) { - (*env)->DeleteGlobalRef(env, structPtr->transferable); - } - if (!JNU_IsNull(env, structPtr->formatMap)) { - (*env)->DeleteGlobalRef(env, structPtr->formatMap); - } - if (!JNU_IsNull(env, structPtr->formats)) { - (*env)->DeleteGlobalRef(env, structPtr->formats); - } - free(structPtr); - return False; - } - - if (XSaveContext(dpy, xid, awt_convertDataContext, - (XPointer)structPtr) == XCNOMEM) { - free(structPtr); - return False; - } - - return True; -} - -/* - * Convenience routine. Constructs an appropriate exception message based on the - * specified prefix and the return code of XGrab* function and throws an - * InvalidDnDOperationException with the constructed message. - */ -static void -throw_grab_failure_exception(JNIEnv* env, int ret_code, char* msg_prefix) { - char msg[200]; - char* msg_cause = ""; - - switch (ret_code) { - case GrabNotViewable: msg_cause = "not viewable"; break; - case AlreadyGrabbed: msg_cause = "already grabbed"; break; - case GrabInvalidTime: msg_cause = "invalid time"; break; - case GrabFrozen: msg_cause = "grab frozen"; break; - default: msg_cause = "unknown failure"; break; - } - - sprintf(msg, "%s: %s.", msg_prefix, msg_cause); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - msg); -} - -/* - * Sets the proxy mode source window - the source window which the drag - * notifications from an XEmbed client should be forwarded to. - * If the window is not None and there is a drag operation in progress, - * throws InvalidDnDOperationException and doesn't change - * proxy_mode_source_window. - * The caller mush hold AWT_LOCK. - */ -void -set_proxy_mode_source_window(Window window) { - if (window != None && dnd_in_progress) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Drag and drop is already in progress."); - return; - } - - proxy_mode_source_window = window; -} - -/* - * Checks if the event is a drag notification from an XEmbed client. - * If it is, forwards this event back to the current source and returns True. - * Otherwise, returns False. - * Currently only XDnD protocol notifications are recognized. - * The caller must hold AWT_LOCK. - */ -static Boolean -process_proxy_mode_event(XEvent* event) { - if (proxy_mode_source_window == None) { - return False; - } - - if (event->type == ClientMessage) { - XClientMessageEvent* xclient = &event->xclient; - if (xclient->message_type == XA_XdndStatus || - xclient->message_type == XA_XdndFinished) { - Window source = proxy_mode_source_window; - - xclient->data.l[0] = xclient->window; - xclient->window = source; - - XSendEvent(xclient->display, source, False, NoEventMask, - (XEvent*)xclient); - - if (xclient->message_type == XA_XdndFinished) { - proxy_mode_source_window = None; - } - - return True; - } - } - - return False; -} - -/* - * Class: sun_awt_motif_X11DragSourceContextPeer - * Method: startDrag - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_X11DragSourceContextPeer_startDrag(JNIEnv *env, - jobject this, - jobject component, - jobject wpeer, - jobject transferable, - jobject trigger, - jobject cursor, - jint ctype, - jint actions, - jlongArray formats, - jobject formatMap) { - Time time_stamp = CurrentTime; - Cursor xcursor = None; - Window root_window = None; - Atom* targets = NULL; - jsize num_targets = 0; - - AWT_LOCK(); - - if (dnd_in_progress) { - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Drag and drop is already in progress."); - AWT_UNLOCK(); - return; - } - - if (proxy_mode_source_window != None) { - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Proxy drag is in progress."); - AWT_UNLOCK(); - return; - } - - if (!awt_dnd_init(awt_display)) { - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "DnD subsystem initialization failed."); - AWT_UNLOCK(); - return; - } - - if (!JNU_IsNull(env, cursor)) { - xcursor = getCursor(env, cursor); - - if (xcursor == None) { - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Invalid drag cursor"); - AWT_UNLOCK(); - } - } - - /* Determine the root window for the drag operation. */ - { - struct FrameData* wdata = (struct FrameData*) - JNU_GetLongFieldAsPtr(env, wpeer, mComponentPeerIDs.pData); - - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "Null component data"); - AWT_UNLOCK(); - return; - } - - if (wdata->winData.shell == NULL) { - JNU_ThrowNullPointerException(env, "Null shell widget"); - AWT_UNLOCK(); - return; - } - - root_window = RootWindowOfScreen(XtScreen(wdata->winData.shell)); - - if (root_window == None) { - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot get the root window for the drag operation."); - AWT_UNLOCK(); - return; - } - } - - time_stamp = get_latest_time_stamp(); - - /* Extract the targets from java array. */ - { - targets = NULL; - num_targets = (*env)->GetArrayLength(env, formats); - - /* - * In debug build GetLongArrayElements aborts with assertion on an empty - * array. - */ - if (num_targets > 0) { - jboolean isCopy = JNI_TRUE; - jlong* java_targets = (*env)->GetLongArrayElements(env, formats, - &isCopy); - - if ((*env)->ExceptionCheck(env) == JNI_TRUE) { - AWT_UNLOCK(); - return; - } - - if (java_targets != NULL) { - targets = (Atom*)malloc(num_targets * sizeof(Atom)); - if (targets != NULL) { -#ifdef _LP64 - memcpy(targets, java_targets, num_targets * sizeof(Atom)); -#else - jsize i; - - for (i = 0; i < num_targets; i++) { - targets[i] = (Atom)java_targets[i]; - } -#endif - } - (*env)->ReleaseLongArrayElements(env, formats, java_targets, - JNI_ABORT); - } - } - if (targets == NULL) { - num_targets = 0; - } - } - - /* Write the XDnD initiator info on the awt_root_shell. */ - { - unsigned char ret; - Atom action_atoms[3]; - unsigned int action_count = 0; - - if (actions & java_awt_dnd_DnDConstants_ACTION_COPY) { - action_atoms[action_count] = XA_XdndActionCopy; - action_count++; - } - if (actions & java_awt_dnd_DnDConstants_ACTION_MOVE) { - action_atoms[action_count] = XA_XdndActionMove; - action_count++; - } - if (actions & java_awt_dnd_DnDConstants_ACTION_LINK) { - action_atoms[action_count] = XA_XdndActionLink; - action_count++; - } - - ret = checked_XChangeProperty(awt_display, awt_dnd_ds_get_source_window(), - XA_XdndActionList, XA_ATOM, 32, - PropModeReplace, (unsigned char*)action_atoms, - action_count * sizeof(Atom)); - - if (ret != Success) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot write XdndActionList property"); - AWT_UNLOCK(); - return; - } - - ret = checked_XChangeProperty(awt_display, awt_dnd_ds_get_source_window(), - XA_XdndTypeList, XA_ATOM, 32, - PropModeReplace, (unsigned char*)targets, - num_targets); - - if (ret != Success) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot write XdndTypeList property"); - AWT_UNLOCK(); - return; - } - } - - /* Write the Motif DnD initiator info on the awt_root_shell. */ - { - InitiatorInfo info; - unsigned char ret; - int target_list_index = - get_index_for_target_list(awt_display, targets, num_targets); - - if (target_list_index == -1) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot determine the target list index."); - AWT_UNLOCK(); - return; - } - - info.byte_order = MOTIF_BYTE_ORDER; - info.protocol_version = MOTIF_DND_PROTOCOL_VERSION; - info.index = target_list_index; - info.selection_atom = _XA_MOTIF_ATOM_0; - - ret = checked_XChangeProperty(awt_display, awt_dnd_ds_get_source_window(), - _XA_MOTIF_ATOM_0, - _XA_MOTIF_DRAG_INITIATOR_INFO, 8, - PropModeReplace, (unsigned char*)&info, - sizeof(InitiatorInfo)); - - if (ret != Success) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot write the Motif DnD initiator info"); - AWT_UNLOCK(); - return; - } - } - - /* Acquire XDnD selection ownership. */ - if (XtOwnSelection(awt_root_shell, XA_XdndSelection, time_stamp, - awt_convertData, NULL, NULL) != True) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot acquire XdndSelection ownership."); - AWT_UNLOCK(); - return; - } - - /* Acquire Motif DnD selection ownership. */ - if (XtOwnSelection(awt_root_shell, _XA_MOTIF_ATOM_0, time_stamp, - motif_convert_proc, NULL, NULL) != True) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot acquire Motif DnD selection ownership."); - AWT_UNLOCK(); - return; - } - - /* - * Store the information needed to convert data for both selections - * in awt_convertDataContext. - */ - { - if (!set_convert_data_context(env, awt_display, XA_XdndSelection, - component, transferable, formatMap, - formats)) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot save context for XDnD selection data conversion."); - AWT_UNLOCK(); - return; - } - - if (!set_convert_data_context(env, awt_display, _XA_MOTIF_ATOM_0, - component, transferable, formatMap, - formats)) { - cleanup_drag(awt_display, time_stamp); - JNU_ThrowByName(env, "java/awt/dnd/InvalidDnDOperationException", - "Cannot save context for Motif DnD selection data conversion."); - AWT_UNLOCK(); - return; - } - } - - /* Install X grabs. */ - { - XWindowAttributes xwa; - int ret; - - XGetWindowAttributes(awt_display, root_window, &xwa); - - your_root_event_mask = xwa.your_event_mask; - - XSelectInput(awt_display, root_window, - your_root_event_mask | ROOT_EVENT_MASK); - - ret = XGrabPointer(awt_display, - root_window, - False, - GRAB_EVENT_MASK, - GrabModeAsync, - GrabModeAsync, - None, - xcursor, - time_stamp); - - if (ret != GrabSuccess) { - cleanup_drag(awt_display, time_stamp); - throw_grab_failure_exception(env, ret, "Cannot grab pointer"); - AWT_UNLOCK(); - return; - } - - ret = XGrabKeyboard(awt_display, - root_window, - False, - GrabModeAsync, - GrabModeAsync, - time_stamp); - - if (ret != GrabSuccess) { - cleanup_drag(awt_display, time_stamp); - throw_grab_failure_exception(env, ret, "Cannot grab keyboard"); - AWT_UNLOCK(); - return; - } - } - - /* Update the global state. */ - source_peer = (*env)->NewGlobalRef(env, this); - dnd_in_progress = True; - drag_in_progress = True; - data_types = targets; - data_types_count = num_targets; - source_actions = actions; - drag_root_window = root_window; - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_X11DragSourceContextPeer - * Method: setNativeCursor - * Signature: ()V - */ -JNIEXPORT void JNICALL -Java_sun_awt_motif_X11DragSourceContextPeer_setNativeCursor(JNIEnv *env, - jobject this, - jlong nativeCtxt, - jobject cursor, - jint type) { - if (JNU_IsNull(env, cursor)) { - return; - } - - XChangeActivePointerGrab(awt_display, - GRAB_EVENT_MASK, - getCursor(env, cursor), - CurrentTime); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_dnd_dt.c --- a/jdk/src/solaris/native/sun/awt/awt_dnd_dt.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3700 +0,0 @@ -/* - * Copyright 2003-2006 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_dnd.h" - -#include "jlong.h" - -#include "awt_DataTransferer.h" -#include "awt_MToolkit.h" - -#include "java_awt_dnd_DnDConstants.h" -#include "java_awt_event_MouseEvent.h" - -#include "sun_awt_motif_MComponentPeer.h" -#include "awt_xembed.h" - -#define DT_INITIAL_STATE 0 -#define DT_ENTERED_STATE 1 -#define DT_OVER_STATE 2 - -extern struct ComponentIDs componentIDs; -extern struct MComponentPeerIDs mComponentPeerIDs; - -/**************************** XEmbed server DnD support ***********************/ -extern void -set_xembed_drop_target(JNIEnv* env, jobject server); -extern void -remove_xembed_drop_target(JNIEnv* env, jobject server); -extern Boolean -is_xembed_client(Window window); - -DECLARE_JAVA_CLASS(MEmbedCanvasPeerClass, "sun/awt/motif/MEmbedCanvasPeer"); -/******************************************************************************/ - -typedef enum { - EventSuccess, /* Event is successfully processed. */ - EventFailure /* Failed to process the event. */ -} EventStatus; - -typedef enum { - EnterEvent, /* XdndEnter, TOP_LEVEL_ENTER */ - MotionEvent, /* XdndPosition, DRAG_MOTION, OPERATION_CHANGED */ - LeaveEvent, /* XdndLeave, TOP_LEVEL_LEAVE */ - DropEvent, /* XdndDrop, DROP_START */ - UnknownEvent -} EventType; - -static Protocol source_protocol = NO_PROTOCOL; -static unsigned int source_protocol_version = 0; -static Window source_window = None; -static Atom source_atom = None; -static long source_window_mask = None; -static jint source_actions = java_awt_dnd_DnDConstants_ACTION_NONE; -/* - * According to XDnD protocol, XdndActionList is optional. - * In case if XdndActionList is not set on the source, the list of drop actions - * supported by the source is constructed as follows: - * - "copy" is always included; - * - "move" is included if at least one XdndPosition message received - * after the latest XdndEnter passed XdndActionMove in data.l[4]; - * - "link" is included if at least one XdndPosition message received - * after the latest XdndEnter passed XdndActionLink in data.l[4]. - * We use a boolean flag to signal that we are building the list of drop actions - * supported by the source. - */ -static Boolean track_source_actions = False; -static jint user_action = java_awt_dnd_DnDConstants_ACTION_NONE; -static jlongArray source_data_types = NULL; -static Atom* source_data_types_native = NULL; -static unsigned int source_data_types_count = 0; -static int source_x = 0; -static int source_y = 0; -static jobject target_component = NULL; -/* - * The Motif DnD protocol prescribes that DROP_START message should always be - * preceeded with TOP_LEVEL_LEAVE message. We need to cleanup on TOP_LEVEL_LEAVE - * message, but DROP_START wouldn't be processed properly. - * To resolve this issue we postpone cleanup using a boolean flag this flag is - * set when we receive the TOP_LEVEL_LEAVE message and cleared when the next - * client message arrives if that message is not DROP_START. If that message is - * a DROP_START message, the flag is cleared after the DROP_START is processed. - */ -static Boolean motif_top_level_leave_postponed = False; -/* - * We store a postponed TOP_LEVEL_LEAVE message here. - */ -static XClientMessageEvent motif_top_level_leave_postponed_event; - -/* Forward declarations */ -static Window get_root_for_window(Window window); -static Window get_outer_canvas_for_window(Window window); -static Boolean register_drop_site(Widget outer_canvas, XtPointer componentRef); -static Boolean is_xdnd_drag_message_type(unsigned long message_type); -static Boolean register_xdnd_drop_site(Display* dpy, Window toplevel, - Window window); - -/**************************** JNI stuff ***************************************/ - -DECLARE_JAVA_CLASS(dtcp_clazz, "sun/awt/motif/X11DropTargetContextPeer") - -static void -dt_postDropTargetEvent(JNIEnv* env, jobject component, int x, int y, - jint dropAction, jint event_id, - XClientMessageEvent* event) { - DECLARE_STATIC_VOID_JAVA_METHOD(dtcp_postDropTargetEventToPeer, dtcp_clazz, - "postDropTargetEventToPeer", - "(Ljava/awt/Component;IIII[JJI)V"); - - { - void* copy = NULL; - - if (event != NULL) { - /* - * For XDnD messages we append the information from the latest - * XdndEnter to the context. It is done to be able to reconstruct - * XdndEnter for an XEmbed client. - */ - Boolean isXDnDMessage = - is_xdnd_drag_message_type(event->message_type); - - if (isXDnDMessage) { - copy = malloc(sizeof(XClientMessageEvent) + - 4 * sizeof(long)); - } else { - copy = malloc(sizeof(XClientMessageEvent)); - } - - if (copy == NULL) { - DTRACE_PRINTLN2("%s:%d malloc failed.", __FILE__, __LINE__); - return; - } - - memcpy(copy, event, sizeof(XClientMessageEvent)); - - if (isXDnDMessage) { - size_t msgSize = sizeof(XClientMessageEvent); - long data1 = source_protocol_version << XDND_PROTOCOL_SHIFT; - long * appended_data; - if (source_data_types_native != NULL && - source_data_types_count > 3) { - - data1 |= XDND_DATA_TYPES_BIT; - } - - appended_data = (long*)((char*)copy + msgSize); - appended_data[0] = data1; - appended_data[1] = source_data_types_count > 0 ? - source_data_types_native[0] : 0; - appended_data[2] = source_data_types_count > 1 ? - source_data_types_native[1] : 0; - appended_data[3] = source_data_types_count > 2 ? - source_data_types_native[2] : 0; - } - } - - DASSERT(!JNU_IsNull(env, component)); - - (*env)->CallStaticVoidMethod(env, clazz, dtcp_postDropTargetEventToPeer, - component, x, y, dropAction, - source_actions, source_data_types, - ptr_to_jlong(copy), event_id); - } -} - -/******************************************************************************/ - -/********************* Embedded drop site list support ************************/ - -struct EmbeddedDropSiteListEntryRec; - -typedef struct EmbeddedDropSiteListEntryRec EmbeddedDropSiteListEntry; - -struct EmbeddedDropSiteListEntryRec { - Window toplevel; - Window root; - /* - * We select for PropertyNotify events on the toplevel, so we need to - * restore the event mask when we are done with this toplevel. - */ - long event_mask; - unsigned int embedded_sites_count; - Window* embedded_sites; - EmbeddedDropSiteListEntry* next; -}; - -static EmbeddedDropSiteListEntry* embedded_drop_site_list = NULL; - -struct EmbeddedDropSiteProtocolListEntryRec; - -typedef struct EmbeddedDropSiteProtocolListEntryRec EmbeddedDropSiteProtocolListEntry; - -struct EmbeddedDropSiteProtocolListEntryRec { - Window window; - Window proxy; - /* - * We override the XdndAware property on the toplevel, so we should keep its - * original contents - the XDnD protocol version supported by the browser. - * This is needed to adjust XDnD messages forwarded to the browser. - */ - unsigned int protocol_version; - /* True if the toplevel was already registered as a drag receiver and - we just changed the proxy. False, otherwise */ - Boolean overriden; - EmbeddedDropSiteProtocolListEntry* next; -}; - -static EmbeddedDropSiteProtocolListEntry* embedded_motif_protocol_list = NULL; -static EmbeddedDropSiteProtocolListEntry* embedded_xdnd_protocol_list = NULL; - -typedef enum { - RegFailure, /* Proxy registration failed */ - RegSuccess, /* The new drop site is registered with the new proxy */ - RegOverride, /* The new proxy is set for the existing drop site */ - RegAlreadyRegistered /* This proxy is already set for this drop site */ -} ProxyRegistrationStatus; - -/* Forward declarations. */ -static EmbeddedDropSiteProtocolListEntry* -get_xdnd_protocol_entry_for_toplevel(Window toplevel); -static EmbeddedDropSiteProtocolListEntry* -get_motif_protocol_entry_for_toplevel(Window toplevel); -static void remove_xdnd_protocol_entry_for_toplevel(Window toplevel); -static void remove_motif_protocol_entry_for_toplevel(Window toplevel); - -/* - * Registers the toplevel as a Motif drag receiver if it is not registered yet, - * sets the specified new_proxy for it and returns the previous proxy in old_proxy. - * Does nothing if the new_proxy is already set as a proxy for this toplevel. - * Returns the completion status. - */ -static ProxyRegistrationStatus -set_motif_proxy(Display* dpy, Window toplevel, Window new_proxy, Window *old_proxy) { - Boolean override = False; - - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char* data; - unsigned char ret; - - DASSERT(old_proxy != NULL); - - *old_proxy = None; - - data = NULL; - ret = checked_XGetWindowProperty(dpy, toplevel, - _XA_MOTIF_DRAG_RECEIVER_INFO, 0, 0xFFFF, - False, AnyPropertyType, &type, &format, - &nitems, &after, &data); - - /* Check if toplevel is a valid window. */ - if (ret != Success) { - return RegFailure; - } - - if (ret == Success && data != NULL && type != None && format == 8 - && nitems >= MOTIF_RECEIVER_INFO_SIZE) { - unsigned char byte_order = read_card8((char*)data, 0); - void* p = (char*)data + 4; - - /* Browser and plugin have different byte orders - report failure for now. */ - if (MOTIF_BYTE_ORDER != byte_order) { - XFree(data); - return RegFailure; - } - - *old_proxy = read_card32((char*)data, 4, byte_order); - - /* If the proxy is already set to the specified window - return. */ - if (*old_proxy == new_proxy) { - XFree(data); - return RegAlreadyRegistered; - } - - /* replace the proxy window */ - write_card32(&p, new_proxy); - - override = True; - } else { - void* p; - - if (ret == Success) { - XFree(data); - data = NULL; - } - - data = malloc(MOTIF_RECEIVER_INFO_SIZE); - - if (data == NULL) { - DTRACE_PRINTLN2("%s:%d malloc failed.", __FILE__, __LINE__); - return RegFailure; - } - - p = data; - - write_card8(&p, MOTIF_BYTE_ORDER); - write_card8(&p, MOTIF_DND_PROTOCOL_VERSION); /* protocol version */ - write_card8(&p, MOTIF_DYNAMIC_STYLE); /* protocol style */ - write_card8(&p, 0); /* pad */ - write_card32(&p, new_proxy); /* proxy window */ - write_card16(&p, 0); /* num_drop_sites */ - write_card16(&p, 0); /* pad */ - write_card32(&p, MOTIF_RECEIVER_INFO_SIZE); - } - - ret = checked_XChangeProperty(dpy, toplevel, - _XA_MOTIF_DRAG_RECEIVER_INFO, - _XA_MOTIF_DRAG_RECEIVER_INFO, 8, - PropModeReplace, (unsigned char*)data, - MOTIF_RECEIVER_INFO_SIZE); - - if (data != NULL) { - XFree(data); - data = NULL; - } - - if (ret == Success) { - if (override) { - return RegOverride; - } else { - return RegSuccess; - } - } else { - return RegFailure; - } -} - -/* - * Registers the toplevel as a XDnD drag receiver if it is not registered yet, - * sets the specified new_proxy for it and returns the previous proxy in - * old_proxy and the original XDnD protocol version in old_version. - * Does nothing if the new_proxy is already set as a proxy for this toplevel. - * Returns the completion status. - */ -static ProxyRegistrationStatus -set_xdnd_proxy(Display* dpy, Window toplevel, Window new_proxy, - Window* old_proxy, unsigned int* old_version) { - Atom version_atom = XDND_PROTOCOL_VERSION; - Window xdnd_proxy = None; - Boolean override = False; - - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char* data; - unsigned char ret; - - DASSERT(old_proxy != NULL); - - *old_proxy = None; - - data = NULL; - ret = checked_XGetWindowProperty(dpy, toplevel, XA_XdndAware, 0, 1, - False, AnyPropertyType, &type, &format, - &nitems, &after, &data); - - if (ret != Success) { - return RegFailure; - } - - if (ret == Success && data != NULL && type == XA_ATOM) { - unsigned int protocol_version = *((unsigned int*)data); - - override = True; - *old_version = protocol_version; - - /* XdndProxy is not supported for prior to XDnD version 4 */ - if (protocol_version >= 4) { - int status; - - XFree(data); - - data = NULL; - status = XGetWindowProperty(dpy, toplevel, XA_XdndProxy, 0, 1, - False, XA_WINDOW, &type, &format, - &nitems, &after, &data); - - if (status == Success && data != NULL && type == XA_WINDOW) { - xdnd_proxy = *((Window*)data); - - if (xdnd_proxy != None) { - XFree(data); - - data = NULL; - status = XGetWindowProperty(dpy, xdnd_proxy, XA_XdndProxy, - 0, 1, False, XA_WINDOW, &type, - &format, &nitems, &after, &data); - - if (status != Success || data == NULL || type != XA_WINDOW || - *((Window*)data) != xdnd_proxy) { - /* Ignore invalid proxy. */ - xdnd_proxy = None; - } - } - - if (xdnd_proxy != None) { - XFree(data); - - data = NULL; - status = XGetWindowProperty(dpy, xdnd_proxy, XA_XdndAware, - 0, 1, False, AnyPropertyType, - &type, &format, &nitems, &after, - &data); - - if (status == Success && data != NULL && type == XA_ATOM) { - unsigned int proxy_version = *((unsigned int*)data); - - if (proxy_version != protocol_version) { - /* Ignore invalid proxy. */ - xdnd_proxy = None; - } - } else { - /* Ignore invalid proxy. */ - xdnd_proxy = None; - } - } - } - - *old_proxy = xdnd_proxy; - } - } - - XFree(data); - - /* If the proxy is already set to the specified window - return. */ - if (xdnd_proxy == new_proxy) { - return RegAlreadyRegistered; - } - - /* The proxy window must have the XdndAware set, as XDnD protocol prescribes - to check the proxy window for XdndAware. */ - ret = checked_XChangeProperty(dpy, new_proxy, XA_XdndAware, XA_ATOM, 32, - PropModeReplace, - (unsigned char*)&version_atom, 1); - - if (ret != Success) { - return RegFailure; - } - - /* The proxy window must have the XdndProxy set to point to itself. */ - ret = checked_XChangeProperty(dpy, new_proxy, XA_XdndProxy, XA_WINDOW, 32, - PropModeReplace, - (unsigned char*)&new_proxy, 1); - - if (ret != Success) { - return RegFailure; - } - - ret = checked_XChangeProperty(dpy, toplevel, XA_XdndAware, XA_ATOM, 32, - PropModeReplace, - (unsigned char*)&version_atom, 1); - - if (ret != Success) { - return RegFailure; - } - - ret = checked_XChangeProperty(dpy, toplevel, XA_XdndProxy, XA_WINDOW, 32, - PropModeReplace, - (unsigned char*)&new_proxy, 1); - - if (ret == Success) { - if (override) { - return RegOverride; - } else { - return RegSuccess; - } - } else { - return RegFailure; - } -} - -/* - * 'toplevel' is the browser toplevel window. To register a drop site on the - * plugin window we set the proxy for the browser toplevel window to point to - * the awt_root_shell window. - * - * We assume that only one JVM per browser instance is possible. This - * assumption is true with the current plugin implementation - it creates a - * single JVM for all plugin instances created by the given plugin factory. - * - * When a client message event for the browser toplevel window is received, we - * will iterate over drop sites registered with this toplevel and determine if - * the mouse pointer is currently over one of them (there could be several - * plugin windows in one browser window - for example if an HTML page contains - * frames and several frames contain a plugin object). - * - * If the pointer is not over any of the plugin drop sites the client message - * will be resent to the browser, otherwise it will be processed normally. - */ -static EmbeddedDropSiteListEntry* -awt_dnd_dt_init_proxy(Display* dpy, Window root, Window toplevel, Window window) { - Window awt_root_window = get_awt_root_window(); - Window motif_proxy = None; - Boolean motif_override = False; - unsigned long event_mask = 0; - - if (awt_root_window == None) { - return NULL; - } - - /* Grab server, since we are working with the window that belongs to - another client. REMIND: ungrab when done!!! */ - XGrabServer(dpy); - - { - ProxyRegistrationStatus motif_status = RegFailure; - - motif_status = set_motif_proxy(dpy, toplevel, awt_root_window, &motif_proxy); - - switch (motif_status) { - case RegFailure: - case RegAlreadyRegistered: - XUngrabServer(dpy); - /* Workaround for bug 5039226 */ - XSync(dpy, False); - return NULL; - case RegOverride: - motif_override = True; - break; - case RegSuccess: - motif_override = False; - break; - default: - DASSERT(False); - } - - - } - - { - XWindowAttributes xwa; - XGetWindowAttributes(dpy, toplevel, &xwa); - event_mask = xwa.your_event_mask; - if ((event_mask & PropertyChangeMask) == 0) { - XSelectInput(dpy, toplevel, event_mask | PropertyChangeMask); - } - } - - XUngrabServer(dpy); - /* Workaround for bug 5039226 */ - XSync(dpy, False); - - /* Add protocol specific entries for the toplevel. */ - { - EmbeddedDropSiteProtocolListEntry* motif_entry = NULL; - - motif_entry = malloc(sizeof(EmbeddedDropSiteProtocolListEntry)); - - if (motif_entry == NULL) { - return NULL; - } - - motif_entry->window = toplevel; - motif_entry->proxy = motif_proxy; - motif_entry->protocol_version = 0; - motif_entry->overriden = motif_override; - motif_entry->next = embedded_motif_protocol_list; - embedded_motif_protocol_list = motif_entry; - } - - { - EmbeddedDropSiteListEntry* entry = NULL; - Window* sites = NULL; - - entry = malloc(sizeof(EmbeddedDropSiteListEntry)); - - if (entry == NULL) { - return NULL; - } - - sites = malloc(sizeof(Window)); - - if (sites == NULL) { - free(entry); - return NULL; - } - - sites[0] = window; - - entry->toplevel = toplevel; - entry->root = root; - entry->event_mask = event_mask; - entry->embedded_sites_count = 1; - entry->embedded_sites = sites; - entry->next = NULL; - - return entry; - } -} - -static void -register_xdnd_embedder(Display* dpy, EmbeddedDropSiteListEntry* entry, long window) { - Window awt_root_window = get_awt_root_window(); - Window toplevel = entry->toplevel; - Window xdnd_proxy = None; - unsigned int xdnd_protocol_version = 0; - Boolean xdnd_override = False; - Boolean register_xdnd = True; - Boolean motif_overriden = False; - - EmbeddedDropSiteProtocolListEntry* motif_entry = embedded_motif_protocol_list; - while (motif_entry != NULL) { - if (motif_entry->window == toplevel) { - motif_overriden = motif_entry->overriden; - break; - } - motif_entry = motif_entry->next; - } - - /* - * First check if the window is an XEmbed client. - * In this case we don't have to setup a proxy on the toplevel, - * instead we register the XDnD drop site on the embedded window. - */ - if (isXEmbedActiveByWindow(window)) { - register_xdnd_drop_site(dpy, toplevel, window); - return; - } - - /* - * By default, we register a drop site that supports both dnd - * protocols. This approach is not appropriate in plugin - * scenario if the browser doesn't support XDnD. If we forcibly set - * XdndAware on the browser toplevel, any drag source that supports both - * protocols and prefers XDnD will be unable to drop anything on the - * browser. - * The solution for this problem is not to register XDnD drop site - * if the browser supports only Motif DnD. - */ - if (motif_overriden) { - int status; - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char* data; - - data = NULL; - status = XGetWindowProperty(dpy, toplevel, XA_XdndAware, 0, 1, - False, AnyPropertyType, &type, &format, - &nitems, &after, &data); - - XFree(data); - data = NULL; - - if (type != XA_ATOM) { - register_xdnd = False; - } - } - - if (register_xdnd) { - ProxyRegistrationStatus xdnd_status; - /* Grab server, since we are working with the window that belongs to - another client. REMIND: ungrab when done!!! */ - XGrabServer(dpy); - - xdnd_status = - set_xdnd_proxy(dpy, toplevel, awt_root_window, &xdnd_proxy, - &xdnd_protocol_version); - - XUngrabServer(dpy); - - switch (xdnd_status) { - case RegFailure: - case RegAlreadyRegistered: - return; - case RegOverride: - xdnd_override = True; - break; - case RegSuccess: - xdnd_override = False; - break; - default: - DASSERT(False); - } - - { - EmbeddedDropSiteProtocolListEntry* xdnd_entry = NULL; - - xdnd_entry = malloc(sizeof(EmbeddedDropSiteProtocolListEntry)); - - if (xdnd_entry == NULL) { - return; - } - - xdnd_entry->window = toplevel; - xdnd_entry->proxy = xdnd_proxy; - xdnd_entry->protocol_version = xdnd_protocol_version; - xdnd_entry->overriden = xdnd_override; - xdnd_entry->next = embedded_xdnd_protocol_list; - embedded_xdnd_protocol_list = xdnd_entry; - } - } -} - -/* - * If embedded_drop_site_list already contains an entry with the specified - * 'toplevel', the method registers the specified 'window' as an embedded drop - * site for this 'toplevel' and returns True. - * Otherwise, it checks if the 'toplevel' is a registered drop site for adds - * (window, component) pair to the list and returns True - * if completes successfully. - */ -static Boolean -add_to_embedded_drop_site_list(Display* dpy, Window root, Window toplevel, - Window window) { - EmbeddedDropSiteListEntry* entry = embedded_drop_site_list; - - while (entry != NULL) { - if (entry->toplevel == toplevel) { - void* p = realloc(entry->embedded_sites, - sizeof(Window) * - (entry->embedded_sites_count + 1)); - if (p == NULL) { - return False; - } - entry->embedded_sites = p; - entry->embedded_sites[entry->embedded_sites_count++] = window; - - register_xdnd_embedder(dpy, entry, window); - - return True; - } - entry = entry->next; - } - - entry = awt_dnd_dt_init_proxy(dpy, root, toplevel, window); - - if (entry == NULL) { - return False; - } - - register_xdnd_embedder(dpy, entry, window); - - entry->next = embedded_drop_site_list; - embedded_drop_site_list = entry; - - return True; -} - -/* - * Removes the window from the list of embedded drop sites for the toplevel. - * Returns True if the window was successfully removed, False otherwise. - */ -static Boolean -remove_from_embedded_drop_site_list(Display* dpy, Window toplevel, Window window) { - EmbeddedDropSiteListEntry* entry = embedded_drop_site_list; - EmbeddedDropSiteListEntry* prev = NULL; - - while (entry != NULL) { - if (entry->toplevel == toplevel) { - unsigned int idx; - - for (idx = 0; idx < entry->embedded_sites_count; idx++) { - if (entry->embedded_sites[idx] == window) { - int tail = entry->embedded_sites_count - idx - 1; - if (tail > 0) { - memmove(entry->embedded_sites + idx, - entry->embedded_sites + idx + 1, - tail * sizeof(Window)); - } - entry->embedded_sites_count--; - - /* If the list of embedded drop sites for this toplevel - becomes empty - restore the original proxies and remove - the entry. */ - if (entry->embedded_sites_count == 0) { - Widget w = XtWindowToWidget(dpy, toplevel); - - if (w != NULL) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - Widget copy = w; - jobject peer = findPeer(&w); - - if (!JNU_IsNull(env, peer) && - (*env)->IsInstanceOf(env, peer, - get_MEmbedCanvasPeerClass(env)) == JNI_TRUE) { - remove_xembed_drop_target(env, peer); - } - } else { - EmbeddedDropSiteProtocolListEntry* xdnd_entry = - get_xdnd_protocol_entry_for_toplevel(toplevel); - EmbeddedDropSiteProtocolListEntry* motif_entry = - get_motif_protocol_entry_for_toplevel(toplevel); - - if (xdnd_entry != NULL) { - if (xdnd_entry->overriden == True) { - XChangeProperty(dpy, toplevel, XA_XdndAware, - XA_ATOM, 32, - PropModeReplace, - (unsigned char*)&xdnd_entry->protocol_version, - 1); - - XChangeProperty(dpy, toplevel, XA_XdndProxy, - XA_WINDOW, 32, - PropModeReplace, - (unsigned char*)&xdnd_entry->proxy, 1); - } else { - XDeleteProperty(dpy, toplevel, XA_XdndAware); - XDeleteProperty(dpy, toplevel, XA_XdndProxy); - } - remove_xdnd_protocol_entry_for_toplevel(toplevel); - } - - if (motif_entry != NULL) { - if (motif_entry->overriden == True) { - /* Request status */ - int status; - - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char* data; - - data = NULL; - status = XGetWindowProperty(dpy, toplevel, - _XA_MOTIF_DRAG_RECEIVER_INFO, 0, 0xFFFF, - False, AnyPropertyType, &type, &format, - &nitems, &after, &data); - - if (status == Success && data != NULL && type != None && - format == 8 && nitems >= MOTIF_RECEIVER_INFO_SIZE) { - unsigned char byte_order = read_card8((char*)data, 0); - void* p = (char*)data + 4; - - DASSERT(MOTIF_BYTE_ORDER == byte_order); - - if (MOTIF_BYTE_ORDER == byte_order) { - /* restore the original proxy window */ - write_card32(&p, motif_entry->proxy); - - XChangeProperty(dpy, toplevel, - _XA_MOTIF_DRAG_RECEIVER_INFO, - _XA_MOTIF_DRAG_RECEIVER_INFO, 8, - PropModeReplace, - (unsigned char*)data, - MOTIF_RECEIVER_INFO_SIZE); - } - } - - if (status == Success) { - XFree(data); - } - } else { - XDeleteProperty(dpy, toplevel, _XA_MOTIF_DRAG_RECEIVER_INFO); - } - - remove_motif_protocol_entry_for_toplevel(toplevel); - } - - if ((entry->event_mask & PropertyChangeMask) == 0) { - XSelectInput(dpy, toplevel, entry->event_mask); - } - } - - if (prev == NULL) { - embedded_drop_site_list = entry->next; - } else { - prev->next = entry->next; - } - - free(entry); - } - return True; - } - } - return False; - } - prev = entry; - entry = entry->next; - } - return False; -} - -static EmbeddedDropSiteListEntry* -get_entry_for_toplevel(Window toplevel) { - EmbeddedDropSiteListEntry* entry = embedded_drop_site_list; - - while (entry != NULL) { - if (entry->toplevel == toplevel) { - return entry; - } - entry = entry->next; - } - return NULL; -} - -static EmbeddedDropSiteProtocolListEntry* -get_motif_protocol_entry_for_toplevel(Window toplevel) { - EmbeddedDropSiteProtocolListEntry* entry = embedded_motif_protocol_list; - - while (entry != NULL) { - if (entry->window == toplevel) { - return entry; - } - entry = entry->next; - } - return NULL; -} - -static EmbeddedDropSiteProtocolListEntry* -get_xdnd_protocol_entry_for_toplevel(Window toplevel) { - EmbeddedDropSiteProtocolListEntry* entry = embedded_xdnd_protocol_list; - - while (entry != NULL) { - if (entry->window == toplevel) { - return entry; - } - entry = entry->next; - } - return NULL; -} - -static void -remove_motif_protocol_entry_for_toplevel(Window toplevel) { - EmbeddedDropSiteProtocolListEntry* entry = embedded_motif_protocol_list; - EmbeddedDropSiteProtocolListEntry* prev_entry = NULL; - - while (entry != NULL) { - if (entry->window == toplevel) { - if (prev_entry != NULL) { - prev_entry->next = entry->next; - } else { - embedded_motif_protocol_list = entry->next; - } - free(entry); - } - entry = entry->next; - prev_entry = entry; - } -} - -static void -remove_xdnd_protocol_entry_for_toplevel(Window toplevel) { - EmbeddedDropSiteProtocolListEntry* entry = embedded_xdnd_protocol_list; - EmbeddedDropSiteProtocolListEntry* prev_entry = NULL; - - while (entry != NULL) { - if (entry->window == toplevel) { - if (prev_entry != NULL) { - prev_entry->next = entry->next; - } else { - embedded_xdnd_protocol_list = entry->next; - } - free(entry); - } - entry = entry->next; - } -} - -static Boolean -is_embedding_toplevel(Window toplevel) { - return get_entry_for_toplevel(toplevel) != NULL; -} - -static Window -get_embedded_window(Display* dpy, Window toplevel, int x, int y) { - EmbeddedDropSiteListEntry* entry = get_entry_for_toplevel(toplevel); - - if (entry != NULL) { - unsigned int idx; - - for (idx = 0; idx < entry->embedded_sites_count; idx++) { - Window site = entry->embedded_sites[idx]; - Window child = None; - int x_return, y_return; - - if (XTranslateCoordinates(dpy, entry->root, site, x, y, - &x_return, &y_return, &child)) { - if (x_return >= 0 && y_return >= 0) { - XWindowAttributes xwa; - XGetWindowAttributes(dpy, site, &xwa); - if (xwa.map_state != IsUnmapped && - x_return < xwa.width && y_return < xwa.height) { - return site; - } - } - } - } - } - - return None; -} - -/* - * If the toplevel is not an embedding toplevel does nothing and returns False. - * Otherwise, sets xdnd_proxy for the specified toplevel to the 'proxy_window', - * xdnd_protocol_version to 'version', xdnd_override to 'override', returns True. - */ -static Boolean -set_xdnd_proxy_for_toplevel(Window toplevel, Window proxy_window, - unsigned int version, Boolean override) { - EmbeddedDropSiteProtocolListEntry* entry = - get_xdnd_protocol_entry_for_toplevel(toplevel); - - if (entry == NULL) { - return False; - } - - entry->proxy = proxy_window; - entry->protocol_version = version; - entry->overriden = override; - - return True; -} - -/* - * If the toplevel is not an embedding toplevel does nothing and returns False. - * Otherwise, sets motif_proxy for the specified toplevel to the proxy_window, - * motif_override to 'override' and returns True. - */ -static Boolean -set_motif_proxy_for_toplevel(Window toplevel, Window proxy_window, Boolean override) { - EmbeddedDropSiteProtocolListEntry* entry = - get_motif_protocol_entry_for_toplevel(toplevel); - - if (entry == NULL) { - return False; - } - - entry->proxy = proxy_window; - entry->overriden = override; - - return True; -} - -/* - * Forwards a drag notification to the embedding toplevel modifying the event - * to match the protocol version supported by the toplevel. - * Returns True if the event is sent, False otherwise. - */ -static Boolean -forward_client_message_to_toplevel(Window toplevel, XClientMessageEvent* event) { - EmbeddedDropSiteProtocolListEntry* protocol_entry = NULL; - Window proxy = None; - - if (event->message_type == _XA_MOTIF_DRAG_AND_DROP_MESSAGE) { - protocol_entry = get_motif_protocol_entry_for_toplevel(toplevel); - } else { - /* Assume XDnD */ - protocol_entry = get_xdnd_protocol_entry_for_toplevel(toplevel); - if (protocol_entry != NULL) { - /* Adjust the event to match the XDnD protocol version. */ - unsigned int version = protocol_entry->protocol_version; - if (event->message_type == XA_XdndEnter) { - unsigned int min_version = source_protocol_version < version ? - source_protocol_version : version; - event->data.l[1] = min_version << XDND_PROTOCOL_SHIFT; - event->data.l[1] |= source_data_types_count > 3 ? XDND_DATA_TYPES_BIT : 0; - } - } - } - - if (protocol_entry == NULL) { - return False; - } - - if (!protocol_entry->overriden) { - return False; - } - proxy = protocol_entry->proxy; - - if (proxy == None) { - proxy = toplevel; - } - - event->window = toplevel; - - XSendEvent(event->display, proxy, False, NoEventMask, (XEvent*)event); - - return True; -} - -/******************************************************************************/ - -/********************* Drop site list support *********************************/ - -struct DropSiteListEntryRec; - -typedef struct DropSiteListEntryRec DropSiteListEntry; - -struct DropSiteListEntryRec { - Window window; - Window root; - /* - * The closest to the root ancestor with WM_STATE property set. - * Normally toplevel == window. - * In plugin scenario toplevel is the browser toplevel window. - */ - Window toplevel; - /* - * Java top-level position is the outer canvas position, not the shell - * window position. We need to keep the outer canvas ID (and the root ID) to - * translate from mouse position root coordinates to the Java component - * coordinates. - */ - Window outer_canvas; - jobject component; - DropSiteListEntry* next; -}; - -static DropSiteListEntry* drop_site_list = NULL; - -/* - * If drop_site_list already contains an entry with the same window, - * does nothing and returns False. - * Otherwise, adds a new entry the list and returns True - * if completes successfully. - */ -static Boolean -add_to_drop_site_list(Window window, Window root, Window toplevel, - Window outer_canvas, jobject component) { - DropSiteListEntry* entry = drop_site_list; - - while (entry != NULL) { - if (entry->window == window) { - return False; - } - entry = entry->next; - } - - entry = malloc(sizeof(DropSiteListEntry)); - - if (entry == NULL) { - return False; - } - - entry->window = window; - entry->root = root; - entry->toplevel = toplevel; - entry->outer_canvas = outer_canvas; - entry->component = component; - entry->next = drop_site_list; - drop_site_list = entry; - - return True; -} - -/* - * Returns True if the list entry for the specified window has been successfully - * removed from the list. Otherwise, returns False. - */ -static Boolean -remove_from_drop_site_list(Window window) { - DropSiteListEntry* entry = drop_site_list; - DropSiteListEntry* prev = NULL; - - while (entry != NULL) { - if (entry->window == window) { - if (prev != NULL) { - prev->next = entry->next; - } else { - drop_site_list = entry->next; - } - free(entry); - return True; - } - prev = entry; - entry = entry->next; - } - - return False; -} - -static jobject -get_component_for_window(Window window) { - DropSiteListEntry* entry = drop_site_list; - - while (entry != NULL) { - if (entry->window == window) { - return entry->component; - } - entry = entry->next; - } - - return NULL; -} - -static Window -get_root_for_window(Window window) { - DropSiteListEntry* entry = drop_site_list; - - while (entry != NULL) { - if (entry->window == window) { - return entry->root; - } - entry = entry->next; - } - - return None; -} - -static Window -get_toplevel_for_window(Window window) { - DropSiteListEntry* entry = drop_site_list; - - while (entry != NULL) { - if (entry->window == window) { - return entry->toplevel; - } - entry = entry->next; - } - - return None; -} - -static Window -get_outer_canvas_for_window(Window window) { - DropSiteListEntry* entry = drop_site_list; - - while (entry != NULL) { - if (entry->window == window) { - return entry->outer_canvas; - } - entry = entry->next; - } - - return None; -} -/******************************************************************************/ - -/******************* Delayed drop site registration stuff *********************/ -struct DelayedRegistrationEntryRec; - -typedef struct DelayedRegistrationEntryRec DelayedRegistrationEntry; - -struct DelayedRegistrationEntryRec { - Widget outer_canvas; - jobject component; - XtIntervalId timer; - DelayedRegistrationEntry* next; -}; - -static DelayedRegistrationEntry* delayed_registration_list = NULL; - -static const int DELAYED_REGISTRATION_PERIOD = 500; - -/* Timer callback. */ -static void -register_drop_site_later(XtPointer client_data, XtIntervalId* id); - -/* - * Enqueues the specified widget and component for delayed drop site - * registration. If this widget has already been registered, does nothing and - * returns False. Otherwise, schedules a timer callback that will repeatedly - * attempt to register the drop site until the registration succeeds. - * To remove this widget from the queue of delayed registration call - * remove_delayed_registration_entry(). - * - * The caller must own AWT_LOCK. - */ -static Boolean -add_delayed_registration_entry(Widget outer_canvas, XtPointer componentRef) { - DelayedRegistrationEntry* entry = delayed_registration_list; - - if (outer_canvas == NULL || componentRef == NULL) { - return False; - } - - while (entry != NULL && entry->outer_canvas != outer_canvas) { - entry = entry->next; - } - - if (entry != NULL) { - return False; - } - - entry = malloc(sizeof(DelayedRegistrationEntry)); - - if (entry == NULL) { - return False; - } - - entry->outer_canvas = outer_canvas; - entry->component = componentRef; - entry->timer = XtAppAddTimeOut(awt_appContext, DELAYED_REGISTRATION_PERIOD, - register_drop_site_later, entry); - entry->next = delayed_registration_list; - delayed_registration_list = entry; - - return True; -} - -/* - * Unregisters the timer callback and removes this widget from the queue of - * delayed drop site registration. - * - * The caller must own AWT_LOCK. - */ -static Boolean -remove_delayed_registration_entry(Widget outer_canvas) { - DelayedRegistrationEntry* entry = delayed_registration_list; - DelayedRegistrationEntry* prev = NULL; - - if (outer_canvas == NULL) { - return False; - } - - while (entry != NULL && entry->outer_canvas != outer_canvas) { - prev = entry; - entry = entry->next; - } - - if (entry == NULL) { - return False; - } - - if (prev != NULL) { - prev->next = entry->next; - } else { - delayed_registration_list = entry->next; - } - - if (entry->timer) { - XtRemoveTimeOut(entry->timer); - entry->timer = (XtIntervalId)0; - } - - free(entry); - - return True; -} - -static void -register_drop_site_later(XtPointer client_data, XtIntervalId* id) { - DelayedRegistrationEntry* entry = (DelayedRegistrationEntry*)client_data; - - if (XtIsRealized(entry->outer_canvas) && - register_drop_site(entry->outer_canvas, entry->component)) { - remove_delayed_registration_entry(entry->outer_canvas); - } else { - entry->timer = XtAppAddTimeOut(awt_appContext, DELAYED_REGISTRATION_PERIOD, - register_drop_site_later, entry); - } -} -/******************************************************************************/ - -static void -awt_dnd_cleanup() { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - - if (!JNU_IsNull(env, target_component)) { - /* Trigger dragExit */ - /* - * Note: we pass NULL native context. This indicates that response - * shouldn't be sent to the source. - */ - dt_postDropTargetEvent(env, target_component, 0, 0, - java_awt_dnd_DnDConstants_ACTION_NONE, - java_awt_event_MouseEvent_MOUSE_EXITED, - NULL); - } - - if (motif_top_level_leave_postponed) { - XClientMessageEvent* leave = &motif_top_level_leave_postponed_event; - if (leave->type == ClientMessage) { - Window win = leave->window; - if (is_embedding_toplevel(win)) { - forward_client_message_to_toplevel(win, leave); - } - } - } - - if (source_window != None) { - XSelectInput(awt_display, source_window, source_window_mask); - } - - source_protocol = NO_PROTOCOL; - source_protocol_version = 0; - source_window = None; - source_atom = None; - source_window_mask = 0; - source_actions = java_awt_dnd_DnDConstants_ACTION_NONE; - track_source_actions = False; - (*env)->DeleteGlobalRef(env, source_data_types); - source_data_types = NULL; - if (source_data_types_native != NULL) { - free(source_data_types_native); - source_data_types_native = NULL; - } - source_data_types_count = 0; - source_x = 0; - source_y = 0; - target_component = NULL; - motif_top_level_leave_postponed = False; - memset(&motif_top_level_leave_postponed_event, 0, - sizeof(XClientMessageEvent)); -} - -static jlongArray -get_data_types_array(JNIEnv* env, Atom* types, unsigned int types_count) { - jlongArray array = NULL; - jboolean isCopy; - jlong* jTargets; -#ifndef _LP64 /* Atom and jlong are different sizes in the 32-bit build */ - unsigned int i; -#endif - - if ((*env)->PushLocalFrame(env, 1) < 0) { - return NULL; - } - - array = (*env)->NewLongArray(env, types_count); - - if (JNU_IsNull(env, array)) { - return NULL; - } - - if (types_count == 0) { - return array; - } - - jTargets = (*env)->GetLongArrayElements(env, array, &isCopy); - if (jTargets == NULL) { - (*env)->PopLocalFrame(env, NULL); - return NULL; - } - -#ifdef _LP64 - memcpy(jTargets, types, types_count * sizeof(Atom)); -#else - for (i = 0; i < types_count; i++) { - jTargets[i] = (types[i] & 0xFFFFFFFFLU); - } -#endif - - (*env)->ReleaseLongArrayElements(env, array, jTargets, 0); - - array = (*env)->NewGlobalRef(env, array); - - (*env)->PopLocalFrame(env, NULL); - - return array; -} - -static Boolean -is_xdnd_drag_message_type(unsigned long message_type) { - return message_type == XA_XdndEnter || - message_type == XA_XdndPosition || - message_type == XA_XdndLeave || - message_type == XA_XdndDrop ? True : False; -} - -/* - * Returns EventConsume if the event should be consumed, - * EventPassAlong otherwise. - */ -static EventStatus -handle_xdnd_enter(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - Display* dpy = event->display; - long* event_data = event->data.l; - Window source_win = None; - long source_win_mask = 0; - unsigned int protocol_version = 0; - unsigned int data_types_count = 0; - Atom* data_types = NULL; - jlongArray java_data_types = NULL; - jint actions = java_awt_dnd_DnDConstants_ACTION_NONE; - Boolean track = False; - - DTRACE_PRINTLN5("%s:%d XdndEnter comp=%X src_win=%ld protocol=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol); - - if (!JNU_IsNull(env, target_component) || source_window != None || - source_protocol != NO_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - /* - * NOTE: the component can be NULL if the event was sent to the embedding - * toplevel. - */ - if (JNU_IsNull(env, get_component_for_window(event->window)) && - !is_embedding_toplevel(event->window)) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - window is not a registered drop site.", - __FILE__, __LINE__); - return EventFailure; - } - - protocol_version = - (event_data[1] & XDND_PROTOCOL_MASK) >> XDND_PROTOCOL_SHIFT; - - /* XDnD compliance only requires supporting version 3 and up. */ - if (protocol_version < XDND_MIN_PROTOCOL_VERSION) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - invalid protocol version.", - __FILE__, __LINE__); - return EventFailure; - } - - /* Ignore the source if the protocol version is higher than we support. */ - if (protocol_version > XDND_PROTOCOL_VERSION) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - invalid protocol version.", - __FILE__, __LINE__); - return EventFailure; - } - - source_win = event_data[0]; - - /* Extract the list of supported actions. */ - if (protocol_version < 2) { - /* Prior to XDnD version 2 only COPY action was supported. */ - actions = java_awt_dnd_DnDConstants_ACTION_COPY; - } else { - unsigned char ret; - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - data = NULL; - ret = checked_XGetWindowProperty(dpy, source_win, XA_XdndActionList, - 0, 0xFFFF, False, XA_ATOM, &type, - &format, &nitems, &after, &data); - - /* Ignore the source if the window is destroyed. */ - if (ret == BadWindow) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - invalid window.", - __FILE__, __LINE__); - return EventFailure; - } - - if (ret == Success) { - if (type == XA_ATOM && format == 32) { - unsigned int i; - Atom* action_atoms = (Atom*)data; - - for (i = 0; i < nitems; i++) { - actions |= xdnd_to_java_action(action_atoms[i]); - } - } - - /* - * According to XDnD protocol, XdndActionList is optional. - * If XdndActionList is not set we try to guess which actions are - * supported. - */ - if (type == None) { - actions = java_awt_dnd_DnDConstants_ACTION_COPY; - track = True; - } - - XFree(data); - } - } - - /* Extract the available data types. */ - if (event_data[1] & XDND_DATA_TYPES_BIT) { - unsigned char ret; - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - data = NULL; - ret = checked_XGetWindowProperty(dpy, source_win, XA_XdndTypeList, - 0, 0xFFFF, False, XA_ATOM, &type, - &format, &nitems, &after, &data); - - /* Ignore the source if the window is destroyed. */ - if (ret == BadWindow) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - invalid window.", - __FILE__, __LINE__); - return EventFailure; - } - - if (ret == Success) { - if (type == XA_ATOM && format == 32 && nitems > 0) { - data_types_count = nitems; - data_types = (Atom*)malloc(data_types_count * sizeof(Atom)); - - if (data_types == NULL) { - XFree(data); - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - malloc fails.", - __FILE__, __LINE__); - return EventFailure; - } - - memcpy((void *)data_types, (void *)data, - data_types_count * sizeof(Atom)); - } - - XFree(data); - } - } else { - int i; - data_types = (Atom*)malloc(3 * sizeof (Atom)); - if (data_types == NULL) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - malloc fails.", - __FILE__, __LINE__); - return EventFailure; - } - for (i = 0; i < 3; i++) { - Atom j; - if ((j = event_data[2 + i]) != None) { - data_types[data_types_count++] = j; - } - } - } - - java_data_types = get_data_types_array(env, data_types, data_types_count); - - if (JNU_IsNull(env, java_data_types)) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - cannot create types array.", - __FILE__, __LINE__); - free((char*)data_types); - return EventFailure; - } - - /* - * Select for StructureNotifyMask to receive DestroyNotify in case of source - * crash. - */ - { - unsigned char ret; - XWindowAttributes xwa; - - XGetWindowAttributes(dpy, source_win, &xwa); - - source_win_mask = xwa.your_event_mask; - - ret = checked_XSelectInput(dpy, source_win, - (source_win_mask | StructureNotifyMask)); - - if (ret == BadWindow) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - invalid window.", - __FILE__, __LINE__); - free((char*)data_types); - (*env)->DeleteGlobalRef(env, java_data_types); - return EventFailure; - } - } - - /* Update the global state. */ - source_protocol = XDND_PROTOCOL; - source_protocol_version = protocol_version; - source_window = source_win; - source_window_mask = source_win_mask; - source_actions = actions; - track_source_actions = track; - source_data_types = java_data_types; - source_data_types_native = data_types; - source_data_types_count = data_types_count; - - DTRACE_PRINTLN5("%s:%d XdndEnter handled src_win=%ld protocol=%d fmt=%d.", - __FILE__, __LINE__, - source_window, source_protocol, data_types_count); - - return EventSuccess; -} - -/* - * Returns EventConsume if the event should be consumed, - * EventPassAlong otherwise. - */ -static EventStatus -handle_xdnd_position(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - long* event_data = event->data.l; - Window source_win = None; - Time time_stamp = CurrentTime; - Atom action_atom = None; - jint action = java_awt_dnd_DnDConstants_ACTION_NONE; - int x = 0; - int y = 0; - jint java_event_id = 0; - jobject component = NULL; - Window receiver = None; - - DTRACE_PRINTLN5("%s:%d XdndPosition comp=%X src_win=%ld protocol=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol); - - if (source_protocol != XDND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d XdndPosition rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - source_win = event_data[0]; - - /* Ignore XDnD messages from all other windows. */ - if (source_window != source_win) { - DTRACE_PRINTLN4("%s:%d XdndPosition rejected - invalid source window cur=%ld this=%ld.", - __FILE__, __LINE__, source_window, source_win); - return EventFailure; - } - - x = event_data[2] >> 16; - y = event_data[2] & 0xFFFF; - - component = get_component_for_window(event->window); - - if (JNU_IsNull(env, component)) { - /* - * The window must be the embedding toplevel, since otherwise we would reject the - * XdndEnter and never get to this point. - */ - DASSERT(is_embedding_toplevel(event->window)); - - receiver = get_embedded_window(event->display, event->window, x, y); - - if (receiver != None) { - component = get_component_for_window(receiver); - } - } else { - receiver = event->window; - } - - /* Translate mouse position from root coordinates - to the target window coordinates. */ - if (receiver != None) { - Window child = None; - XTranslateCoordinates(event->display, - get_root_for_window(receiver), - get_outer_canvas_for_window(receiver), - x, y, &x, &y, &child); - } - - /* Time stamp - new in XDnD version 1. */ - if (source_protocol_version > 0) { - time_stamp = event_data[3]; - } - - /* User action - new in XDnD version 1. */ - if (source_protocol_version > 1) { - action_atom = event_data[4]; - } else { - /* The default action is XdndActionCopy */ - action_atom = XA_XdndActionCopy; - } - - action = xdnd_to_java_action(action_atom); - - if (track_source_actions) { - source_actions |= action; - } - - if (JNU_IsNull(env, component)) { - if (!JNU_IsNull(env, target_component)) { - dt_postDropTargetEvent(env, target_component, x, y, - java_awt_dnd_DnDConstants_ACTION_NONE, - java_awt_event_MouseEvent_MOUSE_EXITED, - NULL); - } - } else { - if (JNU_IsNull(env, target_component)) { - java_event_id = java_awt_event_MouseEvent_MOUSE_ENTERED; - } else { - java_event_id = java_awt_event_MouseEvent_MOUSE_DRAGGED; - } - - dt_postDropTargetEvent(env, component, x, y, action, - java_event_id, event); - } - - user_action = action; - source_x = x; - source_y = y; - target_component = component; - - return EventSuccess; -} - -/* - * Returns EventConsume if the event should be consumed, - * EventPassAlong otherwise. - */ -static EventStatus -handle_xdnd_leave(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - long* event_data = event->data.l; - Window source_win = None; - - if (source_protocol != XDND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d XdndLeave rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - source_win = event_data[0]; - - /* Ignore XDnD messages from all other windows. */ - if (source_window != source_win) { - DTRACE_PRINTLN4("%s:%d XdndLeave rejected - invalid source window cur=%ld this=%ld.", - __FILE__, __LINE__, source_window, source_win); - return EventFailure; - } - - awt_dnd_cleanup(); - - return EventSuccess; -} - -/* - * Returns EventConsume if the event should be consumed, - * EventPassAlong otherwise. - */ -static EventStatus -handle_xdnd_drop(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - long* event_data = event->data.l; - Window source_win = None; - - DTRACE_PRINTLN5("%s:%d XdndDrop comp=%X src_win=%ld protocol=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol); - - if (source_protocol != XDND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d XdndDrop rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - source_win = event_data[0]; - - /* Ignore XDnD messages from all other windows. */ - if (source_window != source_win) { - DTRACE_PRINTLN4("%s:%d XdndDrop rejected - invalid source window cur=%ld this=%ld.", - __FILE__, __LINE__, source_window, source_win); - return EventFailure; - } - - if (!JNU_IsNull(env, target_component)) { - dt_postDropTargetEvent(env, target_component, source_x, source_y, user_action, - java_awt_event_MouseEvent_MOUSE_RELEASED, event); - } - - return EventSuccess; -} - -/* - * Returns EventPassAlong if the event should be passed to the original proxy. - * TOP_LEVEL_ENTER should be passed to the original proxy only if the event is - * invalid. - */ -static EventStatus -handle_motif_top_level_enter(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - Display* dpy = event->display; - char* event_data = event->data.b; - unsigned char event_byte_order = 0; - Window source_win = None; - long source_win_mask = 0; - unsigned int protocol_version = MOTIF_DND_PROTOCOL_VERSION; - Atom property_atom = None; - unsigned int data_types_count = 0; - Atom* data_types = NULL; - jlongArray java_data_types = NULL; - - DTRACE_PRINTLN5("%s:%d TOP_LEVEL_ENTER comp=%X src_win=%ld protocol=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol); - - if (!JNU_IsNull(env, target_component) || source_window != None || - source_protocol != NO_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d TOP_LEVEL_ENTER rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - if (JNU_IsNull(env, get_component_for_window(event->window)) && - !is_embedding_toplevel(event->window)) { - DTRACE_PRINTLN2("%s:%d TOP_LEVEL_ENTER rejected - window is not a registered drop site.", - __FILE__, __LINE__); - return EventFailure; - } - - event_byte_order = read_card8(event_data, 1); - source_win = read_card32(event_data, 8, event_byte_order); - property_atom = read_card32(event_data, 12, event_byte_order); - - /* Extract the available data types. */ - { - unsigned char ret; - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - data = NULL; - ret = checked_XGetWindowProperty(dpy, source_win, property_atom, 0, - 0xFFFF, False, - _XA_MOTIF_DRAG_INITIATOR_INFO, &type, - &format, &nitems, &after, &data); - - /* Ignore the source if the window is destroyed. */ - if (ret == BadWindow) { - DTRACE_PRINTLN2("%s:%d TOP_LEVEL_ENTER rejected - invalid window.", - __FILE__, __LINE__); - return EventFailure; - } - - if (ret == BadAtom) { - DTRACE_PRINTLN2("%s:%d TOP_LEVEL_ENTER rejected - invalid property atom.", - __FILE__, __LINE__); - return EventFailure; - } - - if (ret == Success) { - if (type == _XA_MOTIF_DRAG_INITIATOR_INFO && format == 8 && - nitems == MOTIF_INITIATOR_INFO_SIZE) { - unsigned char property_byte_order = read_card8((char*)data, 0); - int index = read_card16((char*)data, 2, property_byte_order); - - protocol_version = read_card8((char*)data, 1); - - if (protocol_version > MOTIF_DND_PROTOCOL_VERSION) { - DTRACE_PRINTLN3("%s:%d TOP_LEVEL_ENTER rejected - invalid protocol version: %d.", - __FILE__, __LINE__, protocol_version); - XFree(data); - return EventFailure; - } - - get_target_list_for_index(dpy, index, &data_types, &data_types_count); - } - - XFree(data); - } - } - - java_data_types = get_data_types_array(env, data_types, data_types_count); - - if (JNU_IsNull(env, java_data_types)) { - DTRACE_PRINTLN2("%s:%d TOP_LEVEL_ENTER rejected - cannot create types array.", - __FILE__, __LINE__); - free((char*)data_types); - return EventFailure; - } - - /* - * Select for StructureNotifyMask to receive DestroyNotify in case of source - * crash. - */ - { - unsigned char ret; - XWindowAttributes xwa; - - XGetWindowAttributes(dpy, source_win, &xwa); - - source_win_mask = xwa.your_event_mask; - - ret = checked_XSelectInput(dpy, source_win, - (source_win_mask | StructureNotifyMask)); - - if (ret == BadWindow) { - DTRACE_PRINTLN2("%s:%d XdndEnter rejected - invalid window.", - __FILE__, __LINE__); - free((char*)data_types); - (*env)->DeleteGlobalRef(env, java_data_types); - return EventFailure; - } - } - - source_protocol = MOTIF_DND_PROTOCOL; - source_protocol_version = protocol_version; - source_window = source_win; - source_atom = property_atom; - source_window_mask = source_win_mask; - /* - * TOP_LEVEL_ENTER doesn't communicate the list of supported actions - * They are provided in DRAG_MOTION. - */ - source_actions = java_awt_dnd_DnDConstants_ACTION_NONE; - track_source_actions = False; - source_data_types = java_data_types; - source_data_types_native = data_types; - source_data_types_count = data_types_count; - DTRACE_PRINTLN6("%s:%d TOP_LEVEL_ENTER comp=%d src_win=%ld protocol=%d fmt=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol, data_types_count); - - return EventSuccess; -} - -/* - * Returns EventPassAlong if the event should be passed to the original proxy. - * DRAG_MOTION event shouldn't be passed to the original proxy only if it is - * a valid event and the mouse coordinates passed in it specify the point over - * a Java component in this JVM. - */ -static EventStatus -handle_motif_drag_motion(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - char* event_data = event->data.b; - unsigned char event_reason = 0; - unsigned char event_byte_order = 0; - Window source_win = None; - CARD16 flags = 0; - unsigned char motif_action = 0; - unsigned char motif_actions = 0; - jint java_action = java_awt_dnd_DnDConstants_ACTION_NONE; - jint java_actions = java_awt_dnd_DnDConstants_ACTION_NONE; - int x = 0; - int y = 0; - jint java_event_id = 0; - jobject component = NULL; - - DTRACE_PRINTLN5("%s:%d DRAG_MOTION comp=%X src_win=%ld protocol=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol); - - if (source_protocol != MOTIF_DND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d DRAG_MOTION rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - event_reason = read_card8(event_data, 0) & MOTIF_MESSAGE_REASON_MASK; - event_byte_order = read_card8(event_data, 1); - - flags = read_card16(event_data, 2, event_byte_order); - - motif_action = (flags & MOTIF_DND_ACTION_MASK) >> MOTIF_DND_ACTION_SHIFT; - motif_actions = (flags & MOTIF_DND_ACTIONS_MASK) >> MOTIF_DND_ACTIONS_SHIFT; - - java_action = motif_to_java_actions(motif_action); - java_actions = motif_to_java_actions(motif_actions); - - /* Append source window id to the event data, so that we can send the - response properly. */ - { - Window win = source_window; - void* p = &event->data.b[12]; - if (event_byte_order != MOTIF_BYTE_ORDER) { - SWAP4BYTES(win); - } - write_card32(&p, (CARD32)win); - } - - component = get_component_for_window(event->window); - - if (event_reason == OPERATION_CHANGED) { - /* OPERATION_CHANGED event doesn't provide coordinates, so we use - previously stored position and component ref. */ - x = source_x; - y = source_y; - - if (JNU_IsNull(env, component)) { - component = target_component; - } - } else { - Window receiver = None; - - x = read_card16(event_data, 8, event_byte_order); - y = read_card16(event_data, 10, event_byte_order); - - if (JNU_IsNull(env, component)) { - /* - * The window must be the embedding toplevel, since otherwise we - * would reject the TOP_LEVEL_ENTER and never get to this point. - */ - DASSERT(is_embedding_toplevel(event->window)); - - receiver = get_embedded_window(event->display, event->window, x, y); - - if (receiver != None) { - component = get_component_for_window(receiver); - } - } else { - receiver = event->window; - } - - /* Translate mouse position from root coordinates - to the target window coordinates. */ - if (receiver != None) { - Window child = None; - XTranslateCoordinates(event->display, - get_root_for_window(receiver), - get_outer_canvas_for_window(receiver), - x, y, &x, &y, &child); - } - } - - if (JNU_IsNull(env, component)) { - if (!JNU_IsNull(env, target_component)) { - /* Triggers dragExit */ - dt_postDropTargetEvent(env, target_component, x, y, - java_awt_dnd_DnDConstants_ACTION_NONE, - java_awt_event_MouseEvent_MOUSE_EXITED, - NULL); - } - } else { - if (JNU_IsNull(env, target_component)) { - /* Triggers dragEnter */ - java_event_id = java_awt_event_MouseEvent_MOUSE_ENTERED; - } else { - /* Triggers dragOver */ - java_event_id = java_awt_event_MouseEvent_MOUSE_DRAGGED; - } - - dt_postDropTargetEvent(env, component, x, y, java_action, java_event_id, - event); - } - - source_actions = java_actions; - track_source_actions = False; - user_action = java_action; - source_x = x; - source_y = y; - target_component = component; - - return EventSuccess; -} - -/* - * Returns EventPassAlong if the event should be passed to the original proxy. - * TOP_LEVEL_LEAVE should be passed to the original proxy only if the event - * is invalid. - */ -static EventStatus -handle_motif_top_level_leave(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - char* event_data = event->data.b; - unsigned char event_byte_order = 0; - Window source_win = None; - - DTRACE_PRINTLN5("%s:%d TOP_LEVEL_LEAVE comp=%X src_win=%ld protocol=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol); - - if (source_protocol != MOTIF_DND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d TOP_LEVEL_LEAVE rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - event_byte_order = read_card8(event_data, 1); - source_win = read_card32(event_data, 8, event_byte_order); - - /* Ignore Motif DnD messages from all other windows. */ - if (source_window != source_win) { - DTRACE_PRINTLN4("%s:%d TOP_LEVEL_LEAVE rejected - invalid source window cur=%ld this=%ld.", - __FILE__, __LINE__, source_window, source_win); - return EventFailure; - } - - /* - * Postpone upcall to java, so that we can abort it in case - * if drop immediatelly follows (see BugTraq ID 4395290). - * Send a dummy ClientMessage event to guarantee that a postponed java - * upcall will be processed. - */ - motif_top_level_leave_postponed = True; - { - XClientMessageEvent dummy; - Window proxy; - - dummy.display = event->display; - dummy.type = ClientMessage; - dummy.window = event->window; - dummy.format = 32; - dummy.message_type = None; - - /* - * If this is an embedded drop site, the event should go to the - * awt_root_window as this is a proxy for all embedded drop sites. - * Otherwise the event should go to the event->window, as we don't use - * proxies for normal drop sites. - */ - if (is_embedding_toplevel(event->window)) { - proxy = get_awt_root_window(); - } else { - proxy = event->window; - } - - XSendEvent(event->display, proxy, False, NoEventMask, - (XEvent*)&dummy); - } - - return EventSuccess; -} - -/* - * Returns EventPassAlong if the event should be passed to the original proxy. - * DROP_START event shouldn't be passed to the original proxy only if it is - * a valid event and the mouse coordinates passed in it specify the point over - * a Java component in this JVM. - */ -static EventStatus -handle_motif_drop_start(XClientMessageEvent* event) { - JNIEnv *env = (JNIEnv*)JNU_GetEnv(jvm, JNI_VERSION_1_4); - char* event_data = event->data.b; - unsigned char event_byte_order = 0; - Window source_win = None; - Atom property_atom = None; - CARD16 flags = 0; - unsigned char motif_action = 0; - unsigned char motif_actions = 0; - jint java_action = java_awt_dnd_DnDConstants_ACTION_NONE; - jint java_actions = java_awt_dnd_DnDConstants_ACTION_NONE; - int x = 0; - int y = 0; - jobject component = NULL; - Window receiver = None; - - DTRACE_PRINTLN5("%s:%d DROP_START comp=%X src_win=%ld protocol=%d.", - __FILE__, __LINE__, - target_component, source_window, source_protocol); - - if (source_protocol != MOTIF_DND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d DROP_START rejected - invalid state.", - __FILE__, __LINE__); - return EventFailure; - } - - event_byte_order = read_card8(event_data, 1); - source_win = read_card32(event_data, 16, event_byte_order); - - /* Ignore Motif DnD messages from all other windows. */ - if (source_window != source_win) { - DTRACE_PRINTLN4("%s:%d DROP_START rejected - invalid source window cur=%ld this=%ld.", - __FILE__, __LINE__, source_window, source_win); - return EventFailure; - } - - property_atom = read_card32(event_data, 12, event_byte_order); - - flags = read_card16(event_data, 2, event_byte_order); - - motif_action = (flags & MOTIF_DND_ACTION_MASK) >> MOTIF_DND_ACTION_SHIFT; - motif_actions = (flags & MOTIF_DND_ACTIONS_MASK) >> MOTIF_DND_ACTIONS_SHIFT; - - java_action = motif_to_java_actions(motif_action); - java_actions = motif_to_java_actions(motif_actions); - - x = read_card16(event_data, 8, event_byte_order); - y = read_card16(event_data, 10, event_byte_order); - - source_actions = java_actions; - - component = get_component_for_window(event->window); - - if (JNU_IsNull(env, component)) { - /* - * The window must be the embedding toplevel, since otherwise we would reject the - * TOP_LEVEL_ENTER and never get to this point. - */ - DASSERT(is_embedding_toplevel(event->window)); - - receiver = get_embedded_window(event->display, event->window, x, y); - - if (receiver != None) { - component = get_component_for_window(receiver); - } - } else { - receiver = event->window; - } - - /* Translate mouse position from root coordinates - to the target window coordinates. */ - if (receiver != None) { - Window child = None; - XTranslateCoordinates(event->display, - get_root_for_window(receiver), - get_outer_canvas_for_window(receiver), - x, y, &x, &y, &child); - } - - if (JNU_IsNull(env, component)) { - if (!JNU_IsNull(env, target_component)) { - /* Triggers dragExit */ - dt_postDropTargetEvent(env, target_component, x, y, - java_awt_dnd_DnDConstants_ACTION_NONE, - java_awt_event_MouseEvent_MOUSE_EXITED, - NULL); - } - } else { - dt_postDropTargetEvent(env, component, x, y, java_action, - java_awt_event_MouseEvent_MOUSE_RELEASED, - event); - } - - return EventSuccess; -} - -static void -send_enter_message_to_toplevel(Window toplevel, XClientMessageEvent* xclient) { - XClientMessageEvent enter; - - if (source_protocol == XDND_PROTOCOL) { - enter.display = xclient->display; - enter.type = ClientMessage; - enter.window = toplevel; - enter.format = 32; - enter.message_type = XA_XdndEnter; - enter.data.l[0] = xclient->data.l[0]; /* XID of the source window */ - enter.data.l[1] = source_protocol_version << XDND_PROTOCOL_SHIFT; - enter.data.l[1] |= source_data_types_count > 3 ? XDND_DATA_TYPES_BIT : 0; - enter.data.l[2] = - source_data_types_count > 0 ? source_data_types_native[0] : None; - enter.data.l[3] = - source_data_types_count > 1 ? source_data_types_native[1] : None; - enter.data.l[4] = - source_data_types_count > 2 ? source_data_types_native[2] : None; - } else if (source_protocol == MOTIF_DND_PROTOCOL) { - int reason = (int)(xclient->data.b[0] & MOTIF_MESSAGE_REASON_MASK); - unsigned char byte_order = xclient->data.b[1]; - - enter.display = xclient->display; - enter.type = ClientMessage; - enter.window = toplevel; - enter.format = 8; - enter.message_type = _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - { - void* p = &enter.data.b[0]; - int flags = 0; - - flags |= java_to_motif_actions(user_action) << MOTIF_DND_ACTION_SHIFT; - flags |= java_to_motif_actions(source_actions) << MOTIF_DND_ACTIONS_SHIFT; - - write_card8(&p, TOP_LEVEL_ENTER | MOTIF_MESSAGE_FROM_INITIATOR); - write_card8(&p, byte_order); - write_card16(&p, flags); - { - Time time_stamp = read_card32(xclient->data.b, 4, byte_order); - Window src_window = source_window; - Atom motif_atom = _XA_MOTIF_ATOM_0; - - if (byte_order != MOTIF_BYTE_ORDER) { - SWAP4BYTES(time_stamp); - SWAP4BYTES(src_window); - SWAP4BYTES(motif_atom); - } - write_card32(&p, time_stamp); - write_card32(&p, src_window); - write_card32(&p, motif_atom); - } - } - } else { - return; - } - - forward_client_message_to_toplevel(toplevel, &enter); -} - -static void -send_leave_message_to_toplevel(Window toplevel, XClientMessageEvent* xclient) { - XClientMessageEvent leave; - - if (source_protocol == XDND_PROTOCOL) { - leave.display = xclient->display; - leave.type = ClientMessage; - leave.window = toplevel; - leave.format = 32; - leave.message_type = XA_XdndLeave; - leave.data.l[0] = xclient->data.l[0]; /* XID of the source window */ - leave.data.l[1] = 0; /* flags */ - } else if (source_protocol == MOTIF_DND_PROTOCOL) { - int reason = (int)(xclient->data.b[0] & MOTIF_MESSAGE_REASON_MASK); - unsigned char byte_order = xclient->data.b[1]; - - leave.display = xclient->display; - leave.type = ClientMessage; - leave.window = toplevel; - leave.format = 8; - leave.message_type = _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - { - void* p = &leave.data.b[0]; - int flags = 0; - - write_card8(&p, TOP_LEVEL_LEAVE | MOTIF_MESSAGE_FROM_INITIATOR); - write_card8(&p, byte_order); - - { - Time time_stamp = read_card32(xclient->data.b, 4, byte_order); - Window src_window = source_window; - - if (byte_order != MOTIF_BYTE_ORDER) { - SWAP4BYTES(time_stamp); - SWAP4BYTES(src_window); - } - write_card32(&p, time_stamp); - write_card32(&p, src_window); - } - } - } else { - return; - } - - forward_client_message_to_toplevel(toplevel, &leave); -} - -static void -post_process_client_message(XClientMessageEvent* xclient, EventStatus status, - EventType type) { - Window win = xclient->window; - Boolean postponed_leave = motif_top_level_leave_postponed; - - motif_top_level_leave_postponed = False; - - if (is_embedding_toplevel(win)) { - Boolean server_grabbed = False; - - if (postponed_leave) { - XClientMessageEvent* leave = &motif_top_level_leave_postponed_event; - DASSERT(leave->type == ClientMessage && type == DropEvent); - /* Grab the server to ensure that no event is sent between - the TOP_LEVEL_LEAVE and the next message. */ - XGrabServer(awt_display); - forward_client_message_to_toplevel(leave->window, leave); - memset(&motif_top_level_leave_postponed_event, 0, - sizeof(XClientMessageEvent)); - } - - /* - * This code forwards drag notifications to the browser according to the - * following rules: - * - the messages that we failed to process are always forwarded to the - * browser; - * - MotionEvents and DropEvents are forwarded if and only if the drag - * is not over a plugin window; - * - XDnD: EnterEvents and LeaveEvents are never forwarded, instead, we - * send synthesized EnterEvents or LeaveEvents when the drag - * respectively exits or enters plugin windows; - * - Motif DnD: EnterEvents and LeaveEvents are always forwarded. - * Synthetic EnterEvents and LeaveEvents are needed, because the XDnD drop - * site implemented Netscape 6.2 has a nice feature: when it receives - * the first XdndPosition it continuously sends XdndStatus messages to - * the source (every 100ms) until the drag terminates or leaves the drop - * site. When the mouse is dragged over plugin window embedded in the - * browser frame, these XdndStatus messages are mixed with the XdndStatus - * messages sent from the plugin. - * For Motif DnD, synthetic events cause Motif warnings being displayed, - * so these events are always forwarded. However, Motif DnD drop site in - * Netscape 6.2 is implemented in the same way, so there could be similar - * problems if the drag source choose Motif DnD for communication. - */ - switch (status) { - case EventFailure: - forward_client_message_to_toplevel(win, xclient); - break; - case EventSuccess: - { - /* True iff the previous notification was MotionEvent and it was - forwarded to the browser. */ - static Boolean motion_passed_along = False; - - Boolean motif_protocol = - xclient->message_type == _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - switch (type) { - case MotionEvent: - if (JNU_IsNull(env, target_component)) { - if (!motion_passed_along && !motif_protocol) { - send_enter_message_to_toplevel(win, xclient); - } - forward_client_message_to_toplevel(win, xclient); - motion_passed_along = True; - } else { - if (motion_passed_along && !motif_protocol) { - send_leave_message_to_toplevel(win, xclient); - } - motion_passed_along = False; - } - break; - case DropEvent: - if (JNU_IsNull(env, target_component)) { - forward_client_message_to_toplevel(win, xclient); - /* The last chance to cleanup. */ - awt_dnd_cleanup(); - } - motion_passed_along = False; - break; - case EnterEvent: - case LeaveEvent: - if (motif_protocol) { - forward_client_message_to_toplevel(win, xclient); - } - motion_passed_along = False; - break; - } - } - } - - if (postponed_leave) { - XUngrabServer(awt_display); - } - } -} - -/* - * Returns True if the event is processed and shouldn't be passed along to Java. - * Otherwise, return False. - */ -Boolean -awt_dnd_dt_process_event(XEvent* event) { - Display* dpy = event->xany.display; - EventStatus status = EventFailure; - EventType type = UnknownEvent; - - if (event->type == DestroyNotify) { - if (event->xany.window == source_window) { - awt_dnd_cleanup(); - } - /* pass along */ - return False; - } - - if (event->type == PropertyNotify) { - if (is_embedding_toplevel(event->xany.window)) { - Atom atom = event->xproperty.atom; - /* - * If some other client replaced the XDnD or Motif DnD proxy with - * another window we set the proxy back to the awt_root_window - * and update the entry in the embedded_drop_site_list. - * This code is needed, as for example Netscape 4.7 resets the proxy - * when the browser shell is resized. - */ - if (atom == _XA_MOTIF_DRAG_RECEIVER_INFO) { - Window prev_motif_proxy; - ProxyRegistrationStatus status; - status = set_motif_proxy(event->xany.display, event->xany.window, - get_awt_root_window(), &prev_motif_proxy); - if (status != RegFailure && status != RegAlreadyRegistered) { - set_motif_proxy_for_toplevel(event->xany.window, - prev_motif_proxy, - status == RegOverride); - } - } - - if (atom == XA_XdndAware || atom == XA_XdndProxy) { - Window prev_xdnd_proxy; - unsigned int prev_protocol_version; - ProxyRegistrationStatus status; - status = set_xdnd_proxy(event->xany.display, event->xany.window, - get_awt_root_window(), &prev_xdnd_proxy, - &prev_protocol_version); - if (status != RegFailure && status != RegAlreadyRegistered) { - set_xdnd_proxy_for_toplevel(event->xany.window, - prev_xdnd_proxy, - prev_protocol_version, - status == RegOverride); - } - } - } - /* pass along */ - return False; - } - - if (event->type != ClientMessage) { - return False; - } - - if (get_component_for_window(event->xany.window) == NULL && - !is_embedding_toplevel(event->xany.window)) { - return False; - } - - if (motif_top_level_leave_postponed) { - /* Sanity check. */ - if (source_protocol != MOTIF_DND_PROTOCOL) { - DTRACE_PRINTLN2("%s:%d TOP_LEVEL_LEAVE rejected - invalid state.", - __FILE__, __LINE__); - awt_dnd_cleanup(); - } else if (event->xclient.message_type == - _XA_MOTIF_DRAG_AND_DROP_MESSAGE) { - unsigned char first_byte = event->xclient.data.b[0]; - unsigned char reason = first_byte & MOTIF_MESSAGE_REASON_MASK; - unsigned char origin = first_byte & MOTIF_MESSAGE_SENDER_MASK; - - if (origin == MOTIF_MESSAGE_FROM_INITIATOR && - reason != DROP_START) { - awt_dnd_cleanup(); - } - } else { - awt_dnd_cleanup(); - } - } - - if (event->xclient.message_type == XA_XdndEnter) { - status = handle_xdnd_enter(&event->xclient); - type = EnterEvent; - } else if (event->xclient.message_type == XA_XdndPosition) { - status = handle_xdnd_position(&event->xclient); - type = MotionEvent; - } else if (event->xclient.message_type == XA_XdndLeave) { - status = handle_xdnd_leave(&event->xclient); - type = LeaveEvent; - } else if (event->xclient.message_type == XA_XdndDrop) { - status = handle_xdnd_drop(&event->xclient); - type = DropEvent; - } else if (event->xclient.message_type == _XA_MOTIF_DRAG_AND_DROP_MESSAGE) { - unsigned char reason = event->xclient.data.b[0] & MOTIF_MESSAGE_REASON_MASK; - unsigned char origin = event->xclient.data.b[0] & MOTIF_MESSAGE_SENDER_MASK; - - /* Only initiator messages should be handled. */ - if (origin == MOTIF_MESSAGE_FROM_INITIATOR) { - switch (reason) { - case DRAG_MOTION: - case OPERATION_CHANGED: - status = handle_motif_drag_motion(&event->xclient); - type = MotionEvent; - break; - case TOP_LEVEL_ENTER: - status = handle_motif_top_level_enter(&event->xclient); - type = EnterEvent; - break; - case TOP_LEVEL_LEAVE: - status = handle_motif_top_level_leave(&event->xclient); - type = LeaveEvent; - break; - case DROP_START: - status = handle_motif_drop_start(&event->xclient); - type = DropEvent; - break; - } - } - } else { - /* Unknown message type. */ - return False; - } - - /* - * We need to handle a special case here: Motif DnD protocol prescribed that - * DROP_START message should always be preceeded with TOP_LEVEL_LEAVE - * message. We need to cleanup on TOP_LEVEL_LEAVE message, but DROP_START - * wouldn't be processed properly. Instead we postpone the cleanup and - * send a dummy client message to ourselves. If dummy arrives first we do a - * normal cleanup. If DROP_START arrives before the dummy we discard delayed - * cleanup. - * In case of forwarding events from an embedded Java app to an embedding - * Java app it could happen that the embedding app receives the dummy before - * the DROP_START message arrives from the embedding app. In this case the - * drop operation on the embedding app fails to complete. - * To resolve this problem we postpone forwarding of TOP_LEVEL_LEAVE message - * until the next client message is about to be forwarded. - */ - if (motif_top_level_leave_postponed && type == LeaveEvent) { - /* motif_top_level_leave_postponed can be set only if the latest client - message has been processed successfully. */ - DASSERT(status == EventSuccess); - memcpy(&motif_top_level_leave_postponed_event, &event->xclient, - sizeof(XClientMessageEvent)); - } else { - post_process_client_message(&event->xclient, status, type); - } - - return True; -} - -static Boolean -register_xdnd_drop_site(Display* dpy, Window toplevel, Window window) { - unsigned char ret; - Atom version_atom = XDND_PROTOCOL_VERSION; - - ret = checked_XChangeProperty(dpy, window, XA_XdndAware, XA_ATOM, 32, - PropModeReplace, - (unsigned char*)&version_atom, 1); - - return (ret == Success); -} - -static Boolean -register_motif_drop_site(Display* dpy, Window toplevel, Window window) { - unsigned char status; - size_t data_size = MOTIF_RECEIVER_INFO_SIZE; - char* data = malloc(data_size); - void* p = data; - - if (data == NULL) { - DTRACE_PRINTLN2("%s:%d malloc failed.", __FILE__, __LINE__); - return False; - } - - write_card8(&p, MOTIF_BYTE_ORDER); - write_card8(&p, MOTIF_DND_PROTOCOL_VERSION); /* protocol version */ - write_card8(&p, MOTIF_DYNAMIC_STYLE); /* protocol style */ - write_card8(&p, 0); /* pad */ - write_card32(&p, window); /* proxy window */ - write_card16(&p, 0); /* num_drop_sites */ - write_card16(&p, 0); /* pad */ - write_card32(&p, data_size); - - status = checked_XChangeProperty(dpy, window, _XA_MOTIF_DRAG_RECEIVER_INFO, - _XA_MOTIF_DRAG_RECEIVER_INFO, 8, PropModeReplace, - (unsigned char*)data, data_size); - - free(data); - - return (status == Success); -} - -static Window -find_toplevel_window(Display* dpy, Window window) { - Window ret = None; - Window root = None; - Window parent = None; - Window *children; - unsigned int nchildren; - - int status; - - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - /* Traverse the ancestor tree from window up to the root and find - the top-level client window nearest to the root. */ - do { - type = None; - - data = NULL; - status = XGetWindowProperty(dpy, window, XA_WM_STATE, 0, 0, False, - AnyPropertyType, &type, &format, &nitems, - &after, &data); - - if (status == Success) { - XFree(data); - } - - if (type != None) { - ret = window; - } - - if (!XQueryTree(dpy, window, &root, &parent, &children, &nchildren)) { - return None; - } - - XFree(children); - - window = parent; - } while (window != root); - - return ret; -} - -static Boolean -register_drop_site(Widget outer_canvas, XtPointer componentRef) { - Display* dpy = XtDisplay(outer_canvas); - Widget shell = NULL; - /* Shell window. */ - Window window = None; - Window root = None; - Window toplevel = None; - - for (shell = outer_canvas; shell != NULL && !XtIsShell(shell); - shell = XtParent(shell)); - - if (shell == NULL || !XtIsRealized(shell)) { - DTRACE_PRINTLN2("%s:%d Cannot find a realized shell for the widget.", - __FILE__, __LINE__); - return False; - } - - window = XtWindow(shell); - - if (!awt_dnd_init(dpy)) { - DTRACE_PRINTLN2("%s:%d Fail to initialize.", __FILE__, __LINE__); - return False; - } - - { - XWindowAttributes xwa; - - if (!XGetWindowAttributes(dpy, window, &xwa)) { - DTRACE_PRINTLN2("%s:%d XGetWindowAttributes failed.", __FILE__, __LINE__); - return False; - } - - root = xwa.root; - - if (root == None) { - DTRACE_PRINTLN2("%s:%d Bad root.", __FILE__, __LINE__); - return False; - } - } - - toplevel = find_toplevel_window(dpy, window); - - /* - * No window with WM_STATE property is found. - * Since the window can be a plugin window reparented to the browser - * toplevel, we cannot determine which window will eventually have WM_STATE - * property set. So we schedule a timer callback that will periodically - * attempt to find an ancestor with WM_STATE and register the drop site - * appropriately. - */ - if (toplevel == None) { - add_delayed_registration_entry(outer_canvas, componentRef); - return False; - } - - if (toplevel == window) { - Boolean xdnd_registered = False; - Boolean motif_registered = False; - - xdnd_registered = register_xdnd_drop_site(dpy, toplevel, window); - - motif_registered = register_motif_drop_site(dpy, toplevel, window); - - if (!xdnd_registered && !motif_registered) { - DTRACE_PRINTLN2("%s:%d Failed to register.", __FILE__, __LINE__); - return False; - } - } else { - if (!add_to_embedded_drop_site_list(dpy, root, toplevel, window)) { - DTRACE_PRINTLN2("%s:%d Failed to init proxy.", __FILE__, __LINE__); - return False; - } - } - - /* There is no need to update the window for the component later, since the - window is destroyed only when the component is disposed in which case the - drop site will be unregistered as well. */ - if (add_to_drop_site_list(window, root, toplevel, XtWindow(outer_canvas), - (jobject)componentRef)) { - DTRACE_PRINTLN2("%s:%d Drop site registered.", __FILE__, __LINE__); - return True; - } else { - DTRACE_PRINTLN2("%s:%d Failed to register.", __FILE__, __LINE__); - return False; - } -} - -static void -register_drop_site_when_realized(Widget outer_canvas, XtPointer client_data, - XEvent *event, Boolean *dontSwallow) { - if (XtIsRealized(outer_canvas)) { - XtRemoveEventHandler(outer_canvas, StructureNotifyMask, False, - register_drop_site_when_realized, client_data); - - register_drop_site(outer_canvas, client_data); - } -} - -/* - * Registers the top-level Window that contains the specified widget as a drop - * site that supports XDnD and Motif DnD protocols. - * If the registration fails for some reason, adds an event handler that will - * attempt to register the drop site later. - * - * Returns True if the drop site is registered successfully. - */ -static Boolean -awt_dnd_register_drop_site(Widget outer_canvas, XtPointer componentRef) { - if (XtIsRealized(outer_canvas)) { - return register_drop_site(outer_canvas, componentRef); - } else { - XtAddEventHandler(outer_canvas, StructureNotifyMask, False, - register_drop_site_when_realized, - componentRef); - - DTRACE_PRINTLN2("%s:%d Unrealized shell. Register later.", - __FILE__, __LINE__); - - return True; - } -} - -/* - * Unregisters the drop site associated with the top-level Window that contains - * the specified widget . - * - * Returns True if completes successfully, False otherwise. - */ -static Boolean -awt_dnd_unregister_drop_site(Widget outer_canvas, XtPointer componentRef) { - Widget shell = NULL; - - XtRemoveEventHandler(outer_canvas, StructureNotifyMask, False, - register_drop_site_when_realized, componentRef); - - remove_delayed_registration_entry(outer_canvas); - - for (shell = outer_canvas; shell != NULL && !XtIsShell(shell); - shell = XtParent(shell)); - - if (shell != NULL && XtIsShell(shell) && XtIsRealized(shell)) { - Window win = XtWindow(shell); - Window toplevel = get_toplevel_for_window(win); - /* - * Cleanup the global state if this drop site participate in the current - * drag operation. Particularly, this allows to delete global ref to the - * component safely. - */ - if (get_component_for_window(win) == target_component) { - awt_dnd_cleanup(); - } - if (toplevel != win) { - remove_from_embedded_drop_site_list(awt_display, toplevel, win); - } - return remove_from_drop_site_list(win); - } - - return True; -} - -/**************************** XEmbed server DnD support ***********************/ - -/* - * - * - */ -Boolean -register_xembed_drop_site(JNIEnv* env, Display* dpy, jobject server, - Window serverHandle, Window clientHandle) { - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char* data; - unsigned char ret; - unsigned int protocol_version; - - Window xdnd_proxy = None; - unsigned int xdnd_protocol_version = 0; - Boolean xdnd_override = False; - - if (!awt_dnd_init(dpy)) { - DTRACE_PRINTLN2("%s:%d Fail to initialize.", __FILE__, __LINE__); - return False; - } - - /* Get the XDnD protocol version and XDnD proxy of the XEmbed client. */ - data = NULL; - ret = checked_XGetWindowProperty(dpy, clientHandle, XA_XdndAware, 0, 1, - False, AnyPropertyType, &type, &format, - &nitems, &after, &data); - - /* XEmbed client doesn't have an associated XDnD drop site - - do nothing and return True to indicate success. */ - if (ret != Success || data == NULL || nitems == 0 || type != XA_ATOM) { - XFree(data); - return False; - } - - protocol_version = *((unsigned int*)data); - - XFree(data); - - if (protocol_version < XDND_MIN_PROTOCOL_VERSION) { - return False; - } - - xdnd_protocol_version = protocol_version; - - /* XdndProxy is not supported prior to XDnD version 4 */ - if (protocol_version >= 4) { - int status; - - data = NULL; - status = XGetWindowProperty(dpy, clientHandle, XA_XdndProxy, 0, 1, - False, XA_WINDOW, &type, &format, - &nitems, &after, &data); - - if (status == Success && data != NULL && type == XA_WINDOW) { - xdnd_proxy = *((Window*)data); - - if (xdnd_proxy != None) { - XFree(data); - - data = NULL; - status = XGetWindowProperty(dpy, xdnd_proxy, XA_XdndProxy, - 0, 1, False, XA_WINDOW, &type, - &format, &nitems, &after, - &data); - - if (status != Success || data == NULL || type != XA_WINDOW || - *((Window*)data) != xdnd_proxy) { - /* Ignore invalid proxy. */ - xdnd_proxy = None; - } - } - - if (xdnd_proxy != None) { - XFree(data); - - data = NULL; - status = XGetWindowProperty(dpy, xdnd_proxy, XA_XdndAware, 0, 1, - False, AnyPropertyType, &type, - &format, &nitems, &after, &data); - - if (status == Success && data != NULL && type == XA_ATOM) { - unsigned int proxy_version = *((unsigned int*)data); - - if (proxy_version != protocol_version) { - /* Ignore invalid proxy. */ - xdnd_proxy = None; - } - } else { - /* Ignore invalid proxy. */ - xdnd_proxy = None; - } - } - } - - XFree(data); - } - - set_xembed_drop_target(env, server); - - /* Add protocol specific entries for the embedded window. */ - /* Only XDnD protocol is supported for XEmbed clients. */ - { - EmbeddedDropSiteProtocolListEntry* xdnd_entry = NULL; - - xdnd_entry = malloc(sizeof(EmbeddedDropSiteProtocolListEntry)); - - if (xdnd_entry == NULL) { - return False; - } - - xdnd_entry->window = clientHandle; - xdnd_entry->proxy = xdnd_proxy; - xdnd_entry->protocol_version = xdnd_protocol_version; - xdnd_entry->overriden = True; - xdnd_entry->next = embedded_xdnd_protocol_list; - embedded_xdnd_protocol_list = xdnd_entry; - } - - { - EmbeddedDropSiteListEntry* entry = NULL; - Window* sites = NULL; - - entry = malloc(sizeof(EmbeddedDropSiteListEntry)); - - if (entry == NULL) { - return False; - } - - sites = malloc(sizeof(Window)); - - if (sites == NULL) { - free(entry); - return False; - } - - sites[0] = clientHandle; - - entry->toplevel = serverHandle; - entry->root = None; - entry->event_mask = 0; - entry->embedded_sites_count = 1; - entry->embedded_sites = sites; - entry->next = embedded_drop_site_list; - embedded_drop_site_list = entry; - } - - return True; -} - -Boolean -unregister_xembed_drop_site(JNIEnv* env, Display* dpy, jobject server, - Window serverHandle, Window clientHandle) { - remove_from_embedded_drop_site_list(dpy, serverHandle, clientHandle); - return True; -} - -void -forward_event_to_embedded(Window embedded, jlong ctxt, jint eventID) { - static XClientMessageEvent* prevMessage = NULL; - static Boolean overXEmbedClient = False; - - XClientMessageEvent* xclient = - (XClientMessageEvent*)jlong_to_ptr(ctxt); - - if (xclient == NULL && prevMessage == NULL) { - return; - } - - if (xclient != NULL) { - /* - * NOTE: this check guarantees that prevMessage will always be an XDnD - * drag message. - */ - if (!is_xdnd_drag_message_type(xclient->message_type)) { - return; - } - - if (!overXEmbedClient) { - long* appended_data = jlong_to_ptr(ctxt) + - sizeof(XClientMessageEvent); - - /* Copy XdndTypeList from source to proxy. */ - if ((appended_data[0] & XDND_DATA_TYPES_BIT) != 0) { - unsigned char ret; - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - data = NULL; - ret = checked_XGetWindowProperty(xclient->display, - xclient->data.l[0], - XA_XdndTypeList, 0, 0xFFFF, - False, XA_ATOM, &type, &format, - &nitems, &after, &data); - - /* Ignore the source if the window is destroyed. */ - if (ret == BadWindow) { - return; - } - - if (ret == Success) { - if (type == XA_ATOM && format == 32) { - ret = checked_XChangeProperty(xclient->display, - xclient->window, - XA_XdndTypeList, XA_ATOM, - 32, PropModeReplace, data, - nitems); - } - - XFree(data); - } - } - - set_proxy_mode_source_window(xclient->data.l[0]); - - { - XClientMessageEvent enter; - enter.display = xclient->display; - enter.type = ClientMessage; - enter.window = embedded; - enter.format = 32; - enter.message_type = XA_XdndEnter; - - enter.data.l[0] = xclient->window; /* XID of the source window */ - enter.data.l[1] = appended_data[0]; - enter.data.l[2] = appended_data[1]; - enter.data.l[3] = appended_data[2]; - enter.data.l[4] = appended_data[3]; - - forward_client_message_to_toplevel(embedded, &enter); - } - - overXEmbedClient = True; - } - - /* Make a copy of the original event, since we are going to modify the - event while it still can be referenced from other Java events. */ - { - XClientMessageEvent copy; - memcpy(©, xclient, sizeof(XClientMessageEvent)); - copy.data.l[0] = xclient->window; - - forward_client_message_to_toplevel(embedded, ©); - } - } - - if (eventID == java_awt_event_MouseEvent_MOUSE_EXITED) { - if (overXEmbedClient) { - if (xclient != NULL || prevMessage != NULL) { - /* Last chance to send XdndLeave to the XEmbed client. */ - XClientMessageEvent leave; - - leave.display = xclient != NULL ? - xclient->display : prevMessage->display; - leave.type = ClientMessage; - leave.window = embedded; - leave.format = 32; - leave.message_type = XA_XdndLeave; - leave.data.l[0] = xclient != NULL ? - xclient->window : prevMessage->window; /* XID of the source window */ - leave.data.l[1] = 0; /* flags */ - - forward_client_message_to_toplevel(embedded, &leave); - } - overXEmbedClient = False; - } - } - - if (eventID == java_awt_event_MouseEvent_MOUSE_RELEASED) { - overXEmbedClient = False; - awt_dnd_cleanup(); - } - - if (prevMessage != 0) { - free(prevMessage); - prevMessage = 0; - } - - if (xclient != 0 && overXEmbedClient) { - prevMessage = malloc(sizeof(XClientMessageEvent)); - - memcpy(prevMessage, xclient, sizeof(XClientMessageEvent)); - } -} - -/******************************************************************************/ - -/* - * Class: sun_awt_motif_MWindowPeer - * Method: registerX11DropTarget - * Signature: (Ljava/awt/Component;)V - */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MWindowPeer_registerX11DropTarget(JNIEnv *env, jobject this, - jobject target) { - struct FrameData* wdata = NULL; - DropSitePtr dsi = NULL; - - wdata = (struct FrameData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (wdata == NULL || wdata->winData.comp.widget == NULL) { - JNU_ThrowNullPointerException(env, "NULL component data"); - return; - } - - if (wdata->winData.shell == NULL) { - JNU_ThrowNullPointerException(env, "Null shell widget"); - return; - } - - DASSERT(wdata->winData.comp.dsi == NULL); - - dsi = (DropSitePtr)calloc(1, sizeof(struct DropSiteInfo)); - - if (dsi == NULL) { - JNU_ThrowOutOfMemoryError(env, ""); - return; - } - - dsi->component = (*env)->NewGlobalRef(env, target); - dsi->isComposite = False; - - wdata->winData.comp.dsi = dsi; - - AWT_LOCK(); - - awt_dnd_register_drop_site(wdata->winData.comp.widget, - dsi->component); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MWindowPeer - * Method: unregisterX11DropTarget - * Signature: (Ljava/awt/Component;)V - */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_MWindowPeer_unregisterX11DropTarget(JNIEnv *env, - jobject this, - jobject target) { - struct FrameData* wdata = NULL; - DropSitePtr dsi = NULL; - - wdata = (struct FrameData *) - JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); - - if (wdata == NULL) { - JNU_ThrowNullPointerException(env, "Null component data"); - return; - } - - if (wdata->winData.shell == NULL) { - JNU_ThrowNullPointerException(env, "Null shell widget"); - return; - } - - dsi = wdata->winData.comp.dsi; - - if (dsi == NULL) { - JNU_ThrowNullPointerException(env, "Null DropSiteInfo"); - return; - } - - AWT_LOCK(); - - awt_dnd_unregister_drop_site(wdata->winData.comp.widget, dsi->component); - - AWT_UNLOCK(); - - wdata->winData.comp.dsi = NULL; - - (*env)->DeleteGlobalRef(env, dsi->component); - - free(dsi); -} - -static void -dt_send_event_to_source(XClientMessageEvent* xclient) { - /* Shortcut if the source is in the same JVM. */ - if (xclient->window == awt_dnd_ds_get_source_window()) { - awt_dnd_ds_process_event((XEvent*)xclient); - } else { - unsigned char ret; - - ret = checked_XSendEvent(xclient->display, xclient->window, False, - NoEventMask, (XEvent*)xclient); - - if (ret == BadWindow) { - DTRACE_PRINTLN2("%s:%d XSendEvent - invalid window.", - __FILE__, __LINE__); - - /* Cleanup if we are still communicating with this window. */ - if (source_window == xclient->window) { - awt_dnd_cleanup(); - } - } - } -} - -static void -dt_send_response(XClientMessageEvent* xclient, jint eventID, jint action) { - Display* dpy = xclient->display; - XClientMessageEvent response; - - if (xclient->message_type == XA_XdndPosition) { - long* event_data = xclient->data.l; - - if (eventID == java_awt_event_MouseEvent_MOUSE_EXITED) { - action = java_awt_dnd_DnDConstants_ACTION_NONE; - } - - response.display = dpy; - response.type = ClientMessage; - response.window = event_data[0]; - response.format = 32; - response.message_type = XA_XdndStatus; - /* target window */ - response.data.l[0] = xclient->window; - /* flags */ - response.data.l[1] = 0; - if (action != java_awt_dnd_DnDConstants_ACTION_NONE) { - response.data.l[1] |= XDND_ACCEPT_DROP_FLAG; - } - /* specify an empty rectangle */ - response.data.l[2] = 0; /* x, y */ - response.data.l[3] = 0; /* w, h */ - /* action accepted by the target */ - response.data.l[4] = java_to_xdnd_action(action); - } else if (xclient->message_type == _XA_MOTIF_DRAG_AND_DROP_MESSAGE) { - int reason = (int)(xclient->data.b[0] & MOTIF_MESSAGE_REASON_MASK); - int origin = (int)(xclient->data.b[0] & MOTIF_MESSAGE_SENDER_MASK); - unsigned char byte_order = xclient->data.b[1]; - CARD16 response_flags = 0; - CARD8 response_reason = 0; - void* p = &response.data.b; - - /* Only initiator messages should be handled. */ - if (origin != MOTIF_MESSAGE_FROM_INITIATOR) { - DTRACE_PRINTLN2("%s:%d Receiver message.", __FILE__, __LINE__); - return; - } - - switch (reason) { - case DRAG_MOTION: - switch (eventID) { - case java_awt_event_MouseEvent_MOUSE_ENTERED: - response_reason = DROP_SITE_ENTER; - break; - case java_awt_event_MouseEvent_MOUSE_DRAGGED: - response_reason = DRAG_MOTION; - break; - case java_awt_event_MouseEvent_MOUSE_EXITED: - response_reason = DROP_SITE_LEAVE; - break; - } - } - - response.display = dpy; - response.type = ClientMessage; - response.window = read_card32(xclient->data.b, 12, byte_order); - response.format = 8; - response.message_type = _XA_MOTIF_DRAG_AND_DROP_MESSAGE; - - write_card8(&p, response_reason | MOTIF_MESSAGE_FROM_RECEIVER); - write_card8(&p, MOTIF_BYTE_ORDER); - - if (response_reason != DROP_SITE_LEAVE) { - CARD16 flags = read_card16(xclient->data.b, 2, byte_order); - unsigned char drop_site_status = - (action == java_awt_dnd_DnDConstants_ACTION_NONE) ? - MOTIF_INVALID_DROP_SITE : MOTIF_VALID_DROP_SITE; - - /* Clear action and drop site status bits. */ - response_flags = - flags & ~MOTIF_DND_ACTION_MASK & ~MOTIF_DND_STATUS_MASK; - - /* Fill in new action and drop site status. */ - response_flags |= - java_to_motif_actions(action) << MOTIF_DND_ACTION_SHIFT; - response_flags |= - drop_site_status << MOTIF_DND_STATUS_SHIFT; - } else { - response_flags = 0; - } - - write_card16(&p, response_flags); - - /* Write time stamp. */ - write_card32(&p, read_card32(xclient->data.b, 4, byte_order)); - - /* Write coordinates. */ - if (response_reason != DROP_SITE_LEAVE) { - write_card16(&p, read_card16(xclient->data.b, 8, byte_order)); - write_card16(&p, read_card16(xclient->data.b, 10, byte_order)); - } else { - write_card16(&p, 0); - write_card16(&p, 0); - } - } else { - return; - } - - dt_send_event_to_source(&response); -} - -static void -dummy_selection_callback(Widget w, XtPointer client_data, Atom* selection, - Atom* type, XtPointer value, unsigned long *length, - int32_t *format) { - /* The selection callback is responsible for freeing the data. */ - if (value != NULL) { - XtFree(value); - value = NULL; - } -} - -static void -dt_notify_drop_done(JNIEnv* env, XClientMessageEvent* xclient, jboolean success, - jint action) { - if (xclient->message_type == XA_XdndDrop) { - Display* dpy = xclient->display; - XClientMessageEvent finished; - long* event_data = xclient->data.l; - - /* - * The XDnD protocol recommends that the target requests the special - * target DELETE in case if the drop action is XdndActionMove. - */ - if (action == java_awt_dnd_DnDConstants_ACTION_MOVE && - success == JNI_TRUE) { - - Time time_stamp = event_data[2]; - - XtGetSelectionValue(awt_root_shell, XA_XdndSelection, XA_DELETE, - dummy_selection_callback, NULL, time_stamp); - } - - finished.display = dpy; - finished.type = ClientMessage; - finished.window = event_data[0]; - finished.format = 32; - finished.message_type = XA_XdndFinished; - finished.data.l[0] = xclient->window; - finished.data.l[1] = 0; /* flags */ - finished.data.l[2] = None; - if (source_protocol_version >= 5) { - if (success == JNI_TRUE) { - finished.data.l[1] |= XDND_ACCEPT_DROP_FLAG; - } - finished.data.l[2] = java_to_xdnd_action(action); - } - - dt_send_event_to_source(&finished); - } else if (xclient->message_type == _XA_MOTIF_DRAG_AND_DROP_MESSAGE) { - char* event_data = xclient->data.b; - unsigned char event_byte_order = read_card8(event_data, 1); - unsigned char first_byte = read_card8(event_data, 0); - unsigned char reason = first_byte & MOTIF_MESSAGE_REASON_MASK; - unsigned char origin = first_byte & MOTIF_MESSAGE_SENDER_MASK; - Atom selection = None; - Time time_stamp = CurrentTime; - Atom status_atom = None; - - if (origin != MOTIF_MESSAGE_FROM_INITIATOR) { - DTRACE_PRINTLN2("%s:%d Invalid origin.", __FILE__, __LINE__); - return; - } - - if (reason != DROP_START) { - DTRACE_PRINTLN2("%s:%d Invalid reason.", __FILE__, __LINE__); - return; - } - - selection = read_card32(event_data, 12, event_byte_order); - time_stamp = read_card32(event_data, 4, event_byte_order); - - if (success == JNI_TRUE) { - status_atom = XA_XmTRANSFER_SUCCESS; - } else { - status_atom = XA_XmTRANSFER_FAILURE; - } - - /* - * This is just the way to communicate the drop completion status back - * to the initiator as prescribed by the Motif DnD protocol. - */ - XtGetSelectionValue(awt_root_shell, selection, status_atom, - dummy_selection_callback, NULL, time_stamp); - } - - /* - * Flush the buffer to guarantee that the drop completion event is sent - * to the source before the method returns. - */ - XFlush(awt_display); - - /* Trick to prevent awt_dnd_cleanup() from posting dragExit */ - target_component = NULL; - /* Cannot do cleanup before the drop finishes as we need source protocol - version to send XdndFinished message. */ - awt_dnd_cleanup(); -} - -/* - * Class: sun_awt_motif_X11DropTargetContextPeer - * Method: sendResponse - * Signature: (IIJZ)V - */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_X11DropTargetContextPeer_sendResponse(JNIEnv *env, - jobject this, - jint eventID, - jint action, - jlong nativeCtxt, - jboolean dispatcherDone, - jboolean consumed) { - XClientMessageEvent* xclient = - (XClientMessageEvent*)jlong_to_ptr(nativeCtxt); - - AWT_LOCK(); - - if (consumed == JNI_FALSE) { - dt_send_response(xclient, eventID, action); - } - - /* - * Free the native context only if all copies of the original event are - * processed. - */ - if (dispatcherDone == JNI_TRUE) { - XtFree((char*)xclient); - } - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_X11DropTargetContextPeer - * Method: dropDone - * Signature: (JZI)V - */ - -JNIEXPORT void JNICALL -Java_sun_awt_motif_X11DropTargetContextPeer_dropDone(JNIEnv *env, - jobject this, - jlong nativeCtxt, - jboolean success, - jint action) { - XClientMessageEvent* xclient = - (XClientMessageEvent*)jlong_to_ptr(nativeCtxt); - - AWT_LOCK(); - - dt_notify_drop_done(env, xclient, success, action); - - XtFree((char*)xclient); - - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_X11DropTargetContextPeer - * Method: getData - * Signature: (IJ)Ljava/lang/Object; - */ - -JNIEXPORT jobject JNICALL -Java_sun_awt_motif_X11DropTargetContextPeer_getData(JNIEnv *env, - jobject this, - jlong nativeCtxt, - jlong formatAtom) { - XClientMessageEvent* xclient = - (XClientMessageEvent*)jlong_to_ptr(nativeCtxt); - - Atom selection = None; - Time time_stamp = CurrentTime; - Atom target = (Atom)formatAtom; - - if (xclient->message_type == XA_XdndDrop || - xclient->message_type == XA_XdndPosition) { - Display* dpy = xclient->display; - Window source_win = xclient->data.l[0]; - Atom protocol_version = 0; - - int status; - - Atom type; - int format; - unsigned long nitems; - unsigned long after; - unsigned char *data; - - AWT_LOCK(); - - data = NULL; - status = XGetWindowProperty(dpy, source_win, XA_XdndAware, 0, 0xFFFF, - False, XA_ATOM, &type, &format, &nitems, - &after, &data); - - if (status == Success && data != NULL && type == XA_ATOM && format == 32 - && nitems > 0) { - protocol_version = (protocol_version > XDND_PROTOCOL_VERSION) ? - XDND_PROTOCOL_VERSION : protocol_version; - - if (protocol_version > 0) { - if (xclient->message_type == XA_XdndDrop) { - time_stamp = xclient->data.l[2]; - } else if (xclient->message_type == XA_XdndPosition) { - time_stamp = xclient->data.l[3]; - } - } - } - - if (status == Success) { - XFree(data); - data = NULL; - } - - AWT_FLUSH_UNLOCK(); - - selection = XA_XdndSelection; - if (time_stamp == CurrentTime) { - time_stamp = awt_util_getCurrentServerTime(); - } - - } else if (xclient->message_type == _XA_MOTIF_DRAG_AND_DROP_MESSAGE) { - char* event_data = xclient->data.b; - unsigned char event_byte_order = read_card8(event_data, 1); - unsigned char first_byte = read_card8(event_data, 0); - unsigned char reason = first_byte & MOTIF_MESSAGE_REASON_MASK; - unsigned char origin = first_byte & MOTIF_MESSAGE_SENDER_MASK; - - if (origin != MOTIF_MESSAGE_FROM_INITIATOR) { - DTRACE_PRINTLN2("%s:%d Invalid origin.", __FILE__, __LINE__); - return NULL; - } - - switch (reason) { - case DROP_START: - selection = read_card32(event_data, 12, event_byte_order); - break; - case DRAG_MOTION: - case OPERATION_CHANGED: - selection = source_atom; - break; - default: - DTRACE_PRINTLN2("%s:%d Invalid reason.", __FILE__, __LINE__); - return NULL; - } - - if (selection == None) { - return NULL; - } - - time_stamp = read_card32(event_data, 4, event_byte_order); - } else { - return NULL; - } - - return get_selection_data(env, selection, target, time_stamp); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_motif.c --- a/jdk/src/solaris/native/sun/awt/awt_motif.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/* - * Copyright 2000-2002 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_motif.h" - -#include - -/* Common routines required for both Motif 2.1 and Motif 1.2 */ -#include - -/* Remove the ScrollBar widget's continuous scrolling timeout handler - on a ButtonRelease to prevent the continuous scrolling that would - occur if a timeout expired after the ButtonRelease. -*/ -/* - * Note: RFE:4263104 is filed when the API is available these needs to removed - */ -void -awt_motif_Scrollbar_ButtonReleaseHandler(Widget w, - XtPointer data, - XEvent *event, - Boolean *cont) -{ - /* Remove the timeout handler. */ -#define END_TIMER (1<<2) - XmScrollBarWidget sbw = (XmScrollBarWidget) w; - if (sbw->scrollBar.timer != NULL) { - XtRemoveTimeOut( sbw->scrollBar.timer ); - sbw->scrollBar.timer = (XtIntervalId)NULL; - sbw->scrollBar.flags |= END_TIMER; - } -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_motif12.c --- a/jdk/src/solaris/native/sun/awt/awt_motif12.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,435 +0,0 @@ -/* - * Copyright 2000-2001 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. - */ - -#if MOTIF_VERSION!=1 - #error This file should only be compiled with motif 1.2 -#endif - -#include "awt_motif.h" -#include -#include -#include "debug_util.h" -#include "awt.h" - -/* - * awt_motif_getIMStatusHeight is a cut and paste of the ImGetGeo() function - * found in CDE Motif's Xm/XmIm.c. It returns the height of the Input Method - * Status region attached to the given VendorShell. This is needed in order - * to calculate geometry for Frames and Dialogs that contain TextField or - * TextArea widgets. - * - * BCB: Copying this function out of the Motif source is a horrible - * hack. Unfortunately, Motif tries to hide the existence of the IM Status - * region from us so it does not provide any public way to get this info. - * Clearly a better long term solution needs to be found. - */ - -typedef struct _XmICStruct { - struct _XmICStruct *next; - Widget icw; - Window focus_window; - XtArgVal foreground; - XtArgVal background; - XtArgVal background_pixmap; - XtArgVal font_list; - XtArgVal line_space; - int32_t status_width; - int32_t status_height; - int32_t preedit_width; - int32_t preedit_height; - Boolean has_focus; - Boolean need_reset; -} XmICStruct; - -typedef struct { - Widget im_widget; - XIMStyle input_style; - XIC xic; - int32_t status_width; - int32_t status_height; - int32_t preedit_width; - int32_t preedit_height; - XmICStruct *iclist; - XmICStruct *current; -} XmImInfo; - -static XFontSet extract_fontset(XmFontList); -static XmICStruct *get_iclist(Widget); - -#define MAXARGS 10 -static Arg xic_vlist[MAXARGS]; -static Arg status_vlist[MAXARGS]; -static Arg preedit_vlist[MAXARGS]; - -#define NO_ARG_VAL -1 -#define SEPARATOR_HEIGHT 2 - - -#ifdef MOTIF_2_1_HACK -/* To shut up warning messages from "cc -v" - * Copied from Solaris 2.6 /usr/dt/include/Xm/BaseClassP.h and not - * there in Solaris 7. - */ -#if defined(__SunOS_5_7) || defined(__SunOS_5_8) -extern XmWidgetExtData _XmGetWidgetExtData(Widget, unsigned char); -#endif - -#else - -/* - The following defines are to make the XmImGetXIC to compile on systems - lower than SunOS 5.7, so therefore the following is a copy of the - defines on SunOS 5.7/Motif2.1 header files. -*/ -/*#if defined (__SunOS_5_5_1) || defined (__SunOS_5_6)*/ -#define XmPER_SHELL 0 - -extern XIC XmImGetXIC( - Widget w, - unsigned int input_policy, - ArgList args, - Cardinal num_args) ; -#endif - -static XmICStruct * -get_iclist(Widget w) -{ - Widget p; - XmVendorShellExtObject ve; - XmWidgetExtData extData; - XmImInfo *im_info; - - p = w; - while (!XtIsShell(p)) - p = XtParent(p); - - extData = (XmWidgetExtData)_XmGetWidgetExtData((Widget) p, XmSHELL_EXTENSION); - if (extData == NULL) - return NULL; - - ve = (XmVendorShellExtObject) extData->widget; - if ((im_info = (XmImInfo *) ve->vendor.im_info) == NULL) - return NULL; - else - return im_info->iclist; -} - -int32_t -awt_motif_getIMStatusHeight(Widget vw, jobject tc) -{ - XmICStruct *icp; - XmVendorShellExtObject ve; - XmWidgetExtData extData; - XmImInfo *im_info; - int32_t width = 0; - int32_t height = 0; - XRectangle rect; - XRectangle *rp; - int32_t old_height; - Arg args[1]; - int32_t base_height; - XFontSet fs; - XFontSet fss = NULL; - XFontSet fsp = NULL; - - extData = (XmWidgetExtData)_XmGetWidgetExtData((Widget) vw, XmSHELL_EXTENSION); - ve = (XmVendorShellExtObject) extData->widget; - - if ((icp = get_iclist(vw)) == NULL) { - ve->vendor.im_height = 0; - return 0; - } - im_info = (XmImInfo *) ve->vendor.im_info; - if (im_info->xic == NULL) { - ve->vendor.im_height = 0; - return 0; - } - status_vlist[0].name = XNFontSet; - status_vlist[1].name = NULL; - preedit_vlist[0].name = XNFontSet; - preedit_vlist[1].name = NULL; - - xic_vlist[0].name = XNAreaNeeded; - xic_vlist[1].name = NULL; - - im_info->status_width = 0; - im_info->status_height = 0; - im_info->preedit_width = 0; - im_info->preedit_height = 0; - for (; icp != NULL; icp = icp->next) { - if (im_info->input_style & XIMStatusArea) { - if (icp->status_height == 0) { - char *ret; - - if (icp->font_list == NO_ARG_VAL || - (fss = extract_fontset((XmFontList) icp->font_list)) == NULL) - continue; - - status_vlist[0].value = (XtArgVal) fss; - XSetICValues(im_info->xic, - XNStatusAttributes, &status_vlist[0], - NULL); - - xic_vlist[0].value = (XtArgVal) & rp; - ret = XGetICValues(im_info->xic, - XNStatusAttributes, &xic_vlist[0], - NULL); - - if (ret) { - /* Cannot obtain XIC value. IM server may be gone. */ - ve->vendor.im_height = 0; - return 0; - } else { - icp->status_width = rp->width; - icp->status_height = rp->height; - XFree(rp); - } - } - if (icp->status_width > im_info->status_width) - im_info->status_width = icp->status_width; - if (icp->status_height > im_info->status_height) - im_info->status_height = icp->status_height; - } - if (im_info->input_style & XIMPreeditArea) { - if (icp->preedit_height == 0) { - if (icp->font_list == NO_ARG_VAL || - (fsp = extract_fontset((XmFontList) icp->font_list)) == NULL) - continue; - - preedit_vlist[0].value = (XtArgVal) fsp; - XSetICValues(im_info->xic, - XNPreeditAttributes, &preedit_vlist[0], - NULL); - - xic_vlist[0].value = (XtArgVal) & rp; - XGetICValues(im_info->xic, - XNPreeditAttributes, &xic_vlist[0], - NULL); - - icp->preedit_width = rp->width; - icp->preedit_height = rp->height; - XFree(rp); - } - if (icp->preedit_width > im_info->preedit_width) - im_info->preedit_width = icp->preedit_width; - if (icp->preedit_height > im_info->preedit_height) - im_info->preedit_height = icp->preedit_height; - } - } - - if (im_info->current != NULL && (fss != NULL || fsp != NULL)) { - if (im_info->current->font_list != NO_ARG_VAL && - (fs = extract_fontset((XmFontList) im_info->current->font_list)) - != NULL) { - if (fss != NULL) - status_vlist[0].value = (XtArgVal) fs; - else - status_vlist[0].name = NULL; - if (fsp != NULL) - preedit_vlist[0].value = (XtArgVal) fs; - else - preedit_vlist[0].name = NULL; - XSetICValues(im_info->xic, - XNStatusAttributes, &status_vlist[0], - XNPreeditAttributes, &preedit_vlist[0], - NULL); - } - } - if (im_info->status_height > im_info->preedit_height) - height = im_info->status_height; - else - height = im_info->preedit_height; - old_height = ve->vendor.im_height; - if (height) - height += SEPARATOR_HEIGHT; - - ve->vendor.im_height = height; - - XtSetArg(args[0], XtNbaseHeight, &base_height); - XtGetValues(vw, args, 1); - if (base_height < 0) - base_height = 0; - XtSetArg(args[0], XtNbaseHeight, base_height); - XtSetValues(vw, args, 1); - return height; -} -static XRectangle geometryRect; -XVaNestedList awt_motif_getXICStatusAreaList(Widget w, jobject tc) -{ - Widget p; - XmVendorShellExtObject ve; - XmWidgetExtData extData; - XmImInfo *im_info; - XmICStruct *icp; - - XVaNestedList list = NULL; - XRectangle *ssgeometry = &geometryRect; - Pixel bg; - Pixel fg; - Pixmap bpm; - Dimension height,width; - Position x,y; - - p = w; - while (!XtIsShell(p)){ - p = XtParent(p); - } - - XtVaGetValues(p, - XmNx, &x, - XmNy, &y, - XmNwidth, &width, - XmNheight, &height, - NULL); - - extData = (XmWidgetExtData)_XmGetWidgetExtData((Widget) p, XmSHELL_EXTENSION); - if (extData == NULL) { - return NULL; - } - - ve = (XmVendorShellExtObject) extData->widget; - if ((im_info = (XmImInfo *) ve->vendor.im_info) == NULL) { - return NULL; - } else - icp = im_info->iclist; - - - if (icp) { - /* - * We hava at least a textfield/textarea in the frame, use the - * first one. - */ - ssgeometry->x = 0; - ssgeometry->y = height - icp->status_height; - ssgeometry->width = icp->status_width; - ssgeometry->height = icp->status_height; - - /* - * use motif TextComponent's resource - */ - fg = icp->foreground; - bg = icp->background; - bpm = icp->background_pixmap; - - list = XVaCreateNestedList(0, - XNFontSet, extract_fontset((XmFontList)icp->font_list), - XNArea, ssgeometry, - XNBackground, bg, - XNForeground, fg, - XNBackgroundPixmap, bpm, - NULL); - } - return list ; -} - -static XFontSet -extract_fontset(XmFontList fl) -{ - XmFontContext context; - XmFontListEntry next_entry; - XmFontType type_return; - XtPointer tmp_font; - XFontSet first_fs = NULL; - char *font_tag; - - if (!XmFontListInitFontContext(&context, fl)) - return NULL; - - do { - next_entry = XmFontListNextEntry(context); - if (next_entry) { - tmp_font = XmFontListEntryGetFont(next_entry, &type_return); - if (type_return == XmFONT_IS_FONTSET) { - font_tag = XmFontListEntryGetTag(next_entry); - if (!strcmp(font_tag, XmFONTLIST_DEFAULT_TAG)) { - XmFontListFreeFontContext(context); - XtFree(font_tag); - return (XFontSet) tmp_font; - } - XtFree(font_tag); - if (first_fs == NULL) - first_fs = (XFontSet) tmp_font; - } - } - } while (next_entry); - - XmFontListFreeFontContext(context); - return first_fs; -} - -/* - * Motif 1.2 requires that an X event passed to XmDragStart is of - * ButtonPress type. In Motif 2.1 the restriction is relaxed to allow - * ButtonPress, ButtonRelease, KeyRelease, KeyPress, MotionNotify events - * as drag initiators. Actually the code in Motif 1.2 works okay for these - * events as well, since it uses only the fields that have the same values - * in all five event types. To bypass the initial sanity check in - * XmDragStart we forcibly change event type to ButtonPress. - * - * This function causes an UnsatisfiedLinkError on Linux. - * Since Linux only links against Motif 2.1, we can safely remove - * this function altogether from the Linux build. - * bchristi 1/22/2001 - */ - -#ifdef __solaris__ -void -awt_motif_adjustDragTriggerEvent(XEvent* xevent) { - xevent->type = ButtonPress; -} -#endif /* __solaris__ */ - -static XmDragStartProc do_drag_start = NULL; -static Widget drag_initiator = NULL; - -static void -CheckedDragStart(XmDragContext dc, Widget src, XEvent *event) { - DASSERT(do_drag_start != NULL); - DASSERT(drag_initiator != NULL); - /* - * Fix for BugTraq ID 4407057. - * Enable the drag operation only if it is registered on the specific widget. - * We use this check to disable Motif default drag support. - */ - if (src == drag_initiator) { - do_drag_start(dc, src, event); - } else { - /* - * This is the last chance to destroy the XmDragContext widget. - * NOTE: We rely on the fact that Motif 1.2 never uses the pointer - * to XmDragContext object returned from XmDragStart. - */ - XtDestroyWidget(dc); - } -} - -void -awt_motif_enableSingleDragInitiator(Widget w) { - DASSERT(drag_initiator == NULL && do_drag_start == NULL && w != NULL); - drag_initiator = w; - do_drag_start = xmDragContextClassRec.drag_class.start; - DASSERT(do_drag_start != NULL); - xmDragContextClassRec.drag_class.start = (XmDragStartProc)CheckedDragStart; -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_motif21.c --- a/jdk/src/solaris/native/sun/awt/awt_motif21.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,234 +0,0 @@ -/* - * Copyright 2000-2006 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. - */ - -#if MOTIF_VERSION!=2 - #error This file should only be compiled with motif 2.1 -#endif - -#include "awt_motif.h" -#include -#include "awt.h" -#include "awt_p.h" -#include "awt_Component.h" - -#define XmPER_SHELL 0 -extern int32_t _XmImGetGeo( - Widget vw) ; - -#define MAXARGS 10 -static Arg xic_vlist[MAXARGS]; - -#define SEPARATOR_HEIGHT 2 -#define MTEXTAREAPEER_CLASS_NAME "sun/awt/motif/MTextAreaPeer" -extern struct MComponentPeerIDs mComponentPeerIDs; -static jobject mTextAreaClass = NULL; - -/* - * Get the Motif text widget from the text component peer. XmImGetXIC() - * function should be issued on Motif text widgets. - */ -static Widget getTextWidget(jobject tc) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - if (mTextAreaClass == NULL) { - jclass localClass = (*env)->FindClass(env, MTEXTAREAPEER_CLASS_NAME); - mTextAreaClass = (jclass)(*env)->NewGlobalRef(env, localClass); - (*env)->DeleteLocalRef(env, localClass); - } - - if ((*env)->IsInstanceOf(env, tc, mTextAreaClass)) { - struct TextAreaData * tdata = (struct TextAreaData *) - JNU_GetLongFieldAsPtr(env, tc, mComponentPeerIDs.pData); - return tdata->txt; - } else { - struct ComponentData * tdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, tc, mComponentPeerIDs.pData); - return tdata->widget; - } -} - -/* get_im_height: returns height of the input method status area in pixels. - * - * This function assumes that if any XIM related information cannot be - * queried then the app must not have an input method status area in the - * current locale and returns zero as the status area height - */ -int32_t -awt_motif_getIMStatusHeight(Widget w, jobject tc) -{ - XIC xic = NULL; - XRectangle *im_rect=NULL; - int32_t im_height = 0; - char *ret; - - xic = XmImGetXIC(getTextWidget(tc), XmPER_SHELL, NULL, 0); - - if(xic != NULL) { - /* finally query the server for the status area geometry */ - xic_vlist[0].name = XNArea; - xic_vlist[0].value = (XtArgVal)&im_rect; - xic_vlist[1].name = NULL; - ret=XGetICValues(xic, XNStatusAttributes, &xic_vlist[0], NULL); - if (ret == NULL && im_rect != NULL) { - im_height = im_rect->height; - if (im_height > 0) { - im_height += SEPARATOR_HEIGHT; - } - XFree(im_rect); - } else { - im_height = 0; - } - } - - if (im_height == 0) { - im_height = _XmImGetGeo(w); - } - -#if defined(DEBUG) - jio_fprintf(stderr,"awt_motif_getIMStatusHeight: Height = %d",im_height); -#endif - return im_height; -} - - -static XRectangle geomRect; -static Pixmap bpm; -XVaNestedList awt_motif_getXICStatusAreaList(Widget w, jobject tc) -{ - XIC xic; - - XRectangle *im_rect; - XFontSet *im_font; - - Pixel bg ; - Pixel fg ; - Dimension height, width ; - Position x,y ; - - XVaNestedList list = NULL; - - char *ret; - Widget p=w; - - while (!XtIsShell(p)) { - p = XtParent(p); - } - - XtVaGetValues(p, - XmNx, &x, - XmNy, &y, - XmNwidth, &width, - XmNheight, &height, - XmNbackgroundPixmap, &bpm, - NULL); - - - - xic = XmImGetXIC(getTextWidget(tc), XmPER_SHELL, NULL, 0); - if(xic == NULL) - { -#if defined DEBUG - jio_fprintf(stderr,"Could not get XIC"); -#endif - return list ; - } - - /* finally query the server for the required attributes area geometry */ - xic_vlist[0].name = XNFontSet ; - xic_vlist[0].value = (XtArgVal) &im_font ; - xic_vlist[1].name = XNArea; - xic_vlist[1].value = (XtArgVal) &im_rect; - xic_vlist[2].name = XNBackground ; - xic_vlist[2].value = (XtArgVal) &bg ; - xic_vlist[3].name = XNForeground ; - xic_vlist[3].value = (XtArgVal) &fg ; - xic_vlist[4].name = NULL; - - - if(ret=XGetICValues(xic, XNStatusAttributes, &xic_vlist[0], NULL)) - { - return list ; - } else { - geomRect.x = 0 ; - geomRect.y = height - im_rect->height ; - geomRect.width = im_rect->width ; - geomRect.height = im_rect->height ; - XFree(im_rect) ; - - list = XVaCreateNestedList(0 , - XNFontSet, im_font , - XNArea, &geomRect , - XNBackground, bg , - XNForeground, fg , - XNBackgroundPixmap, &bpm , - NULL ); - } -#if defined(DEBUG) - jio_fprintf(stderr,"awt_motif_getXICStatusAreaList:\n"); - jio_fprintf(stderr,"XNArea:x=%d,y=%d,width=%d,height=%d\n", \ - geomRect.x,geomRect.y,geomRect.width,geomRect.height); - jio_fprintf(stderr,"XNBackground=0x%x\n",bg); - jio_fprintf(stderr,"XNForeground=0x%x\n",fg); - jio_fprintf(stderr,"XNBackgroundPixmap=0x%x\n",bpm); -#endif - return list ; - -} - - /* This function causes an UnsatisfiedLinkError on Linux. - * Since Linux only links against Motif 2.1 and under 2.1 this function - * is a no-op, we can safely remove - * this function altogether from the Linux build. - * bchristi 1/22/2001 - */ - -#ifdef __solaris__ -void -awt_motif_adjustDragTriggerEvent(XEvent* xevent) { - /* Do nothing. In Motif 2.1 the sanity check is corrected - to allow any imput event as a drag trigger event. */ -} -#endif /* __solaris__ */ - -static void -CheckDragInitiator(Widget w, XtPointer client_data, - XmDragStartCallbackStruct* cbstruct) { - Widget drag_initiator = (Widget)client_data; - /* - * Fix for BugTraq ID 4407057. - * Enable the drag operation only if it is registered on the specific - * widget. We use this check to disable Motif default drag support. - */ - if (drag_initiator != cbstruct->widget) { - cbstruct->doit = False; - } -} - -void -awt_motif_enableSingleDragInitiator(Widget w) { - XtAddCallback(XmGetXmDisplay(XtDisplay(w)), - XmNdragStartCallback, (XtCallbackProc)CheckDragInitiator, - (XtPointer)w); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_p.h --- a/jdk/src/solaris/native/sun/awt/awt_p.h Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/native/sun/awt/awt_p.h Mon Aug 25 13:58:15 2008 -0700 @@ -79,7 +79,7 @@ #ifndef XAWT #include "GLXGraphicsConfig.h" -#include +//#include #endif #ifndef HEADLESS diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/awt_xembed.c --- a/jdk/src/solaris/native/sun/awt/awt_xembed.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,430 +0,0 @@ -/* - * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#ifdef HEADLESS - #error This file should not be included in headless library -#endif - -#include "awt_p.h" - -#include -#include -#include -#include - -/* JNI headers */ -#include "java_awt_Frame.h" /* for frame state constants */ - -#include "awt_wm.h" -#include "awt_util.h" /* for X11 error handling macros */ -#include "awt_xembed.h" -#include "awt_MToolkit.h" -#include "awt_DataTransferer.h" /* for DECLARE_XXX macros */ - -#ifdef DOTRACE -#define MTRACE(param) fprintf(myerr, param) -#define MTRACEP1(format, p1) fprintf(myerr, format, p1) -#define MTRACEP2(format, p1, p2) fprintf(myerr, format, p1, p2) -#define MTRACEP3(format, p1, p2, p3) fprintf(myerr, format, p1, p2, p3) -#define MTRACEP4(format, p1, p2, p3, p4) fprintf(myerr, format, p1, p2, p3, p4) -#define MTRACEP5(format, p1, p2, p3, p4, p5) fprintf(myerr, format, p1, p2, p3, p4, p5) -#define MTRACEP6(format, p1, p2, p3, p4, p5, p6) fprintf(myerr, format, p1, p2, p3, p4, p5, p6) -#define MTRACEP7(format, p1, p2, p3, p4, p5, p6, p7) fprintf(myerr, format, p1, p2, p3, p4, p5, p6, p7) -#else -#define MTRACE(param) -#define MTRACEP1(format, p1) -#define MTRACEP2(format, p1, p2) -#define MTRACEP3(format, p1, p2, p3) -#define MTRACEP4(format, p1, p2, p3, p4) -#define MTRACEP5(format, p1, p2, p3, p4, p5) -#define MTRACEP6(format, p1, p2, p3, p4, p5, p6) -#define MTRACEP7(format, p1, p2, p3, p4, p5, p6, p7) -#endif - -#ifdef DOTRACE -static FILE* myerr; -#endif - -static Window getParent(Window window); -static Window getEmbedder(Window client); -static jmethodID handleFocusInMID; - -const char * error_msg = "UNKNOWN XEMBED MESSAGE"; - -const char * xembed_strs[] = { - "EMBEDDED_NOTIFY", - "WINDOW_ACTIVATE", - "WINDOW_DEACTIVATE", - "REQUEST_FOCUS", - "FOCUS_IN", - "FOCUS_OUT", - "FOCUS_NEXT", - "FOCUS_PREV" , - "GRAB_KEY", - "UNGRAB_KEY", - "MODALITY_ON" , - "MODALITY_OFF", - "REGISTER_ACCELERATOR", - "UNREGISTER_ACCELERATOR", - "ACTIVATE_ACCELERATOR" -}; - -const char * -msg_to_str(int msg) { - if (msg >= 0 && msg <= XEMBED_LAST_MSG) { - return xembed_strs[msg]; - } else { - return error_msg; - } -} - -DECLARE_JAVA_CLASS(MEmbeddedFramePeerClass, "sun/awt/motif/MEmbeddedFramePeer"); - -typedef struct _xembed_info { - CARD32 version; - CARD32 flags; -} xembed_info; - -typedef struct _xembed_data { - struct FrameData * wdata; // pointer to EmbeddedFrame wdata - Window client; // pointer to plugin intermediate widget, XEmbed client - Boolean active; // whether xembed is active for this client - Boolean applicationActive; // whether the embedding application is active - Window embedder; // Window ID of the embedder - struct _xembed_data * next; -} xembed_data, * pxembed_data; - -static pxembed_data xembed_list = NULL; - -static pxembed_data -getData(Window client) { - pxembed_data temp = xembed_list; - while (temp != NULL) { - if (temp->client == client) { - return temp; - } - temp = temp->next; - } - return NULL; -} - -static pxembed_data -getDataByFrame(struct FrameData* wdata) { - pxembed_data temp = xembed_list; - while (temp != NULL) { - if (temp->wdata == wdata) { - return temp; - } - temp = temp->next; - } - return NULL; -} - -static pxembed_data -addData(Window client) { - xembed_data * data = malloc(sizeof(xembed_data)); - memset(data, 0, sizeof(xembed_data)); - data->client = client; - data->next = xembed_list; - xembed_list = data; - return data; -} - -static void -removeData(Window client) { - pxembed_data * temp = &xembed_list; - while (*temp != NULL) { - if ((*temp)->client == client) { - xembed_data * data = *temp; - *temp = (*temp)->next; - free(data); - return; - } - temp = &(*temp)->next; - } -} - -static Atom XA_XEmbedInfo; -static Atom XA_XEmbed; - -void -init_xembed() { - XA_XEmbedInfo = XInternAtom(awt_display, "_XEMBED_INFO", False); - XA_XEmbed = XInternAtom(awt_display, "_XEMBED", False); -#ifdef DOTRACE - myerr = fopen("xembedclient.log","w"); -#endif -} - -static Time -getCurrentServerTime() { - return awt_util_getCurrentServerTime(); -} - - -void -sendMessageHelper(Window window, int message, long detail, - long data1, long data2) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - XEvent ev; - XClientMessageEvent * req = (XClientMessageEvent*)&ev; - memset(&ev, 0, sizeof(ev)); - - req->type = ClientMessage; - req->window = window; - req->message_type = XA_XEmbed; - req->format = 32; - req->data.l[0] = getCurrentServerTime(); - req->data.l[1] = message; - req->data.l[2] = detail; - req->data.l[3] = data1; - req->data.l[4] = data2; - AWT_LOCK(); - XSendEvent(awt_display, window, False, NoEventMask, &ev); - AWT_UNLOCK(); -} - -void -sendMessage(Window window, int message) { - sendMessageHelper(window, message, 0, 0, 0); -} - - -static Window -getParent(Window window) { - Window root, parent = None, *children = NULL; - unsigned int count; - XQueryTree(awt_display, window, &root, &parent, &children, &count); - if (children != NULL) { - XFree(children); - } - return parent; -} - -static Window -getEmbedder(Window client) { - return getParent(client); -} - - -static void -handleFocusIn(struct FrameData* wdata, int detail) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - struct WidgetInfo* winfo; - MTRACE("HandleFocusIn\n"); - winfo = findWidgetInfo(wdata->winData.comp.widget); - if (winfo != NULL) { - jobject peer = winfo->peer; - if (handleFocusInMID == NULL) { - jclass clazz = (*env)->FindClass(env, "sun/awt/motif/MEmbeddedFramePeer"); - DASSERT(clazz != NULL); - handleFocusInMID = (*env)->GetMethodID(env, clazz, "handleFocusIn", "(I)V"); - DASSERT(handleFocusInMID != NULL); - if (clazz != NULL) { - (*env)->DeleteLocalRef(env, clazz); - } - } - if (handleFocusInMID != NULL) { - (*env)->CallVoidMethod(env, peer, handleFocusInMID, (jint)detail); - } - } -} - -static void -genWindowFocus(struct FrameData *wdata, Boolean gain) { - XEvent ev; - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - memset(&ev, 0, sizeof(ev)); - - ev.type = (gain?FocusIn:FocusOut); - ev.xany.send_event = True; - ev.xany.display = awt_display; - ev.xfocus.mode = NotifyNormal; - ev.xfocus.detail = NotifyNonlinear; - ev.xfocus.window = XtWindow(wdata->winData.shell); - awt_put_back_event(env, &ev); -} - -extern Boolean skipNextFocusIn; - -static void -callNotifyStarted(JNIEnv* env, jobject peer) { - DECLARE_VOID_JAVA_METHOD(notifyStartedMID, MEmbeddedFramePeerClass, - "notifyStarted", "()V"); - - (*env)->CallVoidMethod(env, peer, notifyStartedMID); -} - -void -xembed_eventHandler(XEvent *event) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - struct FrameData *wdata; - xembed_data * data; - - data = getData(event->xany.window); - if (data == NULL) { - MTRACEP1("No XEMBED client registered for this window %x\n", event->xany.window); - if (event->xany.type == ClientMessage) { - MTRACEP7("Unprocessed handleClientMessage: type=%d 0=%ld 1=%ld(%s) 2=%ld 3=%ld 4=%ld\n", - event->xclient.message_type, event->xclient.data.l[0], - event->xclient.data.l[1], msg_to_str(event->xclient.data.l[1]), - event->xclient.data.l[2], - event->xclient.data.l[3], event->xclient.data.l[4]); - } - return; - } - - wdata = data->wdata; - - if (event->xany.type == ClientMessage) { - MTRACEP6("handleClientMessage: type=%d 0=%ld 1=%ld 2=%ld 3=%ld 4=%ld\n", - event->xclient.message_type, event->xclient.data.l[0], - event->xclient.data.l[1], event->xclient.data.l[2], - event->xclient.data.l[3], event->xclient.data.l[4]); - // Probably a message from embedder - if (event->xclient.message_type == XA_XEmbed) { - // XEmbed message, data[1] contains message - switch ((int)event->xclient.data.l[1]) { - case XEMBED_EMBEDDED_NOTIFY: - MTRACE("EMBEDDED_NOTIFY\n"); - data->active = True; - data->embedder = getEmbedder(data->client); - // If Frame has not been reparented already we should "reparent" - // it manually - if (!(wdata->reparented)) { - wdata->reparented = True; - // in XAWT we also update WM_NORMAL_HINTS here. - } - { - struct WidgetInfo* winfo = - findWidgetInfo(wdata->winData.comp.widget); - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_4); - if (winfo != NULL) { - callNotifyStarted(env, winfo->peer); - } - } - MTRACE("Embedded notify in client\n"); - break; - case XEMBED_WINDOW_DEACTIVATE: - MTRACE("DEACTIVATE\n"); - data->applicationActive = False; - break; - case XEMBED_WINDOW_ACTIVATE: - MTRACE("ACTIVATE\n"); - data->applicationActive = True; - break; - case XEMBED_FOCUS_IN: - MTRACE("FOCUS IN\n"); - skipNextFocusIn = False; - handleFocusIn(wdata, (int)(event->xclient.data.l[2])); - genWindowFocus(wdata, True); - break; - case XEMBED_FOCUS_OUT: - MTRACE("FOCUS OUT\n"); - genWindowFocus(wdata, False); - break; - } - } - } else if (event->xany.type == ReparentNotify) { - data->embedder = event->xreparent.parent; - } -} - -void -notify_ready(Window client) { - sendMessage(getEmbedder(client), _SUN_XEMBED_START); -} - -void -install_xembed(Widget client_widget, struct FrameData* wdata) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - xembed_info info = {XEMBED_VERSION, XEMBED_MAPPED}; - Window client = XtWindow(client_widget); - xembed_data * data; - - AWT_LOCK(); - data = addData(client); - data->wdata = wdata; - - // Install event handler for messages from embedder - XSelectInput(awt_display, client, StructureNotifyMask); - - // Install XEMBED_INFO information - XChangeProperty(awt_display, client, XA_XEmbedInfo, - XA_XEmbedInfo, 32, PropModeReplace, - (unsigned char*)&info, 2); - MTRACE("Installing xembed\n"); - - notify_ready(client); - - AWT_UNLOCK(); -} - -void -deinstall_xembed(struct FrameData* wdata) { - xembed_data * data = getDataByFrame(wdata); - - if (data != NULL) { - removeData(data->client); - } -} - -void -requestXEmbedFocus(struct FrameData * wdata) { - xembed_data * data = getDataByFrame(wdata); - - if (data != NULL) { - if (data->active && data->applicationActive) { - sendMessage(data->embedder, XEMBED_REQUEST_FOCUS); - } - } -} - -Boolean -isXEmbedActive(struct FrameData * wdata) { - xembed_data * data = getDataByFrame(wdata); - return (data != NULL && data->active); -} - -Boolean -isXEmbedActiveByWindow(Window client) { - xembed_data * data = getData(client); - return (data != NULL && data->active); -} - - -Boolean -isXEmbedApplicationActive(struct FrameData * wdata) { - xembed_data * data = getDataByFrame(wdata); - return (data != NULL && data->applicationActive); -} - -void -xembed_traverse_out(struct FrameData * wdata, jboolean direction) { - xembed_data * data = getDataByFrame(wdata); - sendMessage(data->embedder, (direction == JNI_TRUE)?XEMBED_FOCUS_NEXT:XEMBED_FOCUS_PREV); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/canvas.c --- a/jdk/src/solaris/native/sun/awt/canvas.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3227 +0,0 @@ -/* - * Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -#ifdef HEADLESS - #error This file should not be included in headless library -#endif - -#include "awt_p.h" -#include /* timeval */ - -#define XK_KATAKANA -#include /* standard X keysyms */ -#include /* DEC vendor-specific */ -#include /* Sun vendor-specific */ -#include /* Apollo (HP) vendor-specific */ -/* - * #include HP vendor-specific - * I checked HPkeysym.h into the workspace because it ships - * with X11R6.4.2 (and later) but not with X11R6.4.1. - * So, it ought to ship with Solaris 9, but not Solaris 8. - * Same deal for Linux - newer versions of XFree have it. - * - * Note: this is mainly done for the hp keysyms; it does NOT - * give us the osf keysyms that are also defined in HPkeysym.h. - * This is because we are already getting /Xm/VirtKeys.h - * from awt_p.h <- /Xm/Xm.h <- /Xm/VirtKeys.h, and VirtKeys.h - * #defines _OSF_Keysyms before we get here. We are - * missing a couple of osf keysyms because of this, - * so I have #defined them below. - */ -#include "HPkeysym.h" /* HP vendor-specific */ - -#include -#include -#include "java_awt_Frame.h" -#include "java_awt_Component.h" -#include "java_awt_AWTEvent.h" -#include "java_awt_event_KeyEvent.h" -#include "java_awt_event_FocusEvent.h" -#include "java_awt_event_MouseEvent.h" -#include "java_awt_event_MouseWheelEvent.h" -#include "java_awt_event_InputEvent.h" -#include "java_awt_event_WindowEvent.h" -#include "sun_awt_motif_MComponentPeer.h" -#include "color.h" -#include "canvas.h" -#include "awt_Cursor.h" -#include "VDrawingArea.h" -#include "XDrawingArea.h" -#include "awt_Component.h" -#include "awt_AWTEvent.h" -#include "awt_Event.h" -#include "awt_KeyboardFocusManager.h" -#include "awt_MToolkit.h" -#include "awt_TopLevel.h" -#include "awt_util.h" - -#include -#include -#include -#include - -#ifdef NDEBUG /* NDEBUG overrides DEBUG */ -#undef DEBUG -#endif - -/* - * Two osf keys are not defined in standard keysym.h, - * /Xm/VirtKeys.h, or HPkeysym.h, so I added them below. - * I found them in /usr/openwin/lib/X11/XKeysymDB - */ -#ifndef osfXK_Prior -#define osfXK_Prior 0x1004FF55 -#endif -#ifndef osfXK_Next -#define osfXK_Next 0x1004FF56 -#endif -/* - * osfXK_Escape is defined in HPkeysym.h, but not in - * /Xm/VirtKeys.h, so I added it below. It is also in - * /usr/openwin/lib/X11/XKeysymDB - * Note: it is in /Xm/VirtKeys.h in the AWT motif workspace, - * but not in /usr/local/Motif/include/Xm/VirtKeys.h - * on the Solaris 7, 8, or 9 machines I tried. - */ -#ifndef osfXK_Escape -#define osfXK_Escape 0x1004FF1B -#endif - -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct AWTEventIDs awtEventIDs; -extern struct KeyEventIDs keyEventIDs; -extern struct InputEventIDs inputEventIDs; -extern struct ComponentIDs componentIDs; -extern struct KeyboardFocusManagerIDs keyboardFocusManagerIDs; - -#ifdef DEBUG -static Boolean debugKeys = False; -#endif - -jint awt_multiclick_smudge = 4; - -extern Widget drag_source; - -Widget prevWidget = NULL; /* for bug fix 4017222 */ - -FocusListElt *focusList = NULL, *focusListEnd = NULL; - -jweak forGained = NULL; - -extern Boolean scrollBugWorkAround; -extern jobject currentX11InputMethodInstance; -extern Window currentFocusWindow; -extern Boolean awt_x11inputmethod_lookupString(XKeyPressedEvent *, KeySym *); -Boolean awt_UseType4Patch = True; -Boolean awt_ServerDetected = False; -Boolean awt_IsXsun = False; -Boolean awt_UseXKB = False; - -void awt_post_java_key_event(XtPointer client_data, jint id, - XEvent *xevent, Time when, jint keycode, - jchar keychar, jint modifiers, - jint keyLocation, XEvent *anEvent); -void awt_post_java_focus_event(XtPointer client_data, jint id, jobject cause, - XEvent *event); -void awt_post_java_mouse_event(XtPointer client_data, jint id, - XEvent *event, Time when, jint modifiers, - jint x, jint y, - jint xAbs, jint yAbs, - jint clickcount, Boolean popuptrigger, - jint wheelAmt, jint button); - -typedef struct KEYMAP_ENTRY { - jint awtKey; - KeySym x11Key; - Boolean mapsToUnicodeChar; - jint keyLocation; -} KeymapEntry; - -/* NB: XK_R? keysyms are for Type 4 keyboards. - * The corresponding XK_F? keysyms are for Type 5 - * - * Note: this table must be kept in sorted order, since it is traversed - * according to both Java keycode and X keysym. There are a number of - * keycodes that map to more than one corresponding keysym, and we need - * to choose the right one. Unfortunately, there are some keysyms that - * can map to more than one keycode, depending on what kind of keyboard - * is in use (e.g. F11 and F12). - */ - -KeymapEntry keymapTable[] = -{ - {java_awt_event_KeyEvent_VK_A, XK_a, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_B, XK_b, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_C, XK_c, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_D, XK_d, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_E, XK_e, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F, XK_f, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_G, XK_g, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_H, XK_h, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_I, XK_i, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_J, XK_j, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_K, XK_k, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_L, XK_l, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_M, XK_m, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_N, XK_n, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_O, XK_o, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_P, XK_p, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_Q, XK_q, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_R, XK_r, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_S, XK_s, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_T, XK_t, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_U, XK_u, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_V, XK_v, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_W, XK_w, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_X, XK_x, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_Y, XK_y, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_Z, XK_z, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* TTY Function keys */ - {java_awt_event_KeyEvent_VK_BACK_SPACE, XK_BackSpace, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_TAB, XK_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CLEAR, XK_Clear, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_ENTER, XK_Return, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_ENTER, XK_Linefeed, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAUSE, XK_Pause, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAUSE, XK_F21, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAUSE, XK_R1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_Scroll_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_F23, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_SCROLL_LOCK, XK_R3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_ESCAPE, XK_Escape, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Other vendor-specific versions of TTY Function keys */ - {java_awt_event_KeyEvent_VK_BACK_SPACE, osfXK_BackSpace, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CLEAR, osfXK_Clear, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_ESCAPE, osfXK_Escape, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Modifier keys */ - {java_awt_event_KeyEvent_VK_SHIFT, XK_Shift_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT}, - {java_awt_event_KeyEvent_VK_SHIFT, XK_Shift_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT}, - {java_awt_event_KeyEvent_VK_CONTROL, XK_Control_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT}, - {java_awt_event_KeyEvent_VK_CONTROL, XK_Control_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT}, - {java_awt_event_KeyEvent_VK_ALT, XK_Alt_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT}, - {java_awt_event_KeyEvent_VK_ALT, XK_Alt_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT}, - {java_awt_event_KeyEvent_VK_META, XK_Meta_L, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_LEFT}, - {java_awt_event_KeyEvent_VK_META, XK_Meta_R, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_RIGHT}, - {java_awt_event_KeyEvent_VK_CAPS_LOCK, XK_Caps_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Misc Functions */ - {java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_Print, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_F22, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PRINTSCREEN, XK_R2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CANCEL, XK_Cancel, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_HELP, XK_Help, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_NUM_LOCK, XK_Num_Lock, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - - /* Other vendor-specific versions of Misc Functions */ - {java_awt_event_KeyEvent_VK_CANCEL, osfXK_Cancel, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_HELP, osfXK_Help, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Rectangular Navigation Block */ - {java_awt_event_KeyEvent_VK_HOME, XK_Home, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_HOME, XK_R7, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_UP, XK_Page_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_UP, XK_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_UP, XK_R9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_Page_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_R15, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_END, XK_End, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_END, XK_R13, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_INSERT, XK_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DELETE, XK_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Keypad equivalents of Rectangular Navigation Block */ - {java_awt_event_KeyEvent_VK_HOME, XK_KP_Home, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_PAGE_UP, XK_KP_Page_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_PAGE_UP, XK_KP_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_KP_Page_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_PAGE_DOWN, XK_KP_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_END, XK_KP_End, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_INSERT, XK_KP_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_DELETE, XK_KP_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - - /* Other vendor-specific Rectangular Navigation Block */ - {java_awt_event_KeyEvent_VK_PAGE_UP, osfXK_PageUp, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_UP, osfXK_Prior, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_DOWN, osfXK_PageDown, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PAGE_DOWN, osfXK_Next, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_END, osfXK_EndLine, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_INSERT, osfXK_Insert, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DELETE, osfXK_Delete, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Triangular Navigation Block */ - {java_awt_event_KeyEvent_VK_LEFT, XK_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_UP, XK_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_RIGHT, XK_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DOWN, XK_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Keypad equivalents of Triangular Navigation Block */ - {java_awt_event_KeyEvent_VK_KP_LEFT, XK_KP_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_KP_UP, XK_KP_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_KP_RIGHT, XK_KP_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_KP_DOWN, XK_KP_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - - /* Other vendor-specific Triangular Navigation Block */ - {java_awt_event_KeyEvent_VK_LEFT, osfXK_Left, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_UP, osfXK_Up, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_RIGHT, osfXK_Right, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DOWN, osfXK_Down, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Remaining Cursor control & motion */ - {java_awt_event_KeyEvent_VK_BEGIN, XK_Begin, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_BEGIN, XK_KP_Begin, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - - {java_awt_event_KeyEvent_VK_0, XK_0, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_1, XK_1, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_2, XK_2, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_3, XK_3, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_4, XK_4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_5, XK_5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_6, XK_6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_7, XK_7, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_8, XK_8, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_9, XK_9, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - {java_awt_event_KeyEvent_VK_SPACE, XK_space, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_EXCLAMATION_MARK, XK_exclam, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_QUOTEDBL, XK_quotedbl, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_NUMBER_SIGN, XK_numbersign, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DOLLAR, XK_dollar, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_AMPERSAND, XK_ampersand, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_QUOTE, XK_apostrophe, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_LEFT_PARENTHESIS, XK_parenleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_RIGHT_PARENTHESIS, XK_parenright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_ASTERISK, XK_asterisk, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PLUS, XK_plus, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_COMMA, XK_comma, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_MINUS, XK_minus, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PERIOD, XK_period, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_SLASH, XK_slash, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - {java_awt_event_KeyEvent_VK_COLON, XK_colon, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_SEMICOLON, XK_semicolon, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_LESS, XK_less, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_EQUALS, XK_equal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_GREATER, XK_greater, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - {java_awt_event_KeyEvent_VK_AT, XK_at, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - {java_awt_event_KeyEvent_VK_OPEN_BRACKET, XK_bracketleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_BACK_SLASH, XK_backslash, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CLOSE_BRACKET, XK_bracketright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CIRCUMFLEX, XK_asciicircum, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_UNDERSCORE, XK_underscore, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_BACK_QUOTE, XK_grave, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - {java_awt_event_KeyEvent_VK_BRACELEFT, XK_braceleft, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_BRACERIGHT, XK_braceright, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - {java_awt_event_KeyEvent_VK_INVERTED_EXCLAMATION_MARK, XK_exclamdown, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Remaining Numeric Keypad Keys */ - {java_awt_event_KeyEvent_VK_NUMPAD0, XK_KP_0, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD1, XK_KP_1, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD2, XK_KP_2, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD3, XK_KP_3, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD4, XK_KP_4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD5, XK_KP_5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD6, XK_KP_6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD7, XK_KP_7, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD8, XK_KP_8, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_NUMPAD9, XK_KP_9, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_SPACE, XK_KP_Space, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_TAB, XK_KP_Tab, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_ENTER, XK_KP_Enter, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_EQUALS, XK_KP_Equal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_EQUALS, XK_R4, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_MULTIPLY, XK_KP_Multiply, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_MULTIPLY, XK_F26, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_MULTIPLY, XK_R6, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_ADD, XK_KP_Add, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_SEPARATOR, XK_KP_Separator, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_SUBTRACT, XK_KP_Subtract, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_SUBTRACT, XK_F24, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_DECIMAL, XK_KP_Decimal, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_DIVIDE, XK_KP_Divide, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_DIVIDE, XK_F25, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - {java_awt_event_KeyEvent_VK_DIVIDE, XK_R5, TRUE, java_awt_event_KeyEvent_KEY_LOCATION_NUMPAD}, - - /* Function Keys */ - {java_awt_event_KeyEvent_VK_F1, XK_F1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F2, XK_F2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F3, XK_F3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F4, XK_F4, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F5, XK_F5, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F6, XK_F6, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F7, XK_F7, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F8, XK_F8, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F9, XK_F9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F10, XK_F10, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F11, XK_F11, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F12, XK_F12, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Sun vendor-specific version of F11 and F12 */ - {java_awt_event_KeyEvent_VK_F11, SunXK_F36, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_F12, SunXK_F37, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* X11 keysym names for input method related keys don't always - * match keytop engravings or Java virtual key names, so here we - * only map constants that we've found on real keyboards. - */ - /* Type 5c Japanese keyboard: kakutei */ - {java_awt_event_KeyEvent_VK_ACCEPT, XK_Execute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - /* Type 5c Japanese keyboard: henkan */ - {java_awt_event_KeyEvent_VK_CONVERT, XK_Kanji, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - /* Type 5c Japanese keyboard: nihongo */ - {java_awt_event_KeyEvent_VK_INPUT_METHOD_ON_OFF, XK_Henkan_Mode, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - /* VK_KANA_LOCK is handled separately because it generates the - * same keysym as ALT_GRAPH in spite of its different behavior. - */ - - {java_awt_event_KeyEvent_VK_COMPOSE, XK_Multi_key, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_ALT_GRAPH, XK_Mode_switch, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Editing block */ - {java_awt_event_KeyEvent_VK_AGAIN, XK_Redo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_AGAIN, XK_L2, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_UNDO, XK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_UNDO, XK_L4, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_COPY, XK_L6, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PASTE, XK_L8, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CUT, XK_L10, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_FIND, XK_Find, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_FIND, XK_L9, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PROPS, XK_L3, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_STOP, XK_L1, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Sun vendor-specific versions for editing block */ - {java_awt_event_KeyEvent_VK_AGAIN, SunXK_Again, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_UNDO, SunXK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_COPY, SunXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PASTE, SunXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CUT, SunXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_FIND, SunXK_Find, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PROPS, SunXK_Props, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_STOP, SunXK_Stop, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Apollo (HP) vendor-specific versions for editing block */ - {java_awt_event_KeyEvent_VK_COPY, apXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CUT, apXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PASTE, apXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Other vendor-specific versions for editing block */ - {java_awt_event_KeyEvent_VK_COPY, osfXK_Copy, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_CUT, osfXK_Cut, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_PASTE, osfXK_Paste, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_UNDO, osfXK_Undo, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Dead key mappings (for European keyboards) */ - {java_awt_event_KeyEvent_VK_DEAD_GRAVE, XK_dead_grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_ACUTE, XK_dead_acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, XK_dead_circumflex, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_TILDE, XK_dead_tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_MACRON, XK_dead_macron, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_BREVE, XK_dead_breve, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_ABOVEDOT, XK_dead_abovedot, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, XK_dead_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_ABOVERING, XK_dead_abovering, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_DOUBLEACUTE, XK_dead_doubleacute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CARON, XK_dead_caron, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CEDILLA, XK_dead_cedilla, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_OGONEK, XK_dead_ogonek, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_IOTA, XK_dead_iota, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_VOICED_SOUND, XK_dead_voiced_sound, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_SEMIVOICED_SOUND, XK_dead_semivoiced_sound, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Sun vendor-specific dead key mappings (for European keyboards) */ - {java_awt_event_KeyEvent_VK_DEAD_GRAVE, SunXK_FA_Grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, SunXK_FA_Circum, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_TILDE, SunXK_FA_Tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_ACUTE, SunXK_FA_Acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, SunXK_FA_Diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CEDILLA, SunXK_FA_Cedilla, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* DEC vendor-specific dead key mappings (for European keyboards) */ - {java_awt_event_KeyEvent_VK_DEAD_ABOVERING, DXK_ring_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, DXK_circumflex_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CEDILLA, DXK_cedilla_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_ACUTE, DXK_acute_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_GRAVE, DXK_grave_accent, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_TILDE, DXK_tilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, DXK_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - /* Other vendor-specific dead key mappings (for European keyboards) */ - {java_awt_event_KeyEvent_VK_DEAD_ACUTE, hpXK_mute_acute, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_GRAVE, hpXK_mute_grave, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_CIRCUMFLEX, hpXK_mute_asciicircum, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_DIAERESIS, hpXK_mute_diaeresis, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - {java_awt_event_KeyEvent_VK_DEAD_TILDE, hpXK_mute_asciitilde, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_STANDARD}, - - {java_awt_event_KeyEvent_VK_UNDEFINED, NoSymbol, FALSE, java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN} -}; - -static Boolean -keyboardHasKanaLockKey() -{ - static Boolean haveResult = FALSE; - static Boolean result = FALSE; - - int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode; - KeySym *keySyms, *keySymsStart, keySym; - int32_t i; - int32_t kanaCount = 0; - - // Solaris doesn't let you swap keyboards without rebooting, - // so there's no need to check for the kana lock key more than once. - if (haveResult) { - return result; - } - - // There's no direct way to determine whether the keyboard has - // a kana lock key. From available keyboard mapping tables, it looks - // like only keyboards with the kana lock key can produce keysyms - // for kana characters. So, as an indirect test, we check for those. - - XDisplayKeycodes(awt_display, &minKeyCode, &maxKeyCode); - keySyms = XGetKeyboardMapping(awt_display, minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode); - keySymsStart = keySyms; - for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) { - keySym = *keySyms++; - if ((keySym & 0xff00) == 0x0400) { - kanaCount++; - } - } - XFree(keySymsStart); - - // use a (somewhat arbitrary) minimum so we don't get confused by a stray function key - result = kanaCount > 10; - haveResult = TRUE; - return result; -} - -void -keysymToAWTKeyCode(KeySym x11Key, jint *keycode, Boolean *mapsToUnicodeChar, - jint *keyLocation) -{ - int32_t i; - - // Solaris uses XK_Mode_switch for both the non-locking AltGraph - // and the locking Kana key, but we want to keep them separate for - // KeyEvent. - if (x11Key == XK_Mode_switch && keyboardHasKanaLockKey()) { - *keycode = java_awt_event_KeyEvent_VK_KANA_LOCK; - *mapsToUnicodeChar = FALSE; - *keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN; - return; - } - - for (i = 0; - keymapTable[i].awtKey != java_awt_event_KeyEvent_VK_UNDEFINED; - i++) { - if (keymapTable[i].x11Key == x11Key) { - *keycode = keymapTable[i].awtKey; - *mapsToUnicodeChar = keymapTable[i].mapsToUnicodeChar; - *keyLocation = keymapTable[i].keyLocation; - return; - } - } - - *keycode = java_awt_event_KeyEvent_VK_UNDEFINED; - *mapsToUnicodeChar = FALSE; - *keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN; - - DTRACE_PRINTLN1("keysymToAWTKeyCode: no key mapping found: keysym = %x", x11Key); -} - -KeySym -awt_getX11KeySym(jint awtKey) -{ - int32_t i; - - if (awtKey == java_awt_event_KeyEvent_VK_KANA_LOCK && keyboardHasKanaLockKey()) { - return XK_Mode_switch; - } - - for (i = 0; keymapTable[i].awtKey != 0; i++) { - if (keymapTable[i].awtKey == awtKey) { - return keymapTable[i].x11Key; - } - } - - DTRACE_PRINTLN1("awt_getX11KeySym: no key mapping found: awtKey = %x", awtKey); - return NoSymbol; -} - - -typedef struct COLLAPSE_INFO { - Window win; - DamageRect *r; -} CollapseInfo; - -static void -expandDamageRect(DamageRect * drect, XEvent * xev, Boolean debug, char *str) -{ - int32_t x1 = xev->xexpose.x; - int32_t y1 = xev->xexpose.y; - int32_t x2 = x1 + xev->xexpose.width; - int32_t y2 = y1 + xev->xexpose.height; - - /* - if (debug) { - printf(" %s: collapsing (%d,%d %dx%d) into (%d,%d %dx%d) ->>", - str, x1, y1, xev->xexpose.width, xev->xexpose.height, - drect->x1, drect->y1, drect->x2 - drect->x1, drect->y2 - drect->y1); - } - */ - - drect->x1 = MIN(x1, drect->x1); - drect->y1 = MIN(y1, drect->y1); - drect->x2 = MAX(x2, drect->x2); - drect->y2 = MAX(y2, drect->y2); - - /* - if (debug) { - printf("(%d,%d %dx%d) %s\n", - drect->x1, drect->y1, drect->x2 - drect->x1, drect->y2 - drect->y1); - } - */ - -} - -static Bool -checkForExpose(Display * dpy, XEvent * evt, XPointer client_data) -{ - CollapseInfo *cinfo = (CollapseInfo *) client_data; - - if ((evt->type == Expose && evt->xexpose.window == cinfo->win && - INTERSECTS(cinfo->r->x1, cinfo->r->x2, cinfo->r->y1, cinfo->r->y2, - evt->xexpose.x, - evt->xexpose.x + evt->xexpose.width, - evt->xexpose.y, - evt->xexpose.y + evt->xexpose.height)) || - (evt->type == GraphicsExpose && evt->xgraphicsexpose.drawable == cinfo->win && - INTERSECTS(cinfo->r->x1, cinfo->r->x2, cinfo->r->y1, cinfo->r->y2, - evt->xgraphicsexpose.x, - evt->xgraphicsexpose.x + evt->xgraphicsexpose.width, - evt->xgraphicsexpose.y, - evt->xgraphicsexpose.y + evt->xgraphicsexpose.height))) { - - return True; - } - return False; -} - -/* - * javaObject is an MComponentPeer instance - */ -static void -HandleExposeEvent(Widget w, jobject javaObject, XEvent * event) -{ - jobject target; - jint wdth, hght; - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - switch (event->type) { - case Expose: - case GraphicsExpose: - { - struct ComponentData *cdata; - Boolean debug = FALSE; - jint drawState; - - /* Set the draw state */ - drawState = (*env)->GetIntField(env, javaObject, - mComponentPeerIDs.drawState); - (*env)->SetIntField(env, javaObject, mComponentPeerIDs.drawState, - drawState | JAWT_LOCK_CLIP_CHANGED); - cdata = (struct ComponentData *) - JNU_GetLongFieldAsPtr(env, javaObject, mComponentPeerIDs.pData); - if (JNU_IsNull(env, javaObject) || (cdata == NULL)) { - return; - } - if (event->xexpose.send_event) { - if (cdata->repaintPending & RepaintPending_REPAINT) { - cdata->repaintPending &= ~RepaintPending_REPAINT; - - JNU_CallMethodByName(env, - NULL, - javaObject, - "handleRepaint", - "(IIII)V", - (jint) cdata->repaintRect.x1, - (jint) cdata->repaintRect.y1, - (jint) cdata->repaintRect.x2 - - cdata->repaintRect.x1, - (jint) cdata->repaintRect.y2 - - cdata->repaintRect.y1); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } - return; - } - if ((cdata->repaintPending & RepaintPending_EXPOSE) == 0) { - cdata->exposeRect.x1 = event->xexpose.x; - cdata->exposeRect.y1 = event->xexpose.y; - cdata->exposeRect.x2 = cdata->exposeRect.x1 + event->xexpose.width; - cdata->exposeRect.y2 = cdata->exposeRect.y1 + event->xexpose.height; - cdata->repaintPending |= RepaintPending_EXPOSE; - } else { - expandDamageRect(&(cdata->exposeRect), event, debug, "1"); - } - - /* Only post Expose/Repaint if we know others arn't following - * directly in the queue. - */ - if (event->xexpose.count == 0) { - int32_t count = 0; - CollapseInfo cinfo; - - cinfo.win = XtWindow(w); - cinfo.r = &(cdata->exposeRect); - - /* Do a little more inspecting and collapse further if there - * are additional expose events pending on this window where - * the damage rects intersect with the current exposeRect. - */ - while (TRUE) { - XEvent xev; - - if (XCheckIfEvent(XtDisplay(w), &xev - ,checkForExpose, (XtPointer) & cinfo)) { - count = xev.xexpose.count; - expandDamageRect(&(cdata->exposeRect), &xev, debug, "2"); - - } else { - /* XCheckIfEvent Failed. */ - break; - } - } - - cdata->repaintPending &= ~RepaintPending_EXPOSE; - - /* Fix for bugtraq id 4262108. Paint events should not be - * delivered to components that have one of their - * dimensions equal to zero. - */ - - if ((*env)->EnsureLocalCapacity(env, 1) < 0) { - return; - } - - target = (*env)->GetObjectField(env, javaObject, - mComponentPeerIDs.target); - wdth = (*env)->GetIntField(env, target, componentIDs.width); - hght = (*env)->GetIntField(env, target, componentIDs.height); - (*env)->DeleteLocalRef(env, target); - - if ( wdth != 0 && hght != 0) { - JNU_CallMethodByName(env, - NULL, - javaObject, - "handleExpose", - "(IIII)V", - (jint) cdata->exposeRect.x1, - (jint) cdata->exposeRect.y1, - (jint) cdata->exposeRect.x2 - - cdata->exposeRect.x1, - (jint) cdata->exposeRect.y2 - - cdata->exposeRect.y1); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - } - } - } - break; - - default: - jio_fprintf(stderr, "Got event %d in HandleExposeEvent!\n", event->type); - } -} - -/* We always store and return JNI GlobalRefs. */ -static jweak focusOwnerPeer = NULL; -static jweak focusedWindowPeer = NULL; - -/* - * This function should only be called under the - * protection of AWT_LOCK(). Otherwise, multithreaded access - * can corrupt the value of focusOwnerPeer variable. - * This function returns LocalRef, result should be deleted - * explicitly if called on a thread that never returns to - * Java. - */ -jobject -awt_canvas_getFocusOwnerPeer() { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject res; - AWT_LOCK(); - res = (*env)->NewLocalRef(env, focusOwnerPeer); - AWT_UNLOCK(); - return res; -} - -/* - * This function should only be called under the - * protection of AWT_LOCK(). Otherwise, multithreaded access - * can corrupt the value of focusedWindowPeer variable. - * This function returns LocalRef, result should be deleted - * explicitly if called on a thread that never returns to - * Java. - */ -jobject -awt_canvas_getFocusedWindowPeer() { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject res; - AWT_LOCK(); - res = (*env)->NewLocalRef(env, focusedWindowPeer); - AWT_UNLOCK(); - return res; -} - -/* - * Only call this function under AWT_LOCK(). Otherwise, multithreaded - * access can corrupt the value of focusOwnerPeer variable. - */ -void -awt_canvas_setFocusOwnerPeer(jobject peer) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - AWT_LOCK(); - if (focusOwnerPeer != NULL) { - (*env)->DeleteWeakGlobalRef(env, focusOwnerPeer); - } - focusOwnerPeer = (peer != NULL) - ? (*env)->NewWeakGlobalRef(env, peer) : NULL; - AWT_UNLOCK(); -} - -/* - * Only call this function under AWT_LOCK(). Otherwise, multithreaded - * access can corrupt the value of focusedWindowPeer variable. - */ -void -awt_canvas_setFocusedWindowPeer(jobject peer) { - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - AWT_LOCK(); - if (focusedWindowPeer != NULL) { - (*env)->DeleteWeakGlobalRef(env, focusedWindowPeer); - } - focusedWindowPeer = (peer != NULL) - ? (*env)->NewWeakGlobalRef(env, peer) : NULL; - AWT_UNLOCK(); -} - -void callFocusCallback(jobject focusPeer, int focus_type, jobject cause) { - awt_post_java_focus_event(focusPeer, - focus_type, - cause, - NULL); - awt_canvas_setFocusOwnerPeer(focusPeer); -} - - -void -handleFocusEvent(Widget w, - XFocusChangeEvent * fevent, - XtPointer client_data, - Boolean * cont, - Boolean passEvent, - jobject cause) -{ - if (fevent->type == FocusIn) { - if (fevent->mode == NotifyNormal && - fevent->detail != NotifyPointer && fevent->detail != NotifyVirtual) - { -#ifdef DEBUG_FOCUS - printf("window = %d, mode = %d, detail = %d\n", fevent->window, fevent->mode, fevent->detail); - printf("----posting java FOCUS GAINED on window %d, pass = %d\n", XtWindow(w), passEvent); -#endif - awt_post_java_focus_event(client_data, - java_awt_event_FocusEvent_FOCUS_GAINED, - cause, - NULL); - awt_canvas_setFocusOwnerPeer(client_data); - } - } else { - /* FocusOut */ - if (fevent->mode == NotifyNormal && - fevent->detail != NotifyPointer && fevent->detail != NotifyVirtual) - { -#ifdef DEBUG_FOCUS - printf("window = %d, mode = %d, detail = %d\n", fevent->window, fevent->mode, fevent->detail); - printf("----posting java FOCUS LOST on window %d, pass = %d, temp = %d\n", XtWindow(w), passEvent, temp); -#endif - awt_post_java_focus_event(client_data, - java_awt_event_FocusEvent_FOCUS_LOST, - cause, - NULL); - awt_canvas_setFocusOwnerPeer(NULL); - } - } - *cont = TRUE; -} - -void callFocusHandler(Widget w, int eventType, jobject cause) { - jobject peer = NULL; - XFocusChangeEvent event; - Boolean cont; - JNIEnv *env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2); - - if (w == NULL) { - return; - } - - peer = findPeer(&w); - if (peer == NULL) { - w = findTopLevelByShell(w); - if (w != NULL) { - peer = findPeer(&w); - } - } - if (peer == NULL) { - return; - } - memset(&event, 0, sizeof(event)); - event.type = eventType; - event.mode = NotifyNormal; - event.detail = NotifyAncestor; - event.window = XtWindow(w); - cont = FALSE; - handleFocusEvent(w, &event, (XtPointer)peer, &cont, TRUE, cause); -} - -/** - * Copy XEvent to jbyteArray and save it in AWTEvent - */ -void -awt_copyXEventToAWTEvent(JNIEnv *env, XEvent * xev, jobject jevent) -{ - jbyteArray bdata; - if (xev != NULL) { - if ((*env)->EnsureLocalCapacity(env, 1) < 0) { - return; - } - bdata = (*env)->NewByteArray(env, sizeof(XEvent)); - if (bdata != NULL) { - (*env)->SetByteArrayRegion(env, bdata, 0, sizeof(XEvent), - (jbyte *)xev); - (*env)->SetObjectField(env, jevent, awtEventIDs.bdata, bdata); - (*env)->DeleteLocalRef(env, bdata); - } - } -} - -/* Returns new modifiers set like ???_DOWN_MASK for keyboard and mouse after the event. - * The modifiers on a Java key event reflect the state of the modifier keys - * immediately AFTER the key press or release. This usually doesn't require - * us to change the modifiers: the exception is when the key pressed or - * released is a modifier key. Since the state of an XEvent represents - * the modifiers BEFORE the event, we change the modifiers according to - * the button and keycode. - */ -jint -getModifiers(uint32_t state, jint button, jint keyCode) -{ - jint modifiers = 0; - - if (((state & ShiftMask) != 0) ^ (keyCode == java_awt_event_KeyEvent_VK_SHIFT)) - { - modifiers |= java_awt_event_InputEvent_SHIFT_DOWN_MASK; - } - if (((state & ControlMask) != 0) ^ (keyCode == java_awt_event_KeyEvent_VK_CONTROL)) - { - modifiers |= java_awt_event_InputEvent_CTRL_DOWN_MASK; - } - if (((state & awt_MetaMask) != 0) ^ (keyCode == java_awt_event_KeyEvent_VK_META)) - { - modifiers |= java_awt_event_InputEvent_META_DOWN_MASK; - } - if (((state & awt_AltMask) != 0) ^ (keyCode == java_awt_event_KeyEvent_VK_ALT)) - { - modifiers |= java_awt_event_InputEvent_ALT_DOWN_MASK; - } - if (((state & awt_ModeSwitchMask) != 0) ^ (keyCode == java_awt_event_KeyEvent_VK_ALT_GRAPH)) - { - modifiers |= java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK; - } - if (((state & Button1Mask) != 0) ^ (button == java_awt_event_MouseEvent_BUTTON1)) { - modifiers |= java_awt_event_InputEvent_BUTTON1_DOWN_MASK; - } - if (((state & Button2Mask) != 0) ^ (button == java_awt_event_MouseEvent_BUTTON2)) { - modifiers |= java_awt_event_InputEvent_BUTTON2_DOWN_MASK; - } - if (((state & Button3Mask) != 0) ^ (button == java_awt_event_MouseEvent_BUTTON3)) { - modifiers |= java_awt_event_InputEvent_BUTTON3_DOWN_MASK; - } - return modifiers; -} - -/* Returns which mouse button has changed state - */ -jint -getButton(uint32_t button) -{ - switch (button) { - case Button1: - return java_awt_event_MouseEvent_BUTTON1; - case Button2: - return java_awt_event_MouseEvent_BUTTON2; - case Button3: - return java_awt_event_MouseEvent_BUTTON3; - } - return java_awt_event_MouseEvent_NOBUTTON; -} - - -/* This function changes the state of the native XEvent AFTER - * the corresponding Java event has been processed. The XEvent - * needs to be modified before it is dispatched to the native widget. - */ -void -awt_modify_KeyEvent(JNIEnv *env, XEvent *xevent, jobject jevent) -{ - jint keyCode; - jchar keyChar; - jint modifiers; - KeySym keysym = (KeySym) java_awt_event_KeyEvent_CHAR_UNDEFINED; - - if (xevent->type != KeyPress && xevent->type != KeyRelease) { - return; - } - - keyCode = (*env)->GetIntField(env, jevent, keyEventIDs.keyCode); - keyChar = (*env)->GetCharField(env, jevent, keyEventIDs.keyChar); - modifiers = (*env)->GetIntField(env, jevent, inputEventIDs.modifiers); - - switch (keyCode) { - case java_awt_event_KeyEvent_VK_MULTIPLY: - case java_awt_event_KeyEvent_VK_SUBTRACT: - case java_awt_event_KeyEvent_VK_DIVIDE: - /* Bugid 4103229: Change the X event so these three Numpad - * keys work with the NumLock off. For some reason, Motif - * widgets ignore the events produced by these three keys - * unless the NumLock is on. It also ignores them if some - * other modifiers are set. Turn off ALL modifiers, then - * turn NumLock mask on in the X event. - */ - xevent->xkey.state = awt_NumLockMask; - return; - case java_awt_event_KeyEvent_VK_ENTER: - case java_awt_event_KeyEvent_VK_BACK_SPACE: - case java_awt_event_KeyEvent_VK_TAB: - case java_awt_event_KeyEvent_VK_ESCAPE: - case java_awt_event_KeyEvent_VK_ADD: - case java_awt_event_KeyEvent_VK_DECIMAL: - case java_awt_event_KeyEvent_VK_NUMPAD0: - case java_awt_event_KeyEvent_VK_NUMPAD1: - case java_awt_event_KeyEvent_VK_NUMPAD2: - case java_awt_event_KeyEvent_VK_NUMPAD3: - case java_awt_event_KeyEvent_VK_NUMPAD4: - case java_awt_event_KeyEvent_VK_NUMPAD5: - case java_awt_event_KeyEvent_VK_NUMPAD6: - case java_awt_event_KeyEvent_VK_NUMPAD7: - case java_awt_event_KeyEvent_VK_NUMPAD8: - case java_awt_event_KeyEvent_VK_NUMPAD9: - keysym = awt_getX11KeySym(keyCode); - break; - case java_awt_event_KeyEvent_VK_DELETE: - /* For some reason XKeysymToKeycode returns incorrect value for - * Delete, so we don't want to modify the original event - */ - break; - default: - if (keyChar < (KeySym) 256) { - keysym = (KeySym) keyChar; - } else { - keysym = awt_getX11KeySym(keyCode); - } - break; - } - - if (keysym < (KeySym) 256) { - if (modifiers & java_awt_event_InputEvent_CTRL_MASK) { - switch (keysym + 64) { - case '[': - case ']': - case '\\': - case '_': - keysym += 64; - break; - default: - if (isalpha((int32_t)(keysym + 'a' - 1))) { - keysym += ('a' - 1); - } - break; - } - } - /* - * 0xff61 is Unicode value of first XK_kana_fullstop. - * We need X Keysym to Unicode map in post1.1 release - * to support more international keyboards. - */ - if (keysym >= (KeySym) 0xff61 && keysym <= (KeySym) 0xff9f) { - keysym = keysym - 0xff61 + XK_kana_fullstop; - } - xevent->xkey.keycode = XKeysymToKeycode(awt_display, keysym); - } - - if (keysym >= 'A' && keysym <= 'Z') { - xevent->xkey.state |= ShiftMask; - } - if (modifiers & java_awt_event_InputEvent_SHIFT_DOWN_MASK) { - xevent->xkey.state |= ShiftMask; - } - if (modifiers & java_awt_event_InputEvent_CTRL_DOWN_MASK) { - xevent->xkey.state |= ControlMask; - } - if (modifiers & java_awt_event_InputEvent_META_DOWN_MASK) { - xevent->xkey.state |= awt_MetaMask; - } - if (modifiers & java_awt_event_InputEvent_ALT_DOWN_MASK) { - xevent->xkey.state |= awt_AltMask; - } - if (modifiers & java_awt_event_InputEvent_ALT_GRAPH_DOWN_MASK) { - xevent->xkey.state |= awt_ModeSwitchMask; - } - if (modifiers & java_awt_event_InputEvent_BUTTON1_DOWN_MASK) { - xevent->xkey.state |= Button1Mask; - } - if (modifiers & java_awt_event_InputEvent_BUTTON2_DOWN_MASK) { - xevent->xkey.state |= Button2Mask; - } - if (modifiers & java_awt_event_InputEvent_BUTTON3_DOWN_MASK) { - xevent->xkey.state |= Button3Mask; - } -} - - -/* Called from handleKeyEvent. The purpose of this function is - * to check for a list of vendor-specific keysyms, most of which - * have values greater than 0xFFFF. Most of these keys don't map - * to unicode characters, but some do. - * - * For keys that don't map to unicode characters, the keysym - * is irrelevant at this point. We set the keysym to zero - * to ensure that the switch statement immediately below - * this function call (in adjustKeySym) won't incorrectly act - * on them after the high bits are stripped off. - * - * For keys that do map to unicode characters, we change the keysym - * to the equivalent that is < 0xFFFF - */ -static void -handleVendorKeySyms(XEvent *event, KeySym *keysym) -{ - KeySym originalKeysym = *keysym; - - switch (*keysym) { - /* Apollo (HP) vendor-specific from */ - case apXK_Copy: - case apXK_Cut: - case apXK_Paste: - /* DEC vendor-specific from */ - case DXK_ring_accent: /* syn usldead_ring */ - case DXK_circumflex_accent: - case DXK_cedilla_accent: /* syn usldead_cedilla */ - case DXK_acute_accent: - case DXK_grave_accent: - case DXK_tilde: - case DXK_diaeresis: - /* Sun vendor-specific from */ - case SunXK_FA_Grave: - case SunXK_FA_Circum: - case SunXK_FA_Tilde: - case SunXK_FA_Acute: - case SunXK_FA_Diaeresis: - case SunXK_FA_Cedilla: - case SunXK_F36: /* Labeled F11 */ - case SunXK_F37: /* Labeled F12 */ - case SunXK_Props: - case SunXK_Copy: - case SunXK_Open: - case SunXK_Paste: - case SunXK_Cut: - /* Other vendor-specific from HPkeysym.h */ - case hpXK_mute_acute: /* syn usldead_acute */ - case hpXK_mute_grave: /* syn usldead_grave */ - case hpXK_mute_asciicircum: /* syn usldead_asciicircum */ - case hpXK_mute_diaeresis: /* syn usldead_diaeresis */ - case hpXK_mute_asciitilde: /* syn usldead_asciitilde */ - case osfXK_Copy: - case osfXK_Cut: - case osfXK_Paste: - case osfXK_PageUp: - case osfXK_PageDown: - case osfXK_EndLine: - case osfXK_Clear: - case osfXK_Left: - case osfXK_Up: - case osfXK_Right: - case osfXK_Down: - case osfXK_Prior: - case osfXK_Next: - case osfXK_Insert: - case osfXK_Undo: - case osfXK_Help: - *keysym = 0; - break; - /* - * The rest DO map to unicode characters, so translate them - */ - case osfXK_BackSpace: - *keysym = XK_BackSpace; - break; - case osfXK_Escape: - *keysym = XK_Escape; - break; - case osfXK_Cancel: - *keysym = XK_Cancel; - break; - case osfXK_Delete: - *keysym = XK_Delete; - break; - default: - break; - } - - if (originalKeysym != *keysym) { - DTRACE_PRINTLN2("In handleVendorKeySyms: originalKeysym=%x, keysym=%x", - originalKeysym, *keysym); - } -} - -/* Called from handleKeyEvent. - * The purpose of this function is to adjust the keysym and XEvent - * keycode for a key event. This is basically a conglomeration of - * bugfixes that require these adjustments. - */ -static void -adjustKeySym(XEvent *event, KeySym *keysym) -{ - KeySym originalKeysym = *keysym; - - /* We have seen bits set in the high two bytes on Linux, - * which prevents this switch statement from executing - * correctly. Strip off the high order bits. - */ - *keysym &= 0x0000FFFF; - - switch (*keysym) { - case XK_Return: - *keysym = XK_Linefeed; /* fall thru */ - case XK_BackSpace: - case XK_Tab: - case XK_Linefeed: - case XK_Escape: - case XK_Delete: - /* strip off highorder bits defined in keysymdef.h - * I think doing this converts them to values that - * we can cast to jchars and use as java keychars. - * If so, it's really a hack. - */ - *keysym &= 0x007F; - break; - case XK_Cancel: - *keysym = 0x0018; /* the unicode char for Cancel */ - break; - case XK_KP_Decimal: - *keysym = '.'; - break; - case XK_KP_Add: - *keysym = '+'; - break; - case XK_F24: /* NumLock off */ - case XK_KP_Subtract: /* NumLock on */ - *keysym = '-'; - break; - case XK_F25: /* NumLock off */ - case XK_KP_Divide: /* NumLock on */ - *keysym = '/'; - break; - case XK_F26: /* NumLock off */ - case XK_KP_Multiply: /* NumLock on */ - *keysym = '*'; - break; - case XK_KP_Equal: - *keysym = '='; - break; - case XK_KP_0: - *keysym = '0'; - break; - case XK_KP_1: - *keysym = '1'; - break; - case XK_KP_2: - *keysym = '2'; - break; - case XK_KP_3: - *keysym = '3'; - break; - case XK_KP_4: - *keysym = '4'; - break; - case XK_KP_5: - *keysym = '5'; - break; - case XK_KP_6: - *keysym = '6'; - break; - case XK_KP_7: - *keysym = '7'; - break; - case XK_KP_8: - *keysym = '8'; - break; - case XK_KP_9: - *keysym = '9'; - break; - case XK_KP_Left: /* Bug 4350175 */ - *keysym = XK_Left; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Up: - *keysym = XK_Up; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Right: - *keysym = XK_Right; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Down: - *keysym = XK_Down; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Home: - *keysym = XK_Home; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_End: - *keysym = XK_End; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Page_Up: - *keysym = XK_Page_Up; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Page_Down: - *keysym = XK_Page_Down; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Begin: - *keysym = XK_Begin; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Insert: - *keysym = XK_Insert; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - break; - case XK_KP_Delete: - *keysym = XK_Delete; - event->xkey.keycode = XKeysymToKeycode(awt_display, *keysym); - *keysym &= 0x007F; - break; - case XK_KP_Enter: - *keysym = XK_Linefeed; - event->xkey.keycode = XKeysymToKeycode(awt_display, XK_Return); - *keysym &= 0x007F; - break; - default: - break; - } - - if (originalKeysym != *keysym) { - DTRACE_PRINTLN2("In adjustKeySym: originalKeysym=%x, keysym=%x", - originalKeysym, *keysym); - } -} - -/* - * What a sniffer sez? - * Xsun and Xorg if NumLock is on do two thing different: - * keep Keypad key in different places of keysyms array and - * ignore/obey "ModLock is ShiftLock", so we should choose. - * People say, it's right to use behavior and not Vendor tags to decide. - * Maybe. But why these tags were invented, then? - * TODO: use behavior, not tags. Maybe. - */ -static Boolean -isXsunServer(XEvent *event) { - if( awt_ServerDetected ) return awt_IsXsun; - if( strncmp( ServerVendor( event->xkey.display ), "Sun Microsystems, Inc.", 32) ) { - awt_ServerDetected = True; - awt_IsXsun = False; - return False; - } - // Now, it's Sun. It still may be Xorg though, eg on Solaris 10, x86. - // Today (2005), VendorRelease of Xorg is a Big Number unlike Xsun. - if( VendorRelease( event->xkey.display ) > 10000 ) { - awt_ServerDetected = True; - awt_IsXsun = False; - return False; - } - awt_ServerDetected = True; - awt_IsXsun = True; - return True; -} -static Boolean -isKPevent(XEvent *event) -{ - /* - Xlib manual, ch 12.7 says, as a first rule for choice of keysym: - The numlock modifier is on and the second KeySym is a keypad KeySym. In this case, - if the Shift modifier is on, or if the Lock modifier is on and is interpreted as ShiftLock, - then the first KeySym is used, otherwise the second KeySym is used. - - However, Xsun server does ignore ShiftLock and always takes 3-rd element from an array. - - So, is it a keypad keysym? - */ - jint mods = getModifiers(event->xkey.state, 0, event->xkey.keycode); - Boolean bsun = isXsunServer( event ); - - return IsKeypadKey( XKeycodeToKeysym(event->xkey.display, event->xkey.keycode,(bsun && !awt_UseXKB ? 2 : 1) ) ); -} -/* - * In a next redesign, get rid of this code altogether. - * - */ -static void -handleKeyEventWithNumLockMask_New(XEvent *event, KeySym *keysym) -{ - KeySym originalKeysym = *keysym; - if( !isKPevent( event ) ) { - return; - } - if( isXsunServer( event ) && !awt_UseXKB ) { - if( (event->xkey.state & ShiftMask) ) { // shift modifier is on - *keysym = XKeycodeToKeysym(event->xkey.display, - event->xkey.keycode, 3); - }else { - *keysym = XKeycodeToKeysym(event->xkey.display, - event->xkey.keycode, 2); - } - } else { - if( (event->xkey.state & ShiftMask) || // shift modifier is on - ((event->xkey.state & LockMask) && // lock modifier is on - (awt_ModLockIsShiftLock)) ) { // it is interpreted as ShiftLock - *keysym = XKeycodeToKeysym(event->xkey.display, - event->xkey.keycode, 0); - }else{ - *keysym = XKeycodeToKeysym(event->xkey.display, - event->xkey.keycode, 1); - } - } -} - -/* Called from handleKeyEvent. - * The purpose of this function is to make some adjustments to keysyms - * that have been found to be necessary when the NumLock mask is set. - * They come from various bug fixes and rearchitectures. - * This function is meant to be called when - * (event->xkey.state & awt_NumLockMask) is TRUE. - */ -static void -handleKeyEventWithNumLockMask(XEvent *event, KeySym *keysym) -{ - KeySym originalKeysym = *keysym; - -#ifndef __linux__ - /* The following code on Linux will cause the keypad keys - * not to echo on JTextField when the NumLock is on. The - * keysyms will be 0, because the last parameter 2 is not defined. - * See Xlib Programming Manual, O'Reilly & Associates, Section - * 9.1.5 "Other Keyboard-handling Routines", "The meaning of - * the keysym list beyond the first two (unmodified, Shift or - * Shift Lock) is not defined." - */ - - /* Translate again with NumLock as modifier. */ - /* ECH - I wonder why we think that NumLock corresponds to 2? - * On Linux, we've seen xmodmap -pm yield mod2 as NumLock, - * but I don't know that it will be for every configuration. - * Perhaps using the index (modn in awt_MToolkit.c:setup_modifier_map) - * would be more correct. - */ - *keysym = XKeycodeToKeysym(event->xkey.display, - event->xkey.keycode, 2); - if (originalKeysym != *keysym) { - DTRACE_PRINTLN3("%s=%x, keysym=%x", - "In handleKeyEventWithNumLockMask ifndef linux: originalKeysym", - originalKeysym, *keysym); - } -#endif - - /* Note: the XK_R? key assignments are for Type 4 kbds */ - switch (*keysym) { - case XK_R13: - *keysym = XK_KP_1; - break; - case XK_R14: - *keysym = XK_KP_2; - break; - case XK_R15: - *keysym = XK_KP_3; - break; - case XK_R10: - *keysym = XK_KP_4; - break; - case XK_R11: - *keysym = XK_KP_5; - break; - case XK_R12: - *keysym = XK_KP_6; - break; - case XK_R7: - *keysym = XK_KP_7; - break; - case XK_R8: - *keysym = XK_KP_8; - break; - case XK_R9: - *keysym = XK_KP_9; - break; - case XK_KP_Insert: - *keysym = XK_KP_0; - break; - case XK_KP_Delete: - *keysym = XK_KP_Decimal; - break; - case XK_R4: - *keysym = XK_KP_Equal; /* Type 4 kbd */ - break; - case XK_R5: - *keysym = XK_KP_Divide; - break; - case XK_R6: - *keysym = XK_KP_Multiply; - break; - /* - * Need the following keysym changes for Linux key releases. - * Sometimes the modifier state gets messed up, so we get a - * KP_Left when we should get a KP_4, for example. - * XK_KP_Insert and XK_KP_Delete were already handled above. - */ - case XK_KP_Left: - *keysym = XK_KP_4; - break; - case XK_KP_Up: - *keysym = XK_KP_8; - break; - case XK_KP_Right: - *keysym = XK_KP_6; - break; - case XK_KP_Down: - *keysym = XK_KP_2; - break; - case XK_KP_Home: - *keysym = XK_KP_7; - break; - case XK_KP_End: - *keysym = XK_KP_1; - break; - case XK_KP_Page_Up: - *keysym = XK_KP_9; - break; - case XK_KP_Page_Down: - *keysym = XK_KP_3; - break; - case XK_KP_Begin: - *keysym = XK_KP_5; - break; - default: - break; - } - - if (originalKeysym != *keysym) { - DTRACE_PRINTLN2("In handleKeyEventWithNumLockMask: originalKeysym=%x, keysym=%x", - originalKeysym, *keysym); - } -} - -static void -handleKeyEvent(jint keyEventId, - XEvent *event, - XtPointer *client_data, - Boolean *cont, - Boolean passEvent) -{ - KeySym keysym = NoSymbol; - jint keycode = java_awt_event_KeyEvent_VK_UNDEFINED; - Modifiers mods = 0; - Boolean mapsToUnicodeChar = FALSE; - jint keyLocation = java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN; - jint modifiers = 0; - - DTRACE_PRINTLN4("\nEntered handleKeyEvent: type=%d, xkeycode=%x, xstate=%x, keysym=%x", - event->type, event->xkey.keycode, event->xkey.state, keysym); - - if (currentX11InputMethodInstance != NULL - && keyEventId == java_awt_event_KeyEvent_KEY_PRESSED - && event->xkey.window == currentFocusWindow) - { - /* invokes XmbLookupString to get a committed string or keysym if any. */ - if (awt_x11inputmethod_lookupString((XKeyPressedEvent*)event, &keysym)) { - *cont = FALSE; - return; - } - } - - /* Ignore the keysym found immediately above in - * awt_x11inputmethod_lookupString; the methodology in that function - * sometimes returns incorrect results. - * - * Get keysym without taking modifiers into account first. - * This keysym is not necessarily for the character that was typed: - * it is for the primary layer. So, if $ were typed by pressing - * shift-4, this call should give us 4, not $ - * - * We only want this keysym so we can use it to index into the - * keymapTable to get the Java keycode associated with the - * primary layer key that was pressed. - */ - keysym = XKeycodeToKeysym(event->xkey.display, event->xkey.keycode, 0); - - /* Linux: Sometimes the keysym returned is uppercase when CapsLock is - * on and LockMask is not set in event->xkey.state. - */ - if (keysym >= (KeySym) 'A' && keysym <= (KeySym) 'Z') { - event->xkey.state |= LockMask; - keysym = (KeySym) tolower((int32_t) keysym); - } - - DTRACE_PRINTLN4("In handleKeyEvent: type=%d, xkeycode=%x, xstate=%x, keysym=%x", - event->type, event->xkey.keycode, event->xkey.state, keysym); - - if (keysym == NoSymbol) { - *cont = TRUE; - return; - } - - if (keysym < (KeySym) 256) { - keysymToAWTKeyCode(keysym, &keycode, &mapsToUnicodeChar, &keyLocation); - - /* Now get real keysym which looks at modifiers - * XtGetActionKeySym() returns wrong value with Kana Lock, - * so use XtTranslateKeycode(). - */ - XtTranslateKeycode(event->xkey.display, (KeyCode) event->xkey.keycode, - event->xkey.state, &mods, &keysym); - DTRACE_PRINTLN6("%s: type=%d, xkeycode=%x, xstate=%x, keysym=%x, xmods=%d", - "In handleKeyEvent keysym<256 ", event->type, event->xkey.keycode, - event->xkey.state, keysym, mods); - - /* Linux: With caps lock on, chars echo lowercase. */ - if ((event->xkey.state & LockMask) && - (keysym >= (KeySym) 'a' && keysym <= (KeySym) 'z')) - { - keysym = (KeySym) toupper((int32_t) keysym); - } - - if ((event->xkey.state & ControlMask)) { - switch (keysym) { - case '[': - case ']': - case '\\': - case '_': - keysym -= 64; - break; - default: - if (isalpha((int32_t) keysym)) { - keysym = (KeySym) tolower((int32_t) keysym) - 'a' + 1; - } - break; - } - } - - if (keysym >= (KeySym) XK_kana_fullstop && - keysym <= (KeySym) XK_semivoicedsound) { - /* - * 0xff61 is Unicode value of first XK_kana_fullstop. - * We need X Keysym to Unicode map in post1.1 release - * to support more intenational keyboard. - */ - keysym = keysym - XK_kana_fullstop + 0xff61; - } - - modifiers = getModifiers(event->xkey.state, 0, keycode); - DTRACE_PRINTLN6("%s: type=%d, xkeycode=%x, xstate=%x, keysym=%x, AWTmodifiers=%d", - "In handleKeyEvent keysym<256 ", event->type, event->xkey.keycode, - event->xkey.state, keysym, modifiers); - - awt_post_java_key_event(client_data, - keyEventId, - (passEvent == TRUE) ? event : NULL, - event->xkey.time, - keycode, - (jchar) keysym, - modifiers, - keyLocation, - event); - - if (keyEventId == java_awt_event_KeyEvent_KEY_PRESSED) { - awt_post_java_key_event(client_data, - java_awt_event_KeyEvent_KEY_TYPED, - NULL, - event->xkey.time, - java_awt_event_KeyEvent_VK_UNDEFINED, - (jchar) keysym, - modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, - event); - - } - } else { - if (event->xkey.state & awt_NumLockMask) { - if( awt_UseType4Patch ) { - handleKeyEventWithNumLockMask(event, &keysym); - }else{ - handleKeyEventWithNumLockMask_New(event, &keysym); - } - } - - if (keysym == XK_ISO_Left_Tab) { - keysym = XK_Tab; - } - - /* The keysym here does not consider modifiers, so these results - * are relevant to the KEY_PRESSED event only, not the KEY_TYPED - */ - keysymToAWTKeyCode(keysym, &keycode, &mapsToUnicodeChar, &keyLocation); - DTRACE_PRINTLN3("In handleKeyEvent: keysym=%x, AWTkeycode=%x, mapsToUnicodeChar=%d", - keysym, keycode, mapsToUnicodeChar); - - if (keycode == java_awt_event_KeyEvent_VK_UNDEFINED) { - *cont = TRUE; - return; - } - - /* Need to take care of keysyms > 0xFFFF here - * Most of these keys don't map to unicode characters, but some do. - * - * For keys that don't map to unicode characters, the keysym - * is irrelevant at this point. We set the keysym to zero - * to ensure that the switch statement immediately below - * this function call (in adjustKeySym) won't incorrectly act - * on them after the high bits are stripped off. - * - * For keys that do map to unicode characters, we change the keysym - * to the equivalent that is < 0xFFFF - */ - handleVendorKeySyms(event, &keysym); - - /* This function is a conglomeration of bug fixes that adjust - * the keysym and XEvent keycode for this key event. - */ - adjustKeySym(event, &keysym); - - modifiers = getModifiers(event->xkey.state, 0, keycode); - - DTRACE_PRINTLN6("%s: type=%d, xkeycode=%x, xstate=%x, keysym=%x, xmods=%d", - "In handleKeyEvent keysym>=256 ", event->type, event->xkey.keycode, - event->xkey.state, keysym, mods); - DTRACE_PRINTLN2(" AWTkeycode=%x, AWTmodifiers=%d", - keycode, modifiers); - - awt_post_java_key_event(client_data, - keyEventId, - (passEvent == TRUE) ? event : NULL, - event->xkey.time, - keycode, - (jchar) (mapsToUnicodeChar ? keysym : - java_awt_event_KeyEvent_CHAR_UNDEFINED), - modifiers, - keyLocation, - event); - - /* If this was a keyPressed event, we may need to post a - * keyTyped event, too. Otherwise, return. - */ - if (keyEventId == java_awt_event_KeyEvent_KEY_RELEASED) { - return; - } - DTRACE_PRINTLN("This is a keyPressed event"); - - /* XtTranslateKeycode seems to return slightly bogus values for the - * Escape key (keysym==1004ff69==osfXK_Cancel, xmods=2) on Solaris, - * so we just create the KEY_TYPED as a special case for Escape here. - * (Linux works fine, and this was also okay running under VNC.) - */ - if (keycode == java_awt_event_KeyEvent_VK_ESCAPE) { - awt_post_java_key_event(client_data, - java_awt_event_KeyEvent_KEY_TYPED, - NULL, - event->xkey.time, - java_awt_event_KeyEvent_VK_UNDEFINED, - (jchar) keysym, - modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, - event); - - DTRACE_PRINTLN("Posted a keyTyped event for VK_ESCAPE"); - return; - } - - /* Now get real keysym which looks at modifiers for keyTyped event. - * XtGetActionKeySym() returns wrong value with Kana Lock, - * so use XtTranslateKeycode(). - */ - XtTranslateKeycode(event->xkey.display, (KeyCode) event->xkey.keycode, - event->xkey.state, &mods, &keysym); - DTRACE_PRINTLN6("%s: type=%d, xkeycode=%x, xstate=%x, keysym=%x, xmods=%d", - "In handleKeyEvent keysym>=256 ", event->type, event->xkey.keycode, - event->xkey.state, keysym, mods); - - if (keysym == NoSymbol) { - return; - } - - if (event->xkey.state & awt_NumLockMask) { - if( awt_UseType4Patch ) { - handleKeyEventWithNumLockMask(event, &keysym); - }else{ - handleKeyEventWithNumLockMask_New(event, &keysym); - } - } - - if (keysym == XK_ISO_Left_Tab) { - keysym = XK_Tab; - } - - /* Map the real keysym to a Java keycode */ - keysymToAWTKeyCode(keysym, &keycode, &mapsToUnicodeChar, &keyLocation); - DTRACE_PRINTLN3("In handleKeyEvent: keysym=%x, AWTkeycode=%x, mapsToUnicodeChar=%d", - keysym, keycode, mapsToUnicodeChar); - - /* If it doesn't map to a Unicode character, don't post a keyTyped event */ - if (!mapsToUnicodeChar) { - return; - } - - handleVendorKeySyms(event, &keysym); - adjustKeySym(event, &keysym); - DTRACE_PRINT4("In handleKeyEvent: type=%d, xkeycode=%x, xstate=%x, keysym=%x", - event->type, event->xkey.keycode, event->xkey.state, keysym); - DTRACE_PRINTLN2(", AWTkeycode=%x, AWTmodifiers=%d", keycode, modifiers); - - awt_post_java_key_event(client_data, - java_awt_event_KeyEvent_KEY_TYPED, - NULL, - event->xkey.time, - java_awt_event_KeyEvent_VK_UNDEFINED, - (jchar) keysym, - modifiers, - java_awt_event_KeyEvent_KEY_LOCATION_UNKNOWN, - event); - } -} - - -static void -translateXY(Widget w, jint *xp, jint *yp) -{ - Position wx, wy; - - XtVaGetValues(w, XmNx, &wx, XmNy, &wy, NULL); - *xp += wx; - *yp += wy; -} - - -/* - * Part fix for bug id 4017222. Return the root widget of the Widget parameter. - */ -Widget -getRootWidget(Widget w) { - if(!w) return NULL; - - if(XtParent(w)) - return getRootWidget(XtParent(w)); - else - return w; -} - -#define ABS(x) ((x) < 0 ? -(x) : (x)) - -/* This proc is the major AWT engine for processing X events - * for Java components and is the proc responsible for taking - * X events and posting their corresponding Java event to the - * AWT EventQueue. It is set up to be called both from an Xt - * event handler and directly from MToolkit.c:shouldDispatchToWidget(). - * For the latter case, the "passEvent" parameter will be true, - * which means that the event is being posted on the Java queue - * BEFORE it is being passed to Xt and so a copy of the X event - * must be stored within the Java event structure so it can be - * dispatched to Xt later on. - */ -void -awt_canvas_handleEvent(Widget w, XtPointer client_data, - XEvent * event, struct WidgetInfo *winfo, - Boolean * cont, Boolean passEvent) -{ - static jint clickCount = 1; - static XtPointer lastPeer = NULL; - static Time lastTime = 0; - static jint lastx = 0; - static jint lasty = 0; - static int32_t rbutton = 0; - static int32_t lastButton = 0; - Boolean popupTrigger; - jint x, y; - jint modifiers = 0; - jint button = java_awt_event_MouseEvent_NOBUTTON; - uint32_t fullRelease = 0; - WidgetClass wclass = 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; - } - *cont = FALSE; - - switch (event->type) { - case SelectionClear: - case SelectionNotify: - case SelectionRequest: - *cont = TRUE; - break; - case GraphicsExpose: - case Expose: - HandleExposeEvent(w, (jobject) client_data, event); - break; - case FocusIn: - case FocusOut: - *cont = TRUE; - updateCursor(client_data, CACHE_UPDATE); // 4840883 - // We no longer listen to the Motif focus notifications. - // Instead we call focus callbacks in the times we think - // appropriate trying to simulate correct Motif widget system - // behavior. - break; - case ButtonPress: - x = (jint) event->xbutton.x; - y = (jint) event->xbutton.y; - - if (lastPeer == client_data && - lastButton == event->xbutton.button && - (event->xbutton.time - lastTime) <= (Time) awt_multiclick_time) { - clickCount++; - } else { - clickCount = 1; - lastPeer = client_data; - lastButton = event->xbutton.button; - lastx = x; - lasty = y; - } - lastTime = event->xbutton.time; - - /* On MouseEvent.MOUSE_PRESSED, RELEASED and CLICKED only new modifiers and - * modifier for changed mouse button are set. - */ - button = getButton(event->xbutton.button); - modifiers = getModifiers(event->xbutton.state, button, 0); - - - /* If the widget is a subwidget on a component we need to - * translate the x,y into the coordinate space of the component. - */ - if (winfo != NULL && winfo->widget != winfo->origin) { - translateXY(winfo->widget, &x, &y); - } - - if (XtIsSubclass(w, xmScrollBarWidgetClass) && findWidgetInfo(w) != NULL) { - passEvent = FALSE; - *cont = TRUE; - } - - /* Mouse wheel events come in as button 4 (wheel up) and - * button 5 (wheel down). - */ - if (lastButton == 4 || lastButton == 5) { - *cont = FALSE; - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_WHEEL, - (passEvent == TRUE) ? event : NULL, - event->xbutton.time, - modifiers, - x, y, - (jint) (event->xbutton.x_root), - (jint) (event->xbutton.y_root), - clickCount, - False, - lastButton == 4 ? -1 : 1, - java_awt_event_MouseEvent_NOBUTTON); - /* we're done with this event */ - break; - } - - /* (4168006) Find out out how many buttons we have - * If this is a two button system Right == 2 - * If this is a three button system Right == 3 - */ - if ( rbutton == 0 ) { - unsigned char map[5]; - rbutton = XGetPointerMapping ( awt_display, map, 3 ); - } - - if (event->xbutton.button == rbutton || event->xbutton.button > 2) { - popupTrigger = True; - } else { - popupTrigger = False; - } - - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_PRESSED, - (passEvent == TRUE) ? event : NULL, - event->xbutton.time, - modifiers, - x, y, - (jint) (event->xbutton.x_root), - (jint) (event->xbutton.y_root), - clickCount, - popupTrigger, 0, - button); - - drag_source = w; - - break; - case ButtonRelease: - if (XtIsSubclass(w, xmScrollBarWidgetClass) && findWidgetInfo(w) != NULL) { - passEvent = FALSE; - *cont = TRUE; - } - - /* - * For button 4 & 5 (mouse wheel) we can simply ignore this event. - * We dispatch the wheel on the ButtonPress. - */ - if (event->xbutton.button == 4 || - event->xbutton.button == 5) { - break; - } - - prevWidget = NULL; - x = (jint) event->xbutton.x; - y = (jint) event->xbutton.y; - /* On MouseEvent.MOUSE_PRESSED, RELEASED and CLICKED only new modifiers and - * modifier for changed mouse button are set. - */ - button = getButton(event->xbutton.button); - modifiers = getModifiers(event->xbutton.state, button, 0); - - fullRelease = - ((event->xbutton.state & Button1Mask) && - !(event->xbutton.state & Button2Mask) && - !(event->xbutton.state & Button3Mask) && - (event->xbutton.button == Button1)) || - (!(event->xbutton.state & Button1Mask) && - (event->xbutton.state & Button2Mask) && - !(event->xbutton.state & Button3Mask) && - (event->xbutton.button == Button2)) || - (!(event->xbutton.state & Button1Mask) && - !(event->xbutton.state & Button2Mask) && - (event->xbutton.state & Button3Mask) && - (event->xbutton.button == Button3)); - - /* If the widget is a subwidget on a component we need to - * translate the x,y into the coordinate space of the component. - */ - if (winfo != NULL && winfo->widget != winfo->origin) { - translateXY(winfo->widget, &x, &y); - } - drag_source = NULL; - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_RELEASED, - (passEvent == TRUE) ? event : NULL, - event->xbutton.time, - modifiers, - x, y, - (jint) (event->xbutton.x_root), - (jint) (event->xbutton.y_root), - clickCount, - FALSE, 0, - button); - - if (lastPeer == client_data) { - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_CLICKED, - NULL, - event->xbutton.time, - modifiers, - x, y, - (jint) (event->xbutton.x_root), - (jint) (event->xbutton.y_root), - clickCount, - FALSE, 0, - button); - } - - if (fullRelease) { - updateCursor(client_data, UPDATE_ONLY); - } - - break; - case MotionNotify: - if (XtIsSubclass(w, xmScrollBarWidgetClass) && findWidgetInfo(w) != NULL) { - passEvent = FALSE; - *cont = TRUE; - } - - x = (jint) event->xmotion.x; - y = (jint) event->xmotion.y; - - /* If a motion comes in while a multi-click is pending, - * allow a smudge factor so that moving the mouse by a small - * amount does not wipe out the multi-click state variables. - */ - if (!(lastPeer == client_data && - ((event->xmotion.time - lastTime) <= (Time) awt_multiclick_time) && - (ABS(lastx - x) < awt_multiclick_smudge && - ABS(lasty - y) < awt_multiclick_smudge))) { - clickCount = (jint) 0; - lastTime = (Time) 0; - lastPeer = NULL; - lastx = (jint) 0; - lasty = (jint) 0; - } - /* On other MouseEvent only new modifiers and - * old mouse modifiers are set. - */ - modifiers = getModifiers(event->xmotion.state, 0, 0); - - /* If the widget is a subwidget on a component we need to - * translate the x,y into the coordinate space of the component. - */ - if (winfo != NULL && winfo->widget != winfo->origin) { - translateXY(winfo->widget, &x, &y); - } - if (event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) { - if (!clickCount) { - - /* - Fix for bug id 4017222. A button is down, so EnterNotify and - LeaveNotify events are only being sent to this widget. If - the pointer has moved over a new widget, manually generate - MouseEnter and MouseExit and send them to the right widgets. - */ - - extern Widget awt_WidgetAtXY(Widget root, Position x, Position y); - extern Widget awt_GetWidgetAtPointer(); - Widget currentWidget=NULL, topLevelW; - Position wx=0, wy=0; - - XtTranslateCoords(w, (int32_t) x, (int32_t) y, &wx, &wy); - /* Get the top level widget underneath the mouse pointer */ - currentWidget = awt_GetWidgetAtPointer(); - /* Get the exact widget at the current XY from the top level */ - currentWidget = awt_WidgetAtXY(currentWidget, wx, wy); - if ((prevWidget != NULL) && (prevWidget != w) && - (currentWidget != prevWidget) && awt_isAwtWidget(prevWidget) && - !prevWidget->core.being_destroyed) { - XtPointer userData=NULL; - XtVaGetValues(prevWidget, XmNuserData, &userData, NULL); - if (userData) { - awt_post_java_mouse_event(userData, - java_awt_event_MouseEvent_MOUSE_EXITED, - (passEvent==TRUE) ? event : NULL, - event->xmotion.time, - modifiers, - x, y, - (jint) (event->xmotion.x_root), - (jint) (event->xmotion.y_root), - clickCount, - FALSE, 0, - java_awt_event_MouseEvent_NOBUTTON); - } - } - - if ((currentWidget != NULL) && (currentWidget != w) && - (currentWidget != prevWidget) && awt_isAwtWidget(currentWidget)) { - XtPointer userData=NULL; - XtVaGetValues(currentWidget, XmNuserData, &userData, NULL); - if (userData) { - awt_post_java_mouse_event(userData, - java_awt_event_MouseEvent_MOUSE_ENTERED, - (passEvent==TRUE) ? event : NULL, - event->xmotion.time, - modifiers, - x, y, - (jint) (event->xmotion.x_root), - (jint) (event->xmotion.y_root), - clickCount, - FALSE, 0, - java_awt_event_MouseEvent_NOBUTTON); - } - - updateCursor(userData, CACHE_ONLY); - awt_util_setCursor(currentWidget, None); - } - - prevWidget = currentWidget; - /* end 4017222 */ - - - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_DRAGGED, - (passEvent == TRUE) ? event : NULL, - event->xmotion.time, - modifiers, - x, y, - (jint) (event->xmotion.x_root), - (jint) (event->xmotion.y_root), - clickCount, - FALSE, 0, - java_awt_event_MouseEvent_NOBUTTON); - - } - } else { - - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_MOVED, - (passEvent == TRUE) ? event : NULL, - event->xmotion.time, - modifiers, - x, y, - (jint) (event->xmotion.x_root), - (jint) (event->xmotion.y_root), - clickCount, - FALSE, 0, - java_awt_event_MouseEvent_NOBUTTON); - } - break; - case KeyPress: - handleKeyEvent(java_awt_event_KeyEvent_KEY_PRESSED, - event, client_data, cont, TRUE); - break; - case KeyRelease: - handleKeyEvent(java_awt_event_KeyEvent_KEY_RELEASED, - event, client_data, cont, TRUE); - break; - case EnterNotify: - case LeaveNotify: -/* - printf("----->%s on %s(%x):mode=%d detail = %d\n", - event->type == EnterNotify?"EnterNotify":"LeaveNotify", - XtName(w), w, - ((XCrossingEvent*)event)->mode, ((XCrossingEvent*)event)->detail); -*/ - if (event->xcrossing.mode != NotifyNormal || - ((event->xcrossing.detail == NotifyVirtual || - event->xcrossing.detail == NotifyNonlinearVirtual) && - !XtIsSubclass(w, xmScrolledWindowWidgetClass))) { - *cont = TRUE; - return; - } - - /* fix for 4454304. - * We should not post MOUSE_ENTERED and MOUSE_EXITED events - * if the mouse pointer is in the place between component - * and its scrollbars. - * kdm@sparc.spb.su - */ - if (winfo != NULL && winfo->widget != NULL) { - wclass = XtClass(winfo->widget); - if (event->xcrossing.subwindow == NULL - && event->xcrossing.detail == NotifyInferior - && (wclass == xmTextWidgetClass - || wclass == xmListWidgetClass)) { - *cont = TRUE; - return; - } - } - - clickCount = (jint) 0; - lastTime = (Time) 0; - lastPeer = NULL; - - /* On other MouseEvent only new modifiers and - * old mouse modifiers are set. - */ - modifiers = getModifiers(event->xcrossing.state, 0, 0); - - switch (event->type) { - case EnterNotify: - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_ENTERED, - (passEvent == TRUE) ? event : NULL, - event->xcrossing.time, - modifiers, - (jint) (event->xcrossing.x), - (jint) (event->xcrossing.y), - (jint) (event->xcrossing.x_root), - (jint) (event->xcrossing.y_root), - clickCount, - FALSE, 0, - java_awt_event_MouseEvent_NOBUTTON); - if (!(event->xcrossing.state - & (Button1Mask | Button2Mask | Button3Mask))) { - updateCursor(client_data, CACHE_UPDATE); - } - - break; - case LeaveNotify: - awt_post_java_mouse_event(client_data, - java_awt_event_MouseEvent_MOUSE_EXITED, - (passEvent == TRUE) ? event : NULL, - event->xcrossing.time, - modifiers, - (jint) (event->xcrossing.x), - (jint) (event->xcrossing.y), - (jint) (event->xcrossing.x_root), - (jint) (event->xcrossing.y_root), - clickCount, - FALSE, 0, - java_awt_event_MouseEvent_NOBUTTON); - break; - } - break; - - default: - break; - } -} - -/* - * client_data is MComponentPeer subclass - */ -void -awt_canvas_event_handler(Widget w, XtPointer client_data, - XEvent * event, Boolean * cont) -{ - awt_canvas_handleEvent(w, client_data, event, NULL, cont, FALSE); -} - -void -awt_canvas_reconfigure(struct FrameData *wdata) -{ - Dimension w, h; - - if (wdata->winData.comp.widget == NULL || - XtParent(wdata->winData.comp.widget) == NULL) { - return; - } - XtVaGetValues(XtParent(wdata->winData.comp.widget), XmNwidth, &w, XmNheight, &h, NULL); - XtConfigureWidget(wdata->winData.comp.widget, - -(wdata->left), - -(wdata->top), - w + (wdata->left + wdata->right), - h + (wdata->top + wdata->bottom), - 0); -} - -static void -Wrap_event_handler(Widget widget, - XtPointer client_data, - XmDrawingAreaCallbackStruct * call_data) -{ - awt_canvas_reconfigure((struct FrameData *) client_data); -} - - -Widget -awt_canvas_create(XtPointer this, - Widget parent, - char *base, - int32_t width, - int32_t height, - Boolean parentIsFrame, - struct FrameData *wdata, - AwtGraphicsConfigDataPtr awtData) -{ - Widget newCanvas; - Widget wrap; -#define MAX_ARGC 20 - Arg args[MAX_ARGC]; - int32_t argc; - char name[128]; - static XtTranslations translationKeyDown = NULL; - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - - if (parent == NULL) { - JNU_ThrowNullPointerException(env, "NullPointerException"); - return NULL; - } - if (width == 0) { - width = 1; - } - if (height == 0) { - height = 1; - } - - if (wdata != NULL) { - argc = 0; - if (!parentIsFrame) - { - XtSetArg(args[argc], XmNwidth, width); - argc++; - XtSetArg(args[argc], XmNheight, height); - 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++; - /* check for overflowing name? */ - strcpy(name, base); - strcat(name, "wrap"); - - DASSERT(!(argc > MAX_ARGC)); - wrap = XmCreateDrawingArea(parent, name, args, argc); - if (!parentIsFrame) - { - /* Fixing bugs in frame module (awt_Frame.c). It will now - provide the resize handling for this inner/parent canvas.*/ - XtAddCallback(wrap, XmNresizeCallback, - (XtCallbackProc) Wrap_event_handler, wdata); - } - XtManageChild(wrap); - } else { - wrap = parent; - } - - /* check for overflowing name? */ - strcpy(name, base); - strcat(name, "canvas"); - - argc = 0; - XtSetArg(args[argc], XmNspacing, 0); - argc++; - if (!parentIsFrame) - { - XtSetArg(args[argc], XmNwidth, width); - argc++; - XtSetArg(args[argc], XmNheight, height); - argc++; - } - XtSetArg(args[argc], XmNmarginHeight, 0); - argc++; - XtSetArg(args[argc], XmNmarginWidth, 0); - argc++; - XtSetArg(args[argc], XmNresizePolicy, XmRESIZE_NONE); - argc++; - XtSetArg(args[argc], XmNuserData, this); - argc++; - /* Fixed 4059430, 3/11/98, robi.khan@eng - * install insert proc callback so components are ordered correctly - * when added directly to frame/dialogs/windows - */ - XtSetArg(args[argc], XmNinsertPosition, (XtPointer) awt_util_insertCallback); - argc++; - - if (awtData != getDefaultConfig(awtData->awt_visInfo.screen)) { - XtSetArg (args[argc], XtNvisual, awtData->awt_visInfo.visual); argc++; - XtSetArg (args[argc], XmNdepth, awtData->awt_depth); argc++; - XtSetArg (args[argc], XmNscreen, - ScreenOfDisplay(awt_display, - awtData->awt_visInfo.screen)); argc++; - - if (awtData->awt_cmap == None) { - awtJNI_CreateColorData (env, awtData, 1); - } - - XtSetArg (args[argc], XmNcolormap, awtData->awt_cmap); argc++; - - DASSERT(!(argc > MAX_ARGC)); - newCanvas = XtCreateWidget(name, vDrawingAreaClass, wrap, - args, argc); - - } else { - newCanvas = XtCreateWidget(name, xDrawingAreaClass, - wrap, args, argc); - } - - XtSetMappedWhenManaged(newCanvas, False); - XtManageChild(newCanvas); -/* - XXX: causes problems on 2.5 - if (!scrollBugWorkAround) { - awt_setWidgetGravity(newCanvas, StaticGravity); - } -*/ - /* Fixed 4250354 7/28/99 ssi@sparc.spb.su - * XtParseTranslationTable leaks in old ver of Xtoolkit - * and result should be deletetd in any case - * - * XtOverrideTranslations(newCanvas, - * XtParseTranslationTable(":DrawingAreaInput()")); - */ - if (NULL==translationKeyDown) - translationKeyDown=XtParseTranslationTable(":DrawingAreaInput()"); - XtOverrideTranslations(newCanvas,translationKeyDown); - - XtSetSensitive(newCanvas, True); - - return newCanvas; -} - -static void -messWithGravity(Widget w, int32_t gravity) -{ - extern void awt_changeAttributes(Display * dpy, Widget w, - unsigned long mask, - XSetWindowAttributes * xattr); - XSetWindowAttributes xattr; - - xattr.bit_gravity = gravity; - xattr.win_gravity = gravity; - - awt_changeAttributes(XtDisplay(w), w, (CWBitGravity | CWWinGravity), &xattr); - -} - -struct MoveRecord { - long dx; - long dy; -}; - -void -moveWidget(Widget w, void *data) -{ - struct MoveRecord *rec = (struct MoveRecord *) data; - - if (XtIsRealized(w) && XmIsRowColumn(w)) { - w->core.x -= rec->dx; - w->core.y -= rec->dy; - } -} - -#if 0 -/* Scroll entire contents of window by dx and dy. Currently only - dy is supported. A negative dy means scroll backwards, i.e., - contents in window move down. */ -void -awt_canvas_scroll(XtPointer this, - struct CanvasData *wdata, - long dx, - long dy) -{ - - Window win; - XWindowChanges xchgs; - Window root; - int x, y; - unsigned int width, height, junk; - Display *dpy; - struct MoveRecord mrec; - - mrec.dx = dx; - mrec.dy = dy; - - dpy = XtDisplay(wdata->comp.widget); - win = XtWindow(wdata->comp.widget); - - /* REMIND: consider getting rid of this! */ - XGetGeometry(awt_display, - win, - &root, - &x, - &y, - &width, - &height, - &junk, - &junk); - - /* we need to actually update the coordinates for manager widgets, */ - /* otherwise the parent won't pass down events to them properly */ - /* after scrolling... */ - awt_util_mapChildren(wdata->comp.widget, moveWidget, 0, &mrec); - - if (dx < 0) { - /* scrolling backward */ - - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, NorthWestGravity); - } - xchgs.x = x + dx; - xchgs.y = y; - xchgs.width = width - dx; - xchgs.height = height; - XConfigureWindow(awt_display, - win, - CWX | CWY | CWWidth | CWHeight, - &xchgs); - - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, NorthWestGravity); - } - xchgs.x = x; - xchgs.y = y; - XConfigureWindow(awt_display, - win, - CWX | CWY, - &xchgs); - - xchgs.width = width; - xchgs.height = height; - XConfigureWindow(awt_display, - win, - CWWidth | CWHeight, - &xchgs); - } else { - /* forward scrolling */ - - /* make window a little taller */ - xchgs.width = width + dx; - xchgs.height = height; - XConfigureWindow(awt_display, - win, - CWWidth | CWHeight, - &xchgs); - - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, NorthEastGravity); - } - /* move window by amount we're scrolling */ - xchgs.x = x - dx; - xchgs.y = y; - XConfigureWindow(awt_display, - win, - CWX | CWY, - &xchgs); - - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, NorthWestGravity); - } - /* resize to original size */ - xchgs.x = x; - xchgs.y = y; - xchgs.width = width; - xchgs.height = height; - XConfigureWindow(awt_display, - win, - CWX | CWY | CWWidth | CWHeight, - &xchgs); - } - /* Because of the weird way we're scrolling this window, - we have to eat all the exposure events that result from - scrolling forward, and translate them up by the amount we're - scrolling by. - - Rather than just eating all the exposures and having the - java code fill in what it knows is exposed, we do it this - way. The reason is that there might be some other exposure - events caused by overlapping windows on top of us that we - also need to deal with. */ - { - XRectangle rect; - - rect.x = -1; - eatAllExposures(dpy, win, &rect); - if (rect.x != -1) { /* we got at least one expose event */ - if (dx > 0) { - rect.x -= dx; - rect.width += dx; - } -/* - printf("EXPOSE (%d): %d, %d, %d, %d\n", - dy, rect.x, rect.y, rect.width, rect.height); -*/ - callJavaExpose(this, &rect); - XSync(awt_display, False); - } - } - if (dy < 0) { - /* scrolling backward */ - - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, SouthGravity); - } - xchgs.x = x; - xchgs.y = y + dy; - xchgs.width = width; - xchgs.height = height - dy; - XConfigureWindow(awt_display, - win, - CWX | CWY | CWWidth | CWHeight, - &xchgs); - - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, NorthWestGravity); - } - xchgs.x = x; - xchgs.y = y; - XConfigureWindow(awt_display, - win, - CWX | CWY, - &xchgs); - - xchgs.width = width; - xchgs.height = height; - XConfigureWindow(awt_display, - win, - CWWidth | CWHeight, - &xchgs); - } else { - /* forward scrolling */ - - /* make window a little taller */ - xchgs.width = width; - xchgs.height = height + dy; - XConfigureWindow(awt_display, - win, - CWWidth | CWHeight, - &xchgs); - - /* move window by amount we're scrolling */ - xchgs.x = x; - xchgs.y = y - dy; - XConfigureWindow(awt_display, - win, - CWX | CWY, - &xchgs); - - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, SouthGravity); - } - /* resize to original size */ - xchgs.x = x; - xchgs.y = y; - xchgs.width = width; - xchgs.height = height; - XConfigureWindow(awt_display, - win, - CWX | CWY | CWWidth | CWHeight, - &xchgs); - if (scrollBugWorkAround) { - messWithGravity(wdata->comp.widget, NorthWestGravity); - } - } - /* Because of the weird way we're scrolling this window, - we have to eat all the exposure events that result from - scrolling forward, and translate them up by the amount we're - scrolling by. - - Rather than just eating all the exposures and having the - java code fill in what it knows is exposed, we do it this - way. The reason is that there might be some other exposure - events caused by overlapping windows on top of us that we - also need to deal with. */ - { - XRectangle rect; - - rect.x = -1; - eatAllExposures(dpy, win, &rect); - if (rect.x != -1) { /* we got at least one expose event */ - if (dy > 0) { - rect.y -= dy; - rect.height += dy; - } - if (dx > 0) { - rect.x -= dx; - rect.width += dx; - } -/* - printf("EXPOSE (%d): %d, %d, %d, %d\n", - dy, rect.x, rect.y, rect.width, rect.height); -*/ - callJavaExpose(this, &rect); - XSync(awt_display, False); - } - } -} -#endif - -extern Window focusProxyWindow; -/* - * client_data is MComponentPeer instance - */ -void -awt_post_java_key_event(XtPointer client_data, jint id, XEvent *event, - Time when, jint keycode, jchar keychar, jint modifiers, jint keyLocation, XEvent *anEvent) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject peer = (jobject) client_data; - jobject target; - static jclass classKeyEvent = NULL; - static jmethodID mid = NULL; - char *clsName = "java/awt/event/KeyEvent"; - jobject hEvent; - jlong jWhen; - Boolean isProxyActive = (focusProxyWindow != None); - - if (anEvent != NULL && anEvent->xany.send_event == 2){ - isProxyActive = False; - if (event != NULL) { - event->xany.send_event = 0; - } - } - if ((*env)->PushLocalFrame(env, 16) < 0) - return; - - target = (*env)->GetObjectField(env, peer, mComponentPeerIDs.target); - - if (classKeyEvent == NULL) { - jobject sysClass; - - sysClass = (*env)->FindClass(env, clsName); - if (sysClass != NULL) { - /* Make this class 'sticky', we don't want it GC'd */ - classKeyEvent = (*env)->NewGlobalRef(env, sysClass); - mid = (*env)->GetMethodID(env, classKeyEvent, "", - "(Ljava/awt/Component;IJIICIZ)V"); - } - if (JNU_IsNull(env, classKeyEvent) || mid == NULL) { - JNU_ThrowClassNotFoundException(env, clsName); - (*env)->PopLocalFrame(env, 0); - return; - } - } - - jWhen = awt_util_nowMillisUTC_offset(when); /* convert Time to UTC */ - - hEvent = (*env)->NewObject(env, classKeyEvent, mid, - target, id, jWhen, modifiers, - keycode, keychar, keyLocation, - isProxyActive?JNI_TRUE:JNI_FALSE); - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (JNU_IsNull(env, hEvent)) { - JNU_ThrowNullPointerException(env, "NullPointerException: constructor failed."); - (*env)->PopLocalFrame(env, 0); - return; - } - awt_copyXEventToAWTEvent(env, event, hEvent); - #ifdef DEBUG - if (debugKeys) { - jio_fprintf(stderr, "native posting event id:%d keychar:%c\n", (int)id, (char)keychar); - } - #endif - JNU_CallMethodByName(env, NULL, peer, - "postEvent", "(Ljava/awt/AWTEvent;)V", hEvent); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - (*env)->PopLocalFrame(env, 0); -} /* awt_post_java_key_event() */ - -/* - * Note: this routine returns a global reference which should be deleted - * after use. - */ -jobject -awt_canvas_wrapInSequenced(jobject awtevent) { - static jclass classSequencedEvent = NULL; - static jmethodID mid = NULL; - jobject wrapperEventLocal = NULL; - jobject wrapperEvent = NULL; - - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - - if ((*env)->PushLocalFrame(env, 5) < 0) - return NULL; - - if (classSequencedEvent == NULL) { - jobject sysClass = (*env)->FindClass(env, "java/awt/SequencedEvent"); - if (sysClass != NULL) { - /* Make this class 'sticky', we don't want it GC'd */ - classSequencedEvent = (*env)->NewGlobalRef(env, sysClass); - if (mid == NULL) { - mid = (*env)->GetMethodID(env, classSequencedEvent - ,"" - ,"(Ljava/awt/AWTEvent;)V"); - } - } - if (JNU_IsNull(env, classSequencedEvent) || mid == NULL) { - JNU_ThrowClassNotFoundException(env, "java/awt/SequencedEvent"); - (*env)->PopLocalFrame(env, 0); - return NULL; - } - } - wrapperEventLocal = (*env)->NewObject(env, classSequencedEvent, mid, awtevent); - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (JNU_IsNull(env, wrapperEventLocal)) { - JNU_ThrowNullPointerException(env, "constructor failed."); - (*env)->PopLocalFrame(env, 0); - return NULL; - } - wrapperEvent = (*env)->NewGlobalRef(env, wrapperEventLocal); - if (!JNU_IsNull(env, ((*env)->ExceptionOccurred(env)))) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - (*env)->PopLocalFrame(env, 0); - return NULL; - } - if (JNU_IsNull(env, wrapperEvent)) { - JNU_ThrowNullPointerException(env, "NewGlobalRef failed."); - (*env)->PopLocalFrame(env, 0); - return NULL; - } - - (*env)->PopLocalFrame(env, 0); - return wrapperEvent; -} - -jobject -findTopLevelOpposite(JNIEnv *env, jint eventType) -{ - jobject target, peer, opposite; - - if ((*env)->EnsureLocalCapacity(env, 2) < 0) { - return NULL; - } - - /* 4462056: Get a usable handle for a weakly referenced object */ - target = (*env)->NewLocalRef(env, - (eventType == java_awt_event_WindowEvent_WINDOW_GAINED_FOCUS) - ? forGained - : focusList->requestor); - if (target == NULL) { - return NULL; - } - - peer = (*env)->GetObjectField(env, target, componentIDs.peer); - (*env)->DeleteLocalRef(env, target); - if (peer == NULL) { - return NULL; - } - - opposite = findTopLevel(peer, env); - (*env)->DeleteLocalRef(env, peer); - - return opposite; -} - -void -cleanFocusList(JNIEnv *env){ - - while(focusList) { - FocusListElt *tmp = focusList->next; - (*env)->DeleteWeakGlobalRef(env, focusList->requestor); - free(focusList); - focusList = tmp; - } - focusListEnd = NULL; -} - -static jweak -computeOpposite(jint id, jobject target) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject top; - jboolean isSameObject; - - if (focusList == NULL) { - return NULL; - } - - /* 4462056: Get a usable handle for a weakly referenced object */ - top = (*env)->NewLocalRef(env, focusList->requestor); - if (top == NULL) { - /* weakly referenced component was deleted -- clean up focus list */ - cleanFocusList(env); - return NULL; - } - - isSameObject = (*env)->IsSameObject(env, target, top); - (*env)->DeleteLocalRef(env, top); - - if (isSameObject) { - if (id == java_awt_event_FocusEvent_FOCUS_GAINED) { - return forGained; - } else { /* focus lost */ - FocusListElt *tmp = focusList->next; - (*env)->DeleteWeakGlobalRef(env, forGained); - forGained = focusList->requestor; - free(focusList); - focusList = tmp; - - if (focusList == NULL) { - focusListEnd = NULL; - return NULL; - } - return focusList->requestor; - } - } else { /* target does not match top of list */ - /* be gentle with focus lost for now... */ - if (id == java_awt_event_FocusEvent_FOCUS_LOST) { - (*env)->DeleteWeakGlobalRef(env, forGained); - forGained = (*env)->NewWeakGlobalRef(env, target); - return NULL; - } - - cleanFocusList(env); - return NULL; - } -} - - -/* - * client_data is MComponentPeer instance - */ -void -awt_post_java_focus_event(XtPointer client_data, - jint id, jobject cause, - XEvent* event) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject peer = (jobject) client_data; - jobject target; - jobject opposite; - static jclass classFocusEvent = NULL; - static jmethodID mid = NULL; - char *clsName = "sun/awt/CausedFocusEvent"; - jobject hEvent; - - if ((*env)->PushLocalFrame(env, 16) < 0) - return; - - target = (*env)->GetObjectField(env, peer, mComponentPeerIDs.target); - - opposite = (*env)->NewLocalRef(env, computeOpposite(id, target)); - - if (classFocusEvent == NULL) { - jobject sysClass; - - sysClass = (*env)->FindClass(env, clsName); - if (sysClass != NULL) { - /* Make this class 'sticky', we don't want it GC'd */ - classFocusEvent = (*env)->NewGlobalRef(env, sysClass); - mid = (*env)->GetMethodID(env, classFocusEvent - ,"" - ,"(Ljava/awt/Component;IZLjava/awt/Component;Lsun/awt/CausedFocusEvent$Cause;)V"); - } - if (JNU_IsNull(env, classFocusEvent) || mid == 0) { - JNU_ThrowClassNotFoundException(env, clsName); - (*env)->PopLocalFrame(env, 0); - return; - } - } - hEvent = (*env)->NewObject(env, classFocusEvent, mid, - target, id, JNI_FALSE, opposite, cause); - (*env)->DeleteLocalRef(env, opposite); - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (JNU_IsNull(env, hEvent)) { - JNU_ThrowNullPointerException(env, "NullPointerException: constructor failed."); - (*env)->PopLocalFrame(env, 0); - return; - } - awt_copyXEventToAWTEvent(env, event, hEvent); - { - jobject awtEvent = awt_canvas_wrapInSequenced(hEvent); - JNU_CallMethodByName(env, NULL, peer, - "postEvent", "(Ljava/awt/AWTEvent;)V", - awtEvent); - (*env)->DeleteGlobalRef(env, awtEvent); - } - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - (*env)->PopLocalFrame(env, 0); -} - - -void -awt_canvas_addToFocusListDefault(jobject target) { - awt_canvas_addToFocusListWithDuplicates(target, JNI_FALSE); -} - -void -awt_canvas_addToFocusListWithDuplicates(jobject target, jboolean acceptDuplicates) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jboolean isSameObject; - - if (focusListEnd) { - jobject localRef = (*env)->NewLocalRef(env, focusListEnd->requestor); - - if (localRef == NULL) { - isSameObject = JNI_FALSE; - } else { - isSameObject = (*env)->IsSameObject(env, target, localRef); - (*env)->DeleteLocalRef(env, localRef); - } - - if (isSameObject && !acceptDuplicates) { - return; - } - - focusListEnd->next = malloc(sizeof(FocusListElt)); - focusListEnd = focusListEnd->next; - } else { - jobject l_focusOwnerPeer = awt_canvas_getFocusOwnerPeer(); - if (l_focusOwnerPeer == NULL) { - isSameObject = JNI_FALSE; - } else { - jobject l_focusOwner = - (*env)->GetObjectField(env, l_focusOwnerPeer, - mComponentPeerIDs.target); - isSameObject = - (*env)->IsSameObject(env, target, l_focusOwner); - (*env)->DeleteLocalRef(env, l_focusOwner); - (*env)->DeleteLocalRef(env, l_focusOwnerPeer); - } - - if (isSameObject && !acceptDuplicates) { - return; - } - - focusList = focusListEnd = malloc(sizeof(FocusListElt)); - } - - focusListEnd->requestor = (*env)->NewWeakGlobalRef(env, target); - focusListEnd->next = NULL; -} - -/* - * client_data is MComponentPeer instance - */ -void -awt_post_java_mouse_event(XtPointer client_data, jint id, XEvent* event, - Time when, jint modifiers, jint x, jint y, - jint xAbs, jint yAbs, - jint clickcount, - Boolean popuptrigger, - jint wheelAmt, jint button) -{ - JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); - jobject peer = (jobject) client_data; - jobject target; - - static jclass classMouseEvent = NULL; - static jclass classMouseWheelEvent = NULL; - - static jmethodID mid = NULL; - static jmethodID wheelmid = NULL; - - char *clsName = "java/awt/event/MouseEvent"; - char *wheelClsName = "java/awt/event/MouseWheelEvent"; - - jobject hEvent; - jobject sysClass; - jlong jWhen; - - if ((*env)->PushLocalFrame(env, 16) < 0) - return; - - target = (*env)->GetObjectField(env, peer, mComponentPeerIDs.target); - - if (classMouseEvent == NULL) { - sysClass = (*env)->FindClass(env, clsName); - if (sysClass != NULL) { - /* Make this class 'sticky', we don't want it GC'd */ - classMouseEvent = (*env)->NewGlobalRef(env, sysClass); - mid = (*env)->GetMethodID(env, classMouseEvent - ,"" - ,"(Ljava/awt/Component;IJIIIIIIZI)V"); - } - if (JNU_IsNull(env, classMouseEvent) || mid == 0) { - JNU_ThrowClassNotFoundException(env, clsName); - (*env)->PopLocalFrame(env, 0); - return; - } - } - - if (id == java_awt_event_MouseEvent_MOUSE_WHEEL && - classMouseWheelEvent == NULL) { - sysClass = (*env)->FindClass(env, wheelClsName); - if (sysClass != NULL) { - /* Make this class 'sticky', we don't want it GC'd */ - classMouseWheelEvent = (*env)->NewGlobalRef(env, sysClass); - wheelmid = (*env)->GetMethodID(env, classMouseWheelEvent, - "", - "(Ljava/awt/Component;IJIIIIIIZIII)V"); - } - if (JNU_IsNull(env, classMouseWheelEvent) || wheelmid == 0) { - JNU_ThrowClassNotFoundException(env, wheelClsName); - (*env)->PopLocalFrame(env, 0); - return; - } - } - - jWhen = awt_util_nowMillisUTC_offset(when); /* convert Time to UTC */ - - if (id == java_awt_event_MouseEvent_MOUSE_WHEEL) { - hEvent = (*env)->NewObject(env, classMouseWheelEvent, wheelmid, - target, id, jWhen, modifiers, - x, y, - xAbs, yAbs, - clickcount, popuptrigger, - /* Linux has no API for setting how a Component - * should scroll in response to the mouse wheel, - * so we have to make up our own. - * The default behavior on Windows is 3 lines of - * text, so we use that to match. - */ - java_awt_event_MouseWheelEvent_WHEEL_UNIT_SCROLL, - 3, - wheelAmt); - } - else { - hEvent = (*env)->NewObject(env, classMouseEvent, mid, - target, id, jWhen, modifiers, - x, y, - xAbs, yAbs, - clickcount, popuptrigger, button); - } - - - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - if (JNU_IsNull(env, hEvent)) { - JNU_ThrowNullPointerException(env, "NullPointerException: constructor failed."); - (*env)->PopLocalFrame(env, 0); - return; - } - awt_copyXEventToAWTEvent(env, event, hEvent); - JNU_CallMethodByName(env, NULL, peer, - "postEvent", "(Ljava/awt/AWTEvent;)V", hEvent); - if ((*env)->ExceptionOccurred(env)) { - (*env)->ExceptionDescribe(env); - (*env)->ExceptionClear(env); - } - (*env)->PopLocalFrame(env, 0); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/cursor.c --- a/jdk/src/solaris/native/sun/awt/cursor.c Wed Jul 05 16:40:31 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,132 +0,0 @@ -/* - * Copyright 1997-2003 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 "java_awt_Cursor.h" -#include "awt_Cursor.h" -#include "sun_awt_motif_MCustomCursor.h" - -#include "jni.h" -#include "jni_util.h" - -extern struct CursorIDs cursorIDs; -static jfieldID widthID; -static jfieldID heightID; - -/* - * Class: sun_awt_motif_MCustomCursor - * Method: cacheInit - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCustomCursor_cacheInit - (JNIEnv *env, jclass cls) -{ - jclass clsDimension = (*env)->FindClass(env, "java/awt/Dimension"); - widthID = (*env)->GetFieldID(env, clsDimension, "width", "I"); - heightID = (*env)->GetFieldID(env, clsDimension, "height", "I"); -} - -/* - * Class: sun_awt_motif_MCustomCursor - * Method: queryBestCursor - * Signature: (Ljava/awt/Dimension;)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCustomCursor_queryBestCursor - (JNIEnv *env, jclass cls, jobject dimension) -{ - Window root; - uint32_t width, height; - - AWT_LOCK(); - root = RootWindow(awt_display, DefaultScreen(awt_display)); - XQueryBestCursor(awt_display, root, - (*env)->GetIntField(env, dimension, widthID), - (*env)->GetIntField(env, dimension, heightID), - &width, &height); - (*env)->SetIntField(env, dimension, widthID, (int32_t) width); - (*env)->SetIntField(env, dimension, heightID, (int32_t) height); - AWT_UNLOCK(); -} - -/* - * Class: sun_awt_motif_MCustomCursor - * Method: createCursor - * Signature: ([B[BIIII)V - */ -JNIEXPORT void JNICALL Java_sun_awt_motif_MCustomCursor_createCursor - (JNIEnv *env , jobject this, jbyteArray xorMask, jbyteArray andMask, - jint width, jint height, jint fc, jint bc, jint xHotSpot, jint yHotSpot) -{ - Cursor cursor; - char *sourceBits, *maskBits; - Window root; - Pixmap source, mask; - XColor fcolor, bcolor; - AwtGraphicsConfigDataPtr defaultConfig = - getDefaultConfig(DefaultScreen(awt_display)); - - AWT_LOCK(); - - root = RootWindow(awt_display, DefaultScreen(awt_display)); - fcolor.flags = DoRed | DoGreen | DoBlue; - fcolor.red = ((fc >> 16) & 0x000000ff) << 8; - fcolor.green = ((fc >> 8) & 0x000000ff) << 8; - fcolor.blue = ((fc >> 0) & 0x000000ff) << 8; - XAllocColor(awt_display, defaultConfig->awt_cmap, &fcolor); - bcolor.flags = DoRed | DoGreen | DoBlue; - bcolor.red = ((bc >> 16) & 0x000000ff) << 8; - bcolor.green = ((bc >> 8) & 0x000000ff) << 8; - bcolor.blue = ((bc >> 0) & 0x000000ff) << 8; - XAllocColor(awt_display, defaultConfig->awt_cmap, &bcolor); - - /* Create source pixmap. */ - sourceBits = (char *)(*env)->GetPrimitiveArrayCritical(env, xorMask, NULL); - source = XCreateBitmapFromData(awt_display, root, sourceBits, - width, height); - - /* Create mask pixmap */ - maskBits = (char *)(*env)->GetPrimitiveArrayCritical(env, andMask, NULL); - mask = XCreateBitmapFromData(awt_display, root, maskBits, - width, height); - - /* Create cursor */ - cursor = XCreatePixmapCursor(awt_display, source, mask, &fcolor, &bcolor, - xHotSpot, yHotSpot); - - /* Free resources */ - XFreePixmap(awt_display, source); - XFreePixmap(awt_display, mask); - - (*env)->ReleasePrimitiveArrayCritical(env, xorMask, sourceBits, JNI_ABORT); - (*env)->ReleasePrimitiveArrayCritical(env, andMask, maskBits, JNI_ABORT); - - JNU_SetLongFieldFromPtr(env, this, cursorIDs.pData, cursor); - - AWT_FLUSH_UNLOCK(); -} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/initIDs.c --- a/jdk/src/solaris/native/sun/awt/initIDs.c Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/native/sun/awt/initIDs.c Mon Aug 25 13:58:15 2008 -0700 @@ -26,7 +26,7 @@ #include "java_awt_Color.h" #include "java_awt_Dimension.h" #include "java_awt_MenuBar.h" -#include "java_awt_Label.h" +//#include "java_awt_Label.h" #include "java_awt_FontMetrics.h" #include "java_awt_event_MouseEvent.h" #include "java_awt_Rectangle.h" diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/multi_font.c --- a/jdk/src/solaris/native/sun/awt/multi_font.c Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/native/sun/awt/multi_font.c Mon Aug 25 13:58:15 2008 -0700 @@ -52,8 +52,8 @@ extern XFontStruct *loadFont(Display *, char *, int32_t); extern struct FontIDs fontIDs; -extern struct MComponentPeerIDs mComponentPeerIDs; -extern struct MMenuItemPeerIDs mMenuItemPeerIDs; +//extern struct MComponentPeerIDs mComponentPeerIDs; +//extern struct MMenuItemPeerIDs mMenuItemPeerIDs; extern struct PlatformFontIDs platformFontIDs; extern struct MFontPeerIDs mFontPeerIDs; @@ -151,8 +151,8 @@ struct gRefStruct *temp; gRef = (jobject) - JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.jniGlobalRef); - JNU_SetLongFieldFromPtr(env, this, mMenuItemPeerIDs.jniGlobalRef, NULL); + //JNU_GetLongFieldAsPtr(env, this, mMenuItemPeerIDs.jniGlobalRef); + //JNU_SetLongFieldFromPtr(env, this, mMenuItemPeerIDs.jniGlobalRef, NULL); /* * Verra handy for tracking down race conditions. If you diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/solaris/native/sun/awt/splashscreen/splashscreen_sys.c --- a/jdk/src/solaris/native/sun/awt/splashscreen/splashscreen_sys.c Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/solaris/native/sun/awt/splashscreen/splashscreen_sys.c Mon Aug 25 13:58:15 2008 -0700 @@ -40,6 +40,7 @@ #include #include #include +#include static Bool shapeSupported; static int shapeEventBase, shapeErrorBase; @@ -534,40 +535,34 @@ SplashEventLoop(Splash * splash) { /* Different from win32 implementation - this loop - uses select timeouts instead of a timer */ + uses poll timeouts instead of a timer */ /* we should have splash _locked_ on entry!!! */ int xconn = XConnectionNumber(splash->display); while (1) { + struct pollfd pfd[2]; + int timeout = -1; int ctl = splash->controlpipe[0]; - fd_set fds[2]; - int n = 0; - struct timeval tv, *ptv; int rc; - int time; int pipes_empty; - FD_ZERO(fds); - FD_SET(xconn, fds); - if (xconn+1 > n) - n = xconn+1; - FD_SET(ctl, fds); - if (ctl+1 > n) - n = ctl+1; + pfd[0].fd = xconn; + pfd[0].events = POLLIN | POLLPRI; + + pfd[1].fd = ctl; + pfd[1].events = POLLIN | POLLPRI; + errno = 0; if (splash->isVisible>0 && SplashIsStillLooping(splash)) { - time = splash->time + splash->frames[splash->currentFrame].delay + timeout = splash->time + splash->frames[splash->currentFrame].delay - SplashTime(); - if (time < 0) - time = 0; - msec2timeval(time, &tv); - ptv = &tv; - } else { - ptv = NULL; + if (timeout < 0) { + timeout = 0; + } } SplashUnlock(splash); - rc = select(n, fds, NULL, NULL, ptv); + rc = poll(pfd, 2, timeout); SplashLock(splash); if (splash->isVisible>0 && SplashTime() >= splash->time + splash->frames[splash->currentFrame].delay) { diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/windows/native/sun/windows/ComCtl32Util.cpp --- a/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.cpp Mon Aug 25 13:58:15 2008 -0700 @@ -49,6 +49,9 @@ m_bNewSubclassing = (m_lpfnSetWindowSubclass != NULL) && (m_lpfnRemoveWindowSubclass != NULL) && (m_lpfnDefSubclassProc != NULL); + + fn_InitCommonControlsEx = (ComCtl32Util::InitCommonControlsExType)::GetProcAddress(hModComCtl32, "InitCommonControlsEx"); + InitCommonControls(); } } } @@ -108,3 +111,15 @@ CATCH_BAD_ALLOC_RET(0); } + +void ComCtl32Util::InitCommonControls() +{ + if (fn_InitCommonControlsEx == NULL) { + return; + } + + INITCOMMONCONTROLSEX iccex; + memset(&iccex, 0, sizeof(INITCOMMONCONTROLSEX)); + iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); + fn_InitCommonControlsEx(&iccex); +} diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/windows/native/sun/windows/ComCtl32Util.h --- a/jdk/src/windows/native/sun/windows/ComCtl32Util.h Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/ComCtl32Util.h Mon Aug 25 13:58:15 2008 -0700 @@ -25,6 +25,8 @@ #include "awt_Component.h" +#include + #ifndef _COMCTL32UTIL_H #define _COMCTL32UTIL_H @@ -81,6 +83,11 @@ PFNREMOVEWINDOWSUBCLASS m_lpfnRemoveWindowSubclass; PFNDEFSUBCLASSPROC m_lpfnDefSubclassProc; + typedef BOOL (WINAPI * InitCommonControlsExType)(const LPINITCOMMONCONTROLSEX lpInitCtrls); + InitCommonControlsExType fn_InitCommonControlsEx; + + void InitCommonControls(); + BOOL m_bNewSubclassing; // comctl32.dll version 6 window proc diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/windows/native/sun/windows/awt_Container.cpp --- a/jdk/src/windows/native/sun/windows/awt_Container.cpp Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/awt_Container.cpp Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2000 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 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 @@ -30,8 +30,6 @@ * AwtContainer fields */ -jfieldID AwtContainer::ncomponentsID; -jfieldID AwtContainer::componentID; jfieldID AwtContainer::layoutMgrID; jmethodID AwtContainer::findComponentAtMID; @@ -45,18 +43,12 @@ Java_java_awt_Container_initIDs(JNIEnv *env, jclass cls) { TRY; - AwtContainer::ncomponentsID = env->GetFieldID(cls, "ncomponents", "I"); - AwtContainer::componentID = - env->GetFieldID(cls, "component", "[Ljava/awt/Component;"); - AwtContainer::layoutMgrID = env->GetFieldID(cls, "layoutMgr", "Ljava/awt/LayoutManager;"); AwtContainer::findComponentAtMID = env->GetMethodID(cls, "findComponentAt", "(IIZ)Ljava/awt/Component;"); - DASSERT(AwtContainer::ncomponentsID != NULL); - DASSERT(AwtContainer::componentID != NULL); DASSERT(AwtContainer::layoutMgrID != NULL); DASSERT(AwtContainer::findComponentAtMID); diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/windows/native/sun/windows/awt_Container.h --- a/jdk/src/windows/native/sun/windows/awt_Container.h Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/awt_Container.h Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1998-1999 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2008 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 @@ -37,8 +37,6 @@ public: /* java.awt.Container field ids */ - static jfieldID ncomponentsID; - static jfieldID componentID; static jfieldID layoutMgrID; static jmethodID findComponentAtMID; diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/windows/native/sun/windows/awt_TextArea.cpp --- a/jdk/src/windows/native/sun/windows/awt_TextArea.cpp Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/awt_TextArea.cpp Mon Aug 25 13:58:15 2008 -0700 @@ -209,15 +209,13 @@ void AwtTextArea::EditSetSel(CHARRANGE &cr) { // Fix for 5003402: added restoring/hiding selection to enable automatic scrolling - LockWindowUpdate(GetHWnd()); SendMessage(EM_HIDESELECTION, FALSE, TRUE); SendMessage(EM_EXSETSEL, 0, reinterpret_cast(&cr)); SendMessage(EM_HIDESELECTION, TRUE, TRUE); - // 6417581: LockWindowUpdate doesn't force expected drawing + // 6417581: force expected drawing if (IS_WINVISTA && cr.cpMin == cr.cpMax) { ::InvalidateRect(GetHWnd(), NULL, TRUE); } - LockWindowUpdate(NULL); } void AwtTextArea::EditGetSel(CHARRANGE &cr) { @@ -993,12 +991,10 @@ c->CheckLineSeparator(buffer); c->RemoveCR(buffer); // Fix for 5003402: added restoring/hiding selection to enable automatic scrolling - LockWindowUpdate(c->GetHWnd()); c->SendMessage(EM_HIDESELECTION, FALSE, TRUE); c->SendMessageW(EM_SETSEL, start, end); c->SendMessageW(EM_REPLACESEL, FALSE, (LPARAM)buffer); c->SendMessage(EM_HIDESELECTION, TRUE, TRUE); - LockWindowUpdate(NULL); delete[] buffer; } diff -r 90cf935adb35 -r 715cf9378c53 jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp --- a/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/src/windows/native/sun/windows/awt_Win32GraphicsDevice.cpp Mon Aug 25 13:58:15 2008 -0700 @@ -1021,6 +1021,10 @@ // with the WWindowPeer object HWND hWnd = window->GetHWnd(); + jobject target = env->GetObjectField(windowPeer, AwtObject::targetID); + jboolean alwaysOnTop = JNU_GetFieldByName(env, NULL, target, "alwaysOnTop", "Z").z; + env->DeleteLocalRef(target); + if (!::SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOSIZE)) { @@ -1029,6 +1033,9 @@ ::GetLastError()); } + // We should restore alwaysOnTop state as it's anyway dropped here + Java_sun_awt_windows_WWindowPeer_setAlwaysOnTopNative(env, windowPeer, alwaysOnTop); + CATCH_BAD_ALLOC; } diff -r 90cf935adb35 -r 715cf9378c53 jdk/test/java/awt/Container/CheckZOrderChange/CheckZOrderChange.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Container/CheckZOrderChange/CheckZOrderChange.java Mon Aug 25 13:58:15 2008 -0700 @@ -0,0 +1,48 @@ +/* + @test %I% %E% + @bug 2161766 + @summary Component is missing after changing the z-order of the component & focus is not transfered in + @author Andrei Dmitriev : area=awt.container + @run main CheckZOrderChange +*/ +import java.awt.*; +import java.awt.event.*; + +public class CheckZOrderChange { + + private static Button content[] = new Button[]{new Button("Button 1"), new Button("Button 2"), new Button("Button 3"), new Button("Button 4")}; + private static Frame frame; + + public static void main(String[] args) { + + frame = new Frame("Test Frame"); + frame.setLayout(new FlowLayout()); + + for (Button b: content){ + frame.add(b); + } + + frame.setSize(300, 300); + frame.setVisible(true); + + /* INITIAL ZORDERS ARE*/ + for (Button b: content){ + System.out.println("frame.getComponentZOrder("+ b +") = " + frame.getComponentZOrder(b)); + } + + //Change the Z Order + frame.setComponentZOrder(content[0], 2); + System.out.println("ZOrder of button1 changed to 2"); + + if (frame.getComponentZOrder(content[0]) != 2 || + frame.getComponentZOrder(content[1]) != 0 || + frame.getComponentZOrder(content[2]) != 1 || + frame.getComponentZOrder(content[3]) != 3) + { + for (Button b: content){ + System.out.println("frame.getComponentZOrder("+ b +") = " + frame.getComponentZOrder(b)); + } + throw new RuntimeException("TEST FAILED: getComponentZOrder did not return the correct value"); + } + } +} diff -r 90cf935adb35 -r 715cf9378c53 jdk/test/java/awt/Focus/NoAutotransferToDisabledCompTest/NoAutotransferToDisabledCompTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Focus/NoAutotransferToDisabledCompTest/NoAutotransferToDisabledCompTest.java Mon Aug 25 13:58:15 2008 -0700 @@ -0,0 +1,109 @@ +/* + * Copyright 2008 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. + * + * 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. + */ + +/* + @test + @bug 4685768 + @summary Tests that auto-transfering focus doesn't stuck on a disabled component. + @author Anton Tarasov: area=awt.focus + @library ../../regtesthelpers + @build Util + @run main NoAutotransferToDisabledCompTest +*/ + +import java.awt.Robot; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.applet.Applet; +import test.java.awt.regtesthelpers.Util; + +public class NoAutotransferToDisabledCompTest extends Applet { + Robot robot; + JFrame frame = new JFrame("Frame"); + JButton b0 = new JButton("b0"); + JButton b1 = new JButton("b1"); + JButton b2 = new JButton("b2"); + + public static void main(String[] args) { + NoAutotransferToDisabledCompTest app = new NoAutotransferToDisabledCompTest(); + app.init(); + app.start(); + } + + public void init() { + robot = Util.createRobot(); + frame.add(b0); + frame.add(b1); + frame.add(b2); + frame.setLayout(new FlowLayout()); + frame.pack(); + + b1.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + b1.setEnabled(false); + b2.setEnabled(false); + } + }); + } + + public void start() { + Util.showWindowWait(frame); + + // Request focus on b1. + if (!Util.focusComponent(b1, 2000)) { + throw new TestErrorException("couldn't focus " + b1); + } + + // Activate b1. + robot.keyPress(KeyEvent.VK_SPACE); + robot.delay(50); + robot.keyRelease(KeyEvent.VK_SPACE); + Util.waitForIdle(robot); + + // Check that focus has been transfered to b0. + if (!b0.hasFocus()) { + throw new TestFailedException("focus wasn't auto-transfered properly!"); + } + System.out.println("Test passed."); + } +} + +/** + * Thrown when the behavior being verified is found wrong. + */ +class TestFailedException extends RuntimeException { + TestFailedException(String msg) { + super("Test failed: " + msg); + } +} + +/** + * Thrown when an error not related to the behavior being verified is encountered. + */ +class TestErrorException extends RuntimeException { + TestErrorException(String msg) { + super("Unexpected error: " + msg); + } +} + diff -r 90cf935adb35 -r 715cf9378c53 jdk/test/java/awt/Focus/RequestFocusToDisabledCompTest/RequestFocusToDisabledCompTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Focus/RequestFocusToDisabledCompTest/RequestFocusToDisabledCompTest.java Mon Aug 25 13:58:15 2008 -0700 @@ -0,0 +1,97 @@ +/* + * Copyright 2008 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. + * + * 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. + */ + +/* + @test + @bug 4685768 + @summary Tests that it's possible to manually request focus on a disabled component. + @author Anton Tarasov: area=awt.focus + @library ../../regtesthelpers + @build Util + @run main RequestFocusToDisabledCompTest +*/ + +import java.awt.Robot; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.applet.Applet; +import test.java.awt.regtesthelpers.Util; + +public class RequestFocusToDisabledCompTest extends Applet { + Robot robot; + JFrame frame = new JFrame("Frame"); + JButton b0 = new JButton("b0"); + JButton b1 = new JButton("b1"); + + public static void main(String[] args) { + RequestFocusToDisabledCompTest app = new RequestFocusToDisabledCompTest(); + app.init(); + app.start(); + } + + public void init() { + robot = Util.createRobot(); + frame.add(b0); + frame.add(b1); + frame.setLayout(new FlowLayout()); + frame.pack(); + + b1.setEnabled(false); + } + + public void start() { + Util.showWindowWait(frame); + + if (!b0.hasFocus()) { + // Request focus on b0. + if (!Util.focusComponent(b0, 2000)) { + throw new TestErrorException("couldn't focus " + b0); + } + } + + // Try to request focus on b1. + if (!Util.focusComponent(b1, 2000)) { + throw new TestFailedException("focus wasn't requested on disabled " + b1); + } + System.out.println("Test passed."); + } +} + +/** + * Thrown when the behavior being verified is found wrong. + */ +class TestFailedException extends RuntimeException { + TestFailedException(String msg) { + super("Test failed: " + msg); + } +} + +/** + * Thrown when an error not related to the behavior being verified is encountered. + */ +class TestErrorException extends RuntimeException { + TestErrorException(String msg) { + super("Unexpected error: " + msg); + } +} diff -r 90cf935adb35 -r 715cf9378c53 jdk/test/java/awt/Mixing/Validating.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Mixing/Validating.java Mon Aug 25 13:58:15 2008 -0700 @@ -0,0 +1,405 @@ +/* + * Copyright 2008 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. + * + * 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. + */ + +/* + @test + @bug 6682046 + @summary Mixing code does not always recalculate shapes correctly when resizing components + @author anthony.petrov@...: area=awt.mixing + @library ../regtesthelpers + @build Util + @run main Validating +*/ + +/** + * Validating.java + * + * summary: Mixing code does not always recalculate shapes correctly when resizing components + */ + +import java.awt.*; +import java.awt.event.*; +import test.java.awt.regtesthelpers.Util; + +public class Validating +{ + static volatile boolean clickPassed = false; + + private static void init() + { + //*** Create instructions for the user here *** + + String[] instructions = + { + "This is an AUTOMATIC test, simply wait until it is done.", + "The result (passed or failed) will be shown in the", + "message window below." + }; + Sysout.createDialog( ); + Sysout.printInstructions( instructions ); + + if (!Toolkit.getDefaultToolkit().isFrameStateSupported(Frame.MAXIMIZED_BOTH)) { + System.out.println("The test environment does not support maximization. The test cannot be performed."); + pass(); + return; + } + + // Create the frame with a button. + Frame f = new Frame(); + Button b = new Button("ok"); + b.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent e) { + clickPassed = true; + } + }); + f.add(b); + // Make the frame maximized + f.setExtendedState(Frame.MAXIMIZED_BOTH); + f.pack(); + f.setVisible(true); + + Robot robot = Util.createRobot(); + robot.setAutoDelay(20); + + Util.waitForIdle(robot); + + // Now let's attempt to click in the middle of the button + // (i.e. in the middle of the window). + // If the button doesn't receive the click, it means that the test + // failed: the shape of the button was not enlarged. + Point heavyLoc = b.getLocationOnScreen(); + robot.mouseMove(heavyLoc.x + b.getWidth() / 2, heavyLoc.y + b.getHeight() / 2); + + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + Util.waitForIdle(robot); + + if (clickPassed) { + pass(); + } else { + fail("The button cannot be clicked."); + } + }//End init() + + + + /***************************************************** + * Standard Test Machinery Section + * DO NOT modify anything in this section -- it's a + * standard chunk of code which has all of the + * synchronisation necessary for the test harness. + * By keeping it the same in all tests, it is easier + * to read and understand someone else's test, as + * well as insuring that all tests behave correctly + * with the test harness. + * There is a section following this for test- + * classes + ******************************************************/ + private static boolean theTestPassed = false; + private static boolean testGeneratedInterrupt = false; + private static String failureMessage = ""; + + private static Thread mainThread = null; + + private static int sleepTime = 300000; + + // Not sure about what happens if multiple of this test are + // instantiated in the same VM. Being static (and using + // static vars), it aint gonna work. Not worrying about + // it for now. + public static void main( String args[] ) throws InterruptedException + { + mainThread = Thread.currentThread(); + try + { + init(); + } + catch( TestPassedException e ) + { + //The test passed, so just return from main and harness will + // interepret this return as a pass + return; + } + //At this point, neither test pass nor test fail has been + // called -- either would have thrown an exception and ended the + // test, so we know we have multiple threads. + + //Test involves other threads, so sleep and wait for them to + // called pass() or fail() + try + { + Thread.sleep( sleepTime ); + //Timed out, so fail the test + throw new RuntimeException( "Timed out after " + sleepTime/1000 + " seconds" ); + } + catch (InterruptedException e) + { + //The test harness may have interrupted the test. If so, rethrow the exception + // so that the harness gets it and deals with it. + if( ! testGeneratedInterrupt ) throw e; + + //reset flag in case hit this code more than once for some reason (just safety) + testGeneratedInterrupt = false; + + if ( theTestPassed == false ) + { + throw new RuntimeException( failureMessage ); + } + } + + }//main + + public static synchronized void setTimeoutTo( int seconds ) + { + sleepTime = seconds * 1000; + } + + public static synchronized void pass() + { + Sysout.println( "The test passed." ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //first check if this is executing in main thread + if ( mainThread == Thread.currentThread() ) + { + //Still in the main thread, so set the flag just for kicks, + // and throw a test passed exception which will be caught + // and end the test. + theTestPassed = true; + throw new TestPassedException(); + } + theTestPassed = true; + testGeneratedInterrupt = true; + mainThread.interrupt(); + }//pass() + + public static synchronized void fail() + { + //test writer didn't specify why test failed, so give generic + fail( "it just plain failed! :-)" ); + } + + public static synchronized void fail( String whyFailed ) + { + Sysout.println( "The test failed: " + whyFailed ); + Sysout.println( "The test is over, hit Ctl-C to stop Java VM" ); + //check if this called from main thread + if ( mainThread == Thread.currentThread() ) + { + //If main thread, fail now 'cause not sleeping + throw new RuntimeException( whyFailed ); + } + theTestPassed = false; + testGeneratedInterrupt = true; + failureMessage = whyFailed; + mainThread.interrupt(); + }//fail() + +}// class Validating + +//This exception is used to exit from any level of call nesting +// when it's determined that the test has passed, and immediately +// end the test. +class TestPassedException extends RuntimeException +{ +} + +//*********** End Standard Test Machinery Section ********** + + +//************ Begin classes defined for the test **************** + +// if want to make listeners, here is the recommended place for them, then instantiate +// them in init() + +/* Example of a class which may be written as part of a test +class NewClass implements anInterface + { + static int newVar = 0; + + public void eventDispatched(AWTEvent e) + { + //Counting events to see if we get enough + eventCount++; + + if( eventCount == 20 ) + { + //got enough events, so pass + + Validating.pass(); + } + else if( tries == 20 ) + { + //tried too many times without getting enough events so fail + + Validating.fail(); + } + + }// eventDispatched() + + }// NewClass class + +*/ + + +//************** End classes defined for the test ******************* + + + + +/**************************************************** + Standard Test Machinery + DO NOT modify anything below -- it's a standard + chunk of code whose purpose is to make user + interaction uniform, and thereby make it simpler + to read and understand someone else's test. + ****************************************************/ + +/** + This is part of the standard test machinery. + It creates a dialog (with the instructions), and is the interface + for sending text messages to the user. + To print the instructions, send an array of strings to Sysout.createDialog + WithInstructions method. Put one line of instructions per array entry. + To display a message for the tester to see, simply call Sysout.println + with the string to be displayed. + This mimics System.out.println but works within the test harness as well + as standalone. + */ + +class Sysout +{ + private static TestDialog dialog; + + public static void createDialogWithInstructions( String[] instructions ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + dialog.printInstructions( instructions ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + public static void createDialog( ) + { + dialog = new TestDialog( new Frame(), "Instructions" ); + String[] defInstr = { "Instructions will appear here. ", "" } ; + dialog.printInstructions( defInstr ); + dialog.setVisible(true); + println( "Any messages for the tester will display here." ); + } + + + public static void printInstructions( String[] instructions ) + { + dialog.printInstructions( instructions ); + } + + + public static void println( String messageIn ) + { + dialog.displayMessage( messageIn ); + System.out.println(messageIn); + } + +}// Sysout class + +/** + This is part of the standard test machinery. It provides a place for the + test instructions to be displayed, and a place for interactive messages + to the user to be displayed. + To have the test instructions displayed, see Sysout. + To have a message to the user be displayed, see Sysout. + Do not call anything in this dialog directly. + */ +class TestDialog extends Dialog +{ + + TextArea instructionsText; + TextArea messageText; + int maxStringLength = 80; + + //DO NOT call this directly, go through Sysout + public TestDialog( Frame frame, String name ) + { + super( frame, name ); + int scrollBoth = TextArea.SCROLLBARS_BOTH; + instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth ); + add( "North", instructionsText ); + + messageText = new TextArea( "", 5, maxStringLength, scrollBoth ); + add("Center", messageText); + + pack(); + + setVisible(true); + }// TestDialog() + + //DO NOT call this directly, go through Sysout + public void printInstructions( String[] instructions ) + { + //Clear out any current instructions + instructionsText.setText( "" ); + + //Go down array of instruction strings + + String printStr, remainingStr; + for( int i=0; i < instructions.length; i++ ) + { + //chop up each into pieces maxSringLength long + remainingStr = instructions[ i ]; + while( remainingStr.length() > 0 ) + { + //if longer than max then chop off first max chars to print + if( remainingStr.length() >= maxStringLength ) + { + //Try to chop on a word boundary + int posOfSpace = remainingStr. + lastIndexOf( ' ', maxStringLength - 1 ); + + if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1; + + printStr = remainingStr.substring( 0, posOfSpace + 1 ); + remainingStr = remainingStr.substring( posOfSpace + 1 ); + } + //else just print + else + { + printStr = remainingStr; + remainingStr = ""; + } + + instructionsText.append( printStr + "\n" ); + + }// while + + }// for + + }//printInstructions() + + //DO NOT call this directly, go through Sysout + public void displayMessage( String messageIn ) + { + messageText.append( messageIn + "\n" ); + System.out.println(messageIn); + } + +}// TestDialog class diff -r 90cf935adb35 -r 715cf9378c53 jdk/test/java/awt/Toolkit/HeadlessTray/HeadlessTray.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Toolkit/HeadlessTray/HeadlessTray.java Mon Aug 25 13:58:15 2008 -0700 @@ -0,0 +1,49 @@ +/* + * Copyright 2008 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. + * + * 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. + */ + +/* + @test + @bug 6737722 + @summary no tray support in headless mode + @author dmitry.cherepanov: area=awt.headless + @run main HeadlessTray +*/ + +import java.awt.*; + +public class HeadlessTray +{ + public static void main (String args[]) { + + System.setProperty("java.awt.headless", "true"); + + // We expect the method returns false and no exception thrown + boolean isSupported = SystemTray.isSupported(); + + if (isSupported) { + throw new RuntimeException("Tray shouldn't be supported in headless mode "); + } + + } + +} diff -r 90cf935adb35 -r 715cf9378c53 jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_2.java --- a/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_2.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/test/java/awt/event/MouseEvent/SpuriousExitEnter/SpuriousExitEnter_2.java Mon Aug 25 13:58:15 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2007-2008 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 @@ -100,7 +100,7 @@ Sysout.printInstructions( instructions ); Sysout.enableNumbering(true); - MouseAdapter enterExitAdapter = new MouseAdapter { + MouseAdapter enterExitAdapter = new MouseAdapter() { public void mouseEntered(MouseEvent e){ Sysout.println("Entered on " + e.getSource().getClass().getName()); } diff -r 90cf935adb35 -r 715cf9378c53 jdk/test/java/awt/regtesthelpers/Util.java --- a/jdk/test/java/awt/regtesthelpers/Util.java Wed Jul 05 16:40:31 2017 +0200 +++ b/jdk/test/java/awt/regtesthelpers/Util.java Mon Aug 25 13:58:15 2008 -0700 @@ -124,6 +124,14 @@ } /** + * Makes the window visible and waits until it's shown. + */ + public static void showWindowWait(Window win) { + win.setVisible(true); + waitTillShown(win); + } + + /** * Moves mouse pointer in the center of given {@code comp} component * using {@code robot} parameter. */ @@ -574,4 +582,22 @@ public static boolean trackActionPerformed(Button button, Runnable action, int time, boolean printEvent) { return trackEvent(ActionEvent.ACTION_PERFORMED, button, action, time, printEvent); } + + /* + * Requests focus on the component provided and waits for the result. + * @return true if the component has been focused, false otherwise. + */ + public static boolean focusComponent(Component comp, int time) { + return focusComponent(comp, time, false); + } + public static boolean focusComponent(final Component comp, int time, boolean printEvent) { + return trackFocusGained(comp, + new Runnable() { + public void run() { + comp.requestFocus(); + } + }, + time, printEvent); + + } }