summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUoti Urpala <uau@symbol.nonexistent.invalid>2008-04-30 11:06:55 +0300
committerUoti Urpala <uau@symbol.nonexistent.invalid>2008-04-30 14:46:17 +0300
commitbfcb3a7a8130be478103beb1923567f5e5d86c67 (patch)
treee8a376f6cebf586fff714f1b49b83c0e695b0cdb
parent32e52b8fd0b917a40a9192770cc1a41aa31b34d0 (diff)
downloadmpv-bfcb3a7a8130be478103beb1923567f5e5d86c67.tar.bz2
mpv-bfcb3a7a8130be478103beb1923567f5e5d86c67.tar.xz
input: Move key filedescriptor list to context struct
The context variable is now passed to VOs too as it's now needed to add a callback on the X filedescriptor.
-rw-r--r--input/input.c54
-rw-r--r--input/input.h8
-rw-r--r--libvo/video_out.c14
-rw-r--r--libvo/video_out.h4
-rw-r--r--libvo/vo_xv.c6
-rw-r--r--mplayer.c6
6 files changed, 53 insertions, 39 deletions
diff --git a/input/input.c b/input/input.c
index e467217b9c..250fc55498 100644
--- a/input/input.c
+++ b/input/input.c
@@ -565,6 +565,9 @@ struct input_ctx {
// The command binds of current section
mp_cmd_bind_t *cmd_binds;
mp_cmd_bind_t *cmd_binds_default;
+
+ mp_input_fd_t key_fds[MP_MAX_KEY_FD];
+ unsigned int num_key_fd;
};
@@ -575,8 +578,6 @@ int (*mp_input_key_cb)(int code) = NULL;
int async_quit_request;
-static mp_input_fd_t key_fds[MP_MAX_KEY_FD];
-static unsigned int num_key_fd = 0;
static mp_input_fd_t cmd_fds[MP_MAX_CMD_FD];
static unsigned int num_cmd_fd = 0;
static mp_cmd_t* cmd_queue[CMD_QUEUE_SIZE];
@@ -669,29 +670,31 @@ mp_input_rm_cmd_fd(int fd) {
num_cmd_fd--;
}
-void
-mp_input_rm_key_fd(int 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 < num_key_fd; i++) {
+ for (i = 0; i < ictx->num_key_fd; i++) {
if(key_fds[i].fd == fd)
break;
}
- if(i == num_key_fd)
+ 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 < num_key_fd)
- memmove(&key_fds[i],&key_fds[i+1],(num_key_fd - i - 1)*sizeof(mp_input_fd_t));
- num_key_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(int fd, int select, mp_key_func_t read_func,
- mp_close_func_t close_func, void *ctx)
+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(num_key_fd == MP_MAX_KEY_FD) {
+ if (ictx->num_key_fd == MP_MAX_KEY_FD) {
mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrCantRegister2ManyKeyFds,fd);
return 0;
}
@@ -700,14 +703,14 @@ mp_input_add_key_fd(int fd, int select, mp_key_func_t read_func,
return 0;
}
- key_fds[num_key_fd] = (struct mp_input_fd){
+ 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,
};
- num_key_fd++;
+ ictx->num_key_fd++;
return 1;
}
@@ -1165,9 +1168,10 @@ static mp_cmd_t *read_events(struct input_ctx *ictx, int time, int paused)
{
int i;
int got_cmd = 0;
- for (i = 0; i < num_key_fd; i++)
+ struct mp_input_fd *key_fds = ictx->key_fds;
+ for (i = 0; i < ictx->num_key_fd; i++)
if (key_fds[i].dead) {
- mp_input_rm_key_fd(key_fds[i].fd);
+ mp_input_rm_key_fd(ictx, key_fds[i].fd);
i--;
}
for (i = 0; i < num_cmd_fd; i++)
@@ -1182,7 +1186,7 @@ static mp_cmd_t *read_events(struct input_ctx *ictx, int time, int paused)
FD_ZERO(&fds);
if (!got_cmd) {
int max_fd = 0, num_fd = 0;
- for (i = 0; i < num_key_fd; i++) {
+ for (i = 0; i < ictx->num_key_fd; i++) {
if (key_fds[i].no_select)
continue;
if (key_fds[i].fd > max_fd)
@@ -1221,7 +1225,7 @@ static mp_cmd_t *read_events(struct input_ctx *ictx, int time, int paused)
#endif
- for (i = 0; i < num_key_fd; i++) {
+ for (i = 0; i < ictx->num_key_fd; i++) {
#ifdef HAVE_POSIX_SELECT
if (!key_fds[i].no_select && !FD_ISSET(key_fds[i].fd, &fds))
continue;
@@ -1720,7 +1724,8 @@ struct input_ctx *mp_input_init(int use_gui)
if(fd < 0)
mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrCantInitJoystick);
else
- mp_input_add_key_fd(fd,1,mp_input_joystick_read,(mp_close_func_t)close,NULL);
+ mp_input_add_key_fd(ictx, fd, 1, mp_input_joystick_read,
+ (mp_close_func_t)close,NULL);
}
#endif
@@ -1745,7 +1750,8 @@ struct input_ctx *mp_input_init(int use_gui)
if(mp_input_ar_init() < 0)
mp_msg(MSGT_INPUT,MSGL_ERR,MSGTR_INPUT_INPUT_ErrCantInitAppleRemote);
else
- mp_input_add_key_fd(-1,0,mp_input_ar_read,mp_input_ar_close, NULL);
+ mp_input_add_key_fd(ictx, -1, 0, mp_input_ar_read, mp_input_ar_close,
+ NULL);
}
#endif
@@ -1771,9 +1777,9 @@ void mp_input_uninit(struct input_ctx *ictx)
unsigned int i;
- for(i=0; i < num_key_fd; i++) {
- if(key_fds[i].close_func)
- key_fds[i].close_func(key_fds[i].fd);
+ for (i=0; i < ictx->num_key_fd; i++) {
+ if (ictx->key_fds[i].close_func)
+ ictx->key_fds[i].close_func(ictx->key_fds[i].fd);
}
for(i=0; i < num_cmd_fd; i++) {
diff --git a/input/input.h b/input/input.h
index 6833051340..2e0a198bef 100644
--- a/input/input.h
+++ b/input/input.h
@@ -225,12 +225,12 @@ mp_input_rm_cmd_fd(int fd);
// The args are the same as for the key's drivers. If you don't use any valid fd you MUST
// give a read_func.
-int
-mp_input_add_key_fd(int fd, int select, mp_key_func_t read_func, mp_close_func_t close_func, void *ctx);
+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);
// As for the cmd one you usually don't need this function.
-void
-mp_input_rm_key_fd(int fd);
+void mp_input_rm_key_fd(struct input_ctx *ictx, int fd);
/// Get input key from its name.
int mp_input_get_key_from_name(const char *name);
diff --git a/libvo/video_out.c b/libvo/video_out.c
index 78f1f71743..42354c5f34 100644
--- a/libvo/video_out.c
+++ b/libvo/video_out.c
@@ -294,11 +294,18 @@ void list_video_out(void)
}
struct vo *init_best_video_out(struct MPOpts *opts, struct vo_x11_state *x11,
- struct mp_fifo *key_fifo)
+ struct mp_fifo *key_fifo,
+ struct input_ctx *input_ctx)
{
char **vo_list = opts->video_driver_list;
int i;
struct vo *vo = talloc_ptrtype(NULL, vo);
+ struct vo initial_values = {
+ .opts = opts,
+ .x11 = x11,
+ .key_fifo = key_fifo,
+ .input_ctx = input_ctx,
+ };
// first try the preferred drivers, with their optional subdevice param:
if (vo_list && vo_list[0])
while (vo_list[0][0]) {
@@ -317,8 +324,7 @@ struct vo *init_best_video_out(struct MPOpts *opts, struct vo_x11_state *x11,
const vo_info_t *info = video_driver->info;
if (!strcmp(info->short_name, name)) {
// name matches, try it
- *vo = (struct vo){.opts = opts, .x11 = x11,
- .key_fifo = key_fifo};
+ *vo = initial_values;
vo->driver = video_driver;
if (!vo_preinit(vo, vo_subdevice)) {
free(name);
@@ -336,7 +342,7 @@ struct vo *init_best_video_out(struct MPOpts *opts, struct vo_x11_state *x11,
vo_subdevice = NULL;
for (i = 0; video_out_drivers[i]; i++) {
const struct vo_driver *video_driver = video_out_drivers[i];
- *vo = (struct vo){.opts = opts, .x11 = x11, key_fifo = key_fifo};
+ *vo = initial_values;
vo->driver = video_driver;
if (!vo_preinit(vo, vo_subdevice))
return vo; // success!
diff --git a/libvo/video_out.h b/libvo/video_out.h
index a62a9b335b..4e9f3abeae 100644
--- a/libvo/video_out.h
+++ b/libvo/video_out.h
@@ -214,6 +214,7 @@ struct vo {
struct MPOpts *opts;
struct vo_x11_state *x11;
struct mp_fifo *key_fifo;
+ struct input_ctx *input_ctx;
// requested position/resolution
int dx;
@@ -223,7 +224,8 @@ struct vo {
};
struct vo *init_best_video_out(struct MPOpts *opts, struct vo_x11_state *x11,
- struct mp_fifo *key_fifo);
+ struct mp_fifo *key_fifo,
+ struct input_ctx *input_ctx);
int vo_config(struct vo *vo, uint32_t width, uint32_t height,
uint32_t d_width, uint32_t d_height, uint32_t flags,
char *title, uint32_t format);
diff --git a/libvo/vo_xv.c b/libvo/vo_xv.c
index 29374ed0e6..01313a30bd 100644
--- a/libvo/vo_xv.c
+++ b/libvo/vo_xv.c
@@ -711,7 +711,7 @@ static void uninit(struct vo *vo)
vo_vm_close(vo);
#endif
if (ctx->event_fd_registered)
- mp_input_rm_key_fd(ConnectionNumber(vo->x11->display));
+ mp_input_rm_key_fd(vo->input_ctx, ConnectionNumber(vo->x11->display));
// uninit() shouldn't get called unless initialization went past vo_init()
vo_x11_uninit(vo);
}
@@ -844,8 +844,8 @@ static int preinit(struct vo *vo, const char *arg)
ctx->fo = XvListImageFormats(x11->display, x11->xv_port, (int *) &ctx->formats);
- mp_input_add_key_fd(ConnectionNumber(x11->display), 1, x11_fd_callback,
- NULL, vo);
+ mp_input_add_key_fd(vo->input_ctx, ConnectionNumber(x11->display), 1,
+ x11_fd_callback, NULL, vo);
ctx->event_fd_registered = 1;
return 0;
diff --git a/mplayer.c b/mplayer.c
index ba8b4485da..7b64936b6a 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2141,7 +2141,7 @@ int reinit_video_chain(struct MPContext *mpctx)
//shouldn't we set dvideo->id=-2 when we fail?
//if((mpctx->video_out->preinit(vo_subdevice))!=0){
- if(!(mpctx->video_out=init_best_video_out(opts, mpctx->x11_state, mpctx->key_fifo))){
+ if(!(mpctx->video_out=init_best_video_out(opts, mpctx->x11_state, mpctx->key_fifo, mpctx->input))){
mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_ErrorInitializingVODevice);
goto err_out;
}
@@ -2873,11 +2873,11 @@ if(!codecs_file || !parse_codec_cfg(codecs_file)){
// Init input system
current_module = "init_input";
mpctx->input = mp_input_init(use_gui);
- mp_input_add_key_fd(-1,0,mplayer_get_key,NULL, mpctx->key_fifo);
+ mp_input_add_key_fd(mpctx->input, -1,0,mplayer_get_key,NULL, mpctx->key_fifo);
if(slave_mode)
mp_input_add_cmd_fd(0,USE_SELECT,MP_INPUT_SLAVE_CMD_FUNC,NULL);
else if(!noconsolecontrols)
- mp_input_add_key_fd(0, 1, read_keys, NULL, mpctx->key_fifo);
+ mp_input_add_key_fd(mpctx->input, 0, 1, read_keys, NULL, mpctx->key_fifo);
// Set the libstream interrupt callback
stream_set_interrupt_callback(mp_input_check_interrupt, mpctx->input);