@Override
    public Key readInput() {
        synchronized(readMutex) {
            if(!keyQueue.isEmpty())
                return keyQueue.poll();
            
            Key key = inputDecoder.getNextCharacter();
            if (key != null && key.getKind() == Key.Kind.CursorLocation) {
                TerminalPosition reportedTerminalPosition = inputDecoder.getLastReportedTerminalPosition();
                if (reportedTerminalPosition != null)
                    onResized(reportedTerminalPosition.getColumn(), reportedTerminalPosition.getRow());

                return readInput();
            } else {
                return key;
            }
        }
    }