import jexer.TApplication;
import jexer.TDesktop;
import jexer.TTerminalWidget;
+import jexer.TSplitPane;
import jexer.TWidget;
-import jexer.event.TKeypressEvent;
import jexer.event.TMenuEvent;
-import jexer.event.TMouseEvent;
-import jexer.event.TResizeEvent;
import jexer.menu.TMenu;
/**
* Menu item: split the terminal horizontally.
*/
private static final int MENU_SPLIT_HORIZONTAL = 2001;
+ /**
+ * Menu item: recreate the root terminal.
+ */
+ private static final int MENU_RESPAWN_ROOT = 2002;
/**
* Handle to the root widget.
*/
private TWidget root = null;
-
+
/**
* Main entry point.
*/
* Public constructor chooses the ECMA-48 / Xterm backend.
*/
public JexerTilingWindowManager2() throws Exception {
- super(BackendType.SWING);
+ super(BackendType.XTERM);
// The stock tool menu has items for redrawing the screen, opening
// images, and (when using the Swing backend) setting the font.
// New commands for this example: split vertical and horizontal.
tileMenu.addItem(MENU_SPLIT_VERTICAL, "&Vertical Split");
tileMenu.addItem(MENU_SPLIT_HORIZONTAL, "&Horizontal Split");
+ tileMenu.addItem(MENU_RESPAWN_ROOT, "&Respawn Root Terminal");
- // Stock commands: a new shell with resizable window, previous, next,
- // close, and exit program.
- tileMenu.addItem(TMenu.MID_SHELL, "&Floating");
+ // Stock commands: a new shell with resizable window, and exit
+ // program.
tileMenu.addSeparator();
- tileMenu.addDefaultItem(TMenu.MID_WINDOW_PREVIOUS);
- tileMenu.addDefaultItem(TMenu.MID_WINDOW_NEXT);
- tileMenu.addDefaultItem(TMenu.MID_WINDOW_CLOSE);
+ tileMenu.addItem(TMenu.MID_SHELL, "&New Windowed Terminal");
tileMenu.addSeparator();
tileMenu.addDefaultItem(TMenu.MID_EXIT);
- // Spin up the root terminal
- root = new TTerminalWidget(getDesktop(), 0, 0,
- getDesktop().getWidth(), getDesktop().getHeight(),
- new TAction() {
- public void DO() {
- // TODO: if root's parent is TSplitPane, call
- // TSplitPane.removeSplit(TWidget).
- if (root != null) {
- root.remove();
- }
+ // TTerminalWidget can request the text-block mouse pointer be
+ // suppressed, but the default TDesktop will ignore it. Let's set a
+ // new TDesktop to pass that mouse pointer visibility option to
+ // TApplication.
+ setDesktop(new TDesktop(this) {
+ @Override
+ public boolean hasHiddenMouse() {
+ TWidget active = getActiveChild();
+ if (active instanceof TTerminalWidget) {
+ return ((TTerminalWidget) active).hasHiddenMouse();
}
- });
+ return false;
+ }
+ });
+
+ // Spin up the root terminal
+ createRootTerminal();
}
/**
*/
@Override
protected boolean onMenu(TMenuEvent event) {
- if (event.getId() == MENU_SPLIT_VERTICAL) {
- splitVertical();
+ TWidget active = getDesktop().getActiveChild();
+ TSplitPane split = null;
+
+ switch (event.getId()) {
+ case MENU_RESPAWN_ROOT:
+ assert (root == null);
+ createRootTerminal();
return true;
- }
- if (event.getId() == MENU_SPLIT_HORIZONTAL) {
- splitHorizontal();
+
+ case MENU_SPLIT_VERTICAL:
+ if (root == null) {
+ assert (getDesktop().getActiveChild() == null);
+ createRootTerminal();
+ return true;
+ }
+ split = active.splitVertical(false, createTerminal());
+ if (active == root) {
+ root = split;
+ }
+ return true;
+
+ case MENU_SPLIT_HORIZONTAL:
+ if (root == null) {
+ assert (getDesktop().getActiveChild() == null);
+ createRootTerminal();
+ return true;
+ }
+ split = active.splitHorizontal(false, createTerminal());
+ if (active == root) {
+ root = split;
+ }
return true;
+
+ default:
+ return super.onMenu(event);
}
- return super.onMenu(event);
}
/**
- * Perform the vertical split.
+ * Create the root terminal.
*/
- private void splitVertical() {
- // TODO
+ private void createRootTerminal() {
+ assert (root == null);
+ disableMenuItem(MENU_RESPAWN_ROOT);
+ enableMenuItem(MENU_SPLIT_VERTICAL);
+ enableMenuItem(MENU_SPLIT_HORIZONTAL);
+ root = createTerminal();
}
/**
- * Perform the horizontal split.
+ * Create a new terminal.
+ *
+ * @return the new terminal
*/
- private void splitHorizontal() {
- // TODO
+ private TWidget createTerminal() {
+ return new TTerminalWidget(getDesktop(), 0, 0,
+ getDesktop().getWidth(), getDesktop().getHeight(),
+ new TAction() {
+ public void DO() {
+ if (source.getParent() instanceof TSplitPane) {
+ ((TSplitPane) source.getParent()).removeSplit(source,
+ true);
+ } else {
+ source.getApplication().enableMenuItem(
+ MENU_RESPAWN_ROOT);
+ source.getApplication().disableMenuItem(
+ MENU_SPLIT_VERTICAL);
+ source.getApplication().disableMenuItem(
+ MENU_SPLIT_HORIZONTAL);
+ source.remove();
+ root = null;
+ }
+ }
+ });
}
}