#pragma once

#include "nvim/eval/typval_defs.h"  // IWYU pragma: keep
#include "nvim/normal_defs.h"  // IWYU pragma: keep
#include "nvim/types_defs.h"  // IWYU pragma: keep
#include "nvim/vim_defs.h"  // IWYU pragma: keep

/// jump_to_mouse() returns one of first five these values, possibly with
/// some of the other five added.
enum {
  IN_UNKNOWN       = 0,
  IN_BUFFER        = 1,
  IN_STATUS_LINE   = 2,       ///< on status or command line
  IN_SEP_LINE      = 4,       ///< on vertical separator line
  IN_OTHER_WIN     = 8,       ///< in other window but can't go there
  CURSOR_MOVED     = 0x100,
  MOUSE_FOLD_CLOSE = 0x200,   ///< clicked on '-' in fold column
  MOUSE_FOLD_OPEN  = 0x400,   ///< clicked on '+' in fold column
  MOUSE_WINBAR     = 0x800,   ///< in window toolbar
  MOUSE_STATUSCOL  = 0x1000,  ///< in 'statuscolumn'
};

/// flags for jump_to_mouse()
enum {
  MOUSE_FOCUS        = 0x01,  ///< need to stay in this window
  MOUSE_MAY_VIS      = 0x02,  ///< may start Visual mode
  MOUSE_DID_MOVE     = 0x04,  ///< only act when mouse has moved
  MOUSE_SETPOS       = 0x08,  ///< only set current mouse position
  MOUSE_MAY_STOP_VIS = 0x10,  ///< may stop Visual mode
  MOUSE_RELEASED     = 0x20,  ///< button was released
};

enum {
  // Codes for mouse button events in lower three bits:
  MOUSE_LEFT    = 0x00,
  MOUSE_MIDDLE  = 0x01,
  MOUSE_RIGHT   = 0x02,
  MOUSE_RELEASE = 0x03,

  // mouse buttons that are handled like a key press
  MOUSE_X1 = 0x300,  ///< Mouse-button X1 (6th)
  MOUSE_X2 = 0x400,  ///< Mouse-button X2
};

/// Direction for nv_mousescroll() and ins_mousescroll()
enum {
  MSCR_DOWN  = 0,  ///< DOWN must be false
  MSCR_UP    = 1,
  MSCR_LEFT  = -1,
  MSCR_RIGHT = -2,
};

#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "mouse.h.generated.h"
#endif
