Moved the static stuff into a singleton.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34376 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -98,11 +98,6 @@ private:
|
||||
void _BuildDefaultPopUp();
|
||||
void _ShowPopUp(BView* target, BPoint where);
|
||||
|
||||
static bool sVisible;
|
||||
static bool sVisibleInitialized;
|
||||
static BLocker sLock;
|
||||
static BList sList;
|
||||
|
||||
enum relation {
|
||||
TARGET_UNKNOWN,
|
||||
TARGET_IS_CHILD,
|
||||
|
||||
@@ -11,11 +11,11 @@
|
||||
//! BDragger represents a replicant "handle".
|
||||
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <Alert.h>
|
||||
#include <Autolock.h>
|
||||
#include <Beep.h>
|
||||
#include <Bitmap.h>
|
||||
#include <Dragger.h>
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <Shelf.h>
|
||||
#include <Window.h>
|
||||
|
||||
#include <AutoLocker.h>
|
||||
|
||||
#include <AppServerLink.h>
|
||||
#include <DragTrackingFilter.h>
|
||||
#include <binary_compatibility/Interface.h>
|
||||
@@ -34,11 +36,6 @@
|
||||
#include "ZombieReplicantView.h"
|
||||
|
||||
|
||||
bool BDragger::sVisible;
|
||||
bool BDragger::sVisibleInitialized;
|
||||
BLocker BDragger::sLock("BDragger static");
|
||||
BList BDragger::sList;
|
||||
|
||||
const uint32 kMsgDragStarted = 'Drgs';
|
||||
|
||||
const unsigned char
|
||||
@@ -54,6 +51,58 @@ kHandBitmap[] = {
|
||||
};
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
struct DraggerManager {
|
||||
bool visible;
|
||||
bool visibleInitialized;
|
||||
BList list;
|
||||
|
||||
DraggerManager()
|
||||
:
|
||||
visible(false),
|
||||
visibleInitialized(false),
|
||||
fLock("BDragger static")
|
||||
{
|
||||
}
|
||||
|
||||
bool Lock()
|
||||
{
|
||||
return fLock.Lock();
|
||||
}
|
||||
|
||||
void Unlock()
|
||||
{
|
||||
fLock.Unlock();
|
||||
}
|
||||
|
||||
static DraggerManager* Default()
|
||||
{
|
||||
if (sDefaultInstance == NULL)
|
||||
pthread_once(&sDefaultInitOnce, &_InitSingleton);
|
||||
|
||||
return sDefaultInstance;
|
||||
}
|
||||
|
||||
private:
|
||||
static void _InitSingleton()
|
||||
{
|
||||
sDefaultInstance = new DraggerManager;
|
||||
}
|
||||
|
||||
private:
|
||||
BLocker fLock;
|
||||
|
||||
static pthread_once_t sDefaultInitOnce;
|
||||
static DraggerManager* sDefaultInstance;
|
||||
};
|
||||
|
||||
pthread_once_t DraggerManager::sDefaultInitOnce = PTHREAD_ONCE_INIT;
|
||||
DraggerManager* DraggerManager::sDefaultInstance = NULL;
|
||||
|
||||
} // unnamed namespace
|
||||
|
||||
|
||||
BDragger::BDragger(BRect bounds, BView *target, uint32 rmask, uint32 flags)
|
||||
: BView(bounds, "_dragger_", rmask, flags),
|
||||
fTarget(target),
|
||||
@@ -329,8 +378,10 @@ BDragger::ShowAllDraggers()
|
||||
|
||||
status_t status = link.Flush();
|
||||
if (status == B_OK) {
|
||||
sVisible = true;
|
||||
sVisibleInitialized = true;
|
||||
DraggerManager* manager = DraggerManager::Default();
|
||||
AutoLocker<DraggerManager> locker(manager);
|
||||
manager->visible = true;
|
||||
manager->visibleInitialized = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
@@ -346,8 +397,10 @@ BDragger::HideAllDraggers()
|
||||
|
||||
status_t status = link.Flush();
|
||||
if (status == B_OK) {
|
||||
sVisible = false;
|
||||
sVisibleInitialized = true;
|
||||
DraggerManager* manager = DraggerManager::Default();
|
||||
AutoLocker<DraggerManager> locker(manager);
|
||||
manager->visible = false;
|
||||
manager->visibleInitialized = true;
|
||||
}
|
||||
|
||||
return status;
|
||||
@@ -357,21 +410,22 @@ BDragger::HideAllDraggers()
|
||||
bool
|
||||
BDragger::AreDraggersDrawn()
|
||||
{
|
||||
BAutolock _(sLock);
|
||||
DraggerManager* manager = DraggerManager::Default();
|
||||
AutoLocker<DraggerManager> locker(manager);
|
||||
|
||||
if (!sVisibleInitialized) {
|
||||
if (!manager->visibleInitialized) {
|
||||
BPrivate::AppServerLink link;
|
||||
link.StartMessage(AS_GET_SHOW_ALL_DRAGGERS);
|
||||
|
||||
status_t status;
|
||||
if (link.FlushWithReply(status) == B_OK && status == B_OK) {
|
||||
link.Read<bool>(&sVisible);
|
||||
sVisibleInitialized = true;
|
||||
link.Read<bool>(&manager->visible);
|
||||
manager->visibleInitialized = true;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
return sVisible;
|
||||
return manager->visible;
|
||||
}
|
||||
|
||||
|
||||
@@ -547,13 +601,14 @@ BDragger::operator=(const BDragger &)
|
||||
/*static*/ void
|
||||
BDragger::_UpdateShowAllDraggers(bool visible)
|
||||
{
|
||||
BAutolock _(sLock);
|
||||
DraggerManager* manager = DraggerManager::Default();
|
||||
AutoLocker<DraggerManager> locker(manager);
|
||||
|
||||
sVisibleInitialized = true;
|
||||
sVisible = visible;
|
||||
manager->visibleInitialized = true;
|
||||
manager->visible = visible;
|
||||
|
||||
for (int32 i = sList.CountItems(); i-- > 0;) {
|
||||
BDragger* dragger = (BDragger*)sList.ItemAt(i);
|
||||
for (int32 i = manager->list.CountItems(); i-- > 0;) {
|
||||
BDragger* dragger = (BDragger*)manager->list.ItemAt(i);
|
||||
BMessenger target(dragger);
|
||||
target.SendMessage(_SHOW_DRAG_HANDLES_);
|
||||
}
|
||||
@@ -563,8 +618,9 @@ BDragger::_UpdateShowAllDraggers(bool visible)
|
||||
void
|
||||
BDragger::_AddToList()
|
||||
{
|
||||
BAutolock _(sLock);
|
||||
sList.AddItem(this);
|
||||
DraggerManager* manager = DraggerManager::Default();
|
||||
AutoLocker<DraggerManager> locker(manager);
|
||||
manager->list.AddItem(this);
|
||||
|
||||
bool allowsDragging = true;
|
||||
if (fShelf)
|
||||
@@ -583,8 +639,9 @@ BDragger::_AddToList()
|
||||
void
|
||||
BDragger::_RemoveFromList()
|
||||
{
|
||||
BAutolock _(sLock);
|
||||
sList.RemoveItem(this);
|
||||
DraggerManager* manager = DraggerManager::Default();
|
||||
AutoLocker<DraggerManager> locker(manager);
|
||||
manager->list.RemoveItem(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user