summaryrefslogtreecommitdiff
path: root/gnu/java/awt/peer/gtk/GtkComponentPeer.java
diff options
context:
space:
mode:
authorGuilhem Lavaux <guilhem@kaffe.org>2006-02-18 18:33:27 +0000
committerGuilhem Lavaux <guilhem@kaffe.org>2006-02-18 18:33:27 +0000
commitcc0db4315db5e0550da9a4a13f4b5e502e58a5c2 (patch)
tree25a49d0fc9588fae44f8e5edfc496f612a316931 /gnu/java/awt/peer/gtk/GtkComponentPeer.java
parent5093bf804963cd90f1c6c6053c0417f78b945ca6 (diff)
downloadclasspath-cc0db4315db5e0550da9a4a13f4b5e502e58a5c2.tar.gz
Merged with HEAD.
Diffstat (limited to 'gnu/java/awt/peer/gtk/GtkComponentPeer.java')
-rw-r--r--gnu/java/awt/peer/gtk/GtkComponentPeer.java115
1 files changed, 63 insertions, 52 deletions
diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
index fe0dae70d..9c23fa30a 100644
--- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
@@ -1,5 +1,6 @@
/* GtkComponentPeer.java -- Implements ComponentPeer with GTK
- Copyright (C) 1998, 1999, 2002, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2004, 2005, 2006
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -46,10 +47,10 @@ import java.awt.Component;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
+import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
-import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Insets;
@@ -87,8 +88,6 @@ public class GtkComponentPeer extends GtkGenericPeer
boolean isInRepaint;
- static final Timer repaintTimer = new Timer (true);
-
/* this isEnabled differs from Component.isEnabled, in that it
knows if a parent is disabled. In that case Component.isEnabled
may return true, but our isEnabled will always return false */
@@ -303,29 +302,29 @@ public class GtkComponentPeer extends GtkGenericPeer
{
case PaintEvent.PAINT:
case PaintEvent.UPDATE:
- {
- try
- {
- Graphics g = getGraphics ();
-
- // Some peers like GtkFileDialogPeer are repainted by Gtk itself
- if (g == null)
- break;
-
- g.setClip (((PaintEvent) event).getUpdateRect());
-
- if (id == PaintEvent.PAINT)
- awtComponent.paint (g);
- else
- awtComponent.update (g);
-
- g.dispose ();
- }
- catch (InternalError e)
- {
- System.err.println (e);
- }
- }
+ {
+ try
+ {
+ Graphics g = getGraphics();
+
+ if (!awtComponent.isShowing() || awtComponent.getWidth() < 1
+ || awtComponent.getHeight() < 1 || g == null)
+ break;
+
+ g.setClip(((PaintEvent) event).getUpdateRect());
+
+ if (id == PaintEvent.PAINT)
+ awtComponent.paint(g);
+ else
+ awtComponent.update(g);
+
+ g.dispose();
+ }
+ catch (InternalError e)
+ {
+ System.err.println(e);
+ }
+ }
break;
case KeyEvent.KEY_PRESSED:
ke = (KeyEvent) event;
@@ -383,19 +382,30 @@ public class GtkComponentPeer extends GtkGenericPeer
if (x == 0 && y == 0 && width == 0 && height == 0)
return;
- repaintTimer.schedule(new RepaintTimerTask(x, y, width, height), tm);
+ if (tm <= 0)
+ q().postEvent(new PaintEvent(awtComponent, PaintEvent.UPDATE,
+ new Rectangle(x, y, width, height)));
+ else
+ RepaintTimerTask.schedule(tm, x, y, width, height, awtComponent);
}
- private class RepaintTimerTask extends TimerTask
+ /**
+ * Used for scheduling delayed paint updates on the event queue.
+ */
+ private static class RepaintTimerTask extends TimerTask
{
+ private static final Timer repaintTimer = new Timer(true);
+
private int x, y, width, height;
+ private Component awtComponent;
- RepaintTimerTask(int x, int y, int width, int height)
+ RepaintTimerTask(Component c, int x, int y, int width, int height)
{
this.x = x;
this.y = y;
this.width = width;
this.height = height;
+ this.awtComponent = c;
}
public void run()
@@ -403,6 +413,12 @@ public class GtkComponentPeer extends GtkGenericPeer
q().postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE,
new Rectangle (x, y, width, height)));
}
+
+ static void schedule(long tm, int x, int y, int width, int height,
+ Component c)
+ {
+ repaintTimer.schedule(new RepaintTimerTask(c, x, y, width, height), tm);
+ }
}
public void requestFocus ()
@@ -443,26 +459,17 @@ public class GtkComponentPeer extends GtkGenericPeer
// non-lightweight.
boolean lightweightChild = false;
Insets i;
- while (parent.isLightweight ())
+ while (parent.isLightweight())
{
- lightweightChild = true;
+ lightweightChild = true;
- next_parent = parent.getParent ();
+ next_parent = parent.getParent();
- i = ((Container) parent).getInsets ();
+ i = ((Container) parent).getInsets();
+ new_x += parent.getX() + i.left;
+ new_y += parent.getY() + i.top;
- if (next_parent instanceof Window)
- {
- new_x += i.left;
- new_y += i.top;
- }
- else
- {
- new_x += parent.getX () + i.left;
- new_y += parent.getY () + i.top;
- }
-
- parent = next_parent;
+ parent = next_parent;
}
// We only need to convert from Java to GTK coordinates if we're
@@ -571,6 +578,8 @@ public class GtkComponentPeer extends GtkGenericPeer
KeyEvent keyEvent = new KeyEvent (awtComponent, id, when, mods,
keyCode, keyChar, keyLocation);
+ EventQueue q = q();
+
// Also post a KEY_TYPED event if keyEvent is a key press that
// doesn't represent an action or modifier key.
if (keyEvent.getID () == KeyEvent.KEY_PRESSED
@@ -579,15 +588,17 @@ public class GtkComponentPeer extends GtkGenericPeer
&& keyCode != KeyEvent.VK_CONTROL
&& keyCode != KeyEvent.VK_ALT))
{
- synchronized (q)
- {
- q().postEvent (keyEvent);
- q().postEvent (new KeyEvent (awtComponent, KeyEvent.KEY_TYPED, when, mods,
- KeyEvent.VK_UNDEFINED, keyChar, keyLocation));
+ synchronized(q)
+ {
+ q.postEvent(keyEvent);
+ keyEvent = new KeyEvent(awtComponent, KeyEvent.KEY_TYPED, when,
+ mods, KeyEvent.VK_UNDEFINED, keyChar,
+ keyLocation);
+ q.postEvent(keyEvent);
}
}
else
- q().postEvent (keyEvent);
+ q.postEvent(keyEvent);
}
protected void postFocusEvent (int id, boolean temporary)