10c5f6a2a8b035a6f3fbb83124e93cfb84ca9e94
[framework/uifw/elementary.git] / src / lib / elm_theme.h
1 /**
2  * @defgroup Theme Theme
3  * @ingroup Elementary
4  *
5  * Elementary uses Edje to theme its widgets, naturally. But for the most
6  * part this is hidden behind a simpler interface that lets the user set
7  * extensions and choose the style of widgets in a much easier way.
8  *
9  * Instead of thinking in terms of paths to Edje files and their groups
10  * each time you want to change the appearance of a widget, Elementary
11  * works so you can add any theme file with extensions or replace the
12  * main theme at one point in the application, and then just set the style
13  * of widgets with elm_object_style_set() and related functions. Elementary
14  * will then look in its list of themes for a matching group and apply it,
15  * and when the theme changes midway through the application, all widgets
16  * will be updated accordingly.
17  *
18  * There are three concepts you need to know to understand how Elementary
19  * theming works: default theme, extensions and overlays.
20  *
21  * Default theme, obviously enough, is the one that provides the default
22  * look of all widgets. End users can change the theme used by Elementary
23  * by setting the @c ELM_THEME environment variable before running an
24  * application, or globally for all programs using the @c elementary_config
25  * utility. Applications can change the default theme using elm_theme_set(),
26  * but this can go against the user wishes, so it's not an advised practice.
27  *
28  * Ideally, applications should find everything they need in the already
29  * provided theme, but there may be occasions when that's not enough and
30  * custom styles are required to correctly express the idea. For this
31  * cases, Elementary has extensions.
32  *
33  * Extensions allow the application developer to write styles of its own
34  * to apply to some widgets. This requires knowledge of how each widget
35  * is themed, as extensions will always replace the entire group used by
36  * the widget, so important signals and parts need to be there for the
37  * object to behave properly (see documentation of Edje for details).
38  * Once the theme for the extension is done, the application needs to add
39  * it to the list of themes Elementary will look into, using
40  * elm_theme_extension_add(), and set the style of the desired widgets as
41  * he would normally with elm_object_style_set().
42  *
43  * Overlays, on the other hand, can replace the look of all widgets by
44  * overriding the default style. Like extensions, it's up to the application
45  * developer to write the theme for the widgets it wants, the difference
46  * being that when looking for the theme, Elementary will check first the
47  * list of overlays, then the set theme and lastly the list of extensions,
48  * so with overlays it's possible to replace the default view and every
49  * widget will be affected. This is very much alike to setting the whole
50  * theme for the application and will probably clash with the end user
51  * options, not to mention the risk of ending up with not matching styles
52  * across the program. Unless there's a very special reason to use them,
53  * overlays should be avoided for the reasons exposed before.
54  *
55  * All these theme lists are handled by ::Elm_Theme instances. Elementary
56  * keeps one default internally and every function that receives one of
57  * these can be called with NULL to refer to this default (except for
58  * elm_theme_free()). It's possible to create a new instance of a
59  * ::Elm_Theme to set other theme for a specific widget (and all of its
60  * children), but this is as discouraged, if not even more so, than using
61  * overlays. Don't use this unless you really know what you are doing.
62  *
63  * But to be less negative about things, you can look at the following
64  * examples:
65  * @li @ref theme_example_01 "Using extensions"
66  * @li @ref theme_example_02 "Using overlays"
67  *
68  * @{
69  */
70 /**
71  * @typedef Elm_Theme
72  *
73  * Opaque handler for the list of themes Elementary looks for when
74  * rendering widgets.
75  *
76  * Stay out of this unless you really know what you are doing. For most
77  * cases, sticking to the default is all a developer needs.
78  */
79 typedef struct _Elm_Theme Elm_Theme;
80
81 /**
82  * Create a new specific theme
83  *
84  * This creates an empty specific theme that only uses the default theme. A
85  * specific theme has its own private set of extensions and overlays too
86  * (which are empty by default). Specific themes do not fall back to themes
87  * of parent objects. They are not intended for this use. Use styles, overlays
88  * and extensions when needed, but avoid specific themes unless there is no
89  * other way (example: you want to have a preview of a new theme you are
90  * selecting in a "theme selector" window. The preview is inside a scroller
91  * and should display what the theme you selected will look like, but not
92  * actually apply it yet. The child of the scroller will have a specific
93  * theme set to show this preview before the user decides to apply it to all
94  * applications).
95  *
96  * @ingroup Theme
97  */
98 EAPI Elm_Theme       *elm_theme_new(void);
99
100 /**
101  * Free a specific theme
102  *
103  * @param th The theme to free
104  *
105  * This frees a theme created with elm_theme_new().
106  *
107  * @ingroup Theme
108  */
109 EAPI void             elm_theme_free(Elm_Theme *th);
110
111 /**
112  * Copy the theme from the source to the destination theme
113  *
114  * @param th The source theme to copy from
115  * @param thdst The destination theme to copy data to
116  *
117  * This makes a one-time static copy of all the theme config, extensions
118  * and overlays from @p th to @p thdst. If @p th references a theme, then
119  * @p thdst is also set to reference it, with all the theme settings,
120  * overlays and extensions that @p th had.
121  *
122  * @ingroup Theme
123  */
124 EAPI void             elm_theme_copy(Elm_Theme *th, Elm_Theme *thdst);
125
126 /**
127  * Tell the source theme to reference the ref theme
128  *
129  * @param th The theme that will do the referencing
130  * @param thref The theme that is the reference source
131  *
132  * This clears @p th to be empty and then sets it to refer to @p thref
133  * so @p th acts as an override to @p thref, but where its overrides
134  * don't apply, it will fall through to @p thref for configuration.
135  *
136  * @ingroup Theme
137  */
138 EAPI void             elm_theme_ref_set(Elm_Theme *th, Elm_Theme *thref);
139
140 /**
141  * Return the theme referred to
142  *
143  * @param th The theme to get the reference from
144  * @return The referenced theme handle
145  *
146  * This gets the theme set as the reference theme by elm_theme_ref_set().
147  * If no theme is set as a reference, NULL is returned.
148  *
149  * @ingroup Theme
150  */
151 EAPI Elm_Theme       *elm_theme_ref_get(Elm_Theme *th);
152
153 /**
154  * Return the default theme
155  *
156  * @return The default theme handle
157  *
158  * This returns the internal default theme setup handle that all widgets
159  * use implicitly unless a specific theme is set. This is also often use
160  * as a shorthand of NULL.
161  *
162  * @ingroup Theme
163  */
164 EAPI Elm_Theme       *elm_theme_default_get(void);
165
166 /**
167  * Prepends a theme overlay to the list of overlays
168  *
169  * @param th The theme to add to, or if NULL, the default theme
170  * @param item The Edje file path to be used
171  *
172  * Use this if your application needs to provide some custom overlay theme
173  * (An Edje file that replaces some default styles of widgets) where adding
174  * new styles, or changing system theme configuration is not possible. Do
175  * NOT use this instead of a proper system theme configuration. Use proper
176  * configuration files, profiles, environment variables etc. to set a theme
177  * so that the theme can be altered by simple configuration by a user. Using
178  * this call to achieve that effect is abusing the API and will create lots
179  * of trouble.
180  *
181  * @see elm_theme_extension_add()
182  *
183  * @ingroup Theme
184  */
185 EAPI void             elm_theme_overlay_add(Elm_Theme *th, const char *item);
186
187 /**
188  * Delete a theme overlay from the list of overlays
189  *
190  * @param th The theme to delete from, or if NULL, the default theme
191  * @param item The name of the theme overlay
192  *
193  * @see elm_theme_overlay_add()
194  *
195  * @ingroup Theme
196  */
197 EAPI void             elm_theme_overlay_del(Elm_Theme *th, const char *item);
198
199 /**
200  * Get the list of registered overlays for the given theme
201  *
202  * @param th The theme from which to get the overlays
203  * @return List of theme overlays. Do not free it.
204  *
205  * @see elm_theme_overlay_add()
206  *
207  * @ingroup Theme
208  */
209 EAPI const Eina_List *elm_theme_overlay_list_get(const Elm_Theme *th);
210
211 /**
212  * Appends a theme extension to the list of extensions.
213  *
214  * @param th The theme to add to, or if NULL, the default theme
215  * @param item The Edje file path to be used
216  *
217  * This is intended when an application needs more styles of widgets or new
218  * widget themes that the default does not provide (or may not provide). The
219  * application has "extended" usage by coming up with new custom style names
220  * for widgets for specific uses, but as these are not "standard", they are
221  * not guaranteed to be provided by a default theme. This means the
222  * application is required to provide these extra elements itself in specific
223  * Edje files. This call adds one of those Edje files to the theme search
224  * path to be search after the default theme. The use of this call is
225  * encouraged when default styles do not meet the needs of the application.
226  * Use this call instead of elm_theme_overlay_add() for almost all cases.
227  *
228  * @see elm_object_style_set()
229  *
230  * @ingroup Theme
231  */
232 EAPI void             elm_theme_extension_add(Elm_Theme *th, const char *item);
233
234 /**
235  * Deletes a theme extension from the list of extensions.
236  *
237  * @param th The theme to delete from, or if NULL, the default theme
238  * @param item The name of the theme extension
239  *
240  * @see elm_theme_extension_add()
241  *
242  * @ingroup Theme
243  */
244 EAPI void             elm_theme_extension_del(Elm_Theme *th, const char *item);
245
246 /**
247  * Get the list of registered extensions for the given theme
248  *
249  * @param th The theme from which to get the extensions
250  * @return List of theme extensions. Do not free it.
251  *
252  * @see elm_theme_extension_add()
253  *
254  * @ingroup Theme
255  */
256 EAPI const Eina_List *elm_theme_extension_list_get(const Elm_Theme *th);
257
258 /**
259  * Set the theme search order for the given theme
260  *
261  * @param th The theme to set the search order, or if NULL, the default theme
262  * @param theme Theme search string
263  *
264  * This sets the search string for the theme in path-notation from first
265  * theme to search, to last, delimited by the : character. Example:
266  *
267  * "shiny:/path/to/file.edj:default"
268  *
269  * See the ELM_THEME environment variable for more information.
270  *
271  * @see elm_theme_get()
272  * @see elm_theme_list_get()
273  *
274  * @ingroup Theme
275  */
276 EAPI void             elm_theme_set(Elm_Theme *th, const char *theme);
277
278 /**
279  * Return the theme search order
280  *
281  * @param th The theme to get the search order, or if NULL, the default theme
282  * @return The internal search order path
283  *
284  * This function returns a colon separated string of theme elements as
285  * returned by elm_theme_list_get().
286  *
287  * @see elm_theme_set()
288  * @see elm_theme_list_get()
289  *
290  * @ingroup Theme
291  */
292 EAPI const char      *elm_theme_get(Elm_Theme *th);
293
294 /**
295  * Return a list of theme elements to be used in a theme.
296  *
297  * @param th Theme to get the list of theme elements from.
298  * @return The internal list of theme elements
299  *
300  * This returns the internal list of theme elements (will only be valid as
301  * long as the theme is not modified by elm_theme_set() or theme is not
302  * freed by elm_theme_free(). This is a list of strings which must not be
303  * altered as they are also internal. If @p th is NULL, then the default
304  * theme element list is returned.
305  *
306  * A theme element can consist of a full or relative path to a .edj file,
307  * or a name, without extension, for a theme to be searched in the known
308  * theme paths for Elementary.
309  *
310  * @see elm_theme_set()
311  * @see elm_theme_get()
312  *
313  * @ingroup Theme
314  */
315 EAPI const Eina_List *elm_theme_list_get(const Elm_Theme *th);
316
317 /**
318  * Return the full path for a theme element
319  *
320  * @param f The theme element name
321  * @param in_search_path Pointer to a boolean to indicate if item is in the search path or not
322  * @return The full path to the file found.
323  *
324  * This returns a string you should free with free() on success, NULL on
325  * failure. This will search for the given theme element, and if it is a
326  * full or relative path element or a simple search-able name. The returned
327  * path is the full path to the file, if searched, and the file exists, or it
328  * is simply the full path given in the element or a resolved path if
329  * relative to home. The @p in_search_path boolean pointed to is set to
330  * EINA_TRUE if the file was a search-able file and is in the search path,
331  * and EINA_FALSE otherwise.
332  *
333  * @ingroup Theme
334  */
335 EAPI char            *elm_theme_list_item_path_get(const char *f, Eina_Bool *in_search_path);
336
337 /**
338  * Flush the current theme.
339  *
340  * @param th Theme to flush
341  *
342  * This flushes caches that let elementary know where to find theme elements
343  * in the given theme. If @p th is NULL, then the default theme is flushed.
344  * Call this function if source theme data has changed in such a way as to
345  * make any caches Elementary kept invalid.
346  *
347  * @ingroup Theme
348  */
349 EAPI void             elm_theme_flush(Elm_Theme *th);
350
351 /**
352  * This flushes all themes (default and specific ones).
353  *
354  * This will flush all themes in the current application context, by calling
355  * elm_theme_flush() on each of them.
356  *
357  * @ingroup Theme
358  */
359 EAPI void             elm_theme_full_flush(void);
360
361 /**
362  * Return a list of theme elements in the theme search path
363  *
364  * @return A list of strings that are the theme element names.
365  *
366  * This lists all available theme files in the standard Elementary search path
367  * for theme elements, and returns them in alphabetical order as theme
368  * element names in a list of strings. Free this with
369  * elm_theme_name_available_list_free() when you are done with the list.
370  *
371  * @ingroup Theme
372  */
373 EAPI Eina_List       *elm_theme_name_available_list_new(void);
374
375 /**
376  * Free the list returned by elm_theme_name_available_list_new()
377  *
378  * This frees the list of themes returned by
379  * elm_theme_name_available_list_new(). Once freed the list should no longer
380  * be used. a new list mys be created.
381  *
382  * @ingroup Theme
383  */
384 EAPI void             elm_theme_name_available_list_free(Eina_List *list);
385
386 /**
387  * Set a specific theme to be used for this object and its children
388  *
389  * @param obj The object to set the theme on
390  * @param th The theme to set
391  *
392  * This sets a specific theme that will be used for the given object and any
393  * child objects it has. If @p th is NULL then the theme to be used is
394  * cleared and the object will inherit its theme from its parent (which
395  * ultimately will use the default theme if no specific themes are set).
396  *
397  * Use special themes with great care as this will annoy users and make
398  * configuration difficult. Avoid any custom themes at all if it can be
399  * helped.
400  *
401  * @ingroup Theme
402  */
403 EAPI void             elm_object_theme_set(Evas_Object *obj, Elm_Theme *th);
404
405 /**
406  * Get the specific theme to be used
407  *
408  * @param obj The object to get the specific theme from
409  * @return The specific theme set.
410  *
411  * This will return a specific theme set, or NULL if no specific theme is
412  * set on that object. It will not return inherited themes from parents, only
413  * the specific theme set for that specific object. See elm_object_theme_set()
414  * for more information.
415  *
416  * @ingroup Theme
417  */
418 EAPI Elm_Theme       *elm_object_theme_get(const Evas_Object *obj);
419
420 /**
421  * Get a data item from a theme
422  *
423  * @param th The theme, or NULL for default theme
424  * @param key The data key to search with
425  * @return The data value, or NULL on failure
426  *
427  * This function is used to return data items from edc in @p th, an overlay, or an extension.
428  * It works the same way as edje_file_data_get() except that the return is stringshared.
429  *
430  * @ingroup Theme
431  */
432 EAPI const char      *elm_theme_data_get(Elm_Theme *th, const char *key);
433
434 /**
435  * @}
436  */