Pahtz's changes to use BPortLink systemwide, with a few minor other changes

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8520 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm 2004-07-30 15:16:59 +00:00
parent 3ceb31b96a
commit ad56ce66a3
18 changed files with 713 additions and 700 deletions

View File

@ -26,15 +26,11 @@
//------------------------------------------------------------------------------
#include <AppDefs.h>
#include <Accelerant.h>
#include <PortMessage.h>
#include <Entry.h>
#include <Path.h>
#include <Directory.h>
#include <PortMessage.h>
#include <PortLink.h>
#include <Session.h>
#include <File.h>
#include <Message.h>
#include "AppServer.h"
@ -53,8 +49,17 @@
#include "Desktop.h"
//#define DEBUG_KEYHANDLING
//#define DEBUG_SERVER
#ifdef DEBUG_KEYHANDLING
# include <stdio.h>
# define KBTRACE(x) printf x
#else
# define KBTRACE(x) ;
#endif
#ifdef DEBUG_SERVER
# include <stdio.h>
# define STRACE(x) printf x
#else
# define STRACE(x) ;
@ -86,7 +91,7 @@ AppServer::AppServer(void)
#endif
{
fMousePort= create_port(200,SERVER_INPUT_PORT);
_fMessagePort= create_port(200,SERVER_PORT_NAME);
fMessagePort= create_port(200,SERVER_PORT_NAME);
fAppList= new BList(0);
fQuittingServer= false;
@ -206,22 +211,23 @@ AppServer::~AppServer(void)
int32 AppServer::PollerThread(void *data)
{
// This thread handles nothing but input messages for mouse and keyboard
AppServer *appserver=(AppServer*)data;
PortQueue mousequeue(appserver->fMousePort);
PortMessage *msg;
AppServer *appserver=(AppServer*)data;
BPortLink mousequeue(-1,appserver->fMousePort);
int32 code=0;
status_t err=B_OK;
for(;;)
{
if(!mousequeue.MessagesWaiting())
mousequeue.GetMessagesFromPort(true);
else
mousequeue.GetMessagesFromPort(false);
msg= mousequeue.GetMessageFromQueue();
if(!msg)
STRACE(("info: AppServer::PollerThread listening on port %ld.\n", appserver->fMousePort));
err=mousequeue.GetNextReply(&code);
if(err<B_OK)
{
STRACE(("PollerThread:mousequeue.GetNextReply failed\n"));
continue;
switch(msg->Code())
}
switch(code)
{
// We don't need to do anything with these two, so just pass them
// onto the active application. Eventually, we will end up passing
@ -230,7 +236,7 @@ int32 AppServer::PollerThread(void *data)
case B_MOUSE_UP:
case B_MOUSE_WHEEL_CHANGED:
case B_MOUSE_MOVED:
desktop->MouseEventHandler(msg);
desktop->MouseEventHandler(code,mousequeue);
break;
case B_KEY_DOWN:
@ -238,20 +244,18 @@ int32 AppServer::PollerThread(void *data)
case B_UNMAPPED_KEY_DOWN:
case B_UNMAPPED_KEY_UP:
case B_MODIFIERS_CHANGED:
desktop->KeyboardEventHandler(msg);
desktop->KeyboardEventHandler(code,mousequeue);
break;
default:
printf("Server::Poller received unexpected code %lx\n",msg->Code());
STRACE(("AppServer::Poller received unexpected code %lx\n",code));
break;
}
delete msg;
if(appserver->fExitPoller)
break;
}
return 0;
return err;
}
/*!
@ -304,41 +308,45 @@ thread_id AppServer::Run(void)
//! Main message-monitoring loop for the regular message port - no input messages!
void AppServer::MainLoop(void)
{
PortMessage pmsg;
BPortLink pmsg(-1,fMessagePort);
int32 code=0;
status_t err=B_OK;
while(1)
{
if(pmsg.ReadFromPort(_fMessagePort)== B_OK)
{
if(pmsg.Protocol()== B_QUIT_REQUESTED)
pmsg.SetCode(B_QUIT_REQUESTED);
switch(pmsg.Code())
{
case B_QUIT_REQUESTED:
case AS_CREATE_APP:
case AS_DELETE_APP:
case AS_GET_SCREEN_MODE:
case AS_UPDATED_CLIENT_FONTLIST:
case AS_QUERY_FONTS_CHANGED:
case AS_SET_UI_COLORS:
case AS_GET_UI_COLOR:
case AS_SET_DECORATOR:
case AS_GET_DECORATOR:
case AS_R5_SET_DECORATOR:
DispatchMessage(&pmsg);
break;
default:
{
printf("Server::MainLoop received unexpected code %ld(offset %ld)\n",
pmsg.Code(),pmsg.Code()-SERVER_TRUE);
break;
}
}
STRACE(("info: AppServer::MainLoop listening on port %ld.\n", fMessagePort));
err=pmsg.GetNextReply(&code);
if(err<B_OK)
{
STRACE(("MainLoop:pmsg.GetNextReply failed\n"));
continue;
}
switch(code)
{
case B_QUIT_REQUESTED:
case AS_CREATE_APP:
case AS_DELETE_APP:
case AS_GET_SCREEN_MODE:
case AS_UPDATED_CLIENT_FONTLIST:
case AS_QUERY_FONTS_CHANGED:
case AS_SET_UI_COLORS:
case AS_GET_UI_COLOR:
case AS_SET_DECORATOR:
case AS_GET_DECORATOR:
case AS_R5_SET_DECORATOR:
DispatchMessage(code,pmsg);
break;
default:
{
STRACE(("Server::MainLoop received unexpected code %ld(offset %ld)\n",
code,code-SERVER_TRUE));
break;
}
}
if(pmsg.Code()==AS_DELETE_APP || (pmsg.Protocol()==B_QUIT_REQUESTED && DISPLAYDRIVER!=HWDRIVER))
if(code==AS_DELETE_APP || (code==B_QUIT_REQUESTED && DISPLAYDRIVER!=HWDRIVER))
{
if(fQuittingServer== true && fAppList->CountItems()== 0)
break;
@ -384,13 +392,14 @@ bool AppServer::LoadDecorator(const char *path)
// Get the instantiation function
stat= get_image_symbol(addon, "instantiate_decorator", B_SYMBOL_TYPE_TEXT, (void**)&pcreatefunc);
if(stat != B_OK){
if(stat != B_OK)
{
unload_add_on(addon);
return false;
}
BPath temppath(path);
fDecoratorName= temppath.Leaf();
BPath temppath(path);
fDecoratorName=temppath.Leaf();
acquire_sem(fDecoratorLock);
make_decorator=pcreatefunc;
@ -436,12 +445,12 @@ void AppServer::InitDecorators(void)
/*!
\brief Message handling function for all messages sent to the app_server
\param code ID of the message sent
\param buffer Attachement buffer for the message.
\param buffer Attachment buffer for the message.
*/
void AppServer::DispatchMessage(PortMessage *msg)
void AppServer::DispatchMessage(int32 code, BPortLink &msg)
{
switch(msg->Code())
switch(code)
{
case AS_CREATE_APP:
{
@ -456,45 +465,47 @@ void AppServer::DispatchMessage(PortMessage *msg)
// 5) port_id - port to reply to
// Find the necessary data
team_id clientTeamID;
port_id clientLooperPort;
port_id reply_port;
port_id app_port;
int32 htoken;
char* app_signature;
team_id clientTeamID=-1;
port_id clientLooperPort=-1;
port_id reply_port=-1; // TODO: deprecated
port_id app_port=-1;
int32 htoken=B_NULL_TOKEN;
char *app_signature=NULL;
msg->Read<port_id>(&app_port);
msg->Read<port_id>(&clientLooperPort);
msg->Read<team_id>(&clientTeamID);
msg->Read<int32>(&htoken);
msg->ReadString(&app_signature);
msg->Read<int32>(&reply_port);
msg.Read<port_id>(&app_port);
msg.Read<port_id>(&clientLooperPort);
msg.Read<team_id>(&clientTeamID);
msg.Read<int32>(&htoken);
msg.ReadString(&app_signature);
msg.Read<int32>(&reply_port);
// Create the ServerApp subthread for this app
acquire_sem(fAppListLock);
port_id r= create_port(DEFAULT_MONITOR_PORT_SIZE, app_signature);
if(r== B_NO_MORE_PORTS || r== B_BAD_VALUE)
port_id server_listen=create_port(DEFAULT_MONITOR_PORT_SIZE, app_signature);
if(server_listen<B_OK)
{
release_sem(fAppListLock);
printf("No more ports left. Time to crash. Have a nice day! :)\n");
break;
}
ServerApp *newapp;
newapp= new ServerApp(app_port, r, clientLooperPort, clientTeamID, htoken, app_signature);
ServerApp *newapp=NULL;
newapp= new ServerApp(app_port,server_listen, clientLooperPort, clientTeamID,
htoken, app_signature);
// add the new ServerApp to the known list of ServerApps
// add the new ServerApp to the known list of ServerApps
fAppList->AddItem(newapp);
release_sem(fAppListLock);
PortLink replylink(reply_port);
replylink.SetOpCode(AS_SET_SERVER_PORT);
BPortLink replylink(reply_port);
replylink.StartMessage(AS_SET_SERVER_PORT);
replylink.Attach<int32>(newapp->fMessagePort);
replylink.Flush();
// This is necessary because PortLink::ReadString allocates memory
delete app_signature;
// This is necessary because BPortLink::ReadString allocates memory
if(app_signature)
free(app_signature);
break;
}
@ -506,12 +517,14 @@ void AppServer::DispatchMessage(PortMessage *msg)
// Attached Data:
// 1) thread_id - thread ID of the ServerApp to be deleted
int32 i,
appnum= fAppList->CountItems();
ServerApp *srvapp;
int32 i=0,
appnum=fAppList->CountItems();
ServerApp *srvapp=NULL;
thread_id srvapp_id=-1;
thread_id srvapp_id;
msg->Read<thread_id>(&srvapp_id);
if(msg.Read<thread_id>(&srvapp_id)<B_OK)
break;
acquire_sem(fAppListLock);
@ -523,7 +536,8 @@ void AppServer::DispatchMessage(PortMessage *msg)
if(srvapp != NULL && srvapp->fMonitorThreadID== srvapp_id)
{
srvapp=(ServerApp *)fAppList->RemoveItem(i);
if(srvapp){
if(srvapp)
{
status_t temp;
wait_for_thread(srvapp_id, &temp);
delete srvapp;
@ -557,12 +571,15 @@ void AppServer::DispatchMessage(PortMessage *msg)
bool needs_update=fontserver->FontsNeedUpdated();
fontserver->Unlock();
// Seeing how the client merely wants an answer, we'll skip the PortLink
// Seeing how the client merely wants an answer, we'll skip the BPortLink
// and all its overhead and just write the code to port.
port_id replyport;
msg->Read<port_id>(&replyport);
if (msg.Read<port_id>(&replyport) < B_OK)
break;
BPortLink replylink(replyport);
replylink.StartMessage(needs_update ? SERVER_TRUE : SERVER_FALSE);
replylink.Flush();
write_port(replyport, (needs_update)?SERVER_TRUE:SERVER_FALSE, NULL,0);
break;
}
case AS_SET_UI_COLORS:
@ -574,7 +591,7 @@ void AppServer::DispatchMessage(PortMessage *msg)
// 1) ColorSet new colors to use
gui_colorset.Lock();
msg->Read<ColorSet>(&gui_colorset);
msg.Read<ColorSet>(&gui_colorset);
gui_colorset.Unlock();
Broadcast(AS_UPDATE_COLORS);
break;
@ -587,8 +604,8 @@ void AppServer::DispatchMessage(PortMessage *msg)
// Attached Data:
// char * name of the decorator in the decorators path to use
char *decname;
msg->ReadString(&decname);
char *decname=NULL;
msg.ReadString(&decname);
if(decname)
{
if(strcmp(decname,"Default")!=0)
@ -605,7 +622,7 @@ void AppServer::DispatchMessage(PortMessage *msg)
Broadcast(AS_UPDATE_DECORATOR);
}
}
delete decname;
free(decname);
break;
}
@ -614,10 +631,12 @@ void AppServer::DispatchMessage(PortMessage *msg)
// Attached Data:
// 1) port_id reply port
port_id replyport;
msg->Read<port_id>(&replyport);
PortLink replylink(replyport);
replylink.SetOpCode(AS_GET_DECORATOR);
port_id replyport=-1;
if(msg.Read<port_id>(&replyport)<B_OK)
return;
BPortLink replylink(replyport);
replylink.StartMessage(AS_GET_DECORATOR);
replylink.AttachString(fDecoratorName.String());
replylink.Flush();
break;
@ -630,8 +649,9 @@ void AppServer::DispatchMessage(PortMessage *msg)
// Attached Data:
// char * name of the decorator in the decorators path to use
int32 decindex;
msg->Read<int32>(&decindex);
int32 decindex=0;
if(msg.Read<int32>(&decindex)<B_OK)
break;
BString decpath;
decpath.SetTo(DECORATORS_DIR);
@ -666,11 +686,12 @@ void AppServer::DispatchMessage(PortMessage *msg)
display_mode dmode;
fDriver->GetMode(&dmode);
port_id replyport;
msg->Read<port_id>(&replyport);
port_id replyport=-1;
if(msg.Read<port_id>(&replyport)<B_OK)
break;
PortLink replylink(replyport);
replylink.SetOpCode(AS_GET_SCREEN_MODE);
BPortLink replylink(replyport);
replylink.StartMessage(AS_GET_SCREEN_MODE);
replylink.Attach<display_mode>(dmode);
replylink.Flush();
break;

View File

@ -6,7 +6,6 @@
#include <List.h>
#include <Application.h>
#include <Window.h>
#include <PortQueue.h>
#include <String.h>
#include "Decorator.h"
#include "ServerConfig.h"
@ -17,7 +16,6 @@ class ServerApp;
class DisplayDriver;
class CursorManager;
class BitmapManager;
class PortMessage;
/*!
\class AppServer AppServer.h
@ -45,7 +43,7 @@ public:
bool LoadDecorator(const char *path);
void InitDecorators(void);
void DispatchMessage(PortMessage *msg);
void DispatchMessage(int32 code, BPortLink &link);
void Broadcast(int32 code);
ServerApp* FindApp(const char *sig);
@ -57,7 +55,7 @@ private:
// global function pointer
create_decorator *make_decorator;
port_id _fMessagePort,
port_id fMessagePort,
fMousePort;
image_id fDecoratorID;

View File

@ -35,7 +35,6 @@
#include "DisplayDriver.h"
#include "Globals.h"
#include "Layer.h"
#include "PortMessage.h"
#include "RootLayer.h"
#include "ServerConfig.h"
#include "ServerScreen.h"
@ -259,14 +258,6 @@ void Desktop::AddWinBorder(WinBorder* winBorder)
// other windows are added to the current RootLayer only.
ActiveRootLayer()->AddWinBorder(winBorder);
// TODO: try to unify this code with that for B_MOUSE_DOWN
winBorder->Window()->Lock();
BRegion invalidRegion;
invalidRegion.Include(&(winBorder->fFull));
invalidRegion.Include(&(winBorder->fTopLayer->fFull));
winBorder->fParent->RebuildAndForceRedraw(invalidRegion, winBorder);
winBorder->Window()->Unlock();
// add that pointer to user winboder list so that we can keep track of them.
fLayerLock.Lock();
fWinBorderList.AddItem(winBorder);
@ -302,10 +293,10 @@ bool Desktop::HasWinBorder(WinBorder* winBorder)
//---------------------------------------------------------------------------
// Input related methods
//---------------------------------------------------------------------------
void Desktop::MouseEventHandler(PortMessage *msg)
void Desktop::MouseEventHandler(int32 code, BPortLink& msg)
{
// TODO: locking mechanism needs SERIOUS rethought
switch(msg->Code())
switch(code)
{
case B_MOUSE_DOWN:
{
@ -317,24 +308,24 @@ void Desktop::MouseEventHandler(PortMessage *msg)
// 5) int32 - buttons down
// 6) int32 - clicks
BPoint pt;
int64 dummy;
PointerEvent evt;
evt.code = B_MOUSE_DOWN;
msg.Read<int64>(&evt.when);
msg.Read<float>(&evt.where.x);
msg.Read<float>(&evt.where.y);
msg.Read<int32>(&evt.modifiers);
msg.Read<int32>(&evt.buttons);
msg.Read<int32>(&evt.clicks);
msg->Read<int64>(&dummy);
msg->Read<float>(&pt.x);
msg->Read<float>(&pt.y);
// printf("MOUSE DOWN: at (%f, %f)\n", evt.where.x, evt.where.y);
// After we read the data, we need to reset it for MouseDown()
msg->Rewind();
// printf("MOUSE DOWN: at (%f, %f)\n", pt.x, pt.y);
WinBorder *target;
RootLayer *rl;
Workspace *ws;
WinBorder *target=NULL;
RootLayer *rl=NULL;
Workspace *ws=NULL
;
rl = ActiveRootLayer();
ws = rl->ActiveWorkspace();
target = rl->WinBorderAt(pt);
target = rl->WinBorderAt(evt.where);
if (target)
{
fGeneralLock.Lock();
@ -346,8 +337,8 @@ printf("Focus: %s\n", ws->FocusLayer()->GetName());
#endif
if (target != ws->FrontLayer())
{
WinBorder *previousFocus;
WinBorder *activeFocus;
WinBorder *previousFocus=NULL;
WinBorder *activeFocus=NULL;
BRegion invalidRegion;
ws->BringToFrontANormalWindow(target);
@ -359,12 +350,13 @@ printf("Focus: %s\n", ws->FocusLayer()->GetName());
activeFocus->Window()->Lock();
if (target == activeFocus && target->Window()->Flags() & B_WILL_ACCEPT_FIRST_CLICK)
target->MouseDown(msg, true);
target->MouseDown(evt, true);
else
target->MouseDown(msg, false);
target->MouseDown(evt, false);
// may be or may be empty.
// TODO: what if modal of floating windows are in front of us?
// TODO: what if modal of floating windows are in front of us?
invalidRegion.Include(&(activeFocus->fFull));
invalidRegion.Include(&(activeFocus->fTopLayer->fFull));
activeFocus->fParent->RebuildAndForceRedraw(invalidRegion, activeFocus);
@ -394,7 +386,7 @@ printf("2Focus: %s\n", ws->FocusLayer()->GetName());
if (target == ws->FocusLayer())
{
target->Window()->Lock();
target->MouseDown(msg, true);
target->MouseDown(evt, true);
target->Window()->Unlock();
}
}
@ -415,37 +407,32 @@ printf("2Focus: %s\n", ws->FocusLayer()->GetName());
// 3) float - y coordinate of mouse click
// 4) int32 - modifier keys down
PointerEvent evt;
evt.code = B_MOUSE_UP;
msg.Read<int64>(&evt.when);
msg.Read<float>(&evt.where.x);
msg.Read<float>(&evt.where.y);
msg.Read<int32>(&evt.modifiers);
if (fMouseTarget)
{
fMouseTarget->Window()->Lock();
fMouseTarget->MouseUp(msg);
fMouseTarget->MouseUp(evt);
fMouseTarget->Window()->Unlock();
fMouseTarget = NULL;
}
else
{
BPoint pt;
int64 dummy;
int32 mod;
msg->Read<int64>(&dummy);
msg->Read<float>(&pt.x);
msg->Read<float>(&pt.y);
msg->Read<int32>(&mod);
// After we read the data, we need to reset it for MouseUp()
msg->Rewind();
WinBorder *target = ActiveRootLayer()->WinBorderAt(pt);
WinBorder *target = ActiveRootLayer()->WinBorderAt(evt.where);
if(target){
target->Window()->Lock();
target->MouseUp(msg);
target->MouseUp(evt);
target->Window()->Unlock();
}
}
// printf("MOUSE UP: at (%f, %f)\n", pt.x, pt.y);
STRACE(("MOUSE UP: at (%f, %f)\n", evt.where.x, evt.where.y));
break;
}
@ -456,45 +443,50 @@ printf("2Focus: %s\n", ws->FocusLayer()->GetName());
// 2) float - x coordinate of mouse click
// 3) float - y coordinate of mouse click
// 4) int32 - buttons down
int64 dummy;
float x,y;
int32 buttons;
msg->Read<int64>(&dummy);
msg->Read<float>(&x);
msg->Read<float>(&y);
msg->Read<int32>(&buttons);
// After we read the data, we need to reset it for MouseDown()
msg->Rewind();
PointerEvent evt;
evt.code = B_MOUSE_MOVED;
msg.Read<int64>(&evt.when);
msg.Read<float>(&evt.where.x);
msg.Read<float>(&evt.where.y);
msg.Read<int32>(&evt.buttons);
if (fMouseTarget)
{
fActiveScreen->DDriver()->HideCursor();
fActiveScreen->DDriver()->MoveCursorTo(x,y);
fActiveScreen->DDriver()->MoveCursorTo(evt.where.x, evt.where.y);
fMouseTarget->Window()->Lock();
fMouseTarget->MouseMoved(msg);
fMouseTarget->MouseMoved(evt);
fMouseTarget->Window()->Unlock();
fActiveScreen->DDriver()->ShowCursor();
}
else
{
WinBorder *target = ActiveRootLayer()->WinBorderAt(BPoint(x,y));
WinBorder *target = ActiveRootLayer()->WinBorderAt(BPoint(evt.where.x, evt.where.y));
if(target){
target->Window()->Lock();
target->MouseMoved(msg);
target->MouseMoved(evt);
target->Window()->Unlock();
}
fActiveScreen->DDriver()->MoveCursorTo(x,y);
fActiveScreen->DDriver()->MoveCursorTo(evt.where.x, evt.where.y);
}
break;
}
case B_MOUSE_WHEEL_CHANGED:
{
PointerEvent evt;
evt.code = B_MOUSE_WHEEL_CHANGED;
msg.Read<int64>(&evt.when);
msg.Read<float>(&evt.where.x);
msg.Read<float>(&evt.where.y);
msg.Read<float>(&evt.wheel_delta_x);
msg.Read<float>(&evt.wheel_delta_y);
msg.Read<int32>(&evt.modifiers);
// TODO: Pass this on to the client ServerWindow
break;
}
@ -506,11 +498,10 @@ printf("2Focus: %s\n", ws->FocusLayer()->GetName());
}
}
void Desktop::KeyboardEventHandler(PortMessage *msg)
void Desktop::KeyboardEventHandler(int32 code, BPortLink& msg)
{
int8 *index=(int8*)msg->Buffer();
switch(msg->Code())
switch(code)
{
case B_KEY_DOWN:
{
@ -525,13 +516,22 @@ void Desktop::KeyboardEventHandler(PortMessage *msg)
// generated string
// 8) Character string generated by the keystroke
// 9) int8[16] state of all keys
// Obtain only what data which we'll need
STRACE(("Key Down: 0x%lx\n",scancode));
index+=sizeof(int64);
int32 scancode=*((int32*)index); index+=sizeof(int32) * 3;
int32 modifiers=*((int32*)index); index+=sizeof(int32) + (sizeof(int8) * 3);
int8 stringlength=*index; index+=stringlength;
bigtime_t time;
int32 scancode, modifiers;
int8 utf[3];
char *string = NULL;
int32 keystate;
msg.Read<bigtime_t>(&time);
msg.Read<int32>(&scancode);
msg.Read<int32>(&modifiers);
msg.Read(utf, sizeof(utf));
msg.ReadString(&string);
msg.Read<int32>(&keystate);
if (string)
free(string);
if(DISPLAYDRIVER==HWDRIVER)
{
// Check for workspace change or safe video mode
@ -669,11 +669,26 @@ void Desktop::KeyboardEventHandler(PortMessage *msg)
// 7) Character string generated by the keystroke
// 8) int8[16] state of all keys
// Obtain only what data which we'll need
index+=sizeof(int64);
int32 scancode=*((int32*)index); index+=sizeof(int32) * 3;
int32 modifiers=*((int32*)index); index+=sizeof(int8) * 3;
int8 stringlength=*index; index+=stringlength + sizeof(int8);
bigtime_t time;
int32 scancode;
int32 ascii;
int32 modifiers;
int8 utf[3];
int8 bytes;
char *string;
int8 keystate[16];
msg.Read<bigtime_t>(&time);
msg.Read<int32>(&scancode);
msg.Read<int32>(&ascii);
msg.Read<int32>(&modifiers);
msg.Read(utf, sizeof(utf));
msg.Read<int8>(&bytes);
msg.ReadString(&string);
msg.Read(keystate, sizeof(keystate));
if (string)
free(string);
STRACE(("Key Up: 0x%lx\n",scancode));
if(DISPLAYDRIVER==HWDRIVER)
@ -717,9 +732,20 @@ void Desktop::KeyboardEventHandler(PortMessage *msg)
// 4) int32 number of elements in the key state array to follow
// 5) int8 state of all keys
bigtime_t time;
int32 scancode;
int32 modifiers;
int32 elements;
//int8 keystate[16];
msg.Read<bigtime_t>(&time);
msg.Read<int32>(&scancode);
msg.Read<int32>(&modifiers);
msg.Read<int32>(&elements);
//msg.Read(keystate, elements);
#ifdef DEBUG_KEYHANDLING
index+=sizeof(bigtime_t);
printf("Unmapped Key Down: 0x%lx\n",*((int32*)index));
printf("Unmapped Key Down: 0x%lx\n", scancode);
#endif
// TODO: Pass on to client window with the focus
break;
@ -733,9 +759,20 @@ void Desktop::KeyboardEventHandler(PortMessage *msg)
// 4) int32 number of elements in the key state array to follow
// 5) int8 state of all keys
bigtime_t time;
int32 scancode;
int32 modifiers;
int32 elements;
//int8 keystate[16];
msg.Read<bigtime_t>(&time);
msg.Read<int32>(&scancode);
msg.Read<int32>(&modifiers);
msg.Read<int32>(&elements);
//msg.Read(keystate, elements);
#ifdef DEBUG_KEYHANDLING
index+=sizeof(bigtime_t);
printf("Unmapped Key Up: 0x%lx\n",*((int32*)index));
printf("Unmapped Key Up: 0x%lx\n", scancode);
#endif
// TODO: Pass on to client window with the focus
@ -750,8 +787,19 @@ void Desktop::KeyboardEventHandler(PortMessage *msg)
// 4) int32 number of elements in the key state array to follow
// 5) int8 state of all keys
bigtime_t time;
int32 scancode;
int32 modifiers;
int32 elements;
//int8 keystate[16];
msg.Read<bigtime_t>(&time);
msg.Read<int32>(&scancode);
msg.Read<int32>(&modifiers);
msg.Read<int32>(&elements);
//msg.Read(keystate, elements);
#ifdef DEBUG_KEYHANDLING
index+=sizeof(bigtime_t);
printf("Modifiers Changed\n");
#endif

View File

@ -36,9 +36,9 @@ class RootLayer;
class Screen;
class Layer;
class BMessage;
class PortMessage;
class WinBorder;
class DisplayDriver;
class BPortLink;
class Desktop
{
@ -70,8 +70,8 @@ public:
bool HasWinBorder(WinBorder *winBorder);
// Input related methods
void MouseEventHandler(PortMessage *msg);
void KeyboardEventHandler(PortMessage *msg);
void MouseEventHandler(int32 code, BPortLink& link);
void KeyboardEventHandler(int32 code, BPortLink& link);
void SetDragMessage(BMessage *msg);
BMessage *DragMessage(void) const;

View File

@ -798,7 +798,7 @@ DDView::DDView(BRect bounds)
SetViewColor(B_TRANSPARENT_32_BIT);
#ifdef ENABLE_INPUT_SERVER_EMULATION
serverlink.SetPort(find_port(SERVER_INPUT_PORT));
serverlink.SetSendPort(find_port(SERVER_INPUT_PORT));
#endif
}
@ -827,7 +827,7 @@ void DDView::MouseDown(BPoint pt)
GetMouse(&p,&buttons);
serverlink.SetOpCode(B_MOUSE_DOWN);
serverlink.StartMessage(B_MOUSE_DOWN);
serverlink.Attach(&time, sizeof(int64));
serverlink.Attach(&pt.x,sizeof(float));
serverlink.Attach(&pt.y,sizeof(float));
@ -850,7 +850,7 @@ void DDView::MouseMoved(BPoint pt, uint32 transit, const BMessage *msg)
uint32 buttons;
int64 time=(int64)real_time_clock();
serverlink.SetOpCode(B_MOUSE_MOVED);
serverlink.StartMessage(B_MOUSE_MOVED);
serverlink.Attach(&time,sizeof(int64));
serverlink.Attach(&pt.x,sizeof(float));
serverlink.Attach(&pt.y,sizeof(float));
@ -877,7 +877,7 @@ void DDView::MouseUp(BPoint pt)
GetMouse(&p,&buttons);
serverlink.SetOpCode(B_MOUSE_UP);
serverlink.StartMessage(B_MOUSE_UP);
serverlink.Attach(&time, sizeof(int64));
serverlink.Attach(&pt.x,sizeof(float));
serverlink.Attach(&pt.y,sizeof(float));
@ -897,7 +897,7 @@ void DDView::MessageReceived(BMessage *msg)
msg->FindFloat("be:wheel_delta_x",&x);
msg->FindFloat("be:wheel_delta_y",&y);
int64 time=real_time_clock();
serverlink.SetOpCode(B_MOUSE_WHEEL_CHANGED);
serverlink.StartMessage(B_MOUSE_WHEEL_CHANGED);
serverlink.Attach(&time,sizeof(int64));
serverlink.Attach(x);
serverlink.Attach(y);

View File

@ -73,7 +73,7 @@ public:
void MouseUp(BPoint pt);
void MessageReceived(BMessage *msg);
PortLink serverlink;
BPortLink serverlink;
};
class DDWindow : public BDirectWindow
@ -162,7 +162,7 @@ protected:
rgb_color GetBlitColor(rgb_color src, rgb_color dest,DrawData *d, bool use_high=true);
PortLink *serverlink;
BPortLink *serverlink;
DDWindow *screenwin;
BView *drawview;
};

View File

@ -40,7 +40,6 @@ Server app_server :
FMWList.cpp
PicturePlayer.cpp
PNGDump.cpp
SessionStreamReader.cpp
Utils.cpp
# Manager Classes

View File

@ -44,7 +44,7 @@ Layer::Layer(BRect frame, const char *name, int32 token, uint32 resize,
fBoundsLeftTop.Set( 0.0f, 0.0f );
fName = new BString(name);
fName = new BString(name ? name : B_EMPTY_STRING);
fLayerData = new LayerData();
// driver init
@ -65,7 +65,6 @@ Layer::Layer(BRect frame, const char *name, int32 token, uint32 resize,
fFlags = flags;
fAdFlags = 0;
fClassID = AS_LAYER_CLASS;
fFrameAction = B_LAYER_NONE;
fResizeMode = resize;
fHidden = false;
@ -446,15 +445,7 @@ void Layer::RequestDraw(const BRegion &reg, Layer *startFrom)
int redraw = false;
if (startFrom == NULL)
redraw = true;
/*
srand(real_time_clock_usecs());
RGBColor c(rand()/256,34,56);
BRegion reg1 = reg;
fDriver->ConstrainClippingRegion(&reg1);
fDriver->FillRect(reg.Frame(), c);
fDriver->ConstrainClippingRegion(NULL);
snooze(1000000);
*/
if (fVisible.CountRects() > 0)
{
// client side drawing. Send only one UPDATE message!
@ -465,7 +456,7 @@ snooze(1000000);
// calculate the minimum region/rectangle to be updated with
// a single message to the client.
fUpdateReg = fFullVisible;
if (fFlags & B_FULL_UPDATE_ON_RESIZE && fFrameAction == B_LAYER_RESIZE){ }
if (fFlags & B_FULL_UPDATE_ON_RESIZE){ }
else { fUpdateReg.IntersectWith(&reg); }
if (fUpdateReg.CountRects() > 0)
@ -479,7 +470,7 @@ snooze(1000000);
// calculate the update region, then...
fUpdateReg = fVisible;
if (fFlags & B_FULL_UPDATE_ON_RESIZE && fFrameAction == B_LAYER_RESIZE){ }
if (fFlags & B_FULL_UPDATE_ON_RESIZE){ }
else { fUpdateReg.IntersectWith(&reg); }
if (fUpdateReg.CountRects() > 0)
@ -495,7 +486,7 @@ snooze(1000000);
else
{
fUpdateReg = fVisible;
if (fFlags & B_FULL_UPDATE_ON_RESIZE && fFrameAction == B_LAYER_RESIZE){ }
if (fFlags & B_FULL_UPDATE_ON_RESIZE){ }
else { fUpdateReg.IntersectWith(&reg); }
if (fUpdateReg.CountRects() > 0)
@ -534,6 +525,7 @@ snooze(1000000);
void Layer::Draw(const BRect &r)
{
// TODO/NOTE: this should be an empty method! the next lines are for testing only
#ifdef DEBUG_LAYER
printf("Layer::Draw: ");
r.PrintToStream();
@ -1022,9 +1014,7 @@ void Layer::MoveBy(float x, float y)
debugger("ERROR: in Layer::MoveBy()! - No parent!\n");
return;
}
fFrameAction = B_LAYER_MOVE;
BPoint pt(x,y);
BRect rect(fFull.Frame().OffsetByCopy(pt));
@ -1034,8 +1024,6 @@ void Layer::MoveBy(float x, float y)
EmptyGlobals();
fFrameAction = B_LAYER_NONE;
STRACE(("Layer(%s)::MoveBy() END\n", GetName()));
}
@ -1127,9 +1115,7 @@ void Layer::ResizeBy(float x, float y)
printf("ERROR: in Layer::MoveBy()! - No parent!\n");
return;
}
fFrameAction = B_LAYER_RESIZE;
BPoint pt(x,y);
BRect rect(fFull.Frame());
rect.right += x;
@ -1141,9 +1127,7 @@ void Layer::ResizeBy(float x, float y)
fParent->Redraw(gRedrawReg, this);
EmptyGlobals();
fFrameAction = B_LAYER_NONE;
STRACE(("Layer(%s)::ResizeBy() END\n", GetName()));
}
@ -1174,7 +1158,7 @@ void Layer::PrintToStream(void)
printf("Frame: (%f, %f, %f, %f)", fFrame.left, fFrame.top, fFrame.right, fFrame.bottom);
printf("Token: %ld\n",fViewToken);
printf("Hidden - direct: %s\n", IsHidden()?"true":"false");
printf("Hidden - direct: %s\n", fHidden?"true":"false");
printf("Hidden - indirect: %s\n", IsHidden()?"true":"false");
printf("ResizingMode: %lx\n", fResizeMode);
printf("Flags: %lx\n", fFlags);

View File

@ -43,7 +43,7 @@
#include "PatternHandler.h"
class BBitmap;
class PortLink;
class BPortLink;
class SDWindow;
class LayerData;
class ScreenDriver;
@ -65,7 +65,7 @@ protected:
friend class ScreenDriver;
bool is_connected;
PortLink *serverlink;
BPortLink *serverlink;
BPoint mousepos;
uint32 buttons;
thread_id monitor_thread,copy_thread;
@ -89,7 +89,7 @@ public:
void MessageReceived(BMessage *msg);
BBitmap *viewbmp;
PortLink *serverlink;
BPortLink *serverlink;
int hide_cursor;
BBitmap *cursor;
@ -192,7 +192,7 @@ protected:
BBitmap *framebuffer;
BView *drawview;
BRegion laregion;
PortLink *serverlink;
BPortLink *serverlink;
rgb_color highcolor,lowcolor;
bool is_initialized;

View File

@ -28,12 +28,7 @@
#include <List.h>
#include <String.h>
#include <PortLink.h>
#include <PortMessage.h>
#include <PortQueue.h>
#include <SysCursor.h>
#include <Session.h>
#include <ColorSet.h>
#include <RGBColor.h>
#include <stdio.h>
@ -91,11 +86,12 @@ ServerApp::ServerApp(port_id sendport, port_id rcvport, port_id clientLooperPort
// fClientAppPort is the our BApplication's event port
fClientAppPort=sendport;
fAppLink=new PortLink(fClientAppPort);
// fMessagePort is the port we receive messages from our BApplication
fMessagePort=rcvport;
fAppLink = new BPortLink(fClientAppPort, fMessagePort);
fSWindowList=new BList(0);
fBitmapList=new BList(0);
fPictureList=new BList(0);
@ -246,8 +242,8 @@ bool ServerApp::PingTarget(void)
printf("PANIC: ServerApp %s could not find the app_server port in PingTarget()!\n",fSignature.String());
return false;
}
fAppLink->SetPort(serverport);
fAppLink->SetOpCode(AS_DELETE_APP);
fAppLink->SetSendPort(serverport);
fAppLink->StartMessage(AS_DELETE_APP);
fAppLink->Attach(&fMonitorThreadID,sizeof(thread_id));
fAppLink->Flush();
return false;
@ -336,22 +332,19 @@ int32 ServerApp::MonitorApp(void *data)
// Message-dispatching loop for the ServerApp
ServerApp *app = (ServerApp *)data;
PortQueue msgqueue(app->fMessagePort);
PortMessage *msg;
BPortLink msgqueue(-1, app->fMessagePort);
bool quitting = false;
int32 code;
status_t err = B_OK;
for( ; !quitting; )
while(!quitting)
{
if(!msgqueue.MessagesWaiting())
msgqueue.GetMessagesFromPort(true);
else
msgqueue.GetMessagesFromPort(false);
STRACE(("info: ServerApp::MonitorApp listening on port %ld.\n", app->fMessagePort));
err = msgqueue.GetNextReply(&code);
if (err < B_OK)
break;
msg = msgqueue.GetMessageFromQueue();
if(!msg)
continue;
switch(msg->Code())
switch(code)
{
case AS_QUIT_APP:
{
@ -400,8 +393,8 @@ int32 ServerApp::MonitorApp(void *data)
printf("PANIC: ServerApp %s could not find the app_server port!\n",app->fSignature.String());
break;
}
app->fAppLink->SetPort(serverport);
app->fAppLink->SetOpCode(AS_DELETE_APP);
app->fAppLink->SetSendPort(serverport);
app->fAppLink->StartMessage(AS_DELETE_APP);
app->fAppLink->Attach(&app->fMonitorThreadID, sizeof(thread_id));
app->fAppLink->Flush();
break;
@ -409,12 +402,11 @@ int32 ServerApp::MonitorApp(void *data)
default:
{
STRACE(("ServerApp %s: Got a Message to dispatch\n",app->fSignature.String()));
app->_DispatchMessage(msg);
app->_DispatchMessage(code, msgqueue);
break;
}
}
delete msg;
} // end for
// clean exit.
@ -430,10 +422,10 @@ int32 ServerApp::MonitorApp(void *data)
All attachments are placed in the buffer via a PortLink, so it will be a
matter of casting and incrementing an index variable to access them.
*/
void ServerApp::_DispatchMessage(PortMessage *msg)
void ServerApp::_DispatchMessage(int32 code, BPortLink& msg)
{
LayerData ld;
switch(msg->Code())
switch(code)
{
case AS_UPDATED_CLIENT_FONTLIST:
{
@ -460,7 +452,7 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
win=(ServerWindow*)fSWindowList->ItemAt(i);
win->Lock();
win->fWinBorder->UpdateColors();
win->SendMessageToClient(&msg);
win->SendMessageToClient(AS_UPDATE_COLORS, msg);
win->Unlock();
}
*/ break;
@ -479,7 +471,7 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
win=(ServerWindow*)fSWindowList->ItemAt(i);
win->Lock();
win->fWinBorder->UpdateFont();
win->SendMessageToClient(&msg);
win->SendMessageToClient(AS_UPDATE_FONTS, msg);
win->Unlock();
}
*/ break;
@ -518,22 +510,24 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
uint32 feel;
uint32 flags;
uint32 wkspaces;
int32 token;
port_id sendPort;
port_id looperPort;
port_id replyport;
char *title;
int32 token = B_NULL_TOKEN;
port_id sendPort = -1;
port_id looperPort = -1;
char *title = NULL;
port_id replyport = -1;
msg->Read<BRect>(&frame);
msg->Read<int32>((int32*)&look);
msg->Read<int32>((int32*)&feel);
msg->Read<int32>((int32*)&flags);
msg->Read<int32>((int32*)&wkspaces);
msg->Read<int32>(&token);
msg->Read<port_id>(&sendPort);
msg->Read<port_id>(&looperPort);
msg->ReadString(&title);
msg->Read<port_id>(&replyport);
msg.Read<BRect>(&frame);
msg.Read<int32>((int32*)&look);
msg.Read<int32>((int32*)&feel);
msg.Read<int32>((int32*)&flags);
msg.Read<int32>((int32*)&wkspaces);
msg.Read<int32>(&token);
msg.Read<port_id>(&sendPort);
msg.Read<port_id>(&looperPort);
msg.ReadString(&title);
//TODO: deprecate - just use sendPort
msg.Read<port_id>(&replyport);
STRACE(("ServerApp %s: Got 'New Window' message, trying to do smething...\n",fSignature.String()));
@ -546,7 +540,8 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
STRACE(("\nServerApp %s: New Window %s (%.1f,%.1f,%.1f,%.1f)\n",
fSignature.String(),title,frame.left,frame.top,frame.right,frame.bottom));
delete [] title;
if (title)
free(title);
break;
}
@ -570,40 +565,39 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// 3) int32 area pointer offset used to calculate fBasePtr
// First, let's attempt to allocate the bitmap
port_id replyport;
port_id replyport = -1;
BRect r;
color_space cs;
int32 f,bpr;
screen_id s;
msg->Read<BRect>(&r);
msg->Read<color_space>(&cs);
msg->Read<int32>(&f);
msg->Read<int32>(&bpr);
msg->Read<screen_id>(&s);
msg->Read<int32>(&replyport);
msg.Read<BRect>(&r);
msg.Read<color_space>(&cs);
msg.Read<int32>(&f);
msg.Read<int32>(&bpr);
msg.Read<screen_id>(&s);
msg.Read<int32>(&replyport);
ServerBitmap *sbmp=bitmapmanager->CreateBitmap(r,cs,f,bpr,s);
STRACE(("ServerApp %s: Create Bitmap (%.1f,%.1f,%.1f,%.1f)\n",
fSignature.String(),r.left,r.top,r.right,r.bottom));
BPortLink replylink(replyport);
if(sbmp)
{
fBitmapList->AddItem(sbmp);
PortLink replylink(replyport);
replylink.SetOpCode(SERVER_TRUE);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<int32>(sbmp->Token());
replylink.Attach<int32>(sbmp->Area());
replylink.Attach<int32>(sbmp->AreaOffset());
replylink.Flush();
}
else
{
// alternatively, if something went wrong, we reply with SERVER_FALSE
int32 code=SERVER_FALSE;
write_port(replyport,SERVER_FALSE,&code,sizeof(int32));
replylink.StartMessage(SERVER_FALSE);
}
replylink.Flush();
break;
}
@ -618,24 +612,25 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// Reply Code: SERVER_TRUE if successful,
// SERVER_FALSE if the buffer was already deleted or was not found
port_id replyport;
port_id replyport = -1;
int32 bmp_id;
msg->Read<int32>(&bmp_id);
msg->Read<int32>(&replyport);
msg.Read<int32>(&bmp_id);
msg.Read<int32>(&replyport);
ServerBitmap *sbmp=FindBitmap(bmp_id);
BPortLink replylink(replyport);
if(sbmp)
{
STRACE(("ServerApp %s: Deleting Bitmap %ld\n",fSignature.String(),bmp_id));
fBitmapList->RemoveItem(sbmp);
bitmapmanager->DeleteBitmap(sbmp);
write_port(replyport,SERVER_TRUE,NULL,0);
replylink.StartMessage(SERVER_TRUE);
}
else
write_port(replyport,SERVER_FALSE,NULL,0);
replylink.StartMessage(SERVER_TRUE);
replylink.Flush();
break;
}
case AS_CREATE_PICTURE:
@ -677,9 +672,9 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
int32 workspace;
uint32 mode;
bool stick;
msg->Read<int32>(&workspace);
msg->Read<uint32>(&mode);
msg->Read<bool>(&stick);
msg.Read<int32>(&workspace);
msg.Read<uint32>(&mode);
msg.Read<bool>(&stick);
//TODO: Resolve
//SetSpace(workspace,mode,ActiveScreen(),stick);
@ -694,7 +689,7 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// Error-checking is done in ActivateWorkspace, so this is a safe call
int32 workspace;
msg->Read<int32>(&workspace);
msg.Read<int32>(&workspace);
//TODO: Resolve
//SetWorkspace(workspace);
@ -729,9 +724,11 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// Attached data
// 1) int32 port to reply to
int32 replyport;
msg->Read<int32>(&replyport);
msg.Read<int32>(&replyport);
write_port(replyport,(fCursorHidden)?SERVER_TRUE:SERVER_FALSE,NULL,0);
BPortLink replylink(replyport);
replylink.StartMessage(fCursorHidden ? SERVER_TRUE : SERVER_FALSE);
replylink.Flush();
break;
}
case AS_SET_CURSOR_DATA:
@ -740,7 +737,7 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// Attached data: 68 bytes of fAppCursor data
int8 cdata[68];
msg->Read(cdata,68);
msg.Read(cdata,68);
// Because we don't want an overaccumulation of these particular
// cursors, we will delete them if there is an existing one. It would
@ -763,13 +760,13 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// 2) int32 token ID of the cursor to set
// 3) port_id port to receive a reply. Only exists if the sync flag is true.
bool sync;
int32 ctoken;
port_id replyport;
int32 ctoken = B_NULL_TOKEN;
port_id replyport = -1;
msg->Read<bool>(&sync);
msg->Read<int32>(&ctoken);
msg.Read<bool>(&sync);
msg.Read<int32>(&ctoken);
if(sync)
msg->Read<int32>(&replyport);
msg.Read<int32>(&replyport);
cursormanager->SetCursor(ctoken);
@ -777,8 +774,9 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
{
// the application is expecting a reply, but plans to do literally nothing
// with the data, so we'll just reuse the cursor token variable
ctoken=AS_SET_CURSOR_BCURSOR;
write_port(replyport,ctoken, &ctoken, sizeof(int32));
BPortLink replylink(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Flush();
}
break;
}
@ -789,20 +787,21 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// 1) 68 bytes of fAppCursor data
// 2) port_id reply port
port_id replyport;
port_id replyport = -1;
int8 cdata[68];
msg->Read(cdata,68);
msg->Read<int32>(&replyport);
msg.Read(cdata,68);
msg.Read<int32>(&replyport);
fAppCursor=new ServerCursor(cdata);
fAppCursor->SetAppSignature(fSignature.String());
cursormanager->AddCursor(fAppCursor);
// Synchronous message - BApplication is waiting on the cursor's ID
PortLink link(replyport);
link.Attach<int32>(fAppCursor->ID());
link.Flush();
BPortLink replylink(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<int32>(fAppCursor->ID());
replylink.Flush();
break;
}
case AS_DELETE_BCURSOR:
@ -810,8 +809,8 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
STRACE(("ServerApp %s: Delete BCursor\n",fSignature.String()));
// Attached data:
// 1) int32 token ID of the cursor to delete
int32 ctoken;
msg->Read<int32>(&ctoken);
int32 ctoken = B_NULL_TOKEN;
msg.Read<int32>(&ctoken);
if(fAppCursor && fAppCursor->ID()==ctoken)
fAppCursor=NULL;
@ -828,12 +827,12 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
scroll_bar_info sbi=desktop->ScrollBarInfo();
port_id replyport;
msg->Read<int32>(&replyport);
msg.Read<int32>(&replyport);
PortLink link(replyport);
link.Attach<scroll_bar_info>(sbi);
link.Flush();
BPortLink replylink(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<scroll_bar_info>(sbi);
replylink.Flush();
break;
}
case AS_SET_SCROLLBAR_INFO:
@ -842,7 +841,7 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// Attached Data:
// 1) scroll_bar_info scroll bar info structure
scroll_bar_info sbi;
msg->Read<scroll_bar_info>(&sbi);
msg.Read<scroll_bar_info>(&sbi);
desktop->SetScrollBarInfo(sbi);
break;
@ -854,23 +853,23 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// 1) port_id reply port - synchronous message
port_id replyport;
msg->Read<int32>(&replyport);
msg.Read<int32>(&replyport);
PortLink link(replyport);
link.Attach<bool>(desktop->FFMouseInUse());
link.Flush();
BPortLink replylink(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<bool>(desktop->FFMouseInUse());
replylink.Flush();
break;
}
case AS_SET_FOCUS_FOLLOWS_MOUSE:
{
STRACE(("ServerApp %s: Set Focus Follows Mouse in use\n",fSignature.String()));
// Attached Data:
/* // Attached Data:
// 1) scroll_bar_info scroll bar info structure
scroll_bar_info sbi;
msg->Read<scroll_bar_info>(&sbi);
msg.Read<scroll_bar_info>(&sbi);
desktop->SetScrollBarInfo(sbi);
desktop->SetScrollBarInfo(sbi);*/
break;
}
case AS_SET_MOUSE_MODE:
@ -879,7 +878,7 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
// Attached Data:
// 1) enum mode_mouse FFM mouse mode
mode_mouse mmode;
msg->Read<mode_mouse>(&mmode);
msg.Read<mode_mouse>(&mmode);
desktop->SetFFMouseMode(mmode);
break;
@ -892,13 +891,13 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
mode_mouse mmode=desktop->FFMouseMode();
port_id replyport;
msg->Read<int32>(&replyport);
port_id replyport = -1;
msg.Read<int32>(&replyport);
PortLink link(replyport);
link.Attach<mode_mouse>(mmode);
link.Flush();
BPortLink replylink(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<mode_mouse>(mmode);
replylink.Flush();
break;
}
case AS_GET_UI_COLOR:
@ -907,17 +906,17 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
RGBColor color;
int32 whichcolor;
port_id replyport;
port_id replyport = -1;
msg->Read<int32>(&whichcolor);
msg->Read<port_id>(&replyport);
msg.Read<int32>(&whichcolor);
msg.Read<port_id>(&replyport);
gui_colorset.Lock();
color=gui_colorset.AttributeToColor(whichcolor);
gui_colorset.Unlock();
PortLink replylink(replyport);
replylink.SetOpCode(SERVER_TRUE);
BPortLink replylink(replyport);
replylink.StartMessage(SERVER_TRUE);
replylink.Attach<rgb_color>(color.GetColor32());
replylink.Flush();
break;
@ -925,7 +924,7 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
default:
{
STRACE(("ServerApp %s received unhandled message code offset %s\n",fSignature.String(),
MsgCodeToBString(msg->Code()).String()));
MsgCodeToBString(code).String()));
break;
}
@ -953,3 +952,4 @@ team_id ServerApp::ClientTeamID()
{
return fClientTeamID;
}

View File

@ -34,8 +34,7 @@
class AppServer;
class BMessage;
class PortLink;
class PortMessage;
class BPortLink;
class BList;
class DisplayDriver;
class ServerCursor;
@ -82,7 +81,7 @@ protected:
friend class AppServer;
friend class ServerWindow;
void _DispatchMessage(PortMessage *msg);
void _DispatchMessage(int32 code, BPortLink& link);
ServerBitmap* _FindBitmap(int32 token);
port_id fClientAppPort,
@ -94,7 +93,7 @@ protected:
team_id fClientTeamID;
PortLink *fAppLink;
BPortLink *fAppLink;
BList *fSWindowList,
*fBitmapList,
*fPictureList;

View File

@ -124,6 +124,8 @@ ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook,
if(string)
fTitle.SetTo(string);
else
fTitle.SetTo(B_EMPTY_STRING);
fFrame = rect;
fFlags = wflags;
@ -136,6 +138,7 @@ ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook,
fWorkspaces = index;
fWinBorder = NULL;
cl = NULL; //current layer
// fClientWinPort is the port to which the app awaits messages from the server
fClientWinPort = winport;
@ -143,24 +146,12 @@ ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook,
// fMessagePort is the port to which the app sends messages for the server
fMessagePort = create_port(30,fTitle.String());
fSession = new BSession(fMessagePort, fClientWinPort);
fSession = new BPortLink(fClientWinPort, fMessagePort);
// Send a reply to our window - it is expecting fMessagePort port.
// Temporarily use winlink to save time and memory
PortLink winLink(replyport);
winLink.SetOpCode(AS_CREATE_WINDOW);
winLink.Attach<port_id>(fMessagePort);
winLink.Flush();
// check the next 2 messages to make sure we receive top_view's attributes.
int32 vCode;
fSession->ReadInt32(&vCode);
if(vCode != AS_LAYER_CREATE_ROOT)
debugger("SERVER ERROR: ServerWindow(xxx): NO top_view data received! - 1\n");
fSession->ReadInt32(&vCode);
if(vCode != AS_LAYER_CREATE)
debugger("SERVER ERROR: ServerWindow(xxx): NO top_view data received! - 2\n");
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<port_id>(fMessagePort);
fSession->Flush();
STRACE(("ServerWindow %s:\n",fTitle.String()));
STRACE(("\tFrame (%.1f,%.1f,%.1f,%.1f)\n",rect.left,rect.top,rect.right,rect.bottom));
@ -174,18 +165,6 @@ void ServerWindow::Init(void)
this, desktop->GetDisplayDriver());
fWinBorder->RebuildFullRegion();
// Start receiving top_view data -- pass NULL as the parent view.
// This should be the *only* place where this happens.
fWinBorder->fTopLayer = CreateLayerTree(NULL);
fWinBorder->fTopLayer->SetAsTopLayer(true);
cl = fWinBorder->fTopLayer;
// connect decorator and top layer.
fWinBorder->AddChild(fWinBorder->fTopLayer, NULL);
// NOTE: this MUST be before the monitor thread is spawned!
desktop->AddWinBorder(fWinBorder);
// Spawn our message-monitoring thread
fMonitorThreadID = spawn_thread(MonitorWin, fTitle.String(), B_NORMAL_PRIORITY, this);
@ -283,13 +262,17 @@ void ServerWindow::Show(void)
WinBorder *previousFocus;
BRegion invalidRegion;
Workspace *ws;
// TODO: can you unify this method with Desktop::MouseEventHandler::B_MOUSE_DOWN
// TODO: can you unify this method with Desktop::MouseEventHandler::B_MOUSE_DOWN
ws = rl->WorkspaceAt(i+1);
ws->BringToFrontANormalWindow(fWinBorder);
ws->SearchAndSetNewFront(fWinBorder);
previousFocus = ws->FocusLayer();
ws->SearchAndSetNewFocus(fWinBorder);
// TODO: only do this in for the active workspace!
// TODO: only do this in for the active workspace!
// first redraw previous window's decorator. It has lost focus state.
if (previousFocus)
if (previousFocus->fDecorator)
@ -358,7 +341,7 @@ void ServerWindow::Hide(void)
if (ws->FocusLayer() == fWinBorder)
ws->SearchAndSetNewFocus(fWinBorder);
else{
// TODO: RootLayer class should take care of this. (or Desktop)
// TODO: RootLayer class should take care of this. (or Desktop)
// ws->Invalidate();
}
}
@ -531,13 +514,12 @@ void ServerWindow::SetLayerFontState(Layer *layer)
// NOTE: no need to check for a lock. This is a private method.
uint16 mask;
fSession->ReadUInt16(&mask);
fSession->Read<uint16>(&mask);
if (mask & B_FONT_FAMILY_AND_STYLE)
{
uint32 fontID;
fSession->ReadInt32((int32*)&fontID);
fSession->Read<int32>((int32*)&fontID);
// TODO: implement later. Currently there is no SetFamAndStyle(uint32)
// in ServerFont class. DW, could you add one?
//layer->fLayerData->font->
@ -546,49 +528,49 @@ void ServerWindow::SetLayerFontState(Layer *layer)
if (mask & B_FONT_SIZE)
{
float size;
fSession->ReadFloat(&size);
fSession->Read<float>(&size);
layer->fLayerData->font.SetSize(size);
}
if (mask & B_FONT_SHEAR)
{
float shear;
fSession->ReadFloat(&shear);
fSession->Read<float>(&shear);
layer->fLayerData->font.SetShear(shear);
}
if (mask & B_FONT_ROTATION)
{
float rotation;
fSession->ReadFloat(&rotation);
fSession->Read<float>(&rotation);
layer->fLayerData->font.SetRotation(rotation);
}
if (mask & B_FONT_SPACING)
{
uint8 spacing;
fSession->ReadUInt8(&spacing);
fSession->Read<uint8>(&spacing);
layer->fLayerData->font.SetSpacing(spacing);
}
if (mask & B_FONT_ENCODING)
{
uint8 encoding;
fSession->ReadUInt8((uint8*)&encoding);
fSession->Read<uint8>((uint8*)&encoding);
layer->fLayerData->font.SetEncoding(encoding);
}
if (mask & B_FONT_FACE)
{
uint16 face;
fSession->ReadUInt16(&face);
fSession->Read<uint16>(&face);
layer->fLayerData->font.SetFace(face);
}
if (mask & B_FONT_FLAGS)
{
uint32 flags;
fSession->ReadUInt32(&flags);
fSession->Read<uint32>(&flags);
layer->fLayerData->font.SetFlags(flags);
}
STRACE(("DONE: ServerWindow %s: Message AS_LAYER_SET_FONT_STATE: Layer: %s\n",
@ -599,25 +581,25 @@ void ServerWindow::SetLayerState(Layer *layer)
{
// NOTE: no need to check for a lock. This is a private method.
rgb_color highColor, lowColor, viewColor;
pattern patt;
pattern patt;
int32 clipRegRects;
fSession->ReadPoint( &(layer->fLayerData->penlocation));
fSession->ReadFloat( &(layer->fLayerData->pensize));
fSession->ReadData( &highColor, sizeof(rgb_color));
fSession->ReadData( &lowColor, sizeof(rgb_color));
fSession->ReadData( &viewColor, sizeof(rgb_color));
fSession->ReadData( &patt, sizeof(pattern));
fSession->ReadInt8((int8*) &(layer->fLayerData->draw_mode));
fSession->ReadPoint( &(layer->fLayerData->coordOrigin));
fSession->ReadInt8((int8*) &(layer->fLayerData->lineJoin));
fSession->ReadInt8((int8*) &(layer->fLayerData->lineCap));
fSession->ReadFloat( &(layer->fLayerData->miterLimit));
fSession->ReadInt8((int8*) &(layer->fLayerData->alphaSrcMode));
fSession->ReadInt8((int8*) &(layer->fLayerData->alphaFncMode));
fSession->ReadFloat( &(layer->fLayerData->scale));
fSession->ReadBool( &(layer->fLayerData->fontAliasing));
fSession->ReadInt32( &clipRegRects);
fSession->Read<BPoint>( &(layer->fLayerData->penlocation));
fSession->Read<float>( &(layer->fLayerData->pensize));
fSession->Read( &highColor, sizeof(rgb_color));
fSession->Read( &lowColor, sizeof(rgb_color));
fSession->Read( &viewColor, sizeof(rgb_color));
fSession->Read( &patt, sizeof(pattern));
fSession->Read<int8>((int8*) &(layer->fLayerData->draw_mode));
fSession->Read<BPoint>( &(layer->fLayerData->coordOrigin));
fSession->Read<int8>((int8*) &(layer->fLayerData->lineJoin));
fSession->Read<int8>((int8*) &(layer->fLayerData->lineCap));
fSession->Read<float>( &(layer->fLayerData->miterLimit));
fSession->Read<int8>((int8*) &(layer->fLayerData->alphaSrcMode));
fSession->Read<int8>((int8*) &(layer->fLayerData->alphaFncMode));
fSession->Read<float>( &(layer->fLayerData->scale));
fSession->Read<bool>( &(layer->fLayerData->fontAliasing));
fSession->Read<int32>( &clipRegRects);
layer->fLayerData->patt.Set(*((uint64*)&patt));
layer->fLayerData->highcolor.SetColor(highColor);
@ -635,7 +617,7 @@ void ServerWindow::SetLayerState(Layer *layer)
for(int32 i = 0; i < clipRegRects; i++)
{
fSession->ReadRect(&rect);
fSession->Read<BRect>(&rect);
layer->fLayerData->clipReg->Include(rect);
}
}
@ -662,61 +644,43 @@ Layer * ServerWindow::CreateLayerTree(Layer *localRoot)
uint32 flags;
bool hidden;
int32 childCount;
char *name;
char *name = NULL;
fSession->ReadInt32(&token);
name = fSession->ReadString();
fSession->ReadRect(&frame);
fSession->ReadUInt32(&resizeMask);
fSession->ReadUInt32(&flags);
fSession->ReadBool(&hidden);
fSession->ReadInt32(&childCount);
fSession->Read<int32>(&token);
fSession->ReadString(&name);
fSession->Read<BRect>(&frame);
fSession->Read<uint32>(&resizeMask);
fSession->Read<uint32>(&flags);
fSession->Read<bool>(&hidden);
fSession->Read<int32>(&childCount);
Layer *newLayer;
newLayer = new Layer(frame.OffsetToCopy(0.0, 0.0), name, token, resizeMask,
newLayer = new Layer(frame, name, token, resizeMask,
flags, desktop->GetDisplayDriver());
delete name;
if (name)
free(name);
// there is no way of setting this, other than manually :-)
newLayer->fHidden = hidden;
int32 dummyMsg;
// next comes BView's font state
fSession->ReadInt32(&dummyMsg);
if (dummyMsg == AS_LAYER_SET_FONT_STATE)
SetLayerFontState(newLayer);
else
debugger("ServerWindow(%s) - AS_LAYER_SET_FONT_STATE Expected!\n");
// lastly, the BView's graphic state
fSession->ReadInt32(&dummyMsg);
if (dummyMsg == AS_LAYER_SET_STATE)
SetLayerState(newLayer);
else
debugger("ServerWindow(%s) - AS_LAYER_SET_STATE Expected!\n");
// add the new Layer to the tree structure.
if(localRoot)
localRoot->AddChild(newLayer, NULL);
// attach newLayer's children...
for(int i = 0; i < childCount; i++)
{
fSession->ReadInt32(&dummyMsg);
if (dummyMsg == AS_LAYER_CREATE)
CreateLayerTree(newLayer);
else
debugger("ServerWindow(%s) - AS_LAYER_CREATE Expected!\n");
}
STRACE(("DONE: ServerWindow %s: Message AS_CREATE_LAYER: Parent: %s, Child: %s\n", fTitle.String(),
STRACE(("DONE: ServerWindow %s: Message AS_LAYER_CREATE: Parent: %s, Child: %s\n", fTitle.String(),
localRoot? localRoot->fName->String(): "NULL", newLayer->fName->String()));
return newLayer;
}
//------------------------------------------------------------------------------
void ServerWindow::DispatchMessage(int32 code)
{
if (cl == NULL && code != AS_LAYER_CREATE_ROOT)
{
printf("ServerWindow %s received unexpected code - message offset %lx before top_view attached.\n",fTitle.String(), code - SERVER_TRUE);
return;
}
switch(code)
{
//--------- BView Messages -----------------
@ -725,8 +689,8 @@ void ServerWindow::DispatchMessage(int32 code)
int32 bitmapToken;
BPoint point;
fSession->ReadInt32(&bitmapToken);
fSession->ReadPoint(&point);
fSession->Read<int32>(&bitmapToken);
fSession->Read<BPoint>(&point);
ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken);
if(sbmp)
@ -750,8 +714,8 @@ void ServerWindow::DispatchMessage(int32 code)
int32 bitmapToken;
BPoint point;
fSession->ReadInt32(&bitmapToken);
fSession->ReadPoint(&point);
fSession->Read<int32>(&bitmapToken);
fSession->Read<BPoint>(&point);
ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken);
if(sbmp)
@ -773,9 +737,9 @@ void ServerWindow::DispatchMessage(int32 code)
int32 bitmapToken;
BRect srcRect, dstRect;
fSession->ReadInt32(&bitmapToken);
fSession->ReadRect(&dstRect);
fSession->ReadRect(&srcRect);
fSession->Read<int32>(&bitmapToken);
fSession->Read<BRect>(&dstRect);
fSession->Read<BRect>(&srcRect);
ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken);
if(sbmp)
@ -797,9 +761,9 @@ void ServerWindow::DispatchMessage(int32 code)
int32 bitmapToken;
BRect srcRect, dstRect;
fSession->ReadInt32(&bitmapToken);
fSession->ReadRect(&dstRect);
fSession->ReadRect(&srcRect);
fSession->Read<int32>(&bitmapToken);
fSession->Read<BRect>(&dstRect);
fSession->Read<BRect>(&srcRect);
ServerBitmap *sbmp = fServerApp->FindBitmap(bitmapToken);
if(sbmp)
@ -819,20 +783,42 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_SET_CURRENT_LAYER: Layer name: %s\n", fTitle.String(), cl->fName->String()));
int32 token;
fSession->ReadInt32(&token);
fSession->Read<int32>(&token);
Layer *current = FindLayer(fWinBorder->fTopLayer, token);
if (current)
cl=current;
else // hope this NEVER happens! :-)
debugger("Server PANIC: window cannot find Layer with ID\n");
break;
}
case AS_LAYER_CREATE_ROOT:
{
// Start receiving top_view data -- pass NULL as the parent view.
// This should be the *only* place where this happens.
if (cl != NULL)
break;
fWinBorder->fTopLayer = CreateLayerTree(NULL);
fWinBorder->fTopLayer->SetAsTopLayer(true);
cl = fWinBorder->fTopLayer;
// connect decorator and top layer.
fWinBorder->AddChild(fWinBorder->fTopLayer, NULL);
desktop->AddWinBorder(fWinBorder);
break;
}
case AS_LAYER_CREATE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_CREATE: Layer name: %s\n", fTitle.String(), cl->fName->String()));
Layer *newLayer;
if (cl == NULL)
break;
newLayer = CreateLayerTree(NULL);
cl->AddChild(newLayer, this);
@ -898,46 +884,49 @@ void ServerWindow::DispatchMessage(int32 code)
vc = ld->viewcolor.GetColor32();
patt = ld->patt.GetInt64();
// TODO: DW implement such a method in ServerFont class
// fSession->WriteUInt32(ld->font.GetFamAndStyle());
fSession->WriteUInt32(0UL);
fSession->WriteFloat(ld->font.Size());
fSession->WriteFloat(ld->font.Shear());
fSession->WriteFloat(ld->font.Rotation());
fSession->WriteUInt8(ld->font.Spacing());
fSession->WriteUInt8(ld->font.Encoding());
fSession->WriteUInt16(ld->font.Face());
fSession->WriteUInt32(ld->font.Flags());
// TODO: DW implement such a method in ServerFont class!
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<uint32>(0UL /*uint32 ld->font.GetFamAndStyle()*/);
fSession->Attach<float>(ld->font.Size());
fSession->Attach<float>(ld->font.Shear());
fSession->Attach<float>(ld->font.Rotation());
fSession->Attach<uint8>(ld->font.Spacing());
fSession->Attach<uint8>(ld->font.Encoding());
fSession->Attach<uint16>(ld->font.Face());
fSession->Attach<uint32>(ld->font.Flags());
fSession->WritePoint(ld->penlocation);
fSession->WriteFloat(ld->pensize);
fSession->WriteData(&hc, sizeof(rgb_color));
fSession->WriteData(&lc, sizeof(rgb_color));
fSession->WriteData(&vc, sizeof(rgb_color));
fSession->WriteData(&patt,sizeof(pattern));
fSession->WritePoint(ld->coordOrigin);
fSession->WriteUInt8((uint8)(ld->draw_mode));
fSession->WriteUInt8((uint8)(ld->lineCap));
fSession->WriteUInt8((uint8)(ld->lineJoin));
fSession->WriteFloat(ld->miterLimit);
fSession->WriteUInt8((uint8)(ld->alphaSrcMode));
fSession->WriteUInt8((uint8)(ld->alphaFncMode));
fSession->WriteFloat(ld->scale);
fSession->WriteFloat(ld->fontAliasing);
fSession->Attach<BPoint>(ld->penlocation);
fSession->Attach<float>(ld->pensize);
fSession->Attach(&hc, sizeof(rgb_color));
fSession->Attach(&lc, sizeof(rgb_color));
fSession->Attach(&vc, sizeof(rgb_color));
// TODO: fix this to use the templatized version
fSession->Attach(&patt,sizeof(pattern));
fSession->Attach<BPoint>(ld->coordOrigin);
fSession->Attach<uint8>((uint8)(ld->draw_mode));
fSession->Attach<uint8>((uint8)(ld->lineCap));
fSession->Attach<uint8>((uint8)(ld->lineJoin));
fSession->Attach<float>(ld->miterLimit);
fSession->Attach<uint8>((uint8)(ld->alphaSrcMode));
fSession->Attach<uint8>((uint8)(ld->alphaFncMode));
fSession->Attach<float>(ld->scale);
fSession->Attach<float>(ld->fontAliasing);
int32 noOfRects = 0;
if (ld->clipReg)
noOfRects = ld->clipReg->CountRects();
fSession->WriteInt32(noOfRects);
fSession->Attach<int32>(noOfRects);
for(int i = 0; i < noOfRects; i++)
fSession->WriteRect(ld->clipReg->RectAt(i));
fSession->Attach<BRect>(ld->clipReg->RectAt(i));
fSession->WriteFloat(cl->fFrame.left);
fSession->WriteFloat(cl->fFrame.top);
fSession->WriteRect(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop));
fSession->Sync();
fSession->Attach<float>(cl->fFrame.left);
fSession->Attach<float>(cl->fFrame.top);
fSession->Attach<BRect>(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop));
fSession->Flush();
break;
}
case AS_LAYER_MOVETO:
@ -945,8 +934,8 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_MOVETO: Layer name: %s\n", fTitle.String(), cl->fName->String()));
float x, y;
fSession->ReadFloat(&x);
fSession->ReadFloat(&y);
fSession->Read<float>(&x);
fSession->Read<float>(&y);
cl->MoveBy(x, y);
@ -957,8 +946,8 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_RESIZETO: Layer name: %s\n", fTitle.String(), cl->fName->String()));
float newWidth, newHeight;
fSession->ReadFloat(&newWidth);
fSession->ReadFloat(&newHeight);
fSession->Read<float>(&newWidth);
fSession->Read<float>(&newHeight);
// TODO: check for minimum alowed. WinBorder should provide such
// a method, based on its decorator.
@ -970,10 +959,12 @@ void ServerWindow::DispatchMessage(int32 code)
case AS_LAYER_GET_COORD:
{
STRACE(("ServerWindow %s: Message AS_LAYER_GET_COORD: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->WriteFloat(cl->fFrame.left);
fSession->WriteFloat(cl->fFrame.top);
fSession->WriteRect(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop));
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<float>(cl->fFrame.left);
fSession->Attach<float>(cl->fFrame.top);
fSession->Attach<BRect>(cl->fFrame.OffsetToCopy(cl->fBoundsLeftTop));
fSession->Flush();
break;
}
case AS_LAYER_SET_ORIGIN:
@ -981,8 +972,8 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_SET_ORIGIN: Layer: %s\n",fTitle.String(), cl->fName->String()));
float x, y;
fSession->ReadFloat(&x);
fSession->ReadFloat(&y);
fSession->Read<float>(&x);
fSession->Read<float>(&y);
cl->fLayerData->coordOrigin.Set(x, y);
@ -991,15 +982,16 @@ void ServerWindow::DispatchMessage(int32 code)
case AS_LAYER_GET_ORIGIN:
{
STRACE(("ServerWindow %s: Message AS_LAYER_GET_ORIGIN: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->WritePoint(cl->fLayerData->coordOrigin);
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<BPoint>(cl->fLayerData->coordOrigin);
fSession->Flush();
break;
}
case AS_LAYER_RESIZE_MODE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_RESIZE_MODE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->ReadUInt32(&(cl->fResizeMode));
fSession->Read<uint32>(&(cl->fResizeMode));
break;
}
@ -1008,7 +1000,7 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_CURSOR: Layer: %s\n",fTitle.String(), cl->fName->String()));
int32 token;
fSession->ReadInt32(&token);
fSession->Read<int32>(&token);
cursormanager->SetCursor(token);
@ -1016,7 +1008,7 @@ void ServerWindow::DispatchMessage(int32 code)
}
case AS_LAYER_SET_FLAGS:
{
fSession->ReadUInt32(&(cl->fFlags));
fSession->Read<uint32>(&(cl->fFlags));
STRACE(("ServerWindow %s: Message AS_LAYER_SET_FLAGS: Layer: %s\n",fTitle.String(), cl->fName->String()));
break;
@ -1043,9 +1035,9 @@ void ServerWindow::DispatchMessage(int32 code)
// it was called. e.g.: different lineCap or lineJoin. Strange results
// would appear.
fSession->ReadInt8(&lineCap);
fSession->ReadInt8(&lineJoin);
fSession->ReadFloat(&(cl->fLayerData->miterLimit));
fSession->Read<int8>(&lineCap);
fSession->Read<int8>(&lineJoin);
fSession->Read<float>(&(cl->fLayerData->miterLimit));
cl->fLayerData->lineCap = (cap_mode)lineCap;
cl->fLayerData->lineJoin = (join_mode)lineJoin;
@ -1055,10 +1047,11 @@ void ServerWindow::DispatchMessage(int32 code)
case AS_LAYER_GET_LINE_MODE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_GET_LINE_MODE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->WriteInt8((int8)(cl->fLayerData->lineCap));
fSession->WriteInt8((int8)(cl->fLayerData->lineJoin));
fSession->WriteFloat(cl->fLayerData->miterLimit);
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<int8>((int8)(cl->fLayerData->lineCap));
fSession->Attach<int8>((int8)(cl->fLayerData->lineJoin));
fSession->Attach<float>(cl->fLayerData->miterLimit);
fSession->Flush();
break;
}
@ -1092,9 +1085,8 @@ void ServerWindow::DispatchMessage(int32 code)
}
case AS_LAYER_SET_SCALE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_SET_SCALE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->ReadFloat(&(cl->fLayerData->scale));
STRACE(("ServerWindow %s: Message AS_LAYER_SET_SCALE: Layer: %s\n",fTitle.String(), cl->_name->String()));
fSession->Read<float>(&(cl->fLayerData->scale));
break;
}
case AS_LAYER_GET_SCALE:
@ -1107,9 +1099,10 @@ void ServerWindow::DispatchMessage(int32 code)
while((ld = ld->prevState))
scale *= ld->scale;
fSession->WriteFloat(scale);
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<float>(scale);
fSession->Flush();
break;
}
case AS_LAYER_SET_PEN_LOC:
@ -1117,34 +1110,36 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_SET_PEN_LOC: Layer: %s\n",fTitle.String(), cl->fName->String()));
float x, y;
fSession->ReadFloat(&x);
fSession->ReadFloat(&y);
fSession->Read<float>(&x);
fSession->Read<float>(&y);
cl->fLayerData->penlocation.Set(x, y);
break;
}
case AS_LAYER_GET_PEN_LOC:
{
STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_LOC: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->WritePoint(cl->fLayerData->penlocation);
fSession->Sync();
STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_LOC: Layer: %s\n",fTitle.String(), cl->_name->String()));
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<BPoint>(cl->fLayerData->penlocation);
fSession->Flush();
break;
}
case AS_LAYER_SET_PEN_SIZE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_SET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->ReadFloat(&(cl->fLayerData->pensize));
STRACE(("ServerWindow %s: Message AS_LAYER_SET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->_name->String()));
fSession->Read<float>(&(cl->fLayerData->pensize));
break;
}
case AS_LAYER_GET_PEN_SIZE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->WriteFloat(cl->fLayerData->pensize);
fSession->Sync();
STRACE(("ServerWindow %s: Message AS_LAYER_GET_PEN_SIZE: Layer: %s\n",fTitle.String(), cl->_name->String()));
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<float>(cl->fLayerData->pensize);
fSession->Flush();
break;
}
case AS_LAYER_SET_HIGH_COLOR:
@ -1152,10 +1147,10 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_SET_HIGH_COLOR: Layer: %s\n",fTitle.String(), cl->fName->String()));
rgb_color c;
fSession->ReadData(&c, sizeof(rgb_color));
fSession->Read(&c, sizeof(rgb_color));
cl->fLayerData->highcolor.SetColor(c);
break;
}
case AS_LAYER_SET_LOW_COLOR:
@ -1163,7 +1158,7 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_SET_LOW_COLOR: Layer: %s\n",fTitle.String(), cl->fName->String()));
rgb_color c;
fSession->ReadData(&c, sizeof(rgb_color));
fSession->Read(&c, sizeof(rgb_color));
cl->fLayerData->lowcolor.SetColor(c);
@ -1174,7 +1169,7 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_SET_VIEW_COLOR: Layer: %s\n",fTitle.String(), cl->fName->String()));
rgb_color c;
fSession->ReadData(&c, sizeof(rgb_color));
fSession->Read(&c, sizeof(rgb_color));
cl->fLayerData->viewcolor.SetColor(c);
@ -1191,10 +1186,11 @@ void ServerWindow::DispatchMessage(int32 code)
lowColor = cl->fLayerData->lowcolor.GetColor32();
viewColor = cl->fLayerData->viewcolor.GetColor32();
fSession->WriteData(&highColor, sizeof(rgb_color));
fSession->WriteData(&lowColor, sizeof(rgb_color));
fSession->WriteData(&viewColor, sizeof(rgb_color));
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach(&highColor, sizeof(rgb_color));
fSession->Attach(&lowColor, sizeof(rgb_color));
fSession->Attach(&viewColor, sizeof(rgb_color));
fSession->Flush();
break;
}
@ -1203,21 +1199,21 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_SET_BLEND_MODE: Layer: %s\n",fTitle.String(), cl->fName->String()));
int8 srcAlpha, alphaFunc;
fSession->ReadInt8(&srcAlpha);
fSession->ReadInt8(&alphaFunc);
fSession->Read<int8>(&srcAlpha);
fSession->Read<int8>(&alphaFunc);
cl->fLayerData->alphaSrcMode = (source_alpha)srcAlpha;
cl->fLayerData->alphaFncMode = (alpha_function)alphaFunc;
break;
}
case AS_LAYER_GET_BLEND_MODE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_GET_BLEND_MODE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->WriteInt8((int8)(cl->fLayerData->alphaSrcMode));
fSession->WriteInt8((int8)(cl->fLayerData->alphaFncMode));
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<int8>((int8)(cl->fLayerData->alphaSrcMode));
fSession->Attach<int8>((int8)(cl->fLayerData->alphaFncMode));
fSession->Flush();
break;
}
@ -1226,7 +1222,7 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_SET_DRAW_MODE: Layer: %s\n",fTitle.String(), cl->fName->String()));
int8 drawingMode;
fSession->ReadInt8(&drawingMode);
fSession->Read<int8>(&drawingMode);
cl->fLayerData->draw_mode = (drawing_mode)drawingMode;
@ -1235,27 +1231,29 @@ void ServerWindow::DispatchMessage(int32 code)
case AS_LAYER_GET_DRAW_MODE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_GET_DRAW_MODE: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->WriteInt8((int8)(cl->fLayerData->draw_mode));
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<int8>((int8)(cl->fLayerData->draw_mode));
fSession->Flush();
break;
}
case AS_LAYER_PRINT_ALIASING:
{
STRACE(("ServerWindow %s: Message AS_LAYER_PRINT_ALIASING: Layer: %s\n",fTitle.String(), cl->fName->String()));
fSession->ReadBool(&(cl->fLayerData->fontAliasing));
fSession->Read<bool>(&(cl->fLayerData->fontAliasing));
break;
}
case AS_LAYER_CLIP_TO_PICTURE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_CLIP_TO_PICTURE: Layer: %s\n",fTitle.String(), cl->fName->String()));
// TODO: watch out for the coordinate system
int32 pictureToken;
BPoint where;
fSession->ReadInt32(&pictureToken);
fSession->ReadPoint(&where);
fSession->Read<int32>(&pictureToken);
fSession->Read<BPoint>(&where);
BRegion reg;
@ -1324,12 +1322,13 @@ void ServerWindow::DispatchMessage(int32 code)
case AS_LAYER_CLIP_TO_INVERSE_PICTURE:
{
STRACE(("ServerWindow %s: Message AS_LAYER_CLIP_TO_INVERSE_PICTURE: Layer: %s\n",fTitle.String(), cl->fName->String()));
// TODO: watch out for the coordinate system
int32 pictureToken;
BPoint where;
fSession->ReadInt32(&pictureToken);
fSession->ReadPoint(&where);
fSession->Read<int32>(&pictureToken);
fSession->Read<BPoint>(&where);
ServerPicture *sp = NULL;
int32 i = 0;
@ -1365,8 +1364,9 @@ void ServerWindow::DispatchMessage(int32 code)
STRACE(("ServerWindow %s: Message AS_LAYER_GET_CLIP_REGION: Layer: %s\n",fTitle.String(), cl->fName->String()));
// if this Layer is hidden, it is clear that its visible region is void.
if (cl->IsHidden()){
fSession->WriteInt32(0L);
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<int32>(0L);
fSession->Flush();
}
else{
// TODO: watch out for the coordinate system
@ -1387,10 +1387,11 @@ void ServerWindow::DispatchMessage(int32 code)
}
noOfRects = reg.CountRects();
fSession->WriteInt32(noOfRects);
fSession->StartMessage(SERVER_TRUE);
fSession->Attach<int32>(noOfRects);
for(int i = 0; i < noOfRects; i++)
fSession->WriteRect(reg.RectAt(i));
fSession->Attach<BRect>(reg.RectAt(i));
}
break;
}
@ -1406,11 +1407,11 @@ void ServerWindow::DispatchMessage(int32 code)
else
cl->fLayerData->clipReg = new BRegion();
fSession->ReadInt32(&noOfRects);
fSession->Read<int32>(&noOfRects);
for(int i = 0; i < noOfRects; i++)
{
fSession->ReadRect(&r);
fSession->Read<BRect>(&r);
cl->fLayerData->clipReg->Include(r);
}
@ -1431,7 +1432,7 @@ void ServerWindow::DispatchMessage(int32 code)
// TODO: watch out for the coordinate system
BRect invalRect;
fSession->ReadRect(&invalRect);
fSession->Read<BRect>(&invalRect);
cl->Invalidate(invalRect);
@ -1445,11 +1446,11 @@ void ServerWindow::DispatchMessage(int32 code)
int32 noOfRects;
BRect rect;
fSession->ReadInt32(&noOfRects);
fSession->Read<int32>(&noOfRects);
for(int i = 0; i < noOfRects; i++)
{
fSession->ReadRect(&rect);
fSession->Read<BRect>(&rect);
invalReg.Include(rect);
}
@ -1527,21 +1528,21 @@ void ServerWindow::DispatchMessage(int32 code)
int32 mainToken;
team_id teamID;
fSession->ReadInt32(&mainToken);
fSession->ReadData(&teamID, sizeof(team_id));
fSession->Read<int32>(&mainToken);
fSession->Read(&teamID, sizeof(team_id));
wb = desktop->FindWinBorderByServerWindowTokenAndTeamID(mainToken, teamID);
if(wb)
{
fSession->WriteInt32(SERVER_TRUE);
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Flush();
fWinBorder->AddToSubsetOf(wb);
}
else
{
fSession->WriteInt32(SERVER_FALSE);
fSession->Sync();
fSession->StartMessage(SERVER_FALSE);
fSession->Flush();
}
break;
}
@ -1551,21 +1552,21 @@ void ServerWindow::DispatchMessage(int32 code)
int32 mainToken;
team_id teamID;
fSession->ReadInt32(&mainToken);
fSession->ReadData(&teamID, sizeof(team_id));
fSession->Read<int32>(&mainToken);
fSession->Read(&teamID, sizeof(team_id));
wb = desktop->FindWinBorderByServerWindowTokenAndTeamID(mainToken, teamID);
if(wb)
{
fSession->WriteInt32(SERVER_TRUE);
fSession->Sync();
fSession->StartMessage(SERVER_TRUE);
fSession->Flush();
fWinBorder->RemoveFromSubsetOf(wb);
}
else
{
fSession->WriteInt32(SERVER_FALSE);
fSession->Sync();
fSession->StartMessage(SERVER_FALSE);
fSession->Flush();
}
break;
}
@ -1616,8 +1617,8 @@ void ServerWindow::DispatchMessage(int32 code)
float xResizeBy;
float yResizeBy;
fSession->ReadFloat(&xResizeBy);
fSession->ReadFloat(&yResizeBy);
fSession->Read<float>(&xResizeBy);
fSession->Read<float>(&yResizeBy);
fWinBorder->ResizeBy(xResizeBy, yResizeBy);
@ -1628,8 +1629,8 @@ void ServerWindow::DispatchMessage(int32 code)
float xMoveBy;
float yMoveBy;
fSession->ReadFloat(&xMoveBy);
fSession->ReadFloat(&yMoveBy);
fSession->Read<float>(&xMoveBy);
fSession->Read<float>(&yMoveBy);
fWinBorder->MoveBy(xMoveBy, yMoveBy);
@ -2216,14 +2217,18 @@ void ServerWindow::DispatchGraphicsMessage(int32 msgsize, int8 *msgbuffer)
int32 ServerWindow::MonitorWin(void *data)
{
ServerWindow *win = (ServerWindow *)data;
BSession *ses = win->fSession;
BPortLink *ses = win->fSession;
bool quitting = false;
int32 code;
status_t err = B_OK;
while(!quitting)
{
printf("info: ServerWindow::MonitorWin listening on port %ld.\n", win->fMessagePort);
code = AS_CLIENT_DEAD;
ses->ReadInt32(&code);
err = ses->GetNextReply(&code);
if (err < B_OK)
return err;
win->Lock();
@ -2255,7 +2260,7 @@ int32 ServerWindow::MonitorWin(void *data)
win->Unlock();
}
return 0;
return err;
}
//------------------------------------------------------------------------------
Layer* ServerWindow::FindLayer(const Layer* start, int32 token) const

View File

@ -34,7 +34,6 @@
#include <Rect.h>
#include <String.h>
#include <Window.h>
#include <PortMessage.h>
#include "FMWList.h"
class BString;
@ -43,10 +42,9 @@ class BPoint;
class BMessage;
class ServerApp;
class Decorator;
class PortLink;
class BPortLink;
class WinBorder;
class Workspace;
class BSession;
class Layer;
#define AS_UPDATE_DECORATOR 'asud'
@ -159,7 +157,7 @@ protected:
uint32 fToken;
int32 fHandlerToken;
BSession *fSession;
BPortLink *fSession;
// cl is short for currentLayer. We'll use it a lot, that's why it's short :-)
Layer *cl;

View File

@ -25,7 +25,7 @@
//
//------------------------------------------------------------------------------
#include <PortLink.h>
#include <PortMessage.h>
#include <AppServerLink.h>
#include <ServerProtocol.h>
#include <OS.h>
#include <String.h>
@ -43,8 +43,8 @@ void set_syscursor(cursor_which which, const BCursor *cursor)
port_id server=find_port(SERVER_PORT_NAME);
if(server!=B_NAME_NOT_FOUND)
{
PortLink link(server);
link.SetOpCode(AS_SET_SYSCURSOR_BCURSOR);
BPortLink link(server);
link.StartMessage(AS_SET_SYSCURSOR_BCURSOR);
link.Attach<cursor_which>(which);
// The easy (and clean) way for us to access the cursor's token
@ -69,8 +69,8 @@ void set_syscursor(cursor_which which, const BBitmap *bitmap)
port_id server=find_port(SERVER_PORT_NAME);
if(server!=B_NAME_NOT_FOUND)
{
PortLink link(server);
link.SetOpCode(AS_SET_SYSCURSOR_BBITMAP);
BPortLink link(server);
link.StartMessage(AS_SET_SYSCURSOR_BBITMAP);
link.Attach<cursor_which>(which);
// Just like the BCursor version, we will use a hack until R1.
@ -89,17 +89,19 @@ void set_syscursor(cursor_which which, const BBitmap *bitmap)
cursor_which get_syscursor(void)
{
port_id server=find_port(SERVER_PORT_NAME);
if(server!=B_NAME_NOT_FOUND)
if(server >= 0)
{
PortMessage pmsg;
PortLink link(server);
link.SetOpCode(AS_GET_SYSCURSOR);
link.FlushWithReply(&pmsg);
int32 code = SERVER_FALSE;
BPrivate::BAppServerLink link;
cursor_which which;
pmsg.Read<cursor_which>(&which);
return which;
link.SetSendPort(server);
link.StartMessage(AS_GET_SYSCURSOR);
link.FlushWithReply(&code);
if (code == SERVER_TRUE)
if (link.Read<cursor_which>(&which) == B_OK)
return which;
}
return B_CURSOR_INVALID;
}
@ -111,10 +113,10 @@ cursor_which get_syscursor(void)
void setcursor(cursor_which which)
{
port_id server=find_port(SERVER_PORT_NAME);
if(server!=B_NAME_NOT_FOUND)
if(server >= 0)
{
PortLink link(server);
link.SetOpCode(AS_SET_CURSOR_SYSTEM);
BPortLink link(server);
link.StartMessage(AS_SET_CURSOR_SYSTEM);
link.Flush();
}
}
@ -270,7 +272,7 @@ status_t CursorSet::FindCursor(cursor_which which, BBitmap **cursor, BPoint *hot
return B_NAME_NOT_FOUND;
const void *buffer;
BString tempstr;
const char *tempstr;
int32 bufferLength;
BBitmap *bmp;
BPoint hotpt;
@ -282,7 +284,7 @@ status_t CursorSet::FindCursor(cursor_which which, BBitmap **cursor, BPoint *hot
return B_ERROR;
if(tempstr.Compare("cursor")==0)
if(strcmp(tempstr, "cursor")==0)
{
bmp=new BBitmap( msg.FindRect("_frame"),
(color_space) msg.FindInt32("_cspace"),true );
@ -316,7 +318,7 @@ status_t CursorSet::FindCursor(cursor_which which, ServerCursor **cursor)
return B_NAME_NOT_FOUND;
const void *buffer;
BString tempstr;
const char *tempstr;
int32 bufferLength;
ServerCursor *csr;
BPoint hotpt;
@ -327,7 +329,7 @@ status_t CursorSet::FindCursor(cursor_which which, ServerCursor **cursor)
if(msg.FindPoint("hotspot",&hotpt)!=B_OK)
return B_ERROR;
if(tempstr.Compare("cursor")==0)
if(strcmp(tempstr, "cursor")==0)
{
csr=new ServerCursor(msg.FindRect("_frame"),(color_space) msg.FindInt32("_cspace"),0, hotpt);
msg.FindData("_data",B_RAW_TYPE,(const void **)&buffer, (ssize_t*)&bufferLength);
@ -345,8 +347,8 @@ status_t CursorSet::FindCursor(cursor_which which, ServerCursor **cursor)
*/
const char *CursorSet::GetName(void)
{
const char *name = NULL;
if (FindString("name", &name) == B_OK)
const char *name;
if(FindString("name",&name)==B_OK)
return name;
return NULL;
}

View File

@ -83,7 +83,7 @@ VDView::VDView(BRect bounds)
// This link for sending mouse messages to the OBAppServer.
// This is only to take the place of the Input Server.
serverlink=new PortLink(find_port(SERVER_INPUT_PORT));
serverlink = new BPortLink(find_port(SERVER_INPUT_PORT));
// Create a cursor which isn't just a box
cursor=new BBitmap(BRect(0,0,20,20),B_RGBA32,true);
@ -159,7 +159,7 @@ void VDView::MouseDown(BPoint pt)
GetMouse(&p,&buttons);
serverlink->SetOpCode(B_MOUSE_DOWN);
serverlink->StartMessage(B_MOUSE_DOWN);
serverlink->Attach(&time, sizeof(int64));
serverlink->Attach(&pt.x,sizeof(float));
serverlink->Attach(&pt.y,sizeof(float));
@ -182,7 +182,7 @@ void VDView::MouseMoved(BPoint pt, uint32 transit, const BMessage *msg)
uint32 buttons;
int64 time=(int64)real_time_clock();
serverlink->SetOpCode(B_MOUSE_MOVED);
serverlink->StartMessage(B_MOUSE_MOVED);
serverlink->Attach(&time,sizeof(int64));
serverlink->Attach(&pt.x,sizeof(float));
serverlink->Attach(&pt.y,sizeof(float));
@ -209,7 +209,7 @@ void VDView::MouseUp(BPoint pt)
GetMouse(&p,&buttons);
serverlink->SetOpCode(B_MOUSE_UP);
serverlink->StartMessage(B_MOUSE_UP);
serverlink->Attach(&time, sizeof(int64));
serverlink->Attach(&pt.x,sizeof(float));
serverlink->Attach(&pt.y,sizeof(float));
@ -229,7 +229,7 @@ void VDView::MessageReceived(BMessage *msg)
msg->FindFloat("be:wheel_delta_x",&x);
msg->FindFloat("be:wheel_delta_y",&y);
int64 time=real_time_clock();
serverlink->SetOpCode(B_MOUSE_WHEEL_CHANGED);
serverlink->StartMessage(B_MOUSE_WHEEL_CHANGED);
serverlink->Attach(&time,sizeof(int64));
serverlink->Attach(x);
serverlink->Attach(y);
@ -289,7 +289,7 @@ void VDWindow::MessageReceived(BMessage *msg)
msg->FindString("bytes",&string);
for(int8 i=0;i<15;i++)
msg->FindInt8("states",i,&keyarray[i]);
view->serverlink->SetOpCode(B_KEY_DOWN);
view->serverlink->StartMessage(B_KEY_DOWN);
view->serverlink->Attach(&systime,sizeof(bigtime_t));
view->serverlink->Attach(scancode);
view->serverlink->Attach(asciicode);
@ -330,7 +330,7 @@ void VDWindow::MessageReceived(BMessage *msg)
msg->FindString("bytes",&string);
for(int8 i=0;i<15;i++)
msg->FindInt8("states",i,&keyarray[i]);
view->serverlink->SetOpCode(B_KEY_UP);
view->serverlink->StartMessage(B_KEY_UP);
view->serverlink->Attach(&systime,sizeof(bigtime_t));
view->serverlink->Attach(scancode);
view->serverlink->Attach(asciicode);
@ -358,7 +358,7 @@ void VDWindow::MessageReceived(BMessage *msg)
msg->FindInt32("modifiers",&modifiers);
for(int8 i=0;i<15;i++)
msg->FindInt8("states",i,&keyarray[i]);
view->serverlink->SetOpCode(B_UNMAPPED_KEY_DOWN);
view->serverlink->StartMessage(B_UNMAPPED_KEY_DOWN);
view->serverlink->Attach(&systime,sizeof(bigtime_t));
view->serverlink->Attach(scancode);
view->serverlink->Attach(modifiers);
@ -382,7 +382,7 @@ void VDWindow::MessageReceived(BMessage *msg)
msg->FindInt32("modifiers",&modifiers);
for(int8 i=0;i<15;i++)
msg->FindInt8("states",i,&keyarray[i]);
view->serverlink->SetOpCode(B_UNMAPPED_KEY_UP);
view->serverlink->StartMessage(B_UNMAPPED_KEY_UP);
view->serverlink->Attach(&systime,sizeof(bigtime_t));
view->serverlink->Attach(scancode);
view->serverlink->Attach(modifiers);
@ -407,7 +407,7 @@ void VDWindow::MessageReceived(BMessage *msg)
msg->FindInt32("be:old_modifiers",&oldmodifiers);
for(int8 i=0;i<15;i++)
msg->FindInt8("states",i,&keyarray[i]);
view->serverlink->SetOpCode(B_MODIFIERS_CHANGED);
view->serverlink->StartMessage(B_MODIFIERS_CHANGED);
view->serverlink->Attach(&systime,sizeof(bigtime_t));
view->serverlink->Attach(scancode);
view->serverlink->Attach(modifiers);

View File

@ -40,7 +40,7 @@
#include "FontServer.h"
class BBitmap;
class PortLink;
class BPortLink;
class VDWindow;
class DrawData;
@ -57,7 +57,7 @@ public:
void MessageReceived(BMessage *msg);
BBitmap *viewbmp;
PortLink *serverlink;
BPortLink *serverlink;
int hide_cursor;
BBitmap *cursor;
@ -160,7 +160,7 @@ protected:
BView *drawview;
BRegion laregion;
PortLink *serverlink;
BPortLink *serverlink;
// drawing_mode drawmode;
rgb_color highcolor,lowcolor;

View File

@ -30,7 +30,7 @@
#include <Locker.h>
#include <Debug.h>
#include <TokenSpace.h>
#include "PortMessage.h"
#include "PortLink.h"
#include "View.h" // for mouse button defines
#include "ServerWindow.h"
#include "Decorator.h"
@ -90,7 +90,6 @@ WinBorder::WinBorder(const BRect &r, const char *name, const int32 look, const i
fMouseButtons = 0;
fKeyModifiers = 0;
fServerHidden = false;
fMainWinBorder = NULL;
fDecorator = NULL;
fTopLayer = NULL;
@ -140,7 +139,7 @@ void WinBorder::RebuildFullRegion(void)
fDecorator->GetFootprint(&fFull);
}
void WinBorder::MouseDown(PortMessage *msg, bool sendMessage)
void WinBorder::MouseDown(PointerEvent& evt, bool sendMessage)
{
if (!(Window()->IsLocked()))
debugger("you must lock the attached ServerWindow object\n\t before calling WinBorder::MouseDown()\n");
@ -150,34 +149,13 @@ void WinBorder::MouseDown(PortMessage *msg, bool sendMessage)
// user clicked on WinBorder's visible region, which is in fact decorator's.
// so, if true, we find out if the user clicked the decorator.
// Attached data:
// 1) int64 - time of mouse click
// 2) float - x coordinate of mouse click
// 3) float - y coordinate of mouse click
// 4) int32 - modifier keys down
// 5) int32 - buttons down
// 6) int32 - clicks
int64 time;
BPoint pt;
int32 modifierkeys;
int32 buttons;
int32 clicks;
msg->Read<int64>(&time);
msg->Read<float>(&pt.x);
msg->Read<float>(&pt.y);
msg->Read<int32>(&modifierkeys);
msg->Read<int32>(&buttons);
msg->Read<int32>(&clicks);
Layer *target = LayerAt(pt);
Layer *target = LayerAt(evt.where);
if (target == this)
{
click_type action;
// find out where user clicked in Decorator
action = fDecorator->Clicked(pt, buttons, modifierkeys);
action = fDecorator->Clicked(evt.where, evt.buttons, evt.modifiers);
switch(action)
{
case DEC_CLOSE:
@ -236,42 +214,29 @@ void WinBorder::MouseDown(PortMessage *msg, bool sendMessage)
else if (sendMessage){
BMessage msg;
msg.what= B_MOUSE_DOWN;
msg.AddInt64("when", time);
msg.AddPoint("where", pt);
msg.AddInt32("modifiers", modifierkeys);
msg.AddInt32("buttons", buttons);
msg.AddInt32("clicks", clicks);
msg.AddInt64("when", evt.when);
msg.AddPoint("where", evt.where);
msg.AddInt32("modifiers", evt.modifiers);
msg.AddInt32("buttons", evt.buttons);
msg.AddInt32("clicks", evt.clicks);
// TODO: figure out how to specify the target
// msg.AddInt32("token", token);
Window()->SendMessageToClient(&msg);
}
// Just to clean up any mess we've made. :)
msg->Rewind();
fLastMousePosition = pt;
fLastMousePosition = evt.where;
}
void WinBorder::MouseMoved(PortMessage *msg)
void WinBorder::MouseMoved(PointerEvent& evt)
{
if (!(Window()->IsLocked()))
debugger("you must lock the attached ServerWindow object\n\t before calling WinBorder::MouseMoved()\n");
BPoint pt;
int64 dummy;
int32 buttons;
msg->Read<int64>(&dummy);
msg->Read<float>(&pt.x);
msg->Read<float>(&pt.y);
msg->Read<int32>(&buttons);
msg->Rewind();
if (fIsMoving)
{
STRACE_CLICK(("===> Moving...\n"));
BPoint offset = pt;
BPoint offset = evt.where;
offset -= fLastMousePosition;
MoveBy(offset.x, offset.y);
}
@ -279,14 +244,14 @@ void WinBorder::MouseMoved(PortMessage *msg)
if (fIsResizing)
{
STRACE_CLICK(("===> Resizing...\n"));
BPoint offset = pt;
BPoint offset = evt.where;
offset -= fLastMousePosition;
ResizeBy(offset.x, offset.y);
}
else
{
// Do a click test only if we have to, which would be now. :)
click_type location=fDecorator->Clicked(pt,buttons,fKeyModifiers);
click_type location=fDecorator->Clicked(evt.where, evt.buttons,fKeyModifiers);
if (fIsZooming && location!=DEC_ZOOM)
{
@ -306,10 +271,10 @@ void WinBorder::MouseMoved(PortMessage *msg)
fDecorator->DrawMinimize();
}
}
fLastMousePosition = pt;
fLastMousePosition = evt.where;
}
void WinBorder::MouseUp(PortMessage *msg)
void WinBorder::MouseUp(PointerEvent& evt)
{
if (!(Window()->IsLocked()))
debugger("you must lock the attached ServerWindow object\n\t before calling WinBorder::MouseUp()\n");
@ -411,22 +376,7 @@ void WinBorder::ResizeBy(float x, float y)
Layer::ResizeBy(x,y);
}
bool WinBorder::IsHidden() const{
if (fServerHidden)
return true;
return Layer::IsHidden();
}
void WinBorder::ServerHide(){
fServerHidden = true;
}
void WinBorder::ServerUnhide(){
fServerHidden = false;
}
bool WinBorder::HasPoint(const BPoint& pt) const
bool WinBorder::HasPoint(BPoint pt) const
{
return fFullVisible.Contains(pt);
}
@ -495,7 +445,7 @@ void WinBorder::AddToSubsetOf(WinBorder* main)
{
// if the main window is hidden also hide this one.
if(main->IsHidden())
Hide();//fHidden = true;
fHidden = true;
// add to main window's subset
main->Window()->fWinFMWList.AddItem(this);
@ -603,7 +553,7 @@ void WinBorder::PrintToStream()
if (fLevel == B_NORMAL_FEEL)
printf("\t%s", "B_NORMAL_WINDOW_FEEL");
printf("\t%s\n", IsHidden()?"hidden" : "not hidden");
printf("\t%s\n", fHidden?"hidden" : "not hidden");
}
void WinBorder::UpdateColors(void)

View File

@ -35,9 +35,23 @@
class ServerWindow;
class Decorator;
class DisplayDriver;
class PortMessage;
class Desktop;
class PointerEvent
{
public:
int32 code; //B_MOUSE_UP, B_MOUSE_DOWN, B_MOUSE_MOVED
//B_MOUSE_WHEEL_CHANGED
bigtime_t when;
BPoint where;
float wheel_delta_x;
float wheel_delta_y;
int32 modifiers;
int32 buttons; //B_PRIMARY_MOUSE_BUTTON, B_SECONDARY_MOUSE_BUTTON
//B_TERTIARY_MOUSE_BUTTON
int32 clicks;
};
class WinBorder : public Layer
{
public:
@ -52,13 +66,9 @@ public:
virtual void RebuildFullRegion(void);
virtual bool IsHidden() const;
void ServerHide();
void ServerUnhide();
void MouseDown(PortMessage *msg, bool sendMessage);
void MouseMoved(PortMessage *msg);
void MouseUp(PortMessage *msg);
void MouseDown(PointerEvent& evt, bool sendMessage);
void MouseMoved(PointerEvent& evt);
void MouseUp(PointerEvent& evt);
void UpdateColors(void);
void UpdateDecorator(void);
@ -71,7 +81,7 @@ public:
void SetLevel();
void HighlightDecorator(const bool &active);
bool HasPoint(const BPoint &pt) const;
bool HasPoint(BPoint pt) const;
void AddToSubsetOf(WinBorder* main);
void RemoveFromSubsetOf(WinBorder* main);
@ -93,7 +103,6 @@ protected:
int32 fKeyModifiers;
BPoint fLastMousePosition;
bool fServerHidden;
WinBorder *fMainWinBorder;
bool fIsMoving;
bool fIsResizing;