app_server & libbe: Use server_read_only_memory for the colormap.

At present there's only ever one global one, so we don't bother using
an array for multiple screens (and we don't support multiple screens
yet anyway.)

This fixes a very old TODO, and avoids sending a ~32 KB port message
on every application startup.

Note that this breaks the app_server protocol ABI.
This commit is contained in:
Augustin Cavalier
2025-01-06 23:39:39 -05:00
parent 3aa371a285
commit 2b7da773ed
8 changed files with 17 additions and 64 deletions
-4
View File
@@ -162,7 +162,6 @@ enum {
AS_GET_PIXEL_CLOCK_LIMITS, AS_GET_PIXEL_CLOCK_LIMITS,
AS_GET_TIMING_CONSTRAINTS, AS_GET_TIMING_CONSTRAINTS,
AS_SCREEN_GET_COLORMAP,
AS_GET_DESKTOP_COLOR, AS_GET_DESKTOP_COLOR,
AS_SET_DESKTOP_COLOR, AS_SET_DESKTOP_COLOR,
AS_GET_SCREEN_ID_FROM_WINDOW, AS_GET_SCREEN_ID_FROM_WINDOW,
@@ -375,9 +374,6 @@ enum {
AS_VIEW_CLIP_TO_RECT, AS_VIEW_CLIP_TO_RECT,
AS_VIEW_CLIP_TO_SHAPE, AS_VIEW_CLIP_TO_SHAPE,
// Internal messages
AS_COLOR_MAP_UPDATED,
AS_LAST_CODE AS_LAST_CODE
}; };
@@ -21,6 +21,7 @@ static const int32 kColorWhichCount = kColorWhichLastContinuous + 3;
struct server_read_only_memory { struct server_read_only_memory {
color_map colormap;
rgb_color colors[kColorWhichCount]; rgb_color colors[kColorWhichCount];
}; };
@@ -107,10 +107,8 @@ private:
private: private:
int32 fID; int32 fID;
int32 fReferenceCount; int32 fReferenceCount;
color_map* fColorMap;
sem_id fRetraceSem; sem_id fRetraceSem;
bool fRetraceSemValid; bool fRetraceSemValid;
bool fOwnsColorMap;
BRect fFrame; BRect fFrame;
bigtime_t fLastUpdate; bigtime_t fLastUpdate;
}; };
+11 -34
View File
@@ -30,7 +30,9 @@
#include <AppMisc.h> #include <AppMisc.h>
#include <AppServerLink.h> #include <AppServerLink.h>
#include <ApplicationPrivate.h>
#include <ServerProtocol.h> #include <ServerProtocol.h>
#include <ServerReadOnlyMemory.h>
using namespace BPrivate; using namespace BPrivate;
@@ -295,8 +297,8 @@ BPrivateScreen::IndexForColor(uint8 red, uint8 green, uint8 blue, uint8 alpha)
return B_TRANSPARENT_8_BIT; return B_TRANSPARENT_8_BIT;
uint16 index = ((red & 0xf8) << 7) | ((green & 0xf8) << 2) | (blue >> 3); uint16 index = ((red & 0xf8) << 7) | ((green & 0xf8) << 2) | (blue >> 3);
if (ColorMap()) if (const color_map* colormap = ColorMap())
return fColorMap->index_map[index]; return colormap->index_map[index];
return 0; return 0;
} }
@@ -305,8 +307,8 @@ BPrivateScreen::IndexForColor(uint8 red, uint8 green, uint8 blue, uint8 alpha)
rgb_color rgb_color
BPrivateScreen::ColorForIndex(const uint8 index) BPrivateScreen::ColorForIndex(const uint8 index)
{ {
if (ColorMap()) if (const color_map* colormap = ColorMap())
return fColorMap->color_list[index]; return colormap->color_list[index];
return rgb_color(); return rgb_color();
} }
@@ -315,8 +317,8 @@ BPrivateScreen::ColorForIndex(const uint8 index)
uint8 uint8
BPrivateScreen::InvertIndex(uint8 index) BPrivateScreen::InvertIndex(uint8 index)
{ {
if (ColorMap()) if (const color_map* colormap = ColorMap())
return fColorMap->inversion_map[index]; return colormap->inversion_map[index];
return 0; return 0;
} }
@@ -325,31 +327,10 @@ BPrivateScreen::InvertIndex(uint8 index)
const color_map* const color_map*
BPrivateScreen::ColorMap() BPrivateScreen::ColorMap()
{ {
if (fColorMap == NULL) { if (be_app == NULL || BApplication::Private::ServerReadOnlyMemory() == NULL)
Screens* screens = Screens::Default(); return NULL;
AutoLocker<Screens> locker(screens);
if (fColorMap != NULL) { return &BApplication::Private::ServerReadOnlyMemory()->colormap;
// someone could have been faster than us
return fColorMap;
}
// TODO: BeOS R5 here gets the colormap pointer
// (with BApplication::ro_offset_to_ptr() ?)
// which is contained in a shared area created by the server.
BPrivate::AppServerLink link;
link.StartMessage(AS_SCREEN_GET_COLORMAP);
link.Attach<int32>(ID());
status_t status;
if (link.FlushWithReply(status) == B_OK && status == B_OK) {
fColorMap = (color_map*)malloc(sizeof(color_map));
fOwnsColorMap = true;
link.Read<color_map>(fColorMap);
}
}
return fColorMap;
} }
@@ -792,10 +773,8 @@ BPrivateScreen::BPrivateScreen(int32 id)
: :
fID(id), fID(id),
fReferenceCount(0), fReferenceCount(0),
fColorMap(NULL),
fRetraceSem(-1), fRetraceSem(-1),
fRetraceSemValid(false), fRetraceSemValid(false),
fOwnsColorMap(false),
fFrame(0, 0, 0, 0), fFrame(0, 0, 0, 0),
fLastUpdate(0) fLastUpdate(0)
{ {
@@ -804,6 +783,4 @@ BPrivateScreen::BPrivateScreen(int32 id)
BPrivateScreen::~BPrivateScreen() BPrivateScreen::~BPrivateScreen()
{ {
if (fOwnsColorMap)
free(fColorMap);
} }
+2 -1
View File
@@ -38,6 +38,7 @@
#include <PrivateScreen.h> #include <PrivateScreen.h>
#include <ServerProtocol.h> #include <ServerProtocol.h>
#include <ServerReadOnlyMemory.h>
#include <ViewPrivate.h> #include <ViewPrivate.h>
#include <WindowInfo.h> #include <WindowInfo.h>
@@ -494,7 +495,7 @@ Desktop::Init()
// desktop settings, since it is used there already // desktop settings, since it is used there already
InitializeColorMap(); InitializeColorMap();
const size_t areaSize = B_PAGE_SIZE; const size_t areaSize = sizeof(server_read_only_memory);
char name[B_OS_NAME_LENGTH]; char name[B_OS_NAME_LENGTH];
snprintf(name, sizeof(name), "d:%d:shared read only", fUserID); snprintf(name, sizeof(name), "d:%d:shared read only", fUserID);
fSharedReadOnlyArea = create_area(name, (void **)&fServerReadOnlyMemory, fSharedReadOnlyArea = create_area(name, (void **)&fServerReadOnlyMemory,
+3
View File
@@ -28,6 +28,7 @@
#include "GlobalFontManager.h" #include "GlobalFontManager.h"
#include "GlobalSubpixelSettings.h" #include "GlobalSubpixelSettings.h"
#include "ServerConfig.h" #include "ServerConfig.h"
#include "SystemPalette.h"
DesktopSettingsPrivate::DesktopSettingsPrivate(server_read_only_memory* shared) DesktopSettingsPrivate::DesktopSettingsPrivate(server_read_only_memory* shared)
@@ -79,6 +80,8 @@ DesktopSettingsPrivate::_SetDefaults()
fWorkspacesColumns = 2; fWorkspacesColumns = 2;
fWorkspacesRows = 2; fWorkspacesRows = 2;
memcpy((void*)&fShared.colormap, SystemColorMap(),
sizeof(color_map));
memcpy((void*)fShared.colors, BPrivate::kDefaultColors, memcpy((void*)fShared.colors, BPrivate::kDefaultColors,
sizeof(rgb_color) * kColorWhichCount); sizeof(rgb_color) * kColorWhichCount);
@@ -141,7 +141,6 @@ string_for_message_code(uint32 code)
CODE(AS_GET_PIXEL_CLOCK_LIMITS); CODE(AS_GET_PIXEL_CLOCK_LIMITS);
CODE(AS_GET_TIMING_CONSTRAINTS); CODE(AS_GET_TIMING_CONSTRAINTS);
CODE(AS_SCREEN_GET_COLORMAP);
CODE(AS_GET_DESKTOP_COLOR); CODE(AS_GET_DESKTOP_COLOR);
CODE(AS_SET_DESKTOP_COLOR); CODE(AS_SET_DESKTOP_COLOR);
CODE(AS_GET_SCREEN_ID_FROM_WINDOW); CODE(AS_GET_SCREEN_ID_FROM_WINDOW);
@@ -321,9 +320,6 @@ string_for_message_code(uint32 code)
CODE(AS_DIRECT_WINDOW_GET_SYNC_DATA); CODE(AS_DIRECT_WINDOW_GET_SYNC_DATA);
CODE(AS_DIRECT_WINDOW_SET_FULLSCREEN); CODE(AS_DIRECT_WINDOW_SET_FULLSCREEN);
// Internal messages
CODE(AS_COLOR_MAP_UPDATED);
default: default:
return "unknown code"; return "unknown code";
break; break;
-19
View File
@@ -65,7 +65,6 @@
#include "ServerPicture.h" #include "ServerPicture.h"
#include "ServerTokenSpace.h" #include "ServerTokenSpace.h"
#include "ServerWindow.h" #include "ServerWindow.h"
#include "SystemPalette.h"
#include "Window.h" #include "Window.h"
@@ -3175,24 +3174,6 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
break; break;
} }
case AS_SCREEN_GET_COLORMAP:
{
STRACE(("ServerApp %s: AS_SCREEN_GET_COLORMAP\n", Signature()));
int32 id;
link.Read<int32>(&id);
const color_map* colorMap = SystemColorMap();
if (colorMap != NULL) {
fLink.StartMessage(B_OK);
fLink.Attach<color_map>(*colorMap);
} else
fLink.StartMessage(B_ERROR);
fLink.Flush();
break;
}
case AS_GET_DESKTOP_COLOR: case AS_GET_DESKTOP_COLOR:
{ {
STRACE(("ServerApp %s: get desktop color\n", Signature())); STRACE(("ServerApp %s: get desktop color\n", Signature()));