Revert 64-bit fixes for input_server.

This patch reverts http://cgit.haiku-os.org/haiku/diff/?id=57ab0395ad31761e27ef6d5aa3af68cc3e4d71b2
It may fix #661. Thanks to kcg369 for pointing it out.

Signed-off-by: Adrien Destugues <[email protected]>

The initial issue was the storage of a pointer in an int32 for
input method cookies. This was fixed in two ways:

- The int32 was initally replaced with a void*, which allowed to store a
  complete pointer, but changed the format of the BMessages used for
  communication, breaking Canna.
- Then, the code was changed to not use a pointer and instead use an
  int32 for the cookie (see #8831). However, the int32 was still cast
  into a void* when putting it into a BMessage, so the problem was still
  there for Canna.

This commit reverts the remaining parts of the initial solution and
restores the ABI to use int32 everywhere.

Fixes #661.
This commit is contained in:
Murai Takashi
2016-09-17 19:35:32 +02:00
committed by Adrien Destugues
parent f8c5cdace0
commit c90d3c9d9f
4 changed files with 28 additions and 28 deletions
+2 -2
View File
@@ -17,7 +17,7 @@
#include <string.h> #include <string.h>
#include "MethodMenuItem.h" #include "MethodMenuItem.h"
MethodMenuItem::MethodMenuItem(void* cookie, const char* name, const uchar* icon, BMenu* subMenu, BMessenger& messenger) MethodMenuItem::MethodMenuItem(int32 cookie, const char* name, const uchar* icon, BMenu* subMenu, BMessenger& messenger)
: BMenuItem(subMenu), : BMenuItem(subMenu),
fIcon(BRect(0, 0, MENUITEM_ICON_SIZE - 1, MENUITEM_ICON_SIZE - 1), B_CMAP8), fIcon(BRect(0, 0, MENUITEM_ICON_SIZE - 1, MENUITEM_ICON_SIZE - 1), B_CMAP8),
fCookie(cookie) fCookie(cookie)
@@ -28,7 +28,7 @@ MethodMenuItem::MethodMenuItem(void* cookie, const char* name, const uchar* icon
} }
MethodMenuItem::MethodMenuItem(void* cookie, const char* name, const uchar* icon) MethodMenuItem::MethodMenuItem(int32 cookie, const char* name, const uchar* icon)
: BMenuItem(name, NULL), : BMenuItem(name, NULL),
fIcon(BRect(0, 0, MENUITEM_ICON_SIZE - 1, MENUITEM_ICON_SIZE - 1), B_CMAP8), fIcon(BRect(0, 0, MENUITEM_ICON_SIZE - 1, MENUITEM_ICON_SIZE - 1), B_CMAP8),
fCookie(cookie) fCookie(cookie)
+4 -4
View File
@@ -24,8 +24,8 @@
class MethodMenuItem : public BMenuItem { class MethodMenuItem : public BMenuItem {
public: public:
MethodMenuItem(void *cookie, const char *label, const uchar *icon, BMenu *subMenu, BMessenger &messenger); MethodMenuItem(int32 cookie, const char *label, const uchar *icon, BMenu *subMenu, BMessenger &messenger);
MethodMenuItem(void *cookie, const char *label, const uchar *icon); MethodMenuItem(int32 cookie, const char *label, const uchar *icon);
virtual ~MethodMenuItem(); virtual ~MethodMenuItem();
@@ -38,10 +38,10 @@ class MethodMenuItem : public BMenuItem {
void SetIcon(const uchar *icon); void SetIcon(const uchar *icon);
const uchar *Icon() { return(uchar *)fIcon.Bits(); }; const uchar *Icon() { return(uchar *)fIcon.Bits(); };
void *Cookie() { return fCookie; }; int32 Cookie() { return fCookie; };
private: private:
BBitmap fIcon; BBitmap fIcon;
void *fCookie; int32 fCookie;
BMessenger fMessenger; BMessenger fMessenger;
}; };
+21 -21
View File
@@ -198,7 +198,7 @@ MethodReplicant::MouseDown(BPoint point)
if (dynamic_cast<MethodMenuItem*>(item) != NULL) { if (dynamic_cast<MethodMenuItem*>(item) != NULL) {
BMessage msg(IS_SET_METHOD); BMessage msg(IS_SET_METHOD);
msg.AddPointer("cookie", ((MethodMenuItem*)item)->Cookie()); msg.AddInt32("cookie", ((MethodMenuItem*)item)->Cookie());
BMessenger messenger(fSignature); BMessenger messenger(fSignature);
messenger.SendMessage(&msg); messenger.SendMessage(&msg);
} }
@@ -216,15 +216,15 @@ void
MethodReplicant::UpdateMethod(BMessage* message) MethodReplicant::UpdateMethod(BMessage* message)
{ {
CALLED(); CALLED();
void* cookie; int32 cookie;
if (message->FindPointer("cookie", &cookie) != B_OK) { if (message->FindInt32("cookie", &cookie) != B_OK) {
fprintf(stderr, "can't find cookie in message\n"); fprintf(stderr, "can't find cookie in message\n");
return; return;
} }
MethodMenuItem* item = FindItemByCookie(cookie); MethodMenuItem* item = FindItemByCookie(cookie);
if (item == NULL) { if (item == NULL) {
fprintf(stderr, "can't find item with cookie %p\n", cookie); fprintf(stderr, "can't find item with cookie %" B_PRIx32 "\n", cookie);
return; return;
} }
item->SetMarked(true); item->SetMarked(true);
@@ -239,8 +239,8 @@ void
MethodReplicant::UpdateMethodIcon(BMessage* message) MethodReplicant::UpdateMethodIcon(BMessage* message)
{ {
CALLED(); CALLED();
void* cookie; int32 cookie;
if (message->FindPointer("cookie", &cookie) != B_OK) { if (message->FindInt32("cookie", &cookie) != B_OK) {
fprintf(stderr, "can't find cookie in message\n"); fprintf(stderr, "can't find cookie in message\n");
return; return;
} }
@@ -255,7 +255,7 @@ MethodReplicant::UpdateMethodIcon(BMessage* message)
MethodMenuItem* item = FindItemByCookie(cookie); MethodMenuItem* item = FindItemByCookie(cookie);
if (item == NULL) { if (item == NULL) {
fprintf(stderr, "can't find item with cookie %p\n", cookie); fprintf(stderr, "can't find item with cookie %" B_PRIx32 "\n", cookie);
return; return;
} }
@@ -267,8 +267,8 @@ void
MethodReplicant::UpdateMethodMenu(BMessage* message) MethodReplicant::UpdateMethodMenu(BMessage* message)
{ {
CALLED(); CALLED();
void* cookie; int32 cookie;
if (message->FindPointer("cookie", &cookie) != B_OK) { if (message->FindInt32("cookie", &cookie) != B_OK) {
fprintf(stderr, "can't find cookie in message\n"); fprintf(stderr, "can't find cookie in message\n");
return; return;
} }
@@ -294,7 +294,7 @@ MethodReplicant::UpdateMethodMenu(BMessage* message)
MethodMenuItem* item = FindItemByCookie(cookie); MethodMenuItem* item = FindItemByCookie(cookie);
if (item == NULL) { if (item == NULL) {
fprintf(stderr, "can't find item with cookie %p\n", cookie); fprintf(stderr, "can't find item with cookie %" B_PRIx32 "\n", cookie);
return; return;
} }
int32 index = fMenu.IndexOf(item); int32 index = fMenu.IndexOf(item);
@@ -317,8 +317,8 @@ void
MethodReplicant::UpdateMethodName(BMessage* message) MethodReplicant::UpdateMethodName(BMessage* message)
{ {
CALLED(); CALLED();
void* cookie; int32 cookie;
if (message->FindPointer("cookie", &cookie) != B_OK) { if (message->FindInt32("cookie", &cookie) != B_OK) {
fprintf(stderr, "can't find cookie in message\n"); fprintf(stderr, "can't find cookie in message\n");
return; return;
} }
@@ -331,7 +331,7 @@ MethodReplicant::UpdateMethodName(BMessage* message)
MethodMenuItem* item = FindItemByCookie(cookie); MethodMenuItem* item = FindItemByCookie(cookie);
if (item == NULL) { if (item == NULL) {
fprintf(stderr, "can't find item with cookie %p\n", cookie); fprintf(stderr, "can't find item with cookie %" B_PRIx32 "\n", cookie);
return; return;
} }
@@ -340,11 +340,11 @@ MethodReplicant::UpdateMethodName(BMessage* message)
MethodMenuItem* MethodMenuItem*
MethodReplicant::FindItemByCookie(void* cookie) MethodReplicant::FindItemByCookie(int32 cookie)
{ {
for (int32 i = 0; i < fMenu.CountItems(); i++) { for (int32 i = 0; i < fMenu.CountItems(); i++) {
MethodMenuItem* item = (MethodMenuItem*)fMenu.ItemAt(i); MethodMenuItem* item = (MethodMenuItem*)fMenu.ItemAt(i);
PRINT(("cookie : %p\n", item->Cookie())); PRINT(("cookie : 0x%" B_PRIx32 "\n", item->Cookie()));
if (item->Cookie() == cookie) if (item->Cookie() == cookie)
return item; return item;
} }
@@ -357,8 +357,8 @@ void
MethodReplicant::AddMethod(BMessage* message) MethodReplicant::AddMethod(BMessage* message)
{ {
CALLED(); CALLED();
void* cookie; int32 cookie;
if (message->FindPointer("cookie", &cookie) != B_OK) { if (message->FindInt32("cookie", &cookie) != B_OK) {
fprintf(stderr, "can't find cookie in message\n"); fprintf(stderr, "can't find cookie in message\n");
return; return;
} }
@@ -379,7 +379,7 @@ MethodReplicant::AddMethod(BMessage* message)
MethodMenuItem* item = FindItemByCookie(cookie); MethodMenuItem* item = FindItemByCookie(cookie);
if (item != NULL) { if (item != NULL) {
fprintf(stderr, "item with cookie %p already exists\n", cookie); fprintf(stderr, "item with cookie %" B_PRIx32 " already exists\n", cookie);
return; return;
} }
@@ -396,15 +396,15 @@ void
MethodReplicant::RemoveMethod(BMessage* message) MethodReplicant::RemoveMethod(BMessage* message)
{ {
CALLED(); CALLED();
void* cookie; int32 cookie;
if (message->FindPointer("cookie", &cookie) != B_OK) { if (message->FindInt32("cookie", &cookie) != B_OK) {
fprintf(stderr, "can't find cookie in message\n"); fprintf(stderr, "can't find cookie in message\n");
return; return;
} }
MethodMenuItem* item = FindItemByCookie(cookie); MethodMenuItem* item = FindItemByCookie(cookie);
if (item == NULL) { if (item == NULL) {
fprintf(stderr, "can't find item with cookie %p\n", cookie); fprintf(stderr, "can't find item with cookie %" B_PRIx32 "\n", cookie);
return; return;
} }
fMenu.RemoveItem(item); fMenu.RemoveItem(item);
+1 -1
View File
@@ -57,7 +57,7 @@ class MethodReplicant : public BView {
void UpdateMethodName(BMessage *); void UpdateMethodName(BMessage *);
void AddMethod(BMessage *message); void AddMethod(BMessage *message);
void RemoveMethod(BMessage *message); void RemoveMethod(BMessage *message);
MethodMenuItem *FindItemByCookie(void *cookie); MethodMenuItem *FindItemByCookie(int32 cookie);
}; };
#endif #endif