1 //=============================================================================
2 //
3 //   File : KviOptions.cpp
4 //   Creation date : Tue Jun 20 2000 11:42:00 by Szymon Stefanek
5 //
6 //   This file is part of the KVIrc IRC client distribution
7 //   Copyright (C) 2000-2010 Szymon Stefanek (pragma at kvirc dot net)
8 //   Copyright (C) 2014 OmegaPhil (OmegaPhil at startmail dot com)
9 //
10 //   This program is FREE software. You can redistribute it and/or
11 //   modify it under the terms of the GNU General Public License
12 //   as published by the Free Software Foundation; either version 2
13 //   of the License, or (at your option) any later version.
14 //
15 //   This program is distributed in the HOPE that it will be USEFUL,
16 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 //   See the GNU General Public License for more details.
19 //
20 //   You should have received a copy of the GNU General Public License
21 //   along with this program. If not, write to the Free Software Foundation,
22 //   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 //
24 //=============================================================================
25 
26 #define _KVI_OPTIONS_CPP_
27 
28 #include "KviOptions.h"
29 #include "kvi_confignames.h"
30 #include "kvi_defaults.h"
31 #include "kvi_out.h"
32 #include "kvi_settings.h"
33 #include "KviApplication.h"
34 #include "KviConfigurationFile.h"
35 #include "KviControlCodes.h"
36 #include "KviFileUtils.h"
37 #include "KviIconManager.h"
38 #include "KviInternalCommand.h"
39 #include "KviLocale.h"
40 #include "KviMainWindow.h"
41 #include "KviStringConversion.h"
42 #include "KviTheme.h"
43 #include "KviWindow.h"
44 
45 #include <QDir>
46 #include <QMessageBox>
47 #include <QStringList>
48 
49 // KviApplication.cpp
50 extern KVIRC_API int g_iIdentDaemonRunningUsers;
51 
52 #define RECT_OPTION(_txt, _val, _flags) KviRectOption(KVI_RECT_OPTIONS_PREFIX _txt, _val, _flags)
53 
54 KviRectOption g_rectOptionsTable[KVI_NUM_RECT_OPTIONS] = {
55 	RECT_OPTION("FrameGeometry", QRect(0, 0, 10, 10), KviOption_sectFlagGeometry),
56 	RECT_OPTION("GeneralOptionsDialogGeometry", QRect(50, 50, 600, 450), KviOption_sectFlagGeometry),
57 	RECT_OPTION("RegisteredUsersDialogGeometry", QRect(50, 50, 600, 450), KviOption_sectFlagGeometry)
58 };
59 
60 #define BOOL_OPTION(_txt, _val, _flags) KviBoolOption(KVI_BOOL_OPTIONS_PREFIX _txt, _val, _flags)
61 
62 // NOTICE: REUSE EQUIVALENT UNUSED KviOption_bool in KviOptions.h ENTRIES BEFORE ADDING NEW ENTRIES BELOW
63 KviBoolOption g_boolOptionsTable[KVI_NUM_BOOL_OPTIONS] = {
64 	BOOL_OPTION("WindowsRememberProperties", true, KviOption_sectFlagWindows),
65 	BOOL_OPTION("IrcViewShowImages", false, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
66 	BOOL_OPTION("IrcViewTimestamp", true, KviOption_sectFlagIrcView),
67 	BOOL_OPTION("IrcViewUrlHighlighting", true, KviOption_sectFlagIrcView | KviOption_groupTheme),
68 	BOOL_OPTION("IrcViewWrapMargin", true, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
69 	BOOL_OPTION("InputHistoryCursorAtEnd", true, KviOption_sectFlagInput),
70 	BOOL_OPTION("AvoidParserWarnings", false, KviOption_sectFlagUserParser),
71 	BOOL_OPTION("UseProxyHost", false, KviOption_sectFlagConnection),
72 	BOOL_OPTION("IgnoreSpecialCharactersInNickCompletion", false, KviOption_sectFlagInput),
73 	BOOL_OPTION("ForceBrutalQuit", false, KviOption_sectFlagIrcSocket),
74 	BOOL_OPTION("ShowPingPong", true, KviOption_sectFlagConnection),
75 	BOOL_OPTION("PopupNotifierOnNewQueryMessages", true, KviOption_sectFlagFrame),
76 	BOOL_OPTION("ShowExtendedServerInfo", false, KviOption_sectFlagConnection),
77 	BOOL_OPTION("EchoNumericTopic", true, KviOption_sectFlagConnection),
78 	BOOL_OPTION("ShowOwnParts", true, KviOption_sectFlagConnection),
79 	BOOL_OPTION("UseAntiSpamOnPrivmsg", false, KviOption_sectFlagAntiSpam),
80 	BOOL_OPTION("UseExtendedPrivmsgView", false, KviOption_sectFlagIrcView | KviOption_groupTheme),
81 	BOOL_OPTION("ShowUserAndHostInPrivmsgView", false, KviOption_sectFlagIrcView | KviOption_groupTheme),
82 	BOOL_OPTION("UseWordHighlighting", true, KviOption_sectFlagIrcView), /* _ALL_ newbie users, with who i was taling asks me where can they switch on */
83 	BOOL_OPTION("CleanupUnusedModules", true, KviOption_sectFlagModules),
84 	BOOL_OPTION("IgnoreCtcpPing", false, KviOption_sectFlagCtcp),
85 	BOOL_OPTION("IgnoreCtcpVersion", false, KviOption_sectFlagCtcp),
86 	BOOL_OPTION("UseCtcpFloodProtection", true, KviOption_sectFlagCtcp),
87 	BOOL_OPTION("DisableBrokenEventHandlers", true, KviOption_sectFlagUserParser),
88 	BOOL_OPTION("IgnoreCtcpClientinfo", false, KviOption_sectFlagCtcp),
89 	BOOL_OPTION("IgnoreCtcpUserinfo", false, KviOption_sectFlagCtcp),
90 	BOOL_OPTION("IgnoreCtcpFinger", true, KviOption_sectFlagCtcp),
91 	BOOL_OPTION("IgnoreCtcpSource", false, KviOption_sectFlagCtcp),
92 	BOOL_OPTION("IgnoreCtcpTime", false, KviOption_sectFlagCtcp),
93 	BOOL_OPTION("RequestMissingAvatars", false, KviOption_sectFlagAvatar),
94 	BOOL_OPTION("ShowCompactModeChanges", true, KviOption_sectFlagConnection),
95 	BOOL_OPTION("IgnoreCtcpDcc", false, KviOption_sectFlagDcc),
96 	BOOL_OPTION("AutoAcceptDccChat", false, KviOption_sectFlagDcc),
97 	BOOL_OPTION("AutoAcceptDccSend", false, KviOption_sectFlagDcc),
98 	BOOL_OPTION("SendZeroAckInDccRecv", false, KviOption_sectFlagDcc),
99 	BOOL_OPTION("UseFastDccSend", true, KviOption_sectFlagDcc),
100 	BOOL_OPTION("UseCompositingForTransparency", false, KviOption_sectFlagGui | KviOption_resetUpdatePseudoTransparency | KviOption_groupTheme),
101 	BOOL_OPTION("UseWindowListIrcContextIndicator", false, KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme),
102 	BOOL_OPTION("UseGlobalApplicationFont", false, KviOption_sectFlagGui | KviOption_resetUpdateAppFont | KviOption_groupTheme),
103 	BOOL_OPTION("AlwaysQuitKVIrcClosingLastConsole", false, KviOption_sectFlagFrame),
104 	BOOL_OPTION("AlwaysDisconnectClosingConnectedConsole", false, KviOption_sectFlagFrame),
105 	BOOL_OPTION("FlashWindowOnHighlightedMessages", true, KviOption_sectFlagFrame),
106 	BOOL_OPTION("PopupNotifierOnHighlightedMessages", true, KviOption_sectFlagFrame),
107 	BOOL_OPTION("FlashWindowOnNotifyOnLine", true, KviOption_sectFlagConnection),
108 	BOOL_OPTION("IrcViewTimestampUTC", false, KviOption_sectFlagIrcView),
109 	BOOL_OPTION("UseGlobalPseudoTransparency", false, KviOption_sectFlagGui | KviOption_resetUpdatePseudoTransparency | KviOption_groupTheme),
110 	BOOL_OPTION("UseNotifyList", false, KviOption_sectFlagConnection | KviOption_resetRestartNotifyList),
111 	BOOL_OPTION("NotifyListChangesToActiveWindow", true, KviOption_sectFlagConnection),
112 	BOOL_OPTION("AutoResumeDccSendWhenAutoAccepted", false, KviOption_sectFlagDcc),
113 	BOOL_OPTION("LimitOutgoingTraffic", false, KviOption_sectFlagIrcSocket),
114 	BOOL_OPTION("SendUnknownCommandsAsRaw", true, KviOption_sectFlagUserParser),
115 	BOOL_OPTION("UserListViewDrawGrid", true, KviOption_sectFlagUserListView | KviOption_resetUpdateGui | KviOption_groupTheme),
116 	BOOL_OPTION("ShowChannelSyncTime", true, KviOption_sectFlagConnection),
117 	BOOL_OPTION("RejoinChannelOnKick", false, KviOption_sectFlagConnection),
118 	BOOL_OPTION("KeepChannelOpenOnKick", true, KviOption_sectFlagConnection),
119 	BOOL_OPTION("AutoCloseDccSendOnSuccess", false, KviOption_sectFlagDcc),
120 	BOOL_OPTION("NotifyDccSendSuccessInConsole", false, KviOption_sectFlagDcc),
121 	BOOL_OPTION("CreateMinimizedDccSend", false, KviOption_sectFlagDcc),
122 	BOOL_OPTION("CreateMinimizedDccChat", false, KviOption_sectFlagDcc),
123 	BOOL_OPTION("AutoAcceptIncomingAvatars", false, KviOption_sectFlagDcc),
124 	BOOL_OPTION("UseNickCompletionPostfixForFirstWordOnly", true, KviOption_sectFlagInput),
125 	BOOL_OPTION("UseWindowListIcons", true, KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme),
126 	BOOL_OPTION("CreateMinimizedDccSendWhenAutoAccepted", true, KviOption_sectFlagDcc),
127 	BOOL_OPTION("CreateMinimizedDccChatWhenAutoAccepted", true, KviOption_sectFlagDcc),
128 	BOOL_OPTION("DccGuessIpFromServerWhenLocalIsUnroutable", true, KviOption_sectFlagDcc),
129 	BOOL_OPTION("ColorNicksWithBackground", false, KviOption_sectFlagIrcView | KviOption_groupTheme),
130 	BOOL_OPTION("AutoLogQueries", true, KviOption_sectFlagLogging), /* this options enabled by default in mIRC,XChat and irssi. People are confused while they want to see logs, but see empty dir*/
131 	BOOL_OPTION("AutoLogChannels", true, KviOption_sectFlagLogging),
132 	BOOL_OPTION("AutoLogDccChat", false, KviOption_sectFlagLogging),
133 	BOOL_OPTION("AutoLogConsole", false, KviOption_sectFlagLogging),
134 	BOOL_OPTION("SilentAntiSpam", false, KviOption_sectFlagAntiSpam),
135 	BOOL_OPTION("UseIncomingDccMediaTypeSavePath", true, KviOption_sectFlagDcc),
136 	BOOL_OPTION("NotifyListSendUserhostForOnlineUsers", true, KviOption_sectFlagConnection),
137 	BOOL_OPTION("UseIntelligentNotifyListManager", true, KviOption_sectFlagConnection | KviOption_resetRestartNotifyList),
138 	BOOL_OPTION("UseWatchListIfAvailable", true, KviOption_sectFlagConnection),
139 	BOOL_OPTION("UseTreeWindowList", true, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList | KviOption_groupTheme),
140 	BOOL_OPTION("BindIrcIPv4ConnectionsToSpecifiedAddress", false, KviOption_sectFlagConnection),
141 	BOOL_OPTION("BindIrcIPv6ConnectionsToSpecifiedAddress", false, KviOption_sectFlagConnection),
142 	BOOL_OPTION("UseAntiSpamOnNotice", false, KviOption_sectFlagAntiSpam),
143 	BOOL_OPTION("SetLastAvatarAsDefaultForRegisteredUsers", true, KviOption_sectFlagAvatar),
144 	BOOL_OPTION("CantAcceptIncomingDccConnections", false, KviOption_sectFlagDcc),
145 	BOOL_OPTION("IgnoreCtcpAvatar", false, KviOption_sectFlagCtcp),
146 	BOOL_OPTION("CtcpRepliesToActiveWindow", true, KviOption_sectFlagCtcp),
147 	BOOL_OPTION("AutoAcceptDccCanvas", false, KviOption_sectFlagDcc),
148 	BOOL_OPTION("NotifyDccSendSuccessInNotifier", true, KviOption_sectFlagDcc),
149 	BOOL_OPTION("KillBrokenTimers", true, KviOption_sectFlagUserParser),
150 	BOOL_OPTION("DccVoiceVolumeSliderControlsPCM", true, KviOption_sectFlagDcc),
151 	BOOL_OPTION("DccVoiceForceHalfDuplex", false, KviOption_sectFlagDcc),
152 	BOOL_OPTION("AutoAcceptDccVoice", false, KviOption_sectFlagDcc),
153 	BOOL_OPTION("CreateMinimizedDccVoice", false, KviOption_sectFlagDcc),
154 	BOOL_OPTION("CreateMinimizedDccVoiceWhenAutoAccepted", true, KviOption_sectFlagDcc),
155 	BOOL_OPTION("UseIdentService", false, KviOption_sectFlagConnection | KviOption_resetRestartIdentd),
156 	BOOL_OPTION("ShowTipAtStartup", false, KviOption_sectFlagFrame),
157 	BOOL_OPTION("IdentdEnableIPv6", false, KviOption_sectFlagConnection | KviOption_resetRestartIdentd),
158 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
159 	BOOL_OPTION("IdentdIPv6ContainsIPv4", false, KviOption_sectFlagConnection | KviOption_resetRestartIdentd),
160 #else
161 	BOOL_OPTION("IdentdIPv6ContainsIPv4", true, KviOption_sectFlagConnection | KviOption_resetRestartIdentd),
162 #endif
163 	BOOL_OPTION("ScaleAvatars", true, KviOption_sectFlagAvatar | KviOption_resetUpdateGui | KviOption_groupTheme),
164 	BOOL_OPTION("ColorNicks", false, KviOption_sectFlagIrcView | KviOption_groupTheme),
165 	BOOL_OPTION("BoldedNicks", true, KviOption_sectFlagIrcView | KviOption_groupTheme),
166 	BOOL_OPTION("DccListenOnSpecifiedInterfaceByDefault", false, KviOption_sectFlagDcc),
167 	BOOL_OPTION("ChangeNickAway", false, KviOption_sectFlagConnection),
168 	BOOL_OPTION("AutoGeneratedAwayNick", false, KviOption_sectFlagConnection), /* only ircnet uses 9-symbol nicks */
169 	BOOL_OPTION("ExitAwayOnInput", false, KviOption_sectFlagConnection),
170 	BOOL_OPTION("AlwaysHighlightNick", true, KviOption_sectFlagIrcView),
171 	BOOL_OPTION("ShowChannelsJoinOnIrc", true, KviOption_sectFlagFrame),
172 	BOOL_OPTION("ShowChannelsJoinDialogAsToplevel", true, KviOption_sectFlagFrame), //UNUSED
173 	BOOL_OPTION("UserDefinedPortRange", false, KviOption_sectFlagDcc),
174 	BOOL_OPTION("CreateQueryOnPrivmsg", true, KviOption_sectFlagConnection),
175 	BOOL_OPTION("CreateQueryOnNotice", false, KviOption_sectFlagConnection),
176 	BOOL_OPTION("CreateIncomingQueriesAsMinimized", true, KviOption_sectFlagConnection),
177 	BOOL_OPTION("AutoJoinOnInvite", false, KviOption_sectFlagConnection),
178 	BOOL_OPTION("ShowServersConnectDialogOnStart", true, KviOption_sectFlagFrame),
179 	BOOL_OPTION("ShowServersConnectDialogAsToplevel", true, KviOption_sectFlagFrame),  //UNUSED
180 	BOOL_OPTION("AcceptBrokenFileNameDccResumeRequests", true, KviOption_sectFlagDcc),
181 	BOOL_OPTION("AutoReconnectOnUnexpectedDisconnect", true, KviOption_sectFlagFrame),
182 	BOOL_OPTION("RejoinChannelsAfterReconnect", true, KviOption_sectFlagFrame),
183 	BOOL_OPTION("ReopenQueriesAfterReconnect", true, KviOption_sectFlagFrame),
184 	BOOL_OPTION("EnableQueryTracing", true, KviOption_sectFlagConnection),
185 	BOOL_OPTION("OperatorMessagesToActiveWindow", false, KviOption_sectFlagConnection),
186 	BOOL_OPTION("InvitesToActiveWindow", true, KviOption_sectFlagConnection),
187 	BOOL_OPTION("ShowChannelUserFlagInPrivmsgView", true, KviOption_sectFlagConnection),
188 	BOOL_OPTION("DccSendFakeAddressByDefault", false, KviOption_sectFlagDcc),
189 	BOOL_OPTION("UseWindowListActivityMeter", false, KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme),
190 	BOOL_OPTION("CloseServerWidgetAfterConnect", false, KviOption_sectFlagFrame),
191 	BOOL_OPTION("PrioritizeLastActionTime", false, KviOption_sectFlagInput),
192 	BOOL_OPTION("ShowUserChannelIcons", true, KviOption_sectFlagUserListView | KviOption_resetUpdateGui | KviOption_groupTheme),
193 	BOOL_OPTION("ShowUserChannelState", false, KviOption_sectFlagUserListView | KviOption_resetUpdateGui | KviOption_groupTheme),
194 	BOOL_OPTION("EnableIgnoreOnPrivMsg", true, KviOption_sectFlagConnection),
195 	BOOL_OPTION("VerboseIgnore", false, KviOption_sectFlagConnection),
196 	BOOL_OPTION("EnableIgnoreOnNotice", true, KviOption_sectFlagConnection),
197 	BOOL_OPTION("NotifyFailedDccHandshakes", true, KviOption_sectFlagDcc),
198 	BOOL_OPTION("DrawEmoticons", true, KviOption_sectFlagIrcView | KviOption_groupTheme),
199 	BOOL_OPTION("IgnoreCtcpPage", false, KviOption_sectFlagCtcp),
200 	BOOL_OPTION("ShowDialogOnCtcpPage", true, KviOption_sectFlagCtcp),
201 	BOOL_OPTION("BashLikeNickCompletion", false, KviOption_sectFlagInput),
202 	BOOL_OPTION("UseSSLCertificate", false, KviOption_sectFlagConnection),
203 	BOOL_OPTION("UseSSLPrivateKey", false, KviOption_sectFlagConnection),
204 	BOOL_OPTION("WarnAboutPastingMultipleLines", true, KviOption_sectFlagFrame),
205 	BOOL_OPTION("KeepChannelsOpenOnUnexpectedDisconnect", true, KviOption_sectFlagFrame),
206 	BOOL_OPTION("KeepQueriesOpenOnUnexpectedDisconnect", true, KviOption_sectFlagFrame),
207 	BOOL_OPTION("UseLagMeterEngine", true, KviOption_sectFlagConnection | KviOption_resetRestartLagMeter),
208 	BOOL_OPTION("ShowLagOnContextDisplay", true, KviOption_sectFlagFrame),
209 	BOOL_OPTION("DisableBanListRequestOnJoin", false, KviOption_sectFlagConnection),
210 	BOOL_OPTION("DisableBanExceptionListRequestOnJoin", true, KviOption_sectFlagConnection),
211 	BOOL_OPTION("DisableInviteListRequestOnJoin", true, KviOption_sectFlagConnection),
212 	BOOL_OPTION("DisableWhoRequestOnJoin", false, KviOption_sectFlagConnection),
213 	BOOL_OPTION("ShowDockExtension", true, KviOption_sectFlagFrame),
214 	BOOL_OPTION("DccAddressByIrcDns", false, KviOption_sectFlagFrame),
215 	BOOL_OPTION("HighlightOnlyNormalMsg", false, KviOption_sectFlagFrame),
216 	BOOL_OPTION("HighlightOnlyNormalMsgQueryToo", false, KviOption_sectFlagFrame),
217 	BOOL_OPTION("HighlightOnlyNormalMsgHighlightInChanToo", false, KviOption_sectFlagFrame),
218 	BOOL_OPTION("HighlightOnlyAtCustomHighlightLevel", false, KviOption_sectFlagFrame),
219 	BOOL_OPTION("DccBrokenBouncerHack", false, KviOption_sectFlagDcc),
220 	BOOL_OPTION("ExternalMessagesToActiveWindow", true, KviOption_sectFlagConnection),
221 	BOOL_OPTION("IgnoreChannelAvatarRequestsWhenNoAvatarSet", true, KviOption_sectFlagAvatar),
222 	BOOL_OPTION("FlashQueryWindowOnNewMessages", true, KviOption_sectFlagFrame),
223 	BOOL_OPTION("ConfirmCloseWhenThereAreConnections", true, KviOption_sectFlagFrame),
224 	BOOL_OPTION("UseWindowsDesktopForTransparency", false, KviOption_sectFlagGui | KviOption_resetUpdatePseudoTransparency | KviOption_groupTheme),
225 	BOOL_OPTION("CtcpRequestsToActiveWindow", false, KviOption_sectFlagConnection),
226 	BOOL_OPTION("ServerRepliesToActiveWindow", true, KviOption_sectFlagConnection),
227 	BOOL_OPTION("ServerNoticesToActiveWindow", false, KviOption_sectFlagConnection),
228 	BOOL_OPTION("ServicesNoticesToActiveWindow", false, KviOption_sectFlagConnection),
229 	BOOL_OPTION("SortWindowListItemsByName", true, KviOption_sectFlagConnection | KviOption_groupTheme),
230 	BOOL_OPTION("ShowWindowListToolTips", true, KviOption_sectFlagConnection | KviOption_groupTheme),
231 	BOOL_OPTION("ShowUserListViewToolTips", true, KviOption_sectFlagConnection | KviOption_groupTheme),
232 	BOOL_OPTION("WhoisRepliesToActiveWindow", true, KviOption_sectFlagConnection),
233 	BOOL_OPTION("PopupNotifierOnNotifyOnLine", true, KviOption_sectFlagConnection),
234 	BOOL_OPTION("EnableNotifier", true, KviOption_sectFlagConnection),
235 	BOOL_OPTION("DccSendForceIdleStep", false, KviOption_sectFlagDcc),
236 	BOOL_OPTION("StatusBarVisible", true, KviOption_sectFlagFrame),
237 	BOOL_OPTION("TrackLastReadTextViewLine", true, KviOption_sectFlagFrame),
238 	BOOL_OPTION("KeepChannelOpenOnPart", false, KviOption_sectFlagFrame),
239 	BOOL_OPTION("StripMircColorsInUserMessages", false, KviOption_sectFlagFrame | KviOption_groupTheme),
240 	BOOL_OPTION("DoNotSuggestRestoreDefaultScript", false, KviOption_sectFlagFrame),
241 	BOOL_OPTION("LimitDccSendSpeed", false, KviOption_sectFlagDcc),
242 	BOOL_OPTION("LimitDccRecvSpeed", false, KviOption_sectFlagDcc),
243 	BOOL_OPTION("IgnoreModuleVersions", false, KviOption_sectFlagFrame),
244 	BOOL_OPTION("EnableInputHistory", true, KviOption_sectFlagInput | KviOption_resetUpdateGui),
245 	BOOL_OPTION("UseSpecialColorForTimestamp", true, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
246 	BOOL_OPTION("EnableAwayListUpdates", true, KviOption_sectFlagFrame),
247 	BOOL_OPTION("ShowAvatarsInUserlist", true, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
248 	BOOL_OPTION("ShowUserListStatisticLabel", true, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
249 #ifdef COMPILE_ON_MAC
250 	BOOL_OPTION("ShowIconsInPopupMenus", false, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme | KviOption_resetReloadImages),
251 #else
252 	BOOL_OPTION("ShowIconsInPopupMenus", true, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme | KviOption_resetReloadImages),
253 #endif
254 	BOOL_OPTION("ScriptErrorsToDebugWindow", false, KviOption_sectFlagFrame),
255 	BOOL_OPTION("ShowMinimizedDebugWindow", true, KviOption_sectFlagFrame),
256 	BOOL_OPTION("ShowExtendedInfoInQueryLabel", true, KviOption_resetUpdateGui),
257 	BOOL_OPTION("UseUserListColorsAsNickColors", true, KviOption_sectFlagIrcView | KviOption_groupTheme),
258 	BOOL_OPTION("GzipLogs", false, KviOption_sectFlagLogging),
259 	BOOL_OPTION("UseFullWordHighlighting", false, KviOption_sectFlagIrcView),
260 	BOOL_OPTION("NotifierFlashing", true, KviOption_sectFlagFrame),
261 	BOOL_OPTION("CommandlineInUserFriendlyModeByDefault", true, KviOption_sectFlagFrame),
262 	BOOL_OPTION("EnableVisualEffects", true, KviOption_resetUpdateGui),
263 	BOOL_OPTION("DCCFileTransferReplaceOutgoingSpacesWithUnderscores", true, KviOption_sectFlagDcc),
264 	BOOL_OPTION("DoNotUpscaleAvatars", true, KviOption_sectFlagIrcView | KviOption_resetUpdateGui),
265 	BOOL_OPTION("UseDifferentColorForOwnNick", false, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
266 	BOOL_OPTION("CloseInTray", false, KviOption_sectFlagFrame | KviOption_resetUpdateGui),
267 	BOOL_OPTION("StartupMinimized", false, KviOption_sectFlagFrame),
268 	BOOL_OPTION("SortReceivedByDccFilesByNicks", false, KviOption_sectFlagDcc),
269 	BOOL_OPTION("LogChannelHistory", true, KviOption_sectFlagConnection),
270 	BOOL_OPTION("ClassicWindowListSetMaximumButtonWidth", true, KviOption_groupTheme | KviOption_sectFlagGeometry | KviOption_resetUpdateGui),
271 	BOOL_OPTION("KeepChannelsOpenOnDisconnect", true, KviOption_sectFlagFrame),
272 	BOOL_OPTION("KeepQueriesOpenOnDisconnect", true, KviOption_sectFlagFrame),
273 	BOOL_OPTION("HideWindowToolButtons", true, KviOption_sectFlagFrame),
274 	BOOL_OPTION("HideInputToolButtons", true, KviOption_sectFlagFrame),
275 	BOOL_OPTION("StripControlCodesInLogs", false, KviOption_sectFlagLogging),
276 	BOOL_OPTION("EnableTrayIconFlashing", true, KviOption_sectFlagFrame),
277 	BOOL_OPTION("UseFlatClassicWindowListButtons", false, KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme),
278 	BOOL_OPTION("StripMsgTypeInLogs", false, KviOption_sectFlagLogging),
279 	BOOL_OPTION("UseLevelBasedTrayNotification", false, KviOption_sectFlagFrame),
280 	BOOL_OPTION("MuteAllSounds", false, KviOption_sectFlagFrame),
281 	BOOL_OPTION("CreateMinimizedChannels", false, KviOption_sectFlagFrame),
282 	BOOL_OPTION("ShowNetworkNameForConsoleWindowListEntry", true, KviOption_sectFlagFrame | KviOption_resetUpdateGui),
283 	BOOL_OPTION("DrawGenderIcons", true, KviOption_sectFlagFrame | KviOption_resetUpdateGui | KviOption_groupTheme),
284 	BOOL_OPTION("PrependGenderInfoToRealname", true, KviOption_sectFlagConnection),
285 	BOOL_OPTION("UseIdentServiceOnlyOnConnect", true, KviOption_sectFlagConnection | KviOption_resetRestartIdentd),
286 	BOOL_OPTION("UseSystemUrlHandlers", true, KviOption_sectFlagUrl),
287 	BOOL_OPTION("ScaleAvatarsOnLoad", true, KviOption_sectFlagAvatar),
288 	BOOL_OPTION("NotifierFading", true, KviOption_sectFlagFrame),
289 	BOOL_OPTION("PickRandomIpAddressForRoundRobinServers", true, KviOption_sectFlagConnection),
290 	BOOL_OPTION("PrependAvatarInfoToRealname", true, KviOption_sectFlagConnection),
291 	BOOL_OPTION("EnableAnimatedAvatars", true, KviOption_sectFlagGui | KviOption_resetUpdateGui),
292 	BOOL_OPTION("EnableAnimatedSmiles", true, KviOption_sectFlagGui | KviOption_resetUpdateGui),
293 	BOOL_OPTION("PlaceNickWithNonAlphaCharsAtEnd", true, KviOption_sectFlagGui | KviOption_resetUpdateGui),
294 	BOOL_OPTION("PasteLastLogOnChannelJoin", false, KviOption_sectFlagLogging),
295 	BOOL_OPTION("PasteLastLogOnQueryJoin", false, KviOption_sectFlagLogging),
296 	BOOL_OPTION("UseSpecifiedSmartColorForOwnNick", false, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
297 	BOOL_OPTION("ZshLikeNickCompletion", false, KviOption_sectFlagInput),
298 	BOOL_OPTION("AutoAcceptDccVideo", false, KviOption_sectFlagDcc),
299 	BOOL_OPTION("CreateMinimizedDccVideo", false, KviOption_sectFlagDcc),
300 	BOOL_OPTION("CreateMinimizedDccVideoWhenAutoAccepted", true, KviOption_sectFlagDcc),
301 	BOOL_OPTION("ShowTaskBarButton", true, KviOption_sectFlagFrame),
302 	BOOL_OPTION("FlashDccChatWindowOnNewMessages", true, KviOption_sectFlagFrame),
303 	BOOL_OPTION("PopupNotifierOnNewDccChatMessages", true, KviOption_sectFlagFrame),
304 	BOOL_OPTION("UseAwayMessage", true, KviOption_sectFlagConnection),
305 	BOOL_OPTION("DisableQuietBanListRequestOnJoin", true, KviOption_sectFlagConnection),
306 	BOOL_OPTION("UseWindowListCloseButton", false, KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme),
307 	BOOL_OPTION("FrameIsMaximized", false, KviOption_sectFlagGeometry),
308 	BOOL_OPTION("PrependNickColorInfoToRealname", true, KviOption_sectFlagConnection),
309 	BOOL_OPTION("DontShowNotifierIfActiveWindowIsFullScreen", true, KviOption_sectFlagFrame),
310 	BOOL_OPTION("WheelScrollsWindowsList", true, KviOption_sectFlagWindowList),
311 	BOOL_OPTION("AcceptMismatchedPortDccResumeRequests", false, KviOption_sectFlagDcc),
312 	BOOL_OPTION("EnableUrlLinkToolTip", true, KviOption_sectFlagGui),
313 	BOOL_OPTION("EnableHostLinkToolTip", true, KviOption_sectFlagGui),
314 	BOOL_OPTION("EnableServerLinkToolTip", true, KviOption_sectFlagGui),
315 	BOOL_OPTION("EnableModeLinkToolTip", true, KviOption_sectFlagGui),
316 	BOOL_OPTION("EnableNickLinkToolTip", true, KviOption_sectFlagGui),
317 	BOOL_OPTION("EnableChannelLinkToolTip", true, KviOption_sectFlagGui),
318 	BOOL_OPTION("EnableEscapeLinkToolTip", true, KviOption_sectFlagGui),
319 	BOOL_OPTION("UseDBusNotifier", false, KviOption_sectFlagConnection),
320 	BOOL_OPTION("UseKDENotifier", false, KviOption_sectFlagConnection),
321 	BOOL_OPTION("CaseSensitiveHighlighting", false, KviOption_sectFlagIrcView),
322 	BOOL_OPTION("MinimizeInTray", false, KviOption_sectFlagFrame | KviOption_resetUpdateGui),
323 	BOOL_OPTION("DisplayNotifierOnPrimaryScreen", true, KviOption_sectFlagFrame),
324 	BOOL_OPTION("ShowDialogOnChannelCtcpPage", false, KviOption_sectFlagCtcp),
325 	BOOL_OPTION("PopupNotifierOnNewNotices", true, KviOption_sectFlagFrame),
326 	BOOL_OPTION("UserListViewUseAwayColor", true, KviOption_sectFlagUserListView | KviOption_resetUpdateGui),
327 	BOOL_OPTION("ShowUserFlagForChannelsInWindowList", true, KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme),
328 	BOOL_OPTION("EnableCustomCursorWidth", false, KviOption_sectFlagGui | KviOption_resetUpdateGui),
329 	BOOL_OPTION("ShowFavoriteServersOnly", false, KviOption_sectFlagFrame),
330 	BOOL_OPTION("RequireControlToCopy", false, KviOption_sectFlagIrcView),
331 	BOOL_OPTION("Send64BitAckInDccRecv", false, KviOption_sectFlagDcc),
332 	BOOL_OPTION("ShowTreeWindowListHandle", true, KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme),
333 	BOOL_OPTION("MenuBarVisible", true, KviOption_sectFlagFrame | KviOption_resetUpdateGui),
334 	BOOL_OPTION("WarnAboutHidingMenuBar", true, KviOption_sectFlagFrame),
335 	BOOL_OPTION("WhoRepliesToActiveWindow", false, KviOption_sectFlagConnection),
336 	BOOL_OPTION("DropConnectionOnSaslFailure", false, KviOption_sectFlagConnection)
337 };
338 
339 // NOTICE: REUSE EQUIVALENT UNUSED KviOption_bool in KviOptions.h ENTRIES BEFORE ADDING NEW ENTRIES ABOVE
340 
341 #define STRING_OPTION(_txt, _val, _flags) KviStringOption(KVI_STRING_OPTIONS_PREFIX _txt, _val, _flags)
342 
343 // FIXME: #warning "Remove the unused string options here!"
344 
345 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
346 #define RUN_THE_BROWSER "run cmd.exe /c start \"\" \"$0\""
347 #else
348 #ifdef COMPILE_ON_MAC
349 #define RUN_THE_BROWSER "run open $0"
350 #else
351 #define RUN_THE_BROWSER "run xdg-open $0"
352 #endif
353 #endif
354 
355 KviStringOption g_stringOptionsTable[KVI_NUM_STRING_OPTIONS] = {
356 	STRING_OPTION("Nickname1", "", KviOption_sectFlagUser),
357 	STRING_OPTION("Nickname2", "", KviOption_sectFlagUser),
358 	STRING_OPTION("Nickname3", "", KviOption_sectFlagUser),
359 	STRING_OPTION("Nickname4", "", KviOption_sectFlagUser),
360 	STRING_OPTION("Username", KVI_DEFAULT_USERNAME, KviOption_sectFlagUser),
361 	STRING_OPTION("Realname", KVI_DEFAULT_REALNAME, KviOption_sectFlagUser),
362 	STRING_OPTION("LocalHostIp", "127.0.0.1", KviOption_sectFlagIrcSocket),
363 	STRING_OPTION("PartMessage", KVI_DEFAULT_PART_MESSAGE, KviOption_sectFlagConnection),
364 	STRING_OPTION("QuitMessage", KVI_DEFAULT_QUIT_MESSAGE, KviOption_sectFlagConnection),
365 	STRING_OPTION("UrlHttpCommand", RUN_THE_BROWSER, KviOption_sectFlagUrl),
366 	STRING_OPTION("ExtendedPrivmsgPrefix", "[", KviOption_sectFlagIrcView | KviOption_groupTheme),
367 	STRING_OPTION("ExtendedPrivmsgPostfix", "] ", KviOption_sectFlagIrcView | KviOption_groupTheme),
368 	STRING_OPTION("CtcpVersionPostfix", "", KviOption_sectFlagCtcp),
369 	STRING_OPTION("CtcpUserInfoOther", KVI_DEFAULT_CTCP_USERINFO_REPLY, KviOption_sectFlagUser),
370 	STRING_OPTION("CtcpSourcePostfix", "", KviOption_sectFlagCtcp),
371 	STRING_OPTION("UrlFtpCommand", RUN_THE_BROWSER, KviOption_sectFlagUrl),
372 	STRING_OPTION("UrlHttpsCommand", RUN_THE_BROWSER, KviOption_sectFlagUrl),
373 	STRING_OPTION("UrlMailtoCommand", RUN_THE_BROWSER, KviOption_sectFlagUrl),
374 	STRING_OPTION("PreferredMediaPlayer", "auto", KviOption_sectFlagFrame),
375 	STRING_OPTION("UrlFileCommand", RUN_THE_BROWSER, KviOption_sectFlagUrl),
376 	STRING_OPTION("NickCompletionPostfix", ": ", KviOption_sectFlagInput),
377 	STRING_OPTION("UrlUnknownCommand", RUN_THE_BROWSER, KviOption_sectFlagUrl),
378 	STRING_OPTION("IPv4ConnectionBindAddress", "", KviOption_sectFlagConnection),
379 	STRING_OPTION("IPv6ConnectionBindAddress", "", KviOption_sectFlagConnection),
380 	STRING_OPTION("DccVoiceSoundDevice", "/dev/dsp", KviOption_sectFlagDcc),
381 	STRING_OPTION("DccVoiceMixerDevice", "/dev/mixer", KviOption_sectFlagDcc),
382 	STRING_OPTION("AwayMessage", KVI_DEFAULT_AWAY_MESSAGE, KviOption_sectFlagConnection),
383 	STRING_OPTION("IdentdUser", "kvirc", KviOption_sectFlagConnection | KviOption_resetRestartIdentd),
384 	STRING_OPTION("DccListenDefaultInterface", "ppp0", KviOption_sectFlagDcc),
385 	STRING_OPTION("CustomAwayNick", KVI_DEFAULT_AWAY_NICK, KviOption_sectFlagConnection),
386 	STRING_OPTION("DefaultDccFakeAddress", "", KviOption_sectFlagDcc),
387 	STRING_OPTION("CtcpPageReply", KVI_DEFAULT_CTCP_PAGE_REPLY, KviOption_sectFlagCtcp),
388 	STRING_OPTION("SSLCertificatePath", "", KviOption_sectFlagConnection | KviOption_encodePath),
389 	STRING_OPTION("SSLCertificatePass", "", KviOption_sectFlagConnection),
390 	STRING_OPTION("SSLPrivateKeyPath", "", KviOption_sectFlagConnection | KviOption_encodePath),
391 	STRING_OPTION("SSLPrivateKeyPass", "", KviOption_sectFlagConnection),
392 	STRING_OPTION("SoundSystem", "unknown", KviOption_sectFlagFrame),
393 	STRING_OPTION("DefaultUserMode", "", KviOption_sectFlagUser),
394 	STRING_OPTION("LastImageDialogPath", "", KviOption_sectFlagUser | KviOption_encodePath),
395 	STRING_OPTION("IconThemeSubdir", "", KviOption_sectFlagUser | KviOption_groupTheme | KviOption_resetReloadImages | KviOption_encodePath),
396 	STRING_OPTION("IncomingPath", "", KviOption_sectFlagUser | KviOption_encodePath),
397 	STRING_OPTION("MyAvatar", "", KviOption_sectFlagUser),
398 	STRING_OPTION("DefaultTextEncoding", "", KviOption_sectFlagFrame),
399 	STRING_OPTION("WinampTextEncoding", "", KviOption_sectFlagFrame),
400 	STRING_OPTION("Mp3TagsEncoding", "", KviOption_sectFlagFrame),
401 	STRING_OPTION("CtcpUserInfoAge", "", KviOption_sectFlagUser),
402 	STRING_OPTION("CtcpUserInfoGender", "", KviOption_sectFlagUser),
403 	STRING_OPTION("CtcpUserInfoLocation", "", KviOption_sectFlagUser),
404 	STRING_OPTION("CtcpUserInfoLanguages", "", KviOption_sectFlagUser),
405 	STRING_OPTION("WordSplitters", ",\"';:|.%^~!\\$#()?", KviOption_sectFlagIrcView),
406 	STRING_OPTION("OnNewQueryOpenedSound", "", KviOption_sectFlagFrame),
407 	STRING_OPTION("OnHighlightedMessageSound", "", KviOption_sectFlagFrame),
408 	STRING_OPTION("OnMeKickedSound", "", KviOption_sectFlagFrame),
409 	STRING_OPTION("OnQueryMessageSound", "", KviOption_sectFlagFrame),
410 	STRING_OPTION("IrcViewTimestampFormat", "[hh:mm:ss]", KviOption_sectFlagIrcView),
411 	STRING_OPTION("PreferredTorrentClient", "auto", KviOption_sectFlagFrame),
412 	STRING_OPTION("DefaultSrvEncoding", "", KviOption_sectFlagFrame),
413 	STRING_OPTION("LogsPath", "", KviOption_sectFlagUser | KviOption_encodePath),
414 	STRING_OPTION("LogsDynamicPath", "", KviOption_sectFlagUser | KviOption_encodePath),
415 	STRING_OPTION("LogsExportPath", "", KviOption_sectFlagUser | KviOption_encodePath)
416 };
417 
418 #define STRINGLIST_OPTION(_txt, _flags) \
419 	KviStringListOption(KVI_STRINGLIST_OPTIONS_PREFIX _txt, QStringList(), _flags)
420 
421 #define STRINGLIST_OPTION_WITHDEFAULT(_txt, _flags, _def) \
422 	KviStringListOption(KVI_STRINGLIST_OPTIONS_PREFIX _txt, QStringList(_def), _flags)
423 
424 KviStringListOption g_stringlistOptionsTable[KVI_NUM_STRINGLIST_OPTIONS] = {
425 	STRINGLIST_OPTION("HighlightWords", KviOption_sectFlagIrcView),
426 	STRINGLIST_OPTION("SpamWords", KviOption_sectFlagAntiSpam),
427 	STRINGLIST_OPTION_WITHDEFAULT("RecentChannels", KviOption_sectFlagRecent, "#kvirc" KVI_RECENT_CHANNELS_SEPARATOR "freenode"),
428 	STRINGLIST_OPTION("RecentServers", KviOption_sectFlagRecent),
429 	STRINGLIST_OPTION("RecentNicknames", KviOption_sectFlagRecent),
430 	STRINGLIST_OPTION("ModuleExtensionToolbars", KviOption_sectFlagFrame),
431 	STRINGLIST_OPTION("ImageSearchPaths", KviOption_sectFlagFrame | KviOption_encodePath),
432 	STRINGLIST_OPTION("RecentIrcUrls", KviOption_sectFlagRecent),
433 	STRINGLIST_OPTION("SpellCheckerDictionaries", KviOption_sectFlagInput)
434 };
435 
436 #define MIRC_COLOR_OPTION(_num, _red, _green, _blue)                               \
437 	KviColorOption(KVI_MIRCCOLOR_OPTIONS_PREFIX _num, QColor(_red, _green, _blue), \
438 	    KviOption_sectFlagMircColor | KviOption_resetUpdateGui | KviOption_groupTheme)
439 
440 KviColorOption g_mirccolorOptionsTable[KVI_NUM_MIRCCOLOR_OPTIONS] = {
441 	MIRC_COLOR_OPTION("0", 255, 255, 255),
442 	MIRC_COLOR_OPTION("1", 0, 0, 0),
443 	MIRC_COLOR_OPTION("2", 0, 0, 140),
444 	MIRC_COLOR_OPTION("3", 0, 100, 0),
445 	MIRC_COLOR_OPTION("4", 230, 0, 0),
446 	MIRC_COLOR_OPTION("5", 150, 0, 0),
447 	MIRC_COLOR_OPTION("6", 80, 0, 80),
448 	MIRC_COLOR_OPTION("7", 255, 90, 0),
449 	MIRC_COLOR_OPTION("8", 255, 255, 0),
450 	MIRC_COLOR_OPTION("9", 0, 255, 0),
451 	MIRC_COLOR_OPTION("10", 0, 150, 180),
452 	MIRC_COLOR_OPTION("11", 170, 170, 255),
453 	MIRC_COLOR_OPTION("12", 15, 15, 255),
454 	MIRC_COLOR_OPTION("13", 200, 0, 200),
455 	MIRC_COLOR_OPTION("14", 80, 80, 80),
456 	MIRC_COLOR_OPTION("15", 170, 170, 170)
457 };
458 
459 #define COLOR_OPTION(_name, _red, _green, _blue, _alpha, _flags) \
460 	KviColorOption(KVI_COLOR_OPTIONS_PREFIX _name,               \
461 	    QColor(_red, _green, _blue, _alpha),                     \
462 	    _flags | KviOption_resetUpdateGui | KviOption_groupTheme | KviOption_resetUpdatePseudoTransparency)
463 
464 KviColorOption g_colorOptionsTable[KVI_NUM_COLOR_OPTIONS] = {
465 	COLOR_OPTION("WindowListNormalText", 0, 0, 0, 255, KviOption_sectFlagWindowList),
466 	COLOR_OPTION("WindowListMinimizedText", 60, 60, 60, 255, KviOption_sectFlagWindowList),
467 	COLOR_OPTION("WindowListHighlight1Text", 0, 16, 144, 255, KviOption_sectFlagWindowList),
468 	COLOR_OPTION("WindowListHighlight2Text", 32, 0, 255, 255, KviOption_sectFlagWindowList),
469 	COLOR_OPTION("WindowListProgressBar", 180, 180, 180, 255, KviOption_sectFlagWindowList),
470 	COLOR_OPTION("UserListViewAwayForeground", 143, 143, 143, 255, KviOption_sectFlagUserListView),
471 	COLOR_OPTION("UserListViewOwnForeground", 255, 255, 0, 255, KviOption_sectFlagUserListView),
472 	COLOR_OPTION("UserListViewIrcOpForeground", 200, 0, 0, 255, KviOption_sectFlagUserListView),
473 	COLOR_OPTION("NotifierBackground", 255, 255, 255, 255, KviOption_sectFlagNotifier),
474 	COLOR_OPTION("NotifierForeground", 0, 0, 0, 255, KviOption_sectFlagNotifier),
475 	COLOR_OPTION("NotifierTitleForeground", 255, 255, 255, 255, KviOption_sectFlagNotifier),
476 	COLOR_OPTION("IrcViewBackground", 255, 255, 255, 255, KviOption_sectFlagIrcView),
477 	COLOR_OPTION("InputBackground", 255, 255, 255, 255, KviOption_sectFlagInput),
478 	COLOR_OPTION("InputSelectionBackground", 0, 0, 0, 255, KviOption_sectFlagInput),
479 	COLOR_OPTION("InputSelectionForeground", 255, 255, 255, 255, KviOption_sectFlagInput),
480 	COLOR_OPTION("InputCursor", 0, 0, 0, 255, KviOption_sectFlagInput),
481 	COLOR_OPTION("InputControl", 200, 100, 0, 255, KviOption_sectFlagInput),
482 	COLOR_OPTION("InputForeground", 0, 0, 0, 255, KviOption_sectFlagInput),
483 	COLOR_OPTION("UserListViewBackground", 255, 255, 255, 255, KviOption_sectFlagUserListView),
484 	COLOR_OPTION("UserListViewOpForeground", 200, 0, 0, 255, KviOption_sectFlagUserListView),
485 	COLOR_OPTION("UserListViewVoiceForeground", 0, 0, 200, 255, KviOption_sectFlagUserListView),
486 	COLOR_OPTION("UserListViewNormalForeground", 0, 0, 0, 255, KviOption_sectFlagUserListView),
487 	COLOR_OPTION("UserListViewSelectionBackground", 0, 0, 0, 255, KviOption_sectFlagUserListView),
488 	COLOR_OPTION("UserListViewSelectionForeground", 255, 255, 255, 255, KviOption_sectFlagUserListView),
489 	COLOR_OPTION("LabelBackground", 255, 255, 255, 255, KviOption_sectFlagLabel),
490 	COLOR_OPTION("LabelForeground", 0, 0, 0, 255, KviOption_sectFlagLabel),
491 	COLOR_OPTION("GlobalTransparencyFade", 255, 255, 255, 255, KviOption_sectFlagGui),
492 	COLOR_OPTION("IrcToolBarAppletBackground", 255, 255, 255, 255, KviOption_sectFlagIrcToolBar),
493 	COLOR_OPTION("IrcToolBarAppletBorder", 110, 110, 110, 255, KviOption_sectFlagIrcToolBar),
494 	COLOR_OPTION("IrcToolBarAppletFont", 0, 0, 0, 255, KviOption_sectFlagIrcToolBar),
495 	COLOR_OPTION("TreeWindowListBackground", 255, 255, 255, 255, KviOption_sectFlagWindowList),
496 	COLOR_OPTION("TreeWindowListActiveBackground", 200, 200, 200, 255, KviOption_sectFlagWindowList),
497 	COLOR_OPTION("TreeWindowListForeground", 0, 0, 0, 255, KviOption_sectFlagWindowList),
498 	COLOR_OPTION("TreeWindowListActiveForeground", 0, 0, 0, 255, KviOption_sectFlagWindowList),
499 	COLOR_OPTION("TreeWindowListHighlight1Foreground", 0, 16, 144, 255, KviOption_sectFlagWindowList),
500 	COLOR_OPTION("TreeWindowListHighlight2Foreground", 32, 0, 255, 255, KviOption_sectFlagWindowList),
501 	COLOR_OPTION("TreeWindowListProgress", 150, 150, 150, 255, KviOption_sectFlagWindowList),
502 	COLOR_OPTION("UserListViewHalfOpForeground", 119, 0, 178, 255, KviOption_sectFlagUserListView),
503 	COLOR_OPTION("WindowListHighlight3Text", 128, 20, 255, 255, KviOption_sectFlagWindowList),
504 	COLOR_OPTION("WindowListHighlight4Text", 220, 0, 255, 255, KviOption_sectFlagWindowList),
505 	COLOR_OPTION("WindowListHighlight5Text", 255, 0, 0, 255, KviOption_sectFlagWindowList),
506 	COLOR_OPTION("TreeWindowListHighlight3Foreground", 128, 0, 255, 255, KviOption_sectFlagWindowList),
507 	COLOR_OPTION("TreeWindowListHighlight4Foreground", 220, 0, 255, 255, KviOption_sectFlagWindowList),
508 	COLOR_OPTION("TreeWindowListHighlight5Foreground", 255, 0, 0, 255, KviOption_sectFlagWindowList),
509 	COLOR_OPTION("UserListViewChanAdminForeground", 83, 54, 5, 255, KviOption_sectFlagUserListView),
510 	COLOR_OPTION("UserListViewUserOpForeground", 0, 127, 178, 255, KviOption_sectFlagUserListView),
511 	COLOR_OPTION("UserListViewGrid", 110, 110, 110, 255, KviOption_sectFlagUserListView),
512 	COLOR_OPTION("UserListViewChanOwnerForeground", 81, 87, 111, 255, KviOption_sectFlagUserListView),
513 	COLOR_OPTION("IrcViewMarkLine", 40, 40, 40, 255, KviOption_sectFlagIrcView)
514 };
515 
516 #define IC_COLOR_OPTION(_num, _red, _green, _blue) \
517 	KviColorOption(                                \
518 	    KVI_ICCOLOR_OPTIONS_PREFIX _num,           \
519 	    QColor(_red, _green, _blue),               \
520 	    KviOption_sectFlagWindowList | KviOption_resetUpdateGui | KviOption_groupTheme)
521 
522 KviColorOption g_iccolorOptionsTable[KVI_NUM_ICCOLOR_OPTIONS] = {
523 	IC_COLOR_OPTION("0", 250, 250, 0),
524 	IC_COLOR_OPTION("1", 0, 0, 0),
525 	IC_COLOR_OPTION("2", 0, 0, 200),
526 	IC_COLOR_OPTION("3", 200, 0, 0),
527 	IC_COLOR_OPTION("4", 255, 255, 255),
528 	IC_COLOR_OPTION("5", 0, 150, 190),
529 	IC_COLOR_OPTION("6", 0, 130, 0),
530 	IC_COLOR_OPTION("7", 150, 0, 170)
531 };
532 
533 #define PIXMAP_OPTION(_name, _flags)     \
534 	KviPixmapOption(                     \
535 	    KVI_PIXMAP_OPTIONS_PREFIX _name, \
536 	    KviPixmap(),                     \
537 	    _flags | KviOption_resetUpdateGui)
538 
539 KviPixmapOption g_pixmapOptionsTable[KVI_NUM_PIXMAP_OPTIONS] = {
540 	PIXMAP_OPTION("IrcViewBackground", KviOption_sectFlagIrcView | KviOption_groupTheme),
541 	PIXMAP_OPTION("InputBackground", KviOption_sectFlagInput | KviOption_groupTheme),
542 	PIXMAP_OPTION("UserListViewBackground", KviOption_sectFlagUserListView | KviOption_groupTheme),
543 	PIXMAP_OPTION("LabelBackground", KviOption_sectFlagLabel | KviOption_groupTheme),
544 	PIXMAP_OPTION("MyAvatar", KviOption_sectFlagUser),
545 	PIXMAP_OPTION("IrcToolBarAppletBackground", KviOption_sectFlagIrcToolBar | KviOption_groupTheme),
546 	PIXMAP_OPTION("TreeWindowListBackground", KviOption_sectFlagWindowList | KviOption_groupTheme),
547 	PIXMAP_OPTION("GlobalTransparencyBackground", KviOption_sectFlagGui | KviOption_resetUpdatePseudoTransparency | KviOption_groupTheme),
548 	PIXMAP_OPTION("NotifierBackground", KviOption_sectFlagNotifier | KviOption_groupTheme)
549 };
550 
551 #define UINT_OPTION(_name, _value, _flags) \
552 	KviUIntOption(                         \
553 	    KVI_UINT_OPTIONS_PREFIX _name,     \
554 	    _value,                            \
555 	    _flags)
556 
557 KviUIntOption g_uintOptionsTable[KVI_NUM_UINT_OPTIONS] = {
558 	UINT_OPTION("IrcSocketTimeout", 60, KviOption_sectFlagIrcSocket),
559 	UINT_OPTION("ModuleCleanupTimerInterval", 90, KviOption_sectFlagModules),
560 	UINT_OPTION("ModuleCleanupTimeout", 180, KviOption_sectFlagModules),
561 	UINT_OPTION("MaxCtcpRequests", 5, KviOption_sectFlagCtcp),
562 	UINT_OPTION("CtcpFloodCheckInterval", 10, KviOption_sectFlagCtcp),
563 	UINT_OPTION("TotalConnectionTime", 0, 0),
564 	UINT_OPTION("DccSocketTimeout", 360, KviOption_sectFlagDcc),
565 	UINT_OPTION("DccSendIdleStepInMSec", 30, KviOption_sectFlagDcc),
566 	UINT_OPTION("DccSendPacketSize", 16384, KviOption_sectFlagDcc),
567 	UINT_OPTION("GlobalTransparencyParentFadeFactor", 10, KviOption_sectFlagGui | KviOption_resetUpdatePseudoTransparency | KviOption_groupTheme),
568 	UINT_OPTION("GlobalTransparencyChildFadeFactor", 50, KviOption_sectFlagGui | KviOption_resetUpdatePseudoTransparency | KviOption_groupTheme),
569 	UINT_OPTION("NotifyListCheckTimeInSecs", 180, KviOption_sectFlagConnection),
570 	UINT_OPTION("SocketQueueFlushTimeout", 500, KviOption_sectFlagIrcSocket),
571 	UINT_OPTION("OutgoingTrafficLimitUSeconds", 2000000, KviOption_sectFlagIrcSocket),
572 	UINT_OPTION("NotifyListIsOnDelayTimeInSecs", 6, KviOption_sectFlagConnection),
573 	UINT_OPTION("NotifyListUserhostDelayTimeInSecs", 6, KviOption_sectFlagConnection),
574 	UINT_OPTION("TreeWindowListMinimumWidth", 24, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList),
575 	UINT_OPTION("AvatarOfferTimeoutInSecs", 60, KviOption_sectFlagAvatar),
576 	UINT_OPTION("IrcViewMaxBufferSize", 1024, KviOption_sectFlagIrcView),
577 	UINT_OPTION("IrcViewToolTipTimeoutInMsec", 1200, KviOption_sectFlagIrcView),
578 	UINT_OPTION("IrcViewToolTipHideTimeoutInMsec", 12000, KviOption_sectFlagIrcView),
579 	UINT_OPTION("DccVoicePreBufferSize", 32000, KviOption_sectFlagDcc),
580 	UINT_OPTION("IdentdPort", 113, KviOption_sectFlagConnection | KviOption_resetRestartIdentd),
581 	UINT_OPTION("AvatarScaleWidth", 80, KviOption_sectFlagAvatar | KviOption_resetUpdateGui),
582 	UINT_OPTION("AvatarScaleHeight", 80, KviOption_sectFlagAvatar | KviOption_resetUpdateGui),
583 	UINT_OPTION("DccMinPort", 30000, KviOption_sectFlagDcc),
584 	UINT_OPTION("DccMaxPort", 31000, KviOption_sectFlagDcc),
585 	UINT_OPTION("SoundOfferTimeoutInSecs", 60, KviOption_sectFlagConnection),
586 	UINT_OPTION("MaximumRequestedAvatarSize", 524288, KviOption_sectFlagAvatar),
587 	UINT_OPTION("GlobalWindowOpacityPercent", 100, KviOption_sectFlagGui | KviOption_resetUpdatePseudoTransparency | KviOption_groupTheme),
588 	UINT_OPTION("PasteDelay", 2000, KviOption_sectFlagInput),
589 	UINT_OPTION("MaxDccSendTransfers", 10, KviOption_sectFlagDcc),
590 	UINT_OPTION("MaxDccSlots", 64, KviOption_sectFlagDcc),
591 	UINT_OPTION("TileMethod", 5, KviOption_sectFlagMdi),
592 	UINT_OPTION("LagMeterHeartbeat", 5000, KviOption_sectFlagConnection | KviOption_resetRestartLagMeter),
593 	UINT_OPTION("LagAlarmTime", 120000, KviOption_sectFlagConnection),
594 	UINT_OPTION("WindowListButtonMinWidth", 100, KviOption_sectFlagWindowList),
595 	UINT_OPTION("OutputVerbosityLevel", KVI_VERBOSITY_LEVEL_NORMAL, KviOption_sectFlagFrame),
596 	UINT_OPTION("IrcContextAppletWidth", 160, KviOption_sectFlagFrame),
597 	UINT_OPTION("MinHighlightLevel", 0, KviOption_uintMinHighlightLevel),
598 	UINT_OPTION("UserListViewGridType", 3, KviOption_sectFlagUserListView | KviOption_resetUpdateGui | KviOption_groupTheme),
599 	UINT_OPTION("WindowListMaximumRows", 2, KviOption_sectFlagFrame),
600 	UINT_OPTION("MaxAutoReconnectAttempts", 15, KviOption_sectFlagFrame),
601 	UINT_OPTION("AutoReconnectDelay", 10, KviOption_sectFlagFrame),
602 	UINT_OPTION("MaxDccSendSpeed", 0, KviOption_sectFlagFrame),
603 	UINT_OPTION("MaxDccRecvSpeed", 0, KviOption_sectFlagFrame),
604 	UINT_OPTION("TimeStampForeground", KviControlCodes::DarkGray, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
605 	UINT_OPTION("TimeStampBackground", KviControlCodes::Transparent, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
606 	UINT_OPTION("UserExperienceLevel", 1, KviOption_sectFlagUser),
607 	UINT_OPTION("ClassicWindowListMaximumButtonWidth", 100, KviOption_sectFlagGeometry | KviOption_resetUpdateGui | KviOption_groupTheme),
608 	UINT_OPTION("DefaultBanType", 9, KviOption_sectFlagIrcSocket),
609 	UINT_OPTION("IrcViewPixmapAlign", 0, KviOption_sectFlagIrcView | KviOption_groupTheme),
610 	UINT_OPTION("UserListPixmapAlign", 0, KviOption_sectFlagFrame | KviOption_groupTheme),
611 	UINT_OPTION("ToolBarAppletPixmapAlign", 0, KviOption_sectFlagFrame | KviOption_groupTheme),
612 	UINT_OPTION("TreeWindowListPixmapAlign", 0, KviOption_sectFlagFrame | KviOption_groupTheme),
613 	UINT_OPTION("InputPixmapAlign", 0, KviOption_sectFlagFrame | KviOption_groupTheme),
614 	UINT_OPTION("AutoFlushLogs", 30, KviOption_sectFlagFrame),
615 	UINT_OPTION("MinTrayLowLevelMessage", 1, KviOption_sectFlagFrame),
616 	UINT_OPTION("MinTrayHighLevelMessage", 4, KviOption_sectFlagFrame),
617 	UINT_OPTION("IdentdOutputMode", KviIdentdOutputMode::Quiet, KviOption_sectFlagConnection),
618 	UINT_OPTION("ScaleAvatarsOnLoadHeight", 640, KviOption_sectFlagAvatar),
619 	UINT_OPTION("ScaleAvatarsOnLoadWidth", 480, KviOption_sectFlagAvatar),
620 	UINT_OPTION("NotifierActiveTransparency", 100, KviOption_sectFlagNotifier | KviOption_groupTheme),
621 	UINT_OPTION("NotifierInactiveTransparency", 80, KviOption_sectFlagNotifier | KviOption_groupTheme), // this may be cool but it confuses the user
622 	UINT_OPTION("IrcViewMarkerStyle", 0, KviOption_sectFlagIrcView | KviOption_groupTheme),
623 	UINT_OPTION("IrcViewMarkerSize", 1, KviOption_sectFlagIrcView | KviOption_groupTheme),
624 	UINT_OPTION("UrlMouseClickNum", 2, KviOption_sectFlagUrl),
625 	UINT_OPTION("NotifierAutoHideTime", 30, KviOption_sectFlagModules),
626 	UINT_OPTION("LinesToPasteOnChannelJoin", 10, KviOption_sectFlagLogging),
627 	UINT_OPTION("DaysIntervalToPasteOnChannelJoin", 10, KviOption_sectFlagLogging),
628 	UINT_OPTION("LinesToPasteOnQueryJoin", 10, KviOption_sectFlagLogging),
629 	UINT_OPTION("DaysIntervalToPasteOnQueryJoin", 10, KviOption_sectFlagLogging),
630 	UINT_OPTION("SpacesToExpandTabulationInput", 4, KviOption_sectFlagInput),
631 	UINT_OPTION("UserIrcViewOwnForeground", 4, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
632 	UINT_OPTION("UserIrcViewOwnBackground", 8, KviOption_sectFlagIrcView | KviOption_resetUpdateGui | KviOption_groupTheme),
633 	UINT_OPTION("NotifierPixmapAlign", 0, KviOption_sectFlagNotifier | KviOption_groupTheme),
634 	UINT_OPTION("OutputDatetimeFormat", 0, KviOption_sectFlagIrcView),
635 	UINT_OPTION("OnJoinRequestsDelay", 1, KviOption_sectFlagConnection), // FIXME: Wouldn't this be nicer in msecs defaulting to 100-200 ?
636 	UINT_OPTION("ToolBarIconSize", 22, KviOption_groupTheme | KviOption_resetReloadImages),
637 	UINT_OPTION("ToolBarButtonStyle", 0, KviOption_groupTheme), // 0 = Qt::ToolButtonIconOnly
638 	UINT_OPTION("MaximumBlowFishKeySize", 56, KviOption_sectFlagNone),
639 	UINT_OPTION("CustomCursorWidth", 1, KviOption_resetUpdateGui),
640 	UINT_OPTION("UserListMinimumWidth", 100, KviOption_sectFlagUserListView | KviOption_resetUpdateGui | KviOption_groupTheme)
641 };
642 
643 #define FONT_OPTION(_name, _face, _size, _flags) \
644 	KviFontOption(                               \
645 	    KVI_FONT_OPTIONS_PREFIX _name,           \
646 	    QFont(_face, _size),                     \
647 	    _flags | KviOption_groupTheme)
648 
649 KviFontOption g_fontOptionsTable[KVI_NUM_FONT_OPTIONS] = {
650 #if defined(COMPILE_ON_WINDOWS) || defined(COMPILE_ON_MINGW)
651 	FONT_OPTION("IrcView", "Arial", 9, KviOption_sectFlagIrcView | KviOption_resetUpdateGui),
652 	FONT_OPTION("Input", "Arial", 12, KviOption_sectFlagInput | KviOption_resetUpdateGui),
653 	FONT_OPTION("UserListView", "Arial", 9, KviOption_sectFlagUserListView | KviOption_resetUpdateGui),
654 	FONT_OPTION("Label", "Arial", 9, KviOption_sectFlagLabel | KviOption_resetUpdateGui),
655 	FONT_OPTION("Application", "Arial", 9, KviOption_sectFlagGui | KviOption_resetUpdateAppFont),
656 	FONT_OPTION("WindowList", "Arial", 9, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList),
657 	FONT_OPTION("TreeWindowList", "Arial", 9, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList),
658 	FONT_OPTION("Notifier", "Arial", 9, KviOption_sectFlagNotifier | KviOption_resetUpdateGui),
659 	FONT_OPTION("NotifierTitle", "Arial", 9, KviOption_sectFlagNotifier | KviOption_resetUpdateGui)
660 #elif defined(COMPILE_ON_MAC)
661 	FONT_OPTION("IrcView", "Lucida Grande", 12, KviOption_sectFlagIrcView | KviOption_resetUpdateGui),
662 	FONT_OPTION("Input", "Lucida Grande", 12, KviOption_sectFlagInput | KviOption_resetUpdateGui),
663 	FONT_OPTION("UserListView", "Lucida Grande", 12, KviOption_sectFlagUserListView | KviOption_resetUpdateGui),
664 	FONT_OPTION("Label", "Lucida Grande", 12, KviOption_sectFlagLabel | KviOption_resetUpdateGui),
665 	FONT_OPTION("Application", "Lucida Grande", 12, KviOption_sectFlagGui | KviOption_resetUpdateAppFont),
666 	FONT_OPTION("WindowList", "Lucida Grande", 12, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList),
667 	FONT_OPTION("TreeWindowList", "Lucida Grande", 12, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList),
668 	FONT_OPTION("Notifier", "Lucida Grande", 12, KviOption_sectFlagNotifier | KviOption_resetUpdateNotifier),
669 	FONT_OPTION("NotifierTitle", "Lucida Grande", 12, KviOption_sectFlagNotifier | KviOption_resetUpdateNotifier)
670 #else
671 	FONT_OPTION("IrcView", "sans-serif", 10, KviOption_sectFlagIrcView | KviOption_resetUpdateGui),
672 	FONT_OPTION("Input", "sans-serif", 10, KviOption_sectFlagInput | KviOption_resetUpdateGui),
673 	FONT_OPTION("UserListView", "sans-serif", 10, KviOption_sectFlagUserListView | KviOption_resetUpdateGui),
674 	FONT_OPTION("Label", "sans-serif", 10, KviOption_sectFlagLabel | KviOption_resetUpdateGui),
675 	FONT_OPTION("Application", "sans-serif", 10, KviOption_sectFlagGui | KviOption_resetUpdateAppFont),
676 	FONT_OPTION("WindowList", "sans-serif", 10, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList),
677 	FONT_OPTION("TreeWindowList", "sans-serif", 10, KviOption_sectFlagWindowList | KviOption_resetUpdateWindowList),
678 	FONT_OPTION("Notifier", "sans-serif", 10, KviOption_sectFlagNotifier | KviOption_resetUpdateNotifier),
679 	FONT_OPTION("NotifierTitle", "sans-serif", 10, KviOption_sectFlagNotifier | KviOption_resetUpdateNotifier)
680 #endif
681 };
682 
683 #define MSGTYPE_OPTION(_name, _text, _icon, _levl)                                                               \
684 	KviMessageTypeSettingsOption(                                                                                \
685 	    KVI_MSGTYPE_OPTIONS_PREFIX _name,                                                                        \
686 	    KviMessageTypeSettings(_text, _icon, KviControlCodes::Black, KviControlCodes::Transparent, true, _levl), \
687 	    KviOption_sectFlagMsgType | KviOption_groupTheme)
688 
689 #define MSGTYPE_OPTION_SPEC(_name, _text, _icon, _fore, _back, _levl)    \
690 	KviMessageTypeSettingsOption(                                        \
691 	    KVI_MSGTYPE_OPTIONS_PREFIX _name,                                \
692 	    KviMessageTypeSettings(_text, _icon, _fore, _back, true, _levl), \
693 	    KviOption_sectFlagMsgType | KviOption_groupTheme)
694 
695 // FIXME: #warning "FIX THE ICONS HERE!!!"
696 KviMessageTypeSettingsOption g_msgtypeOptionsTable[KVI_NUM_MSGTYPE_OPTIONS] = {
697 	MSGTYPE_OPTION("Echo", __tr_no_lookup("Normal text"), KviIconManager::None, KVI_MSGTYPE_LEVEL_1),
698 	MSGTYPE_OPTION_SPEC("Selection", __tr_no_lookup("Selection"), KviIconManager::None, KviControlCodes::White, KviControlCodes::Black, KVI_MSGTYPE_LEVEL_1),
699 	MSGTYPE_OPTION_SPEC("Highlight", __tr_no_lookup("Highlighted text"), KviIconManager::HighlightText, KviControlCodes::White, KviControlCodes::Black, KVI_MSGTYPE_LEVEL_5),
700 	MSGTYPE_OPTION_SPEC("URL", __tr_no_lookup("URL foreground"), KviIconManager::Url, KviControlCodes::Blue, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_1),
701 	MSGTYPE_OPTION_SPEC("Link", __tr_no_lookup("Link mouse hover foreground"), KviIconManager::Url, KviControlCodes::Blue, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_1),
702 	MSGTYPE_OPTION_SPEC("ParserError", __tr_no_lookup("Parser error"), KviIconManager::ParserError, KviControlCodes::Red, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_2),
703 	MSGTYPE_OPTION_SPEC("ParserWarning", __tr_no_lookup("Parser warning"), KviIconManager::ParserWarning, KviControlCodes::Red, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_2),
704 	MSGTYPE_OPTION("HostLookup", __tr_no_lookup("Host lookup result"), KviIconManager::Server, KVI_MSGTYPE_LEVEL_3),
705 	MSGTYPE_OPTION("SocketMessage", __tr_no_lookup("Socket message"), KviIconManager::SocketMessage, KVI_MSGTYPE_LEVEL_1),
706 	MSGTYPE_OPTION("SocketWarning", __tr_no_lookup("Socket warning"), KviIconManager::SocketWarning, KVI_MSGTYPE_LEVEL_3),
707 	MSGTYPE_OPTION_SPEC("SocketError", __tr_no_lookup("Socket error"), KviIconManager::SocketError, KviControlCodes::Red, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_3),
708 	MSGTYPE_OPTION_SPEC("SystemError", __tr_no_lookup("System error"), KviIconManager::SystemError, KviControlCodes::Red, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_3),
709 	MSGTYPE_OPTION("RAW", __tr_no_lookup("RAW data to server"), KviIconManager::Raw, KVI_MSGTYPE_LEVEL_1),
710 	MSGTYPE_OPTION("Connection", __tr_no_lookup("Connection status"), KviIconManager::World, KVI_MSGTYPE_LEVEL_1),
711 	MSGTYPE_OPTION("SystemWarning", __tr_no_lookup("System warning"), KviIconManager::SystemWarning, KVI_MSGTYPE_LEVEL_3),
712 	MSGTYPE_OPTION("SystemMessage", __tr_no_lookup("System message"), KviIconManager::SystemMessage, KVI_MSGTYPE_LEVEL_1),
713 	MSGTYPE_OPTION("UnhandledReply", __tr_no_lookup("Unhandled server reply"), KviIconManager::UnHandled, KVI_MSGTYPE_LEVEL_1),
714 	MSGTYPE_OPTION("ServerInfo", __tr_no_lookup("Server information"), KviIconManager::ServerInfo, KVI_MSGTYPE_LEVEL_1),
715 	MSGTYPE_OPTION("MOTD", __tr_no_lookup("Server message of the day"), KviIconManager::Motd, KVI_MSGTYPE_LEVEL_1),
716 	MSGTYPE_OPTION("ServerPing", __tr_no_lookup("Server ping"), KviIconManager::ServerPing, KVI_MSGTYPE_LEVEL_1),
717 	MSGTYPE_OPTION("Join", __tr_no_lookup("Join message"), KviIconManager::Join, KVI_MSGTYPE_LEVEL_1),
718 	MSGTYPE_OPTION("Part", __tr_no_lookup("Part message"), KviIconManager::Part, KVI_MSGTYPE_LEVEL_1),
719 	MSGTYPE_OPTION("Unrecognized", __tr_no_lookup("Unrecognized/broken message"), KviIconManager::Unrecognized, KVI_MSGTYPE_LEVEL_2),
720 	MSGTYPE_OPTION("Topic", __tr_no_lookup("Topic message"), KviIconManager::Topic, KVI_MSGTYPE_LEVEL_3),
721 	MSGTYPE_OPTION("OwnPrivateMessage", __tr_no_lookup("Own private message"), KviIconManager::OwnPrivMsg, KVI_MSGTYPE_LEVEL_1),
722 	MSGTYPE_OPTION("ChannelPrivateMessage", __tr_no_lookup("Channel private message"), KviIconManager::ChanPrivMsg, KVI_MSGTYPE_LEVEL_4),
723 	MSGTYPE_OPTION("QueryPrivateMessage", __tr_no_lookup("Query private message"), KviIconManager::QueryPrivMsg, KVI_MSGTYPE_LEVEL_4),
724 	MSGTYPE_OPTION("CTCPReply", __tr_no_lookup("CTCP reply"), KviIconManager::CtcpReply, KVI_MSGTYPE_LEVEL_3),
725 	MSGTYPE_OPTION("CTCPRequestReplied", __tr_no_lookup("CTCP request replied"), KviIconManager::CtcpRequestReplied, KVI_MSGTYPE_LEVEL_3),
726 	MSGTYPE_OPTION("CTCPRequestIgnored", __tr_no_lookup("CTCP request ignored"), KviIconManager::CtcpRequestIgnored, KVI_MSGTYPE_LEVEL_3),
727 	MSGTYPE_OPTION("CTCPRequestFlood", __tr_no_lookup("CTCP request flood warning"), KviIconManager::CtcpRequestFlood, KVI_MSGTYPE_LEVEL_3),
728 	MSGTYPE_OPTION("CTCPRequestUnknown", __tr_no_lookup("CTCP request unknown"), KviIconManager::CtcpRequestUnknown, KVI_MSGTYPE_LEVEL_3),
729 	MSGTYPE_OPTION("Action", __tr_no_lookup("User action"), KviIconManager::Action, KVI_MSGTYPE_LEVEL_3),
730 	MSGTYPE_OPTION("AvatarChange", __tr_no_lookup("Avatar change"), KviIconManager::Avatar, KVI_MSGTYPE_LEVEL_3),
731 	MSGTYPE_OPTION("Quit", __tr_no_lookup("Quit message"), KviIconManager::Quit, KVI_MSGTYPE_LEVEL_1),
732 	MSGTYPE_OPTION("Split", __tr_no_lookup("Split message"), KviIconManager::Split, KVI_MSGTYPE_LEVEL_2),
733 	MSGTYPE_OPTION("QuitSplit", __tr_no_lookup("Quit on netsplit message"), KviIconManager::QuitSplit, KVI_MSGTYPE_LEVEL_2),
734 	MSGTYPE_OPTION("Nick", __tr_no_lookup("Nick changes"), KviIconManager::Nick, KVI_MSGTYPE_LEVEL_2),
735 	MSGTYPE_OPTION("Op", __tr_no_lookup("+o mode change"), KviIconManager::Op, KVI_MSGTYPE_LEVEL_2),
736 	MSGTYPE_OPTION("Deop", __tr_no_lookup("-o mode change"), KviIconManager::DeOp, KVI_MSGTYPE_LEVEL_2),
737 	MSGTYPE_OPTION("Voice", __tr_no_lookup("+v mode change"), KviIconManager::Voice, KVI_MSGTYPE_LEVEL_2),
738 	MSGTYPE_OPTION("Devoice", __tr_no_lookup("-v mode change"), KviIconManager::DeVoice, KVI_MSGTYPE_LEVEL_2),
739 	MSGTYPE_OPTION("Mode", __tr_no_lookup("Multiple user mode change"), KviIconManager::Mode, KVI_MSGTYPE_LEVEL_2), //This is a generic icon for both user/chan
740 	MSGTYPE_OPTION("Key", __tr_no_lookup("Channel key change"), KviIconManager::Key, KVI_MSGTYPE_LEVEL_2),
741 	MSGTYPE_OPTION("Limit", __tr_no_lookup("Channel limit change"), KviIconManager::Limit, KVI_MSGTYPE_LEVEL_2),
742 	MSGTYPE_OPTION("Ban", __tr_no_lookup("+b mode change"), KviIconManager::Ban, KVI_MSGTYPE_LEVEL_2),
743 	MSGTYPE_OPTION("Unban", __tr_no_lookup("-b mode change"), KviIconManager::UnBan, KVI_MSGTYPE_LEVEL_2),
744 	MSGTYPE_OPTION("BanExcept", __tr_no_lookup("+e mode change"), KviIconManager::BanExcept, KVI_MSGTYPE_LEVEL_2),
745 	MSGTYPE_OPTION("BanUnexcept", __tr_no_lookup("-e mode change"), KviIconManager::BanUnExcept, KVI_MSGTYPE_LEVEL_2),
746 	MSGTYPE_OPTION("InviteExcept", __tr_no_lookup("+I mode change"), KviIconManager::InviteExcept, KVI_MSGTYPE_LEVEL_2),
747 	MSGTYPE_OPTION("InviteUnexcept", __tr_no_lookup("-I mode change"), KviIconManager::InviteUnExcept, KVI_MSGTYPE_LEVEL_2),
748 	MSGTYPE_OPTION("ChanMode", __tr_no_lookup("Multiple channel mode change"), KviIconManager::Mode, KVI_MSGTYPE_LEVEL_2), //This is a generic icon for both user/chan
749 	MSGTYPE_OPTION("WHO", __tr_no_lookup("Who reply"), KviIconManager::Who, KVI_MSGTYPE_LEVEL_3),
750 	MSGTYPE_OPTION("DCCRequest", __tr_no_lookup("DCC request"), KviIconManager::DccRequest, KVI_MSGTYPE_LEVEL_3),
751 	MSGTYPE_OPTION("DCCMsg", __tr_no_lookup("DCC message"), KviIconManager::DccMsg, KVI_MSGTYPE_LEVEL_2),
752 	MSGTYPE_OPTION("DCCError", __tr_no_lookup("DCC error"), KviIconManager::DccError, KVI_MSGTYPE_LEVEL_3),
753 	MSGTYPE_OPTION("NicknameProblem", __tr_no_lookup("Nickname problem"), KviIconManager::NickNameProblem, KVI_MSGTYPE_LEVEL_3),
754 	MSGTYPE_OPTION("WHOISUser", __tr_no_lookup("WHOIS user reply"), KviIconManager::WhoisUser, KVI_MSGTYPE_LEVEL_3),
755 	MSGTYPE_OPTION("WHOISChannels", __tr_no_lookup("WHOIS channels reply"), KviIconManager::WhoisChannels, KVI_MSGTYPE_LEVEL_3),
756 	MSGTYPE_OPTION("WHOISIdle", __tr_no_lookup("WHOIS idle reply"), KviIconManager::WhoisIdle, KVI_MSGTYPE_LEVEL_3),
757 	MSGTYPE_OPTION("WHOISServer", __tr_no_lookup("WHOIS server reply"), KviIconManager::WhoisServer, KVI_MSGTYPE_LEVEL_3),
758 	MSGTYPE_OPTION("WHOISOther", __tr_no_lookup("WHOIS other reply"), KviIconManager::WhoisOther, KVI_MSGTYPE_LEVEL_3),
759 	MSGTYPE_OPTION("CreationTime", __tr_no_lookup("Channel creation time reply"), KviIconManager::Time, KVI_MSGTYPE_LEVEL_1),
760 	MSGTYPE_OPTION("NotifyOnLine", __tr_no_lookup("Notify list joins"), KviIconManager::NotifyOnLine, KVI_MSGTYPE_LEVEL_3),
761 	MSGTYPE_OPTION("NotifyOffLine", __tr_no_lookup("Notify list leaves"), KviIconManager::NotifyOffLine, KVI_MSGTYPE_LEVEL_3),
762 	MSGTYPE_OPTION("OwnPrivmsgCrypted", __tr_no_lookup("Own encrypted private message"), KviIconManager::OwnPrivMsgCrypted, KVI_MSGTYPE_LEVEL_1),
763 	MSGTYPE_OPTION("ChanPrivmsgCrypted", __tr_no_lookup("Channel encrypted private message"), KviIconManager::ChanPrivMsgCrypted, KVI_MSGTYPE_LEVEL_3),
764 	MSGTYPE_OPTION("QueryPrivmsgCrypted", __tr_no_lookup("Query encrypted private message"), KviIconManager::QueryPrivMsgCrypted, KVI_MSGTYPE_LEVEL_3),
765 	MSGTYPE_OPTION("DCCChatMsg", __tr_no_lookup("DCC chat message"), KviIconManager::DccChatMsg, KVI_MSGTYPE_LEVEL_3),
766 	MSGTYPE_OPTION("DCCChatMsgCrypted", __tr_no_lookup("Encrypted DCC chat message"), KviIconManager::DccChatMsgCrypted, KVI_MSGTYPE_LEVEL_3),
767 	MSGTYPE_OPTION("IRC", __tr_no_lookup("Login operations completed"), KviIconManager::Irc, KVI_MSGTYPE_LEVEL_1),
768 	MSGTYPE_OPTION("Kick", __tr_no_lookup("Kick action"), KviIconManager::Kick, KVI_MSGTYPE_LEVEL_2),
769 	MSGTYPE_OPTION("Links", __tr_no_lookup("Links reply"), KviIconManager::Links, KVI_MSGTYPE_LEVEL_1),
770 	MSGTYPE_OPTION("Spam", __tr_no_lookup("Spam report"), KviIconManager::Spam, KVI_MSGTYPE_LEVEL_3),
771 	MSGTYPE_OPTION("ICQ", __tr_no_lookup("ICQ message"), KviIconManager::Icq, KVI_MSGTYPE_LEVEL_1),
772 	MSGTYPE_OPTION("ICQMessage", __tr_no_lookup("ICQ user-message"), KviIconManager::Message, KVI_MSGTYPE_LEVEL_1),
773 	MSGTYPE_OPTION("ICQMessageSent", __tr_no_lookup("Outgoing ICQ user-message"), KviIconManager::MessageSent, KVI_MSGTYPE_LEVEL_1),
774 	MSGTYPE_OPTION("ChannelNotice", __tr_no_lookup("Channel notice"), KviIconManager::ChannelNotice, KVI_MSGTYPE_LEVEL_3),
775 	MSGTYPE_OPTION("ChannelNoticeCrypted", __tr_no_lookup("Encrypted channel notice"), KviIconManager::ChannelNoticeCrypted, KVI_MSGTYPE_LEVEL_3),
776 	MSGTYPE_OPTION("QueryNotice", __tr_no_lookup("Query notice"), KviIconManager::QueryNotice, KVI_MSGTYPE_LEVEL_3),
777 	MSGTYPE_OPTION("QueryNoticeCrypted", __tr_no_lookup("Encrypted query notice"), KviIconManager::QueryNoticeCrypted, KVI_MSGTYPE_LEVEL_3),
778 	MSGTYPE_OPTION("ServerNotice", __tr_no_lookup("Server notice"), KviIconManager::ServerNotice, KVI_MSGTYPE_LEVEL_3),
779 	MSGTYPE_OPTION("HalfOp", __tr_no_lookup("Halfop mode change"), KviIconManager::HalfOp, KVI_MSGTYPE_LEVEL_2),
780 	MSGTYPE_OPTION("CTCPReplyUnknown", __tr_no_lookup("Unknown CTCP reply"), KviIconManager::CtcpReplyUnknown, KVI_MSGTYPE_LEVEL_3),
781 	MSGTYPE_OPTION("NickServ", __tr_no_lookup("NickServ message"), KviIconManager::NickServ, KVI_MSGTYPE_LEVEL_3),
782 	MSGTYPE_OPTION("ChanServ", __tr_no_lookup("ChanServ message"), KviIconManager::ChanServ, KVI_MSGTYPE_LEVEL_1),
783 	MSGTYPE_OPTION("Away", __tr_no_lookup("Away message"), KviIconManager::Away, KVI_MSGTYPE_LEVEL_3),
784 	MSGTYPE_OPTION("Ident", __tr_no_lookup("Ident message"), KviIconManager::Ident, KVI_MSGTYPE_LEVEL_3),
785 	MSGTYPE_OPTION("List", __tr_no_lookup("Channel list message"), KviIconManager::List, KVI_MSGTYPE_LEVEL_1),
786 	MSGTYPE_OPTION("HalfDeOp", __tr_no_lookup("Half-deop mode change"), KviIconManager::HalfDeOp, KVI_MSGTYPE_LEVEL_2),
787 	MSGTYPE_OPTION("Invite", __tr_no_lookup("Invite message"), KviIconManager::Invite, KVI_MSGTYPE_LEVEL_3),
788 	MSGTYPE_OPTION("Multimedia", __tr_no_lookup("Multimedia message"), KviIconManager::MultiMedia, KVI_MSGTYPE_LEVEL_2),
789 	MSGTYPE_OPTION("QueryTrace", __tr_no_lookup("Query trace message"), KviIconManager::QueryTrace, KVI_MSGTYPE_LEVEL_1),
790 	MSGTYPE_OPTION("Wallops", __tr_no_lookup("Wallops message"), KviIconManager::WallOps, KVI_MSGTYPE_LEVEL_3),
791 	MSGTYPE_OPTION("JoinError", __tr_no_lookup("Join error message"), KviIconManager::NoChannel, KVI_MSGTYPE_LEVEL_3),
792 	MSGTYPE_OPTION("BroadcastPrivmsg", __tr_no_lookup("Broadcast private message"), KviIconManager::BroadcastPrivMsg, KVI_MSGTYPE_LEVEL_3),
793 	MSGTYPE_OPTION("BroadcastNotice", __tr_no_lookup("Broadcast notice"), KviIconManager::BroadcastNotice, KVI_MSGTYPE_LEVEL_3),
794 	MSGTYPE_OPTION("MeKick", __tr_no_lookup("Am kicked"), KviIconManager::MeKick, KVI_MSGTYPE_LEVEL_5),
795 	MSGTYPE_OPTION("MeOp", __tr_no_lookup("Am op'd"), KviIconManager::MeOp, KVI_MSGTYPE_LEVEL_5),
796 	MSGTYPE_OPTION("MeVoice", __tr_no_lookup("Am voiced"), KviIconManager::MeVoice, KVI_MSGTYPE_LEVEL_5),
797 	MSGTYPE_OPTION("MeDeOp", __tr_no_lookup("Am deop'd"), KviIconManager::MeDeOp, KVI_MSGTYPE_LEVEL_5),
798 	MSGTYPE_OPTION("MeDeVoice", __tr_no_lookup("Am devoiced"), KviIconManager::MeDeVoice, KVI_MSGTYPE_LEVEL_5),
799 	MSGTYPE_OPTION("MeHalfOp", __tr_no_lookup("Am halfop'd"), KviIconManager::MeHalfOp, KVI_MSGTYPE_LEVEL_5),
800 	MSGTYPE_OPTION("MeDeHalfOp", __tr_no_lookup("Am de-halfop'd"), KviIconManager::MeDeHalfOp, KVI_MSGTYPE_LEVEL_5),
801 	MSGTYPE_OPTION("MeBan", __tr_no_lookup("Ban matching my mask"), KviIconManager::MeBan, KVI_MSGTYPE_LEVEL_5),
802 	MSGTYPE_OPTION("MeUnban", __tr_no_lookup("Unban matching my mask"), KviIconManager::MeUnBan, KVI_MSGTYPE_LEVEL_5),
803 	MSGTYPE_OPTION("MeBanExcept", __tr_no_lookup("Ban exception matching my mask"), KviIconManager::MeBanExcept, KVI_MSGTYPE_LEVEL_5),
804 	MSGTYPE_OPTION("MeBanUnExcept", __tr_no_lookup("Ban unexception matching my mask"), KviIconManager::MeBanUnExcept, KVI_MSGTYPE_LEVEL_5),
805 	MSGTYPE_OPTION("MeInviteExcept", __tr_no_lookup("Invite exception matching my mask"), KviIconManager::MeInviteExcept, KVI_MSGTYPE_LEVEL_5),
806 	MSGTYPE_OPTION("MeInviteUnexcept", __tr_no_lookup("Invite unexception matching my mask"), KviIconManager::MeInviteUnExcept, KVI_MSGTYPE_LEVEL_5),
807 	MSGTYPE_OPTION("Ignore", __tr_no_lookup("Ignored user message"), KviIconManager::Ignore, KVI_MSGTYPE_LEVEL_3),
808 	MSGTYPE_OPTION("Stats", __tr_no_lookup("Server statistics"), KviIconManager::Stats, KVI_MSGTYPE_LEVEL_1),
809 	MSGTYPE_OPTION("SSL", __tr_no_lookup("SSL message"), KviIconManager::Ssl, KVI_MSGTYPE_LEVEL_1),
810 	MSGTYPE_OPTION("Search", __tr_no_lookup("Search"), KviIconManager::Search, KVI_MSGTYPE_LEVEL_1),
811 	MSGTYPE_OPTION("GenericSuccess", __tr_no_lookup("Generic success"), KviIconManager::CyanSquare, KVI_MSGTYPE_LEVEL_3),
812 	MSGTYPE_OPTION("GenericStatus", __tr_no_lookup("Generic status"), KviIconManager::GreenSquare, KVI_MSGTYPE_LEVEL_2),
813 	MSGTYPE_OPTION("GenericVerbose", __tr_no_lookup("Generic verbose message"), KviIconManager::DarkGreenSquare, KVI_MSGTYPE_LEVEL_1),
814 	MSGTYPE_OPTION("GenericWarning", __tr_no_lookup("Generic warning"), KviIconManager::YellowSquare, KVI_MSGTYPE_LEVEL_3),
815 	MSGTYPE_OPTION_SPEC("GenericError", __tr_no_lookup("Generic error"), KviIconManager::RedSquare, KviControlCodes::Red, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_5),
816 	MSGTYPE_OPTION_SPEC("GenericCritical", __tr_no_lookup("Generic critical error"), KviIconManager::BlackSquare, KviControlCodes::Red, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_5),
817 	MSGTYPE_OPTION("ChanAdmin", __tr_no_lookup("Chan admin status set"), KviIconManager::ChanAdmin, KVI_MSGTYPE_LEVEL_5),
818 	MSGTYPE_OPTION("ChanUnAdmin", __tr_no_lookup("Chan admin status unset"), KviIconManager::ChanUnAdmin, KVI_MSGTYPE_LEVEL_5),
819 	MSGTYPE_OPTION("MeChanAdmin", __tr_no_lookup("Own chan admin status set"), KviIconManager::MeChanAdmin, KVI_MSGTYPE_LEVEL_5),
820 	MSGTYPE_OPTION("MeChanUnAdmin", __tr_no_lookup("Own chan admin status unset"), KviIconManager::MeChanUnAdmin, KVI_MSGTYPE_LEVEL_5),
821 	MSGTYPE_OPTION("UserOp", __tr_no_lookup("Userop mode change"), KviIconManager::UserOp, KVI_MSGTYPE_LEVEL_2),
822 	MSGTYPE_OPTION("UserDeOp", __tr_no_lookup("User-deop mode change"), KviIconManager::DeUserOp, KVI_MSGTYPE_LEVEL_2),
823 	MSGTYPE_OPTION("MeUserOp", __tr_no_lookup("Am userop'd"), KviIconManager::MeUserOp, KVI_MSGTYPE_LEVEL_5),
824 	MSGTYPE_OPTION("MeDeUserOp", __tr_no_lookup("Am de-userop'd"), KviIconManager::MeDeUserOp, KVI_MSGTYPE_LEVEL_5),
825 	MSGTYPE_OPTION_SPEC("Verbose", __tr_no_lookup("Verbose/Debug"), KviIconManager::BinaryText, KviControlCodes::DarkGray, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_1),
826 	MSGTYPE_OPTION("ChanOwner", __tr_no_lookup("Chan owner status set"), KviIconManager::ChanOwner, KVI_MSGTYPE_LEVEL_5),
827 	MSGTYPE_OPTION("ChanUnOwner", __tr_no_lookup("Chan owner status unset"), KviIconManager::ChanUnOwner, KVI_MSGTYPE_LEVEL_5),
828 	MSGTYPE_OPTION("MeChanOwner", __tr_no_lookup("Own chan owner status set"), KviIconManager::MeChanOwner, KVI_MSGTYPE_LEVEL_5),
829 	MSGTYPE_OPTION("MeChanUnOwner", __tr_no_lookup("Own chan owner status unset"), KviIconManager::MeChanUnOwner, KVI_MSGTYPE_LEVEL_5),
830 	MSGTYPE_OPTION_SPEC("ServerError", __tr_no_lookup("Server error"), KviIconManager::ServerError, KviControlCodes::Red, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_5),
831 	MSGTYPE_OPTION_SPEC("Help", __tr_no_lookup("Help"), KviIconManager::Help, KviControlCodes::DarkGreen, KviControlCodes::Transparent, KVI_MSGTYPE_LEVEL_1),
832 	MSGTYPE_OPTION("TextEncoding", __tr_no_lookup("Text encoding server message"), KviIconManager::TextEncoding, KVI_MSGTYPE_LEVEL_1),
833 	MSGTYPE_OPTION("BitTorrent", __tr_no_lookup("BitTorrent message"), KviIconManager::Gnutella, KVI_MSGTYPE_LEVEL_2),
834 	MSGTYPE_OPTION("IrcOp", __tr_no_lookup("IRC Op status set"), KviIconManager::IrcOp, KVI_MSGTYPE_LEVEL_5),
835 	MSGTYPE_OPTION("DeIrcOp", __tr_no_lookup("IRC Op status unset"), KviIconManager::DeIrcOp, KVI_MSGTYPE_LEVEL_5),
836 	MSGTYPE_OPTION("MeIrcOp", __tr_no_lookup("Own IRC Op status set"), KviIconManager::MeIrcOp, KVI_MSGTYPE_LEVEL_5),
837 	MSGTYPE_OPTION("MeDeIrcOp", __tr_no_lookup("Own IRC Op status unset"), KviIconManager::MeDeIrcOp, KVI_MSGTYPE_LEVEL_5),
838 	MSGTYPE_OPTION("Cap", __tr_no_lookup("Extended capability message"), KviIconManager::ServerInfo, KVI_MSGTYPE_LEVEL_1),
839 	MSGTYPE_OPTION("ChanURL", __tr_no_lookup("Channel URL"), KviIconManager::Url, KVI_MSGTYPE_LEVEL_3),
840 	MSGTYPE_OPTION("MemoServ", __tr_no_lookup("MemoServ message"), KviIconManager::MemoServ, KVI_MSGTYPE_LEVEL_1),
841 	MSGTYPE_OPTION("Log", __tr_no_lookup("Log message"), KviIconManager::Log, KVI_MSGTYPE_LEVEL_1),
842 	MSGTYPE_OPTION("ActionCrypted", __tr_no_lookup("Encrypted user action"), KviIconManager::ActionCrypted, KVI_MSGTYPE_LEVEL_3),
843 	MSGTYPE_OPTION("OwnAction", __tr_no_lookup("Own action"), KviIconManager::OwnAction, KVI_MSGTYPE_LEVEL_1),
844 	MSGTYPE_OPTION("OwnActionCrypted", __tr_no_lookup("Own encrypted action"), KviIconManager::OwnActionCrypted, KVI_MSGTYPE_LEVEL_1),
845 	MSGTYPE_OPTION("TopicCrypted", __tr_no_lookup("Encrypted topic message"), KviIconManager::TopicCrypted, KVI_MSGTYPE_LEVEL_3),
846 };
847 
848 static const char * options_section_table[KVI_NUM_OPTION_SECT_FLAGS] = {
849 	"None", "Frame", "Mdi", "Windows",
850 	"WindowList", "IrcView", "MsgType", "MircColor",
851 	"Input", "UserParser", "Connection", "IrcSocket",
852 	"User", "UserListView", "Label", "Modules",
853 	"Ctcp", "Dcc", "Gui", "IrcToolBar",
854 	"Logging", "AntiSpam", "Avatar", "Url",
855 	"Recent", "Geometry", "Notifier"
856 };
857 
config_set_section(int flag,KviConfigurationFile * cfg)858 static void config_set_section(int flag, KviConfigurationFile * cfg)
859 {
860 	int index = flag & KviOption_sectMask;
861 	if((index < KVI_NUM_OPTION_SECT_FLAGS) && (index >= 0))
862 		cfg->setGroup(options_section_table[index]);
863 	else
864 		cfg->setGroup(""); // Default group
865 }
866 
loadOptions()867 void KviApplication::loadOptions()
868 {
869 	QString buffer;
870 	if(getReadOnlyConfigPath(buffer, KVI_CONFIGFILE_MAIN))
871 	{
872 		KviConfigurationFile cfg(buffer, KviConfigurationFile::Read);
873 
874 		int i;
875 
876 #define READ_OPTIONS(_num, _table, _readFnc)                               \
877 	for(i = 0; i < _num; i++)                                              \
878 	{                                                                      \
879 		config_set_section(_table[i].flags, &cfg);                         \
880 		_table[i].option = cfg._readFnc(_table[i].name, _table[i].option); \
881 	}
882 
883 		READ_OPTIONS(KVI_NUM_RECT_OPTIONS, g_rectOptionsTable, readRectEntry)
884 		READ_OPTIONS(KVI_NUM_BOOL_OPTIONS, g_boolOptionsTable, readBoolEntry)
885 		READ_OPTIONS(KVI_NUM_STRING_OPTIONS, g_stringOptionsTable, readEntry)
886 		READ_OPTIONS(KVI_NUM_COLOR_OPTIONS, g_colorOptionsTable, readColorEntry)
887 		READ_OPTIONS(KVI_NUM_PIXMAP_OPTIONS, g_pixmapOptionsTable, readPixmapEntry)
888 		READ_OPTIONS(KVI_NUM_UINT_OPTIONS, g_uintOptionsTable, readUIntEntry)
889 		READ_OPTIONS(KVI_NUM_FONT_OPTIONS, g_fontOptionsTable, readFontEntry)
890 		READ_OPTIONS(KVI_NUM_MSGTYPE_OPTIONS, g_msgtypeOptionsTable, readMsgTypeEntry)
891 		READ_OPTIONS(KVI_NUM_STRINGLIST_OPTIONS, g_stringlistOptionsTable, readStringListEntry)
892 		READ_OPTIONS(KVI_NUM_MIRCCOLOR_OPTIONS, g_mirccolorOptionsTable, readColorEntry)
893 		READ_OPTIONS(KVI_NUM_ICCOLOR_OPTIONS, g_iccolorOptionsTable, readColorEntry)
894 
895 		for(i = 0; i < KVI_NUM_STRING_OPTIONS; i++)
896 		{
897 			if(g_stringOptionsTable[i].flags & KviOption_encodePath)
898 				KviStringConversion::decodePath(g_stringOptionsTable[i].option);
899 		}
900 
901 		for(i = 0; i < KVI_NUM_STRINGLIST_OPTIONS; i++)
902 		{
903 			if(g_stringlistOptionsTable[i].flags & KviOption_encodePath)
904 				KviStringConversion::decodePath(g_stringlistOptionsTable[i].option);
905 		}
906 
907 #undef READ_OPTIONS
908 	} // else already have the defaults
909 }
910 
saveOptions()911 void KviApplication::saveOptions()
912 {
913 	QString buffer;
914 
915 	saveRecentChannels();
916 
917 	getLocalKvircDirectory(buffer, Config, KVI_CONFIGFILE_MAIN);
918 
919 	KviConfigurationFile cfg(buffer, KviConfigurationFile::Write);
920 
921 	int i;
922 
923 #define WRITE_OPTIONS(_num, _table)                       \
924 	for(i = 0; i < _num; i++)                             \
925 	{                                                     \
926 		config_set_section(_table[i].flags, &cfg);        \
927 		cfg.writeEntry(_table[i].name, _table[i].option); \
928 	}
929 
930 	WRITE_OPTIONS(KVI_NUM_RECT_OPTIONS, g_rectOptionsTable)
931 	WRITE_OPTIONS(KVI_NUM_BOOL_OPTIONS, g_boolOptionsTable)
932 
933 	for(i = 0; i < KVI_NUM_STRING_OPTIONS; i++)
934 	{
935 		if(g_stringOptionsTable[i].flags & KviOption_encodePath)
936 			KviStringConversion::encodePath(g_stringOptionsTable[i].option);
937 	}
938 
939 	WRITE_OPTIONS(KVI_NUM_STRING_OPTIONS, g_stringOptionsTable)
940 	for(i = 0; i < KVI_NUM_STRING_OPTIONS; i++)
941 	{
942 		if(g_stringOptionsTable[i].flags & KviOption_encodePath)
943 			KviStringConversion::decodePath(g_stringOptionsTable[i].option);
944 	}
945 
946 	WRITE_OPTIONS(KVI_NUM_COLOR_OPTIONS, g_colorOptionsTable)
947 
948 	WRITE_OPTIONS(KVI_NUM_PIXMAP_OPTIONS, g_pixmapOptionsTable)
949 	WRITE_OPTIONS(KVI_NUM_UINT_OPTIONS, g_uintOptionsTable)
950 	WRITE_OPTIONS(KVI_NUM_FONT_OPTIONS, g_fontOptionsTable)
951 	WRITE_OPTIONS(KVI_NUM_MSGTYPE_OPTIONS, g_msgtypeOptionsTable)
952 
953 	for(i = 0; i < KVI_NUM_STRINGLIST_OPTIONS; i++)
954 	{
955 		if(g_stringlistOptionsTable[i].flags & KviOption_encodePath)
956 			KviStringConversion::encodePath(g_stringlistOptionsTable[i].option);
957 	}
958 
959 	WRITE_OPTIONS(KVI_NUM_STRINGLIST_OPTIONS, g_stringlistOptionsTable)
960 	for(i = 0; i < KVI_NUM_STRINGLIST_OPTIONS; i++)
961 	{
962 		if(g_stringlistOptionsTable[i].flags & KviOption_encodePath)
963 			KviStringConversion::decodePath(g_stringlistOptionsTable[i].option);
964 	}
965 	WRITE_OPTIONS(KVI_NUM_MIRCCOLOR_OPTIONS, g_mirccolorOptionsTable)
966 	WRITE_OPTIONS(KVI_NUM_ICCOLOR_OPTIONS, g_iccolorOptionsTable)
967 
968 	if(!cfg.saveIfDirty())
969 	{
970 		QMessageBox::warning(nullptr, __tr2qs("Warning While Writing Configuration - KVIrc"),
971 		    __tr2qs("I can't write to the main configuration file:\n\t%1\nPlease ensure the directory exists and that you have the proper permissions before continuing, "
972 		            "or else any custom configuration will be lost.")
973 		        .arg(buffer));
974 	}
975 
976 #undef WRITE_OPTIONS
977 }
978 
979 #undef WRITE_OPTIONS
980 
981 #define WRITE_OPTIONS(_num, _table)                           \
982 	for(i = 0; i < _num; i++)                                 \
983 	{                                                         \
984 		if(_table[i].flags & KviOption_groupTheme)            \
985 			cfg.writeEntry(_table[i].name, _table[i].option); \
986 	}
987 
988 namespace KviTheme
989 {
990 	// utility functions for the KviTheme namespace (KviTheme.h)
991 	// that are implemented here for convenience (in saving the options)
save(KviThemeInfo & options,bool bSaveIcons)992 	bool save(KviThemeInfo & options, bool bSaveIcons)
993 	{
994 		QString szThemeDirPath = options.directory();
995 
996 		if(szThemeDirPath.isEmpty())
997 		{
998 			options.setLastError(__tr2qs("Missing absolute directory for the theme information"));
999 			return false;
1000 		}
1001 
1002 		if(!KviFileUtils::directoryExists(szThemeDirPath))
1003 		{
1004 			if(!KviFileUtils::makeDir(szThemeDirPath))
1005 			{
1006 				options.setLastError(__tr2qs("Failed to create the theme directory"));
1007 				return false;
1008 			}
1009 		}
1010 
1011 		if(!options.save(szThemeDirPath + KVI_THEMEINFO_FILE_NAME))
1012 			return false;
1013 
1014 		KviConfigurationFile cfg(szThemeDirPath + KVI_THEMEDATA_FILE_NAME, KviConfigurationFile::Write);
1015 
1016 		cfg.setGroup(KVI_THEMEDATA_CONFIG_GROUP);
1017 
1018 		int i;
1019 
1020 		WRITE_OPTIONS(KVI_NUM_RECT_OPTIONS, g_rectOptionsTable)
1021 		WRITE_OPTIONS(KVI_NUM_BOOL_OPTIONS, g_boolOptionsTable)
1022 		WRITE_OPTIONS(KVI_NUM_STRING_OPTIONS, g_stringOptionsTable)
1023 		WRITE_OPTIONS(KVI_NUM_COLOR_OPTIONS, g_colorOptionsTable)
1024 		WRITE_OPTIONS(KVI_NUM_UINT_OPTIONS, g_uintOptionsTable)
1025 		WRITE_OPTIONS(KVI_NUM_FONT_OPTIONS, g_fontOptionsTable)
1026 		WRITE_OPTIONS(KVI_NUM_MSGTYPE_OPTIONS, g_msgtypeOptionsTable)
1027 		WRITE_OPTIONS(KVI_NUM_STRINGLIST_OPTIONS, g_stringlistOptionsTable)
1028 		WRITE_OPTIONS(KVI_NUM_MIRCCOLOR_OPTIONS, g_mirccolorOptionsTable)
1029 		WRITE_OPTIONS(KVI_NUM_ICCOLOR_OPTIONS, g_iccolorOptionsTable)
1030 
1031 #undef WRITE_OPTIONS
1032 
1033 		// the pixmap options need special processing
1034 		for(i = 0; i < KVI_NUM_PIXMAP_OPTIONS; i++)
1035 		{
1036 			if(g_pixmapOptionsTable[i].flags & KviOption_groupTheme)
1037 			{
1038 				if(g_pixmapOptionsTable[i].option.pixmap())
1039 				{
1040 					QString szPixPath = szThemeDirPath;
1041 					QString szPixName = g_pixmapOptionsTable[i].name;
1042 					szPixName += ".png";
1043 					szPixPath += szPixName;
1044 
1045 					if(g_pixmapOptionsTable[i].option.pixmap()->save(szPixPath, "PNG"))
1046 					{
1047 						cfg.writeEntry(g_pixmapOptionsTable[i].name, szPixName);
1048 					}
1049 					else
1050 					{
1051 						// we ignore this error for now
1052 						qDebug("failed to save %s", szPixPath.toUtf8().data());
1053 						cfg.writeEntry(g_pixmapOptionsTable[i].name, "");
1054 					}
1055 				}
1056 				else
1057 				{
1058 					cfg.writeEntry(g_pixmapOptionsTable[i].name, "");
1059 				}
1060 			}
1061 		}
1062 
1063 		cfg.writeEntry("stringIconThemeSubdir", options.subdirectory());
1064 
1065 		if(bSaveIcons)
1066 		{
1067 
1068 			// find all the "kvi_bigicon" images that we can find in the main pics directory
1069 			QString szPicsPath;
1070 
1071 			g_pApp->getGlobalKvircDirectory(szPicsPath, KviApplication::Pics);
1072 
1073 			QDir d(szPicsPath);
1074 			QStringList sl = d.entryList(QDir::nameFiltersFromString("kvi_bigicon_*.png"), QDir::Files);
1075 
1076 			for(auto & it : sl)
1077 			{
1078 				KviCachedPixmap * p = g_pIconManager->getPixmapWithCache(it);
1079 				if(p)
1080 				{
1081 					QString szPixPath = szThemeDirPath;
1082 					szPixPath += it;
1083 
1084 					if(!KviFileUtils::copyFile(p->path(), szPixPath))
1085 					{
1086 						qDebug("Failed to copy file %s into %s", p->path().toUtf8().data(), szPixPath.toUtf8().data());
1087 						options.setLastError(__tr2qs("Failed to save one of the theme images"));
1088 						return false;
1089 					}
1090 				}
1091 			}
1092 
1093 			if(!KviFileUtils::makeDir(szThemeDirPath + KVI_SMALLICONS_SUBDIRECTORY))
1094 			{
1095 				options.setLastError(__tr2qs("Failed to create the theme subdirectory"));
1096 				return false;
1097 			}
1098 
1099 			// We actually need to *save* the small icons since
1100 			// we have a compatibility mode that can load them from
1101 			// the old format kvi_smallicon_XY.png multiimage libraries.
1102 			for(int j = 0; j < KviIconManager::IconCount; j++)
1103 			{
1104 				QPixmap * pix = g_pIconManager->getSmallIcon(j);
1105 
1106 				QString szPixPath = szThemeDirPath;
1107 				szPixPath.append(KVI_SMALLICONS_SUBDIRECTORY);
1108 				szPixPath.append(KVI_PATH_SEPARATOR_CHAR);
1109 				szPixPath.append("kcs_");
1110 				szPixPath.append(g_pIconManager->getSmallIconName(j));
1111 				szPixPath.append(".png");
1112 
1113 				if(!pix->isNull() && !pix->save(szPixPath, "PNG", 90))
1114 				{
1115 					qDebug("Failed to save small icon %d into %s", j, szPixPath.toUtf8().data());
1116 					options.setLastError(__tr2qs("Failed to save one of the theme images"));
1117 					return false;
1118 				}
1119 			}
1120 		}
1121 
1122 		return true;
1123 	}
1124 
apply(const QString & szThemeDir,KviThemeInfo::Location eLocation,KviThemeInfo & buffer)1125 	bool apply(const QString & szThemeDir, KviThemeInfo::Location eLocation, KviThemeInfo & buffer)
1126 	{
1127 		//qDebug("Loading and apply theme");
1128 		if(!buffer.load(szThemeDir, eLocation))
1129 		{
1130 			qDebug("data does not exist in theme dir %s at location %d", szThemeDir.toUtf8().data(), eLocation);
1131 			return false; // makes sure that themedata exists too
1132 		}
1133 
1134 		QString szThemeDirPath = buffer.directory();
1135 
1136 		//qDebug("Ok loading from %s",szThemeDirPath.toUtf8().data());
1137 		// reset the current theme subdir
1138 		KVI_OPTION_STRING(KviOption_stringIconThemeSubdir) = "";
1139 
1140 		KviConfigurationFile cfg(szThemeDirPath + KVI_THEMEDATA_FILE_NAME, KviConfigurationFile::Read);
1141 		QString t = szThemeDirPath + KVI_THEMEDATA_FILE_NAME;
1142 		cfg.setGroup(KVI_THEMEDATA_CONFIG_GROUP);
1143 
1144 		int i;
1145 		int iResetFlags = 0;
1146 #ifdef COMPILE_ON_MAC
1147 		bool bWerePopupMenuIconsEnabled = KVI_OPTION_BOOL(KviOption_boolShowIconsInPopupMenus);
1148 #endif
1149 
1150 #undef READ_OPTIONS
1151 
1152 #define READ_OPTIONS(_num, _table, _readFnc)                                       \
1153 	for(i = 0; i < _num; i++)                                                      \
1154 	{                                                                              \
1155 		if(_table[i].flags & KviOption_groupTheme)                                 \
1156 		{                                                                          \
1157 			if(cfg.hasKey(_table[i].name))                                         \
1158 			{                                                                      \
1159 				iResetFlags |= (_table[i].flags & KviOption_resetMask);            \
1160 				_table[i].option = cfg._readFnc(_table[i].name, _table[i].option); \
1161 			}                                                                      \
1162 		}                                                                          \
1163 	}
1164 
1165 #define READ_ALL_OPTIONS(_num, _table, _readFnc)                               \
1166 	for(i = 0; i < _num; i++)                                                  \
1167 	{                                                                          \
1168 		if(cfg.hasKey(_table[i].name))                                         \
1169 		{                                                                      \
1170 			iResetFlags |= (_table[i].flags & KviOption_resetMask);            \
1171 			_table[i].option = cfg._readFnc(_table[i].name, _table[i].option); \
1172 		}                                                                      \
1173 	}
1174 
1175 		READ_OPTIONS(KVI_NUM_RECT_OPTIONS, g_rectOptionsTable, readRectEntry)
1176 		READ_OPTIONS(KVI_NUM_BOOL_OPTIONS, g_boolOptionsTable, readBoolEntry)
1177 		READ_OPTIONS(KVI_NUM_STRING_OPTIONS, g_stringOptionsTable, readEntry)
1178 		READ_OPTIONS(KVI_NUM_COLOR_OPTIONS, g_colorOptionsTable, readColorEntry)
1179 		READ_OPTIONS(KVI_NUM_UINT_OPTIONS, g_uintOptionsTable, readUIntEntry)
1180 		READ_OPTIONS(KVI_NUM_FONT_OPTIONS, g_fontOptionsTable, readFontEntry)
1181 		READ_ALL_OPTIONS(KVI_NUM_MSGTYPE_OPTIONS, g_msgtypeOptionsTable, readMsgTypeEntry)
1182 		READ_OPTIONS(KVI_NUM_STRINGLIST_OPTIONS, g_stringlistOptionsTable, readStringListEntry)
1183 		READ_OPTIONS(KVI_NUM_MIRCCOLOR_OPTIONS, g_mirccolorOptionsTable, readColorEntry)
1184 		READ_OPTIONS(KVI_NUM_ICCOLOR_OPTIONS, g_iccolorOptionsTable, readColorEntry)
1185 
1186 #undef READ_OPTIONS
1187 #undef READ_ALL_OPTIONS
1188 
1189 #ifdef COMPILE_ON_MAC
1190 		/* disregard what the theme says and apply no icons on menus if they
1191 			   weren't enabled before */
1192 		if(!bWerePopupMenuIconsEnabled)
1193 		{
1194 			KVI_OPTION_BOOL(KviOption_boolShowIconsInPopupMenus) = false;
1195 			g_boolOptionsTable[KviOption_boolShowIconsInPopupMenus].option = false;
1196 		}
1197 #endif
1198 
1199 		KVI_OPTION_STRING(KviOption_stringIconThemeSubdir) = KVI_OPTION_STRING(KviOption_stringIconThemeSubdir).trimmed();
1200 
1201 		// the pixmap options need special processing
1202 		for(i = 0; i < KVI_NUM_PIXMAP_OPTIONS; i++)
1203 		{
1204 			if(g_pixmapOptionsTable[i].flags & KviOption_groupTheme)
1205 			{
1206 				if(cfg.hasKey(g_pixmapOptionsTable[i].name))
1207 				{
1208 					QString szVal = cfg.readEntry(g_pixmapOptionsTable[i].name, "").trimmed();
1209 					QString szBuffer;
1210 					if(!szVal.isEmpty())
1211 						g_pApp->findImage(szBuffer, szVal);
1212 					else
1213 						szBuffer = szVal;
1214 
1215 					KviStringConversion::fromString(szBuffer, g_pixmapOptionsTable[i].option);
1216 
1217 					// reset anyway
1218 					iResetFlags |= g_pixmapOptionsTable[i].flags & KviOption_resetMask;
1219 				}
1220 			}
1221 		}
1222 		// force reloading of images anyway
1223 		g_pApp->optionResetUpdate(iResetFlags | KviOption_resetReloadImages);
1224 		KVI_OPTION_STRING(KviOption_stringIconThemeSubdir) = szThemeDir;
1225 		return true;
1226 	}
1227 };
1228 
listAvailableOptions(KviWindow * wnd)1229 void KviApplication::listAvailableOptions(KviWindow * wnd)
1230 {
1231 	int i;
1232 
1233 #define LIST_OPTIONS(__txt, __num, __table)                                                            \
1234 	wnd->output(KVI_OUT_SYSTEMMESSAGE, "%c%s%c", KviControlCodes::Bold, __txt, KviControlCodes::Bold); \
1235 	for(i = 0; i < __num; i++)                                                                         \
1236 		wnd->outputNoFmt(KVI_OUT_SYSTEMMESSAGE, __table[i].name);
1237 
1238 	LIST_OPTIONS(__tr("Boolean options (1/0)"), KVI_NUM_BOOL_OPTIONS, g_boolOptionsTable)
1239 	LIST_OPTIONS(__tr("Rectangle options (x,y,width,height)"), KVI_NUM_RECT_OPTIONS, g_rectOptionsTable)
1240 	LIST_OPTIONS(__tr("String options (string value)"), KVI_NUM_STRING_OPTIONS, g_stringOptionsTable)
1241 	LIST_OPTIONS(__tr("Color options (#RRGGBB)"), KVI_NUM_COLOR_OPTIONS, g_colorOptionsTable)
1242 	LIST_OPTIONS(__tr("Mirccolor options (#RRGGBB)"), KVI_NUM_MIRCCOLOR_OPTIONS, g_mirccolorOptionsTable)
1243 	LIST_OPTIONS(__tr("IRC context color options (#RRGGBB)"), KVI_NUM_ICCOLOR_OPTIONS, g_iccolorOptionsTable)
1244 	LIST_OPTIONS(__tr("Pixmap options (image path)"), KVI_NUM_PIXMAP_OPTIONS, g_pixmapOptionsTable)
1245 	LIST_OPTIONS(__tr("Unsigned integer options (unsigned integer constant)"), KVI_NUM_UINT_OPTIONS, g_uintOptionsTable)
1246 	LIST_OPTIONS(__tr("Font options (family,pointsize,style,charset,weight,flags (biusf))"), KVI_NUM_FONT_OPTIONS, g_fontOptionsTable)
1247 	LIST_OPTIONS(__tr("Message color options (image_id,foreground,background,logFlag (0/1))"), KVI_NUM_MSGTYPE_OPTIONS, g_msgtypeOptionsTable)
1248 	LIST_OPTIONS(__tr("String list options (comma separated list of strings)"), KVI_NUM_STRINGLIST_OPTIONS, g_stringlistOptionsTable)
1249 
1250 #undef LIST_OPTIONS
1251 }
1252 
1253 //using namespace KviStringConversion;
getOptionString(const QString & optName,QString & buffer)1254 bool KviApplication::getOptionString(const QString & optName, QString & buffer)
1255 {
1256 #define GET_OPTION_STRING(__numOpt, __table, __prefix, __prefixLen)       \
1257 	if(KviQString::equalCIN(optName, __prefix, __prefixLen))              \
1258 	{                                                                     \
1259 		for(int i = 0; i < __numOpt; i++)                                 \
1260 		{                                                                 \
1261 			if(KviQString::equalCI(optName, __table[i].name))             \
1262 			{                                                             \
1263 				KviStringConversion::toString(__table[i].option, buffer); \
1264 				return true;                                              \
1265 			}                                                             \
1266 		}                                                                 \
1267 		return false;                                                     \
1268 	}
1269 
1270 	// WARNING : stringlist prefix must go BEFORE the string prefix (otherwise it will match)
1271 	GET_OPTION_STRING(KVI_NUM_BOOL_OPTIONS, g_boolOptionsTable, KVI_BOOL_OPTIONS_PREFIX, KVI_BOOL_OPTIONS_PREFIX_LEN)
1272 	GET_OPTION_STRING(KVI_NUM_RECT_OPTIONS, g_rectOptionsTable, KVI_BOOL_OPTIONS_PREFIX, KVI_BOOL_OPTIONS_PREFIX_LEN)
1273 	GET_OPTION_STRING(KVI_NUM_STRINGLIST_OPTIONS, g_stringlistOptionsTable, KVI_STRINGLIST_OPTIONS_PREFIX, KVI_STRINGLIST_OPTIONS_PREFIX_LEN)
1274 	GET_OPTION_STRING(KVI_NUM_STRING_OPTIONS, g_stringOptionsTable, KVI_STRING_OPTIONS_PREFIX, KVI_STRING_OPTIONS_PREFIX_LEN)
1275 	GET_OPTION_STRING(KVI_NUM_COLOR_OPTIONS, g_colorOptionsTable, KVI_COLOR_OPTIONS_PREFIX, KVI_COLOR_OPTIONS_PREFIX_LEN)
1276 	GET_OPTION_STRING(KVI_NUM_MIRCCOLOR_OPTIONS, g_mirccolorOptionsTable, KVI_MIRCCOLOR_OPTIONS_PREFIX, KVI_MIRCCOLOR_OPTIONS_PREFIX_LEN)
1277 	GET_OPTION_STRING(KVI_NUM_ICCOLOR_OPTIONS, g_iccolorOptionsTable, KVI_ICCOLOR_OPTIONS_PREFIX, KVI_ICCOLOR_OPTIONS_PREFIX_LEN)
1278 	GET_OPTION_STRING(KVI_NUM_PIXMAP_OPTIONS, g_pixmapOptionsTable, KVI_PIXMAP_OPTIONS_PREFIX, KVI_PIXMAP_OPTIONS_PREFIX_LEN)
1279 	GET_OPTION_STRING(KVI_NUM_UINT_OPTIONS, g_uintOptionsTable, KVI_UINT_OPTIONS_PREFIX, KVI_UINT_OPTIONS_PREFIX_LEN)
1280 	GET_OPTION_STRING(KVI_NUM_FONT_OPTIONS, g_fontOptionsTable, KVI_FONT_OPTIONS_PREFIX, KVI_FONT_OPTIONS_PREFIX_LEN)
1281 	GET_OPTION_STRING(KVI_NUM_MSGTYPE_OPTIONS, g_msgtypeOptionsTable, KVI_MSGTYPE_OPTIONS_PREFIX, KVI_MSGTYPE_OPTIONS_PREFIX_LEN)
1282 	return false;
1283 
1284 #undef GET_OPTION_STRING
1285 }
1286 
optionResetUpdate(int flags)1287 void KviApplication::optionResetUpdate(int flags)
1288 {
1289 	if(flags & KviOption_resetReloadImages)
1290 	{
1291 		g_pIconManager->reloadImages();
1292 		emit reloadImages();
1293 	}
1294 
1295 	if(flags & KviOption_resetUpdateAppFont)
1296 		updateApplicationFont();
1297 
1298 #ifdef COMPILE_PSEUDO_TRANSPARENCY
1299 	if(flags & KviOption_resetUpdatePseudoTransparency)
1300 		triggerUpdatePseudoTransparency();
1301 #endif
1302 
1303 	if(flags & KviOption_resetRestartIdentd)
1304 	{
1305 		if(g_iIdentDaemonRunningUsers)
1306 			g_pMainWindow->executeInternalCommand(KVI_INTERNALCOMMAND_IDENT_STOP);
1307 
1308 		if(KVI_OPTION_BOOL(KviOption_boolUseIdentService) && !KVI_OPTION_BOOL(KviOption_boolUseIdentServiceOnlyOnConnect))
1309 			g_pMainWindow->executeInternalCommand(KVI_INTERNALCOMMAND_IDENT_START);
1310 	}
1311 
1312 	if(flags & KviOption_resetUpdateGui)
1313 		triggerUpdateGui();
1314 
1315 	if(flags & KviOption_resetUpdateWindowList)
1316 		g_pMainWindow->recreateWindowList();
1317 
1318 	if(flags & KviOption_resetRestartNotifyList)
1319 		g_pApp->restartNotifyLists();
1320 
1321 	if(flags & KviOption_resetRestartLagMeter)
1322 		g_pApp->restartLagMeters();
1323 
1324 	if(flags & KviOption_resetRecentChannels)
1325 		g_pApp->buildRecentChannels();
1326 
1327 	if(flags & KviOption_resetUpdateNotifier)
1328 		emit updateNotifier();
1329 }
1330 
setOptionValue(const QString & optName,const QString & value)1331 bool KviApplication::setOptionValue(const QString & optName, const QString & value)
1332 {
1333 	if(!setCommonOptionValue(optName, value))
1334 		return false;
1335 
1336 	if(KviQString::equalCI(optName, "stringlistRecentChannels"))
1337 	{
1338 		buildRecentChannels();
1339 		return true;
1340 	}
1341 
1342 	// The pixmap options have special treating
1343 	if(KviQString::equalCIN(optName, KVI_PIXMAP_OPTIONS_PREFIX, KVI_PIXMAP_OPTIONS_PREFIX_LEN))
1344 	{
1345 		// We lookup the image path (so we allow also relative paths for this option type)
1346 		QString szVal = value.trimmed();
1347 		QString szBuffer;
1348 		if(!szVal.isEmpty())
1349 			findImage(szBuffer, szVal);
1350 		else
1351 			szBuffer = szVal;
1352 
1353 		for(auto & i : g_pixmapOptionsTable)
1354 		{
1355 			if(KviQString::equalCI(optName, i.name))
1356 			{
1357 				if(!KviStringConversion::fromString(szBuffer, i.option))
1358 					return false;
1359 				optionResetUpdate(i.flags);
1360 				return true;
1361 			}
1362 		}
1363 		return false;
1364 	}
1365 
1366 	return true;
1367 }
1368 
setCommonOptionValue(const QString & optName,const QString & value)1369 bool KviApplication::setCommonOptionValue(const QString & optName, const QString & value)
1370 {
1371 
1372 #define SET_OPTION_VALUE(__numOpt, __table, __prefix, __prefixLen)             \
1373 	if(KviQString::equalCIN(optName, __prefix, __prefixLen))                   \
1374 	{                                                                          \
1375 		for(int i = 0; i < __numOpt; i++)                                      \
1376 		{                                                                      \
1377 			if(KviQString::equalCI(optName, __table[i].name))                  \
1378 			{                                                                  \
1379 				if(!KviStringConversion::fromString(value, __table[i].option)) \
1380 					return false;                                              \
1381 				optionResetUpdate(__table[i].flags);                           \
1382 				return true;                                                   \
1383 			}                                                                  \
1384 		}                                                                      \
1385 		return false;                                                          \
1386 	}
1387 
1388 	SET_OPTION_VALUE(KVI_NUM_BOOL_OPTIONS, g_boolOptionsTable, KVI_BOOL_OPTIONS_PREFIX, KVI_BOOL_OPTIONS_PREFIX_LEN)
1389 	SET_OPTION_VALUE(KVI_NUM_RECT_OPTIONS, g_rectOptionsTable, KVI_BOOL_OPTIONS_PREFIX, KVI_BOOL_OPTIONS_PREFIX_LEN)
1390 	SET_OPTION_VALUE(KVI_NUM_STRINGLIST_OPTIONS, g_stringlistOptionsTable, KVI_STRINGLIST_OPTIONS_PREFIX, KVI_STRINGLIST_OPTIONS_PREFIX_LEN)
1391 	SET_OPTION_VALUE(KVI_NUM_STRING_OPTIONS, g_stringOptionsTable, KVI_STRING_OPTIONS_PREFIX, KVI_STRING_OPTIONS_PREFIX_LEN)
1392 	SET_OPTION_VALUE(KVI_NUM_COLOR_OPTIONS, g_colorOptionsTable, KVI_COLOR_OPTIONS_PREFIX, KVI_COLOR_OPTIONS_PREFIX_LEN)
1393 	SET_OPTION_VALUE(KVI_NUM_MIRCCOLOR_OPTIONS, g_mirccolorOptionsTable, KVI_MIRCCOLOR_OPTIONS_PREFIX, KVI_MIRCCOLOR_OPTIONS_PREFIX_LEN)
1394 	SET_OPTION_VALUE(KVI_NUM_ICCOLOR_OPTIONS, g_iccolorOptionsTable, KVI_ICCOLOR_OPTIONS_PREFIX, KVI_ICCOLOR_OPTIONS_PREFIX_LEN)
1395 	SET_OPTION_VALUE(KVI_NUM_UINT_OPTIONS, g_uintOptionsTable, KVI_UINT_OPTIONS_PREFIX, KVI_UINT_OPTIONS_PREFIX_LEN)
1396 	SET_OPTION_VALUE(KVI_NUM_FONT_OPTIONS, g_fontOptionsTable, KVI_FONT_OPTIONS_PREFIX, KVI_FONT_OPTIONS_PREFIX_LEN)
1397 	SET_OPTION_VALUE(KVI_NUM_MSGTYPE_OPTIONS, g_msgtypeOptionsTable, KVI_MSGTYPE_OPTIONS_PREFIX, KVI_MSGTYPE_OPTIONS_PREFIX_LEN)
1398 
1399 #undef SET_OPTION_VALUE
1400 	return true;
1401 }
1402