Terminal¶
-
type
termpaint_terminal
¶
The terminal object represents a connected terminal. This can be seen as the root object in termpaint.
The actual connection with the terminal is left to the application. It can be connected to both a operating system terminal as well as to network protocols with suitable glue.
The terminal always needs an bi-directional connection for the terminal object to work.
See Integration for how write a custom integrate of termpaint into an application.
See Addon termpaintx for a simple premade integration suitable for simple applications using a synchronous usage style.
Terminals have different capabilities and thus a auto detection step is recommended before using the terminal in the application.
Input and other events from the terminal are passed to the application using callback functions.
The primary callback is the event callback which is called for keyboard input, mouse events and clipboard
paste events. Use termpaint_terminal_set_event_cb()
to setup your event callback. This callback
is required.
Output is done by placing text on the primary surface of the terminal. This surface can be obtained by
termpaint_terminal_get_surface()
. After all text is in place, call termpaint_terminal_flush()
to output the contents of the surface to the terminal. If no full repaint is requested this will only send
differences since the last flush to the terminal.
Setup¶
The terminal object works better with terminal specific setup which can enabled by doing a terminal auto-detection before
calling termpaint_terminal_setup_fullscreen()
. The terminal auto-detection can be started using
termpaint_terminal_auto_detect()
. This will initiate bidirectional communication to the terminal. The application
can proceed with the setup when the detection is finished.
For applications preferring synchronous integration the application should call
termpaint_terminal_auto_detect_state()
after each additional input from the terminal. If this function returns
termpaint_auto_detect_done
the detection is finished.
For applications preferring asynchronous integration the application needs to wait for an event of type
TERMPAINT_EV_AUTO_DETECT_FINISHED
before proceeding with terminal setup.
In either case the application needs to set an event callback before starting auto-detection.
When the application terminates it needs to restore both terminal configuration as well as the kernel level terminal
setup back to it’s previous values. The first part should be done by calling
termpaint_terminal_free_with_restore()
. The second part should be done by using operating system specific calls
to save the kernel settings before changing those and then restoring them after restoring the terminal setup.
Common functions¶
These functions are commonly used when a initialized terminal object has been acquired.
See Safety for general rules for calling functions in termpaint.
-
void
termpaint_terminal_free_with_restore
(termpaint_terminal *term)¶ Frees the terminal object
term
and restores the attached terminal to it’s base state.This function calls the integrations free callback.
-
void
termpaint_terminal_free
(termpaint_terminal *term)¶ Frees the terminal object
term
without restoring the attached terminal to it’s base state. This will leave the terminal in a state that other applications or the shell will not be prepared to handle in most cases.Prefer to use
termpaint_terminal_free_with_restore()
.This function calls the integrations free callback.
-
void
termpaint_terminal_set_event_cb
(termpaint_terminal *term, void (*cb)(void *user_data, termpaint_event *event), void *user_data, )¶ The application must use this function to set an event callback. See Events for details about events produced by terminal input.
This is mostly a wrapper for using
termpaint_input_set_event_cb()
with a terminal object. Termpaint interprets certain events before passing them on to the application. Also, while running terminal auto detection, events are not passed to the given callback. Some events likeTERMPAINT_EV_AUTO_DETECT_FINISHED
are actually produced by termpaint and not by termpaint_input.
-
termpaint_surface *
termpaint_terminal_get_surface
(termpaint_terminal *term)¶ Returns the primary surface of the terminal object
term
. This surface is linked to the terminal and can be output usingtermpaint_terminal_flush()
.This object is owned by the terminal object, don’t free the returned value.
-
void
termpaint_terminal_flush
(termpaint_terminal *term, bool full_repaint)¶ Output the current state of the primary surface of the terminal object to the attached terminal.
If
full_repaint
is false it uses incremental drawing to reduce bandwidth use. Else it does a full redraw that can repair the contents of the terminal in case another application interfered with uncoordinated output to the same underlying terminal.
-
void
termpaint_terminal_set_cursor_position
(termpaint_terminal *term, int x, int y)¶ Sets the text cursor position for the terminal object
term
. The cursor is moved to this position the next timetermpaint_terminal_flush()
is called.
-
void
termpaint_terminal_set_cursor_visible
(termpaint_terminal *term, bool visible)¶ Sets the visibility of the text cursor for the terminal object
term
. The cursor is shown/hidden the next timetermpaint_terminal_flush()
is called.
-
void
termpaint_terminal_set_cursor_style
(termpaint_terminal *term, int style, bool blink)¶ Sets the cursor shape / style of the terminal object
term
to the style specified instyle
. Ifblink
is true, the cursor will blink.The following styles are available:
-
TERMPAINT_CURSOR_STYLE_TERM_DEFAULT
¶ This is the terminal default style. This is terminal implementation and configuration defined.
-
TERMPAINT_CURSOR_STYLE_BLOCK
¶ Display the cursor as a block that covers an entire character.
-
TERMPAINT_CURSOR_STYLE_UNDERLINE
¶ Display the cursor as a underline under the character.
-
TERMPAINT_CURSOR_STYLE_BAR
¶ Display the cursor as a vertical bar between characters.
-
-
void
termpaint_terminal_set_title
(termpaint_terminal *term, const char *title, int mode)¶ Set the title of the terminal to the string
title
.mode
specifies how to handle terminals where it is not certain that the original title can be restored when exiting the application.-
TERMPAINT_TITLE_MODE_ENSURE_RESTORE
¶ Only set the title if it is certain that the original title can be restored when the application restores the terminal.
This is the recommended mode.
-
TERMPAINT_TITLE_MODE_PREFER_RESTORE
¶ Set the title on all terminals that support setting a title without restricting to terminals that are known to be able to restore the title when the application restores the terminal.
-
-
void
termpaint_terminal_set_icon_title
(termpaint_terminal *term, const char *title, int mode)¶ This function is like
termpaint_terminal_set_title()
but does not set the primary title but an alternative title called the icon title. Interpretation of this title differs by terminal.
-
void
termpaint_terminal_set_color
(termpaint_terminal *term, int color_slot, int r, int b, int g)¶ Set special global (not per cell) terminal colors.
color_slot
can be one of:-
TERMPAINT_COLOR_SLOT_BACKGROUND
¶ This is the color used for cells without an explicitly set background. This color is used e.g. for cells using the
TERMPAINT_DEFAULT_COLOR
as background.
-
TERMPAINT_COLOR_SLOT_FOREGRUND
¶ This is the color used for cells without an explicitly set foreground. This color is used e.g. for cells using the
TERMPAINT_DEFAULT_COLOR
as foreground.
-
TERMPAINT_COLOR_SLOT_CURSOR
¶ Set the color of the cursor in the terminal.
-
-
void
termpaint_terminal_reset_color
(termpaint_terminal *term, int color_slot)¶ Reset color choices made using
termpaint_terminal_set_color()
. Whencolor_slot
isTERMPAINT_COLOR_SLOT_CURSOR
the cursor color is reset to the default.
-
void
termpaint_terminal_request_tagged_paste
(termpaint_terminal *term, _Bool enabled)¶ Request the termial to send the needed information so
TERMPAINT_EV_PASTE
events can be generated.
-
void
termpaint_terminal_set_mouse_mode
(termpaint_terminal *term, int mouse_mode)¶ Request the terminal to enable mouse handling by the application. Depending on the setting
TERMPAINT_EV_MOUSE
events will be generated for:-
TERMPAINT_MOUSE_MODE_OFF
¶ No events.
Terminal native select and copy features will be available to the user.
-
TERMPAINT_MOUSE_MODE_CLICKS
¶ Only report mouse down and up events (clicks).
Terminal native select and copy features will not be available to the user. Some terminals allow overriding this mouse mode using shift temporarily.
-
TERMPAINT_MOUSE_MODE_DRAG
¶ Report mouse down and up events as well as movement when at least one mouse button is held down.
Terminal native select and copy features will not be available to the user. Some terminals allow overriding this mouse mode using shift temporarily.
-
TERMPAINT_MOUSE_MODE_MOVEMENT
¶ Report mouse movement and down and up events independent of mouse button state.
Terminal native select and copy features will not be available to the user. Some terminals allow overriding this mouse mode using shift temporarily.
-
-
void
termpaint_terminal_request_focus_change_reports
(termpaint_terminal *term, _Bool enabled)¶ Request focus change events from the terminal. If supported by the terminal these events will be reported as Misc events of type
termpaint_input_focus_in()
andtermpaint_input_focus_out()
.
-
_Bool
termpaint_terminal_should_use_truecolor
(termpaint_terminal *terminal)¶ After auto detection, returns true if termpaint does not translate rgb color colors to indexed colors.
To force passing rgb colors to the terminal, one of the the capabilities
TERMPAINT_CAPABILITY_TRUECOLOR_MAYBE_SUPPORTED
orTERMPAINT_CAPABILITY_TRUECOLOR_SUPPORTED
must be set.
-
void
termpaint_terminal_bell
(termpaint_terminal *term)¶ Send the BEL character to the terminal. Most terminals trigger a visual or audio reaction to the BEL character.
Functions for setup and auto-detection¶
These functions are used to get a initialized terminal object and are somewhat dependent on the integration used.
For the integration from the termpaintx addon a convenience function encapsulating the setup is
available as termpaintx_full_integration_setup_terminal_fullscreen()
that can be used instead.
See Safety for general rules for calling functions in termpaint.
-
termpaint_terminal *
termpaint_terminal_new
(termpaint_integration *integration)¶ Create a new terminal object.
See Integration for details on the callbacks needed in
integration
.The application has to free this with
termpaint_terminal_free_with_restore()
ortermpaint_terminal_free()
If the integration’s free callback frees the integration this takes ownership of the integration.
-
bool
termpaint_terminal_auto_detect
(termpaint_terminal *terminal)¶ Starts terminal type auto-detection. The event callback has to be set before calling this function.
Return false, if the auto-detection could not be started.
-
enum
termpaint_auto_detect_state_enum
¶ -
enumerator
termpaint_auto_detect_none
¶ Terminal type auto-detection was not run yet.
-
enumerator
termpaint_auto_detect_running
¶ Terminal type auto-detection is currently running.
-
enumerator
termpaint_auto_detect_done
¶ Terminal type auto-detection was run and has finished.
-
enumerator
-
enum termpaint_auto_detect_state_enum
termpaint_terminal_auto_detect_state
(const termpaint_terminal *terminal)¶ Get the state of a possibly running terminal type auto-detection.
-
_Bool
termpaint_terminal_might_be_supported
(const termpaint_terminal *terminal)¶ After auto detection, returns true if the terminal might be supported. If it returns false the terminal is likely missing essential features for proper support.
-
void
termpaint_terminal_setup_fullscreen
(termpaint_terminal *terminal, int width, int height, const char *options)¶ Setup the terminal connected to the terminal object
term
to fullscreen mode. Assume terminal size iswidth
columns byheight
lines.options
specifies an space delimited list of additional settings:-altscreen
Do not activate the alternative screen of the terminal. Previous contents of the screen is not restored after terminating the application.
+kbdsig
Do not activate any modes of the terminal that might conflict with processing of keyboard signals in the kernel tty layer. Use this when passing
+kdbsigint
,+kdbsigquit
or+kdbsigtstp
totermpaintx_full_integration()
or when using an custom integration that enabled the equivalent kernel terminal layer processing.Affected key combinations are usually ctrl-c, ctrl-z and, ctrl-\
-
void
termpaint_terminal_auto_detect_apply_input_quirks
(termpaint_terminal *terminal, _Bool backspace_is_x08)¶ Setup input handling based on the auto detection result and
backspace_is_x08
.Needs to be called after auto detection is finished.
Pass
backspace_is_x08
as true if the terminal uses 0x08 (ASCII BS) for the backspace key.On *nix platforms this information can be obtained from the
termios
structure byoriginal_termios.c_cc[VERASE] == 0x08
. For ssh connections the VERASE value is transmitted as part of the pseudo terminal request in the encoded terminal modes.
Special purpose functions¶
These functions have specialized use. They are not needed in many applications.
See Safety for general rules for calling functions in termpaint.
-
void
termpaint_terminal_pause
(termpaint_terminal *term)¶ Temporarily restore the terminal state. This should be called before running external applications. To return to rendering by termpaint call
termpaint_terminal_unpause()
.After calling this function the application still needs to restore the kernel tty layer settings to the state needed to run external applications.
-
void
termpaint_terminal_unpause
(termpaint_terminal *term)¶ This function activates termpaint mode again after it was previously temporarily restored to the normal state.
Before calling this function the application needs to restore the kernel tty layer settings to the state needed by termpaint (or to the state before calling pause).
-
void
termpaint_terminal_set_raw_input_filter_cb
(termpaint_terminal *term, bool (*cb)(void *user_data, const char *data, unsigned length, bool overflow), void *user_data, )¶ This function allows settings a callback that is called with raw sequences before interpretation. The application can inspect the sequences in this callback. If the callback returns true the sequence is not interpreted further.
This is mostly a wrapper for using
termpaint_input_set_raw_filter_cb()
with a terminal object. But events while running terminal auto detection are not passed to the given callback.
-
void
termpaint_terminal_handle_paste
(termpaint_terminal *term, _Bool enabled)¶ This is a wrapper for using
termpaint_input_handle_paste()
with a terminal object.Explicit paste handling is an switchable termianl feature, see
termpaint_terminal_request_tagged_paste()
for enabling it.
-
const char *
termpaint_terminal_self_reported_name_and_version
(const termpaint_terminal *terminal)¶ Returns a pointer to a string with the result of the terminal’s self reported name and version. Only some terminals support this. For other terminals NULL will be returned.
This value is only available after successful terminal autodetection. The returned pointer is valid until the terminal object is freed or terminal auto detection is triggered again.
-
void
termpaint_terminal_auto_detect_result_text
(const termpaint_terminal *terminal, char *buffer, int buffer_length)¶ Fills
buffer
with null terminated string with debugging details about the detected terminal type. The buffer pointed to bybuffer
needs to be at leastbuffer_length
bytes long.
-
void
termpaint_terminal_activate_input_quirk
(termpaint_terminal *term, int quirk)¶ This is a wrapper for using
termpaint_input_activate_quirk()
with a terminal object.Quirks matching the auto detected terminal are already activated by
termpaint_terminal_auto_detect_apply_input_quirks()
.Calling this function explicitly should be rarely needed.
-
const char *
termpaint_terminal_peek_input_buffer
(const termpaint_terminal *term)¶ This function in conjunction with
termpaint_terminal_peek_input_buffer_length()
allows an application to observe input data that is buffered by not yet processed. If called aftertermpaint_terminal_add_input_data()
returned, this will contain data in partial or ambiguous sequences not yet processed.This is a wrapper for using
termpaint_input_peek_buffer()
with a terminal object.
-
int
termpaint_terminal_peek_input_buffer_length
(const termpaint_terminal *term)¶ Returns the length of the valid data for
termpaint_terminal_peek_input_buffer()
.This is a wrapper for using
termpaint_input_peek_buffer_length()
with a terminal object.
-
void
termpaint_terminal_set_log_mask
(termpaint_terminal *term, unsigned mask)¶ Set the mask of what besides errors is reported to the integration’s logging callback.
All logging messages are for debugging only and might change between releases.
mask
is a bit combination of-
TERMPAINT_LOG_AUTO_DETECT_TRACE
¶ Log details of the auto detection state machine
-
TERMPAINT_LOG_TRACE_RAW_INPUT
¶ Log raw input bytes from the terminal.
-
-
_Bool
termpaint_terminal_capable
(const termpaint_terminal *terminal, int capability)¶ Features supported differ among terminal implementations. Termpaint uses as set of capabilities to decide how to interface with terminals. This function allows to query currently set capabilities.
Capabilities start with some defaults and get setup during terminal auto-detection.
The following capabilities are available:
-
TERMPAINT_CAPABILITY_7BIT_ST
¶ The terminals fully supports using
ESC\\
as string terminator. This is the string terminator specified by ECMA-48.
-
TERMPAINT_CAPABILITY_88_COLOR
¶ The terminal uses 88 colors for indexed colors instead of the more widely supported 256 colors.
-
TERMPAINT_CAPABILITY_CLEARED_COLORING
¶ The terminal supports using “clear to end of line” for trailing sequences of insignificant spaces. This includes support for setting up multiple colored ranges per line using this sequence.
-
TERMPAINT_CAPABILITY_CLEARED_COLORING_DEFCOLOR
¶ If TERMPAINT_CAPABILITY_CLEARED_COLORING is supported this indicated if this sequence also works for the special “default” terminal color.
-
TERMPAINT_CAPABILITY_CSI_EQUALS
¶ The terminal’s escape sequence parser properly handles sequences starting with
ESC[=
and ignores unknown sequences of this type.
-
TERMPAINT_CAPABILITY_CSI_GREATER
¶ The terminal’s escape sequence parser properly handles sequences starting with
ESC[>
and ignores unknown sequences of this type.
-
TERMPAINT_CAPABILITY_CSI_POSTFIX_MOD
¶ The terminal’s escape sequence parser properly handles sequences that use a intermediate character before the final character of a CSI sequence.
-
TERMPAINT_CAPABILITY_CURSOR_SHAPE_OSC50
¶ Cursor shape needs to be setup with a konsole specific escape sequence.
-
TERMPAINT_CAPABILITY_EXTENDED_CHARSET
¶ The terminal is capable of displaying a font with more than 512 different characters.
-
TERMPAINT_CAPABILITY_MAY_TRY_CURSOR_SHAPE
¶ The terminal’s parser is expected to cope with the cursor setup CSI sequence without glitches.
-
TERMPAINT_CAPABILITY_MAY_TRY_CURSOR_SHAPE_BAR
¶ The terminal either does not support cursor shapes or it does support bar cursor shape.
-
TERMPAINT_CAPABILITY_MAY_TRY_TAGGED_PASTE
¶ The terminal supports bracketed/tagged paste.
-
TERMPAINT_CAPABILITY_SAFE_POSITION_REPORT
¶ The terminal uses a format for cursor position reports that is distinct from key press reports.
-
TERMPAINT_CAPABILITY_TITLE_RESTORE
¶ The terminal has a title stack that can be used to restore the title.
-
TERMPAINT_CAPABILITY_TRUECOLOR_MAYBE_SUPPORTED
¶ The terminal is not known to have problems with rgb(truecolor) color types.
-
TERMPAINT_CAPABILITY_TRUECOLOR_SUPPORTED
¶ The terminal is known to support rgb(truecolor) color types.
-
-
void
termpaint_terminal_promise_capability
(termpaint_terminal *terminal, int capability)¶ This function allows overriding terminal type auto-detection of terminal capabilities.
Use this with care, if the terminal is not able to handle the enabled capabilities the rendering might break.
-
void
termpaint_terminal_disable_capability
(termpaint_terminal *terminal, int capability)¶ This function allows overriding terminal type auto-detection of terminal capabilities.
On specific use is to disable
TERMPAINT_CAPABILITY_TRUECOLOR_MAYBE_SUPPORTED
to switch to a more conservative estamination of a terminals capability to support rgb color modes.
-
void
termpaint_terminal_expect_apc_input_sequences
(termpaint_terminal *term, _Bool enabled)¶ This is a wrapper for using
termpaint_input_expect_apc_sequences()
with a terminal object.APC sequences are only known to be used by kitty in an extended keyboard reporting mode that is currently not supported by termpaint.
-
void
termpaint_terminal_expect_cursor_position_report
(termpaint_terminal *term)¶ This is a wrapper for using
termpaint_input_expect_cursor_position_report()
with a terminal object.Needs to be called for each
ESC[6n
sequence send manually to the terminal to ensure the result is interpreted as cursor position report instead of a key press.If the terminal
properly supports ESC[?6n
that sequence should be used and this function does not need to be called.
-
void
termpaint_terminal_expect_legacy_mouse_reports
(termpaint_terminal *term, int s)¶ This is a wrapper for using
termpaint_input_expect_legacy_mouse_reports()
with a terminal object.When mouse reporting is enabled this function is internally called with
TERMPAINT_INPUT_EXPECT_LEGACY_MOUSE
, so it should be rarely needed to call this explicitly.
-
void
termpaint_terminal_glitch_on_out_of_memory
(termpaint_terminal *term)¶ Normally termpaint aborts the process on memory allocation failure to avoid hard to debug glitches.
When this function is called instead termpaint tries to continue, but potentially discarding output characters and attributes where allocation would be needed.
Call this function if your application needs to be resilient against memory allocation failures.
To use termpaint in such environments it’s additionally required to call variants of functions ending in _or_nullptr or _mustcheck instead of the base variant whenever those exist in the header file.
See Environments that need to handle malloc failure for details.
Functions for integrations¶
See Safety for general rules for calling functions in termpaint.
-
const char *
termpaint_terminal_restore_sequence
(const termpaint_terminal *term)¶ Returns a null terminated string that can be used to restore the terminal to it’s base state.
The restore string is the same string that is used when calling
termpaint_terminal_free_with_restore()
ortermpaint_terminal_pause()
.
-
void
termpaint_terminal_callback
(termpaint_terminal *term)¶ If the application has set
request_callback
in the integration structure, this function needs to be called after a delay when the terminal object requests it by invoking therequest_callback
callback.
-
void
termpaint_terminal_add_input_data
(termpaint_terminal *term, const char *data, unsigned length)¶ The integration part of the application has to call this function to pass terminal input data to the terminal object. See Integration for details.
The application has to ensure that this function is never called recursively from a callback with any
termpaint_input
object that is already in a call totermpaint_terminal_add_input_data
.This is a wrapper for using
termpaint_input_add_data()
with a terminal object.