#ifndef TERMINAL_ROSTER_H
#define TERMINAL_ROSTER_H
#include <Clipboard.h>
#include <Handler.h>
#include <Locker.h>
#include <ObjectList.h>
class TerminalRoster : private BHandler {
public:
class Listener;
public:
struct Info {
int32 id;
team_id team;
uint32 workspaces;
bool minimized;
public:
Info(int32 id, team_id team);
Info(const BMessage& archive);
status_t Archive(BMessage& archive) const;
bool operator==(const Info& other) const;
bool operator!=(const Info& other) const
{ return !(*this == other); }
};
public:
TerminalRoster();
bool Lock();
void Unlock();
status_t Register(team_id teamID, BLooper* looper);
void Unregister();
bool IsRegistered() const
{ return fOurInfo != NULL; }
int32 ID() const;
void SetWindowInfo(bool minimized,
uint32 workspaces);
int32 CountTerminals() const
{ return fInfos.CountItems(); }
const Info* TerminalAt(int32 index) const
{ return fInfos.ItemAt(index); }
void SetListener(Listener* listener)
{ fListener = listener; }
private:
virtual void MessageReceived(BMessage* message);
private:
typedef BObjectList<Info, true> InfoList;
private:
status_t _UpdateInfos(bool checkApps);
status_t _UpdateClipboard();
void _NotifyListener();
static int _CompareInfos(const Info* a, const Info* b);
static int _CompareIDInfo(const int32* id,
const Info* info);
bool _TeamIsRunning(team_id teamID);
private:
BLocker fLock;
BClipboard fClipboard;
InfoList fInfos;
Info* fOurInfo;
bigtime_t fLastCheckedTime;
Listener* fListener;
bool fInfosUpdated;
};
class TerminalRoster::Listener {
public:
virtual ~Listener();
virtual void TerminalInfosUpdated(TerminalRoster* roster)
= 0;
};
#endif