summaryrefslogtreecommitdiffstats
path: root/libjava/jni
diff options
context:
space:
mode:
authorgraydon <graydon@138bc75d-0d04-0410-961f-82ee72b054a4>2004-05-27 06:17:44 +0000
committergraydon <graydon@138bc75d-0d04-0410-961f-82ee72b054a4>2004-05-27 06:17:44 +0000
commit7be583b48b04633a592ab530473b7f995955b160 (patch)
tree2ffcb4d3889f27364cadf6d34acb5b88d5881e8a /libjava/jni
parent765f486dfed484416d8afd28184f4cddb742a7d9 (diff)
downloadppe42-gcc-7be583b48b04633a592ab530473b7f995955b160.tar.gz
ppe42-gcc-7be583b48b04633a592ab530473b7f995955b160.zip
2004-05-25 David Jee <djee@redhat.com>
* java/awt/Container.java (remove): Set component's parent to null only after we removed the component from its parent's layout manager. 2004-05-25 David Jee <djee@redhat.com> * gnu/java/awt/peer/gtk/GtkComponentPeer.java (GtkComponentPeer): Set bounds regardless of whether awtComponent is valid. * gnu/java/awt/peer/gtk/GtkListPeer.java (getSize): Change native method declaration. (minimumSize): Pass visible row count into getSize(). (preferredSize): Likewise. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c (Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize): Use scroll window's natural size. Use visible row count to determine the final height value to return. 2004-05-21 Graydon Hoare <graydon@redhat.com> * gnu/java/awt/peer/gtk/GdkGraphics2D.java (setClip): Minor correction to order of operations. * javax/swing/JScrollPane.java: Extend sketchy implementation. * javax/swing/ScrollPaneLayout.java: Likewise. * javax/swing/JViewPort.java: Likewise. * javax/swing/ViewportLayout.java: Likewise. * javax/swing/JComponent.java: Rewrite. * javax/swing/RepaintManager.java: Likewise. * javax/swing/JLayeredPane.java: Change validate() to revalidate(). * javax/swing/JList.java (setSelectedIndices): (getSelectedIndices): (getSelectedValues): New functions. (getPreferredScrollableViewportSize): Return preferred size. (getScrollableUnitIncrement): (getScrollableBlockIncrement): Initial implementations. * javax/swing/JRootPane.java: Clean up slightly. (getUI): (setUI): (updateUI): (getUIClassID): (isValidateRoot): Add overrides from JComponent. * javax/swing/JScrollBar.java: Set default orientation to VERTICAL. * javax/swing/UIManager.java (getDimension): Return the dimension. * javax/swing/plaf/basic/BasicButtonUI.java: Set component opaque. * javax/swing/plaf/basic/BasicLabelUI.java: Likewise. * javax/swing/plaf/basic/BasicMenuItemUI.java: Likewise. * javax/swing/plaf/basic/BasicProgressBarUI.java: Likewise. * javax/swing/plaf/basic/BasicSeparatorUI.java: Likewise. * javax/swing/plaf/basic/BasicSliderUI.java: Likewise. * javax/swing/plaf/basic/BasicTabbedPaneUI.java: Likewise. * javax/swing/plaf/basic/BasicRootPaneUI.java: Likewise, and set background. * javax/swing/plaf/basic/BasicListUI.java: Likewise, and improve a bit. * javax/swing/plaf/basic/BasicScrollBarUI.java: Likewise, and adjust calculations. * javax/swing/plaf/basic/BasicViewportUI.java: Likewise, and improve a bit. * javax/swing/plaf/basic/BasicLookAndFeel.java (Button.margin): Shrink. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c: Hack to set horizontal always, workaround pango. * jni/gtk-peer/gtkcairopeer.h: Change to match pattern API. * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Synchronize more often, check cairo status after ops, handle changes to cairo pattern API, check for disposal. 2004-05-21 Olga Rodimina <rodimina@redhat.com> * javax/swing/plaf/basic/BasicMenuItemUI.java: (BasicMenuItemUI): Create propertyChangeListener. (getPath):Implemented. (installListeners): Add propertyChangeListener to menuItem. (uninstallListeners): Remove propertyChangeListener from menuItem. (update): Implemented. * javax/swing/plaf/basic/BasicMenuUI.MouseInputHandler: (mouseEntered): Take insets of popup menu into account when calculating position of popup menu. 2004-05-18 Olga Rodimina <rodimina@redhat.com> * Makefile.am: Added new file. * Makefile.in: Regenerate. * javax/swing/JMenuBar.java: Started implementation. * javax/swing/JPopupMenu.java: (setVisible): Fixed location of lightweight/mediumweight popup menu. (show): Fixed location of PopupMenu. * javax/swing/plaf/basic/BasicMenuBarUI.java: New file. UI Delegate for JMenuBar. * javax/swing/plaf/basic/BasicMenuUI.MouseInputHandler: (mouseEntered): Corrected position of the submenu. 2004-05-18 Thomas Fitzsimmons <fitzsim@redhat.com> * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c: Remove calls to _gtk_accel_group_attach. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c: Likewise. * gnu/java/awt/peer/gtk/GtkButtonPeer.java: Give gtkSetFont package access. Don't override setFont. * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java: Likewise. * gnu/java/awt/peer/gtk/GtkComponentPeer.java: Give gtkWidgetRequestFocus package access. * gnu/java/awt/peer/gtk/GtkLabelPeer.java: Don't override setFont. * gnu/java/awt/peer/gtk/GtkListPeer.java: Override gtkSetFont. Give gtkWidgetRequestFocus package access. * gnu/java/awt/peer/gtk/GtkTextAreaPeer.java: Give gtkWidgetRequestFocus package access. Don't override setFont. * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java: Don't override setFont. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c (gtkSetLabel): Move call to gtk_bin_get_child into GDK critical region. (gtkSetFont): Likewise. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c (gtkSetFont): Implement. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c (gtkSetFont): Whitespace fix. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (gtkWidgetSetUsize): Remove method. 2004-05-18 David Jee <djee@redhat.com> * java/awt/image/MemoryImageSource.java (newPixels(int,int,int,int,boolean)): Set only the specified rectangle of pixels. (newPixels(byte[],ColorModel,int,int)): Implement. (newPixels(int[],ColorModel,int,int)): Implement. 2004-05-18 Olga Rodimina <rodimina@redhat.com> * Makefile.am: Added new file. * Makefile.in: Regenerate. * javax/swing/JMenu.java: Started implementation. * javax/swing/JPopupMenu.java: (insert): If specified index is -1, then add component at the end. (isPopupTrigger): Reimplemented. (JPopupMenu.LightWeightPopup): setBounds of the lightWeightPopup before adding it to the layeredPane. (javax/swing/plaf/basic/BasicIconFactory.java): (getMenuArrowIcon): Implemented. * javax/swing/plaf/basic/BasicMenuItemUI.java: (getPreferredSize): Add size of the arrow icon if this menu item is instance of JMenu. (paintMenuItem): Paint arrow icon if this menu item is a submenu. * javax/swing/plaf/basic/BasicMenuUI.java: New File. UI Delegate for JMenu. 2004-05-17 Thomas Fitzsimmons <fitzsim@redhat.com> * gnu/java/awt/peer/gtk/GtkComponentPeer.java (postKeyEvent): Post KEY_TYPED events. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (generates_key_typed_event): Remove function. 2004-05-17 Olga Rodimina <rodimina@redhat.com> * javax/swing/JRootPane.java (JRootPane.RootLayout): Reimplemented to set bounds of contentPane and menuBar. (setJMenuBar): Add menu bar to the layered pane. (createLayeredPane): Set layout of layeredPane to null. * javax/swing/JLayeredPane.java: (addImpl): Calculate index of the component in the layeredPane according to the specified position within the layer. 2004-05-17 David Jee <djee@redhat.com> * gnu/java/awt/peer/gtk/GtkImagePainter.java (setPixels): Change color model to the default model after converting pixels. * java/awt/image/MemoryImageSource.java (newPixels): Set only the specified rectangle of pixels. 2004-05-13 Thomas Fitzsimmons <fitzsim@redhat.com> * libgcj.spec.in (lib): Add -l-java-awt -l-java-applet -l-java-beans -l-javax-accessibility -l-javax-swing. * java/awt/AWTEvent.java (toString): Print source's name rather than the source itself. 2004-05-12 Thomas Fitzsimmons <fitzsim@redhat.com> * gnu/java/awt/peer/gtk/GtkToolkit.java (loadSystemColors): Make native. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (gdk_color_to_java_color): New function. * jni/gtk-peer/gtkpeer.h: Add SystemColor defines. 2004-05-12 David Jee <djee@redhat.com> * java/awt/image/RGBImageFilter.java: Initialize origmodel as null. (makeColor): Fix pixel component order. (filterRGBPixels): Fix pixel iteration. (setPixels): Add extra checks for index color model. Convert pixels to default color model if necessary. (convertColorModelToDefault): New override method for byte pixels. (convertColorModelToDefault): For int pixels, fix pixel iteration. (makeColorbyDefaultCM): New override method for byte pixels. (makeColorbyDefaultCM): For int pixel, add color model as argument. (makeColor): Fix pixel component order. 2004-05-11 Kim Ho <kho@redhat.com> * javax/swing/Box.java: Comment out more parts of Box.Filler. 2004-05-11 Kim Ho <kho@redhat.com> * javax/swing/Box.java: Remove reference to AccessibleAWTComponent so it compiles again. 2004-05-10 Thomas Fitzsimmons <fitzsim@redhat.com> * gnu/java/awt/peer/gtk/GtkListPeer.java, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c: Update implementation of list peer to use GtkTreeView instead of deprecated GtkCList. 2004-05-07 Thomas Fitzsimmons <fitzsim@redhat.com> * gnu/java/awt/peer/gtk/GtkComponentPeer.java (gtkWidgetDispatchKeyEvent): Remove keyChar parameter. (handleEvent): Remove keyChar argument to gtkWidgetDispatchKeyEvent calls. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Fix compiler warnings. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Likewise. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c: Likewise. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c: Likewise. 2004-05-06 Thomas Fitzsimmons <fitzsim@redhat.com> * gnu/java/awt/peer/gtk/GtkComponentPeer.java (gtkWidgetRequestFocus): Mark protected. (GtkComponentPeer): Only set the peer's bounds if its component is valid. * java/awt/Component.java (static): Set the default keyboard focus manager. (requestFocus(), requestFocus(boolean), requestFocusInWindow(), requestFocusInWindow(temporary)): Don't request focus if the component is not showing. Get tree lock before traversing component hierarchy. * java/awt/DefaultKeyboardFocusManager.java (dispatchEvent): Only set the global focus owner if it is not a Window. (processKeyEvent): Consume keystrokes associated with the focus traversal keystroke. (focusPreviousComponent, focusNextComponent, upFocusCycle, downFocusCycle): Call requestFocusInWindow instead of requestFocus. * java/awt/EventDispatchThread.java (run): Move setting of default keyboard focus manager to Component.java. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (awt_keycode_to_keysym): New function. (gtkWidgetDispatchKeyEvent): Finish implementation. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (pre_event_handler): Add FIXME comment. * gnu/java/awt/peer/gtk/GtkTextAreaPeer.java, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c (gtkWidgetRequestFocus): New method. * java/awt/TextArea.java (TextArea): Set focus traversal keys to disable Tab and Shift-Tab keystrokes. (addNotify, appendText, insertText, replaceText): Simplify peer retrieval code. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c (connectSignals): Remove connections to "commit" signals. Remove C++-style comments. * gnu/java/awt/peer/gtk/GtkButtonPeer.java, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c (handleEvent): Activate GTK button when the space bar key is pressed. (gtkActivate): New method. 2004-05-06 David Jee <djee@redhat.com> * java/awt/image/CropImageFilter.java (setPixels): Implement for byte array pixels. * java/awt/image/ReplicateScaleFilter.java (setPixels): Implement for byte array pixels. (replicatePixels): Overload for byte array pixels. 2004-05-06 Kim Ho <kho@redhat.com> * javax/swing/Box.java: (getAccessibleContext): Return an instance of the correct class. 2004-05-05 David Jee <djee@redhat.com> * gnu/java/awt/peer/gtk/GdkGraphics.java (drawImage): When component is null, use SystemColor.window as the default bgcolor. * gnu/java/awt/peer/gtk/GtkImage.java (setPixels): We can avoid iterating through the pixel rows only when height is 1. * java/awt/Image.java (getScaledInstance): Partially implement. * java/awt/image/CropImageFilter.java (setProperties): Fix "filter" property. (setPixels): Implement. * java/awt/image/ReplicateScaleFilter.java (setDimensions): Use scaled dimensions. (setPixels): Implement. (replicatePixels): New method. 2004-05-05 David Jee <djee@redhat.com> * gnu/java/awt/peer/gtk/GtkImagePainter.java (convertPixels): If either pixels or model is null, return null. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c (Java_gnu_java_awt_peer_gtk_GtkImagePainter_drawPixels): If jpixels is null, do nothing and return. 2004-05-03 Kim Ho <kho@redhat.com> * gnu/java/awt/peer/gtk/GtkDialogPeer.java: (getGraphics): Like GtkFramePeer, the Graphics object needs to be translate to account for window decorations. (postMouseEvent): New method. Account for translation. (postExposeEvent): ditto. * javax/swing/Box.java: Stubbed. * javax/swing/JDialog.java: Ran through jalopy to fix indentation. (JDialog): Call SwingUtilities' getOwnerFrame for null owners. (setLayout): Check isRootPaneCheckingEnabled * javax/swing/JOptionPane.java: Re-implemented. * javax/swing/SwingUtilities.java: (getOwnerFrame): Static method to grab a default owner frame for Dialogs that don't specify owners. * javax/swing/event/SwingPropertyChangeSupport.java: (firePropertyChange): Fix early exit condition. * javax/swing/plaf/basic/BasicLabelUI.java: (paint): Avoid painting text if it is null or empty. * javax/swing/plaf/basic/BasicOptionPaneUI.java: Implement. 2004-05-03 Olga Rodimina <rodimina@redhat.com> * Makefile.am: Added new file. * Makefile.in: Regenerate. * javax/swing/JPopupMenu.java: Started implementation. * javax/swing/JWindow.java (JWindow): call super() if parent for window is not specified. * javax/swing/plaf/basic/BasicPopupMenuUI.java: New File. UI Delegate for JPopupMenu. 2004-04-30 Olga Rodimina <rodimina@redhat.com> * javax/swing/JApplet.java: Indicated that JApplet implements RootPaneContainer and made method of this interface public. * javax/swing/JFrame.java: Ditto. * javax/swing/JWindow.java: Ditto. 2004-04-29 Thomas Fitzsimmons <fitzsim@redhat.com> * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (nativeSetBounds): Call gdk_window_move in addition to gtk_window_move. * java/applet/Applet.java (preferredSize): Call parent's preferredSize if the applet stub is null. (minimumSize): Likewise for parent's minimumSize. 2004-04-27 Olga Rodimina <rodimina@redhat.com> * javax/swing/JMenuItem.java (createActionPropertyChangeListener): Implemented. (processMouseEvent): Ditto. (fireMenuDragMouseEntered): Ditto. (fireMenuDragMouseExited): Ditto. (fireMenuDragMouseDragged): Ditto. (fireMenuDragMouseReleased): Ditto. (menuSelectionChanged): Ditto. (getSubElements): Ditto. (getComponent): Ditto. (addMenuDragMouseListener): Ditto. (removeMenuDragMouseListener):Ditto. (addMenuKeyListener): Ditto. (removeMenuKeyListener): Ditto. * javax/swing/plaf/basic/BasicMenuItemUI.java (doClick): Imlemented. * javax/swing/plaf/basic/BasicMenuItemUI.MouseInputHandler: Don't handle mouse events here. Pass them to MenuSelectionManager. 2004-04-26 Olga Rodimina <rodimina@redhat.com> Used correct version of jalopy configuration file to fix style in the files below. 2004-04-26 Olga Rodimina <rodimina@redhat.com> * javax/swing/JCheckBoxMenuItem.java: Fixed style and removed unnecessary comments. * javax/swing/JMenuItem.java: Ditto. * javax/swing/JRadioButtonMenuItem.java: Ditto. * javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java: Ditto. * javax/swing/plaf/basic/BasicMenuItemUI.java: Ditto. * javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java: Ditto. 2004-04-23 Thomas Fitzsimmons <fitzsim@redhat.com> * gnu_java_awt_peer_gtk_GtkWindowPeer.c: Change FIXME comment to C-style. * gnu_java_awt_peer_gtk_GtkWindowPeer.c: Add FIXME comment. * java/awt/ContainerOrderFocusTraversalPolicy.java (getComponentAfter): Start from current component and work up the component hierarchy until an acceptable component is found. Synchronize on tree lock. (getComponentBefore): Likewise. 2004-04-22 Thomas Fitzsimmons <fitzsim@redhat.com> * gnu/java/awt/peer/gtk/GtkComponentPeer.java: Remove focus-related debugging messages. * java/awt/DefaultKeyboardFocusManager.java: Likewise. * java/awt/EventDispatchThread.java: Likewise. * java/awt/KeyboardFocusManager.java: Likewise. * java/awt/Window.java: Likewise. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Likewise. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Likewise. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Change new C++-style comments to C-style comments. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Likewise. * gnu/java/awt/peer/gtk/GtkComponentPeer.java, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (handleEvent): Dispatch key press and key release events to backing widget. (requestFocus): Post a FOCUS_GAINED event to the event queue. (gtkWidgetRequestFocus): New method. (gtkWidgetDispatchKeyEvent): Likewise. * java/awt/Component.java (requestFocus, requestFocus(boolean), requestFocusInWindow, requestFocusInWindow(boolean), getFocusCycleRootAncestor, nextFocus, transferFocus, transferFocusBackward, transferFocusUpCycle, hasFocus, isFocusOwner): Implement and document focus-handling methods. (setFocusTraversalKeys): Inherit focus traversal keys when keystrokes argument is null. Fix focus-handling documentation throughout class. * java/awt/Container.java (setFocusTraversalKeys, getFocusTraversalKeys, areFocusTraversalKeysSet, isFocusCycleRoot, setFocusTraversalPolicy, getFocusTraversalPolicy, isFocusTraversalPolicySet, setFocusCycleRoot, isFocusCycleRoot, transferFocusDownCycle): Implement and document focus-handling methods. (transferFocusBackward): Remove method. (readObject, writeObject): Implement and document serialization methods. * java/awt/ContainerOrderFocusTraversalPolicy.java: Implement and document. * java/awt/DefaultFocusTraversalPolicy.java: Implement and document. * java/awt/DefaultKeyboardFocusManager.java: Implement and partially document. * java/awt/EventDispatchThread.java (run): Set default keyboard focus manager. Attempt to dispatch each event to the keyboard focus manager before normal dispatch. * java/awt/KeyboardFocusManager.java: Implement and partially document. * java/awt/Window.java (Window): Set focusCycleRoot to true. (show): Focus initial component when window is shown for the first time. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (pre_event_handler): Replace complex key press and key release logic with simple callbacks into GtkComponentPeer. * jni/gtk-peer/gtkpeer.h: Fix FOCUS_GAINED/FOCUS_LOST reversal. 2004-04-21 Olga Rodimina <rodimina@redhat.com> * javax/swing/MenuSelectionManager.java (componentForPoint): Added new method. (defaultManager): New Method. Implemented. (getSelectedPath): Ditto. (isComponentPartOfCurrentMenu): Ditto. (processKeyEvent): Added new method. (processMouseEvent): New Method. Implemented. (setSelectedPath): Ditto. (getPath): Ditto. 2004-04-19 Kim Ho <kho@redhat.com> * java/awt/Container.java: (remove): Set the component's parent to null. (getComponentAt): Implement. * javax/swing/JComponent.java: (JComponent): Initialize defaultLocale (getDefaultLocale): Implement. (setDefaultLocale): ditto. * javax/swing/JSlider.java: (JSlider): Fix calculation of value. * javax/swing/JSplitPane.java: Implement. * javax/swing/plaf/basic/BasicLookAndFeel.java: Change SplitPane's default divider size. * javax/swing/plaf/basic/BasicScrollBarUI.java: (paint): Remove unused code. * javax/swing/plaf/basic/BasicSplitPaneDivider.java: Added comments and ran through jalopy. (setBasicSplitPaneUI): Get reference to hidden divider and set up one touch buttons if necessary. (setBorder): Fire propertyChangeEvent only if borders are different. (getPreferredSize): Defer to layout manager. (propertyChange): Implement. (oneTouchExpandableChanged): ditto. (createLeftOneTouchButton): Use BasicArrowButton. (createRightOneTouchButton): ditto. (moveDividerTo): New method. Moves the divider to a set location based on the last divider location. (BasicSplitPaneDivider::MouseHandler): Implement. (BasicSplitPaneDivider::OneTouchButton): Removed. (BasicSplitPaneDivider::DragController): Implement. (BasicSplitPaneDivider::VerticalDragController): ditto. (BasicSplitPaneDivider::DividerLayout): ditto. * javax/swing/plaf/basic/BasicSplitPaneUI.java: Reimplement. * javax/swing/plaf/basic/BasicTabbedPaneUI.java: (calculateLayoutInfo): Don't show component if it's null. (paintTab): Fix title paint logic. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82314 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/jni')
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c3
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c5
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c288
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c32
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c521
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c142
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c3
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c439
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c7
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c3
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c20
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c62
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c69
-rw-r--r--libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c14
-rw-r--r--libjava/jni/gtk-peer/gtkcairopeer.h3
-rw-r--r--libjava/jni/gtk-peer/gtkpeer.h33
16 files changed, 1269 insertions, 375 deletions
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c
index afb705bf6e1..a56e7d27d5b 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c
@@ -112,9 +112,10 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_setFont
struct peerfont *pfont = NULL;
PangoFontMap *map = NULL;
char const *family_name = NULL;
+ enum java_awt_font_style style;
gdk_threads_enter ();
- enum java_awt_font_style style = (enum java_awt_font_style) style_int;
+ style = (enum java_awt_font_style) style_int;
g_assert (self != NULL);
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, self);
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c
index b05d76ecb53..5e8562455a4 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c
@@ -636,9 +636,12 @@ JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIsHori
gdk_threads_leave ();
- return
+ return 1;
+ /* FIXME: Pango doesn't seem to have decided how it will deal
+ with vertical text. for the time being we inherit this limitation.
((dir == PANGO_DIRECTION_LTR) ||
(dir == PANGO_DIRECTION_RTL));
+ */
}
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
index a161ba49992..733461dcfc1 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
@@ -67,7 +67,9 @@ struct state_table *native_graphics2d_state_table;
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState
(JNIEnv *env, jclass clazz)
{
- NSA_G2D_INIT (env, clazz);
+ gdk_threads_enter();
+ NSA_G2D_INIT (env, clazz);
+ gdk_threads_leave();
}
/* these public final constants are part of the java2d public API, so we
@@ -124,6 +126,32 @@ enum java_awt_rendering_hints_filter
};
+static int
+peer_is_disposed(JNIEnv *env, jobject obj)
+{
+ static jfieldID fid = NULL;
+ jclass cls;
+ jobject peer;
+
+ return 0;
+
+ if (fid == NULL)
+ {
+ cls = (*env)->GetObjectClass(env, obj);
+ fid = (*env)->GetFieldID(env, cls, "component",
+ "Lgnu/java/awt/peer/gtk/GtkComponentPeer;");
+ }
+ g_assert(fid != NULL);
+ peer = (*env)->GetObjectField(env, obj, fid);
+ if (peer == NULL || NSA_GET_PTR (env, peer) != NULL)
+ return 0;
+ else
+ {
+ return 1;
+ }
+}
+
+
static void
grab_current_drawable (GtkWidget *widget, GdkDrawable **draw, GdkWindow **win)
{
@@ -220,7 +248,7 @@ init_graphics2d_as_renderable (struct graphics2d *gr)
static void
begin_drawing_operation (struct graphics2d * gr)
{
- gdk_threads_enter ();
+ g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS);
if (gr->drawbuf)
{
@@ -248,6 +276,7 @@ begin_drawing_operation (struct graphics2d * gr)
static void
end_drawing_operation (struct graphics2d * gr)
{
+ g_assert(cairo_status (gr->cr) == CAIRO_STATUS_SUCCESS);
if (gr->drawbuf)
{
gint drawable_width, drawable_height;
@@ -268,7 +297,6 @@ end_drawing_operation (struct graphics2d * gr)
if (gr->debug) printf ("copied (%d, %d) pixels from pixbuf to GDK drawable\n",
width, height);
}
- gdk_threads_leave ();
}
@@ -288,7 +316,7 @@ update_pattern_transform (struct graphics2d *gr)
mat = cairo_matrix_create ();
g_assert (mat != NULL);
cairo_matrix_set_affine (mat, a, b, c, d, tx, ty);
- cairo_surface_set_matrix (gr->pattern, mat);
+ cairo_pattern_set_matrix (gr->pattern, mat);
cairo_matrix_destroy (mat);
}
@@ -303,6 +331,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState
{
struct graphics2d *g = NULL, *g_old = NULL;
+ gdk_threads_enter();
g = (struct graphics2d *) malloc (sizeof (struct graphics2d));
g_assert (g != NULL);
memset (g, 0, sizeof(struct graphics2d));
@@ -315,7 +344,6 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState
g->drawable = g_old->drawable;
g->debug = g_old->debug;
- gdk_threads_enter ();
g_object_ref (g->drawable);
g->cr = cairo_create();
@@ -328,9 +356,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState
cairo_surface_set_filter (g->surface, CAIRO_FILTER_FAST);
- gdk_threads_leave ();
-
NSA_SET_G2D_PTR (env, obj, g);
+ gdk_threads_leave();
}
@@ -338,9 +365,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II
(JNIEnv *env, jobject obj, jint width, jint height)
{
struct graphics2d *gr;
-
- gdk_threads_enter ();
+ gdk_threads_enter();
gr = (struct graphics2d *) malloc (sizeof (struct graphics2d));
g_assert (gr != NULL);
memset (gr, 0, sizeof(struct graphics2d));
@@ -362,22 +388,23 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II
else
init_graphics2d_as_pixbuf (gr);
- gdk_threads_leave ();
if (gr->debug) printf ("constructed offscreen drawable of size (%d,%d)\n",
width, height);
NSA_SET_G2D_PTR (env, obj, gr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable
(JNIEnv *env, jobject self, jobject other, jint x, jint y)
{
- GdkRectangle clipRect;
struct graphics2d *src = NULL, *dst = NULL;
gint s_height, s_width, d_height, d_width, height, width;
cairo_matrix_t *matrix;
GdkGC *gc;
cairo_operator_t tmp_op;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; }
src = (struct graphics2d *)NSA_GET_G2D_PTR (env, other);
dst = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);
g_assert (src != NULL);
@@ -385,14 +412,14 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable
if (src->debug) printf ("copying from offscreen drawable\n");
- gdk_threads_enter ();
+ begin_drawing_operation(dst);
+
+ gdk_flush();
+
gdk_drawable_get_size (src->drawable, &s_width, &s_height);
gdk_drawable_get_size (dst->drawable, &d_width, &d_height);
width = min (s_width, d_width);
height = min (s_height, d_height);
- gdk_threads_leave ();
-
- begin_drawing_operation(dst);
matrix = cairo_matrix_create ();
cairo_surface_get_matrix (src->surface, matrix);
@@ -408,14 +435,12 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable
cairo_surface_set_matrix (src->surface, matrix);
cairo_matrix_destroy (matrix);
- end_drawing_operation(dst);
+ gdk_flush();
- gdk_threads_enter ();
- gdk_flush ();
- gdk_threads_leave ();
+ end_drawing_operation(dst);
if (src->debug) printf ("copied %d x %d pixels from offscreen drawable\n", width, height);
-
+ gdk_threads_leave();
}
static jintArray
@@ -454,9 +479,10 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__
void *ptr = NULL;
jintArray color;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
ptr = NSA_GET_PTR (env, peer);
g_assert (ptr != NULL);
- gdk_threads_enter ();
gr = (struct graphics2d *) malloc (sizeof (struct graphics2d));
g_assert (gr != NULL);
@@ -480,8 +506,8 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__
color = current_colors_of_widget (widget, env);
- gdk_threads_leave ();
NSA_SET_G2D_PTR (env, obj, gr);
+ gdk_threads_leave();
return color;
}
@@ -490,11 +516,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose
{
struct graphics2d *gr = NULL;
+ gdk_threads_enter();
gr = (struct graphics2d *) NSA_DEL_G2D_PTR (env, obj);
if (gr == NULL)
- return; /* dispose has been called more than once */
-
- gdk_threads_enter ();
+ {
+ gdk_threads_leave();
+ return; /* dispose has been called more than once */
+ }
if (gr->surface)
cairo_surface_destroy (gr->surface);
@@ -507,15 +535,18 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose
g_object_unref (gr->drawable);
if (gr->pattern)
- cairo_surface_destroy (gr->pattern);
+ cairo_pattern_destroy (gr->pattern);
+
+ if (gr->pattern_surface)
+ cairo_surface_destroy (gr->pattern_surface);
if (gr->pattern_pixels)
free (gr->pattern_pixels);
if (gr->debug) printf ("disposed of graphics2d\n");
- free (gr);
- gdk_threads_leave ();
+ free (gr);
+ gdk_threads_leave();
}
@@ -533,6 +564,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
if (gr->debug) printf ("setGradient (%f,%f) -> (%f,%f); (%d,%d,%d,%d) -> (%d,%d,%d,%d)\n",
x1, y1,
x2, y2,
@@ -623,19 +656,21 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient
/* cairo_surface_set_repeat (surf, cyclic ? 1 : 0); */
if (gr->pattern)
- cairo_surface_destroy (gr->pattern);
+ cairo_pattern_destroy (gr->pattern);
+
+ if (gr->pattern_surface)
+ cairo_surface_destroy (gr->pattern_surface);
if (gr->pattern_pixels)
- {
- free (gr->pattern_pixels);
- gr->pattern_pixels = NULL;
- }
-
- gr->pattern = surf;
+ free (gr->pattern_pixels);
+
+ gr->pattern_pixels = NULL;
+ gr->pattern_surface = surf;
+ gr->pattern = cairo_pattern_create_for_surface(surf);
cairo_restore (gr->cr);
cairo_set_pattern (gr->cr, gr->pattern);
-
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels
@@ -644,6 +679,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels
struct graphics2d *gr = NULL;
jint *jpixels = NULL;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
@@ -651,12 +688,16 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels
(*env)->GetArrayLength (env, jarr), w, h, stride);
if (gr->pattern)
- cairo_surface_destroy (gr->pattern);
+ cairo_pattern_destroy (gr->pattern);
+
+ if (gr->pattern_surface)
+ cairo_surface_destroy (gr->pattern_surface);
if (gr->pattern_pixels)
free (gr->pattern_pixels);
gr->pattern = NULL;
+ gr->pattern_surface = NULL;
gr->pattern_pixels = NULL;
gr->pattern_pixels = (char *) malloc (h * stride * 4);
@@ -667,13 +708,15 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels
memcpy (gr->pattern_pixels, jpixels, h * stride * 4);
(*env)->ReleaseIntArrayElements (env, jarr, jpixels, 0);
- gr->pattern = cairo_surface_create_for_image (gr->pattern_pixels,
- CAIRO_FORMAT_ARGB32,
- w, h, stride * 4);
+ gr->pattern_surface = cairo_surface_create_for_image (gr->pattern_pixels,
+ CAIRO_FORMAT_ARGB32,
+ w, h, stride * 4);
+ g_assert (gr->pattern_surface != NULL);
+ cairo_surface_set_repeat (gr->pattern_surface, 1);
+ gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
g_assert (gr->pattern != NULL);
- cairo_surface_set_repeat (gr->pattern, 1);
cairo_set_pattern (gr->cr, gr->pattern);
-
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels
@@ -684,6 +727,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels
jint *native_pixels = NULL;
jdouble *native_matrix = NULL;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
@@ -716,10 +762,11 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels
}
end_drawing_operation (gr);
-
- (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0);
- (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
-
+
+ (*env)->ReleaseIntArrayElements (env, java_pixels, native_pixels, 0);
+ (*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
+
+ gdk_threads_leave();
}
JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePixels
@@ -735,6 +782,9 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePix
gint total_channels = 4;
jint i, px;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
@@ -783,8 +833,8 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePix
(jsize)0, (jsize) width*height,
(jint*) native_pixels);
+ gdk_threads_leave();
return java_pixels;
-
}
/* passthrough methods to cairo */
@@ -793,21 +843,31 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_save\n");
cairo_save (gr->cr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_restore\n");
cairo_restore (gr->cr);
update_pattern_transform (gr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix
@@ -816,6 +876,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix
struct graphics2d *gr = NULL;
jdouble *native_matrix = NULL;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
@@ -840,6 +903,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix
(*env)->ReleaseDoubleArrayElements (env, java_matrix, native_matrix, 0);
update_pattern_transform (gr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont
@@ -850,14 +914,15 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont
cairo_font_t *ft = NULL;
FT_Face face = NULL;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
g_assert (pfont != NULL);
- gdk_threads_enter ();
-
face = pango_ft2_font_get_face (pfont->font);
g_assert (face != NULL);
@@ -873,8 +938,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont
(double)PANGO_SCALE);
cairo_font_destroy (ft);
-
- gdk_threads_leave ();
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoShowGlyphs
@@ -887,6 +951,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoShowGlyphs
jint i;
jint ncodes, nposns;
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
@@ -921,12 +988,17 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoShowGlyphs
end_drawing_operation (gr);
free(glyphs);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator
(JNIEnv *env, jobject obj, jint op)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_set_operator %d\n", op);
@@ -980,12 +1052,17 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator
cairo_set_operator (gr->cr, CAIRO_OPERATOR_XOR);
break;
}
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor
(JNIEnv *env, jobject obj, jdouble r, jdouble g, jdouble b)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
@@ -1000,22 +1077,33 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor
cairo_set_rgb_color (gr->cr, b, g, r);
else
cairo_set_rgb_color (gr->cr, r, g, b);
+
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha
(JNIEnv *env, jobject obj, jdouble a)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_set_alpha %f\n", a);
cairo_set_alpha (gr->cr, a);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule
(JNIEnv *env, jobject obj, jint rule)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
if (gr->debug) printf ("cairo_set_fill_rule %d\n", rule);
g_assert (gr != NULL);
@@ -1028,22 +1116,32 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule
cairo_set_fill_rule (gr->cr, CAIRO_FILL_RULE_EVEN_ODD);
break;
}
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth
(JNIEnv *env, jobject obj, jdouble width)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_set_line_width %f\n", width);
cairo_set_line_width (gr->cr, width);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap
(JNIEnv *env, jobject obj, jint cap)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_set_line_cap %d\n", cap);
@@ -1061,12 +1159,17 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap
cairo_set_line_cap (gr->cr, CAIRO_LINE_CAP_SQUARE);
break;
}
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin
(JNIEnv *env, jobject obj, jint join)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_set_line_join %d\n", join);
@@ -1084,6 +1187,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin
cairo_set_line_join (gr->cr, CAIRO_LINE_JOIN_BEVEL);
break;
}
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash
@@ -1091,6 +1195,10 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash
{
struct graphics2d *gr = NULL;
jdouble *dasharr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_set_dash\n");
@@ -1098,16 +1206,22 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash
g_assert (dasharr != NULL);
cairo_set_dash (gr->cr, dasharr, ndash, offset);
(*env)->ReleaseDoubleArrayElements (env, dashes, dasharr, 0);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit
(JNIEnv *env, jobject obj, jdouble miter)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_set_miter_limit %f\n", miter);
cairo_set_miter_limit (gr->cr, miter);
+ gdk_threads_leave();
}
@@ -1115,132 +1229,197 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_new_path\n");
cairo_new_path (gr->cr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo
(JNIEnv *env, jobject obj, jdouble x, jdouble y)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_move_to (%f, %f)\n", x, y);
cairo_move_to (gr->cr, x, y);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo
(JNIEnv *env, jobject obj, jdouble x, jdouble y)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_line_to (%f, %f)\n", x, y);
cairo_line_to (gr->cr, x, y);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo
(JNIEnv *env, jobject obj, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jdouble x3, jdouble y3)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_curve_to (%f, %f), (%f, %f), (%f, %f)\n", x1, y1, x2, y2, x3, y3);
cairo_curve_to (gr->cr, x1, y1, x2, y2, x3, y3);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo
(JNIEnv *env, jobject obj, jdouble dx, jdouble dy)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_rel_move_to (%f, %f)\n", dx, dy);
cairo_rel_move_to (gr->cr, dx, dy);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo
(JNIEnv *env, jobject obj, jdouble dx, jdouble dy)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_rel_line_to (%f, %f)\n", dx, dy);
cairo_rel_line_to (gr->cr, dx, dy);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo
(JNIEnv *env, jobject obj, jdouble dx1, jdouble dy1, jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_rel_curve_to (%f, %f), (%f, %f), (%f, %f)\n", dx1, dy1, dx2, dy2, dx3, dy3);
cairo_rel_curve_to (gr->cr, dx1, dy1, dx2, dy2, dx3, dy3);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle
(JNIEnv *env, jobject obj, jdouble x, jdouble y, jdouble width, jdouble height)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_rectangle (%f, %f) (%f, %f)\n", x, y, width, height);
cairo_rectangle (gr->cr, x, y, width, height);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_close_path\n");
cairo_close_path (gr->cr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_stroke\n");
begin_drawing_operation (gr);
cairo_stroke (gr->cr);
end_drawing_operation (gr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_fill\n");
begin_drawing_operation (gr);
cairo_fill (gr->cr);
end_drawing_operation (gr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip
(JNIEnv *env, jobject obj)
{
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_clip\n");
- cairo_init_clip (gr->cr);
- cairo_clip (gr->cr);
+ begin_drawing_operation (gr);
+ cairo_init_clip (gr->cr);
+ cairo_clip (gr->cr);
+ end_drawing_operation (gr);
+ gdk_threads_leave();
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter
(JNIEnv *env, jobject obj, jint filter)
{
-
struct graphics2d *gr = NULL;
+
+ gdk_threads_enter();
+ if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
+
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
g_assert (gr != NULL);
if (gr->debug) printf ("cairo_surface_set_filter %d\n", filter);
@@ -1262,4 +1441,5 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetF
cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BEST);
break;
}
+ gdk_threads_leave();
}
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
index 7f5d44a2d7c..9877a45fe58 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
@@ -96,11 +96,14 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetLabel
void *ptr;
ptr = NSA_GET_PTR (env, obj);
- label = gtk_bin_get_child (GTK_BIN(ptr));
+
text = (*env)->GetStringUTFChars (env, jtext, NULL);
gdk_threads_enter ();
+
+ label = gtk_bin_get_child (GTK_BIN (ptr));
gtk_label_set_text (GTK_LABEL(label), text);
+
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, jtext, text);
@@ -112,22 +115,20 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont
{
const char *font_name;
void *ptr;
- GtkWidget *button;
GtkWidget *label;
PangoFontDescription *font_desc;
ptr = NSA_GET_PTR (env, obj);
- button = GTK_WIDGET (ptr);
- label = gtk_bin_get_child (GTK_BIN(button));
-
- if (!label)
- return;
-
font_name = (*env)->GetStringUTFChars (env, name, NULL);
gdk_threads_enter();
+ label = gtk_bin_get_child (GTK_BIN (ptr));
+
+ if (!label)
+ return;
+
font_desc = pango_font_description_from_string (font_name);
pango_font_description_set_size (font_desc, size * PANGO_SCALE);
@@ -173,3 +174,18 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetForeground
gdk_threads_leave ();
}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkActivate
+ (JNIEnv *env, jobject obj)
+{
+ void *ptr;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ gdk_threads_enter ();
+
+ gtk_widget_activate (GTK_WIDGET (ptr));
+
+ gdk_threads_leave ();
+}
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
index fecaff48243..e8a918f9666 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
@@ -39,9 +39,370 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include <gtk/gtkprivate.h>
+#include <gdk/gdkkeysyms.h>
static GtkWidget *find_fg_color_widget (GtkWidget *widget);
static GtkWidget *find_bg_color_widget (GtkWidget *widget);
+static gboolean focus_in_cb (GtkWidget *widget,
+ GdkEventFocus *event,
+ jobject peer);
+static gboolean focus_out_cb (GtkWidget *widget,
+ GdkEventFocus *event,
+ jobject peer);
+/*
+ * This method returns a GDK keyval that corresponds to one of the
+ * keysyms in the X keymap table. The return value is only used to
+ * determine the keyval's corresponding hardware keycode, and doesn't
+ * reflect an accurate translation of a Java virtual key value to a
+ * GDK keyval.
+ */
+#ifdef __GNUC__
+__inline
+#endif
+static guint
+awt_keycode_to_keysym (jint keyCode, jint keyLocation)
+{
+ /* GDK_A through GDK_Z */
+ if (keyCode >= VK_A && keyCode <= VK_Z)
+ return gdk_keyval_to_lower (keyCode);
+
+ /* GDK_0 through GDK_9 */
+ if (keyCode >= VK_0 && keyCode <= VK_9)
+ return keyCode;
+
+ switch (keyCode)
+ {
+ case VK_ENTER:
+ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Enter : GDK_Return;
+ case VK_BACK_SPACE:
+ return GDK_BackSpace;
+ case VK_TAB:
+ return GDK_Tab;
+ case VK_CANCEL:
+ return GDK_Cancel;
+ case VK_CLEAR:
+ return GDK_Clear;
+ case VK_SHIFT:
+ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Shift_L : GDK_Shift_R;
+ case VK_CONTROL:
+ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Control_L : GDK_Control_R;
+ case VK_ALT:
+ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Alt_L : GDK_Alt_R;
+ case VK_PAUSE:
+ return GDK_Pause;
+ case VK_CAPS_LOCK:
+ return GDK_Caps_Lock;
+ case VK_ESCAPE:
+ return GDK_Escape;
+ case VK_SPACE:
+ return GDK_space;
+ case VK_PAGE_UP:
+ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Up : GDK_Page_Up;
+ case VK_PAGE_DOWN:
+ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Page_Down : GDK_Page_Down;
+ case VK_END:
+ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_End : GDK_End;
+ case VK_HOME:
+ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Home : GDK_Home;
+ case VK_LEFT:
+ return GDK_Left;
+ case VK_UP:
+ return GDK_Up;
+ case VK_RIGHT:
+ return GDK_Right;
+ case VK_DOWN:
+ return GDK_Down;
+ case VK_COMMA:
+ return GDK_comma;
+ case VK_MINUS:
+ return GDK_minus;
+ case VK_PERIOD:
+ return GDK_period;
+ case VK_SLASH:
+ return GDK_slash;
+ /*
+ case VK_0:
+ case VK_1:
+ case VK_2:
+ case VK_3:
+ case VK_4:
+ case VK_5:
+ case VK_6:
+ case VK_7:
+ case VK_8:
+ case VK_9:
+ */
+ case VK_SEMICOLON:
+ return GDK_semicolon;
+ case VK_EQUALS:
+ return GDK_equal;
+ /*
+ case VK_A:
+ case VK_B:
+ case VK_C:
+ case VK_D:
+ case VK_E:
+ case VK_F:
+ case VK_G:
+ case VK_H:
+ case VK_I:
+ case VK_J:
+ case VK_K:
+ case VK_L:
+ case VK_M:
+ case VK_N:
+ case VK_O:
+ case VK_P:
+ case VK_Q:
+ case VK_R:
+ case VK_S:
+ case VK_T:
+ case VK_U:
+ case VK_V:
+ case VK_W:
+ case VK_X:
+ case VK_Y:
+ case VK_Z:
+ */
+ case VK_OPEN_BRACKET:
+ return GDK_bracketleft;
+ case VK_BACK_SLASH:
+ return GDK_backslash;
+ case VK_CLOSE_BRACKET:
+ return GDK_bracketright;
+ case VK_NUMPAD0:
+ return GDK_KP_0;
+ case VK_NUMPAD1:
+ return GDK_KP_1;
+ case VK_NUMPAD2:
+ return GDK_KP_2;
+ case VK_NUMPAD3:
+ return GDK_KP_3;
+ case VK_NUMPAD4:
+ return GDK_KP_4;
+ case VK_NUMPAD5:
+ return GDK_KP_5;
+ case VK_NUMPAD6:
+ return GDK_KP_6;
+ case VK_NUMPAD7:
+ return GDK_KP_7;
+ case VK_NUMPAD8:
+ return GDK_KP_8;
+ case VK_NUMPAD9:
+ return GDK_KP_9;
+ case VK_MULTIPLY:
+ return GDK_KP_Multiply;
+ case VK_ADD:
+ return GDK_KP_Add;
+ /*
+ case VK_SEPARATER:
+ */
+ case VK_SEPARATOR:
+ return GDK_KP_Separator;
+ case VK_SUBTRACT:
+ return GDK_KP_Subtract;
+ case VK_DECIMAL:
+ return GDK_KP_Decimal;
+ case VK_DIVIDE:
+ return GDK_KP_Divide;
+ case VK_DELETE:
+ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Delete : GDK_Delete;
+ case VK_NUM_LOCK:
+ return GDK_Num_Lock;
+ case VK_SCROLL_LOCK:
+ return GDK_Scroll_Lock;
+ case VK_F1:
+ return GDK_F1;
+ case VK_F2:
+ return GDK_F2;
+ case VK_F3:
+ return GDK_F3;
+ case VK_F4:
+ return GDK_F4;
+ case VK_F5:
+ return GDK_F5;
+ case VK_F6:
+ return GDK_F6;
+ case VK_F7:
+ return GDK_F7;
+ case VK_F8:
+ return GDK_F8;
+ case VK_F9:
+ return GDK_F9;
+ case VK_F10:
+ return GDK_F10;
+ case VK_F11:
+ return GDK_F11;
+ case VK_F12:
+ return GDK_F12;
+ case VK_F13:
+ return GDK_F13;
+ case VK_F14:
+ return GDK_F14;
+ case VK_F15:
+ return GDK_F15;
+ case VK_F16:
+ return GDK_F16;
+ case VK_F17:
+ return GDK_F17;
+ case VK_F18:
+ return GDK_F18;
+ case VK_F19:
+ return GDK_F19;
+ case VK_F20:
+ return GDK_F20;
+ case VK_F21:
+ return GDK_F21;
+ case VK_F22:
+ return GDK_F22;
+ case VK_F23:
+ return GDK_F23;
+ case VK_F24:
+ return GDK_F24;
+ case VK_PRINTSCREEN:
+ return GDK_Print;
+ case VK_INSERT:
+ return keyLocation == AWT_KEY_LOCATION_NUMPAD ? GDK_KP_Insert : GDK_Insert;
+ case VK_HELP:
+ return GDK_Help;
+ case VK_META:
+ return keyLocation == AWT_KEY_LOCATION_LEFT ? GDK_Meta_L : GDK_Meta_R;
+ case VK_BACK_QUOTE:
+ return GDK_grave;
+ case VK_QUOTE:
+ return GDK_apostrophe;
+ case VK_KP_UP:
+ return GDK_KP_Up;
+ case VK_KP_DOWN:
+ return GDK_KP_Down;
+ case VK_KP_LEFT:
+ return GDK_KP_Left;
+ case VK_KP_RIGHT:
+ return GDK_KP_Right;
+ case VK_DEAD_GRAVE:
+ return GDK_dead_grave;
+ case VK_DEAD_ACUTE:
+ return GDK_dead_acute;
+ case VK_DEAD_CIRCUMFLEX:
+ return GDK_dead_circumflex;
+ case VK_DEAD_TILDE:
+ return GDK_dead_tilde;
+ case VK_DEAD_MACRON:
+ return GDK_dead_macron;
+ case VK_DEAD_BREVE:
+ return GDK_dead_breve;
+ case VK_DEAD_ABOVEDOT:
+ return GDK_dead_abovedot;
+ case VK_DEAD_DIAERESIS:
+ return GDK_dead_diaeresis;
+ case VK_DEAD_ABOVERING:
+ return GDK_dead_abovering;
+ case VK_DEAD_DOUBLEACUTE:
+ return GDK_dead_doubleacute;
+ case VK_DEAD_CARON:
+ return GDK_dead_caron;
+ case VK_DEAD_CEDILLA:
+ return GDK_dead_cedilla;
+ case VK_DEAD_OGONEK:
+ return GDK_dead_ogonek;
+ case VK_DEAD_IOTA:
+ return GDK_dead_iota;
+ case VK_DEAD_VOICED_SOUND:
+ return GDK_dead_voiced_sound;
+ case VK_DEAD_SEMIVOICED_SOUND:
+ return GDK_dead_semivoiced_sound;
+ case VK_AMPERSAND:
+ return GDK_ampersand;
+ case VK_ASTERISK:
+ return GDK_asterisk;
+ case VK_QUOTEDBL:
+ return GDK_quotedbl;
+ case VK_LESS:
+ return GDK_less;
+ case VK_GREATER:
+ return GDK_greater;
+ case VK_BRACELEFT:
+ return GDK_braceleft;
+ case VK_BRACERIGHT:
+ return GDK_braceright;
+ case VK_AT:
+ return GDK_at;
+ case VK_COLON:
+ return GDK_colon;
+ case VK_CIRCUMFLEX:
+ return GDK_asciicircum;
+ case VK_DOLLAR:
+ return GDK_dollar;
+ case VK_EURO_SIGN:
+ return GDK_EuroSign;
+ case VK_EXCLAMATION_MARK:
+ return GDK_exclam;
+ case VK_INVERTED_EXCLAMATION_MARK:
+ return GDK_exclamdown;
+ case VK_LEFT_PARENTHESIS:
+ return GDK_parenleft;
+ case VK_NUMBER_SIGN:
+ return GDK_numbersign;
+ case VK_PLUS:
+ return GDK_plus;
+ case VK_RIGHT_PARENTHESIS:
+ return GDK_parenright;
+ case VK_UNDERSCORE:
+ return GDK_underscore;
+ /*
+ case VK_FINAL:
+ case VK_CONVERT:
+ case VK_NONCONVERT:
+ case VK_ACCEPT:
+ */
+ case VK_MODECHANGE:
+ return GDK_Mode_switch;
+ /*
+ case VK_KANA:
+ */
+ case VK_KANJI:
+ return GDK_Kanji;
+ /*
+ case VK_ALPHANUMERIC:
+ */
+ case VK_KATAKANA:
+ return GDK_Katakana;
+ case VK_HIRAGANA:
+ return GDK_Hiragana;
+ /*
+ case VK_FULL_WIDTH:
+ case VK_HALF_WIDTH:
+ case VK_ROMAN_CHARACTERS:
+ case VK_ALL_CANDIDATES:
+ */
+ case VK_PREVIOUS_CANDIDATE:
+ return GDK_PreviousCandidate;
+ case VK_CODE_INPUT:
+ return GDK_Codeinput;
+ /*
+ case VK_JAPANESE_KATAKANA:
+ case VK_JAPANESE_HIRAGANA:
+ case VK_JAPANESE_ROMAN:
+ */
+ case VK_KANA_LOCK:
+ return GDK_Kana_Lock;
+ /*
+ case VK_INPUT_METHOD_ON_OFF:
+ case VK_CUT:
+ case VK_COPY:
+ case VK_PASTE:
+ case VK_UNDO:
+ case VK_AGAIN:
+ case VK_FIND:
+ case VK_PROPS:
+ case VK_STOP:
+ case VK_COMPOSE:
+ case VK_ALT_GRAPH:
+ */
+ default:
+ return GDK_VoidSymbol;
+ }
+}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor
@@ -110,6 +471,137 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor
gdk_threads_leave ();
}
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRequestFocus
+ (JNIEnv *env, jobject obj)
+{
+ void *ptr;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ gdk_threads_enter ();
+ gtk_widget_grab_focus (GTK_WIDGET (ptr));
+ gdk_threads_leave ();
+}
+
+/*
+ * Translate a Java KeyEvent object into a GdkEventKey event, then
+ * pass it to the GTK main loop for processing.
+ */
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent
+ (JNIEnv *env, jobject obj, jint id, jlong when, jint mods,
+ jint keyCode, jint keyLocation)
+{
+ void *ptr;
+ GdkEvent *event = NULL;
+ GdkKeymapKey *keymap_keys = NULL;
+ gint n_keys = 0;
+ guint lookup_keyval = 0;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ gdk_threads_enter ();
+
+ if (id == AWT_KEY_PRESSED)
+ event = gdk_event_new (GDK_KEY_PRESS);
+ else if (id == AWT_KEY_RELEASED)
+ event = gdk_event_new (GDK_KEY_RELEASE);
+ else
+ {
+ gdk_threads_leave ();
+ /* Don't send AWT KEY_TYPED events to GTK. */
+ return;
+ }
+
+ if (GTK_IS_BUTTON (ptr))
+ event->key.window = GTK_BUTTON (ptr)->event_window;
+ else if (GTK_IS_SCROLLED_WINDOW (ptr))
+ event->key.window = GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child)->window;
+ else
+ event->key.window = GTK_WIDGET (ptr)->window;
+
+ event->key.send_event = 0;
+ event->key.time = (guint32) when;
+
+ if (mods & AWT_SHIFT_MASK)
+ event->key.state |= GDK_SHIFT_MASK;
+ if (mods & AWT_CTRL_MASK)
+ event->key.state |= GDK_CONTROL_MASK;
+ if (mods & AWT_ALT_MASK)
+ event->key.state |= GDK_MOD1_MASK;
+
+ /* This hack is needed because the AWT has no notion of num lock.
+ It infers numlock state from the only Java virtual keys that are
+ affected by it. */
+ if (keyCode == VK_NUMPAD9
+ || keyCode == VK_NUMPAD8
+ || keyCode == VK_NUMPAD7
+ || keyCode == VK_NUMPAD6
+ || keyCode == VK_NUMPAD5
+ || keyCode == VK_NUMPAD4
+ || keyCode == VK_NUMPAD3
+ || keyCode == VK_NUMPAD2
+ || keyCode == VK_NUMPAD1
+ || keyCode == VK_NUMPAD0
+ || keyCode == VK_DECIMAL)
+ event->key.state |= GDK_MOD2_MASK;
+
+ /* These values don't need to be filled in since GTK doesn't use
+ them. */
+ event->key.length = 0;
+ event->key.string = NULL;
+
+ lookup_keyval = awt_keycode_to_keysym (keyCode, keyLocation);
+
+ if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (),
+ lookup_keyval,
+ &keymap_keys,
+ &n_keys))
+ {
+ /* No matching keymap entry was found. */
+ g_printerr ("No matching keymap entries were found\n");
+ gdk_threads_leave ();
+ return;
+ }
+
+ if (n_keys > 1)
+ g_printerr ("warning: using hardware keycode from first keymap entry, though multiple entries were found\n");
+
+ event->key.hardware_keycode = keymap_keys[0].keycode;
+ event->key.group = keymap_keys[0].group;
+
+ g_free (keymap_keys);
+
+ if (!gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (),
+ event->key.hardware_keycode,
+ event->key.state,
+ event->key.group,
+ &event->key.keyval,
+ NULL, NULL, NULL))
+ {
+ /* No matching keyval was found. */
+ g_printerr ("No matching keyval was found\n");
+ gdk_threads_leave ();
+ return;
+ }
+
+ /* keyevent = (GdkEventKey *) event; */
+ /* g_printerr ("generated event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */
+
+ /* We already received the original key event on the window itself,
+ so we don't want to resend it. */
+ if (!GTK_IS_WINDOW (ptr))
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ gtk_widget_event (GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child), event);
+ else
+ gtk_widget_event (GTK_WIDGET (ptr), event);
+ }
+
+ gdk_threads_leave ();
+}
+
/*
* Find the origin of a widget's window.
*/
@@ -734,6 +1226,12 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignal
g_signal_connect (GTK_OBJECT (ptr), "event",
G_CALLBACK (pre_event_handler), *gref);
+ g_signal_connect (G_OBJECT (ptr), "focus-in-event",
+ G_CALLBACK (focus_in_cb), *gref);
+
+ g_signal_connect (G_OBJECT (ptr), "focus-out-event",
+ G_CALLBACK (focus_out_cb), *gref);
+
gdk_threads_leave ();
}
@@ -772,3 +1270,26 @@ find_bg_color_widget (GtkWidget *widget)
return bg_color_widget;
}
+static gboolean
+focus_in_cb (GtkWidget *widget __attribute((unused)),
+ GdkEventFocus *event __attribute((unused)),
+ jobject peer)
+{
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postFocusEventID,
+ AWT_FOCUS_GAINED,
+ JNI_FALSE);
+ return FALSE;
+}
+
+static gboolean
+focus_out_cb (GtkWidget *widget __attribute((unused)),
+ GdkEventFocus *event __attribute((unused)),
+ jobject peer)
+{
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postFocusEventID,
+ AWT_FOCUS_LOST,
+ JNI_FALSE);
+ return FALSE;
+}
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
index efee7c8f1a2..b3858fb3970 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
@@ -806,31 +806,6 @@ keyevent_to_awt_keychar (GdkEvent *event)
}
}
-/* Checks if keyval triggers a KEY_TYPED event on the source widget.
- This function identifies special keyvals that don't trigger
- GtkIMContext "commit" signals, but that do trigger Java KEY_TYPED
- events. */
-static int
-generates_key_typed_event (GdkEvent *event, GtkWidget *source)
-{
- guint keyval;
-
- if (!GTK_IS_ENTRY (source)
- && !GTK_IS_TEXT_VIEW (source))
- return event->key.length ? 1 : 0;
-
- keyval = event->key.keyval;
-
- return (keyval == GDK_Escape
- || keyval == GDK_BackSpace
- || keyval == GDK_Delete
- || keyval == GDK_KP_Delete
- || keyval == GDK_Return
- || keyval == GDK_KP_Enter
- || (keyval == GDK_Tab
- && GTK_IS_TEXT_VIEW(source))) ? 1 : 0;
-}
-
void
awt_event_handler (GdkEvent *event)
{
@@ -1055,104 +1030,53 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer)
}
}
break;
+
case GDK_FOCUS_CHANGE:
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postFocusEventID,
- (jint) (event->focus_change.in) ?
+ (jint) (event->focus_change.in) ?
AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
JNI_FALSE);
break;
case GDK_KEY_PRESS:
- case GDK_KEY_RELEASE:
- {
- GdkWindow *obj_window;
- jobject *focus_obj_ptr = NULL;
- int generates_key_typed = 0;
-
- /* A widget with a grab will get key events */
- if (!GTK_IS_WINDOW (widget))
- focus_obj_ptr = &peer;
- else
- {
- GtkWindow *window;
-
- /* Check if we have an enabled focused widget in this window.
- If not don't handle the event. */
- window = GTK_WINDOW (widget);
- if (!window->focus_widget
- || !GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
- || !window->focus_widget->window)
- return FALSE;
-
- /* TextArea peers are attached to the scrolled window
- that contains the GtkTextView, not to the text view
- itself. Same for List. */
- if (GTK_IS_TEXT_VIEW (window->focus_widget)
- || GTK_IS_CLIST (window->focus_widget))
- {
- obj_window = gtk_widget_get_parent (window->focus_widget)->window;
- }
- else if (GTK_IS_BUTTON (window->focus_widget))
- /* GtkButton events go to the "event_window" and this is what
- we registered when the button was created. */
- obj_window = GTK_BUTTON (window->focus_widget)->event_window;
- else
- obj_window = window->focus_widget->window;
-
- gdk_property_get (obj_window,
- gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
- gdk_atom_intern ("CARDINAL", FALSE),
- 0,
- sizeof (jobject),
- FALSE,
- NULL,
- NULL,
- NULL,
- (guchar **)&focus_obj_ptr);
-
- /* If the window has no jobject attached we can't send anything */
- if (!focus_obj_ptr)
- return FALSE;
-
- /* Should we generate an AWT_KEY_TYPED event? */
- generates_key_typed = generates_key_typed_event (event, window->focus_widget);
- }
-
- if (event->type == GDK_KEY_PRESS)
- {
- (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
- postKeyEventID,
- (jint) AWT_KEY_PRESSED,
- (jlong) event->key.time,
+ if (GTK_IS_WINDOW (widget))
+ {
+ /* GdkEventKey *keyevent = (GdkEventKey *) event; */
+ /* g_printerr ("key press event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */
+
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postKeyEventID,
+ (jint) AWT_KEY_PRESSED,
+ (jlong) event->key.time,
keyevent_state_to_awt_mods (event),
keysym_to_awt_keycode (event),
keyevent_to_awt_keychar (event),
keysym_to_awt_keylocation (event));
-
- if (generates_key_typed)
- {
- (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
- postKeyEventID,
- (jint) AWT_KEY_TYPED,
- (jlong) event->key.time,
- state_to_awt_mods (event->key.state),
- VK_UNDEFINED,
- keyevent_to_awt_keychar (event),
- AWT_KEY_LOCATION_UNKNOWN);
- }
+ /* FIXME: generation of key typed events needs to be moved
+ to GtkComponentPeer.postKeyEvent. If the key in a key
+ press event is not an "action" key
+ (KeyEvent.isActionKey) and is not a modifier key, then
+ it should generate a key typed event. */
+ return TRUE;
}
- else /* GDK_KEY_RELEASE */
- {
- (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
- postKeyEventID,
- (jint) AWT_KEY_RELEASED,
- (jlong) event->key.time,
- keyevent_state_to_awt_mods (event),
- keysym_to_awt_keycode (event),
+ else
+ return FALSE;
+ break;
+ case GDK_KEY_RELEASE:
+ if (GTK_IS_WINDOW (widget))
+ {
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postKeyEventID,
+ (jint) AWT_KEY_RELEASED,
+ (jlong) event->key.time,
+ keyevent_state_to_awt_mods (event),
+ keysym_to_awt_keycode (event),
keyevent_to_awt_keychar (event),
keysym_to_awt_keylocation (event));
- }
- }
+ return TRUE;
+ }
+ else
+ return FALSE;
break;
default:
break;
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c
index f4e9c3599b3..13282e2be43 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c
@@ -58,6 +58,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImagePainter_drawPixels
g = (struct graphics *) NSA_GET_PTR (env, gc_obj);
+ if (!jpixels)
+ return;
+
elems = (*env)->GetIntArrayElements (env, jpixels, NULL);
num_pixels = (*env)->GetArrayLength (env, jpixels);
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
index 87ecafce991..9f8301bf7d5 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
@@ -1,76 +1,109 @@
/* gtklistpeer.c -- Native implementation of GtkListPeer
Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath 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 for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library. Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module. An independent module is a module which is not derived from
-or based on this library. If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so. If you do not wish to do so, delete this
-exception statement from your version. */
-
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath 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 for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
#include "gtkpeer.h"
-#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkListPeer.h"
-static void item_select (GtkCList *list __attribute__((unused)),
- int row, int col __attribute__((unused)),
- GdkEventButton *event __attribute__((unused)),
- jobject peer_obj);
-static void item_unselect (GtkCList *list __attribute__((unused)),
- int row,
- int col __attribute__((unused)),
- GdkEventButton *event __attribute__((unused)),
- jobject peer_obj);
+enum
+ {
+ COLUMN_STRING,
+ N_COLUMNS
+ };
-#define CLIST_FROM_SW(obj) (GTK_CLIST(GTK_SCROLLED_WINDOW (obj)->container.child))
+#define TREE_VIEW_FROM_SW(obj) \
+ (GTK_TREE_VIEW (GTK_SCROLLED_WINDOW (obj)->container.child))
-JNIEXPORT void JNICALL
+JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_create
- (JNIEnv *env, jobject obj)
+ (JNIEnv *env, jobject obj, jint rows)
{
- GtkWidget *list, *sw;
+ GtkWidget *sw;
+ GtkWidget *list;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+ GtkListStore *list_store;
+ GtkTreeIter iter;
+ GtkRequisition req;
+ gint i;
/* Create global reference and save it for future use */
NSA_SET_GLOBAL_REF (env, obj);
gdk_threads_enter ();
-
- list = gtk_clist_new (1);
- gtk_widget_show (list);
+
+ list_store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING);
+ /* Add the number of rows so that we can calculate the tree view's
+ size request. */
+ for (i = 0; i < rows; i++)
+ {
+ gtk_list_store_append (list_store, &iter);
+ gtk_list_store_set (list_store, &iter,
+ COLUMN_STRING, "",
+ -1);
+ }
+ list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (NULL,
+ renderer,
+ "text",
+ COLUMN_STRING,
+ NULL);
+
sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
+
+ gtk_tree_view_append_column (GTK_TREE_VIEW (list), column);
+
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (list), FALSE);
+
+ gtk_widget_size_request (GTK_WIDGET (list), &req);
+
+ gtk_widget_set_size_request (GTK_WIDGET (list), req.width, req.height);
+
gtk_container_add (GTK_CONTAINER (sw), list);
+ /* Remove the blank rows. */
+ gtk_list_store_clear (list_store);
+
+ gtk_widget_show (list);
+ gtk_widget_show (sw);
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, sw);
@@ -87,7 +120,6 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
-
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();
@@ -97,50 +129,98 @@ JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals
(JNIEnv *env, jobject obj)
{
- GtkCList *list;
- void *ptr = NSA_GET_PTR (env, obj);
- jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ void *ptr;
+ GtkTreeView *list;
+ jobject *gref;
+
+ gref = NSA_GET_GLOBAL_REF (env, obj);
g_assert (gref);
+ ptr = NSA_GET_PTR (env, obj);
+
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
+ list = TREE_VIEW_FROM_SW (ptr);
+ g_signal_connect (G_OBJECT (list), "event",
+ G_CALLBACK (pre_event_handler), *gref);
- /* connect selectable hook */
-
- list = CLIST_FROM_SW (ptr);
+ gdk_threads_leave ();
+}
- g_signal_connect (G_OBJECT (list), "select_row",
- GTK_SIGNAL_FUNC (item_select), *gref);
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkSetFont
+ (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
+{
+ const char *font_name;
+ void *ptr;
+ GtkWidget *list;
+ PangoFontDescription *font_desc;
- g_signal_connect (G_OBJECT (list), "unselect_row",
- GTK_SIGNAL_FUNC (item_unselect), *gref);
+ ptr = NSA_GET_PTR (env, obj);
- /* Connect the superclass signals. */
- /* FIXME: Cannot do that here or it will get the sw and not the list.
- We must a generic way of doing this. */
- /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, peer_obj); */
- g_signal_connect (GTK_OBJECT (list), "event",
- G_CALLBACK (pre_event_handler), *gref);
+ gdk_threads_enter();
+
+ list = GTK_WIDGET (TREE_VIEW_FROM_SW (ptr));
+
+ font_name = (*env)->GetStringUTFChars (env, name, NULL);
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ if (style & AWT_STYLE_BOLD)
+ pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
+
+ if (style & AWT_STYLE_ITALIC)
+ pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
+
+ gtk_widget_modify_font (GTK_WIDGET (list), font_desc);
+
+ pango_font_description_free (font_desc);
+
+ (*env)->ReleaseStringUTFChars (env, name, font_name);
+
+ gdk_threads_leave();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkWidgetRequestFocus
+ (JNIEnv *env, jobject obj)
+{
+ void *ptr;
+ GtkWidget *list;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ gdk_threads_enter ();
+
+ list = GTK_WIDGET (TREE_VIEW_FROM_SW (ptr));
+ gtk_widget_grab_focus (list);
gdk_threads_leave ();
}
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkListPeer_append
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkListPeer_append
(JNIEnv *env, jobject obj, jobjectArray items)
{
void *ptr;
- GtkCList *list;
- jint count, i;
+ GtkTreeView *list;
+ GtkTreeIter iter;
+ GtkTreeModel *list_store;
+ jint count;
+ jint i;
ptr = NSA_GET_PTR (env, obj);
count = (*env)->GetArrayLength (env, items);
gdk_threads_enter ();
- list = CLIST_FROM_SW (ptr);
- for (i = 0; i < count; i++)
+
+ list = TREE_VIEW_FROM_SW (ptr);
+ list_store = gtk_tree_view_get_model (list);
+
+ for (i = 0; i < count; i++)
{
const char *text;
jobject item;
@@ -148,11 +228,13 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_append
item = (*env)->GetObjectArrayElement (env, items, i);
text = (*env)->GetStringUTFChars (env, item, NULL);
- gtk_clist_append (list, (char **)&text);
+ gtk_list_store_append (GTK_LIST_STORE (list_store), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (list_store), &iter,
+ COLUMN_STRING, text,
+ -1);
(*env)->ReleaseStringUTFChars (env, item, text);
}
- gtk_clist_columns_autosize (list);
gdk_threads_leave ();
}
@@ -162,12 +244,26 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_add
{
void *ptr;
const char *str;
-
+ GtkTreeView *list;
+ GtkTreeIter iter;
+ GtkTreeModel *list_store;
+
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, text, NULL);
gdk_threads_enter ();
- gtk_clist_insert (CLIST_FROM_SW (ptr), index, (char **)&str);
+
+ list = TREE_VIEW_FROM_SW (ptr);
+ list_store = gtk_tree_view_get_model (list);
+
+ if (index == -1)
+ gtk_list_store_append (GTK_LIST_STORE (list_store), &iter);
+ else
+ gtk_list_store_insert (GTK_LIST_STORE (list_store), &iter, index);
+
+ gtk_list_store_set (GTK_LIST_STORE (list_store), &iter,
+ COLUMN_STRING, str, -1);
+
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, text, str);
@@ -179,22 +275,32 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_delItems
(JNIEnv *env, jobject obj, jint start, jint end)
{
void *ptr;
- GtkCList *list;
+ GtkTreeView *list;
+ GtkTreeIter iter;
+ GtkTreeModel *list_store;
jint i;
+ jint num_items;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- list = CLIST_FROM_SW (ptr);
- if (end == -1) /* special case for removing all rows */
- gtk_clist_clear (list);
+ list = TREE_VIEW_FROM_SW (ptr);
+ list_store = gtk_tree_view_get_model (list);
+
+ /* Special case: remove all rows. */
+ if (end == -1)
+ gtk_list_store_clear (GTK_LIST_STORE (list_store));
else
{
- gtk_clist_freeze (list);
- for (i = end; i >= start; i--)
- gtk_clist_remove (list, i);
- gtk_clist_thaw (list);
+ i = 0;
+ num_items = end - start + 1;
+ gtk_tree_model_iter_nth_child (list_store, &iter, NULL, start);
+ while (i < num_items)
+ {
+ gtk_list_store_remove (GTK_LIST_STORE (list_store), &iter);
+ i++;
+ }
}
gdk_threads_leave ();
@@ -205,11 +311,17 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_select
(JNIEnv *env, jobject obj, jint index)
{
void *ptr;
+ GtkTreeView *list;
+ GtkTreePath *path;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- gtk_clist_select_row (CLIST_FROM_SW (ptr), index, 0);
+
+ list = TREE_VIEW_FROM_SW (ptr);
+ path = gtk_tree_path_new_from_indices (index, -1);
+ gtk_tree_view_set_cursor (list, path, NULL, FALSE);
+
gdk_threads_leave ();
}
@@ -218,40 +330,61 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_deselect
(JNIEnv *env, jobject obj, jint index)
{
void *ptr;
+ GtkTreeView *list;
+ GtkTreeSelection *selection;
+ GtkTreePath *path;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- gtk_clist_unselect_row (CLIST_FROM_SW (ptr), index, 0);
+
+ list = TREE_VIEW_FROM_SW (ptr);
+ selection = gtk_tree_view_get_selection (list);
+ path = gtk_tree_path_new_from_indices (index, -1);
+ gtk_tree_selection_unselect_path (selection, path);
+
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize
- (JNIEnv *env, jobject obj, jint rows, jintArray jdims)
+ (JNIEnv *env, jobject obj, jint rows, jint visible_rows, jintArray jdims)
{
void *ptr;
jint *dims;
- GtkWidget *list;
- GtkScrolledWindow *sw;
- GtkRequisition myreq;
+ GtkRequisition current_req;
+ GtkRequisition natural_req;
dims = (*env)->GetIntArrayElements (env, jdims, NULL);
dims[0] = dims[1] = 0;
- if (rows < 3)
- rows = 3;
-
ptr = NSA_GET_PTR (env, obj);
+
gdk_threads_enter ();
- list = GTK_WIDGET (CLIST_FROM_SW (ptr));
- sw = GTK_SCROLLED_WINDOW (ptr);
+ /* Save the widget's current size request. */
+ gtk_widget_size_request (GTK_WIDGET (ptr), &current_req);
+
+ /* Get the widget's "natural" size request. */
+ gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1);
+ gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req);
+
+ /* Reset the widget's size request. */
+ gtk_widget_set_size_request (GTK_WIDGET (ptr),
+ current_req.width, current_req.height);
+
+ dims[0] = natural_req.width;
+
+ /* Calculate the final height, by comparing the number of rows
+ in the list to the number of rows requested by the caller.
+ FIXME: Is there a GTK method that counts the number of rows
+ in the list? If so, we don't need to bring visible_rows from
+ the Java peer. */
+ if (rows == visible_rows)
+ dims[1] = natural_req.height;
+ else
+ dims[1] = natural_req.height / visible_rows * rows;
- gtk_widget_size_request(GTK_WIDGET(sw), &myreq);
- dims[1]=myreq.height;
- dims[0]=myreq.width;
-
gdk_threads_leave ();
(*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
@@ -263,31 +396,53 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_getSelectedIndexes
(JNIEnv *env, jobject obj)
{
void *ptr;
- GtkCList *list;
- jintArray selection;
- jint *sel;
- GList *child;
- jint count, i;
+ GtkTreeView *list;
+ GtkTreeSelection *selection;
+ jintArray result_array;
+ jint *result_array_iter;
+ GList *current_row;
+ GList *rows;
+ gint *indices;
+ jint count;
+ jint i;
ptr = NSA_GET_PTR (env, obj);
+
gdk_threads_enter ();
- list = CLIST_FROM_SW (ptr);
- count = g_list_length (list->selection);
+ list = TREE_VIEW_FROM_SW (ptr);
+ selection = gtk_tree_view_get_selection (list);
+ count = gtk_tree_selection_count_selected_rows (selection);
+ if (count > 0)
+ {
+ current_row = rows = gtk_tree_selection_get_selected_rows (selection, NULL);
- selection = (*env)->NewIntArray (env, count);
- sel = (*env)->GetIntArrayElements (env, selection, NULL);
+ result_array = (*env)->NewIntArray (env, count);
+ result_array_iter = (*env)->GetIntArrayElements (env, result_array, NULL);
- for (i = 0, child = list->selection; i < count; i++)
- {
- sel[i] = GPOINTER_TO_INT (child->data);
- child = g_list_next (child);
- }
- gdk_threads_leave ();
+ for (i = 0; i < count; i++)
+ {
+ indices = gtk_tree_path_get_indices (current_row->data);
+ result_array_iter[i] = indices ? indices[0] : -1;
+ current_row = g_list_next (current_row);
+ }
+
+ if (rows)
+ {
+ g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+ g_list_free (rows);
+ }
- (*env)->ReleaseIntArrayElements (env, selection, sel, 0);
+ gdk_threads_leave ();
+
+ (*env)->ReleaseIntArrayElements (env, result_array, result_array_iter, 0);
+
+ return result_array;
+ }
+ else
+ gdk_threads_leave ();
- return selection;
+ return (jintArray) NULL;
}
JNIEXPORT void JNICALL
@@ -295,11 +450,17 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_makeVisible
(JNIEnv *env, jobject obj, jint index)
{
void *ptr;
+ GtkTreeView *list;
+ GtkTreePath *path;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- gtk_clist_moveto (CLIST_FROM_SW (ptr), index, 0, 0.5, 0.5);
+
+ list = TREE_VIEW_FROM_SW (ptr);
+ path = gtk_tree_path_new_from_indices (index, -1);
+ gtk_tree_view_scroll_to_cell (list, path, NULL, FALSE, 0.0, 0.0);
+
gdk_threads_leave ();
}
@@ -308,38 +469,18 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_setMultipleMode
(JNIEnv *env, jobject obj, jboolean mode)
{
void *ptr;
-
+ GtkTreeView *list;
+ GtkTreeSelection *selection;
+
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- gtk_clist_set_selection_mode (CLIST_FROM_SW (ptr),
- mode ? GTK_SELECTION_MULTIPLE :
- GTK_SELECTION_SINGLE);
- gdk_threads_leave ();
-}
-static void
-item_select (GtkCList *list __attribute__((unused)),
- int row, int col __attribute__((unused)),
- GdkEventButton *event __attribute__((unused)),
- jobject peer_obj)
-{
- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
- postListItemEventID,
- row,
- (jint) AWT_ITEM_SELECTED);
-}
+ list = TREE_VIEW_FROM_SW (ptr);
+ selection = gtk_tree_view_get_selection (list);
+ gtk_tree_selection_set_mode (selection,
+ mode ? GTK_SELECTION_MULTIPLE
+ : GTK_SELECTION_SINGLE);
-static void
-item_unselect (GtkCList *list __attribute__((unused)),
- int row,
- int col __attribute__((unused)),
- GdkEventButton *event __attribute__((unused)),
- jobject peer_obj)
-{
- (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
- postListItemEventID,
- row,
- (jint) AWT_ITEM_DESELECTED);
+ gdk_threads_leave ();
}
-
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
index e6a8851fcf2..0bb0ec52567 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
@@ -46,8 +46,11 @@ accel_attach (GtkMenuItem *menu_item,
GtkAccelGroup *accel;
accel = gtk_menu_get_accel_group (GTK_MENU (menu_item->submenu));
+ /* FIXME: update this to use GTK-2.4 GtkActions. */
+#if 0
_gtk_accel_group_attach (accel,
G_OBJECT (gtk_widget_get_toplevel (GTK_WIDGET(menu_item))));
+#endif
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_setupAccelGroup
@@ -129,7 +132,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addItem
(JNIEnv *env, jobject obj, jobject menuitempeer, jint key, jboolean shift)
{
void *ptr1, *ptr2;
- GtkMenu *menu;
+ GtkWidget *menu;
ptr1 = NSA_GET_PTR (env, obj);
ptr2 = NSA_GET_PTR (env, menuitempeer);
@@ -142,7 +145,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addItem
if (key)
{
gtk_widget_add_accelerator (GTK_WIDGET (ptr2), "activate",
- gtk_menu_get_accel_group (menu), key,
+ gtk_menu_get_accel_group (GTK_MENU (menu)), key,
(GDK_CONTROL_MASK
| ((shift) ? GDK_SHIFT_MASK : 0)),
GTK_ACCEL_VISIBLE);
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c
index ee12a7f77b1..2d271ea8f2b 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c
@@ -93,7 +93,10 @@ Java_gnu_java_awt_peer_gtk_GtkPopupMenuPeer_setupAccelGroup
gdk_threads_enter ();
menu = GTK_MENU (GTK_MENU_ITEM (ptr1)->submenu);
gtk_menu_set_accel_group (menu, gtk_accel_group_new ());
+ /* FIXME: update this to use GTK-2.4 GtkActions. */
+#if 0
_gtk_accel_group_attach (gtk_menu_get_accel_group (menu),
G_OBJECT (gtk_widget_get_toplevel (ptr2)));
+#endif
gdk_threads_leave ();
}
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
index 704273c08a3..f9baa296459 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
@@ -164,7 +164,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkSetFont
if (style & AWT_STYLE_ITALIC)
pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
- gtk_widget_modify_font (GTK_WIDGET(text), font_desc);
+ gtk_widget_modify_font (GTK_WIDGET (text), font_desc);
pango_font_description_free (font_desc);
@@ -173,6 +173,24 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkSetFont
(*env)->ReleaseStringUTFChars (env, name, font_name);
}
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetRequestFocus
+ (JNIEnv *env, jobject obj)
+{
+ void *ptr;
+ GtkWidget *text;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ gdk_threads_enter ();
+
+ text = GTK_WIDGET (TEXT_FROM_SW (ptr));
+
+ gtk_widget_grab_focus (text);
+
+ gdk_threads_leave ();
+}
+
JNIEXPORT jint JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_getHScrollbarHeight
(JNIEnv *env, jobject obj)
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
index 0d7d55562c5..2807e6b36fc 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
@@ -40,10 +40,6 @@ exception statement from your version. */
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkTextComponentPeer.h"
-static void textcomponent_commit_cb (GtkIMContext *context,
- const gchar *str,
- jobject peer);
-
static void textcomponent_changed_cb (GtkEditable *editable,
jobject peer);
@@ -61,9 +57,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
if (GTK_IS_ENTRY(ptr))
{
- g_signal_connect (GTK_ENTRY (ptr)->im_context, "commit",
- G_CALLBACK (textcomponent_commit_cb), *gref);
-
g_signal_connect (GTK_EDITABLE (ptr), "changed",
G_CALLBACK (textcomponent_changed_cb), *gref);
@@ -85,9 +78,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
if (text)
{
- g_signal_connect (text->im_context, "commit",
- G_CALLBACK (textcomponent_commit_cb), *gref);
-
buf = gtk_text_view_get_buffer (text);
if (buf)
g_signal_connect (buf, "changed",
@@ -112,8 +102,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getCaretPosition
{
void *ptr;
int pos = 0;
- GtkEditable *editable; /* type of GtkEntry (TextField) */
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkEditable *editable;
+ GtkWidget *text = NULL;
GtkTextBuffer *buf;
GtkTextMark *mark;
GtkTextIter iter;
@@ -157,8 +147,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setCaretPosition
(JNIEnv *env, jobject obj, jint pos)
{
void *ptr;
- GtkEditable *editable; /* type of GtkEntry (TextField) */
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkEditable *editable;
+ GtkWidget *text = NULL;
GtkTextBuffer *buf;
GtkTextIter iter;
@@ -198,8 +188,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getSelectionStart
{
void *ptr;
int pos = 0;
- GtkEditable *editable; /* type of GtkEntry (TextField) */
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkEditable *editable;
+ GtkWidget *text = NULL;
GtkTextBuffer *buf;
GtkTextIter start;
GtkTextIter end;
@@ -255,8 +245,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getSelectionEnd
{
void *ptr;
int pos = 0;
- GtkEditable *editable; /* type of GtkEntry (TextField) */
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkEditable *editable;
+ GtkWidget *text = NULL;
GtkTextBuffer *buf;
GtkTextIter start;
GtkTextIter end;
@@ -311,8 +301,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_select
(JNIEnv *env, jobject obj, jint start, jint end)
{
void *ptr;
- GtkEditable *editable; /* type of GtkEntry (TextField) */
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkEditable *editable;
+ GtkWidget *text = NULL;
GtkTextBuffer *buf;
GtkTextIter iter;
@@ -357,8 +347,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setEditable
(JNIEnv *env, jobject obj, jboolean state)
{
void *ptr;
- GtkEditable *editable; /* type of GtkEntry (TextField) */
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkEditable *editable;
+ GtkWidget *text = NULL;
ptr = NSA_GET_PTR (env, obj);
@@ -396,8 +386,8 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getText
void *ptr;
char *contents = NULL;
jstring jcontents;
- GtkEditable *editable; /* type of GtkEntry (TextField) */
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkEditable *editable;
+ GtkWidget *text = NULL;
GtkTextBuffer *buf;
GtkTextIter start, end;
@@ -444,7 +434,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
{
void *ptr;
const char *str;
- GtkWidget *text = NULL; /* type of GtkTextView (TextArea) */
+ GtkWidget *text = NULL;
GtkTextBuffer *buf;
ptr = NSA_GET_PTR (env, obj);
@@ -480,28 +470,6 @@ Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setText
}
static void
-textcomponent_commit_cb (GtkIMContext *context __attribute__((unused)),
- const gchar *str,
- jobject peer)
-{
- /* str is a \0-terminated UTF-8 encoded character. */
- gunichar2 *jc = g_utf8_to_utf16 (str, -1, NULL, NULL, NULL);
- GdkEvent *event = gtk_get_current_event ();
-
- if (jc)
- (*gdk_env)->CallVoidMethod (gdk_env, peer,
- postKeyEventID,
- (jint) AWT_KEY_TYPED,
- (jlong) event->key.time,
- keyevent_state_to_awt_mods (event),
- VK_UNDEFINED,
- (jchar) jc[0],
- AWT_KEY_LOCATION_UNKNOWN);
- g_free (jc);
- gdk_event_free (event);
-}
-
-static void
textcomponent_changed_cb (GtkEditable *editable __attribute__((unused)),
jobject peer)
{
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
index 37c36906277..6234b29c913 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
@@ -39,6 +39,8 @@ exception statement from your version. */
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkToolkit.h"
+static jint gdk_color_to_java_color (GdkColor color);
+
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkToolkit_beep
(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)))
@@ -88,3 +90,70 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_getScreenResolution
return res;
}
+#define CONVERT(type, state) \
+ gdk_color_to_java_color (style->type[GTK_STATE_ ## state])
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkToolkit_loadSystemColors
+ (JNIEnv *env, jobject obj __attribute__((unused)),
+ jintArray jcolors)
+{
+ jint *colors;
+ GtkStyle *style;
+
+ colors = (*env)->GetIntArrayElements (env, jcolors, 0);
+
+ gdk_threads_enter ();
+
+ style = gtk_widget_get_default_style ();
+
+ colors[AWT_DESKTOP] = CONVERT (bg, SELECTED);
+ colors[AWT_ACTIVE_CAPTION] = CONVERT (bg, SELECTED);
+ colors[AWT_ACTIVE_CAPTION_TEXT] = CONVERT (text, SELECTED);
+ colors[AWT_ACTIVE_CAPTION_BORDER] = CONVERT (fg, NORMAL);
+ colors[AWT_INACTIVE_CAPTION] = CONVERT (base, INSENSITIVE);
+ colors[AWT_INACTIVE_CAPTION_TEXT] = CONVERT (fg, INSENSITIVE);
+ colors[AWT_INACTIVE_CAPTION_BORDER] = CONVERT (fg, INSENSITIVE);
+ colors[AWT_WINDOW] = CONVERT (bg, NORMAL);
+ colors[AWT_WINDOW_BORDER] = CONVERT (fg, NORMAL);
+ colors[AWT_WINDOW_TEXT] = CONVERT (fg, NORMAL);
+ colors[AWT_MENU] = CONVERT (bg, NORMAL);
+ colors[AWT_MENU_TEXT] = CONVERT (fg, NORMAL);
+ colors[AWT_TEXT] = CONVERT (bg, NORMAL);
+ colors[AWT_TEXT_TEXT] = CONVERT (fg, NORMAL);
+ colors[AWT_TEXT_HIGHLIGHT] = CONVERT (bg, SELECTED);
+ colors[AWT_TEXT_HIGHLIGHT_TEXT] = CONVERT (fg, SELECTED);
+ colors[AWT_TEXT_INACTIVE_TEXT] = CONVERT (bg, INSENSITIVE);
+ colors[AWT_CONTROL] = CONVERT (bg, NORMAL);
+ colors[AWT_CONTROL_TEXT] = CONVERT (fg, NORMAL);
+ colors[AWT_CONTROL_HIGHLIGHT] = CONVERT (base, ACTIVE);
+ colors[AWT_CONTROL_LT_HIGHLIGHT] = CONVERT (bg, PRELIGHT);
+ colors[AWT_CONTROL_SHADOW] = CONVERT (bg, ACTIVE);
+ colors[AWT_CONTROL_DK_SHADOW] = CONVERT (fg, INSENSITIVE);
+ colors[AWT_SCROLLBAR] = CONVERT (base, INSENSITIVE);
+ colors[AWT_INFO] = CONVERT (bg, NORMAL);
+ colors[AWT_INFO_TEXT] = CONVERT (fg, NORMAL);
+
+ gdk_threads_leave ();
+
+ (*env)->ReleaseIntArrayElements(env, jcolors, colors, 0);
+}
+
+#undef CONVERT
+
+static jint
+gdk_color_to_java_color (GdkColor gdk_color)
+{
+ guchar red;
+ guchar green;
+ guchar blue;
+ float factor;
+
+ factor = 255.0 / 65535.0;
+
+ red = (float) gdk_color.red * factor;
+ green = (float) gdk_color.green * factor;
+ blue = (float) gdk_color.blue * factor;
+
+ return (jint) (0xff000000 | (red << 16) | (green << 8) | blue);
+}
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
index 619b48d593a..c696a3fa6a2 100644
--- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
+++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
@@ -357,6 +357,20 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds
gdk_threads_enter ();
gtk_window_move (GTK_WINDOW(ptr), x, y);
+ /* The call to gdk_window_move is needed in addition to the call to
+ gtk_window_move. If gdk_window_move isn't called, then the
+ following set of operations doesn't give the expected results:
+
+ 1. show a window
+ 2. manually move it to another position on the screen
+ 3. hide the window
+ 4. reposition the window with Component.setLocation
+ 5. show the window
+
+ Instead of being at the position set by setLocation, the window
+ is reshown at the position to which it was moved manually. */
+ gdk_window_move (GTK_WIDGET (ptr)->window, x, y);
+
/* Need to change the widget's request size. */
gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
/* Also need to call gtk_window_resize. If the resize is requested
diff --git a/libjava/jni/gtk-peer/gtkcairopeer.h b/libjava/jni/gtk-peer/gtkcairopeer.h
index 90a148fa9fc..b4021f51ed9 100644
--- a/libjava/jni/gtk-peer/gtkcairopeer.h
+++ b/libjava/jni/gtk-peer/gtkcairopeer.h
@@ -71,7 +71,8 @@ struct graphics2d
GdkWindow *win;
GdkPixbuf *drawbuf;
char *pattern_pixels;
- cairo_surface_t *pattern;
+ cairo_surface_t *pattern_surface;
+ cairo_pattern_t *pattern;
gboolean debug;
};
diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h
index d552e687c9b..a913986c1db 100644
--- a/libjava/jni/gtk-peer/gtkpeer.h
+++ b/libjava/jni/gtk-peer/gtkpeer.h
@@ -361,8 +361,8 @@ struct graphics
#define VK_ALT_GRAPH 65406
#define VK_UNDEFINED 0
-#define AWT_FOCUS_LOST 1004
-#define AWT_FOCUS_GAINED 1005
+#define AWT_FOCUS_GAINED 1004
+#define AWT_FOCUS_LOST 1005
#define AWT_WINDOW_OPENED 200
#define AWT_WINDOW_CLOSING 201
@@ -385,6 +385,35 @@ struct graphics
#define AWT_STYLE_BOLD 1
#define AWT_STYLE_ITALIC 2
+/* From java.awt.SystemColor */
+#define AWT_DESKTOP 0
+#define AWT_ACTIVE_CAPTION 1
+#define AWT_ACTIVE_CAPTION_TEXT 2
+#define AWT_ACTIVE_CAPTION_BORDER 3
+#define AWT_INACTIVE_CAPTION 4
+#define AWT_INACTIVE_CAPTION_TEXT 5
+#define AWT_INACTIVE_CAPTION_BORDER 6
+#define AWT_WINDOW 7
+#define AWT_WINDOW_BORDER 8
+#define AWT_WINDOW_TEXT 9
+#define AWT_MENU 10
+#define AWT_MENU_TEXT 11
+#define AWT_TEXT 12
+#define AWT_TEXT_TEXT 13
+#define AWT_TEXT_HIGHLIGHT 14
+#define AWT_TEXT_HIGHLIGHT_TEXT 15
+#define AWT_TEXT_INACTIVE_TEXT 16
+#define AWT_CONTROL 17
+#define AWT_CONTROL_TEXT 18
+#define AWT_CONTROL_HIGHLIGHT 19
+#define AWT_CONTROL_LT_HIGHLIGHT 20
+#define AWT_CONTROL_SHADOW 21
+#define AWT_CONTROL_DK_SHADOW 22
+#define AWT_SCROLLBAR 23
+#define AWT_INFO 24
+#define AWT_INFO_TEXT 25
+#define AWT_NUM_COLORS 26
+
extern jmethodID setBoundsCallbackID;
extern jmethodID postActionEventID;
OpenPOWER on IntegriCloud