forked from nakidai/csnake
1
0
Fork 0

Add input function

master
Nakidai 2023-10-29 21:31:33 +03:00
parent 03481db05f
commit 9dc2da1f90
Signed by untrusted user who does not match committer: nakidai
GPG Key ID: 914675D395210A97
3 changed files with 48 additions and 1 deletions

View File

@ -7,7 +7,7 @@ LD = ld
RM = rm -f RM = rm -f
SRCDIR = src SRCDIR = src
OBJDIR = obj OBJDIR = obj
SRC = main.c screen.c SRC = main.c screen.c input.c
OBJ = $(addprefix $(OBJDIR)/,$(SRC:.c=.o)) OBJ = $(addprefix $(OBJDIR)/,$(SRC:.c=.o))
default: $(OUT) default: $(OUT)

14
include/input.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef __INPUT_H__
#define __INPUT_H__
#include <stdbool.h>
typedef struct input_args_t
{
char *out;
bool *alive;
} inputArgs;
void input(void *vargp);
#endif /* __INPUT_H__ */

33
src/input.c Normal file
View File

@ -0,0 +1,33 @@
#include "input.h"
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
char getch(void)
{
char buf = 0;
struct termios old = { 0 };
fflush(stdout);
if (tcgetattr(0, &old) < 0) perror("tcsetattr()");
old.c_lflag &= ~ICANON; // local modes = Non Canonical mode
old.c_lflag &= ~ECHO; // local modes = Disable echo.
old.c_cc[VMIN] = 1; // control chars (MIN value) = 1
old.c_cc[VTIME] = 0; // control chars (TIME value) = 0 (No time)
if (tcsetattr(0, TCSANOW, &old) < 0) perror("tcsetattr ICANON");
if (read(0, &buf, 1) < 0) perror("read()");
old.c_lflag |= ICANON; // local modes = Canonical mode
old.c_lflag |= ECHO; // local modes = Enable echo.
if (tcsetattr(0, TCSADRAIN, &old) < 0) perror ("tcsetattr ~ICANON");
return buf;
}
void input(void *vargp)
{
char *out = ((inputArgs *)vargp)->out;
bool *alive = ((inputArgs *)vargp)->alive;
while (*alive)
{
*out = getch();
}
}