*/
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'.
*
*/
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
/**
* Removes the floating client from its workspace and attaches it to the new
# move workspace to [output] <str>
# move scratchpad
# move [window|container] [to] [absolute] position [ [<pixels> [px] <pixels> [px]] | center ]
+# move [window|container] [to] position mouse|cursor|pointer
state MOVE:
'window'
->
state MOVE_TO_POSITION:
'center'
-> call cmd_move_window_to_center($method)
+ 'mouse', 'cursor', 'pointer'
+ -> call cmd_move_window_to_mouse()
coord_x = word
-> MOVE_TO_POSITION_X
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'.
*
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) {
const struct xcb_button_press_event_t *event = extra;