Implemented new command 'move [window|container] [to] position mouse|cursor|pointer
fixes #1696
This commit is contained in:
parent
1aa42794ed
commit
4a585748a4
|
@ -258,6 +258,12 @@ void cmd_move_window_to_position(I3_CMD, char *method, char *x, char *y);
|
||||||
*/
|
*/
|
||||||
void cmd_move_window_to_center(I3_CMD, char *method);
|
void cmd_move_window_to_center(I3_CMD, char *method);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of 'move [window|container] [to] position mouse'
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void cmd_move_window_to_mouse(I3_CMD);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of 'move scratchpad'.
|
* Implementation of 'move scratchpad'.
|
||||||
*
|
*
|
||||||
|
|
|
@ -70,6 +70,12 @@ bool floating_maybe_reassign_ws(Con *con);
|
||||||
*/
|
*/
|
||||||
void floating_center(Con *con, Rect rect);
|
void floating_center(Con *con, Rect rect);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the given floating con to the current pointer position.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void floating_move_to_pointer(Con *con);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/**
|
/**
|
||||||
* Removes the floating client from its workspace and attaches it to the new
|
* Removes the floating client from its workspace and attaches it to the new
|
||||||
|
|
|
@ -271,6 +271,7 @@ state RENAME_WORKSPACE_NEW_NAME:
|
||||||
# move workspace to [output] <str>
|
# move workspace to [output] <str>
|
||||||
# move scratchpad
|
# move scratchpad
|
||||||
# move [window|container] [to] [absolute] position [ [<pixels> [px] <pixels> [px]] | center ]
|
# move [window|container] [to] [absolute] position [ [<pixels> [px] <pixels> [px]] | center ]
|
||||||
|
# move [window|container] [to] position mouse|cursor|pointer
|
||||||
state MOVE:
|
state MOVE:
|
||||||
'window'
|
'window'
|
||||||
->
|
->
|
||||||
|
@ -342,6 +343,8 @@ state MOVE_TO_ABSOLUTE_POSITION:
|
||||||
state MOVE_TO_POSITION:
|
state MOVE_TO_POSITION:
|
||||||
'center'
|
'center'
|
||||||
-> call cmd_move_window_to_center($method)
|
-> call cmd_move_window_to_center($method)
|
||||||
|
'mouse', 'cursor', 'pointer'
|
||||||
|
-> call cmd_move_window_to_mouse()
|
||||||
coord_x = word
|
coord_x = word
|
||||||
-> MOVE_TO_POSITION_X
|
-> MOVE_TO_POSITION_X
|
||||||
|
|
||||||
|
|
|
@ -1833,6 +1833,30 @@ void cmd_move_window_to_center(I3_CMD, char *method) {
|
||||||
ysuccess(true);
|
ysuccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Implementation of 'move [window|container] [to] position mouse'
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void cmd_move_window_to_mouse(I3_CMD) {
|
||||||
|
HANDLE_EMPTY_MATCH;
|
||||||
|
|
||||||
|
owindow *current;
|
||||||
|
TAILQ_FOREACH(current, &owindows, owindows) {
|
||||||
|
Con *floating_con = con_inside_floating(current->con);
|
||||||
|
if (floating_con == NULL) {
|
||||||
|
DLOG("con %p / %s is not floating, cannot move it to the mouse position.\n",
|
||||||
|
current->con, current->con->name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DLOG("moving floating container %p / %s to cursor position\n", floating_con, floating_con->name);
|
||||||
|
floating_move_to_pointer(floating_con);
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_output->needs_tree_render = true;
|
||||||
|
ysuccess(true);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Implementation of 'move scratchpad'.
|
* Implementation of 'move scratchpad'.
|
||||||
*
|
*
|
||||||
|
|
|
@ -426,6 +426,38 @@ void floating_center(Con *con, Rect rect) {
|
||||||
con->rect.y = rect.y + (rect.height / 2) - (con->rect.height / 2);
|
con->rect.y = rect.y + (rect.height / 2) - (con->rect.height / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Moves the given floating con to the current pointer position.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void floating_move_to_pointer(Con *con) {
|
||||||
|
assert(con->type == CT_FLOATING_CON);
|
||||||
|
|
||||||
|
xcb_query_pointer_reply_t *reply = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, root), NULL);
|
||||||
|
if (reply == NULL) {
|
||||||
|
ELOG("could not query pointer position, not moving this container\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Output *output = get_output_containing(reply->root_x, reply->root_y);
|
||||||
|
|
||||||
|
/* Determine where to put the window. */
|
||||||
|
int32_t x = reply->root_x - con->rect.width / 2;
|
||||||
|
int32_t y = reply->root_y - con->rect.height / 2;
|
||||||
|
FREE(reply);
|
||||||
|
|
||||||
|
/* Correct target coordinates to be in-bounds. */
|
||||||
|
x = MAX(x, (int32_t)output->rect.x);
|
||||||
|
y = MAX(y, (int32_t)output->rect.y);
|
||||||
|
if (x + con->rect.width > output->rect.x + output->rect.width)
|
||||||
|
x = output->rect.x + output->rect.width - con->rect.width;
|
||||||
|
if (y + con->rect.height > output->rect.y + output->rect.height)
|
||||||
|
y = output->rect.y + output->rect.height - con->rect.height;
|
||||||
|
|
||||||
|
/* Update container's coordinates to position it correctly. */
|
||||||
|
floating_reposition(con, (Rect){x, y, con->rect.width, con->rect.height});
|
||||||
|
}
|
||||||
|
|
||||||
DRAGGING_CB(drag_window_callback) {
|
DRAGGING_CB(drag_window_callback) {
|
||||||
const struct xcb_button_press_event_t *event = extra;
|
const struct xcb_button_press_event_t *event = extra;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue