Merge branch 'master' into bar-bindsym
This commit is contained in:
commit
cd6917d4a8
|
@ -95,7 +95,7 @@ struct cmd_results *add_color(const char *name,
|
||||||
/**
|
/**
|
||||||
* TODO: Move this function and its dependent functions to container.c.
|
* TODO: Move this function and its dependent functions to container.c.
|
||||||
*/
|
*/
|
||||||
bool container_resize_tiled(struct sway_container *parent, enum wlr_edges edge,
|
void container_resize_tiled(struct sway_container *parent, enum wlr_edges edge,
|
||||||
int amount);
|
int amount);
|
||||||
|
|
||||||
sway_cmd cmd_assign;
|
sway_cmd cmd_assign;
|
||||||
|
|
|
@ -331,6 +331,12 @@ enum focus_wrapping_mode {
|
||||||
WRAP_FORCE
|
WRAP_FORCE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum mouse_warping_mode {
|
||||||
|
WARP_NO,
|
||||||
|
WARP_OUTPUT,
|
||||||
|
WARP_CONTAINER
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The configuration struct. The result of loading a config file.
|
* The configuration struct. The result of loading a config file.
|
||||||
*/
|
*/
|
||||||
|
@ -372,7 +378,7 @@ struct sway_config {
|
||||||
// Flags
|
// Flags
|
||||||
bool focus_follows_mouse;
|
bool focus_follows_mouse;
|
||||||
bool raise_floating;
|
bool raise_floating;
|
||||||
bool mouse_warping;
|
enum mouse_warping_mode mouse_warping;
|
||||||
enum focus_wrapping_mode focus_wrapping;
|
enum focus_wrapping_mode focus_wrapping;
|
||||||
bool active;
|
bool active;
|
||||||
bool failed;
|
bool failed;
|
||||||
|
|
|
@ -6,13 +6,15 @@ struct cmd_results *cmd_mouse_warping(int argc, char **argv) {
|
||||||
struct cmd_results *error = NULL;
|
struct cmd_results *error = NULL;
|
||||||
if ((error = checkarg(argc, "mouse_warping", EXPECTED_EQUAL_TO, 1))) {
|
if ((error = checkarg(argc, "mouse_warping", EXPECTED_EQUAL_TO, 1))) {
|
||||||
return error;
|
return error;
|
||||||
|
} else if (strcasecmp(argv[0], "container") == 0) {
|
||||||
|
config->mouse_warping = WARP_CONTAINER;
|
||||||
} else if (strcasecmp(argv[0], "output") == 0) {
|
} else if (strcasecmp(argv[0], "output") == 0) {
|
||||||
config->mouse_warping = true;
|
config->mouse_warping = WARP_OUTPUT;
|
||||||
} else if (strcasecmp(argv[0], "none") == 0) {
|
} else if (strcasecmp(argv[0], "none") == 0) {
|
||||||
config->mouse_warping = false;
|
config->mouse_warping = WARP_NO;
|
||||||
} else {
|
} else {
|
||||||
return cmd_results_new(CMD_FAILURE, "mouse_warping",
|
return cmd_results_new(CMD_FAILURE, "mouse_warping",
|
||||||
"Expected 'mouse_warping output|none'");
|
"Expected 'mouse_warping output|container|none'");
|
||||||
}
|
}
|
||||||
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
return cmd_results_new(CMD_SUCCESS, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,11 +179,11 @@ static void container_recursive_resize(struct sway_container *container,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool resize_tiled(struct sway_container *parent, int amount,
|
static void resize_tiled(struct sway_container *parent, int amount,
|
||||||
enum resize_axis axis) {
|
enum resize_axis axis) {
|
||||||
struct sway_container *focused = parent;
|
struct sway_container *focused = parent;
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum sway_container_layout parallel_layout =
|
enum sway_container_layout parallel_layout =
|
||||||
|
@ -216,7 +216,7 @@ static bool resize_tiled(struct sway_container *parent, int amount,
|
||||||
}
|
}
|
||||||
if (!parent) {
|
if (!parent) {
|
||||||
// Can't resize in this direction
|
// Can't resize in this direction
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implement up/down/left/right direction by zeroing one of the weights,
|
// Implement up/down/left/right direction by zeroing one of the weights,
|
||||||
|
@ -248,22 +248,22 @@ static bool resize_tiled(struct sway_container *parent, int amount,
|
||||||
if (sibling_pos < parent_pos && minor_weight) {
|
if (sibling_pos < parent_pos && minor_weight) {
|
||||||
double pixels = -amount / minor_weight;
|
double pixels = -amount / minor_weight;
|
||||||
if (major_weight && (sibling_size + pixels / 2) < min_sane) {
|
if (major_weight && (sibling_size + pixels / 2) < min_sane) {
|
||||||
return false; // Too small
|
return; // Too small
|
||||||
} else if (!major_weight && sibling_size + pixels < min_sane) {
|
} else if (!major_weight && sibling_size + pixels < min_sane) {
|
||||||
return false; // Too small
|
return; // Too small
|
||||||
}
|
}
|
||||||
} else if (sibling_pos > parent_pos && major_weight) {
|
} else if (sibling_pos > parent_pos && major_weight) {
|
||||||
double pixels = -amount / major_weight;
|
double pixels = -amount / major_weight;
|
||||||
if (minor_weight && (sibling_size + pixels / 2) < min_sane) {
|
if (minor_weight && (sibling_size + pixels / 2) < min_sane) {
|
||||||
return false; // Too small
|
return; // Too small
|
||||||
} else if (!minor_weight && sibling_size + pixels < min_sane) {
|
} else if (!minor_weight && sibling_size + pixels < min_sane) {
|
||||||
return false; // Too small
|
return; // Too small
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
double pixels = amount;
|
double pixels = amount;
|
||||||
if (parent_size + pixels < min_sane) {
|
if (parent_size + pixels < min_sane) {
|
||||||
return false; // Too small
|
return; // Too small
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -317,10 +317,9 @@ static bool resize_tiled(struct sway_container *parent, int amount,
|
||||||
} else {
|
} else {
|
||||||
arrange_workspace(parent->workspace);
|
arrange_workspace(parent->workspace);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool container_resize_tiled(struct sway_container *parent,
|
void container_resize_tiled(struct sway_container *parent,
|
||||||
enum wlr_edges edge, int amount) {
|
enum wlr_edges edge, int amount) {
|
||||||
enum resize_axis axis = RESIZE_AXIS_INVALID;
|
enum resize_axis axis = RESIZE_AXIS_INVALID;
|
||||||
switch (edge) {
|
switch (edge) {
|
||||||
|
@ -339,7 +338,7 @@ bool container_resize_tiled(struct sway_container *parent,
|
||||||
case WLR_EDGE_NONE:
|
case WLR_EDGE_NONE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return resize_tiled(parent, amount, axis);
|
resize_tiled(parent, amount, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -447,7 +446,10 @@ static struct cmd_results *resize_adjust_tiled(enum resize_axis axis,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!resize_tiled(current, amount->amount, axis)) {
|
double old_width = current->width;
|
||||||
|
double old_height = current->height;
|
||||||
|
resize_tiled(current, amount->amount, axis);
|
||||||
|
if (current->width == old_width && current->height == old_height) {
|
||||||
return cmd_results_new(CMD_INVALID, "resize",
|
return cmd_results_new(CMD_INVALID, "resize",
|
||||||
"Cannot resize any further");
|
"Cannot resize any further");
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,7 +223,7 @@ static void config_defaults(struct sway_config *config) {
|
||||||
// Flags
|
// Flags
|
||||||
config->focus_follows_mouse = true;
|
config->focus_follows_mouse = true;
|
||||||
config->raise_floating = true;
|
config->raise_floating = true;
|
||||||
config->mouse_warping = true;
|
config->mouse_warping = WARP_OUTPUT;
|
||||||
config->focus_wrapping = WRAP_YES;
|
config->focus_wrapping = WRAP_YES;
|
||||||
config->validating = false;
|
config->validating = false;
|
||||||
config->reloading = false;
|
config->reloading = false;
|
||||||
|
|
|
@ -877,6 +877,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
while (cont->parent) {
|
while (cont->parent) {
|
||||||
cont = cont->parent;
|
cont = cont->parent;
|
||||||
}
|
}
|
||||||
|
seat_set_focus_container(seat, cont);
|
||||||
seat_begin_move_floating(seat, cont, button);
|
seat_begin_move_floating(seat, cont, button);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -772,7 +772,9 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (last_focus) {
|
if (last_focus) {
|
||||||
if (config->mouse_warping && warp && new_output != last_output) {
|
if (config->mouse_warping && warp &&
|
||||||
|
(new_output != last_output ||
|
||||||
|
config->mouse_warping == WARP_CONTAINER)) {
|
||||||
double x = 0;
|
double x = 0;
|
||||||
double y = 0;
|
double y = 0;
|
||||||
if (container) {
|
if (container) {
|
||||||
|
@ -782,9 +784,11 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
|
||||||
x = new_workspace->x + new_workspace->width / 2.0;
|
x = new_workspace->x + new_workspace->width / 2.0;
|
||||||
y = new_workspace->y + new_workspace->height / 2.0;
|
y = new_workspace->y + new_workspace->height / 2.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wlr_output_layout_contains_point(root->output_layout,
|
if (!wlr_output_layout_contains_point(root->output_layout,
|
||||||
new_output->wlr_output, seat->cursor->cursor->x,
|
new_output->wlr_output, seat->cursor->cursor->x,
|
||||||
seat->cursor->cursor->y)) {
|
seat->cursor->cursor->y)
|
||||||
|
|| config->mouse_warping == WARP_CONTAINER) {
|
||||||
wlr_cursor_warp(seat->cursor->cursor, NULL, x, y);
|
wlr_cursor_warp(seat->cursor->cursor, NULL, x, y);
|
||||||
cursor_send_pointer_motion(seat->cursor, 0, true);
|
cursor_send_pointer_motion(seat->cursor, 0, true);
|
||||||
}
|
}
|
||||||
|
@ -1038,7 +1042,7 @@ void seat_begin_down(struct sway_seat *seat, struct sway_container *con,
|
||||||
seat->op_moved = false;
|
seat->op_moved = false;
|
||||||
|
|
||||||
// In case the container was not raised by gaining focus, raise on click
|
// In case the container was not raised by gaining focus, raise on click
|
||||||
if (con && !config->raise_floating) {
|
if (!config->raise_floating) {
|
||||||
container_raise_floating(con);
|
container_raise_floating(con);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1052,6 +1056,12 @@ void seat_begin_move_floating(struct sway_seat *seat,
|
||||||
seat->operation = OP_MOVE_FLOATING;
|
seat->operation = OP_MOVE_FLOATING;
|
||||||
seat->op_container = con;
|
seat->op_container = con;
|
||||||
seat->op_button = button;
|
seat->op_button = button;
|
||||||
|
|
||||||
|
// In case the container was not raised by gaining focus, raise on click
|
||||||
|
if (!config->raise_floating) {
|
||||||
|
container_raise_floating(con);
|
||||||
|
}
|
||||||
|
|
||||||
cursor_set_image(seat->cursor, "grab", NULL);
|
cursor_set_image(seat->cursor, "grab", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1085,6 +1095,11 @@ void seat_begin_resize_floating(struct sway_seat *seat,
|
||||||
seat->op_ref_con_ly = con->y;
|
seat->op_ref_con_ly = con->y;
|
||||||
seat->op_ref_width = con->width;
|
seat->op_ref_width = con->width;
|
||||||
seat->op_ref_height = con->height;
|
seat->op_ref_height = con->height;
|
||||||
|
//
|
||||||
|
// In case the container was not raised by gaining focus, raise on click
|
||||||
|
if (!config->raise_floating) {
|
||||||
|
container_raise_floating(con);
|
||||||
|
}
|
||||||
|
|
||||||
const char *image = edge == WLR_EDGE_NONE ?
|
const char *image = edge == WLR_EDGE_NONE ?
|
||||||
"se-resize" : wlr_xcursor_get_resize_name(edge);
|
"se-resize" : wlr_xcursor_get_resize_name(edge);
|
||||||
|
|
|
@ -492,9 +492,10 @@ The default colors are:
|
||||||
If _--pango\_markup_ is given, then _mode_ will be interpreted as pango
|
If _--pango\_markup_ is given, then _mode_ will be interpreted as pango
|
||||||
markup.
|
markup.
|
||||||
|
|
||||||
*mouse\_warping* output|none
|
*mouse\_warping* output|container|none
|
||||||
If _output_ is specified, the mouse will be moved to new outputs as you
|
If _output_ is specified, the mouse will be moved to new outputs as you
|
||||||
move focus between them. Default is _output_.
|
move focus between them. If _container_ is specified, the mouse will be
|
||||||
|
moved to the middle of the container on switch. Default is _output_.
|
||||||
|
|
||||||
*no\_focus* <criteria>
|
*no\_focus* <criteria>
|
||||||
Prevents windows matching <criteria> from being focused automatically when
|
Prevents windows matching <criteria> from being focused automatically when
|
||||||
|
@ -598,7 +599,7 @@ match any output by using the output name "\*".
|
||||||
*workspace* prev\_on\_output|next\_on\_output
|
*workspace* prev\_on\_output|next\_on\_output
|
||||||
Switches to the next workspace on the current output.
|
Switches to the next workspace on the current output.
|
||||||
|
|
||||||
*workspace* back_and_forth
|
*workspace* back\_and\_forth
|
||||||
Switches to the previously focused workspace.
|
Switches to the previously focused workspace.
|
||||||
|
|
||||||
*workspace* <name> gaps inner|outer <amount>
|
*workspace* <name> gaps inner|outer <amount>
|
||||||
|
|
|
@ -358,7 +358,6 @@ struct sway_container *container_at(struct sway_workspace *workspace,
|
||||||
struct wlr_surface **surface, double *sx, double *sy) {
|
struct wlr_surface **surface, double *sx, double *sy) {
|
||||||
struct sway_container *c;
|
struct sway_container *c;
|
||||||
|
|
||||||
// Focused view's popups
|
|
||||||
struct sway_seat *seat = input_manager_current_seat(input_manager);
|
struct sway_seat *seat = input_manager_current_seat(input_manager);
|
||||||
struct sway_container *focus = seat_get_focused_container(seat);
|
struct sway_container *focus = seat_get_focused_container(seat);
|
||||||
bool is_floating = focus && container_is_floating_or_child(focus);
|
bool is_floating = focus && container_is_floating_or_child(focus);
|
||||||
|
@ -370,14 +369,11 @@ struct sway_container *container_at(struct sway_workspace *workspace,
|
||||||
}
|
}
|
||||||
*surface = NULL;
|
*surface = NULL;
|
||||||
}
|
}
|
||||||
// Cast a ray to handle floating windows
|
// Floating
|
||||||
for (int i = workspace->floating->length - 1; i >= 0; --i) {
|
if ((c = floating_container_at(lx, ly, surface ,sx ,sy))) {
|
||||||
struct sway_container *cn = workspace->floating->items[i];
|
return c;
|
||||||
if (cn->view && (c = surface_at_view(cn, lx, ly, surface, sx, sy))) {
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// If focused is tiling, focused view's non-popups
|
// Tiling (focused)
|
||||||
if (focus && focus->view && !is_floating) {
|
if (focus && focus->view && !is_floating) {
|
||||||
if ((c = surface_at_view(focus, lx, ly, surface, sx, sy))) {
|
if ((c = surface_at_view(focus, lx, ly, surface, sx, sy))) {
|
||||||
return c;
|
return c;
|
||||||
|
|
|
@ -243,10 +243,10 @@ void view_autoconfigure(struct sway_view *view) {
|
||||||
// title area. We have to offset the surface y by the height of the title,
|
// title area. We have to offset the surface y by the height of the title,
|
||||||
// bar, and disable any top border because we'll always have the title bar.
|
// bar, and disable any top border because we'll always have the title bar.
|
||||||
enum sway_container_layout layout = container_parent_layout(con);
|
enum sway_container_layout layout = container_parent_layout(con);
|
||||||
if (layout == L_TABBED) {
|
if (layout == L_TABBED && !container_is_floating(con)) {
|
||||||
y_offset = container_titlebar_height();
|
y_offset = container_titlebar_height();
|
||||||
view->border_top = false;
|
view->border_top = false;
|
||||||
} else if (layout == L_STACKED) {
|
} else if (layout == L_STACKED && !container_is_floating(con)) {
|
||||||
list_t *siblings = container_get_siblings(con);
|
list_t *siblings = container_get_siblings(con);
|
||||||
y_offset = container_titlebar_height() * siblings->length;
|
y_offset = container_titlebar_height() * siblings->length;
|
||||||
view->border_top = false;
|
view->border_top = false;
|
||||||
|
|
|
@ -624,7 +624,10 @@ void workspace_add_gaps(struct sway_workspace *ws) {
|
||||||
if (config->smart_gaps) {
|
if (config->smart_gaps) {
|
||||||
struct sway_seat *seat = input_manager_get_default_seat(input_manager);
|
struct sway_seat *seat = input_manager_get_default_seat(input_manager);
|
||||||
struct sway_container *focus =
|
struct sway_container *focus =
|
||||||
seat_get_focus_inactive_view(seat, &ws->node);
|
seat_get_focus_inactive_tiling(seat, ws);
|
||||||
|
if (focus && !focus->view) {
|
||||||
|
focus = seat_get_focus_inactive_view(seat, &focus->node);
|
||||||
|
}
|
||||||
if (focus && focus->view && view_is_only_visible(focus->view)) {
|
if (focus && focus->view && view_is_only_visible(focus->view)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ int main(int argc, char **argv) {
|
||||||
bar_id = strdup(optarg);
|
bar_id = strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
fprintf(stdout, "sway version " SWAY_VERSION "\n");
|
fprintf(stdout, "swaybar version " SWAY_VERSION "\n");
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
case 'd': // Debug
|
case 'd': // Debug
|
||||||
|
|
|
@ -345,7 +345,7 @@ int main(int argc, char **argv) {
|
||||||
cmdtype = strdup(optarg);
|
cmdtype = strdup(optarg);
|
||||||
break;
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
fprintf(stdout, "sway version " SWAY_VERSION "\n");
|
fprintf(stdout, "swaymsg version " SWAY_VERSION "\n");
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in a new issue