@@ -596,7 +596,7 @@ static int multiboot_ui_show_pass(struct udevice *dev, int seq, bool show)
SCENEOBJT_TEXTLINE);
if (!tline)
return log_msg_ret("tln", -ENOENT);
- buf = abuf_data(&tline->buf);
+ buf = abuf_data(&tline->tin.buf);
*buf = '\0';
/* Set highlight and open the textline for editing */
@@ -625,7 +625,7 @@ static int multiboot_ui_get_pass(struct udevice *dev, int seq,
if (!tline)
return log_msg_ret("tln", -ENOENT);
- *passp = abuf_data(&tline->buf);
+ *passp = abuf_data(&tline->tin.buf);
return 0;
}
@@ -315,14 +315,14 @@ int bootflow_menu_add(struct expo *exp, struct bootflow *bflow, int seq,
"Passphrase:", NULL);
if (ret < 0)
return log_msg_ret("itl", -EINVAL);
- tline->label_id = ret;
+ tline->tin.label_id = ret;
snprintf(name, sizeof(name), "item%d.pass.edit", seq);
ret = scene_txt_str(scn, name, ITEM_PASS_EDIT + seq, 0,
- abuf_data(&tline->buf), &txt);
+ abuf_data(&tline->tin.buf), &txt);
if (ret < 0)
return log_msg_ret("ite", -EINVAL);
- tline->edit_id = ret;
+ tline->tin.edit_id = ret;
txt->obj.flags |= SCENEOF_PASSWORD;
/* Create message text (hidden by default) for success/error feedback */
@@ -433,7 +433,7 @@ static int h_write_settings(struct scene_obj *obj, void *vpriv)
const struct scene_obj_textline *tline;
tline = (struct scene_obj_textline *)obj;
- ret = write_dt_string(buf, obj->name, abuf_data(&tline->buf));
+ ret = write_dt_string(buf, obj->name, abuf_data(&tline->tin.buf));
if (ret)
return log_msg_ret("wr2", ret);
break;
@@ -538,9 +538,9 @@ static int h_read_settings(struct scene_obj *obj, void *vpriv)
tline = (struct scene_obj_textline *)obj;
val = ofnode_read_prop(node, obj->name, &len);
- if (len >= tline->line_chars)
+ if (len >= tline->tin.line_chars)
return log_msg_ret("str", -ENOSPC);
- strcpy(abuf_data(&tline->buf), val);
+ strcpy(abuf_data(&tline->tin.buf), val);
break;
}
case SCENEOBJT_MENU: {
@@ -638,7 +638,7 @@ static int h_write_settings_env(struct scene_obj *obj, void *vpriv)
const struct scene_obj_textline *tline;
tline = (struct scene_obj_textline *)obj;
- str = abuf_data(&tline->buf);
+ str = abuf_data(&tline->tin.buf);
ret = env_set(var, str);
if (ret)
return log_msg_ret("set", ret);
@@ -708,13 +708,13 @@ static int h_read_settings_env(struct scene_obj *obj, void *vpriv)
tline = (struct scene_obj_textline *)obj;
value = env_get(var);
- if (value && strlen(value) >= tline->line_chars)
+ if (value && strlen(value) >= tline->tin.line_chars)
return log_msg_ret("str", -ENOSPC);
if (!value)
value = "";
if (priv->verbose)
printf("%s=%s\n", var, value);
- strcpy(abuf_data(&tline->buf), value);
+ strcpy(abuf_data(&tline->tin.buf), value);
break;
}
}
@@ -347,7 +347,7 @@ static int textline_build(struct build_info *info, ofnode node,
ret = add_txt_str(info, node, scn, "title", buf, 0);
if (ret < 0)
return log_msg_ret("tit", ret);
- ted->label_id = ret;
+ ted->tin.label_id = ret;
/* Setup the editor */
info->err_prop = "edit-id";
@@ -356,11 +356,11 @@ static int textline_build(struct build_info *info, ofnode node,
return log_msg_ret("id", -ENOENT);
snprintf(buf, sizeof(buf), "%s.edit", name);
- ret = scene_txt_str(scn, buf, edit_id, 0, abuf_data(&ted->buf),
+ ret = scene_txt_str(scn, buf, edit_id, 0, abuf_data(&ted->tin.buf),
NULL);
if (ret < 0)
return log_msg_ret("add", ret);
- ted->edit_id = ret;
+ ted->tin.edit_id = ret;
return 0;
}
@@ -107,9 +107,9 @@ static void dump_textline(struct dump_ctx *ctx,
struct scene_obj_textline *tline)
{
outf(ctx, "Textline: label_id %x edit_id %x\n",
- tline->label_id, tline->edit_id);
+ tline->tin.label_id, tline->tin.edit_id);
ctx->indent += 2;
- outf(ctx, "line_chars %x pos %x\n", tline->line_chars, tline->pos);
+ outf(ctx, "line_chars %x pos %x\n", tline->tin.line_chars, tline->pos);
ctx->indent -= 2;
}
@@ -117,7 +117,7 @@ static void dump_textedit(struct dump_ctx *ctx,
struct scene_obj_txtedit *tedit)
{
outf(ctx, "Textedit: label_id %x edit_id %x\n",
- tedit->label_id, tedit->edit_id);
+ tedit->tin.label_id, tedit->tin.edit_id);
}
static void obj_dump_(struct dump_ctx *ctx, struct scene_obj *obj)
@@ -786,7 +786,7 @@ int scene_calc_arrange(struct scene *scn, struct expo_arrange_info *arr)
struct scene_obj_textline *tline;
tline = (struct scene_obj_textline *)obj,
- label_id = tline->label_id;
+ label_id = tline->tin.label_id;
break;
}
}
@@ -31,12 +31,12 @@ int scene_texted(struct scene *scn, const char *name, uint id,
if (ret < 0)
return log_msg_ret("obj", ret);
- abuf_init(&ted->buf);
- if (!abuf_realloc(&ted->buf, INITIAL_SIZE))
+ abuf_init(&ted->tin.buf);
+ if (!abuf_realloc(&ted->tin.buf, INITIAL_SIZE))
return log_msg_ret("buf", -ENOMEM);
- buf = abuf_data(&ted->buf);
+ buf = abuf_data(&ted->tin.buf);
*buf = '\0';
- ted->line_chars = line_chars;
+ ted->tin.line_chars = line_chars;
if (teditp)
*teditp = ted;
@@ -53,7 +53,7 @@ int scene_txted_set_font(struct scene *scn, uint id, const char *font_name,
if (!ted)
return log_msg_ret("find", -ENOENT);
- return scene_txt_set_font(scn, ted->edit_id, font_name, font_size);
+ return scene_txt_set_font(scn, ted->tin.edit_id, font_name, font_size);
}
int scene_txted_arrange(struct scene *scn, struct expo_arrange_info *arr,
@@ -67,8 +67,8 @@ int scene_txted_arrange(struct scene *scn, struct expo_arrange_info *arr,
x = ted->obj.req_bbox.x0;
y = ted->obj.req_bbox.y0;
- if (ted->label_id) {
- ret = scene_obj_set_pos(scn, ted->label_id, x, y);
+ if (ted->tin.label_id) {
+ ret = scene_obj_set_pos(scn, ted->tin.label_id, x, y);
if (ret < 0)
return log_msg_ret("tit", ret);
@@ -76,14 +76,14 @@ int scene_txted_arrange(struct scene *scn, struct expo_arrange_info *arr,
}
/* constrain the edit text to fit within the textedit bbox */
- ret = scene_obj_set_bbox(scn, ted->edit_id, x, y,
+ ret = scene_obj_set_bbox(scn, ted->tin.edit_id, x, y,
ted->obj.req_bbox.x1, ted->obj.req_bbox.y1);
if (ret < 0)
return log_msg_ret("edi", ret);
point = scn->highlight_id == ted->obj.id;
point &= !open;
- scene_obj_flag_clrset(scn, ted->edit_id, SCENEOF_POINT,
+ scene_obj_flag_clrset(scn, ted->tin.edit_id, SCENEOF_POINT,
point ? SCENEOF_POINT : 0);
ted->obj.dims.x = x - ted->obj.req_bbox.x0;
@@ -31,12 +31,12 @@ int scene_textline(struct scene *scn, const char *name, uint id,
(struct scene_obj **)&tline);
if (ret < 0)
return log_msg_ret("obj", -ENOMEM);
- if (!abuf_init_size(&tline->buf, line_chars + 1))
+ if (!abuf_init_size(&tline->tin.buf, line_chars + 1))
return log_msg_ret("buf", -ENOMEM);
- buf = abuf_data(&tline->buf);
+ buf = abuf_data(&tline->tin.buf);
*buf = '\0';
tline->pos = line_chars;
- tline->line_chars = line_chars;
+ tline->tin.line_chars = line_chars;
if (tlinep)
*tlinep = tline;
@@ -52,11 +52,11 @@ void scene_textline_calc_bbox(struct scene_obj_textline *tline,
int inset = theme->menu_inset;
bbox->valid = false;
- scene_bbox_union(tline->obj.scene, tline->label_id, inset, bbox);
- scene_bbox_union(tline->obj.scene, tline->edit_id, inset, bbox);
+ scene_bbox_union(tline->obj.scene, tline->tin.label_id, inset, bbox);
+ scene_bbox_union(tline->obj.scene, tline->tin.edit_id, inset, bbox);
edit_bbox->valid = false;
- scene_bbox_union(tline->obj.scene, tline->edit_id, inset,
+ scene_bbox_union(tline->obj.scene, tline->tin.edit_id, inset,
edit_bbox);
}
@@ -68,12 +68,12 @@ int scene_textline_calc_dims(struct scene_obj_textline *tline,
struct scene_obj_txt *txt;
int ret;
- txt = scene_obj_find(scn, tline->edit_id, SCENEOBJT_NONE);
+ txt = scene_obj_find(scn, tline->tin.edit_id, SCENEOBJT_NONE);
if (!txt)
return log_msg_ret("dim", -ENOENT);
ret = vidconsole_nominal(cons, txt->gen.font_name, txt->gen.font_size,
- tline->line_chars, &bbox);
+ tline->tin.line_chars, &bbox);
if (ret)
return log_msg_ret("nom", ret);
@@ -98,19 +98,19 @@ int scene_textline_arrange(struct scene *scn, struct expo_arrange_info *arr,
x = tline->obj.req_bbox.x0;
y = tline->obj.req_bbox.y0;
- if (tline->label_id) {
+ if (tline->tin.label_id) {
struct scene_obj *edit;
- ret = scene_obj_set_pos(scn, tline->label_id, x, y);
+ ret = scene_obj_set_pos(scn, tline->tin.label_id, x, y);
if (ret < 0)
return log_msg_ret("tit", ret);
x += arr->label_width + theme->textline_label_margin_x;
- ret = scene_obj_set_pos(scn, tline->edit_id, x, y);
+ ret = scene_obj_set_pos(scn, tline->tin.edit_id, x, y);
if (ret < 0)
return log_msg_ret("til", ret);
- edit = scene_obj_find(scn, tline->edit_id, SCENEOBJT_NONE);
+ edit = scene_obj_find(scn, tline->tin.edit_id, SCENEOBJT_NONE);
if (!edit)
return log_msg_ret("tie", -ENOENT);
x += edit->dims.x;
@@ -119,7 +119,7 @@ int scene_textline_arrange(struct scene *scn, struct expo_arrange_info *arr,
point = scn->highlight_id == tline->obj.id;
point &= !open;
- scene_obj_flag_clrset(scn, tline->edit_id, SCENEOF_POINT,
+ scene_obj_flag_clrset(scn, tline->tin.edit_id, SCENEOF_POINT,
point ? SCENEOF_POINT : 0);
tline->obj.dims.x = x - tline->obj.req_bbox.x0;
@@ -143,7 +143,7 @@ int scene_textline_send_key(struct scene *scn, struct scene_obj_textline *tline,
event->select.id = tline->obj.id;
/* Copy the backup text from the scene buffer */
- memcpy(abuf_data(&tline->buf), abuf_data(&scn->buf),
+ memcpy(abuf_data(&tline->tin.buf), abuf_data(&scn->buf),
abuf_size(&scn->buf));
/* cursor is not needed now */
@@ -181,7 +181,7 @@ int scene_textline_send_key(struct scene *scn, struct scene_obj_textline *tline,
bool scene_textline_within(const struct scene *scn,
struct scene_obj_textline *tline, int x, int y)
{
- return scene_within(scn, tline->edit_id, x, y);
+ return scene_within(scn, tline->tin.edit_id, x, y);
}
int scene_textline_render_deps(struct scene *scn,
@@ -198,7 +198,7 @@ int scene_textline_render_deps(struct scene *scn,
ret = vidconsole_entry_restore(cons, &scn->entry_save);
if (ret)
return log_msg_ret("sav", ret);
- scene_render_obj(scn, tline->edit_id);
+ scene_render_obj(scn, tline->tin.edit_id);
/* move cursor back to the correct position */
for (i = scn->cls.num; i < scn->cls.eol_num; i++)
@@ -236,17 +236,17 @@ int scene_textline_open(struct scene *scn, struct scene_obj_textline *tline)
int ret;
/* Copy the text into the scene buffer in case the edit is cancelled */
- memcpy(abuf_data(&scn->buf), abuf_data(&tline->buf),
+ memcpy(abuf_data(&scn->buf), abuf_data(&tline->tin.buf),
abuf_size(&scn->buf));
/* get the position of the editable */
- txt = scene_obj_find(scn, tline->edit_id, SCENEOBJT_NONE);
+ txt = scene_obj_find(scn, tline->tin.edit_id, SCENEOBJT_NONE);
if (!txt)
return log_msg_ret("cur", -ENOENT);
vidconsole_set_cursor_pos(cons, txt->obj.bbox.x0, txt->obj.bbox.y0);
vidconsole_entry_start(cons);
- cli_cread_init(&scn->cls, abuf_data(&tline->buf), tline->line_chars);
+ cli_cread_init(&scn->cls, abuf_data(&tline->tin.buf), tline->tin.line_chars);
scn->cls.insert = true;
scn->cls.putch = scene_textline_putch;
ret = vidconsole_entry_save(cons, &scn->entry_save);
@@ -503,23 +503,32 @@ struct scene_menitem {
};
/**
- * struct scene_obj_textline - information about a textline in a scene
- *
- * A textline has a prompt and a line of editable text
+ * struct scene_txtin - generic info for text-input objects
*
- * @obj: Basic object information
* @label_id: ID of the label text object (not string ID), or 0 if none
* @edit_id: ID of the editable text object (not string ID)
- * @line_chars: Nominal number of characters in a line (also a hard limit)
+ * @line_chars: Nominal number of characters in a line
* @buf: Text buffer containing current text
- * @pos: Cursor position
*/
-struct scene_obj_textline {
- struct scene_obj obj;
+struct scene_txtin {
uint label_id;
uint edit_id;
uint line_chars;
struct abuf buf;
+};
+
+/**
+ * struct scene_obj_textline - information about a textline in a scene
+ *
+ * A textline has a prompt and a line of editable text
+ *
+ * @obj: Basic object information
+ * @tin: Text-input info
+ * @pos: Cursor position
+ */
+struct scene_obj_textline {
+ struct scene_obj obj;
+ struct scene_txtin tin;
uint pos;
};
@@ -544,17 +553,11 @@ struct scene_obj_box {
* A text editor which allows users to edit a small text file
*
* @obj: Basic object information
- * @label_id: ID of the label text object (not string ID), or 0 if none
- * @edit_id: ID of the editable text object (not string ID)
- * @line_chars: Nominal number of characters in a line
- * @buf: Text buffer containing current text
+ * @tin: Text-input info
*/
struct scene_obj_txtedit {
struct scene_obj obj;
- uint label_id;
- uint edit_id;
- uint line_chars;
- struct abuf buf;
+ struct scene_txtin tin;
};
/**
@@ -384,23 +384,23 @@ static int check_passphrase(struct unit_test_state *uts,
/* Type 't', 'e', 's', 't' - each poll processes one character */
ut_asserteq(4, console_in_puts("test"));
ut_assertok(bc_ui_poll(ui_dev, &seq_out, &selected));
- ut_asserteq_str("t", abuf_data(&tline->buf));
+ ut_asserteq_str("t", abuf_data(&tline->tin.buf));
ut_assertok(bc_ui_poll(ui_dev, &seq_out, &selected));
- ut_asserteq_str("te", abuf_data(&tline->buf));
+ ut_asserteq_str("te", abuf_data(&tline->tin.buf));
ut_assertok(bc_ui_poll(ui_dev, &seq_out, &selected));
- ut_asserteq_str("tes", abuf_data(&tline->buf));
+ ut_asserteq_str("tes", abuf_data(&tline->tin.buf));
ut_assertok(bc_ui_poll(ui_dev, &seq_out, &selected));
- ut_asserteq_str("test", abuf_data(&tline->buf));
+ ut_asserteq_str("test", abuf_data(&tline->tin.buf));
/* Send backspace to remove one character */
ut_asserteq(1, console_in_puts("\b"));
ut_assertok(bc_ui_poll(ui_dev, &seq_out, &selected));
- ut_asserteq_str("tes", abuf_data(&tline->buf));
+ ut_asserteq_str("tes", abuf_data(&tline->tin.buf));
/* Re-add the 't' and verify */
ut_asserteq(1, console_in_puts("t"));
ut_assertok(bc_ui_poll(ui_dev, &seq_out, &selected));
- ut_asserteq_str("test", abuf_data(&tline->buf));
+ ut_asserteq_str("test", abuf_data(&tline->tin.buf));
/* Send return key to submit - should close textline and select */
ut_asserteq(1, console_in_puts("\n"));
@@ -89,7 +89,7 @@ static int cedit_fdt(struct unit_test_state *uts)
/* get a textline to fiddle with too */
tline = scene_obj_find(scn, ID_MACHINE_NAME, SCENEOBJT_TEXTLINE);
ut_assertnonnull(tline);
- str = abuf_data(&tline->buf);
+ str = abuf_data(&tline->tin.buf);
strcpy(str, "my-machine");
ut_assertok(run_command("cedit write_fdt hostfs - settings.dtb", 0));
@@ -158,7 +158,7 @@ static int cedit_env(struct unit_test_state *uts)
/* get a textline to fiddle with too */
tline = scene_obj_find(scn, ID_MACHINE_NAME, SCENEOBJT_TEXTLINE);
ut_assertnonnull(tline);
- str = abuf_data(&tline->buf);
+ str = abuf_data(&tline->tin.buf);
strcpy(str, "my-machine");
ut_assertok(run_command("cedit write_env -v", 0));
@@ -398,7 +398,7 @@ static int cedit_render_textline(struct unit_test_state *uts)
/* set up an initial value for the textline */
tline = scene_obj_find(scn, ID_MACHINE_NAME, SCENEOBJT_TEXTLINE);
ut_assertnonnull(tline);
- str = abuf_data(&tline->buf);
+ str = abuf_data(&tline->tin.buf);
strcpy(str, "my-machine");
ut_asserteq(20, tline->pos);
@@ -655,7 +655,7 @@ static int cedit_mouse(struct unit_test_state *uts)
speed->obj.flags);
/* click on the textline */
- ut_assertok(click_check(uts, scn, mach->edit_id,
+ ut_assertok(click_check(uts, scn, mach->tin.edit_id,
EXPOACT_REPOINT_OPEN, &act));
ut_asserteq(ID_MACHINE_NAME, act.select.id);
ut_asserteq(ID_CPU_SPEED, act.select.prev_id);
@@ -1013,7 +1013,7 @@ static int expo_within_funcs(struct unit_test_state *uts)
/* test scene_textline_within() */
tline = scene_obj_find(scn, ID_MACHINE_NAME, SCENEOBJT_NONE);
ut_assertnonnull(tline);
- obj = scene_obj_find(scn, tline->edit_id, SCENEOBJT_NONE);
+ obj = scene_obj_find(scn, tline->tin.edit_id, SCENEOBJT_NONE);
ut_assertnonnull(obj);
/* positive test: point within textline bounds */
@@ -1400,19 +1400,19 @@ static int expo_render_textline(struct unit_test_state *uts)
id = scene_textline(scn, "textline", OBJ_TEXTLINE, 20, &tline);
ut_assert(id > 0);
ut_assertok(scene_obj_set_pos(scn, OBJ_TEXTLINE, 500, 500));
- strcpy(abuf_data(&tline->buf), "sample hopwind");
+ strcpy(abuf_data(&tline->tin.buf), "sample hopwind");
/* create the label text object */
id = scene_txt_str(scn, "tline-label", 0, 0, "Label:", NULL);
ut_assert(id > 0);
- tline->label_id = id;
+ tline->tin.label_id = id;
/* create the edit text object pointing to the textline buffer */
- id = scene_txt_str(scn, "tline-edit", 0, 0, abuf_data(&tline->buf),
+ id = scene_txt_str(scn, "tline-edit", 0, 0, abuf_data(&tline->tin.buf),
NULL);
ut_assert(id > 0);
- tline->edit_id = id;
- ut_assertok(scene_txt_set_font(scn, tline->edit_id,
+ tline->tin.edit_id = id;
+ ut_assertok(scene_txt_set_font(scn, tline->tin.edit_id,
"nimbus_sans_l_regular", 40));
expo_set_scene_id(exp, SCENE1);
@@ -1446,7 +1446,7 @@ static int expo_render_textline(struct unit_test_state *uts)
/* check cursor moved back one position, before 'a' */
ut_asserteq(14, scn->cls.num);
ut_asserteq(15, scn->cls.eol_num);
- ut_asserteq_str("sample hopwinda", abuf_data(&tline->buf));
+ ut_asserteq_str("sample hopwinda", abuf_data(&tline->tin.buf));
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
ut_asserteq(19552, video_compress_fb(uts, dev, false));
@@ -1458,7 +1458,7 @@ static int expo_render_textline(struct unit_test_state *uts)
/* check cursor moved back three more positions, before 'i' */
ut_asserteq(11, scn->cls.num);
ut_asserteq(15, scn->cls.eol_num);
- ut_asserteq_str("sample hopwinda", abuf_data(&tline->buf));
+ ut_asserteq_str("sample hopwinda", abuf_data(&tline->tin.buf));
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
ut_asserteq(19570, video_compress_fb(uts, dev, false));
@@ -1469,7 +1469,7 @@ static int expo_render_textline(struct unit_test_state *uts)
/* check character deleted at cursor position */
ut_asserteq(11, scn->cls.num);
ut_asserteq(14, scn->cls.eol_num);
- ut_asserteq_str("sample hopwnda", abuf_data(&tline->buf));
+ ut_asserteq_str("sample hopwnda", abuf_data(&tline->tin.buf));
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
ut_asserteq(19505, video_compress_fb(uts, dev, false));
@@ -1483,7 +1483,7 @@ static int expo_render_textline(struct unit_test_state *uts)
/* check the textline is closed and text was saved */
ut_asserteq(0, tline->obj.flags & SCENEOF_OPEN);
- ut_asserteq_str("sample hopwnda", abuf_data(&tline->buf));
+ ut_asserteq_str("sample hopwnda", abuf_data(&tline->tin.buf));
ut_assertok(scene_arrange(scn));
ut_assertok(expo_render(exp));
ut_asserteq(19543, video_compress_fb(uts, dev, false));
@@ -1518,16 +1518,16 @@ static int expo_render_textedit(struct unit_test_state *uts)
/* create the label text object */
id = scene_txt_str(scn, "ted-label", 0, 0, "Editor:", NULL);
ut_assert(id > 0);
- ted->label_id = id;
+ ted->tin.label_id = id;
/* create the edit text object pointing to the textedit buffer */
- abuf_printf(&ted->buf, "This\nis the initial contents of the text "
+ abuf_printf(&ted->tin.buf, "This\nis the initial contents of the text "
"editor but it is quite likely that more will be added later");
- id = scene_txt_str(scn, "ted-edit", STR_TEXTED, 0, abuf_data(&ted->buf),
- NULL);
+ id = scene_txt_str(scn, "ted-edit", STR_TEXTED, 0,
+ abuf_data(&ted->tin.buf), NULL);
ut_assert(id > 0);
- ted->edit_id = id;
- ut_assertok(scene_txt_set_font(scn, ted->edit_id,
+ ted->tin.edit_id = id;
+ ut_assertok(scene_txt_set_font(scn, ted->tin.edit_id,
"nimbus_sans_l_regular", 20));
expo_set_scene_id(exp, SCENE1);