summaryrefslogtreecommitdiff
path: root/Src/Zle
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/zle_main.c19
-rw-r--r--Src/Zle/zle_thingy.c16
2 files changed, 27 insertions, 8 deletions
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index b2d075f91..b2a662072 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -313,11 +313,17 @@ static int
breakread(int fd, char *buf, int n)
{
fd_set f;
+ int ret;
FD_ZERO(&f);
FD_SET(fd, &f);
- return (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ?
- EOF : read(fd, buf, n));
+
+ ALLOWTRAPS {
+ ret = (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ?
+ EOF : read(fd, buf, n));
+ } DISALLOWTRAPS;
+
+ return ret;
}
# define read breakread
@@ -388,7 +394,7 @@ getkey(int keytmout)
# else
ioctl(SHTTY, TCSETA, &ti.tio);
# endif
- r = read(SHTTY, &cc, 1);
+ r = ztrapread(SHTTY, &cc, 1);
# ifdef HAVE_TERMIOS_H
tcsetattr(SHTTY, TCSANOW, &shttyinfo.tio);
# else
@@ -398,7 +404,10 @@ getkey(int keytmout)
# endif
#endif
}
- while ((r = read(SHTTY, &cc, 1)) != 1) {
+ for (;;) {
+ r = ztrapread(SHTTY, &cc, 1);
+ if (r == 1)
+ break;
if (r == 0) {
/* The test for IGNOREEOF was added to make zsh ignore ^Ds
that were typed while commands are running. Unfortuantely
@@ -1083,7 +1092,7 @@ zleaftertrap(Hookdef dummy, void *dat)
static struct builtin bintab[] = {
BUILTIN("bindkey", 0, bin_bindkey, 0, -1, 0, "evaMldDANmrsLR", NULL),
BUILTIN("vared", 0, bin_vared, 1, 7, 0, NULL, NULL),
- BUILTIN("zle", 0, bin_zle, 0, -1, 0, "lDANCLmMgGcRaU", NULL),
+ BUILTIN("zle", 0, bin_zle, 0, -1, 0, "lDANCLmMgGcRaUI", NULL),
};
/* The order of the entries in this table has to match the *HOOK
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index 7e81e2f88..f5acb73b4 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -339,6 +339,7 @@ bin_zle(char *name, char **args, char *ops, int func)
{ 'R', bin_zle_refresh, 0, -1 },
{ 'M', bin_zle_mesg, 1, 1 },
{ 'U', bin_zle_unget, 1, 1 },
+ { 'I', bin_zle_invalidate, 0, 0 },
{ 0, bin_zle_call, 0, -1 },
};
struct opn const *op, *opp;
@@ -396,10 +397,8 @@ bin_zle_refresh(char *name, char **args, char *ops, char func)
char *s = statusline;
int sl = statusll, ocl = clearlist;
- if (!zleactive) {
- zwarnnam(name, "can only be called from widget function", NULL, 0);
+ if (!zleactive)
return 1;
- }
statusline = NULL;
statusll = 0;
if (*args) {
@@ -656,6 +655,17 @@ bin_zle_call(char *name, char **args, char *ops, char func)
return ret;
}
+/**/
+static int
+bin_zle_invalidate(char *name, char **args, char *ops, char func)
+{
+ if (zleactive) {
+ trashzle();
+ return 0;
+ } else
+ return 1;
+}
+
/*******************/
/* initialiasation */
/*******************/