From ff6deaf4ab6b9b56891bbb1f6c5a2d5926cf292c Mon Sep 17 00:00:00 2001 From: Markus Gans Date: Sat, 15 Oct 2016 03:32:30 +0200 Subject: [PATCH] Each virtual window gets its own virtual print cursor --- ChangeLog | 3 + README.md | 196 +++++++++++++++++++++--------------------- doc/class-diagram.txt | 196 +++++++++++++++++++++--------------------- src/fvterm.cpp | 169 +++++++++++++++++++----------------- src/fvterm.h | 10 +-- src/fwidget.cpp | 18 ++-- src/fwidget.h | 2 +- 7 files changed, 304 insertions(+), 290 deletions(-) diff --git a/ChangeLog b/ChangeLog index 29bfca13..ab45fc7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2016-10-15 Markus Gans + * Each virtual window gets its own virtual print cursor + 2016-10-14 Markus Gans * Virtual windows can now store their own offset information * Correct implementation of the move() method diff --git a/README.md b/README.md index 6e9305a6..07cccf15 100644 --- a/README.md +++ b/README.md @@ -101,102 +101,102 @@ printf(...) Class digramm -------------
-                                 ┌───────────┐
-                            ┌────┤ FKeyEvent │
-                            │    └───────────┘
-                            │    ┌─────────────┐
-                            ├────┤ FMouseEvent │
-                            │    └─────────────┘
-                            │    ┌─────────────┐
-                            ├────┤ FWheelEvent │
-                            │    └─────────────┘
-                            │    ┌─────────────┐
-                            ├────┤ FFocusEvent │
-                            │    └─────────────┘
-                            │    ┌─────────────┐
-                ┌────────┐  ├────┤ FAccelEvent │
-                │ FEvent │◄─┤    └─────────────┘
-                └────┬───┘  │    ┌──────────────┐
-                     :1     ├────┤ FResizeEvent │
-                     :      │    └──────────────┘
-                     :      │    ┌────────────┐
-                     :      ├────┤ FShowEvent │
-                     :      │    └────────────┘
-                     :      │    ┌────────────┐
-                     :      ├────┤ FHideEvent │
-                     :      │    └────────────┘
-                     :      │    ┌─────────────┐
-                     :      ├────┤ FCloseEvent │
-                     :      │    └─────────────┘
-                     :      │    ┌─────────────┐
-                     :      └────┤ FTimerEvent │
-                     :           └─────────────┘
-                     :
-                     :           ┌──────────────┐
-                     :      ┌────┤ FApplication │
-                     :      │    └──────────────┘
-                     :      │    ┌─────────┐1
-                     :      ├────┤ FButton ├-----------------------------┐
-                     :      │    └─────────┘                             :
-                     :      │    ┌────────┐1                             :
-                     :      ├────┤ FLabel ├------------------------------:
-                     :      │    └────────┘                              :
-                     :      │    ┌───────────┐1                          :
-                     :      ├────┤ FLineEdit ├---------------------------:
-                     :      │    └───────────┘                           :
-                     :      │    ┌──────────────┐      ┌──────────────┐1 :
-                     :1     ├────┤ FButtonGroup │   ┌──┤ FRadioButton ├--:
- ┌─────────┐   ┌─────┴───┐  │    └──────────────┘   │  └──────────────┘  :
- │ FObject │◄─┬┤ FWidget │◄─┤    ┌───────────────┐  │  ┌───────────┐1    :
- └─────────┘  │└───┬─┬───┘  ├────┤ FToggleButton │◄─┼──┤ FCheckBox ├-----:
-              │    :1:1     │    └───────────────┘  │  └───────────┘     :
-   ┌───────┐  │    : :      │    ┌──────────────┐   │  ┌─────────┐1      :
-   │ FTerm │◄─┘    : :      ├────┤ FProgressbar │   └──┤ FSwitch ├-------:
-   └┬─┬─┬──┘       : :      │    └──────────────┘      └─────────┘       :
-    :1:1:1         : :      │    ┌────────────┐                          :  *┌─────────┐
-    : : └----------┤ :      ├────┤ FScrollbar │                          ├---┤ FString │
-    : :1           : :      │    └────────────┘                          :   └─────────┘
-    :┌┴──────────┐ : :      │    ┌───────────┐1                          :
-    :│ FOptiAttr │ : :      ├────┤ FTextView ├---------------------------:
-    :└───────────┘ : :      │    └───────────┘                           :
-    :1             : :      │    ┌──────────┐1     *┌──────────────┐1    :
-   ┌┴──────────┐   : :      ├────┤ FListBox ├-------┤ FListBoxItem ├-----:
-   │ FOptiMove │   : :      │    └──────────┘       └──────────────┘     :
-   └───────────┘   : :      │    ┌────────────┐1   *┌────────────┐1      :
-                   : :      ├────┤ FStatusBar ├-----┤ FStatusKey ├-------:
-                   : :      │    └────┬───────┘     └────────────┘       :
-                   : :      │        1└----------------------------------:
-                   : :      │                         ┌─────────────┐1   :
-                   : :  ┌───┴─────┐  ┌─────────┐   ┌──┤ FFileDialog ├----:
-                   : :  │ FWindow │◄─┤ FDialog │◄──┤  └─────────────┘    :
-                   : :  └──┬──┬───┘  └────┬────┘   │  ┌─────────────┐1   :
-                   : :     ▲  ▲          1:        └──┤ FMessageBox ├----:
-                   : :     │  │           :           └─────────────┘    :
-                   : :     │  │           └------------------------------:
-                   : :     │  │      ┌──────────┐                        :
-                   : :     │  └──────┤ FToolTip │                        :
-                   : :     │         └──────────┘                        :
-                   : :     └───────────────┐          ┌──────────┐       :
-                   : :                     │      ┌───┤ FMenuBar │       :
-                   : :    ┌───────────┐    └──────┤   └──────────┘       :
-                   : :    │ FMenuList │◄──────────┤   ┌───────┐          :
-                   : :    └────┬──────┘           └───┤ FMenu │◄──┐      :
-                   : :         :                      └───────┘   │      :
-                   : :         :            ┌─────────────────┐   │      :
-                   : :         :            │ FDialogListMenu ├───┘      :
-                   : :         :            └─────────────────┘          :
-                   : :        1:                    ┌────────────────┐*  :
-                   : :         : *┌───────────┐  ┌──┤ FCheckMenuItem ├-┐ :
-                   : :         ├--┤ FMenuItem │◄─┤  └────────────────┘ : :
-                   : :         :  └───────────┘  │  ┌────────────────┐*: :
-                   : :         :                 └──┤ FRadioMenuItem ├-┤ :
-                   : :         :                    └────────────────┘ : :
-                   : :         └---------------------------------------┘ :
-                   : └---------------------------------------------------┘
-                   :  *┌────────┐
-                   ├---┤ FPoint │
-                   :   └────────┘
-                   :  *┌───────┐
-                   └---┤ FRect │
-                       └───────┘
+                                                ┌───────────┐
+                                           ┌────┤ FKeyEvent │
+                                           │    └───────────┘
+                                           │    ┌─────────────┐
+                                           ├────┤ FMouseEvent │
+                                           │    └─────────────┘
+                                           │    ┌─────────────┐
+                                           ├────┤ FWheelEvent │
+                                           │    └─────────────┘
+                                           │    ┌─────────────┐
+                                           ├────┤ FFocusEvent │
+                                           │    └─────────────┘
+                                           │    ┌─────────────┐
+                               ┌────────┐  ├────┤ FAccelEvent │
+                               │ FEvent │◄─┤    └─────────────┘
+                               └────┬───┘  │    ┌──────────────┐
+                                    :1     ├────┤ FResizeEvent │
+                                    :      │    └──────────────┘
+                                    :      │    ┌────────────┐
+                                    :      ├────┤ FShowEvent │
+                                    :      │    └────────────┘
+                                    :      │    ┌────────────┐
+                                    :      ├────┤ FHideEvent │
+                                    :      │    └────────────┘
+                                    :      │    ┌─────────────┐
+                                    :      ├────┤ FCloseEvent │
+                                    :      │    └─────────────┘
+                                    :      │    ┌─────────────┐
+                                    :      └────┤ FTimerEvent │
+                                    :           └─────────────┘
+                                    :
+                                    :           ┌──────────────┐
+                                    :      ┌────┤ FApplication │
+                                    :      │    └──────────────┘
+                                    :      │    ┌─────────┐1
+                                    :      ├────┤ FButton ├-----------------------------┐
+                                    :      │    └─────────┘                             :
+                                    :      │    ┌────────┐1                             :
+                                    :      ├────┤ FLabel ├------------------------------┐
+                                    :      │    └────────┘                              :
+                                    :      │    ┌───────────┐1                          :
+                                    :      ├────┤ FLineEdit ├---------------------------┐
+                                    :      │    └───────────┘                           :
+                                    :      │    ┌──────────────┐      ┌──────────────┐1 :
+                                    :1     ├────┤ FButtonGroup │   ┌──┤ FRadioButton ├--┐
+ ┌─────────┐    ┌────────┐    ┌─────┴───┐  │    └──────────────┘   │  └──────────────┘  :
+ │ FObject │◄─┬─┤ FVTerm │◄───┤ FWidget │◄─┤    ┌───────────────┐  │  ┌───────────┐1    :
+ └─────────┘  │ └────┬───┘    └───┬─┬───┘  ├────┤ FToggleButton │◄─┼──┤ FCheckBox ├-----┐
+              │      :1           :1:1     │    └───────────────┘  │  └───────────┘     :
+   ┌───────┐  │      :            : :      │    ┌──────────────┐   │  ┌─────────┐1      :
+   │ FTerm │◄─┘      └------------┐ :      ├────┤ FProgressbar │   └──┤ FSwitch ├-------┐
+   └─┬───┬─┘                      : :      │    └──────────────┘      └─────────┘       :
+     :1  :1                       : :      │    ┌────────────┐                          :  *┌─────────┐
+     :   └------------------------┐ :      ├────┤ FScrollbar │                          ├---┤ FString │
+     :                            : :      │    └────────────┘                          :   └─────────┘
+     :  1┌───────────┐            : :      │    ┌───────────┐1                          :
+     └---┤ FOptiAttr │            : :      ├────┤ FTextView ├---------------------------┘
+     :   └───────────┘            : :      │    └───────────┘                           :
+     :  1┌───────────┐            : :      │    ┌──────────┐1     *┌──────────────┐1    :
+     └---┤ FOptiMove │            : :      ├────┤ FListBox ├-------┤ FListBoxItem ├-----┘
+         └───────────┘            : :      │    └──────────┘       └──────────────┘     :
+                                  : :      │    ┌────────────┐1   *┌────────────┐1      :
+                                  : :      │ ┌──┤ FStatusBar ├-----┤ FStatusKey ├-------┘
+                                  : :      │ │  └────┬───────┘     └────────────┘       :
+                                  : :      │ │      1└----------------------------------┘
+                                  : :      │ ▼                       ┌─────────────┐1   :
+                                  : :  ┌───┴─┴───┐  ┌─────────┐   ┌──┤ FFileDialog ├----┘
+                                  : :  │ FWindow │◄─┤ FDialog │◄──┤  └─────────────┘    :
+                                  : :  └──┬──┬───┘  └────┬────┘   │  ┌─────────────┐1   :
+                                  : :     ▲  ▲          1:        └──┤ FMessageBox ├----┘
+                                  : :     │  │           :           └─────────────┘    :
+                                  : :     │  │           └------------------------------┘
+                                  : :     │  │      ┌──────────┐                        :
+                                  : :     │  └──────┤ FToolTip ├------------------------┘
+                                  : :     │         └──────────┘                        :
+                                  : :     └───────────────┐          ┌──────────┐       :
+                                  : :                     │      ┌───┤ FMenuBar │       :
+                                  : :    ┌───────────┐    └──────┤   └──────────┘       :
+                                  : :    │ FMenuList │◄──────────┤   ┌───────┐          :
+                                  : :    └────┬──────┘           └───┤ FMenu │◄──┐      :
+                                  : :        1:                      └───────┘   │      :
+                                  : :         :            ┌─────────────────┐   │      :
+                                  : :         :            │ FDialogListMenu ├───┘      :
+                                  : :         :            └─────────────────┘          :
+                                  : :         :                    ┌────────────────┐*  :
+                                  : :         : *┌───────────┐  ┌──┤ FCheckMenuItem ├-┐ :
+                                  : :         ├--┤ FMenuItem │◄─┤  └────────────────┘ : :
+                                  : :         :  └───────────┘  │  ┌────────────────┐*: :
+                                  : :         :                 └──┤ FRadioMenuItem ├-┤ :
+                                  : :         :                    └────────────────┘ : :
+                                  : :         └---------------------------------------┘ :
+                                  : └---------------------------------------------------┘
+                                  :  *┌────────┐
+                                  └---┤ FPoint │
+                                  :   └────────┘
+                                  :  *┌───────┐
+                                  └---┤ FRect │
+                                      └───────┘
 
diff --git a/doc/class-diagram.txt b/doc/class-diagram.txt index 836948ce..b3803adb 100644 --- a/doc/class-diagram.txt +++ b/doc/class-diagram.txt @@ -2,101 +2,101 @@ Class digramm ══════════════════════════════════════════════════════════════════════════════ - ┌───────────┐ - ┌────┤ FKeyEvent │ - │ └───────────┘ - │ ┌─────────────┐ - ├────┤ FMouseEvent │ - │ └─────────────┘ - │ ┌─────────────┐ - ├────┤ FWheelEvent │ - │ └─────────────┘ - │ ┌─────────────┐ - ├────┤ FFocusEvent │ - │ └─────────────┘ - │ ┌─────────────┐ - ┌────────┐ ├────┤ FAccelEvent │ - │ FEvent │◄─┤ └─────────────┘ - └────┬───┘ │ ┌──────────────┐ - :1 ├────┤ FResizeEvent │ - : │ └──────────────┘ - : │ ┌────────────┐ - : ├────┤ FShowEvent │ - : │ └────────────┘ - : │ ┌────────────┐ - : ├────┤ FHideEvent │ - : │ └────────────┘ - : │ ┌─────────────┐ - : ├────┤ FCloseEvent │ - : │ └─────────────┘ - : │ ┌─────────────┐ - : └────┤ FTimerEvent │ - : └─────────────┘ - : - : ┌──────────────┐ - : ┌────┤ FApplication │ - : │ └──────────────┘ - : │ ┌─────────┐1 - : ├────┤ FButton ├-----------------------------┐ - : │ └─────────┘ : - : │ ┌────────┐1 : - : ├────┤ FLabel ├------------------------------: - : │ └────────┘ : - : │ ┌───────────┐1 : - : ├────┤ FLineEdit ├---------------------------: - : │ └───────────┘ : - : │ ┌──────────────┐ ┌──────────────┐1 : - :1 ├────┤ FButtonGroup │ ┌──┤ FRadioButton ├--: - ┌─────────┐ ┌─────┴───┐ │ └──────────────┘ │ └──────────────┘ : - │ FObject │◄─┬┤ FWidget │◄─┤ ┌───────────────┐ │ ┌───────────┐1 : - └─────────┘ │└───┬─┬───┘ ├────┤ FToggleButton │◄─┼──┤ FCheckBox ├-----: - │ :1:1 │ └───────────────┘ │ └───────────┘ : - ┌───────┐ │ : : │ ┌──────────────┐ │ ┌─────────┐1 : - │ FTerm │◄─┘ : : ├────┤ FProgressbar │ └──┤ FSwitch ├-------: - └┬─┬─┬──┘ : : │ └──────────────┘ └─────────┘ : - :1:1:1 : : │ ┌────────────┐ : *┌─────────┐ - : : └----------┤ : ├────┤ FScrollbar │ ├---┤ FString │ - : :1 : : │ └────────────┘ : └─────────┘ - :┌┴──────────┐ : : │ ┌───────────┐1 : - :│ FOptiAttr │ : : ├────┤ FTextView ├---------------------------: - :└───────────┘ : : │ └───────────┘ : - :1 : : │ ┌──────────┐1 *┌──────────────┐1 : - ┌┴──────────┐ : : ├────┤ FListBox ├-------┤ FListBoxItem ├-----: - │ FOptiMove │ : : │ └──────────┘ └──────────────┘ : - └───────────┘ : : │ ┌────────────┐1 *┌────────────┐1 : - : : ├────┤ FStatusBar ├-----┤ FStatusKey ├-------: - : : │ └────┬───────┘ └────────────┘ : - : : │ 1└----------------------------------: - : : │ ┌─────────────┐1 : - : : ┌───┴─────┐ ┌─────────┐ ┌──┤ FFileDialog ├----: - : : │ FWindow │◄─┤ FDialog │◄──┤ └─────────────┘ : - : : └──┬──┬───┘ └────┬────┘ │ ┌─────────────┐1 : - : : ▲ ▲ 1: └──┤ FMessageBox ├----: - : : │ │ : └─────────────┘ : - : : │ │ └------------------------------: - : : │ │ ┌──────────┐ : - : : │ └──────┤ FToolTip │ : - : : │ └──────────┘ : - : : └───────────────┐ ┌──────────┐ : - : : │ ┌───┤ FMenuBar │ : - : : ┌───────────┐ └──────┤ └──────────┘ : - : : │ FMenuList │◄──────────┤ ┌───────┐ : - : : └────┬──────┘ └───┤ FMenu │◄──┐ : - : : : └───────┘ │ : - : : : ┌─────────────────┐ │ : - : : : │ FDialogListMenu ├───┘ : - : : : └─────────────────┘ : - : : 1: ┌────────────────┐* : - : : : *┌───────────┐ ┌──┤ FCheckMenuItem ├-┐ : - : : ├--┤ FMenuItem │◄─┤ └────────────────┘ : : - : : : └───────────┘ │ ┌────────────────┐*: : - : : : └──┤ FRadioMenuItem ├-┤ : - : : : └────────────────┘ : : - : : └---------------------------------------┘ : - : └---------------------------------------------------┘ - : *┌────────┐ - ├---┤ FPoint │ - : └────────┘ - : *┌───────┐ - └---┤ FRect │ - └───────┘ + ┌───────────┐ + ┌────┤ FKeyEvent │ + │ └───────────┘ + │ ┌─────────────┐ + ├────┤ FMouseEvent │ + │ └─────────────┘ + │ ┌─────────────┐ + ├────┤ FWheelEvent │ + │ └─────────────┘ + │ ┌─────────────┐ + ├────┤ FFocusEvent │ + │ └─────────────┘ + │ ┌─────────────┐ + ┌────────┐ ├────┤ FAccelEvent │ + │ FEvent │◄─┤ └─────────────┘ + └────┬───┘ │ ┌──────────────┐ + :1 ├────┤ FResizeEvent │ + : │ └──────────────┘ + : │ ┌────────────┐ + : ├────┤ FShowEvent │ + : │ └────────────┘ + : │ ┌────────────┐ + : ├────┤ FHideEvent │ + : │ └────────────┘ + : │ ┌─────────────┐ + : ├────┤ FCloseEvent │ + : │ └─────────────┘ + : │ ┌─────────────┐ + : └────┤ FTimerEvent │ + : └─────────────┘ + : + : ┌──────────────┐ + : ┌────┤ FApplication │ + : │ └──────────────┘ + : │ ┌─────────┐1 + : ├────┤ FButton ├-----------------------------┐ + : │ └─────────┘ : + : │ ┌────────┐1 : + : ├────┤ FLabel ├------------------------------┐ + : │ └────────┘ : + : │ ┌───────────┐1 : + : ├────┤ FLineEdit ├---------------------------┐ + : │ └───────────┘ : + : │ ┌──────────────┐ ┌──────────────┐1 : + :1 ├────┤ FButtonGroup │ ┌──┤ FRadioButton ├--┐ + ┌─────────┐ ┌────────┐ ┌─────┴───┐ │ └──────────────┘ │ └──────────────┘ : + │ FObject │◄─┬─┤ FVTerm │◄───┤ FWidget │◄─┤ ┌───────────────┐ │ ┌───────────┐1 : + └─────────┘ │ └────┬───┘ └───┬─┬───┘ ├────┤ FToggleButton │◄─┼──┤ FCheckBox ├-----┐ + │ :1 :1:1 │ └───────────────┘ │ └───────────┘ : + ┌───────┐ │ : : : │ ┌──────────────┐ │ ┌─────────┐1 : + │ FTerm │◄─┘ └------------┐ : ├────┤ FProgressbar │ └──┤ FSwitch ├-------┐ + └─┬───┬─┘ : : │ └──────────────┘ └─────────┘ : + :1 :1 : : │ ┌────────────┐ : *┌─────────┐ + : └------------------------┐ : ├────┤ FScrollbar │ ├---┤ FString │ + : : : │ └────────────┘ : └─────────┘ + : 1┌───────────┐ : : │ ┌───────────┐1 : + └---┤ FOptiAttr │ : : ├────┤ FTextView ├---------------------------┘ + : └───────────┘ : : │ └───────────┘ : + : 1┌───────────┐ : : │ ┌──────────┐1 *┌──────────────┐1 : + └---┤ FOptiMove │ : : ├────┤ FListBox ├-------┤ FListBoxItem ├-----┘ + └───────────┘ : : │ └──────────┘ └──────────────┘ : + : : │ ┌────────────┐1 *┌────────────┐1 : + : : │ ┌──┤ FStatusBar ├-----┤ FStatusKey ├-------┘ + : : │ │ └────┬───────┘ └────────────┘ : + : : │ │ 1└----------------------------------┘ + : : │ ▼ ┌─────────────┐1 : + : : ┌───┴─┴───┐ ┌─────────┐ ┌──┤ FFileDialog ├----┘ + : : │ FWindow │◄─┤ FDialog │◄──┤ └─────────────┘ : + : : └──┬──┬───┘ └────┬────┘ │ ┌─────────────┐1 : + : : ▲ ▲ 1: └──┤ FMessageBox ├----┘ + : : │ │ : └─────────────┘ : + : : │ │ └------------------------------┘ + : : │ │ ┌──────────┐ : + : : │ └──────┤ FToolTip ├------------------------┘ + : : │ └──────────┘ : + : : └───────────────┐ ┌──────────┐ : + : : │ ┌───┤ FMenuBar │ : + : : ┌───────────┐ └──────┤ └──────────┘ : + : : │ FMenuList │◄──────────┤ ┌───────┐ : + : : └────┬──────┘ └───┤ FMenu │◄──┐ : + : : 1: └───────┘ │ : + : : : ┌─────────────────┐ │ : + : : : │ FDialogListMenu ├───┘ : + : : : └─────────────────┘ : + : : : ┌────────────────┐* : + : : : *┌───────────┐ ┌──┤ FCheckMenuItem ├-┐ : + : : ├--┤ FMenuItem │◄─┤ └────────────────┘ : : + : : : └───────────┘ │ ┌────────────────┐*: : + : : : └──┤ FRadioMenuItem ├-┤ : + : : : └────────────────┘ : : + : : └---------------------------------------┘ : + : └---------------------------------------------------┘ + : *┌────────┐ + └---┤ FPoint │ + : └────────┘ + : *┌───────┐ + └---┤ FRect │ + └───────┘ diff --git a/src/fvterm.cpp b/src/fvterm.cpp index 313c1965..8a8d83cb 100644 --- a/src/fvterm.cpp +++ b/src/fvterm.cpp @@ -19,7 +19,6 @@ bool FVTerm::vterm_updates; int FVTerm::skipped_terminal_update = 0; std::queue* FVTerm::output_buffer = 0; FPoint* FVTerm::term_pos = 0; -FPoint* FVTerm::cursor = 0; FVTerm::term_area* FVTerm::vterm = 0; FVTerm::term_area* FVTerm::vdesktop = 0; FVTerm::term_area* FVTerm::last_area = 0; @@ -66,7 +65,6 @@ void FVTerm::init() vdesktop = 0; last_area = 0; term_pos = new FPoint(-1,-1); - cursor = new FPoint(0,0); output_buffer = new std::queue; // Preset to false @@ -129,9 +127,6 @@ void FVTerm::finish() removeArea (vdesktop); removeArea (vterm); - if ( cursor ) - delete cursor; - if ( term_pos ) delete term_pos; } @@ -192,6 +187,8 @@ void FVTerm::createArea ( int x_offset, int y_offset area->height = -1; area->right_shadow = 0; area->bottom_shadow = 0; + area->cursor_x = 0; + area->cursor_y = 0; area->input_cursor_x = -1; area->input_cursor_y = -1; area->input_cursor_visible = false; @@ -369,15 +366,15 @@ void FVTerm::restoreVTerm (int x, int y, int w, int h) iter = widget->window_list->begin(); end = widget->window_list->end(); - while ( iter != end ) + for (; iter != end; ++iter) { term_area* win = (*iter)->getVWin(); if ( ! win ) - break; + continue; if ( ! win->visible ) - break; + continue; int win_x = win->x_offset; int win_y = win->y_offset; @@ -424,8 +421,6 @@ void FVTerm::restoreVTerm (int x, int y, int w, int h) sc = tmp; } } - - ++iter; } } @@ -469,15 +464,15 @@ FVTerm::covered_state FVTerm::isCovered ( int x, int y iter = w->window_list->begin(); end = w->window_list->end(); - while ( iter != end ) + for (; iter != end; ++iter) { term_area* win = (*iter)->getVWin(); - + if ( ! win ) - break; + continue; if ( ! win->visible ) - break; + continue; int win_x = win->x_offset; int win_y = win->y_offset; @@ -505,8 +500,6 @@ FVTerm::covered_state FVTerm::isCovered ( int x, int y if ( area == win ) found = true; - - ++iter; } } @@ -700,8 +693,8 @@ bool FVTerm::updateVTermCursor (FVTerm::term_area* area) { int cx, cy, ax, ay, x, y; // area offset - ax = area->widget->getTermX() - 1; - ay = area->widget->getTermY() - 1; + ax = area->x_offset; + ay = area->y_offset; // area cursor position cx = area->input_cursor_x; cy = area->input_cursor_y; @@ -829,8 +822,8 @@ void FVTerm::getArea (int x, int y, int w, int h, FVTerm::term_area* area) if ( ! area ) return; - dx = x - area->widget->getTermX(); - dy = y - area->widget->getTermY(); + dx = x - area->x_offset + 1; + dy = y - area->y_offset + 1; if ( x < 0 || y < 0 ) return; @@ -990,6 +983,7 @@ void FVTerm::putArea (int ax, int ay, FVTerm::term_area* area) //---------------------------------------------------------------------- void FVTerm::scrollAreaForward (FVTerm::term_area* area) { + // Scrolls the entire area up line down int total_width; int length; int y_max; @@ -1032,6 +1026,7 @@ void FVTerm::scrollAreaForward (FVTerm::term_area* area) //---------------------------------------------------------------------- void FVTerm::scrollAreaReverse (FVTerm::term_area* area) { + // Scrolls the entire area one line down int total_width; int length; FOptiAttr::char_data nc; // next character @@ -1072,11 +1067,12 @@ void FVTerm::scrollAreaReverse (FVTerm::term_area* area) //---------------------------------------------------------------------- void FVTerm::clearArea (FVTerm::term_area* area) { + // clear the area with the current attributes FOptiAttr::char_data nc; // next character int total_width; uInt w; - // clear with the current attributes and space characters + // current attributes with a space character std::memcpy (&nc, &next_attribute, sizeof(FOptiAttr::char_data)); nc.code = ' '; @@ -1142,6 +1138,7 @@ FOptiAttr::char_data FVTerm::getCharacter ( character_type type , const FPoint& pos , FVTerm* obj ) { + // Gets the overlapped or the covered character for a given position return getCharacter (type, pos.getX(), pos.getY(), obj); } @@ -1151,8 +1148,8 @@ FOptiAttr::char_data FVTerm::getCharacter ( character_type char_type , int y , FVTerm* obj ) { - // get the overlapped or the covered character for a position - int xx,yy; + // Gets the overlapped or the covered character for the position (x,y) + int xx, yy; FOptiAttr::char_data* cc; // covered character FOptiAttr::char_data s_ch; // shadow character FOptiAttr::char_data i_ch; // inherit background character @@ -1186,7 +1183,7 @@ FOptiAttr::char_data FVTerm::getCharacter ( character_type char_type iter = w->window_list->begin(); end = w->window_list->end(); - while ( iter != end ) + for (; iter != end; ++iter) { bool significant_char; @@ -1202,10 +1199,10 @@ FOptiAttr::char_data FVTerm::getCharacter ( character_type char_type term_area* win = (*iter)->getVWin(); if ( ! win ) - break; + continue; if ( ! win->visible ) - break; + continue; int win_x = win->x_offset; int win_y = win->y_offset; @@ -1248,27 +1245,35 @@ FOptiAttr::char_data FVTerm::getCharacter ( character_type char_type } else if ( char_type == covered_character ) break; - - ++iter; } } return *cc; } +//---------------------------------------------------------------------- +FOptiAttr::char_data FVTerm::getCoveredCharacter ( const FPoint& pos + , FVTerm* obj ) +{ + // Gets the covered character for a given position + return getCharacter (covered_character, pos.getX(), pos.getY(), obj); +} + //---------------------------------------------------------------------- FOptiAttr::char_data FVTerm::getCoveredCharacter ( int x , int y , FVTerm* obj) { + // Gets the covered character for the position (x,y) return getCharacter (covered_character, x, y, obj); } //---------------------------------------------------------------------- -FOptiAttr::char_data FVTerm::getCoveredCharacter ( const FPoint& pos - , FVTerm* obj ) +FOptiAttr::char_data FVTerm::getOverlappedCharacter ( const FPoint& pos + , FVTerm* obj ) { - return getCharacter (covered_character, pos.getX(), pos.getY(), obj); + // Gets the overlapped character for a given position + return getCharacter (overlapped_character, pos.getX(), pos.getY(), obj); } //---------------------------------------------------------------------- @@ -1276,32 +1281,28 @@ FOptiAttr::char_data FVTerm::getOverlappedCharacter ( int x , int y , FVTerm* obj) { + // Gets the overlapped character for the position (x,y) return getCharacter (overlapped_character, x, y, obj); } -//---------------------------------------------------------------------- -FOptiAttr::char_data FVTerm::getOverlappedCharacter ( const FPoint& pos - , FVTerm* obj ) -{ - return getCharacter (overlapped_character, pos.getX(), pos.getY(), obj); -} - //---------------------------------------------------------------------- void FVTerm::startTerminalUpdate() { + // Pauses the terminal updates for the printing phase terminal_update_complete = false; } //---------------------------------------------------------------------- void FVTerm::finishTerminalUpdate() { + // After the printing phase is completed, the terminal will be updated terminal_update_complete = true; } //---------------------------------------------------------------------- void FVTerm::setTermXY (register int x, register int y) { - // sets the hardware cursor to the given (x,y) position + // Sets the hardware cursor to the given (x,y) position int term_x, term_y, term_width, term_height; char* move_str; @@ -1338,6 +1339,7 @@ void FVTerm::setTermXY (register int x, register int y) //---------------------------------------------------------------------- bool FVTerm::hideCursor (bool on) { + // Hides or shows the input cursor on the terminal if ( on == hidden_cursor ) return hidden_cursor; @@ -1420,6 +1422,7 @@ void FVTerm::updateTerminal (bool on) //---------------------------------------------------------------------- void FVTerm::updateTerminal() { + // Updates pending changes to the terminal term_area* vt; int term_width, term_height; @@ -1501,7 +1504,7 @@ void FVTerm::updateTerminal() //---------------------------------------------------------------------- bool FVTerm::updateTerminalCursor() { - // updates the input cursor visibility and the position + // Updates the input cursor visibility and the position if ( vterm && vterm->input_cursor_visible ) { int x = vterm->input_cursor_x; @@ -1523,6 +1526,7 @@ bool FVTerm::updateTerminalCursor() //---------------------------------------------------------------------- void FVTerm::processTerminalUpdate() { + // Retains terminal updates if there are unprocessed inputs const int max_skip = 8; if ( terminal_update_pending ) @@ -1559,9 +1563,27 @@ bool FVTerm::isInsideTerminal (int x, int y) } //---------------------------------------------------------------------- -FPoint* FVTerm::getPrintPos() const +void FVTerm::setPrintCursor (register int x, register int y) { - return cursor; + term_area* win = getPrintArea(); + + if ( win ) + { + win->cursor_x = x - win->x_offset; + win->cursor_y = y - win->y_offset; + } +} + +//---------------------------------------------------------------------- +FPoint FVTerm::getPrintCursor() +{ + term_area* win = getPrintArea(); + + if ( win ) + return FPoint ( win->x_offset + win->cursor_x + , win->y_offset + win->cursor_y ); + + return FPoint(0,0); } //---------------------------------------------------------------------- @@ -1707,9 +1729,7 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) { while ( *p ) { - int x_offset, y_offset, width, height, rsh, bsh; - x_offset = area->x_offset; - y_offset = area->y_offset; + int width, height, rsh, bsh; width = area->width; height = area->height; rsh = area->right_shadow; @@ -1718,22 +1738,22 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) switch ( *p ) { case '\n': - cursor->y_ref()++; + area->cursor_y++; case '\r': - cursor->x_ref() = 1; + area->cursor_x = 1; break; case '\t': - cursor->x_ref() = short ( uInt(cursor->x_ref()) - + tabstop - - uInt(cursor->x_ref()) - + 1 - % tabstop ); + area->cursor_x = short ( uInt(area->cursor_x) + + tabstop + - uInt(area->cursor_x) + + 1 + % tabstop ); break; case '\b': - cursor->x_ref()--; + area->cursor_x--; break; case '\a': @@ -1742,8 +1762,8 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) default: { - short x = short(cursor->getX() - 1); - short y = short(cursor->getY() - 1); + int ax = area->cursor_x - 1; + int ay = area->cursor_y - 1; FOptiAttr::char_data nc; // next character nc.code = *p; @@ -1766,9 +1786,6 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) nc.trans_shadow = next_attribute.trans_shadow; nc.inherit_bg = next_attribute.inherit_bg; - int ax = x - x_offset; - int ay = y - y_offset; - if ( area && ax >= 0 && ay >= 0 && ax < area->width + area->right_shadow @@ -1806,19 +1823,19 @@ int FVTerm::print (FVTerm::term_area* area, FString& s) } } - cursor->x_ref()++; + area->cursor_x++; } } - if ( cursor->x_ref() > x_offset + width + rsh ) + if ( area->cursor_x > width + rsh ) { - cursor->x_ref() = short(x_offset + 1); - cursor->y_ref()++; + area->cursor_x = 1; + area->cursor_y++; } - if ( cursor->y_ref() > y_offset + height + bsh ) + if ( area->cursor_y > height + bsh ) { - cursor->y_ref()--; + area->cursor_y--; break; } @@ -1852,18 +1869,17 @@ int FVTerm::print (register int c) int FVTerm::print (FVTerm::term_area* area, register int c) { FOptiAttr::char_data nc; // next character - int x_offset, y_offset, width, height, rsh, bsh, ax, ay; - short x, y; + int width, height, rsh, bsh, ax, ay; if ( ! area ) return -1; - x_offset = area->x_offset; - y_offset = area->y_offset; width = area->width; height = area->height; rsh = area->right_shadow; bsh = area->bottom_shadow; + ax = area->cursor_x - 1; + ay = area->cursor_y - 1; nc.code = c; nc.fg_color = next_attribute.fg_color; @@ -1885,11 +1901,6 @@ int FVTerm::print (FVTerm::term_area* area, register int c) nc.trans_shadow = next_attribute.trans_shadow; nc.inherit_bg = next_attribute.inherit_bg; - x = short(cursor->getX() - 1); - y = short(cursor->getY() - 1); - ax = x - x_offset; - ay = y - y_offset; - if ( ax >= 0 && ay >= 0 && ax < area->width + area->right_shadow && ay < area->height + area->bottom_shadow ) @@ -1927,17 +1938,17 @@ int FVTerm::print (FVTerm::term_area* area, register int c) } } - cursor->x_ref()++; + area->cursor_x++; - if ( cursor->x_ref() > x_offset + width + rsh ) + if ( area->cursor_x > width + rsh ) { - cursor->x_ref() = short(x_offset + 1); - cursor->y_ref()++; + area->cursor_x = 1; + area->cursor_y++; } - if ( cursor->y_ref() > y_offset + height + bsh ) + if ( area->cursor_y > height + bsh ) { - cursor->y_ref()--; + area->cursor_y--; updateVTerm (area); return -1; } diff --git a/src/fvterm.h b/src/fvterm.h index 6634e680..b8fb6f3b 100644 --- a/src/fvterm.h +++ b/src/fvterm.h @@ -50,7 +50,6 @@ class FVTerm : public FObject, public FTerm static FOptiAttr::char_data term_attribute; static FOptiAttr::char_data next_attribute; static FPoint* term_pos; // terminal cursor position - static FPoint* cursor; // virtual print cursor static FTermcap::tcap_map* tcap; static bool hidden_cursor; @@ -90,6 +89,8 @@ class FVTerm : public FObject, public FTerm int height; int right_shadow; int bottom_shadow; + int cursor_x; + int cursor_y; int input_cursor_x; int input_cursor_y; int input_cursor_visible; @@ -182,7 +183,8 @@ class FVTerm : public FObject, public FTerm void setPrintCursor (const FPoint&); void setPrintCursor (register int, register int); - FPoint* getPrintPos() const; + FPoint getPrintCursor(); + int printf (const wchar_t*, ...); int printf (const char*, ...) #if defined(__clang__) @@ -336,10 +338,6 @@ inline FVTerm::term_area* FVTerm::getVWin() const inline void FVTerm::setPrintCursor (const FPoint& pos) { setPrintCursor (pos.getX(), pos.getY()); } -//---------------------------------------------------------------------- -inline void FVTerm::setPrintCursor (register int x, register int y) -{ cursor->setPoint(x,y); } - //---------------------------------------------------------------------- inline void FVTerm::setColor (register short fg, register short bg) { diff --git a/src/fwidget.cpp b/src/fwidget.cpp index 11795002..3e8deafd 100644 --- a/src/fwidget.cpp +++ b/src/fwidget.cpp @@ -1867,6 +1867,7 @@ void FWidget::move (int dx, int dy) //---------------------------------------------------------------------- bool FWidget::setCursorPos (register int x, register int y) { + // sets the input cursor position widget_cursor_position.setPoint(x,y); if ( (flags & fc::focus) != 0 && ! isWindowWidget() ) @@ -1892,18 +1893,19 @@ bool FWidget::setCursorPos (register int x, register int y) //---------------------------------------------------------------------- void FWidget::setPrintPos (register int x, register int y) { - setPrintCursor ( offset.getX1() + adjust_wsize.getX() - 1 + x, - offset.getY1() + adjust_wsize.getY() - 1 + y ); + setPrintCursor ( offset.getX1() + getX() + x - 1, + offset.getY1() + getY() + y - 1 ); } //---------------------------------------------------------------------- -FPoint FWidget::getPrintPos() const +FPoint FWidget::getPrintPos() { - const FPoint* cur = FVTerm::getPrintPos(); - int cx = cur->getX(); - int cy = cur->getY(); - return FPoint ( cx - offset.getX1() - adjust_wsize.getX() + 1 - , cy - offset.getY1() - adjust_wsize.getY() + 1 ); + const FPoint cur = getPrintCursor(); + int cx = cur.getX(); + int cy = cur.getY(); + return FPoint ( cx - offset.getX1() - getX() + 1 + , cy - offset.getY1() - getY() + 1 ); + } //---------------------------------------------------------------------- diff --git a/src/fwidget.h b/src/fwidget.h index 02a513ea..7b5c65b8 100644 --- a/src/fwidget.h +++ b/src/fwidget.h @@ -508,7 +508,7 @@ class FWidget : public FVTerm void setPrintPos (const FPoint&); void setPrintPos (register int, register int); - FPoint getPrintPos() const; + FPoint getPrintPos(); void drawShadow(); void clearShadow();