*/
package jexer.backend;
-import java.util.LinkedList;
+import java.util.ArrayList;
import java.util.List;
-import jexer.bits.CellAttributes;
+import jexer.TApplication;
+import jexer.TWindow;
+import jexer.event.TCommandEvent;
import jexer.event.TInputEvent;
import jexer.event.TKeypressEvent;
import jexer.event.TMouseEvent;
-import jexer.TApplication;
-import jexer.TWindow;
+import jexer.event.TResizeEvent;
+import static jexer.TCommand.*;
/**
* TWindowBackend uses a window in one TApplication to provide a backend for
private List<TInputEvent> eventQueue;
/**
- * The screen to use.
+ * The screen this window is monitoring.
*/
private Screen otherScreen;
+ /**
+ * The application associated with otherScreen.
+ */
+ private TApplication otherApplication;
+
/**
* The session information.
*/
private SessionInfo sessionInfo;
+ /**
+ * OtherScreen provides a hook to notify TWindowBackend of screen size
+ * changes.
+ */
+ private class OtherScreen extends LogicalScreen {
+
+ /**
+ * The TWindowBackend to notify.
+ */
+ private TWindowBackend window;
+
+ /**
+ * Public constructor.
+ */
+ public OtherScreen(final TWindowBackend window) {
+ this.window = window;
+ }
+
+ /**
+ * Resize the physical screen to match the logical screen dimensions.
+ */
+ @Override
+ public void resizeToScreen() {
+ window.setWidth(getWidth() + 2);
+ window.setHeight(getHeight() + 2);
+ }
+
+ /**
+ * Get the width of a character cell in pixels.
+ *
+ * @return the width in pixels of a character cell
+ */
+ @Override
+ public int getTextWidth() {
+ return window.getScreen().getTextWidth();
+ }
+
+ /**
+ * Get the height of a character cell in pixels.
+ *
+ * @return the height in pixels of a character cell
+ */
+ @Override
+ public int getTextHeight() {
+ return window.getScreen().getTextHeight();
+ }
+
+ }
+
+
// ------------------------------------------------------------------------
// Constructors -----------------------------------------------------------
// ------------------------------------------------------------------------
super(application, title, width, height);
this.listener = listener;
- eventQueue = new LinkedList<TInputEvent>();
+ eventQueue = new ArrayList<TInputEvent>();
sessionInfo = new TSessionInfo(width, height);
- otherScreen = new LogicalScreen();
+ otherScreen = new OtherScreen(this);
otherScreen.setDimensions(width - 2, height - 2);
drawLock = otherScreen;
setHiddenMouse(true);
super(application, title, width, height, flags);
this.listener = listener;
- eventQueue = new LinkedList<TInputEvent>();
+ eventQueue = new ArrayList<TInputEvent>();
sessionInfo = new TSessionInfo(width, height);
- otherScreen = new LogicalScreen();
+ otherScreen = new OtherScreen(this);
otherScreen.setDimensions(width - 2, height - 2);
drawLock = otherScreen;
setHiddenMouse(true);
super(application, title, x, y, width, height);
this.listener = listener;
- eventQueue = new LinkedList<TInputEvent>();
+ eventQueue = new ArrayList<TInputEvent>();
sessionInfo = new TSessionInfo(width, height);
- otherScreen = new LogicalScreen();
+ otherScreen = new OtherScreen(this);
otherScreen.setDimensions(width - 2, height - 2);
drawLock = otherScreen;
setHiddenMouse(true);
super(application, title, x, y, width, height, flags);
this.listener = listener;
- eventQueue = new LinkedList<TInputEvent>();
+ eventQueue = new ArrayList<TInputEvent>();
sessionInfo = new TSessionInfo(width, height);
- otherScreen = new LogicalScreen();
+ otherScreen = new OtherScreen(this);
otherScreen.setDimensions(width - 2, height - 2);
drawLock = otherScreen;
setHiddenMouse(true);
// Event handlers ---------------------------------------------------------
// ------------------------------------------------------------------------
+ /**
+ * Handle window/screen resize events.
+ *
+ * @param event resize event
+ */
+ @Override
+ public void onResize(final TResizeEvent event) {
+ if (event.getType() == TResizeEvent.Type.WIDGET) {
+ int newWidth = event.getWidth() - 2;
+ int newHeight = event.getHeight() - 2;
+ if ((newWidth != otherScreen.getWidth())
+ || (newHeight != otherScreen.getHeight())
+ ) {
+ // I was resized, notify the screen I am watching to match my
+ // new size.
+ synchronized (eventQueue) {
+ eventQueue.add(new TResizeEvent(TResizeEvent.Type.SCREEN,
+ newWidth, newHeight));
+ }
+ synchronized (listener) {
+ listener.notifyAll();
+ }
+ }
+ return;
+ } else {
+ super.onResize(event);
+ }
+ }
+
/**
* Returns true if the mouse is currently in the otherScreen window.
*
setCursorVisible(false);
}
}
+
+ // Check if the other application has died. If so, unset hidden
+ // mouse.
+ if (otherApplication != null) {
+ if (otherApplication.isRunning() == false) {
+ setHiddenMouse(false);
+ }
+ }
+
}
/**
*/
@Override
public void onClose() {
- // TODO: send a screen disconnect
+ synchronized (eventQueue) {
+ eventQueue.add(new TCommandEvent(cmBackendDisconnect));
+ }
}
// ------------------------------------------------------------------------
return otherScreen;
}
+ /**
+ * Set the other screen's application.
+ *
+ * @param application the application driving the other screen
+ */
+ public void setOtherApplication(final TApplication application) {
+ this.otherApplication = application;
+ }
+
}