wrap when moving things to outputs with direction
This commit is contained in:
parent
3cd4b8c111
commit
f13d8ed06f
@ -87,20 +87,29 @@ Output *get_output_by_name(const char *name);
|
|||||||
*/
|
*/
|
||||||
Output *get_output_containing(int x, int y);
|
Output *get_output_containing(int x, int y);
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the output which is the last one in the given direction, for example
|
|
||||||
* the output on the most bottom when direction == D_DOWN, the output most
|
|
||||||
* right when direction == D_RIGHT and so on.
|
|
||||||
*
|
|
||||||
* This function always returns a output.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
Output *get_output_most(direction_t direction, Output *current);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the output which is the next one in the given direction.
|
* Gets the output which is the next one in the given direction.
|
||||||
*
|
*
|
||||||
|
* If close_far == CLOSEST_OUTPUT, then the output next to the current one will
|
||||||
|
* selected. If close_far == FARTHEST_OUTPUT, the output which is the last one
|
||||||
|
* in the given direction will be selected.
|
||||||
|
*
|
||||||
|
* NULL will be returned when no active outputs are present in the direction
|
||||||
|
* specified (note that ‘current’ counts as such an output).
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
Output *get_output_next(direction_t direction, Output *current, output_close_far_t close_far);
|
Output *get_output_next(direction_t direction, Output *current, output_close_far_t close_far);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Like get_output_next with close_far == CLOSEST_OUTPUT, but wraps.
|
||||||
|
*
|
||||||
|
* For example if get_output_next(D_DOWN, x, FARTHEST_OUTPUT) = NULL, then
|
||||||
|
* get_output_next_wrap(D_DOWN, x) will return the topmost output.
|
||||||
|
*
|
||||||
|
* This function always returns a output: if no active outputs can be found,
|
||||||
|
* current itself is returned.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
Output *get_output_next_wrap(direction_t direction, Output *current);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -55,23 +55,15 @@ static bool definitelyGreaterThan(float a, float b, float epsilon) {
|
|||||||
static Output *get_output_from_string(Output *current_output, const char *output_str) {
|
static Output *get_output_from_string(Output *current_output, const char *output_str) {
|
||||||
Output *output;
|
Output *output;
|
||||||
|
|
||||||
if (strcasecmp(output_str, "left") == 0) {
|
if (strcasecmp(output_str, "left") == 0)
|
||||||
output = get_output_next(D_LEFT, current_output, CLOSEST_OUTPUT);
|
output = get_output_next_wrap(D_LEFT, current_output);
|
||||||
if (!output)
|
else if (strcasecmp(output_str, "right") == 0)
|
||||||
output = get_output_most(D_RIGHT, current_output);
|
output = get_output_next_wrap(D_RIGHT, current_output);
|
||||||
} else if (strcasecmp(output_str, "right") == 0) {
|
else if (strcasecmp(output_str, "up") == 0)
|
||||||
output = get_output_next(D_RIGHT, current_output, CLOSEST_OUTPUT);
|
output = get_output_next_wrap(D_UP, current_output);
|
||||||
if (!output)
|
else if (strcasecmp(output_str, "down") == 0)
|
||||||
output = get_output_most(D_LEFT, current_output);
|
output = get_output_next_wrap(D_DOWN, current_output);
|
||||||
} else if (strcasecmp(output_str, "up") == 0) {
|
else output = get_output_by_name(output_str);
|
||||||
output = get_output_next(D_UP, current_output, CLOSEST_OUTPUT);
|
|
||||||
if (!output)
|
|
||||||
output = get_output_most(D_DOWN, current_output);
|
|
||||||
} else if (strcasecmp(output_str, "down") == 0) {
|
|
||||||
output = get_output_next(D_DOWN, current_output, CLOSEST_OUTPUT);
|
|
||||||
if (!output)
|
|
||||||
output = get_output_most(D_UP, current_output);
|
|
||||||
} else output = get_output_by_name(output_str);
|
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@ -1052,13 +1044,13 @@ void cmd_move_con_to_output(I3_CMD, char *name) {
|
|||||||
|
|
||||||
// TODO: clean this up with commands.spec as soon as we switched away from the lex/yacc command parser
|
// TODO: clean this up with commands.spec as soon as we switched away from the lex/yacc command parser
|
||||||
if (strcasecmp(name, "up") == 0)
|
if (strcasecmp(name, "up") == 0)
|
||||||
output = get_output_next(D_UP, current_output, CLOSEST_OUTPUT);
|
output = get_output_next_wrap(D_UP, current_output);
|
||||||
else if (strcasecmp(name, "down") == 0)
|
else if (strcasecmp(name, "down") == 0)
|
||||||
output = get_output_next(D_DOWN, current_output, CLOSEST_OUTPUT);
|
output = get_output_next_wrap(D_DOWN, current_output);
|
||||||
else if (strcasecmp(name, "left") == 0)
|
else if (strcasecmp(name, "left") == 0)
|
||||||
output = get_output_next(D_LEFT, current_output, CLOSEST_OUTPUT);
|
output = get_output_next_wrap(D_LEFT, current_output);
|
||||||
else if (strcasecmp(name, "right") == 0)
|
else if (strcasecmp(name, "right") == 0)
|
||||||
output = get_output_next(D_RIGHT, current_output, CLOSEST_OUTPUT);
|
output = get_output_next_wrap(D_RIGHT, current_output);
|
||||||
else
|
else
|
||||||
output = get_output_by_name(name);
|
output = get_output_by_name(name);
|
||||||
|
|
||||||
|
34
src/randr.c
34
src/randr.c
@ -93,15 +93,30 @@ Output *get_output_containing(int x, int y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Gets the output which is the last one in the given direction, for example
|
* Like get_output_next with close_far == CLOSEST_OUTPUT, but wraps.
|
||||||
* the output on the most bottom when direction == D_DOWN, the output most
|
|
||||||
* right when direction == D_RIGHT and so on.
|
|
||||||
*
|
*
|
||||||
* This function always returns a output.
|
* For example if get_output_next(D_DOWN, x, FARTHEST_OUTPUT) = NULL, then
|
||||||
|
* get_output_next_wrap(D_DOWN, x) will return the topmost output.
|
||||||
|
*
|
||||||
|
* This function always returns a output: if no active outputs can be found,
|
||||||
|
* current itself is returned.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
Output *get_output_most(direction_t direction, Output *current) {
|
Output *get_output_next_wrap(direction_t direction, Output *current) {
|
||||||
Output *best = get_output_next(direction, current, FARTHEST_OUTPUT);
|
Output *best = get_output_next(direction, current, CLOSEST_OUTPUT);
|
||||||
|
/* If no output can be found, wrap */
|
||||||
|
if (!best) {
|
||||||
|
direction_t opposite;
|
||||||
|
if (direction == D_RIGHT)
|
||||||
|
opposite = D_LEFT;
|
||||||
|
else if (direction == D_LEFT)
|
||||||
|
opposite = D_RIGHT;
|
||||||
|
else if (direction == D_DOWN)
|
||||||
|
opposite = D_UP;
|
||||||
|
else
|
||||||
|
opposite = D_DOWN;
|
||||||
|
best = get_output_next(opposite, current, FARTHEST_OUTPUT);
|
||||||
|
}
|
||||||
if (!best)
|
if (!best)
|
||||||
best = current;
|
best = current;
|
||||||
DLOG("current = %s, best = %s\n", current->name, best->name);
|
DLOG("current = %s, best = %s\n", current->name, best->name);
|
||||||
@ -111,6 +126,13 @@ Output *get_output_most(direction_t direction, Output *current) {
|
|||||||
/*
|
/*
|
||||||
* Gets the output which is the next one in the given direction.
|
* Gets the output which is the next one in the given direction.
|
||||||
*
|
*
|
||||||
|
* If close_far == CLOSEST_OUTPUT, then the output next to the current one will
|
||||||
|
* selected. If close_far == FARTHEST_OUTPUT, the output which is the last one
|
||||||
|
* in the given direction will be selected.
|
||||||
|
*
|
||||||
|
* NULL will be returned when no active outputs are present in the direction
|
||||||
|
* specified (note that “current” counts as such an output).
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
Output *get_output_next(direction_t direction, Output *current, output_close_far_t close_far) {
|
Output *get_output_next(direction_t direction, Output *current, output_close_far_t close_far) {
|
||||||
Rect *cur = &(current->rect),
|
Rect *cur = &(current->rect),
|
||||||
|
Loading…
Reference in New Issue
Block a user