Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/annexi-strayline/Curses
Advanced UNIX Terminal UI Ada Binding Package
https://github.com/annexi-strayline/Curses
curses curses-library tui
Last synced: 3 months ago
JSON representation
Advanced UNIX Terminal UI Ada Binding Package
- Host: GitHub
- URL: https://github.com/annexi-strayline/Curses
- Owner: annexi-strayline
- Created: 2018-12-12T18:36:43.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2020-05-01T17:25:23.000Z (over 4 years ago)
- Last Synced: 2024-07-31T20:32:20.432Z (6 months ago)
- Topics: curses, curses-library, tui
- Language: Ada
- Size: 561 KB
- Stars: 14
- Watchers: 3
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome-ada - curses - Advanced UNIX Terminal UI Ada Binding Package. (Frameworks / Terminal User Interface)
README
# Introduction
The Curses library provides a very high-level **thick** binding for the common "ncurses" terminal control library common on most *nixes.
The library has the following key features:
* **Fully task-safe**, and allows for concurrent interface driving
* Full color support for xterm and xterm-256color, including palette changing ability (though this rarely supported by terminal emulators in the wild)
* Non signal-based, synchronous dynamic terminal resizing support with hooks
* Designed to drive multiple terminals simultaneously
* Includes a unified color space shared amongst all terminals
* Supports cross-terminal Surface (window, pad) transcription
* Abstracted "Surface" type represents traditional curses Windows, with fully automatic re-rendering on update, including visibility computation (automatic layering).
* The Curses package does not use allocators anywhere (however the (n)curses library itself likely does use allocations from the heap). All objects are stack allocated, unless explicitly created with a user-defined allocator.# State of Release
This package is currently in **pre-release alpha** and is still very much under development.Core functionality (Surface primitives) is complete and working. Work on higher-level UI abstractions is underway.
**The interface is subject to breaking changes until further notice**
## Open issues
* Gnome terminal can't handle Set_Background with a Colored_Cursor. Artifacts appear during refresh. Almost all other tested terminals work fine (xterm, uxrvt, konsole).## Work queue
- [ ] Higher-level UI abstractions
- [ ] "Dialog boxes", Menus, Forms, etc.
- [ ] Expanded documentation
- [ ] Examples# Building and using
This library is presented as a gpr "library project" - libnadacurses.gpr.The library can be built directly with grpbuild, or included within another project file.
The library project has two primary configuration properties \(set with -XProperty=..\), as follows:
1. HOST_OS
* FreeBSD
* Solaris
* Linux
Linux should have a distribution set if relevent, which shall be one of the following:
* Ubuntu \(Default\)2. WIDE_SUPPORT
* NO \(Default\)
No wide character (unicode) support. This links with the regular ncurses library.* YES
Includes full wide character support. This requires the ncursesw library. When using this option, ensure the terminal supports wide character or UTF-8 encoding, and that "locale" for the terminal is set appropriately (eg. en_US.UTF-8).# Alpha test-drive
* Refer to the extensive comments in the Curses package to understand basic Surface operations
* Refer to the Curses.Terminals for the Terminal type and comments for setting up a Terminal
* Refer to Curses.Terminals.Surfaces.Standard (Curses.Standard) for the basic Screen and Window primitive Surfaces
* Refer to Curses.Terminals.Color for enabling Color options (especially via the Colored_Cursor type)Here is a basic example program which places a filled window in the centre of the screen, and prints "Hello World!" with centered justification.
```
with Curses; use Curses;
with Curses.Terminals; use Curses.Terminals;
with Curses.Standard; use Curses.Standard;with Curses.Terminals.Surfaces;
with Curses.Device.Environment;procedure Example is
TTY: aliased Terminal (Curses.Device.Environment.Environment_Terminal);
subtype Control_Character is Curses.Terminals.Surfaces.Control_Character;
begin
TTY.Attach;declare
Main_Screen: Screen := New_Screen (TTY);
My_Window : Window'Class := Main_Screen.New_Window
(Proposed_Extents => (Row => 4, Column => 40));
Input_Char: Control_Character;
-- This will be centered on the screen, of size 4x40
Fill_Cursor: Cursor := (Style => (Inverted => True, others => <>),
others => <>);
begin
My_Window.Set_Background (Fill_Cursor => Fill_Cursor);
My_Window.Position_Cursor ( (Row => 2,
Column => (My_Window.Extents.Column / 2)) );
My_Window.Put (Content => "Type 'x' to exit.",
Justify => Center,
Advance_Cursor => True);
My_Window.Position_Cursor ( (Row => 3, Column => 2) );
My_Window.Put (Content => ">",
Advance_Cursor => True);
My_Window.Show;
-- New windows are hidden by default
loop
Input_Char := My_Window.Input_Key;
exit when Input_Char.Class = Graphic
and then Input_Char.Key = 'x';
if Input_Char.Class = Graphic
and then My_Window.Current_Cursor.Position < My_Window.Extents
then
My_Window.Put (Content => String'(1..1 => Input_Char.Key),
Advance_Cursor => True);
end if;
end loop;
-- That's it, the Curses package will automatically shut everything down
-- for you!
end;
end Example;
```This example code can be found in the root directory under Tests/example.adb. A gprbuild project file can be found in the root directory as example.gpr
Compile as follows (gnat must be installed):
```
$ gprbuild -p -P example.adb -XHOST_OS=[Your host OS]
```HOST_OS Must be set to one of the three currently supported OS types:
1. "Linux"
2. "FreeBSD"
3. "Solaris"This binding has been tested to work as is on
- FreeBSD
- Linux
- Solaris (illumos)