{"id":13578634,"url":"https://github.com/gansm/finalcut","last_synced_at":"2025-05-14T21:09:33.566Z","repository":{"id":31432878,"uuid":"34996446","full_name":"gansm/finalcut","owner":"gansm","description":"The modern text-based widget toolkit","archived":false,"fork":false,"pushed_at":"2025-02-15T19:18:27.000Z","size":27510,"stargazers_count":1051,"open_issues_count":8,"forks_count":56,"subscribers_count":30,"default_branch":"main","last_synced_at":"2025-03-30T13:06:15.416Z","etag":null,"topics":["c-plus-plus","console","cpp","cpp14","dialog","framework","library","object-oriented","termcap","terminal","terminal-app","text","text-mode-gui","tty","tui","user-interface","widget","widget-toolkit"],"latest_commit_sha":null,"homepage":"https://github.com/gansm/finalcut/wiki/First-steps#first-steps-with-the-final-cut-widget-toolkit","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gansm.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog","contributing":"Contributing.md","funding":null,"license":"COPYING","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-05-03T18:39:17.000Z","updated_at":"2025-03-29T20:49:43.000Z","dependencies_parsed_at":"2023-10-15T13:24:20.435Z","dependency_job_id":"94f3051e-5edb-42ab-aeb4-a04ebd42c96d","html_url":"https://github.com/gansm/finalcut","commit_stats":{"total_commits":1724,"total_committers":13,"mean_commits":132.6153846153846,"dds":"0.016241299303944357","last_synced_commit":"c294f2857fed6b0c63b1a3d157bbc66352e9fbd4"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gansm%2Ffinalcut","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gansm%2Ffinalcut/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gansm%2Ffinalcut/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gansm%2Ffinalcut/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gansm","download_url":"https://codeload.github.com/gansm/finalcut/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247492512,"owners_count":20947544,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-plus-plus","console","cpp","cpp14","dialog","framework","library","object-oriented","termcap","terminal","terminal-app","text","text-mode-gui","tty","tui","user-interface","widget","widget-toolkit"],"created_at":"2024-08-01T15:01:32.427Z","updated_at":"2025-04-06T14:08:04.191Z","avatar_url":"https://github.com/gansm.png","language":"C++","readme":"![FINAL CUT](misc/logo/svg/finalcut-logo.svg)\n\n# Library for creating terminal applications with text-based widgets\n\nFINAL CUT is a powerful and lightweight C++ library for creating [terminal-based applications](https://en.wikipedia.org/wiki/Text-based_user_interface) with numerous text-based widgets. FINAL CUT is designed for simplicity and does not require the functionality of external libraries (such as [ncurses](https://invisible-island.net/ncurses/ncurses.html) or [termbox](https://code.google.com/archive/p/termbox/)) but still offers full [mouse](doc/mouse-control.md#title-bar-actions-on-mouse-clicks) support, Unicode compatibility, and versatile widget functions.\n\nIt provides [UTF-8](https://en.wikipedia.org/wiki/UTF-8) character encoding, [full-width character](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) support, and the ability to display [combined Unicode characters](https://en.wikipedia.org/wiki/Combining_character). The library helps the developer to create an easy-to-use text console application and allows handling multiple text windows on the screen.\n\nThe design of FINAL CUT's C++ class structure 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.\n\n![Architecture of the sub-systems of a FINAL CUT application](doc/subsystem-architecture.svg)\n\n\n## Building and Code Analysis\n\n|                    | Badge |\n|-------------------:|:------|\n| *Latest release*   | [![Latest Release](https://img.shields.io/github/release/gansm/finalcut.svg)](https://github.com/gansm/finalcut/releases) |\n| *License*          | [![LGPL v3](https://img.shields.io/badge/License-LGPL_v3-blue.svg)](LICENSE) |\n| *Class Reference*  | [![documented](https://codedocs.xyz/gansm/finalcut.svg)](https://codedocs.xyz/gansm/finalcut/hierarchy.html) |\n| *ARM build*        | [![ARM build](https://github.com/gansm/finalcut/actions/workflows/arm.yml/badge.svg)](https://github.com/gansm/finalcut/actions/workflows/arm.yml) |\n| *FreeBSD build*    | [![FreeBSD build](https://github.com/gansm/finalcut/actions/workflows/freebsd.yml/badge.svg)](https://github.com/gansm/finalcut/actions/workflows/freebsd.yml) |\n| *NetBSD build*     | [![NetBSD build](https://github.com/gansm/finalcut/actions/workflows/netbsd.yml/badge.svg)](https://github.com/gansm/finalcut/actions/workflows/netbsd.yml) |\n| *OpenBSD build*    | [![OpenBSD build](https://github.com/gansm/finalcut/actions/workflows/openbsd.yml/badge.svg)](https://github.com/gansm/finalcut/actions/workflows/openbsd.yml) |\n| *macOS build*      | [![macOS build](https://github.com/gansm/finalcut/actions/workflows/macos.yml/badge.svg)](https://github.com/gansm/finalcut/actions/workflows/macos.yml) |\n| *Cygwin build*     | [![Cygwin build](https://github.com/gansm/finalcut/actions/workflows/cygwin.yml/badge.svg)](https://github.com/gansm/finalcut/actions/workflows/cygwin.yml) |\n| *Solaris build*    | [![Solaris build](https://github.com/gansm/finalcut/actions/workflows/solaris.yml/badge.svg)](https://github.com/gansm/finalcut/actions/workflows/solaris.yml) |\n| *CodeQL analysis*  | [![CodeQL analysis](https://github.com/gansm/finalcut/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/gansm/finalcut/security/code-scanning) |\n| *Coverity Scan*    | [![Coverity Scan Status](https://img.shields.io/coverity/scan/6508.svg)](https://scan.coverity.com/projects/6508 ) |\n| *SonarCloud*       | [![Quality gate](https://sonarcloud.io/api/project_badges/measure?project=gansm_finalcut\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=gansm_finalcut) |\n| *CodeFactor*       | [![CodeFactor](https://www.codefactor.io/repository/github/gansm/finalcut/badge)](https://www.codefactor.io/repository/github/gansm/finalcut) |\n| *SIGRID*       | [![sigrid-publish](https://github.com/gansm/finalcut/actions/workflows/sigrid-publish.yml/badge.svg?branch=main)](https://github.com/gansm/finalcut/actions/workflows/sigrid-publish.yml) |\n\n\n## Installation\n\nBefore 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?](doc/faq.md#what-do-i-need-to-build-this-library)\".\n\n```bash\n\u003e git clone https://github.com/gansm/finalcut.git\n\u003e cd finalcut\n\u003e autoreconf --install --force\n\u003e ./configure --prefix=/usr\n\u003e make\n\u003e su -c \"make install\"\n```\n\n## Supported Platforms\n\nFINAL CUT currently works on the following platforms:\n\n* Linux\n* FreeBSD\n* NetBSD\n* OpenBSD\n* macOS\n* Cygwin\n* GNU Hurd\n* Solaris\n\nIf your platform is not listed here, it may still be compatible with FINAL CUT. [Contributions](Contributing.md) to extend the platform support are welcome!\n\n## Documentation\n\nRead the documentation on the [first steps](doc/first-steps.md#first-steps-with-the-final-cut-widget-toolkit) in FINAL CUT to find out how to use the library.\n\n## Frequently Asked Questions\n\nCheck out the FINAL CUT [FAQ](doc/faq.md#frequently-asked-questions) for common questions and answers.\n\n## Screenshots\n\nExplore the power of FINAL CUT with these examples:\n\n![FFileDialog](doc/fileopen-dialog.png)\n\u003cbr /\u003e*FFileDialog widget with incremental search*\u003cbr /\u003e\u003cbr /\u003e\n\n![FProgressbar](doc/progress-bar.png)\n\u003cbr /\u003e*FProgressbar widget*\u003cbr /\u003e\u003cbr /\u003e\n\n![XPM Viewer](doc/xpmview.png)\n\u003cbr /\u003e*X PixMap (XPM) viewer example*\u003cbr /\u003e\u003cbr /\u003e\n\n![FTextView](doc/textview.png)\n\u003cbr /\u003e*Scrollable text in an FTextView widget*\u003cbr /\u003e\u003cbr /\u003e\n\n![Mandelbrot set](doc/Mandelbrot.png)\n\u003cbr /\u003e*Mandelbrot set example*\u003cbr /\u003e\u003cbr /\u003e\n\n## FINAL CUT newfont\n\nThis project contains [NewFont](final/font/), a graphical text font for X11 and the Linux console:\n\n![ui example in newfont mode](doc/newfont1.png)\n\u003cbr /\u003e*UI example in NewFont mode*\u003cbr /\u003e\u003cbr /\u003e\n\n![drive symbols](doc/newfont2.png)\n\u003cbr /\u003e*Drive symbols*\u003cbr /\u003e\u003cbr /\u003e\n\n![calculator](doc/calculator.png)\n\u003cbr /\u003e*Calculator example in NewFont mode*\u003cbr /\u003e\u003cbr /\u003e\n\n## Benchmark\n\nMeasure the [terminal character output speed](doc/benchmark.md#benchmark) with the Rotozoomer example.\n\n## Virtual Terminal\n\nFINAL 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.\n\n\u003cpre style=\"line-height: 1 !important;\"\u003e\n print(...)\nprintf(...)\n  │\n  │          ╔════════════════════════[ vterm ]════════════════════════╗\n  │          ║createVTerm()                                            ║\n  │          ║                                   ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ║\n  │          ║                                                         ║\n  │          ║                                   │ restoreVTerm(box) │ ║\n  │  ┌───────╨────[ vwin ]────────────┐                                ║\n  │  │createArea(size)                │          └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ║\n  │  │                                │                                ║\n  │  │                                │                                ║\n  └──┼────────►                putArea(pos,area) ────►                 ║\n     │                                │                                ║\n     │                   ◄──── getArea(pos,area)                       ║\n     │                                │                                ║\n     │                                │                                ║\n     │                                │                                ║\n     │          resizeArea(size, area)│                                ║\n     └───────╥────────────────────────┘                                ║\n             ║                                                         ║\n             ║       │                                resizeVTerm(size)║\n             ╚═══════▼═════════════════════════════════════════════════╝\n                     │\n                     │   putVTerm()\n                     └──────────────────► updateTerminalLine(y)\n                       updateTerminal()            │\n                                                   ▼\n                                           ┌───────────────┐\n                                           │ output_buffer │\n                                           └───────────────┘\n                                                   │\n                                                   │ flush()\n                                                   │\n                                                   ▼\n                                           ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n                                           ▌               ▐\n                                           ▌    screen     ▐\n                                           ▌ ───────────── ▐\n                                           ▌ real terminal ▐\n                                           ▌               ▐\n                                           ▀▀▀▀▀▀▀███▀▀▀▀▀▀▀\n                                                  ███\n                                               ▀▀▀▀▀▀▀▀▀\n\u003c/pre\u003e\n\n## Class Digramm\n\n\u003cpre style=\"line-height: 1 !important;\"\u003e\n    ┌────────────┐1\n    │ FTermLinux ├------┐\n    └────────────┘      :\n  ┌──────────────┐1     :\n  │ FTermFreeBSD ├------┐\n  └──────────────┘      :\n  ┌──────────────┐1     :\n  │ FTermOpenBSD ├------┐\n  └──────────────┘      :\n┌────────────────┐1     :\n│ FTermDetection ├------┐\n└────────────────┘      :\n┌────────────────┐1     :\n│ FTermcapQuirks ├------┐\n└────────────────┘      :            ┌───────────┐\n┌────────────────┐1     :       ┌────┤ FKeyEvent │\n│ FTermXTerminal ├------┐       │    └───────────┘\n└────────────────┘      :       │    ┌─────────────┐\n      ┌──────────┐1     :       ├────┤ FMouseEvent │\n      │ FTermcap ├------┐       │    └─────────────┘\n      └──────────┘      :       │    ┌─────────────┐\n      ┌──────────┐1     :       ├────┤ FWheelEvent │\n      │ FTermios ├------┐       │    └─────────────┘\n      └──────────┘      :       │    ┌─────────────┐\n ┌───────────────┐1     :       ├────┤ FFocusEvent │\n │ FColorPalette ├------┐       │    └─────────────┘\n └───────────────┘      :       │    ┌─────────────┐\n     ┌───────────┐1     :       ├────┤ FAccelEvent │\n     │ FOptiMove ├------┐       │    └─────────────┘\n     └───────────┘      :       │    ┌──────────────┐\n     ┌───────────┐1     :       ├────┤ FResizeEvent │\n     │ FOptiAttr ├------┐       │    └──────────────┘\n     └───────────┘      :       │    ┌────────────┐\n     ┌───────────┐1     :       ├────┤ FShowEvent │\n     │ FKeyboard ├------┐       │    └────────────┘\n     └───────────┘      :       │    ┌────────────┐\n ┌───────────────┐1     :       ├────┤ FHideEvent │\n │ FMouseControl ├------┐       │    └────────────┘\n └───────────────┘      :       │    ┌─────────────┐\n       ┌─────────┐1     :       ├────┤ FCloseEvent │\n       │ FSystem ├------┐       │    └─────────────┘\n       └─────────┘      :       │    ┌─────────────┐\n       ┌─────────┐*     :       ├────┤ FTimerEvent │\n       │ FString ├---┐  :       │    └─────────────┘\n       └─────────┘   :  :       │    ┌────────────┐1    1┌───────┐\n ┌───────────────┐*  :  :       ├────┤ FUserEvent ├------┤ FData │\n │ FStringStream ├---┐  :       │    └────────────┘      └───────┘\n └───────────────┘   :  :       │        ┌──────┐   ┌─────────┐\n        ┌────────┐*  :  :       │        │ FLog │◄──┤ FLogger │\n        │ FPoint ├---┐  :       │        └──┬───┘   └─────────┘\n        └────────┘   :  :       │           :1\n         ┌───────┐*  :  :       │        ┌──┴───────────┐\n         │ FRect ├---┐  :       │   ┌────┤ FApplication │\n         └───────┘   :  :       │   │    └──────────────┘\n         ┌───────┐*  :  :       │   │    ┌────────┐\n         │ FSize ├---┐  :       │   ├────┤ FLabel │\n         └───────┘   :  :       │   │    └────────┘\n                     :1 :1      │   │    ┌───────────┐\n                 ┌───┴──┴┐      │   ├────┤ FLineEdit │\n                 │ FTerm │      │   │    └───────────┘\n                 └───┬───┘      │   │    ┌──────────┐\n                     :1         │   ├────┤ FSpinBox │\n┌─────────┐   ┌──────┴──────┐   │   │    └──────────┘\n│ FOutput │◄──┤ FTermOutput │   │   │    ┌─────────┐\n└────┬────┘   └─────────────┘   │   ├────┤ FButton │\n     :             ┌────────┐   │   │    └─────────┘\n     :1            │ FEvent │◄──┘   │    ┌──────────────┐      ┌──────────────┐\n ┌───┴────┐        └────┬───┘       ├────┤ FButtonGroup │   ┌──┤ FRadioButton │\n │ FVTerm │◄──┐         :1          │    └──────────────┘   │  └──────────────┘\n └────────┘   │    ┌────┴────┐      │    ┌───────────────┐  │  ┌───────────┐\n              ├────┤ FWidget │◄─────┼────┤ FToggleButton │◄─┼──┤ FCheckBox │\n┌─────────┐   │    └────┬────┘      │    └───────────────┘  │  └───────────┘\n│ FObject │◄──┘         :1          │    ┌──────────────┐   │  ┌─────────┐\n└────┬────┘      ┌──────┴────────┐  ├────┤ FProgressbar │   └──┤ FSwitch │\n     ▼           │ FWidgetColors │  │    └──────────────┘      └─────────┘\n ┌───┴────┐      └───────────────┘  │    ┌────────────┐\n │ FTimer │                         ├────┤ FScrollbar │\n └────────┘                         │    └────────────┘\n                                    │    ┌───────────┐\n                                    ├────┤ FTextView │\n                                    │    └───────────┘\n                                    │    ┌───────────┐1    1┌──────────────────┐\n                                    ├────┤ FComboBox ├------┤ FDropDownListBox │\n                                    │    └───────────┘      └──────────────────┘\n ┌──────────────┐1                  │    ┌──────────┐1     *┌──────────────┐1\n │ FVTermBuffer ├-------------------├────┤ FListBox ├-------┤ FListBoxItem ├--┐\n └──────────────┘                   │    └──────────┘       └──────────────┘  :\n                                    │   1┌───────────┐1    *┌───────────────┐ :\n                                    ├────┤ FListView ├------┤ FListViewItem │ :\n                                    │    └───────────┘      └────────┬──────┘ :\n                                    │    ┌─────────────┐             :1       :\n                                    ├────┤ FScrollView │         ┌───┴───┐1   :\n                                    │    └─────────────┘         │ FData ├----┘\n                                    │                            └───────┘\n                                    │    ┌────────────┐1   *┌────────────┐\n                                    │ ┌──┤ FStatusBar ├-----┤ FStatusKey │\n                                    │ │  └────────────┘     └────────────┘\n                                    │ │\n                                    │ ▼                       ┌─────────────┐\n                                ┌───┴─┴───┐  ┌─────────┐   ┌──┤ FFileDialog │\n                                │ FWindow │◄─┤ FDialog │◄──┤  └─────────────┘\n                                └──┬──┬───┘  └─────────┘   │  ┌─────────────┐\n                                   ▲  ▲                    └──┤ FMessageBox │\n                                   │  │                       └─────────────┘\n                                   │  │      ┌──────────┐  ┌────────────────┐\n                                   │  └──────┤ FToolTip │◄─┤ FBusyIndicator │\n                                   │         └──────────┘  └────────────────┘\n                                   └───────────────┐          ┌──────────┐\n                                                   │      ┌───┤ FMenuBar │\n                                  ┌───────────┐    └──────┤   └──────────┘\n                                  │ FMenuList │◄──────────┤   ┌───────┐\n                                  └────┬──────┘           └───┤ FMenu │◄──┐\n                                       :1                     └───────┘   │\n                                       :            ┌─────────────────┐   │\n                                       :            │ FDialogListMenu ├───┘\n                                       :            └─────────────────┘\n                                       └--------------------------------┐\n                                       :*          ┌────────────────┐*  :\n                                  ┌────┴─────┐  ┌──┤ FCheckMenuItem ├---┘\n                                  │FMenuItem │◄─┤  └────────────────┘   :\n                                  └──────────┘  │  ┌────────────────┐*  :\n                                                └──┤ FRadioMenuItem ├---┘\n                                                   └────────────────┘\n\u003c/pre\u003e\n\n## Contributing and reporting bugs\n\nWe encourage community involvement in improving FINAL CUT. If you find bugs or [issues](https://github.com/gansm/finalcut/issues), report them here. For contributions, please review our [Contributing Guidelines](Contributing.md).\n\n## License\n\nFINAL CUT is licensed under the GNU Lesser General Public License v3.0. See the [LGPL v3.0 license page](https://www.gnu.org/licenses/lgpl-3.0-standalone.html) for more details. \u003ca href=\"https://www.gnu.org/licenses/lgpl-3.0-standalone.html\"\u003e\u003cimg width=\"200\" align=\"right\" src=\"https://upload.wikimedia.org/wikipedia/commons/3/3b/LGPLv3_Logo.svg\" alt=\"LGPLv3\" data-canonical-src=\"https://upload.wikimedia.org/wikipedia/commons/3/3b/LGPLv3_Logo.svg\"\u003e\u003c/a\u003e\n","funding_links":[],"categories":["CLI","\u003ca name=\"cpp\"\u003e\u003c/a\u003eC++","C++","Multimedia","Table of Contents"],"sub_categories":["Text-mode UI, terminal"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgansm%2Ffinalcut","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgansm%2Ffinalcut","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgansm%2Ffinalcut/lists"}