#define __frame_h
#include "geom.h"
-#include "render/render.h"
+#include "obrender/render.h"
typedef struct _ObFrame ObFrame;
/*! This is a special context, which occurs while dragging a window in
a move/resize */
OB_FRAME_CONTEXT_MOVE_RESIZE,
+ OB_FRAME_CONTEXT_DOCK,
OB_FRAME_NUM_CONTEXTS
} ObFrameContext;
+#define FRAME_CONTEXT(co, cl) ((cl && cl->type != OB_CLIENT_TYPE_DESKTOP) ? \
+ co == OB_FRAME_CONTEXT_FRAME : FALSE)
+#define CLIENT_CONTEXT(co, cl) ((cl && cl->type == OB_CLIENT_TYPE_DESKTOP) ? \
+ co == OB_FRAME_CONTEXT_DESKTOP : \
+ co == OB_FRAME_CONTEXT_CLIENT)
+
/*! The decorations the client window wants to be displayed on it */
typedef enum {
OB_FRAME_DECOR_TITLEBAR = 1 << 0, /*!< Display a titlebar */
/*! 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_SHADE = 1 << 8, /*!< Display a shade button */
OB_FRAME_DECOR_CLOSE = 1 << 9 /*!< Display a close button */
} ObFrameDecorations;
Window window;
- Strut size;
+ Strut size; /* the size of the frame */
+ Strut oldsize; /* the size of the frame last told to the client */
Rect area;
gboolean visible;
Window innertop; /*!< For drawing the inner client border */
Window innerright; /*!< For drawing the inner client border */
Window innerbottom; /*!< For drawing the inner client border */
+ Window innerblb;
+ Window innerbll;
+ Window innerbrb;
+ Window innerbrr;
Window backback; /*!< A colored window shown while resizing */
Window backfront; /*!< An undrawn-in window, to prevent flashing on
unmap */
Colormap colormap;
- RrAppearance *a_unfocused_title;
- RrAppearance *a_focused_title;
- RrAppearance *a_unfocused_label;
- RrAppearance *a_focused_label;
- RrAppearance *a_icon;
- RrAppearance *a_unfocused_handle;
- RrAppearance *a_focused_handle;
-
- GSList *clients;
-
gint icon_on; /* if the window icon button is on */
gint label_on; /* if the window title is on */
gint iconify_on; /* if the window iconify button is on */
gboolean iconify_hover;
gboolean focused;
+ gboolean need_render;
gboolean flashing;
gboolean flash_on;
GTimeVal flash_end;
+ guint flash_timer;
/*! Is the frame currently in an animation for iconify or restore.
0 means that it is not animating. > 0 means it is animating an iconify.
< 0 means it is animating a restore.
*/
gint iconify_animation_going;
+ guint iconify_animation_timer;
GTimeVal iconify_animation_end;
};
void frame_show(ObFrame *self);
void frame_hide(ObFrame *self);
void frame_adjust_theme(ObFrame *self);
+#ifdef SHAPE
+void frame_adjust_shape_kind(ObFrame *self, int kind);
+#endif
void frame_adjust_shape(ObFrame *self);
void frame_adjust_area(ObFrame *self, gboolean moved,
gboolean resized, gboolean fake);
ObFrameContext frame_context_from_string(const gchar *name);
+/*! Parses a ObFrameContext from a string of space-separated context names.
+ @names The list of context names, the first of which is removed from the
+ string.
+ @cx The ObFrameContext is returned here. If an invalid name is found, this
+ is set to OB_FRAME_CONTEXT_NONE.
+ @return TRUE if there was something to read in @names, FALSE if it was an
+ empty input.
+*/
+gboolean frame_next_context_from_string(gchar *names, ObFrameContext *cx);
+
ObFrameContext frame_context(struct _ObClient *self, Window win,
gint x, gint y);
be positioned.
@return The proper coordinates for the frame, based on the client.
*/
-void frame_client_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h);
+void frame_client_gravity(ObFrame *self, gint *x, gint *y);
/*! Reversly applies gravity to the frame's position to find where the client
should be positioned.
@return The proper coordinates for the client, based on the frame.
*/
-void frame_frame_gravity(ObFrame *self, gint *x, gint *y, gint w, gint h);
+void frame_frame_gravity(ObFrame *self, gint *x, gint *y);
/*! Convert a rectangle in client coordinates/sizes to what it would be
for the frame, given its current decorations sizes */
void frame_rect_to_frame(ObFrame *self, Rect *r);
+/*! Convert a rectangle in frame coordinates/sizes to what it would be for the
+ client, given its current decorations sizes */
+void frame_rect_to_client(ObFrame *self, Rect *r);
+
void frame_flash_start(ObFrame *self);
void frame_flash_stop(ObFrame *self);