summaryrefslogtreecommitdiff
path: root/src/tui-internals.h
blob: 9469b474b9c4304eb32f6ae2dba706f2ae14f675 (plain)
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
/* parc
 * Copyright (C) 2025 Ekaitz Zarraga <ekaitz@elenq.tech>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef TUI_INTERNALS_H
#define TUI_INTERNALS_H

#include <termios.h>

typedef struct _vec2
  {
    int x;
    int y;
  }
vec2;

#define INPUT_BUFF_SIZE 100

typedef struct _tui
  {
    struct termios term_old_config;
    struct termios term_config;
    char input_buff[INPUT_BUFF_SIZE]; /* For input events */

    /* Double buffering of the display:
     * We allocate a huge array, double the size we need and realloc it when
     * needed. Then the top half is for the old display status and the bottom
     * half is for the incoming. Then we flip.
     */
    int *display_A;
    int *display_B;
    vec2 display_size;
  }
tui;

typedef struct _event_mouse
  {
    int key;
    vec2 pos;
  }
event_mouse;

typedef struct _event_scroll
  {
    int amount;
  }
event_scroll;

typedef struct _event_key
  {
    int key;
    int modifiers;
  }
event_key;

typedef enum
  {
    EVENT_KEY,
    EVENT_MOUSE,
    EVENT_SCROLL
  }
event_type;

typedef struct _event {
  event_type type;
  union
    {
      event_key key;
      event_mouse mouse;
      event_scroll scroll;
    } data;
} event;

void tui_cursor_save (void);
void tui_cursor_restore (void);
void tui_mouse_enable (void);
void tui_mouse_disable (void);
void tui_cursor_move (int x, int y);
void tui_cursor_show (void);
void tui_cursor_hide (void);
void tui_screen_erase (void);
void tui_alternate_buffer_enable (void);
void tui_alternate_buffer_disable (void);
void tui_input_sequence_consume (void);

tui *tui_init (void);
void tui_deinit (tui *ui);
void tui_loop (tui *ui);

#endif /* TUI_INTERNALS_H */