2005-06-08 08:01:59 +04:00
|
|
|
/*
|
|
|
|
* Copyright 2001-2005, Haiku.
|
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* DarkWyrm <bpmagic@columbus.rr.com>
|
|
|
|
* Adrian Oanca <adioanca@cotty.iren.ro>
|
|
|
|
* Stephan Aßmus <superstippi@gmx.de>
|
|
|
|
* Stefano Ceccherini (burton666@libero.it)
|
|
|
|
* Axel Dörfler, axeld@pinc-software.de
|
|
|
|
*/
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2005-06-24 03:46:17 +04:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
#include <AppDefs.h>
|
2005-06-23 22:48:10 +04:00
|
|
|
#include <Autolock.h>
|
2004-01-17 21:37:57 +03:00
|
|
|
#include <ColorSet.h>
|
2005-06-24 03:46:17 +04:00
|
|
|
#include <List.h>
|
2003-07-10 21:48:04 +04:00
|
|
|
#include <ScrollBar.h>
|
2003-03-12 17:29:59 +03:00
|
|
|
#include <ServerProtocol.h>
|
2005-06-24 03:46:17 +04:00
|
|
|
#include <Shape.h>
|
|
|
|
#include <String.h>
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2004-01-17 21:37:57 +03:00
|
|
|
#include "AppServer.h"
|
2004-10-14 05:23:00 +04:00
|
|
|
#include "BGet++.h"
|
2005-06-24 03:46:17 +04: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"
|
2005-06-24 03:46:17 +04:00
|
|
|
#include "DecorManager.h"
|
2003-01-24 17:36:15 +03:00
|
|
|
#include "DisplayDriver.h"
|
|
|
|
#include "FontServer.h"
|
2005-06-24 03:46:17 +04:00
|
|
|
#include "HWInterface.h"
|
|
|
|
#include "LayerData.h"
|
2004-10-14 05:23:00 +04:00
|
|
|
#include "RAMLinkMsgReader.h"
|
2005-06-24 03:46:17 +04:00
|
|
|
//#include "RGBColor.h"
|
2004-08-23 02:33:57 +04:00
|
|
|
#include "RootLayer.h"
|
2003-01-24 17:36:15 +03:00
|
|
|
#include "ServerBitmap.h"
|
|
|
|
#include "ServerConfig.h"
|
2005-06-24 03:46:17 +04:00
|
|
|
#include "ServerCursor.h"
|
|
|
|
#include "ServerPicture.h"
|
|
|
|
#include "ServerScreen.h"
|
|
|
|
#include "ServerWindow.h"
|
|
|
|
#include "SysCursor.h"
|
2005-06-08 01:32:24 +04:00
|
|
|
#include "SystemPalette.h"
|
2003-03-19 04:12:53 +03:00
|
|
|
#include "Utils.h"
|
2005-06-24 03:46:17 +04:00
|
|
|
#include "WinBorder.h"
|
2003-03-19 04:12:53 +03:00
|
|
|
|
2005-06-24 03:46:17 +04:00
|
|
|
#include "ServerApp.h"
|
2005-06-24 03:21:10 +04:00
|
|
|
#include <syslog.h>
|
2005-06-23 22:48:10 +04:00
|
|
|
|
2004-09-05 04:52:45 +04:00
|
|
|
//#define DEBUG_SERVERAPP
|
2003-09-17 23:28:31 +04:00
|
|
|
|
2003-09-09 01:48:35 +04:00
|
|
|
#ifdef DEBUG_SERVERAPP
|
|
|
|
# define STRACE(x) printf x
|
|
|
|
#else
|
|
|
|
# define STRACE(x) ;
|
|
|
|
#endif
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
//#define DEBUG_SERVERAPP_FONT
|
2005-01-19 18:12:35 +03:00
|
|
|
|
|
|
|
#ifdef DEBUG_SERVERAPP_FONT
|
|
|
|
# define FTRACE(x) printf x
|
|
|
|
#else
|
|
|
|
# define FTRACE(x) ;
|
|
|
|
#endif
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
static const uint32 kMsgAppQuit = 'appQ';
|
|
|
|
|
|
|
|
|
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
|
|
|
*/
|
2005-06-23 21:40:35 +04:00
|
|
|
ServerApp::ServerApp(port_id clientReplyPort, port_id clientLooperPort,
|
|
|
|
team_id clientTeam, int32 handlerID, const char* signature)
|
2005-06-08 08:01:59 +04:00
|
|
|
:
|
2005-06-23 21:40:35 +04:00
|
|
|
fClientReplyPort(clientReplyPort),
|
|
|
|
fMessagePort(-1),
|
2005-06-08 08:01:59 +04:00
|
|
|
fClientLooperPort(clientLooperPort),
|
|
|
|
fSignature(signature),
|
2005-06-23 21:40:35 +04:00
|
|
|
fThread(-1),
|
|
|
|
fClientTeam(clientTeam),
|
2005-06-23 22:48:10 +04:00
|
|
|
fWindowListLock("window list"),
|
2005-06-08 08:01:59 +04:00
|
|
|
fAppCursor(NULL),
|
|
|
|
fCursorHidden(false),
|
|
|
|
fIsActive(false),
|
|
|
|
//fHandlerToken(handlerID),
|
2005-06-24 08:01:16 +04:00
|
|
|
fSharedMem("shared memory"),
|
2005-06-08 08:01:59 +04:00
|
|
|
fQuitting(false)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2005-05-08 10:06:55 +04:00
|
|
|
if (fSignature == "")
|
2005-06-23 21:40:35 +04:00
|
|
|
fSignature = "application/no-signature";
|
|
|
|
|
2005-06-23 22:48:10 +04:00
|
|
|
char name[B_OS_NAME_LENGTH];
|
|
|
|
snprintf(name, sizeof(name), "a<%s", Signature());
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2005-06-23 22:48:10 +04:00
|
|
|
fMessagePort = create_port(DEFAULT_MONITOR_PORT_SIZE, name);
|
2005-06-23 21:40:35 +04:00
|
|
|
if (fMessagePort < B_OK)
|
|
|
|
return;
|
|
|
|
|
|
|
|
fLink.SetSenderPort(fClientReplyPort);
|
|
|
|
fLink.SetReceiverPort(fMessagePort);
|
|
|
|
|
|
|
|
// we let the application own the port, so that we get aware when it's gone
|
|
|
|
if (set_port_owner(fMessagePort, clientTeam) < B_OK) {
|
|
|
|
delete_port(fMessagePort);
|
|
|
|
fMessagePort = -1;
|
|
|
|
return;
|
|
|
|
}
|
2005-05-26 19:06:31 +04:00
|
|
|
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-05-08 10:06:55 +04:00
|
|
|
ServerCursor *defaultCursor =
|
2005-05-28 17:43:13 +04:00
|
|
|
gDesktop->ActiveRootLayer()->GetCursorManager().GetCursor(B_CURSOR_DEFAULT);
|
2005-05-26 19:06:31 +04:00
|
|
|
|
2005-05-08 10:06:55 +04:00
|
|
|
if (defaultCursor) {
|
|
|
|
fAppCursor = new ServerCursor(defaultCursor);
|
2005-06-23 21:40:35 +04:00
|
|
|
fAppCursor->SetOwningTeam(fClientTeam);
|
2005-05-08 10:06:55 +04:00
|
|
|
}
|
2005-05-26 19:06:31 +04:00
|
|
|
|
2005-05-08 10:06:55 +04:00
|
|
|
STRACE(("ServerApp %s:\n", fSignature.String()));
|
2005-06-23 21:40:35 +04:00
|
|
|
STRACE(("\tBApp port: %ld\n", fClientReplyPort));
|
2005-05-08 10:06:55 +04:00
|
|
|
STRACE(("\tReceiver port: %ld\n", fMessagePort));
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
|
|
|
|
2005-05-08 10:06:55 +04:00
|
|
|
|
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()));
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
if (!fQuitting)
|
|
|
|
CRITICAL("ServerApp: destructor called after Run()!\n");
|
|
|
|
|
2005-06-24 03:21:10 +04:00
|
|
|
fWindowListLock.Lock();
|
|
|
|
|
|
|
|
// quit all server windows
|
|
|
|
|
|
|
|
for (int32 i = fWindowList.CountItems(); i-- > 0;) {
|
|
|
|
ServerWindow* window = (ServerWindow*)fWindowList.ItemAt(i);
|
|
|
|
window->Quit();
|
|
|
|
}
|
|
|
|
int32 tries = fWindowList.CountItems() + 1;
|
|
|
|
|
|
|
|
fWindowListLock.Unlock();
|
|
|
|
|
|
|
|
// wait for the windows to quit
|
|
|
|
while (tries-- > 0) {
|
|
|
|
fWindowListLock.Lock();
|
|
|
|
if (fWindowList.CountItems() == 0) {
|
|
|
|
// we leave the list locked, doesn't matter anymore
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
fWindowListLock.Unlock();
|
|
|
|
snooze(10000);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tries < 0) {
|
|
|
|
// This really shouldn't happen, as it shows we're buggy
|
|
|
|
syslog(LOG_ERR, "ServerApp %s needs to kill some server windows...\n", Signature());
|
|
|
|
|
|
|
|
// there still seem to be some windows left - kill them!
|
|
|
|
fWindowListLock.Lock();
|
|
|
|
|
|
|
|
for (int32 i = 0; i < fWindowList.CountItems(); i++) {
|
|
|
|
ServerWindow* window = (ServerWindow*)fWindowList.ItemAt(i);
|
|
|
|
|
|
|
|
kill_thread(window->Thread());
|
|
|
|
window->Hide();
|
|
|
|
delete window;
|
|
|
|
}
|
|
|
|
|
|
|
|
fWindowListLock.Unlock();
|
|
|
|
}
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
// first, make sure our monitor thread doesn't
|
|
|
|
for (int32 i = 0; i < fBitmapList.CountItems(); i++) {
|
|
|
|
delete static_cast<ServerBitmap *>(fBitmapList.ItemAt(i));
|
2005-06-08 08:01:59 +04:00
|
|
|
}
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
for (int32 i = 0; i < fPictureList.CountItems(); i++) {
|
|
|
|
delete static_cast<ServerPicture *>(fPictureList.ItemAt(i));
|
2005-06-08 08:01:59 +04:00
|
|
|
}
|
2003-03-21 18:49:28 +03:00
|
|
|
|
2004-10-19 01:31:15 +04:00
|
|
|
// This shouldn't be necessary -- all cursors owned by the app
|
|
|
|
// should be cleaned up by RemoveAppCursors
|
2005-06-23 21:40:35 +04:00
|
|
|
// delete fAppCursor;
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-06-23 21:40:35 +04:00
|
|
|
gDesktop->ActiveRootLayer()->GetCursorManager().RemoveAppCursors(fClientTeam);
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2005-06-24 08:01:16 +04:00
|
|
|
STRACE(("ServerApp %s::~ServerApp(): Exiting\n", Signature()));
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Checks if the application was initialized correctly
|
|
|
|
*/
|
|
|
|
status_t
|
|
|
|
ServerApp::InitCheck()
|
|
|
|
{
|
|
|
|
if (fMessagePort < B_OK)
|
|
|
|
return fMessagePort;
|
|
|
|
|
|
|
|
if (fClientReplyPort < B_OK)
|
|
|
|
return fClientReplyPort;
|
|
|
|
|
2005-06-23 22:48:10 +04:00
|
|
|
if (fWindowListLock.Sem() < B_OK)
|
|
|
|
return fWindowListLock.Sem();
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
return B_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
bool
|
2005-06-23 21:40:35 +04:00
|
|
|
ServerApp::Run()
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
fQuitting = false;
|
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
// Unlike a BApplication, a ServerApp is *supposed* to return immediately
|
2005-05-07 02:38:04 +04:00
|
|
|
// when its Run() function is called.
|
2005-06-24 02:43:11 +04:00
|
|
|
fThread = spawn_thread(_message_thread, Signature(), B_NORMAL_PRIORITY, this);
|
2005-06-23 21:40:35 +04:00
|
|
|
if (fThread < B_OK)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (resume_thread(fThread) != B_OK) {
|
|
|
|
fQuitting = true;
|
|
|
|
kill_thread(fThread);
|
|
|
|
fThread = -1;
|
2003-01-24 17:36:15 +03:00
|
|
|
return false;
|
2005-06-23 21:40:35 +04:00
|
|
|
}
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2005-06-24 02:43:11 +04:00
|
|
|
// Let's tell the client how to talk with us
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(fMessagePort);
|
|
|
|
fLink.Flush();
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
return true;
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief This quits the application and deletes it. You're not supposed
|
|
|
|
to call its destructor directly.
|
|
|
|
|
|
|
|
At the point you're calling this method, the application should already
|
|
|
|
be removed from the application list.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
ServerApp::Quit()
|
|
|
|
{
|
|
|
|
if (fThread < B_OK) {
|
|
|
|
delete this;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// execute application deletion in the message looper thread
|
|
|
|
|
|
|
|
fQuitting = true;
|
2005-06-24 02:43:11 +04:00
|
|
|
PostMessage(kMsgAppQuit);
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
send_data(fThread, 'QUIT', NULL, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
/*!
|
|
|
|
\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..."
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
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.
|
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
bool
|
2005-06-23 21:40:35 +04:00
|
|
|
ServerApp::PingTarget()
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
team_info info;
|
|
|
|
if (get_team_info(fClientTeam, &info) != B_OK) {
|
2005-06-15 01:28:56 +04:00
|
|
|
BPrivate::LinkSender link(gAppServerPort);
|
2005-06-08 08:01:59 +04:00
|
|
|
link.StartMessage(AS_DELETE_APP);
|
2005-06-23 21:40:35 +04:00
|
|
|
link.Attach(&fThread, sizeof(thread_id));
|
2005-06-08 08:01:59 +04:00
|
|
|
link.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
|
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
void
|
|
|
|
ServerApp::PostMessage(int32 code)
|
2003-01-27 22:43:15 +03:00
|
|
|
{
|
2005-06-15 01:28:56 +04:00
|
|
|
BPrivate::LinkSender link(fMessagePort);
|
2004-08-23 02:33:57 +04:00
|
|
|
link.StartMessage(code);
|
|
|
|
link.Flush();
|
2004-01-20 01:18:37 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Send a message to the ServerApp's BApplication
|
|
|
|
\param msg The message to send
|
2005-05-28 20:58:25 +04:00
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
void
|
|
|
|
ServerApp::SendMessageToClient(const BMessage *msg) const
|
2004-01-20 01:18:37 +03:00
|
|
|
{
|
2005-05-08 10:06:55 +04:00
|
|
|
ssize_t size = msg->FlattenedSize();
|
|
|
|
char *buffer = new char[size];
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2004-01-20 01:18:37 +03:00
|
|
|
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
|
|
|
}
|
2005-05-28 20:58:25 +04: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
|
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
void
|
|
|
|
ServerApp::Activate(bool value)
|
2003-09-17 23:28:31 +04:00
|
|
|
{
|
2005-05-08 10:06:55 +04:00
|
|
|
fIsActive = value;
|
2003-09-17 23:28:31 +04:00
|
|
|
SetAppCursor();
|
|
|
|
}
|
2005-05-28 18:00:15 +04:00
|
|
|
|
|
|
|
|
2003-09-17 23:28:31 +04:00
|
|
|
//! Sets the cursor to the application cursor, if any.
|
2005-05-08 10:06:55 +04:00
|
|
|
void
|
|
|
|
ServerApp::SetAppCursor(void)
|
2003-09-17 23:28:31 +04:00
|
|
|
{
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-05-08 10:06:55 +04:00
|
|
|
if (fAppCursor)
|
2005-06-24 03:46:17 +04:00
|
|
|
gDesktop->GetHWInterface()->SetCursor(fAppCursor);
|
2003-09-17 23:28:31 +04:00
|
|
|
}
|
|
|
|
|
2005-05-28 18:00:15 +04:00
|
|
|
|
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
|
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
int32
|
2005-06-23 21:40:35 +04:00
|
|
|
ServerApp::_message_thread(void *_app)
|
|
|
|
{
|
|
|
|
ServerApp *app = (ServerApp *)_app;
|
|
|
|
|
|
|
|
app->_MessageLooper();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief The thread function ServerApps use to monitor messages
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
ServerApp::_MessageLooper()
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
|
|
|
// Message-dispatching loop for the ServerApp
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
BPrivate::LinkReceiver &receiver = fLink.Receiver();
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2004-07-30 19:16:59 +04:00
|
|
|
int32 code;
|
|
|
|
status_t err = B_OK;
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
while (!fQuitting) {
|
|
|
|
STRACE(("info: ServerApp::_MessageLooper() listening on port %ld.\n", fMessagePort));
|
|
|
|
err = receiver.GetNextMessage(code, B_INFINITE_TIMEOUT);
|
|
|
|
if (err < B_OK || code == B_QUIT_REQUESTED) {
|
|
|
|
STRACE(("ServerApp: application seems to be gone...\n"));
|
2005-05-26 19:06:31 +04:00
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
// Tell the app_server to quit us
|
2005-06-15 01:28:56 +04:00
|
|
|
BPrivate::LinkSender link(gAppServerPort);
|
2005-06-08 08:01:59 +04:00
|
|
|
link.StartMessage(AS_DELETE_APP);
|
2005-06-23 21:40:35 +04:00
|
|
|
link.Attach<thread_id>(Thread());
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Flush();
|
2004-07-30 19:16:59 +04:00
|
|
|
break;
|
2005-05-07 02:38:04 +04:00
|
|
|
}
|
2003-10-04 23:10:11 +04:00
|
|
|
|
2005-05-26 19:06:31 +04:00
|
|
|
switch (code) {
|
2005-06-23 21:40:35 +04:00
|
|
|
case kMsgAppQuit:
|
|
|
|
// we receive this from our destructor on quit
|
|
|
|
fQuitting = true;
|
|
|
|
break;
|
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
case AS_CREATE_WINDOW:
|
|
|
|
{
|
|
|
|
// Create the ServerWindow to node monitor a new OBWindow
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// Attached data:
|
|
|
|
// 2) BRect window frame
|
|
|
|
// 3) uint32 window look
|
|
|
|
// 4) uint32 window feel
|
|
|
|
// 5) uint32 window flags
|
|
|
|
// 6) uint32 workspace index
|
|
|
|
// 7) int32 BHandler token of the window
|
|
|
|
// 8) port_id window's message port
|
|
|
|
// 9) const char * title
|
|
|
|
|
|
|
|
BRect frame;
|
|
|
|
uint32 look;
|
|
|
|
uint32 feel;
|
|
|
|
uint32 flags;
|
2005-06-23 22:48:10 +04:00
|
|
|
uint32 workspaces;
|
2005-02-28 23:23:51 +03:00
|
|
|
int32 token = B_NULL_TOKEN;
|
2005-06-24 02:43:11 +04:00
|
|
|
port_id clientReplyPort = -1;
|
2005-02-28 23:23:51 +03:00
|
|
|
port_id looperPort = -1;
|
|
|
|
char *title = NULL;
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
receiver.Read<BRect>(&frame);
|
|
|
|
receiver.Read<uint32>(&look);
|
|
|
|
receiver.Read<uint32>(&feel);
|
|
|
|
receiver.Read<uint32>(&flags);
|
2005-06-23 22:48:10 +04:00
|
|
|
receiver.Read<uint32>(&workspaces);
|
2005-06-23 21:40:35 +04:00
|
|
|
receiver.Read<int32>(&token);
|
2005-06-24 02:43:11 +04:00
|
|
|
receiver.Read<port_id>(&clientReplyPort);
|
2005-06-23 21:40:35 +04:00
|
|
|
receiver.Read<port_id>(&looperPort);
|
|
|
|
if (receiver.ReadString(&title) != B_OK)
|
2005-06-08 08:01:59 +04:00
|
|
|
break;
|
2005-02-28 23:23:51 +03:00
|
|
|
|
|
|
|
// ServerWindow constructor will reply with port_id of a newly created port
|
2005-06-24 02:43:11 +04:00
|
|
|
ServerWindow *window = new ServerWindow(title, this, clientReplyPort,
|
|
|
|
looperPort, token, frame, look, feel, flags, workspaces);
|
2005-02-28 23:23:51 +03:00
|
|
|
|
|
|
|
STRACE(("\nServerApp %s: New Window %s (%.1f,%.1f,%.1f,%.1f)\n",
|
2005-06-24 02:43:11 +04:00
|
|
|
fSignature(), title, frame.left, frame.top, frame.right, frame.bottom));
|
|
|
|
|
|
|
|
if (window->InitCheck() == B_OK && window->Run()) {
|
|
|
|
// add the window to the list
|
|
|
|
if (fWindowListLock.Lock()) {
|
|
|
|
fWindowList.AddItem(window);
|
|
|
|
fWindowListLock.Unlock();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
delete window;
|
|
|
|
|
|
|
|
// window creation failed, we need to notify the client
|
|
|
|
BPrivate::LinkSender reply(clientReplyPort);
|
|
|
|
reply.StartMessage(SERVER_FALSE);
|
|
|
|
reply.Flush();
|
|
|
|
}
|
2005-02-28 23:23:51 +03:00
|
|
|
|
2005-06-23 22:48:10 +04:00
|
|
|
// We don't have to free the title, as it's owned by the ServerWindow now
|
2005-02-28 23:23:51 +03:00
|
|
|
break;
|
|
|
|
}
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
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.
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
STRACE(("ServerApp %s:Server shutdown notification received\n", Signature()));
|
2004-01-20 01:18:37 +03:00
|
|
|
|
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
|
2005-04-18 22:48:19 +04:00
|
|
|
#if TEST_MODE
|
2005-03-29 19:39:08 +04:00
|
|
|
BMessage pleaseQuit(B_QUIT_REQUESTED);
|
2005-06-23 21:40:35 +04:00
|
|
|
SendMessageToClient(&pleaseQuit);
|
2005-03-29 19:39:08 +04:00
|
|
|
#endif
|
2003-10-04 23:10:11 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
default:
|
2005-06-23 21:40:35 +04:00
|
|
|
STRACE(("ServerApp %s: Got a Message to dispatch\n", Signature()));
|
|
|
|
_DispatchMessage(code, receiver);
|
2003-10-04 23:10:11 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
// Quit() will send us a message; we're handling the exiting procedure
|
|
|
|
thread_id sender;
|
|
|
|
receive_data(&sender, NULL, 0);
|
|
|
|
|
|
|
|
delete this;
|
2003-01-24 17:36:15 +03:00
|
|
|
}
|
|
|
|
|
2005-05-28 18:00:15 +04:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
/*!
|
|
|
|
\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.
|
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
void
|
2005-06-23 21:40:35 +04:00
|
|
|
ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link)
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2005-06-23 22:48:10 +04:00
|
|
|
// LayerData ld;
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
switch (code) {
|
2003-10-19 04:03:06 +04:00
|
|
|
case AS_UPDATE_COLORS:
|
|
|
|
{
|
2004-10-06 03:00:47 +04:00
|
|
|
// NOTE: R2: Eventually we will have windows which will notify their children of changes in
|
2004-06-11 18:58:24 +04:00
|
|
|
// 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);
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
for(int32 i = 0; i < fWindowList.CountItems(); i++) {
|
|
|
|
win=(ServerWindow*)fWindowList.ItemAt(i);
|
2005-05-28 17:43:13 +04:00
|
|
|
win->GetWinBorder()->UpdateColors();
|
2004-07-30 19:16:59 +04:00
|
|
|
win->SendMessageToClient(AS_UPDATE_COLORS, msg);
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
*/ break;
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
|
|
|
case AS_UPDATE_FONTS:
|
|
|
|
{
|
2004-10-06 03:00:47 +04:00
|
|
|
// NOTE: R2: Eventually we will have windows which will notify their children of changes in
|
2004-06-11 18:58:24 +04:00
|
|
|
// 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);
|
2005-05-28 17:43:13 +04:00
|
|
|
win->GetWinBorder()->UpdateFont();
|
2004-07-30 19:16:59 +04:00
|
|
|
win->SendMessageToClient(AS_UPDATE_FONTS, msg);
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
2004-01-20 01:18:37 +03:00
|
|
|
*/ break;
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
2004-10-14 05:23:00 +04:00
|
|
|
case AS_AREA_MESSAGE:
|
|
|
|
{
|
|
|
|
// This occurs in only one kind of case: a message is too big to send over a port. This
|
|
|
|
// is really an edge case, so this shouldn't happen *too* often
|
|
|
|
|
|
|
|
// Attached Data:
|
|
|
|
// 1) area_id id of an area already owned by the server containing the message
|
|
|
|
// 2) size_t offset of the pointer in the area
|
|
|
|
// 3) size_t size of the message
|
|
|
|
|
|
|
|
area_id area;
|
|
|
|
size_t offset;
|
|
|
|
size_t msgsize;
|
|
|
|
area_info ai;
|
|
|
|
int8 *msgpointer;
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<area_id>(&area);
|
|
|
|
link.Read<size_t>(&offset);
|
|
|
|
link.Read<size_t>(&msgsize);
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2004-10-14 05:23:00 +04:00
|
|
|
// Part sanity check, part get base pointer :)
|
2005-05-08 10:06:55 +04:00
|
|
|
if (get_area_info(area, &ai) < B_OK)
|
2004-10-14 05:23:00 +04:00
|
|
|
break;
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2005-05-08 10:06:55 +04:00
|
|
|
msgpointer = (int8*)ai.address + offset;
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2004-10-14 05:23:00 +04:00
|
|
|
RAMLinkMsgReader mlink(msgpointer);
|
2005-06-23 21:40:35 +04:00
|
|
|
_DispatchMessage(mlink.Code(), mlink);
|
|
|
|
|
2004-10-14 05:23:00 +04:00
|
|
|
// This is a very special case in the sense that when ServerMemIO is used for this
|
|
|
|
// purpose, it will be set to NOT automatically free the memory which it had
|
|
|
|
// requested. This is the server's job once the message has been dispatched.
|
2005-06-24 08:01:16 +04:00
|
|
|
fSharedMem.ReleaseBuffer(msgpointer);
|
2004-10-14 05:23:00 +04:00
|
|
|
break;
|
|
|
|
}
|
2004-10-06 03:00:47 +04:00
|
|
|
case AS_ACQUIRE_SERVERMEM:
|
|
|
|
{
|
2004-10-14 05:23:00 +04:00
|
|
|
// This particular call is more than a bit of a pain in the neck. We are given a
|
|
|
|
// size of a chunk of memory needed. We need to (1) allocate it, (2) get the area for
|
|
|
|
// this particular chunk, (3) find the offset in the area for this chunk, and (4)
|
|
|
|
// tell the client about it. Good thing this particular call isn't used much
|
|
|
|
|
2004-10-06 03:00:47 +04:00
|
|
|
// Received from a ServerMemIO object requesting operating memory
|
|
|
|
// Attached Data:
|
|
|
|
// 1) size_t requested size
|
2004-10-14 05:23:00 +04:00
|
|
|
// 2) port_id reply_port
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2004-10-14 05:23:00 +04:00
|
|
|
size_t memsize;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<size_t>(&memsize);
|
|
|
|
|
2004-10-14 05:23:00 +04:00
|
|
|
// TODO: I wonder if ACQUIRE_SERVERMEM should have a minimum size requirement?
|
|
|
|
|
2005-06-24 08:01:16 +04:00
|
|
|
void *sharedmem = fSharedMem.GetBuffer(memsize);
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-05-08 10:06:55 +04:00
|
|
|
if (memsize < 1 || sharedmem == NULL) {
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
2004-10-14 05:23:00 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-05-08 10:06:55 +04:00
|
|
|
area_id owningArea = area_for(sharedmem);
|
2005-06-08 08:01:59 +04:00
|
|
|
area_info info;
|
|
|
|
|
|
|
|
if (owningArea == B_ERROR || get_area_info(owningArea, &info) < B_OK) {
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
2004-10-14 05:23:00 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
int32 areaoffset = (addr_t)sharedmem - (addr_t)info.address;
|
2004-10-14 05:23:00 +04:00
|
|
|
STRACE(("Successfully allocated shared memory of size %ld\n",memsize));
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<area_id>(owningArea);
|
|
|
|
fLink.Attach<int32>(areaoffset);
|
|
|
|
fLink.Flush();
|
2004-10-06 03:00:47 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_RELEASE_SERVERMEM:
|
|
|
|
{
|
2004-10-14 05:23:00 +04:00
|
|
|
// Received when a ServerMemIO object on destruction
|
|
|
|
// Attached Data:
|
|
|
|
// 1) area_id owning area
|
|
|
|
// 2) int32 area offset
|
|
|
|
|
|
|
|
area_id owningArea;
|
|
|
|
int32 areaoffset;
|
2005-05-08 10:06:55 +04:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<area_id>(&owningArea);
|
|
|
|
link.Read<int32>(&areaoffset);
|
2004-10-14 05:23:00 +04:00
|
|
|
|
2005-05-08 10:06:55 +04:00
|
|
|
area_info areaInfo;
|
|
|
|
if (owningArea < 0 || get_area_info(owningArea, &areaInfo) != B_OK)
|
2004-10-14 05:23:00 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
STRACE(("Successfully freed shared memory\n"));
|
2005-05-08 10:06:55 +04:00
|
|
|
void *sharedmem = ((int32*)areaInfo.address) + areaoffset;
|
2004-10-14 05:23:00 +04:00
|
|
|
|
2005-06-24 08:01:16 +04:00
|
|
|
fSharedMem.ReleaseBuffer(sharedmem);
|
2004-10-14 05:23:00 +04:00
|
|
|
|
2004-10-06 03:00:47 +04: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
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
for (int32 i = 0; i < fWindowList.CountItems(); i++) {
|
|
|
|
ServerWindow *window = (ServerWindow*)fWindowList.ItemAt(i);
|
|
|
|
window->Lock();
|
|
|
|
const_cast<WinBorder *>(window->GetWinBorder())->UpdateDecorator();
|
|
|
|
window->Unlock();
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
2004-01-13 03:56:36 +03:00
|
|
|
break;
|
2003-10-19 04:03:06 +04:00
|
|
|
}
|
2005-06-17 23:10:15 +04:00
|
|
|
case AS_SET_DECORATOR:
|
|
|
|
{
|
|
|
|
// Received from an application when the user wants to set the window
|
|
|
|
// decorator to a new one
|
|
|
|
|
|
|
|
// Attached Data:
|
|
|
|
// int32 the index of the decorator to use
|
|
|
|
|
|
|
|
int32 index;
|
|
|
|
link.Read<int32>(&index);
|
|
|
|
if(gDecorManager.SetDecorator(index))
|
|
|
|
BroadcastToAllApps(AS_UPDATE_DECORATOR);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_COUNT_DECORATORS:
|
|
|
|
{
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(gDecorManager.CountDecorators());
|
|
|
|
fLink.Flush();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_DECORATOR:
|
|
|
|
{
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(gDecorManager.GetDecorator());
|
|
|
|
fLink.Flush();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_DECORATOR_NAME:
|
|
|
|
{
|
|
|
|
int32 index;
|
|
|
|
link.Read<int32>(&index);
|
|
|
|
|
|
|
|
BString str(gDecorManager.GetDecoratorName(index));
|
|
|
|
if(str.CountChars() > 0)
|
|
|
|
{
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.AttachString(str.String());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_R5_SET_DECORATOR:
|
|
|
|
{
|
|
|
|
// Sort of supports Tracker's nifty Easter Egg. It was easy to do and
|
|
|
|
// it's kind of neat, so why not?
|
|
|
|
|
|
|
|
// Attached Data:
|
|
|
|
// int32 value of the decorator to use
|
|
|
|
// 0: BeOS
|
|
|
|
// 1: Amiga
|
|
|
|
// 2: Windows
|
|
|
|
// 3: MacOS
|
|
|
|
|
|
|
|
int32 decindex = 0;
|
|
|
|
link.Read<int32>(&decindex);
|
|
|
|
|
|
|
|
if(gDecorManager.SetR5Decorator(decindex))
|
|
|
|
BroadcastToAllApps(AS_UPDATE_DECORATOR);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
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
|
2005-06-08 08:01:59 +04:00
|
|
|
ServerBitmap *bitmap = NULL;
|
|
|
|
BRect frame;
|
|
|
|
color_space colorSpace;
|
|
|
|
int32 flags, bytesPerRow;
|
|
|
|
screen_id screenID;
|
|
|
|
|
|
|
|
link.Read<BRect>(&frame);
|
|
|
|
link.Read<color_space>(&colorSpace);
|
|
|
|
link.Read<int32>(&flags);
|
|
|
|
link.Read<int32>(&bytesPerRow);
|
|
|
|
if (link.Read<screen_id>(&screenID) == B_OK) {
|
2005-06-24 07:31:41 +04:00
|
|
|
bitmap = gBitmapManager->CreateBitmap(frame, colorSpace, flags,
|
2005-06-08 08:01:59 +04:00
|
|
|
bytesPerRow, screenID);
|
|
|
|
}
|
|
|
|
|
|
|
|
STRACE(("ServerApp %s: Create Bitmap (%.1fx%.1f)\n",
|
|
|
|
fSignature.String(), frame.Width(), frame.Height()));
|
|
|
|
|
|
|
|
if (bitmap) {
|
2005-06-23 21:40:35 +04:00
|
|
|
fBitmapList.AddItem(bitmap);
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(bitmap->Token());
|
|
|
|
fLink.Attach<int32>(bitmap->Area());
|
|
|
|
fLink.Attach<int32>(bitmap->AreaOffset());
|
2005-05-08 10:06:55 +04:00
|
|
|
} else {
|
2003-03-12 17:29:59 +03:00
|
|
|
// alternatively, if something went wrong, we reply with SERVER_FALSE
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
2003-03-12 17:29:59 +03:00
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
fLink.Flush();
|
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
|
2005-06-08 08:01:59 +04:00
|
|
|
int32 id;
|
|
|
|
link.Read<int32>(&id);
|
|
|
|
|
|
|
|
ServerBitmap *bitmap = FindBitmap(id);
|
|
|
|
if (bitmap) {
|
|
|
|
STRACE(("ServerApp %s: Deleting Bitmap %ld\n", fSignature.String(), id));
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
fBitmapList.RemoveItem(bitmap);
|
2005-06-24 07:31:41 +04:00
|
|
|
gBitmapManager->DeleteBitmap(bitmap);
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
2005-05-08 10:06:55 +04:00
|
|
|
} else
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2003-03-12 17:29:59 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-03-21 18:49:28 +03:00
|
|
|
case AS_CREATE_PICTURE:
|
|
|
|
{
|
2004-08-29 19:01:44 +04:00
|
|
|
// TODO: Implement AS_CREATE_PICTURE
|
2005-06-08 08:01:59 +04: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:
|
|
|
|
{
|
2004-08-29 19:01:44 +04:00
|
|
|
// TODO: Implement AS_DELETE_PICTURE
|
2005-06-08 08:01:59 +04: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:
|
|
|
|
{
|
2004-08-29 19:01:44 +04:00
|
|
|
// TODO: Implement AS_CLONE_PICTURE
|
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:
|
|
|
|
{
|
2004-08-29 19:01:44 +04:00
|
|
|
// TODO; Implement AS_DOWNLOAD_PICTURE
|
2005-06-17 23:10:15 +04:00
|
|
|
STRACE(("ServerApp %s: Download Picture unimplemented\n", fSignature.String()));
|
2004-08-29 19:01:44 +04:00
|
|
|
|
|
|
|
// What is this particular function call for, anyway?
|
2005-06-17 23:10:15 +04:00
|
|
|
|
|
|
|
// DW: I think originally it might have been to support
|
|
|
|
// the undocumented Flatten function.
|
|
|
|
|
2003-03-21 18:49:28 +03:00
|
|
|
break;
|
|
|
|
}
|
2005-06-10 12:29:49 +04:00
|
|
|
|
2005-06-14 02:11:29 +04:00
|
|
|
case AS_CURRENT_WORKSPACE:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2005-06-14 02:11:29 +04:00
|
|
|
STRACE(("ServerApp %s: get current workspace\n", fSignature.String()));
|
|
|
|
|
|
|
|
// TODO: Locking this way is not nice
|
|
|
|
RootLayer *root = gDesktop->ActiveRootLayer();
|
|
|
|
root->Lock();
|
2004-08-23 02:33:57 +04:00
|
|
|
|
2005-06-14 02:11:29 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(root->ActiveWorkspaceIndex());
|
|
|
|
fLink.Flush();
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2005-06-14 02:11:29 +04:00
|
|
|
root->Unlock();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case AS_ACTIVATE_WORKSPACE:
|
|
|
|
{
|
|
|
|
STRACE(("ServerApp %s: activate workspace\n", fSignature.String()));
|
2004-08-23 02:33:57 +04:00
|
|
|
|
2005-06-14 02:11:29 +04:00
|
|
|
// TODO: See above
|
|
|
|
int32 index;
|
|
|
|
link.Read<int32>(&index);
|
|
|
|
RootLayer *root = gDesktop->ActiveRootLayer();
|
|
|
|
root->Lock();
|
|
|
|
root->SetActiveWorkspace(index);
|
|
|
|
root->Unlock();
|
|
|
|
// no reply
|
|
|
|
|
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()));
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-06-24 03:46:17 +04:00
|
|
|
// TODO: support nested showing/hiding
|
|
|
|
gDesktop->GetHWInterface()->SetCursorVisible(true);
|
2005-05-12 14:31:48 +04: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()));
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-06-24 03:46:17 +04:00
|
|
|
// TODO: support nested showing/hiding
|
|
|
|
gDesktop->GetHWInterface()->SetCursorVisible(false);
|
2005-05-12 14:31:48 +04: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()));
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-06-24 03:46:17 +04:00
|
|
|
// gDesktop->GetHWInterface()->ObscureCursor();
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-02-24 18:47:06 +03:00
|
|
|
case AS_QUERY_CURSOR_HIDDEN:
|
2003-02-24 00:40:44 +03:00
|
|
|
{
|
2005-06-08 08:01:59 +04: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
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(fCursorHidden ? SERVER_TRUE : SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
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];
|
2005-06-08 08:01:59 +04:00
|
|
|
link.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)
|
2005-05-28 17:43:13 +04:00
|
|
|
gDesktop->ActiveRootLayer()->GetCursorManager().DeleteCursor(fAppCursor->ID());
|
2003-01-24 17:36:15 +03:00
|
|
|
|
2005-05-12 14:31:48 +04:00
|
|
|
fAppCursor = new ServerCursor(cdata);
|
2005-06-23 21:40:35 +04:00
|
|
|
fAppCursor->SetOwningTeam(fClientTeam);
|
2004-01-20 01:18:37 +03:00
|
|
|
fAppCursor->SetAppSignature(fSignature.String());
|
2005-05-28 17:43:13 +04:00
|
|
|
gDesktop->ActiveRootLayer()->GetCursorManager().AddCursor(fAppCursor);
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-06-24 03:46:17 +04:00
|
|
|
gDesktop->GetHWInterface()->SetCursor(fAppCursor);
|
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;
|
2004-07-30 19:16:59 +04:00
|
|
|
int32 ctoken = B_NULL_TOKEN;
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<bool>(&sync);
|
|
|
|
link.Read<int32>(&ctoken);
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
|
|
|
ServerCursor *cursor;
|
2005-05-28 17:43:13 +04:00
|
|
|
if ((cursor = gDesktop->ActiveRootLayer()->GetCursorManager().FindCursor(ctoken)))
|
2005-06-24 03:46:17 +04:00
|
|
|
gDesktop->GetHWInterface()->SetCursor(cursor);
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
if (sync) {
|
2003-10-03 04:41:40 +04:00
|
|
|
// the application is expecting a reply, but plans to do literally nothing
|
|
|
|
// with the data, so we'll just reuse the cursor token variable
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Flush();
|
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
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
int8 cursorData[68];
|
|
|
|
link.Read(cursorData, sizeof(cursorData));
|
2003-02-24 18:47:06 +03:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fAppCursor = new ServerCursor(cursorData);
|
2005-06-23 21:40:35 +04:00
|
|
|
fAppCursor->SetOwningTeam(fClientTeam);
|
2004-01-20 01:18:37 +03:00
|
|
|
fAppCursor->SetAppSignature(fSignature.String());
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-05-28 17:43:13 +04:00
|
|
|
gDesktop->ActiveRootLayer()->GetCursorManager().AddCursor(fAppCursor);
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2003-02-24 18:47:06 +03:00
|
|
|
// Synchronous message - BApplication is waiting on the cursor's ID
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(fAppCursor->ID());
|
|
|
|
fLink.Flush();
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
2003-09-17 23:28:31 +04:00
|
|
|
case AS_DELETE_BCURSOR:
|
|
|
|
{
|
2005-06-08 08:01:59 +04: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
|
2004-07-30 19:16:59 +04:00
|
|
|
int32 ctoken = B_NULL_TOKEN;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<int32>(&ctoken);
|
|
|
|
|
|
|
|
if (fAppCursor && fAppCursor->ID() == ctoken)
|
|
|
|
fAppCursor = NULL;
|
|
|
|
|
2005-01-19 21:00:05 +03:00
|
|
|
// although this isn't pretty, ATM we have only one RootLayer.
|
|
|
|
// there should be a way that this ServerApp be attached to a particular
|
|
|
|
// RootLayer to know which RootLayer's cursor to modify.
|
2005-05-28 17:43:13 +04:00
|
|
|
gDesktop->ActiveRootLayer()->GetCursorManager().DeleteCursor(ctoken);
|
2003-09-17 23:28:31 +04:00
|
|
|
break;
|
|
|
|
}
|
2003-07-10 21:48:04 +04:00
|
|
|
case AS_GET_SCROLLBAR_INFO:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
STRACE(("ServerApp %s: Get ScrollBar info\n", fSignature.String()));
|
|
|
|
scroll_bar_info info = gDesktop->ScrollBarInfo();
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<scroll_bar_info>(info);
|
|
|
|
fLink.Flush();
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_SCROLLBAR_INFO:
|
|
|
|
{
|
2005-06-08 08:01:59 +04: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
|
2005-06-08 08:01:59 +04:00
|
|
|
scroll_bar_info info;
|
|
|
|
if (link.Read<scroll_bar_info>(&info) == B_OK)
|
|
|
|
gDesktop->SetScrollBarInfo(info);
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_FOCUS_FOLLOWS_MOUSE:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
STRACE(("ServerApp %s: query Focus Follow Mouse in use\n", fSignature.String()));
|
2003-10-03 04:41:40 +04:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<bool>(gDesktop->FFMouseInUse());
|
|
|
|
fLink.Flush();
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_FOCUS_FOLLOWS_MOUSE:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
STRACE(("ServerApp %s: Set Focus Follows Mouse in use\n", fSignature.String()));
|
|
|
|
// ToDo: implement me!
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_MOUSE_MODE:
|
|
|
|
{
|
2005-06-08 08:01:59 +04: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;
|
2005-06-08 08:01:59 +04:00
|
|
|
if (link.Read<mode_mouse>(&mmode) == B_OK)
|
|
|
|
gDesktop->SetFFMouseMode(mmode);
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_MOUSE_MODE:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", fSignature.String()));
|
|
|
|
mode_mouse mmode = gDesktop->FFMouseMode();
|
2004-01-17 21:37:57 +03:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<mode_mouse>(mmode);
|
|
|
|
fLink.Flush();
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-06-14 23:48:30 +04:00
|
|
|
case AS_GET_UI_COLORS:
|
|
|
|
{
|
|
|
|
// Client application is asking for all the system colors at once
|
|
|
|
// using a ColorSet object
|
|
|
|
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gGUIColorSet.Lock();
|
2005-06-14 23:48:30 +04:00
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
2005-06-24 07:31:41 +04:00
|
|
|
fLink.Attach<ColorSet>(gGUIColorSet);
|
2005-06-14 23:48:30 +04:00
|
|
|
fLink.Flush();
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gGUIColorSet.Unlock();
|
2005-06-14 23:48:30 +04:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_UI_COLORS:
|
|
|
|
{
|
|
|
|
// Client application is asking to set all the system colors at once
|
|
|
|
// using a ColorSet object
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2005-06-14 23:48:30 +04:00
|
|
|
// Attached data:
|
|
|
|
// 1) ColorSet new colors to use
|
2005-06-24 07:31:41 +04:00
|
|
|
|
|
|
|
gGUIColorSet.Lock();
|
|
|
|
link.Read<ColorSet>(&gGUIColorSet);
|
|
|
|
gGUIColorSet.Unlock();
|
|
|
|
|
2005-06-17 23:10:15 +04:00
|
|
|
BroadcastToAllApps(AS_UPDATE_COLORS);
|
2005-06-14 23:48:30 +04:00
|
|
|
break;
|
|
|
|
}
|
2003-10-09 03:18:30 +04:00
|
|
|
case AS_GET_UI_COLOR:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
STRACE(("ServerApp %s: Get UI color\n", fSignature.String()));
|
2004-01-17 21:37:57 +03:00
|
|
|
|
|
|
|
RGBColor color;
|
2005-06-24 07:31:41 +04:00
|
|
|
int32 whichColor;
|
|
|
|
link.Read<int32>(&whichColor);
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gGUIColorSet.Lock();
|
|
|
|
color = gGUIColorSet.AttributeToColor(whichColor);
|
|
|
|
gGUIColorSet.Unlock();
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<rgb_color>(color.GetColor32());
|
|
|
|
fLink.Flush();
|
2003-10-09 03:18:30 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-06-24 07:31:41 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
case AS_UPDATED_CLIENT_FONTLIST:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
STRACE(("ServerApp %s: Acknowledged update of client-side font list\n",
|
|
|
|
fSignature.String()));
|
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// received when the client-side global font list has been
|
|
|
|
// refreshed
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
gFontServer->FontsUpdated();
|
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_QUERY_FONTS_CHANGED:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_QUERY_FONTS_CHANGED unimplemented\n",
|
|
|
|
fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) bool check flag
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// if just checking, just give an answer,
|
|
|
|
// if not and needs updated,
|
|
|
|
// sync the font list and return true else return false
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_FAMILY_NAME:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_FAMILY_NAME\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) int32 the ID of the font family to get
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) font_family - name of family
|
|
|
|
// 2) uint32 - flags of font family (B_IS_FIXED || B_HAS_TUNED_FONT)
|
2005-06-08 08:01:59 +04:00
|
|
|
int32 id;
|
|
|
|
link.Read<int32>(&id);
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontFamily *ffamily = gFontServer->GetFamily(id);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (ffamily) {
|
2005-01-17 05:05:50 +03:00
|
|
|
font_family fam;
|
2005-06-08 08:01:59 +04:00
|
|
|
strcpy(fam, ffamily->Name());
|
|
|
|
fLink.Attach(fam, sizeof(font_family));
|
|
|
|
fLink.Attach<int32>(ffamily->GetFlags());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_STYLE_NAME:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_STYLE_NAME\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) font_family The name of the font family
|
|
|
|
// 2) int32 ID of the style to get
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) font_style - name of the style
|
|
|
|
// 2) uint16 - appropriate face values
|
|
|
|
// 3) uint32 - flags of font style (B_IS_FIXED || B_HAS_TUNED_FONT)
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
int32 styid;
|
|
|
|
font_family fam;
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
link.Read(fam,sizeof(font_family));
|
|
|
|
link.Read<int32>(&styid);
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontStyle *fstyle = gFontServer->GetStyle(fam, styid);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (fstyle) {
|
2005-01-17 05:05:50 +03:00
|
|
|
font_family sty;
|
2005-06-08 08:01:59 +04:00
|
|
|
strcpy(sty, fstyle->Name());
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach(sty,sizeof(font_style));
|
|
|
|
fLink.Attach<int32>(fstyle->GetFace());
|
|
|
|
fLink.Attach<int32>(fstyle->GetFlags());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_FAMILY_AND_STYLE:
|
|
|
|
{
|
2005-01-19 18:12:35 +03:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_FAMILY_AND_STYLE\n",fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) font_family The name of the font family
|
|
|
|
// 2) font_style - name of the style
|
2005-02-28 23:23:51 +03:00
|
|
|
uint16 famid, styid;
|
2005-01-17 05:05:50 +03:00
|
|
|
font_family fam;
|
|
|
|
font_style sty;
|
2005-02-28 23:23:51 +03:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint16>(&famid);
|
|
|
|
link.Read<uint16>(&styid);
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontStyle *fstyle = gFontServer->GetStyle(famid, styid);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (fstyle) {
|
|
|
|
strcpy(fam, fstyle->Family()->Name());
|
|
|
|
strcpy(sty, fstyle->Name());
|
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach(fam, sizeof(font_family));
|
|
|
|
fLink.Attach(sty, sizeof(font_style));
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
2005-01-17 05:05:50 +03:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_FONT_DIRECTION:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_FONT_DIRECTION unimplemented\n",
|
|
|
|
fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) font_direction direction of font
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-02-23 04:45:48 +03:00
|
|
|
// NOTE: While this may be unimplemented, we can safely return
|
|
|
|
// SERVER_FALSE. This will force the BFont code to default to
|
|
|
|
// B_LEFT_TO_RIGHT, which is what the vast majority of fonts will be.
|
|
|
|
// This will be fixed later.
|
|
|
|
int32 famid, styid;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<int32>(&famid);
|
|
|
|
link.Read<int32>(&styid);
|
2005-01-17 05:05:50 +03:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
/* gFontServer->Lock();
|
|
|
|
FontStyle *fstyle=gFontServer->GetStyle(famid,styid);
|
2005-01-17 05:05:50 +03:00
|
|
|
if(fstyle)
|
|
|
|
{
|
|
|
|
font_direction dir=fstyle->GetDirection();
|
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<font_direction>(dir);
|
|
|
|
fLink.Flush();
|
2005-01-17 05:05:50 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
*/ fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
2005-02-23 04:45:48 +03:00
|
|
|
// }
|
2005-01-17 05:05:50 +03:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
// gFontServer->Unlock();
|
2005-02-06 01:46:54 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_STRING_WIDTH:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_STRING_WIDTH\n", fSignature.String()));
|
2005-02-06 01:46:54 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) string String to measure
|
|
|
|
// 2) int32 string length to measure
|
|
|
|
// 3) uint16 ID of family
|
|
|
|
// 4) uint16 ID of style
|
|
|
|
// 5) float point size of font
|
|
|
|
// 6) uint8 spacing to use
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-02-06 01:46:54 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) float - width of the string in pixels
|
2005-06-08 08:01:59 +04:00
|
|
|
char *string = NULL;
|
2005-02-06 01:46:54 +03:00
|
|
|
int32 length;
|
2005-06-08 08:01:59 +04:00
|
|
|
uint16 family, style;
|
|
|
|
float size, width = 0;
|
2005-02-06 01:46:54 +03:00
|
|
|
uint8 spacing;
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
link.ReadString(&string);
|
|
|
|
link.Read<int32>(&length);
|
|
|
|
link.Read<uint16>(&family);
|
|
|
|
link.Read<uint16>(&style);
|
|
|
|
link.Read<float>(&size);
|
|
|
|
link.Read<uint8>(&spacing);
|
2005-04-19 04:42:42 +04:00
|
|
|
|
|
|
|
ServerFont font;
|
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
if (length > 0 && font.SetFamilyAndStyle(family, style) == B_OK
|
|
|
|
&& size > 0 && string) {
|
2005-04-19 04:42:42 +04:00
|
|
|
|
|
|
|
font.SetSize(size);
|
|
|
|
font.SetSpacing(spacing);
|
|
|
|
|
2005-05-28 17:43:13 +04:00
|
|
|
width = gDesktop->GetDisplayDriver()->StringWidth(string, length, font);
|
2005-05-20 23:52:38 +04:00
|
|
|
// NOTE: The line below will return the exact same thing. However,
|
|
|
|
// the line above uses the AGG rendering backend, for which glyph caching
|
|
|
|
// actually works. It is about 20 times faster!
|
|
|
|
//width = font.StringWidth(string, length);
|
2005-05-20 21:36:55 +04:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<float>(width);
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-03 23:50:30 +04:00
|
|
|
free(string);
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_FONT_BOUNDING_BOX:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_BOUNDING_BOX unimplemented\n",
|
|
|
|
fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) BRect - box holding entire font
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
// ToDo: implement me!
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_TUNED_COUNT:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_TUNED_COUNT\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) int32 - number of font strikes available
|
2005-02-23 04:45:48 +03:00
|
|
|
int32 famid, styid;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<int32>(&famid);
|
|
|
|
link.Read<int32>(&styid);
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontStyle *fstyle = gFontServer->GetStyle(famid, styid);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (fstyle) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(fstyle->TunedCount());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_TUNED_INFO:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_TUNED_INFO unimplmemented\n",
|
|
|
|
fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
// 3) uint32 - index of the particular font strike
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) tuned_font_info - info on the strike specified
|
2005-06-08 08:01:59 +04:00
|
|
|
// ToDo: implement me!
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_QUERY_FONT_FIXED:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_QUERY_FONT_FIXED unimplmemented\n",
|
|
|
|
fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) bool - font is/is not fixed
|
2005-02-23 04:45:48 +03:00
|
|
|
int32 famid, styid;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<int32>(&famid);
|
|
|
|
link.Read<int32>(&styid);
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontStyle *fstyle = gFontServer->GetStyle(famid, styid);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (fstyle) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<bool>(fstyle->IsFixedWidth());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
2005-01-19 18:12:35 +03:00
|
|
|
case AS_SET_FAMILY_NAME:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_FAMILY_NAME\n", fSignature.String()));
|
2005-01-19 18:12:35 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) font_family - name of font family to use
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-19 18:12:35 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) uint16 - family ID
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-19 18:12:35 +03:00
|
|
|
font_family fam;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read(fam, sizeof(font_family));
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontFamily *ffam = gFontServer->GetFamily(fam);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (ffam) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint16>(ffam->GetID());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
2005-01-19 18:12:35 +03:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-19 18:12:35 +03:00
|
|
|
break;
|
|
|
|
}
|
2005-01-17 05:05:50 +03:00
|
|
|
case AS_SET_FAMILY_AND_STYLE:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_FAMILY_AND_STYLE\n",
|
|
|
|
fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) font_family - name of font family to use
|
|
|
|
// 2) font_style - name of style in family
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-19 18:12:35 +03:00
|
|
|
font_family fam;
|
|
|
|
font_style sty;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read(fam, sizeof(font_family));
|
|
|
|
link.Read(sty, sizeof(font_style));
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontStyle *fstyle = gFontServer->GetStyle(fam, sty);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (fstyle) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint16>(fstyle->Family()->GetID());
|
|
|
|
fLink.Attach<uint16>(fstyle->GetID());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
2005-02-06 01:46:54 +03:00
|
|
|
case AS_SET_FAMILY_AND_STYLE_FROM_ID:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_FAMILY_AND_STYLE_FROM_ID\n",
|
|
|
|
fSignature.String()));
|
2005-02-06 01:46:54 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - ID of font family to use
|
|
|
|
// 2) uint16 - ID of style in family
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-02-06 01:46:54 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) uint16 - face of the font
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-02-06 01:46:54 +03:00
|
|
|
uint16 fam, sty;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint16>(&fam);
|
|
|
|
link.Read<uint16>(&sty);
|
|
|
|
|
2005-02-06 01:46:54 +03:00
|
|
|
ServerFont font;
|
2005-06-08 08:01:59 +04:00
|
|
|
if (font.SetFamilyAndStyle(fam, sty) == B_OK) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint16>(font.Face());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-02-06 01:46:54 +03:00
|
|
|
break;
|
|
|
|
}
|
2005-01-17 05:05:50 +03:00
|
|
|
case AS_SET_FAMILY_AND_FACE:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_FAMILY_AND_FACE unimplmemented\n",
|
|
|
|
fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) font_family - name of font family to use
|
|
|
|
// 2) uint16 - font face
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
|
|
|
|
// TODO: Check R5 for error condition behavior in SET_FAMILY_AND_FACE
|
2005-06-08 08:01:59 +04:00
|
|
|
// ToDo: implement me!
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_COUNT_FONT_FAMILIES:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_COUNT_FONT_FAMILIES\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) int32 - # of font families
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
2005-06-24 07:31:41 +04:00
|
|
|
fLink.Attach<int32>(gFontServer->CountFamilies());
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.Flush();
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_COUNT_FONT_STYLES:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_COUNT_FONT_STYLES\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) font_family - name of font family
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) int32 - # of font styles
|
2005-01-17 23:08:40 +03:00
|
|
|
font_family fam;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read(fam,sizeof(font_family));
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontFamily *ffam = gFontServer->GetFamily(fam);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (ffam) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<int32>(ffam->CountStyles());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_SYSFONT_PLAIN:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_SYSFONT_PLAIN\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
// 3) float - size in points
|
|
|
|
// 4) uint16 - face flags
|
2005-01-17 23:08:40 +03:00
|
|
|
// 5) uint32 - font flags
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
ServerFont *sf = gFontServer->GetSystemPlain();
|
2005-06-08 08:01:59 +04:00
|
|
|
if (sf) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint16>(sf->FamilyID());
|
|
|
|
fLink.Attach<uint16>(sf->StyleID());
|
|
|
|
fLink.Attach<float>(sf->Size());
|
|
|
|
fLink.Attach<uint16>(sf->Face());
|
|
|
|
fLink.Attach<uint32>(sf->Flags());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 23:08:40 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_FONT_HEIGHT:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_FONT_HEIGHT\n", fSignature.String()));
|
2005-01-17 23:08:40 +03:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 family ID
|
|
|
|
// 2) uint16 style ID
|
|
|
|
// 3) float size
|
|
|
|
uint16 famid,styid;
|
|
|
|
float ptsize;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint16>(&famid);
|
|
|
|
link.Read<uint16>(&styid);
|
|
|
|
link.Read<float>(&ptsize);
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
FontStyle *fstyle = gFontServer->GetStyle(famid, styid);
|
2005-06-08 08:01:59 +04:00
|
|
|
if (fstyle) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<font_height>(fstyle->GetHeight(ptsize));
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_SYSFONT_BOLD:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_SYSFONT_BOLD\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
// 3) float - size in points
|
|
|
|
// 4) uint16 - face flags
|
2005-01-17 23:08:40 +03:00
|
|
|
// 5) uint32 - font flags
|
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
ServerFont *sf = gFontServer->GetSystemBold();
|
2005-06-08 08:01:59 +04:00
|
|
|
if (sf) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint16>(sf->FamilyID());
|
|
|
|
fLink.Attach<uint16>(sf->StyleID());
|
|
|
|
fLink.Attach<float>(sf->Size());
|
|
|
|
fLink.Attach<uint16>(sf->Face());
|
|
|
|
fLink.Attach<uint32>(sf->Flags());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_SYSFONT_FIXED:
|
|
|
|
{
|
2005-06-08 08:01:59 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_SYSFONT_FIXED\n", fSignature.String()));
|
2005-01-17 05:05:50 +03:00
|
|
|
// Returns:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
// 3) float - size in points
|
|
|
|
// 4) uint16 - face flags
|
2005-01-17 23:08:40 +03:00
|
|
|
// 5) uint32 - font flags
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Lock();
|
|
|
|
ServerFont *sf = gFontServer->GetSystemFixed();
|
2005-06-08 08:01:59 +04:00
|
|
|
if (sf) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint16>(sf->FamilyID());
|
|
|
|
fLink.Attach<uint16>(sf->StyleID());
|
|
|
|
fLink.Attach<float>(sf->Size());
|
|
|
|
fLink.Attach<uint16>(sf->Face());
|
|
|
|
fLink.Attach<uint32>(sf->Flags());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-24 07:31:41 +04:00
|
|
|
gFontServer->Unlock();
|
2005-01-17 05:05:50 +03:00
|
|
|
break;
|
|
|
|
}
|
2005-04-01 11:00:32 +04:00
|
|
|
case AS_GET_GLYPH_SHAPES:
|
|
|
|
{
|
2005-06-04 15:17:30 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_GLYPH_SHAPES\n", fSignature.String()));
|
2005-04-01 11:00:32 +04:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
// 3) float - point size
|
|
|
|
// 4) float - shear
|
|
|
|
// 5) float - rotation
|
|
|
|
// 6) uint32 - flags
|
|
|
|
// 7) int32 - numChars
|
|
|
|
// 8) char - chars (numChars times)
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-04-01 11:00:32 +04:00
|
|
|
// Returns:
|
2005-04-01 13:18:25 +04:00
|
|
|
// 1) BShape - glyph shape
|
2005-04-01 11:00:32 +04:00
|
|
|
// numChars times
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-04-01 11:00:32 +04:00
|
|
|
uint16 famid, styid;
|
|
|
|
uint32 flags;
|
|
|
|
float ptsize, shear, rotation;
|
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint16>(&famid);
|
|
|
|
link.Read<uint16>(&styid);
|
|
|
|
link.Read<float>(&ptsize);
|
|
|
|
link.Read<float>(&shear);
|
|
|
|
link.Read<float>(&rotation);
|
|
|
|
link.Read<uint32>(&flags);
|
2005-04-01 11:00:32 +04:00
|
|
|
|
|
|
|
int32 numChars;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<int32>(&numChars);
|
2005-04-01 11:00:32 +04:00
|
|
|
|
|
|
|
char charArray[numChars];
|
|
|
|
for (int32 i = 0; i < numChars; i++)
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<char>(&charArray[i]);
|
2005-04-01 11:00:32 +04:00
|
|
|
|
|
|
|
ServerFont font;
|
|
|
|
if (font.SetFamilyAndStyle(famid, styid) == B_OK) {
|
|
|
|
font.SetSize(ptsize);
|
|
|
|
font.SetShear(shear);
|
|
|
|
font.SetRotation(rotation);
|
|
|
|
font.SetFlags(flags);
|
|
|
|
|
|
|
|
BShape **shapes = font.GetGlyphShapes(charArray, numChars);
|
|
|
|
if (shapes) {
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
2005-04-01 13:18:25 +04:00
|
|
|
for (int32 i = 0; i < numChars; i++) {
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.AttachShape(*shapes[i]);
|
2005-04-01 13:18:25 +04:00
|
|
|
delete shapes[i];
|
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-04-01 13:18:25 +04:00
|
|
|
delete shapes;
|
2005-06-08 08:01:59 +04:00
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-04-01 13:18:25 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_GET_ESCAPEMENTS:
|
|
|
|
{
|
2005-06-04 15:17:30 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_ESCAPEMENTS\n", fSignature.String()));
|
2005-04-01 13:18:25 +04:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
// 3) float - point size
|
|
|
|
// 4) float - rotation
|
|
|
|
// 5) uint32 - flags
|
|
|
|
// 6) int32 - numChars
|
|
|
|
// 7) char - char -\ both
|
|
|
|
// 8) BPoint - offset -/ (numChars times)
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-04-01 13:18:25 +04:00
|
|
|
// Returns:
|
|
|
|
// 1) BPoint - escapement
|
|
|
|
// numChars times
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-04-01 13:18:25 +04:00
|
|
|
uint16 famid, styid;
|
|
|
|
uint32 flags;
|
|
|
|
float ptsize, rotation;
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
link.Read<uint16>(&famid);
|
|
|
|
link.Read<uint16>(&styid);
|
|
|
|
link.Read<float>(&ptsize);
|
|
|
|
link.Read<float>(&rotation);
|
|
|
|
link.Read<uint32>(&flags);
|
|
|
|
|
2005-04-01 13:18:25 +04:00
|
|
|
int32 numChars;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<int32>(&numChars);
|
|
|
|
|
2005-04-01 13:18:25 +04:00
|
|
|
char charArray[numChars];
|
|
|
|
BPoint offsetArray[numChars];
|
|
|
|
for (int32 i = 0; i < numChars; i++) {
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<char>(&charArray[i]);
|
|
|
|
link.Read<BPoint>(&offsetArray[i]);
|
2005-04-01 13:18:25 +04:00
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-04-01 13:18:25 +04:00
|
|
|
ServerFont font;
|
|
|
|
if (font.SetFamilyAndStyle(famid, styid) == B_OK) {
|
|
|
|
font.SetSize(ptsize);
|
|
|
|
font.SetRotation(rotation);
|
|
|
|
font.SetFlags(flags);
|
|
|
|
|
|
|
|
BPoint *esc = font.GetEscapements(charArray, numChars, offsetArray);
|
|
|
|
if (esc) {
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
2005-04-01 13:18:25 +04:00
|
|
|
for (int32 i = 0; i < numChars; i++) {
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.Attach<BPoint>(esc[i]);
|
2005-04-01 13:18:25 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
delete esc;
|
2005-06-08 08:01:59 +04:00
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-04-01 11:00:32 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-05-07 21:11:30 +04:00
|
|
|
case AS_GET_ESCAPEMENTS_AS_FLOATS:
|
|
|
|
{
|
2005-06-04 15:17:30 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_ESCAPEMENTS_AS_FLOATS\n", fSignature.String()));
|
2005-05-07 21:11:30 +04:00
|
|
|
// Attached Data:
|
|
|
|
// 1) uint16 - family ID
|
|
|
|
// 2) uint16 - style ID
|
|
|
|
// 3) float - point size
|
|
|
|
// 4) float - rotation
|
|
|
|
// 5) uint32 - flags
|
2005-05-12 19:09:30 +04:00
|
|
|
|
|
|
|
// 6) float - additional "nonspace" delta
|
|
|
|
// 7) float - additional "space" delta
|
|
|
|
|
|
|
|
// 8) int32 - numChars
|
|
|
|
// 9) int32 - numBytes
|
|
|
|
// 10) char - the char buffer with size numBytes
|
|
|
|
|
2005-05-07 21:11:30 +04:00
|
|
|
// Returns:
|
2005-05-12 19:09:30 +04:00
|
|
|
// 1) float - escapement buffer with numChar entries
|
2005-05-07 21:11:30 +04:00
|
|
|
|
|
|
|
uint16 famid, styid;
|
|
|
|
uint32 flags;
|
|
|
|
float ptsize, rotation;
|
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint16>(&famid);
|
|
|
|
link.Read<uint16>(&styid);
|
|
|
|
link.Read<float>(&ptsize);
|
|
|
|
link.Read<float>(&rotation);
|
|
|
|
link.Read<uint32>(&flags);
|
2005-05-12 19:09:30 +04:00
|
|
|
|
|
|
|
escapement_delta delta;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<float>(&delta.nonspace);
|
|
|
|
link.Read<float>(&delta.space);
|
2005-05-07 21:11:30 +04:00
|
|
|
|
|
|
|
int32 numChars;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<int32>(&numChars);
|
2005-05-12 19:09:30 +04:00
|
|
|
|
|
|
|
uint32 numBytes;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint32>(&numBytes);
|
2005-05-12 19:09:30 +04:00
|
|
|
|
|
|
|
char* charArray = new char[numBytes];
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read(charArray, numBytes);
|
2005-05-12 19:09:30 +04:00
|
|
|
|
|
|
|
float* escapements = new float[numChars];
|
|
|
|
// figure out escapements
|
|
|
|
|
|
|
|
ServerFont font;
|
|
|
|
bool success = false;
|
|
|
|
if (font.SetFamilyAndStyle(famid, styid) == B_OK) {
|
|
|
|
font.SetSize(ptsize);
|
|
|
|
font.SetRotation(rotation);
|
|
|
|
font.SetFlags(flags);
|
|
|
|
|
|
|
|
if (font.GetEscapements(charArray, numChars, escapements, delta)) {
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach(escapements, numChars * sizeof(float));
|
2005-05-12 19:09:30 +04:00
|
|
|
success = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
delete[] charArray;
|
|
|
|
delete[] escapements;
|
|
|
|
|
|
|
|
if (!success)
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
2005-05-12 19:09:30 +04:00
|
|
|
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.Flush();
|
2005-05-07 21:11:30 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-04-30 11:04:27 +04:00
|
|
|
case AS_SCREEN_GET_MODE:
|
|
|
|
{
|
2005-06-04 15:17:30 +04:00
|
|
|
STRACE(("ServerApp %s: AS_SCREEN_GET_MODE\n", fSignature.String()));
|
2005-04-30 11:04:27 +04:00
|
|
|
// Attached data
|
|
|
|
// 1) int32 port to reply to
|
|
|
|
// 2) screen_id
|
|
|
|
// 3) workspace index
|
|
|
|
screen_id id;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<screen_id>(&id);
|
2005-04-30 11:04:27 +04:00
|
|
|
uint32 workspace;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint32>(&workspace);
|
|
|
|
|
2005-04-30 11:04:27 +04:00
|
|
|
// TODO: the display_mode can be different between
|
|
|
|
// the various screens.
|
|
|
|
// We have the screen_id and the workspace number, with these
|
|
|
|
// we need to find the corresponding "driver", and call getmode on it
|
|
|
|
display_mode mode;
|
2005-06-24 03:46:17 +04:00
|
|
|
gDesktop->ScreenAt(0)->GetMode(&mode);
|
2005-04-30 11:04:27 +04:00
|
|
|
// actually this isn't still enough as different workspaces can
|
|
|
|
// have different display_modes
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<display_mode>(mode);
|
|
|
|
fLink.Attach<status_t>(B_OK);
|
|
|
|
fLink.Flush();
|
2005-04-30 11:04:27 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-05-01 10:26:49 +04:00
|
|
|
case AS_SCREEN_SET_MODE:
|
|
|
|
{
|
2005-06-04 15:17:30 +04:00
|
|
|
STRACE(("ServerApp %s: AS_SCREEN_SET_MODE\n", fSignature.String()));
|
2005-05-01 10:26:49 +04:00
|
|
|
// Attached data
|
|
|
|
// 1) int32 port to reply to
|
|
|
|
// 2) screen_id
|
|
|
|
// 3) workspace index
|
|
|
|
// 4) display_mode to set
|
2005-05-05 11:38:39 +04:00
|
|
|
// 5) 'makedefault' boolean
|
|
|
|
// TODO: See above: workspaces support, etc.
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-05-01 10:26:49 +04:00
|
|
|
screen_id id;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
2005-05-01 10:26:49 +04:00
|
|
|
uint32 workspace;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<uint32>(&workspace);
|
|
|
|
|
2005-05-01 10:26:49 +04:00
|
|
|
display_mode mode;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<display_mode>(&mode);
|
|
|
|
|
2005-05-01 10:26:49 +04:00
|
|
|
bool makedefault = false;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<bool>(&makedefault);
|
|
|
|
|
2005-06-24 03:46:17 +04:00
|
|
|
// TODO: lock RootLayer, set mode and tell it to update it's frame and all clipping
|
|
|
|
// optionally put this into a message and let the root layer thread handle it.
|
|
|
|
// status_t ret = gDesktop->ScreenAt(0)->SetMode(mode);
|
2005-06-24 04:14:19 +04:00
|
|
|
status_t ret = B_ERROR;
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
2005-06-24 03:46:17 +04:00
|
|
|
fLink.Attach<status_t>(ret);
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.Flush();
|
2005-05-01 10:26:49 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-22 22:14:13 +04:00
|
|
|
case AS_GET_MODE_LIST:
|
|
|
|
{
|
|
|
|
display_mode* modeList;
|
|
|
|
uint32 count;
|
2005-06-24 03:46:17 +04:00
|
|
|
if (gDesktop->GetHWInterface()->GetModeList(&modeList, &count) == B_OK) {
|
2005-06-22 22:14:13 +04:00
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint32>(count);
|
|
|
|
fLink.Attach(modeList, sizeof(display_mode) * count);
|
|
|
|
|
|
|
|
delete[] modeList;
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-06-08 01:32:24 +04:00
|
|
|
case AS_SCREEN_GET_COLORMAP:
|
|
|
|
{
|
|
|
|
STRACE(("ServerApp %s: AS_SCREEN_GET_COLORMAP\n", fSignature.String()));
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-08 01:32:24 +04:00
|
|
|
screen_id id;
|
2005-06-08 08:01:59 +04:00
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
2005-06-09 08:36:00 +04:00
|
|
|
fLink.Attach<color_map>(*SystemColorMap());
|
2005-06-08 08:01:59 +04:00
|
|
|
fLink.Flush();
|
2005-06-08 01:32:24 +04:00
|
|
|
break;
|
|
|
|
}
|
2005-06-08 08:01:59 +04:00
|
|
|
|
2005-06-08 17:24:40 +04:00
|
|
|
case AS_GET_DESKTOP_COLOR:
|
|
|
|
{
|
|
|
|
STRACE(("ServerApp %s: get desktop color\n", fSignature.String()));
|
|
|
|
|
|
|
|
int32 workspaceIndex = 0;
|
|
|
|
link.Read<int32>(&workspaceIndex);
|
|
|
|
|
|
|
|
// ToDo: for some reason, we currently get "1" as no. of workspace
|
|
|
|
workspaceIndex = 0;
|
|
|
|
|
|
|
|
// ToDo: locking is probably wrong - why the hell is there no (safe)
|
|
|
|
// way to get to the workspace object directly?
|
|
|
|
RootLayer *root = gDesktop->ActiveRootLayer();
|
|
|
|
root->Lock();
|
|
|
|
|
|
|
|
Workspace *workspace = root->WorkspaceAt(workspaceIndex);
|
|
|
|
if (workspace != NULL) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
//rgb_color color;
|
|
|
|
fLink.Attach<rgb_color>(workspace->BGColor().GetColor32());
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
|
|
|
root->Unlock();
|
|
|
|
break;
|
|
|
|
}
|
2005-06-24 22:02:01 +04:00
|
|
|
|
|
|
|
case AS_GET_ACCELERANT_INFO:
|
|
|
|
{
|
|
|
|
STRACE(("ServerApp %s: get accelerant info\n", fSignature.String()));
|
|
|
|
|
|
|
|
// We aren't using the screen_id for now...
|
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
|
|
|
accelerant_device_info accelerantInfo;
|
|
|
|
// TODO: I wonder if there should be a "desktop" lock...
|
|
|
|
if (gDesktop->GetHWInterface()->GetDeviceInfo(&accelerantInfo) == B_OK) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<accelerant_device_info>(accelerantInfo);
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case AS_GET_RETRACE_SEMAPHORE:
|
|
|
|
{
|
|
|
|
STRACE(("ServerApp %s: get retrace semaphore\n", fSignature.String()));
|
|
|
|
|
|
|
|
// We aren't using the screen_id for now...
|
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
|
|
|
sem_id semaphore = gDesktop->GetHWInterface()->RetraceSemaphore();
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<sem_id>(semaphore);
|
|
|
|
fLink.Flush();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2005-06-14 02:11:29 +04:00
|
|
|
|
2003-01-24 17:36:15 +03:00
|
|
|
default:
|
2005-06-08 08:01:59 +04:00
|
|
|
printf("ServerApp %s received unhandled message code offset %s\n",
|
|
|
|
fSignature.String(), MsgCodeToBString(code).String());
|
|
|
|
|
|
|
|
if (link.NeedsReply()) {
|
|
|
|
// the client is now blocking and waiting for a reply!
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
fLink.Flush();
|
|
|
|
} else
|
|
|
|
puts("message doesn't need a reply!");
|
2003-01-24 17:36:15 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2003-03-12 17:29:59 +03:00
|
|
|
|
2005-05-14 17:22:26 +04:00
|
|
|
|
2005-06-23 22:48:10 +04:00
|
|
|
void
|
|
|
|
ServerApp::RemoveWindow(ServerWindow* window)
|
|
|
|
{
|
|
|
|
BAutolock locker(fWindowListLock);
|
|
|
|
|
|
|
|
fWindowList.RemoveItem(window);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-05-14 17:22:26 +04:00
|
|
|
int32
|
|
|
|
ServerApp::CountBitmaps() const
|
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
return fBitmapList.CountItems();
|
2005-05-14 17:22:26 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
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
|
|
|
|
*/
|
2005-05-08 10:06:55 +04:00
|
|
|
ServerBitmap *
|
|
|
|
ServerApp::FindBitmap(int32 token) const
|
2003-03-12 17:29:59 +03:00
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
for (int32 i = 0; i < fBitmapList.CountItems(); i++) {
|
|
|
|
ServerBitmap *bitmap = static_cast<ServerBitmap *>(fBitmapList.ItemAt(i));
|
2005-05-08 10:06:55 +04:00
|
|
|
if (bitmap && bitmap->Token() == token)
|
|
|
|
return bitmap;
|
2003-03-12 17:29:59 +03:00
|
|
|
}
|
2005-06-23 21:40:35 +04:00
|
|
|
|
2003-03-12 17:29:59 +03:00
|
|
|
return NULL;
|
|
|
|
}
|
2003-09-17 23:28:31 +04:00
|
|
|
|
2005-05-07 19:56:15 +04:00
|
|
|
|
2005-05-14 17:22:26 +04:00
|
|
|
int32
|
|
|
|
ServerApp::CountPictures() const
|
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
return fPictureList.CountItems();
|
2005-05-14 17:22:26 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ServerPicture *
|
|
|
|
ServerApp::FindPicture(int32 token) const
|
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
for (int32 i = 0; i < fPictureList.CountItems(); i++) {
|
|
|
|
ServerPicture *picture = static_cast<ServerPicture *>(fPictureList.ItemAt(i));
|
2005-05-14 17:22:26 +04:00
|
|
|
if (picture && picture->GetToken() == token)
|
|
|
|
return picture;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-05-07 19:56:15 +04:00
|
|
|
team_id
|
2005-06-23 21:40:35 +04:00
|
|
|
ServerApp::ClientTeam() const
|
2004-01-20 01:18:37 +03:00
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
return fClientTeam;
|
2004-01-13 03:56:36 +03:00
|
|
|
}
|
2004-07-30 19:16:59 +04:00
|
|
|
|
2005-05-07 19:56:15 +04:00
|
|
|
|
|
|
|
thread_id
|
2005-06-23 21:40:35 +04:00
|
|
|
ServerApp::Thread() const
|
2005-05-07 19:56:15 +04:00
|
|
|
{
|
2005-06-23 21:40:35 +04:00
|
|
|
return fThread;
|
2005-05-07 19:56:15 +04:00
|
|
|
}
|
|
|
|
|