A text-based widget toolkit
Go to file
Markus Gans d09349c1f9
Some checks failed
Alpine Linux build / build (push) Has been cancelled
ARM build / Build on ${{ matrix.arch }} (aarch64) (push) Has been cancelled
ARM build / Build on ${{ matrix.arch }} (armv6) (push) Has been cancelled
ARM build / Build on ${{ matrix.arch }} (armv7) (push) Has been cancelled
CodeQL analysis / Analyze (cpp) (push) Has been cancelled
Code coverage / analyze (push) Has been cancelled
Coverity Scan / analyze (push) Has been cancelled
Cygwin build / Build on ${{ matrix.platform }} (x86) (push) Has been cancelled
Cygwin build / Build on ${{ matrix.platform }} (x86_64) (push) Has been cancelled
FreeBSD build / build (push) Has been cancelled
macOS build / build (push) Has been cancelled
NetBSD build / build (push) Has been cancelled
OpenBSD build / build (push) Has been cancelled
sigrid-publish / sigridci (push) Has been cancelled
Solaris build / build (push) Has been cancelled
SonarCloud analysis / build (push) Has been cancelled
FINAL CUT icon update
2024-09-27 21:49:20 +02:00
.github Fixed use of TIOCSTI on Linux 6.2 or higher 2024-09-26 21:26:14 +02:00
doc Change the widget color theme for non-focused list item 2024-09-21 19:28:09 +02:00
examples FINAL CUT icon update 2024-09-27 21:49:20 +02:00
final pthread linking fixed 2024-09-25 00:08:50 +02:00
misc FINAL CUT icon update 2024-09-27 21:49:20 +02:00
scripts Reduce the complexity of some methods 2023-11-18 21:20:27 +01:00
test FINAL CUT icon update 2024-09-27 21:49:20 +02:00
.codacy.yml Remove package build files from the repository 2021-10-10 20:11:52 +02:00
.codedocs Switched to the c++ language standard C++14 2021-11-01 02:06:29 +01:00
.editorconfig Add .editorconfig 2020-03-01 15:42:07 +01:00
.gitignore Fixed use of TIOCSTI on Linux 6.2 or higher 2024-09-26 18:41:26 +02:00
AUTHORS upload 2015-05-23 13:35:12 +02:00
autogen.sh Moved FTerm debug access methods to FTermDebugData 2018-11-01 21:29:54 +01:00
build.sh Fixed use of TIOCSTI on Linux 6.2 or higher 2024-09-26 18:41:26 +02:00
ChangeLog Change the widget color theme for non-focused list item 2024-09-21 19:28:09 +02:00
CODE_OF_CONDUCT.md Added Code of Conduct 2021-05-11 23:50:57 +02:00
codecov.yml Added Code of Conduct 2021-05-11 23:50:57 +02:00
configure.ac Added a backend monitor object to the event loop example 2024-09-24 20:45:20 +02:00
Contributing.md change git:// -> https:// 2022-01-11 16:29:28 +01:00
COPYING Avoiding some friend classes 2022-05-29 15:44:26 +02:00
finalcut.pc.in some fixes 2018-12-22 15:33:23 +01:00
LICENSE LICENSE.txt -> LICENSE 2022-05-25 01:18:46 +02:00
Makefile.am LICENSE.txt -> LICENSE 2022-05-25 01:33:01 +02:00
README.md Current development is now version 0.9.2 2024-08-18 12:53:49 +02:00
SECURITY.md Added SECURITY.md 2021-05-15 12:29:58 +02:00
sigrid.yaml Readme update 2022-12-31 03:11:10 +01:00
sonar-project.properties Current development is now version 0.9.2 2024-08-18 12:53:49 +02:00

FINAL CUT

Library for creating terminal applications with text-based widgets

FINAL CUT is a C++ class library and widget toolkit that enables developers to create text-based user interfaces. FINAL CUT is a standalone library that interacts directly with the terminal without relying on external libraries such as ncurses or termbox.

FINAL CUT provides full mouse support, UTF-8 character encoding, full-width character support, and the ability to display combined Unicode characters. The library helps the programmer to create a text console application. It allows handling multiple text windows on the screen.

The design of the C++ class structure of FINAL CUT was inspired by the Qt framework. It provides a variety of common controls, including dialog boxes, push buttons, check boxes, radio buttons, input lines, list boxes, and status bars. With FINAL CUT, developers can create text-based user interfaces that are both functional and visually appealing.

Building and code analysis

Badge
Latest release Latest Release
License LGPL v3
Class Reference documented
ARM build ARM build
FreeBSD build FreeBSD build
NetBSD build NetBSD build
OpenBSD build OpenBSD build
macOS build macOS build
Cygwin build Cygwin build
Solaris build Solaris build
CodeQL analysis CodeQL analysis
Coverity Scan Coverity Scan Status
SonarCloud Quality gate
CodeFactor CodeFactor
SIGRID sigrid-publish

Installation

Before installing FINAL CUT, check if your computer meets the requirements. You can find these in the FAQ section under "What do I need to build this library?".

> git clone https://github.com/gansm/finalcut.git
> cd finalcut
> autoreconf --install --force
> ./configure --prefix=/usr
> make
> su -c "make install"

Supported platforms

If your platform is not listed here, it may still be compatible with FINAL CUT. I welcome any help to make this software available on more platforms.

FINAL CUT currently works on the following platforms:

  • Linux
  • FreeBSD
  • NetBSD
  • OpenBSD
  • macOS
  • Cygwin
  • GNU Hurd
  • Solaris

Documentation

See the first steps documentation for information on how to use the library.

Frequently Asked Questions

For general questions about FINAL CUT, likely the answer is already included in the FAQ.

Screenshots

The FFileDialog widget with incremental file name search:

FFileDialog

The FINAL CUT FProgressbar widget:

FProgressbar

Scrollable text in the FTextView widget:

FTextView

The Mandelbrot set example:

Mandelbrot set

FINAL CUT newfont

A graphical text font for X11 and the Linux console.

ui example in newfont mode

Newfont drive symbols:

drive symbols

The calculator example in newfont mode:

calculator

Benchmark

Here you can find a test for measuring the character speed in the terminal.

Virtual terminal

FINAL CUT uses a virtual terminal to print character via an update method on the screen. It provides (as an overlying layer) virtual windows for the realization of window movements. The update methods only transfer differences to the virtual terminal or physical screen.

 print(...)
printf(...)
  │
  │          ╔════════════════════════[ vterm ]════════════════════════╗
  │          ║createVTerm()                                            ║
  │          ║                                   ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ║
  │          ║                                                         ║
  │          ║                                   │ restoreVTerm(box) │ ║
  │  ┌───────╨────[ vwin ]────────────┐                                ║
  │  │createArea(size)                │          └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ║
  │  │                                │                                ║
  │  │                                │                                ║
  └──┼────────►                putArea(pos,area) ────►                 ║
     │                                │                                ║
     │                   ◄──── getArea(pos,area)                       ║
     │                                │                                ║
     │                                │                                ║
     │                                │                                ║
     │          resizeArea(size, area)│                                ║
     └───────╥────────────────────────┘                                ║
             ║                                                         ║
             ║       │                                resizeVTerm(size)║
             ╚═══════▼═════════════════════════════════════════════════╝
                     │
                     │   putVTerm()
                     └──────────────────► updateTerminalLine(y)
                       updateTerminal()            │
                                                   ▼
                                           ┌───────────────┐
                                           │ output_buffer │
                                           └───────────────┘
                                                   │
                                                   │ flush()
                                                   │
                                                   ▼
                                           ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
                                           ▌               ▐
                                           ▌    screen     ▐
                                           ▌ ───────────── ▐
                                           ▌ real terminal ▐
                                           ▌               ▐
                                           ▀▀▀▀▀▀▀███▀▀▀▀▀▀▀
                                                  ███
                                               ▀▀▀▀▀▀▀▀▀

Class digramm

    ┌────────────┐1
    │ FTermLinux ├------┐
    └────────────┘      :
  ┌──────────────┐1     :
  │ FTermFreeBSD ├------┐
  └──────────────┘      :
  ┌──────────────┐1     :
  │ FTermOpenBSD ├------┐
  └──────────────┘      :
┌────────────────┐1     :
│ FTermDetection ├------┐
└────────────────┘      :
┌────────────────┐1     :
│ FTermcapQuirks ├------┐
└────────────────┘      :            ┌───────────┐
┌────────────────┐1     :       ┌────┤ FKeyEvent │
│ FTermXTerminal ├------┐       │    └───────────┘
└────────────────┘      :       │    ┌─────────────┐
      ┌──────────┐1     :       ├────┤ FMouseEvent │
      │ FTermcap ├------┐       │    └─────────────┘
      └──────────┘      :       │    ┌─────────────┐
      ┌──────────┐1     :       ├────┤ FWheelEvent │
      │ FTermios ├------┐       │    └─────────────┘
      └──────────┘      :       │    ┌─────────────┐
 ┌───────────────┐1     :       ├────┤ FFocusEvent │
 │ FColorPalette ├------┐       │    └─────────────┘
 └───────────────┘      :       │    ┌─────────────┐
     ┌───────────┐1     :       ├────┤ FAccelEvent │
     │ FOptiMove ├------┐       │    └─────────────┘
     └───────────┘      :       │    ┌──────────────┐
     ┌───────────┐1     :       ├────┤ FResizeEvent │
     │ FOptiAttr ├------┐       │    └──────────────┘
     └───────────┘      :       │    ┌────────────┐
     ┌───────────┐1     :       ├────┤ FShowEvent │
     │ FKeyboard ├------┐       │    └────────────┘
     └───────────┘      :       │    ┌────────────┐
 ┌───────────────┐1     :       ├────┤ FHideEvent │
 │ FMouseControl ├------┐       │    └────────────┘
 └───────────────┘      :       │    ┌─────────────┐
       ┌─────────┐1     :       ├────┤ FCloseEvent │
       │ FSystem ├------┐       │    └─────────────┘
       └─────────┘      :       │    ┌─────────────┐
       ┌─────────┐*     :       ├────┤ FTimerEvent │
       │ FString ├---┐  :       │    └─────────────┘
       └─────────┘   :  :       │    ┌────────────┐1    1┌───────┐
 ┌───────────────┐*  :  :       ├────┤ FUserEvent ├------┤ FData │
 │ FStringStream ├---┐  :       │    └────────────┘      └───────┘
 └───────────────┘   :  :       │        ┌──────┐   ┌─────────┐
        ┌────────┐*  :  :       │        │ FLog │◄──┤ FLogger │
        │ FPoint ├---┐  :       │        └──┬───┘   └─────────┘
        └────────┘   :  :       │           :1
         ┌───────┐*  :  :       │        ┌──┴───────────┐
         │ FRect ├---┐  :       │   ┌────┤ FApplication │
         └───────┘   :  :       │   │    └──────────────┘
         ┌───────┐*  :  :       │   │    ┌────────┐
         │ FSize ├---┐  :       │   ├────┤ FLabel │
         └───────┘   :  :       │   │    └────────┘
                     :1 :1      │   │    ┌───────────┐
                 ┌───┴──┴┐      │   ├────┤ FLineEdit │
                 │ FTerm │      │   │    └───────────┘
                 └───┬───┘      │   │    ┌──────────┐
                     :1         │   ├────┤ FSpinBox │
┌─────────┐   ┌──────┴──────┐   │   │    └──────────┘
│ FOutput │◄──┤ FTermOutput │   │   │    ┌─────────┐
└────┬────┘   └─────────────┘   │   ├────┤ FButton │
     :             ┌────────┐   │   │    └─────────┘
     :1            │ FEvent │◄──┘   │    ┌──────────────┐      ┌──────────────┐
 ┌───┴────┐        └────┬───┘       ├────┤ FButtonGroup │   ┌──┤ FRadioButton │
 │ FVTerm │◄──┐         :1          │    └──────────────┘   │  └──────────────┘
 └────────┘   │    ┌────┴────┐      │    ┌───────────────┐  │  ┌───────────┐
              ├────┤ FWidget │◄─────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │
┌─────────┐   │    └────┬────┘      │    └───────────────┘  │  └───────────┘
│ FObject │◄──┘         :1          │    ┌──────────────┐   │  ┌─────────┐
└────┬────┘      ┌──────┴────────┐  ├────┤ FProgressbar │   └──┤ FSwitch │
     ▼           │ FWidgetColors │  │    └──────────────┘      └─────────┘
 ┌───┴────┐      └───────────────┘  │    ┌────────────┐
 │ FTimer │                         ├────┤ FScrollbar │
 └────────┘                         │    └────────────┘
                                    │    ┌───────────┐
                                    ├────┤ FTextView │
                                    │    └───────────┘
                                    │    ┌───────────┐1    1┌──────────────────┐
                                    ├────┤ FComboBox ├------┤ FDropDownListBox │
                                    │    └───────────┘      └──────────────────┘
 ┌──────────────┐1                  │    ┌──────────┐1     *┌──────────────┐1
 │ FVTermBuffer ├-------------------├────┤ FListBox ├-------┤ FListBoxItem ├--┐
 └──────────────┘                   │    └──────────┘       └──────────────┘  :
                                    │   1┌───────────┐1    *┌───────────────┐ :
                                    ├────┤ FListView ├------┤ FListViewItem │ :
                                    │    └───────────┘      └────────┬──────┘ :
                                    │    ┌─────────────┐             :1       :
                                    ├────┤ FScrollView │         ┌───┴───┐1   :
                                    │    └─────────────┘         │ FData ├----┘
                                    │                            └───────┘
                                    │    ┌────────────┐1   *┌────────────┐
                                    │ ┌──┤ FStatusBar ├-----┤ FStatusKey │
                                    │ │  └────────────┘     └────────────┘
                                    │ │
                                    │ ▼                       ┌─────────────┐
                                ┌───┴─┴───┐  ┌─────────┐   ┌──┤ FFileDialog │
                                │ FWindow │◄─┤ FDialog │◄──┤  └─────────────┘
                                └──┬──┬───┘  └─────────┘   │  ┌─────────────┐
                                   ▲  ▲                    └──┤ FMessageBox │
                                   │  │                       └─────────────┘
                                   │  │      ┌──────────┐  ┌────────────────┐
                                   │  └──────┤ FToolTip │◄─┤ FBusyIndicator │
                                   │         └──────────┘  └────────────────┘
                                   └───────────────┐          ┌──────────┐
                                                   │      ┌───┤ FMenuBar │
                                  ┌───────────┐    └──────┤   └──────────┘
                                  │ FMenuList │◄──────────┤   ┌───────┐
                                  └────┬──────┘           └───┤ FMenu │◄──┐
                                       :1                     └───────┘   │
                                       :            ┌─────────────────┐   │
                                       :            │ FDialogListMenu ├───┘
                                       :            └─────────────────┘
                                       └--------------------------------┐
                                       :*          ┌────────────────┐*  :
                                  ┌────┴─────┐  ┌──┤ FCheckMenuItem ├---┘
                                  │FMenuItem │◄─┤  └────────────────┘   :
                                  └──────────┘  │  ┌────────────────┐*  :
                                                └──┤ FRadioMenuItem ├---┘
                                                   └────────────────┘

Please send bug reports to

https://github.com/gansm/finalcut/issues

License

Licensed under the GNU Lesser General Public License, Version 3.0 LGPLv3