]> git.sur5r.net Git - cc65/commitdiff
fixes for GEOS structures, initialized menu/icontabs finally are possible
authorizydorst <izydorst@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 15 Mar 2003 22:39:16 +0000 (22:39 +0000)
committerizydorst <izydorst@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 15 Mar 2003 22:39:16 +0000 (22:39 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2022 b7a2c559-68d2-44c3-8de9-860c34a00d81

include/geos/gstruct.h
samples/geos/menu.c

index ad32290fd37706829ff3ad7803fb1af770d48411..e410ec3a55466bd311c341dcc73d0f612021a7ae 100644 (file)
@@ -5,6 +5,15 @@
   by Maciej 'YTM/Elysium' Witkowiak
 */
 
+/*
+   apart from initializing data, structures below can be used to
+   speed up access to data and let cc65 to generate better code
+   e.g. if you have menu defined as TopMenu and you want to change the number of
+   menu items use:
+    ((struct menu*)&TopMenu)->number=newNumber;
+   This will translate into single lda/sta pair
+*/
+
 #ifndef _GSTRUCT_H
 #define _GSTRUCT_H
 
@@ -110,33 +119,26 @@ struct icondef {          /* icon definition for DoIcons              */
 struct icontab {
        char number;            /* number of declared icons                 */
        struct pixel mousepos;  /* position of mouse after DoIcons          */
-       struct icondef *tab;    /* table of size declared by icontab.number */
+       struct icondef tab[];   /* table of size declared by icontab.number */
 };
 
-/*
-   structures below might be used to speed up access to own menus
-   e.g. if you have menu defined as TopMenu and you want to change the number of
-   menu items use:
-    ((struct menu*)&TopMenu)->number=newNumber;
-   This will allow cc65 to emit better code.
-*/
 
 struct menuitem {
        char *name;
        char type;
-       int rest;               /* may be ptr to function, or if submenu ptr to struct menu */
+       void *rest;             /* may be ptr to function, or ptr to struct menu (submenu) */
 };
 
 struct menu {
        struct window size;
        char number;
-       struct menuitem *items;
+       struct menuitem items[];
 };
 
 struct inittab {               /* use struct inittab mytab[n] for initram              */
        int ptr;                /* ptr to 1st byte                                      */
        char number;            /* number of following bytes                            */
-       char *values;           /* actual string of bytes                               */
+       char values[];          /* actual string of bytes                               */
 };
 
 #endif
index a6a6efd44034251565c8f688341bdf3147c1b38e..78751f8b2c64123ef543cbad3b8dc8d1f019888a 100644 (file)
@@ -15,6 +15,8 @@ void smenu3 (void);
 
 typedef void menuString;
 
+/* you can declare a menu using cc65 non-ANSI extensions */
+
 static const menuString subMenu1 = {
        (char)0, (char)(3*15),
        (unsigned)0, (unsigned)50,
@@ -22,9 +24,24 @@ static const menuString subMenu1 = {
        "subitem1", (char)MENU_ACTION, (unsigned)smenu1,
        "subitem2", (char)MENU_ACTION, (unsigned)smenu2,
        "subitem3", (char)MENU_ACTION, (unsigned)smenu3
-       };
+ };
+
+/* or by using initialized structures */
+
+static struct menu subMenu2 = {
+       { 0, 3*15, 0, 50 },
+       3 | VERTICAL,
+         {
+           { "subitem1", MENU_ACTION, smenu1 },
+           { "subitem2", MENU_ACTION, smenu2 },
+           { "subitem3", MENU_ACTION, smenu3 },
+         }
+ };
 
 void main (void)
 {
+
     DoMenu(&subMenu1);
-    }
+    DoMenu(&subMenu2);
+
+}