2003-01-24 17:36:15 +03:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// Copyright (c) 2001-2002, OpenBeOS
|
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
// copy of this software and associated documentation files (the "Software"),
|
|
|
|
// to deal in the Software without restriction, including without limitation
|
|
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
// and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
// Software is furnished to do so, subject to the following conditions:
|
|
|
|
//
|
|
|
|
// The above copyright notice and this permission notice shall be included in
|
|
|
|
// all copies or substantial portions of the Software.
|
|
|
|
//
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
// DEALINGS IN THE SOFTWARE.
|
|
|
|
//
|
|
|
|
// File Name: ServerApp.cpp
|
|
|
|
// Author: DarkWyrm <bpmagic@columbus.rr.com>
|
|
|
|
// Description: Server-side BApplication counterpart
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
#include <AppDefs.h>
|
|
|
|
#include <List.h>
|
|
|
|
#include <String.h>
|
2003-01-24 18:19:27 +03:00
|
|
|
#include <PortLink.h>
|
2003-10-04 23:10:11 +04:00
|
|
|
#include <PortMessage.h>
|
|
|
|
#include <PortQueue.h>
|
2003-09-17 23:28:31 +04:00
|
|
|
#include <SysCursor.h>
|
2003-08-31 21:38:34 +04:00
|
|
|
|
|
|
|
#include <Session.h>
|
|
|
|
|
2004-01-17 21:37:57 +03:00
|
|
|
#include <ColorSet.h>
|
|
|
|
#include <RGBColor.h>
|
2003-01-24 17:36:15 +03:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2003-07-10 21:48:04 +04:00
|
|
|
#include <ScrollBar.h>
|
2003-03-12 17:29:59 +03:00
|
|
|
#include <ServerProtocol.h>
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-17 21:37:57 +03:00
|
|
|
#include "AppServer.h"
|
2003-03-12 17:29:59 +03:00
|
|
|
#include "BitmapManager.h"
|
2003-01-24 17:36:15 +03:00
|
|
|
#include "CursorManager.h"
|
2003-01-24 18:19:27 +03:00
|
|
|
#include "Desktop.h"
|
2003-01-24 17:36:15 +03:00
|
|
|
#include "DisplayDriver.h"
|
|
|
|
#include "FontServer.h"
|
|
|
|
#include "ServerApp.h"
|
2003-02-07 15:53:57 +03:00
|
|
|
#include "ServerWindow.h"
|
2003-01-24 17:36:15 +03:00
|
|
|
#include "ServerCursor.h"
|
|
|
|
#include "ServerBitmap.h"
|
2003-03-21 18:49:28 +03:00
|
|
|
#include "ServerPicture.h"
|
2003-01-24 17:36:15 +03:00
|
|
|
#include "ServerConfig.h"
|
2003-10-19 04:03:06 +04:00
|
|
|
#include "WinBorder.h"
|
2003-01-24 17:36:15 +03:00
|
|
|
#include "LayerData.h"
|
2003-03-19 04:12:53 +03:00
|
|
|
#include "Utils.h"
|
|
|
|
|
2004-01-21 05:58:39 +03:00
|
|
|
//#define DEBUG_SERVERAPP
|
2003-09-17 23:28:31 +04:00
|
|
|
|
2003-09-09 01:48:35 +04:00
|
|
|
#ifdef DEBUG_SERVERAPP
|
|
|
|
# include <stdio.h>
|
|
|
|
# define STRACE(x) printf x
|
|
|
|
#else
|
|
|
|
# define STRACE(x) ;
|
|
|
|
#endif
|
2003-01-24 17:36:15 +03:00
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Constructor
|
2003-07-10 21:48:04 +04:00
|
|
|
\param sendport port ID for the BApplication which will receive the ServerApp's messages
|
|
|
|
\param rcvport port by which the ServerApp will receive messages from its BApplication.
|
2004-01-20 01:18:37 +03:00
|
|
|
\param fSignature NULL-terminated string which contains the BApplication's
|
|
|
|
MIME fSignature.
|
2003-01-24 17:36:15 +03:00
|
|
|
*/
|
2004-01-13 03:56:36 +03:00
|
|
|
ServerApp::ServerApp(port_id sendport, port_id rcvport, port_id clientLooperPort,
|
|
|
|
team_id clientTeamID, int32 handlerID, char *signature)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
// it will be of *very* musch use in correct window order
|
2004-01-13 03:56:36 +03:00
|
|
|
fClientTeamID = clientTeamID;
|
2004-01-20 01:18:37 +03:00
|
|
|
|
|
|
|
// what to send a message to the client? Write a BMessage to this port.
|
2004-01-13 03:56:36 +03:00
|
|
|
fClientLooperPort = clientLooperPort;
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
// need to copy the fSignature because the message buffer
|
2003-01-24 17:36:15 +03:00
|
|
|
// owns the copy which we are passed as a parameter.
|
2004-01-20 01:18:37 +03:00
|
|
|
fSignature=(signature)?signature:"application/x-vnd.NULL-application-signature";
|
2003-03-19 04:12:53 +03:00
|
|
|
|
|
|
|
// token ID of the BApplication's BHandler object. Used for BMessage target specification
|
2004-01-20 01:18:37 +03:00
|
|
|
fHandlerToken=handlerID;
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
// fClientAppPort is the our BApplication's event port
|
|
|
|
fClientAppPort=sendport;
|
|
|
|
fAppLink=new PortLink(fClientAppPort);
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
// fMessagePort is the port we receive messages from our BApplication
|
|
|
|
fMessagePort=rcvport;
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
fSWindowList=new BList(0);
|
|
|
|
fBitmapList=new BList(0);
|
|
|
|
fPictureList=new BList(0);
|
|
|
|
fIsActive=false;
|
2003-01-24 17:36:15 +03:00
|
|
|
|
|
|
|
ServerCursor *defaultc=cursormanager->GetCursor(B_CURSOR_DEFAULT);
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
fAppCursor=(defaultc)?new ServerCursor(defaultc):NULL;
|
|
|
|
fLockSem=create_sem(1,"ServerApp sem");
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-17 21:37:57 +03:00
|
|
|
// Does this even belong here any more? --DW
|
|
|
|
// _driver=desktop->GetDisplayDriver();
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
fCursorHidden=false;
|
2003-03-19 04:12:53 +03:00
|
|
|
|
2004-01-13 03:56:36 +03:00
|
|
|
Run();
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s:\n",fSignature.String()));
|
|
|
|
STRACE(("\tBApp port: %ld\n",fClientAppPort));
|
|
|
|
STRACE(("\tReceiver port: %ld\n",fMessagePort));
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
//! Does all necessary teardown for application
|
|
|
|
ServerApp::~ServerApp(void)
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("*ServerApp %s:~ServerApp()\n",fSignature.String()));
|
2003-01-24 17:36:15 +03:00
|
|
|
int32 i;
|
2004-01-20 01:18:37 +03:00
|
|
|
|
2004-06-19 17:04:50 +04:00
|
|
|
// WindowBroadcast(AS_QUIT_APP);
|
2004-01-20 01:18:37 +03:00
|
|
|
|
2004-06-19 17:04:50 +04:00
|
|
|
// TODO: wait for our ServerWindow threads.
|
|
|
|
/*
|
2004-01-20 01:18:37 +03:00
|
|
|
bool ready=true;
|
2004-01-13 03:56:36 +03:00
|
|
|
desktop->fLayerLock.Lock();
|
|
|
|
do{
|
|
|
|
ready = true;
|
|
|
|
|
|
|
|
int32 count = desktop->fWinBorderList.CountItems();
|
2004-01-20 01:18:37 +03:00
|
|
|
for( int32 i = 0; i < count; i++)
|
|
|
|
{
|
|
|
|
ServerWindow *sw = ((WinBorder*)desktop->fWinBorderList.ItemAt(i))->Window();
|
|
|
|
if (ClientTeamID() == sw->ClientTeamID())
|
|
|
|
{
|
2004-01-13 03:56:36 +03:00
|
|
|
thread_id tid = sw->ThreadID();
|
|
|
|
status_t temp;
|
|
|
|
|
|
|
|
desktop->fLayerLock.Unlock();
|
2004-01-20 01:18:37 +03:00
|
|
|
|
|
|
|
printf("waiting for thread %s\n", sw->Title());
|
2004-01-13 03:56:36 +03:00
|
|
|
wait_for_thread(tid, &temp);
|
|
|
|
|
|
|
|
desktop->fLayerLock.Lock();
|
|
|
|
|
|
|
|
ready = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
} while(!ready);
|
2004-01-13 03:56:36 +03:00
|
|
|
desktop->fLayerLock.Unlock();
|
2004-06-19 17:04:50 +04:00
|
|
|
*/
|
2004-01-13 03:56:36 +03:00
|
|
|
/*
|
2003-02-07 15:53:57 +03:00
|
|
|
ServerWindow *tempwin;
|
2004-01-20 01:18:37 +03:00
|
|
|
for(i=0;i<fSWindowList->CountItems();i++)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
tempwin=(ServerWindow*)fSWindowList->ItemAt(i);
|
2003-01-24 17:36:15 +03:00
|
|
|
if(tempwin)
|
|
|
|
delete tempwin;
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
fSWindowList->MakeEmpty();
|
|
|
|
delete fSWindowList;
|
2004-01-13 03:56:36 +03:00
|
|
|
*/
|
2004-01-20 01:18:37 +03:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
ServerBitmap *tempbmp;
|
2004-01-20 01:18:37 +03:00
|
|
|
for(i=0;i<fBitmapList->CountItems();i++)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
tempbmp=(ServerBitmap*)fBitmapList->ItemAt(i);
|
2003-01-24 17:36:15 +03:00
|
|
|
if(tempbmp)
|
|
|
|
delete tempbmp;
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
fBitmapList->MakeEmpty();
|
|
|
|
delete fBitmapList;
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2003-03-21 18:49:28 +03:00
|
|
|
ServerPicture *temppic;
|
2004-01-20 01:18:37 +03:00
|
|
|
for(i=0;i<fPictureList->CountItems();i++)
|
2003-03-21 18:49:28 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
temppic=(ServerPicture*)fPictureList->ItemAt(i);
|
2003-03-21 18:49:28 +03:00
|
|
|
if(temppic)
|
|
|
|
delete temppic;
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
fPictureList->MakeEmpty();
|
|
|
|
delete fPictureList;
|
2003-03-21 18:49:28 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
delete fAppLink;
|
|
|
|
fAppLink=NULL;
|
|
|
|
if(fAppCursor)
|
|
|
|
delete fAppCursor;
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
cursormanager->RemoveAppCursors(fSignature.String());
|
|
|
|
delete_sem(fLockSem);
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("#ServerApp %s:~ServerApp()\n",fSignature.String()));
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
// Kill the monitor thread if it exists
|
|
|
|
thread_info info;
|
2004-01-20 01:18:37 +03:00
|
|
|
if(get_thread_info(fMonitorThreadID,&info)==B_OK)
|
|
|
|
kill_thread(fMonitorThreadID);
|
2003-01-24 17:36:15 +03:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Starts the ServerApp monitoring for messages
|
|
|
|
\return false if the application couldn't start, true if everything went OK.
|
|
|
|
*/
|
|
|
|
bool ServerApp::Run(void)
|
|
|
|
{
|
|
|
|
// Unlike a BApplication, a ServerApp is *supposed* to return immediately
|
|
|
|
// when its Run() function is called.
|
2004-01-20 01:18:37 +03:00
|
|
|
fMonitorThreadID=spawn_thread(MonitorApp,fSignature.String(),B_NORMAL_PRIORITY,this);
|
|
|
|
if(fMonitorThreadID==B_NO_MORE_THREADS || fMonitorThreadID==B_NO_MEMORY)
|
2003-01-24 17:36:15 +03:00
|
|
|
return false;
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
resume_thread(fMonitorThreadID);
|
2003-01-24 17:36:15 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Pings the target app to make sure it's still working
|
|
|
|
\return true if target is still "alive" and false if "He's dead, Jim."
|
|
|
|
"But that's impossible..."
|
|
|
|
|
|
|
|
This function is called by the app_server thread to ensure that
|
|
|
|
the target app still exists. We do this not by sending a message
|
|
|
|
but by calling get_port_info. We don't want to send ping messages
|
|
|
|
just because the app might simply be hung. If this is the case, it
|
|
|
|
should be up to the user to kill it. If the app has been killed, its
|
|
|
|
ports will be invalid. Thus, if get_port_info returns an error, we
|
|
|
|
tell the app_server to delete the respective ServerApp.
|
|
|
|
*/
|
|
|
|
bool ServerApp::PingTarget(void)
|
|
|
|
{
|
|
|
|
team_info tinfo;
|
2004-01-20 01:18:37 +03:00
|
|
|
if(get_team_info(fClientTeamID,&tinfo)==B_BAD_TEAM_ID)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
|
|
|
port_id serverport=find_port(SERVER_PORT_NAME);
|
|
|
|
if(serverport==B_NAME_NOT_FOUND)
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
printf("PANIC: ServerApp %s could not find the app_server port in PingTarget()!\n",fSignature.String());
|
2003-01-24 17:36:15 +03:00
|
|
|
return false;
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
fAppLink->SetPort(serverport);
|
|
|
|
fAppLink->SetOpCode(AS_DELETE_APP);
|
|
|
|
fAppLink->Attach(&fMonitorThreadID,sizeof(thread_id));
|
|
|
|
fAppLink->Flush();
|
2003-01-24 17:36:15 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2003-01-27 22:43:15 +03:00
|
|
|
/*!
|
|
|
|
\brief Send a message to the ServerApp with no attachments
|
|
|
|
\param code ID code of the message to post
|
|
|
|
*/
|
2003-02-04 03:20:15 +03:00
|
|
|
void ServerApp::PostMessage(int32 code, size_t size, int8 *buffer)
|
2003-01-27 22:43:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
write_port(fMessagePort,code, buffer, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Send a simple message to all of the ServerApp's ServerWindows
|
|
|
|
\param msg The message code to broadcast
|
|
|
|
*/
|
2004-06-19 17:04:50 +04:00
|
|
|
/*
|
2004-01-20 01:18:37 +03:00
|
|
|
void ServerApp::WindowBroadcast(int32 code)
|
|
|
|
{
|
|
|
|
desktop->fLayerLock.Lock();
|
|
|
|
int32 count=desktop->fWinBorderList.CountItems();
|
|
|
|
for(int32 i=0; i<count; i++)
|
|
|
|
{
|
|
|
|
ServerWindow *sw = ((WinBorder*)desktop->fWinBorderList.ItemAt(i))->Window();
|
2004-06-11 18:58:24 +04:00
|
|
|
BMessage msg(code);
|
2004-06-19 17:04:50 +04:00
|
|
|
sw->Lock();
|
2004-02-24 14:58:25 +03:00
|
|
|
sw->SendMessageToClient(&msg);
|
2004-06-19 17:04:50 +04:00
|
|
|
sw->Unlock();
|
2004-01-20 01:18:37 +03:00
|
|
|
}
|
|
|
|
desktop->fLayerLock.Unlock();
|
2003-01-27 22:43:15 +03:00
|
|
|
}
|
2004-06-19 17:04:50 +04:00
|
|
|
*/
|
2004-01-20 01:18:37 +03:00
|
|
|
/*!
|
|
|
|
\brief Send a message to the ServerApp's BApplication
|
|
|
|
\param msg The message to send
|
|
|
|
*/
|
|
|
|
void ServerApp::SendMessageToClient(const BMessage *msg) const
|
|
|
|
{
|
|
|
|
ssize_t size;
|
|
|
|
char *buffer;
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
size=msg->FlattenedSize();
|
|
|
|
buffer=new char[size];
|
|
|
|
|
|
|
|
if (msg->Flatten(buffer, size) == B_OK)
|
2004-01-13 03:56:36 +03:00
|
|
|
write_port(fClientLooperPort, msg->what, buffer, size);
|
|
|
|
else
|
2004-01-20 01:18:37 +03:00
|
|
|
printf("PANIC: ServerApp: '%s': can't flatten message in 'SendMessageToClient()'\n", fSignature.String());
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2004-06-11 18:58:24 +04:00
|
|
|
delete [] buffer;
|
2004-01-13 03:56:36 +03:00
|
|
|
}
|
|
|
|
|
2003-09-17 23:28:31 +04:00
|
|
|
/*!
|
|
|
|
\brief Sets the ServerApp's active status
|
|
|
|
\param value The new status of the ServerApp.
|
|
|
|
|
|
|
|
This changes an internal flag and also sets the current cursor to the one specified by
|
|
|
|
the application
|
|
|
|
*/
|
|
|
|
void ServerApp::Activate(bool value)
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
fIsActive=value;
|
2003-09-17 23:28:31 +04:00
|
|
|
SetAppCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
//! Sets the cursor to the application cursor, if any.
|
|
|
|
void ServerApp::SetAppCursor(void)
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
if(fAppCursor)
|
|
|
|
cursormanager->SetCursor(fAppCursor->ID());
|
2003-09-17 23:28:31 +04:00
|
|
|
else
|
|
|
|
cursormanager->SetCursor(B_CURSOR_DEFAULT);
|
|
|
|
}
|
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
/*!
|
|
|
|
\brief The thread function ServerApps use to monitor messages
|
|
|
|
\param data Pointer to the thread's ServerApp object
|
|
|
|
\return Throwaway value - always 0
|
|
|
|
*/
|
2004-01-20 01:18:37 +03:00
|
|
|
int32 ServerApp::MonitorApp(void *data)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
|
|
|
// Message-dispatching loop for the ServerApp
|
2003-10-04 23:10:11 +04:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
ServerApp *app = (ServerApp *)data;
|
|
|
|
PortQueue msgqueue(app->fMessagePort);
|
|
|
|
PortMessage *msg;
|
|
|
|
bool quitting = false;
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
for( ; !quitting; )
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2003-10-04 23:10:11 +04:00
|
|
|
if(!msgqueue.MessagesWaiting())
|
|
|
|
msgqueue.GetMessagesFromPort(true);
|
|
|
|
else
|
|
|
|
msgqueue.GetMessagesFromPort(false);
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
msg = msgqueue.GetMessageFromQueue();
|
2003-10-04 23:10:11 +04:00
|
|
|
if(!msg)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
switch(msg->Code())
|
|
|
|
{
|
|
|
|
case AS_QUIT_APP:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
// This message is received only when the app_server is asked to shut down in
|
|
|
|
// test/debug mode. Of course, if we are testing while using AccelerantDriver, we do
|
|
|
|
// NOT want to shut down client applications. The server can be quit o in this fashion
|
|
|
|
// through the driver's interface, such as closing the ViewDriver's window.
|
|
|
|
|
|
|
|
STRACE(("ServerApp %s:Server shutdown notification received\n",app->fSignature.String()));
|
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
// If we are using the real, accelerated version of the
|
|
|
|
// DisplayDriver, we do NOT want the user to be able shut down
|
|
|
|
// the server. The results would NOT be pretty
|
|
|
|
if(DISPLAYDRIVER!=HWDRIVER)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
BMessage pleaseQuit(B_QUIT_REQUESTED);
|
2004-01-13 03:56:36 +03:00
|
|
|
app->SendMessageToClient(&pleaseQuit);
|
2004-06-19 17:04:50 +04:00
|
|
|
// TODO: I do not understand why we nee this? delete.
|
|
|
|
// When BApplications receives B_QUIT_REQUESTED, it asks its BWindow(s) if it can
|
|
|
|
// safely quit. If all respond with 'true' then, each one that 'agrees' will send
|
|
|
|
// a AS_DELETE_WINDOW message to the server couterpart thread (ServerWindow). Curently,
|
|
|
|
// it always quits on this message.
|
|
|
|
// DW, I left this text here for you to see it. After you read, please remove it. Thanks.
|
|
|
|
// app->WindowBroadcast(AS_QUIT_APP);
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
2003-10-04 23:10:11 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
// TODO: Fix
|
|
|
|
// Using this case is a hack. The ServerApp is receiving a message with a '0' code after
|
|
|
|
// it sends the quit message on server shutdown and I can't find what's sending it. This
|
|
|
|
// must be found and fixed!
|
|
|
|
case 0:
|
2003-10-04 23:10:11 +04:00
|
|
|
case B_QUIT_REQUESTED:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: B_QUIT_REQUESTED\n",app->fSignature.String()));
|
2003-10-04 23:10:11 +04:00
|
|
|
// Our BApplication sent us this message when it quit.
|
|
|
|
// We need to ask the app_server to delete our monitor
|
2004-01-13 03:56:36 +03:00
|
|
|
// ADI: No! This is a bad solution. A thead should continue its
|
|
|
|
// execution until its exit point, and this can *very* easily be done
|
2004-01-20 01:18:37 +03:00
|
|
|
quitting=true;
|
2004-01-13 03:56:36 +03:00
|
|
|
// see... no need to ask the main thread to kill us.
|
|
|
|
// still... it will delete this ServerApp object.
|
|
|
|
port_id serverport = find_port(SERVER_PORT_NAME);
|
|
|
|
if(serverport == B_NAME_NOT_FOUND){
|
2004-01-20 01:18:37 +03:00
|
|
|
printf("PANIC: ServerApp %s could not find the app_server port!\n",app->fSignature.String());
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
app->fAppLink->SetPort(serverport);
|
|
|
|
app->fAppLink->SetOpCode(AS_DELETE_APP);
|
|
|
|
app->fAppLink->Attach(&app->fMonitorThreadID, sizeof(thread_id));
|
|
|
|
app->fAppLink->Flush();
|
2003-10-04 23:10:11 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Got a Message to dispatch\n",app->fSignature.String()));
|
2003-10-04 23:10:11 +04:00
|
|
|
app->_DispatchMessage(msg);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delete msg;
|
|
|
|
} // end for
|
2004-01-20 01:18:37 +03:00
|
|
|
|
|
|
|
// clean exit.
|
2003-01-24 17:36:15 +03:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Handler function for BApplication API messages
|
|
|
|
\param code Identifier code for the message. Equivalent to BMessage::what
|
|
|
|
\param buffer Any attachments
|
|
|
|
|
|
|
|
Note that the buffer's exact format is determined by the particular message.
|
|
|
|
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.
|
|
|
|
*/
|
2003-10-04 23:10:11 +04:00
|
|
|
void ServerApp::_DispatchMessage(PortMessage *msg)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
|
|
|
LayerData ld;
|
2003-10-04 23:10:11 +04:00
|
|
|
switch(msg->Code())
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_UPDATED_CLIENT_FONTLIST:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Acknowledged update of client-side font list\n",fSignature.String()));
|
2004-01-17 21:37:57 +03:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
// received when the client-side global font list has been
|
|
|
|
// refreshed
|
|
|
|
fontserver->Lock();
|
|
|
|
fontserver->FontsUpdated();
|
|
|
|
fontserver->Unlock();
|
|
|
|
break;
|
|
|
|
}
|
2003-10-19 04:03:06 +04:00
|
|
|
case AS_UPDATE_COLORS:
|
|
|
|
{
|
2004-06-11 18:58:24 +04:00
|
|
|
// Eventually we will have windows which will notify their children of changes in
|
|
|
|
// system colors
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
/* STRACE(("ServerApp %s: Received global UI color update notification\n",fSignature.String()));
|
2004-01-13 03:56:36 +03:00
|
|
|
ServerWindow *win;
|
2003-10-19 04:03:06 +04:00
|
|
|
BMessage msg(_COLORS_UPDATED);
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
for(int32 i=0; i<fSWindowList->CountItems(); i++)
|
2003-10-19 04:03:06 +04:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
win=(ServerWindow*)fSWindowList->ItemAt(i);
|
2003-10-19 04:03:06 +04:00
|
|
|
win->Lock();
|
2004-01-20 01:18:37 +03:00
|
|
|
win->fWinBorder->UpdateColors();
|
2003-10-19 04:03:06 +04:00
|
|
|
win->SendMessageToClient(&msg);
|
|
|
|
win->Unlock();
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
*/ break;
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
|
|
|
case AS_UPDATE_FONTS:
|
|
|
|
{
|
2004-06-11 18:58:24 +04:00
|
|
|
// Eventually we will have windows which will notify their children of changes in
|
|
|
|
// system fonts
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
/* STRACE(("ServerApp %s: Received global font update notification\n",fSignature.String()));
|
2004-01-13 03:56:36 +03:00
|
|
|
ServerWindow *win;
|
2003-10-19 04:03:06 +04:00
|
|
|
BMessage msg(_FONTS_UPDATED);
|
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
for(int32 i=0; i<fSWindowList->CountItems(); i++)
|
2003-10-19 04:03:06 +04:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
win=(ServerWindow*)fSWindowList->ItemAt(i);
|
2003-10-19 04:03:06 +04:00
|
|
|
win->Lock();
|
2004-01-20 01:18:37 +03:00
|
|
|
win->fWinBorder->UpdateFont();
|
2003-10-19 04:03:06 +04:00
|
|
|
win->SendMessageToClient(&msg);
|
|
|
|
win->Unlock();
|
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
*/ break;
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
|
|
|
case AS_UPDATE_DECORATOR:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Received decorator update notification\n",fSignature.String()));
|
2004-01-17 21:37:57 +03:00
|
|
|
|
2004-01-13 03:56:36 +03:00
|
|
|
ServerWindow *win;
|
2003-10-19 04:03:06 +04:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
for(int32 i=0; i<fSWindowList->CountItems(); i++)
|
2003-10-19 04:03:06 +04:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
win=(ServerWindow*)fSWindowList->ItemAt(i);
|
2003-10-19 04:03:06 +04:00
|
|
|
win->Lock();
|
2004-01-20 01:18:37 +03:00
|
|
|
win->fWinBorder->UpdateDecorator();
|
2003-10-19 04:03:06 +04:00
|
|
|
win->Unlock();
|
|
|
|
}
|
2004-01-13 03:56:36 +03:00
|
|
|
break;
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_CREATE_WINDOW:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
|
|
|
// Create the ServerWindow to node monitor a new OBWindow
|
|
|
|
|
|
|
|
// Attached data:
|
|
|
|
// 2) BRect window frame
|
2003-07-24 23:38:24 +04:00
|
|
|
// 3) uint32 window look
|
|
|
|
// 4) uint32 window feel
|
|
|
|
// 5) uint32 window flags
|
2003-08-31 21:38:34 +04:00
|
|
|
// 6) uint32 workspace index
|
|
|
|
// 7) int32 BHandler token of the window
|
|
|
|
// 8) port_id window's message port
|
2003-07-24 23:38:24 +04:00
|
|
|
// 9) const char * title
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-06-11 18:58:24 +04:00
|
|
|
BRect frame;
|
|
|
|
uint32 look;
|
|
|
|
uint32 feel;
|
|
|
|
uint32 flags;
|
|
|
|
uint32 wkspaces;
|
|
|
|
int32 token;
|
|
|
|
port_id sendPort;
|
|
|
|
port_id looperPort;
|
|
|
|
port_id replyport;
|
|
|
|
char *title;
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2003-12-07 08:40:51 +03:00
|
|
|
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);
|
2004-02-24 14:58:25 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Got 'New Window' message, trying to do smething...\n",fSignature.String()));
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
// ServerWindow constructor will reply with port_id of a newly created port
|
2004-06-11 18:58:24 +04:00
|
|
|
ServerWindow *sw = NULL;
|
|
|
|
sw = new ServerWindow(frame, title, look, feel, flags, this,
|
2004-03-28 19:00:48 +04:00
|
|
|
sendPort, looperPort, replyport, wkspaces, token);
|
|
|
|
sw->Init();
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-13 03:56:36 +03:00
|
|
|
STRACE(("\nServerApp %s: New Window %s (%.1f,%.1f,%.1f,%.1f)\n",
|
2004-01-20 01:18:37 +03:00
|
|
|
fSignature.String(),title,frame.left,frame.top,frame.right,frame.bottom));
|
2003-08-31 21:38:34 +04:00
|
|
|
|
2004-06-11 18:58:24 +04:00
|
|
|
delete [] title;
|
2003-03-23 23:52:37 +03:00
|
|
|
|
2003-02-07 15:53:57 +03:00
|
|
|
break;
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
2003-03-12 17:29:59 +03:00
|
|
|
case AS_CREATE_BITMAP:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Received BBitmap creation request\n",fSignature.String()));
|
2003-03-12 17:29:59 +03:00
|
|
|
// Allocate a bitmap for an application
|
|
|
|
|
|
|
|
// Attached Data:
|
2003-10-04 04:56:43 +04:00
|
|
|
// 1) BRect bounds
|
|
|
|
// 2) color_space space
|
|
|
|
// 3) int32 bitmap_flags
|
|
|
|
// 4) int32 bytes_per_row
|
|
|
|
// 5) int32 screen_id::id
|
|
|
|
// 6) port_id reply port
|
2003-03-12 17:29:59 +03:00
|
|
|
|
|
|
|
// Reply Code: SERVER_TRUE
|
|
|
|
// Reply Data:
|
|
|
|
// 1) int32 server token
|
|
|
|
// 2) area_id id of the area in which the bitmap data resides
|
|
|
|
// 3) int32 area pointer offset used to calculate fBasePtr
|
|
|
|
|
|
|
|
// First, let's attempt to allocate the bitmap
|
2003-10-03 04:41:40 +04:00
|
|
|
port_id replyport;
|
|
|
|
BRect r;
|
|
|
|
color_space cs;
|
|
|
|
int32 f,bpr;
|
2003-03-12 17:29:59 +03:00
|
|
|
screen_id s;
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
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);
|
2003-03-12 17:29:59 +03:00
|
|
|
|
|
|
|
ServerBitmap *sbmp=bitmapmanager->CreateBitmap(r,cs,f,bpr,s);
|
2003-09-09 01:48:35 +04:00
|
|
|
|
|
|
|
STRACE(("ServerApp %s: Create Bitmap (%.1f,%.1f,%.1f,%.1f)\n",
|
2004-01-20 01:18:37 +03:00
|
|
|
fSignature.String(),r.left,r.top,r.right,r.bottom));
|
2003-09-09 01:48:35 +04:00
|
|
|
|
2003-03-12 17:29:59 +03:00
|
|
|
if(sbmp)
|
|
|
|
{
|
2004-04-16 21:52:31 +04:00
|
|
|
fBitmapList->AddItem(sbmp);
|
2003-10-04 23:10:11 +04:00
|
|
|
PortLink replylink(replyport);
|
2003-10-05 01:53:09 +04:00
|
|
|
replylink.SetOpCode(SERVER_TRUE);
|
2003-10-04 23:10:11 +04:00
|
|
|
replylink.Attach<int32>(sbmp->Token());
|
|
|
|
replylink.Attach<int32>(sbmp->Area());
|
|
|
|
replylink.Attach<int32>(sbmp->AreaOffset());
|
|
|
|
replylink.Flush();
|
2003-03-12 17:29:59 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// alternatively, if something went wrong, we reply with SERVER_FALSE
|
2003-10-04 23:10:11 +04:00
|
|
|
int32 code=SERVER_FALSE;
|
|
|
|
write_port(replyport,SERVER_FALSE,&code,sizeof(int32));
|
2003-03-12 17:29:59 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_DELETE_BITMAP:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: received BBitmap delete request\n",fSignature.String()));
|
2003-03-12 17:29:59 +03:00
|
|
|
// Delete a bitmap's allocated memory
|
|
|
|
|
|
|
|
// Attached Data:
|
2003-10-04 04:56:43 +04:00
|
|
|
// 1) int32 token
|
|
|
|
// 2) int32 reply port
|
2003-03-12 17:29:59 +03:00
|
|
|
|
|
|
|
// Reply Code: SERVER_TRUE if successful,
|
|
|
|
// SERVER_FALSE if the buffer was already deleted or was not found
|
2003-10-03 04:41:40 +04:00
|
|
|
port_id replyport;
|
|
|
|
int32 bmp_id;
|
2003-03-12 17:29:59 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&bmp_id);
|
|
|
|
msg->Read<int32>(&replyport);
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2004-04-16 21:52:31 +04:00
|
|
|
ServerBitmap *sbmp=FindBitmap(bmp_id);
|
2003-03-12 17:29:59 +03:00
|
|
|
if(sbmp)
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Deleting Bitmap %ld\n",fSignature.String(),bmp_id));
|
2003-09-09 01:48:35 +04:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
fBitmapList->RemoveItem(sbmp);
|
2003-03-12 17:29:59 +03:00
|
|
|
bitmapmanager->DeleteBitmap(sbmp);
|
|
|
|
write_port(replyport,SERVER_TRUE,NULL,0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
write_port(replyport,SERVER_FALSE,NULL,0);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2003-03-21 18:49:28 +03:00
|
|
|
case AS_CREATE_PICTURE:
|
|
|
|
{
|
2003-03-23 23:52:37 +03:00
|
|
|
// TODO: Implement
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Create Picture unimplemented\n",fSignature.String()));
|
2003-09-09 01:48:35 +04:00
|
|
|
|
2003-03-21 18:49:28 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_DELETE_PICTURE:
|
|
|
|
{
|
2003-03-23 23:52:37 +03:00
|
|
|
// TODO: Implement
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Delete Picture unimplemented\n",fSignature.String()));
|
2003-09-09 01:48:35 +04:00
|
|
|
|
2003-03-21 18:49:28 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_CLONE_PICTURE:
|
|
|
|
{
|
2003-03-23 23:52:37 +03:00
|
|
|
// TODO: Implement
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Clone Picture unimplemented\n",fSignature.String()));
|
2003-09-09 01:48:35 +04:00
|
|
|
|
2003-03-21 18:49:28 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_DOWNLOAD_PICTURE:
|
|
|
|
{
|
2003-03-23 23:52:37 +03:00
|
|
|
// TODO; Implement
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Download Picture unimplemented\n",fSignature.String()));
|
2003-09-09 01:48:35 +04:00
|
|
|
|
2003-03-21 18:49:28 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_SET_SCREEN_MODE:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Set Screen Mode\n",fSignature.String()));
|
2004-01-17 21:37:57 +03:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
// Attached data
|
|
|
|
// 1) int32 workspace #
|
|
|
|
// 2) uint32 screen mode
|
|
|
|
// 3) bool make default
|
2003-10-03 04:41:40 +04:00
|
|
|
int32 workspace;
|
|
|
|
uint32 mode;
|
|
|
|
bool stick;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&workspace);
|
|
|
|
msg->Read<uint32>(&mode);
|
|
|
|
msg->Read<bool>(&stick);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
//TODO: Resolve
|
|
|
|
//SetSpace(workspace,mode,ActiveScreen(),stick);
|
2003-01-24 18:19:27 +03:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_ACTIVATE_WORKSPACE:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Activate Workspace\n",fSignature.String()));
|
2003-01-24 17:36:15 +03:00
|
|
|
// Attached data
|
|
|
|
// 1) int32 workspace index
|
|
|
|
|
|
|
|
// Error-checking is done in ActivateWorkspace, so this is a safe call
|
2003-10-03 04:41:40 +04:00
|
|
|
int32 workspace;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&workspace);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
//TODO: Resolve
|
|
|
|
//SetWorkspace(workspace);
|
2003-01-24 18:19:27 +03:00
|
|
|
break;
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Theoretically, we could just call the driver directly, but we will
|
|
|
|
// call the CursorManager's version to allow for future expansion
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_SHOW_CURSOR:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Show Cursor\n",fSignature.String()));
|
2003-01-24 17:36:15 +03:00
|
|
|
cursormanager->ShowCursor();
|
2004-01-20 01:18:37 +03:00
|
|
|
fCursorHidden=false;
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_HIDE_CURSOR:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Hide Cursor\n",fSignature.String()));
|
2003-01-24 17:36:15 +03:00
|
|
|
cursormanager->HideCursor();
|
2004-01-20 01:18:37 +03:00
|
|
|
fCursorHidden=true;
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_OBSCURE_CURSOR:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Obscure Cursor\n",fSignature.String()));
|
2003-01-24 17:36:15 +03:00
|
|
|
cursormanager->ObscureCursor();
|
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_QUERY_CURSOR_HIDDEN:
|
2003-02-24 00:40:44 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Received IsCursorHidden request\n",fSignature.String()));
|
2003-02-24 00:40:44 +03:00
|
|
|
// Attached data
|
|
|
|
// 1) int32 port to reply to
|
2003-10-03 04:41:40 +04:00
|
|
|
int32 replyport;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&replyport);
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
write_port(replyport,(fCursorHidden)?SERVER_TRUE:SERVER_FALSE,NULL,0);
|
2003-02-24 00:40:44 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_SET_CURSOR_DATA:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: SetCursor via cursor data\n",fSignature.String()));
|
|
|
|
// Attached data: 68 bytes of fAppCursor data
|
2003-01-24 17:36:15 +03:00
|
|
|
|
|
|
|
int8 cdata[68];
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read(cdata,68);
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
// Because we don't want an overaccumulation of these particular
|
|
|
|
// cursors, we will delete them if there is an existing one. It would
|
|
|
|
// otherwise be easy to crash the server by calling SetCursor a
|
|
|
|
// sufficient number of times
|
2004-01-20 01:18:37 +03:00
|
|
|
if(fAppCursor)
|
|
|
|
cursormanager->DeleteCursor(fAppCursor->ID());
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
fAppCursor=new ServerCursor(cdata);
|
|
|
|
fAppCursor->SetAppSignature(fSignature.String());
|
|
|
|
cursormanager->AddCursor(fAppCursor);
|
|
|
|
cursormanager->SetCursor(fAppCursor->ID());
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_SET_CURSOR_BCURSOR:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: SetCursor via BCursor\n",fSignature.String()));
|
2003-09-17 23:28:31 +04:00
|
|
|
// Attached data:
|
2003-10-03 04:41:40 +04:00
|
|
|
// 1) bool flag to send a reply
|
|
|
|
// 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;
|
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<bool>(&sync);
|
|
|
|
msg->Read<int32>(&ctoken);
|
2003-10-03 04:41:40 +04:00
|
|
|
if(sync)
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&replyport);
|
2003-10-03 04:41:40 +04:00
|
|
|
|
|
|
|
cursormanager->SetCursor(ctoken);
|
|
|
|
|
|
|
|
if(sync)
|
|
|
|
{
|
|
|
|
// the application is expecting a reply, but plans to do literally nothing
|
|
|
|
// with the data, so we'll just reuse the cursor token variable
|
2003-10-04 23:10:11 +04:00
|
|
|
ctoken=AS_SET_CURSOR_BCURSOR;
|
|
|
|
write_port(replyport,ctoken, &ctoken, sizeof(int32));
|
2003-10-03 04:41:40 +04:00
|
|
|
}
|
2003-09-17 23:28:31 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_CREATE_BCURSOR:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Create BCursor\n",fSignature.String()));
|
2003-02-24 18:47:06 +03:00
|
|
|
// Attached data:
|
2004-01-20 01:18:37 +03:00
|
|
|
// 1) 68 bytes of fAppCursor data
|
2003-10-04 04:56:43 +04:00
|
|
|
// 2) port_id reply port
|
2003-02-24 18:47:06 +03:00
|
|
|
|
2003-10-03 04:41:40 +04:00
|
|
|
port_id replyport;
|
2003-02-24 18:47:06 +03:00
|
|
|
int8 cdata[68];
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read(cdata,68);
|
|
|
|
msg->Read<int32>(&replyport);
|
2003-02-24 18:47:06 +03:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
fAppCursor=new ServerCursor(cdata);
|
|
|
|
fAppCursor->SetAppSignature(fSignature.String());
|
|
|
|
cursormanager->AddCursor(fAppCursor);
|
2003-02-24 18:47:06 +03:00
|
|
|
|
|
|
|
// Synchronous message - BApplication is waiting on the cursor's ID
|
2003-11-14 04:41:04 +03:00
|
|
|
PortLink link(replyport);
|
2004-01-20 01:18:37 +03:00
|
|
|
link.Attach<int32>(fAppCursor->ID());
|
2003-11-14 04:41:04 +03:00
|
|
|
link.Flush();
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-09-17 23:28:31 +04:00
|
|
|
case AS_DELETE_BCURSOR:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Delete BCursor\n",fSignature.String()));
|
2003-09-17 23:28:31 +04:00
|
|
|
// Attached data:
|
|
|
|
// 1) int32 token ID of the cursor to delete
|
2003-10-03 04:41:40 +04:00
|
|
|
int32 ctoken;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&ctoken);
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
if(fAppCursor && fAppCursor->ID()==ctoken)
|
|
|
|
fAppCursor=NULL;
|
2003-09-17 23:28:31 +04:00
|
|
|
|
2003-10-03 04:41:40 +04:00
|
|
|
cursormanager->DeleteCursor(ctoken);
|
2003-09-17 23:28:31 +04:00
|
|
|
break;
|
|
|
|
}
|
2003-07-10 21:48:04 +04:00
|
|
|
case AS_GET_SCROLLBAR_INFO:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Get ScrollBar info\n",fSignature.String()));
|
2003-07-10 21:48:04 +04:00
|
|
|
// Attached data:
|
|
|
|
// 1) port_id reply port - synchronous message
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
scroll_bar_info sbi=desktop->ScrollBarInfo();
|
2003-10-03 04:41:40 +04:00
|
|
|
|
|
|
|
port_id replyport;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&replyport);
|
2003-07-10 21:48:04 +04:00
|
|
|
|
2003-11-14 04:41:04 +03:00
|
|
|
PortLink link(replyport);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
link.Attach<scroll_bar_info>(sbi);
|
2003-11-14 04:41:04 +03:00
|
|
|
link.Flush();
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_SCROLLBAR_INFO:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Set ScrollBar info\n",fSignature.String()));
|
2003-07-10 21:48:04 +04:00
|
|
|
// Attached Data:
|
|
|
|
// 1) scroll_bar_info scroll bar info structure
|
2003-10-03 04:41:40 +04:00
|
|
|
scroll_bar_info sbi;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<scroll_bar_info>(&sbi);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
desktop->SetScrollBarInfo(sbi);
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_FOCUS_FOLLOWS_MOUSE:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: query Focus Follow Mouse in use\n",fSignature.String()));
|
2003-07-10 21:48:04 +04:00
|
|
|
// Attached data:
|
|
|
|
// 1) port_id reply port - synchronous message
|
|
|
|
|
2003-10-03 04:41:40 +04:00
|
|
|
port_id replyport;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&replyport);
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2003-11-14 04:41:04 +03:00
|
|
|
PortLink link(replyport);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
link.Attach<bool>(desktop->FFMouseInUse());
|
2003-11-14 04:41:04 +03:00
|
|
|
link.Flush();
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_FOCUS_FOLLOWS_MOUSE:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Set Focus Follows Mouse in use\n",fSignature.String()));
|
2003-07-10 21:48:04 +04:00
|
|
|
// Attached Data:
|
|
|
|
// 1) scroll_bar_info scroll bar info structure
|
2003-10-03 04:41:40 +04:00
|
|
|
scroll_bar_info sbi;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<scroll_bar_info>(&sbi);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
desktop->SetScrollBarInfo(sbi);
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_MOUSE_MODE:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Set Focus Follows Mouse mode\n",fSignature.String()));
|
2003-07-10 21:48:04 +04:00
|
|
|
// Attached Data:
|
|
|
|
// 1) enum mode_mouse FFM mouse mode
|
2003-10-03 04:41:40 +04:00
|
|
|
mode_mouse mmode;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<mode_mouse>(&mmode);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
desktop->SetFFMouseMode(mmode);
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_MOUSE_MODE:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n",fSignature.String()));
|
2003-07-10 21:48:04 +04:00
|
|
|
// Attached data:
|
|
|
|
// 1) port_id reply port - synchronous message
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
mode_mouse mmode=desktop->FFMouseMode();
|
2003-10-03 04:41:40 +04:00
|
|
|
|
|
|
|
port_id replyport;
|
2003-10-04 23:10:11 +04:00
|
|
|
msg->Read<int32>(&replyport);
|
2003-07-10 21:48:04 +04:00
|
|
|
|
2003-11-14 04:41:04 +03:00
|
|
|
PortLink link(replyport);
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
link.Attach<mode_mouse>(mmode);
|
2003-11-14 04:41:04 +03:00
|
|
|
link.Flush();
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
2003-10-09 03:18:30 +04:00
|
|
|
case AS_GET_UI_COLOR:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s: Get UI color\n",fSignature.String()));
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
RGBColor color;
|
|
|
|
int32 whichcolor;
|
|
|
|
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);
|
|
|
|
replylink.Attach<rgb_color>(color.GetColor32());
|
|
|
|
replylink.Flush();
|
2003-10-09 03:18:30 +04:00
|
|
|
break;
|
|
|
|
}
|
2003-01-24 17:36:15 +03:00
|
|
|
default:
|
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
STRACE(("ServerApp %s received unhandled message code offset %s\n",fSignature.String(),
|
|
|
|
MsgCodeToBString(msg->Code()).String()));
|
2003-09-09 01:48:35 +04:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2003-03-12 17:29:59 +03:00
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Looks up a ServerApp's ServerBitmap in its list
|
|
|
|
\param token ID token of the bitmap to find
|
|
|
|
\return The bitmap having that ID or NULL if not found
|
|
|
|
*/
|
2004-04-16 21:52:31 +04:00
|
|
|
ServerBitmap *ServerApp::FindBitmap(int32 token)
|
2003-03-12 17:29:59 +03:00
|
|
|
{
|
|
|
|
ServerBitmap *temp;
|
2004-01-20 01:18:37 +03:00
|
|
|
for(int32 i=0; i<fBitmapList->CountItems();i++)
|
2003-03-12 17:29:59 +03:00
|
|
|
{
|
2004-01-20 01:18:37 +03:00
|
|
|
temp=(ServerBitmap*)fBitmapList->ItemAt(i);
|
2003-03-12 17:29:59 +03:00
|
|
|
if(temp && temp->Token()==token)
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2003-09-17 23:28:31 +04:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
team_id ServerApp::ClientTeamID()
|
|
|
|
{
|
2004-01-13 03:56:36 +03:00
|
|
|
return fClientTeamID;
|
|
|
|
}
|