summaryrefslogtreecommitdiffstats
path: root/input
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2011-04-25 11:38:46 +0300
committerUoti Urpala <uau@mplayer2.org>2011-05-02 00:44:21 +0300
commit3832d67afd7ce1feefd86a345af2af6d708efc38 (patch)
tree991f0ea14f9104ca5df6a14e5a2c4ad0b24fd0c8 /input
parent23cb82907220d0c2724a0ec92bde437cbcd67d6a (diff)
downloadmpv-3832d67afd7ce1feefd86a345af2af6d708efc38.tar.bz2
mpv-3832d67afd7ce1feefd86a345af2af6d708efc38.tar.xz
cleanup: reformat input.c
Diffstat (limited to 'input')
-rw-r--r--input/input.c1878
1 files changed, 957 insertions, 921 deletions
diff --git a/input/input.c b/input/input.c
index f5e2d3824d..225c4eee0d 100644
--- a/input/input.c
+++ b/input/input.c
@@ -59,13 +59,13 @@
#include "ar.h"
typedef struct mp_cmd_bind {
- int input[MP_MAX_KEY_DOWN+1];
- char* cmd;
+ int input[MP_MAX_KEY_DOWN + 1];
+ char *cmd;
} mp_cmd_bind_t;
typedef struct mp_key_name {
- int key;
- char* name;
+ int key;
+ char *name;
} mp_key_name_t;
/// This array defines all known commands.
@@ -532,37 +532,37 @@ static const mp_cmd_bind_t def_cmd_binds[] = {
#define CMD_QUEUE_SIZE 100
typedef struct mp_input_fd {
- int fd;
- union {
- mp_key_func_t key;
- mp_cmd_func_t cmd;
- } read_func;
- mp_close_func_t close_func;
- void *ctx;
- unsigned eof : 1;
- unsigned drop : 1;
- unsigned dead : 1;
- unsigned got_cmd : 1;
- unsigned no_select : 1;
- // These fields are for the cmd fds.
- char* buffer;
- int pos,size;
+ int fd;
+ union {
+ mp_key_func_t key;
+ mp_cmd_func_t cmd;
+ } read_func;
+ mp_close_func_t close_func;
+ void *ctx;
+ unsigned eof : 1;
+ unsigned drop : 1;
+ unsigned dead : 1;
+ unsigned got_cmd : 1;
+ unsigned no_select : 1;
+ // These fields are for the cmd fds.
+ char *buffer;
+ int pos, size;
} mp_input_fd_t;
typedef struct mp_cmd_filter mp_cmd_filter_t;
struct mp_cmd_filter {
- mp_input_cmd_filter filter;
- void* ctx;
- mp_cmd_filter_t* next;
+ mp_input_cmd_filter filter;
+ void *ctx;
+ mp_cmd_filter_t *next;
};
typedef struct mp_cmd_bind_section mp_cmd_bind_section_t;
struct mp_cmd_bind_section {
- mp_cmd_bind_t* cmd_binds;
- char* section;
- mp_cmd_bind_section_t* next;
+ mp_cmd_bind_t *cmd_binds;
+ char *section;
+ mp_cmd_bind_section_t *next;
};
struct input_ctx {
@@ -599,40 +599,40 @@ struct input_ctx {
};
-static mp_cmd_filter_t* cmd_filters = NULL;
+static mp_cmd_filter_t *cmd_filters = NULL;
// Callback to allow the menu filter to grab the incoming keys
int (*mp_input_key_cb)(int code) = NULL;
int async_quit_request;
-static int print_key_list(m_option_t* cfg);
-static int print_cmd_list(m_option_t* cfg);
+static int print_key_list(m_option_t *cfg);
+static int print_cmd_list(m_option_t *cfg);
// Our command line options
static const m_option_t input_conf[] = {
OPT_STRING("conf", input.config_file, CONF_GLOBAL),
- OPT_INT("ar-delay",input.ar_delay, CONF_GLOBAL),
+ OPT_INT("ar-delay", input.ar_delay, CONF_GLOBAL),
OPT_INT("ar-rate", input.ar_rate, CONF_GLOBAL),
- { "keylist", print_key_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },
- { "cmdlist", print_cmd_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },
+ { "keylist", print_key_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },
+ { "cmdlist", print_cmd_list, CONF_TYPE_FUNC, CONF_GLOBAL, 0, 0, NULL },
OPT_STRING("js-dev", input.js_dev, CONF_GLOBAL),
OPT_STRING("ar-dev", input.ar_dev, CONF_GLOBAL),
OPT_STRING("file", input.in_file, CONF_GLOBAL),
OPT_MAKE_FLAGS("default-bindings", input.default_bindings, CONF_GLOBAL),
- { NULL, NULL, 0, 0, 0, 0, NULL}
+ { NULL, NULL, 0, 0, 0, 0, NULL}
};
static const m_option_t mp_input_opts[] = {
- { "input", &input_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
+ { "input", &input_conf, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
OPT_MAKE_FLAGS("joystick", input.use_joystick, CONF_GLOBAL),
OPT_MAKE_FLAGS("lirc", input.use_lirc, CONF_GLOBAL),
OPT_MAKE_FLAGS("lircc", input.use_lircc, CONF_GLOBAL),
OPT_MAKE_FLAGS("ar", input.use_ar, CONF_GLOBAL),
- { NULL, NULL, 0, 0, 0, 0, NULL}
+ { NULL, NULL, 0, 0, 0, 0, NULL}
};
-static int default_cmd_func(int fd,char* buf, int l);
+static int default_cmd_func(int fd, char *buf, int l);
static char *get_key_name(int key)
{
@@ -659,90 +659,94 @@ static char *get_key_name(int key)
int mp_input_add_cmd_fd(struct input_ctx *ictx, int fd, int select,
mp_cmd_func_t read_func, mp_close_func_t close_func)
{
- if (ictx->num_cmd_fd == MP_MAX_CMD_FD) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Too many command file descriptors, cannot register file descriptor %d.\n",fd);
- return 0;
- }
- if (select && fd < 0) {
- mp_msg(MSGT_INPUT, MSGL_ERR, "Invalid fd %i in mp_input_add_cmd_fd", fd);
- return 0;
- }
+ if (ictx->num_cmd_fd == MP_MAX_CMD_FD) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Too many command file descriptors, "
+ "cannot register file descriptor %d.\n", fd);
+ return 0;
+ }
+ if (select && fd < 0) {
+ mp_msg(MSGT_INPUT, MSGL_ERR,
+ "Invalid fd %d in mp_input_add_cmd_fd", fd);
+ return 0;
+ }
- ictx->cmd_fds[ictx->num_cmd_fd] = (struct mp_input_fd){
- .fd = fd,
- .read_func.cmd = read_func ? read_func : default_cmd_func,
- .close_func = close_func,
- .no_select = !select
- };
- ictx->num_cmd_fd++;
+ ictx->cmd_fds[ictx->num_cmd_fd] = (struct mp_input_fd){
+ .fd = fd,
+ .read_func.cmd = read_func ? read_func : default_cmd_func,
+ .close_func = close_func,
+ .no_select = !select
+ };
+ ictx->num_cmd_fd++;
- return 1;
+ return 1;
}
void mp_input_rm_cmd_fd(struct input_ctx *ictx, int fd)
{
struct mp_input_fd *cmd_fds = ictx->cmd_fds;
- unsigned int i;
-
- for (i = 0; i < ictx->num_cmd_fd; i++) {
- if(cmd_fds[i].fd == fd)
- break;
- }
- if (i == ictx->num_cmd_fd)
- return;
- if(cmd_fds[i].close_func)
- cmd_fds[i].close_func(cmd_fds[i].fd);
- talloc_free(cmd_fds[i].buffer);
-
- if (i + 1 < ictx->num_cmd_fd)
- memmove(&cmd_fds[i], &cmd_fds[i+1],
- (ictx->num_cmd_fd - i - 1) * sizeof(mp_input_fd_t));
- ictx->num_cmd_fd--;
+ unsigned int i;
+
+ for (i = 0; i < ictx->num_cmd_fd; i++) {
+ if (cmd_fds[i].fd == fd)
+ break;
+ }
+ if (i == ictx->num_cmd_fd)
+ return;
+ if (cmd_fds[i].close_func)
+ cmd_fds[i].close_func(cmd_fds[i].fd);
+ talloc_free(cmd_fds[i].buffer);
+
+ if (i + 1 < ictx->num_cmd_fd)
+ memmove(&cmd_fds[i], &cmd_fds[i + 1],
+ (ictx->num_cmd_fd - i - 1) * sizeof(mp_input_fd_t));
+ ictx->num_cmd_fd--;
}
void mp_input_rm_key_fd(struct input_ctx *ictx, int fd)
{
struct mp_input_fd *key_fds = ictx->key_fds;
- unsigned int i;
-
- for (i = 0; i < ictx->num_key_fd; i++) {
- if(key_fds[i].fd == fd)
- break;
- }
- if (i == ictx->num_key_fd)
- return;
- if(key_fds[i].close_func)
- key_fds[i].close_func(key_fds[i].fd);
-
- if(i + 1 < ictx->num_key_fd)
- memmove(&key_fds[i], &key_fds[i+1],
- (ictx->num_key_fd - i - 1) * sizeof(mp_input_fd_t));
- ictx->num_key_fd--;
+ unsigned int i;
+
+ for (i = 0; i < ictx->num_key_fd; i++) {
+ if (key_fds[i].fd == fd)
+ break;
+ }
+ if (i == ictx->num_key_fd)
+ return;
+ if (key_fds[i].close_func)
+ key_fds[i].close_func(key_fds[i].fd);
+
+ if (i + 1 < ictx->num_key_fd)
+ memmove(&key_fds[i], &key_fds[i + 1],
+ (ictx->num_key_fd - i - 1) * sizeof(mp_input_fd_t));
+ ictx->num_key_fd--;
}
int mp_input_add_key_fd(struct input_ctx *ictx, int fd, int select,
mp_key_func_t read_func, mp_close_func_t close_func,
void *ctx)
{
- if (ictx->num_key_fd == MP_MAX_KEY_FD) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Too many key file descriptors, cannot register file descriptor %d.\n",fd);
- return 0;
- }
- if (select && fd < 0) {
- mp_msg(MSGT_INPUT, MSGL_ERR, "Invalid fd %i in mp_input_add_key_fd", fd);
- return 0;
- }
-
- ictx->key_fds[ictx->num_key_fd] = (struct mp_input_fd){
- .fd = fd,
- .read_func.key = read_func,
- .close_func = close_func,
- .no_select = !select,
- .ctx = ctx,
- };
- ictx->num_key_fd++;
-
- return 1;
+ if (ictx->num_key_fd == MP_MAX_KEY_FD) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Too many key file descriptors, "
+ "cannot register file descriptor %d.\n", fd);
+ return 0;
+ }
+ if (select && fd < 0) {
+ mp_msg(MSGT_INPUT, MSGL_ERR,
+ "Invalid fd %d in mp_input_add_key_fd", fd);
+ return 0;
+ }
+
+ ictx->key_fds[ictx->num_key_fd] = (struct mp_input_fd){
+ .fd = fd,
+ .read_func.key = read_func,
+ .close_func = close_func,
+ .no_select = !select,
+ .ctx = ctx,
+ };
+ ictx->num_key_fd++;
+
+ return 1;
}
int mp_input_parse_and_queue_cmds(struct input_ctx *ictx, const char *str)
@@ -754,8 +758,8 @@ int mp_input_parse_and_queue_cmds(struct input_ctx *ictx, const char *str)
while (*str) {
mp_cmd_t *cmd;
size_t len = strcspn(str, "\r\n");
- char *cmdbuf = talloc_size(NULL, len+1);
- av_strlcpy(cmdbuf, str, len+1);
+ char *cmdbuf = talloc_size(NULL, len + 1);
+ av_strlcpy(cmdbuf, str, len + 1);
cmd = mp_input_parse_cmd(cmdbuf);
if (cmd) {
mp_input_queue_cmd(ictx, cmd);
@@ -769,351 +773,375 @@ int mp_input_parse_and_queue_cmds(struct input_ctx *ictx, const char *str)
return cmd_num;
}
-mp_cmd_t*
-mp_input_parse_cmd(char* str) {
- int i,l;
- int pausing = 0;
- char *ptr,*e;
- const mp_cmd_t *cmd_def;
+mp_cmd_t *mp_input_parse_cmd(char *str)
+{
+ int i, l;
+ int pausing = 0;
+ char *ptr, *e;
+ const mp_cmd_t *cmd_def;
#ifdef MP_DEBUG
- assert(str != NULL);
+ assert(str != NULL);
#endif
- // Ignore heading spaces.
- while (str[0] == ' ' || str[0] == '\t')
- ++str;
-
- if (strncmp(str, "pausing ", 8) == 0) {
- pausing = 1;
- str = &str[8];
- } else if (strncmp(str, "pausing_keep ", 13) == 0) {
- pausing = 2;
- str = &str[13];
- } else if (strncmp(str, "pausing_toggle ", 15) == 0) {
- pausing = 3;
- str = &str[15];
- } else if (strncmp(str, "pausing_keep_force ", 19) == 0) {
- pausing = 4;
- str = &str[19];
- }
-
- for(ptr = str ; ptr[0] != '\0' && ptr[0] != '\t' && ptr[0] != ' ' ; ptr++)
- /* NOTHING */;
- if(ptr[0] != '\0')
- l = ptr-str;
- else
- l = strlen(str);
-
- if(l == 0)
- return NULL;
+ // Ignore heading spaces.
+ while (str[0] == ' ' || str[0] == '\t')
+ ++str;
- for(i=0; mp_cmds[i].name != NULL; i++) {
- if(strncasecmp(mp_cmds[i].name,str,l) == 0)
- break;
- }
+ if (strncmp(str, "pausing ", 8) == 0) {
+ pausing = 1;
+ str = &str[8];
+ } else if (strncmp(str, "pausing_keep ", 13) == 0) {
+ pausing = 2;
+ str = &str[13];
+ } else if (strncmp(str, "pausing_toggle ", 15) == 0) {
+ pausing = 3;
+ str = &str[15];
+ } else if (strncmp(str, "pausing_keep_force ", 19) == 0) {
+ pausing = 4;
+ str = &str[19];
+ }
- if(mp_cmds[i].name == NULL)
- return NULL;
+ for (ptr = str; ptr[0] != '\0' && ptr[0] != '\t' && ptr[0] != ' '; ptr++)
+ /* NOTHING */;
+ if (ptr[0] != '\0')
+ l = ptr - str;
+ else
+ l = strlen(str);
- cmd_def = &mp_cmds[i];
-
- mp_cmd_t *cmd = talloc_ptrtype(NULL, cmd);
- *cmd = (mp_cmd_t){
- .id = cmd_def->id,
- .name = talloc_strdup(cmd, cmd_def->name),
- .pausing = pausing,
- };
-
- ptr = str;
-
- for(i=0; ptr && i < MP_CMD_MAX_ARGS; i++) {
- while(ptr[0] != ' ' && ptr[0] != '\t' && ptr[0] != '\0') ptr++;
- if(ptr[0] == '\0') break;
- while(ptr[0] == ' ' || ptr[0] == '\t') ptr++;
- if(ptr[0] == '\0' || ptr[0] == '#') break;
- cmd->args[i].type = cmd_def->args[i].type;
- switch(cmd_def->args[i].type) {
- case MP_CMD_ARG_INT:
- errno = 0;
- cmd->args[i].v.i = atoi(ptr);
- if(errno != 0) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Command %s: argument %d isn't an integer.\n",cmd_def->name,i+1);
- ptr = NULL;
- }
- break;
- case MP_CMD_ARG_FLOAT:
- errno = 0;
- cmd->args[i].v.f = atof(ptr);
- if(errno != 0) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Command %s: argument %d isn't a float.\n",cmd_def->name,i+1);
- ptr = NULL;
- }
- break;
- case MP_CMD_ARG_STRING: {
- char term;
- char* ptr2 = ptr, *start;
-
- if(ptr[0] == '\'' || ptr[0] == '"') {
- term = ptr[0];
- ptr2++;
- } else
- term = ' ';
- start = ptr2;
- while(1) {
- e = strchr(ptr2,term);
- if(!e) break;
- if(e <= ptr2 || *(e - 1) != '\\') break;
- ptr2 = e + 1;
- }
-
- if(term != ' ' && (!e || e[0] == '\0')) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Command %s: argument %d is unterminated.\n",cmd_def->name,i+1);
- ptr = NULL;
- break;
- } else if(!e) e = ptr+strlen(ptr);
- l = e-start;
- ptr2 = start;
- for(e = strchr(ptr2,'\\') ; e && e<start+l ; e = strchr(ptr2,'\\')) {
- memmove(e,e+1,strlen(e));
- ptr2 = e + 1;
- l--;
- }
- cmd->args[i].v.s = talloc_strndup(cmd, start, l);
- if(term != ' ') ptr += l+2;
- } break;
- case -1:
- ptr = NULL;
- break;
- default :
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Unknown argument %d\n",i);
+ if (l == 0)
+ return NULL;
+
+ for (i = 0; mp_cmds[i].name != NULL; i++) {
+ if (strncasecmp(mp_cmds[i].name, str, l) == 0)
+ break;
}
- }
- cmd->nargs = i;
- if(cmd_def->nargs > cmd->nargs) {
-/* mp_msg(MSGT_INPUT,MSGL_ERR,"Got command '%s' but\n",str); */
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Command %s requires at least %d arguments, we found only %d so far.\n",cmd_def->name,cmd_def->nargs,cmd->nargs);
- mp_cmd_free(cmd);
- return NULL;
- }
+ if (mp_cmds[i].name == NULL)
+ return NULL;
- for( ; i < MP_CMD_MAX_ARGS && cmd_def->args[i].type != -1 ; i++) {
- memcpy(&cmd->args[i],&cmd_def->args[i],sizeof(mp_cmd_arg_t));
- if(cmd_def->args[i].type == MP_CMD_ARG_STRING && cmd_def->args[i].v.s != NULL)
- cmd->args[i].v.s = talloc_strdup(cmd, cmd_def->args[i].v.s);
- }
+ cmd_def = &mp_cmds[i];
+
+ mp_cmd_t *cmd = talloc_ptrtype(NULL, cmd);
+ *cmd = (mp_cmd_t){
+ .id = cmd_def->id,
+ .name = talloc_strdup(cmd, cmd_def->name),
+ .pausing = pausing,
+ };
- if(i < MP_CMD_MAX_ARGS)
- cmd->args[i].type = -1;
+ ptr = str;
+
+ for (i = 0; ptr && i < MP_CMD_MAX_ARGS; i++) {
+ while (ptr[0] != ' ' && ptr[0] != '\t' && ptr[0] != '\0')
+ ptr++;
+ if (ptr[0] == '\0')
+ break;
+ while (ptr[0] == ' ' || ptr[0] == '\t')
+ ptr++;
+ if (ptr[0] == '\0' || ptr[0] == '#')
+ break;
+ cmd->args[i].type = cmd_def->args[i].type;
+ switch (cmd_def->args[i].type) {
+ case MP_CMD_ARG_INT:
+ errno = 0;
+ cmd->args[i].v.i = atoi(ptr);
+ if (errno != 0) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Command %s: argument %d "
+ "isn't an integer.\n", cmd_def->name, i + 1);
+ ptr = NULL;
+ }
+ break;
+ case MP_CMD_ARG_FLOAT:
+ errno = 0;
+ cmd->args[i].v.f = atof(ptr);
+ if (errno != 0) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Command %s: argument %d "
+ "isn't a float.\n", cmd_def->name, i + 1);
+ ptr = NULL;
+ }
+ break;
+ case MP_CMD_ARG_STRING: {
+ char term;
+ char *ptr2 = ptr, *start;
+
+ if (ptr[0] == '\'' || ptr[0] == '"') {
+ term = ptr[0];
+ ptr2++;
+ } else
+ term = ' ';
+ start = ptr2;
+ while (1) {
+ e = strchr(ptr2, term);
+ if (!e)
+ break;
+ if (e <= ptr2 || *(e - 1) != '\\')
+ break;
+ ptr2 = e + 1;
+ }
- return cmd;
+ if (term != ' ' && (!e || e[0] == '\0')) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Command %s: argument %d is "
+ "unterminated.\n", cmd_def->name, i + 1);
+ ptr = NULL;
+ break;
+ } else if (!e)
+ e = ptr + strlen(ptr);
+ l = e - start;
+ ptr2 = start;
+ for (e = strchr(ptr2, '\\'); e && e < start + l; e = strchr(ptr2, '\\')) {
+ memmove(e, e + 1, strlen(e));
+ ptr2 = e + 1;
+ l--;
+ }
+ cmd->args[i].v.s = talloc_strndup(cmd, start, l);
+ if (term != ' ')
+ ptr += l + 2;
+ break;
+ }
+ case -1:
+ ptr = NULL;
+ break;
+ default:
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Unknown argument %d\n", i);
+ }
+ }
+ cmd->nargs = i;
+
+ if (cmd_def->nargs > cmd->nargs) {
+/* mp_msg(MSGT_INPUT, MSGL_ERR, "Got command '%s' but\n", str); */
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Command %s requires at least %d "
+ "arguments, we found only %d so far.\n", cmd_def->name,
+ cmd_def->nargs, cmd->nargs);
+ mp_cmd_free(cmd);
+ return NULL;
+ }
+
+ for (; i < MP_CMD_MAX_ARGS && cmd_def->args[i].type != -1; i++) {
+ memcpy(&cmd->args[i], &cmd_def->args[i], sizeof(mp_cmd_arg_t));
+ if (cmd_def->args[i].type == MP_CMD_ARG_STRING
+ && cmd_def->args[i].v.s != NULL)
+ cmd->args[i].v.s = talloc_strdup(cmd, cmd_def->args[i].v.s);
+ }
+
+ if (i < MP_CMD_MAX_ARGS)
+ cmd->args[i].type = -1;
+
+ return cmd;
}
#define MP_CMD_MAX_SIZE 4096
-static int read_cmd(mp_input_fd_t* mp_fd, char** ret)
+static int read_cmd(mp_input_fd_t *mp_fd, char **ret)
{
- char* end;
- (*ret) = NULL;
-
- // Allocate the buffer if it doesn't exist
- if(!mp_fd->buffer) {
- mp_fd->buffer = talloc_size(NULL, MP_CMD_MAX_SIZE);
- mp_fd->pos = 0;
- mp_fd->size = MP_CMD_MAX_SIZE;
- }
-
- // Get some data if needed/possible
- while (!mp_fd->got_cmd && !mp_fd->eof && (mp_fd->size - mp_fd->pos > 1) ) {
- int r = mp_fd->read_func.cmd(mp_fd->fd, mp_fd->buffer+mp_fd->pos,
- mp_fd->size - 1 - mp_fd->pos);
- // Error ?
- if(r < 0) {
- switch(r) {
- case MP_INPUT_ERROR:
- case MP_INPUT_DEAD:
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Error while reading command file descriptor %d: %s\n",mp_fd->fd,strerror(errno));
- case MP_INPUT_NOTHING:
- return r;
- case MP_INPUT_RETRY:
- continue;
- }
- // EOF ?
- } else if(r == 0) {
- mp_fd->eof = 1;
- break;
- }
- mp_fd->pos += r;
- break;
- }
-
- mp_fd->got_cmd = 0;
-
- while(1) {
- int l = 0;
- // Find the cmd end
- mp_fd->buffer[mp_fd->pos] = '\0';
- end = strchr(mp_fd->buffer,'\r');
- if (end) *end = '\n';
- end = strchr(mp_fd->buffer,'\n');
- // No cmd end ?
- if(!end) {
- // If buffer is full we must drop all until the next \n
- if(mp_fd->size - mp_fd->pos <= 1) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Command buffer of file descriptor %d is full: dropping content.\n",mp_fd->fd);
- mp_fd->pos = 0;
- mp_fd->drop = 1;
- }
- break;
+ char *end;
+ *ret = NULL;
+
+ // Allocate the buffer if it doesn't exist
+ if (!mp_fd->buffer) {
+ mp_fd->buffer = talloc_size(NULL, MP_CMD_MAX_SIZE);
+ mp_fd->pos = 0;
+ mp_fd->size = MP_CMD_MAX_SIZE;
}
- // We already have a cmd : set the got_cmd flag
- else if((*ret)) {
- mp_fd->got_cmd = 1;
- break;
+
+ // Get some data if needed/possible
+ while (!mp_fd->got_cmd && !mp_fd->eof && (mp_fd->size - mp_fd->pos > 1)) {
+ int r = mp_fd->read_func.cmd(mp_fd->fd, mp_fd->buffer + mp_fd->pos,
+ mp_fd->size - 1 - mp_fd->pos);
+ // Error ?
+ if (r < 0) {
+ switch (r) {
+ case MP_INPUT_ERROR:
+ case MP_INPUT_DEAD:
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Error while reading "
+ "command file descriptor %d: %s\n",
+ mp_fd->fd, strerror(errno));
+ case MP_INPUT_NOTHING:
+ return r;
+ case MP_INPUT_RETRY:
+ continue;
+ }
+ // EOF ?
+ } else if (r == 0) {
+ mp_fd->eof = 1;
+ break;
+ }
+ mp_fd->pos += r;
+ break;
}
- l = end - mp_fd->buffer;
+ mp_fd->got_cmd = 0;
+
+ while (1) {
+ int l = 0;
+ // Find the cmd end
+ mp_fd->buffer[mp_fd->pos] = '\0';
+ end = strchr(mp_fd->buffer, '\r');
+ if (end)
+ *end = '\n';
+ end = strchr(mp_fd->buffer, '\n');
+ // No cmd end ?
+ if (!end) {
+ // If buffer is full we must drop all until the next \n
+ if (mp_fd->size - mp_fd->pos <= 1) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Command buffer of file "
+ "descriptor %d is full: dropping content.\n",
+ mp_fd->fd);
+ mp_fd->pos = 0;
+ mp_fd->drop = 1;
+ }
+ break;
+ }
+ // We already have a cmd : set the got_cmd flag
+ else if ((*ret)) {
+ mp_fd->got_cmd = 1;
+ break;
+ }
- // Not dropping : put the cmd in ret
- if (!mp_fd->drop)
- *ret = talloc_strndup(NULL, mp_fd->buffer, l);
- else
- mp_fd->drop = 0;
- mp_fd->pos -= l+1;
- memmove(mp_fd->buffer, end+1, mp_fd->pos);
- }
+ l = end - mp_fd->buffer;
- if(*ret)
- return 1;
- else
- return MP_INPUT_NOTHING;
+ // Not dropping : put the cmd in ret
+ if (!mp_fd->drop)
+ *ret = talloc_strndup(NULL, mp_fd->buffer, l);
+ else
+ mp_fd->drop = 0;
+ mp_fd->pos -= l + 1;
+ memmove(mp_fd->buffer, end + 1, mp_fd->pos);
+ }
+
+ if (*ret)
+ return 1;
+ else
+ return MP_INPUT_NOTHING;
}
-static int default_cmd_func(int fd,char* buf, int l)
+static int default_cmd_func(int fd, char *buf, int l)
{
- while(1) {
- int r = read(fd,buf,l);
- // Error ?
- if(r < 0) {
- if(errno == EINTR)
- continue;
- else if(errno == EAGAIN)
- return MP_INPUT_NOTHING;
- return MP_INPUT_ERROR;
- // EOF ?
+ while (1) {
+ int r = read(fd, buf, l);
+ // Error ?
+ if (r < 0) {
+ if (errno == EINTR)
+ continue;
+ else if (errno == EAGAIN)
+ return MP_INPUT_NOTHING;
+ return MP_INPUT_ERROR;
+ // EOF ?
+ }
+ return r;
}
- return r;
- }
-
}
-void
-mp_input_add_cmd_filter(mp_input_cmd_filter func, void* ctx) {
+void mp_input_add_cmd_filter(mp_input_cmd_filter func, void *ctx)
+{
mp_cmd_filter_t *filter = talloc_ptrtype(NULL, filter);
- filter->filter = func;
- filter->ctx = ctx;
- filter->next = cmd_filters;
- cmd_filters = filter;
+ filter->filter = func;
+ filter->ctx = ctx;
+ filter->next = cmd_filters;
+ cmd_filters = filter;
}
-static char *find_bind_for_key(const mp_cmd_bind_t* binds, int n,int* keys)
+static char *find_bind_for_key(const mp_cmd_bind_t *binds, int n, int *keys)
{
- int j;
-
- if (n <= 0) return NULL;
- for(j = 0; binds[j].cmd != NULL; j++) {
- int found = 1,s;
- for(s = 0; s < n && binds[j].input[s] != 0; s++) {
- if(binds[j].input[s] != keys[s]) {
- found = 0;
- break;
- }
- }
- if(found && binds[j].input[s] == 0 && s == n)
- break;
- }
- return binds[j].cmd;
+ int j;
+
+ if (n <= 0)
+ return NULL;
+ for (j = 0; binds[j].cmd != NULL; j++) {
+ int found = 1, s;
+ for (s = 0; s < n && binds[j].input[s] != 0; s++) {
+ if (binds[j].input[s] != keys[s]) {
+ found = 0;
+ break;
+ }
+ }
+ if (found && binds[j].input[s] == 0 && s == n)
+ break;
+ }
+ return binds[j].cmd;
}
static mp_cmd_bind_section_t *get_bind_section(struct input_ctx *ictx,
char *section)
{
- mp_cmd_bind_section_t *bind_section = ictx->cmd_bind_sections;
-
- if (section==NULL) section="default";
- while (bind_section) {
- if(strcmp(section,bind_section->section)==0) return bind_section;
- if(bind_section->next==NULL) break;
- bind_section=bind_section->next;
- }
- if(bind_section) {
- bind_section->next = talloc_ptrtype(ictx, bind_section->next);
- bind_section=bind_section->next;
- } else {
- ictx->cmd_bind_sections = talloc_ptrtype(ictx, ictx->cmd_bind_sections);
- bind_section = ictx->cmd_bind_sections;
- }
- bind_section->cmd_binds=NULL;
- bind_section->section = talloc_strdup(bind_section, section);
- bind_section->next=NULL;
- return bind_section;
+ mp_cmd_bind_section_t *bind_section = ictx->cmd_bind_sections;
+
+ if (section == NULL)
+ section = "default";
+ while (bind_section) {
+ if (strcmp(section, bind_section->section) == 0)
+ return bind_section;
+ if (bind_section->next == NULL)
+ break;
+ bind_section = bind_section->next;
+ }
+ if (bind_section) {
+ bind_section->next = talloc_ptrtype(ictx, bind_section->next);
+ bind_section = bind_section->next;
+ } else {
+ ictx->cmd_bind_sections = talloc_ptrtype(ictx, ictx->cmd_bind_sections);
+ bind_section = ictx->cmd_bind_sections;
+ }
+ bind_section->cmd_binds = NULL;
+ bind_section->section = talloc_strdup(bind_section, section);
+ bind_section->next = NULL;
+ return bind_section;
}
static mp_cmd_t *get_cmd_from_keys(struct input_ctx *ictx, int n, int *keys)
{
- char* cmd = NULL;
- mp_cmd_t* ret;
-
- if (ictx->cmd_binds)
- cmd = find_bind_for_key(ictx->cmd_binds, n, keys);
- if (ictx->cmd_binds_default && cmd == NULL)
- cmd = find_bind_for_key(ictx->cmd_binds_default, n, keys);
- if (ictx->default_bindings && cmd == NULL)
- cmd = find_bind_for_key(def_cmd_binds,n,keys);
-
- if(cmd == NULL) {
- char *key_buf = get_key_name(keys[0]);
- mp_tmsg(MSGT_INPUT,MSGL_WARN,"No bind found for key '%s'.", key_buf);
- talloc_free(key_buf);
- if(n > 1) {
- int s;
- for(s=1; s < n; s++) {
- key_buf = get_key_name(keys[s]);
- mp_msg(MSGT_INPUT,MSGL_WARN,"-%s", key_buf);
- talloc_free(key_buf);
- }
+ char *cmd = NULL;
+ mp_cmd_t *ret;
+
+ if (ictx->cmd_binds)
+ cmd = find_bind_for_key(ictx->cmd_binds, n, keys);
+ if (ictx->cmd_binds_default && cmd == NULL)
+ cmd = find_bind_for_key(ictx->cmd_binds_default, n, keys);
+ if (ictx->default_bindings && cmd == NULL)
+ cmd = find_bind_for_key(def_cmd_binds, n, keys);
+
+ if (cmd == NULL) {
+ char *key_buf = get_key_name(keys[0]);
+ mp_tmsg(MSGT_INPUT, MSGL_WARN, "No bind found for key '%s'.", key_buf);
+ talloc_free(key_buf);
+ if (n > 1) {
+ for (int s = 1; s < n; s++) {
+ key_buf = get_key_name(keys[s]);
+ mp_msg(MSGT_INPUT, MSGL_WARN, "-%s", key_buf);
+ talloc_free(key_buf);
+ }
+ }
+ mp_msg(MSGT_INPUT, MSGL_WARN, " \n");
+ return NULL;
}
- mp_msg(MSGT_INPUT,MSGL_WARN," \n");
- return NULL;
- }
- if (strcmp(cmd, "ignore") == 0) return NULL;
- ret = mp_input_parse_cmd(cmd);
- if(!ret) {
- char *key_buf = get_key_name(ictx->key_down[0]);
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Invalid command for bound key %s", key_buf);
- talloc_free(key_buf);
- if (ictx->num_key_down > 1) {
- unsigned int s;
- for(s=1; s < ictx->num_key_down; s++) {
- char *key_buf = get_key_name(ictx->key_down[s]);
- mp_msg(MSGT_INPUT,MSGL_ERR,"-%s", key_buf);
- talloc_free(key_buf);
- }
+ if (strcmp(cmd, "ignore") == 0)
+ return NULL;
+ ret = mp_input_parse_cmd(cmd);
+ if (!ret) {
+ char *key_buf = get_key_name(ictx->key_down[0]);
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Invalid command for bound key %s",
+ key_buf);
+ talloc_free(key_buf);
+ if (ictx->num_key_down > 1) {
+ unsigned int s;
+ for (s = 1; s < ictx->num_key_down; s++) {
+ char *key_buf = get_key_name(ictx->key_down[s]);
+ mp_msg(MSGT_INPUT, MSGL_ERR, "-%s", key_buf);
+ talloc_free(key_buf);
+ }
+ }
+ mp_msg(MSGT_INPUT, MSGL_ERR, " : %s \n", cmd);
}
- mp_msg(MSGT_INPUT,MSGL_ERR," : %s \n",cmd);
- }
- return ret;
+ return ret;
}
-static mp_cmd_t* interpret_key(struct input_ctx *ictx, int code)
+static mp_cmd_t *interpret_key(struct input_ctx *ictx, int code)
{
- unsigned int j;
- mp_cmd_t* ret;
+ unsigned int j;
+ mp_cmd_t *ret;
/* On normal keyboards shift changes the character code of non-special
* keys, so don't count the modifier separately for those. In other words
@@ -1124,57 +1152,57 @@ static mp_cmd_t* interpret_key(struct input_ctx *ictx, int code)
if (unmod < 256 && unmod != KEY_ENTER && unmod != KEY_TAB)
code &= ~KEY_MODIFIER_SHIFT;
- if(mp_input_key_cb) {
- if (code & MP_KEY_DOWN)
- return NULL;
- code &= ~(MP_KEY_DOWN|MP_NO_REPEAT_KEY);
- if (mp_input_key_cb(code))
- return NULL;
- }
-
- if(code & MP_KEY_DOWN) {
- if (ictx->num_key_down > MP_MAX_KEY_DOWN) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Too many key down events at the same time\n");
- return NULL;
- }
- code &= ~MP_KEY_DOWN;
- // Check if we don't already have this key as pushed
- for (j = 0; j < ictx->num_key_down; j++) {
- if (ictx->key_down[j] == code)
- break;
- }
- if (j != ictx->num_key_down)
- return NULL;
- ictx->key_down[ictx->num_key_down] = code;
- ictx->num_key_down++;
- ictx->last_key_down = GetTimer();
- ictx->ar_state = 0;
- return NULL;
+ if (mp_input_key_cb) {
+ if (code & MP_KEY_DOWN)
+ return NULL;
+ code &= ~(MP_KEY_DOWN | MP_NO_REPEAT_KEY);
+ if (mp_input_key_cb(code))
+ return NULL;
}
- // key released
- // Check if the key is in the down key, driver which can't send push event
- // send only release event
+
+ if (code & MP_KEY_DOWN) {
+ if (ictx->num_key_down > MP_MAX_KEY_DOWN) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Too many key down events "
+ "at the same time\n");
+ return NULL;
+ }
+ code &= ~MP_KEY_DOWN;
+ // Check if we don't already have this key as pushed
+ for (j = 0; j < ictx->num_key_down; j++) {
+ if (ictx->key_down[j] == code)
+ break;
+ }
+ if (j != ictx->num_key_down)
+ return NULL;
+ ictx->key_down[ictx->num_key_down] = code;
+ ictx->num_key_down++;
+ ictx->last_key_down = GetTimer();
+ ictx->ar_state = 0;
+ return NULL;
+ }
+ // button released or press of key with no separate down/up events
for (j = 0; j < ictx->num_key_down; j++) {
- if (ictx->key_down[j] == code)
- break;
+ if (ictx->key_down[j] == code)
+ break;
}
- if (j == ictx->num_key_down) { // key was not in the down keys : add it
- if (ictx->num_key_down > MP_MAX_KEY_DOWN) {
- mp_tmsg(MSGT_INPUT,MSGL_ERR,"Too many key down events at the same time\n");
- return NULL;
- }
- ictx->key_down[ictx->num_key_down] = code;
- ictx->num_key_down++;
- ictx->last_key_down = 1;
+ if (j == ictx->num_key_down) { // was not already down; add temporarily
+ if (ictx->num_key_down > MP_MAX_KEY_DOWN) {
+ mp_tmsg(MSGT_INPUT, MSGL_ERR, "Too many key down events "
+ "at the same time\n");
+ return NULL;
+ }
+ ictx->key_down[ictx->num_key_down] = code;
+ ictx->num_key_down++;
+ ictx->last_key_down = 1;
}
- // We ignore key from last combination
+ // Interpret only maximal point of multibutton event
ret = ictx->last_key_down ?
- get_cmd