MiniDevil As beautiful as a shell
input.c
Go to the documentation of this file.
1 /* ************************************************************************** */
2 /* */
3 /* ::: :::::::: */
4 /* input.c :+: :+: :+: */
5 /* +:+ +:+ +:+ */
6 /* By: baelgadi <baelgadi@student.42.fr> +#+ +:+ +#+ */
7 /* +#+#+#+#+#+ +#+ */
8 /* Created: 2026/02/17 17:49:28 by zotaj-di #+# #+# */
9 /* Updated: 2026/03/04 03:52:58 by baelgadi ### ########.fr */
10 /* */
11 /* ************************************************************************** */
12 
13 #include "minishell_ui.h"
14 
20 int read_key(void)
21 {
22  char c;
23  char seq[3];
24 
25  if (read(STDIN_FILENO, &c, 1) != 1)
26  return (-1);
27  if (c == KEY_ESC)
28  {
29  if (read(STDIN_FILENO, &seq[0], 1) != 1)
30  return (KEY_ESC);
31  if (read(STDIN_FILENO, &seq[1], 1) != 1)
32  return (KEY_ESC);
33  if (seq[0] == '[')
34  {
35  if (seq[1] == 'A')
36  return (KEY_UP);
37  else if (seq[1] == 'B')
38  return (KEY_DOWN);
39  else if (seq[1] == 'C')
40  return (KEY_RIGHT);
41  else if (seq[1] == 'D')
42  return (KEY_LEFT);
43  }
44  return (KEY_ESC);
45  }
46  return (c);
47 }
48 
57 void cmd_add_char(t_cmd *cmd, char c)
58 {
59  if (cmd->len < MAX_CMD_LEN - 1)
60  {
61  cmd->buf[cmd->len] = c;
62  cmd->len++;
63  cmd->buf[cmd->len] = '\0';
64  }
65 }
66 
74 void cmd_del_char(t_cmd *cmd)
75 {
76  if (cmd->len > 0)
77  {
78  cmd->len--;
79  cmd->buf[cmd->len] = '\0';
80  }
81 }
82 
92 static void handle_scroll(t_ui *ui, int key)
93 {
94  if (key == KEY_UP && ui->out.scroll > 0)
95  {
96  ui->out.scroll--;
98  }
99  else if (key == KEY_DOWN && ui->out.scroll < ui->out.count - 10)
100  {
101  ui->out.scroll++;
102  redraw_output_only(ui);
103  }
104 }
105 
119 void handle_key(t_shell *shell, int key)
120 {
121  t_ui *ui;
122 
123  if (!shell || !shell->ui)
124  return ;
125  ui = shell->ui;
126  if (key == KEY_ENTER)
127  cmd_execute(shell);
128  else if (key == KEY_BACKSPACE)
129  cmd_del_char(&ui->cmd);
130  else if (key == KEY_CTRL_D)
131  ui->running = 0;
132  else if (key == KEY_CTRL_C)
133  {
134  ft_memset(ui->cmd.buf, 0, MAX_CMD_LEN);
135  ui->cmd.len = 0;
136  }
137  else if (key == KEY_UP || key == KEY_DOWN)
138  handle_scroll(ui, key);
139  else if (key >= 32 && key <= 126)
140  cmd_add_char(&ui->cmd, (char)key);
141 }
void cmd_execute(t_shell *shell)
Execute the current command buffer & reset it.
Definition: command.c:52
void redraw_output_only(t_ui *ui)
Redraw only the output box interior rows without borders nor title.
static void handle_scroll(t_ui *ui, int key)
Adjust the scroll offset and refresh the output panel.
Definition: input.c:92
void cmd_del_char(t_cmd *cmd)
Remove the last character from the command buffer.
Definition: input.c:74
void handle_key(t_shell *shell, int key)
Dispatch key code to the appropriate UI action.
Definition: input.c:119
void cmd_add_char(t_cmd *cmd, char c)
Append a printable character to the command buffer.
Definition: input.c:57
int read_key(void)
Read 1 keypress or escape sequence from STDIN.
Definition: input.c:20
UI mode structures, macros & function prototypes.
#define KEY_RIGHT
Definition: minishell_ui.h:100
#define KEY_CTRL_D
Definition: minishell_ui.h:95
#define KEY_BACKSPACE
Definition: minishell_ui.h:94
#define MAX_CMD_LEN
Definition: minishell_ui.h:84
#define KEY_DOWN
Definition: minishell_ui.h:98
#define KEY_ESC
Definition: minishell_ui.h:92
#define KEY_ENTER
Definition: minishell_ui.h:93
#define KEY_CTRL_C
Definition: minishell_ui.h:96
#define KEY_LEFT
Definition: minishell_ui.h:99
#define KEY_UP
Definition: minishell_ui.h:97
Cmd input buffer.
Definition: minishell_ui.h:137
char buf[MAX_CMD_LEN]
Fixed size buffer.
Definition: minishell_ui.h:138
int len
Current input length.
Definition: minishell_ui.h:139
int scroll
Current scroll's offset.
Definition: minishell_ui.h:150
int count
Nbr of stored lines.
Definition: minishell_ui.h:149
Shell state.
Definition: structs.h:164
struct s_ui * ui
UI state (NULL if off)
Definition: structs.h:170
UI state.
Definition: minishell_ui.h:167
t_cmd cmd
Cmd buffer.
Definition: minishell_ui.h:169
t_out out
Output state.
Definition: minishell_ui.h:170
int running
Event loop flag.
Definition: minishell_ui.h:172