* vim:ts=4:sw=4:expandtab
*
* i3 - an improved dynamic tiling window manager
- * © 2009-2010 Michael Stapelberg and contributors (see also: LICENSE)
+ * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE)
*
* include/data.h: This file defines all data structures used by i3
*
*/
-#include <xcb/xcb.h>
+#ifndef _DATA_H
+#define _DATA_H
+
+#define SN_API_NOT_YET_FROZEN 1
+#include <libsn/sn-launcher.h>
+
#include <xcb/randr.h>
#include <xcb/xcb_atom.h>
#include <stdbool.h>
+#include <pcre.h>
-#ifndef _DATA_H
-#define _DATA_H
#include "queue.h"
/*
*/
/* Forward definitions */
-typedef struct Font i3Font;
typedef struct Binding Binding;
typedef struct Rect Rect;
typedef struct xoutput Output;
typedef struct Con Con;
typedef struct Match Match;
+typedef struct Assignment Assignment;
typedef struct Window i3Window;
typedef enum { NO_ORIENTATION = 0, HORIZ, VERT } orientation_t;
typedef enum { BS_NORMAL = 0, BS_NONE = 1, BS_1PIXEL = 2 } border_style_t;
+/** parameter to specify whether tree_close() and x_window_kill() should kill
+ * only this specific window or the whole X11 client */
+typedef enum { DONT_KILL_WINDOW = 0, KILL_WINDOW = 1, KILL_CLIENT = 2 } kill_window_t;
+
enum {
BIND_NONE = 0,
BIND_SHIFT = XCB_MOD_MASK_SHIFT, /* (1 << 0) */
} __attribute__((packed));
/**
- * Used for the cache of colorpixels.
+ * Stores the reserved pixels on each screen edge read from a
+ * _NET_WM_STRUT_PARTIAL.
*
*/
-struct Colorpixel {
- uint32_t pixel;
- char *hex;
- SLIST_ENTRY(Colorpixel) colorpixels;
+struct reservedpx {
+ uint32_t left;
+ uint32_t right;
+ uint32_t top;
+ uint32_t bottom;
};
-struct Cached_Pixmap {
- xcb_pixmap_t id;
-
- /* We’re going to paint on it, so a graphics context will be needed */
- xcb_gcontext_t gc;
+/**
+ * Stores a width/height pair, used as part of deco_render_params to check
+ * whether the rects width/height have changed.
+ *
+ */
+struct width_height {
+ uint32_t w;
+ uint32_t h;
+};
- /* The rect with which the pixmap was created */
- Rect rect;
+/**
+ * Stores the parameters for rendering a window decoration. This structure is
+ * cached in every Con and no re-rendering will be done if the parameters have
+ * not changed (only the pixmaps will be copied).
+ *
+ */
+struct deco_render_params {
+ struct Colortriple *color;
+ int border_style;
+ struct width_height con_rect;
+ struct width_height con_window_rect;
+ Rect con_deco_rect;
+ uint32_t background;
+ bool con_is_leaf;
+};
- /* The rect of the object to which this pixmap belongs. Necessary to
- * find out when we need to re-create the pixmap. */
- Rect *referred_rect;
+/**
+ * Stores which workspace (by name) goes to which output.
+ *
+ */
+struct Workspace_Assignment {
+ char *name;
+ char *output;
- xcb_drawable_t referred_drawable;
+ TAILQ_ENTRY(Workspace_Assignment) ws_assignments;
};
struct Ignore_Event {
int sequence;
+ int response_type;
time_t added;
SLIST_ENTRY(Ignore_Event) ignore_events;
};
+/**
+ * Stores internal information about a startup sequence, like the workspace it
+ * was initiated on.
+ *
+ */
+struct Startup_Sequence {
+ /** startup ID for this sequence, generated by libstartup-notification */
+ char *id;
+ /** workspace on which this startup was initiated */
+ char *workspace;
+ /** libstartup-notification context for this launch */
+ SnLauncherContext *context;
+
+ TAILQ_ENTRY(Startup_Sequence) sequences;
+};
+
+/**
+ * Regular expression wrapper. It contains the pattern itself as a string (like
+ * ^foo[0-9]$) as well as a pointer to the compiled PCRE expression and the
+ * pcre_extra data returned by pcre_study().
+ *
+ * This makes it easier to have a useful logfile, including the matching or
+ * non-matching pattern.
+ *
+ */
+struct regex {
+ char *pattern;
+ pcre *regex;
+ pcre_extra *extra;
+};
+
/******************************************************************************
* Major types
*****************************************************************************/
};
/**
- * Holds a command specified by an exec-line in the config (see src/config.c)
+ * Holds a command specified by either an:
+ * - exec-line
+ * - exec_always-line
+ * in the config (see src/config.c)
*
*/
struct Autostart {
/** Command, like in command mode */
char *command;
+ /** no_startup_id flag for start_application(). Determines whether a
+ * startup notification context/ID should be created. */
+ bool no_startup_id;
TAILQ_ENTRY(Autostart) autostarts;
+ TAILQ_ENTRY(Autostart) autostarts_always;
};
-/**
- * Data structure for cached font information:
- * - font id in X11 (load it once)
- * - font height (multiple calls needed to get it)
- *
- */
-struct Font {
- /** The name of the font, that is what the pattern resolves to */
- char *name;
- /** A copy of the pattern to build a cache */
- char *pattern;
- /** The height of the font, built from font_ascent + font_descent */
- int height;
- /** The xcb-id for the font */
- xcb_font_t id;
-
- TAILQ_ENTRY(Font) fonts;
-};
-
-
/**
* An Output is a physical output on your graphics driver. Outputs which
* are currently in use have (output->active == true). Each output has a
* two stages) */
bool changed;
bool to_be_disabled;
+ bool primary;
/** x, y, width, height */
Rect rect;
-#if 0
- /** The bar window */
- xcb_window_t bar;
- xcb_gcontext_t bargc;
-
- /** Contains all clients with _NET_WM_WINDOW_TYPE ==
- * _NET_WM_WINDOW_TYPE_DOCK */
- SLIST_HEAD(dock_clients_head, Client) dock_clients;
-#endif
-
TAILQ_ENTRY(xoutput) outputs;
};
* application supports _NET_WM_NAME, in COMPOUND_TEXT otherwise). */
char *name_x;
+ /** The WM_WINDOW_ROLE of this window (for example, the pidgin buddy window
+ * sets "buddy list"). Useful to match specific windows in assignments or
+ * for_window. */
+ char *role;
+
+ /** Flag to force re-rendering the decoration upon changes */
+ bool name_x_changed;
+
/** The name of the window as used in JSON (in UTF-8 if the application
* supports _NET_WM_NAME, in COMPOUND_TEXT otherwise) */
char *name_json;
/** The length of the name in glyphs (not bytes) */
- int name_len;
+ size_t name_len;
/** Whether the application used _NET_WM_NAME */
bool uses_net_wm_name;
+ /** Whether the application needs to receive WM_TAKE_FOCUS */
+ bool needs_take_focus;
+
/** Whether the window says it is a dock window */
- bool dock;
+ enum { W_NODOCK = 0, W_DOCK_TOP = 1, W_DOCK_BOTTOM = 2 } dock;
+
+ /** Pixels the window reserves. left/right/top/bottom */
+ struct reservedpx reserved;
+
+ /** Pointers to the Assignments which were already ran for this Window
+ * (assignments run only once) */
+ uint32_t nr_assignments;
+ Assignment **ran_assignments;
};
struct Match {
- enum { M_WINDOW, M_CON } what;
-
- char *title;
- int title_len;
- char *application;
- char *class;
- char *instance;
- char *mark;
- int dock;
+ struct regex *title;
+ struct regex *application;
+ struct regex *class;
+ struct regex *instance;
+ struct regex *mark;
+ struct regex *role;
+ enum {
+ M_DONTCHECK = -1,
+ M_NODOCK = 0,
+ M_DOCK_ANY = 1,
+ M_DOCK_TOP = 2,
+ M_DOCK_BOTTOM = 3
+ } dock;
xcb_window_t id;
Con *con_id;
enum { M_ANY = 0, M_TILING, M_FLOATING } floating;
- enum { M_GLOBAL = 0, M_OUTPUT, M_WORKSPACE } levels;
-
- enum { M_USER = 0, M_RESTART } source;
-
- /* wo das fenster eingefügt werden soll. bei here wird es direkt
- * diesem Con zugewiesen, also layout saving. bei active ist es
- * ein assignment, welches an der momentan fokussierten stelle einfügt */
- enum { M_HERE = 0, M_ACTIVE } insert_where;
+ /* Where the window looking for a match should be inserted:
+ *
+ * M_HERE = the matched container will be replaced by the window
+ * (layout saving)
+ * M_ASSIGN_WS = the matched container will be inserted in the target_ws.
+ * M_BELOW = the window will be inserted as a child of the matched container
+ * (dockareas)
+ *
+ */
+ enum { M_HERE = 0, M_ASSIGN_WS, M_BELOW } insert_where;
TAILQ_ENTRY(Match) matches;
};
+/**
+ * An Assignment makes specific windows go to a specific workspace/output or
+ * run a command for that window. With this mechanism, the user can -- for
+ * example -- make specific windows floating or assign his browser to workspace
+ * "www". Checking if a window is assigned works by comparing the Match data
+ * structure with the window (see match_matches_window()).
+ *
+ */
+struct Assignment {
+ /** type of this assignment:
+ *
+ * A_COMMAND = run the specified command for the matching window
+ * A_TO_WORKSPACE = assign the matching window to the specified workspace
+ * A_TO_OUTPUT = assign the matching window to the specified output
+ *
+ * While the type is a bitmask, only one value can be set at a time. It is
+ * a bitmask to allow filtering for multiple types, for example in the
+ * assignment_for() function.
+ *
+ */
+ enum {
+ A_ANY = 0,
+ A_COMMAND = (1 << 0),
+ A_TO_WORKSPACE = (1 << 1),
+ A_TO_OUTPUT = (1 << 2)
+ } type;
+
+ /** the criteria to check if a window matches */
+ Match match;
+
+ /** destination workspace/output/command, depending on the type */
+ union {
+ char *command;
+ char *workspace;
+ char *output;
+ } dest;
+
+ TAILQ_ENTRY(Assignment) assignments;
+};
+
struct Con {
bool mapped;
- enum { CT_ROOT = 0, CT_OUTPUT = 1, CT_CON = 2, CT_FLOATING_CON = 3, CT_WORKSPACE = 4 } type;
+ enum {
+ CT_ROOT = 0,
+ CT_OUTPUT = 1,
+ CT_CON = 2,
+ CT_FLOATING_CON = 3,
+ CT_WORKSPACE = 4,
+ CT_DOCKAREA = 5
+ } type;
orientation_t orientation;
struct Con *parent;
- /* parent before setting it to floating */
- struct Con *old_parent;
struct Rect rect;
struct Rect window_rect;
struct Rect deco_rect;
+ /** the geometry this window requested when getting mapped */
+ struct Rect geometry;
char *name;
* inside this container (if any) sets the urgency hint, for example. */
bool urgent;
- /* ids/gc for the frame window */
+ /* ids/pixmap/graphics context for the frame window */
xcb_window_t frame;
- xcb_gcontext_t gc;
+ xcb_pixmap_t pixmap;
+ xcb_gcontext_t pm_gc;
+ bool pixmap_recreated;
+
+ /** Cache for the decoration rendering */
+ struct deco_render_params *deco_render_params;
/* Only workspace-containers can have floating clients */
TAILQ_HEAD(floating_head, Con) floating_head;
TAILQ_HEAD(swallow_head, Match) swallow_head;
enum { CF_NONE = 0, CF_OUTPUT = 1, CF_GLOBAL = 2 } fullscreen_mode;
- enum { L_DEFAULT = 0, L_STACKED = 1, L_TABBED = 2 } layout;
+ enum { L_DEFAULT = 0, L_STACKED = 1, L_TABBED = 2, L_DOCKAREA = 3, L_OUTPUT = 4 } layout;
border_style_t border_style;
/** floating? (= not in tiling layout) This cannot be simply a bool
* because we want to keep track of whether the status was set by the
TAILQ_ENTRY(Con) focused;
TAILQ_ENTRY(Con) all_cons;
TAILQ_ENTRY(Con) floating_windows;
+
+ /** callbacks */
+ void(*on_remove_child)(Con *);
};
#endif