X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Fbackend%2FMultiBackend.java;h=d01b9442c0526cc9ce2a67af0be5e8f1a2a514c7;hb=505be508ae7d3fb48122be548b310a238cfb91eb;hp=9166e1c19bec44817a21297d87d949cb27b1a1f2;hpb=3e0743556d1f31723a11a6019b5c2b018b4b2104;p=fanfix.git diff --git a/src/jexer/backend/MultiBackend.java b/src/jexer/backend/MultiBackend.java index 9166e1c..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,16 +28,22 @@ */ 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. */ public class MultiBackend implements Backend { + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ + /** * The screen to use. */ @@ -46,7 +52,16 @@ 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 ----------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Public constructor requires one backend. Note that this backend's @@ -61,37 +76,15 @@ public class MultiBackend implements Backend { } else { multiScreen = new MultiScreen(backend.getScreen()); } - } - - /** - * Add a backend to the list. - * - * @param backend the backend to add - */ - public void addBackend(final Backend backend) { - backends.add(backend); - if (backend instanceof TWindowBackend) { - multiScreen.addScreen(((TWindowBackend) backend).getOtherScreen()); - } else { - multiScreen.addScreen(backend.getScreen()); + if (backend instanceof GenericBackend) { + ((GenericBackend) backend).abortOnDisconnect = false; } + sessionInfo = backend.getSessionInfo(); } - /** - * Remove a backend from the list. - * - * @param backend the backend to remove - */ - public void removeBackend(final Backend backend) { - if (backends.size() > 1) { - if (backend instanceof TWindowBackend) { - multiScreen.removeScreen(((TWindowBackend) backend).getOtherScreen()); - } else { - multiScreen.removeScreen(backend.getScreen()); - } - backends.remove(backend); - } - } + // ------------------------------------------------------------------------ + // Backend ---------------------------------------------------------------- + // ------------------------------------------------------------------------ /** * Getter for sessionInfo. @@ -99,7 +92,7 @@ public class MultiBackend implements Backend { * @return the SessionInfo */ public SessionInfo getSessionInfo() { - return backends.get(0).getSessionInfo(); + return sessionInfo; } /** @@ -121,6 +114,23 @@ public class MultiBackend implements Backend { } } + /** + * Check if there are events in the queue. + * + * @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; + } + } + return false; + } + /** * Subclasses must provide an implementation to get keyboard, mouse, and * screen resize events. @@ -128,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)); } } @@ -166,4 +205,50 @@ public class MultiBackend implements Backend { } } + /** + * Reload backend options from System properties. + */ + public void reloadOptions() { + for (Backend backend: backends) { + backend.reloadOptions(); + } + } + + // ------------------------------------------------------------------------ + // MultiBackend ----------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Add a backend to the list. + * + * @param backend the backend to add + */ + public void addBackend(final Backend backend) { + backends.add(backend); + if (backend instanceof TWindowBackend) { + multiScreen.addScreen(((TWindowBackend) backend).getOtherScreen()); + } else { + multiScreen.addScreen(backend.getScreen()); + } + if (backend instanceof GenericBackend) { + ((GenericBackend) backend).abortOnDisconnect = false; + } + } + + /** + * Remove a backend from the list. + * + * @param backend the backend to remove + */ + public void removeBackend(final Backend backend) { + if (backends.size() > 1) { + if (backend instanceof TWindowBackend) { + multiScreen.removeScreen(((TWindowBackend) backend).getOtherScreen()); + } else { + multiScreen.removeScreen(backend.getScreen()); + } + backends.remove(backend); + } + } + }