⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prefs.c

📁 浏览器的源代码,可移植到嵌入式设备.
💻 C
字号:
/* * Preferences for dillo * * Copyright (C) 2000 Luca Rota <lrota@cclinf.polito.it> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <glib.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <string.h>       /* for strchr */#include <fcntl.h>#include <unistd.h>#include <locale.h>       /* for setlocale */#include "prefs.h"#include "colors.h"#include "misc.h"/* symbol array */static const struct {   gchar *name;   guint  token;} symbols[] = {   { "geometry", DRC_TOKEN_GEOMETRY },   { "http_proxy", DRC_TOKEN_PROXY },   { "http_proxyuser", DRC_TOKEN_PROXYUSER },   { "no_proxy", DRC_TOKEN_NOPROXY },   { "link_color", DRC_TOKEN_LINK_COLOR },   { "visited_color", DRC_TOKEN_VISITED_COLOR, },   { "bg_color", DRC_TOKEN_BG_COLOR },   { "allow_white_bg", DRC_TOKEN_ALLOW_WHITE_BG },   { "force_my_colors", DRC_TOKEN_FORCE_MY_COLORS },   { "force_visited_color", DRC_TOKEN_FORCE_VISITED_COLOR },   { "text_color", DRC_TOKEN_TEXT_COLOR },   { "use_oblique", DRC_TOKEN_USE_OBLIQUE },   { "start_page", DRC_TOKEN_START_PAGE },   { "home", DRC_TOKEN_HOME },   { "show_tooltip", DRC_TOKEN_SHOW_TOOLTIP },   { "panel_size", DRC_TOKEN_PANEL_SIZE },   { "small_icons", DRC_TOKEN_SMALL_ICONS },   { "limit_text_width", DRC_TOKEN_LIMIT_TEXT_WIDTH },   { "font_factor", DRC_TOKEN_FONT_FACTOR },   { "use_dicache", DRC_TOKEN_USE_DICACHE },   { "show_back", DRC_TOKEN_SHOW_BACK },   { "show_forw", DRC_TOKEN_SHOW_FORW },   { "show_home", DRC_TOKEN_SHOW_HOME },   { "show_reload", DRC_TOKEN_SHOW_RELOAD },   { "show_save", DRC_TOKEN_SHOW_SAVE },   { "show_stop", DRC_TOKEN_SHOW_STOP },   { "show_bookmarks", DRC_TOKEN_SHOW_BOOKMARKS },   { "show_menubar", DRC_TOKEN_SHOW_MENUBAR },   { "show_clear_url", DRC_TOKEN_SHOW_CLEAR_URL },   { "show_url", DRC_TOKEN_SHOW_URL },   { "show_search", DRC_TOKEN_SHOW_SEARCH },   { "show_progress_box", DRC_TOKEN_SHOW_PROGRESS_BOX },   { "fullwindow_start", DRC_TOKEN_FULLWINDOW_START },   { "transient_dialogs", DRC_TOKEN_TRANSIENT_DIALOGS },   { "vw_fontname", DRC_TOKEN_VW_FONT },   { "fw_fontname", DRC_TOKEN_FW_FONT },   { "generate_submit", DRC_TOKEN_GENERATE_SUBMIT },   { "enterpress_forces_submit", DRC_TOKEN_ENTERPRESS_FORCES_SUBMIT },   { "search_url", DRC_TOKEN_SEARCH_URL },   { "show_msg", DRC_TOKEN_SHOW_MSG },   { "show_extra_warnings", DRC_TOKEN_SHOW_EXTRA_WARNINGS }};static const guint n_symbols = sizeof (symbols) / sizeof (symbols[0]);/* * Read tokens from dillorc and set values in the prefs structure. * (Although this function can be called several times, and not leak, *  preferences aren't yet enabled for on-the-fly changes). */static guint Prefs_parser(GScanner *scanner){   gint st;   guint symbol;   /* expect a valid symbol */   g_scanner_get_next_token(scanner);   symbol = scanner->token;   if (scanner->token == G_TOKEN_EQUAL_SIGN) {      g_scanner_get_next_token (scanner);      return G_TOKEN_NONE;   } else if (symbol < DRC_TOKEN_FIRST || symbol > DRC_TOKEN_LAST )      return G_TOKEN_SYMBOL;   /* expect '=' */   g_scanner_get_next_token(scanner);   if (scanner->token != G_TOKEN_EQUAL_SIGN)      return G_TOKEN_EQUAL_SIGN;   /* expect a string */   g_scanner_get_next_token(scanner);   if (scanner->token != G_TOKEN_STRING)      return G_TOKEN_STRING;   /* assign value and exit successfully */   switch (symbol) {   case DRC_TOKEN_GEOMETRY:      a_Misc_parse_geometry(scanner->value.v_string, &prefs.xpos, &prefs.ypos,                            &prefs.width, &prefs.height);      break;   case DRC_TOKEN_PROXY:      a_Url_free(prefs.http_proxy);      prefs.http_proxy = a_Url_new(scanner->value.v_string, NULL, 0, 0, 0);      break;   case DRC_TOKEN_PROXYUSER:      g_free(prefs.http_proxyuser);      prefs.http_proxyuser = g_strdup(scanner->value.v_string);      break;   case DRC_TOKEN_NOPROXY:      g_free(prefs.no_proxy);      prefs.no_proxy = g_strdup(scanner->value.v_string);      prefs.no_proxy_vec = g_strsplit(prefs.no_proxy, " ", 0);      break;   case DRC_TOKEN_LINK_COLOR:      prefs.link_color = a_Color_parse(scanner->value.v_string,                                       prefs.link_color, &st);      break;   case DRC_TOKEN_VISITED_COLOR:      prefs.visited_color = a_Color_parse(scanner->value.v_string,                                          prefs.visited_color, &st);      break;   case DRC_TOKEN_TEXT_COLOR:      prefs.text_color = a_Color_parse(scanner->value.v_string,                                       prefs.text_color, &st);      break;   case DRC_TOKEN_BG_COLOR:      prefs.bg_color = a_Color_parse(scanner->value.v_string,                                     prefs.bg_color, &st);      break;   case DRC_TOKEN_ALLOW_WHITE_BG:      prefs.allow_white_bg = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_FORCE_MY_COLORS:      prefs.force_my_colors = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_FORCE_VISITED_COLOR:      prefs.force_visited_color =         (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_USE_OBLIQUE:      prefs.use_oblique = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_PANEL_SIZE:      if (!g_strcasecmp(scanner->value.v_string, "tiny"))         prefs.panel_size = 1;      else if (!g_strcasecmp(scanner->value.v_string, "medium"))         prefs.panel_size = 2;      else /* default to "large" */         prefs.panel_size = 3;      break;   case DRC_TOKEN_SMALL_ICONS:      prefs.small_icons = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_START_PAGE:      a_Url_free(prefs.start_page);      prefs.start_page = a_Url_new(scanner->value.v_string, NULL, 0, 0, 0);      break;   case DRC_TOKEN_HOME:      a_Url_free(prefs.home);      prefs.home = a_Url_new(scanner->value.v_string, NULL, 0, 0, 0);      break;   case DRC_TOKEN_SHOW_TOOLTIP:      prefs.show_tooltip = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_FONT_FACTOR:      prefs.font_factor = strtod(scanner->value.v_string, NULL);      break;   case DRC_TOKEN_LIMIT_TEXT_WIDTH:      prefs.limit_text_width = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_USE_DICACHE:      prefs.use_dicache = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_BACK:      prefs.show_back = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_FORW:      prefs.show_forw = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_HOME:      prefs.show_home = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_RELOAD:      prefs.show_reload = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_SAVE:      prefs.show_save = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_STOP:      prefs.show_stop = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_BOOKMARKS:      prefs.show_bookmarks = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_MENUBAR:      prefs.show_menubar = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_CLEAR_URL:      prefs.show_clear_url = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_URL:      prefs.show_url = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_SEARCH:      prefs.show_search = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_PROGRESS_BOX:      prefs.show_progress_box = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_FULLWINDOW_START:      prefs.fullwindow_start = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_TRANSIENT_DIALOGS:      prefs.transient_dialogs = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_FW_FONT:      g_free(prefs.fw_fontname);      prefs.fw_fontname = g_strdup(scanner->value.v_string);      break;   case DRC_TOKEN_VW_FONT:      g_free(prefs.vw_fontname);      prefs.vw_fontname = g_strdup(scanner->value.v_string);      break;   case DRC_TOKEN_GENERATE_SUBMIT:      prefs.generate_submit = (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_ENTERPRESS_FORCES_SUBMIT:      prefs.enterpress_forces_submit =         (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SEARCH_URL:      g_free(prefs.search_url);      prefs.search_url = g_strdup(scanner->value.v_string);      break;   case DRC_TOKEN_SHOW_MSG:      prefs.show_msg =         (strcmp(scanner->value.v_string, "YES") == 0);      break;   case DRC_TOKEN_SHOW_EXTRA_WARNINGS:      prefs.show_extra_warnings =         (strcmp(scanner->value.v_string, "YES") == 0);      break;   default:      break;   /* Not reached */   }   return G_TOKEN_NONE;}static gint Prefs_load(void){   GScanner *scanner;   gint fd;   guint i, expected_token;   gchar *file;   /* Here we load and set options from dillorc */   file = a_Misc_prepend_user_home(".dillo/dillorc");   fd = open(file, O_RDONLY);   g_free(file);   if (fd < 0 && (fd = open(DILLORC_SYS, O_RDONLY)) < 0)      return FILE_NOT_FOUND;   fcntl(fd, F_SETFD, FD_CLOEXEC | fcntl(fd, F_GETFD));   scanner = g_scanner_new(NULL);   /* Adjust lexing behaviour to suit our needs */   /* Specifies the chars which can be used in identifiers */   scanner->config->cset_identifier_nth = (      G_CSET_a_2_z      "~+-_:&%#/.0123456789"      G_CSET_A_2_Z      G_CSET_LATINS   /*??? I don't know if we need these two */      G_CSET_LATINC   /*??? */   );   /* Specifies the chars which can start identifiers */   scanner->config->cset_identifier_first = (      G_CSET_a_2_z      G_CSET_A_2_Z      "_0123456789"   );   /* Don't return G_TOKEN_SYMBOL, but the symbol's value */   scanner->config->symbol_2_token = TRUE;   /* Don't return G_TOKEN_IDENTIFIER, but convert it to string */   scanner->config->identifier_2_string = TRUE;   /* load symbols into the scanner */   g_scanner_freeze_symbol_table(scanner);   for (i = 0; i < n_symbols; i++)      g_scanner_add_symbol(scanner, symbols[i].name,                           GINT_TO_POINTER (symbols[i].token));   g_scanner_thaw_symbol_table(scanner);   /* feed in the text */   g_scanner_input_file(scanner, fd);   /* give the error handler an idea on how the input is named */   scanner->input_name = "dillorc";   /*    * Scanning loop, we parse the input until it's end is reached,    * the scanner encountered a lexing error, or our sub routine came    * across invalid syntax    */   do {      expected_token = Prefs_parser(scanner);      /* Give an error message upon syntax errors */      if (expected_token == G_TOKEN_SYMBOL)         g_scanner_unexp_token (scanner, expected_token, NULL, "symbol", NULL,                                NULL, FALSE);      else if (expected_token == G_TOKEN_STRING)         g_scanner_unexp_token (scanner, expected_token, NULL, "string", NULL,                                NULL, FALSE);      else if (expected_token == G_TOKEN_EQUAL_SIGN)         g_scanner_unexp_token (scanner, expected_token, NULL, "=", NULL,                                NULL, FALSE);      g_scanner_peek_next_token (scanner);   } while ( /* expected_token == G_TOKEN_NONE && */            scanner->next_token != G_TOKEN_EOF &&            scanner->next_token != G_TOKEN_ERROR);   /* give an error message upon syntax errors */   if (expected_token != G_TOKEN_NONE)      g_scanner_unexp_token(scanner, expected_token, NULL, "symbol", NULL,                            NULL, TRUE);   /* finish parsing */   g_scanner_destroy(scanner);   close(fd);   return PARSE_OK;}void a_Prefs_init(void){   gchar *old_locale;   prefs.width = D_GEOMETRY_DEFAULT_WIDTH;   prefs.height = D_GEOMETRY_DEFAULT_HEIGHT;   prefs.xpos = D_GEOMETRY_DEFAULT_XPOS;   prefs.ypos = D_GEOMETRY_DEFAULT_YPOS;   prefs.http_proxy = NULL;   prefs.http_proxyuser = NULL;   prefs.no_proxy = NULL;   prefs.no_proxy_vec = NULL;   prefs.link_color = DW_COLOR_DEFAULT_BLUE;   prefs.visited_color = DW_COLOR_DEFAULT_PURPLE;   prefs.bg_color = DW_COLOR_DEFAULT_BGND;   prefs.text_color = DW_COLOR_DEFAULT_BLACK;   prefs.use_oblique = FALSE;   prefs.start_page = a_Url_new(DILLO_START_PAGE, NULL, 0, 0, 0);   prefs.home = a_Url_new(DILLO_HOME, NULL, 0, 0, 0);   prefs.allow_white_bg = TRUE;   prefs.force_my_colors = FALSE;   prefs.force_visited_color = FALSE;   prefs.show_tooltip = FALSE;   prefs.panel_size = 1;   prefs.small_icons = FALSE;   prefs.limit_text_width = FALSE;   prefs.font_factor = 1.0;   prefs.use_dicache = FALSE;   prefs.show_back=TRUE;   prefs.show_forw=TRUE;   prefs.show_home=TRUE;   prefs.show_reload=TRUE;   prefs.show_save=TRUE;   prefs.show_stop=TRUE;   prefs.show_bookmarks=TRUE;   prefs.show_menubar=TRUE;   prefs.show_clear_url=TRUE;   prefs.show_url=TRUE;   prefs.show_search=TRUE;   prefs.show_progress_box=TRUE;   prefs.fullwindow_start=FALSE;   prefs.transient_dialogs=FALSE;   prefs.vw_fontname = g_strdup("helvetica");   prefs.fw_fontname = g_strdup("courier");   prefs.generate_submit = FALSE;   prefs.enterpress_forces_submit = FALSE;   prefs.search_url = g_strdup("http://www.google.com/search?q=%s");   prefs.show_msg = TRUE;   prefs.show_extra_warnings = FALSE;   /* this locale stuff is to avoid parsing problems with float numbers */   old_locale = g_strdup (setlocale (LC_NUMERIC, NULL));   setlocale (LC_NUMERIC, "C");   Prefs_load();   setlocale (LC_NUMERIC, old_locale);   g_free (old_locale);}/* *  Preferences memory-deallocation *  (Call this one at exit time) */void a_Prefs_freeall(void){   g_free(prefs.http_proxyuser);   g_free(prefs.no_proxy);   if (prefs.no_proxy_vec)      g_strfreev(prefs.no_proxy_vec);   a_Url_free(prefs.http_proxy);   g_free(prefs.fw_fontname);   g_free(prefs.vw_fontname);   a_Url_free(prefs.start_page);   a_Url_free(prefs.home);   g_free(prefs.search_url);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -