#ifndef FRAME_H_
#define FRAME_H_

#include "geom.h"
#include "render/render.h"

struct _ObClient;

typedef enum
  {
    OB_FRAME_CONTEXT_NONE,
    OB_FRAME_CONTEXT_DESKTOP,
    OB_FRAME_CONTEXT_ROOT,
    OB_FRAME_CONTEXT_CLIENT,
    OB_FRAME_CONTEXT_TITLEBAR,
    OB_FRAME_CONTEXT_FRAME,
    OB_FRAME_CONTEXT_BLCORNER,
    OB_FRAME_CONTEXT_BRCORNER,
    OB_FRAME_CONTEXT_TLCORNER,
    OB_FRAME_CONTEXT_TRCORNER,
    OB_FRAME_CONTEXT_TOP,
    OB_FRAME_CONTEXT_BOTTOM,
    OB_FRAME_CONTEXT_LEFT,
    OB_FRAME_CONTEXT_RIGHT,
    OB_FRAME_CONTEXT_MAXIMIZE,
    OB_FRAME_CONTEXT_ALLDESKTOPS,
    OB_FRAME_CONTEXT_SHADE,
    OB_FRAME_CONTEXT_ICONIFY,
    OB_FRAME_CONTEXT_ICON,
    OB_FRAME_CONTEXT_CLOSE,
    /*! This is a special context, which occurs while dragging a window in
     a move/resize */
    OB_FRAME_CONTEXT_MOVE_RESIZE,
    OB_FRAME_NUM_CONTEXTS
  } ObFrameContext;

/*! The decorations the client window wants to be displayed on it */
typedef enum
  {
    OB_FRAME_DECOR_TITLEBAR = 1 << 0, /*!< Display a titlebar */
    OB_FRAME_DECOR_HANDLE = 1 << 1, /*!< Display a handle (bottom) */
    OB_FRAME_DECOR_GRIPS = 1 << 2, /*!< Display grips in the handle */
    OB_FRAME_DECOR_BORDER = 1 << 3, /*!< Display a border */
    OB_FRAME_DECOR_ICON = 1 << 4, /*!< Display the window's icon */
    OB_FRAME_DECOR_ICONIFY = 1 << 5, /*!< Display an iconify button */
    OB_FRAME_DECOR_MAXIMIZE = 1 << 6, /*!< Display a maximize button */
    /*! Display a button to toggle the window's placement on
     all desktops */
    OB_FRAME_DECOR_ALLDESKTOPS = 1 << 7,
    OB_FRAME_DECOR_SHADE = 1 << 8, /*!< Displays a shade button */
    OB_FRAME_DECOR_CLOSE = 1 << 9 /*!< Display a close button */
  } ObFrameDecorations;

struct _ObFrame
  {
    struct _ObClient *client;

    Window window; // public attributes

    Strut size; // public (read, write) size update ?
    Rect area; // public  (read, write) size_update ?
    gint bwidth; // public       /* border width */
    guint decorations; // public

    gboolean visible; // public (read only)

    gboolean max_horz;// public      /* when maxed some decorations are hidden */
    gboolean max_vert;// public      /* when maxed some decorations are hidden */

    gboolean max_press;// public (read, write)
    gboolean close_press;// public (read, write)
    gboolean desk_press;// public (read, write)
    gboolean shade_press;// public (read, write)
    gboolean iconify_press;// public (read, write)

    gboolean max_hover;// public (read, write)
    gboolean close_hover;// public (read, write)
    gboolean desk_hover;// public (read, write)
    gboolean shade_hover;// public (read, write)
    gboolean iconify_hover;// public (read, write)

    gint iconify_animation_going;// public

  };

typedef struct _ObFrame ObFrame;

#endif /*FRAME_H_*/
