+void EventThreadMouseHide( event_thread_t *p_event )
+{
+ PostMessage( p_event->hwnd, WM_VLC_HIDE_MOUSE, 0, 0 );
+}
+
+void EventThreadUpdateTitle( event_thread_t *p_event, const char *psz_fallback )
+{
+ char *psz_title = var_InheritString( p_event->vd, "video-title" );
+ if( !psz_title )
+ psz_title = strdup( psz_fallback );
+ if( !psz_title )
+ return;
+
+ vlc_mutex_lock( &p_event->lock );
+ free( p_event->psz_title );
+ p_event->psz_title = psz_title;
+ vlc_mutex_unlock( &p_event->lock );
+
+ PostMessage( p_event->hwnd, WM_VLC_CHANGE_TEXT, 0, 0 );
+}
+int EventThreadGetWindowStyle( event_thread_t *p_event )
+{
+ /* No need to lock, it is serialized by EventThreadStart */
+ return p_event->i_window_style;
+}
+
+void EventThreadUpdateWindowPosition( event_thread_t *p_event,
+ bool *pb_moved, bool *pb_resized,
+ int x, int y, unsigned w, unsigned h )
+{
+ vlc_mutex_lock( &p_event->lock );
+ *pb_moved = x != p_event->wnd_cfg.x ||
+ y != p_event->wnd_cfg.y;
+ *pb_resized = w != p_event->wnd_cfg.width ||
+ h != p_event->wnd_cfg.height;
+
+ p_event->wnd_cfg.x = x;
+ p_event->wnd_cfg.y = y;
+ p_event->wnd_cfg.width = w;
+ p_event->wnd_cfg.height = h;
+ vlc_mutex_unlock( &p_event->lock );
+}
+
+void EventThreadUpdateSourceAndPlace( event_thread_t *p_event,
+ const video_format_t *p_source,
+ const vout_display_place_t *p_place )
+{
+ vlc_mutex_lock( &p_event->lock );
+ p_event->source = *p_source;
+ p_event->place = *p_place;
+ vlc_mutex_unlock( &p_event->lock );
+}
+
+void EventThreadUseOverlay( event_thread_t *p_event, bool b_used )
+{
+ vlc_mutex_lock( &p_event->lock );
+ p_event->use_overlay = b_used;
+ vlc_mutex_unlock( &p_event->lock );
+}
+bool EventThreadGetAndResetHasMoved( event_thread_t *p_event )
+{
+ vlc_mutex_lock( &p_event->lock );
+ const bool has_moved = p_event->has_moved;
+ p_event->has_moved = false;
+ vlc_mutex_unlock( &p_event->lock );
+
+ return has_moved;
+}
+
+event_thread_t *EventThreadCreate( vout_display_t *vd)