X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Fdata.h;h=40fffbfc4cebf8c71d2a4d18f38003968083357f;hb=0f9fbcbd259a26969c3503ac1e31b2cf2df351f5;hp=6174e4e427b90d82470be62cbec23464af06fbf5;hpb=5098e45f234d9fd49af43f82c32fcbc9be9e1a60;p=i3%2Fi3 diff --git a/include/data.h b/include/data.h index 6174e4e4..40fffbfc 100644 --- a/include/data.h +++ b/include/data.h @@ -2,18 +2,22 @@ * 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 +#ifndef _DATA_H +#define _DATA_H + +#define SN_API_NOT_YET_FROZEN 1 +#include + #include #include #include +#include -#ifndef _DATA_H -#define _DATA_H #include "queue.h" /* @@ -28,12 +32,12 @@ */ /* 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; @@ -42,7 +46,11 @@ typedef struct Window i3Window; *****************************************************************************/ typedef enum { D_LEFT, D_RIGHT, D_UP, D_DOWN } direction_t; typedef enum { NO_ORIENTATION = 0, HORIZ, VERT } orientation_t; -typedef enum { BS_NORMAL = 0, BS_NONE = 1, BS_1PIXEL = 3 } border_style_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, @@ -76,38 +84,93 @@ struct Rect { } __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 *****************************************************************************/ @@ -145,35 +208,22 @@ struct Binding { }; /** - * 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 @@ -198,20 +248,11 @@ struct xoutput { * 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; }; @@ -230,57 +271,129 @@ struct Window { * 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; @@ -320,9 +433,14 @@ struct Con { * 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; @@ -333,7 +451,7 @@ struct Con { 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 @@ -359,6 +477,9 @@ struct Con { TAILQ_ENTRY(Con) focused; TAILQ_ENTRY(Con) all_cons; TAILQ_ENTRY(Con) floating_windows; + + /** callbacks */ + void(*on_remove_child)(Con *); }; #endif