Merge commit '77d3a60869e7a780c6ae069e51530e1eacece5e2'
[fanfix.git] / src / jexer / backend / GenericBackend.java
index bf27e947607f1c7bea073b4edac0689f300e6067..ede3c0bff4365743f1d8c38d3c4b130f1cdc01f0 100644 (file)
@@ -3,7 +3,7 @@
  *
  * The MIT License (MIT)
  *
- * Copyright (C) 2017 Kevin Lamonte
+ * Copyright (C) 2019 Kevin Lamonte
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -31,6 +31,8 @@ package jexer.backend;
 import java.util.List;
 
 import jexer.event.TInputEvent;
+import jexer.event.TCommandEvent;
+import static jexer.TCommand.*;
 
 /**
  * This abstract class provides a screen, keyboard, and mouse to
@@ -39,11 +41,43 @@ import jexer.event.TInputEvent;
  */
 public abstract class GenericBackend implements Backend {
 
+    // ------------------------------------------------------------------------
+    // Variables --------------------------------------------------------------
+    // ------------------------------------------------------------------------
+
     /**
      * The session information.
      */
     protected SessionInfo sessionInfo;
 
+    /**
+     * The screen to draw on.
+     */
+    protected Screen screen;
+
+    /**
+     * Input events are processed by this Terminal.
+     */
+    protected TerminalReader terminal;
+
+    /**
+     * By default, GenericBackend adds a cmAbort after it sees
+     * cmBackendDisconnect, so that TApplication will exit when the user
+     * closes the Swing window or disconnects the ECMA48 streams.  But
+     * MultiBackend wraps multiple Backends, and needs to decide when to send
+     * cmAbort differently.  Setting this to false is how it manages that.
+     * Note package private access.
+     */
+    boolean abortOnDisconnect = true;
+
+    // ------------------------------------------------------------------------
+    // Constructors -----------------------------------------------------------
+    // ------------------------------------------------------------------------
+
+    // ------------------------------------------------------------------------
+    // Backend ----------------------------------------------------------------
+    // ------------------------------------------------------------------------
+
     /**
      * Getter for sessionInfo.
      *
@@ -53,11 +87,6 @@ public abstract class GenericBackend implements Backend {
         return sessionInfo;
     }
 
-    /**
-     * The screen to draw on.
-     */
-    protected Screen screen;
-
     /**
      * Getter for screen.
      *
@@ -75,9 +104,13 @@ public abstract class GenericBackend implements Backend {
     }
 
     /**
-     * Input events are processed by this Terminal.
+     * Check if there are events in the queue.
+     *
+     * @return if true, getEvents() has something to return to the application
      */
-    protected TerminalReader terminal;
+    public boolean hasEvents() {
+        return terminal.hasEvents();
+    }
 
     /**
      * Get keyboard, mouse, and screen resize events.
@@ -87,6 +120,18 @@ public abstract class GenericBackend implements Backend {
     public void getEvents(final List<TInputEvent> queue) {
         if (terminal.hasEvents()) {
             terminal.getEvents(queue);
+
+            // This default backend assumes a single user, and if that user
+            // becomes disconnected we should terminate the application.
+            if ((queue.size() > 0) && (abortOnDisconnect == true)) {
+                TInputEvent event = queue.get(queue.size() - 1);
+                if (event instanceof TCommandEvent) {
+                    TCommandEvent command = (TCommandEvent) event;
+                    if (command.equals(cmBackendDisconnect)) {
+                        queue.add(new TCommandEvent(cmAbort));
+                    }
+                }
+            }
         }
     }
 
@@ -116,4 +161,11 @@ public abstract class GenericBackend implements Backend {
         terminal.setListener(listener);
     }
 
+    /**
+     * Reload backend options from System properties.
+     */
+    public void reloadOptions() {
+        terminal.reloadOptions();
+    }
+
 }