summaryrefslogtreecommitdiffstats
path: root/video/out/vo.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-11-02 20:26:51 +0100
committerwm4 <wm4@nowhere>2014-11-02 20:53:56 +0100
commit4e2574f025b9f143140008cbed48f6ee9705f813 (patch)
tree0d3f18fa705a31cb278819324cb4e54533a704a6 /video/out/vo.c
parent61b06f3756596d0e858db25f5293920eff29333c (diff)
downloadmpv-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.c26
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