+ struct cui_opt_data *data = item->data;
+ if (data && data->dev && data->dev == dev)
+ pmenu_remove(cui->main,item);
+ }
+ /* Look in plugins menu too */
+ for (i=0; i < cui->plugin_menu->item_count; i++) {
+ struct pmenu_item *item = item_userptr(cui->plugin_menu->items[i]);
+ if (!item || !item->data )
+ continue;
+
+ struct cui_opt_data *data = item->data;
+ if (data && data->dev && data->dev == dev)
+ pmenu_remove(cui->plugin_menu,item);
+ }
+
+ /* Re-attach the items array. */
+
+ result = set_menu_items(cui->main->ncm, cui->main->items);
+ result |= set_menu_items(cui->plugin_menu->ncm, cui->plugin_menu->items);
+
+ /* Move cursor to 'Exit' menu entry for the main menu.. */
+ menu_format(cui->main->ncm, &rows, &cols);
+ last = cui->main->item_count - 1;
+ set_current_item(cui->main->ncm, cui->main->items[last]);
+ if (!item_visible(cui->main->items[last])) {
+ top = last < rows ? 0 : last - rows + 1;
+ set_top_row(cui->main->ncm, top);
+ }
+
+ /* ..and the plugin menu */
+ menu_format(cui->plugin_menu->ncm, &rows, &cols);
+ last = cui->plugin_menu->item_count - 1;
+ set_current_item(cui->plugin_menu->ncm, cui->plugin_menu->items[last]);
+ if (!item_visible(cui->plugin_menu->items[last])) {
+ top = last < rows ? 0 : last - rows + 1;
+ set_top_row(cui->plugin_menu->ncm, top);
+ }
+
+ if (result)
+ pb_log("%s: set_menu_items failed: %d\n", __func__, result);
+
+ if (0) {
+ pb_log("%s\n", __func__);
+ pmenu_dump_items(cui->main->items,
+ item_count(cui->main->ncm) + 1);
+ }
+
+ if (cui->current == &cui->main->scr)
+ nc_scr_post(cui->current);
+ if (cui->current == &cui->plugin_menu->scr)
+ nc_scr_post(cui->current);
+}
+
+static void cui_update_status(struct status *status, void *arg)
+{
+ struct cui *cui = cui_from_arg(arg);
+
+ statuslog_append_steal(cui, cui->statuslog, status);
+
+ /* Ignore status messages from the backlog */
+ if (!status->backlog)
+ nc_scr_status_printf(cui->current, "%s", status->message);
+}
+
+/*
+ * Handle a new installed plugin option and update its associated
+ * (uninstalled) menu item if it exists.
+ */
+static int cui_plugin_option_add(struct plugin_option *opt, void *arg)
+{
+ struct cui_opt_data *cod;
+ struct cui *cui = cui_from_arg(arg);
+ struct pmenu_item *item = NULL;
+ struct boot_option *dummy_opt;
+ struct device *dev;
+ unsigned int i;
+ int result;
+
+fallback:
+ /* Find uninstalled plugin by matching on plugin_file */
+ for (i = 0; i < cui->plugin_menu->item_count; i++) {
+ item = item_userptr(cui->plugin_menu->items[i]);
+ if (!item)
+ continue;
+ cod = cod_from_item(item);
+ if (!cod || !cod->pd)
+ continue;
+ if (strncmp(cod->pd->plugin_file, opt->plugin_file,
+ strlen(cod->pd->plugin_file)) == 0)
+ break;
+ }