]> git.sur5r.net Git - i3/i3/blobdiff - include/data.h
Merge branch 'master' into next
[i3/i3] / include / data.h
index c408d3f6fed3c8283806b8991ebb65f81ad5d438..3bc425d9c792f4161115c3d6a34ded12642859ac 100644 (file)
@@ -2,17 +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
  *
  */
+#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;
 
 
@@ -136,6 +141,37 @@ struct Ignore_Event {
     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
  *****************************************************************************/
@@ -173,29 +209,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 height of the font, built from font_ascent + font_descent */
-    int height;
-    /** The xcb-id for the font */
-    xcb_font_t id;
-};
-
-
 /**
  * An Output is a physical output on your graphics driver. Outputs which
  * are currently in use have (output->active == true). Each output has a
@@ -225,16 +254,6 @@ struct xoutput {
     /** 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;
 };
 
@@ -253,6 +272,11 @@ 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;
 
@@ -261,7 +285,7 @@ struct Window {
     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;
@@ -274,17 +298,20 @@ struct Window {
 
     /** 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;
+    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,
@@ -296,12 +323,6 @@ struct Match {
     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;
-
-    char *target_ws;
-
     /* Where the window looking for a match should be inserted:
      *
      * M_HERE   = the matched container will be replaced by the window
@@ -314,7 +335,46 @@ struct Match {
     enum { M_HERE = 0, M_ASSIGN_WS, M_BELOW } insert_where;
 
     TAILQ_ENTRY(Match) matches;
-    TAILQ_ENTRY(Match) assignments;
+};
+
+/**
+ * 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 {