summaryrefslogtreecommitdiff
path: root/src/terminal/fqterm_buffer.h
diff options
context:
space:
mode:
authoriroul <iroul@iroul-VirtualBox.(none)>2014-04-04 07:35:14 -0700
committeriroul <iroul@iroul-VirtualBox.(none)>2014-04-04 07:35:14 -0700
commitafd34f2893a06a3aecf17e8e83b1df6ed2ae91a2 (patch)
tree851102abc55d91a1b76e63e9e89f9a7733da95b5 /src/terminal/fqterm_buffer.h
parentc4b028ad53f7b362a864de24828d7cc39ff67b0a (diff)
downloadfqterm-afd34f2893a06a3aecf17e8e83b1df6ed2ae91a2.tar.xz
move to my github.
Diffstat (limited to 'src/terminal/fqterm_buffer.h')
-rw-r--r--src/terminal/fqterm_buffer.h297
1 files changed, 297 insertions, 0 deletions
diff --git a/src/terminal/fqterm_buffer.h b/src/terminal/fqterm_buffer.h
new file mode 100644
index 0000000..3e0ef6a
--- /dev/null
+++ b/src/terminal/fqterm_buffer.h
@@ -0,0 +1,297 @@
+/***************************************************************************
+ * fqterm, a terminal emulator for both BBS and *nix. *
+ * Copyright (C) 2008 fqterm development group. *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. *
+ ***************************************************************************/
+
+#ifndef FQTERM_BUFFER_H
+#define FQTERM_BUFFER_H
+
+#include <QList>
+#include <QObject>
+#include <QPoint>
+
+#include "fqterm_text_line.h"
+class QString;
+class QByteArray;
+class QRect;
+
+namespace FQTerm {
+
+class FQTermTextLine;
+
+/* Text buffer consists of characters in a matrix of cells.
+ *
+ * Buffer
+ * +--------------------------------+
+ * ||----> |
+ * || x |
+ * || |
+ * |V Y |
+ * | |
+ * . .
+ * . .
+ * . histroical lines .
+ * . .
+ * . .
+ * | |
+ * | |
+ * | |
+ * | |
+ * |+------------------------------+|
+ * |||----> ||
+ * ||| x ||
+ * ||| terminal ||
+ * ||V Y ||
+ * || ||
+ * || ||
+ * || | (caret) ||
+ * || ||
+ * || ||
+ * |+------------------------------+|
+ * +--------------------------------+
+ *
+ * Text buffer, to manage lines of characters with colors and
+ * attributes, caret positions, terminal size/margins, selection
+ * region, historical text lines, buffer write mode (insert or
+ * replace), and etc.
+ *
+ * Note: There are two coordinates, relative to terminal or entire
+ * buffer. When we use (column, row) it indicates terminal coordinate,
+ * while when we use (column, line) it indicates buffer coordinate.
+ * This rule applies both in variable names and function names.
+ **/
+class FQTermBuffer: public QObject {
+ Q_OBJECT;
+ public:
+ enum TermMode {
+ INSERT_MODE, /* otherwise replace mode */
+ ANSI_MODE, /* otherwise VT52 mode */
+ SMOOTH_MODE, /* otherwse jump mode */
+ NEWLINE_MODE, /* otherwise line feed mode */
+ CURSOR_MODE, /* otherwise reset cursor mode */
+ NUMERIC_MODE, /* otherwise application mode */
+ ORIGIN_MODE, /* otherwise absolute mode */
+ AUTOWRAP_MODE, /* otherwise non-autowrap mode */
+ AUTOREPEAT_MODE, /* otherwise non-autorepeat mode */
+ LIGHTBG_MODE, /* otherwise dark background mode */
+ };
+
+ enum VtCharSet {
+ UNITED_KINGDOM_SET,
+ ASCII_SET,
+ SPECIAL_GRAPHICS,
+ ALTERNATE_CHARACTER_ROM_STANDARD_CHARACTER_SET,
+ ALTERNATE_CHARACTER_ROM_SPECIAL_GRAPHICS
+ };
+
+ FQTermBuffer(int column, int row, int max_hist_line, bool is_bbs);
+ ~FQTermBuffer();
+
+ // Get text lines.
+ // Return null if the line_index is out of bound, return NULL.
+ const FQTermTextLine *getTextLineInBuffer(int line_index) const;
+ const FQTermTextLine *getTextLineInTerm(int line_index) const;
+
+ // Get number of columns and rows of the term, or lines of the
+ // entire buffer.
+ int getNumColumns() const;
+ int getNumRows() const;
+ int getNumLines() const;
+
+ // Set the size of the screen.
+ void setTermSize(int col, int row);
+ // set margins in term. (Generally speaking, most operations are
+ // restrictied in [top_row_, bottom_row_] of terminal.)
+ void setMargins(int top_row, int bottom_row);
+
+ // the caret's coordinate in term or buffer.
+ int getCaretColumn() const;
+ int getCaretRow() const;
+ int getCaretLine() const;
+
+ // Set current attribute.
+ void setCurrentAttr(unsigned char color, unsigned char attr);
+
+ // Below are a series of functions to modify the content of buffer.
+ // These functions will work from the current caret position.
+ // All the behaviours of these functions may be influenced by the
+ // mode of this buffer (is_insert_mode_, is_newline_mode_, and
+ // etc.).
+
+ void writeText(const QString &cstr, int charstate = FQTermTextLine::NORMAL);
+
+ void fillScreenWith(char c);
+
+ void insertSpaces(int count);
+ void insertLines(int count);
+
+ void deleteText(int cell_count);
+ void deleteLines(int line_count);
+
+ void eraseText(int cell_count);
+
+ void eraseToLineBegin();
+ void eraseToLineEnd();
+ void eraseEntireLine();
+
+ void eraseToTermBegin();
+ void eraseToTermEnd();
+ void eraseEntireTerm();
+
+ // Set a line of buffer to have been changed from start to end.
+ void setLineChanged(int index, int cell_begin, int cell_end);
+ void clearLineChanged(int index);
+ void setLineAllChanged(int index);
+
+ // Functions about caret.
+ // If the caret is moved, the cells of the position of the last caret will
+ // be marked as changed.
+ void moveCaretOffset(int coloumn_offset, int row_offset,
+ bool scroll_if_necessary = false);
+ void moveCaretTo(int coloumn, int row, bool scroll_if_necessary = false);
+ void changeCaretPosition(int coloumn, int row);
+ void saveCaret();
+ void restoreCaret();
+
+ void SelectVtCharacterSet(VtCharSet charset, bool G0);
+ void invokeCharset(bool G0);
+
+ // non-printing characters
+ void tab();
+ void carriageReturn();
+ void lineFeed();
+
+ void addTabStop();
+ void clearTabStop(bool clear_all);
+
+ // Select Mode (SM) and Reset Mode (RM) functions.
+ // See ANSI X3.64 Mode-Changing Parameters.
+ void setMode(TermMode);
+ void resetMode(TermMode);
+
+ bool isCursorMode() const { return is_cursor_mode_; }
+ bool isAnsiMode() const { return is_ansi_mode_; }
+ bool isNumericMode() const { return is_numeric_mode_; }
+ bool isAutoRepeatMode() const { return is_autorepeat_mode_; }
+ bool isLightBackgroundMode() const { return is_lightbg_mode_; }
+ bool isNewLineMode() const {return is_newline_mode_;}
+
+ // for test
+ void startDecode();
+ void endDecode();
+
+ // Functions about selection in buffer.
+ void setSelect(const QPoint &start_point, const QPoint &end_point);
+ void clearSelect();
+ bool isSelected(const QPoint &cell, bool isRectSel) const;
+ bool isSelected(int line_index) const;
+
+ QString getTextSelected(bool is_rect_sel, bool is_color_copy,
+ const QByteArray &escape) const;
+
+ // Get the rectangle of selected text of a certain line in buffer.
+ // Note: please ensure there exits any cell of the line line_index
+ // is selected.
+ QRect getSelectRect(int line_index, bool is_rect_sel) const;
+
+ //Scroll line && adjust caret pos.
+ //Scroll must occur at the line where caret is
+ void scrollTerm(int numRows);
+
+ signals:
+ void bufferSizeChanged();
+ void termSizeChanged(int column, int row);
+ void onSetTermSize(int col, int row);
+ void caretChangeRow();
+ private:
+ // Scroll lines between startRow and bottom_row_ (see setMargin()).
+ // num > 0 scroll up.
+ // num < 0 scroll down.
+ void scrollLinesInTerm(int startRow, int numRows);
+
+ // Replace a area of cells with spaces.
+ void clearArea(int startColumn, int startRow,
+ int width, int height,
+ unsigned char color, unsigned char attr);
+
+ // Append n empty lines to the buffer and make the first n lines of
+ // term historical.
+ void addHistoryLine(int n);
+
+ int getTabStop(int column);
+
+ struct Caret {
+ int column_, row_;
+ int color_, attr_;
+ VtCharSet G0_, G1_;
+
+ Caret();
+ };
+
+ // terminal size.
+ int num_columns_, num_rows_;
+
+ // term margins. (Generally speaking, most operations are
+ // restrictied in [top_row_, bottom_row_] of terminal.)
+ int top_row_, bottom_row_;
+
+ // Historical data length and max length.
+ int num_hist_lines_, max_num_hist_lines_;
+
+ // All lines of text, including both historical lines and lines in
+ // current terminal.
+ //
+ // Note: the number of historical lines, num_hist_lines, may
+ // increase from 0 to max_num_hist_lines_.
+ QList<FQTermTextLine *> text_lines_;
+
+ void *tab_stops_;
+
+ // The caret in terminal
+ Caret caret_;
+ Caret last_saved_caret_;
+
+ bool is_g0_used_; // is G0 or G1 charset used;
+
+ bool is_insert_mode_; // Is insert or replace mode.
+ bool is_ansi_mode_; // Is ansi or vt52 mode.
+ bool is_smoothscroll_mode_; // Is smooth or jump scrolling mode.
+ bool is_newline_mode_; // Is newline or linefeed mode.
+ bool is_cursor_mode_; // Is cursor key mode.
+ bool is_numeric_mode_; // Is numeric or application mode.
+ bool is_origin_mode_; // Is origin or absolute mode.
+ bool is_autowrap_mode_; // Is auto-wrap mode enabled.
+ bool is_autorepeat_mode_; // Is auto-repeat mode enabled.
+ bool is_lightbg_mode_; // Is ligth background or dark backgrond mode.
+
+ // Selection in buffer. If section start and end are in the same
+ // line, start.x should be equal to or less than end.x. Otherwise
+ // start.y should be less than end.y.
+ //
+ // If selection_start_ = selection_start_ = (-1, -1), the selection
+ // is empty.
+ QPoint selection_start_;
+ QPoint selection_end_;
+
+ // whether this buffer is used for a bbs session.
+ bool is_bbs_;
+};
+
+} // namespace FQTerm
+
+#endif // FQTERM_BUFFER_H