mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Implement mousedown operation
This allows you to move the cursor off the surface while dragging its scrollbar.
This commit is contained in:
		
							parent
							
								
									db4b4935b3
								
							
						
					
					
						commit
						a36625a482
					
				
					 3 changed files with 50 additions and 1 deletions
				
			
		| 
						 | 
					@ -56,6 +56,7 @@ struct sway_seat {
 | 
				
			||||||
	// Operations (drag and resize)
 | 
						// Operations (drag and resize)
 | 
				
			||||||
	enum {
 | 
						enum {
 | 
				
			||||||
		OP_NONE,
 | 
							OP_NONE,
 | 
				
			||||||
 | 
							OP_MOUSEDOWN,
 | 
				
			||||||
		OP_MOVE,
 | 
							OP_MOVE,
 | 
				
			||||||
		OP_RESIZE_FLOATING,
 | 
							OP_RESIZE_FLOATING,
 | 
				
			||||||
		OP_RESIZE_TILING,
 | 
							OP_RESIZE_TILING,
 | 
				
			||||||
| 
						 | 
					@ -157,6 +158,9 @@ bool seat_is_input_allowed(struct sway_seat *seat, struct wlr_surface *surface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void drag_icon_update_position(struct sway_drag_icon *icon);
 | 
					void drag_icon_update_position(struct sway_drag_icon *icon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void seat_begin_mousedown(struct sway_seat *seat, struct sway_container *con,
 | 
				
			||||||
 | 
							uint32_t button, double sx, double sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void seat_begin_move(struct sway_seat *seat, struct sway_container *con,
 | 
					void seat_begin_move(struct sway_seat *seat, struct sway_container *con,
 | 
				
			||||||
		uint32_t button);
 | 
							uint32_t button);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -215,6 +215,18 @@ static enum wlr_edges find_resize_edge(struct sway_container *cont,
 | 
				
			||||||
	return edge;
 | 
						return edge;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void handle_mousedown_motion(struct sway_seat *seat,
 | 
				
			||||||
 | 
							struct sway_cursor *cursor, uint32_t time_msec) {
 | 
				
			||||||
 | 
						struct sway_container *con = seat->op_container;
 | 
				
			||||||
 | 
						if (seat_is_input_allowed(seat, con->sway_view->surface)) {
 | 
				
			||||||
 | 
							double moved_x = cursor->cursor->x - seat->op_ref_lx;
 | 
				
			||||||
 | 
							double moved_y = cursor->cursor->y - seat->op_ref_ly;
 | 
				
			||||||
 | 
							double sx = seat->op_ref_con_lx + moved_x;
 | 
				
			||||||
 | 
							double sy = seat->op_ref_con_ly + moved_y;
 | 
				
			||||||
 | 
							wlr_seat_pointer_notify_motion(seat->wlr_seat, time_msec, sx, sy);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void handle_move_motion(struct sway_seat *seat,
 | 
					static void handle_move_motion(struct sway_seat *seat,
 | 
				
			||||||
		struct sway_cursor *cursor) {
 | 
							struct sway_cursor *cursor) {
 | 
				
			||||||
	struct sway_container *con = seat->op_container;
 | 
						struct sway_container *con = seat->op_container;
 | 
				
			||||||
| 
						 | 
					@ -397,6 +409,9 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor, uint32_t time_msec,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (seat->operation != OP_NONE) {
 | 
						if (seat->operation != OP_NONE) {
 | 
				
			||||||
		switch (seat->operation) {
 | 
							switch (seat->operation) {
 | 
				
			||||||
 | 
							case OP_MOUSEDOWN:
 | 
				
			||||||
 | 
								handle_mousedown_motion(seat, cursor, time_msec);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
		case OP_MOVE:
 | 
							case OP_MOVE:
 | 
				
			||||||
			handle_move_motion(seat, cursor);
 | 
								handle_move_motion(seat, cursor);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					@ -743,6 +758,14 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Handle mousedown on a container surface
 | 
				
			||||||
 | 
						if (surface && cont && state == WLR_BUTTON_PRESSED) {
 | 
				
			||||||
 | 
							seat_set_focus(seat, cont);
 | 
				
			||||||
 | 
							seat_pointer_notify_button(seat, time_msec, button, state);
 | 
				
			||||||
 | 
							seat_begin_mousedown(seat, cont, button, sx, sy);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Handle clicking a container surface
 | 
						// Handle clicking a container surface
 | 
				
			||||||
	if (cont) {
 | 
						if (cont) {
 | 
				
			||||||
		seat_set_focus(seat, cont);
 | 
							seat_set_focus(seat, cont);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -954,6 +954,17 @@ struct seat_config *seat_get_config(struct sway_seat *seat) {
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void seat_begin_mousedown(struct sway_seat *seat, struct sway_container *con,
 | 
				
			||||||
 | 
							uint32_t button, double sx, double sy) {
 | 
				
			||||||
 | 
						seat->operation = OP_MOUSEDOWN;
 | 
				
			||||||
 | 
						seat->op_container = con;
 | 
				
			||||||
 | 
						seat->op_button = button;
 | 
				
			||||||
 | 
						seat->op_ref_lx = seat->cursor->cursor->x;
 | 
				
			||||||
 | 
						seat->op_ref_ly = seat->cursor->cursor->y;
 | 
				
			||||||
 | 
						seat->op_ref_con_lx = sx;
 | 
				
			||||||
 | 
						seat->op_ref_con_ly = sy;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void seat_begin_move(struct sway_seat *seat, struct sway_container *con,
 | 
					void seat_begin_move(struct sway_seat *seat, struct sway_container *con,
 | 
				
			||||||
		uint32_t button) {
 | 
							uint32_t button) {
 | 
				
			||||||
	if (!seat->cursor) {
 | 
						if (!seat->cursor) {
 | 
				
			||||||
| 
						 | 
					@ -1007,6 +1018,7 @@ void seat_begin_resize_tiling(struct sway_seat *seat,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void seat_end_mouse_operation(struct sway_seat *seat) {
 | 
					void seat_end_mouse_operation(struct sway_seat *seat) {
 | 
				
			||||||
 | 
						int operation = seat->operation;
 | 
				
			||||||
	if (seat->operation == OP_MOVE) {
 | 
						if (seat->operation == OP_MOVE) {
 | 
				
			||||||
		// We "move" the container to its own location so it discovers its
 | 
							// We "move" the container to its own location so it discovers its
 | 
				
			||||||
		// output again.
 | 
							// output again.
 | 
				
			||||||
| 
						 | 
					@ -1015,7 +1027,17 @@ void seat_end_mouse_operation(struct sway_seat *seat) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	seat->operation = OP_NONE;
 | 
						seat->operation = OP_NONE;
 | 
				
			||||||
	seat->op_container = NULL;
 | 
						seat->op_container = NULL;
 | 
				
			||||||
	cursor_set_image(seat->cursor, "left_ptr", NULL);
 | 
						if (operation == OP_MOUSEDOWN) {
 | 
				
			||||||
 | 
							// Set the cursor's previous coords to the x/y at the start of the
 | 
				
			||||||
 | 
							// operation, so the container change will be detected if using
 | 
				
			||||||
 | 
							// focus_follows_mouse and the cursor moved off the original container
 | 
				
			||||||
 | 
							// during the operation.
 | 
				
			||||||
 | 
							seat->cursor->previous.x = seat->op_ref_lx;
 | 
				
			||||||
 | 
							seat->cursor->previous.y = seat->op_ref_ly;
 | 
				
			||||||
 | 
							cursor_send_pointer_motion(seat->cursor, 0, true);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							cursor_set_image(seat->cursor, "left_ptr", NULL);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec,
 | 
					void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue