2009-02-14 02:33:31 +01:00
|
|
|
|
/*
|
2010-04-13 17:52:23 +02:00
|
|
|
|
* vim:ts=4:sw=4:expandtab
|
2009-02-14 02:33:31 +01:00
|
|
|
|
*
|
|
|
|
|
* i3 - an improved dynamic tiling window manager
|
2010-04-13 17:52:23 +02:00
|
|
|
|
* © 2009-2010 Michael Stapelberg and contributors (see also: LICENSE)
|
2009-02-14 02:33:31 +01:00
|
|
|
|
*
|
2009-02-24 14:18:08 +01:00
|
|
|
|
* include/data.h: This file defines all data structures used by i3
|
|
|
|
|
*
|
2009-02-14 02:33:31 +01:00
|
|
|
|
*/
|
2009-02-08 04:04:35 +01:00
|
|
|
|
#include <xcb/xcb.h>
|
2010-03-02 12:47:21 +01:00
|
|
|
|
#include <xcb/randr.h>
|
2009-04-19 20:44:34 +02:00
|
|
|
|
#include <xcb/xcb_atom.h>
|
2009-02-14 08:38:07 +01:00
|
|
|
|
#include <stdbool.h>
|
2009-02-08 04:04:35 +01:00
|
|
|
|
|
|
|
|
|
#ifndef _DATA_H
|
|
|
|
|
#define _DATA_H
|
2009-02-24 14:18:08 +01:00
|
|
|
|
#include "queue.h"
|
|
|
|
|
|
2009-02-06 17:49:45 +01:00
|
|
|
|
/*
|
2009-06-29 21:54:51 +02:00
|
|
|
|
* To get the big concept: There are helper structures like struct Colorpixel
|
|
|
|
|
* or struct Stack_Window. Everything which is also defined as type (see
|
|
|
|
|
* forward definitions) is considered to be a major structure, thus important.
|
2009-02-24 14:18:08 +01:00
|
|
|
|
*
|
|
|
|
|
* Let’s start from the biggest to the smallest:
|
|
|
|
|
*
|
2010-03-27 15:25:51 +01:00
|
|
|
|
* TODO
|
2009-02-06 17:49:45 +01:00
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
2009-02-08 02:39:56 +01:00
|
|
|
|
/* Forward definitions */
|
2009-02-10 05:50:35 +01:00
|
|
|
|
typedef struct Font i3Font;
|
2009-02-10 20:49:47 +01:00
|
|
|
|
typedef struct Binding Binding;
|
2009-02-15 01:58:09 +01:00
|
|
|
|
typedef struct Rect Rect;
|
2010-03-02 12:47:21 +01:00
|
|
|
|
typedef struct xoutput Output;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
typedef struct Con Con;
|
|
|
|
|
typedef struct Match Match;
|
|
|
|
|
typedef struct Window i3Window;
|
|
|
|
|
|
2009-02-08 02:39:56 +01:00
|
|
|
|
|
2009-02-24 14:18:08 +01:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Helper types
|
|
|
|
|
*****************************************************************************/
|
2009-02-08 02:39:56 +01:00
|
|
|
|
typedef enum { D_LEFT, D_RIGHT, D_UP, D_DOWN } direction_t;
|
2010-06-01 22:45:18 +02:00
|
|
|
|
typedef enum { NO_ORIENTATION = 0, HORIZ, VERT } orientation_t;
|
2009-02-10 20:49:47 +01:00
|
|
|
|
|
|
|
|
|
enum {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
BIND_NONE = 0,
|
|
|
|
|
BIND_SHIFT = XCB_MOD_MASK_SHIFT, /* (1 << 0) */
|
|
|
|
|
BIND_CONTROL = XCB_MOD_MASK_CONTROL, /* (1 << 2) */
|
|
|
|
|
BIND_MOD1 = XCB_MOD_MASK_1, /* (1 << 3) */
|
|
|
|
|
BIND_MOD2 = XCB_MOD_MASK_2, /* (1 << 4) */
|
|
|
|
|
BIND_MOD3 = XCB_MOD_MASK_3, /* (1 << 5) */
|
|
|
|
|
BIND_MOD4 = XCB_MOD_MASK_4, /* (1 << 6) */
|
|
|
|
|
BIND_MOD5 = XCB_MOD_MASK_5, /* (1 << 7) */
|
|
|
|
|
BIND_MODE_SWITCH = (1 << 8)
|
2009-02-10 20:49:47 +01:00
|
|
|
|
};
|
|
|
|
|
|
2009-06-29 21:54:51 +02:00
|
|
|
|
/**
|
2009-06-29 22:15:37 +02:00
|
|
|
|
* Stores a rectangle, for example the size of a window, the child window etc.
|
2009-12-31 17:48:41 +01:00
|
|
|
|
* It needs to be packed so that the compiler will not add any padding bytes.
|
|
|
|
|
* (it is used in src/ewmh.c for example)
|
2009-06-29 21:54:51 +02:00
|
|
|
|
*
|
2010-02-12 13:06:59 +01:00
|
|
|
|
* Note that x and y can contain signed values in some cases (for example when
|
|
|
|
|
* used for the coordinates of a window, which can be set outside of the
|
|
|
|
|
* visible area, but not when specifying the position of a workspace for the
|
|
|
|
|
* _NET_WM_WORKAREA hint). Not declaring x/y as int32_t saves us a lot of
|
|
|
|
|
* typecasts.
|
|
|
|
|
*
|
2009-06-29 21:54:51 +02:00
|
|
|
|
*/
|
2009-02-15 01:58:09 +01:00
|
|
|
|
struct Rect {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
uint32_t x;
|
|
|
|
|
uint32_t y;
|
|
|
|
|
uint32_t width;
|
|
|
|
|
uint32_t height;
|
2009-12-31 17:48:41 +01:00
|
|
|
|
} __attribute__((packed));
|
2009-02-15 01:58:09 +01:00
|
|
|
|
|
2009-06-29 21:54:51 +02:00
|
|
|
|
/**
|
2009-02-24 14:18:08 +01:00
|
|
|
|
* Used for the cache of colorpixels.
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
struct Colorpixel {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
uint32_t pixel;
|
|
|
|
|
char *hex;
|
|
|
|
|
SLIST_ENTRY(Colorpixel) colorpixels;
|
2009-02-24 14:18:08 +01:00
|
|
|
|
};
|
|
|
|
|
|
2009-07-17 18:32:40 +02:00
|
|
|
|
struct Cached_Pixmap {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
xcb_pixmap_t id;
|
2009-07-17 18:32:40 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/* We’re going to paint on it, so a graphics context will be needed */
|
|
|
|
|
xcb_gcontext_t gc;
|
2009-07-17 18:32:40 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/* The rect with which the pixmap was created */
|
|
|
|
|
Rect rect;
|
2009-07-17 18:32:40 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/* 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;
|
2009-07-17 18:32:40 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
xcb_drawable_t referred_drawable;
|
2009-07-17 18:32:40 +02:00
|
|
|
|
};
|
|
|
|
|
|
2009-03-10 00:51:15 +01:00
|
|
|
|
struct Ignore_Event {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
int sequence;
|
|
|
|
|
time_t added;
|
2009-02-24 14:18:08 +01:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
SLIST_ENTRY(Ignore_Event) ignore_events;
|
2009-04-19 20:44:34 +02:00
|
|
|
|
};
|
|
|
|
|
|
2009-02-24 14:18:08 +01:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
* Major types
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
2009-06-29 21:54:51 +02:00
|
|
|
|
/**
|
|
|
|
|
* Holds a keybinding, consisting of a keycode combined with modifiers and the
|
|
|
|
|
* command which is executed as soon as the key is pressed (see src/command.c)
|
2009-02-06 18:23:37 +01:00
|
|
|
|
*
|
|
|
|
|
*/
|
2009-02-10 20:49:47 +01:00
|
|
|
|
struct Binding {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Symbol the user specified in configfile, if any. This needs to be
|
|
|
|
|
* stored with the binding to be able to re-convert it into a keycode
|
|
|
|
|
* if the keyboard mapping changes (using Xmodmap for example) */
|
|
|
|
|
char *symbol;
|
2009-08-07 15:35:12 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Only in use if symbol != NULL. Gets set to the value to which the
|
|
|
|
|
* symbol got translated when binding. Useful for unbinding and
|
|
|
|
|
* checking which binding was used when a key press event comes in.
|
|
|
|
|
*
|
|
|
|
|
* This is an array of number_keycodes size. */
|
|
|
|
|
xcb_keycode_t *translated_to;
|
2009-08-07 15:35:12 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
uint32_t number_keycodes;
|
2009-08-07 15:35:12 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Keycode to bind */
|
|
|
|
|
uint32_t keycode;
|
2009-08-07 15:35:12 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Bitmask consisting of BIND_MOD_1, BIND_MODE_SWITCH, … */
|
|
|
|
|
uint32_t mods;
|
2009-08-07 15:35:12 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Command, like in command mode */
|
|
|
|
|
char *command;
|
2009-08-07 15:35:12 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
TAILQ_ENTRY(Binding) bindings;
|
2009-02-10 20:49:47 +01:00
|
|
|
|
};
|
|
|
|
|
|
2009-06-29 21:54:51 +02:00
|
|
|
|
/**
|
2009-03-29 14:53:48 +02:00
|
|
|
|
* Holds a command specified by an exec-line in the config (see src/config.c)
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
struct Autostart {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Command, like in command mode */
|
|
|
|
|
char *command;
|
|
|
|
|
TAILQ_ENTRY(Autostart) autostarts;
|
2009-05-16 17:32:36 +02:00
|
|
|
|
};
|
|
|
|
|
|
2009-06-29 21:54:51 +02:00
|
|
|
|
/**
|
2009-03-01 22:00:54 +01:00
|
|
|
|
* Data structure for cached font information:
|
|
|
|
|
* - font id in X11 (load it once)
|
|
|
|
|
* - font height (multiple calls needed to get it)
|
2009-02-06 18:23:37 +01:00
|
|
|
|
*
|
|
|
|
|
*/
|
2009-02-08 02:39:56 +01:00
|
|
|
|
struct Font {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** 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;
|
2009-02-08 02:39:56 +01:00
|
|
|
|
};
|
2009-02-06 18:23:37 +01:00
|
|
|
|
|
2009-02-08 04:04:35 +01:00
|
|
|
|
|
2009-06-29 21:54:51 +02:00
|
|
|
|
/**
|
2010-03-02 12:47:21 +01:00
|
|
|
|
* An Output is a physical output on your graphics driver. Outputs which
|
|
|
|
|
* are currently in use have (output->active == true). Each output has a
|
|
|
|
|
* position and a mode. An output usually corresponds to one connected
|
|
|
|
|
* screen (except if you are running multiple screens in clone mode).
|
2009-02-24 14:18:08 +01:00
|
|
|
|
*
|
|
|
|
|
*/
|
2010-03-02 12:47:21 +01:00
|
|
|
|
struct xoutput {
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Output id, so that we can requery the output directly later */
|
|
|
|
|
xcb_randr_output_t id;
|
|
|
|
|
/** Name of the output */
|
|
|
|
|
char *name;
|
2010-03-02 12:47:21 +01:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Whether the output is currently active (has a CRTC attached with a
|
|
|
|
|
* valid mode) */
|
|
|
|
|
bool active;
|
2009-02-15 01:58:09 +01:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Internal flags, necessary for querying RandR screens (happens in
|
|
|
|
|
* two stages) */
|
|
|
|
|
bool changed;
|
|
|
|
|
bool to_be_disabled;
|
2010-03-05 14:32:48 +01:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** x, y, width, height */
|
|
|
|
|
Rect rect;
|
2009-02-15 01:58:09 +01:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** The bar window */
|
|
|
|
|
xcb_window_t bar;
|
|
|
|
|
xcb_gcontext_t bargc;
|
2009-03-04 12:09:43 +01:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
/** Contains all clients with _NET_WM_WINDOW_TYPE ==
|
|
|
|
|
* _NET_WM_WINDOW_TYPE_DOCK */
|
|
|
|
|
SLIST_HEAD(dock_clients_head, Client) dock_clients;
|
2009-04-11 14:29:15 +02:00
|
|
|
|
|
2010-04-13 17:52:23 +02:00
|
|
|
|
TAILQ_ENTRY(xoutput) outputs;
|
2009-02-15 01:58:09 +01:00
|
|
|
|
};
|
|
|
|
|
|
2010-03-27 15:25:51 +01:00
|
|
|
|
struct Window {
|
|
|
|
|
xcb_window_t id;
|
|
|
|
|
|
2010-04-13 17:46:54 +02:00
|
|
|
|
char *class_class;
|
|
|
|
|
char *class_instance;
|
|
|
|
|
|
|
|
|
|
/** The name of the window as it will be passod to X11 (in UCS2 if the
|
|
|
|
|
* application supports _NET_WM_NAME, in COMPOUND_TEXT otherwise). */
|
|
|
|
|
char *name_x;
|
|
|
|
|
|
|
|
|
|
/** 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) */
|
2010-04-13 17:22:34 +02:00
|
|
|
|
int name_len;
|
2010-04-13 17:46:54 +02:00
|
|
|
|
|
|
|
|
|
/** Whether the application used _NET_WM_NAME */
|
2010-04-13 17:22:34 +02:00
|
|
|
|
bool uses_net_wm_name;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Match {
|
|
|
|
|
enum { M_WINDOW, M_CON } what;
|
|
|
|
|
|
|
|
|
|
char *title;
|
|
|
|
|
int title_len;
|
|
|
|
|
char *application;
|
|
|
|
|
char *class;
|
|
|
|
|
char *instance;
|
2010-06-02 23:32:05 +02:00
|
|
|
|
char *mark;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
xcb_window_t id;
|
2010-04-16 15:30:07 +02:00
|
|
|
|
Con *con_id;
|
2010-04-16 22:57:21 +02:00
|
|
|
|
enum { M_ANY = 0, M_TILING, M_FLOATING } floating;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
|
2010-04-16 22:57:21 +02:00
|
|
|
|
enum { M_GLOBAL = 0, M_OUTPUT, M_WORKSPACE } levels;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
|
2010-04-16 22:57:21 +02:00
|
|
|
|
enum { M_USER = 0, M_RESTART } source;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
|
|
|
|
|
/* 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 */
|
2010-04-16 22:57:21 +02:00
|
|
|
|
enum { M_HERE = 0, M_ACTIVE } insert_where;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
|
|
|
|
|
TAILQ_ENTRY(Match) matches;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Con {
|
|
|
|
|
bool mapped;
|
2010-05-31 00:11:11 +02:00
|
|
|
|
enum { CT_ROOT = 0, CT_OUTPUT = 1, CT_CON = 2, CT_FLOATING_CON = 3, CT_WORKSPACE = 4 } type;
|
2010-03-27 15:25:51 +01:00
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
char *name;
|
|
|
|
|
|
2010-06-02 23:32:05 +02:00
|
|
|
|
/* user-definable mark to jump to this container later */
|
|
|
|
|
char *mark;
|
|
|
|
|
|
2010-03-27 15:25:51 +01:00
|
|
|
|
double percent;
|
|
|
|
|
|
|
|
|
|
struct Window *window;
|
|
|
|
|
|
2010-06-02 17:51:58 +02:00
|
|
|
|
/* Should this container be marked urgent? This gets set when the window
|
|
|
|
|
* inside this container (if any) sets the urgency hint, for example. */
|
|
|
|
|
bool urgent;
|
|
|
|
|
|
2010-03-27 15:25:51 +01:00
|
|
|
|
/* ids/gc for the frame window */
|
|
|
|
|
xcb_window_t frame;
|
|
|
|
|
xcb_gcontext_t gc;
|
|
|
|
|
|
|
|
|
|
/* Only workspace-containers can have floating clients */
|
|
|
|
|
TAILQ_HEAD(floating_head, Con) floating_head;
|
|
|
|
|
|
|
|
|
|
TAILQ_HEAD(nodes_head, Con) nodes_head;
|
|
|
|
|
TAILQ_HEAD(focus_head, Con) focus_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;
|
|
|
|
|
/** 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
|
|
|
|
|
* application (by setting _NET_WM_WINDOW_TYPE appropriately) or by the
|
|
|
|
|
* user. The user’s choice overwrites automatic mode, of course. The
|
|
|
|
|
* order of the values is important because we check with >=
|
|
|
|
|
* FLOATING_AUTO_ON if a client is floating. */
|
|
|
|
|
enum {
|
|
|
|
|
FLOATING_AUTO_OFF = 0,
|
|
|
|
|
FLOATING_USER_OFF = 1,
|
|
|
|
|
FLOATING_AUTO_ON = 2,
|
|
|
|
|
FLOATING_USER_ON = 3
|
|
|
|
|
} floating;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TAILQ_ENTRY(Con) nodes;
|
|
|
|
|
TAILQ_ENTRY(Con) focused;
|
|
|
|
|
TAILQ_ENTRY(Con) all_cons;
|
|
|
|
|
TAILQ_ENTRY(Con) floating_windows;
|
|
|
|
|
};
|
|
|
|
|
|
2009-02-08 04:04:35 +01:00
|
|
|
|
#endif
|