diff options
author | wm4 <wm4@nowhere> | 2014-11-02 20:26:51 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-11-02 20:53:56 +0100 |
commit | 4e2574f025b9f143140008cbed48f6ee9705f813 (patch) | |
tree | 0d3f18fa705a31cb278819324cb4e54533a704a6 /video/out/vo.c | |
parent | 61b06f3756596d0e858db25f5293920eff29333c (diff) | |
download | mpv-4e2574f025b9f143140008cbed48f6ee9705f813.tar.bz2 mpv-4e2574f025b9f143140008cbed48f6ee9705f813.tar.xz |
command: make window-scale property observable
Add a generic mechanism to the VO to relay "extra" events from VO to
player. Use it to notify the core of window resizes, which in turn will
be used to mark all affected properties ("window-scale" in this case) as
changed.
(I refrained from hacking this as internal command into input_ctx, or to
poll the state change, etc. - but in the end, maybe it would be best to
actually pass the client API context directly to the places where events
can happen.)
Diffstat (limited to 'video/out/vo.c')
-rw-r--r-- | video/out/vo.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/video/out/vo.c b/video/out/vo.c index 9f6021282f..f697002f92 100644 --- a/video/out/vo.c +++ b/video/out/vo.c @@ -129,6 +129,7 @@ struct vo_internal { bool request_redraw; // redraw request from player to VO bool want_redraw; // redraw request from VO to player bool paused; + int queued_events; int64_t flip_queue_offset; // queue flip events at most this much in advance @@ -838,6 +839,31 @@ int64_t vo_get_vsync_interval(struct vo *vo) return vo->in->vsync_interval; } +// Set specific event flags, and wakeup the playback core if needed. +// vo_query_events() can retrieve the events again. +void vo_event(struct vo *vo, int event) +{ + struct vo_internal *in = vo->in; + pthread_mutex_lock(&in->lock); + if ((in->queued_events & event & VO_EVENTS_USER) != (event & VO_EVENTS_USER)) + mp_input_wakeup(vo->input_ctx); + in->queued_events |= event; + pthread_mutex_unlock(&in->lock); +} + +// Check event flags set with vo_event(). Return the mask of events that was +// set and included in the events parameter. If clear==true, clear these events. +int vo_query_events(struct vo *vo, int events, bool clear) +{ + struct vo_internal *in = vo->in; + pthread_mutex_lock(&in->lock); + int r = in->queued_events & events; + if (clear) + in->queued_events &= ~(unsigned)r; + pthread_mutex_unlock(&in->lock); + return r; +} + /** * \brief lookup an integer in a table, table must have 0 as the last key * \param key key to search for |