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();
|
||||
|
||||
/**
|
||||
* Set warp_to coordinates. This will trigger on the next call to
|
||||
* x_push_changes().
|
||||
*
|
||||
*/
|
||||
void x_set_warp_to(Rect *rect);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -591,6 +591,13 @@ void con_move_to_workspace(Con *con, Con *workspace) {
|
|||
if (source_output != dest_output &&
|
||||
workspace_is_visible(workspace)) {
|
||||
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);
|
||||
|
|
|
@ -414,8 +414,10 @@ static bool _tree_next(Con *con, char way, orientation_t orientation, bool wrap)
|
|||
|
||||
workspace_show(workspace->name);
|
||||
Con *focus = con_descend_direction(workspace, direction);
|
||||
if (focus)
|
||||
if (focus) {
|
||||
con_focus(focus);
|
||||
x_set_warp_to(&(focus->rect));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -227,7 +227,7 @@ void workspace_show(const char *num) {
|
|||
/* Set mouse pointer */
|
||||
Con *new_output = con_get_output(focused);
|
||||
if (old_output != new_output) {
|
||||
xcb_warp_pointer_rect(conn, &next->rect);
|
||||
x_set_warp_to(&next->rect);
|
||||
}
|
||||
|
||||
/* 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 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).
|
||||
* 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;
|
||||
}
|
||||
|
||||
if (warp_to) {
|
||||
xcb_warp_pointer_rect(conn, warp_to);
|
||||
warp_to = NULL;
|
||||
}
|
||||
|
||||
xcb_flush(conn);
|
||||
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,
|
||||
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) {
|
||||
xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0,
|
||||
rect->x + (rect->width / 2),
|
||||
rect->y + (rect->height / 2));
|
||||
int mid_x = rect->x + (rect->width / 2);
|
||||
int mid_y = 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