fix(float): re-sort layers when grid zindex changed #30259

Problem: when zindex is changed in vim.schedule the zindex sort in
layers not changed.

Solution: resort layers when zindex changed.
This commit is contained in:
glepnir
2024-12-12 18:45:57 +08:00
committed by GitHub
parent de794f2d24
commit 17383870dd
3 changed files with 140 additions and 0 deletions

View File

@@ -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.
///

View File

@@ -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) {