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

📄 cfgfiles.c

📁 The major functionality added in this release includes: - Rootless mode in X11 - Widget Templt
💻 C
📖 第 1 页 / 共 2 页
字号:
/* X-Chat * Copyright (C) 1998 Peter Zelezny. * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#ifdef HAVE_STRINGS_H#include <strings.h>#endif#include <string.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include "xchat.h"#include "cfgfiles.h"#include "util.h"#include "fe.h"#include "text.h"#include "xchatc.h"#ifdef USE_JCODE#include <locale.h>#endif#define DEF_FONT "-b&h-lucidatypewriter-medium-r-normal-*-*-120-*-*-m-*-*-*"#define DEF_FONT_JCODE "-*-fixed-medium-r-normal-*-14-*-*-*-c-*-*-*"#define DEF_FONT_WIN32 "-*-Fixedsys-normal-r-normal-*-15-*-*-*-m-*-iso8859-1"voidlist_addentry (GSList ** list, char *cmd, char *name){	struct popup *pop;	int cmd_len = 1, name_len;	if (cmd)		cmd_len = strlen (cmd) + 1;	name_len = strlen (name) + 1;	pop = malloc (sizeof (struct popup) + cmd_len + name_len);	pop->name = (char *) pop + sizeof (struct popup);	pop->cmd = pop->name + name_len;	memcpy (pop->name, name, name_len);	if (cmd)		memcpy (pop->cmd, cmd, cmd_len);	else		pop->cmd[0] = 0;	*list = g_slist_append (*list, pop);}voidlist_loadconf (char *file, GSList ** list, char *defaultconf){	char filebuf[256];	char cmd[256];	char name[82];	char *buf, *ibuf;	int fh, pnt = 0;	struct stat st;	snprintf (filebuf, sizeof (filebuf), "%s/%s", get_xdir (), file);	fh = open (filebuf, O_RDONLY | OFLAGS);	if (fh == -1)	{		fh = open (filebuf, O_TRUNC | O_WRONLY | O_CREAT | OFLAGS, 0600);		if (fh != -1)		{			write (fh, defaultconf, strlen (defaultconf));			close (fh);			list_loadconf (file, list, defaultconf);		}		return;	}	if (fstat (fh, &st) != 0)	{		perror ("fstat");		abort ();	}	/*fstat (fh, &st);*/	ibuf = malloc (st.st_size);	read (fh, ibuf, st.st_size);	close (fh);	cmd[0] = 0;	name[0] = 0;	while (buf_get_line (ibuf, &buf, &pnt, st.st_size))	{		if (*buf != '#')		{			if (!strncasecmp (buf, "NAME ", 5))			{				safe_strcpy (name, buf + 5, sizeof (name));			}			if (!strncasecmp (buf, "CMD ", 4))			{				safe_strcpy (cmd, buf + 4, sizeof (cmd));				if (*name)				{					list_addentry (list, cmd, name);					cmd[0] = 0;					name[0] = 0;				}			}		}	}	free (ibuf);}voidlist_free (GSList ** list){	void *data;	while (*list)	{		data = (void *) (*list)->data;		free (data);		*list = g_slist_remove (*list, data);	}}intlist_delentry (GSList ** list, char *name){	struct popup *pop;	GSList *alist = *list;	while (alist)	{		pop = (struct popup *) alist->data;		if (!strcasecmp (name, pop->name))		{			*list = g_slist_remove (*list, pop);			free (pop);			return 1;		}		alist = alist->next;	}	return 0;}char *cfg_get_str (char *cfg, char *var, char *dest){	while (1)	{		if (!strncasecmp (var, cfg, strlen (var)))		{			char *value, t;			cfg += strlen (var);			while (*cfg == ' ')				cfg++;			if (*cfg == '=')				cfg++;			while (*cfg == ' ')				cfg++;			/*while (*cfg == ' ' || *cfg == '=')			   cfg++; */			value = cfg;			while (*cfg != 0 && *cfg != '\n')				cfg++;			t = *cfg;			*cfg = 0;			strcpy (dest, value);			*cfg = t;			return cfg;		}		while (*cfg != 0 && *cfg != '\n')			cfg++;		if (*cfg == 0)			return 0;		cfg++;		if (*cfg == 0)			return 0;	}}static voidcfg_put_str (int fh, char *var, char *value){	char buf[512];	snprintf (buf, sizeof buf, "%s = %s\n", var, value);	write (fh, buf, strlen (buf));}voidcfg_put_int (int fh, int value, char *var){	char buf[400];	if (value == -1)		value = 1;	snprintf (buf, sizeof buf, "%s = %d\n", var, value);	write (fh, buf, strlen (buf));}intcfg_get_int_with_result (char *cfg, char *var, int *result){	char str[128];	if (!cfg_get_str (cfg, var, str))	{		*result = 0;		return 0;	}	*result = 1;	return atoi (str);}intcfg_get_int (char *cfg, char *var){	char str[128];	if (!cfg_get_str (cfg, var, str))		return 0;	return atoi (str);}char *xdir = 0;char *get_xdir (void){#ifndef WIN32	if (!xdir)	{		xdir = malloc (strlen (g_get_home_dir ()) + 8);		sprintf (xdir, "%s/.xchat", g_get_home_dir ());	}	return xdir;#else	return "./data"; /* FIXME */#endif}voidcheck_prefs_dir (void){	char *xdir = get_xdir ();	if (access (xdir, F_OK) != 0)	{#ifdef WIN32		if (mkdir (xdir) != 0)#else		if (mkdir (xdir, S_IRUSR | S_IWUSR | S_IXUSR) != 0)#endif			fe_message (_("Cannot create ~/.xchat"), FALSE);	}}char *default_file (void){	static char *dfile = 0;	if (!dfile)	{		dfile = malloc (strlen (get_xdir ()) + 12);		sprintf (dfile, "%s/xchat.conf", get_xdir ());	}	return dfile;}/* Keep these sorted!! */#ifdef USE_PERLstruct prefs vars[] = {#elsestatic struct prefs vars[] = {#endif	{"auto_indent", PREFS_OFFINT (auto_indent), TYPE_BOOL},	{"auto_resume", PREFS_OFFINT (autoresume), TYPE_BOOL},	{"autodccchat", PREFS_OFFINT (autodccchat), TYPE_BOOL},	{"autodccsend", PREFS_OFFINT (autodccsend), TYPE_BOOL},	{"autodialog", PREFS_OFFINT (autodialog), TYPE_BOOL},	{"autoopendccchatwindow", PREFS_OFFINT (autoopendccchatwindow), TYPE_BOOL},	{"autoopendccrecvwindow", PREFS_OFFINT (autoopendccrecvwindow), TYPE_BOOL},	{"autoopendccsendwindow", PREFS_OFFINT (autoopendccsendwindow), TYPE_BOOL},	{"autoreconnect", PREFS_OFFINT (autoreconnect), TYPE_BOOL},	{"autoreconnectonfail", PREFS_OFFINT (autoreconnectonfail), TYPE_BOOL},	{"autorejoin", PREFS_OFFINT (autorejoin), TYPE_BOOL},	{"autosave", PREFS_OFFINT (autosave), TYPE_BOOL},	{"autosaveurl", PREFS_OFFINT (autosave_url), TYPE_BOOL},	{"awayreason", PREFS_OFFSET (awayreason), TYPE_STR},	{"background_dialog_pic", PREFS_OFFSET (background_dialog), TYPE_STR},	{"background_pic", PREFS_OFFSET (background), TYPE_STR},	{"ban_type", PREFS_OFFINT (bantype), TYPE_INT},	{"beep_msg", PREFS_OFFINT (beepmsg), TYPE_BOOL},	{"beep_chans", PREFS_OFFINT (beepchans), TYPE_BOOL},	{"bluestring", PREFS_OFFSET (bluestring), TYPE_STR},	{"chanmodebuttons", PREFS_OFFINT (chanmodebuttons), TYPE_BOOL},	{"channelbox", PREFS_OFFINT (channelbox), TYPE_INT},	{"cmdchar", PREFS_OFFSET (cmdchar), TYPE_STR},	{"colorednicks", PREFS_OFFINT (colorednicks), TYPE_BOOL},	{"ctcp_number_limit", PREFS_OFFINT (ctcp_number_limit), TYPE_INT},	{"ctcp_time_limit", PREFS_OFFINT (ctcp_time_limit), TYPE_INT},	{"dcc_blocksize", PREFS_OFFINT (dcc_blocksize), TYPE_INT},	{"dcc_ip", PREFS_OFFSET (dcc_ip_str), TYPE_STR},	{"dcc_permissions", PREFS_OFFINT (dccpermissions), TYPE_INT},	{"dcc_send_fillspaces", PREFS_OFFINT (dcc_send_fillspaces), TYPE_BOOL},	{"dcc_stall_timeout", PREFS_OFFINT (dccstalltimeout), TYPE_INT},	{"dcc_timeout", PREFS_OFFINT (dcctimeout), TYPE_INT},	{"dccdir", PREFS_OFFSET (dccdir), TYPE_STR},	{"dccwithnick", PREFS_OFFINT (dccwithnick), TYPE_BOOL},	{"dialog_height", PREFS_OFFINT (dialog_height), TYPE_INT},	{"dialog_indent_nicks", PREFS_OFFINT (dialog_indent_nicks), TYPE_BOOL},	{"dialog_indent_pixels", PREFS_OFFINT (dialog_indent_pixels), TYPE_INT},	{"dialog_show_separator", PREFS_OFFINT (dialog_show_separator), TYPE_BOOL},	{"dialog_tint", PREFS_OFFINT (dialog_tint), TYPE_BOOL},	{"dialog_tint_blue", PREFS_OFFINT (dialog_tint_blue), TYPE_INT},	{"dialog_tint_green", PREFS_OFFINT (dialog_tint_green), TYPE_INT},	{"dialog_tint_red", PREFS_OFFINT (dialog_tint_red), TYPE_INT},	{"dialog_transparent", PREFS_OFFINT (dialog_transparent), TYPE_BOOL},	{"dialog_width", PREFS_OFFINT (dialog_width), TYPE_INT},	{"dialog_wordwrap", PREFS_OFFINT (dialog_wordwrap), TYPE_BOOL},	{"dnsprogram", PREFS_OFFSET (dnsprogram), TYPE_STR},	{"doubleclickuser", PREFS_OFFSET (doubleclickuser), TYPE_STR},	{"fastdccsend", PREFS_OFFINT (fastdccsend), TYPE_BOOL},	{"filterbeep", PREFS_OFFINT (filterbeep), TYPE_BOOL},	{"first_dcc_send_port", PREFS_OFFINT (first_dcc_send_port), TYPE_INT},	{"font_dialog_normal", PREFS_OFFSET (dialog_font_normal), TYPE_STR},	{"font_normal", PREFS_OFFSET (font_normal), TYPE_STR},#ifdef USE_ZVT	{"font_shell", PREFS_OFFSET (font_shell), TYPE_STR},#endif	{"fudgeservernotice", PREFS_OFFINT (fudgeservernotice), TYPE_BOOL},#ifdef USE_HEBREW	{"hebrew", PREFS_OFFINT (hebrew), TYPE_BOOL},#endif	{"hide_version", PREFS_OFFINT (hidever), TYPE_BOOL},	{"hidemenu", PREFS_OFFINT (hidemenu), TYPE_BOOL},	{"hideuserlist", PREFS_OFFINT (hideuserlist), TYPE_BOOL},	{"hilight_notify", PREFS_OFFINT (hilitenotify), TYPE_BOOL},	{"hilightnick", PREFS_OFFINT (hilightnick), TYPE_BOOL},	{"host_in_userlist", PREFS_OFFINT(showhostname_in_userlist), TYPE_BOOL},	{"hostname", PREFS_OFFSET (hostname), TYPE_STR},	{"indent_nicks", PREFS_OFFINT (indent_nicks), TYPE_BOOL},	{"indent_pixels", PREFS_OFFINT (indent_pixels), TYPE_INT},	{"inputgad_superfocus", PREFS_OFFINT (inputgad_superfocus), TYPE_BOOL},	{"invisible", PREFS_OFFINT (invisible), TYPE_BOOL},	{"ip_from_server", PREFS_OFFINT (ip_from_server), TYPE_BOOL},	{"lagometer", PREFS_OFFINT (lagometer), TYPE_INT},	{"last_dcc_send_port", PREFS_OFFINT (last_dcc_send_port), TYPE_INT},	{"limitedtabhighlight", PREFS_OFFINT (limitedtabhighlight), TYPE_BOOL},	{"logging", PREFS_OFFINT (logging), TYPE_BOOL},	{"logmask", PREFS_OFFSET (logmask), TYPE_STR},	{"mail_check", PREFS_OFFINT (mail_check), TYPE_BOOL},	{"mainwindow_height", PREFS_OFFINT (mainwindow_height), TYPE_INT},	{"mainwindow_left", PREFS_OFFINT (mainwindow_left), TYPE_INT},	{"mainwindow_save", PREFS_OFFINT (mainwindow_save), TYPE_BOOL},	{"mainwindow_top", PREFS_OFFINT (mainwindow_top), TYPE_INT},	{"mainwindow_width", PREFS_OFFINT (mainwindow_width), TYPE_INT},	{"max_auto_indent", PREFS_OFFINT (max_auto_indent), TYPE_INT},	{"max_lines", PREFS_OFFINT (max_lines), TYPE_INT},	{"msg_number_limit", PREFS_OFFINT (msg_number_limit), TYPE_INT},	{"msg_time_limit", PREFS_OFFINT (msg_time_limit), TYPE_INT},	{"newtabs_to_front", PREFS_OFFINT (newtabstofront), TYPE_BOOL},	{"nick_suffix", PREFS_OFFSET (nick_suffix), TYPE_STR},	{"nickcompletion", PREFS_OFFINT (nickcompletion), TYPE_BOOL},	{"nickgad", PREFS_OFFINT (nickgad), TYPE_BOOL},	{"nickname1", PREFS_OFFSET (nick1), TYPE_STR},	{"nickname2", PREFS_OFFSET (nick2), TYPE_STR},	{"nickname3", PREFS_OFFSET (nick3), TYPE_STR},	{"notices_tabs", PREFS_OFFINT (notices_tabs), TYPE_BOOL},	{"notify_timeout", PREFS_OFFINT (notify_timeout), TYPE_INT},	{"nu_color", PREFS_OFFINT (nu_color), TYPE_INT},	{"old_nickcompletion", PREFS_OFFINT (old_nickcompletion), TYPE_BOOL},	{"paned_userlist", PREFS_OFFINT (paned_userlist), TYPE_BOOL},#ifdef USE_PANEL	{"panel_vbox", PREFS_OFFINT (panel_vbox), TYPE_BOOL},	{"panelize_hide", PREFS_OFFINT (panelize_hide), TYPE_BOOL},#endif	{"partreason", PREFS_OFFSET (partreason), TYPE_STR},	{"percascii", PREFS_OFFINT (perc_ascii), TYPE_BOOL},	{"perccolor", PREFS_OFFINT (perc_color), TYPE_BOOL},#ifdef USE_PERL	{"perlwarnings", PREFS_OFFINT (perlwarnings), TYPE_BOOL},#endif	{"persist_chans", PREFS_OFFINT (persist_chans), TYPE_BOOL},	{"pingtimeout", PREFS_OFFINT (pingtimeout), TYPE_INT},	{"priv_msg_tabs", PREFS_OFFINT (privmsgtab), TYPE_BOOL},	{"proxy_host", PREFS_OFFSET (proxy_host), TYPE_STR},	{"proxy_port", PREFS_OFFINT (proxy_port), TYPE_INT},	{"proxy_type", PREFS_OFFINT (proxy_type), TYPE_INT},	{"quitreason", PREFS_OFFSET (quitreason), TYPE_STR},	{"raw_modes", PREFS_OFFINT (raw_modes), TYPE_BOOL},	{"realname", PREFS_OFFSET (realname), TYPE_STR},

⌨️ 快捷键说明

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