root/src/servers/app/DesktopListener.h
/*
 * Copyright 2010, Haiku.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Clemens Zeidler <haiku@clemens-zeidler.de>
 */
#ifndef DESKTOP_LISTENER_H
#define DESKTOP_LISTENER_H


#include <util/DoublyLinkedList.h>

#include <Point.h>

#include <ServerLink.h>
#include "Window.h"


class BMessage;
class Desktop;
class Window;


class DesktopListener : public DoublyLinkedListLinkImpl<DesktopListener> {
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<DesktopListener> 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