tab_winpos => _('Windows'),
tab_accounts => _('Accounts'),
tab_plugins => _('Plugins'),
+ tab_info => _('Info'),
ab_frame => _('Addressbook'),
mem_frame => _('Memory'),
l_beh_warn_dnd => _('Warn on drag \'n\' drop'),
h_beh_warn_dnd => _('Display a confirmation dialogue on drag \'n\' drop of folders.'),
l_beh_out_ascii => _('Outgoing messages fallback to ASCII'),
- h_beh_out_ascii => _('If content allows, ASCII will be used to encode outgoing messages, otherwise the user-defined encoding is enforced always.'),
+ h_beh_out_ascii => _('If allowed by content, ASCII will be used to encode outgoing messages, otherwise the user-defined encoding is always enforced.'),
l_beh_pp_unsel => _('Primary paste unselects selection'),
h_beh_pp_unsel => _('Controls how pasting using middle-click changes the selected text and insertion point.'),
l_beh_inline_at => _('Show inline attachments'),
- h_beh_inline_at => _('Allows hiding inline attachments already shown in mail structure view.'),
+ h_beh_inline_at => _('Allows to hide inline attachments already shown in mail structure view.'),
l_beh_addr_swc => _('Address search in compose window matches any'),
h_beh_addr_swc => _('On Tab-key completion, address text will match any part of the string or only from the start.'),
l_beh_fold_swc => _('Folder search in folder selector matches any'),
h_beh_fold_swc => _('On folder name completion text will match any part of the string or only from the start.'),
+ l_beh_rewrite_ff => _('Rewrite first \'From\' using QP encoding'),
+ h_beh_rewrite_ff => _('Workaround some servers which convert first \'From\' to \'>From\' by using Quoted-Printable transfer encoding instead of 7bit/8bit encoding.'),
l_col_emphasis => _('X-Mailer header'),
h_col_emphasis => _('The colour used for the X-Mailer line when its value is Claws Mail.'),
l_acc_gtls_pri => _('GnuTLS priority'),
h_acc_gtls_pri => _('Value to use as GnuTLS priority string if custom priority check is enabled. Otherwise this value is ignored.'),
+ l_plu_gpg_alimit => _('Autocompletion limit'),
+ h_plu_gpg_alimit => _('Limits the number of addresses obtained from keyring through autocompletion. Use 0 to get all matches.'),
l_plu_lav_burl => _('Base URL'),
h_plu_lav_burl => _('This is the URL where avatar requests are sent. You can use the one of your own libravatar server, if available.'),
l_plu_prl_flvb => _('Log level'),
l_plu_prl_manual => _('Manual'),
l_plu_prl_action => _('Actions'),
l_plu_prl_match => _('Matches'),
-
- e_error => _('Error: '),
- e_noclawsrc => _('resource file for Claws Mail was not found.'),
- e_running => _('seems Claws Mail is currently running, close it first.'),
);
# data and metadata of resource files
my $CONFIGDIR = $ENV{HOME} . '/.claws-mail/';
my $CONFIGRC = 'clawsrc';
my $ACCOUNTRC = 'accountrc';
+# supported and available plugins lists
+my @PLUGINS = qw(AttRemover GPG ManageSieve Libravatar PerlPlugin);
+my @AVPLUGINS = ();
+# loaded icons
+my @APPICONS = ();
# index constants for preference arrays
use constant NAME => 0; # the name on the rc file
}
sub claws_is_running {
- my $emsg = "$xl::s{e_error}$xl::s{e_running}";
+ my $emsg = _('Error: seems Claws Mail is currently running, close it first.');
log_message ($emsg);
error_dialog ($emsg);
return FALSE;
sub check_rc_file {
my ($rcfile) = @_;
(defined($rcfile) && -f $rcfile) or do {
- my $emsg = "$xl::s{e_error}$xl::s{e_noclawsrc}\n";
+ my $emsg = _('Error: resource file for Claws Mail was not found.');
log_message ($emsg);
error_dialog ($emsg);
return FALSE;
sub new_hbox_pack {
my $hbox = Gtk2::HBox->new (FALSE, 5);
$hbox->set_border_width (PAGE_SPC);
- foreach my $item (@_) {
- $hbox->pack_start ($item, FALSE, FALSE, 0);
+ foreach (@_) {
+ $hbox->pack_start ($_, FALSE, FALSE, 0);
}
return $hbox;
}
sub new_vbox_pack {
my $vbox = Gtk2::VBox->new (FALSE, 5);
$vbox->set_border_width (PAGE_SPC);
- foreach my $item (@_) {
- $vbox->pack_start ($item, FALSE, FALSE, 0);
+ foreach (@_) {
+ $vbox->pack_start ($_, FALSE, FALSE, 0);
}
return $vbox;
}
sub new_vbox_pack_compact {
my $vbox = Gtk2::VBox->new (FALSE, 0);
$vbox->set_border_width (0);
- foreach my $item (@_) {
- $vbox->pack_start ($item, FALSE, FALSE, 0);
+ foreach (@_) {
+ $vbox->pack_start ($_, FALSE, FALSE, 0);
}
return $vbox;
}
'3.9.3.18',
'0',
],
+ rewrite_ff => [
+ 'rewrite_first_from',
+ $xl::s{l_beh_rewrite_ff},
+ $xl::s{h_beh_rewrite_ff},
+ 'bool',
+ '3.14.0.94',
+ '0',
+ ],
);
sub new_behaviour_page() {
new_check_button_for (\%pr::beh, 'dangerous', \%HPVALUE),
new_check_button_for (\%pr::beh, 'out_ascii', \%HPVALUE),
new_check_button_for (\%pr::beh, 'pp_unsel', \%HPVALUE),
- new_check_button_for (\%pr::beh, 'inline_at', \%HPVALUE)),
+ new_check_button_for (\%pr::beh, 'inline_at', \%HPVALUE),
+ new_check_button_for (\%pr::beh, 'rewrite_ff', \%HPVALUE)),
$xl::s{msgs_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$bf->pack_start (new_subpage_frame (
sub new_accounts_page() {
my $accbook = Gtk2::Notebook->new;
$accbook->set_tab_pos ('right');
- foreach (keys %ACPREFS) {
+ my @akeys = sort {
+ $ACPREFS{$a}{'account_name'} cmp $ACPREFS{$b}{'account_name'}
+ } keys %ACPREFS;
+ foreach (@akeys) {
my $name = $ACPREFS{$_}{'account_name'};
- $accbook->append_page (new_account_subpage ($_), $name);
+ my $isdef = ($ACPREFS{$_}{'is_default'} eq '1');
+ my $page = new_account_subpage ($_);
+ $accbook->append_page ($page, $isdef? '<b>' . $name . '</b>': $name);
+ if ($isdef) {
+ my $label = $accbook->get_tab_label ($page);
+ $label->set_use_markup (TRUE);
+ }
}
return $accbook;
}
'-1',
'AttRemover',
],
+ # GPG
+ gpg_alimit => [
+ 'autocompletion_limit',
+ $xl::s{l_plu_gpg_alimit},
+ $xl::s{h_plu_gpg_alimit},
+ 'int,0,100',
+ '3.12.0.75',
+ '0',
+ 'GPG',
+ ],
+ # managesieve
+ msv_winw => [
+ 'manager_win_width',
+ $xl::s{l_win_w},
+ $xl::s{h_win_w},
+ 'int,0,3000', # 0 pixels - 3000 pixels
+ '3.11.1.210',
+ '-1',
+ 'ManageSieve',
+ ],
+ msv_winh => [
+ 'manager_win_height',
+ $xl::s{l_win_h},
+ $xl::s{h_win_h},
+ 'int,0,3000', # 0 pixels - 3000 pixels
+ '3.11.1.210',
+ '-1',
+ 'ManageSieve',
+ ],
# libravatar
lav_burl => [
'base_url',
);
sub new_plugins_page() {
- return new_vbox_pack (
+ my %frame = ();
+ $frame{'AttRemover'} =
new_subpage_frame (
new_hbox_pack (
new_text_box_for_int (\%pr::plu, 'arm_winw', $PLHPVALUE{'AttRemover'}),
new_text_box_for_int (\%pr::plu, 'arm_winh', $PLHPVALUE{'AttRemover'})),
- _('Attachment remover'), 'not-packed'),
+ _('Attachment remover'), 'not-packed');
+ $frame{'GPG'} =
+ new_subpage_frame (
+ new_hbox_pack (
+ new_text_box_for_int (\%pr::plu, 'gpg_alimit', $PLHPVALUE{'GPG'})),
+ _('GPG'), 'not-packed');
+ $frame{'ManageSieve'} =
+ new_subpage_frame (
+ new_hbox_pack (
+ new_text_box_for_int (\%pr::plu, 'msv_winw', $PLHPVALUE{'ManageSieve'}),
+ new_text_box_for_int (\%pr::plu, 'msv_winh', $PLHPVALUE{'ManageSieve'})),
+ _('Sieve manager'), 'not-packed');
+ $frame{'Libravatar'} =
new_subpage_frame (
new_hbox_pack (
new_text_box_for_nchar (\%pr::plu, 'lav_burl', $PLHPVALUE{'Libravatar'})),
- _('Libravatar'), 'not-packed'),
+ _('Libravatar'), 'not-packed');
+ $frame{'PerlPlugin'} =
new_subpage_frame (
new_hbox_pack (
new_selection_box_for (\%pr::plu, 'prl_flvb', $PLHPVALUE{'PerlPlugin'})),
- _('Perl'), 'not-packed')
- );
+ _('Perl'), 'not-packed');
+ foreach (@PLUGINS) {
+ $frame{$_}->set_sensitive (defined $PLHPVALUE{$_});
+ }
+ return new_vbox_pack (
+ $frame{'AttRemover'},
+ $frame{'GPG'},
+ $frame{'ManageSieve'},
+ $frame{'Libravatar'},
+ $frame{'PerlPlugin'});
+}
+
+sub new_info_page() {
+ my $t0 = Gtk2::Table->new (7, 2, FALSE);
+ my $v = get_toolkit_versions ();
+ my %labels = (
+ 'glib' => 'Perl-GLib',
+ 'glib-r' => _('GLib runtime'),
+ 'glib-b' => _('GLib built'),
+ 'gtk2' => 'Perl-GTK2',
+ 'gtk2-r' => _('GTK2 runtime'),
+ 'gtk2-b' => _('GTK2 built'),
+ );
+ my $row = 0;
+ foreach (sort keys %$v) {
+ if (defined $v->{$_}) {
+ my $label = Gtk2::Label->new ($labels{$_});
+ my $value = Gtk2::Label->new ('<b>' . $v->{$_} . '</b>');
+ $label->set_alignment (0, 0.5);
+ $value->set_alignment (0, 0.5);
+ $value->set_use_markup (TRUE);
+ $t0->attach ($label, 0, 1, $row, $row + 1, 'fill', 'shrink', 8, 6);
+ $t0->attach ($value, 1, 2, $row, $row + 1, 'fill', 'shrink', 8, 6);
+ ++$row;
+ }
+ }
+ my $t1 = Gtk2::Table->new (2, 2, FALSE);
+ my @lbl = map { $_->set_alignment (0, 0.5); $_ } (
+ Gtk2::Label->new (_('Binary')),
+ Gtk2::Label->new (_('Configuration'))
+ );
+ my $cfgv = $CONFIGDATA->{'Common'}{'config_version'};
+ $cfgv //= '';
+ my @val = map { $_->set_alignment (0, 0.5); $_->set_use_markup (TRUE); $_ } (
+ Gtk2::Label->new ('<b>' . $CLAWSV . '</b>'),
+ Gtk2::Label->new ('<b>' . $cfgv . '</b>')
+ );
+ for (my $i = 0; $i <= $#lbl; ++$i) {
+ $t1->attach ($lbl[$i], 0, 1, $i, $i + 1, 'fill', 'shrink', 8, 6);
+ $t1->attach ($val[$i], 1, 2, $i, $i + 1, 'fill', 'shrink', 8, 6);
+ }
+ return new_vbox_pack (
+ new_subpage_frame ($t0, _('Library versions'), 'not-packed'),
+ new_subpage_frame ($t1, _('Claws Mail versions'), 'not-packed'));
}
# version info
+sub get_toolkit_versions {
+ my %versions = ();
+ $versions{'glib'} = $Glib::VERSION;
+ # version info stuff appeared in 1.040
+ if ($Glib::VERSION >= 1.040) {
+ $versions{'glib-b'} = join('.', Glib->GET_VERSION_INFO);
+ $versions{'glib-r'} = join('.',
+ &Glib::major_version, &Glib::minor_version, &Glib::micro_version);
+ }
+ $versions{'gtk2'} = $Gtk2::VERSION;
+ if ($Gtk2::VERSION >= 1.040) {
+ $versions{'gtk2-b'} = join('.', Gtk2->GET_VERSION_INFO);
+ $versions{'gtk2-r'} = join('.',
+ &Gtk2::major_version, &Gtk2::minor_version, &Gtk2::micro_version);
+ }
+ return \%versions;
+}
+
sub print_version() {
print $xl::s{about_title} . "\n";
print $xl::s{about_version} . " $VERSION\n";
- print "Perl-GLib " . $Glib::VERSION;
- # version info stuff appeared in 1.040
- if ($Glib::VERSION >= 1.040) {
- print _(", built for ") . join(".", Glib->GET_VERSION_INFO)
- . _(", running with ") . join(".", &Glib::major_version,
- &Glib::minor_version, &Glib::micro_version);
+ my $v = get_toolkit_versions ();
+ if ($v->{'glib-b'}) {
+ print _("Perl-GLib version {glibv}, built for {glibb}, running with {glibr}.",
+ glibv => $v->{'glib'},
+ glibb => $v->{'glib-b'},
+ glibr => $v->{'glib-r'});
+ } else {
+ print _("Perl-GLib version {glibv}.", glibv => $v->{'glib'});
}
print "\n";
- print "Perl-GTK2 " . $Gtk2::VERSION;
- if ($Gtk2::VERSION >= 1.040) {
- print _(", built for ") . join(".", Gtk2->GET_VERSION_INFO)
- . _(", running with ") . join(".", &Gtk2::major_version,
- &Gtk2::minor_version, &Gtk2::micro_version);
+ if ($v->{'gtk2-b'}) {
+ print _("Perl-GTK2 version {gtkv}, built for {gtkb}, running with {gtkr}.",
+ gtkv => $v->{'gtk2'},
+ gtkb => $v->{'gtk2-b'},
+ gtkr => $v->{'gtk2-r'});
+ } else {
+ print _("Perl-GTK2 version {gtkv}.", gtkv => $v->{'gtk2'});
}
print "\n";
my $clawsver = ($CLAWSV eq "") ?
- _("was not found!") :
- (_("returned version ") . $CLAWSV);
- print "Claws Mail " . $clawsver . "\n";
+ _("Claws Mail was not found!") :
+ _("Claws Mail returned version {cmv}.", cmv => $CLAWSV);
+ print $clawsver . "\n";
}
# the command line help
sub print_help() {
- my $line = '-' x length ($xl::s{about_title}) . "\n";
- print $line;
- print $xl::s{about_title} . "\n";
- print $line;
- print _("Syntax:\n");
- print _(" clawsker [options]\n");
- print _("Options:\n");
- print _(" -h|--help Prints this help screen.\n");
- print _(" -v|--version Prints version infos.\n");
- print _(" -b|--verbose More messages on standard output.\n");
- print _(" -a|--alternate-config-dir <dir> Uses <dir> as Claws Mail config dir.\n");
- print _(" -c|--clawsrc <file> Uses <file> as full resource name.\n");
+ my $line = '-' x length ($xl::s{about_title});
+ say $line;
+ say $xl::s{about_title};
+ say $line;
+ my @help = (
+ _("Syntax:"),
+ _(" clawsker [options]"),
+ _("Options:"),
+ _(" -a|--alternate-config-dir <dir> Uses <dir> as Claws Mail configuration."),
+ _(" -b|--verbose More messages on standard output."),
+ _(" -c|--clawsrc <file> Uses <file> as full resource name."),
+ _(" -h|--help Prints this help screen and exits."),
+ _(" -r|--read-only Disables writing changes to disk."),
+ _(" -v|--version Prints version information and exits.")
+ );
+ foreach (@help) { say $_ }
}
sub parse_command_line {
$HPVALUE{${$hash}{$key}[NAME]} = $PREFS{${$hash}{$key}[NAME]};
}
}
- return TRUE;
-}
-
-sub init_ac_hidden_preferences {
foreach my $akey (keys %ACPREFS) {
foreach my $key (keys %pr::acc) {
my $pname = $pr::acc{$key}[NAME];
$ACHPVALUE{$akey}{$pname} = $ACPREFS{$akey}{$pname};
}
}
- return TRUE;
-}
-
-sub init_plu_hidden_preferences {
foreach my $key (keys %pr::plu) {
my $plugin = $pr::plu{$key}[PLUGIN];
my $pname = $pr::plu{$key}[NAME];
- $PLHPVALUE{$plugin}{$pname} = $PLPREFS{$plugin}{$pname};
+ if (defined $PLPREFS{$plugin}) {
+ $PLHPVALUE{$plugin}{$pname} = $PLPREFS{$plugin}{$pname};
+ }
}
return TRUE;
}
my %meta = ();
my $line = 0;
open (RCF, '<:encoding(utf8)', $rc)
- or die _("Error: opening '{file}' for reading", file => $rc) . ": $!";
+ or die _("Error: opening '{file}' for reading", file => $rc) . ": $!\n";
my $section = '_'; # default unnamed section
while (<RCF>) {
chomp;
sub save_resource {
my ($rc, $data, $meta) = @_;
open (RCF, '>:utf8', $rc)
- or die _("Error: opening '{file}' for writing", file => $rc) . ": $!";
+ or die _("Error: opening '{file}' for writing", file => $rc) . ": $!\n";
my @sections = keys %$data;
if (defined $meta) {
@sections = sort {
}
# load current status from disc
-sub load_preferences {
+sub load_rc_preferences {
my $rc = get_rc_filename ();
log_message ("Loading preferences from $rc\n");
return FALSE unless check_rc_file ($rc);
- return FALSE unless check_claws_not_running ();
($CONFIGDATA, $CONFIGMETA) = load_resource ($rc);
foreach (keys %{$CONFIGDATA->{'Common'}}) {
$PREFS{$_} = $CONFIGDATA->{'Common'}{$_};
}
- foreach my $plugin (qw(AttRemover Libravatar PerlPlugin)) {
- foreach (keys %{$CONFIGDATA->{$plugin}}) {
- $PLPREFS{$plugin}{$_} = $CONFIGDATA->{$plugin}{$_};
+ foreach my $plugin (@PLUGINS) {
+ if (defined $CONFIGDATA->{$plugin}) {
+ push (@AVPLUGINS, $plugin);
+ foreach (keys %{$CONFIGDATA->{$plugin}}) {
+ $PLPREFS{$plugin}{$_} = $CONFIGDATA->{$plugin}{$_};
+ }
}
}
return TRUE;
my $rc = get_ac_rc_filename ();
log_message ("Loading account preferences from $rc\n");
return FALSE unless check_rc_file ($rc);
- return FALSE unless check_claws_not_running ();
($ACCOUNTDATA, $ACCOUNTMETA) = load_resource ($rc);
foreach my $asect (keys %$ACCOUNTDATA) {
if ($asect =~ /^Account: (\d+)$/) {
return TRUE;
}
+sub load_preferences {
+ return FALSE unless check_claws_not_running ();
+ return (load_rc_preferences () and load_ac_preferences ());
+}
+
# save current preferences to disc
sub save_preferences {
my $rc = get_rc_filename ();
$CONFIGDATA->{'Common'}{$_} = $HPVALUE{$_};
}
}
- foreach my $plugin (qw(AttRemover Libravatar PerlPlugin)) {
+ foreach my $plugin (@AVPLUGINS) {
foreach (keys %{$CONFIGDATA->{$plugin}}) {
if (defined $PLHPVALUE{$plugin}{$_}) {
$CONFIGDATA->{$plugin}{$_} = $PLHPVALUE{$plugin}{$_};
$nb->append_page (new_winpos_page (), $xl::s{tab_winpos});
$nb->append_page (new_accounts_page (), $xl::s{tab_accounts});
$nb->append_page (new_plugins_page (), $xl::s{tab_plugins});
+ $nb->append_page (new_info_page (), $xl::s{tab_info});
return $nb;
}
. "<span size=\"large\">$lic</span>\n\n"
. "<span size=\"small\">$license</span>");
$dialog->set_title ($xl::s{about});
+ if (Gtk2->CHECK_VERSION (2, 10, 0)) {
+ my @icons = get_app_icons ();
+ my $image = Gtk2::Image->new_from_pixbuf ($icons[1]);
+ $image->show ();
+ $image->set_alignment (0, 0);
+ $dialog->set_image ($image);
+ }
#
return $dialog;
}
}
sub get_app_icons {
- my $dir = $DATADIR . '/icons/hicolor';
- my @names = map {
- join ('/', ($dir, , $_ . 'x' . $_, 'apps', $NAME . '.png'))
- } (64, 128);
- my @icons = ();
+ return @APPICONS if (@APPICONS);
+ my @names;
+ if (-d $DATADIR) { # installed
+ my $dir = $DATADIR . '/icons/hicolor';
+ @names = map {
+ join ('/', ($dir, $_ . 'x' . $_, 'apps', $NAME . '.png'))
+ } (64, 128);
+ } else { # unpacked tarball or git clone
+ @names = map {
+ join ('/', ('./icons', $NAME . '-' . $_ . '.png'));
+ } (64, 128);
+ }
foreach (@names) {
my $icon = undef;
$icon = Gtk2::Gdk::Pixbuf->new_from_file($_) if (-f $_);
- push @icons, $icon if ($icon);
+ push @APPICONS, $icon if ($icon);
}
- return @icons;
+ return @APPICONS;
}
# initialise
Gtk2->init;
$main_window = Gtk2::Window->new ('toplevel');
exit unless load_preferences ();
-exit unless load_ac_preferences ();
exit unless init_hidden_preferences ();
-exit unless init_ac_hidden_preferences ();
-exit unless init_plu_hidden_preferences ();
# create main GUI
my $box = Gtk2::VBox->new (FALSE, 5);
$box->set_border_width(3);