vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun May 14 22:26:05 2017 +0300| [545f5b8a28085490ccfda75bb304d02daee55ed1] | committer: Rémi Denis-Courmont
addons: simplify events handling Use fixed owner structure instead of deprecated VLC events. Notes: - Outstanding memory leaks are not fixed. - Reference counting in MacOS UI is not obvious if it exists (??). > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=545f5b8a28085490ccfda75bb304d02daee55ed1 --- include/vlc_addons.h | 17 +++++++-- include/vlc_events.h | 11 ------ modules/gui/macosx/VLCAddonsWindowController.m | 47 +++++++++++++++-------- modules/gui/qt/managers/addons_manager.cpp | 52 ++++++++++++++------------ modules/gui/qt/managers/addons_manager.hpp | 4 +- src/misc/addons.c | 44 ++++------------------ 6 files changed, 84 insertions(+), 91 deletions(-) diff --git a/include/vlc_addons.h b/include/vlc_addons.h index 92d5bc6e12..23cb134968 100644 --- a/include/vlc_addons.h +++ b/include/vlc_addons.h @@ -129,14 +129,22 @@ struct addons_storage_t addons_storage_sys_t *p_sys; }; +typedef struct addons_manager_t addons_manager_t; + +struct addons_manager_owner +{ + void *sys; + void (*addon_found)(struct addons_manager_t *, struct addon_entry_t *); + void (*discovery_ended)(struct addons_manager_t *); + void (*addon_changed)(struct addons_manager_t *, struct addon_entry_t *); +}; + typedef struct addons_manager_private_t addons_manager_private_t; struct addons_manager_t { - vlc_event_manager_t * p_event_manager; - + struct addons_manager_owner owner; addons_manager_private_t *p_priv; }; -typedef struct addons_manager_t addons_manager_t; /** * addon entry lifecycle @@ -148,7 +156,8 @@ VLC_API void addon_entry_Release(addon_entry_t *); /** * addons manager lifecycle */ -VLC_API addons_manager_t *addons_manager_New( vlc_object_t * ); +VLC_API addons_manager_t *addons_manager_New( vlc_object_t *, + const struct addons_manager_owner * ); VLC_API void addons_manager_Delete( addons_manager_t * ); /** diff --git a/include/vlc_events.h b/include/vlc_events.h index 82245cbbd0..aef8301cdc 100644 --- a/include/vlc_events.h +++ b/include/vlc_events.h @@ -124,11 +124,6 @@ typedef enum vlc_event_type_t { /* Renderer Discovery events */ vlc_RendererDiscoveryItemAdded=vlc_InputItemPreparseEnded+6, vlc_RendererDiscoveryItemRemoved, - - /* Addons Manager events */ - vlc_AddonFound, - vlc_AddonsDiscoveryEnded, - vlc_AddonChanged } vlc_event_type_t; /* Event definition */ @@ -185,12 +180,6 @@ typedef struct vlc_event_t { vlc_renderer_item_t * p_item; } renderer_discovery_item_removed; - - /* Addons */ - struct vlc_addon_generic_event - { - addon_entry_t * p_entry; - } addon_generic_event; } u; } vlc_event_t; diff --git a/modules/gui/macosx/VLCAddonsWindowController.m b/modules/gui/macosx/VLCAddonsWindowController.m index a82e521ebf..b6b38ab045 100644 --- a/modules/gui/macosx/VLCAddonsWindowController.m +++ b/modules/gui/macosx/VLCAddonsWindowController.m @@ -20,7 +20,6 @@ *****************************************************************************/ #import <vlc_common.h> -#import <vlc_events.h> #import <vlc_addons.h> #import "VLCAddonsWindowController.h" @@ -42,17 +41,32 @@ @end -static void addonsEventsCallback( const vlc_event_t *event, void *data ) +static void addonFoundCallback( addons_manager_t *manager, + addon_entry_t *entry ) { - VLCAddonsWindowController *controller = (__bridge VLCAddonsWindowController *)data; + VLCAddonsWindowController *controller = (__bridge VLCAddonsWindowController *) manager->owner.sys; @autoreleasepool { - if (event->type == vlc_AddonFound) - [controller performSelectorOnMainThread:@selector(addAddon:) withObject:[NSValue valueWithPointer:event->u.addon_generic_event.p_entry] waitUntilDone:NO]; - else if (event->type == vlc_AddonsDiscoveryEnded) - [controller performSelectorOnMainThread:@selector(discoveryEnded) withObject:nil waitUntilDone:NO]; - else if (event->type == vlc_AddonChanged) - [controller performSelectorOnMainThread:@selector(addonChanged:) withObject:[NSValue valueWithPointer:event->u.addon_generic_event.p_entry] waitUntilDone:NO]; + [controller performSelectorOnMainThread:@selector(addAddon:) withObject:[NSValue valueWithPointer:entry] waitUntilDone:NO]; + } +} + +static void addonsDiscoveryEndedCallback( addons_manager_t *manager ) +{ + VLCAddonsWindowController *controller = (__bridge VLCAddonsWindowController *) manager->owner.sys; + + @autoreleasepool { + [controller performSelectorOnMainThread:@selector(discoveryEnded) withObject:nil waitUntilDone:NO]; + } +} + +static void addonsChangedCallback( addons_manager_t *manager, + addon_entry_t *entry ) +{ + VLCAddonsWindowController *controller = (__bridge VLCAddonsWindowController *) manager->owner.sys; + + @autoreleasepool { + [controller performSelectorOnMainThread:@selector(addonChanged:) withObject:[NSValue valueWithPointer:entry] waitUntilDone:NO]; } } @@ -117,15 +131,18 @@ static void addonsEventsCallback( const vlc_event_t *event, void *data ) [[[_addonsTable tableColumnWithIdentifier:@"author"] headerCell] setStringValue:_NS("Author")]; [[[_addonsTable tableColumnWithIdentifier:@"type"] headerCell] setStringValue:_NS("Type")]; - _manager = addons_manager_New((vlc_object_t *)getIntf()); + struct addons_manager_owner owner = + { + (__bridge void *)self, + addonFoundCallback, + addonsDiscoveryEndedCallback, + addonChangedCallback, + }; + + _manager = addons_manager_New((vlc_object_t *)getIntf(), &owner); if (!_manager) return; - vlc_event_manager_t *p_em = _manager->p_event_manager; - vlc_event_attach(p_em, vlc_AddonFound, addonsEventsCallback, (__bridge void *)self); - vlc_event_attach(p_em, vlc_AddonsDiscoveryEnded, addonsEventsCallback, (__bridge void *)self); - vlc_event_attach(p_em, vlc_AddonChanged, addonsEventsCallback, (__bridge void *)self); - [self _findInstalled]; } diff --git a/modules/gui/qt/managers/addons_manager.cpp b/modules/gui/qt/managers/addons_manager.cpp index 6309ca319d..d4fc655d16 100644 --- a/modules/gui/qt/managers/addons_manager.cpp +++ b/modules/gui/qt/managers/addons_manager.cpp @@ -30,13 +30,15 @@ const QEvent::Type AddonManagerEvent::DiscoveryEndedEvent = AddonsManager::AddonsManager( intf_thread_t *p_intf ) { - p_manager = addons_manager_New( VLC_OBJECT(p_intf) ); - if ( !p_manager ) return; + struct addons_manager_owner owner = + { + this, + addonFoundCallback, + addonsDiscoveryEndedCallback, + addonChangedCallback, + }; - vlc_event_manager_t *p_em = p_manager->p_event_manager; - vlc_event_attach( p_em, vlc_AddonFound, addonsEventsCallback, this ); - vlc_event_attach( p_em, vlc_AddonsDiscoveryEnded, addonsEventsCallback, this ); - vlc_event_attach( p_em, vlc_AddonChanged, addonsEventsCallback, this ); + p_manager = addons_manager_New( VLC_OBJECT(p_intf), &owner ); } AddonsManager::~AddonsManager() @@ -97,27 +99,29 @@ QString AddonsManager::getAddonType( int i_type ) } } -void AddonsManager::addonsEventsCallback( const vlc_event_t *event, void *data ) +void AddonsManager::addonFoundCallback( addons_manager_t *manager, + addon_entry_t *entry ) { - AddonsManager *me = ( AddonsManager * ) data; - QEvent *ev = NULL; + AddonsManager *me = (AddonsManager *) manager->owner.sys; + QEvent *ev = new AddonManagerEvent( AddonManagerEvent::AddedEvent, + entry ); + QApplication::postEvent( me, ev ); +} - if ( event->type == vlc_AddonFound ) - { - ev = new AddonManagerEvent( AddonManagerEvent::AddedEvent, - event->u.addon_generic_event.p_entry ); - } - else if ( event->type == vlc_AddonsDiscoveryEnded ) - { - ev = new QEvent( AddonManagerEvent::DiscoveryEndedEvent ); - } - else if ( event->type == vlc_AddonChanged ) - { - ev = new AddonManagerEvent( AddonManagerEvent::ChangedEvent, - event->u.addon_generic_event.p_entry ); - } +void AddonsManager::addonsDiscoveryEndedCallback( addons_manager_t *manager ) +{ + AddonsManager *me = (AddonsManager *) manager->owner.sys; + QEvent *ev = new QEvent( AddonManagerEvent::DiscoveryEndedEvent ); + QApplication::postEvent( me, ev ); +} - if ( ev ) QApplication::postEvent( me, ev ); +void AddonsManager::addonChangedCallback( addons_manager_t *manager, + addon_entry_t *entry ) +{ + AddonsManager *me = (AddonsManager *) manager->owner.sys; + QEvent *ev = new AddonManagerEvent( AddonManagerEvent::ChangedEvent, + entry ); + QApplication::postEvent( me, ev ); } void AddonsManager::customEvent( QEvent *event ) diff --git a/modules/gui/qt/managers/addons_manager.hpp b/modules/gui/qt/managers/addons_manager.hpp index 6a221fdc7d..9ef3c6e035 100644 --- a/modules/gui/qt/managers/addons_manager.hpp +++ b/modules/gui/qt/managers/addons_manager.hpp @@ -66,7 +66,9 @@ class AddonsManager : public QObject, public Singleton<AddonsManager> public: AddonsManager( intf_thread_t * ); virtual ~AddonsManager(); - static void addonsEventsCallback( const vlc_event_t *, void * ); + static void addonFoundCallback( addons_manager_t *, addon_entry_t * ); + static void addonsDiscoveryEndedCallback( addons_manager_t * ); + static void addonChangedCallback( addons_manager_t *, addon_entry_t * ); void customEvent( QEvent * ); void install( QByteArray id ); void remove( QByteArray id ); diff --git a/src/misc/addons.c b/src/misc/addons.c index c03505aecc..641ebd3b4a 100644 --- a/src/misc/addons.c +++ b/src/misc/addons.c @@ -26,7 +26,6 @@ #include <vlc_atomic.h> #include <vlc_modules.h> #include <vlc_arrays.h> -#include <vlc_events.h> #include "libvlc.h" #include <vlc_addons.h> @@ -124,7 +123,8 @@ void addon_entry_Release( addon_entry_t * p_entry ) free( owner ); } -addons_manager_t *addons_manager_New( vlc_object_t *p_this ) +addons_manager_t *addons_manager_New( vlc_object_t *p_this, + const struct addons_manager_owner *restrict owner ) { addons_manager_t *p_manager = malloc( sizeof(addons_manager_t) ); if ( !p_manager ) return NULL; @@ -136,14 +136,7 @@ addons_manager_t *addons_manager_New( vlc_object_t *p_this ) return NULL; } - p_manager->p_event_manager = malloc( sizeof(vlc_event_manager_t) ); - if ( !p_manager->p_event_manager ) - { - free( p_manager->p_priv ); - free( p_manager ); - return NULL; - } - + p_manager->owner = *owner; p_manager->p_priv->p_parent = p_this; #define INIT_QUEUE( name ) \ @@ -156,12 +149,6 @@ addons_manager_t *addons_manager_New( vlc_object_t *p_this ) INIT_QUEUE( installer ) ARRAY_INIT( p_manager->p_priv->finder.uris ); - vlc_event_manager_t *em = p_manager->p_event_manager; - vlc_event_manager_init( em, p_manager ); - vlc_event_manager_register_event_type(em, vlc_AddonFound); - vlc_event_manager_register_event_type(em, vlc_AddonsDiscoveryEnded); - vlc_event_manager_register_event_type(em, vlc_AddonChanged); - return p_manager; } @@ -187,8 +174,6 @@ void addons_manager_Delete( addons_manager_t *p_manager ) vlc_join( p_manager->p_priv->installer.thread, NULL ); } - vlc_event_manager_fini( p_manager->p_event_manager ); - #define FREE_QUEUE( name ) \ FOREACH_ARRAY( addon_entry_t *p_entry, p_manager->p_priv->name.entries )\ addon_entry_Release( p_entry );\ @@ -205,7 +190,6 @@ void addons_manager_Delete( addons_manager_t *p_manager ) ARRAY_RESET( p_manager->p_priv->finder.uris ); free( p_manager->p_priv ); - free( p_manager->p_event_manager ); free( p_manager ); } @@ -273,10 +257,7 @@ static void MergeSources( addons_manager_t *p_manager, if ( !p_manager_entry ) { ARRAY_APPEND( p_manager->p_priv->finder.entries, p_entry ); - vlc_event_t event; - event.type = vlc_AddonFound; - event.u.addon_generic_event.p_entry = p_entry; - vlc_event_send( p_manager->p_event_manager, &event ); + p_manager->owner.addon_found( p_manager, p_entry ); } else { @@ -361,11 +342,7 @@ static void *FinderThread( void *p_data ) vlc_object_release( p_finder ); } - vlc_event_t event; - event.type = vlc_AddonsDiscoveryEnded; - event.u.addon_generic_event.p_entry = NULL; - vlc_event_send( p_manager->p_event_manager, &event ); - + p_manager->owner.discovery_ended( p_manager ); vlc_restorecancel( i_cancel ); vlc_testcancel(); } @@ -437,8 +414,6 @@ static void *InstallerThread( void *p_data ) { addons_manager_t *p_manager = p_data; int i_ret; - vlc_event_t event; - event.type = vlc_AddonChanged; for( ;; ) { @@ -466,8 +441,7 @@ static void *InstallerThread( void *p_data ) vlc_mutex_unlock( &p_entry->lock ); /* notify */ - event.u.addon_generic_event.p_entry = p_entry; - vlc_event_send( p_manager->p_event_manager, &event ); + p_manager->owner.addon_changed( p_manager, p_entry ); i_ret = installOrRemoveAddon( p_manager, p_entry, false ); @@ -481,8 +455,7 @@ static void *InstallerThread( void *p_data ) vlc_mutex_unlock( &p_entry->lock ); /* notify */ - event.u.addon_generic_event.p_entry = p_entry; - vlc_event_send( p_manager->p_event_manager, &event ); + p_manager->owner.addon_changed( p_manager, p_entry ); i_ret = installOrRemoveAddon( p_manager, p_entry, true ); @@ -493,8 +466,7 @@ static void *InstallerThread( void *p_data ) vlc_mutex_unlock( &p_entry->lock ); /* !DO WORK */ - event.u.addon_generic_event.p_entry = p_entry; - vlc_event_send( p_manager->p_event_manager, &event ); + p_manager->owner.addon_changed( p_manager, p_entry ); addon_entry_Release( p_entry ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
