From John Scipione <jscipione@xxxxxxxxx>:
John Scipione has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/3149 ;)
Change subject: App Server: create a single global instance of DecorManager
......................................................................
App Server: create a single global instance of DecorManager
... created in AppServer constructor, similar to BitmapManager.
Use ICompare to test against "Default" decorator case-insensitively.
Print error loading decorator on startup to syslog fixing a TODO.
---
M src/servers/app/AppServer.cpp
M src/servers/app/AppServer.h
M src/servers/app/Desktop.cpp
M src/servers/app/ServerApp.cpp
M src/servers/app/Window.cpp
M src/servers/app/decorator/DecorManager.cpp
M src/servers/app/decorator/DecorManager.h
7 files changed, 36 insertions(+), 25 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/49/3149/1
diff --git a/src/servers/app/AppServer.cpp b/src/servers/app/AppServer.cpp
index a0601ce..8add131 100644
--- a/src/servers/app/AppServer.cpp
+++ b/src/servers/app/AppServer.cpp
@@ -1,12 +1,13 @@
/*
- * Copyright 2001-2016, Haiku, Inc.
+ * Copyright 2001-2020 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT license.
*
* Authors:
* DarkWyrm <bpmagic@xxxxxxxxxxxxxxx>
* Axel Dörfler, axeld@xxxxxxxxxxxxxxxx
* Stephan Aßmus <superstippi@xxxxxx>
- * Christian Packmann
+ * Christian Packmann
+ * John Scipione <jscipione@xxxxxxxxx>
*/
@@ -18,6 +19,7 @@
#include <PortLink.h>
#include "BitmapManager.h"
+#include "DecorManager.h"
#include "Desktop.h"
#include "FontManager.h"
#include "InputManager.h"
@@ -69,6 +71,9 @@
// Create the bitmap allocator. Object declared in BitmapManager.cpp
gBitmapManager = new BitmapManager();
+ // Create the decor manager. Object declared in DecorManager.cpp
+ gDecorManager = new DecorManager();
+
#ifndef HAIKU_TARGET_PLATFORM_LIBBE_TEST
// TODO: check the attached displays, and launch login session for them
BMessage data;
@@ -84,6 +89,7 @@
*/
AppServer::~AppServer()
{
+ delete gDecorManager;
delete gBitmapManager;
gScreenManager->Lock();
diff --git a/src/servers/app/AppServer.h b/src/servers/app/AppServer.h
index e25beaa..3f5c22c 100644
--- a/src/servers/app/AppServer.h
+++ b/src/servers/app/AppServer.h
@@ -33,6 +33,7 @@
class ServerApp;
class BitmapManager;
+class DecorManager;
class Desktop;
@@ -58,7 +59,8 @@
};
-extern BitmapManager *gBitmapManager;
+extern BitmapManager* gBitmapManager;
+extern DecorManager* gDecorManager;
extern port_id gAppServerPort;
diff --git a/src/servers/app/Desktop.cpp b/src/servers/app/Desktop.cpp
index c2d4808..559cbee 100644
--- a/src/servers/app/Desktop.cpp
+++ b/src/servers/app/Desktop.cpp
@@ -457,7 +457,7 @@
RegisterListener(&fStackAndTile);
const DesktopListenerList& newListeners
- = gDecorManager.GetDesktopListeners();
+ = gDecorManager->GetDesktopListeners();
for (int i = 0; i < newListeners.CountItems(); i++)
RegisterListener(newListeners.ItemAt(i));
}
@@ -2184,7 +2184,7 @@
// register new listeners
const DesktopListenerList& newListeners
- = gDecorManager.GetDesktopListeners();
+ = gDecorManager->GetDesktopListeners();
for (int i = 0; i < newListeners.CountItems(); i++)
RegisterListener(newListeners.ItemAt(i));
diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp
index ec6fdec..b318b68 100644
--- a/src/servers/app/ServerApp.cpp
+++ b/src/servers/app/ServerApp.cpp
@@ -679,7 +679,7 @@
BString path;
link.ReadString(path);
- status_t error = gDecorManager.SetDecorator(path,
fDesktop);
+ status_t error = gDecorManager->SetDecorator(path,
fDesktop);
fLink.Attach<status_t>(error);
fLink.Flush();
@@ -692,7 +692,7 @@
case AS_GET_DECORATOR:
{
fLink.StartMessage(B_OK);
-
fLink.AttachString(gDecorManager.GetCurrentDecorator().String());
+
fLink.AttachString(gDecorManager->GetCurrentDecorator().String());
fLink.Flush();
break;
}
diff --git a/src/servers/app/Window.cpp b/src/servers/app/Window.cpp
index 8be0c8e..8e85c7c 100644
--- a/src/servers/app/Window.cpp
+++ b/src/servers/app/Window.cpp
@@ -140,7 +140,7 @@
}
}
if (fFeel != kOffscreenWindowFeel)
- fWindowBehaviour = gDecorManager.AllocateWindowBehaviour(this);
+ fWindowBehaviour = gDecorManager->AllocateWindowBehaviour(this);
// do we need to change our size to let the decorator fit?
// _ResizeBy() will adapt the frame for validity before resizing
@@ -179,7 +179,7 @@
delete fWindowBehaviour;
delete fDrawingEngine;
- gDecorManager.CleanupForWindow(this);
+ gDecorManager->CleanupForWindow(this);
}
@@ -595,7 +595,7 @@
if (fLook != B_NO_BORDER_WINDOW_LOOK) {
// we need a new decorator
- decorator = gDecorManager.AllocateDecorator(this);
+ decorator = gDecorManager->AllocateDecorator(this);
if (decorator == NULL)
return false;
@@ -613,7 +613,7 @@
} else
return true;
- windowBehaviour = gDecorManager.AllocateWindowBehaviour(this);
+ windowBehaviour = gDecorManager->AllocateWindowBehaviour(this);
if (windowBehaviour == NULL) {
delete decorator;
return false;
@@ -1205,7 +1205,7 @@
// 'prVu' == preview a decorator!
BString path;
if (settings.FindString("preview", &path) == B_OK)
- return gDecorManager.PreviewDecorator(path, this) ==
B_OK;
+ return gDecorManager->PreviewDecorator(path, this) ==
B_OK;
return false;
}
@@ -1272,7 +1272,7 @@
::Decorator* decorator = Decorator();
if (decorator == NULL && look != B_NO_BORDER_WINDOW_LOOK) {
// we need a new decorator
- decorator = gDecorManager.AllocateDecorator(this);
+ decorator = gDecorManager->AllocateDecorator(this);
fCurrentStack->SetDecorator(decorator);
if (IsFocus())
decorator->SetFocus(stackPosition, true);
@@ -2252,7 +2252,7 @@
fCurrentStack = NULL;
::Decorator* decorator = NULL;
if (fLook != B_NO_BORDER_WINDOW_LOOK)
- decorator = gDecorManager.AllocateDecorator(this);
+ decorator = gDecorManager->AllocateDecorator(this);
WindowStack* stack = new(std::nothrow) WindowStack(decorator);
if (stack == NULL)
diff --git a/src/servers/app/decorator/DecorManager.cpp
b/src/servers/app/decorator/DecorManager.cpp
index ef01bd6..df2377e 100644
--- a/src/servers/app/decorator/DecorManager.cpp
+++ b/src/servers/app/decorator/DecorManager.cpp
@@ -30,8 +30,9 @@
typedef float get_version(void);
typedef DecorAddOn* create_decor_addon(image_id id, const char* name);
-// Globals
-DecorManager gDecorManager;
+
+//! The one and only decor manager for the server, created by AppServer
+DecorManager* gDecorManager = NULL;
DecorAddOn::DecorAddOn(image_id id, const char* name)
@@ -260,8 +261,8 @@
return B_OK;
}
- // TODO: unloading the newDecor and its image
- // problem is we don't know how many windows failed... or why they
failed...
+ // TODO unloading the newDecor and its image the problem is we don't
+ // know how many windows failed... or why they failed...
syslog(LOG_WARNING,
"app_server:DecorManager:SetDecorator:\"%s\" *partly* failed\n",
fCurrentDecorPath.String());
@@ -273,21 +274,21 @@
DecorAddOn*
-DecorManager::_LoadDecor(BString _path, status_t& error )
+DecorManager::_LoadDecor(BString path, status_t& error)
{
- if (_path == "Default") {
+ if (path.ICompare("Default") == 0) {
error = B_OK;
return &fDefaultDecor;
}
- BEntry entry(_path.String(), true);
+ BEntry entry(path.String(), true);
if (!entry.Exists()) {
error = B_ENTRY_NOT_FOUND;
return NULL;
}
- BPath path(&entry);
- image_id image = load_add_on(path.Path());
+ BPath entryPath(&entry);
+ image_id image = load_add_on(entryPath.Path());
if (image < 0) {
error = B_BAD_IMAGE_ID;
return NULL;
@@ -343,7 +344,9 @@
fCurrentDecor = decor;
return true;
} else {
- //TODO: do something with the reported error
+ syslog(LOG_ERR,
"app_server:DecorManager:DecorManager:"
+ " failed to load \"%s\": %s",
itemPath.String(),
+ strerror(error));
}
}
}
diff --git a/src/servers/app/decorator/DecorManager.h
b/src/servers/app/decorator/DecorManager.h
index eeb8864..35ca04c 100644
--- a/src/servers/app/decorator/DecorManager.h
+++ b/src/servers/app/decorator/DecorManager.h
@@ -93,6 +93,6 @@
BString fCurrentDecorPath;
};
-extern DecorManager gDecorManager;
+extern DecorManager* gDecorManager;
#endif /* DECOR_MANAGER_H */
--
To view, visit https://review.haiku-os.org/c/haiku/+/3149
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: Ia826a0e48d69ade01e470729dfa9f3ec6ba77309
Gerrit-Change-Number: 3149
Gerrit-PatchSet: 1
Gerrit-Owner: John Scipione <jscipione@xxxxxxxxx>
Gerrit-MessageType: newchange