From 23c79e062f2649587f445425a54df1a4253d49f5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 8 Mar 2009 22:05:55 +0200 Subject: [PATCH] dialog_Progress replacement for intf_UserProgress --- include/vlc_dialog.h | 20 ++++++++++++++ src/interface/dialog.c | 63 ++++++++++++++++++++++++++++++++++++++++++ src/libvlccore.sym | 4 +++ 3 files changed, 87 insertions(+) diff --git a/include/vlc_dialog.h b/include/vlc_dialog.h index fb34492fab..6914ef552f 100644 --- a/include/vlc_dialog.h +++ b/include/vlc_dialog.h @@ -96,6 +96,26 @@ VLC_EXPORT( int, dialog_Question, (vlc_object_t *, const char *, const char *, c #define dialog_Question(o, t, m, y, n, c) \ dialog_Question(VLC_OBJECT(o), t, m, y, n, c) +typedef struct dialog_progress_bar_t +{ /* Request-time parameters */ + const char *title; + const char *message; + const char *cancel; + /* Permanent parameters */ + vlc_mutex_t lock; + void (*pf_update) (void *, float); + bool (*pf_check) (void *); + void (*pf_destroy) (void *); + void *p_sys; +} dialog_progress_bar_t; + +VLC_EXPORT( dialog_progress_bar_t *, dialog_ProgressCreate, (vlc_object_t *, const char *, const char *, const char *) ); +#define dialog_ProgressCreate(o, t, m, c) \ + dialog_ProgressCreate(VLC_OBJECT(o), t, m, c) +VLC_EXPORT( void, dialog_ProgressDestroy, (dialog_progress_bar_t *) ); +VLC_EXPORT( void, dialog_ProgressSet, (dialog_progress_bar_t *, float) ); +VLC_EXPORT( bool, dialog_ProgressCancelled, (dialog_progress_bar_t *) ); + VLC_EXPORT( int, dialog_Register, (vlc_object_t *) ); VLC_EXPORT( int, dialog_Unregister, (vlc_object_t *) ); #define dialog_Register(o) dialog_Register(VLC_OBJECT(o)) diff --git a/src/interface/dialog.c b/src/interface/dialog.c index bfd8c91a6d..6aa87c7f90 100644 --- a/src/interface/dialog.c +++ b/src/interface/dialog.c @@ -194,3 +194,66 @@ int dialog_Question (vlc_object_t *obj, const char *title, const char *text, vlc_object_release (provider); return dialog.answer; } + +#undef dialog_ProgressCreate +/** + * Creates a progress bar dialog. + */ +dialog_progress_bar_t * +dialog_ProgressCreate (vlc_object_t *obj, const char *title, + const char *message, const char *cancel) +{ + if (obj->i_flags & OBJECT_FLAGS_NOINTERACT) + return NULL; + + vlc_object_t *provider = dialog_GetProvider (obj); + if (provider == NULL) + return NULL; + + dialog_progress_bar_t *dialog = malloc (sizeof (*dialog)); + if (dialog != NULL) + { + dialog->title = title; + dialog->message = message; + dialog->cancel = cancel; + var_SetAddress (provider, "dialog-progress-bar", dialog); +#ifndef NDEBUG + dialog->title = dialog->message = dialog->cancel = NULL; +#endif + assert (dialog->pf_update); + assert (dialog->pf_check); + assert (dialog->pf_destroy); + } + + /* FIXME: This could conceivably crash if the dialog provider is destroyed + * before the dialog user. Holding the provider does not help, as it only + * protects object variable operations. For instance, it does not prevent + * unloading of the interface plugin. In the short term, the only solution + * is to not use progress dialog after deinitialization of the interfaces. + */ + vlc_object_release (provider); + return dialog; +} + +void dialog_ProgressDestroy (dialog_progress_bar_t *dialog) +{ + assert (dialog); + + dialog->pf_destroy (dialog->p_sys); + free (dialog); +} + +void dialog_ProgressSet (dialog_progress_bar_t *dialog, float value) +{ + assert (dialog); + + dialog->pf_update (dialog->p_sys, value); +} + +bool dialog_ProgressCancelled (dialog_progress_bar_t *dialog) +{ + assert (dialog); + + return dialog->pf_check (dialog->p_sys); +} + diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 7116000448..485dbf2869 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -103,6 +103,10 @@ demux_PacketizerDestroy demux_PacketizerNew demux_vaControlHelper dialog_Login +dialog_ProgressCancelled +dialog_ProgressCreate +dialog_ProgressDestroy +dialog_ProgressSet dialog_Question dialog_Register dialog_Unregister -- 2.39.2