#ifndef NVIM_API_UI_EVENTS_IN_H
#define NVIM_API_UI_EVENTS_IN_H

// This file is not compiled, just parsed for definitions
#ifdef INCLUDE_GENERATED_DECLARATIONS
# error "don't include this file, include nvim/ui.h"
#endif

#include "nvim/api/private/defs.h"
#include "nvim/func_attr.h"
#include "nvim/ui.h"

void mode_info_set(Boolean enabled, Array cursor_styles)
  FUNC_API_SINCE(3);
void update_menu(void)
  FUNC_API_SINCE(3);
void busy_start(void)
  FUNC_API_SINCE(3);
void busy_stop(void)
  FUNC_API_SINCE(3);
void mouse_on(void)
  FUNC_API_SINCE(3);
void mouse_off(void)
  FUNC_API_SINCE(3);
void mode_change(String mode, Integer mode_idx)
  FUNC_API_SINCE(3);
void bell(void)
  FUNC_API_SINCE(3);
void visual_bell(void)
  FUNC_API_SINCE(3);
void flush(void)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_IMPL;
void suspend(void)
  FUNC_API_SINCE(3) FUNC_API_BRIDGE_IMPL;
void set_title(String title)
  FUNC_API_SINCE(3);
void set_icon(String icon)
  FUNC_API_SINCE(3);
void screenshot(String path)
  FUNC_API_SINCE(7) FUNC_API_REMOTE_IMPL;
void option_set(String name, Object value)
  FUNC_API_SINCE(4) FUNC_API_BRIDGE_IMPL;
// Stop event is not exported as such, represented by EOF in the msgpack stream.
void stop(void)
  FUNC_API_NOEXPORT;

// First revision of the grid protocol, used by default
void update_fg(Integer fg)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void update_bg(Integer bg)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void update_sp(Integer sp)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void resize(Integer width, Integer height)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void clear(void)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void eol_clear(void)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void cursor_goto(Integer row, Integer col)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void highlight_set(HlAttrs attrs)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY FUNC_API_REMOTE_IMPL;
void put(String str)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void set_scroll_region(Integer top, Integer bot, Integer left, Integer right)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void scroll(Integer count)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;

// Second revision of the grid protocol, used with ext_linegrid ui option
void default_colors_set(Integer rgb_fg, Integer rgb_bg, Integer rgb_sp,
                        Integer cterm_fg, Integer cterm_bg)
  FUNC_API_SINCE(4) FUNC_API_REMOTE_IMPL;
void hl_attr_define(Integer id, HlAttrs rgb_attrs, HlAttrs cterm_attrs,
                    Array info)
  FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL FUNC_API_BRIDGE_IMPL;
void hl_group_set(String name, Integer id)
  FUNC_API_SINCE(6) FUNC_API_BRIDGE_IMPL;
void grid_resize(Integer grid, Integer width, Integer height)
  FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL FUNC_API_COMPOSITOR_IMPL FUNC_API_CLIENT_IMPL;
void grid_clear(Integer grid)
  FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL;
void grid_cursor_goto(Integer grid, Integer row, Integer col)
  FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL FUNC_API_COMPOSITOR_IMPL;
void grid_line(Integer grid, Integer row, Integer col_start, Array data)
  FUNC_API_SINCE(5) FUNC_API_REMOTE_ONLY FUNC_API_CLIENT_IMPL;
void grid_scroll(Integer grid, Integer top, Integer bot,
                 Integer left, Integer right, Integer rows, Integer cols)
  FUNC_API_SINCE(5) FUNC_API_REMOTE_IMPL FUNC_API_COMPOSITOR_IMPL;
void grid_destroy(Integer grid)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;

// For performance and simplicity, we use the dense screen representation
// in internal code, such as compositor and TUI. The remote_ui module will
// translate this in to the public grid_line format.
void raw_line(Integer grid, Integer row, Integer startcol,
              Integer endcol, Integer clearcol, Integer clearattr,
              LineFlags flags, const schar_T *chunk, const sattr_T *attrs)
  FUNC_API_NOEXPORT FUNC_API_COMPOSITOR_IMPL;

void event(char *name, Array args, bool *args_consumed)
  FUNC_API_NOEXPORT;

void win_pos(Integer grid, Window win, Integer startrow,
             Integer startcol, Integer width, Integer height)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void win_float_pos(Integer grid, Window win, String anchor, Integer anchor_grid,
                   Float anchor_row, Float anchor_col, Boolean focusable,
                   Integer zindex)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void win_external_pos(Integer grid, Window win)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void win_hide(Integer grid)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void win_close(Integer grid)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void msg_set_pos(Integer grid, Integer row, Boolean scrolled, String sep_char)
  FUNC_API_SINCE(6) FUNC_API_BRIDGE_IMPL FUNC_API_COMPOSITOR_IMPL;

void win_viewport(Integer grid, Window win, Integer topline,
                  Integer botline, Integer curline, Integer curcol,
                  Integer line_count)
  FUNC_API_SINCE(7) FUNC_API_REMOTE_ONLY;

void popupmenu_show(Array items, Integer selected,
                    Integer row, Integer col, Integer grid)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void popupmenu_hide(void)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void popupmenu_select(Integer selected)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;

void tabline_update(Tabpage current, Array tabs,
                    Buffer current_buffer, Array buffers)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;

void cmdline_show(Array content, Integer pos, String firstc, String prompt,
                  Integer indent, Integer level)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void cmdline_pos(Integer pos, Integer level)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void cmdline_special_char(String c, Boolean shift, Integer level)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void cmdline_hide(Integer level)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void cmdline_block_show(Array lines)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void cmdline_block_append(Array lines)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;
void cmdline_block_hide(void)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_ONLY;

void wildmenu_show(Array items)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_IMPL FUNC_API_BRIDGE_IMPL;
void wildmenu_select(Integer selected)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_IMPL FUNC_API_BRIDGE_IMPL;
void wildmenu_hide(void)
  FUNC_API_SINCE(3) FUNC_API_REMOTE_IMPL FUNC_API_BRIDGE_IMPL;

void msg_show(String kind, Array content, Boolean replace_last)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void msg_clear(void)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void msg_showcmd(Array content)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void msg_showmode(Array content)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void msg_ruler(Array content)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
void msg_history_show(Array entries)
  FUNC_API_SINCE(6) FUNC_API_REMOTE_ONLY;
#endif  // NVIM_API_UI_EVENTS_IN_H
