VLC  3.0.15
vlc_extensions.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * vlc_extensions.h: Extensions (meta data, web information, ...)
3  *****************************************************************************
4  * Copyright (C) 2009-2010 VideoLAN and authors
5  * $Id: 8523fe6c4ce8a644a68db95520bf16f4c00ddb75 $
6  *
7  * Authors: Jean-Philippe AndrĂ© < jpeg # videolan.org >
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23 
24 #ifndef VLC_EXTENSIONS_H
25 #define VLC_EXTENSIONS_H
26 
27 #include "vlc_common.h"
28 #include "vlc_arrays.h"
29 
30 /* Structures */
34 
35 /** Extension descriptor: name, title, author, ... */
36 typedef struct extension_t {
37  /* Below, (ro) means read-only for the GUI */
38  char *psz_name; /**< Real name of the extension (ro) */
39 
40  char *psz_title; /**< Display title (ro) */
41  char *psz_author; /**< Author of the extension (ro) */
42  char *psz_version; /**< Version (ro) */
43  char *psz_url; /**< A URL to the official page (ro) */
44  char *psz_description; /**< Full description (ro) */
45  char *psz_shortdescription; /**< Short description (eg. 1 line) (ro) */
46  char *p_icondata; /**< Embedded data for the icon (ro) */
47  int i_icondata_size; /**< Size of that data */
48 
49  extension_sys_t *p_sys; /**< Reserved for the manager module */
50 } extension_t;
51 
52 /** Extensions manager object */
54 {
56 
57  module_t *p_module; /**< Extensions manager module */
58  extensions_manager_sys_t *p_sys; /**< Reserved for the module */
59 
60  DECL_ARRAY(extension_t*) extensions; /**< Array of extension descriptors */
61  vlc_mutex_t lock; /**< A lock for the extensions array */
62 
63  /** Control, see extension_Control */
64  int ( *pf_control ) ( extensions_manager_t*, int, va_list );
65 };
66 
67 /* Control commands */
68 enum
69 {
70  /* Control extensions */
71  EXTENSION_ACTIVATE, /**< arg1: extension_t* */
72  EXTENSION_DEACTIVATE, /**< arg1: extension_t* */
73  EXTENSION_IS_ACTIVATED, /**< arg1: extension_t*, arg2: bool* */
74  EXTENSION_HAS_MENU, /**< arg1: extension_t* */
75  EXTENSION_GET_MENU, /**< arg1: extension_t*, arg2: char***, arg3: uint16_t** */
76  EXTENSION_TRIGGER_ONLY, /**< arg1: extension_t*, arg2: bool* */
77  EXTENSION_TRIGGER, /**< arg1: extension_t* */
78  EXTENSION_TRIGGER_MENU, /**< arg1: extension_t*, int (uint16_t) */
79  EXTENSION_SET_INPUT, /**< arg1: extension_t*, arg2 (input_thread_t*) */
80  EXTENSION_PLAYING_CHANGED, /**< arg1: extension_t*, arg2 int( playing status ) */
81  EXTENSION_META_CHANGED, /**< arg1: extension_t*, arg2 (input_item_t*) */
82 };
83 
84 /**
85  * Control function for extensions.
86  * Every GUI -> extension command will go through this function.
87  **/
88 static inline int extension_Control( extensions_manager_t *p_mgr,
89  int i_control, ... )
90 {
91  va_list args;
92  va_start( args, i_control );
93  int i_ret = p_mgr->pf_control( p_mgr, i_control, args );
94  va_end( args );
95  return i_ret;
96 }
97 
98 /**
99  * Helper for extension_HasMenu, extension_IsActivated...
100  * Do not use.
101  **/
102 static inline bool __extension_GetBool( extensions_manager_t *p_mgr,
103  extension_t *p_ext,
104  int i_flag,
105  bool b_default )
106 {
107  bool b = b_default;
108  int i_ret = extension_Control( p_mgr, i_flag, p_ext, &b );
109  if( i_ret != VLC_SUCCESS )
110  return b_default;
111  else
112  return b;
113 }
114 
115 /** Activate or trigger an extension */
116 #define extension_Activate( mgr, ext ) \
117  extension_Control( mgr, EXTENSION_ACTIVATE, ext )
118 
119 /** Trigger the extension. Attention: NOT multithreaded! */
120 #define extension_Trigger( mgr, ext ) \
121  extension_Control( mgr, EXTENSION_TRIGGER, ext )
122 
123 /** Deactivate an extension */
124 #define extension_Deactivate( mgr, ext ) \
125  extension_Control( mgr, EXTENSION_DEACTIVATE, ext )
126 
127 /** Is this extension activated? */
128 #define extension_IsActivated( mgr, ext ) \
129  __extension_GetBool( mgr, ext, EXTENSION_IS_ACTIVATED, false )
130 
131 /** Does this extension have a sub-menu? */
132 #define extension_HasMenu( mgr, ext ) \
133  __extension_GetBool( mgr, ext, EXTENSION_HAS_MENU, false )
134 
135 /** Get this extension's sub-menu */
136 static inline int extension_GetMenu( extensions_manager_t *p_mgr,
137  extension_t *p_ext,
138  char ***pppsz,
139  uint16_t **ppi )
140 {
141  return extension_Control( p_mgr, EXTENSION_GET_MENU, p_ext, pppsz, ppi );
142 }
143 
144 /** Trigger an entry of the extension menu */
145 static inline int extension_TriggerMenu( extensions_manager_t *p_mgr,
146  extension_t *p_ext,
147  uint16_t i )
148 {
149  return extension_Control( p_mgr, EXTENSION_TRIGGER_MENU, p_ext, i );
150 }
151 
152 /** Trigger an entry of the extension menu */
153 static inline int extension_SetInput( extensions_manager_t *p_mgr,
154  extension_t *p_ext,
155  struct input_thread_t *p_input )
156 {
157  return extension_Control( p_mgr, EXTENSION_SET_INPUT, p_ext, p_input );
158 }
159 
161  extension_t *p_ext,
162  int state )
163 {
164  return extension_Control( p_mgr, EXTENSION_PLAYING_CHANGED, p_ext, state );
165 }
166 
167 static inline int extension_MetaChanged( extensions_manager_t *p_mgr,
168  extension_t *p_ext )
169 {
170  return extension_Control( p_mgr, EXTENSION_META_CHANGED, p_ext );
171 }
172 
173 /** Can this extension only be triggered but not activated?
174  Not compatible with HasMenu */
175 #define extension_TriggerOnly( mgr, ext ) \
176  __extension_GetBool( mgr, ext, EXTENSION_TRIGGER_ONLY, false )
177 
178 
179 /*****************************************************************************
180  * Extension dialogs
181  *****************************************************************************/
182 
185 
186 /// User interface event types
187 typedef enum
188 {
189  EXTENSION_EVENT_CLICK, ///< Click on a widget: data = widget
190  EXTENSION_EVENT_CLOSE, ///< Close the dialog: no data
191  // EXTENSION_EVENT_SELECTION_CHANGED,
192  // EXTENSION_EVENT_TEXT_CHANGED,
194 
195 /// Command to pass to the extension dialog owner
196 typedef struct
197 {
198  extension_dialog_t *p_dlg; ///< Destination dialog
199  extension_dialog_event_e event; ///< Event, @see extension_dialog_event_e
200  void *p_data; ///< Opaque data to send
202 
203 
204 /// Dialog descriptor for extensions
205 struct extension_dialog_t
206 {
207  vlc_object_t *p_object; ///< Owner object (callback on "dialog-event")
208 
209  char *psz_title; ///< Title for the Dialog (in TitleBar)
210  int i_width; ///< Width hint in pixels (may be discarded)
211  int i_height; ///< Height hint in pixels (may be discarded)
212 
213  DECL_ARRAY(extension_widget_t*) widgets; ///< Widgets owned by the dialog
214 
215  bool b_hide; ///< Hide this dialog (!b_hide shows)
216  bool b_kill; ///< Kill this dialog
217 
218  void *p_sys; ///< Dialog private pointer
219  void *p_sys_intf; ///< GUI private pointer
220  vlc_mutex_t lock; ///< Dialog mutex
221  vlc_cond_t cond; ///< Signaled == UI is done working on the dialog
222 };
223 
224 /** Send a command to an Extension dialog
225  * @param p_dialog The dialog
226  * @param event @see extension_dialog_event_e for a list of possible events
227  * @param data Optional opaque data, @see extension_dialog_event_e
228  * @return VLC error code
229  **/
230 static inline int extension_DialogCommand( extension_dialog_t* p_dialog,
232  void *data )
233 {
235  command.p_dlg = p_dialog;
236  command.event = event;
237  command.p_data = data;
238  var_SetAddress( p_dialog->p_object, "dialog-event", &command );
239  return VLC_SUCCESS;
240 }
241 
242 /** Close the dialog
243  * @param dlg The dialog
244  **/
245 #define extension_DialogClosed( dlg ) \
246  extension_DialogCommand( dlg, EXTENSION_EVENT_CLOSE, NULL )
247 
248 /** Forward a click on a widget
249  * @param dlg The dialog
250  * @param wdg The widget (button, ...)
251  **/
252 #define extension_WidgetClicked( dlg, wdg ) \
253  extension_DialogCommand( dlg, EXTENSION_EVENT_CLICK, wdg )
254 
255 /// Widget types
256 typedef enum
257 {
258  EXTENSION_WIDGET_LABEL, ///< Text label
259  EXTENSION_WIDGET_BUTTON, ///< Clickable button
260  EXTENSION_WIDGET_IMAGE, ///< Image label (psz_text is local URI)
261  EXTENSION_WIDGET_HTML, ///< HTML or rich text area (non editable)
262  EXTENSION_WIDGET_TEXT_FIELD, ///< Editable text line for user input
263  EXTENSION_WIDGET_PASSWORD, ///< Editable password input (******)
264  EXTENSION_WIDGET_DROPDOWN, ///< Drop-down box
265  EXTENSION_WIDGET_LIST, ///< Vertical list box (of strings)
266  EXTENSION_WIDGET_CHECK_BOX, ///< Checkable box with label
267  EXTENSION_WIDGET_SPIN_ICON, ///< A "loading..." spinning icon
269 
270 /// Widget descriptor for extensions
271 struct extension_widget_t
272 {
273  /* All widgets */
274  extension_widget_type_e type; ///< Type of the widget
275  char *psz_text; ///< Text. May be NULL or modified by the UI
276 
277  /* Drop-down & List widgets */
279  int i_id; ///< Identifier for the extension module
280  ///< (weird behavior may occur if not unique)
281  char *psz_text; ///< String value
282  bool b_selected; ///< True if this item is selected
283  struct extension_widget_value_t *p_next; ///< Next value or NULL
284  } *p_values; ///< Chained list of values (Drop-down/List)
285 
286  /* Check-box */
287  bool b_checked; ///< Is this entry checked
288 
289  /* Layout */
290  int i_row; ///< Row in the grid
291  int i_column; ///< Column in the grid
292  int i_horiz_span; ///< Horizontal size of the object
293  int i_vert_span; ///< Vertical size of the object
294  int i_width; ///< Width hint
295  int i_height; ///< Height hint
296  bool b_hide; ///< Hide this widget (make it invisible)
297 
298  /* Spinning icon */
299  int i_spin_loops; ///< Number of loops to play (-1 = infinite,
300  ///< 0 = stop animation)
301 
302  /* Orders */
303  bool b_kill; ///< Destroy this widget
304  bool b_update; ///< Update this widget
305 
306  /* Misc */
307  void *p_sys; ///< Reserved for the extension manager
308  void *p_sys_intf; ///< Reserved for the UI, but:
309  ///< NULL means the UI has destroyed the widget
310  ///< or has not created it yet
311  extension_dialog_t *p_dialog; ///< Parent dialog
312 };
313 
314 #endif /* VLC_EXTENSIONS_H */
EXTENSION_WIDGET_SPIN_ICON
A "loading..." spinning icon.
Definition: vlc_extensions.h:266
extension_widget_t::extension_widget_value_t::b_selected
bool b_selected
True if this item is selected.
Definition: vlc_extensions.h:281
extension_dialog_command_t::event
extension_dialog_event_e event
Event,.
Definition: vlc_extensions.h:198
extension_dialog_t::widgets
struct extension_dialog_t::@165 widgets
Widgets owned by the dialog.
extensions_manager_t::p_module
module_t * p_module
Extensions manager module.
Definition: vlc_extensions.h:57
VLC_COMMON_MEMBERS
#define VLC_COMMON_MEMBERS
Backward compatibility macro.
Definition: vlc_common.h:453
extension_widget_t::i_width
int i_width
Width hint.
Definition: vlc_extensions.h:293
EXTENSION_EVENT_CLICK
Click on a widget: data = widget.
Definition: vlc_extensions.h:188
extension_t::psz_shortdescription
char * psz_shortdescription
Short description (eg.
Definition: vlc_extensions.h:45
var_SetAddress
#define var_SetAddress(o, n, p)
Definition: vlc_variables.h:260
extension_dialog_t::i_width
int i_width
Width hint in pixels (may be discarded)
Definition: vlc_extensions.h:209
extension_widget_t::p_sys
void * p_sys
Reserved for the extension manager.
Definition: vlc_extensions.h:306
extension_widget_t::b_checked
bool b_checked
Is this entry checked.
Definition: vlc_extensions.h:286
extension_sys_t
struct extension_sys_t extension_sys_t
Definition: vlc_extensions.h:33
EXTENSION_PLAYING_CHANGED
arg1: extension_t*, arg2 int( playing status )
Definition: vlc_extensions.h:80
EXTENSION_HAS_MENU
arg1: extension_t*
Definition: vlc_extensions.h:74
vlc_common.h
EXTENSION_WIDGET_HTML
HTML or rich text area (non editable)
Definition: vlc_extensions.h:260
extension_dialog_t::cond
vlc_cond_t cond
Signaled == UI is done working on the dialog.
Definition: vlc_extensions.h:220
extension_widget_t::i_spin_loops
int i_spin_loops
Number of loops to play (-1 = infinite, 0 = stop animation)
Definition: vlc_extensions.h:298
extension_widget_t::b_update
bool b_update
Update this widget.
Definition: vlc_extensions.h:303
extension_PlayingChanged
static int extension_PlayingChanged(extensions_manager_t *p_mgr, extension_t *p_ext, int state)
Definition: vlc_extensions.h:160
EXTENSION_WIDGET_BUTTON
Clickable button.
Definition: vlc_extensions.h:258
extension_widget_t::b_hide
bool b_hide
Hide this widget (make it invisible)
Definition: vlc_extensions.h:295
extension_dialog_command_t
Command to pass to the extension dialog owner.
Definition: vlc_extensions.h:195
extension_t
struct extension_t extension_t
Extension descriptor: name, title, author, ...
extension_dialog_t::psz_title
char * psz_title
Title for the Dialog (in TitleBar)
Definition: vlc_extensions.h:208
extension_TriggerMenu
static int extension_TriggerMenu(extensions_manager_t *p_mgr, extension_t *p_ext, uint16_t i)
Trigger an entry of the extension menu.
Definition: vlc_extensions.h:145
extension_GetMenu
static int extension_GetMenu(extensions_manager_t *p_mgr, extension_t *p_ext, char ***pppsz, uint16_t **ppi)
Get this extension's sub-menu.
Definition: vlc_extensions.h:136
extension_t::p_icondata
char * p_icondata
Embedded data for the icon (ro)
Definition: vlc_extensions.h:46
extension_dialog_t::i_height
int i_height
Height hint in pixels (may be discarded)
Definition: vlc_extensions.h:210
extensions_manager_sys_t
struct extensions_manager_sys_t extensions_manager_sys_t
Definition: vlc_extensions.h:31
__extension_GetBool
static bool __extension_GetBool(extensions_manager_t *p_mgr, extension_t *p_ext, int i_flag, bool b_default)
Helper for extension_HasMenu, extension_IsActivated...
Definition: vlc_extensions.h:102
extension_dialog_command_t::p_dlg
extension_dialog_t * p_dlg
Destination dialog.
Definition: vlc_extensions.h:197
vlc_cond_t
pthread_cond_t vlc_cond_t
Condition variable.
Definition: vlc_threads.h:279
extension_t::psz_title
char * psz_title
Display title (ro)
Definition: vlc_extensions.h:40
extension_widget_t::extension_widget_value_t
Definition: vlc_extensions.h:277
extension_widget_type_e
extension_widget_type_e
Widget types.
Definition: vlc_extensions.h:255
EXTENSION_TRIGGER_MENU
arg1: extension_t*, int (uint16_t)
Definition: vlc_extensions.h:78
extension_SetInput
static int extension_SetInput(extensions_manager_t *p_mgr, extension_t *p_ext, struct input_thread_t *p_input)
Trigger an entry of the extension menu.
Definition: vlc_extensions.h:153
EXTENSION_TRIGGER
arg1: extension_t*
Definition: vlc_extensions.h:77
extension_widget_t::i_horiz_span
int i_horiz_span
Horizontal size of the object.
Definition: vlc_extensions.h:291
extension_widget_t::extension_widget_value_t::p_next
struct extension_widget_value_t * p_next
Next value or NULL.
Definition: vlc_extensions.h:282
extension_t
Extension descriptor: name, title, author, ...
Definition: vlc_extensions.h:36
module_t
Internal module descriptor.
Definition: modules.h:79
EXTENSION_WIDGET_TEXT_FIELD
Editable text line for user input.
Definition: vlc_extensions.h:261
extensions_manager_t
Extensions manager object.
Definition: vlc_extensions.h:53
extension_widget_t::type
extension_widget_type_e type
Type of the widget.
Definition: vlc_extensions.h:273
EXTENSION_EVENT_CLOSE
Close the dialog: no data.
Definition: vlc_extensions.h:189
extension_widget_t::p_sys_intf
void * p_sys_intf
Reserved for the UI, but: NULL means the UI has destroyed the widget or has not created it yet.
Definition: vlc_extensions.h:307
extension_t::psz_name
char * psz_name
Real name of the extension (ro)
Definition: vlc_extensions.h:38
extension_t::psz_description
char * psz_description
Full description (ro)
Definition: vlc_extensions.h:44
extensions_manager_t::lock
vlc_mutex_t lock
A lock for the extensions array.
Definition: vlc_extensions.h:61
extension_dialog_t::lock
vlc_mutex_t lock
Dialog mutex.
Definition: vlc_extensions.h:219
extension_dialog_t::p_object
vlc_object_t * p_object
Owner object (callback on "dialog-event")
Definition: vlc_extensions.h:206
extension_widget_t::i_row
int i_row
Row in the grid.
Definition: vlc_extensions.h:289
extensions_manager_t::p_sys
extensions_manager_sys_t * p_sys
Reserved for the module.
Definition: vlc_extensions.h:58
extension_widget_t
Widget descriptor for extensions.
Definition: vlc_extensions.h:270
extension_widget_t::b_kill
bool b_kill
Destroy this widget.
Definition: vlc_extensions.h:302
DECL_ARRAY
#define DECL_ARRAY(type)
Definition: vlc_arrays.h:165
extension_dialog_event_e
extension_dialog_event_e
User interface event types.
Definition: vlc_extensions.h:186
extension_dialog_t::p_sys_intf
void * p_sys_intf
GUI private pointer.
Definition: vlc_extensions.h:218
extension_widget_t::extension_widget_value_t::i_id
int i_id
Identifier for the extension module (weird behavior may occur if not unique)
Definition: vlc_extensions.h:278
EXTENSION_WIDGET_LABEL
Text label.
Definition: vlc_extensions.h:257
extension_dialog_t::b_kill
bool b_kill
Kill this dialog.
Definition: vlc_extensions.h:215
extension_dialog_t::p_sys
void * p_sys
Dialog private pointer.
Definition: vlc_extensions.h:217
vlc_object_t
The main vlc_object_t structure.
Definition: vlc_objects.h:39
extension_widget_t::p_dialog
extension_dialog_t * p_dialog
Parent dialog.
Definition: vlc_extensions.h:310
EXTENSION_META_CHANGED
arg1: extension_t*, arg2 (input_item_t*)
Definition: vlc_extensions.h:81
extension_t::psz_author
char * psz_author
Author of the extension (ro)
Definition: vlc_extensions.h:41
extension_widget_t::extension_widget_value_t::psz_text
char * psz_text
String value.
Definition: vlc_extensions.h:280
extension_widget_t::psz_text
char * psz_text
Text. May be NULL or modified by the UI.
Definition: vlc_extensions.h:274
vlc_mutex_t
pthread_mutex_t vlc_mutex_t
Mutex.
Definition: vlc_threads.h:267
VLC_SUCCESS
#define VLC_SUCCESS
No error.
Definition: vlc_common.h:349
EXTENSION_IS_ACTIVATED
arg1: extension_t*, arg2: bool*
Definition: vlc_extensions.h:73
extension_widget_t::p_values
struct extension_widget_t::extension_widget_value_t * p_values
Chained list of values (Drop-down/List)
extension_dialog_command_t::p_data
void * p_data
Opaque data to send.
Definition: vlc_extensions.h:199
extension_widget_t::i_column
int i_column
Column in the grid.
Definition: vlc_extensions.h:290
extension_t::psz_url
char * psz_url
A URL to the official page (ro)
Definition: vlc_extensions.h:43
EXTENSION_ACTIVATE
arg1: extension_t*
Definition: vlc_extensions.h:71
extension_t::p_sys
extension_sys_t * p_sys
Reserved for the manager module.
Definition: vlc_extensions.h:49
extension_widget_t::i_height
int i_height
Height hint.
Definition: vlc_extensions.h:294
extensions_manager_t::pf_control
int(* pf_control)(extensions_manager_t *, int, va_list)
Control, see extension_Control.
Definition: vlc_extensions.h:64
EXTENSION_WIDGET_LIST
Vertical list box (of strings)
Definition: vlc_extensions.h:264
extension_widget_t::i_vert_span
int i_vert_span
Vertical size of the object.
Definition: vlc_extensions.h:292
extension_MetaChanged
static int extension_MetaChanged(extensions_manager_t *p_mgr, extension_t *p_ext)
Definition: vlc_extensions.h:167
extension_Control
static int extension_Control(extensions_manager_t *p_mgr, int i_control,...)
Control function for extensions.
Definition: vlc_extensions.h:88
EXTENSION_WIDGET_CHECK_BOX
Checkable box with label.
Definition: vlc_extensions.h:265
EXTENSION_DEACTIVATE
arg1: extension_t*
Definition: vlc_extensions.h:72
EXTENSION_SET_INPUT
arg1: extension_t*, arg2 (input_thread_t*)
Definition: vlc_extensions.h:79
EXTENSION_WIDGET_PASSWORD
Editable password input (******)
Definition: vlc_extensions.h:262
extension_DialogCommand
static int extension_DialogCommand(extension_dialog_t *p_dialog, extension_dialog_event_e event, void *data)
Send a command to an Extension dialog.
Definition: vlc_extensions.h:229
EXTENSION_GET_MENU
arg1: extension_t*, arg2: char***, arg3: uint16_t**
Definition: vlc_extensions.h:75
EXTENSION_WIDGET_IMAGE
Image label (psz_text is local URI)
Definition: vlc_extensions.h:259
vlc_arrays.h
EXTENSION_TRIGGER_ONLY
arg1: extension_t*, arg2: bool*
Definition: vlc_extensions.h:76
input_thread_t
Main structure representing an input thread.
Definition: vlc_input.h:221
extensions_manager_t::extensions
struct extensions_manager_t::@164 extensions
Array of extension descriptors.
EXTENSION_WIDGET_DROPDOWN
Drop-down box.
Definition: vlc_extensions.h:263
extension_t::i_icondata_size
int i_icondata_size
Size of that data.
Definition: vlc_extensions.h:47
extension_dialog_t
Dialog descriptor for extensions.
Definition: vlc_extensions.h:204
extension_dialog_t::b_hide
bool b_hide
Hide this dialog (!b_hide shows)
Definition: vlc_extensions.h:214
extension_t::psz_version
char * psz_version
Version (ro)
Definition: vlc_extensions.h:42