tab_gui => _('GUI'),
tab_other => _('Other'),
tab_winpos => _('Windows'),
+ tab_accounts => _('Accounts'),
ab_frame => _('Addressbook'),
mem_frame => _('Memory'),
l_win_main_fs => _('Full-screen'),
h_win_main_fs => _('Changes full screen status.'),
+ l_acc_gtls_set => _('Use custom GnuTLS priority'),
+ h_acc_gtls_set => _('Enables using user provided GnuTLS priority string.'),
+ 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.'),
+
e_error => _('Error: '),
e_noclawsrc => _('resource file for Claws Mail was not found.'),
e_running => _('seems Claws Mail is currently running, close it first.'),
# all preferences read by load_preferences
my %PREFS = ();
+my %ACPREFS = ();
# values of all preferences handled by clawsker
my %HPVALUE = ();
+my %ACHPVALUE = ();
# default config dir and file name
my $ALTCONFIGDIR = FALSE;
my $CONFIGDIR = $ENV{HOME} . '/.claws-mail/';
my $CONFIGRC = 'clawsrc';
+my $ACCOUNTRC = 'accountrc';
# index constants for preference arrays
use constant NAME => 0; # the name on the rc file
}
sub get_claws_version {
- my @cmbin = (
- 'claws-mail',
- );
- my $res = "";
- foreach my $bin (@cmbin) {
- $_ = qx/which $bin/;
- chomp;
- last if ($_ ne "");
- }
+ $_ = qx/which claws-mail/;
+ chomp;
return "" unless ($_); # not installed
+ my $res = "";
$_ = qx/$_ -v/;
chomp;
my @fver = split (/ /);
}
sub handle_nchar_value {
- my ($widget, $event, $dataref, $minlen) = @_;
- $_ = substr ($widget->get_text (), 0, $minlen);
+ my ($widget, $event, $dataref, $minlen, $maxlen) = @_;
+ $_ = substr ($widget->get_text (), 0, $maxlen);
$widget->set_text ($_);
$$dataref = $_;
}
return $CONFIGDIR . $CONFIGRC;
}
+sub get_ac_rc_filename {
+ return $CONFIGDIR . $ACCOUNTRC;
+}
+
sub set_rc_filename {
my ($fullname) = @_;
my @parts = split ('/', $fullname);
my ($hash, $key, $vhash) = @_;
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
- my @type = split (/,/, $$hash{$key}[TYPE]); # char,minlen,maxlen
+ my @type = split (/,/, $$hash{$key}[TYPE]); # char,minlen,maxlen,width
my $hbox = Gtk2::HBox->new (FALSE, 5);
my $glabel = Gtk2::Label->new ($label);
my $gentry = Gtk2::Entry->new ();
$gentry->set_max_length($type[2]) if defined ($type[2]);
- $gentry->set_width_chars(int ($type[2]) + 2) if defined ($type[2]);
+ my $width = $type[3];
+ $width //= $type[2];
+ $gentry->set_width_chars(int ($width) + 2) if defined ($width);
my $value = $$vhash{$name};
$value //= $$hash{$key}[CMDEF];
$gentry->set_text ($value);
$gentry->signal_connect('key-release-event' => sub {
my ($w, $e) = @_;
- handle_nchar_value ($w, $e, \$$vhash{$name}, $type[1]);
+ handle_nchar_value ($w, $e, \$$vhash{$name}, $type[1], $type[2]);
});
set_widget_hint ($gentry, $$hash{$key}[DESC]);
set_widget_sens ($gentry, $$hash{$key}[CMVER]);
return $winbook;
}
+%pr::acc = ( # per account hidden preferences
+ tls_set => [
+ 'gnutls_set_priority',
+ $xl::s{l_acc_gtls_set},
+ $xl::s{h_acc_gtls_set},
+ 'bool',
+ '3.9.0.181',
+ '0',
+ undef,
+ ],
+ tls_pri => [
+ 'gnutls_priority',
+ $xl::s{l_acc_gtls_pri},
+ $xl::s{h_acc_gtls_pri},
+ 'char,0,256,32',
+ '3.9.0.181',
+ '0',
+ undef,
+ ],
+);
+
+sub new_account_subpage($) {
+ my ($akey) = @_;
+ return new_vbox_pack (
+ new_subpage_frame (
+ new_vbox_pack (
+ new_check_button_for (\%pr::acc, 'tls_set', $ACHPVALUE{$akey}),
+ new_text_box_for_nchar (\%pr::acc, 'tls_pri', $ACHPVALUE{$akey})),
+ _('GnuTLS priority'), 'not-packed')
+ );
+}
+
+sub new_accounts_page() {
+ my $accbook = Gtk2::Notebook->new;
+ $accbook->set_tab_pos ('right');
+ foreach (keys %ACPREFS) {
+ my $name = $ACPREFS{$_}{'account_name'};
+ $accbook->append_page (new_account_subpage ($_), $name);
+ }
+ return $accbook;
+}
+
# version info
sub print_version() {
print $xl::s{about_title} . "\n";
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;
+}
+
# load current status from disc
sub load_preferences {
my $rc = get_rc_filename ();
return TRUE;
}
+sub load_ac_preferences {
+ 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 ();
+ open (RCF, "<$rc");
+ my $akey;
+ while (<RCF>) {
+ chomp;
+ if (/^\[Account: (\d+)\]$/) {
+ $akey = $1;
+ next;
+ }
+ if (/^([8a-z_]+)=(.*)$/) {
+ $ACPREFS{$akey}{$1} = decode('UTF-8', $2);
+ }
+ }
+ close (RCF);
+ return TRUE;
+}
+
# save current preferences to disc
sub save_preferences {
my $rc = get_rc_filename ();
return TRUE;
}
+sub save_ac_preferences {
+ my $rc = get_ac_rc_filename ();
+ log_message ("Saving account preferences to $rc\n");
+ return FALSE unless check_rc_file ($rc);
+ return FALSE unless check_claws_not_running ();
+ my $rcbak = "$rc.backup";
+ rename ($rc, $rcbak);
+ open (RCF, ">$rc");
+ open (RCB, "<$rcbak");
+ my $akey;
+ while (<RCB>) {
+ chomp;
+ if (/^\[Account: (\d+)\]$/) {
+ $akey = $1;
+ print RCF $_ . "\n";
+ next;
+ }
+ if (/^([8a-z_]+)=(.*)$/) {
+ if (defined($ACHPVALUE{$akey}{$1})) {
+ print RCF $1 . "=" . $ACHPVALUE{$akey}{$1} . "\n";
+ }
+ else {
+ print RCF $_ . "\n";
+ }
+ }
+ else {
+ print RCF $_ . "\n";
+ }
+ }
+ close (RCB);
+ close (RCF);
+ return TRUE;
+}
+
# create notebook
sub new_notebook {
my $nb = Gtk2::Notebook->new;
$nb->append_page (new_gui_page (), $xl::s{tab_gui});
$nb->append_page (new_other_page (), $xl::s{tab_other});
$nb->append_page (new_winpos_page (), $xl::s{tab_winpos});
+ $nb->append_page (new_accounts_page (), $xl::s{tab_accounts});
return $nb;
}
my $hbox = Gtk2::HBox->new (FALSE, 5);
# signal handlers
$b_exit->signal_connect (clicked => sub { Gtk2->main_quit });
- $b_apply->signal_connect (clicked => sub { save_preferences ($parent) });
+ $b_apply->signal_connect (clicked => sub {
+ save_preferences ($parent);
+ save_ac_preferences ($parent);
+ });
# $b_undo->signal_connect (clicked => sub { undo_current_changes });
$b_about->signal_connect (clicked => sub { $adlg->run; $adlg->hide });
# package them
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 ();
# create main GUI
my $box = Gtk2::VBox->new (FALSE, 5);
$box->set_border_width(3);