diff options
| author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2006-03-16 03:24:18 +0000 |
|---|---|---|
| committer | Thomas Fitzsimmons <fitzsim@redhat.com> | 2006-03-16 03:24:18 +0000 |
| commit | 270d334aa80ac5cc204e167749b28af8649d9e9e (patch) | |
| tree | 48f5f75da67ca47ca7af6ddeeb8be1201688af19 /gnu/java | |
| parent | 50fc0fe5b9ad536dd58ee682e07a7fa92f3697a0 (diff) | |
| download | classpath-270d334aa80ac5cc204e167749b28af8649d9e9e.tar.gz | |
2006-03-15 Thomas Fitzsimmons <fitzsim@redhat.com>
PR classpath/26486
* gnu/java/awt/peer/gtk/GtkCanvasPeer.java (getGraphics): Remove
method.
(handleEvent): Likewise.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java (isInRepaint):
Remove field.
(beginNativeRepaint): Remove method.
(endNativeRepaint): Likewise.
(handleEvent): Call paintComponent and updateComponent.
(paintComponent): New method.
(updateComponent): Likewise.
(repaint): Return early if width or height is less than one.
(postExposeEvent): Remove isInRepaint reference.
* gnu/java/awt/peer/gtk/GtkContainerPeer.java: (getGraphics):
Remove method.
* gnu/java/awt/peer/gtk/GtkDialogPeer.java (getGraphics): Inherit
from GtkWindowPeer.
(postMouseEvent): Likewise.
(postExposeEvent): Likewise.
* gnu/java/awt/peer/gtk/GtkFileDialogPeer.java (updateComponent):
Override to do nothing.
* gnu/java/awt/peer/gtk/GtkFramePeer.java (getGraphics): Inherit
from GtkWindowPeer.
(postMouseEvent): Likewise.
(postExposeEvent): Likewise.
* gnu/java/awt/peer/gtk/GtkPanelPeer.java (handleEvent): Inherit
paint and update handling from GtkComponentPeer.
(updateComponent): Override to call paintComponent.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c: Replace
gdk_flush calls with schedule_flush calls.
(flush): New function.
(schedule_flush): Likewise.
Diffstat (limited to 'gnu/java')
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkCanvasPeer.java | 41 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkComponentPeer.java | 89 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkContainerPeer.java | 5 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkDialogPeer.java | 28 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkFileDialogPeer.java | 7 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkFramePeer.java | 28 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkPanelPeer.java | 40 | ||||
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkWindowPeer.java | 69 |
8 files changed, 111 insertions, 196 deletions
diff --git a/gnu/java/awt/peer/gtk/GtkCanvasPeer.java b/gnu/java/awt/peer/gtk/GtkCanvasPeer.java index dc2176120..16166afa4 100644 --- a/gnu/java/awt/peer/gtk/GtkCanvasPeer.java +++ b/gnu/java/awt/peer/gtk/GtkCanvasPeer.java @@ -54,45 +54,8 @@ public class GtkCanvasPeer extends GtkComponentPeer implements CanvasPeer super (c); } - public Graphics getGraphics () - { - if (GtkToolkit.useGraphics2D ()) - return new GdkGraphics2D (this); - else - return new GdkGraphics (this); - } - - public void handleEvent (AWTEvent event) - { - int id = event.getID(); - - switch (id) - { - case PaintEvent.PAINT: - case PaintEvent.UPDATE: - { - try - { - Graphics g = getGraphics (); - 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; - } - } - - /* Preferred size for a drawing widget is always what the user requested */ + // Preferred size for a drawing widget is always what the user + // requested. public Dimension getPreferredSize () { return awtComponent.getSize (); diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java index 821183927..61cc3a82a 100644 --- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -86,8 +86,6 @@ public class GtkComponentPeer extends GtkGenericPeer Insets insets; - boolean isInRepaint; - /* 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 */ @@ -176,16 +174,6 @@ public class GtkComponentPeer extends GtkGenericPeer gtkWidgetSetParent (p); } - void beginNativeRepaint () - { - isInRepaint = true; - } - - void endNativeRepaint () - { - isInRepaint = false; - } - /* * Set the bounds of this peer's AWT Component based on dimensions * returned by the native windowing system. Most Components impose @@ -250,6 +238,8 @@ public class GtkComponentPeer extends GtkGenericPeer return getToolkit().getFontMetrics(font); } + // getGraphics may be overridden by derived classes but it should + // never return null. public Graphics getGraphics () { if (GtkToolkit.useGraphics2D ()) @@ -291,30 +281,10 @@ public class GtkComponentPeer extends GtkGenericPeer switch (id) { case PaintEvent.PAINT: + paintComponent((PaintEvent) event); + break; case PaintEvent.UPDATE: - { - 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); - } - } + updateComponent((PaintEvent) event); break; case KeyEvent.KEY_PRESSED: ke = (KeyEvent) event; @@ -328,7 +298,49 @@ public class GtkComponentPeer extends GtkGenericPeer break; } } - + + // This method and its overrides are the only methods in the peers + // that should call awtComponent.paint. + protected void paintComponent (PaintEvent event) + { + // Do not call Component.paint if the component is not showing or + // if its bounds form a degenerate rectangle. + if (!awtComponent.isShowing() + || (awtComponent.getWidth() < 1 || awtComponent.getHeight() < 1)) + return; + + // Creating and disposing a GdkGraphics every time paint is called + // seems expensive. However, the graphics state does not carry + // over between calls to paint, and resetting the graphics object + // may even be more costly than simply creating a new one. + GdkGraphics g = (GdkGraphics) getGraphics(); + + g.setClip(event.getUpdateRect()); + + awtComponent.paint(g); + + g.dispose(); + } + + // This method and its overrides are the only methods in the peers + // that should call awtComponent.update. + protected void updateComponent (PaintEvent event) + { + // Do not call Component.update if the component is not showing or + // if its bounds form a degenerate rectangle. + if (!awtComponent.isShowing() + || (awtComponent.getWidth() < 1 || awtComponent.getHeight() < 1)) + return; + + GdkGraphics g = (GdkGraphics) getGraphics(); + + g.setClip(event.getUpdateRect()); + + awtComponent.update(g); + + g.dispose(); + } + public boolean isFocusTraversable () { return true; @@ -369,7 +381,7 @@ public class GtkComponentPeer extends GtkGenericPeer public void repaint (long tm, int x, int y, int width, int height) { - if (x == 0 && y == 0 && width == 0 && height == 0) + if (width < 1 || height < 1) return; if (tm <= 0) @@ -563,8 +575,7 @@ public class GtkComponentPeer extends GtkGenericPeer protected void postExposeEvent (int x, int y, int width, int height) { - if (!isInRepaint) - q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, new Rectangle (x, y, width, height))); } diff --git a/gnu/java/awt/peer/gtk/GtkContainerPeer.java b/gnu/java/awt/peer/gtk/GtkContainerPeer.java index 23737b0b0..06076e77f 100644 --- a/gnu/java/awt/peer/gtk/GtkContainerPeer.java +++ b/gnu/java/awt/peer/gtk/GtkContainerPeer.java @@ -99,11 +99,6 @@ public class GtkContainerPeer extends GtkComponentPeer } } - public Graphics getGraphics () - { - return super.getGraphics(); - } - public void beginLayout () { } public void endLayout () { } public boolean isPaintPending () { return false; } diff --git a/gnu/java/awt/peer/gtk/GtkDialogPeer.java b/gnu/java/awt/peer/gtk/GtkDialogPeer.java index 3e3125a2b..3254f566d 100644 --- a/gnu/java/awt/peer/gtk/GtkDialogPeer.java +++ b/gnu/java/awt/peer/gtk/GtkDialogPeer.java @@ -51,34 +51,6 @@ public class GtkDialogPeer extends GtkWindowPeer { super (dialog); } - - public Graphics getGraphics () - { - Graphics g; - if (GtkToolkit.useGraphics2D ()) - g = new GdkGraphics2D (this); - else - g = new GdkGraphics (this); - g.translate (-insets.left, -insets.top); - return g; - } - - protected void postMouseEvent(int id, long when, int mods, int x, int y, - int clickCount, boolean popupTrigger) - { - super.postMouseEvent (id, when, mods, - x + insets.left, y + insets.top, - clickCount, popupTrigger); - } - - protected void postExposeEvent (int x, int y, int width, int height) - { - if (!isInRepaint) - q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, - new Rectangle (x + insets.left, - y + insets.top, - width, height))); - } void create () { diff --git a/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java b/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java index a0ae9e9ee..8650578f7 100644 --- a/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java +++ b/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java @@ -41,6 +41,7 @@ package gnu.java.awt.peer.gtk; import java.awt.Dialog; import java.awt.FileDialog; import java.awt.Graphics; +import java.awt.event.PaintEvent; import java.awt.peer.FileDialogPeer; import java.io.File; import java.io.FilenameFilter; @@ -166,10 +167,10 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer return filter.accept(dir, filename); } - public Graphics getGraphics () + // Sun does not call FileDialog.update. + protected void updateComponent (PaintEvent event) { - // GtkFileDialog will repaint by itself - return null; + // Override GtkComponetPeer.updateComponent to do nothing. } // called back by native side: handle_response_cb diff --git a/gnu/java/awt/peer/gtk/GtkFramePeer.java b/gnu/java/awt/peer/gtk/GtkFramePeer.java index f59e781c2..c8cc9423b 100644 --- a/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -196,17 +196,6 @@ public class GtkFramePeer extends GtkWindowPeer } } - public Graphics getGraphics () - { - Graphics g; - if (GtkToolkit.useGraphics2D ()) - g = new GdkGraphics2D (this); - else - g = new GdkGraphics (this); - g.translate (-insets.left, -insets.top); - return g; - } - protected void postConfigureEvent (int x, int y, int width, int height) { int frame_width = width + insets.left + insets.right; @@ -231,23 +220,6 @@ public class GtkFramePeer extends GtkWindowPeer } } - protected void postMouseEvent(int id, long when, int mods, int x, int y, - int clickCount, boolean popupTrigger) - { - super.postMouseEvent (id, when, mods, - x + insets.left, y + insets.top, - clickCount, popupTrigger); - } - - protected void postExposeEvent (int x, int y, int width, int height) - { - if (!isInRepaint) - q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, - new Rectangle (x + insets.left, - y + insets.top, - width, height))); - } - public int getState () { return 0; diff --git a/gnu/java/awt/peer/gtk/GtkPanelPeer.java b/gnu/java/awt/peer/gtk/GtkPanelPeer.java index 88bb71569..16eb8c8fb 100644 --- a/gnu/java/awt/peer/gtk/GtkPanelPeer.java +++ b/gnu/java/awt/peer/gtk/GtkPanelPeer.java @@ -59,37 +59,19 @@ public class GtkPanelPeer extends GtkContainerPeer public void handleEvent(AWTEvent event) { int id = event.getID(); - switch (id) - { - case MouseEvent.MOUSE_PRESSED: - awtComponent.requestFocusInWindow(); - break; - case PaintEvent.UPDATE: - case PaintEvent.PAINT: - { - try - { - Graphics g = getGraphics(); - if (! awtComponent.isShowing() || awtComponent.getWidth() < 1 - || awtComponent.getHeight() < 1 || g == null) - return; - - g.setClip(((PaintEvent) event).getUpdateRect()); - - // Do not want to clear anything before painting.); - awtComponent.paint(g); - - g.dispose(); - return; - } - catch (InternalError e) - { - System.err.println(e); - } - } - } + + if (id == MouseEvent.MOUSE_PRESSED) + awtComponent.requestFocusInWindow(); + super.handleEvent(event); } + protected void updateComponent (PaintEvent event) + { + // Do not want to clear anything before painting. Sun never + // calls Panel.update, only Panel.paint. + paintComponent(event); + } + native void connectSignals (); } diff --git a/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 6cc1390ea..70c6615fa 100644 --- a/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -42,6 +42,7 @@ import java.awt.AWTEvent; import java.awt.Component; import java.awt.Frame; import java.awt.Graphics; +import java.awt.Rectangle; import java.awt.Window; import java.awt.event.PaintEvent; import java.awt.event.WindowEvent; @@ -244,37 +245,55 @@ public class GtkWindowPeer extends GtkContainerPeer // TODO Auto-generated method stub } + + protected void postExposeEvent (int x, int y, int width, int height) + { + // Translate GTK co-ordinates, which do not include a window + // frame's insets, to AWT co-ordinates, which do include a window + // frame's insets. GtkWindowPeer should always have all-zero + // insets but GtkFramePeer and GtkDialogPeer insets will be + // non-zero. + q().postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + new Rectangle (x + insets.left, + y + insets.top, + width, height))); + } + public boolean requestWindowFocus() { // TODO Auto-generated method stub return false; } - public void handleEvent(AWTEvent event) + public Graphics getGraphics () { - int id = event.getID(); - if (id == PaintEvent.UPDATE || id == PaintEvent.PAINT) - { - try - { - Graphics g = getGraphics(); - if (! awtComponent.isShowing() || awtComponent.getWidth() < 1 - || awtComponent.getHeight() < 1 || g == null) - return; - - g.setClip(((PaintEvent) event).getUpdateRect()); - - // Do not want to clear anything before painting. - awtComponent.paint(g); - - g.dispose(); - return; - } - catch (InternalError e) - { - System.err.println(e); - } - } - super.handleEvent(event); + Graphics g = super.getGraphics (); + // Translate AWT co-ordinates, which include a window frame's + // insets, to GTK co-ordinates, which do not include a window + // frame's insets. GtkWindowPeer should always have all-zero + // insets but GtkFramePeer and GtkDialogPeer insets will be + // non-zero. + g.translate (-insets.left, -insets.top); + return g; + } + + protected void updateComponent (PaintEvent event) + { + // Do not clear anything before painting. Sun never calls + // Window.update, only Window.paint. + paintComponent(event); + } + + protected void postMouseEvent(int id, long when, int mods, int x, int y, + int clickCount, boolean popupTrigger) + { + // Translate AWT co-ordinates, which include a window frame's + // insets, to GTK co-ordinates, which do not include a window + // frame's insets. GtkWindowPeer should always have all-zero + // insets but GtkFramePeer and GtkDialogPeer insets will be + // non-zero. + super.postMouseEvent (id, when, mods, + x + insets.left, y + insets.top, + clickCount, popupTrigger); } } |
