gajim-plural/src/common/config.py

568 lines
25 KiB
Python
Raw Normal View History

2005-04-14 09:28:59 +02:00
## common/config.py
##
## Copyright (C) 2003-2006 Yann Le Boulanger <asterix@lagaule.org>
2006-04-04 19:10:12 +02:00
## Copyright (C) 2005-2006 Nikos Kouremenos <kourem@gmail.com>
## Copyright (C) 2004-2005 Vincent Hanquez <tab@snarc.org>
## Copyright (C) 2005 Dimitur Kirov <dkirov@gmail.com>
## Copyright (C) 2005 Travis Shirk <travis@pobox.com>
## Copyright (C) 2005 Norman Rasmussen <norman@rasmussen.co.za>
2005-04-14 09:28:59 +02:00
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 2 only.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
import sre
2005-04-14 09:28:59 +02:00
import copy
2006-03-26 21:34:31 +02:00
(
OPT_TYPE,
OPT_VAL,
OPT_DESC,
# If OPT_RESTART is True - we need restart to use our changed option
# OPT_DESC also should be there
2006-03-26 21:34:31 +02:00
OPT_RESTART,
) = range(4)
2005-04-14 09:28:59 +02:00
opt_int = [ 'integer', 0 ]
opt_str = [ 'string', 0 ]
opt_bool = [ 'boolean', 0 ]
opt_color = [ 'color', '^(#[0-9a-fA-F]{6})|()$' ]
opt_one_window_types = ['never', 'always', 'peracct', 'pertype']
2005-04-14 09:28:59 +02:00
2006-09-26 17:57:47 +02:00
DEFAULT_ICONSET = 'dcraven'
2005-04-14 09:28:59 +02:00
class Config:
__options = {
2006-02-08 03:26:54 +01:00
# name: [ type, default_value, help_string ]
'verbose': [ opt_bool, False, '', True ],
'alwaysauth': [ opt_bool, False ],
'autopopup': [ opt_bool, False ],
'notify_on_signin': [ opt_bool, True ],
'notify_on_signout': [ opt_bool, False ],
'notify_on_new_message': [ opt_bool, True ],
'autopopupaway': [ opt_bool, False ],
'use_notif_daemon': [ opt_bool, True , _('Use D-Bus and Notification-Daemon to show notifications') ],
'ignore_unknown_contacts': [ opt_bool, False ],
'showoffline': [ opt_bool, False, '', True ],
'autoaway': [ opt_bool, True ],
2005-09-04 20:56:06 +02:00
'autoawaytime': [ opt_int, 5, _('Time in minutes, after which your status changes to away.') ],
2005-08-07 11:14:50 +02:00
'autoaway_message': [ opt_str, _('Away as a result of being idle') ],
'autoxa': [ opt_bool, True ],
2005-09-04 20:56:06 +02:00
'autoxatime': [ opt_int, 15, _('Time in minutes, after which your status changes to not available.') ],
2005-08-07 11:14:50 +02:00
'autoxa_message': [ opt_str, _('Not available as a result of being idle') ],
'ask_online_status': [ opt_bool, False ],
'ask_offline_status': [ opt_bool, False ],
'last_status_msg_online': [ opt_str, '' ],
'last_status_msg_chat': [ opt_str, '' ],
'last_status_msg_away': [ opt_str, '' ],
'last_status_msg_xa': [ opt_str, '' ],
'last_status_msg_dnd': [ opt_str, '' ],
'last_status_msg_invisible': [ opt_str, '' ],
'last_status_msg_offline': [ opt_str, '' ],
'trayicon': [ opt_bool, True, '', True ],
2006-09-26 17:57:47 +02:00
'iconset': [ opt_str, DEFAULT_ICONSET, '', True ],
'use_transports_iconsets': [ opt_bool, True, '', True ],
'inmsgcolor': [ opt_color, '#a34526', '', True ],
'outmsgcolor': [ opt_color, '#164e6f', '', True ],
'statusmsgcolor': [ opt_color, '#1eaa1e', '', True ],
'markedmsgcolor': [ opt_color, '#ff8080', '', True ],
'urlmsgcolor': [ opt_color, '#0000ff', '', True ],
'collapsed_rows': [ opt_str, '', _('List (space separated) of rows (accounts and groups) that are collapsed.'), True ],
'roster_theme': [ opt_str, 'gtk+', '', True ],
'saveposition': [ opt_bool, True ],
'mergeaccounts': [ opt_bool, False, '', True ],
'sort_by_show': [ opt_bool, True, '', True ],
'enable_zeroconf': [opt_bool, False, _('Enable link-local/zeroconf messaging')],
'use_speller': [ opt_bool, False, ],
'speller_language': [ opt_str, '', _('Language used by speller')],
2006-05-08 16:50:38 +02:00
'print_time': [ opt_str, 'always', _('\'always\' - print time for every message.\n\'sometimes\' - print time every print_ichat_every_foo_minutes minute.\n\'never\' - never print time.')],
'print_time_fuzzy': [ opt_int, 0, _('Value of fuzziness from 1 to 4 or 0 to disable fuzzyclock. 1 is the most precise clock, 4 the less precise one.') ],
'emoticons_theme': [opt_str, 'static', '', True ],
2006-03-02 17:05:52 +01:00
'ascii_formatting': [ opt_bool, True,
_('Treat * / _ pairs as possible formatting characters.'), True],
'show_ascii_formatting_chars': [ opt_bool, True , _('If True, do not '
2006-03-02 17:05:52 +01:00
'remove */_ . So *abc* will be bold but with * * not removed.')],
'sounds_on': [ opt_bool, True ],
# 'aplay', 'play', 'esdplay', 'artsplay' detected first time only
'soundplayer': [ opt_str, '' ],
2005-04-14 09:28:59 +02:00
'openwith': [ opt_str, 'gnome-open' ],
'custombrowser': [ opt_str, 'firefox' ],
'custommailapp': [ opt_str, 'mozilla-thunderbird -compose' ],
'custom_file_manager': [ opt_str, 'xffm' ],
'gc-hpaned-position': [opt_int, 430],
'gc_refer_to_nick_char': [opt_str, ',', _('Character to add after nickname when using nick completion (tab) in group chat.')],
'gc_proposed_nick_char': [opt_str, '_', _('Character to propose to add after desired nickname when desired nickname is used by someone else in group chat.')],
2006-01-08 05:31:02 +01:00
'msgwin-x-position': [opt_int, -1], # Default is to let the window manager decide
'msgwin-y-position': [opt_int, -1], # Default is to let the window manager decide
'msgwin-width': [opt_int, 500],
2006-01-25 14:34:02 +01:00
'msgwin-height': [opt_int, 440],
'chat-msgwin-x-position': [opt_int, -1], # Default is to let the window manager decide
'chat-msgwin-y-position': [opt_int, -1], # Default is to let the window manager decide
2006-01-25 14:34:02 +01:00
'chat-msgwin-width': [opt_int, 480],
'chat-msgwin-height': [opt_int, 440],
'gc-msgwin-x-position': [opt_int, -1], # Default is to let the window manager decide
'gc-msgwin-y-position': [opt_int, -1], # Default is to let the window manager decide
'gc-msgwin-width': [opt_int, 600],
2006-01-25 14:34:02 +01:00
'gc-msgwin-height': [opt_int, 440],
'single-msg-x-position': [opt_int, 0],
'single-msg-y-position': [opt_int, 0],
'single-msg-width': [opt_int, 400],
'single-msg-height': [opt_int, 280],
2005-07-21 23:19:08 +02:00
'roster_x-position': [ opt_int, 0 ],
'roster_y-position': [ opt_int, 0 ],
'roster_width': [ opt_int, 150 ],
'roster_height': [ opt_int, 400 ],
2005-04-14 09:28:59 +02:00
'latest_disco_addresses': [ opt_str, '' ],
'recently_groupchat': [ opt_str, '' ],
'before_time': [ opt_str, '[' ],
'after_time': [ opt_str, ']' ],
2005-07-24 22:34:39 +02:00
'before_nickname': [ opt_str, '' ],
'after_nickname': [ opt_str, ':' ],
'send_os_info': [ opt_bool, True ],
2006-09-26 17:57:47 +02:00
'set_status_msg_from_current_music_track': [ opt_bool, False ],
Merged revisions 5017-5020,5022-5029 via svnmerge from svn://svn.gajim.org/gajim/trunk ........ r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines use escape for pango markup ........ r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines missing new contacts function ........ r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines handle the click on toggle_gpg_encryption menuitem ........ r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines use the saved size even if a chat window is already opened ........ r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines we can now resume filetransfert ........ r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines [Knuckles] Google E-Mail Notification ........ r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines better string ........ r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines fix a TB ........ r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines we can now drag a file on a contact in the roster to send him a file ........ r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines contact.groups is always a list, even if emtpy ........ r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines make all buttons insensitive on a category row in disco ........ r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines auto open groupchat configuration window when we create a new room ........
2006-01-07 18:25:35 +01:00
'notify_on_new_gmail_email': [ opt_bool, True ],
'notify_on_new_gmail_email_extra': [ opt_bool, False ],
'usegpg': [ opt_bool, False, '', True ],
'use_gpg_agent': [ opt_bool, False ],
2005-09-04 20:51:16 +02:00
'change_roster_title': [ opt_bool, True, _('Add * and [n] in roster title?')],
'restore_lines': [opt_int, 4, _('How many lines to remember from previous conversation when a chat tab/window is reopened.')],
'restore_timeout': [opt_int, 60, _('How many minutes should last lines from previous conversation last.')],
2005-09-17 13:34:39 +02:00
'send_on_ctrl_enter': [opt_bool, False, _('Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ Client default behaviour).')],
2005-06-06 01:20:06 +02:00
'show_roster_on_startup': [opt_bool, True],
2005-11-21 17:50:28 +01:00
'key_up_lines': [opt_int, 25, _('How many lines to store for Ctrl+KeyUP.')],
'version': [ opt_str, '0.10.1.3' ], # which version created the config
'search_engine': [opt_str, 'http://www.google.com/search?&q=%s&sourceid=gajim'],
'dictionary_url': [opt_str, 'WIKTIONARY', _("Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary.")],
'always_english_wikipedia': [opt_bool, False],
'always_english_wiktionary': [opt_bool, True],
'remote_control': [opt_bool, True, _('If checked, Gajim can be controlled remotely using gajim-remote.'), True],
'chat_state_notifications': [opt_str, 'all'], # 'all', 'composing_only', 'disabled'
'autodetect_browser_mailer': [opt_bool, False, '', True],
'print_ichat_every_foo_minutes': [opt_int, 5, _('When not printing time for every message (print_time==sometimes), print it every x minutes.')],
'confirm_close_muc': [opt_bool, True, _('Ask before closing a group chat tab/window.')],
2006-03-08 09:29:09 +01:00
'confirm_close_muc_rooms': [opt_str, '', _('Always ask before closing group chat tab/window in this space separated list of room jids.')],
'noconfirm_close_muc_rooms': [opt_str, '', _('Never ask before closing group chat tab/window in this space separated list of room jids.')],
'notify_on_file_complete': [opt_bool, True],
'file_transfers_port': [opt_int, 28011],
'ft_override_host_to_send': [opt_str, '', _('Overrides the host we send for File Transfer in case of address translation/port forwarding.')],
'conversation_font': [opt_str, ''],
'use_kib_mib': [opt_bool, False, _('IEC standard says KiB = 1024 bytes, KB = 1000 bytes.')],
'notify_on_all_muc_messages': [opt_bool, False],
'trayicon_notification_on_new_messages': [opt_bool, True],
'last_save_dir': [opt_str, ''],
'last_send_dir': [opt_str, ''],
'last_emoticons_dir': [opt_str, ''],
'last_sounds_dir': [opt_str, ''],
2005-09-04 20:54:41 +02:00
'tabs_position': [opt_str, 'top'],
'tabs_always_visible': [opt_bool, False, _('Show tab when only one conversation?')],
'tabs_border': [opt_bool, False, _('Show tabbed notebook border in chat windows?')],
'tabs_close_button': [opt_bool, True, _('Show close button in tab?')],
'chat_avatar_width': [opt_int, 52],
'chat_avatar_height': [opt_int, 52],
2005-11-17 00:10:48 +01:00
'roster_avatar_width': [opt_int, 32],
'roster_avatar_height': [opt_int, 32],
'tooltip_avatar_width': [opt_int, 125],
'tooltip_avatar_height': [opt_int, 125],
'vcard_avatar_width': [opt_int, 200],
'vcard_avatar_height': [opt_int, 200],
'notification_position_x': [opt_int, -1],
'notification_position_y': [opt_int, -1],
'notification_avatar_width': [opt_int, 48],
'notification_avatar_height': [opt_int, 48],
'muc_highlight_words': [opt_str, '', _('A semicolon-separated list of words that will be highlighted in multi-user chat.')],
'quit_on_roster_x_button': [opt_bool, False, _('If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if trayicon is used.')],
'set_xmpp://_handler_everytime': [opt_bool, False, _('If True, Gajim registers for xmpp:// on each startup.')],
'show_unread_tab_icon': [opt_bool, False, _('If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated.')],
'show_status_msgs_in_roster': [opt_bool, True, _('If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window.'), True],
'show_avatars_in_roster': [opt_bool, True, '', True],
2005-12-02 20:59:39 +01:00
'ask_avatars_on_startup': [opt_bool, True, _('If True, Gajim will ask for avatar each contact that did not have an avatar last time or has one cached that is too old.')],
'print_status_in_chats': [opt_bool, True, _('If False, Gajim will no longer print status line in chats when a contact changes his or her status and/or his or her status message.')],
'print_status_in_muc': [opt_str, 'in_and_out', _('can be "none", "all" or "in_and_out". If "none", Gajim will no longer print status line in groupchats when a member changes his or her status and/or his or her status message. If "all" Gajim will print all status messages. If "in_and_out", gajim will only print FOO enters/leaves room.')],
'log_contact_status_changes': [opt_bool, False],
'restored_messages_color': [opt_str, 'grey'],
'restored_messages_small': [opt_bool, True, _('If True, restored messages will use a smaller font than the default one.')],
2006-05-08 16:50:38 +02:00
'hide_avatar_of_transport': [opt_bool, False, _('Don\'t show avatar for the transport itself.')],
2006-09-26 17:57:47 +02:00
'roster_window_skip_taskbar': [opt_bool, False, _('Don\'t show roster in the system taskbar.')],
2005-12-30 22:37:36 +01:00
'use_urgency_hint': [opt_bool, True, _('If True and installed GTK+ and PyGTK versions are at least 2.8, make the window flash (the default behaviour in most Window Managers) when holding pending events.')],
'notification_timeout': [opt_int, 5],
'send_sha_in_gc_presence': [opt_bool, True, _('Jabberd1.4 does not like sha info when one join a password protected room. Turn this option to False to stop sending sha info in group chat presences.')],
2006-01-11 09:44:38 +01:00
'one_message_window': [opt_str, 'always',
#always, never, peracct, pertype should not be translated
_('Controls the window where new messages are placed.\n\'always\' - All messages are sent to a single window.\n\'never\' - All messages get their own window.\n\'peracct\' - Messages for each account are sent to a specific window.\n\'pertype\' - Each message type (e.g., chats vs. groupchats) are sent to a specific window. Note, changing this option requires restarting Gajim before the changes will take effect.')],
'show_avatar_in_chat': [opt_bool, True, _('If False, you will no longer see the avatar in the chat window.')],
'escape_key_closes': [opt_bool, True, _('If True, pressing the escape key closes a tab/window.')],
'always_hide_groupchat_buttons': [opt_bool, False, _('Hides the buttons in group chat window.')],
'always_hide_chat_buttons': [opt_bool, False, _('Hides the buttons in two persons chat window.')],
2006-04-10 14:16:29 +02:00
'hide_groupchat_banner': [opt_bool, False, _('Hides the banner in a group chat window')],
'hide_chat_banner': [opt_bool, False, _('Hides the banner in two persons chat window')],
'hide_groupchat_occupants_list': [opt_bool, False, _('Hides the room occupants list in group chat window.')],
'chat_merge_consecutive_nickname': [opt_bool, False, _('Merge consecutive nickname in chat window.')],
'chat_merge_consecutive_nickname_indent': [opt_str, ' ', _('Indentation when using merge consecutive nickame.')],
'gc_nicknames_colors': [ opt_str, '#a34526:#c000ff:#0012ff:#388a99:#38995d:#519938:#ff8a00:#94452d:#244b5a:#32645a', _('List of colors that will be used to color nicknames in group chats.'), True ],
'ctrl_tab_go_to_next_composing': [opt_bool, True, _('Ctrl-Tab go to next composing tab when none is unread.')],
2005-04-14 09:28:59 +02:00
}
__options_per_key = {
'accounts': ({
'name': [ opt_str, '', '', True ],
'hostname': [ opt_str, '', '', True ],
'savepass': [ opt_bool, False ],
2005-04-14 09:28:59 +02:00
'password': [ opt_str, '' ],
'resource': [ opt_str, 'gajim', '', True ],
'priority': [ opt_int, 5, '', True ],
'autoconnect': [ opt_bool, False, '', True ],
2005-09-06 08:18:35 +02:00
'autoreconnect': [ opt_bool, True ],
'active': [ opt_bool, True],
'proxy': [ opt_str, '', '', True ],
'keyid': [ opt_str, '', '', True ],
'keyname': [ opt_str, '', '', True ],
'usessl': [ opt_bool, False, '', True ],
'use_srv': [ opt_bool, True, '', True ],
'use_custom_host': [ opt_bool, False, '', True ],
'custom_port': [ opt_int, 5222, '', True ],
'custom_host': [ opt_str, '', '', True ],
'savegpgpass': [ opt_bool, False, '', True ],
2005-04-14 09:28:59 +02:00
'gpgpassword': [ opt_str, '' ],
'sync_with_global_status': [ opt_bool, False, ],
2005-04-14 09:28:59 +02:00
'no_log_for': [ opt_str, '' ],
'attached_gpg_keys': [ opt_str, '' ],
'keep_alives_enabled': [ opt_bool, True],
# send keepalive every N seconds of inactivity
'keep_alive_every_foo_secs': [ opt_int, 55 ],
# try for 2 minutes before giving up (aka. timeout after those seconds)
'try_connecting_for_foo_secs': [ opt_int, 60 ],
2005-08-05 15:29:39 +02:00
'http_auth': [opt_str, 'ask'], # yes, no, ask
2006-03-31 20:40:10 +02:00
'dont_ack_subscription': [opt_bool, False, _('Jabberd2 workaround')],
2005-08-11 22:27:23 +02:00
# proxy65 for FT
'file_transfer_proxies': [opt_str,
'proxy.jabber.org, proxy.netlab.cz, transfer.jabber.freenet.de, proxy.jabber.cd.chalmers.se'],
'use_ft_proxies': [opt_bool, True, _('If checked, Gajim will use your IP and proxies defined in file_transfer_proxies option for file transfer.'), True],
2006-03-31 20:40:10 +02:00
'msgwin-x-position': [opt_int, -1], # Default is to let the wm decide
'msgwin-y-position': [opt_int, -1], # Default is to let the wm decide
2006-01-25 14:34:02 +01:00
'msgwin-width': [opt_int, 480],
'msgwin-height': [opt_int, 440],
'is_zeroconf': [opt_bool, False],
'zeroconf_first_name': [ opt_str, '', '', True ],
'zeroconf_last_name': [ opt_str, '', '', True ],
'zeroconf_jabber_id': [ opt_str, '', '', True ],
'zeroconf_email': [ opt_str, '', '', True ],
2005-04-15 13:37:56 +02:00
}, {}),
'statusmsg': ({
'message': [ opt_str, '' ],
}, {}),
'defaultstatusmsg': ({
'enabled': [ opt_bool, False ],
'message': [ opt_str, '' ],
}, {}),
'soundevents': ({
'enabled': [ opt_bool, True ],
'path': [ opt_str, '' ],
}, {}),
2005-06-08 17:48:53 +02:00
'proxies': ({
'type': [ opt_str, 'http' ],
'host': [ opt_str, '' ],
'port': [ opt_int, 3128 ],
'user': [ opt_str, '' ],
2005-06-09 00:05:45 +02:00
'pass': [ opt_str, '' ],
2005-06-08 17:48:53 +02:00
}, {}),
2005-06-14 00:11:09 +02:00
'themes': ({
'accounttextcolor': [ opt_color, 'black', '', True ],
'accountbgcolor': [ opt_color, 'white', '', True ],
'accountfont': [ opt_str, '', '', True ],
'accountfontattrs': [ opt_str, 'B', '', True ],
'grouptextcolor': [ opt_color, 'black', '', True ],
'groupbgcolor': [ opt_color, 'white', '', True ],
'groupfont': [ opt_str, '', '', True ],
'groupfontattrs': [ opt_str, 'I', '', True ],
'contacttextcolor': [ opt_color, 'black', '', True ],
'contactbgcolor': [ opt_color, 'white', '', True ],
'contactfont': [ opt_str, '', '', True ],
'contactfontattrs': [ opt_str, '', '', True ],
'bannertextcolor': [ opt_color, 'black', '', True ],
'bannerbgcolor': [ opt_color, '', '', True ],
'bannerfont': [ opt_str, '', '', True ],
'bannerfontattrs': [ opt_str, 'B', '', True ],
2006-03-01 12:03:56 +01:00
2005-09-05 02:08:52 +02:00
# http://www.pitt.edu/~nisg/cis/web/cgi/rgb.html
'state_inactive_color': [ opt_color, 'grey62' ],
'state_composing_color': [ opt_color, 'green4' ],
'state_paused_color': [ opt_color, 'mediumblue' ],
'state_gone_color': [ opt_color, 'grey' ],
2005-09-14 02:51:26 +02:00
# MUC chat states
'state_muc_msg_color': [ opt_color, 'mediumblue' ],
'state_muc_directed_msg_color': [ opt_color, 'red2' ],
2005-06-14 00:11:09 +02:00
}, {}),
2006-04-15 10:10:24 +02:00
'contacts': ({
'gpg_enabled': [ opt_bool, True, _('Is OpenPGP enabled for this contact?')],
'speller_language': [ opt_str, '', _('Language for which we want to check misspelled words')],
}, {}),
'rooms': ({
'speller_language': [ opt_str, '', _('Language for which we want to check misspelled words')],
}, {}),
'notifications': ({
'event': [opt_str, ''],
'recipient_type': [opt_str, 'all'],
'recipients': [opt_str, ''],
'status': [opt_str, 'all', _('all or space separated status')],
'tab_opened': [opt_str, 'both', _("'yes', 'no', or 'both'")],
'sound': [opt_str, '', _("'yes', 'no' or ''")],
'sound_file': [opt_str, ''],
'popup': [opt_str, '', _("'yes', 'no' or ''")],
'auto_open': [opt_str, '', _("'yes', 'no' or ''")],
'run_command': [opt_bool, False],
'command': [opt_str, ''],
'systray': [opt_str, '', _("'yes', 'no' or ''")],
'roster': [opt_str, '', _("'yes', 'no' or ''")],
'urgency_hint': [opt_bool, False],
2006-04-15 10:10:24 +02:00
}, {}),
2005-04-14 09:28:59 +02:00
}
statusmsg_default = {
2005-07-06 14:19:04 +02:00
_('Sleeping'): 'ZZZZzzzzzZZZZZ',
2005-06-06 12:51:24 +02:00
_('Back soon'): _('Back in some minutes.'),
_('Eating'): _("I'm eating, so leave me a message."),
_('Movie'): _("I'm watching a movie."),
_('Working'): _("I'm working."),
_('Phone'): _("I'm on the phone."),
_('Out'): _("I'm out enjoying life"),
}
defaultstatusmsg_default = {
'online': [ False, _("I'm available") ],
'chat': [ False, _("I'm free for chat") ],
'away': [ False, _('Be right back') ],
'xa': [ False, _("I'm not available") ],
'dnd': [ False, _('Do not disturb') ],
'invisible': [ False, _('Bye!') ],
'offline': [ False, _('Bye!') ],
}
soundevents_default = {
'first_message_received': [ True, '../data/sounds/message1.wav' ],
'next_message_received': [ True, '../data/sounds/message2.wav' ],
'contact_connected': [ True, '../data/sounds/connected.wav' ],
'contact_disconnected': [ True, '../data/sounds/disconnected.wav' ],
'message_sent': [ True, '../data/sounds/sent.wav' ],
'muc_message_highlight': [ True, '../data/sounds/gc_message1.wav', _('Sound to play when a MUC message contains one of the words in muc_highlight_words, or when a MUC message contains your nickname.')],
'muc_message_received': [ True, '../data/sounds/gc_message2.wav', _('Sound to play when any MUC message arrives. (This setting is taken into account only if notify_on_all_muc_messages is True)') ],
}
2005-06-14 00:11:09 +02:00
themes_default = {
# sorted alphanum
'gtk+': [ '', '', '', 'B', '', '','', 'I', '', '', '', '', '','', '',
'B' ],
2006-01-26 00:47:15 +01:00
_('green'): [ '', '#94aa8c', '', 'B', '#0000ff', '#eff3e7',
'', 'I', '#000000', '', '', '', '',
'#94aa8c', '', 'B' ],
2006-01-26 00:47:15 +01:00
_('grocery'): [ '', '#6bbe18', '', 'B', '#12125a', '#ceefad',
'', 'I', '#000000', '#efb26b', '', '', '',
'#108abd', '', 'B' ],
2006-01-26 00:47:15 +01:00
_('human'): [ '', '#996442', '', 'B', '#ab5920', '#e3ca94',
'', 'I', '#000000', '', '', '', '',
'#996442', '', 'B' ],
2006-01-26 00:47:15 +01:00
_('marine'): [ '', '#918caa', '', 'B', '', '#e9e7f3',
'', 'I', '#000000', '', '', '', '',
'#918caa', '', 'B' ],
2005-06-14 00:11:09 +02:00
}
def foreach(self, cb, data = None):
2005-04-14 09:28:59 +02:00
for opt in self.__options:
cb(data, opt, None, self.__options[opt])
2005-04-14 09:28:59 +02:00
for opt in self.__options_per_key:
cb(data, opt, None, None)
2005-04-14 09:28:59 +02:00
dict = self.__options_per_key[opt][1]
for opt2 in dict.keys():
cb(data, opt2, [opt], None)
2005-04-14 09:28:59 +02:00
for opt3 in dict[opt2]:
cb(data, opt3, [opt, opt2], dict[opt2][opt3])
2005-04-14 09:28:59 +02:00
def is_valid_int(self, val):
try:
ival = int(val)
except:
return None
return ival
2005-04-14 09:28:59 +02:00
def is_valid_bool(self, val):
if val == 'True':
return True
elif val == 'False':
return False
else:
ival = self.is_valid_int(val)
if ival:
return True
elif ival is None:
return None
return False
return None
2005-04-14 09:28:59 +02:00
def is_valid_string(self, val):
return val
2005-04-14 09:28:59 +02:00
def is_valid(self, type, val):
if not type:
return None
2005-04-14 09:28:59 +02:00
if type[0] == 'boolean':
return self.is_valid_bool(val)
elif type[0] == 'integer':
return self.is_valid_int(val)
elif type[0] == 'string':
return self.is_valid_string(val)
else:
if sre.match(type[1], val):
return val
else:
return None
2005-04-14 09:28:59 +02:00
def set(self, optname, value):
if not self.__options.has_key(optname):
2005-08-06 01:47:41 +02:00
# raise RuntimeError, 'option %s does not exist' % optname
return
2005-04-14 09:28:59 +02:00
opt = self.__options[optname]
value = self.is_valid(opt[OPT_TYPE], value)
if value is None:
2005-08-06 01:47:41 +02:00
# raise RuntimeError, 'value of %s cannot be None' % optname
return
2005-04-14 09:28:59 +02:00
opt[OPT_VAL] = value
def get(self, optname = None):
if not optname:
return self.__options.keys()
if not self.__options.has_key(optname):
2005-04-14 09:28:59 +02:00
return None
return self.__options[optname][OPT_VAL]
def get_desc(self, optname):
if not self.__options.has_key(optname):
return None
if len(self.__options[optname]) > OPT_DESC:
return self.__options[optname][OPT_DESC]
2005-04-14 09:28:59 +02:00
def get_restart(self, optname):
if not self.__options.has_key(optname):
return None
if len(self.__options[optname]) > OPT_RESTART:
return self.__options[optname][OPT_RESTART]
def add_per(self, typename, name): # per_group_of_option
2005-04-14 09:28:59 +02:00
if not self.__options_per_key.has_key(typename):
2005-08-06 01:47:41 +02:00
# raise RuntimeError, 'option %s does not exist' % typename
return
2005-04-14 09:28:59 +02:00
opt = self.__options_per_key[typename]
if opt[1].has_key(name):
# we already have added group name before
2005-08-05 12:30:22 +02:00
return 'you already have added %s before' % name
2005-04-14 09:28:59 +02:00
opt[1][name] = copy.deepcopy(opt[0])
2005-09-09 22:51:22 +02:00
def del_per(self, typename, name, subname = None): # per_group_of_option
2005-04-14 09:28:59 +02:00
if not self.__options_per_key.has_key(typename):
2005-08-06 01:47:41 +02:00
# raise RuntimeError, 'option %s does not exist' % typename
return
2005-08-06 23:19:16 +02:00
2005-04-14 09:28:59 +02:00
opt = self.__options_per_key[typename]
2005-09-10 11:30:46 +02:00
if subname is None:
2005-09-09 22:51:22 +02:00
del opt[1][name]
# if subname is specified, delete the item in the group.
elif opt[1][name].has_key(subname):
del opt[1][name][subname]
2005-04-14 09:28:59 +02:00
def set_per(self, optname, key, subname, value): # per_group_of_option
2005-04-14 09:28:59 +02:00
if not self.__options_per_key.has_key(optname):
2005-08-06 01:47:41 +02:00
# raise RuntimeError, 'option %s does not exist' % optname
return
2005-04-14 09:28:59 +02:00
dict = self.__options_per_key[optname][1]
if not dict.has_key(key):
2005-08-06 01:47:41 +02:00
# raise RuntimeError, '%s is not a key of %s' % (key, dict)
return
2005-04-14 09:28:59 +02:00
obj = dict[key]
if not obj.has_key(subname):
2005-08-06 01:47:41 +02:00
# raise RuntimeError, '%s is not a key of %s' % (subname, obj)
return
2005-04-14 09:28:59 +02:00
subobj = obj[subname]
value = self.is_valid(subobj[OPT_TYPE], value)
if value is None:
2005-08-06 01:47:41 +02:00
# raise RuntimeError, '%s of %s cannot be None' % optname
return
2005-04-14 09:28:59 +02:00
subobj[OPT_VAL] = value
def get_per(self, optname, key = None, subname = None): # per_group_of_option
2005-04-14 09:42:26 +02:00
if not self.__options_per_key.has_key(optname):
2005-04-14 09:28:59 +02:00
return None
2005-04-14 09:42:26 +02:00
dict = self.__options_per_key[optname][1]
2005-04-14 09:28:59 +02:00
if not key:
return dict.keys()
if not dict.has_key(key):
return None
obj = dict[key]
if not subname:
return obj
if not obj.has_key(subname):
return None
return obj[subname][OPT_VAL]
2005-04-14 09:28:59 +02:00
def get_desc_per(self, optname, key = None, subname = None):
if not self.__options_per_key.has_key(optname):
return None
dict = self.__options_per_key[optname][1]
if not key:
return None
if not dict.has_key(key):
return None
obj = dict[key]
if not subname:
return None
if not obj.has_key(subname):
return None
if len(obj[subname]) > OPT_DESC:
return obj[subname][OPT_DESC]
return None
def get_restart_per(self, optname, key = None, subname = None):
if not self.__options_per_key.has_key(optname):
return False
dict = self.__options_per_key[optname][1]
if not key:
return False
if not dict.has_key(key):
return False
obj = dict[key]
if not subname:
return False
if not obj.has_key(subname):
return False
if len(obj[subname]) > OPT_RESTART:
return obj[subname][OPT_RESTART]
return False
2005-04-14 09:28:59 +02:00
def __init__(self):
#init default values
2005-04-16 17:01:06 +02:00
for event in self.soundevents_default:
default = self.soundevents_default[event]
self.add_per('soundevents', event)
self.set_per('soundevents', event, 'enabled', default[0])
2005-04-16 17:01:06 +02:00
self.set_per('soundevents', event, 'path', default[1])
for status in self.defaultstatusmsg_default:
default = self.defaultstatusmsg_default[status]
self.add_per('defaultstatusmsg', status)
self.set_per('defaultstatusmsg', status, 'enabled', default[0])
self.set_per('defaultstatusmsg', status, 'message', default[1])