Usermode/AxWin3 - Adding pop-up menu support (via a new window type)
[tpg/acess2.git] / Usermode / Applications / axwin3_src / libaxwin3.so_src / r_menu.c
1 /*
2  * AxWin3 Interface Library
3  * - By John Hodge (thePowersGang)
4  *
5  * r_menu.c
6  * - Menu renderer interface
7  */
8 #include <stdlib.h>
9 #include <axwin3/axwin.h>
10 #include <axwin3/menu.h>
11 #include <menu_messages.h>
12 #include "include/internal.h"
13 #include "include/ipc.h"
14 #include <string.h>
15
16 // === TYPES ===
17 typedef struct sMenuWindowInfo  tMenuWindowInfo;
18
19 struct sAxWin3_MenuItem
20 {
21         tHWND   Window;
22          int    ID;
23         tAxWin3_Menu_Callback   Callback;
24         void    *CbPtr;
25         tHWND   SubMenu;
26 };
27
28 struct sMenuWindowInfo
29 {
30          int    nItems;
31         tAxWin3_MenuItem        *Items;
32 };
33
34 // === CODE ===
35 int AxWin3_Menu_int_Callback(tHWND Window, int Message, int Length, void *Data)
36 {
37         tMenuWindowInfo *info = AxWin3_int_GetDataPtr(Window);
38         switch(Message)
39         {
40         case MSG_MENU_SELECT: {
41                 tMenuMsg_Select *msg = Data;
42                 tAxWin3_MenuItem        *item;
43                 if(Length < sizeof(tMenuMsg_Select))    return -1;
44                 if(msg->ID >= info->nItems)     return -1;
45                 item = &info->Items[msg->ID];
46                 if(item->Callback)      item->Callback(item->CbPtr);
47                 return 0; }
48         }
49         return 1;
50 }
51
52 tHWND AxWin3_Menu_Create(tHWND Parent)
53 {
54         tHWND   ret;
55         tMenuWindowInfo *info;
56         
57         ret = AxWin3_CreateWindow(Parent, "Menu", 0, sizeof(*info), AxWin3_Menu_int_Callback);
58         if(!ret)        return ret;
59         
60         info = AxWin3_int_GetDataPtr(ret);
61         info->nItems = 0;
62         info->Items = NULL;
63         
64         return ret;
65 }
66
67 void AxWin3_Menu_ShowAt(tHWND Menu, int X, int Y)
68 {
69         AxWin3_MoveWindow(Menu, X, Y);
70         AxWin3_ShowWindow(Menu, 1);
71 }
72
73 tAxWin3_MenuItem *AxWin3_Menu_AddItem(
74         tHWND Menu, const char *Label,
75         tAxWin3_Menu_Callback Cb, void *Ptr,
76         int Flags, tHWND SubMenu
77         )
78 {
79         tMenuWindowInfo *info;
80         tAxWin3_MenuItem        *ret;
81         
82         info = AxWin3_int_GetDataPtr(Menu);
83         
84         info->nItems ++;
85         info->Items = realloc(info->Items, sizeof(*info->Items)*info->nItems);
86         if(!info->Items) {
87                 _SysDebug("ERROR: Realloc Failed");
88                 return NULL;
89         }
90         
91         ret = &info->Items[info->nItems-1];
92         ret->ID = info->nItems - 1;
93         ret->Window = Menu;
94         ret->Callback = Cb;
95         ret->CbPtr = Ptr;
96         ret->SubMenu = SubMenu; 
97
98         {
99                 tAxWin_IPCMessage       *msg;
100                 tMenuMsg_AddItem        *req;
101                 msg = AxWin3_int_AllocateIPCMessage(Menu, MSG_MENU_ADDITEM, 0, sizeof(*req)+strlen(Label));
102                 req = (void*)msg->Data;
103                 req->ID = ret->ID;
104                 req->Flags = Flags;
105                 req->SubMenuID = AxWin3_int_GetWindowID(SubMenu);
106                 strcpy(req->Label, Label);
107                 AxWin3_int_SendIPCMessage(msg);
108                 free(msg);
109         }
110         
111         return ret;
112 }

UCC git Repository :: git.ucc.asn.au