X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Fbackend%2FMultiBackend.java;h=d01b9442c0526cc9ce2a67af0be5e8f1a2a514c7;hb=12b90437b5f22c2ae6e9b9b14c3b62b60f6143e5;hp=4e82d4ee694e13cbe12275ca1e16f67b42391251;hpb=d6ee0801333ff93dffd851f4c1a44519c96c371d;p=fanfix.git diff --git a/src/jexer/backend/MultiBackend.java b/src/jexer/backend/MultiBackend.java index 4e82d4e..d01b944 100644 --- a/src/jexer/backend/MultiBackend.java +++ b/src/jexer/backend/MultiBackend.java @@ -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"), @@ -28,10 +28,12 @@ */ package jexer.backend; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; +import jexer.event.TCommandEvent; import jexer.event.TInputEvent; +import static jexer.TCommand.*; /** * MultiBackend mirrors its I/O to several backends. @@ -50,7 +52,12 @@ public class MultiBackend implements Backend { /** * The list of backends to use. */ - private List backends = new LinkedList(); + private List backends = new ArrayList(); + + /** + * The SessionInfo to return. + */ + private SessionInfo sessionInfo; // ------------------------------------------------------------------------ // Constructors ----------------------------------------------------------- @@ -69,6 +76,10 @@ public class MultiBackend implements Backend { } else { multiScreen = new MultiScreen(backend.getScreen()); } + if (backend instanceof GenericBackend) { + ((GenericBackend) backend).abortOnDisconnect = false; + } + sessionInfo = backend.getSessionInfo(); } // ------------------------------------------------------------------------ @@ -81,7 +92,7 @@ public class MultiBackend implements Backend { * @return the SessionInfo */ public SessionInfo getSessionInfo() { - return backends.get(0).getSessionInfo(); + return sessionInfo; } /** @@ -109,6 +120,9 @@ public class MultiBackend implements Backend { * @return if true, getEvents() has something to return to the application */ public boolean hasEvents() { + if (backends.size() == 0) { + return true; + } for (Backend backend: backends) { if (backend.hasEvents()) { return true; @@ -124,8 +138,37 @@ public class MultiBackend implements Backend { * @param queue list to append new events to */ public void getEvents(List queue) { + List backendsToRemove = null; for (Backend backend: backends) { - backend.getEvents(queue); + if (backend.hasEvents()) { + backend.getEvents(queue); + + // This default backend assumes a single user, and if that + // user becomes disconnected we should terminate the + // application. + if (queue.size() > 0) { + TInputEvent event = queue.get(queue.size() - 1); + if (event instanceof TCommandEvent) { + TCommandEvent command = (TCommandEvent) event; + if (command.equals(cmBackendDisconnect)) { + if (backendsToRemove == null) { + backendsToRemove = new ArrayList(); + } + backendsToRemove.add(backend); + } + } + } + } + } + if (backendsToRemove != null) { + for (Backend backend: backendsToRemove) { + multiScreen.removeScreen(backend.getScreen()); + backends.remove(backend); + backend.shutdown(); + } + } + if (backends.size() == 0) { + queue.add(new TCommandEvent(cmAbort)); } } @@ -162,6 +205,15 @@ public class MultiBackend implements Backend { } } + /** + * Reload backend options from System properties. + */ + public void reloadOptions() { + for (Backend backend: backends) { + backend.reloadOptions(); + } + } + // ------------------------------------------------------------------------ // MultiBackend ----------------------------------------------------------- // ------------------------------------------------------------------------ @@ -178,6 +230,9 @@ public class MultiBackend implements Backend { } else { multiScreen.addScreen(backend.getScreen()); } + if (backend instanceof GenericBackend) { + ((GenericBackend) backend).abortOnDisconnect = false; + } } /**