[haiku-commits] Change in haiku[master]: App Server: create a single global instance of DecorManager

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 15 Aug 2020 18:20:29 +0000

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: App Server: create a single global instance of DecorManager - Gerrit