void ui_attach_impl(UI *ui) { if (ui_count == MAX_UI_COUNT) { abort(); } if (!ui->ui_ext[kUIMultigrid] && !ui->ui_ext[kUIFloatDebug]) { ui_comp_attach(ui); } uis[ui_count++] = ui; ui_refresh_options(); for (UIExtension i = kUIGlobalCount; (int)i < kUIExtCount; i++) { ui_set_ext_option(ui, i, ui->ui_ext[i]); } bool sent = false; if (ui->ui_ext[kUIHlState]) { sent = highlight_use_hlstate(); } if (!sent) { ui_send_all_hls(ui); } ui_refresh(); }
static void ui_set_option(UI *ui, bool init, String name, Object value, Error *error) { if (strequal(name.data, "rgb")) { if (value.type != kObjectTypeBoolean) { api_set_error(error, kErrorTypeValidation, "rgb must be a Boolean"); return; } ui->rgb = value.data.boolean; // A little drastic, but only legacy uis need to use this option if (!init) { ui_refresh(); } return; } // LEGACY: Deprecated option, use `ext_cmdline` instead. bool is_popupmenu = strequal(name.data, "popupmenu_external"); for (UIExtension i = 0; i < kUIExtCount; i++) { if (strequal(name.data, ui_ext_names[i]) || (i == kUIPopupmenu && is_popupmenu)) { if (value.type != kObjectTypeBoolean) { snprintf((char *)IObuff, IOSIZE, "%s must be a Boolean", name.data); api_set_error(error, kErrorTypeValidation, (char *)IObuff); return; } bool boolval = value.data.boolean; if (!init && i == kUINewgrid && boolval != ui->ui_ext[i]) { // There shouldn't be a reason for an UI to do this ever // so explicitly don't support this. api_set_error(error, kErrorTypeValidation, "ext_newgrid option cannot be changed"); } ui->ui_ext[i] = boolval; if (!init) { ui_set_ext_option(ui, i, boolval); } return; } } api_set_error(error, kErrorTypeValidation, "No such UI option: %s", name.data); }