⛏️ index : haiku.git

#ifndef TRAY_VIEW
#define TRAY_VIEW

#include <InterfaceDefs.h>
#include <TranslationKit.h>
#include <Deskbar.h>
#include <OS.h>


#include "common.h"
#include "settings.h"
#include <Roster.h>

//exported instantiator function
extern "C" _EXPORT BView* instantiate_deskbar_item(float maxWidth, float maxHeight);


//since we can't remove the view from the deskbar from within the same thread
//as tray view, a thread will be spawned and this function called. It removed
//TrayView from the Deskbar
status_t removeFromDeskbar(void *);

class _EXPORT TrayView;


/*********************************************
	class TrayView derived from BView

	The icon in the Deskbar tray, provides the fundamental
	user interface. Archivable, so it can be flattened and
	fired at the deskbar.

*********************************************/

class TrayView:public BView{
	private:

		BBitmap *_activeIcon, *_inactiveIcon;
		bool watching;

		void _init(void); //initialization common to all constructors

	public:
		AutoRaiseSettings *_settings;
		mode_mouse fNormalMM;
		volatile int32 current_window; // id
		bigtime_t raise_delay;
		volatile thread_id last_raiser_thread;
		team_id fDeskbarTeam;

		bigtime_t polling_delay;
		sem_id fPollerSem;
		thread_id poller_thread;

		TrayView(BRect frame);
		TrayView(BMessage *mdArchive);
		virtual ~TrayView();

		virtual status_t Archive(BMessage *data, bool deep = true) const;
		static TrayView *Instantiate(BMessage *data);

		virtual void Draw(BRect updateRect );
		virtual void AttachedToWindow();
		virtual void MouseDown(BPoint where);
		virtual void MessageReceived(BMessage* message);

		AutoRaiseSettings *Settings() const;
		void SetActive(bool);
};

int32 fronter(void *);
int32 poller(void *);

/*********************************************
	ConfigMenu derived from BPopUpMenu
	Provides the contextual left-click menu for the
	TrayView. Fires it's messages at the TrayView specified
	in it's constructor;
	Also, it's by default set to asynchronously destruct,
	so it's basically a fire & forget kinda fella.
*********************************************/

class ConfigMenu: public BPopUpMenu{
	private:

	public:
		ConfigMenu(TrayView *tv, bool useMag);
		virtual ~ConfigMenu();
};


#endif