Skip to content
This repository has been archived by the owner on Nov 1, 2021. It is now read-only.

Implement pointer-constraints-unstable-v1 protocol #852

Merged
merged 17 commits into from
Sep 27, 2018
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
pointer-constraints: refactoring
* Rename the constraint_create signal to new_constraint for
  consistency
* Move the constraint_destroy signal to the constraint itself
* Use rotate_child_position instead of duplicating logic
* Fix inert constraint resource handling
* Style fixes
emersion committed Sep 27, 2018
commit dac4f8e19ffd19dfeee2c65270476a52c13d0f8f
3 changes: 1 addition & 2 deletions include/rootston/desktop.h
Original file line number Diff line number Diff line change
@@ -68,8 +68,7 @@ struct roots_desktop {
struct wl_listener input_inhibit_activate;
struct wl_listener input_inhibit_deactivate;
struct wl_listener virtual_keyboard_new;
struct wl_listener constraint_create;
struct wl_listener constraint_destroy;
struct wl_listener pointer_constraint;

#ifdef WLR_HAS_XWAYLAND
struct wlr_xwayland *xwayland;
3 changes: 3 additions & 0 deletions include/rootston/output.h
Original file line number Diff line number Diff line change
@@ -28,6 +28,9 @@ struct roots_output {
struct wl_listener damage_destroy;
};

void rotate_child_position(double *sx, double *sy, double sw, double sh,
double pw, double ph, float rotation);

void handle_new_output(struct wl_listener *listener, void *data);

struct roots_view;
6 changes: 6 additions & 0 deletions include/rootston/seat.h
Original file line number Diff line number Diff line change
@@ -122,6 +122,12 @@ struct roots_tablet_tool {
struct wl_listener tablet_destroy;
};

struct roots_pointer_constraint {
struct wlr_pointer_constraint_v1 *constraint;

struct wl_listener destroy;
};

struct roots_seat *roots_seat_create(struct roots_input *input, char *name);

void roots_seat_destroy(struct roots_seat *seat);
22 changes: 10 additions & 12 deletions include/wlr/types/wlr_pointer_constraints_v1.h
Original file line number Diff line number Diff line change
@@ -48,6 +48,10 @@ struct wlr_pointer_constraint_v1 {

struct wl_list link; // wlr_pointer_constraints_v1::constraints

struct {
struct wl_signal destroy;
} events;

void *data;
};

@@ -59,15 +63,9 @@ struct wlr_pointer_constraints_v1 {
/**
* Called when a new pointer constraint is created.
*
* data: wlr_pointer_constraint_v1*
* data: struct wlr_pointer_constraint_v1 *
*/
struct wl_signal constraint_create;
/**
* Called when a pointer constraint is destroyed.
*
* data: wlr_pointer_constraint_v1*
*/
struct wl_signal constraint_destroy;
struct wl_signal new_constraint;
} events;

struct wl_list constraints; // wlr_pointer_constraint_v1::link
@@ -78,16 +76,16 @@ struct wlr_pointer_constraints_v1 {
struct wlr_pointer_constraints_v1 *wlr_pointer_constraints_v1_create(
struct wl_display *display);
void wlr_pointer_constraints_v1_destroy(
struct wlr_pointer_constraints_v1 *wlr_pointer_constraints_v1);
struct wlr_pointer_constraints_v1 *pointer_constraints);

struct wlr_pointer_constraint_v1 *wlr_pointer_constraints_v1_constraint_for_surface(
struct wlr_pointer_constraints_v1 *wlr_pointer_constraints_v1,
struct wlr_pointer_constraint_v1 *
wlr_pointer_constraints_v1_constraint_for_surface(
struct wlr_pointer_constraints_v1 *pointer_constraints,
struct wlr_surface *surface, struct wlr_seat *seat);

void wlr_pointer_constraint_v1_send_activated(
struct wlr_pointer_constraint_v1 *constraint);
void wlr_pointer_constraint_v1_send_deactivated(
struct wlr_pointer_constraint_v1 *constraint);


#endif
66 changes: 35 additions & 31 deletions rootston/cursor.c
Original file line number Diff line number Diff line change
@@ -572,32 +572,45 @@ void roots_cursor_handle_constraint_commit(struct roots_cursor *cursor) {
}
}

static void handle_constraint_commit(struct wl_listener *listener,
void *data) {
struct roots_cursor *cursor =
wl_container_of(listener, cursor, constraint_commit);
assert(cursor->active_constraint->surface == data);
roots_cursor_handle_constraint_commit(cursor);
}

void roots_cursor_constrain(struct roots_cursor *cursor,
struct wlr_pointer_constraint_v1 *constraint, double sx, double sy) {
if (cursor->active_constraint != constraint) {
wlr_log(WLR_DEBUG, "roots_cursor_constrain(%p, %p)", cursor, constraint);
wlr_log(WLR_DEBUG, "cursor->active_constraint: %p", cursor->active_constraint);

if (cursor->active_constraint) {
wlr_pointer_constraint_v1_send_deactivated(cursor->active_constraint);
if (cursor->constraint_commit.link.next) {
wl_list_remove(&cursor->constraint_commit.link);
}
}
if (cursor->active_constraint == constraint) {
return;
}

cursor->active_constraint = constraint;
wlr_log(WLR_DEBUG, "roots_cursor_constrain(%p, %p)",
cursor, constraint);
wlr_log(WLR_DEBUG, "cursor->active_constraint: %p",
cursor->active_constraint);

if (!constraint) {
return;
}
wl_list_remove(&cursor->constraint_commit.link);
wl_list_init(&cursor->constraint_commit.link);
if (cursor->active_constraint) {
wlr_pointer_constraint_v1_send_deactivated(
cursor->active_constraint);
}

wlr_pointer_constraint_v1_send_activated(constraint);
wl_signal_add(&constraint->surface->events.commit,
&cursor->constraint_commit);
} else if (constraint == NULL) {
cursor->active_constraint = constraint;

if (constraint == NULL) {
return;
}

wlr_pointer_constraint_v1_send_activated(constraint);

wl_list_remove(&cursor->constraint_commit.link);
wl_signal_add(&constraint->surface->events.commit,
&cursor->constraint_commit);
cursor->constraint_commit.notify = handle_constraint_commit;

pixman_region32_clear(&cursor->confine);

pixman_region32_t *region = &constraint->region;
@@ -612,20 +625,11 @@ void roots_cursor_constrain(struct roots_cursor *cursor,
double sx = (boxes[0].x1 + boxes[0].x2) / 2.;
double sy = (boxes[0].y1 + boxes[0].y2) / 2.;

double lx, ly;
if (view->rotation == 0.0) {
lx = sx + view->x;
ly = sy + view->y;
} else {
double c = cos(view->rotation);
double s = sin(view->rotation);

double center_x = view->width / 2.;
double center_y = view->height / 2.;
rotate_child_position(&sx, &sy, 0, 0, view->width, view->height,
view->rotation);

lx = c * (sx - center_x) - s * (sy - center_y) + center_x + view->x;
ly = s * (sx - center_x) + c * (sy - center_y) + center_y + view->y;
}
double lx = view->x + sx;
double ly = view->y + sy;

wlr_cursor_warp_closest(cursor->cursor, NULL, lx, ly);
}
89 changes: 47 additions & 42 deletions rootston/desktop.c
Original file line number Diff line number Diff line change
@@ -777,52 +777,59 @@ static void input_inhibit_deactivate(struct wl_listener *listener, void *data) {
}
}

static void handle_constraint_create(
struct wl_listener *listener,
struct wlr_pointer_constraint_v1 *constraint) {
struct roots_seat* seat = constraint->seat->data;
static void handle_constraint_destroy(struct wl_listener *listener,
void *data) {
struct roots_pointer_constraint *constraint =
wl_container_of(listener, constraint, destroy);
struct wlr_pointer_constraint_v1 *wlr_constraint = data;
struct roots_seat *seat = wlr_constraint->seat->data;

double sx, sy;
struct wlr_surface *surface = desktop_surface_at(seat->input->server->desktop,
seat->cursor->cursor->x, seat->cursor->cursor->y, &sx, &sy, NULL);
wl_list_remove(&constraint->destroy.link);

if (surface == constraint->surface) {
assert(!seat->cursor->active_constraint);
roots_cursor_constrain(seat->cursor, constraint, sx, sy);
}
}
if (seat->cursor->active_constraint == wlr_constraint) {
wl_list_remove(&seat->cursor->constraint_commit.link);
wl_list_init(&seat->cursor->constraint_commit.link);
seat->cursor->active_constraint = NULL;

static void handle_constraint_destroy(
struct wl_listener *listener,
struct wlr_pointer_constraint_v1 *constraint) {
struct roots_seat* seat = constraint->seat->data;
if (seat->cursor->active_constraint == constraint) {
roots_cursor_constrain(seat->cursor, NULL, NAN, NAN);
if (constraint->current.committed &
if (wlr_constraint->current.committed &
WLR_POINTER_CONSTRAINT_V1_STATE_CURSOR_HINT &&
seat->cursor->pointer_view) {
double sx = constraint->current.cursor_hint.x;
double sy = constraint->current.cursor_hint.y;
double sx = wlr_constraint->current.cursor_hint.x;
double sy = wlr_constraint->current.cursor_hint.y;

struct roots_view *view = seat->cursor->pointer_view->view;
rotate_child_position(&sx, &sy, 0, 0, view->width, view->height,
view->rotation);
double lx = view->x + sx;
double ly = view->y + sy;

double lx, ly;
if (view->rotation == 0.0) {
lx = sx + view->x;
ly = sy + view->y;
} else {
double c = cos(view->rotation);
double s = sin(view->rotation);
wlr_cursor_warp(seat->cursor->cursor, NULL, lx, ly);
}
}

double center_x = view->width / 2.;
double center_y = view->height / 2.;
free(constraint);
}

lx = c * (sx - center_x) - s * (sy - center_y) + center_x + view->x;
ly = s * (sx - center_x) + c * (sy - center_y) + center_y + view->y;
}
static void handle_pointer_constraint(struct wl_listener *listener,
void *data) {
struct wlr_pointer_constraint_v1 *wlr_constraint = data;
struct roots_seat *seat = wlr_constraint->seat->data;

wlr_cursor_warp(seat->cursor->cursor, NULL, lx, ly);
}
struct roots_pointer_constraint *constraint =
calloc(1, sizeof(struct roots_pointer_constraint));
constraint->constraint = wlr_constraint;

constraint->destroy.notify = handle_constraint_destroy;
wl_signal_add(&wlr_constraint->events.destroy, &constraint->destroy);

double sx, sy;
struct wlr_surface *surface = desktop_surface_at(
seat->input->server->desktop,
seat->cursor->cursor->x, seat->cursor->cursor->y, &sx, &sy, NULL);

if (surface == wlr_constraint->surface) {
assert(!seat->cursor->active_constraint);
roots_cursor_constrain(seat->cursor, wlr_constraint, sx, sy);
}
}

@@ -956,13 +963,11 @@ struct roots_desktop *desktop_create(struct roots_server *server,
&desktop->xdg_toplevel_decoration);
desktop->xdg_toplevel_decoration.notify = handle_xdg_toplevel_decoration;

desktop->pointer_constraints = wlr_pointer_constraints_v1_create(server->wl_display);
desktop->constraint_destroy.notify = (wl_notify_func_t)handle_constraint_destroy;
wl_signal_add(&desktop->pointer_constraints->events.constraint_destroy,
&desktop->constraint_destroy);
desktop->constraint_create.notify = (wl_notify_func_t)handle_constraint_create;
wl_signal_add(&desktop->pointer_constraints->events.constraint_create,
&desktop->constraint_create);
desktop->pointer_constraints =
wlr_pointer_constraints_v1_create(server->wl_display);
desktop->pointer_constraint.notify = handle_pointer_constraint;
wl_signal_add(&desktop->pointer_constraints->events.new_constraint,
&desktop->pointer_constraint);

return desktop;
}
2 changes: 1 addition & 1 deletion rootston/output.c
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@
* Rotate a child's position relative to a parent. The parent size is (pw, ph),
* the child position is (*sx, *sy) and its size is (sw, sh).
*/
static void rotate_child_position(double *sx, double *sy, double sw, double sh,
void rotate_child_position(double *sx, double *sy, double sw, double sh,
double pw, double ph, float rotation) {
if (rotation != 0.0) {
// Coordinates relative to the center of the subsurface
9 changes: 0 additions & 9 deletions rootston/seat.c
Original file line number Diff line number Diff line change
@@ -307,14 +307,6 @@ static void handle_pointer_focus_change(struct wl_listener *listener,
roots_cursor_handle_focus_change(cursor, event);
}

static void handle_constraint_commit(struct wl_listener *listener,
void *data) {
struct roots_cursor *cursor =
wl_container_of(listener, cursor, constraint_commit);
assert(cursor->active_constraint->surface == data);
roots_cursor_handle_constraint_commit(cursor);
}

static void seat_reset_device_mappings(struct roots_seat *seat,
struct wlr_input_device *device) {
struct wlr_cursor *cursor = seat->cursor->cursor;
@@ -456,7 +448,6 @@ static void roots_seat_init_cursor(struct roots_seat *seat) {
seat->cursor->focus_change.notify = handle_pointer_focus_change;

wl_list_init(&seat->cursor->constraint_commit.link);
seat->cursor->constraint_commit.notify = handle_constraint_commit;
}

static void roots_drag_icon_handle_surface_commit(struct wl_listener *listener,
Loading