-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexncwi.h
211 lines (198 loc) · 15.6 KB
/
exncwi.h
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#ifndef EXNCWI_H_INCLUDED
#define EXNCWI_H_INCLUDED
/*----------Библиотеки----------*/
#include <ncursesw/ncurses.h>
#include <locale.h>
#include <stdlib.h>
/*------------------------------*/
/*-----------Структуры----------*/
/* Кнопка. */
typedef struct button
{
uint32_t id; // Индекс кнопки.
uint16_t y_size; // Размер кнопки по оси OY.
uint16_t x_size; // Размер кнопки по оси OX.
wchar_t* text; // Текст кнопки.
WINDOW* button_win; // Указатель на окно кнопки.
struct button* next; // Указатель на следующую кнопку.
} Button;
/*------------------------------*/
/*------Функции-и-процедуры-----*/
/// Функция, выполняющая инициализацию и стартовую настройку
/// библиотеки ncurses. Если необходимо задать особое
/// поведение - все операции можно произвести вручную.
/// Устанавливается локаль, по умолчанию используемая в системе.
/// Все параметры типа "флаг" могут принимать следующие значения: TRUE / FALSE.
/// \param use_cursor - флаг отображения консольного курсора;
/// \param use_echo - флаг отображения нажатых клавиш на экране;
/// \param use_keypad - подключение функциональных клавиш (флаг) (F1, F2, ...);
/// \param use_colors - подключение поддержки цветов (флаг);
/// \param color_pairs_amount - количество цветовых пар (текст & фон). Больше 0;
/// \param color_pairs_array - массив, заполненный цветовыми парами.
/// Значения больше 0, включительно.
/// Четное количество элементов массива.
/// Содержимое (цветовые пары):
/// - цвет текста 1, цвет фона 1;
/// - цвет текста 2, цвет фона 2;
/// - ...
/// Пример: uint16_t colors[] = {COLOR_GREEN,
/// COLOR_BLACK, COLOR_YELLOW, COLOR_BLACK}.
/// \return 0 - операция произведена успешно;
/// 1 - некорректные входные параметры. (если указатель равен NULL или
/// количество цветовых пар меньше 1) (учитываются не все описанные
/// выше ограничения);
/// 2 - ошибка инициализации ncurses;
/// 3 - ошибка установки режима отображения курсора;
/// 4 - при возникновении ошибки (3) функция close_exncwi
/// завершилась с ошибкой;
/// 5 - ошибка установки режима отображения символов, набираемых
/// на клавиатуре;
/// 6 - при возникновении ошибки (5) функция close_exncwi
/// завершилась с ошибкой;
/// 7 - ошибка при включении/выключении режима поддержки функциональных
/// клавиш;
/// 8 - при возникновении ошибки (7) функция close_exncwi
/// завершилась с ошибкой;
/// 9 - ошибка при установке режима ввода cbreak (cимволы становятся
/// доступными программе сразу после их набора на клавиатуре);
/// 10 - при возникновении ошибки (9) функция close_exncwi
/// завершилась с ошибкой;
/// 11 - ошибка: терминал не поддерживает цвета;
/// 12 - при возникновении ошибки (11) функция close_exncwi
/// завершилась с ошибкой;
/// 13 - не удалось включить поддержку цветов;
/// 14 - при возникновении ошибки (13) функция close_exncwi
/// завершилась с ошибкой;
/// 15 - количество создаваемых цветовых пар превышает максимально
/// возможное;
/// 16 - при возникновении ошибки (15) функция close_exncwi
/// завершилась с ошибкой;
/// 17 - ошибка при создании какой-либо цветовой пары;
/// 18 - при возникновении ошибки (17) функция close_exncwi
/// завершилась с ошибкой;
/// 19 - ошибка при установке текущей цветовой пары (первая);
/// 20 - при возникновении ошибки (19) функция close_exncwi
/// завершилась с ошибкой;
int init_exncwi(bool use_cursor, bool use_echo, bool use_keypad,
bool use_colors, uint16_t color_pairs_amount,
const uint16_t* color_pairs_array);
/// Функция, завершающая работу с ncurses.
/// Должна быть вызвана при завершении работы в curses-режиме.
/// \return OK - в случае успеха;
/// ERR - в остальных случаях.
int close_exncwi();
/// Функция, создающая односвязный список кнопок.
/// Кнопки будут пронумерованы от 1. Создаваемые кнопки не должны
/// частично/полностью находиться за пределами экрана.
/// \param buttons_text - массив строк с текстом для каждой кнопки. Количество
/// строк не может быть меньше количества создаваемых
/// кнопок. Длинна каждой строки не должна превышать
/// ширину соответствующей кнопки;
/// \param buttons_amount - количество кнопок в списке. Больше 0;
/// \param y - координата левого верхнего угла первой кнопки по оси OY.
/// Больше 0;
/// \param x - координата левого верхнего угла первой кнопки по оси OX.
/// Больше 0;
/// \param y_size - размер каждой кнопки в списке по оси OY. Больше 0;
/// \param x_size - размер каждой кнопки в списке по оси OX. Больше 0;
/// \param y_interval - расстояние по оси OY между соседними кнопками;
/// \param x_interval - расстояние по оси OX между соседними кнопками.
/// \return в случае успеха - указатель на корневую (первую) кнопку списка.
/// в остальных случаях - NULL.
Button* create_buttons_list(wchar_t* buttons_text[],
uint32_t buttons_amount, uint16_t y, uint16_t x,
uint16_t y_size, uint16_t x_size,
int16_t y_interval, int16_t x_interval);
/// Функция-обертка над create_buttons_list.
/// Создаваемые кнопки будут расположены вертикально.
/// \param interval - расстояние по оси OY между соседними кнопками.
/// Остальные входные параметры и возвращаемое значение совпадают с указанными
/// в create_buttons_list (кроме y_interval и x_interval, замененные
/// на interval).
Button* create_vertical_buttons_list(wchar_t* buttons_text[],
uint32_t buttons_amount,
uint16_t y, uint16_t x,
uint16_t y_size, uint16_t x_size,
int16_t interval);
/// Функция-обертка над create_buttons_list.
/// Создаваемые кнопки будут расположены горизонтально.
/// \param interval - расстояние по оси OX между соседними кнопками.
/// Остальные входные параметры и возвращаемое значение совпадают с указанными
/// в create_buttons_list (кроме y_interval и x_interval, замененные
/// на interval).
Button* create_horizontal_buttons_list(wchar_t* buttons_text[],
uint32_t buttons_amount,
uint16_t y, uint16_t x,
uint16_t y_size, uint16_t x_size,
int16_t interval);
/// Функция-обертка над create_buttons_list.
/// Создает список кнопок из одного элемента (кнопку).
/// Создаваемая кнопка не должна частично/полностью находиться за пределами
/// экрана.
/// \param button_text - строка с текстом кнопки. Длинна строки не должна
/// превышать ширину кнопки;
/// \param y - координата левого верхнего угла кнопки по оси OY.
/// Больше 0;
/// \param x - координата левого верхнего угла кнопки по оси OX.
/// Больше 0;
/// \param y_size - размер кнопки по оси OY. Больше 0;
/// \param x_size - размер кнопки по оси OX. Больше 0.
/// \return в случае успеха - указатель на корневую кнопку списка.
/// в остальных случаях - NULL.
Button* create_button(wchar_t* button_text, uint16_t y, uint16_t x,
uint16_t y_size, uint16_t x_size);
/// Процедура, соединяющая два списка кнопок.
/// К концу первого списка будет присоединен второй.
/// Таким образом можно соединять как списки, так и отдельные кнопки.
/// \param list_1 - указатель на первый список кнопок/кнопку;
/// \param list_2 - указатель на второй список кнопок/кнопку.
/// Процедура не произведет никаких действий в случае, если один/оба
/// входных параметра равны NULL или ссылаются на один и тот же список.
void buttons_lists_concat(Button* list_1, Button* list_2);
/// Функция, перемещающая список кнопок.
/// Перемещение производится относительно текущих координат.
/// \param root_button_ptr - указатель на перемещаемый список кнопок;
/// \param y - смещение относительно текущего положения по оси OY;
/// \param x - смещение относительно текущего положения по оси OX.
/// \return 0 - операция произведена успешно;
/// 1 - некорректные входные параметры
/// (если указатель равен NULL или x и y равны 0 одновременно);
/// 2 - не удалось переместить список кнопок
/// (возможно он частично (или полностью) оказался за пределами
/// экрана, что недопустимо);
/// 3 - не удалось переместить список кнопок. Восстановить список
/// в прежнее состояние не удалось.
int move_buttons_list(Button* root_button_ptr, int16_t y, int16_t x);
/// Процедура освобождает выделенную под список кнопок память.
/// Все созданные списки кнопок должны быть удалены до завершения
/// работы программы. Одна кнопка тоже является списком, состоящим
/// из одного элемента.
/// \param Button* root_button_ptr - указатель на список кнопок.
void free_buttons(Button* root_button_ptr);
/// Функция, отображающая список кнопок на экране.
/// Текст кнопок отображается с выравниванием по центру.
/// При необходимости для каждой кнопки из списка задается свой атрибут.
/// Все параметры типа "флаг" могут принимать следующие значения: TRUE / FALSE.
/// \param root_button_ptr - указатель на список кнопок;
/// \param show_box - отображать ли контуры кнопок (флаг);
/// \param vertical_char - символ, используемый для вертикальной части
/// контура кнопок;
/// \param horizontal_char - символ, используемый для горизонтальной части
/// контура кнопок;
/// \param use_attributes - использовать ли атрибуты при отображении
/// кнопок (флаг);
/// \param attributes - массив атрибутов. Количество элементов массива должно
/// равняться количеству кнопок в списке.
/// \return 0 - операция произведена успешно;
/// 1 - некорректные входные параметры (указатели равны NULL);
/// 2 - ошибка при попытке обновить (refresh) окно какой-либо кнопки
/// (или stdscr);
/// 3 - ошибка применения соответствующих атрибутов
/// к какой-либо кнопке;
/// 4 - ошибка при отображении контура какой-либо кнопки;
/// 5 - ошибка при выводе текста какой-либо кнопки.
int print_buttons(const Button* root_button_ptr, bool show_box,
chtype vertical_char, chtype horizontal_char,
bool use_attributes, const int* attributes);
/*------------------------------*/
#endif // EXNCWI_H_INCLUDED