2 * Acess2 Window Manager v3
3 * - By John Hodge (thePowersGang)
6 * - Pop-up menu window class/renderer
9 #include <menu_messages.h>
12 typedef struct sMenuItem
29 typedef struct sMenuWindowInfo
40 tWMRenderer gRenderer_Menu = {
42 .CreateWindow = Renderer_Menu_Create,
43 .Redraw = Renderer_Menu_Redraw,
44 .HandleMessage = Renderer_Menu_HandleMessage
48 void Renderer_Menu_Init(void)
50 WM_RegisterRenderer(&gRenderer_Menu);
53 tWindow *Renderer_Menu_Create(int Argument)
56 tMenuWindowInfo *info;
58 if(Argument < 5) Argument = 5;
59 if(Argument > 200) Argument = 200;
61 ret = WM_CreateWindowStruct(sizeof(*info) + Argument*sizeof(info->Items[0]));
62 info = ret->RendererInfo;
63 info->MaxItems = Argument;
68 void Renderer_Menu_Redraw(tWindow *Window)
70 // TODO: Implement Renderer_Menu_Redraw
72 // - Resize window to contain all items
74 // - Move the window such that it is on screen
75 // > Make sure to catch if the menu can't fit fully onscreen
80 int Renderer_Menu_HandleMessage(tWindow *Window, int Msg, int Length, void *Data)
84 case MSG_MENU_ADDITEM: {
85 tMenuMsg_AddItem *req = Data;
87 if(Length < sizeof(*req) + 1) return -1;
88 if(req->Label[Length-sizeof(*req)] != '\0') return -1;
90 if(info->Items[req->ID]) break;
91 item = malloc(sizeof(tMenuItem)+strlen(req->Label));
92 info->Items[req->ID] = item;
94 if(req->Label[0] == '\0')
102 char *dest = item->Data;
103 char *src = req->Label;
106 item->KeyOffset = -1;
108 for(ofs = 0; *src && *src != '\t'; ofs ++)
112 item->KeyOffset = ofs;
120 // - Key combo / Shortcut
124 item->Shortcut = dest;
125 strcpy(item->Shortcut, src);
129 item->Shortcut = NULL;
133 // - Underline (hotkey)
134 if(item->KeyOffset == -1)
136 item->UnderlineX = 0;
137 item->UnderlineW = 0;
141 char tmp = item->Label[item->KeyOffset];
142 item->Label[item->KeyOffset] = '\0';
143 WM_Render_GetTextDims(NULL, item->Label, &item->UnderlineX, NULL);
144 item->Label[item->KeyOffset] = tmp;
145 tmp = item->Label[item->KeyOffset+1];
146 item->Label[item->KeyOffset+1] = '\0';
147 WM_Render_GetTextDims(NULL, item->Label+item->KeyOffset, &item->UnderlineW, NULL);
148 item->Label[item->KeyOffset+1] = tmp;
151 WM_Render_GetTextDims(NULL, item->Label, &item->LabelWidth, NULL);
153 WM_Render_GetTextDims(NULL, item->Shortcut, &item->ShortcutWidth, NULL);
155 item->ShortcutWidth = 0;
160 // Only message to pass to client
161 case MSG_MENU_SELECT: