/* * Copyright 2010, Haiku. * Distributed under the terms of the MIT License. * * Authors: * Clemens Zeidler */ #ifndef DESKTOP_LISTENER_H #define DESKTOP_LISTENER_H #include #include #include #include "Window.h" class BMessage; class Desktop; class Window; class DesktopListener : public DoublyLinkedListLinkImpl { public: virtual ~DesktopListener(); virtual int32 Identifier() = 0; virtual void ListenerRegistered(Desktop* desktop) = 0; virtual void ListenerUnregistered() = 0; virtual bool HandleMessage(Window* sender, BPrivate::LinkReceiver& link, BPrivate::LinkSender& reply) = 0; virtual void WindowAdded(Window* window) = 0; virtual void WindowRemoved(Window* window) = 0; virtual bool KeyPressed(uint32 what, int32 key, int32 modifiers) = 0; virtual void MouseEvent(BMessage* message) = 0; virtual void MouseDown(Window* window, BMessage* message, const BPoint& where) = 0; virtual void MouseUp(Window* window, BMessage* message, const BPoint& where) = 0; virtual void MouseMoved(Window* window, BMessage* message, const BPoint& where) = 0; virtual void WindowMoved(Window* window) = 0; virtual void WindowResized(Window* window) = 0; virtual void WindowActivated(Window* window) = 0; virtual void WindowSentBehind(Window* window, Window* behindOf) = 0; virtual void WindowWorkspacesChanged(Window* window, uint32 workspaces) = 0; virtual void WindowHidden(Window* window, bool fromMinimize) = 0; virtual void WindowMinimized(Window* window, bool minimize) = 0; virtual void WindowTabLocationChanged(Window* window, float location, bool isShifting) = 0; virtual void SizeLimitsChanged(Window* window, int32 minWidth, int32 maxWidth, int32 minHeight, int32 maxHeight) = 0; virtual void WindowLookChanged(Window* window, window_look look) = 0; virtual void WindowFeelChanged(Window* window, window_feel feel) = 0; virtual bool SetDecoratorSettings(Window* window, const BMessage& settings) = 0; virtual void GetDecoratorSettings(Window* window, BMessage& settings) = 0; }; typedef DoublyLinkedList DesktopListenerDLList; class DesktopObservable { public: DesktopObservable(); void RegisterListener(DesktopListener* listener, Desktop* desktop); void UnregisterListener(DesktopListener* listener); const DesktopListenerDLList& GetDesktopListenerList(); bool MessageForListener(Window* sender, BPrivate::LinkReceiver& link, BPrivate::LinkSender& reply); void NotifyWindowAdded(Window* window); void NotifyWindowRemoved(Window* window); bool NotifyKeyPressed(uint32 what, int32 key, int32 modifiers); void NotifyMouseEvent(BMessage* message); void NotifyMouseDown(Window* window, BMessage* message, const BPoint& where); void NotifyMouseUp(Window* window, BMessage* message, const BPoint& where); void NotifyMouseMoved(Window* window, BMessage* message, const BPoint& where); void NotifyWindowMoved(Window* window); void NotifyWindowResized(Window* window); void NotifyWindowActivated(Window* window); void NotifyWindowSentBehind(Window* window, Window* behindOf); void NotifyWindowWorkspacesChanged(Window* window, uint32 workspaces); void NotifyWindowHidden(Window* window, bool fromMinimize); void NotifyWindowMinimized(Window* window, bool minimize); void NotifyWindowTabLocationChanged(Window* window, float location, bool isShifting); void NotifySizeLimitsChanged(Window* window, int32 minWidth, int32 maxWidth, int32 minHeight, int32 maxHeight); void NotifyWindowLookChanged(Window* window, window_look look); void NotifyWindowFeelChanged(Window* window, window_feel feel); bool SetDecoratorSettings(Window* window, const BMessage& settings); void GetDecoratorSettings(Window* window, BMessage& settings); private: class InvokeGuard { public: InvokeGuard(bool& invoking); ~InvokeGuard(); private: bool& fInvoking; }; DesktopListenerDLList fDesktopListenerList; // prevent recursive invokes bool fWeAreInvoking; }; #endif