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"
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
#include "OffscreenServerWindow.h"
|
2004-10-14 05:23:00 +04:00
|
|
|
#include "RAMLinkMsgReader.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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s:\n", Signature()));
|
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)
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("*ServerApp %s:~ServerApp()\n", Signature()));
|
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
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
#if __HAIKU__
|
2005-06-24 03:21:10 +04:00
|
|
|
syslog(LOG_ERR, "ServerApp %s needs to kill some server windows...\n", Signature());
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
#else
|
|
|
|
fprintf(stderr, "ServerApp %s needs to kill some server windows...\n", Signature());
|
|
|
|
#endif
|
2005-06-24 03:21:10 +04:00
|
|
|
|
|
|
|
// 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++) {
|
2005-07-01 12:10:42 +04:00
|
|
|
gBitmapManager->DeleteBitmap(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++) {
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
delete (ServerPicture*)fPictureList.ItemAt(i);
|
2005-06-08 08:01:59 +04:00
|
|
|
}
|
2003-03-21 18:49:28 +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
|
2005-07-01 14:09:11 +04:00
|
|
|
ServerApp::Quit(sem_id shutdownSemaphore)
|
2005-06-23 21:40:35 +04:00
|
|
|
{
|
|
|
|
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
|
|
|
|
2005-07-01 14:09:11 +04:00
|
|
|
send_data(fThread, 'QUIT', &shutdownSemaphore, sizeof(sem_id));
|
2005-06-23 21:40:35 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
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-07-01 12:48:51 +04:00
|
|
|
// ToDo: this function doesn't make any sense; if the client dies we are
|
|
|
|
// aware of it anyway at this point. This would only make sense if we
|
|
|
|
// actually send the team a message to see if it's still responsive.
|
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
|
2005-07-01 12:48:51 +04:00
|
|
|
printf("PANIC: ServerApp: '%s': can't flatten message in 'SendMessageToClient()'\n", Signature());
|
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:
|
|
|
|
{
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
// Create a ServerWindow
|
|
|
|
// NOTE/TODO: Code duplication in part to below case.
|
|
|
|
// Watch out, if you make changes here, you might have to do them below.
|
|
|
|
// Go ahead and fix if you have an idea for unification...
|
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
|
|
|
|
2005-06-27 06:06:15 +04:00
|
|
|
if (!frame.IsValid()) {
|
|
|
|
// make sure we pass a valid rectangle to ServerWindow
|
|
|
|
frame.right = frame.left + 1;
|
|
|
|
frame.bottom = frame.top + 1;
|
|
|
|
}
|
|
|
|
|
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,
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
looperPort, token);
|
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));
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
|
|
|
|
// NOTE: the reply to the client is handled in window->Run()
|
|
|
|
if (window->Init(frame, look, feel, flags, workspaces) >= B_OK && window->Run()) {
|
2005-06-24 02:43:11 +04:00
|
|
|
// 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;
|
|
|
|
}
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
case AS_CREATE_OFFSCREEN_WINDOW:
|
|
|
|
{
|
|
|
|
// Create an OffscreenServerWindow
|
|
|
|
// NOTE/TODO: Code duplication in part to above case.
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
int32 bitmapToken;
|
|
|
|
uint32 look;
|
|
|
|
uint32 feel;
|
|
|
|
uint32 flags;
|
|
|
|
uint32 workspaces;
|
|
|
|
int32 token = B_NULL_TOKEN;
|
|
|
|
port_id clientReplyPort = -1;
|
|
|
|
port_id looperPort = -1;
|
|
|
|
char *title = NULL;
|
|
|
|
|
|
|
|
receiver.Read<int32>(&bitmapToken);
|
|
|
|
receiver.Read<BRect>(&frame);
|
|
|
|
receiver.Read<uint32>(&look);
|
|
|
|
receiver.Read<uint32>(&feel);
|
|
|
|
receiver.Read<uint32>(&flags);
|
|
|
|
receiver.Read<uint32>(&workspaces);
|
|
|
|
receiver.Read<int32>(&token);
|
|
|
|
receiver.Read<port_id>(&clientReplyPort);
|
|
|
|
receiver.Read<port_id>(&looperPort);
|
|
|
|
if (receiver.ReadString(&title) != B_OK)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (!frame.IsValid()) {
|
|
|
|
// make sure we pass a valid rectangle to ServerWindow
|
|
|
|
frame.right = frame.left + 1;
|
|
|
|
frame.bottom = frame.top + 1;
|
|
|
|
}
|
|
|
|
ServerBitmap* bitmap = FindBitmap(bitmapToken);
|
|
|
|
|
|
|
|
bool success = false;
|
|
|
|
|
|
|
|
if (bitmap) {
|
|
|
|
// ServerWindow constructor will reply with port_id of a newly created port
|
|
|
|
OffscreenServerWindow *window = new OffscreenServerWindow(title, this, clientReplyPort,
|
|
|
|
looperPort, token, bitmap);
|
|
|
|
|
|
|
|
// NOTE: the reply to the client is handled in window->Run()
|
|
|
|
success = window->Init(frame, look, feel, flags, workspaces) >= B_OK && window->Run();
|
|
|
|
|
|
|
|
// add the window to the list
|
|
|
|
if (success && fWindowListLock.Lock()) {
|
|
|
|
success = fWindowList.AddItem(window);
|
|
|
|
fWindowListLock.Unlock();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!success)
|
|
|
|
delete window;
|
|
|
|
}
|
|
|
|
if (!success) {
|
|
|
|
// window creation failed, we need to notify the client
|
|
|
|
BPrivate::LinkSender reply(clientReplyPort);
|
|
|
|
reply.StartMessage(SERVER_FALSE);
|
|
|
|
reply.Flush();
|
|
|
|
}
|
|
|
|
|
|
|
|
// We don't have to free the title, as it's owned by the ServerWindow now
|
|
|
|
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;
|
2005-07-01 14:09:11 +04:00
|
|
|
sem_id shutdownSemaphore;
|
|
|
|
receive_data(&sender, &shutdownSemaphore, sizeof(sem_id));
|
2005-06-23 21:40:35 +04:00
|
|
|
|
|
|
|
delete this;
|
2005-07-01 14:09:11 +04:00
|
|
|
|
|
|
|
if (shutdownSemaphore >= B_OK)
|
|
|
|
release_sem(shutdownSemaphore);
|
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) {
|
2005-07-05 22:14:24 +04:00
|
|
|
case AS_GET_WINDOW_LIST:
|
|
|
|
team_id team;
|
|
|
|
link.Read<team_id>(&team);
|
|
|
|
|
|
|
|
gDesktop->WriteWindowList(team, fLink.Sender());
|
|
|
|
break;
|
|
|
|
|
|
|
|
case AS_GET_WINDOW_INFO:
|
|
|
|
int32 serverToken;
|
|
|
|
link.Read<int32>(&serverToken);
|
|
|
|
|
|
|
|
gDesktop->WriteWindowInfo(serverToken, fLink.Sender());
|
|
|
|
break;
|
|
|
|
|
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
|
|
|
|
|
2005-07-01 12:48:51 +04:00
|
|
|
/* STRACE(("ServerApp %s: Received global UI color update notification\n", Signature()));
|
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
|
|
|
|
|
2005-07-01 12:48:51 +04:00
|
|
|
/* STRACE(("ServerApp %s: Received global font update notification\n", Signature()));
|
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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Received decorator update notification\n", Signature()));
|
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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Received BBitmap creation request\n", Signature()));
|
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,
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
bytesPerRow, screenID);
|
2005-06-08 08:01:59 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
STRACE(("ServerApp %s: Create Bitmap (%.1fx%.1f)\n",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature(), frame.Width(), frame.Height()));
|
2005-06-08 08:01:59 +04:00
|
|
|
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
if (bitmap && fBitmapList.AddItem((void*)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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: received BBitmap delete request\n", Signature()));
|
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);
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
if (bitmap && fBitmapList.RemoveItem((void*)bitmap)) {
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Deleting Bitmap %ld\n", Signature(), id));
|
2005-06-08 08:01:59 +04:00
|
|
|
|
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;
|
|
|
|
}
|
2005-07-01 12:48:51 +04:00
|
|
|
#if 0
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Create Picture unimplemented\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Delete Picture unimplemented\n", Signature()));
|
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
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Clone Picture unimplemented\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Download Picture unimplemented\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
#endif
|
2005-06-14 02:11:29 +04:00
|
|
|
case AS_CURRENT_WORKSPACE:
|
2003-01-24 17:36:15 +03:00
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: get current workspace\n", Signature()));
|
2005-06-14 02:11:29 +04:00
|
|
|
|
|
|
|
// 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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: activate workspace\n", Signature()));
|
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
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Show Cursor\n", Signature()));
|
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
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Hide Cursor\n", Signature()));
|
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
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Obscure Cursor\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Received IsCursorHidden request\n", Signature()));
|
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
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: SetCursor via cursor data\n", Signature()));
|
2004-01-20 01:18:37 +03:00
|
|
|
// 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);
|
2005-07-01 12:48:51 +04:00
|
|
|
fAppCursor->SetAppSignature(Signature());
|
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
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: SetCursor via BCursor\n", Signature()));
|
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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Create BCursor\n", Signature()));
|
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);
|
2005-07-01 12:48:51 +04:00
|
|
|
fAppCursor->SetAppSignature(Signature());
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Delete BCursor\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Get ScrollBar info\n", Signature()));
|
2005-06-08 08:01:59 +04:00
|
|
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Set ScrollBar info\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: query Focus Follow Mouse in use\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Set Focus Follows Mouse in use\n", Signature()));
|
2005-06-08 08:01:59 +04:00
|
|
|
// ToDo: implement me!
|
2003-07-10 21:48:04 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case AS_SET_MOUSE_MODE:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Set Focus Follows Mouse mode\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Get Focus Follows Mouse mode\n", Signature()));
|
2005-06-08 08:01:59 +04:00
|
|
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: Get UI color\n", Signature()));
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
2005-06-08 08:01:59 +04:00
|
|
|
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_FAMILY_NAME\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_STYLE_NAME\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_FAMILY_AND_STYLE\n", Signature()));
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_STRING_WIDTH\n", Signature()));
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_TUNED_COUNT\n", Signature()));
|
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-06-27 19:44:47 +04:00
|
|
|
uint16 famid, styid;
|
|
|
|
link.Read<uint16>(&famid);
|
|
|
|
link.Read<uint16>(&styid);
|
2005-06-08 08:01:59 +04:00
|
|
|
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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-06-27 19:44:47 +04:00
|
|
|
uint16 famid, styid;
|
|
|
|
link.Read<uint16>(&famid);
|
|
|
|
link.Read<uint16>(&styid);
|
2005-06-08 08:01:59 +04:00
|
|
|
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_FAMILY_NAME\n", Signature()));
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_COUNT_FONT_FAMILIES\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_COUNT_FONT_STYLES\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_SYSFONT_PLAIN\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_FONT_HEIGHT\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_SYSFONT_BOLD\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_SET_SYSFONT_FIXED\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_GLYPH_SHAPES\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_ESCAPEMENTS\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
FTRACE(("ServerApp %s: AS_GET_ESCAPEMENTS_AS_FLOATS\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: AS_SCREEN_GET_MODE\n", Signature()));
|
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-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: AS_SCREEN_SET_MODE\n", Signature()));
|
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-25 09:58:43 +04:00
|
|
|
case AS_PROPOSE_MODE:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: AS_PROPOSE_MODE\n", Signature()));
|
2005-06-25 09:58:43 +04:00
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
|
|
|
display_mode target, low, high;
|
|
|
|
link.Read<display_mode>(&target);
|
|
|
|
link.Read<display_mode>(&low);
|
|
|
|
link.Read<display_mode>(&high);
|
|
|
|
status_t status = gDesktop->GetHWInterface()->ProposeMode(&target, &low, &high);
|
|
|
|
// TODO: We always return SERVER_TRUE and put the real
|
|
|
|
// error code in the message. FIX this.
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<display_mode>(target);
|
|
|
|
fLink.Attach<status_t>(status);
|
|
|
|
fLink.Flush();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: AS_SCREEN_GET_COLORMAP\n", Signature()));
|
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);
|
2005-06-25 17:58:55 +04:00
|
|
|
|
|
|
|
const color_map *colorMap = SystemColorMap();
|
|
|
|
if (colorMap != NULL) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<color_map>(*colorMap);
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: get desktop color\n", Signature()));
|
2005-06-08 17:24:40 +04:00
|
|
|
|
|
|
|
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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: get accelerant info\n", Signature()));
|
2005-06-24 22:02:01 +04:00
|
|
|
|
|
|
|
// 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:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: get retrace semaphore\n", Signature()));
|
2005-06-24 22:02:01 +04:00
|
|
|
|
|
|
|
// 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-25 10:30:09 +04:00
|
|
|
|
|
|
|
case AS_GET_TIMING_CONSTRAINTS:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: get timing constraints\n", Signature()));
|
2005-06-25 10:30:09 +04:00
|
|
|
// We aren't using the screen_id for now...
|
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
display_timing_constraints constraints;
|
|
|
|
if (gDesktop->GetHWInterface()->GetTimingConstraints(&constraints) == B_OK) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<display_timing_constraints>(constraints);
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
2005-06-14 02:11:29 +04:00
|
|
|
|
2005-06-25 10:30:09 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case AS_GET_PIXEL_CLOCK_LIMITS:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: get pixel clock limits\n", Signature()));
|
2005-06-25 10:30:09 +04:00
|
|
|
// We aren't using the screen_id for now...
|
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
display_mode mode;
|
|
|
|
link.Read<display_mode>(&mode);
|
|
|
|
|
|
|
|
uint32 low, high;
|
|
|
|
if (gDesktop->GetHWInterface()->GetPixelClockLimits(&mode, &low, &high) == B_OK) {
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint32>(low);
|
|
|
|
fLink.Attach<uint32>(high);
|
|
|
|
} else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-06-25 17:53:48 +04:00
|
|
|
case AS_SET_DPMS:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: AS_SET_DPMS\n", Signature()));
|
2005-06-25 17:53:48 +04:00
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
|
|
|
uint32 mode;
|
|
|
|
link.Read<uint32>(&mode);
|
|
|
|
|
|
|
|
if (gDesktop->GetHWInterface()->SetDPMSMode(mode) == B_OK)
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
else
|
|
|
|
fLink.StartMessage(SERVER_FALSE);
|
|
|
|
|
|
|
|
fLink.Flush();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case AS_GET_DPMS_STATE:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: AS_GET_DPMS_STATE\n", Signature()));
|
2005-06-25 17:53:48 +04:00
|
|
|
|
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
|
|
|
uint32 state = gDesktop->GetHWInterface()->DPMSMode();
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint32>(state);
|
|
|
|
fLink.Flush();
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case AS_GET_DPMS_CAPABILITIES:
|
|
|
|
{
|
2005-07-01 12:48:51 +04:00
|
|
|
STRACE(("ServerApp %s: AS_GET_DPMS_CAPABILITIES\n", Signature()));
|
2005-06-25 17:53:48 +04:00
|
|
|
screen_id id;
|
|
|
|
link.Read<screen_id>(&id);
|
|
|
|
|
|
|
|
uint32 capabilities = gDesktop->GetHWInterface()->DPMSCapabilities();
|
|
|
|
fLink.StartMessage(SERVER_TRUE);
|
|
|
|
fLink.Attach<uint32>(capabilities);
|
|
|
|
fLink.Flush();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
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",
|
2005-07-01 12:48:51 +04:00
|
|
|
Signature(), MsgCodeToBString(code).String());
|
2005-06-08 08:01:59 +04:00
|
|
|
|
|
|
|
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
|
|
|
|
*/
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
ServerBitmap*
|
2005-05-08 10:06:55 +04:00
|
|
|
ServerApp::FindBitmap(int32 token) const
|
2003-03-12 17:29:59 +03:00
|
|
|
{
|
offscreen bitmaps work, tested on Haiku as well, supports all colorspaces that BBitmap::ImportBits() supports. It uses a fallback for non-B_RGB(A)32 bitmaps. Added support for B_SUB_PIXEL_PRECISION view flags, though it is a bit hacky, since I had to add it to LayerData, even though it is not a true part of stack data. Added Layer::SetFlags() to enforce code path and update fLayerData. Cleaned up DisplayDriverPainter and DisplayDriver API (changed some const BRect& rect to simply BRect rect in order to be able to reuse it in the code), moved Painter.h, the test environment only draws the changed part of the frame buffer again - this causes a lot less CPU overhead, Painter special cases stroke width of 1.0 to use square caps, which is similar to R5 implementation and removes a lot of problems with non-straight line drawing, ServerWindow uses the DisplayDriver from it's WinBorder instead of the one from the Desktop (needed for offscreen windows, which have their own DisplayDriverPainter), it also checks for GetRootLayer() == NULL, because offscreen layers are not attached to a RootLayer, there was a fix for scrolling which worked at least in the test environment, it is now defunced, because Adi moved _CopyBits to Layer... I need to reenable it later, LayerData has no more fEscapementDelta, also fixed fFontAliasing (which was thought to overriding the font flags, and now works as such again), Desktop initialises the menu_info and scroll_bar_info stuff, which makes ScrollBars work actually... hope I didn't forget something.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13448 a95241bf-73f2-0310-859d-f6bbb57e9c96
2005-07-05 20:17:16 +04:00
|
|
|
int32 count = fBitmapList.CountItems();
|
|
|
|
for (int32 i = 0; i < count; i++) {
|
|
|
|
ServerBitmap* bitmap = (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
|
|
|
}
|
|
|
|
|