Only warp pointer once during x_push_changes()
- Introduce warp_to static variable in x.c that stores the coordinates to warp to as a Rect. - Add x_set_warp_to function to set this variable. Use in _tree_next, workspace_show, and con_move_to_workspace. - In x_push_chanages, if warp_to is set, then call xcb_warp_pointer_rect and then reset it to NULL. This fixes all know bugs for pointer warping for me.
This commit is contained in:
parent
637d2a3d62
commit
36224f86d1
|
@ -104,4 +104,11 @@ void x_set_name(Con *con, const char *name);
|
||||||
*/
|
*/
|
||||||
void x_set_i3_atoms();
|
void x_set_i3_atoms();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set warp_to coordinates. This will trigger on the next call to
|
||||||
|
* x_push_changes().
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void x_set_warp_to(Rect *rect);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -591,6 +591,13 @@ void con_move_to_workspace(Con *con, Con *workspace) {
|
||||||
if (source_output != dest_output &&
|
if (source_output != dest_output &&
|
||||||
workspace_is_visible(workspace)) {
|
workspace_is_visible(workspace)) {
|
||||||
workspace_show(workspace->name);
|
workspace_show(workspace->name);
|
||||||
|
|
||||||
|
/* Unset warp_to if target con is floating. Otherwise, set warp_to to
|
||||||
|
* current target container. */
|
||||||
|
if (con->type == CT_FLOATING_CON)
|
||||||
|
x_set_warp_to(NULL);
|
||||||
|
else
|
||||||
|
x_set_warp_to(&(con->rect));
|
||||||
}
|
}
|
||||||
|
|
||||||
DLOG("Re-attaching container to %p / %s\n", next, next->name);
|
DLOG("Re-attaching container to %p / %s\n", next, next->name);
|
||||||
|
|
|
@ -414,8 +414,10 @@ static bool _tree_next(Con *con, char way, orientation_t orientation, bool wrap)
|
||||||
|
|
||||||
workspace_show(workspace->name);
|
workspace_show(workspace->name);
|
||||||
Con *focus = con_descend_direction(workspace, direction);
|
Con *focus = con_descend_direction(workspace, direction);
|
||||||
if (focus)
|
if (focus) {
|
||||||
con_focus(focus);
|
con_focus(focus);
|
||||||
|
x_set_warp_to(&(focus->rect));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,7 +227,7 @@ void workspace_show(const char *num) {
|
||||||
/* Set mouse pointer */
|
/* Set mouse pointer */
|
||||||
Con *new_output = con_get_output(focused);
|
Con *new_output = con_get_output(focused);
|
||||||
if (old_output != new_output) {
|
if (old_output != new_output) {
|
||||||
xcb_warp_pointer_rect(conn, &next->rect);
|
x_set_warp_to(&next->rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the EWMH hints */
|
/* Update the EWMH hints */
|
||||||
|
|
18
src/x.c
18
src/x.c
|
@ -12,6 +12,9 @@ xcb_window_t focused_id = XCB_NONE;
|
||||||
static xcb_window_t *btt_stack;
|
static xcb_window_t *btt_stack;
|
||||||
static int btt_stack_num;
|
static int btt_stack_num;
|
||||||
|
|
||||||
|
/* Stores coordinates to warp mouse pointer to if set */
|
||||||
|
static Rect *warp_to;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Describes the X11 state we may modify (map state, position, window stack).
|
* Describes the X11 state we may modify (map state, position, window stack).
|
||||||
* There is one entry per container. The state represents the current situation
|
* There is one entry per container. The state represents the current situation
|
||||||
|
@ -862,6 +865,11 @@ void x_push_changes(Con *con) {
|
||||||
focused_id = root;
|
focused_id = root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (warp_to) {
|
||||||
|
xcb_warp_pointer_rect(conn, warp_to);
|
||||||
|
warp_to = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
xcb_flush(conn);
|
xcb_flush(conn);
|
||||||
DLOG("\n\n ENDING CHANGES\n\n");
|
DLOG("\n\n ENDING CHANGES\n\n");
|
||||||
|
|
||||||
|
@ -937,3 +945,13 @@ void x_set_i3_atoms() {
|
||||||
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A_I3_CONFIG_PATH, A_UTF8_STRING, 8,
|
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root, A_I3_CONFIG_PATH, A_UTF8_STRING, 8,
|
||||||
strlen(current_configpath), current_configpath);
|
strlen(current_configpath), current_configpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set warp_to coordinates. This will trigger on the next call to
|
||||||
|
* x_push_changes().
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void x_set_warp_to(Rect *rect)
|
||||||
|
{
|
||||||
|
warp_to = rect;
|
||||||
|
}
|
||||||
|
|
|
@ -367,7 +367,9 @@ bool xcb_reply_contains_atom(xcb_get_property_reply_t *prop, xcb_atom_t atom) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void xcb_warp_pointer_rect(xcb_connection_t *conn, Rect *rect) {
|
void xcb_warp_pointer_rect(xcb_connection_t *conn, Rect *rect) {
|
||||||
xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0,
|
int mid_x = rect->x + (rect->width / 2);
|
||||||
rect->x + (rect->width / 2),
|
int mid_y = rect->y + (rect->height / 2);
|
||||||
rect->y + (rect->height / 2));
|
|
||||||
|
LOG("warp pointer to: %d %d\n", mid_x, mid_y);
|
||||||
|
xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0, mid_x, mid_y);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue