diff --git a/src/servers/input/InputServerMethod.cpp b/src/servers/input/InputServerMethod.cpp index 6333dc5ec0..1ff173597e 100644 --- a/src/servers/input/InputServerMethod.cpp +++ b/src/servers/input/InputServerMethod.cpp @@ -262,6 +262,11 @@ _BMethodAddOn_::AddMethod() msg.AddInt32("cookie", fCookie); msg.AddString("name", fName); msg.AddData("icon", B_RAW_TYPE, fIcon, 16*16*1); + BMessage menuMsg; + if (fMenu != NULL) + fMenu->Archive(&menuMsg); + msg.AddMessage("menu", &menuMsg); + msg.AddMessenger("target", fMessenger); if (((InputServer*)be_app)->MethodReplicant()) return ((InputServer*)be_app)->MethodReplicant()->SendMessage(&msg); else diff --git a/src/servers/input/MethodReplicant.cpp b/src/servers/input/MethodReplicant.cpp index 95650e39e0..fbeccd0c8f 100644 --- a/src/servers/input/MethodReplicant.cpp +++ b/src/servers/input/MethodReplicant.cpp @@ -367,13 +367,35 @@ MethodReplicant::AddMethod(BMessage* message) return; } + BMessage menuMsg; + if (message->FindMessage("menu", &menuMsg) != B_OK) { + fprintf(stderr, "can't find menu in message\n"); + return; + } + PRINT_OBJECT(menuMsg); + + BMessenger messenger; + if (message->FindMessenger("target", &messenger) != B_OK) { + fprintf(stderr, "can't find target in message\n"); + return; + } + + BMenu* menu = static_cast(BMenu::Instantiate(&menuMsg)); + if (menu == NULL) { + PRINT(("can't instantiate menu\n")); + } else + menu->SetTargetForItems(messenger); + MethodMenuItem* item = FindItemByCookie(cookie); if (item != NULL) { fprintf(stderr, "item with cookie %" B_PRIx32 " already exists\n", cookie); return; } - item = new MethodMenuItem(cookie, name, icon); + if (menu != NULL) { + item = new MethodMenuItem(cookie, name, icon, menu, messenger); + } else + item = new MethodMenuItem(cookie, name, icon); fMenu.AddItem(item); item->SetTarget(this);