aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/window.c
blob: 2c67fc2a742d195b38145e224d3a83aafc7f9b79 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>

#include "api/window.h"
#include "api/defs.h"
#include "api/helpers.h"
#include "../vim.h"
#include "../window.h"
#include "screen.h"
#include "misc2.h"


Buffer window_get_buffer(Window window, Error *err)
{
  win_T *win = find_window(window, err);

  if (!win) {
    return 0;
  }

  return win->w_buffer->b_fnum;
}

Position window_get_cursor(Window window, Error *err)
{
  Position rv = {.row = 0, .col = 0};
  win_T *win = find_window(window, err);

  if (win) {
    rv.row = win->w_cursor.lnum;
    rv.col = win->w_cursor.col;
  }

  return rv;
}

void window_set_cursor(Window window, Position pos, Error *err)
{
  win_T *win = find_window(window, err);

  if (!win) {
    return;
  }

  if (pos.row <= 0 || pos.row > win->w_buffer->b_ml.ml_line_count) {
    set_api_error("cursor position outside buffer", err);
    return;
  }

  win->w_cursor.lnum = pos.row;
  win->w_cursor.col = pos.col;
  win->w_cursor.coladd = 0;
  // When column is out of range silently correct it.
  check_cursor_col_win(win);
  update_screen(VALID);
}

int64_t window_get_height(Window window, Error *err)
{
  win_T *win = find_window(window, err);

  if (!win) {
    return 0;
  }

  return win->w_height;
}

void window_set_height(Window window, int64_t height, Error *err)
{
  win_T *win = find_window(window, err);

  if (!win) {
    return;
  }

  win_T *savewin = curwin;
  curwin = win;
  try_start();
  win_setheight(height);
  curwin = savewin;
  try_end(err);
}

int64_t window_get_width(Window window, Error *err)
{
  win_T *win = find_window(window, err);

  if (!win) {
    return 0;
  }

  return win->w_width;
}

void window_set_width(Window window, int64_t width, Error *err)
{
  win_T *win = find_window(window, err);

  if (!win) {
    return;
  }

  win_T *savewin = curwin;
  curwin = win;
  try_start();
  win_setwidth(width);
  curwin = savewin;
  try_end(err);
}

Object window_get_var(Window window, String name, Error *err)
{
  Object rv;
  win_T *win = find_window(window, err);

  if (!win) {
    return rv;
  }

  return dict_get_value(win->w_vars, name, err);
}

Object window_set_var(Window window, String name, Object value, Error *err)
{
  Object rv;
  win_T *win = find_window(window, err);

  if (!win) {
    return rv;
  }

  return dict_set_value(win->w_vars, name, value, err);
}

Object window_get_option(Window window, String name, Error *err)
{
  Object rv;
  win_T *win = find_window(window, err);

  if (!win) {
    return rv;
  }

  return get_option_from(win, SREQ_WIN, name, err);
}

void window_set_option(Window window, String name, Object value, Error *err)
{
  win_T *win = find_window(window, err);

  if (!win) {
    return;
  }

  set_option_to(win, SREQ_WIN, name, value, err);
}

Position window_get_position(Window window, Error *err)
{
  Position rv;
  win_T *win = find_window(window, err);

  if (win) {
    rv.col = win->w_wincol;
    rv.row = win->w_winrow;
  }

  return rv;
}

Tabpage window_get_tabpage(Window window, Error *err)
{
  set_api_error("Not implemented", err);
  return 0;
}

bool window_is_valid(Window window)
{
  Error stub = {.set = false};
  return find_window(window, &stub) != NULL;
}