+/**
+ * Install/remove all callbacks needed for proper event handling inside
+ * a vout-filter.
+ */
+static inline void vout_filter_SetupChild( vout_thread_t *p_parent, vout_thread_t *p_child,
+ vlc_callback_t pf_mouse_event,
+ vlc_callback_t pf_fullscreen_up,
+ vlc_callback_t pf_fullscreen_down,
+ bool b_init )
+{
+ int (*pf_execute)( vlc_object_t *, const char *, vlc_callback_t, void * );
+
+ if( b_init )
+ pf_execute = __var_AddCallback;
+ else
+ pf_execute = __var_DelCallback;
+
+ /* */
+ if( !pf_mouse_event )
+ pf_mouse_event = ForwardEvent;
+ pf_execute( VLC_OBJECT(p_child), "mouse-x", pf_mouse_event, p_parent );
+ pf_execute( VLC_OBJECT(p_child), "mouse-y", pf_mouse_event, p_parent );
+ pf_execute( VLC_OBJECT(p_child), "mouse-moved", pf_mouse_event, p_parent );
+ pf_execute( VLC_OBJECT(p_child), "mouse-clicked", pf_mouse_event, p_parent );
+ pf_execute( VLC_OBJECT(p_child), "mouse-button-down", pf_mouse_event, p_parent );
+
+ /* */
+ pf_execute( VLC_OBJECT(p_parent), "autoscale", ForwardEvent, p_child );
+ pf_execute( VLC_OBJECT(p_parent), "scale", ForwardEvent, p_child );
+ pf_execute( VLC_OBJECT(p_parent), "aspect-ratio", ForwardEvent, p_child );
+ pf_execute( VLC_OBJECT(p_parent), "crop", ForwardEvent, p_child );
+
+ /* */
+ if( !pf_fullscreen_up )
+ pf_fullscreen_up = ForwardFullscreen;
+ if( !pf_fullscreen_down )
+ pf_fullscreen_down = ForwardFullscreen;
+ pf_execute( VLC_OBJECT(p_child), "fullscreen", pf_fullscreen_up, p_parent );
+ pf_execute( VLC_OBJECT(p_parent), "fullscreen", pf_fullscreen_down, p_child );
+}
+
+#define vout_filter_AddChild( a, b, c ) vout_filter_SetupChild( a, b, c, NULL, NULL, true )
+#define vout_filter_DelChild( a, b, c ) vout_filter_SetupChild( a, b, c, NULL, NULL, false )