summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2006-02-22 14:47:50 +0000
committerMark Wielaard <mark@klomp.org>2006-02-22 14:47:50 +0000
commit15fe13942e812b00a55e12bceb3e4a03322501fe (patch)
tree44fabec9e8c92104159ad922f8ea1a8eec589611
parentf64bc065a63eef69eb5fc35498d0f3eb4e12ddd0 (diff)
downloadclasspath-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--ChangeLog15
-rw-r--r--gnu/java/awt/peer/gtk/GtkCheckboxPeer.java49
-rw-r--r--java/awt/Checkbox.java27
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c9
4 files changed, 59 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog
index cfb6cf284..32ab4fa0a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
}