1 /*****************************************************************************
2 * vlc_extension.h: Extensions (meta data, web information, ...)
3 *****************************************************************************
4 * Copyright (C) 2009-2010 VideoLAN and authors
7 * Authors: Jean-Philippe André < jpeg # videolan.org >
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
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 General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 #ifndef VLC_EXTENSIONS_H
25 #define VLC_EXTENSIONS_H
27 #include "vlc_common.h"
28 #include "vlc_arrays.h"
31 typedef struct extensions_manager_sys_t extensions_manager_sys_t
;
32 typedef struct extensions_manager_t extensions_manager_t
;
33 typedef struct extension_sys_t extension_sys_t
;
35 /** Extension descriptor */
36 typedef struct extension_t
{
37 char *psz_title
; /**< Display title (ro) */
38 char *psz_name
; /**< Real name of the extension (ro) */
39 extension_sys_t
*p_sys
; /**< Reserved for the manager module */
42 /** Extensions manager object */
43 struct extensions_manager_t
47 module_t
*p_module
; /**< Extensions manager module */
48 extensions_manager_sys_t
*p_sys
; /**< Reserved for the module */
50 DECL_ARRAY(extension_t
*) extensions
; /**< Array of extension descriptors */
52 /** Control, see extension_Control */
53 int ( *pf_control
) ( extensions_manager_t
*, int, va_list );
56 /* Control commands */
59 /* Control extensions */
60 EXTENSION_ACTIVATE
, /**< arg1: extension_t* */
61 EXTENSION_DEACTIVATE
, /**< arg1: extension_t* */
62 EXTENSION_IS_ACTIVATED
, /**< arg1: extension_t*, arg2: bool* */
63 EXTENSION_HAS_MENU
, /**< arg1: extension_t* */
64 EXTENSION_GET_MENU
, /**< arg1: extension_t*, arg2: char***, arg3: uint16_t** */
65 EXTENSION_TRIGGER_ONLY
, /**< arg1: extension_t*, arg2: bool* */
66 EXTENSION_TRIGGER
, /**< arg1: extension_t* */
67 EXTENSION_TRIGGER_MENU
, /**< arg1: extension_t*, int (uint16_t) */
71 * Control function for extensions.
72 * Every GUI -> extension command will go through this function.
74 static inline int extension_Control( extensions_manager_t
*p_mgr
,
78 va_start( args
, i_control
);
79 int i_ret
= p_mgr
->pf_control( p_mgr
, i_control
, args
);
85 * Helper for extension_HasMenu, extension_IsActivated...
88 static inline bool __extension_GetBool( extensions_manager_t
*p_mgr
,
94 int i_ret
= extension_Control( p_mgr
, i_flag
, p_ext
, &b
);
95 if( i_ret
!= VLC_SUCCESS
)
101 /** Activate or trigger an extension */
102 #define extension_Activate( mgr, ext ) \
103 extension_Control( mgr, EXTENSION_ACTIVATE, ext )
105 /** Trigger the extension. Attention: NOT multithreaded! */
106 #define extension_Trigger( mgr, ext ) \
107 extension_Control( mgr, EXTENSION_TRIGGER, ext )
109 /** Deactivate an extension */
110 #define extension_Deactivate( mgr, ext ) \
111 extension_Control( mgr, EXTENSION_DEACTIVATE, ext )
113 /** Is this extension activated? */
114 #define extension_IsActivated( mgr, ext ) \
115 __extension_GetBool( mgr, ext, EXTENSION_IS_ACTIVATED, false )
117 /** Does this extension have a sub-menu? */
118 #define extension_HasMenu( mgr, ext ) \
119 __extension_GetBool( mgr, ext, EXTENSION_HAS_MENU, false )
121 /** Get this extension's sub-menu */
122 static inline int extension_GetMenu( extensions_manager_t
*p_mgr
,
127 return extension_Control( p_mgr
, EXTENSION_GET_MENU
, p_ext
, pppsz
, ppi
);
130 /** Trigger an entry of the extension menu */
131 static inline int extension_TriggerMenu( extensions_manager_t
*p_mgr
,
135 return extension_Control( p_mgr
, EXTENSION_TRIGGER_MENU
, p_ext
, i
);
138 /** Can this extension only be triggered but not activated?
139 Not compatible with HasMenu */
140 #define extension_TriggerOnly( mgr, ext ) \
141 __extension_GetBool( mgr, ext, EXTENSION_TRIGGER_ONLY, false )
144 /*****************************************************************************
146 *****************************************************************************/
148 typedef struct extension_dialog_t extension_dialog_t
;
149 typedef struct extension_widget_t extension_widget_t
;
151 /// User interface event types
154 EXTENSION_EVENT_CLICK
, ///< Click on a widget: data = widget
155 EXTENSION_EVENT_CLOSE
, ///< Close the dialog: no data
156 // EXTENSION_EVENT_SELECTION_CHANGED,
157 // EXTENSION_EVENT_TEXT_CHANGED,
158 } extension_dialog_event_e
;
160 /// Command to pass to the extension dialog owner
163 extension_dialog_t
*p_dlg
; ///< Destination dialog
164 extension_dialog_event_e event
; ///< Event, @see extension_dialog_event_e
165 void *p_data
; ///< Opaque data to send
166 } extension_dialog_command_t
;
169 /// Dialog descriptor for extensions
170 struct extension_dialog_t
172 vlc_object_t
*p_object
; ///< Owner object (callback on "dialog-event")
174 char *psz_title
; ///< Title for the Dialog (in TitleBar)
175 int i_width
; ///< Width hint in pixels (may be discarded)
176 int i_height
; ///< Height hint in pixels (may be discarded)
178 DECL_ARRAY(extension_widget_t
*) widgets
; ///< Widgets owned by the dialog
180 bool b_hide
; ///< Hide this dialog (!b_hide shows)
181 bool b_kill
; ///< Kill this dialog
183 void *p_sys
; ///< Dialog private pointer
184 void *p_sys_intf
; ///< GUI private pointer
185 vlc_mutex_t lock
; ///< Dialog mutex
186 vlc_cond_t cond
; ///< Signaled == UI is done working on the dialog
189 /** Send a command to an Extension dialog
190 * @param p_dialog The dialog
191 * @param event @see extension_dialog_event_e for a list of possible events
192 * @param data Optional opaque data, @see extension_dialog_event_e
193 * @return VLC error code
195 static inline int extension_DialogCommand( extension_dialog_t
* p_dialog
,
196 extension_dialog_event_e event
,
199 extension_dialog_command_t command
;
200 command
.p_dlg
= p_dialog
;
201 command
.event
= event
;
202 command
.p_data
= data
;
203 var_SetAddress( p_dialog
->p_object
, "dialog-event", &command
);
208 * @param dlg The dialog
210 #define extension_DialogClosed( dlg ) \
211 extension_DialogCommand( dlg, EXTENSION_EVENT_CLOSE, NULL )
213 /** Forward a click on a widget
214 * @param dlg The dialog
215 * @param wdg The widget (button, ...)
217 #define extension_WidgetClicked( dlg, wdg ) \
218 extension_DialogCommand( dlg, EXTENSION_EVENT_CLICK, wdg )
223 EXTENSION_WIDGET_LABEL
, ///< Non editable text label
224 EXTENSION_WIDGET_BUTTON
, ///< Clickable button
225 EXTENSION_WIDGET_IMAGE
, ///< Image label (psz_text is local URI)
226 EXTENSION_WIDGET_HTML
, ///< HTML or rich text area (non editable)
227 EXTENSION_WIDGET_TEXT_FIELD
, ///< Editable text line for user input
228 EXTENSION_WIDGET_PASSWORD
, ///< Editable password input (******)
229 EXTENSION_WIDGET_DROPDOWN
, ///< Drop-down box
230 EXTENSION_WIDGET_LIST
, ///< Vertical list box (of strings)
231 EXTENSION_WIDGET_CHECK_BOX
, ///< Checkable box with label
232 } extension_widget_type_e
;
234 /// Widget descriptor for extensions
235 struct extension_widget_t
238 extension_widget_type_e type
; ///< Type of the widget
239 char *psz_text
; ///< Text. May be NULL or modified by the UI
241 /* Drop-down & List widgets */
242 struct extension_widget_value_t
{
243 int i_id
; ///< Identifier for the extension module
244 // (weird behavior may occur if not unique)
245 char *psz_text
; ///< String value
246 bool b_selected
; ///< True if this item is selected
247 struct extension_widget_value_t
*p_next
; ///< Next value or NULL
248 } *p_values
; ///< Chained list of values (Drop-down/List)
251 bool b_checked
; ///< Is this entry checked
254 int i_row
; ///< Row in the grid
255 int i_column
; ///< Column in the grid
256 int i_horiz_span
; ///< Horizontal size of the object
257 int i_vert_span
; ///< Vertical size of the object
258 int i_width
; ///< Width hint
259 int i_height
; ///< Height hint
260 bool b_hide
; ///< Hide this widget (make it invisible)
263 bool b_kill
; ///< Destroy this widget
264 bool b_update
; ///< Update this widget
267 void *p_sys
; ///< Reserved for the extension manager
268 void *p_sys_intf
; ///< Reserved for the UI, but:
269 // NULL means the UI has destroyed the widget
270 // or has not created it yet
271 extension_dialog_t
*p_dialog
; ///< Parent dialog
274 VLC_EXPORT(int, dialog_ExtensionUpdate
, (vlc_object_t
*, extension_dialog_t
*));
275 #define dialog_ExtensionUpdate(o, d) dialog_ExtensionUpdate(VLC_OBJECT(o), d)
277 #endif /* VLC_EXTENSIONS_H */