diff options
author | Mark Wielaard <mark@klomp.org> | 2006-02-22 14:47:50 +0000 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2006-02-22 14:47:50 +0000 |
commit | 15fe13942e812b00a55e12bceb3e4a03322501fe (patch) | |
tree | 44fabec9e8c92104159ad922f8ea1a8eec589611 | |
parent | f64bc065a63eef69eb5fc35498d0f3eb4e12ddd0 (diff) | |
download | classpath-15fe13942e812b00a55e12bceb3e4a03322501fe.tar.gz |
* java/awt/Checkbox.java (setState): Check that state actually changed
before calling peer.
(dispatchEventImpl): Set new state if ItemEvent.
* gnu/java/awt/peer/gtk/GtkCheckboxPeer.java (changing): Removed.
(create): Set currentState.
(setState): Make synchronized, check and set currentState before
calling gtkToggleButtonSetActive.
(postItemEvent): Make synchronized, check and set currentState before
posting ItemEvent.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
(postItemEventID): Method now takes boolean.
(item_toggled_cb): Likewise.
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkCheckboxPeer.java | 49 | ||||
-rw-r--r-- | java/awt/Checkbox.java | 27 | ||||
-rw-r--r-- | native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c | 9 |
4 files changed, 59 insertions, 41 deletions
@@ -1,3 +1,18 @@ +2006-02-22 Mark Wielaard <mark@klomp.org> + + * java/awt/Checkbox.java (setState): Check that state actually changed + before calling peer. + (dispatchEventImpl): Set new state if ItemEvent. + * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java (changing): Removed. + (create): Set currentState. + (setState): Make synchronized, check and set currentState before + calling gtkToggleButtonSetActive. + (postItemEvent): Make synchronized, check and set currentState before + posting ItemEvent. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c + (postItemEventID): Method now takes boolean. + (item_toggled_cb): Likewise. + 2006-02-22 Robert Schuster <robertschuster@fsfe.org> * javax/swing/text/DefaultHighlighter.java: diff --git a/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java b/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java index 7b573256b..094aa3c03 100644 --- a/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java +++ b/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java @@ -42,6 +42,8 @@ import java.awt.Checkbox; import java.awt.CheckboxGroup; import java.awt.peer.CheckboxPeer; +import java.awt.event.ItemEvent; + public class GtkCheckboxPeer extends GtkComponentPeer implements CheckboxPeer { @@ -49,7 +51,6 @@ public class GtkCheckboxPeer extends GtkComponentPeer public GtkCheckboxGroupPeer old_group; // The current state of the GTK checkbox. private boolean currentState; - private boolean changing = false; public native void create (GtkCheckboxGroupPeer group); public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group); @@ -75,23 +76,24 @@ public class GtkCheckboxPeer extends GtkComponentPeer CheckboxGroup g = checkbox.getCheckboxGroup (); old_group = GtkCheckboxGroupPeer.getCheckboxGroupPeer (g); create (old_group); - gtkToggleButtonSetActive (checkbox.getState ()); + currentState = checkbox.getState(); + gtkToggleButtonSetActive(currentState); gtkButtonSetLabel (checkbox.getLabel ()); } - public void setState (boolean state) + /** + * Sets native GtkCheckButton is state is different from current + * state. Will set currentState to state to prevent posting an + * event since events should only be posted for user initiated + * clicks on the GtkCheckButton. + */ + synchronized public void setState (boolean state) { - // prevent item_toggled_cb -> postItemEvent -> - // awtComponent.setState -> this.setState -> - // gtkToggleButtonSetActive self-deadlock on the GDK lock. - if (changing && Thread.currentThread() == GtkToolkit.mainThread) + if (currentState != state) { - changing = false; - return; + currentState = state; + gtkToggleButtonSetActive(state); } - - if (currentState != state) - gtkToggleButtonSetActive (state); } public void setLabel (String label) @@ -115,22 +117,15 @@ public class GtkCheckboxPeer extends GtkComponentPeer // Override the superclass postItemEvent so that the peer doesn't // need information that we have. // called back by native side: item_toggled_cb - public void postItemEvent (Object item, int stateChange) + synchronized public void postItemEvent(Object item, boolean state) { - Checkbox currentCheckBox = ((Checkbox)awtComponent); - // A firing of the event is only desired if the state has changed due to a - // button press. The currentCheckBox's state must be different from the - // one that the stateChange is changing to. - // stateChange = 1 if it goes from false -> true - // stateChange = 2 if it goes from true -> false - if (( !currentCheckBox.getState() && stateChange == 1) - || (currentCheckBox.getState() && stateChange == 2)) - { - super.postItemEvent (awtComponent, stateChange); - currentState = !currentCheckBox.getState(); - changing = true; - currentCheckBox.setState(currentState); - } + // Only fire event is state actually changed. + if (currentState != state) + { + currentState = state; + super.postItemEvent(awtComponent, + state ? ItemEvent.SELECTED : ItemEvent.DESELECTED); + } } public void dispose () diff --git a/java/awt/Checkbox.java b/java/awt/Checkbox.java index 93f609247..eea443edf 100644 --- a/java/awt/Checkbox.java +++ b/java/awt/Checkbox.java @@ -1,5 +1,6 @@ /* Checkbox.java -- An AWT checkbox widget - Copyright (C) 1999, 2000, 2001, 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2002, 2005, 2006 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -459,11 +460,14 @@ getState() public synchronized void setState(boolean state) { - this.state = state; - if (peer != null) + if (this.state != state) { - CheckboxPeer cp = (CheckboxPeer) peer; - cp.setState (state); + this.state = state; + if (peer != null) + { + CheckboxPeer cp = (CheckboxPeer) peer; + cp.setState (state); + } } } @@ -599,10 +603,15 @@ void dispatchEventImpl(AWTEvent e) { if (e.id <= ItemEvent.ITEM_LAST - && e.id >= ItemEvent.ITEM_FIRST - && (item_listeners != null - || (eventMask & AWTEvent.ITEM_EVENT_MASK) != 0)) - processEvent(e); + && e.id >= ItemEvent.ITEM_FIRST) + { + ItemEvent ie = (ItemEvent) e; + int itemState = ie.getStateChange(); + setState(itemState == ItemEvent.SELECTED ? true : false); + if (item_listeners != null + || (eventMask & AWTEvent.ITEM_EVENT_MASK) != 0) + processEvent(e); + } else super.dispatchEventImpl(e); } diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c index b74b0a265..297b4f853 100644 --- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c +++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c @@ -1,5 +1,6 @@ /* gtkcheckboxpeer.c -- Native implementation of GtkCheckboxPeer - Copyright (C) 1998, 1999, 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2003, 2004, 2006 + Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -52,7 +53,7 @@ cp_gtk_checkbox_init_jni (void) postItemEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcheckboxpeer, "postItemEvent", - "(Ljava/lang/Object;I)V"); + "(Ljava/lang/Object;Z)V"); } static void item_toggled_cb (GtkToggleButton *item, jobject peer); @@ -230,7 +231,5 @@ item_toggled_cb (GtkToggleButton *item, jobject peer) (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), peer, postItemEventID, peer, - item->active ? - (jint) AWT_ITEM_SELECTED : - (jint) AWT_ITEM_DESELECTED); + item->active); } |