commit
f08119298e
|
@ -378,13 +378,6 @@ orientation_t con_orientation(Con *con);
|
||||||
*/
|
*/
|
||||||
Con *con_next_focused(Con *con);
|
Con *con_next_focused(Con *con);
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the next/previous container in the specified orientation. This may
|
|
||||||
* travel up until it finds a container with suitable orientation.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
Con *con_get_next(Con *con, char way, orientation_t orientation);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the focused con inside this client, descending the tree as far as
|
* Returns the focused con inside this client, descending the tree as far as
|
||||||
* possible. This comes in handy when attaching a con to a workspace at the
|
* possible. This comes in handy when attaching a con to a workspace at the
|
||||||
|
|
|
@ -123,7 +123,7 @@ static bool binding_in_current_group(const Binding *bind) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void grab_keycode_for_binding(xcb_connection_t *conn, Binding *bind, uint32_t keycode) {
|
static void grab_keycode_for_binding(xcb_connection_t *conn, Binding *bind, uint32_t keycode) {
|
||||||
/* Grab the key in all combinations */
|
/* Grab the key in all combinations */
|
||||||
#define GRAB_KEY(modifier) \
|
#define GRAB_KEY(modifier) \
|
||||||
do { \
|
do { \
|
||||||
xcb_grab_key(conn, 0, root, modifier, keycode, XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC); \
|
xcb_grab_key(conn, 0, root, modifier, keycode, XCB_GRAB_MODE_SYNC, XCB_GRAB_MODE_ASYNC); \
|
||||||
|
|
|
@ -302,12 +302,6 @@ static int route_click(Con *con, xcb_button_press_event_t *event, const bool mod
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_stacked) {
|
|
||||||
/* for stacked/tabbed cons, the resizing applies to the parent
|
|
||||||
* container */
|
|
||||||
con = con->parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 7: floating modifier pressed, initiate a resize */
|
/* 7: floating modifier pressed, initiate a resize */
|
||||||
if (dest == CLICK_INSIDE && mod_pressed && event->detail == XCB_BUTTON_CLICK_RIGHT) {
|
if (dest == CLICK_INSIDE && mod_pressed && event->detail == XCB_BUTTON_CLICK_RIGHT) {
|
||||||
if (floating_mod_on_tiled_client(con, event))
|
if (floating_mod_on_tiled_client(con, event))
|
||||||
|
|
|
@ -605,13 +605,17 @@ void cmd_resize(I3_CMD, const char *way, const char *direction, long resize_px,
|
||||||
const double ppt = (double)resize_ppt / 100.0;
|
const double ppt = (double)resize_ppt / 100.0;
|
||||||
if (!cmd_resize_tiling_width_height(current_match, cmd_output,
|
if (!cmd_resize_tiling_width_height(current_match, cmd_output,
|
||||||
current->con, direction,
|
current->con, direction,
|
||||||
resize_px, ppt))
|
resize_px, ppt)) {
|
||||||
|
yerror("Cannot resize.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!cmd_resize_tiling_direction(current_match, cmd_output,
|
if (!cmd_resize_tiling_direction(current_match, cmd_output,
|
||||||
current->con, direction,
|
current->con, direction,
|
||||||
resize_px, resize_ppt))
|
resize_px, resize_ppt)) {
|
||||||
|
yerror("Cannot resize.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -657,7 +661,7 @@ static bool resize_set_tiling(I3_CMD, Con *target, orientation_t resize_orientat
|
||||||
void cmd_resize_set(I3_CMD, long cwidth, const char *mode_width, long cheight, const char *mode_height) {
|
void cmd_resize_set(I3_CMD, long cwidth, const char *mode_width, long cheight, const char *mode_height) {
|
||||||
DLOG("resizing to %ld %s x %ld %s\n", cwidth, mode_width, cheight, mode_height);
|
DLOG("resizing to %ld %s x %ld %s\n", cwidth, mode_width, cheight, mode_height);
|
||||||
if (cwidth < 0 || cheight < 0) {
|
if (cwidth < 0 || cheight < 0) {
|
||||||
ELOG("Resize failed: dimensions cannot be negative (was %ld %s x %ld %s)\n", cwidth, mode_width, cheight, mode_height);
|
yerror("Dimensions cannot be negative.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,6 +786,7 @@ void cmd_append_layout(I3_CMD, const char *cpath) {
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
if ((len = slurp(path, &buf)) < 0) {
|
if ((len = slurp(path, &buf)) < 0) {
|
||||||
|
yerror("Could not slurp \"%s\".", path);
|
||||||
/* slurp already logged an error. */
|
/* slurp already logged an error. */
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1513,7 +1518,7 @@ void cmd_layout(I3_CMD, const char *layout_str) {
|
||||||
|
|
||||||
layout_t layout;
|
layout_t layout;
|
||||||
if (!layout_from_name(layout_str, &layout)) {
|
if (!layout_from_name(layout_str, &layout)) {
|
||||||
ELOG("Unknown layout \"%s\", this is a mismatch between code and parser spec.\n", layout_str);
|
yerror("Unknown layout \"%s\", this is a mismatch between code and parser spec.", layout_str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -353,7 +353,7 @@ CommandResult *parse_command(const char *input, yajl_gen gen) {
|
||||||
if (*walk == '\0' || *walk == ',' || *walk == ';') {
|
if (*walk == '\0' || *walk == ',' || *walk == ';') {
|
||||||
next_state(token);
|
next_state(token);
|
||||||
token_handled = true;
|
token_handled = true;
|
||||||
/* To make sure we start with an appropriate matching
|
/* To make sure we start with an appropriate matching
|
||||||
* datastructure for commands which do *not* specify any
|
* datastructure for commands which do *not* specify any
|
||||||
* criteria, we re-initialize the criteria system after
|
* criteria, we re-initialize the criteria system after
|
||||||
* every command. */
|
* every command. */
|
||||||
|
|
36
src/con.c
36
src/con.c
|
@ -1485,42 +1485,6 @@ Con *con_next_focused(Con *con) {
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the next/previous container in the specified orientation. This may
|
|
||||||
* travel up until it finds a container with suitable orientation.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
Con *con_get_next(Con *con, char way, orientation_t orientation) {
|
|
||||||
DLOG("con_get_next(way=%c, orientation=%d)\n", way, orientation);
|
|
||||||
/* 1: get the first parent with the same orientation */
|
|
||||||
Con *cur = con;
|
|
||||||
while (con_orientation(cur->parent) != orientation) {
|
|
||||||
DLOG("need to go one level further up\n");
|
|
||||||
if (cur->parent->type == CT_WORKSPACE) {
|
|
||||||
LOG("that's a workspace, we can't go further up\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
cur = cur->parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 2: chose next (or previous) */
|
|
||||||
Con *next;
|
|
||||||
if (way == 'n') {
|
|
||||||
next = TAILQ_NEXT(cur, nodes);
|
|
||||||
/* if we are at the end of the list, we need to wrap */
|
|
||||||
if (next == TAILQ_END(&(parent->nodes_head)))
|
|
||||||
return NULL;
|
|
||||||
} else {
|
|
||||||
next = TAILQ_PREV(cur, nodes_head, nodes);
|
|
||||||
/* if we are at the end of the list, we need to wrap */
|
|
||||||
if (next == TAILQ_END(&(cur->nodes_head)))
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
DLOG("next = %p\n", next);
|
|
||||||
|
|
||||||
return next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the focused con inside this client, descending the tree as far as
|
* Returns the focused con inside this client, descending the tree as far as
|
||||||
* possible. This comes in handy when attaching a con to a workspace at the
|
* possible. This comes in handy when attaching a con to a workspace at the
|
||||||
|
|
|
@ -202,7 +202,7 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
|
||||||
/* Clear the old config or initialize the data structure */
|
/* Clear the old config or initialize the data structure */
|
||||||
memset(&config, 0, sizeof(config));
|
memset(&config, 0, sizeof(config));
|
||||||
|
|
||||||
/* Initialize default colors */
|
/* Initialize default colors */
|
||||||
#define INIT_COLOR(x, cborder, cbackground, ctext, cindicator) \
|
#define INIT_COLOR(x, cborder, cbackground, ctext, cindicator) \
|
||||||
do { \
|
do { \
|
||||||
x.border = draw_util_hex_to_color(cborder); \
|
x.border = draw_util_hex_to_color(cborder); \
|
||||||
|
|
|
@ -409,7 +409,7 @@ struct ConfigResultIR *parse_config(const char *input, struct context *context)
|
||||||
if (*walk == '\0' || *walk == '\n' || *walk == '\r') {
|
if (*walk == '\0' || *walk == '\n' || *walk == '\r') {
|
||||||
next_state(token);
|
next_state(token);
|
||||||
token_handled = true;
|
token_handled = true;
|
||||||
/* To make sure we start with an appropriate matching
|
/* To make sure we start with an appropriate matching
|
||||||
* datastructure for commands which do *not* specify any
|
* datastructure for commands which do *not* specify any
|
||||||
* criteria, we re-initialize the criteria system after
|
* criteria, we re-initialize the criteria system after
|
||||||
* every command. */
|
* every command. */
|
||||||
|
|
|
@ -124,9 +124,9 @@ void init_logging(void) {
|
||||||
*/
|
*/
|
||||||
void open_logbuffer(void) {
|
void open_logbuffer(void) {
|
||||||
/* Reserve 1% of the RAM for the logfile, but at max 25 MiB.
|
/* Reserve 1% of the RAM for the logfile, but at max 25 MiB.
|
||||||
* For 512 MiB of RAM this will lead to a 5 MiB log buffer.
|
* For 512 MiB of RAM this will lead to a 5 MiB log buffer.
|
||||||
* At the moment (2011-12-10), no testcase leads to an i3 log
|
* At the moment (2011-12-10), no testcase leads to an i3 log
|
||||||
* of more than ~ 600 KiB. */
|
* of more than ~ 600 KiB. */
|
||||||
logbuffer_size = min(physical_mem_bytes * 0.01, shmlog_size);
|
logbuffer_size = min(physical_mem_bytes * 0.01, shmlog_size);
|
||||||
#if defined(__FreeBSD__)
|
#if defined(__FreeBSD__)
|
||||||
sasprintf(&shmlogname, "/tmp/i3-log-%d", getpid());
|
sasprintf(&shmlogname, "/tmp/i3-log-%d", getpid());
|
||||||
|
|
|
@ -529,7 +529,7 @@ int main(int argc, char *argv[]) {
|
||||||
root_screen = xcb_aux_get_screen(conn, conn_screen);
|
root_screen = xcb_aux_get_screen(conn, conn_screen);
|
||||||
root = root_screen->root;
|
root = root_screen->root;
|
||||||
|
|
||||||
/* Place requests for the atoms we need as soon as possible */
|
/* Place requests for the atoms we need as soon as possible */
|
||||||
#define xmacro(atom) \
|
#define xmacro(atom) \
|
||||||
xcb_intern_atom_cookie_t atom##_cookie = xcb_intern_atom(conn, 0, strlen(#atom), #atom);
|
xcb_intern_atom_cookie_t atom##_cookie = xcb_intern_atom(conn, 0, strlen(#atom), #atom);
|
||||||
#include "atoms.xmacro"
|
#include "atoms.xmacro"
|
||||||
|
@ -567,7 +567,7 @@ int main(int argc, char *argv[]) {
|
||||||
xcb_get_geometry_cookie_t gcookie = xcb_get_geometry(conn, root);
|
xcb_get_geometry_cookie_t gcookie = xcb_get_geometry(conn, root);
|
||||||
xcb_query_pointer_cookie_t pointercookie = xcb_query_pointer(conn, root);
|
xcb_query_pointer_cookie_t pointercookie = xcb_query_pointer(conn, root);
|
||||||
|
|
||||||
/* Setup NetWM atoms */
|
/* Setup NetWM atoms */
|
||||||
#define xmacro(name) \
|
#define xmacro(name) \
|
||||||
do { \
|
do { \
|
||||||
xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(conn, name##_cookie, NULL); \
|
xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(conn, name##_cookie, NULL); \
|
||||||
|
|
14
src/render.c
14
src/render.c
|
@ -134,17 +134,17 @@ void render_con(Con *con) {
|
||||||
x_raise_con(child);
|
x_raise_con(child);
|
||||||
if ((child = TAILQ_FIRST(&(con->focus_head)))) {
|
if ((child = TAILQ_FIRST(&(con->focus_head)))) {
|
||||||
/* By rendering the stacked container again, we handle the case
|
/* By rendering the stacked container again, we handle the case
|
||||||
* that we have a non-leaf-container inside the stack. In that
|
* that we have a non-leaf-container inside the stack. In that
|
||||||
* case, the children of the non-leaf-container need to be raised
|
* case, the children of the non-leaf-container need to be
|
||||||
* as well. */
|
* raised as well. */
|
||||||
render_con(child);
|
render_con(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.children != 1)
|
if (params.children != 1)
|
||||||
/* Raise the stack con itself. This will put the stack decoration on
|
/* Raise the stack con itself. This will put the stack
|
||||||
* top of every stack window. That way, when a new window is opened in
|
* decoration on top of every stack window. That way, when a
|
||||||
* the stack, the old window will not obscure part of the decoration
|
* new window is opened in the stack, the old window will not
|
||||||
* (it’s unmapped afterwards). */
|
* obscure part of the decoration (it’s unmapped afterwards). */
|
||||||
x_raise_con(con);
|
x_raise_con(con);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,8 +121,8 @@ bool scratchpad_show(Con *con) {
|
||||||
DLOG("Found an unfocused scratchpad window on this workspace\n");
|
DLOG("Found an unfocused scratchpad window on this workspace\n");
|
||||||
DLOG("Focusing it: %p\n", walk_con);
|
DLOG("Focusing it: %p\n", walk_con);
|
||||||
/* use con_descend_tiling_focused to get the last focused
|
/* use con_descend_tiling_focused to get the last focused
|
||||||
* window inside this scratch container in order to
|
* window inside this scratch container in order to
|
||||||
* keep the focus the same within this container */
|
* keep the focus the same within this container */
|
||||||
con_activate(con_descend_tiling_focused(walk_con));
|
con_activate(con_descend_tiling_focused(walk_con));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -413,8 +413,7 @@ int sd_booted(void) {
|
||||||
|
|
||||||
struct stat a, b;
|
struct stat a, b;
|
||||||
|
|
||||||
/* We simply test whether the systemd cgroup hierarchy is
|
/* We simply test whether the systemd cgroup hierarchy is mounted */
|
||||||
* mounted */
|
|
||||||
|
|
||||||
if (lstat("/sys/fs/cgroup", &a) < 0)
|
if (lstat("/sys/fs/cgroup", &a) < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -439,7 +439,7 @@ void window_update_hints(i3Window *win, xcb_get_property_reply_t *prop, bool *ur
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void window_update_motif_hints(i3Window *win, xcb_get_property_reply_t *prop, border_style_t *motif_border_style) {
|
void window_update_motif_hints(i3Window *win, xcb_get_property_reply_t *prop, border_style_t *motif_border_style) {
|
||||||
/* This implementation simply mirrors Gnome's Metacity. Official
|
/* This implementation simply mirrors Gnome's Metacity. Official
|
||||||
* documentation of this hint is nowhere to be found.
|
* documentation of this hint is nowhere to be found.
|
||||||
* For more information see:
|
* For more information see:
|
||||||
* https://people.gnome.org/~tthurman/docs/metacity/xprops_8h-source.html
|
* https://people.gnome.org/~tthurman/docs/metacity/xprops_8h-source.html
|
||||||
|
|
Loading…
Reference in New Issue