aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/wlr/types/wlr_output_layout.h37
-rw-r--r--types/wlr_output_layout.c83
2 files changed, 51 insertions, 69 deletions
diff --git a/include/wlr/types/wlr_output_layout.h b/include/wlr/types/wlr_output_layout.h
index 89066ae8..7d567579 100644
--- a/include/wlr/types/wlr_output_layout.h
+++ b/include/wlr/types/wlr_output_layout.h
@@ -28,7 +28,7 @@ struct wlr_output_layout {
struct wl_list outputs;
struct {
- struct wl_signal add;
+ struct wl_signal add; // struct wlr_output_layout_output *
struct wl_signal change;
struct wl_signal destroy;
} 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
- * 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);
-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,
struct wlr_output *output);
@@ -118,17 +134,6 @@ void wlr_output_layout_get_box(struct wlr_output_layout *layout,
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.
*/
struct wlr_output *wlr_output_layout_get_center_output(
diff --git a/types/wlr_output_layout.c b/types/wlr_output_layout.c
index 475ce911..83be909c 100644
--- a/types/wlr_output_layout.c
+++ b/types/wlr_output_layout.c
@@ -165,28 +165,51 @@ static struct wlr_output_layout_output *output_layout_output_create(
return l_output;
}
-void wlr_output_layout_add(struct wlr_output_layout *layout,
- struct wlr_output *output, int lx, int ly) {
+static bool output_layout_add(struct wlr_output_layout *layout,
+ struct wlr_output *output, int lx, int ly,
+ bool auto_configured) {
struct wlr_output_layout_output *l_output =
wlr_output_layout_get(layout, output);
bool is_new = l_output == NULL;
- if (!l_output) {
+ if (is_new) {
l_output = output_layout_output_create(layout, output);
- if (!l_output) {
- wlr_log(WLR_ERROR, "Failed to create wlr_output_layout_output");
- return;
+ if (l_output == NULL) {
+ return false;
}
}
l_output->x = lx;
l_output->y = ly;
- l_output->auto_configured = false;
+ l_output->auto_configured = auto_configured;
+
output_layout_reconfigure(layout);
output_update_global(output);
if (is_new) {
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(
@@ -256,30 +279,6 @@ struct wlr_output *wlr_output_layout_output_at(struct wlr_output_layout *layout,
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,
struct wlr_output *reference, double *lx, double *ly) {
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_layout *layout) {
if (wl_list_empty(&layout->outputs)) {