Fixed argument to tcsetattr.
[scilab.git] / scilab / modules / console / src / c / cmdLine / initConsoleMode.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2011 - DIGITEO - Karim Mamode
4 *
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution.  The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 */
11
12 #include <termios.h>
13 #include <curses.h>
14 #include <term.h>
15 #include <unistd.h>
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include <errno.h>
20 #include "MALLOC.h"
21 #include "initConsoleMode.h"
22
23 static void canonicMode(struct termios *t)
24 {
25     t->c_lflag |= ICANON;       /* Set CANON flag */
26     t->c_lflag |= ECHO;         /* Print character when a key is pressed */
27 }
28
29 static void rawMode(struct termios *t)
30 {
31     t->c_lflag &= ~ICANON;      /* take off CANON flag */
32     t->c_lflag &= ~ECHO;        /* Do not print character when a key is pressed */
33     t->c_cc[VMIN] = 1;          /* Wait 1 charater before leaving getwchar */
34     t->c_cc[VTIME] = 0;         /* Wait 0 second before leaving getwchar */
35 }
36
37 /* Save Shell Attribute To reset it when exit */
38 static void saveAndResetShellAttr(struct termios *shellAttr)
39 {
40     static struct termios *savedAttr = NULL;
41
42     if (savedAttr == NULL && shellAttr != NULL)
43     {
44         savedAttr = MALLOC(sizeof(*savedAttr));
45         *savedAttr = *shellAttr;
46     }
47     else if (shellAttr == NULL && savedAttr != NULL)
48     {
49         if (tcsetattr(0, TCSAFLUSH, savedAttr) == -1)
50         {
51             fprintf(stderr, "Cannot reset the shell attributes: %s\n", strerror(errno));
52         }
53         FREE(savedAttr);
54         savedAttr = NULL;
55     }
56 }
57
58 static void saveShellAttr(struct termios *shellAttr)
59 {
60     saveAndResetShellAttr(shellAttr);
61 }
62
63 static void resetShellAttr(void)
64 {
65     saveAndResetShellAttr(NULL);
66 }
67
68 /* Set Raw mode or Canonic Mode */
69 int setAttr(int bin)
70 {
71     struct termios shellAttr;
72
73     if (bin == ATTR_RESET)
74     {
75         resetShellAttr();
76         return 0;
77     }
78     if (tcgetattr(0, &shellAttr) == -1)
79     {
80         fprintf(stderr, "Cannot access to the term attributes: %s\n", strerror(errno));
81         return -1;
82     }
83     saveShellAttr(&shellAttr);
84     if (bin == CANON)
85     {
86         canonicMode(&shellAttr);
87     }
88     else if (bin == RAW)
89     {
90         rawMode(&shellAttr);
91     }
92     if (tcsetattr(0, TCSAFLUSH, &shellAttr) == -1)
93     {
94         fprintf(stderr, "Cannot change the term attributes: %s\n", strerror(errno));
95         return -1;
96     }
97     return 0;
98 }
99
100 /* Initialise console mode */
101 int initConsoleMode(int bin)
102 {
103     /* TODO: Check more term */
104     if (tgetent(NULL, getenv("TERM")) == ERR && tgetent(NULL, "xterm") == ERR)
105     {
106         fprintf(stderr, "Cannot initialise termcaps.\nPlease check your variable TERM in your environment.\n");
107         return -1;
108     }
109
110     if (!isatty(fileno(stdin)))
111     {
112         /* We are in a pipe, no need to init the console */
113         return 0;
114     }
115
116     return setAttr(bin);
117 }