switch to clang-format-3.8 (#2547)

https://llvm.org/bugs/show_bug.cgi?id=30353 was filed for the unintended
line break between in e.g. “TAILQ_ENTRY(foo)\nbar;”.

Until that’s fixed or a workaround is known, we’ll live with line
breaks. To make it a bit easier for readers to see what’s going on, I
added extra line breaks around each such struct member/variable
definition, so that they at least visually are a single unit.

fixes #2174
next
Michael Stapelberg 2016-11-08 13:46:43 -08:00 committed by GitHub
parent 4ccac59932
commit fff3f79da9
24 changed files with 907 additions and 837 deletions

View File

@ -8,3 +8,4 @@ IndentWidth: 4
PointerBindsToType: false PointerBindsToType: false
ColumnLimit: 0 ColumnLimit: 0
SpaceBeforeParens: ControlStatements SpaceBeforeParens: ControlStatements
SortIncludes: false

File diff suppressed because it is too large Load Diff

View File

@ -74,10 +74,12 @@ struct status_block {
char *name; char *name;
char *instance; char *instance;
TAILQ_ENTRY(status_block) blocks; TAILQ_ENTRY(status_block)
blocks;
}; };
TAILQ_HEAD(statusline_head, status_block) statusline_head; TAILQ_HEAD(statusline_head, status_block)
statusline_head;
#include "child.h" #include "child.h"
#include "ipc.h" #include "ipc.h"

View File

@ -28,18 +28,23 @@ typedef struct binding_t {
int input_code; int input_code;
char *command; char *command;
TAILQ_ENTRY(binding_t) bindings; TAILQ_ENTRY(binding_t)
bindings;
} binding_t; } binding_t;
typedef struct tray_output_t { typedef struct tray_output_t {
char *output; char *output;
TAILQ_ENTRY(tray_output_t) tray_outputs; TAILQ_ENTRY(tray_output_t)
tray_outputs;
} tray_output_t; } tray_output_t;
typedef struct config_t { typedef struct config_t {
int modifier; int modifier;
TAILQ_HEAD(bindings_head, binding_t) bindings;
TAILQ_HEAD(bindings_head, binding_t)
bindings;
position_t position; position_t position;
int verbose; int verbose;
struct xcb_color_strings_t colors; struct xcb_color_strings_t colors;
@ -50,7 +55,10 @@ typedef struct config_t {
char *command; char *command;
char *fontname; char *fontname;
i3String *separator_symbol; i3String *separator_symbol;
TAILQ_HEAD(tray_outputs_head, tray_output_t) tray_outputs;
TAILQ_HEAD(tray_outputs_head, tray_output_t)
tray_outputs;
int tray_padding; int tray_padding;
int num_outputs; int num_outputs;
char **outputs; char **outputs;

View File

@ -67,5 +67,6 @@ struct i3_output {
struct ws_head* workspaces; /* The workspaces on this output */ struct ws_head* workspaces; /* The workspaces on this output */
struct tc_head* trayclients; /* The tray clients on this output */ struct tc_head* trayclients; /* The tray clients on this output */
SLIST_ENTRY(i3_output) slist; /* Pointer for the SLIST-Macro */ SLIST_ENTRY(i3_output)
slist; /* Pointer for the SLIST-Macro */
}; };

View File

@ -18,5 +18,6 @@ struct trayclient {
bool mapped; /* Whether this window is mapped */ bool mapped; /* Whether this window is mapped */
int xe_version; /* The XEMBED version supported by the client */ int xe_version; /* The XEMBED version supported by the client */
TAILQ_ENTRY(trayclient) tailq; /* Pointer for the TAILQ-Macro */ TAILQ_ENTRY(trayclient)
tailq; /* Pointer for the TAILQ-Macro */
}; };

View File

@ -40,5 +40,6 @@ struct i3_ws {
rect rect; /* The rect of the ws (not used (yet)) */ rect rect; /* The rect of the ws (not used (yet)) */
struct i3_output *output; /* The current output of the ws */ struct i3_output *output; /* The current output of the ws */
TAILQ_ENTRY(i3_ws) tailq; /* Pointer for the TAILQ-Macro */ TAILQ_ENTRY(i3_ws)
tailq; /* Pointer for the TAILQ-Macro */
}; };

View File

@ -68,7 +68,8 @@ struct Variable {
char *value; char *value;
char *next_match; char *next_match;
SLIST_ENTRY(Variable) variables; SLIST_ENTRY(Variable)
variables;
}; };
/** /**
@ -82,7 +83,8 @@ struct Mode {
bool pango_markup; bool pango_markup;
struct bindings_head *bindings; struct bindings_head *bindings;
SLIST_ENTRY(Mode) modes; SLIST_ENTRY(Mode)
modes;
}; };
/** /**
@ -253,7 +255,8 @@ struct Barconfig {
/* List of outputs on which the tray is allowed to be shown, in order. /* List of outputs on which the tray is allowed to be shown, in order.
* The special value "none" disables it (per default, it will be shown) and * The special value "none" disables it (per default, it will be shown) and
* the special value "primary" enabled it on the primary output. */ * the special value "primary" enabled it on the primary output. */
TAILQ_HEAD(tray_outputs_head, tray_output_t) tray_outputs; TAILQ_HEAD(tray_outputs_head, tray_output_t)
tray_outputs;
/* Padding around the tray icons. */ /* Padding around the tray icons. */
int tray_padding; int tray_padding;
@ -284,7 +287,8 @@ struct Barconfig {
M_MOD5 = 7 M_MOD5 = 7
} modifier; } modifier;
TAILQ_HEAD(bar_bindings_head, Barbinding) bar_bindings; TAILQ_HEAD(bar_bindings_head, Barbinding)
bar_bindings;
/** Bar position (bottom by default). */ /** Bar position (bottom by default). */
enum { P_BOTTOM = 0, enum { P_BOTTOM = 0,
@ -351,7 +355,8 @@ struct Barconfig {
char *binding_mode_text; char *binding_mode_text;
} colors; } colors;
TAILQ_ENTRY(Barconfig) configs; TAILQ_ENTRY(Barconfig)
configs;
}; };
/** /**
@ -366,13 +371,15 @@ struct Barbinding {
/** The command which is to be executed for this button. */ /** The command which is to be executed for this button. */
char *command; char *command;
TAILQ_ENTRY(Barbinding) bindings; TAILQ_ENTRY(Barbinding)
bindings;
}; };
struct tray_output_t { struct tray_output_t {
char *output; char *output;
TAILQ_ENTRY(tray_output_t) tray_outputs; TAILQ_ENTRY(tray_output_t)
tray_outputs;
}; };
/** /**

View File

@ -199,7 +199,8 @@ struct Workspace_Assignment {
char *name; char *name;
char *output; char *output;
TAILQ_ENTRY(Workspace_Assignment) ws_assignments; TAILQ_ENTRY(Workspace_Assignment)
ws_assignments;
}; };
struct Ignore_Event { struct Ignore_Event {
@ -207,7 +208,8 @@ struct Ignore_Event {
int response_type; int response_type;
time_t added; time_t added;
SLIST_ENTRY(Ignore_Event) ignore_events; SLIST_ENTRY(Ignore_Event)
ignore_events;
}; };
/** /**
@ -226,7 +228,8 @@ struct Startup_Sequence {
* completed) */ * completed) */
time_t delete_at; time_t delete_at;
TAILQ_ENTRY(Startup_Sequence) sequences; TAILQ_ENTRY(Startup_Sequence)
sequences;
}; };
/** /**
@ -252,7 +255,9 @@ struct regex {
struct Binding_Keycode { struct Binding_Keycode {
xcb_keycode_t keycode; xcb_keycode_t keycode;
i3_event_state_mask_t modifiers; i3_event_state_mask_t modifiers;
TAILQ_ENTRY(Binding_Keycode) keycodes;
TAILQ_ENTRY(Binding_Keycode)
keycodes;
}; };
/****************************************************************************** /******************************************************************************
@ -309,12 +314,14 @@ struct Binding {
/** Only in use if symbol != NULL. Contains keycodes which generate the /** Only in use if symbol != NULL. Contains keycodes which generate the
* specified symbol. Useful for unbinding and checking which binding was * specified symbol. Useful for unbinding and checking which binding was
* used when a key press event comes in. */ * used when a key press event comes in. */
TAILQ_HEAD(keycodes_head, Binding_Keycode) keycodes_head; TAILQ_HEAD(keycodes_head, Binding_Keycode)
keycodes_head;
/** Command, like in command mode */ /** Command, like in command mode */
char *command; char *command;
TAILQ_ENTRY(Binding) bindings; TAILQ_ENTRY(Binding)
bindings;
}; };
/** /**
@ -330,8 +337,12 @@ struct Autostart {
/** no_startup_id flag for start_application(). Determines whether a /** no_startup_id flag for start_application(). Determines whether a
* startup notification context/ID should be created. */ * startup notification context/ID should be created. */
bool no_startup_id; bool no_startup_id;
TAILQ_ENTRY(Autostart) autostarts;
TAILQ_ENTRY(Autostart) autostarts_always; TAILQ_ENTRY(Autostart)
autostarts;
TAILQ_ENTRY(Autostart)
autostarts_always;
}; };
/** /**
@ -364,7 +375,8 @@ struct xoutput {
/** x, y, width, height */ /** x, y, width, height */
Rect rect; Rect rect;
TAILQ_ENTRY(xoutput) outputs; TAILQ_ENTRY(xoutput)
outputs;
}; };
/** /**
@ -493,7 +505,8 @@ struct Match {
M_ASSIGN_WS, M_ASSIGN_WS,
M_BELOW } insert_where; M_BELOW } insert_where;
TAILQ_ENTRY(Match) matches; TAILQ_ENTRY(Match)
matches;
/* Whether this match was generated when restarting i3 inplace. /* Whether this match was generated when restarting i3 inplace.
* Leads to not setting focus when managing a new window, because the old * Leads to not setting focus when managing a new window, because the old
@ -537,7 +550,8 @@ struct Assignment {
char *workspace; char *workspace;
} dest; } dest;
TAILQ_ENTRY(Assignment) assignments; TAILQ_ENTRY(Assignment)
assignments;
}; };
/** Fullscreen modes. Used by Con.fullscreen_mode. */ /** Fullscreen modes. Used by Con.fullscreen_mode. */
@ -548,7 +562,8 @@ typedef enum { CF_NONE = 0,
struct mark_t { struct mark_t {
char *name; char *name;
TAILQ_ENTRY(mark_t) marks; TAILQ_ENTRY(mark_t)
marks;
}; };
/** /**
@ -612,7 +627,8 @@ struct Con {
char *sticky_group; char *sticky_group;
/* user-definable marks to jump to this container later */ /* user-definable marks to jump to this container later */
TAILQ_HEAD(marks_head, mark_t) marks_head; TAILQ_HEAD(marks_head, mark_t)
marks_head;
/* cached to decide whether a redraw is needed */ /* cached to decide whether a redraw is needed */
bool mark_changed; bool mark_changed;
@ -631,12 +647,17 @@ struct Con {
struct deco_render_params *deco_render_params; struct deco_render_params *deco_render_params;
/* Only workspace-containers can have floating clients */ /* Only workspace-containers can have floating clients */
TAILQ_HEAD(floating_head, Con) floating_head; TAILQ_HEAD(floating_head, Con)
floating_head;
TAILQ_HEAD(nodes_head, Con) nodes_head; TAILQ_HEAD(nodes_head, Con)
TAILQ_HEAD(focus_head, Con) focus_head; nodes_head;
TAILQ_HEAD(swallow_head, Match) swallow_head; TAILQ_HEAD(focus_head, Con)
focus_head;
TAILQ_HEAD(swallow_head, Match)
swallow_head;
fullscreen_mode_t fullscreen_mode; fullscreen_mode_t fullscreen_mode;
@ -674,10 +695,17 @@ struct Con {
FLOATING_USER_ON = 3 FLOATING_USER_ON = 3
} floating; } floating;
TAILQ_ENTRY(Con) nodes; TAILQ_ENTRY(Con)
TAILQ_ENTRY(Con) focused; nodes;
TAILQ_ENTRY(Con) all_cons;
TAILQ_ENTRY(Con) floating_windows; TAILQ_ENTRY(Con)
focused;
TAILQ_ENTRY(Con)
all_cons;
TAILQ_ENTRY(Con)
floating_windows;
/** callbacks */ /** callbacks */
void (*on_remove_child)(Con *); void (*on_remove_child)(Con *);

View File

@ -31,7 +31,8 @@ typedef struct ipc_client {
int num_events; int num_events;
char **events; char **events;
TAILQ_ENTRY(ipc_client) clients; TAILQ_ENTRY(ipc_client)
clients;
} ipc_client; } ipc_client;
/* /*

View File

@ -446,7 +446,10 @@
} }
#define CIRCLEQ_HEAD_INITIALIZER(head) \ #define CIRCLEQ_HEAD_INITIALIZER(head) \
{ CIRCLEQ_END(&head), CIRCLEQ_END(&head) } { \
CIRCLEQ_END(&head) \
, CIRCLEQ_END(&head) \
}
#define CIRCLEQ_ENTRY(type) \ #define CIRCLEQ_ENTRY(type) \
struct { \ struct { \

View File

@ -142,7 +142,9 @@ static Con *maybe_auto_back_and_forth_workspace(Con *workspace) {
*/ */
typedef struct owindow { typedef struct owindow {
Con *con; Con *con;
TAILQ_ENTRY(owindow) owindows;
TAILQ_ENTRY(owindow)
owindows;
} owindow; } owindow;
typedef TAILQ_HEAD(owindows_head, owindow) owindows_head; typedef TAILQ_HEAD(owindows_head, owindow) owindows_head;

View File

@ -410,7 +410,8 @@ Con *con_parent_with_orientation(Con *con, orientation_t orientation) {
struct bfs_entry { struct bfs_entry {
Con *con; Con *con;
TAILQ_ENTRY(bfs_entry) entries; TAILQ_ENTRY(bfs_entry)
entries;
}; };
/* /*
@ -422,7 +423,9 @@ Con *con_get_fullscreen_con(Con *con, fullscreen_mode_t fullscreen_mode) {
/* TODO: is breadth-first-search really appropriate? (check as soon as /* TODO: is breadth-first-search really appropriate? (check as soon as
* fullscreen levels and fullscreen for containers is implemented) */ * fullscreen levels and fullscreen for containers is implemented) */
TAILQ_HEAD(bfs_head, bfs_entry) bfs_head = TAILQ_HEAD_INITIALIZER(bfs_head); TAILQ_HEAD(bfs_head, bfs_entry)
bfs_head = TAILQ_HEAD_INITIALIZER(bfs_head);
struct bfs_entry *entry = smalloc(sizeof(struct bfs_entry)); struct bfs_entry *entry = smalloc(sizeof(struct bfs_entry));
entry->con = con; entry->con = con;
TAILQ_INSERT_TAIL(&bfs_head, entry, entries); TAILQ_INSERT_TAIL(&bfs_head, entry, entries);

View File

@ -1002,7 +1002,7 @@ bool parse_file(const char *f, bool use_nagbar) {
char *next; char *next;
for (next = bufcopy; for (next = bufcopy;
next < (bufcopy + stbuf.st_size) && next < (bufcopy + stbuf.st_size) &&
(next = strcasestr(next, current->key)) != NULL; (next = strcasestr(next, current->key)) != NULL;
next += strlen(current->key)) { next += strlen(current->key)) {
*next = '_'; *next = '_';
extra_bytes += extra; extra_bytes += extra;

View File

@ -22,7 +22,8 @@
char *current_socketpath = NULL; char *current_socketpath = NULL;
TAILQ_HEAD(ipc_client_head, ipc_client) all_clients = TAILQ_HEAD_INITIALIZER(all_clients); TAILQ_HEAD(ipc_client_head, ipc_client)
all_clients = TAILQ_HEAD_INITIALIZER(all_clients);
/* /*
* Puts the given socket file descriptor into non-blocking mode or dies if * Puts the given socket file descriptor into non-blocking mode or dies if

View File

@ -34,7 +34,9 @@ static bool swallow_is_empty;
* array. */ * array. */
struct focus_mapping { struct focus_mapping {
int old_id; int old_id;
TAILQ_ENTRY(focus_mapping) focus_mappings;
TAILQ_ENTRY(focus_mapping)
focus_mappings;
}; };
static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings = static TAILQ_HEAD(focus_mappings_head, focus_mapping) focus_mappings =

View File

@ -167,7 +167,7 @@ bool match_matches_window(Match *match, i3Window *window) {
/* if we find a window that is newer than this one, bail */ /* if we find a window that is newer than this one, bail */
TAILQ_FOREACH(con, &all_cons, all_cons) { TAILQ_FOREACH(con, &all_cons, all_cons) {
if ((con->window != NULL) && if ((con->window != NULL) &&
_i3_timercmp(con->window->urgent, window->urgent, > )) { _i3_timercmp(con->window->urgent, window->urgent, >)) {
return false; return false;
} }
} }
@ -183,7 +183,7 @@ bool match_matches_window(Match *match, i3Window *window) {
TAILQ_FOREACH(con, &all_cons, all_cons) { TAILQ_FOREACH(con, &all_cons, all_cons) {
if ((con->window != NULL) && if ((con->window != NULL) &&
(con->window->urgent.tv_sec != 0) && (con->window->urgent.tv_sec != 0) &&
_i3_timercmp(con->window->urgent, window->urgent, < )) { _i3_timercmp(con->window->urgent, window->urgent, <)) {
return false; return false;
} }
} }

View File

@ -29,7 +29,8 @@ typedef struct placeholder_state {
/** The graphics context for “pixmap”. */ /** The graphics context for “pixmap”. */
xcb_gcontext_t gc; xcb_gcontext_t gc;
TAILQ_ENTRY(placeholder_state) state; TAILQ_ENTRY(placeholder_state)
state;
} placeholder_state; } placeholder_state;
static TAILQ_HEAD(state_head, placeholder_state) state_head = static TAILQ_HEAD(state_head, placeholder_state) state_head =

20
src/x.c
View File

@ -58,18 +58,26 @@ typedef struct con_state {
char *name; char *name;
CIRCLEQ_ENTRY(con_state) state; CIRCLEQ_ENTRY(con_state)
CIRCLEQ_ENTRY(con_state) old_state; state;
TAILQ_ENTRY(con_state) initial_mapping_order;
CIRCLEQ_ENTRY(con_state)
old_state;
TAILQ_ENTRY(con_state)
initial_mapping_order;
} con_state; } con_state;
CIRCLEQ_HEAD(state_head, con_state) state_head = CIRCLEQ_HEAD(state_head, con_state)
state_head =
CIRCLEQ_HEAD_INITIALIZER(state_head); CIRCLEQ_HEAD_INITIALIZER(state_head);
CIRCLEQ_HEAD(old_state_head, con_state) old_state_head = CIRCLEQ_HEAD(old_state_head, con_state)
old_state_head =
CIRCLEQ_HEAD_INITIALIZER(old_state_head); CIRCLEQ_HEAD_INITIALIZER(old_state_head);
TAILQ_HEAD(initial_mapping_head, con_state) initial_mapping_head = TAILQ_HEAD(initial_mapping_head, con_state)
initial_mapping_head =
TAILQ_HEAD_INITIALIZER(initial_mapping_head); TAILQ_HEAD_INITIALIZER(initial_mapping_head);
/* /*

View File

@ -3,4 +3,4 @@
set -e set -e
set -x set -x
clang-format-3.5 -i $(find . -name "*.[ch]" | tr '\n' ' ') && git diff --exit-code || (echo 'Code was not formatted using clang-format!'; false) clang-format-3.8 -i $(find . -name "*.[ch]" | tr '\n' ' ') && git diff --exit-code || (echo 'Code was not formatted using clang-format!'; false)

View File

@ -13,12 +13,12 @@ RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80retry
# (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now. # (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now.
# Install mk-build-deps (for installing the i3 build dependencies), # Install mk-build-deps (for installing the i3 build dependencies),
# clang and clang-format-3.5 (for checking formatting and building with clang), # clang and clang-format-3.8 (for checking formatting and building with clang),
# lintian (for checking spelling errors), # lintian (for checking spelling errors),
RUN linux32 apt-get update && \ RUN linux32 apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
dpkg-dev devscripts git equivs \ dpkg-dev devscripts git equivs \
clang clang-format-3.5 \ clang clang-format-3.8 \
lintian && \ lintian && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*

View File

@ -13,12 +13,12 @@ RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80retry
# (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now. # (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now.
# Install mk-build-deps (for installing the i3 build dependencies), # Install mk-build-deps (for installing the i3 build dependencies),
# clang and clang-format-3.5 (for checking formatting and building with clang), # clang and clang-format-3.8 (for checking formatting and building with clang),
# lintian (for checking spelling errors), # lintian (for checking spelling errors),
RUN linux32 apt-get update && \ RUN linux32 apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
dpkg-dev devscripts git equivs \ dpkg-dev devscripts git equivs \
clang clang-format-3.5 \ clang clang-format-3.8 \
lintian && \ lintian && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*

View File

@ -13,13 +13,13 @@ RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80retry
# (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now. # (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now.
# Install mk-build-deps (for installing the i3 build dependencies), # Install mk-build-deps (for installing the i3 build dependencies),
# clang and clang-format-3.5 (for checking formatting and building with clang), # clang and clang-format-3.8 (for checking formatting and building with clang),
# lintian (for checking spelling errors), # lintian (for checking spelling errors),
# test suite dependencies (for running tests) # test suite dependencies (for running tests)
RUN apt-get update && \ RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
dpkg-dev devscripts git equivs \ dpkg-dev devscripts git equivs \
clang clang-format-3.5 \ clang clang-format-3.8 \
lintian && \ lintian && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*

View File

@ -11,13 +11,13 @@ RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80retry
# (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now. # (3608 kB/s)). Hence, lets stick with httpredir.debian.org (default) for now.
# Install mk-build-deps (for installing the i3 build dependencies), # Install mk-build-deps (for installing the i3 build dependencies),
# clang and clang-format-3.5 (for checking formatting and building with clang), # clang and clang-format-3.8 (for checking formatting and building with clang),
# lintian (for checking spelling errors), # lintian (for checking spelling errors),
# test suite dependencies (for running tests) # test suite dependencies (for running tests)
RUN apt-get update && \ RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
dpkg-dev devscripts git equivs \ dpkg-dev devscripts git equivs \
clang clang-format-3.5 \ clang clang-format-3.8 \
lintian \ lintian \
libanyevent-perl libanyevent-i3-perl libextutils-pkgconfig-perl xcb-proto cpanminus xvfb xserver-xephyr xauth libinline-perl libinline-c-perl libxml-simple-perl libmouse-perl libmousex-nativetraits-perl libextutils-depends-perl perl libtest-deep-perl libtest-exception-perl libxml-parser-perl libtest-simple-perl libtest-fatal-perl libdata-dump-perl libtest-differences-perl libxml-tokeparser-perl libipc-run-perl libxcb-xtest0-dev libx11-xcb-perl libanyevent-i3-perl && \ libanyevent-perl libanyevent-i3-perl libextutils-pkgconfig-perl xcb-proto cpanminus xvfb xserver-xephyr xauth libinline-perl libinline-c-perl libxml-simple-perl libmouse-perl libmousex-nativetraits-perl libextutils-depends-perl perl libtest-deep-perl libtest-exception-perl libxml-parser-perl libtest-simple-perl libtest-fatal-perl libdata-dump-perl libtest-differences-perl libxml-tokeparser-perl libipc-run-perl libxcb-xtest0-dev libx11-xcb-perl libanyevent-i3-perl && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*