aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_cursor.h11
-rw-r--r--types/wlr_cursor.c54
2 files changed, 40 insertions, 25 deletions
diff --git a/include/wlr/types/wlr_cursor.h b/include/wlr/types/wlr_cursor.h
index 1ea089ef..380d8a6f 100644
--- a/include/wlr/types/wlr_cursor.h
+++ b/include/wlr/types/wlr_cursor.h
@@ -28,8 +28,17 @@ void wlr_cursor_destroy(struct wlr_cursor *cur);
void wlr_cursor_set_xcursor(struct wlr_cursor *cur, struct wlr_xcursor *xcur);
-void wlr_cursor_warp(struct wlr_cursor *cur, double x, double y);
+/**
+ * Warp the cursor to the given x and y in layout coordinates. If x and y are
+ * out of the layout boundaries or constraints, no warp will happen.
+ *
+ * Returns true when the mouse warp was successful.
+ */
+bool wlr_cursor_warp(struct wlr_cursor *cur, double x, double y);
+/**
+ * Move the cursor in the direction of the given x and y coordinates.
+ */
void wlr_cursor_move(struct wlr_cursor *cur, double delta_x, double delta_y);
/**
diff --git a/types/wlr_cursor.c b/types/wlr_cursor.c
index 84224ac9..948ab550 100644
--- a/types/wlr_cursor.c
+++ b/types/wlr_cursor.c
@@ -64,18 +64,11 @@ void wlr_cursor_set_xcursor(struct wlr_cursor *cur, struct wlr_xcursor *xcur) {
cur->state->xcursor = xcur;
}
-void wlr_cursor_warp(struct wlr_cursor *cur, double x, double y) {
-}
-
-void wlr_cursor_move(struct wlr_cursor *cur, double delta_x, double delta_y) {
- //struct wlr_output *current_output;
- //current_output = wlr_output_layout_output_at(cur->state->layout, cur->x, cur->y);
-
- // TODO handle no layout
- assert(cur->state->layout);
+bool wlr_cursor_warp(struct wlr_cursor *cur, double x, double y) {
+ if (!wlr_output_layout_output_at(cur->state->layout, x, y)) {
+ return false;
+ }
- double new_x = cur->x + delta_x;
- double new_y = cur->y + delta_y;
int hotspot_x = 0;
int hotspot_y = 0;
@@ -85,28 +78,41 @@ void wlr_cursor_move(struct wlr_cursor *cur, double delta_x, double delta_y) {
hotspot_y = image->hotspot_y;
}
- if (!wlr_output_layout_output_at(cur->state->layout, new_x, new_y)) {
- int closest_x, closest_y;
- wlr_output_layout_closest_boundary(cur->state->layout, new_x, new_y,
- &closest_x, &closest_y);
- new_x = closest_x;
- new_y = closest_y;
- }
struct wlr_output_layout_output *l_output;
wl_list_for_each(l_output, &cur->state->layout->outputs, link) {
- int output_x = new_x;
- int output_y = new_y;
+ int output_x = x;
+ int output_y = y;
// TODO fix double to int rounding issues
wlr_output_layout_output_coords(cur->state->layout,
- l_output->output, &output_x, &output_y);
+ l_output->output, &output_x, &output_y);
wlr_output_move_cursor(l_output->output, output_x - hotspot_x,
- output_y - hotspot_y);
+ output_y - hotspot_y);
+ }
+
+ return true;
+}
+
+void wlr_cursor_move(struct wlr_cursor *cur, double delta_x, double delta_y) {
+ // TODO handle no layout
+ assert(cur->state->layout);
+
+ int x = cur->x + delta_x;
+ int y = cur->y + delta_y;
+
+ if (!wlr_output_layout_output_at(cur->state->layout, x, y)) {
+ int closest_x, closest_y;
+ wlr_output_layout_closest_boundary(cur->state->layout, x, y, &closest_x,
+ &closest_y);
+ x = closest_x;
+ y = closest_y;
}
- cur->x = new_x;
- cur->y = new_y;
+ if (wlr_cursor_warp(cur, x, y)) {
+ cur->x = x;
+ cur->y = y;
+ }
}
static void handle_pointer_motion(struct wl_listener *listener, void *data) {