📄 st-config-load.c
字号:
/* * Copyright (c) 2002, 2003, 2004 Jean-Yves Lefort * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Jean-Yves Lefort nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include <string.h>#include <stdlib.h>#include <glib/gi18n.h>#include <glib-object.h>#include "sg-parser.h"#include "st-handler.h"#include "st-handler-field.h"#include "st-handlers.h"#include "st-action.h"#include "st-settings.h"#include "st-util.h"/*** type definitions ********************************************************/enum { STATEMENT_OPTIONS = 1, STATEMENT_OPTIONS_VIEW_MENUBAR, /* obsolete */ STATEMENT_OPTIONS_VIEW_TOOLBAR, STATEMENT_OPTIONS_VIEW_TABS, STATEMENT_OPTIONS_VIEW_TAB_ICONS, STATEMENT_OPTIONS_VIEW_STATUSBAR, STATEMENT_OPTIONS_TOOLBAR_THEME, /* obsolete */ STATEMENT_OPTIONS_TOOLBAR_STYLE, STATEMENT_OPTIONS_TOOLBAR_SIZE, STATEMENT_OPTIONS_SAVE_AUTOMATIC, /* obsolete */ STATEMENT_OPTIONS_MAIN_WINDOW_WIDTH, STATEMENT_OPTIONS_MAIN_WINDOW_HEIGHT, STATEMENT_OPTIONS_MAIN_WINDOW_DIVIDER, /* deprecated */ STATEMENT_OPTIONS_WINDOW_WIDTH, /* deprecated */ STATEMENT_OPTIONS_WINDOW_HEIGHT, /* deprecated */ STATEMENT_OPTIONS_WINDOW_DIVIDER, /* deprecated */ STATEMENT_OPTIONS_PREFERENCES_WINDOW_WIDTH, STATEMENT_OPTIONS_PREFERENCES_WINDOW_HEIGHT, STATEMENT_OPTIONS_PREFERENCES_SELECTED_PAGE, STATEMENT_OPTIONS_PREFERENCES_PLUGINS_EXPANDED, STATEMENT_OPTIONS_STREAM_PROPERTIES_WINDOW_WIDTH, STATEMENT_OPTIONS_STREAM_COLUMNS_WINDOW_WIDTH, STATEMENT_OPTIONS_STREAM_COLUMNS_WINDOW_HEIGHT, STATEMENT_OPTIONS_SELECTED_PREFERENCES_PAGE, /* obsolete */ STATEMENT_OPTIONS_PROXY_ENABLED, STATEMENT_OPTIONS_PROXY_TYPE, STATEMENT_OPTIONS_PROXY_URL, /* deprecated */ STATEMENT_OPTIONS_PROXY_SERVER, STATEMENT_OPTIONS_PROXY_PORT, STATEMENT_OPTIONS_PROXY_AUTH_ENABLED, STATEMENT_OPTIONS_PROXY_AUTH_NAME, STATEMENT_OPTIONS_PROXY_AUTH_PASSWORD, STATEMENT_OPTIONS_GALEON_THEMES_ENABLED, /* obsolete */ STATEMENT_OPTIONS_GALEON_THEMES_SYSTEM_DIR, /* obsolete */ STATEMENT_OPTIONS_GALEON_THEMES_USER_DIR, /* obsolete */ STATEMENT_OPTIONS_SELECTED_HANDLER, STATEMENT_OPTIONS_ALWAYS_REFRESH, /* deprecated */ STATEMENT_OPTIONS_ALWAYS_RELOAD, STATEMENT_OPTIONS_FIND_TOKEN, STATEMENT_OPTIONS_FIND_CASE_SENSITIVE, STATEMENT_OPTIONS_FIND_WRAP_AROUND, STATEMENT_OPTIONS_FIND_HISTORY, STATEMENT_OPTIONS_MUSIC_DIR, STATEMENT_ACTION, STATEMENT_ACTION_COMMAND, STATEMENT_ACTION_PROGRAM, /* deprecated */ STATEMENT_HANDLER, STATEMENT_HANDLER_FIELDS_SORT_INDEX, STATEMENT_HANDLER_FIELDS_SORT_ORDER, STATEMENT_HANDLER_PANED_POSITION, STATEMENT_HANDLER_SELECTED_CATEGORY, /* obsolete */ STATEMENT_HANDLER_SELECTED_STREAM, /* obsolete */ STATEMENT_HANDLER_FIELDS_WIDTH, /* deprecated */ STATEMENT_HANDLER_FIELD, STATEMENT_HANDLER_FIELD_VISIBLE, STATEMENT_HANDLER_FIELD_WIDTH, STATEMENT_HANDLER_FIELD_POSITION, STATEMENT_HANDLER_KEY, STATEMENT_HANDLER_EXPANDED_CATEGORIES, /* obsolete */ STATEMENT_HANDLER_SELECTED_STREAMS /* obsolete */};typedef struct{ SGParser *parser; SGParserStatement *statement; char *action; GSList *handlers; STHandler *handler; GSList *handler_field_iter; STHandlerField *handler_field; GParamSpec *handler_config_pspec; char *handler_config_key; GValueArray *handler_config_values;} LoadInfo;/*** constant definitions ****************************************************/static SGParserDefinition config_definitions[] = { { 0, STATEMENT_OPTIONS, "options", TRUE, G_TYPE_NONE }, { /* obsolete */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_VIEW_MENUBAR, "view_menubar", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_VIEW_TOOLBAR, "view_toolbar", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_VIEW_TABS, "view_tabs", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_VIEW_TAB_ICONS, "view_tab_icons", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_VIEW_STATUSBAR, "view_statusbar", FALSE, G_TYPE_BOOLEAN }, { /* obsolete */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_TOOLBAR_THEME, "toolbar_theme", FALSE, G_TYPE_STRING }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_TOOLBAR_STYLE, "toolbar_style", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_TOOLBAR_SIZE, "toolbar_size", FALSE, G_TYPE_INT }, { /* obsolete */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_SAVE_AUTOMATIC, "save_automatic", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_MAIN_WINDOW_WIDTH, "main_window_width", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_MAIN_WINDOW_HEIGHT, "main_window_height", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_MAIN_WINDOW_HEIGHT, "main_window_height", FALSE, G_TYPE_INT }, { /* deprecated */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_MAIN_WINDOW_DIVIDER, "main_window_divider", FALSE, G_TYPE_INT }, { /* deprecated */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_WINDOW_WIDTH, "window_width", FALSE, G_TYPE_INT }, { /* deprecated */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_WINDOW_HEIGHT, "window_height", FALSE, G_TYPE_INT }, { /* deprecated */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_WINDOW_DIVIDER, "window_divider", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PREFERENCES_WINDOW_WIDTH, "preferences_window_width", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PREFERENCES_WINDOW_HEIGHT, "preferences_window_height", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PREFERENCES_SELECTED_PAGE, "preferences_selected_page", FALSE, G_TYPE_STRING }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PREFERENCES_PLUGINS_EXPANDED, "preferences_plugins_expanded", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_STREAM_PROPERTIES_WINDOW_WIDTH, "stream_properties_window_width", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_STREAM_COLUMNS_WINDOW_WIDTH, "stream_columns_window_width", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_STREAM_COLUMNS_WINDOW_HEIGHT, "stream_columns_window_height", FALSE, G_TYPE_INT }, { /* obsolete */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_SELECTED_PREFERENCES_PAGE, "selected_preferences_page", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_ENABLED, "proxy_enabled", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_TYPE, "proxy_type", FALSE, G_TYPE_INT }, { /* deprecated */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_URL, "proxy_url", FALSE, G_TYPE_STRING }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_SERVER, "proxy_server", FALSE, G_TYPE_STRING }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_PORT, "proxy_port", FALSE, G_TYPE_INT }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_AUTH_ENABLED, "proxy_auth_enabled", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_AUTH_NAME, "proxy_auth_name", FALSE, G_TYPE_STRING }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_PROXY_AUTH_PASSWORD, "proxy_auth_password", FALSE, G_TYPE_STRING }, { /* obsolete */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_GALEON_THEMES_ENABLED, "galeon_themes_enabled", FALSE, G_TYPE_INT }, { /* obsolete */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_GALEON_THEMES_SYSTEM_DIR, "galeon_themes_system_dir", FALSE, G_TYPE_STRING }, { /* obsolete */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_GALEON_THEMES_USER_DIR, "galeon_themes_user_dir", FALSE, G_TYPE_STRING }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_SELECTED_HANDLER, "selected_handler", FALSE, G_TYPE_STRING }, { /* deprecated */ STATEMENT_OPTIONS, STATEMENT_OPTIONS_ALWAYS_REFRESH, "always_refresh", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_ALWAYS_RELOAD, "always_reload", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_FIND_TOKEN, "find_token", FALSE, G_TYPE_STRING }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_FIND_CASE_SENSITIVE, "find_case_sensitive", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_FIND_WRAP_AROUND, "find_wrap_around", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_FIND_HISTORY, "find_history", TRUE, G_TYPE_NONE }, { STATEMENT_OPTIONS, STATEMENT_OPTIONS_MUSIC_DIR, "music_dir", FALSE, G_TYPE_STRING }, { 0, STATEMENT_ACTION, "action", TRUE, G_TYPE_STRING }, { STATEMENT_ACTION, STATEMENT_ACTION_COMMAND, "command", FALSE, G_TYPE_STRING }, { /* deprecated */ STATEMENT_ACTION, STATEMENT_ACTION_PROGRAM, "program", FALSE, G_TYPE_STRING }, { 0, STATEMENT_HANDLER, "handler", TRUE, G_TYPE_STRING }, { STATEMENT_HANDLER, STATEMENT_HANDLER_FIELDS_SORT_INDEX, "fields_sort_index", FALSE, G_TYPE_INT }, { STATEMENT_HANDLER, STATEMENT_HANDLER_FIELDS_SORT_ORDER, "fields_sort_order", FALSE, G_TYPE_INT }, { STATEMENT_HANDLER, STATEMENT_HANDLER_PANED_POSITION, "paned_position", FALSE, G_TYPE_INT }, { /* obsolete */ STATEMENT_HANDLER, STATEMENT_HANDLER_SELECTED_CATEGORY, "selected_category", FALSE, G_TYPE_STRING }, { /* obsolete */ STATEMENT_HANDLER, STATEMENT_HANDLER_SELECTED_STREAM, "selected_stream", FALSE, G_TYPE_STRING }, { /* deprecated */ STATEMENT_HANDLER, STATEMENT_HANDLER_FIELDS_WIDTH, "fields_width", TRUE, G_TYPE_NONE }, { STATEMENT_HANDLER, STATEMENT_HANDLER_FIELD, "field", TRUE, G_TYPE_NONE }, { STATEMENT_HANDLER_FIELD, STATEMENT_HANDLER_FIELD_VISIBLE, "visible", FALSE, G_TYPE_BOOLEAN }, { STATEMENT_HANDLER_FIELD, STATEMENT_HANDLER_FIELD_WIDTH, "width", FALSE, G_TYPE_INT }, { STATEMENT_HANDLER_FIELD, STATEMENT_HANDLER_FIELD_POSITION, "position", FALSE, G_TYPE_INT }, { STATEMENT_HANDLER, STATEMENT_HANDLER_KEY, "key", TRUE, G_TYPE_STRING }, { /* obsolete */ STATEMENT_HANDLER, STATEMENT_HANDLER_EXPANDED_CATEGORIES, "expanded_categories", TRUE, G_TYPE_NONE }, { /* obsolete */ STATEMENT_HANDLER, STATEMENT_HANDLER_SELECTED_STREAMS, "selected_streams", TRUE, G_TYPE_NONE }, { 0, 0, NULL, 0, 0 }}; /*** function declarations ***************************************************/static void st_config_load_find_history (LoadInfo *info);static void st_config_load_handler_begin (LoadInfo *info);static void st_config_load_handler_end (LoadInfo *info);static void st_config_load_handler_field_begin (LoadInfo *info);static void st_config_load_handler_field_end (LoadInfo *info);static void st_config_load_command (LoadInfo *info);static void st_config_load_program (LoadInfo *info);static void st_config_load_handler_field_width (LoadInfo *info);static void st_config_load_handler_key_begin (LoadInfo *info);static void st_config_load_handler_key_value (LoadInfo *info);static void st_config_load_handler_key_end (LoadInfo *info);/*** implementation **********************************************************/gbooleanst_config_load (const char *filename, GError **err){ LoadInfo info = { NULL, }; g_return_val_if_fail(filename != NULL, FALSE); info.parser = sg_parser_new(filename, err); if (! info.parser) return FALSE; info.parser->scanner->msg_handler = st_parser_msg_cb; sg_parser_definev(info.parser, config_definitions); while ((info.statement = sg_parser_get_statement(info.parser))) { if (SG_PARSER_STATEMENT_IS_END(info.statement)) { switch (SG_PARSER_SCOPE(info.parser)) { case STATEMENT_HANDLER: st_config_load_handler_end(&info); break; case STATEMENT_HANDLER_FIELD: st_config_load_handler_field_end(&info); break; case STATEMENT_HANDLER_KEY: st_config_load_handler_key_end(&info); break; } } if (info.statement->definition) { switch (info.statement->definition->id) { case STATEMENT_OPTIONS_VIEW_TOOLBAR: st_settings.view_toolbar = g_value_get_boolean(&info.statement->value); break; case STATEMENT_OPTIONS_VIEW_TABS: st_settings.view_tabs = g_value_get_boolean(&info.statement->value); break; case STATEMENT_OPTIONS_VIEW_TAB_ICONS: st_settings.view_tab_icons = g_value_get_boolean(&info.statement->value); break; case STATEMENT_OPTIONS_VIEW_STATUSBAR: st_settings.view_statusbar = g_value_get_boolean(&info.statement->value); break; case STATEMENT_OPTIONS_TOOLBAR_STYLE: st_settings.toolbar_style = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_TOOLBAR_SIZE: st_settings.toolbar_size = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_WINDOW_WIDTH: /* deprecated */ case STATEMENT_OPTIONS_MAIN_WINDOW_WIDTH: st_settings.main_window_width = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_WINDOW_HEIGHT: /* deprecated */ case STATEMENT_OPTIONS_MAIN_WINDOW_HEIGHT: st_settings.main_window_height = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_PREFERENCES_WINDOW_WIDTH: st_settings.preferences_window_width = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_PREFERENCES_WINDOW_HEIGHT: st_settings.preferences_window_height = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_PREFERENCES_SELECTED_PAGE: st_settings.preferences_selected_page = g_value_dup_string(&info.statement->value); break; case STATEMENT_OPTIONS_PREFERENCES_PLUGINS_EXPANDED: st_settings.preferences_plugins_expanded = g_value_get_boolean(&info.statement->value); break; case STATEMENT_OPTIONS_STREAM_PROPERTIES_WINDOW_WIDTH: st_settings.stream_properties_window_width = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_STREAM_COLUMNS_WINDOW_WIDTH: st_settings.stream_columns_window_width = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_STREAM_COLUMNS_WINDOW_HEIGHT: st_settings.stream_columns_window_height = g_value_get_int(&info.statement->value); break; case STATEMENT_OPTIONS_PROXY_ENABLED: st_settings.proxy_enabled = g_value_get_boolean(&info.statement->value); break; case STATEMENT_OPTIONS_PROXY_TYPE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -