#ifndef _MANAGER_H_
#define _MANAGER_H_

#include "General.h"
#include "listmacro2.h"

void initAtoms();

class Client;
declarePList(ClientList, Client);

class WindowManager {
    friend class Border;
public:
    WindowManager();
    ~WindowManager();
    void fatal(const char *);
    Client *windowToClient(Window, Boolean create = False);
    Client *activeClient() {
        return m_activeClient;
    }
    Boolean raiseTransients(Client *);
    Time timestamp(Boolean reset);
    void clearFocus();
    void setActiveClient(Client *const c) {
        m_activeClient = c;
    }
    void addToHiddenList(Client *);
    void removeFromHiddenList(Client *);
    void skipInRevert(Client *, Client *);
    Display *display() {
        return m_display;
    }
    Window root() {
        return m_root;
    }
    Window rootProxy() {
        return root_proxy;
    }
    enum RootCursor {
        NormalCursor, DeleteCursor, DownCursor, RightCursor, DownrightCursor
    };
    void installCursor(RootCursor);
    void installCursorOnWindow(RootCursor, Window);
    void installColormap(Colormap);
    unsigned long allocateColour(char *, char *);
    void considerFocusChange(Client *, Window, Time timestamp);
    void stopConsideringFocus();
    int attemptGrab(Window, Window, int, int);
    void releaseGrab(XButtonEvent *);
    void eventExposure(XExposeEvent *);
    void updateClientList();
private:
    int loop();
    void release();
    Display *m_display;
    int m_screenNumber;
    Window m_root;
    Window root_proxy;
    Colormap m_defaultColormap;
    int m_minimumColormaps;
    Cursor m_cursor;
    Cursor m_xCursor;
    Cursor m_vCursor;
    Cursor m_hCursor;
    Cursor m_vhCursor;
    ClientList m_clients;
    ClientList m_hiddenClients;
    Client *m_activeClient;
    int m_shapeEvent;
    int m_currentTime;
    static Boolean m_looping;
    int m_returnCode;
    static Boolean m_initialising;
    static int errorHandler(Display *, XErrorEvent *);
    static void sigHandler();
    static int m_signalled;
    void initialiseScreen();
    void scanInitialWindows();
    void spawn();
    void circulate(Boolean activeFirst);
    Boolean m_focusChanging;
    Client *m_focusCandidate;
    Window  m_focusCandidateWindow;
    Time    m_focusTimestamp;
    Boolean m_focusPointerMoved;
    Boolean m_focusPointerNowStill;
    void checkDelaysForFocus();
    void nextEvent(XEvent *);
    void eventButton(XButtonEvent *);
    void eventMapRequest(XMapRequestEvent *);
    void eventConfigureRequest(XConfigureRequestEvent *);
    void eventUnmap(XUnmapEvent *);
    void eventCreate(XCreateWindowEvent *);
    void eventDestroy(XDestroyWindowEvent *);
    void eventClient(XClientMessageEvent *);
    void eventColormap(XColormapEvent *);
    void eventProperty(XPropertyEvent *);
    void eventEnter(XCrossingEvent *);
    void eventReparent(XReparentEvent *);
    void eventFocusIn(XFocusInEvent *);
    void eventFocusOut(XFocusOutEvent *);
};

#endif


syntax highlighted by Code2HTML, v. 0.9.1