| /* Copyright (C) 2000 Free Software Foundation |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| package gnu.awt.xlib; |
| |
| import gnu.gcj.xlib.Display; |
| import java.awt.AWTEvent; |
| import java.awt.Component; |
| import java.awt.Container; |
| import java.awt.EventQueue; |
| import java.awt.event.ComponentEvent; |
| import java.awt.event.ContainerEvent; |
| |
| /** |
| * The main difference here from a standard EventQueue is that the X |
| * display connection is flushed before waiting for more events. |
| */ |
| public class XEventQueue extends EventQueue |
| { |
| Display display; |
| |
| public XEventQueue(Display display) |
| { |
| this.display = display; |
| } |
| |
| public AWTEvent getNextEvent() throws InterruptedException |
| { |
| if ((peekEvent() == null) && (display != null)) |
| display.flush(); |
| AWTEvent event = super.getNextEvent(); |
| if (event != null) |
| { |
| switch (event.getID ()) |
| { |
| case ContainerEvent.COMPONENT_ADDED: |
| { |
| /* If a component has been added to a container, it needs to be |
| * invalidated, to ensure that it ultimately gets an addNotify. |
| * If it's not invalidated, the component will never display in |
| * an already-showing container (probably applies only to CardLayout). |
| * Perhaps this code should be in java.awt, but the problem only seems |
| * to happen with xlib peers (not with gtk peers) so it's here instead. |
| */ |
| ContainerEvent ce = (ContainerEvent)event; |
| ce.getChild ().invalidate (); |
| ce.getContainer ().validate (); |
| } |
| break; |
| |
| case ComponentEvent.COMPONENT_RESIZED: |
| { |
| ComponentEvent ce = (ComponentEvent)event; |
| // FIXME: there may be opportunities to coalesce resize events |
| ce.getComponent ().validate (); |
| } |
| break; |
| |
| case ComponentEvent.COMPONENT_SHOWN: |
| { |
| ComponentEvent ce = (ComponentEvent)event; |
| Component comp = ce.getComponent (); |
| if (!comp.isValid ()) |
| { |
| /* Try to validate, going up the tree to the highest-level invalid |
| * Container. The idea is to ensure that addNotify gets called for |
| * any non-top-level component being shown, to make it create a peer. |
| */ |
| Container parent = comp.getParent (); |
| while (parent != null) |
| { |
| Container next = parent.getParent (); |
| if (next == null || next.isValid ()) |
| { |
| parent.validate (); |
| break; |
| } |
| else |
| parent = next; |
| } |
| if (comp instanceof Container) |
| comp.validate (); |
| } |
| comp.repaint (); |
| } |
| break; |
| |
| default: |
| break; |
| } |
| } |
| return event; |
| } |
| } |