Input_server: fix archiving of input method replicants

- Make sure the archive contains the replicant pop-up menu
- Make sure said menu is properly re-targetted when instanciating

Fixes #13138

Signed-off-by: Adrien Destugues <[email protected]>
This commit is contained in:
Sean Healy
2017-01-15 12:31:13 +01:00
committed by Adrien Destugues
parent 856ecc7b19
commit baf9ae1d47
2 changed files with 28 additions and 1 deletions
+5
View File
@@ -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
+23 -1
View File
@@ -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*>(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);