diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ui_compositor.c | 29 | ||||
-rw-r--r-- | src/nvim/window.c | 6 |
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) { |