2 * irreco - Ir Remote Control
3 * Copyright (C) 2007 Arto Karppinen (arto.karppinen@iki.fi),
4 * Harri Vattulainen (t5vaha01@students.oamk.fi)
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include "irreco_config.h"
22 #include "irreco_button.h"
25 * @addtogroup IrrecoConfig
28 * Configuration saving and reading.
35 * Source file of @ref IrrecoConfig.
39 #define IRRECO_CONFIG_GROUP_LEN 20
41 gchar
* irreco_config_layout_file
= "layouts.conf";
42 gchar
* irreco_config_active_layout_file
= "active-layout.conf";
43 gchar
* irreco_config_backend_file
= "backends.conf";
44 gchar
* irreco_config_cmd_chain_file
= "command-chains.conf";
48 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
50 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
52 void irreco_config_read_button_from_keyfile(IrrecoData
* irreco_data
,
53 IrrecoKeyFile
* keyfile
);
54 void irreco_config_read_hardkey_from_keyfile(IrrecoData
* irreco_data
,
55 IrrecoKeyFile
* keyfile
);
56 void irreco_config_read_layout_from_keyfile(IrrecoData
* irreco_data
,
57 IrrecoKeyFile
* keyfile
,
58 const gchar
*filename
);
59 void irreco_config_save_layout_to_keyfile(GKeyFile
* keyfile
,
60 IrrecoButtonLayout
* layout
,
63 gint
* hardkey_index
);
64 void irreco_config_save_hardkey_to_file(IrrecoHardkeyMap
*hardkey_map
,
66 IrrecoCmdChainId chain_id
,
67 IrrecoCmdChain
*chain
,
69 void irreco_config_save_button_to_keyfile(GKeyFile
* keyfile
,
70 IrrecoButton
* button
,
72 gint
* command_index
);
73 void irreco_config_save_cmd_chain_to_keyfile(GKeyFile
* keyfile
,
74 IrrecoButton
* button
,
75 gint
* command_index
);
76 void irreco_config_read_backend_from_keyfile(
77 IrrecoBackendManager
* backend_manager
,
78 IrrecoKeyFile
* keyfile
);
79 void irreco_config_read_layouts(IrrecoDirForeachData
*dir_data
);
82 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
84 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
87 * @name Layout reading
91 gboolean
irreco_config_read_layouts_from_files(IrrecoData
*irreco_data
)
93 IrrecoDirForeachData dir_data
;
96 dir_data
.directory
= irreco_get_config_dir("irreco");
97 dir_data
.filesuffix
= ".conf";
98 dir_data
.user_data_1
= irreco_data
;
100 irreco_dir_foreach(&dir_data
,
101 irreco_config_read_layouts
);
103 IRRECO_RETURN_BOOL(TRUE
);
106 void irreco_config_read_layouts(IrrecoDirForeachData
*dir_data
)
109 IrrecoKeyFile
*keyfile
= NULL
;
110 gchar
*config_dir
= NULL
;
111 gchar
*config_file
= NULL
;
112 gchar
** groups
= NULL
;
113 gsize group_count
= 0;
114 IrrecoData
*irreco_data
= dir_data
->user_data_1
;
117 /* Modified to allow reading old layouts.conf */
118 if(!g_str_has_prefix(dir_data
->filename
, "layout") /* ||
119 strcmp(dir_data->filename, "layouts.conf") == 0*/ ) {
120 IRRECO_DEBUG("Not layout*.conf file\n");
124 config_dir
= (gchar
*) dir_data
->directory
;
125 config_file
= irreco_get_config_file("irreco", dir_data
->filename
);
127 keyfile
= irreco_keyfile_create(config_dir
, config_file
, NULL
);
128 if (config_dir
== NULL
|| config_file
== NULL
|| keyfile
== NULL
) {
131 irreco_keyfile_destroy(keyfile
);
135 IRRECO_PRINTF("Reading layout configuration file \"%s\"\n",
137 groups
= g_key_file_get_groups(keyfile
->keyfile
, &group_count
);
140 for (i
= 0; i
< group_count
; i
++) {
141 gchar
*group
= groups
[i
];
142 if (g_str_has_prefix(group
, "layout")) {
143 IRRECO_PRINTF("Reading layout group \"%s\"\n", group
);
144 irreco_keyfile_set_group(keyfile
, group
);
145 irreco_config_read_layout_from_keyfile(irreco_data
,
152 for (i
= 0; i
< group_count
; i
++) {
153 gchar
*group
= groups
[i
];
154 if (g_str_has_prefix(group
, "button")) {
155 IRRECO_PRINTF("Reading button group \"%s\"\n", group
);
156 irreco_keyfile_set_group(keyfile
, group
);
157 irreco_config_read_button_from_keyfile(irreco_data
,
163 for (i
= 0; i
< group_count
; i
++) {
164 gchar
*group
= groups
[i
];
165 if (g_str_has_prefix(group
, "hardkey")) {
166 IRRECO_PRINTF("Reading hardkey group \"%s\"\n", group
);
167 irreco_keyfile_set_group(keyfile
, group
);
168 irreco_config_read_hardkey_from_keyfile(irreco_data
,
173 /* Read command chains. */
174 irreco_cmd_chain_manager_from_config(irreco_data
);
177 irreco_keyfile_destroy(keyfile
);
182 void irreco_config_read_layout_from_keyfile(IrrecoData
* irreco_data
,
183 IrrecoKeyFile
* keyfile
,
184 const gchar
*filename
)
187 IrrecoButtonLayout
*layout
= NULL
;
193 /* Required fields. */
194 if (!irreco_keyfile_get_str(keyfile
, "name", &name
)) IRRECO_RETURN
195 layout
= irreco_button_layout_create(NULL
,
196 irreco_data
->cmd_chain_manager
);
197 irreco_button_layout_set_name(layout
, name
);
201 /* Don't save old type filename, so it get renamed */
202 if(!strcmp(filename
, "layouts.conf") == 0) {
203 irreco_button_layout_set_filename(layout
, filename
);
206 if (irreco_keyfile_get_int(keyfile
, "bg-type", &type
)) {
208 case IRRECO_BACKGROUND_DEFAULT
:
209 case IRRECO_BACKGROUND_COLOR
:
210 case IRRECO_BACKGROUND_IMAGE
:
211 irreco_button_layout_set_bg_type(layout
, type
);
215 IRRECO_ERROR("Unknown background type \"%i\".\n",
221 if (irreco_keyfile_get_str(keyfile
, "bg-image", &image
)) {
222 irreco_button_layout_set_bg_image(layout
, image
);
228 if (irreco_keyfile_get_uint16(keyfile
, "bg-color-red", &color
.red
) &&
229 irreco_keyfile_get_uint16(keyfile
, "bg-color-green", &color
.green
)&&
230 irreco_keyfile_get_uint16(keyfile
, "bg-color-blue", &color
.blue
)) {
231 irreco_button_layout_set_bg_color(layout
, &color
);
234 if (!irreco_string_table_add(irreco_data
->irreco_layout_array
,
235 irreco_button_layout_get_name(layout
),
237 IRRECO_ERROR("Layout \"%s\" already exists.",
238 irreco_button_layout_get_name(layout
));
239 irreco_button_layout_destroy(layout
);
245 void irreco_config_read_button_from_keyfile(IrrecoData
* irreco_data
,
246 IrrecoKeyFile
* keyfile
)
248 gchar
*layout_name
= NULL
;
249 gchar
*style_name
= NULL
;
251 gchar
*command
= NULL
;
252 IrrecoCmdChainId chain_id
;
256 IrrecoButton
*button
= NULL
;
257 IrrecoButtonLayout
*layout
= NULL
;
258 IrrecoThemeButton
*style
= NULL
;
261 /* Required fields. */
262 if (!irreco_keyfile_get_int(keyfile
, "x", &x
) ||
263 !irreco_keyfile_get_int(keyfile
, "y", &y
) ||
264 !irreco_keyfile_get_str(keyfile
, "layout", &layout_name
)) {
267 IRRECO_PRINTF("Position: x%i y%i\n", x
, y
);
270 if (!irreco_string_table_get(irreco_data
->irreco_layout_array
,
271 layout_name
, (gpointer
*) &layout
)) {
272 IRRECO_ERROR("Button uses unknown layout \"%s\"\n",
278 IRRECO_PRINTF("Style: \"%s\"\n",
279 irreco_button_layout_get_name(layout
));
282 irreco_keyfile_get_str(keyfile
, "style", &style_name
);
283 if (style_name
!= NULL
) {
284 if (irreco_theme_manager_get_button_style(
285 irreco_data
->theme_manager
,
286 style_name
, &style
)) {
287 IRRECO_PRINTF("Style: \"%s\"\n", style
->name
->str
);
289 IRRECO_ERROR("Button uses unknown style \"%s\"\n",
296 /* Get title and command. */
297 irreco_keyfile_get_str(keyfile
, "title", &title
);
298 IRRECO_PRINTF("title: \"%s\"\n", title
);
300 button
= irreco_button_create(layout
, x
, y
, title
, style
,
301 irreco_data
->cmd_chain_manager
);
303 if (irreco_keyfile_get_int(keyfile
, "command-chain-id", &chain_id
)) {
304 irreco_button_set_cmd_chain_id(button
, chain_id
);
312 void irreco_config_read_hardkey_from_keyfile(IrrecoData
* irreco_data
,
313 IrrecoKeyFile
* keyfile
)
315 IrrecoButtonLayout
*layout
= NULL
;
316 gchar
*layout_name
= NULL
;
319 gchar
*hardkey_str
= NULL
;
322 /* Required fields. */
323 if (!irreco_keyfile_get_str(keyfile
, "layout", &layout_name
) ||
324 !irreco_keyfile_get_int(keyfile
, "chain-id", &id
) ||
325 !irreco_keyfile_get_uint(keyfile
, "key-value", &keyval
)) {
331 if (!irreco_string_table_get(irreco_data
->irreco_layout_array
,
332 layout_name
, (gpointer
*) &layout
)) {
333 IRRECO_ERROR("Hardkey uses unknown layout \"%s\"\n",
340 hardkey_str
= irreco_hardkey_to_str(keyval
);
341 IRRECO_PRINTF("Associating layout \"%s\" hardkey \"%s\" with "
342 "command chain \"%i\".\n",
343 irreco_button_layout_get_name(layout
),
347 irreco_hardkey_map_assosiate_chain_with_id(layout
->hardkey_map
,
356 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
358 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
361 * @name Layout saving
368 * Since GKeyFile does not allow two groups with the same name,
369 * layout_index and button_index variables are used to make sure that each
370 * button and layout group has unique name. The index is ignored when reading
373 gboolean
irreco_config_save_layouts(IrrecoData
* irreco_data
)
375 gint button_index
= 1;
376 gint command_index
= 1;
377 gint hardkey_index
= 1;
379 IrrecoStringTable
*table
;
385 /* TODO Sami FIXME */
386 /* Remover 'cause goes to wrong file (I guess) */
387 /*irreco_cmd_chain_manager_to_config(irreco_data->cmd_chain_manager);*/
389 table
= irreco_data
->irreco_layout_array
;
390 IRRECO_STRING_TABLE_FOREACH(table
, key
, IrrecoButtonLayout
*, layout
)
392 keyfile
= g_key_file_new();
393 irreco_config_save_layout_to_keyfile(keyfile
,
399 filename
= irreco_create_uniq_layout_filename(
400 layout
->filename
->str
);
401 g_string_assign(layout
->filename
, filename
);
403 list
= g_list_prepend(list
, g_strdup(filename
));
405 IRRECO_DEBUG("Layout %s in file: %s\n",
407 layout
->filename
->str
);
409 success
= irreco_gkeyfile_write_to_config_file(keyfile
, "irreco",
411 g_key_file_free(keyfile
);
413 IRRECO_STRING_TABLE_FOREACH_END
415 /* Remove unused layouts afterwards */
416 irreco_remove_layouts_exept_glist(list
);
419 IRRECO_RETURN_BOOL(success
);
422 typedef struct _IrrecoConfigSaveHardkeyData IrrecoConfigSaveHardkeyData
;
423 struct _IrrecoConfigSaveHardkeyData
{
426 IrrecoButtonLayout
*layout
;
429 void irreco_config_save_layout_to_keyfile(GKeyFile
* keyfile
,
430 IrrecoButtonLayout
* layout
,
432 gint
* command_index
,
433 gint
* hardkey_index
)
436 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
437 IrrecoConfigSaveHardkeyData hardkey_data
;
441 g_assert(irreco_button_layout_get_name(layout
) != NULL
);
442 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "layout");
443 irreco_gkeyfile_set_string(keyfile
, group
, "name",
444 irreco_button_layout_get_name(layout
));
445 g_key_file_set_integer(keyfile
, group
, "bg-type",
446 irreco_button_layout_get_bg_type(layout
));
447 irreco_gkeyfile_set_string(keyfile
, group
, "bg-image",
448 irreco_button_layout_get_bg_image(layout
));
449 color
= irreco_button_layout_get_bg_color(layout
);
450 g_key_file_set_integer(keyfile
, group
, "bg-color-red", color
->red
);
451 g_key_file_set_integer(keyfile
, group
, "bg-color-green", color
->green
);
452 g_key_file_set_integer(keyfile
, group
, "bg-color-blue", color
->blue
);
455 irreco_button_layout_reindex(layout
);
456 IRRECO_PTR_ARRAY_FORWARDS(layout
->button_array
, IrrecoButton
*, button
)
457 irreco_config_save_button_to_keyfile(keyfile
,
461 *button_index
= *button_index
+ 1;
462 IRRECO_PTR_ARRAY_FORWARDS_END
465 hardkey_data
.keyfile
= keyfile
;
466 hardkey_data
.hardkey_index
= hardkey_index
;
467 hardkey_data
.layout
= layout
;
468 irreco_hardkey_map_chain_foreach(layout
->hardkey_map
,
469 irreco_config_save_hardkey_to_file
,
474 void irreco_config_save_hardkey_to_file(IrrecoHardkeyMap
*hardkey_map
,
476 IrrecoCmdChainId chain_id
,
477 IrrecoCmdChain
*chain
,
480 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
481 IrrecoConfigSaveHardkeyData
*hardkey_data
;
484 hardkey_data
= (IrrecoConfigSaveHardkeyData
*) user_data
;
486 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "hardkey-%i",
487 *hardkey_data
->hardkey_index
);
488 irreco_gkeyfile_set_string(hardkey_data
->keyfile
, group
, "layout",
489 irreco_button_layout_get_name(hardkey_data
->layout
));
490 g_key_file_set_integer(hardkey_data
->keyfile
, group
,
491 "chain-id", chain_id
);
492 irreco_gkeyfile_set_guint(hardkey_data
->keyfile
, group
,
493 "key-value", keyval
);
495 *hardkey_data
->hardkey_index
= *hardkey_data
->hardkey_index
+ 1;
499 void irreco_config_save_button_to_keyfile(GKeyFile
* keyfile
,
500 IrrecoButton
* button
,
502 gint
* command_index
)
504 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
507 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "button-%i", *button_index
);
508 irreco_gkeyfile_set_string(keyfile
, group
, "layout",
509 irreco_button_layout_get_name(button
->irreco_layout
));
510 irreco_gkeyfile_set_string(keyfile
, group
, "title", button
->title
);
511 g_key_file_set_integer(keyfile
, group
, "index", button
->index
);
512 g_key_file_set_integer(keyfile
, group
, "command-chain-id",
513 button
->cmd_chain_id
);
514 g_key_file_set_integer(keyfile
, group
, "x", button
->x
);
515 g_key_file_set_integer(keyfile
, group
, "y", button
->y
);
517 /* It is valid for a button to have NULL style. */
518 if (button
->style
!= NULL
) {
519 irreco_gkeyfile_set_string(keyfile
, group
, "style",
520 button
->style
->style_name
->str
);
530 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
531 /* Save / Read active layout. */
532 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
535 * @name Save / Read active layout
539 gboolean
irreco_config_save_active_layout(IrrecoButtonLayout
* irreco_layout
)
545 keyfile
= g_key_file_new();
546 if (irreco_layout
!= NULL
) {
547 irreco_gkeyfile_set_string(keyfile
, "active-layout", "name",
548 irreco_button_layout_get_name(irreco_layout
));
550 success
= irreco_gkeyfile_write_to_config_file(keyfile
, "irreco",
551 irreco_config_active_layout_file
);
552 g_key_file_free(keyfile
);
553 IRRECO_RETURN_BOOL(success
);
556 IrrecoButtonLayout
*irreco_config_read_active_layout(IrrecoData
* irreco_data
)
558 IrrecoKeyFile
*keyfile
= NULL
;
559 gchar
*config_dir
= NULL
;
560 gchar
*config_file
= NULL
;
562 IrrecoButtonLayout
*irreco_layout
= NULL
;
565 /* Attempt to read layout name, and find layout with the same name. */
566 config_dir
= irreco_get_config_dir("irreco");
567 config_file
= irreco_get_config_file("irreco",
568 irreco_config_active_layout_file
);
569 keyfile
= irreco_keyfile_create(config_dir
, config_file
, NULL
);
570 if (config_dir
!= NULL
&& config_file
!= NULL
&& keyfile
!= NULL
571 && irreco_keyfile_set_group(keyfile
, "active-layout")
572 && irreco_keyfile_get_str(keyfile
, "name", &name
)) {
574 IRRECO_DEBUG("Read active layout name \"%s\" from \"%s\".\n",
575 name
, irreco_config_active_layout_file
);
577 if (irreco_string_table_get(irreco_data
->irreco_layout_array
,
578 name
, (gpointer
*) &irreco_layout
)){
579 IRRECO_DEBUG("Found matching layout.\n");
581 IRRECO_DEBUG("No matching layout found.\n");
585 irreco_keyfile_destroy(keyfile
);
590 /* If we could not find correct active layout,
591 attempt to get some layout.*/
592 if (irreco_layout
== NULL
) {
593 irreco_string_table_index(irreco_data
->irreco_layout_array
, 0,
594 NULL
, (gpointer
*) &irreco_layout
);
596 IRRECO_RETURN_PTR(irreco_layout
);
603 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
604 /* Save / Read backend configuration. */
605 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
608 * @name Save / Read backend configuration
612 gboolean
irreco_config_save_backends(IrrecoBackendManager
* backend_manager
)
617 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
620 keyfile
= g_key_file_new();
621 IRRECO_BACKEND_MANAGER_FOREACH_INSTANCE(backend_manager
, instance
)
622 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "instance-%i", ++i
);
623 irreco_gkeyfile_set_string(keyfile
, group
, "library",
624 instance
->lib
->filename
);
625 irreco_gkeyfile_set_string(keyfile
, group
, "config",
627 irreco_gkeyfile_set_string(keyfile
, group
, "name",
629 IRRECO_BACKEND_MANAGER_FOREACH_END
631 success
= irreco_gkeyfile_write_to_config_file(keyfile
, "irreco",
632 irreco_config_backend_file
);
633 g_key_file_free(keyfile
);
634 IRRECO_RETURN_BOOL(success
);
637 gboolean
irreco_config_read_backends(IrrecoBackendManager
* manager
)
640 IrrecoKeyFile
*keyfile
= NULL
;
641 gchar
*config_dir
= NULL
;
642 gchar
*config_file
= NULL
;
643 gchar
** groups
= NULL
;
644 gsize group_count
= 0;
647 config_dir
= irreco_get_config_dir("irreco");
648 config_file
= irreco_get_config_file("irreco",
649 irreco_config_backend_file
);
650 keyfile
= irreco_keyfile_create(config_dir
, config_file
, NULL
);
651 if (config_dir
== NULL
|| config_file
== NULL
|| keyfile
== NULL
) {
654 irreco_keyfile_destroy(keyfile
);
655 IRRECO_RETURN_BOOL(FALSE
);
658 IRRECO_PRINTF("Reading backend configuration file \"%s\"\n",
660 groups
= g_key_file_get_groups(keyfile
->keyfile
, &group_count
);
662 /* Read instances. */
663 for (i
= 0; i
< group_count
; i
++) {
664 gchar
*group
= groups
[i
];
665 if (g_str_has_prefix(group
, "instance")) {
666 IRRECO_PRINTF("Reading instance group \"%s\"\n", group
);
667 irreco_keyfile_set_group(keyfile
, group
);
668 irreco_config_read_backend_from_keyfile(manager
,
674 irreco_keyfile_destroy(keyfile
);
677 IRRECO_RETURN_BOOL(TRUE
);
680 void irreco_config_read_backend_from_keyfile(IrrecoBackendManager
* manager
,
681 IrrecoKeyFile
* keyfile
)
683 gchar
*library
= NULL
;
684 gchar
*config
= NULL
;
686 IrrecoBackendLib
*lib
;
689 /* Read variables. */
690 if (!irreco_keyfile_get_str(keyfile
, "library", &library
) ||
691 !irreco_keyfile_get_str(keyfile
, "config", &config
) ||
692 !irreco_keyfile_get_str(keyfile
, "name", &name
)) {
700 if (!irreco_backend_manager_find_lib(manager
, library
, &lib
)) {
701 IRRECO_ERROR("Cannot find backend library \"%s\"\n", library
);
709 /* Create instance. */
710 irreco_backend_manager_create_instance(manager
, lib
, name
, config
);
721 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
722 /* Misc layout functions */
723 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
726 * @name Misc layout functions
731 * Get list of themes used by layout
733 * @param data IrrecoData
734 * @param layoutname name of layout
735 * @param list StringTable that'll contain theme names (key) and versions (data)
736 * @returns TRUE in case of success, FALSE otherwise
738 gboolean
irreco_layout_get_themes(IrrecoData
*data
,
740 IrrecoStringTable
**list
)
742 IrrecoStringTable
*themelist
= NULL
;
743 gchar
*bgpath
= NULL
;
747 /* List of theme names used by layout, stored as keys */
748 *list
= irreco_string_table_new(NULL
, NULL
);
749 /* List of all themes */
750 themelist
= irreco_theme_manager_get_themes(data
->theme_manager
);
752 if(irreco_string_table_lenght(data
->irreco_layout_array
) == 0) {
753 IRRECO_RETURN_BOOL(FALSE
);
756 /* Loop through layout buttons and store used themes to list */
757 IRRECO_STRING_TABLE_FOREACH(data
->irreco_layout_array
,
759 IrrecoButtonLayout
*,
761 /* Skip layouts with wrong name */
762 if(g_str_equal(layoutname
, layout
->name
->str
)) {
763 if(layout
->background_type
== 2) {
764 bgpath
= g_strdup(layout
->background_image
->str
);
766 IRRECO_PTR_ARRAY_FORWARDS(layout
->button_array
,
769 /* Block buttons without theme */
770 if(irreco_button
->style
!= NULL
) {
771 gboolean match
= FALSE
;
772 IRRECO_STRING_TABLE_FOREACH_KEY(*list
, themename
)
774 irreco_button
->style
->theme_name
->str
,
778 IRRECO_STRING_TABLE_FOREACH_END
780 irreco_string_table_add(*list
,
781 irreco_button
->style
->theme_name
->str
,
785 IRRECO_PTR_ARRAY_BACKWARDS_END
787 IRRECO_STRING_TABLE_FOREACH_END
789 /* Loop through themes and get versions of wanted themes */
790 IRRECO_STRING_TABLE_FOREACH(themelist
, key
, IrrecoTheme
*, theme
)
791 IRRECO_STRING_TABLE_FOREACH(theme
->backgrounds
,
796 if(g_str_equal(bgtheme
->image_path
->str
, bgpath
)) {
797 gboolean match
= FALSE
;
798 /* Matching theme found for bg */
799 IRRECO_STRING_TABLE_FOREACH_KEY(*list
, themename
)
800 if(g_str_equal(theme
->name
->str
,
804 IRRECO_STRING_TABLE_FOREACH_END
806 irreco_string_table_add(*list
,
811 IRRECO_STRING_TABLE_FOREACH_END
812 IRRECO_STRING_TABLE_FOREACH_KEY(*list
, themename
)
813 if(g_str_equal(themename
, theme
->name
->str
)) {
814 irreco_string_table_change_data(*list
, themename
, theme
->version
->str
);
816 IRRECO_STRING_TABLE_FOREACH_END
817 IRRECO_STRING_TABLE_FOREACH_END
821 IRRECO_RETURN_BOOL(TRUE
);