diff --git a/rlib/c/menu b/rlib/c/menu index c1876fc5f38a554bba3e92299fc06fbc648f2e8d..54b4e867c6779104365e283f5ca1850f73895b35 100644 --- a/rlib/c/menu +++ b/rlib/c/menu @@ -51,10 +51,10 @@ typedef struct menu__str { wimp_menuhdr *m; /* the wimp-level menu that we've built. */ - int nitems; + int nitems; /* items in menu */ void *entryspace; /* for sub-menus, and entries with >12 chars */ - int nbytes; - int maxentrywidth; + int nbytes; /* bytes used in entryspace */ + int maxentrywidth; /* used to set menu width */ } menu__str; /* concrete representation of abstract menu object */ @@ -80,7 +80,7 @@ into the allocation of store and then the copying of data, so that the copy into the larger buffer can share the latter half of the operation. */ static void menu__disposespace(menu m) -{ +{ /* Free two areas (header+icons & indirect data) for a complete menu */ if (m->m != 0) { free(m->m); m->m = 0; @@ -173,7 +173,7 @@ static void menu__copyworkarea(menu__workarea *w /*in*/, menu m /*out*/) /* -------- Creating menu descriptions. -------- */ static void menu__initmenu(char *name, menu m /*out*/) -{ +{ /* Create and initialise menu structure, block and entryspace */ int i; for (i=0; i<12; i++) { m->m->title[i] = name[i]; @@ -193,6 +193,7 @@ static int menu__max(int a, int b) static wimp_menuitem *menu__additem( menu__workarea *w /*out*/, char *name, int length) +/* Add an item to the end of a menu */ /* The returned pointer can be used to set flags, etc. */ { wimp_menuitem *ptr; @@ -207,6 +208,7 @@ static wimp_menuitem *menu__additem( /* in OS units, 16 per char. */ } if (length <= 12) { + /* item can be directly in the icon, so copy to icon block. */ int i; for (i=0; i<length; i++) {ptr->data.text[i] = name[i];} if (length < 12) {ptr->data.text[length] = 0;} @@ -214,10 +216,12 @@ static wimp_menuitem *menu__additem( /* no room for the text: unlikely */ ptr = menu__itemptr(&w->m, w->m.nitems-1); /* fudge */ } else { + /* space for length, so set up icon block to be indirect */ ptr->iconflags += wimp_INDIRECT; ptr->data.indirecttext.buffer = ((char*)w->m.entryspace) + w->m.nbytes; ptr->data.indirecttext.validstring = (char*) -1; ptr->data.indirecttext.bufflen = 100; + /* copy name into entryspace */ (void) memmove(((char*)w->m.entryspace) + w->m.nbytes, name, length); w->m.nbytes += length + 1; ((char*)w->m.entryspace)[w->m.nbytes-1] = 0; /* terminate the string. */ @@ -275,7 +279,6 @@ static void menu__getopt(parser *p) } static void menu__getname (parser *p) - { /*Skip leading spaces*/ while (p->ch == ' ') p->ch = *p->s++; @@ -407,7 +410,7 @@ static void menu__doextend(menu__workarea *w, char *descr) /* -------- Entrypoints. -------- */ menu menu_new(char *name, char *descr) -{ +{ /* Create a new menu from the list of entries in descr */ menu m; menu__workarea menu__w; wimp_menuitem *ptr; @@ -431,7 +434,7 @@ menu menu_new(char *name, char *descr) } void menu_dispose(menu *m, int recursive) -{ +{ /* Free the storage associated with a menu - and optionally submenus. */ if (recursive != 0) { menu *a = (menu*) ((*m)->entryspace); while (1) { @@ -445,7 +448,7 @@ void menu_dispose(menu *m, int recursive) } void menu_extend(menu m, char *descr) -{ +{ /* Add one (or more) items from descr to existing menu. */ menu__workarea menu__w; menu__copytoworkarea(m, &menu__w); menu__doextend(&menu__w, descr); @@ -453,7 +456,7 @@ void menu_extend(menu m, char *descr) } void menu_setflags(menu m, int entry, int tick, int fade) -{ +{ /* Set/Unset tick and fade flags on specific menu entry */ wimp_menuitem *p; if (entry == 0) {return;} if (entry > m->nitems) {return;} @@ -515,7 +518,7 @@ void menu_make_sprite(menu m, int entry, char *spritename) void menu_submenu(menu m, int place, menu submenu) -{ +{ /* Link a submenu to an entry in a parent menu */ int i; wimp_menuitem *p = menu__itemptr(m, place-1); menu__workarea menu__w;