diff --git a/form/form.h b/form/form.h index f11807f..9fb24d7 100644 --- a/form/form.h +++ b/form/form.h @@ -222,6 +222,7 @@ typedef void (*Form_Hook)(FORM *); #define O_STATIC (0x0200U) #define O_DYNAMIC_JUSTIFY (0x0400U) /* ncurses extension */ #define O_NO_LEFT_STRIP (0x0800U) /* ncurses extension */ +#define O_EDGE_INSERT_STAY (0x1000U) /* ncurses extension */ /* form options */ #define O_NL_OVERLOAD (0x0001U) diff --git a/form/form.priv.h b/form/form.priv.h index ad25ec2..5a2dba9 100644 --- a/form/form.priv.h +++ b/form/form.priv.h @@ -166,7 +166,8 @@ TypeArgument; #define ALL_FIELD_OPTS (Field_Options)( \ STD_FIELD_OPTS |\ O_DYNAMIC_JUSTIFY |\ - O_NO_LEFT_STRIP) + O_NO_LEFT_STRIP |\ + O_EDGE_INSERT_STAY) #define C_BLANK ' ' #define is_blank(c) ((c)==C_BLANK) diff --git a/form/frm_driver.c b/form/frm_driver.c index 837b02a..c47a47f 100644 --- a/form/frm_driver.c +++ b/form/frm_driver.c @@ -866,6 +866,7 @@ _nc_Position_Form_Cursor(FORM *form) | E_BAD_ARGUMENT - invalid form pointer | E_SYSTEM_ERROR - general error +--------------------------------------------------------------------------*/ +static bool move_after_insert = true; NCURSES_EXPORT(int) _nc_Refresh_Current_Field(FORM *form) { @@ -897,7 +898,8 @@ _nc_Refresh_Current_Field(FORM *form) else { if (form->curcol >= (form->begincol + field->cols)) - form->begincol = form->curcol - field->cols + 1; + form->begincol = form->curcol - field->cols + + (move_after_insert? 1: 0); } copywin(form->w, formwin, @@ -4183,6 +4185,8 @@ Data_Entry(FORM *form, int c) { bool End_Of_Field = (((field->drows - 1) == form->currow) && ((field->dcols - 1) == form->curcol)); + if (Field_Has_Option(field, O_EDGE_INSERT_STAY)) + move_after_insert = !!(form->curcol - form->begincol - field->cols + 1); SetStatus(form, _WINDOW_MODIFIED); if (End_Of_Field && !Growable(field) && (Field_Has_Option(field, O_AUTOSKIP))) @@ -4347,6 +4351,7 @@ form_driver(FORM *form, int c) { const Binding_Info *BI = (Binding_Info *) 0; int res = E_UNKNOWN_COMMAND; + move_after_insert = true; T((T_CALLED("form_driver(%p,%d)"), (void *)form, c));