summaryrefslogtreecommitdiffstats
path: root/smenu.c
diff options
context:
space:
mode:
authorpgen <p.gen.progs@gmail.com>2021-01-23 22:42:13 +0100
committerpgen <p.gen.progs@gmail.com>2021-01-23 22:42:13 +0100
commit229be48b14c66775ebebd16f2816be879c0e9252 (patch)
treeb8c086be27b38bd35196e94899e130a27dd6de26 /smenu.c
parentf6637bea0c1cb3b773aa1e00b89dee548e2ed2cd (diff)
Improve the function that gets the cursor position
Remove the now useless xread utility function and try to do it faster.
Diffstat (limited to 'smenu.c')
-rw-r--r--smenu.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/smenu.c b/smenu.c
index 7948823..c3e57d0 100644
--- a/smenu.c
+++ b/smenu.c
@@ -1415,14 +1415,19 @@ int
get_cursor_position(int * const r, int * const c)
{
char buf[32];
- size_t i = 0;
- int count = 64;
- int v;
- int rc = 1;
+ char * s;
+
+ int count = 64;
+ int v;
+ int rc = 1;
+
+ int ask; /* Number of asked characters. */
+ int got; /* Number of characters obtained. */
+
+ int buf_size = sizeof(buf);
/* Report cursor location. */
/* """"""""""""""""""""""" */
- errno = 0;
while ((v = write(STDOUT_FILENO, "\x1b[6n", 4)) == -1 && count)
{
if (errno == EINTR)
@@ -1443,17 +1448,20 @@ read:
/* Read the response: ESC [ rows ; cols R. */
/* """"""""""""""""""""""""""""""""""""""" */
- while (i < sizeof(buf) - 1)
- {
- if (xread(STDIN_FILENO, buf + i, 1) != 1)
- break;
+ *(s = buf) = 0;
- i++;
+ do
+ {
+ ask = buf_size - 1 - (s - buf);
+ got = read(STDIN_FILENO, s, ask);
- if (buf[i - 1] == 'R')
+ if (got < 0 && errno == EINTR)
+ got = 0;
+ else if (got == 0)
break;
- }
- buf[i] = '\0';
+
+ s += got;
+ } while (strchr(buf, 'R') == 0);
/* Parse it. */
/* """"""""" */