Allow {start,stop}_driver to fail, abort constructor, have driver-ti try to write the entire start/stop string or error out on -1
This commit is contained in:
parent
8d2fa34a52
commit
052738b8f4
43
driver-ti.c
43
driver-ti.c
|
@ -289,27 +289,54 @@ abort_free_ti:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void start_driver(TermKey *tk, void *info)
|
static int start_driver(TermKey *tk, void *info)
|
||||||
{
|
{
|
||||||
TermKeyTI *ti = info;
|
TermKeyTI *ti = info;
|
||||||
|
char *start_string = ti->start_string;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if(tk->fd == -1 || !start_string)
|
||||||
|
return 1;
|
||||||
|
|
||||||
/* The terminfo database will contain keys in application cursor key mode.
|
/* The terminfo database will contain keys in application cursor key mode.
|
||||||
* We may need to enable that mode
|
* We may need to enable that mode
|
||||||
*/
|
*/
|
||||||
if(tk->fd != -1 && ti->start_string) {
|
|
||||||
// Can't call putp or tputs because they suck and don't give us fd control
|
// Can't call putp or tputs because they suck and don't give us fd control
|
||||||
(void)write(tk->fd, ti->start_string, strlen(ti->start_string));
|
len = strlen(start_string);
|
||||||
|
while(len) {
|
||||||
|
size_t written = write(tk->fd, start_string, len);
|
||||||
|
if(written == -1)
|
||||||
|
return 0;
|
||||||
|
start_string += written;
|
||||||
|
len -= written;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stop_driver(TermKey *tk, void *info)
|
static int stop_driver(TermKey *tk, void *info)
|
||||||
{
|
{
|
||||||
TermKeyTI *ti = info;
|
TermKeyTI *ti = info;
|
||||||
|
char *stop_string = ti->stop_string;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
if(tk->fd != -1 && ti->stop_string) {
|
if(tk->fd == -1 || !stop_string)
|
||||||
// Can't call putp or tputs because they suck and don't give us fd control
|
return 1;
|
||||||
(void)write(tk->fd, ti->stop_string, strlen(ti->stop_string));
|
|
||||||
|
/* The terminfo database will contain keys in application cursor key mode.
|
||||||
|
* We may need to enable that mode
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Can't call putp or tputs because they suck and don't give us fd control
|
||||||
|
len = strlen(stop_string);
|
||||||
|
while(len) {
|
||||||
|
size_t written = write(tk->fd, stop_string, len);
|
||||||
|
if(written == -1)
|
||||||
|
return 0;
|
||||||
|
stop_string += written;
|
||||||
|
len -= written;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_driver(void *info)
|
static void free_driver(void *info)
|
||||||
|
|
|
@ -11,8 +11,8 @@ struct TermKeyDriver
|
||||||
const char *name;
|
const char *name;
|
||||||
void *(*new_driver)(TermKey *tk, const char *term);
|
void *(*new_driver)(TermKey *tk, const char *term);
|
||||||
void (*free_driver)(void *info);
|
void (*free_driver)(void *info);
|
||||||
void (*start_driver)(TermKey *tk, void *info);
|
int (*start_driver)(TermKey *tk, void *info);
|
||||||
void (*stop_driver)(TermKey *tk, void *info);
|
int (*stop_driver)(TermKey *tk, void *info);
|
||||||
TermKeyResult (*peekkey)(TermKey *tk, void *info, TermKeyKey *key, int force, size_t *nbytes);
|
TermKeyResult (*peekkey)(TermKey *tk, void *info, TermKeyKey *key, int force, size_t *nbytes);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -318,7 +318,8 @@ static TermKey *termkey_new_full(int fd, int flags, size_t buffsize, int waittim
|
||||||
struct TermKeyDriverNode *p;
|
struct TermKeyDriverNode *p;
|
||||||
for(p = tk->drivers; p; p = p->next)
|
for(p = tk->drivers; p; p = p->next)
|
||||||
if(p->driver->start_driver)
|
if(p->driver->start_driver)
|
||||||
(*p->driver->start_driver)(tk, p->info);
|
if(!(*p->driver->start_driver)(tk, p->info))
|
||||||
|
goto abort_free_drivers;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "Drivers started; termkey instance %p is ready\n", tk);
|
fprintf(stderr, "Drivers started; termkey instance %p is ready\n", tk);
|
||||||
|
|
Loading…
Reference in New Issue