Finally fixed Adi's repeatedly mentioned pet peeve: in AS_LAYER_GET_MOUSE_COORDS
communication, the port's reply port is no longer sent to the app_server (as it knows where to reply to, anyway). Also made sure the view's looper is locked while getting the coords - I guess BPortLink doesn't like to be written to from two different threads :-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12742 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1205,15 +1205,14 @@ BView::GetMouse(BPoint *location, uint32 *buttons, bool checkMessageQueue)
|
|||||||
queue->Unlock();
|
queue->Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Since we're usually called locked, this is mainly needed
|
||||||
|
// in case we were called from another thread
|
||||||
|
LockLooper();
|
||||||
|
|
||||||
// If no mouse update message has been found in the message queue,
|
// If no mouse update message has been found in the message queue,
|
||||||
// we get the current mouse location and buttons from the app_server
|
// we get the current mouse location and buttons from the app_server
|
||||||
|
|
||||||
owner->fLink->StartMessage(AS_LAYER_GET_MOUSE_COORDS);
|
owner->fLink->StartMessage(AS_LAYER_GET_MOUSE_COORDS);
|
||||||
|
|
||||||
// This is because BPortLink doesn't automatically attach the reply
|
|
||||||
// port to a synchronous message. Bummer.
|
|
||||||
// TODO: Fix BPortLink synchronous reply code
|
|
||||||
owner->fLink->Attach<port_id>(owner->fLink->GetReplyPort());
|
|
||||||
owner->fLink->Flush();
|
owner->fLink->Flush();
|
||||||
|
|
||||||
int32 rCode = SERVER_FALSE;
|
int32 rCode = SERVER_FALSE;
|
||||||
@@ -1222,6 +1221,8 @@ BView::GetMouse(BPoint *location, uint32 *buttons, bool checkMessageQueue)
|
|||||||
owner->fLink->Read<BPoint>(location);
|
owner->fLink->Read<BPoint>(location);
|
||||||
owner->fLink->Read((int32 *)buttons, sizeof(int32));
|
owner->fLink->Read((int32 *)buttons, sizeof(int32));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UnlockLooper();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1487,34 +1487,24 @@ void ServerWindow::DispatchMessage(int32 code, LinkMsgReader &link)
|
|||||||
}
|
}
|
||||||
case AS_LAYER_GET_MOUSE_COORDS:
|
case AS_LAYER_GET_MOUSE_COORDS:
|
||||||
{
|
{
|
||||||
DTRACE(("ServerWindow %s: Message AS_GET_MOUSE_COORDS\n",fName));
|
DTRACE(("ServerWindow %s: Message AS_GET_MOUSE_COORDS\n", fName));
|
||||||
|
|
||||||
// Attached Data:
|
fMsgSender->StartMessage(SERVER_TRUE);
|
||||||
// 1) port_id reply port
|
|
||||||
|
|
||||||
// Returns
|
// Returns
|
||||||
// 1) BPoint mouse location
|
// 1) BPoint mouse location
|
||||||
// 2) int32 button state
|
// 2) int32 button state
|
||||||
|
|
||||||
// For now, it's unimplemented, but this is a synchronous call, so to prevent debugging of
|
fMsgSender->Attach<BPoint>(desktop->GetDisplayDriver()->GetCursorPosition());
|
||||||
// applications which make this call, we'll reply with a SERVER_FALSE until it is implemeneted
|
fMsgSender->Attach<int32>(desktop->ActiveRootLayer()->Buttons());
|
||||||
|
|
||||||
port_id replyport;
|
fMsgSender->Flush();
|
||||||
link.Read<port_id>(&replyport);
|
|
||||||
|
|
||||||
int32 buttons=desktop->ActiveRootLayer()->Buttons();
|
|
||||||
|
|
||||||
BPortLink replylink(replyport);
|
|
||||||
replylink.StartMessage(SERVER_TRUE);
|
|
||||||
replylink.Attach<BPoint>(desktop->GetDisplayDriver()->GetCursorPosition());
|
|
||||||
replylink.Attach<int32>(buttons);
|
|
||||||
replylink.Flush();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
|
||||||
DispatchGraphicsMessage(code, link);
|
DispatchGraphicsMessage(code, link);
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// -------------------- Graphics messages ----------------------------------
|
// -------------------- Graphics messages ----------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user