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";
49 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
51 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
53 void irreco_config_read_style_from_keyfile(IrrecoData
* irreco_data
,
54 IrrecoKeyFile
*keyfile
,
57 void irreco_config_read_button_from_keyfile(IrrecoData
* irreco_data
,
58 IrrecoKeyFile
* keyfile
);
59 void irreco_config_read_hardkey_from_keyfile(IrrecoData
* irreco_data
,
60 IrrecoKeyFile
* keyfile
);
61 void irreco_config_read_layout_from_keyfile(IrrecoData
* irreco_data
,
62 IrrecoKeyFile
* keyfile
);
63 void irreco_config_read_command_from_keyfile(IrrecoData
* irreco_data
,
64 IrrecoKeyFile
* keyfile
);
65 void irreco_config_save_layout_to_keyfile(GKeyFile
* keyfile
,
66 IrrecoButtonLayout
* layout
,
70 gint
* hardkey_index
);
71 void irreco_config_save_hardkey_to_file(IrrecoHardkeyMap
*hardkey_map
,
73 IrrecoCmdChainId chain_id
,
74 IrrecoCmdChain
*chain
,
76 void irreco_config_save_button_to_keyfile(GKeyFile
* keyfile
,
77 IrrecoButton
* button
,
79 gint
* command_index
);
80 void irreco_config_save_cmd_chain_to_keyfile(GKeyFile
* keyfile
,
81 IrrecoButton
* button
,
82 gint
* command_index
);
83 void irreco_config_read_backend_from_keyfile(
84 IrrecoBackendManager
* backend_manager
,
85 IrrecoKeyFile
* keyfile
);
89 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
91 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
94 * @name Layout reading
99 void irreco_config_read_styles_from_dir_foreach(IrrecoDirForeachData
* dir_data
)
101 IrrecoData
* irreco_data
= (IrrecoData
*) dir_data
->user_data_1
;
102 IrrecoKeyFile
*keyfile
;
105 keyfile
= irreco_keyfile_create(dir_data
->directory
,
108 if (keyfile
!= NULL
) {
109 irreco_config_read_style_from_keyfile(irreco_data
, keyfile
,
111 irreco_keyfile_destroy(keyfile
);
118 * Reads buttons-folder inside themefolder
120 * This function uses irreco_dir_foreach() which calls
121 * irreco_config_read_styles_from_dir_foreach()
124 void irreco_config_read_buttons_from_dir_foreach(IrrecoDirForeachData
* dir_data
)
126 IrrecoDirForeachData button_styles
;
127 GString
* directory
= g_string_new("");
130 g_string_printf(directory
, "%s/buttons/", dir_data
->filepath
);
131 IRRECO_DEBUG("Directory = %s\n", directory
->str
);
132 button_styles
.directory
= directory
->str
;
134 button_styles
.filesuffix
= "bstyleconf";
135 button_styles
.user_data_1
= dir_data
->user_data_1
;
137 irreco_dir_foreach_subdirectories(&button_styles
,
138 irreco_config_read_styles_from_dir_foreach
);
140 g_string_free(directory
, TRUE
);
148 * Reads configs from subdirectories ONLY
151 void irreco_config_read_styles_from_dir(IrrecoData * irreco_data,
154 IrrecoDirForeachData dir_data;
157 dir_data.directory = dir;
158 dir_data.filesuffix = ".bstyleconf";
159 dir_data.user_data_1 = irreco_data;
160 irreco_dir_foreach_subdirectories(&dir_data,
161 irreco_config_read_styles_from_dir_foreach);
168 * Reads themefolders from subdirectories
170 * This function uses irreco_dir_foreach() which calls
171 * irreco_config_read_buttons_from_dir_foreach()
174 void irreco_config_read_themes_from_dir(IrrecoData
* irreco_data
,
177 IrrecoDirForeachData dir_data
;
180 dir_data
.directory
= dir
;
181 dir_data
.filesuffix
= "";
182 dir_data
.user_data_1
= irreco_data
;
183 irreco_dir_foreach(&dir_data
,
184 irreco_config_read_buttons_from_dir_foreach
);
190 void irreco_config_read_style_from_file(IrrecoData
* irreco_data
,
194 IrrecoKeyFile
*keyfile
;
197 dir
= g_path_get_dirname(file
);
198 keyfile
= irreco_keyfile_create(dir
, file
, "button-style");
199 if (keyfile
!= NULL
) {
200 irreco_config_read_style_from_keyfile(irreco_data
, keyfile
,
202 irreco_keyfile_destroy(keyfile
);
209 gboolean
irreco_config_read_layouts(IrrecoData
* irreco_data
)
212 IrrecoKeyFile
*keyfile
= NULL
;
213 gchar
*config_dir
= NULL
;
214 gchar
*config_file
= NULL
;
215 gchar
** groups
= NULL
;
216 gsize group_count
= 0;
219 config_dir
= irreco_get_config_dir("irreco");
220 config_file
= irreco_get_config_file("irreco",
221 irreco_config_layout_file
);
222 keyfile
= irreco_keyfile_create(config_dir
, config_file
, NULL
);
223 if (config_dir
== NULL
|| config_file
== NULL
|| keyfile
== NULL
) {
226 irreco_keyfile_destroy(keyfile
);
227 IRRECO_RETURN_BOOL(FALSE
);
230 IRRECO_PRINTF("Reading layout configuration file \"%s\"\n",
232 groups
= g_key_file_get_groups(keyfile
->keyfile
, &group_count
);
235 for (i
= 0; i
< group_count
; i
++) {
236 gchar
*group
= groups
[i
];
237 if (g_str_has_prefix(group
, "layout")) {
238 IRRECO_PRINTF("Reading layout group \"%s\"\n", group
);
239 irreco_keyfile_set_group(keyfile
, group
);
240 irreco_config_read_layout_from_keyfile(irreco_data
,
246 for (i
= 0; i
< group_count
; i
++) {
247 gchar
*group
= groups
[i
];
248 if (g_str_has_prefix(group
, "button")) {
249 IRRECO_PRINTF("Reading button group \"%s\"\n", group
);
250 irreco_keyfile_set_group(keyfile
, group
);
251 irreco_config_read_button_from_keyfile(irreco_data
,
257 for (i
= 0; i
< group_count
; i
++) {
258 gchar
*group
= groups
[i
];
259 if (g_str_has_prefix(group
, "hardkey")) {
260 IRRECO_PRINTF("Reading hardkey group \"%s\"\n", group
);
261 irreco_keyfile_set_group(keyfile
, group
);
262 irreco_config_read_hardkey_from_keyfile(irreco_data
,
268 * Read LEGACY command group configuration.
271 gchar
*chain_config
= irreco_get_config_file(
272 "irreco", irreco_config_cmd_chain_file
);
273 if (irreco_file_exists(chain_config
) == FALSE
) {
274 for (i
= 0; i
< group_count
; i
++) {
275 gchar
*group
= groups
[i
];
276 if (g_str_has_prefix(group
, "command")) {
277 IRRECO_PRINTF("Reading command group \"%s\"\n",
279 irreco_keyfile_set_group(keyfile
, group
);
280 irreco_config_read_command_from_keyfile(
281 irreco_data
, keyfile
);
285 g_free(chain_config
);
288 /* Read command chains. */
289 irreco_cmd_chain_manager_from_config(irreco_data
);
292 irreco_keyfile_destroy(keyfile
);
295 IRRECO_RETURN_BOOL(TRUE
);
298 void irreco_config_read_layout_from_keyfile(IrrecoData
* irreco_data
,
299 IrrecoKeyFile
* keyfile
)
302 IrrecoButtonLayout
*layout
= NULL
;
308 /* Required fields. */
309 if (!irreco_keyfile_get_str(keyfile
, "name", &name
)) IRRECO_RETURN
310 layout
= irreco_button_layout_create(NULL
,
311 irreco_data
->cmd_chain_manager
);
312 irreco_button_layout_set_name(layout
, name
);
316 if (irreco_keyfile_get_int(keyfile
, "bg-type", &type
)) {
318 case IRRECO_BACKGROUND_DEFAULT
:
319 case IRRECO_BACKGROUND_COLOR
:
320 case IRRECO_BACKGROUND_IMAGE
:
321 irreco_button_layout_set_bg_type(layout
, type
);
325 IRRECO_ERROR("Unknown background type \"%i\".\n",
331 if (irreco_keyfile_get_str(keyfile
, "bg-image", &image
)) {
332 irreco_button_layout_set_bg_image(layout
, image
);
338 if (irreco_keyfile_get_uint16(keyfile
, "bg-color-red", &color
.red
) &&
339 irreco_keyfile_get_uint16(keyfile
, "bg-color-green", &color
.green
)&&
340 irreco_keyfile_get_uint16(keyfile
, "bg-color-blue", &color
.blue
)) {
341 irreco_button_layout_set_bg_color(layout
, &color
);
344 if (!irreco_string_table_add(irreco_data
->irreco_layout_array
,
345 irreco_button_layout_get_name(layout
),
347 IRRECO_ERROR("Layout \"%s\" already exists.",
348 irreco_button_layout_get_name(layout
));
349 irreco_button_layout_destroy(layout
);
355 void irreco_config_read_button_from_keyfile(IrrecoData
* irreco_data
,
356 IrrecoKeyFile
* keyfile
)
358 gchar
*layout_name
= NULL
;
359 gchar
*style_name
= NULL
;
361 gchar
*command
= NULL
;
362 IrrecoCmdChainId chain_id
;
366 IrrecoButton
*button
= NULL
;
367 IrrecoButtonLayout
*layout
= NULL
;
368 IrrecoThemeButton
*style
= NULL
;
371 /* Required fields. */
372 if (!irreco_keyfile_get_int(keyfile
, "x", &x
) ||
373 !irreco_keyfile_get_int(keyfile
, "y", &y
) ||
374 !irreco_keyfile_get_str(keyfile
, "layout", &layout_name
)) {
377 IRRECO_PRINTF("Position: x%i y%i\n", x
, y
);
380 if (!irreco_string_table_get(irreco_data
->irreco_layout_array
,
381 layout_name
, (gpointer
*) &layout
)) {
382 IRRECO_ERROR("Button uses unknown layout \"%s\"\n",
388 IRRECO_PRINTF("Style: \"%s\"\n",
389 irreco_button_layout_get_name(layout
));
392 irreco_keyfile_get_str(keyfile
, "style", &style_name
);
393 if (style_name
!= NULL
) {
394 if (irreco_theme_manager_get_button_style(
395 irreco_data
->theme_manager
,
396 style_name
, &style
)) {
398 IRRECO_PRINTF("Style: \"%s\"\n", style
->name
->str
);
400 IRRECO_ERROR("Button uses unknown style \"%s\"\n",
407 /* Get title and command. */
408 irreco_keyfile_get_str(keyfile
, "title", &title
);
409 IRRECO_PRINTF("title: \"%s\"\n", title
);
411 button
= irreco_button_create(layout
, x
, y
, title
, style
,
412 irreco_data
->cmd_chain_manager
);
414 if (irreco_keyfile_get_int(keyfile
, "command-chain-id", &chain_id
)) {
415 irreco_button_set_cmd_chain_id(button
, chain_id
);
423 void irreco_config_read_hardkey_from_keyfile(IrrecoData
* irreco_data
,
424 IrrecoKeyFile
* keyfile
)
426 IrrecoButtonLayout
*layout
= NULL
;
427 gchar
*layout_name
= NULL
;
430 gchar
*hardkey_str
= NULL
;
433 /* Required fields. */
434 if (!irreco_keyfile_get_str(keyfile
, "layout", &layout_name
) ||
435 !irreco_keyfile_get_int(keyfile
, "chain-id", &id
) ||
436 !irreco_keyfile_get_uint(keyfile
, "key-value", &keyval
)) {
442 if (!irreco_string_table_get(irreco_data
->irreco_layout_array
,
443 layout_name
, (gpointer
*) &layout
)) {
444 IRRECO_ERROR("Hardkey uses unknown layout \"%s\"\n",
451 hardkey_str
= irreco_hardkey_to_str(keyval
);
452 IRRECO_PRINTF("Associating layout \"%s\" hardkey \"%s\" with "
453 "command chain \"%i\".\n",
454 irreco_button_layout_get_name(layout
),
458 irreco_hardkey_map_assosiate_chain_with_id(layout
->hardkey_map
,
464 * Support LEGACY configuration.
466 * This still exists in order to read layout configs from old versions of
469 * TODO: Remove sometime next year.
471 void irreco_config_read_command_from_keyfile(IrrecoData
* irreco_data
,
472 IrrecoKeyFile
* keyfile
)
476 gchar
*layout_name
= NULL
;
477 gchar
*type_name
= NULL
;
480 IrrecoButton
*button
;
481 IrrecoButtonLayout
*layout
;
484 if (!irreco_keyfile_get_str(keyfile
, "layout", &layout_name
) ||
485 !irreco_keyfile_get_str(keyfile
, "type", &type_name
) ||
486 !irreco_keyfile_get_int(keyfile
, "button", &button_index
)) {
492 /* Convert type name to type ID. */
493 if ((type
= irreco_cmd_str_to_type(type_name
)) == -1) {
494 IRRECO_ERROR("Unknown command type \"%s\"\n", type_name
);
502 if (!irreco_string_table_get(irreco_data
->irreco_layout_array
,
503 layout_name
, (gpointer
*) &layout
)) {
504 IRRECO_ERROR("Unknown layout \"%s\"\n", layout_name
);
511 if (button_index
>= layout
->button_array
->len
) {
512 IRRECO_ERROR("Invalid button index \"%i\"\n", button_index
);
515 button
= g_ptr_array_index(layout
->button_array
, button_index
);
517 /* Append command to button command chain. */
519 case IRRECO_COMMAND_NONE
:
520 case IRRECO_COMMAND_NEXT_REMOTE
:
521 case IRRECO_COMMAND_PREVIOUS_REMOTE
:
522 case IRRECO_COMMAND_FULLSCREEN_TOGGLE
:
523 command
= irreco_cmd_create();
524 irreco_cmd_set_builtin(command
, type
);
525 irreco_cmd_chain_append(irreco_button_get_cmd_chain(button
),
529 case IRRECO_COMMAND_BACKEND
: {
530 gchar
*instance_name
= NULL
;
531 gchar
*device_name
= NULL
;
532 gchar
*command_name
= NULL
;
533 IrrecoBackendInstance
* backend_instance
;
535 if (!irreco_keyfile_get_str(keyfile
, "instance-name",
537 !irreco_keyfile_get_str(keyfile
, "device-name",
539 !irreco_keyfile_get_str(keyfile
, "command-name",
541 g_free(instance_name
);
543 g_free(command_name
);
547 if (!irreco_backend_manager_find_instance(
548 irreco_data
->irreco_backend_manager
,
550 &backend_instance
)) {
551 IRRECO_ERROR("Could not find instance with name "
552 "\"%s\"\n", instance_name
);
555 command
= irreco_cmd_create();
556 irreco_cmd_set_backend(command
,
560 irreco_cmd_chain_append(irreco_button_get_cmd_chain(button
),
563 g_free(instance_name
);
565 g_free(command_name
);
568 case IRRECO_COMMAND_SHOW_LAYOUT
: {
570 if (!irreco_keyfile_get_str(keyfile
, "show-layout",
575 command
= irreco_cmd_create();
576 irreco_cmd_set_layout(command
, show_layout
);
577 irreco_cmd_chain_append(irreco_button_get_cmd_chain(button
),
582 case IRRECO_COMMAND_WAIT
: {
584 if (!irreco_keyfile_get_uint(keyfile
, "delay", &delay
)) {
588 command
= irreco_cmd_create();
589 irreco_cmd_set_wait(command
, delay
);
590 irreco_cmd_chain_append(irreco_button_get_cmd_chain(button
),
603 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
605 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
608 * @name Layout saving
615 * Since GKeyFile does not allow two groups with the same name,
616 * layout_index and button_index variables are used to make sure that each
617 * button and layout group has unique name. The index is ignored when reading
620 gboolean
irreco_config_save_layouts(IrrecoData
* irreco_data
)
622 gint layout_index
= 1;
623 gint button_index
= 1;
624 gint command_index
= 1;
625 gint hardkey_index
= 1;
627 IrrecoStringTable
*table
;
631 irreco_cmd_chain_manager_to_config(irreco_data
->cmd_chain_manager
);
633 keyfile
= g_key_file_new();
634 table
= irreco_data
->irreco_layout_array
;
635 IRRECO_STRING_TABLE_FOREACH(table
, key
, IrrecoButtonLayout
*, layout
)
636 irreco_config_save_layout_to_keyfile(keyfile
,
643 IRRECO_STRING_TABLE_FOREACH_END
645 success
= irreco_gkeyfile_write_to_config_file(keyfile
, "irreco",
646 irreco_config_layout_file
);
647 g_key_file_free(keyfile
);
648 IRRECO_RETURN_BOOL(success
);
651 typedef struct _IrrecoConfigSaveHardkeyData IrrecoConfigSaveHardkeyData
;
652 struct _IrrecoConfigSaveHardkeyData
{
655 IrrecoButtonLayout
*layout
;
658 void irreco_config_save_layout_to_keyfile(GKeyFile
* keyfile
,
659 IrrecoButtonLayout
* layout
,
662 gint
* command_index
,
663 gint
* hardkey_index
)
666 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
667 IrrecoConfigSaveHardkeyData hardkey_data
;
671 g_assert(irreco_button_layout_get_name(layout
) != NULL
);
672 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "layout-%i", *layout_index
);
673 irreco_gkeyfile_set_string(keyfile
, group
, "name",
674 irreco_button_layout_get_name(layout
));
675 g_key_file_set_integer(keyfile
, group
, "bg-type",
676 irreco_button_layout_get_bg_type(layout
));
677 irreco_gkeyfile_set_string(keyfile
, group
, "bg-image",
678 irreco_button_layout_get_bg_image(layout
));
679 color
= irreco_button_layout_get_bg_color(layout
);
680 g_key_file_set_integer(keyfile
, group
, "bg-color-red", color
->red
);
681 g_key_file_set_integer(keyfile
, group
, "bg-color-green", color
->green
);
682 g_key_file_set_integer(keyfile
, group
, "bg-color-blue", color
->blue
);
685 irreco_button_layout_reindex(layout
);
686 IRRECO_PTR_ARRAY_FORWARDS(layout
->button_array
, IrrecoButton
*, button
)
687 irreco_config_save_button_to_keyfile(keyfile
,
691 *button_index
= *button_index
+ 1;
692 IRRECO_PTR_ARRAY_FORWARDS_END
695 hardkey_data
.keyfile
= keyfile
;
696 hardkey_data
.hardkey_index
= hardkey_index
;
697 hardkey_data
.layout
= layout
;
698 irreco_hardkey_map_chain_foreach(layout
->hardkey_map
,
699 irreco_config_save_hardkey_to_file
,
704 void irreco_config_save_hardkey_to_file(IrrecoHardkeyMap
*hardkey_map
,
706 IrrecoCmdChainId chain_id
,
707 IrrecoCmdChain
*chain
,
710 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
711 IrrecoConfigSaveHardkeyData
*hardkey_data
;
714 hardkey_data
= (IrrecoConfigSaveHardkeyData
*) user_data
;
716 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "hardkey-%i",
717 *hardkey_data
->hardkey_index
);
718 irreco_gkeyfile_set_string(hardkey_data
->keyfile
, group
, "layout",
719 irreco_button_layout_get_name(hardkey_data
->layout
));
720 g_key_file_set_integer(hardkey_data
->keyfile
, group
,
721 "chain-id", chain_id
);
722 irreco_gkeyfile_set_guint(hardkey_data
->keyfile
, group
,
723 "key-value", keyval
);
725 *hardkey_data
->hardkey_index
= *hardkey_data
->hardkey_index
+ 1;
729 void irreco_config_save_button_to_keyfile(GKeyFile
* keyfile
,
730 IrrecoButton
* button
,
732 gint
* command_index
)
734 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
737 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "button-%i", *button_index
);
738 irreco_gkeyfile_set_string(keyfile
, group
, "layout",
739 irreco_button_layout_get_name(button
->irreco_layout
));
740 irreco_gkeyfile_set_string(keyfile
, group
, "title", button
->title
);
741 g_key_file_set_integer(keyfile
, group
, "index", button
->index
);
742 g_key_file_set_integer(keyfile
, group
, "command-chain-id",
743 button
->cmd_chain_id
);
744 g_key_file_set_integer(keyfile
, group
, "x", button
->x
);
745 g_key_file_set_integer(keyfile
, group
, "y", button
->y
);
747 /* It is valid for a button to have NULL style. */
748 if (button
->style
!= NULL
) {
749 irreco_gkeyfile_set_string(keyfile
, group
, "style",
750 button
->style
->style_name
->str
);
760 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
761 /* Save / Read active layout. */
762 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
765 * @name Save / Read active layout
769 gboolean
irreco_config_save_active_layout(IrrecoButtonLayout
* irreco_layout
)
775 keyfile
= g_key_file_new();
776 if (irreco_layout
!= NULL
) {
777 irreco_gkeyfile_set_string(keyfile
, "active-layout", "name",
778 irreco_button_layout_get_name(irreco_layout
));
780 success
= irreco_gkeyfile_write_to_config_file(keyfile
, "irreco",
781 irreco_config_active_layout_file
);
782 g_key_file_free(keyfile
);
783 IRRECO_RETURN_BOOL(success
);
786 IrrecoButtonLayout
*irreco_config_read_active_layout(IrrecoData
* irreco_data
)
788 IrrecoKeyFile
*keyfile
= NULL
;
789 gchar
*config_dir
= NULL
;
790 gchar
*config_file
= NULL
;
792 IrrecoButtonLayout
*irreco_layout
= NULL
;
795 /* Attempt to read layout name, and find layout with the same name. */
796 config_dir
= irreco_get_config_dir("irreco");
797 config_file
= irreco_get_config_file("irreco",
798 irreco_config_active_layout_file
);
799 keyfile
= irreco_keyfile_create(config_dir
, config_file
, NULL
);
800 if (config_dir
!= NULL
&& config_file
!= NULL
&& keyfile
!= NULL
801 && irreco_keyfile_set_group(keyfile
, "active-layout")
802 && irreco_keyfile_get_str(keyfile
, "name", &name
)) {
804 IRRECO_DEBUG("Read active layout name \"%s\" from \"%s\".\n",
805 name
, irreco_config_active_layout_file
);
807 if (irreco_string_table_get(irreco_data
->irreco_layout_array
,
808 name
, (gpointer
*) &irreco_layout
)){
809 IRRECO_DEBUG("Found matching layout.\n");
811 IRRECO_DEBUG("No matching layout found.\n");
815 irreco_keyfile_destroy(keyfile
);
820 /* If we could not find correct active layout,
821 attempt to get some layout.*/
822 if (irreco_layout
== NULL
) {
823 irreco_string_table_index(irreco_data
->irreco_layout_array
, 0,
824 NULL
, (gpointer
*) &irreco_layout
);
826 IRRECO_RETURN_PTR(irreco_layout
);
833 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
834 /* Save / Read backend configuration. */
835 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
838 * @name Save / Read backend configuration
842 gboolean
irreco_config_save_backends(IrrecoBackendManager
* backend_manager
)
847 gchar group
[IRRECO_CONFIG_GROUP_LEN
];
850 keyfile
= g_key_file_new();
851 IRRECO_BACKEND_MANAGER_FOREACH_INSTANCE(backend_manager
, instance
)
852 g_snprintf(group
, IRRECO_CONFIG_GROUP_LEN
, "instance-%i", ++i
);
853 irreco_gkeyfile_set_string(keyfile
, group
, "library",
854 instance
->lib
->filename
);
855 irreco_gkeyfile_set_string(keyfile
, group
, "config",
857 irreco_gkeyfile_set_string(keyfile
, group
, "name",
859 IRRECO_BACKEND_MANAGER_FOREACH_END
861 success
= irreco_gkeyfile_write_to_config_file(keyfile
, "irreco",
862 irreco_config_backend_file
);
863 g_key_file_free(keyfile
);
864 IRRECO_RETURN_BOOL(success
);
867 gboolean
irreco_config_read_backends(IrrecoBackendManager
* manager
)
870 IrrecoKeyFile
*keyfile
= NULL
;
871 gchar
*config_dir
= NULL
;
872 gchar
*config_file
= NULL
;
873 gchar
** groups
= NULL
;
874 gsize group_count
= 0;
877 config_dir
= irreco_get_config_dir("irreco");
878 config_file
= irreco_get_config_file("irreco",
879 irreco_config_backend_file
);
880 keyfile
= irreco_keyfile_create(config_dir
, config_file
, NULL
);
881 if (config_dir
== NULL
|| config_file
== NULL
|| keyfile
== NULL
) {
884 irreco_keyfile_destroy(keyfile
);
885 IRRECO_RETURN_BOOL(FALSE
);
888 IRRECO_PRINTF("Reading backend configuration file \"%s\"\n",
890 groups
= g_key_file_get_groups(keyfile
->keyfile
, &group_count
);
892 /* Read instances. */
893 for (i
= 0; i
< group_count
; i
++) {
894 gchar
*group
= groups
[i
];
895 if (g_str_has_prefix(group
, "instance")) {
896 IRRECO_PRINTF("Reading instance group \"%s\"\n", group
);
897 irreco_keyfile_set_group(keyfile
, group
);
898 irreco_config_read_backend_from_keyfile(manager
,
904 irreco_keyfile_destroy(keyfile
);
907 IRRECO_RETURN_BOOL(TRUE
);
910 void irreco_config_read_backend_from_keyfile(IrrecoBackendManager
* manager
,
911 IrrecoKeyFile
* keyfile
)
913 gchar
*library
= NULL
;
914 gchar
*config
= NULL
;
916 IrrecoBackendLib
*lib
;
919 /* Read variables. */
920 if (!irreco_keyfile_get_str(keyfile
, "library", &library
) ||
921 !irreco_keyfile_get_str(keyfile
, "config", &config
) ||
922 !irreco_keyfile_get_str(keyfile
, "name", &name
)) {
930 if (!irreco_backend_manager_find_lib(manager
, library
, &lib
)) {
931 IRRECO_ERROR("Cannot find backend library \"%s\"\n", library
);
939 /* Create instance. */
940 irreco_backend_manager_create_instance(manager
, lib
, name
, config
);