X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Frenderers%2Fmenu.c;h=e17d954232b305912e87e1f6f2254141c4b03017;hb=2238e69eea50d2274553926f3f294822c1972ff0;hp=ffd1db0da9c3a5ad8fdd5f58746018858b0cabf0;hpb=f0c407e7d468bc5acfd8d436be7f79f6e6248421;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/renderers/menu.c b/Usermode/Applications/axwin3_src/WM/renderers/menu.c index ffd1db0d..e17d9542 100644 --- a/Usermode/Applications/axwin3_src/WM/renderers/menu.c +++ b/Usermode/Applications/axwin3_src/WM/renderers/menu.c @@ -47,6 +47,8 @@ typedef struct sMenuWindowInfo void Renderer_Menu_Init(void); tWindow *Renderer_Menu_Create(int Argument); void Renderer_Menu_Redraw(tWindow *Window); + int Renderer_Menu_HandleIPC_AddItem(tWindow *Window, size_t Length, const void *Data); + int Renderer_Menu_HandleIPC_SetFlags(tWindow *Window, size_t Length, const void *Data); int Renderer_Menu_HandleMessage(tWindow *Window, int Msg, int Length, const void *Data); // === CONSTANTS === @@ -70,7 +72,12 @@ tWMRenderer gRenderer_Menu = { .Name = "Menu", .CreateWindow = Renderer_Menu_Create, .Redraw = Renderer_Menu_Redraw, - .HandleMessage = Renderer_Menu_HandleMessage + .HandleMessage = Renderer_Menu_HandleMessage, + .nIPCHandlers = 2, + .IPCHandlers = { + Renderer_Menu_HandleIPC_AddItem, +// Renderer_Menu_HandleIPC_SetFlags + } }; tFont *gMenu_Font = NULL; // System monospace @@ -196,8 +203,9 @@ void Renderer_Menu_Redraw(tWindow *Window) } } -int Renderer_Menu_int_AddItem(tWindow *Window, int Length, const tMenuMsg_AddItem *Msg) +int Renderer_Menu_HandleIPC_AddItem(tWindow *Window, size_t Length, const void *Data) { + const tMenuIPC_AddItem *Msg = Data; tMenuWindowInfo *info = Window->RendererInfo; tMenuItem *item; @@ -275,17 +283,14 @@ int Renderer_Menu_int_AddItem(tWindow *Window, int Length, const tMenuMsg_AddIte } else { - char tmp = item->Label[item->KeyOffset]; // Get width of preceding substring WM_Render_GetTextDims(NULL, item->Label, item->KeyOffset, &item->UnderlineX, NULL); // Get the width of the underlined character - item->Label[item->KeyOffset] = tmp; // NOTE: 1 makes only one character be parsed, even if it is >1 byte long WM_Render_GetTextDims( NULL, item->Label+item->KeyOffset, 1, &item->UnderlineW, NULL ); - item->Label[item->KeyOffset+1] = tmp; } // - Labels WM_Render_GetTextDims(NULL, item->Label, -1, &item->LabelWidth, NULL); @@ -293,12 +298,16 @@ int Renderer_Menu_int_AddItem(tWindow *Window, int Length, const tMenuMsg_AddIte WM_Render_GetTextDims(NULL, item->Shortcut, -1, &item->ShortcutWidth, NULL); else item->ShortcutWidth = 0; - + + // Get maximum lengths (to determine the size of the menu if( item->LabelWidth > info->MaxLabelWidth ) info->MaxLabelWidth = item->LabelWidth; if( item->ShortcutWidth > info->MaxShortcutWidth ) info->MaxShortcutWidth = item->ShortcutWidth; + // Update width + // TODO: Check, do I want to resize down too? + // TODO: Take into account padding too if( info->MaxLabelWidth + info->MaxShortcutWidth + ciMenu_Gap > info->CachedW ) { info->CachedW = ciMenu_LeftPadding + info->MaxLabelWidth @@ -310,6 +319,9 @@ int Renderer_Menu_int_AddItem(tWindow *Window, int Length, const tMenuMsg_AddIte return 0; } +/** + * \brief Convert coordinates into an item index + */ int Renderer_Menu_int_GetItemByPos(tWindow *Window, tMenuWindowInfo *Info, int X, int Y) { int i; @@ -355,6 +367,7 @@ int Renderer_Menu_HandleMessage(tWindow *Window, int Msg, int Length, const void // TODO: This shouldn't really be done, instead focus should be given // when the menu is shown. // WM_FocusWindow(Window); + WM_RaiseWindow(Window); // If it's shown, raise it to the heavens! } else { @@ -409,16 +422,11 @@ int Renderer_Menu_HandleMessage(tWindow *Window, int Msg, int Length, const void { info->HilightedItem = new_hilight; // TODO: Change sub-menu - WM_Invalidate(Window); + WM_Invalidate(Window, 1); } return 0; } - // Manipulation messages - case MSG_MENU_ADDITEM: -// _SysDebug("MSG_MENU_ADDITEM"); - return Renderer_Menu_int_AddItem(Window, Length, Data); - // Only message to pass to client case MSG_MENU_SELECT: return 1;