aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ui_compositor.c29
-rw-r--r--src/nvim/window.c6
2 files changed, 35 insertions, 0 deletions
diff --git a/src/nvim/ui_compositor.c b/src/nvim/ui_compositor.c
index 4cddc3dc82..38d882462d 100644
--- a/src/nvim/ui_compositor.c
+++ b/src/nvim/ui_compositor.c
@@ -101,6 +101,35 @@ bool ui_comp_should_draw(void)
return composed_uis != 0 && valid_screen;
}
+/// Raises or lowers the layer, syncing comp_index with zindex.
+///
+/// This function adjusts the position of a layer in the layers array
+/// based on its zindex, either raising or lowering it.
+///
+/// @param[in] layer_idx Index of the layer to be raised or lowered.
+/// @param[in] raise Raise the layer if true, else lower it.
+void ui_comp_layers_adjust(size_t layer_idx, bool raise)
+{
+ size_t size = layers.size;
+ ScreenGrid *layer = layers.items[layer_idx];
+
+ if (raise) {
+ while (layer_idx < size - 1 && layer->zindex > layers.items[layer_idx + 1]->zindex) {
+ layers.items[layer_idx] = layers.items[layer_idx + 1];
+ layers.items[layer_idx]->comp_index = layer_idx;
+ layer_idx++;
+ }
+ } else {
+ while (layer_idx > 0 && layer->zindex < layers.items[layer_idx - 1]->zindex) {
+ layers.items[layer_idx] = layers.items[layer_idx - 1];
+ layers.items[layer_idx]->comp_index = layer_idx;
+ layer_idx--;
+ }
+ }
+ layers.items[layer_idx] = layer;
+ layer->comp_index = layer_idx;
+}
+
/// Places `grid` at (col,row) position with (width * height) size.
/// Adds `grid` as the top layer if it is a new layer.
///
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 79c3ce9304..938d9d7618 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -852,7 +852,13 @@ void ui_ext_win_position(win_T *wp, bool validate)
}
}
+ bool resort = wp->w_grid_alloc.comp_index != 0
+ && wp->w_grid_alloc.zindex != wp->w_config.zindex;
+ bool raise = resort && wp->w_grid_alloc.zindex < wp->w_config.zindex;
wp->w_grid_alloc.zindex = wp->w_config.zindex;
+ if (resort) {
+ ui_comp_layers_adjust(wp->w_grid_alloc.comp_index, raise);
+ }
if (ui_has(kUIMultigrid)) {
String anchor = cstr_as_string(float_anchor_str[c.anchor]);
if (!c.hide) {