46 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) 47 #error "Only <final/final.h> can be included directly." 61 #include "final/output/tty/fterm_functions.h" 62 #include "final/util/fdata.h" 63 #include "final/util/fpoint.h" 64 #include "final/util/frect.h" 65 #include "final/util/fsize.h" 66 #include "final/util/fstringstream.h" 67 #include "final/vterm/fvtermattribute.h" 68 #include "final/vterm/fvtermbuffer.h" 70 #define F_PREPROC_HANDLER(i,h) \ 71 reinterpret_cast<FVTerm*>((i)), \ 72 std::bind ( reinterpret_cast<FVTerm::FPreprocessingHandler>((h)) \ 73 , reinterpret_cast<FVTerm*>((i)) ) 87 template <
typename FOutputType>
90 using type = std::remove_cv_t<FOutputType>;
104 using FVTermAttribute::print;
105 using FCharVector = std::vector<FChar>;
106 using FPreprocessingHandler = void (
FVTerm::*)();
107 using FPreprocessingFunction = std::function<void()>;
108 using FPreprocVector = std::vector<std::unique_ptr<FVTermPreprocessing>>;
109 using FVTermList = std::vector<FVTerm*>;
110 using FTermRegionList = std::vector<const FTermRegion*>;
113 enum class TerminalUpdate : uInt8
129 template <
typename FOutputType>
136 auto operator = (
FVTerm&&) noexcept ->
FVTerm& =
delete;
142 template <
typename NumT
143 , enable_if_arithmetic_without_char_t<NumT> =
nullptr>
144 auto operator << (
const NumT&) noexcept ->
FVTerm&;
146 template <
typename CharT
147 , enable_if_CString_t<CharT> =
nullptr>
148 auto operator << (
const CharT&) noexcept ->
FVTerm&;
149 auto operator << (
char) noexcept ->
FVTerm&;
150 auto operator << (
wchar_t) noexcept ->
FVTerm&;
151 auto operator << (
const wchar_t*) noexcept ->
FVTerm&;
152 auto operator << (
const UniChar&) noexcept ->
FVTerm&;
153 auto operator << (
const std::string&) noexcept ->
FVTerm&;
154 auto operator << (
const std::wstring&) noexcept ->
FVTerm&;
158 auto operator << (
const FChar&) noexcept ->
FVTerm&;
159 auto operator << (
const FCharVector&) noexcept ->
FVTerm&;
165 auto getClassName()
const ->
FString override;
166 static auto getFOutput() -> std::shared_ptr<FOutput>;
168 auto getVWin()
const noexcept ->
const FTermRegion*;
169 auto getPrintCursor() ->
FPoint;
170 static auto getWindowList() noexcept -> FVTermList*;
173 void setTerminalUpdates (TerminalUpdate)
const;
174 void setCursor (
const FPoint&) noexcept;
175 void setVWin (std::unique_ptr<FTermRegion>&&) noexcept;
176 static void setNonBlockingRead (
bool =
true);
177 static void unsetNonBlockingRead();
180 static auto isDrawingFinished() noexcept -> bool;
181 static auto isTerminalUpdateForced() noexcept -> bool;
182 static auto areTerminalUpdatesPaused() noexcept -> bool;
183 static auto hasPendingTerminalUpdates() noexcept -> bool;
184 auto hasPreprocessingHandler (
const FVTerm*) noexcept -> bool;
187 virtual void clearRegion (
wchar_t = L
' ');
188 void createVDesktop (
const FSize& size) noexcept;
189 void createVTerm (
const FSize&) noexcept;
190 void resizeVTerm (
const FSize&)
const noexcept;
191 void putVTerm()
const;
192 auto updateTerminal()
const -> bool;
193 static void reduceTerminalLineUpdates (uInt);
194 virtual void addPreprocessingHandler (
const FVTerm*
195 , FPreprocessingFunction&& );
196 virtual void delPreprocessingHandler (
const FVTerm*);
197 template <
typename... Args>
198 auto printf (
const FString&, Args&&...) -> int;
199 auto print (
const FString&) noexcept -> int;
201 auto print (
const std::vector<FChar>&) noexcept -> int;
202 auto print (
FTermRegion*,
const std::vector<FChar>&) noexcept -> int;
207 auto print (
wchar_t) noexcept -> int;
208 auto print (
FTermRegion*,
wchar_t) noexcept -> int;
209 auto print (
const FChar&) noexcept -> int;
211 virtual void print (
const FPoint&);
212 auto print() noexcept ->
FVTerm&;
217 using FChar_iterator = std::vector<FChar>::iterator;
218 using FChar_const_iterator = std::vector<FChar>::const_iterator;
228 auto getChildPrintRegion()
const noexcept ->
FTermRegion*;
229 auto getCurrentPrintRegion()
const noexcept ->
FTermRegion*;
230 auto getVirtualDesktop()
const noexcept ->
FTermRegion*;
231 auto getVirtualTerminal()
const noexcept ->
FTermRegion*;
236 void setActiveRegion (
FTermRegion*)
const noexcept;
239 auto isActive (
const FTermRegion*)
const noexcept -> bool;
240 auto hasPrintRegion()
const noexcept -> bool;
241 auto hasChildPrintRegion()
const noexcept -> bool;
242 auto isVirtualWindow()
const noexcept -> bool;
243 auto isCursorHideable()
const noexcept -> bool;
246 auto createRegion (
const FShadowBox&) -> std::unique_ptr<FTermRegion>;
247 auto createRegion (
const FRect&) -> std::unique_ptr<FTermRegion>;
250 void restoreVTerm (
const FRect&)
const noexcept;
251 auto updateVTermCursor (
const FTermRegion*)
const noexcept -> bool;
252 void hideVTermCursor()
const noexcept;
259 static auto getLayer (
FVTerm&) noexcept -> int;
260 static void determineWindowLayers() noexcept;
263 void clearRegion (
FTermRegion*,
wchar_t = L
' ') noexcept;
264 void forceTerminalUpdate()
const;
265 auto processTerminalUpdate()
const -> bool;
266 static void startDrawing() noexcept;
267 static void finishDrawing() noexcept;
268 virtual void initTerminal();
281 int xmax_inside_vterm;
288 FChar_const_iterator iter;
289 std::ptrdiff_t offset;
290 std::ptrdiff_t start_idx;
291 std::ptrdiff_t end_idx;
294 enum class NoTrans : sInt8
307 NoTrans has_no_transparency;
311 static constexpr
int DEFAULT_MINIMIZED_HEIGHT = 1;
314 enum class CoveredState : uInt8
321 enum class SearchState : uInt8
331 using FOverlaySearchBuffer = std::vector<SearchState>;
332 using FOverlayLineBuffer = std::vector<RegionLine>;
333 using FLineChangesBatch = std::vector<LineChanges>;
336 static void setGlobalFVTermInstance (
FVTerm*) noexcept;
337 static auto getGlobalFVTermInstance() noexcept ->
FVTerm*&;
338 static auto isInitialized() noexcept -> bool;
339 void resetRegionEncoding()
const;
341 auto resizeTextRegion (
FTermRegion*, std::size_t, std::size_t )
const -> bool;
342 auto resizeTextRegion (
FTermRegion*, std::size_t)
const -> bool;
343 auto isCovered (
const FPoint&,
const FTermRegion*)
const noexcept -> CoveredState;
344 auto isRegionValid (
const FShadowBox&)
const noexcept -> bool;
346 constexpr
auto needsHeightResize (
const FTermRegion*,
const std::size_t)
const noexcept -> bool;
347 constexpr
auto needsWidthResize (
const FTermRegion*,
const std::size_t)
const noexcept -> bool;
348 auto tryResizeRegion (
FTermRegion*,
const std::size_t,
const std::size_t)
const -> bool;
350 constexpr
auto getFullRegionWidth (
const FTermRegion*)
const noexcept -> int;
351 constexpr
auto getFullRegionHeight (
const FTermRegion*)
const noexcept -> int;
352 void passChangesToOverlap (
const FTermRegion*)
const;
353 void processOverlappingWindows (
const FTermRegion*,
const FVTermList&)
const;
356 auto calculateStartCoordinate (
int,
int)
const noexcept -> int;
357 auto calculateEndCoordinate (
int,
int,
int,
int)
const noexcept -> int;
358 void updateVTerm()
const;
359 void updateVTermDesktop()
const;
361 auto computeLayerGeometry (
const FTermRegion*)
const noexcept -> LayerGeometry;
362 auto isLayerOutsideVTerm (
const LayerGeometry&)
const noexcept -> bool;
363 void buildLineChangeBatch (
const FTermRegion*,
const LayerGeometry&)
const noexcept;
364 void applyLineBatch (
FTermRegion*,
const LayerGeometry&)
const noexcept;
365 void updateVTermChangesFromBatch (
const LayerGeometry&)
const noexcept;
366 void scrollTerminalForward()
const;
367 void scrollTerminalReverse()
const;
368 void callPreprocessingHandler (
const FTermRegion*)
const;
369 auto hasChildRegionChanges (
const FTermRegion*)
const -> bool;
370 void clearChildRegionChanges (
const FTermRegion*)
const;
371 static constexpr
auto isInsideRegion (
const FPoint&,
const FTermRegion*) noexcept -> bool;
372 auto isInsideTerminal (
const FPoint&)
const noexcept -> bool;
373 static constexpr
auto isFCharTransparent (
const FChar&) noexcept -> bool;
374 auto isTransparentInvisible (
const FChar&)
const noexcept -> bool;
375 template <
typename FOutputType>
377 void initFromGlobalInstance();
380 void saveCurrentVTerm()
const noexcept;
381 void putRegionLine (
const FChar&,
FChar&,
const int)
const noexcept;
382 void applyColorOverlay (
const FChar&,
FChar&)
const;
383 void inheritBackground (
const FChar&,
FChar&)
const;
384 void putMultiLayerRegionLine (FChar_iterator,
const int,
const FPoint&)
const noexcept;
385 void putRegionLineWithTransparency (FChar_const_iterator, FChar_iterator,
const int,
FPoint,
bool)
const;
386 void addRegionLineWithTransparency (FChar_const_iterator, FChar_iterator,
const int)
const;
387 void addTransparentRegionLine (
const FChar_const_iterator&,
const FChar_iterator&,
const int)
const;
388 void addTransparentRegionChar (
const FChar&,
FChar&)
const;
391 auto printWrap (
FTermRegion*, FChar_iterator&)
const -> bool;
392 auto interpretControlCodes (
FTermRegion*, FChar_iterator&,
const FChar&)
const noexcept -> bool;
393 auto printCharacter (
FTermRegion*, FChar_iterator&,
const FChar&)
const noexcept -> int;
395 ,
const FChar_iterator&
396 ,
const FChar&)
const noexcept -> std::size_t;
398 void putNonTransparent (FChar_const_iterator, FChar_iterator&,
int&)
const;
399 void addTransparent (FChar_const_iterator, FChar_iterator&,
int&)
const;
400 void addVDesktopToListIfExists (FTermRegionList&)
const;
404 auto canUpdateTerminalNow()
const -> bool;
405 static auto hasPendingUpdates (
const FTermRegion*) noexcept -> bool;
411 mutable FLineChangesBatch line_changes_batch{};
412 mutable FOverlayLineBuffer overlay_line_buffer{};
413 mutable FOverlaySearchBuffer overlay_search_buffer{};
414 mutable FTermRegionList covered_regions_buffer{};
415 mutable std::mutex line_changes_batch_mutex{};
416 mutable std::mutex buffer_mutex{};
418 std::unique_ptr<FTermRegion> vwin{};
419 std::shared_ptr<FOutput> foutput{};
420 std::shared_ptr<FVTermList> vterm_window_list{};
421 std::shared_ptr<FTermRegion> vterm{};
422 std::shared_ptr<FTermRegion> vterm_old{};
423 std::shared_ptr<FTermRegion> vdesktop{};
426 static bool draw_completed;
427 static bool skip_one_vterm_update;
428 static bool no_terminal_updates;
429 static bool force_terminal_update;
433 friend auto getColumnWidth (
const wchar_t wchar) -> std::size_t;
458 using FDataAccessPtr = std::shared_ptr<FDataAccess>;
459 using FLineChangesVec = std::vector<FLineChanges>;
460 using FCharVec = std::vector<FChar>;
461 using FChar_reference = FCharVec::reference;
462 using FChar_const_reference = FCharVec::const_reference;
463 using FChar_iterator = FCharVec::iterator;
464 using FChar_const_iterator = FCharVec::const_iterator;
478 template <
typename T>
479 inline auto getOwner()
const -> clean_fdata_t<T>&
484 template <
typename T>
485 inline void setOwner (T&& obj)
487 owner = makeFData(std::forward<T>(obj));
490 inline auto hasOwner()
const ->
bool 492 return owner.get() !=
nullptr;
495 constexpr
auto contains (
int,
int)
const noexcept -> bool;
497 constexpr
auto contains (
const FPoint& pos)
const noexcept ->
bool 499 return contains(pos.getX(), pos.getY());
502 constexpr
auto isOverlapped (
const FRect&)
const noexcept -> bool;
503 constexpr
auto isOverlapped (
const FTermRegion*)
const noexcept -> bool;
504 constexpr
auto isPrintPositionInsideRegion()
const noexcept -> bool;
505 auto reprint (
const FRect&,
const FSize&) noexcept -> bool;
507 inline auto getFChar (
int x,
int y)
const noexcept -> FChar_const_reference
509 return data[unsigned(y) * unsigned(size.width + shadow.width) + unsigned(x)];
512 inline auto getFChar (
int x,
int y) noexcept -> FChar_reference
514 return data[unsigned(y) * unsigned(size.width + shadow.width) + unsigned(x)];
517 inline auto getFChar (
const FPoint& pos)
const noexcept -> FChar_const_reference
519 return getFChar(pos.getX(), pos.getY());
522 inline auto getFChar (
const FPoint& pos) noexcept -> FChar_reference
524 return getFChar(pos.getX(), pos.getY());
527 inline auto getFCharIterator (
int x,
int y)
const noexcept -> FChar_const_iterator
529 return data.cbegin() + (unsigned(y) * unsigned(size.width + shadow.width) + unsigned(x));
532 inline auto getFCharIterator (
int x,
int y) noexcept -> FChar_iterator
534 return data.begin() + (unsigned(y) * unsigned(size.width + shadow.width) + unsigned(x));
537 constexpr
void setCursorPos (
int x,
int y) noexcept
543 constexpr
void setInputCursorPos (
int x,
int y) noexcept
549 template <
typename T>
550 inline auto print (T&& term_data) ->
int 553 return getOwner<FVTerm*>()->print (
this, std::forward<T>(term_data));
558 void updateRegionChanges (uInt, uInt, uInt8) noexcept;
580 Encoding encoding{Encoding::Unknown};
581 bool input_cursor_visible{
false};
582 bool has_changes{
false};
584 bool minimized{
false};
585 FDataAccessPtr owner{
nullptr};
586 FPreprocVector preproc_list{};
588 FLineChangesVec changes_in_line{};
593 constexpr
auto FVTerm::FTermRegion::contains (
int x,
int y)
const noexcept ->
bool 597 const int current_height = minimized ? min_size.height
598 : size.height + shadow.height;
599 const int x_min = position.x;
600 const int x_max = x_min + size.width + shadow.width;
601 const int y_min = position.y;
602 const int y_max = y_min + current_height;
610 constexpr
auto FVTerm::FTermRegion::isOverlapped (
const FRect& box)
const noexcept ->
bool 612 const int x1 = position.x;
613 const int x2 = x1 + size.width + shadow.width;
615 if ( x2 < box.getX1() || x1 >= box.getX2() )
618 const int y1 = position.y;
619 const int height = minimized ? min_size.height
620 : size.height + shadow.height;
621 const int y2 = y1 + height;
622 return ! ( y2 < box.getY1() || y1 >= box.getY2() );
626 constexpr
auto FVTerm::FTermRegion::isOverlapped (
const FTermRegion* region)
const noexcept ->
bool 628 const int region_x1 = region->position.x;
629 const int region_x2 = region_x1 + region->size.width + region->shadow.width;
630 const int x1 = position.x;
631 const int x2 = x1 + size.width + shadow.width;
633 if ( x2 <= region_x1 || x1 >= region_x2 )
636 const int region_height = region->minimized ? region->min_size.height
637 : region->size.height + region->shadow.height;
638 const int region_y1 = region->position.y;
639 const int region_y2 = region_y1 + region_height;
640 const int height = minimized ? min_size.height
641 : size.height + shadow.height;
642 const int y1 = position.y;
643 const int y2 = y1 + height;
644 return ! ( y2 <= region_y1 || y1 >= region_y2 );
648 constexpr
auto FVTerm::FTermRegion::isPrintPositionInsideRegion()
const noexcept ->
bool 652 && cursor.x <= size.width + shadow.width
653 && cursor.y <= size.height + shadow.height;
657 inline auto FVTerm::FTermRegion::reprint (
const FRect& box
658 ,
const FSize& term_size ) noexcept ->
bool 660 if ( ! isOverlapped(box) )
664 const auto box_x1 = int(static_cast<unsigned int>(box.getX1()) - 1);
665 const auto box_y1 = int(static_cast<unsigned int>(box.getY1()) - 1);
666 const auto box_x2 = int(static_cast<unsigned int>(box.getX2()) - 1);
667 const auto box_y2 = int(static_cast<unsigned int>(box.getY2()) - 1);
669 if ( box_x1 > box_x2 || box_y1 > box_y2 )
675 const int term_w = int(term_size.getWidth()) - 1;
676 const int term_h = int(term_size.getHeight()) - 1;
677 const int self_h = minimized ? min_size.height
678 : size.height + shadow.height;
679 const int self_w = size.width + shadow.width;
680 const int self_x1 = position.x;
681 const int self_y1 = position.y;
682 const int self_x2 = self_x1 + self_w - 1;
683 const int self_y2 = self_y1 + self_h - 1;
686 const int y_start = std::max(std::max(0, box_y1), self_y1) - self_y1;
687 const int y_end = std::min(std::min(term_h, box_y2), self_y2) - self_y1;
690 const int x_start = std::max(std::max(0, box_x1), self_x1) - self_x1;
691 const int x_end = std::min(std::min(term_w, box_x2), self_x2) - self_x1;
693 if ( y_end < y_start || x_end < x_start )
696 auto first_row = unsigned(y_start);
697 auto last_row = unsigned(std::max(0, y_end));
698 auto line_changes = changes_in_line.begin() + first_row;
699 const auto line_changes_end = changes_in_line.cbegin() + last_row;
701 while ( line_changes <= line_changes_end )
703 line_changes->xmin = std::min(line_changes->xmin, uInt(x_start));
704 line_changes->xmax = std::max(line_changes->xmax, uInt(x_end));
708 changes_in_row.ymin = std::min(changes_in_row.ymin, first_row);
709 changes_in_row.ymax = std::max(changes_in_row.ymax, last_row);
714 inline void FVTerm::FTermRegion::updateRegionChanges ( uInt x, uInt y
715 , uInt8 char_width ) noexcept
717 auto& line_changes = changes_in_line[y];
718 const uInt x_end = x + uInt( char_width >> 1 );
720 line_changes.xmin = std::min(line_changes.xmin, x);
721 line_changes.xmax = std::max(line_changes.xmax, x_end);
723 changes_in_row.ymin = std::min(changes_in_row.ymin, y);
724 changes_in_row.ymax = std::max(changes_in_row.ymax, y);
733 void operator () (
const FVTerm*)
const noexcept
743 : instance(std::unique_ptr<const FVTerm, D>(i))
744 ,
function(std::move(f))
753 std::unique_ptr<const FVTerm, D> instance{};
754 FPreprocessingFunction
function{};
760 template <
typename FOutputType>
763 init<typename outputClass<FOutputType>::type>();
767 template <
typename NumT
768 , enable_if_arithmetic_without_char_t<NumT>>
769 inline auto FVTerm::operator << (
const NumT& n) noexcept ->
FVTerm&
771 print (
FString(std::to_string(n)));
776 template <
typename CharT
777 , enable_if_CString_t<CharT>>
778 inline auto FVTerm::operator << (
const CharT& s) noexcept ->
FVTerm&
785 inline auto FVTerm::operator << (
char c) noexcept ->
FVTerm&
787 print (
wchar_t(uChar(c)));
792 inline auto FVTerm::operator << (
wchar_t c) noexcept ->
FVTerm&
799 inline auto FVTerm::operator << (
const wchar_t* wide_string) noexcept ->
FVTerm&
806 inline auto FVTerm::operator << (
const UniChar& c) noexcept ->
FVTerm&
808 print (static_cast<wchar_t>(c));
813 inline auto FVTerm::operator << (
const std::string&
string) noexcept ->
FVTerm&
820 inline auto FVTerm::operator << (
const std::wstring& wide_string) noexcept ->
FVTerm&
827 inline auto FVTerm::operator << (
const FString& fstring) noexcept ->
FVTerm&
834 inline auto FVTerm::operator << (
const FChar& fchar) noexcept ->
FVTerm&
841 inline auto FVTerm::operator << (
const FCharVector& term_string) noexcept ->
FVTerm&
848 inline auto FVTerm::operator << (
const FPoint& pos) noexcept ->
FVTerm&
855 inline auto FVTerm::operator << (
const FStyle& t_style) noexcept ->
FVTerm&
862 inline auto FVTerm::operator << (
const FColorPair& pair) noexcept ->
FVTerm&
869 inline auto FVTerm::getClassName()
const ->
FString 873 inline auto FVTerm::getVWin() noexcept ->
FTermRegion*
874 {
return vwin.get(); }
877 inline auto FVTerm::getVWin()
const noexcept ->
const FTermRegion*
878 {
return vwin.get(); }
881 inline auto FVTerm::getWindowList() noexcept -> FVTermList*
883 static const auto& init_object = getGlobalFVTermInstance();
884 return ( isInitialized() && init_object->vterm_window_list )
885 ? init_object->vterm_window_list.get()
890 inline void FVTerm::setVWin (std::unique_ptr<FTermRegion>&& region) noexcept
891 { vwin = std::move(region); }
894 inline void FVTerm::unsetNonBlockingRead()
895 { setNonBlockingRead(
false); }
898 inline auto FVTerm::isDrawingFinished() noexcept ->
bool 899 {
return draw_completed; }
902 inline auto FVTerm::isTerminalUpdateForced() noexcept ->
bool 903 {
return force_terminal_update; }
906 inline auto FVTerm::areTerminalUpdatesPaused() noexcept ->
bool 907 {
return no_terminal_updates; }
910 inline auto FVTerm::hasPendingTerminalUpdates() noexcept ->
bool 911 {
return hasPendingUpdates(getGlobalFVTermInstance()->vterm.get()); }
914 template <
typename... Args>
915 auto FVTerm::printf (
const FString& format, Args&&... args) ->
int 918 str.sprintf (format, std::forward<Args>(args)...);
923 inline auto FVTerm::print() noexcept ->
FVTerm&
927 inline void FVTerm::print (
const FPoint& p)
933 inline auto FVTerm::getChildPrintRegion()
const noexcept ->
FTermRegion*
934 {
return child_print_region; }
937 inline auto FVTerm::getCurrentPrintRegion()
const noexcept ->
FTermRegion*
938 {
return print_region; }
941 inline auto FVTerm::getVirtualDesktop()
const noexcept ->
FTermRegion*
942 {
return vdesktop.get(); }
945 inline auto FVTerm::getVirtualTerminal()
const noexcept ->
FTermRegion*
946 {
return vterm.get(); }
949 inline void FVTerm::setPrintRegion (
FTermRegion* region) noexcept
950 { print_region = region; }
953 inline void FVTerm::setChildPrintRegion (
FTermRegion* region) noexcept
954 { child_print_region = region; }
957 inline void FVTerm::setActiveRegion (
FTermRegion* region)
const noexcept
958 { active_region = region; }
961 inline auto FVTerm::isActive (
const FTermRegion* region)
const noexcept ->
bool 962 {
return region == active_region; }
965 inline auto FVTerm::hasPrintRegion()
const noexcept ->
bool 966 {
return print_region; }
969 inline auto FVTerm::hasChildPrintRegion()
const noexcept ->
bool 970 {
return child_print_region; }
973 inline auto FVTerm::isVirtualWindow()
const noexcept ->
bool 974 {
return vwin.get(); }
977 inline void FVTerm::hideVTermCursor()
const noexcept
978 { vterm->input_cursor_visible =
false; }
981 inline auto FVTerm::getLayer (
FVTerm& obj) noexcept ->
int 984 return obj.FVTerm::getPrintRegion()->layer;
988 template <
typename FOutputType>
989 inline void FVTerm::init()
991 if ( isInitialized() )
993 initFromGlobalInstance();
997 setGlobalFVTermInstance(
this);
998 foutput = std::make_shared<FOutputType>(*this);
999 vterm_window_list = std::make_shared<FVTermList>();
1005 inline void FVTerm::initFromGlobalInstance()
1007 const auto& init_object = getGlobalFVTermInstance();
1009 if ( ! init_object )
1012 foutput = std::shared_ptr<FOutput>(init_object->foutput);
1013 vterm_window_list = std::shared_ptr<FVTermList>(init_object->vterm_window_list);
1014 vterm = std::shared_ptr<FTermRegion>(init_object->vterm);
1015 vterm_old = std::shared_ptr<FTermRegion>(init_object->vterm_old);
1016 vdesktop = std::shared_ptr<FTermRegion>(init_object->vdesktop);
Definition: fvtermbuffer.h:56
Definition: class_template.cpp:25
Definition: ftypes.h:1081
Definition: fcolorpair.h:49
Definition: fvtermattribute.h:86