Added a variety of test listeners for the frame so that we can observe
events the frame receives, and a flag to toggle whether to add the listeners. Make sure to dispose of the frame graphics context if it becomes invalid. Removed code to prevent adding a frame participant more than once since the observer list now handles that for us. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@2148 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// $Id: FrameManager.java,v 1.31 2002/12/09 05:13:45 mdb Exp $
|
// $Id: FrameManager.java,v 1.32 2003/01/15 02:21:07 shaper Exp $
|
||||||
|
|
||||||
package com.threerings.media;
|
package com.threerings.media;
|
||||||
|
|
||||||
@@ -10,22 +10,31 @@ import java.awt.Component;
|
|||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.FontMetrics;
|
import java.awt.FontMetrics;
|
||||||
import java.awt.Frame;
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.GraphicsConfiguration;
|
import java.awt.GraphicsConfiguration;
|
||||||
import java.awt.GraphicsDevice;
|
import java.awt.GraphicsDevice;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
|
import java.awt.KeyEventDispatcher;
|
||||||
|
import java.awt.KeyboardFocusManager;
|
||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.awt.Window;
|
import java.awt.Window;
|
||||||
|
|
||||||
|
import java.awt.event.ComponentEvent;
|
||||||
|
import java.awt.event.ComponentListener;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.WindowEvent;
|
||||||
|
import java.awt.event.WindowListener;
|
||||||
|
|
||||||
import java.awt.image.BufferStrategy;
|
import java.awt.image.BufferStrategy;
|
||||||
import java.awt.image.VolatileImage;
|
import java.awt.image.VolatileImage;
|
||||||
|
|
||||||
import java.awt.EventQueue;
|
import java.awt.EventQueue;
|
||||||
|
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import javax.swing.event.AncestorEvent;
|
||||||
|
import javax.swing.event.AncestorListener;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
@@ -67,7 +76,7 @@ import com.threerings.media.timer.SystemMediaTimer;
|
|||||||
* loop).
|
* loop).
|
||||||
*
|
*
|
||||||
* <li> Painting the user interface hierarchy: the top-level component
|
* <li> Painting the user interface hierarchy: the top-level component
|
||||||
* (the frame) is painted (via a call to {@link Frame#paint}) into a flip
|
* (the frame) is painted (via a call to {@link JFrame#paint}) into a flip
|
||||||
* buffer (if supported, an off-screen buffer if not). Updates that were
|
* buffer (if supported, an off-screen buffer if not). Updates that were
|
||||||
* computed during the tick should be rendered in this call to paint. The
|
* computed during the tick should be rendered in this call to paint. The
|
||||||
* paint call will propagate down to all components in the UI hierarchy,
|
* paint call will propagate down to all components in the UI hierarchy,
|
||||||
@@ -113,9 +122,9 @@ public class FrameManager
|
|||||||
* obtain timing information, which is available on every platform,
|
* obtain timing information, which is available on every platform,
|
||||||
* but returns inaccurate time stamps on many platforms.
|
* but returns inaccurate time stamps on many platforms.
|
||||||
*
|
*
|
||||||
* @see #FrameManager(Frame, MediaTimer)
|
* @see #FrameManager(JFrame, MediaTimer)
|
||||||
*/
|
*/
|
||||||
public FrameManager (Frame frame)
|
public FrameManager (JFrame frame)
|
||||||
{
|
{
|
||||||
this(frame, new SystemMediaTimer());
|
this(frame, new SystemMediaTimer());
|
||||||
}
|
}
|
||||||
@@ -129,7 +138,7 @@ public class FrameManager
|
|||||||
*
|
*
|
||||||
* @see GraphicsDevice#setFullScreenWindow
|
* @see GraphicsDevice#setFullScreenWindow
|
||||||
*/
|
*/
|
||||||
public FrameManager (Frame frame, MediaTimer timer)
|
public FrameManager (JFrame frame, MediaTimer timer)
|
||||||
{
|
{
|
||||||
_frame = frame;
|
_frame = frame;
|
||||||
_frame.setIgnoreRepaint(true);
|
_frame.setIgnoreRepaint(true);
|
||||||
@@ -146,6 +155,101 @@ public class FrameManager
|
|||||||
// register a debug hook to toggle the frame rate display
|
// register a debug hook to toggle the frame rate display
|
||||||
DebugChords.registerHook(
|
DebugChords.registerHook(
|
||||||
FPS_DISPLAY_MODMASK, FPS_DISPLAY_KEYCODE, FPS_DISPLAY_HOOK);
|
FPS_DISPLAY_MODMASK, FPS_DISPLAY_KEYCODE, FPS_DISPLAY_HOOK);
|
||||||
|
|
||||||
|
if (DEBUG_EVENTS) {
|
||||||
|
addTestListeners();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a variety of listeners to the frame in order to provide
|
||||||
|
* visibility into the various events received by the frame.
|
||||||
|
*/
|
||||||
|
protected void addTestListeners ()
|
||||||
|
{
|
||||||
|
// add a test window listener
|
||||||
|
_frame.addWindowListener(new WindowListener() {
|
||||||
|
public void windowActivated (WindowEvent e) {
|
||||||
|
Log.info("Window activated [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void windowClosed (WindowEvent e) {
|
||||||
|
Log.info("Window closed [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void windowClosing (WindowEvent e) {
|
||||||
|
Log.info("Window closing [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void windowDeactivated (WindowEvent e) {
|
||||||
|
Log.info("Window deactivated [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void windowDeiconified (WindowEvent e) {
|
||||||
|
Log.info("Window deiconified [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void windowIconified (WindowEvent e) {
|
||||||
|
Log.info("Window iconified [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void windowOpened (WindowEvent e) {
|
||||||
|
Log.info("Window opened [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// add a component listener
|
||||||
|
_frame.addComponentListener(new ComponentListener() {
|
||||||
|
public void componentHidden (ComponentEvent e) {
|
||||||
|
Log.info("Window component hidden [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void componentShown (ComponentEvent e) {
|
||||||
|
Log.info("Window component shown [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void componentMoved (ComponentEvent e) {
|
||||||
|
Log.info("Window component moved [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void componentResized (ComponentEvent e) {
|
||||||
|
Log.info("Window component resized [evt=" + e + "].");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// add test ancestor focus listener
|
||||||
|
_frame.getRootPane().addAncestorListener(
|
||||||
|
new AncestorListener() {
|
||||||
|
public void ancestorAdded (AncestorEvent e) {
|
||||||
|
Log.info("Root pane ancestor added [e=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ancestorRemoved (AncestorEvent e) {
|
||||||
|
Log.info("Root pane ancestor removed [e=" + e + "].");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ancestorMoved (AncestorEvent e) {
|
||||||
|
Log.info("Root pane ancestor moved [e=" + e + "].");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// add test key event dispatcher
|
||||||
|
KeyboardFocusManager.getCurrentKeyboardFocusManager().
|
||||||
|
addKeyEventDispatcher(new KeyEventDispatcher() {
|
||||||
|
public boolean dispatchKeyEvent (KeyEvent e) {
|
||||||
|
// if ((e.getModifiersEx() & KeyEvent.ALT_DOWN_MASK) != 0 &&
|
||||||
|
// e.getKeyCode() == KeyEvent.VK_TAB) {
|
||||||
|
// Log.info("Detected alt-tab key event " +
|
||||||
|
// "[e=" + e + "].");
|
||||||
|
// // attempt to eat the event so that windows
|
||||||
|
// // doesn't alt-tab into unhappy land
|
||||||
|
// e.consume();
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -168,12 +272,7 @@ public class FrameManager
|
|||||||
*/
|
*/
|
||||||
public void registerFrameParticipant (FrameParticipant participant)
|
public void registerFrameParticipant (FrameParticipant participant)
|
||||||
{
|
{
|
||||||
if (_participants.contains(participant)) {
|
_participants.add(participant);
|
||||||
Log.warning("Ingoring already registered participant " +
|
|
||||||
participant + ".");
|
|
||||||
} else {
|
|
||||||
_participants.add(participant);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -390,7 +489,7 @@ public class FrameManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
// dirty our previous bounds
|
// dirty our previous bounds
|
||||||
JComponent comp = (JComponent)((JFrame)_frame).getRootPane();
|
JComponent comp = (JComponent)_frame.getRootPane();
|
||||||
Dimension lsize = _perfLabel.getSize();
|
Dimension lsize = _perfLabel.getSize();
|
||||||
_remgr.addDirtyRegion(comp, FPS_X, FPS_Y, lsize.width, lsize.height);
|
_remgr.addDirtyRegion(comp, FPS_X, FPS_Y, lsize.width, lsize.height);
|
||||||
|
|
||||||
@@ -484,7 +583,12 @@ public class FrameManager
|
|||||||
|
|
||||||
// clear out our frame graphics in case that became invalid for
|
// clear out our frame graphics in case that became invalid for
|
||||||
// the same reasons our back buffer became invalid
|
// the same reasons our back buffer became invalid
|
||||||
_fgfx = null;
|
if (_fgfx != null) {
|
||||||
|
_fgfx.dispose();
|
||||||
|
_fgfx = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log.info("Created back buffer.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -714,7 +818,7 @@ public class FrameManager
|
|||||||
};
|
};
|
||||||
|
|
||||||
/** The frame into which we do our rendering. */
|
/** The frame into which we do our rendering. */
|
||||||
protected Frame _frame;
|
protected JFrame _frame;
|
||||||
|
|
||||||
/** Used to obtain timing measurements. */
|
/** Used to obtain timing measurements. */
|
||||||
protected MediaTimer _timer;
|
protected MediaTimer _timer;
|
||||||
@@ -810,4 +914,7 @@ public class FrameManager
|
|||||||
|
|
||||||
/** The key code for our frame rate display debug hook (f). */
|
/** The key code for our frame rate display debug hook (f). */
|
||||||
protected static int FPS_DISPLAY_KEYCODE = KeyEvent.VK_F;
|
protected static int FPS_DISPLAY_KEYCODE = KeyEvent.VK_F;
|
||||||
|
|
||||||
|
/** Whether to enable AWT event debugging for the frame. */
|
||||||
|
protected static final boolean DEBUG_EVENTS = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user