mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	output-layout: improve API
- wlr_output_layout_add{,_auto}() now return a bool indicating whether
  the function has succeeded.
- wlr_output_layout_move() is removed.
Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/1083
			
			
This commit is contained in:
		
							parent
							
								
									27ea18cc33
								
							
						
					
					
						commit
						097ea84cda
					
				
					 2 changed files with 51 additions and 69 deletions
				
			
		| 
						 | 
					@ -28,7 +28,7 @@ struct wlr_output_layout {
 | 
				
			||||||
	struct wl_list outputs;
 | 
						struct wl_list outputs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct {
 | 
						struct {
 | 
				
			||||||
		struct wl_signal add;
 | 
							struct wl_signal add; // struct wlr_output_layout_output *
 | 
				
			||||||
		struct wl_signal change;
 | 
							struct wl_signal change;
 | 
				
			||||||
		struct wl_signal destroy;
 | 
							struct wl_signal destroy;
 | 
				
			||||||
	} events;
 | 
						} events;
 | 
				
			||||||
| 
						 | 
					@ -77,14 +77,30 @@ struct wlr_output *wlr_output_layout_output_at(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Add the output to the layout at the specified coordinates. If the output is
 | 
					 * Add the output to the layout at the specified coordinates. If the output is
 | 
				
			||||||
 * already part of the output layout, this moves the output.
 | 
					 * already a part of the output layout, it will become manually configured and
 | 
				
			||||||
 | 
					 * will be moved to the specified coordinates.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns true on success, false on a memory allocation error.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void wlr_output_layout_add(struct wlr_output_layout *layout,
 | 
					bool wlr_output_layout_add(struct wlr_output_layout *layout,
 | 
				
			||||||
	struct wlr_output *output, int lx, int ly);
 | 
						struct wlr_output *output, int lx, int ly);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_output_layout_move(struct wlr_output_layout *layout,
 | 
					/**
 | 
				
			||||||
	struct wlr_output *output, int lx, int ly);
 | 
					 * Add the output to the layout as automatically configured. This will place
 | 
				
			||||||
 | 
					 * the output in a sensible location in the layout. The coordinates of
 | 
				
			||||||
 | 
					 * the output in the layout will be adjusted dynamically when the layout
 | 
				
			||||||
 | 
					 * changes. If the output is already a part of the layout, it will become
 | 
				
			||||||
 | 
					 * automatically configured.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns true on success, false on a memory allocation error.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					bool wlr_output_layout_add_auto(struct wlr_output_layout *layout,
 | 
				
			||||||
 | 
						struct wlr_output *output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Remove the output from the layout. If the output is already not a part of
 | 
				
			||||||
 | 
					 * the layout, this function is a no-op.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
void wlr_output_layout_remove(struct wlr_output_layout *layout,
 | 
					void wlr_output_layout_remove(struct wlr_output_layout *layout,
 | 
				
			||||||
	struct wlr_output *output);
 | 
						struct wlr_output *output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -117,17 +133,6 @@ void wlr_output_layout_closest_point(struct wlr_output_layout *layout,
 | 
				
			||||||
void wlr_output_layout_get_box(struct wlr_output_layout *layout,
 | 
					void wlr_output_layout_get_box(struct wlr_output_layout *layout,
 | 
				
			||||||
	struct wlr_output *reference, struct wlr_box *dest_box);
 | 
						struct wlr_output *reference, struct wlr_box *dest_box);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
* Add an auto configured output to the layout. This will place the output in a
 | 
					 | 
				
			||||||
* sensible location in the layout. The coordinates of the output in the layout
 | 
					 | 
				
			||||||
* may adjust dynamically when the layout changes. If the output is already in
 | 
					 | 
				
			||||||
* the layout, it will become auto configured. If the position of the output is
 | 
					 | 
				
			||||||
* set such as with wlr_output_layout_move(), the output will become manually
 | 
					 | 
				
			||||||
* configured.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
void wlr_output_layout_add_auto(struct wlr_output_layout *layout,
 | 
					 | 
				
			||||||
	struct wlr_output *output);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Get the output closest to the center of the layout extents.
 | 
					 * Get the output closest to the center of the layout extents.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,28 +165,51 @@ static struct wlr_output_layout_output *output_layout_output_create(
 | 
				
			||||||
	return l_output;
 | 
						return l_output;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_output_layout_add(struct wlr_output_layout *layout,
 | 
					static bool output_layout_add(struct wlr_output_layout *layout,
 | 
				
			||||||
		struct wlr_output *output, int lx, int ly) {
 | 
							struct wlr_output *output, int lx, int ly,
 | 
				
			||||||
 | 
							bool auto_configured) {
 | 
				
			||||||
	struct wlr_output_layout_output *l_output =
 | 
						struct wlr_output_layout_output *l_output =
 | 
				
			||||||
		wlr_output_layout_get(layout, output);
 | 
							wlr_output_layout_get(layout, output);
 | 
				
			||||||
	bool is_new = l_output == NULL;
 | 
						bool is_new = l_output == NULL;
 | 
				
			||||||
	if (!l_output) {
 | 
						if (is_new) {
 | 
				
			||||||
		l_output = output_layout_output_create(layout, output);
 | 
							l_output = output_layout_output_create(layout, output);
 | 
				
			||||||
		if (!l_output) {
 | 
							if (l_output == NULL) {
 | 
				
			||||||
			wlr_log(WLR_ERROR, "Failed to create wlr_output_layout_output");
 | 
								return false;
 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	l_output->x = lx;
 | 
						l_output->x = lx;
 | 
				
			||||||
	l_output->y = ly;
 | 
						l_output->y = ly;
 | 
				
			||||||
	l_output->auto_configured = false;
 | 
						l_output->auto_configured = auto_configured;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	output_layout_reconfigure(layout);
 | 
						output_layout_reconfigure(layout);
 | 
				
			||||||
	output_update_global(output);
 | 
						output_update_global(output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (is_new) {
 | 
						if (is_new) {
 | 
				
			||||||
		wl_signal_emit_mutable(&layout->events.add, l_output);
 | 
							wl_signal_emit_mutable(&layout->events.add, l_output);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wlr_output_layout_add(struct wlr_output_layout *layout,
 | 
				
			||||||
 | 
							struct wlr_output *output, int lx, int ly) {
 | 
				
			||||||
 | 
						return output_layout_add(layout, output, lx, ly, false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool wlr_output_layout_add_auto(struct wlr_output_layout *layout,
 | 
				
			||||||
 | 
							struct wlr_output *output) {
 | 
				
			||||||
 | 
						return output_layout_add(layout, output, 0, 0, true);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void wlr_output_layout_remove(struct wlr_output_layout *layout,
 | 
				
			||||||
 | 
							struct wlr_output *output) {
 | 
				
			||||||
 | 
						struct wlr_output_layout_output *l_output =
 | 
				
			||||||
 | 
							wlr_output_layout_get(layout, output);
 | 
				
			||||||
 | 
						if (l_output != NULL) {
 | 
				
			||||||
 | 
							output_layout_output_destroy(l_output);
 | 
				
			||||||
 | 
							output_layout_reconfigure(layout);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_output_layout_output *wlr_output_layout_get(
 | 
					struct wlr_output_layout_output *wlr_output_layout_get(
 | 
				
			||||||
| 
						 | 
					@ -256,30 +279,6 @@ struct wlr_output *wlr_output_layout_output_at(struct wlr_output_layout *layout,
 | 
				
			||||||
	return NULL;
 | 
						return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_output_layout_move(struct wlr_output_layout *layout,
 | 
					 | 
				
			||||||
		struct wlr_output *output, int lx, int ly) {
 | 
					 | 
				
			||||||
	struct wlr_output_layout_output *l_output =
 | 
					 | 
				
			||||||
		wlr_output_layout_get(layout, output);
 | 
					 | 
				
			||||||
	if (l_output) {
 | 
					 | 
				
			||||||
		l_output->x = lx;
 | 
					 | 
				
			||||||
		l_output->y = ly;
 | 
					 | 
				
			||||||
		l_output->auto_configured = false;
 | 
					 | 
				
			||||||
		output_layout_reconfigure(layout);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		wlr_log(WLR_ERROR, "output not found in this layout: %s", output->name);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void wlr_output_layout_remove(struct wlr_output_layout *layout,
 | 
					 | 
				
			||||||
		struct wlr_output *output) {
 | 
					 | 
				
			||||||
	struct wlr_output_layout_output *l_output =
 | 
					 | 
				
			||||||
		wlr_output_layout_get(layout, output);
 | 
					 | 
				
			||||||
	if (l_output) {
 | 
					 | 
				
			||||||
		output_layout_output_destroy(l_output);
 | 
					 | 
				
			||||||
		output_layout_reconfigure(layout);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void wlr_output_layout_output_coords(struct wlr_output_layout *layout,
 | 
					void wlr_output_layout_output_coords(struct wlr_output_layout *layout,
 | 
				
			||||||
		struct wlr_output *reference, double *lx, double *ly) {
 | 
							struct wlr_output *reference, double *lx, double *ly) {
 | 
				
			||||||
	assert(layout && reference);
 | 
						assert(layout && reference);
 | 
				
			||||||
| 
						 | 
					@ -381,28 +380,6 @@ void wlr_output_layout_get_box(struct wlr_output_layout *layout,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_output_layout_add_auto(struct wlr_output_layout *layout,
 | 
					 | 
				
			||||||
		struct wlr_output *output) {
 | 
					 | 
				
			||||||
	struct wlr_output_layout_output *l_output =
 | 
					 | 
				
			||||||
		wlr_output_layout_get(layout, output);
 | 
					 | 
				
			||||||
	bool is_new = l_output == NULL;
 | 
					 | 
				
			||||||
	if (!l_output) {
 | 
					 | 
				
			||||||
		l_output = output_layout_output_create(layout, output);
 | 
					 | 
				
			||||||
		if (!l_output) {
 | 
					 | 
				
			||||||
			wlr_log(WLR_ERROR, "Failed to create wlr_output_layout_output");
 | 
					 | 
				
			||||||
			return;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	l_output->auto_configured = true;
 | 
					 | 
				
			||||||
	output_layout_reconfigure(layout);
 | 
					 | 
				
			||||||
	output_update_global(output);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (is_new) {
 | 
					 | 
				
			||||||
		wl_signal_emit_mutable(&layout->events.add, l_output);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct wlr_output *wlr_output_layout_get_center_output(
 | 
					struct wlr_output *wlr_output_layout_get_center_output(
 | 
				
			||||||
		struct wlr_output_layout *layout) {
 | 
							struct wlr_output_layout *layout) {
 | 
				
			||||||
	if (wl_list_empty(&layout->outputs)) {
 | 
						if (wl_list_empty(&layout->outputs)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue