nkeynes@450: /** nkeynes@561: * $Id$ nkeynes@450: * nkeynes@450: * User configuration support nkeynes@450: * nkeynes@450: * Copyright (c) 2005 Nathan Keynes. nkeynes@450: * nkeynes@450: * This program is free software; you can redistribute it and/or modify nkeynes@450: * it under the terms of the GNU General Public License as published by nkeynes@450: * the Free Software Foundation; either version 2 of the License, or nkeynes@450: * (at your option) any later version. nkeynes@450: * nkeynes@450: * This program is distributed in the hope that it will be useful, nkeynes@450: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@450: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@450: * GNU General Public License for more details. nkeynes@450: */ nkeynes@450: nkeynes@450: #ifndef lxdream_config_H nkeynes@450: #define lxdream_config_H 1 nkeynes@450: nkeynes@450: #include nkeynes@1034: #include nkeynes@1072: #include "lxdream.h" nkeynes@755: #include "gettext.h" nkeynes@450: nkeynes@736: #ifdef __cplusplus nkeynes@736: extern "C" { nkeynes@736: #endif nkeynes@736: nkeynes@1072: #define CONFIG_MAX_KEYS 24 nkeynes@1072: nkeynes@450: #define CONFIG_TYPE_NONE 0 nkeynes@450: #define CONFIG_TYPE_FILE 1 nkeynes@450: #define CONFIG_TYPE_PATH 2 nkeynes@450: #define CONFIG_TYPE_KEY 3 nkeynes@1034: #define CONFIG_TYPE_FILELIST 4 nkeynes@1038: #define CONFIG_TYPE_INTEGER 5 nkeynes@1144: #define CONFIG_TYPE_BOOLEAN 6 nkeynes@450: nkeynes@450: #define DEFAULT_CONFIG_FILENAME "lxdreamrc" nkeynes@450: nkeynes@450: typedef struct lxdream_config_entry { nkeynes@450: const gchar *key; nkeynes@724: const gchar *label; // i18n nkeynes@1072: int type; nkeynes@450: const gchar *default_value; nkeynes@1072: uint32_t tag; nkeynes@450: gchar *value; nkeynes@450: } *lxdream_config_entry_t; nkeynes@450: nkeynes@1072: struct lxdream_config_group; nkeynes@1072: nkeynes@1072: /** nkeynes@1072: * Callback invoked for key presses (key-up/key-down). nkeynes@1072: */ nkeynes@1072: typedef void (*key_binding_t)( void *data, uint32_t value, uint32_t pressure, gboolean isKeyDown ); nkeynes@1072: nkeynes@1072: /** nkeynes@1072: * Callback invoked immediately before updating a configuration item. nkeynes@1072: * @return FALSE to abort the change (ie invalid value), or TRUE to proceed normally. nkeynes@1072: */ nkeynes@1072: typedef gboolean (*config_change_callback_t)( void *data, struct lxdream_config_group *group, unsigned item, nkeynes@1072: const gchar *oldval, const gchar *newval ); nkeynes@1072: nkeynes@450: typedef struct lxdream_config_group { nkeynes@450: const gchar *key; nkeynes@1072: config_change_callback_t on_change; nkeynes@1072: key_binding_t key_binding; nkeynes@1072: void *data; nkeynes@1072: struct lxdream_config_entry params[CONFIG_MAX_KEYS]; nkeynes@450: } *lxdream_config_group_t; nkeynes@450: nkeynes@450: #define CONFIG_BIOS_PATH 0 nkeynes@450: #define CONFIG_FLASH_PATH 1 nkeynes@450: #define CONFIG_DEFAULT_PATH 2 nkeynes@450: #define CONFIG_SAVE_PATH 3 nkeynes@1034: #define CONFIG_VMU_PATH 4 nkeynes@1034: #define CONFIG_BOOTSTRAP 5 nkeynes@1034: #define CONFIG_GDROM 6 nkeynes@1034: #define CONFIG_RECENT 7 nkeynes@1034: #define CONFIG_VMU 8 nkeynes@1038: #define CONFIG_QUICK_STATE 9 nkeynes@1038: #define CONFIG_KEY_MAX CONFIG_QUICK_STATE nkeynes@450: nkeynes@1072: #define CONFIG_GROUP_GLOBAL 0 nkeynes@1072: #define CONFIG_GROUP_HOTKEYS 2 nkeynes@1072: #define CONFIG_GROUP_SERIAL 3 nkeynes@1072: nkeynes@450: nkeynes@450: /* Global config values */ nkeynes@1036: const gchar *lxdream_get_global_config_value( int key ); nkeynes@1072: struct lxdream_config_group * lxdream_get_config_group( int group ); nkeynes@1036: void lxdream_set_global_config_value( int key, const gchar *value ); nkeynes@1036: nkeynes@1072: void lxdream_register_config_group( const gchar *key, lxdream_config_group_t group ); nkeynes@1072: gboolean lxdream_set_config_value( lxdream_config_group_t group, int key, const gchar *value ); nkeynes@1072: void lxdream_copy_config_group( lxdream_config_group_t dest, lxdream_config_group_t src ); nkeynes@1072: void lxdream_clone_config_group( lxdream_config_group_t dest, lxdream_config_group_t src ); nkeynes@460: nkeynes@1144: gboolean lxdream_get_config_boolean_value( lxdream_config_group_t group, int key ); nkeynes@1144: gboolean lxdream_set_config_boolean_value( lxdream_config_group_t group, int key, gboolean value ); nkeynes@1144: nkeynes@450: /** nkeynes@1036: * Return a fully expanded path value for a key - this performs substitutions nkeynes@1036: * for ~ and simple shell variables ($VAR and ${VAR}) nkeynes@1036: * nkeynes@1036: * The returned string is newly allocated and must be freed by the caller nkeynes@1036: */ nkeynes@1036: gchar *lxdream_get_global_config_path_value( int key ); nkeynes@1036: nkeynes@1036: /** nkeynes@1036: * Set a path value for a key, escaping if necessary to protect against nkeynes@1036: * shell-substitution on the round trip. nkeynes@1036: * nkeynes@1036: * @return the resultant config value. nkeynes@1036: */ nkeynes@1036: const gchar *lxdream_set_global_config_path_value( int key, const gchar *value ); nkeynes@1036: nkeynes@1036: /** nkeynes@1034: * Construct a list of strings for the given config key - The caller is nkeynes@1034: * responsible for freeing the list and its values. nkeynes@1034: */ nkeynes@1034: GList *lxdream_get_global_config_list_value( int key ); nkeynes@1034: nkeynes@1034: /** nkeynes@1034: * Set a config key based on a list of strings. nkeynes@1034: */ nkeynes@1034: void lxdream_set_global_config_list_value( int key, const GList *list ); nkeynes@1034: /** nkeynes@450: * Search the standard locations for the configuration file: nkeynes@450: * $HOME/.lxdreamrc nkeynes@450: * $CWD/lxdreamrc nkeynes@450: * $SYSCONF_DIR/lxdreamrc nkeynes@450: * @return TRUE if the file was found, otherwise FALSE. nkeynes@450: */ nkeynes@450: gboolean lxdream_find_config( ); nkeynes@450: nkeynes@450: /** nkeynes@450: * Set the configuration file filename to the supplied string. nkeynes@450: * The string is copied internally (ie can be released by the nkeynes@450: * caller). nkeynes@450: */ nkeynes@450: void lxdream_set_config_filename( const gchar *filename ); nkeynes@450: nkeynes@450: /** nkeynes@450: * Load the configuration from the previously determined filename. nkeynes@450: */ nkeynes@450: gboolean lxdream_load_config( ); nkeynes@450: nkeynes@450: /** nkeynes@450: * Update the configuration nkeynes@450: */ nkeynes@450: gboolean lxdream_save_config( ); nkeynes@450: nkeynes@1036: /** nkeynes@1038: * Make the user configuration directories if they don't already exist. nkeynes@1038: */ nkeynes@1038: void lxdream_make_config_dir( ); nkeynes@1038: nkeynes@736: #ifdef __cplusplus nkeynes@736: } nkeynes@736: #endif nkeynes@450: nkeynes@450: #endif /* !lxdream_config_H */