aboutsummaryrefslogtreecommitdiffstats
path: root/menu/libmenu
diff options
context:
space:
mode:
Diffstat (limited to 'menu/libmenu')
-rw-r--r--menu/libmenu/menu.c70
-rw-r--r--menu/libmenu/menu.h28
2 files changed, 81 insertions, 17 deletions
diff --git a/menu/libmenu/menu.c b/menu/libmenu/menu.c
index 7d7e76d2..75a8d724 100644
--- a/menu/libmenu/menu.c
+++ b/menu/libmenu/menu.c
@@ -652,6 +652,44 @@ pt_menuitem runmenusystem(uchar top, uchar left, pt_menu cmenu, uchar startopt,
}
}
+// Finds the indexof the menu with given name
+uchar find_menu_num(const char *name)
+{
+ int i;
+ pt_menu m;
+
+ if (name == NULL) return (uchar)(-1);
+ for (i=0; i < ms->nummenus; i++)
+ {
+ m = ms->menus[i];
+ if ((m->name) && (strcmp(m->name,name)==0)) return i;
+ }
+ return (uchar)(-1);
+}
+
+// Run through all items and if they are submenus
+// with a non-trivial "action" and trivial submenunum
+// replace submenunum with the menu with name "action"
+void fix_submenus()
+{
+ int i,j;
+ pt_menu m;
+ pt_menuitem mi;
+
+ i = 0;
+ for (i=0; i < ms->nummenus; i++)
+ {
+ m = ms->menus[i];
+ for (j=0; j < m->numitems; j++)
+ {
+ mi = m->items[j];
+ // if submenu with non-trivial data string
+ if ( (mi->action == OPT_SUBMENU) && (mi->data) )
+ mi->itemdata.submenunum = find_menu_num (mi->data);
+ }
+ }
+}
+
/* User Callable functions */
pt_menuitem showmenus(uchar startmenu)
@@ -659,6 +697,8 @@ pt_menuitem showmenus(uchar startmenu)
pt_menuitem rv;
uchar oldpage,tpos;
+ fix_submenus(); // Fix submenu numbers incase nick names were used
+
// Setup screen for menusystem
oldpage = getdisppage();
setdisppage(ms->menupage);
@@ -673,6 +713,7 @@ pt_menuitem showmenus(uchar startmenu)
cursoroff(); // Doesn't seem to work?
+
// Go, main menu cannot be a radio menu
rv = runmenusystem(ms->minrow+MENUROW, ms->mincol+MENUCOL,
ms->menus[(unsigned int)startmenu], 0, NORMALMENU);
@@ -983,6 +1024,7 @@ uchar add_menu(const char *title, int maxmenusize)
if (m == NULL) return -1;
ms->menus[num] = m;
m->numitems = 0;
+ m->name = NULL;
m->row = 0xFF;
m->col = 0xFF;
if (maxmenusize < 1)
@@ -1004,6 +1046,32 @@ uchar add_menu(const char *title, int maxmenusize)
return ms->nummenus - 1;
}
+void set_menu_name(const char *name) // Set the "name" of this menu
+{
+ pt_menu m;
+
+ m = ms->menus[ms->nummenus-1];
+ if (m->name) // Free up previous name
+ {
+ free(m->name);
+ m -> name = NULL;
+ }
+
+ if (name)
+ {
+ m->name = (char *)malloc(strlen(name)+1);
+ strcpy(m->name,name);
+ }
+}
+
+// Create a new named menu and return its position
+uchar add_named_menu(const char * name, const char *title, int maxmenusize)
+{
+ add_menu(title,maxmenusize);
+ set_menu_name(name);
+ return ms->nummenus - 1;
+}
+
void set_menu_pos(uchar row,uchar col) // Set the position of this menu.
{
pt_menu m;
@@ -1118,6 +1186,7 @@ pt_menuitem add_item(const char *item, const char *status, t_action action,
break;
case OPT_RADIOMENU:
mi->itemdata.radiomenunum = itemdata;
+ if (mi->data) free(mi->data);
mi->data = NULL; // No selection made
break;
default: // to keep the compiler happy
@@ -1146,3 +1215,4 @@ void set_item_options(uchar shortcut,int helpid)
void close_menusystem(void)
{
}
+
diff --git a/menu/libmenu/menu.h b/menu/libmenu/menu.h
index 1e0a6195..a6fae5d2 100644
--- a/menu/libmenu/menu.h
+++ b/menu/libmenu/menu.h
@@ -155,6 +155,7 @@ typedef struct s_menuitem {
char *status;
char *data; // string containing kernel to run.. but...
// for radio menu's this is a pointer to the item selected or NULL (initially)
+ // for submenu's this string could be name of menu
void * extra_data; // Any other data user can point to
t_item_handler handler; // Pointer to function of type menufn
t_action action;
@@ -169,7 +170,8 @@ typedef t_menuitem *pt_menuitem; // Pointer to type menuitem
typedef struct s_menu {
pt_menuitem *items; // pointer to array of pointer to menuitems
- char *title;
+ char *title; // Title string for menu
+ char *name; // menu can be referred to by this string
int maxmenusize; // the size of array allocated
uchar numitems; // how many items do we actually have
uchar menuwidth;
@@ -215,25 +217,10 @@ typedef struct s_menusystem {
typedef t_menusystem *pt_menusystem; // Pointer to type menusystem
-/************************************************************************
- * IMPORTANT INFORMATION
- *
- * All functions which take a string as argument store the pointer
- * for later use. So if you have alloc'ed a space for the string
- * and are passing it to any of these functions, DO NOT deallocate it.
- *
- * If they are constant strings, you may receive warning from the compiler
- * about "converting from char const * to char *". Ignore these errors.
- *
- * This hack/trick of storing these pointers will help in reducing the size
- * of the internal structures by a lot.
- *
- ***************************************************************************
- */
-
pt_menuitem showmenus(uchar startmenu);
pt_menusystem init_menusystem(const char *title);
+
void close_menusystem(); // Deallocate memory used
void set_normal_attr(uchar normal, uchar selected, uchar inactivenormal, uchar inactiveselected);
@@ -261,9 +248,16 @@ void reg_ontimeout(t_timeout_handler, unsigned int numsteps, unsigned int stepsi
// So stepsize=0 means numsteps is measured in centiseconds.
void unreg_ontimeout();
+// Find the number of the menu given the name
+// Returns -1 if not found
+uchar find_menu_num(const char *name);
+
// Create a new menu and return its position
uchar add_menu(const char *title, int maxmenusize);
+// Create a named menu and return its position
+uchar add_named_menu(const char *name, const char *title, int maxmenusize);
+
void set_menu_pos(uchar row,uchar col); // Set the position of this menu.
// Add item to the "current" menu