[PATCH 1/2] ui/ncurses: Add function to insert boot entries in specific position

Samuel Mendoza-Jonas sam.mj at au1.ibm.com
Thu Jul 3 15:53:50 EST 2014


pmenu_item_add() is added in preparation for changes to the ncurses
UI where boot entries are grouped underneath the name of the matching
boot device

Signed-off-by: Samuel Mendoza-Jonas <sam.mj at au1.ibm.com>
---
 ui/ncurses/nc-menu.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 ui/ncurses/nc-menu.h |  1 +
 2 files changed, 46 insertions(+)

diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c
index 7d4442b..147d9e3 100644
--- a/ui/ncurses/nc-menu.c
+++ b/ui/ncurses/nc-menu.c
@@ -163,6 +163,51 @@ void pmenu_item_insert(struct pmenu *menu, struct pmenu_item *item,
 	menu->items[index] = item->nci;
 }
 
+/**
+ * pmenu_item_add - Insert item into appropriate position
+ *
+ * Inserts boot entry under matching, predefined device header entry,
+ * moving items in the list if necessary
+ */
+
+void pmenu_item_add(struct pmenu *menu, struct pmenu_item *item, unsigned int insert_pt)
+{
+        unsigned int dev;
+        int found = 0;
+        struct cui_opt_data *cod = item->data;;
+
+        /* Items array should already be disconnected */
+
+        for (dev=0; dev<menu->item_count; dev++){
+                if(menu->items[dev]){
+                        struct pmenu_item *i = item_userptr(menu->items[dev]);
+                        struct cui_opt_data *d = i->data;
+                        if(d && !d->opt){
+                                /* Device header will have opt == NULL */
+                                pb_debug("%s: Found item %s\n",__func__,d->name);
+                                if(!strcmp(cod->opt->device_id,d->name)){
+                                        found = 1;
+                                        break;
+                                }
+                        }
+                }
+        }
+
+        if(found){
+                assert(dev<insert_pt);
+                /* Shift down entries between header and insert_pt */
+                memmove(menu->items + dev + 2,
+                       menu->items + dev + 1,
+                       ((menu->items + insert_pt) - (menu->items + dev + 1)) * sizeof(ITEM *));
+                memset(menu->items + dev + 1, 0, sizeof(ITEM *));
+                pmenu_item_insert(menu, item, dev + 1);
+        } else {
+                /* For some reason we didn't find the matching device;
+                 * at least add it to a valid position */
+                pmenu_item_insert(menu, item, insert_pt);
+        }
+}
+
 static int pmenu_item_get_index(const struct pmenu_item *item)
 {
 	unsigned int i;
diff --git a/ui/ncurses/nc-menu.h b/ui/ncurses/nc-menu.h
index 8e9c56b..357fd1a 100644
--- a/ui/ncurses/nc-menu.h
+++ b/ui/ncurses/nc-menu.h
@@ -56,6 +56,7 @@ struct pmenu_item {
 struct pmenu_item *pmenu_item_create(struct pmenu *menu, const char *name);
 void pmenu_item_insert(struct pmenu *menu, struct pmenu_item *item,
 	unsigned int index);
+void pmenu_item_add(struct pmenu *menu, struct pmenu_item *item, unsigned int insert_pt);
 void pmenu_item_delete(struct pmenu_item *item);
 
 static inline struct pmenu_item *pmenu_item_from_arg(void *arg)
-- 
1.9.3



More information about the Petitboot mailing list