From 7edbd87e17d9240077eed1993436365ad6c4365c Mon Sep 17 00:00:00 2001 From: David Jee Date: Mon, 26 Jan 2004 21:55:42 +0000 Subject: 2004-01-26 David Jee * gnu/java/awt/peer/gtk/GtkComponentPeer.java (handleEvent): Implemented. Handles PaintEvents. (paint): Implemented. Use GTK native methods to queue updates for this heavyweight peer. * gnu/java/awt/peer/gtk/GtkContainerPeer.java (handleEvent): Removed. * java/awt/Component.java (paint): Implemented. Explictly paint the heavyweight peer. (update): Clear the background for heavyweight components. (paintAll): No need to call peer.paint() anymore. (processEvent): Don't process PaintEvents here. It's now done in the peer's handleEvent(). (processPaintEvent): Removed. * java/awt/Container.java (paint): No need to call super.paint(). Visit heavyweight children as well. (update): Don't clear the background here. It's done in Component.update(). (visitChildren): Added check to not recurse into Containers. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (filter_expose_event_handler): New method. Filter unwanted expose events while painting heavyweight peers. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilter): New method. Connect filter and block pre_event_handler. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeFilter): New method. Disconnect filter and unblock pre_event_handler. (Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetQueueDrawArea): New method. Invalidate and update given area. * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (pre_event_handler): Add checks for unwanted expose events. From-SVN: r76668 --- .../gnu/java/awt/peer/gtk/GtkComponentPeer.java | 50 +++++++++++++++++++++- .../gnu/java/awt/peer/gtk/GtkContainerPeer.java | 35 --------------- 2 files changed, 49 insertions(+), 36 deletions(-) (limited to 'libjava/gnu/java') diff --git a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java index 9a56619..4b29bcc 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -91,6 +91,9 @@ public class GtkComponentPeer extends GtkGenericPeer native void gtkWidgetSetCursor (int type); native void gtkWidgetSetBackground (int red, int green, int blue); native void gtkWidgetSetForeground (int red, int green, int blue); + native void gtkWidgetQueueDrawArea(int x, int y, int width, int height); + native void addExposeFilter(); + native void removeExposeFilter(); void create () { @@ -217,6 +220,37 @@ public class GtkComponentPeer extends GtkGenericPeer public void handleEvent (AWTEvent event) { + int id = event.getID(); + + switch (id) + { + 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); + } + } + break; + } } public boolean isFocusTraversable () @@ -235,7 +269,21 @@ public class GtkComponentPeer extends GtkGenericPeer public void paint (Graphics g) { - awtComponent.paint (g); + Component parent = awtComponent.getParent(); + GtkComponentPeer parentPeer = null; + if ((parent instanceof Container) && !parent.isLightweight()) + parentPeer = (GtkComponentPeer) parent.getPeer(); + + addExposeFilter(); + if (parentPeer != null) + parentPeer.addExposeFilter(); + + Rectangle clip = g.getClipBounds(); + gtkWidgetQueueDrawArea(clip.x, clip.y, clip.width, clip.height); + + removeExposeFilter(); + if (parentPeer != null) + parentPeer.removeExposeFilter(); } public Dimension preferredSize () diff --git a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java index e888172..361dea7 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java @@ -100,41 +100,6 @@ public class GtkContainerPeer extends GtkComponentPeer 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 (); - - // 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); - } - } - break; - } - } - public void beginLayout () { } public void endLayout () { } public boolean isPaintPending () { return false; } -- cgit v1.1