aboutsummaryrefslogtreecommitdiff
path: root/graphics/macgui/macmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/macgui/macmenu.cpp')
-rw-r--r--graphics/macgui/macmenu.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/graphics/macgui/macmenu.cpp b/graphics/macgui/macmenu.cpp
index 0228798e38..c52a421f81 100644
--- a/graphics/macgui/macmenu.cpp
+++ b/graphics/macgui/macmenu.cpp
@@ -56,6 +56,15 @@ enum {
kFontStyleExtended = 64
};
+enum {
+ kGrayed = 1,
+ kInactive = 2,
+ kPopUp = 16,
+ kMenuBarBreak = 32,
+ kMenuBreak = 64,
+ kEndMenu = 128,
+};
+
struct MacMenuSubItem {
Common::String text;
Common::U32String unicodeText;
@@ -162,6 +171,52 @@ Common::StringArray *MacMenu::readMenuFromResource(Common::SeekableReadStream *r
return result;
}
+static Common::U32String readUnicodeString(Common::SeekableReadStream *stream) {
+ Common::Array<uint32> strData;
+ uint16 wchar;
+ while ((wchar = stream->readUint16LE()) != '\0') {
+ strData.push_back(wchar);
+ }
+ return strData.empty() ? Common::U32String() : Common::U32String(strData.data(), strData.size());
+}
+
+
+MacMenu *MacMenu::createMenuFromPEexe(Common::PEResources &exe, MacWindowManager *wm) {
+ Common::SeekableReadStream *menuData = exe.getResource(Common::kPEMenu, 128);
+ if (!menuData)
+ return nullptr;
+
+ menuData->readUint16LE(); // wVersion
+ menuData->readUint16LE(); // cbHeaderSize
+
+ MacMenu *menu = wm->addMenu();
+
+ int depth = 0;
+ int curMenuItemId = 0;
+ while (depth >= 0) {
+ uint16 flags = menuData->readUint16LE();
+ if (flags & kPopUp) {
+ if (depth == 0) {
+ menu->addMenuItem(readUnicodeString(menuData));
+ } else {
+ // TODO
+ // for now skip
+ readUnicodeString(menuData);
+ }
+ if (!(flags & kEndMenu)) {
+ depth++;
+ }
+ } else {
+ menuData->readUint16LE(); // menu id
+ menu->addMenuSubItem(curMenuItemId, readUnicodeString(menuData), 0);
+ if (flags & kEndMenu) {
+ depth--;
+ }
+ }
+ }
+ return menu;
+}
+
void MacMenu::addStaticMenus(const MacMenuData *data) {
MacMenuItem *about = new MacMenuItem(_wm->_fontMan->hasBuiltInFonts() ? "\xa9" : "\xf0"); // (c) Symbol as the most resembling apple
_items.push_back(about);