nuttx/graphics/nxterm/nxterm_putc.c
raiden00pl 856fad2ffa graphics/nxterm: support command-line cursor editing
Handle carriage return, cursor-left/right, and erase-to-end-of-line
sequences required by readline. Restore glyphs hidden by the cursor
so edited text redraws correctly.

Signed-off-by: raiden00pl <raiden00@railab.me>
Assisted-by: OpenAI Codex:gpt-5
2026-08-23 10:46:02 +08:00

192 lines
5.1 KiB
C

/****************************************************************************
* graphics/nxterm/nxterm_putc.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/ascii.h>
#include "nxterm.h"
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: nxterm_putc
*
* Description:
* Render the specified character at the current display position.
*
****************************************************************************/
void nxterm_putc(FAR struct nxterm_state_s *priv, uint8_t ch)
{
FAR const struct nxterm_bitmap_s *bm;
int lineheight;
/* Handle carriage returns */
if (ch == '\r')
{
priv->fpos.x = priv->spwidth;
return;
}
/* Handle backspace (treating both BS and DEL as backspace) */
if (ch == ASCII_BS || ch == ASCII_DEL)
{
nxterm_backspace(priv);
return;
}
/* Will another character fit on this line? */
if (priv->fpos.x + priv->fwidth > priv->wndo.wsize.w)
{
#ifndef CONFIG_NXTERM_NOWRAP
/* No.. move to the next line */
nxterm_newline(priv);
/* If we were about to output a newline character, then don't */
if (ch == '\n')
{
return;
}
#else
/* No.. Ignore all further characters until a newline is encountered */
if (ch != '\n')
{
return;
}
#endif
}
/* If it is a newline character, then just perform the logical newline
* operation.
*/
if (ch == '\n')
{
nxterm_newline(priv);
return;
}
/* Check if we need to scroll up */
lineheight = (priv->fheight + CONFIG_NXTERM_LINESEPARATION);
while (priv->fpos.y >= priv->wndo.wsize.h - lineheight)
{
nxterm_scroll(priv, lineheight);
}
/* Find the glyph associated with the character and render it onto the
* display.
*/
bm = nxterm_addchar(priv, ch);
if (bm)
{
nxterm_fillchar(priv, NULL, bm);
}
}
/****************************************************************************
* Name: nxterm_showcursor
*
* Description:
* Render the cursor character at the current display position.
*
****************************************************************************/
void nxterm_showcursor(FAR struct nxterm_state_s *priv)
{
int lineheight;
/* Will another character fit on this line? */
if (priv->fpos.x + priv->fwidth > priv->wndo.wsize.w)
{
#ifndef CONFIG_NXTERM_NOWRAP
/* No.. move to the next line */
nxterm_newline(priv);
#else
return;
#endif
}
/* Check if we need to scroll up */
lineheight = (priv->fheight + CONFIG_NXTERM_LINESEPARATION);
while (priv->fpos.y >= priv->wndo.wsize.h - lineheight)
{
nxterm_scroll(priv, lineheight);
}
/* Render the cursor glyph onto the display. */
priv->cursor.pos.x = priv->fpos.x;
priv->cursor.pos.y = priv->fpos.y;
nxterm_fillchar(priv, NULL, &priv->cursor);
}
/****************************************************************************
* Name: nxterm_hidecursor
*
* Description:
* Render the cursor cursor character from the display.
*
****************************************************************************/
void nxterm_hidecursor(FAR struct nxterm_state_s *priv)
{
int i;
nxterm_hidechar(priv, &priv->cursor);
/* A cursor moved into an existing line is drawn on top of a saved glyph.
* Restore that glyph after erasing the cursor so command-line editing does
* not leave a hole in the displayed text.
*/
for (i = priv->nchars - 1; i >= 0; i--)
{
if (priv->bm[i].pos.x == priv->cursor.pos.x &&
priv->bm[i].pos.y == priv->cursor.pos.y)
{
nxterm_fillchar(priv, NULL, &priv->bm[i]);
break;
}
}
}