diff options
author | bfredl <bjorn.linse@gmail.com> | 2023-09-30 13:40:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-30 13:40:35 +0200 |
commit | 578d63417609de9677bc4bf5be3b265766ef2083 (patch) | |
tree | b26ffc04ae41aae5c796fb75fe650e7a7d5b5716 /src | |
parent | 960170e4469b96c5c3d06ba1bb84c9edeaa04b8b (diff) | |
parent | 4200a0f1678c06c6da4e4cfb0184c29c1174ed21 (diff) | |
download | rneovim-578d63417609de9677bc4bf5be3b265766ef2083.tar.gz rneovim-578d63417609de9677bc4bf5be3b265766ef2083.tar.bz2 rneovim-578d63417609de9677bc4bf5be3b265766ef2083.zip |
Merge pull request #25386 from glepnir/toggle_float
feat(float): support toggle show float window
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/api/keysets.h | 1 | ||||
-rw-r--r-- | src/nvim/api/win_config.c | 6 | ||||
-rw-r--r-- | src/nvim/buffer_defs.h | 2 | ||||
-rw-r--r-- | src/nvim/window.c | 29 |
4 files changed, 28 insertions, 10 deletions
diff --git a/src/nvim/api/keysets.h b/src/nvim/api/keysets.h index 236e75983e..429826f231 100644 --- a/src/nvim/api/keysets.h +++ b/src/nvim/api/keysets.h @@ -113,6 +113,7 @@ typedef struct { String style; Boolean noautocmd; Boolean fixed; + Boolean hide; } Dict(float_config); typedef struct { diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c index 656f33aab1..ca7086ab7f 100644 --- a/src/nvim/api/win_config.c +++ b/src/nvim/api/win_config.c @@ -167,6 +167,7 @@ /// calling this function. /// - fixed: If true when anchor is NW or SW, the float window /// would be kept fixed even if the window would be truncated. +/// - hide: If true the floating window will be hidden. /// /// @param[out] err Error details, if any /// @@ -325,6 +326,7 @@ Dictionary nvim_win_get_config(Window window, Error *err) PUT(rv, "focusable", BOOLEAN_OBJ(config->focusable)); PUT(rv, "external", BOOLEAN_OBJ(config->external)); + PUT(rv, "hide", BOOLEAN_OBJ(config->hide)); if (wp->w_floating) { PUT(rv, "width", INTEGER_OBJ(config->width)); @@ -850,6 +852,10 @@ static bool parse_float_config(Dict(float_config) *config, FloatConfig *fconfig, fconfig->fixed = config->fixed; } + if (HAS_KEY_X(config, hide)) { + fconfig->hide = config->hide; + } + return true; #undef HAS_KEY_X } diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h index 7cf28ee0ab..a9ad0051ed 100644 --- a/src/nvim/buffer_defs.h +++ b/src/nvim/buffer_defs.h @@ -967,6 +967,7 @@ typedef struct { int footer_width; bool noautocmd; bool fixed; + bool hide; } FloatConfig; #define FLOAT_CONFIG_INIT ((FloatConfig){ .height = 0, .width = 0, \ @@ -977,6 +978,7 @@ typedef struct { .zindex = kZIndexFloatDefault, \ .style = kWinStyleUnused, \ .noautocmd = false, \ + .hide = false, \ .fixed = false }) // Structure to store last cursor position and topline. Used by check_lnums() diff --git a/src/nvim/window.c b/src/nvim/window.c index d73060494e..41199306fa 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -990,9 +990,13 @@ void ui_ext_win_position(win_T *wp, bool validate) wp->w_grid_alloc.zindex = wp->w_float_config.zindex; if (ui_has(kUIMultigrid)) { String anchor = cstr_as_string((char *)float_anchor_str[c.anchor]); - ui_call_win_float_pos(wp->w_grid_alloc.handle, wp->handle, anchor, - grid->handle, row, col, c.focusable, - wp->w_grid_alloc.zindex); + if (!c.hide) { + ui_call_win_float_pos(wp->w_grid_alloc.handle, wp->handle, anchor, + grid->handle, row, col, c.focusable, + wp->w_grid_alloc.zindex); + } else { + ui_call_win_hide(wp->w_grid_alloc.handle); + } } else { bool valid = (wp->w_redr_type == 0); if (!valid && !validate) { @@ -1014,13 +1018,18 @@ void ui_ext_win_position(win_T *wp, bool validate) } wp->w_winrow = comp_row; wp->w_wincol = comp_col; - ui_comp_put_grid(&wp->w_grid_alloc, comp_row, comp_col, - wp->w_height_outer, wp->w_width_outer, valid, false); - ui_check_cursor_grid(wp->w_grid_alloc.handle); - wp->w_grid_alloc.focusable = wp->w_float_config.focusable; - if (!valid) { - wp->w_grid_alloc.valid = false; - redraw_later(wp, UPD_NOT_VALID); + + if (!c.hide) { + ui_comp_put_grid(&wp->w_grid_alloc, comp_row, comp_col, + wp->w_height_outer, wp->w_width_outer, valid, false); + ui_check_cursor_grid(wp->w_grid_alloc.handle); + wp->w_grid_alloc.focusable = wp->w_float_config.focusable; + if (!valid) { + wp->w_grid_alloc.valid = false; + redraw_later(wp, UPD_NOT_VALID); + } + } else { + ui_comp_remove_grid(&wp->w_grid_alloc); } } } else { |