binmode STDOUT, ":encoding(utf8)";
+use 5.010_000;
use strict;
use utf8;
use Glib qw(TRUE FALSE);
my $DATADIR = '@DATADIR@';
my $VERSION = '@VERSION@';
my $VERBOSE = FALSE;
+my $READONLY = FALSE;
my $CLAWSV = undef;
my $main_window = undef;
tab_gui => _('GUI'),
tab_other => _('Other'),
tab_winpos => _('Windows'),
+ tab_accounts => _('Accounts'),
+ tab_plugins => _('Plugins'),
+ tab_info => _('Info'),
ab_frame => _('Addressbook'),
mem_frame => _('Memory'),
h_oth_use_netm => _('Use NetworkManager to switch offline automatically.'),
l_oth_mp_rounds => _('Rounds for PBKDF2 function'),
h_oth_mp_rounds => _('Specify the number of iterations the key derivation function will be applied on master passphrase computation. Does not modify currently stored passphrase, only master passphrases computed after changing this value are affected.'),
-
+
l_gui_b_unread => _('Show unread messages with bold font'),
h_gui_b_unread => _('Show unread messages in the Message List using a bold font.'),
l_gui_no_markup => _('Don\'t use markup'),
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 the from the start.'),
+ 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_win_main_fs => _('Full-screen'),
h_win_main_fs => _('Changes full screen status.'),
- e_error => _('Error: '),
- e_noclawsrc => _('resource file for Claws Mail was not found.'),
- e_running => _('seems Claws Mail is currently running, close it first.'),
+ 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.'),
+
+ 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'),
+ h_plu_prl_flvb => _('Verbosity level of log, acumulative.'),
+ l_plu_prl_none => _('None'),
+ l_plu_prl_manual => _('Manual'),
+ l_plu_prl_action => _('Actions'),
+ l_plu_prl_match => _('Matches'),
);
+# data and metadata of resource files
+my $CONFIGDATA;
+my $CONFIGMETA;
+my $ACCOUNTDATA;
+my $ACCOUNTMETA;
# all preferences read by load_preferences
my %PREFS = ();
+my %ACPREFS = ();
+my %PLPREFS = ();
# values of all preferences handled by clawsker
my %HPVALUE = ();
+my %ACHPVALUE = ();
+my %PLHPVALUE = ();
# default config dir and file name
my $ALTCONFIGDIR = FALSE;
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
use constant TYPE => 3; # data type: bool, int, float, string, color
use constant CMVER => 4; # lowest[,highest] Claws Mail version(s) the feature exists
use constant CMDEF => 5; # default value for the preference in Claws Mail
-use constant GUI => 6; # GUI element
+use constant PLUGIN => 6; # plugin section (only in plugin preferences)
# constants for GUI spacing
use constant HBOX_SPC => 5;
push (@version, '0');
}
my $idx = 0;
- while (($idx <= $#refvers)
+ while (($idx <= $#refvers)
and (int ($version[$idx]) == int ($refvers[$idx]))) {
++$idx;
}
}
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 = $_;
}
$_ = uc ($str);
if (/\#([A-F0-9][A-F0-9])([A-F0-9][A-F0-9])([A-F0-9][A-F0-9])/) {
$rr = hex($1) * 256;
- $gg = hex($2) * 256;
+ $gg = hex($2) * 256;
$bb = hex($3) * 256;
}
my $color = Gtk2::Gdk::Color->new ($rr, $gg, $bb);
return $CONFIGDIR . $CONFIGRC;
}
+sub get_ac_rc_filename {
+ return $CONFIGDIR . $ACCOUNTRC;
+}
+
sub set_rc_filename {
my ($fullname) = @_;
my @parts = split ('/', $fullname);
}
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_claws_not_running {
+ return TRUE if $READONLY;
my $tmpdir = (defined $ENV{TMPDIR})? $ENV{TMPDIR}: '/tmp';
$tmpdir = '/tmp' if ($tmpdir eq '');
- my $socket = (not $ALTCONFIGDIR)? $tmpdir: $CONFIGDIR;
- $socket .= "/claws-mail-$<";
- -S $socket and return claws_is_running ();
- # since 3.9.0cvs36
my $lockdir = "$tmpdir/claws-mail-$<";
- -d $lockdir and do {
- $_ = $CONFIGDIR;
- s/\/$//;
- $socket = "$lockdir/" . md5_hex ($_);
- -S $socket and return claws_is_running ();
+ -d $lockdir and do {
+ $_ = $CONFIGDIR;
+ s/\/$//;
+ my $socket = "$lockdir/" . md5_hex ($_);
+ -S $socket and return claws_is_running ();
};
return TRUE;
}
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 set_widget_hint {
if ($SHOWHINTS) {
- my ($wdgt, $hint) = @_;
+ my ($wdgt, $hint) = @_;
$wdgt->set_tooltip_text ($hint);
$wdgt->set_has_tooltip (TRUE);
}
}
}
-# graphic element creation
+# graphic element creation
-sub new_check_button_for {
- my ($hash, $key) = @_;
+sub new_check_button_for($$$) {
+ my ($hash, $key, $vhash) = @_;
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
#
my $hbox = Gtk2::HBox->new (FALSE, 5);
my $cb = Gtk2::CheckButton->new ($label);
- $$hash{$key}[GUI] = $cb;
- if (defined ($HPVALUE{$name})) {
- $cb->set_active ($HPVALUE{$name} eq '1');
- }
+ my $value = $$vhash{$name};
+ $value //= $$hash{$key}[CMDEF];
+ $cb->set_active ($value eq '1');
$cb->signal_connect (clicked => sub {
my ($w, $e) = @_;
- handle_bool_value ($w, $e, \$HPVALUE{$name});
+ handle_bool_value ($w, $e, \$$vhash{$name});
});
set_widget_hint ($cb, $$hash{$key}[DESC]);
set_widget_sens ($cb, $$hash{$key}[CMVER]);
return $hbox;
}
-sub new_text_box_for_int {
- my ($hash, $key) = @_;
+sub new_text_box_for_int($$$) {
+ my ($hash, $key, $vhash) = @_;
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
my @type = split (/,/, $$hash{$key}[TYPE]);
- push (@type, 0), push (@type, 10000) unless ($#type > 0);
+ push (@type, 0), push (@type, 10000) unless ($#type > 0);
#
my $hbox = Gtk2::HBox->new (FALSE, 5);
my $glabel = Gtk2::Label->new ($label);
my $pagei = int (($type[2] - $type[1]) / 10);
my $gentry = Gtk2::SpinButton->new_with_range ($type[1], $type[2], $pagei);
+ my $value = $$vhash{$name};
+ $value //= $$hash{$key}[CMDEF];
$gentry->set_numeric (TRUE);
- $gentry->set_value ($HPVALUE{$name});
- $$hash{$key}[GUI] = $gentry;
+ $gentry->set_value ($value);
$gentry->signal_connect('value-changed' => sub {
my ($w, $e) = @_;
- handle_int_value ($w, $e, \$HPVALUE{$name});
+ handle_int_value ($w, $e, \$$vhash{$name});
});
set_widget_hint ($gentry, $$hash{$key}[DESC]);
set_widget_sens ($gentry, $$hash{$key}[CMVER]);
return $hbox;
}
-sub new_text_box_for_nchar {
- my ($hash, $key) = @_;
+sub new_text_box_for_nchar($$$) {
+ 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]);
- $gentry->set_text ($HPVALUE{$name});
- $$hash{$key}[GUI] = $gentry;
+ 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, \$HPVALUE{$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 $hbox;
}
-sub new_color_button_for {
- my ($hash, $key) = @_;
+sub new_color_button_for($$$) {
+ my ($hash, $key, $vhash) = @_;
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
#
- my $col = gdk_color_from_str ($HPVALUE{$name});
+ my $value = $$vhash{$name};
+ $value //= $$hash{$key}[CMDEF];
+ my $col = gdk_color_from_str ($value);
my $hbox = Gtk2::HBox->new (FALSE, 5);
my $glabel = Gtk2::Label->new ($label);
my $button = Gtk2::ColorButton->new_with_color ($col);
- $$hash{$key}[GUI] = $button;
$button->set_title ($label);
$button->set_relief ('none');
$button->signal_connect ('color-set' => sub {
my ($w, $e) = @_;
- handle_color_value ($w, $e, \$HPVALUE{$name});
+ handle_color_value ($w, $e, \$$vhash{$name});
});
set_widget_hint ($button, $$hash{$key}[DESC]);
set_widget_sens ($button, $$hash{$key}[CMVER]);
return $hbox;
}
-sub new_selection_box_for {
- my ($hash, $key) = @_;
+sub new_selection_box_for($$$) {
+ my ($hash, $key, $vhash) = @_;
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
#
my $hbox = Gtk2::HBox->new (FALSE, 5);
my $glabel = Gtk2::Label->new ($label);
my $combo = Gtk2::ComboBox->new_text;
- $$hash{$key}[GUI] = $combo;
my @options = split (';', $$hash{$key}[TYPE]);
foreach my $opt (@options) {
my ($index, $textkey) = split ('=', $opt);
}
$combo->signal_connect ('changed' => sub {
my ($w, $e) = @_;
- handle_selection_value ($w, $e, \$HPVALUE{$name});
+ handle_selection_value ($w, $e, \$$vhash{$name});
});
- $combo->set_active ($HPVALUE{$name});
+ my $value = $$vhash{$name};
+ $value //= $$hash{$key}[CMDEF];
+ $combo->set_active ($value);
set_widget_hint ($combo, $$hash{$key}[DESC]);
set_widget_sens ($combo, $$hash{$key}[CMVER]);
$glabel->set_sensitive ($combo->sensitive);
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;
-}
+}
sub new_subpage_frame {
my ($box, $title, $notpacked) = @_;
my $frame = Gtk2::Frame->new ($title);
- $frame->add ($box);
+ $frame->add ($box);
return new_vbox_pack ($frame) unless defined ($notpacked);
return $frame;
}
# preference maps and corresponding page creation subs
%pr::oth = ( # other preferences
- use_dlg => [
+ use_dlg => [
'addressbook_use_editaddress_dialog',
$xl::s{l_oth_use_dlg},
$xl::s{h_oth_use_dlg},
'bool',
'2.7.0',
'0',
- undef,
],
max_use => [
'cache_max_mem_usage',
'int,0,262144', # 0 Kb - 256 Mb
'0.0.0',
'4096',
- undef,
],
min_time => [
'cache_min_keep_time',
'int,0,120', # 0 minutes - 2 hours
'0.0.0',
'15',
- undef,
],
use_netm => [
'use_networkmanager',
'bool',
'3.3.1',
'1',
- undef,
],
mp_rounds => [
'master_passphrase_pbkdf2_rounds',
'int,50000,1000000',
'3.13.2.110',
'50000',
- undef,
],
);
return new_vbox_pack (
new_subpage_frame (
new_vbox_pack (
- new_check_button_for(\%pr::oth, 'use_dlg')),
+ new_check_button_for(\%pr::oth, 'use_dlg', \%HPVALUE)),
$xl::s{ab_frame}, 'not-packed'),
new_subpage_frame (
new_vbox_pack (
- new_text_box_for_int(\%pr::oth, 'max_use'),
- new_text_box_for_int(\%pr::oth, 'min_time')),
+ new_text_box_for_int(\%pr::oth, 'max_use', \%HPVALUE),
+ new_text_box_for_int(\%pr::oth, 'min_time', \%HPVALUE)),
$xl::s{mem_frame}, 'not-packed'),
new_subpage_frame (
new_vbox_pack (
- new_check_button_for(\%pr::oth, 'use_netm')),
+ new_check_button_for(\%pr::oth, 'use_netm', \%HPVALUE)),
$xl::s{netm_frame}, 'not-packed'),
new_subpage_frame (
new_vbox_pack (
- new_text_box_for_int(\%pr::oth, 'mp_rounds')),
+ new_text_box_for_int(\%pr::oth, 'mp_rounds', \%HPVALUE)),
$xl::s{mpass_frame}, 'not-packed')
);
}
%pr::gui = ( # gui bells and whistles
- b_unread => [
+ b_unread => [
'bold_unread',
$xl::s{l_gui_b_unread},
$xl::s{h_gui_b_unread},
'bool',
'0.0.0',
'1',
- undef,
],
no_markup => [
'compose_no_markup',
'bool',
'0.0.0',
'0',
- undef,
],
dot_lines => [
'enable_dotted_lines',
'bool',
'0.0.0,3.7.10.44',
'0',
- undef,
],
h_scroll => [
'enable_hscrollbar',
'bool',
'0.0.0',
'1',
- undef,
],
swp_from => [
'enable_swap_from',
'bool',
'0.0.0',
'0',
- undef,
],
v_scroll => [
'folderview_vscrollbar_policy',
'0=l_gui_v_scroll_show;1=l_gui_v_scroll_auto;2=l_gui_v_scroll_hide',
'0.0.0',
'0',
- undef,
],
from_show => [
'summary_from_show',
'0=l_gui_from_show_name;1=l_gui_from_show_addr;2=l_gui_from_show_both',
'3.7.10',
'0',
- undef,
],
strip_off => [
'stripes_color_offset',
'int,0,40000', # no idea what this number means
'0.0.0',
'4000',
- undef,
],
cursor_v => [
'textview_cursor_visible',
'bool',
'0.0.0',
'0',
- undef,
],
toolbar_d => [
'toolbar_detachable',
'bool',
'0.0.0',
'0',
- undef,
],
strip_all => [
'use_stripes_everywhere',
'bool',
'0.0.0',
'1',
- undef,
],
strip_sum => [
'use_stripes_in_summaries',
'bool',
'0.0.0',
'1',
- undef,
],
two_linev => [
'two_line_vertical',
'bool',
'3.4.0.7',
'0',
- undef,
],
margin_co => [
'show_compose_margin',
'bool',
'3.7.6.7',
'0',
- undef,
],
mview_date => [
'msgview_date_format',
'bool',
'3.7.8.42',
'0',
- undef,
],
zero_char => [
'zero_replacement_char',
'char,1,1',
'2.8.1.77',
'0',
- undef,
],
type_any => [
'type_any_header',
'bool',
'3.12.0.44',
'0',
- undef,
],
next_del => [
'next_on_delete',
'bool',
'3.13.0.5',
'0',
- undef,
],
);
my $gf = Gtk2::VBox->new (FALSE, 5);
$gf->set_border_width (PAGE_SPC);
- my $cb_dot_lines = new_check_button_for (\%pr::gui, 'dot_lines');
- my $cb_toolbar_d = new_check_button_for (\%pr::gui, 'toolbar_d');
- my $tb_zero_char = new_text_box_for_nchar (\%pr::gui, 'zero_char');
+ my $cb_dot_lines = new_check_button_for (\%pr::gui, 'dot_lines', \%HPVALUE);
+ my $cb_toolbar_d = new_check_button_for (\%pr::gui, 'toolbar_d', \%HPVALUE);
+ my $tb_zero_char = new_text_box_for_nchar (\%pr::gui, 'zero_char', \%HPVALUE);
$gf->pack_start (new_subpage_frame (
new_vbox_pack (
- new_check_button_for (\%pr::gui, 'strip_all'),
- new_check_button_for (\%pr::gui, 'strip_sum'),
- new_text_box_for_int (\%pr::gui, 'strip_off')),
+ new_check_button_for (\%pr::gui, 'strip_all', \%HPVALUE),
+ new_check_button_for (\%pr::gui, 'strip_sum', \%HPVALUE),
+ new_text_box_for_int (\%pr::gui, 'strip_off', \%HPVALUE)),
$xl::s{stripes_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$gf->pack_start (new_subpage_frame (
new_vbox_pack (
- new_check_button_for (\%pr::gui, 'b_unread'),
- new_check_button_for (\%pr::gui, 'swp_from'),
- new_check_button_for (\%pr::gui, 'two_linev'),
- new_check_button_for (\%pr::gui, 'next_del'),
- new_selection_box_for (\%pr::gui, 'from_show')),
- $xl::s{mlist_frame}, 'not-packed'),
+ new_check_button_for (\%pr::gui, 'b_unread', \%HPVALUE),
+ new_check_button_for (\%pr::gui, 'swp_from', \%HPVALUE),
+ new_check_button_for (\%pr::gui, 'two_linev', \%HPVALUE),
+ new_check_button_for (\%pr::gui, 'next_del', \%HPVALUE),
+ new_selection_box_for (\%pr::gui, 'from_show', \%HPVALUE)),
+ $xl::s{mlist_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$gf->pack_start (new_subpage_frame (
new_hbox_pack (
- new_check_button_for (\%pr::gui, 'cursor_v'),
- new_check_button_for (\%pr::gui, 'mview_date')),
- $xl::s{mview_frame}, 'not-packed'),
+ new_check_button_for (\%pr::gui, 'cursor_v', \%HPVALUE),
+ new_check_button_for (\%pr::gui, 'mview_date', \%HPVALUE)),
+ $xl::s{mview_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$gf->pack_start (new_subpage_frame (
new_hbox_pack (
- new_check_button_for (\%pr::gui, 'no_markup'),
- new_check_button_for (\%pr::gui, 'margin_co'),
- new_check_button_for (\%pr::gui, 'type_any')),
- $xl::s{compo_frame}, 'not-packed'),
+ new_check_button_for (\%pr::gui, 'no_markup', \%HPVALUE),
+ new_check_button_for (\%pr::gui, 'margin_co', \%HPVALUE),
+ new_check_button_for (\%pr::gui, 'type_any', \%HPVALUE)),
+ $xl::s{compo_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$gf->pack_start ($cb_dot_lines, FALSE, FALSE, 0);
$gf->pack_start ($cb_toolbar_d, FALSE, FALSE, 0);
$gf->pack_start (new_subpage_frame (
new_vbox_pack (
- new_check_button_for (\%pr::gui, 'h_scroll'),
- new_selection_box_for (\%pr::gui, 'v_scroll')),
+ new_check_button_for (\%pr::gui, 'h_scroll', \%HPVALUE),
+ new_selection_box_for (\%pr::gui, 'v_scroll', \%HPVALUE)),
$xl::s{sbar_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$gf->pack_start ($tb_zero_char, FALSE, FALSE, 0);
'int,100,3000', # 0.1 seconds - 3 seconds
'0.0.0',
'500',
- undef,
],
dangerous => [
'live_dangerously',
'bool',
'0.0.0',
'0',
- undef,
],
flowed => [
'respect_flowed_format',
'bool',
'0.0.0',
'0',
- undef,
],
parts_rw => [
'save_parts_readwrite',
'bool',
'0.0.0',
'0',
- undef,
],
skip_ssl => [
'skip_ssl_cert_check',
'bool',
'0.0.0',
'0',
- undef,
],
up_step => [
'statusbar_update_step',
'int,1,200', # 1 item - 200 items
'0.0.0',
'10',
- undef,
],
thread_a => [
'thread_by_subject_max_age',
'int,1,30', # 1 day - 30 days
'0.0.0',
'10',
- undef,
],
unsafe_ssl => [
'unsafe_ssl_certs',
'bool',
'0.0.0',
'0',
- undef,
],
use_utf8 => [
'utf8_instead_of_locale_for_broken_mail',
'bool',
'0.0.0',
'0',
- undef,
],
warn_dnd => [
'warn_dnd',
'bool',
'0.0.0',
'1',
- undef,
],
out_ascii => [
'outgoing_fallback_to_ascii',
'bool',
'3.4.0.37',
'1',
- undef,
],
pp_unsel => [
'primary_paste_unselects',
'bool',
'3.6.1.35',
'0',
- undef,
],
inline_at => [
'show_inline_attachments',
'bool',
'3.7.8.48',
'1',
- undef,
],
addr_swc => [
'address_search_wildcard',
$xl::s{l_beh_addr_swc},
- $xl::s{h_beh_addr_sw1},
+ $xl::s{h_beh_addr_swc},
'bool',
'3.9.3.18',
'0',
- undef,
],
fold_swc => [
'folder_search_wildcard',
$xl::s{l_beh_fold_swc},
- $xl::s{h_beh_fold_sw1},
+ $xl::s{h_beh_fold_swc},
'bool',
'3.9.3.18',
'0',
- undef,
+ ],
+ rewrite_ff => [
+ 'rewrite_first_from',
+ $xl::s{l_beh_rewrite_ff},
+ $xl::s{h_beh_rewrite_ff},
+ 'bool',
+ '3.14.0.94',
+ '0',
],
);
my $bf = Gtk2::VBox->new (FALSE, 5);
$bf->set_border_width (PAGE_SPC);
- my $tb_up_step = new_text_box_for_int (\%pr::beh, 'up_step');
- my $tb_thread_a = new_text_box_for_int (\%pr::beh, 'thread_a');
+ my $tb_up_step = new_text_box_for_int (\%pr::beh, 'up_step', \%HPVALUE);
+ my $tb_thread_a = new_text_box_for_int (\%pr::beh, 'thread_a', \%HPVALUE);
$bf->pack_start (new_subpage_frame (
new_vbox_pack (
- new_text_box_for_int (\%pr::beh, 'hover_t'),
- new_check_button_for (\%pr::beh, 'warn_dnd')),
- $xl::s{dnd_frame}, 'not-packed'),
+ new_text_box_for_int (\%pr::beh, 'hover_t', \%HPVALUE),
+ new_check_button_for (\%pr::beh, 'warn_dnd', \%HPVALUE)),
+ $xl::s{dnd_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$bf->pack_start (new_subpage_frame (
new_hbox_pack (
- new_check_button_for (\%pr::beh, 'skip_ssl'),
- new_check_button_for (\%pr::beh, 'unsafe_ssl')),
+ new_check_button_for (\%pr::beh, 'skip_ssl', \%HPVALUE),
+ new_check_button_for (\%pr::beh, 'unsafe_ssl', \%HPVALUE)),
$xl::s{ssl_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$bf->pack_start ($tb_up_step, FALSE, FALSE, 0);
$bf->pack_start ($tb_thread_a, FALSE, FALSE, 0);
$bf->pack_start (new_subpage_frame (
new_vbox_pack (
- new_check_button_for (\%pr::beh, 'flowed'),
- new_check_button_for (\%pr::beh, 'parts_rw'),
- new_check_button_for (\%pr::beh, 'use_utf8'),
- new_check_button_for (\%pr::beh, 'dangerous'),
- new_check_button_for (\%pr::beh, 'out_ascii'),
- new_check_button_for (\%pr::beh, 'pp_unsel'),
- new_check_button_for (\%pr::beh, 'inline_at')),
+ new_check_button_for (\%pr::beh, 'flowed', \%HPVALUE),
+ new_check_button_for (\%pr::beh, 'parts_rw', \%HPVALUE),
+ new_check_button_for (\%pr::beh, 'use_utf8', \%HPVALUE),
+ 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, 'rewrite_ff', \%HPVALUE)),
$xl::s{msgs_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
$bf->pack_start (new_subpage_frame (
new_vbox_pack (
- new_check_button_for (\%pr::beh, 'addr_swc'),
- new_check_button_for (\%pr::beh, 'fold_swc')),
+ new_check_button_for (\%pr::beh, 'addr_swc', \%HPVALUE),
+ new_check_button_for (\%pr::beh, 'fold_swc', \%HPVALUE)),
$xl::s{swc_frame}, 'not-packed'),
FALSE, FALSE, FRAME_SPC);
return $bf;
'color',
'0.0.0',
'#0000cf',
- undef,
],
log_err => [
'log_error_color',
'color',
'0.0.0',
'#af0000',
- undef,
],
log_in => [
'log_in_color',
'color',
'0.0.0',
'#000000',
- undef,
],
log_msg => [
'log_msg_color',
'color',
'0.0.0',
'#00af00',
- undef,
],
log_out => [
'log_out_color',
'color',
'0.0.0',
'#0000ef',
- undef,
],
log_warn => [
'log_warn_color',
'color',
'0.0.0',
'#af0000',
- undef,
],
diff_add => [
'diff_added_color',
'color',
'3.8.0.54',
'#008b8b',
- undef,
],
diff_del => [
'diff_deleted_color',
'color',
'3.8.0.54',
'#6a5acd',
- undef,
],
diff_hunk => [
'diff_hunk_color',
'color',
'3.8.0.54',
'#a52a2a',
- undef,
],
);
return new_vbox_pack (
new_subpage_frame (
new_vbox_pack (
- new_color_button_for (\%pr::col, 'emphasis')),
+ new_color_button_for (\%pr::col, 'emphasis', \%HPVALUE)),
$xl::s{msgview_frame}, 'not-packed'),
new_subpage_frame (
new_vbox_pack (
- new_color_button_for (\%pr::col, 'log_err'),
- new_color_button_for (\%pr::col, 'log_in'),
- new_color_button_for (\%pr::col, 'log_msg'),
- new_color_button_for (\%pr::col, 'log_out'),
- new_color_button_for (\%pr::col, 'log_warn')),
+ new_color_button_for (\%pr::col, 'log_err', \%HPVALUE),
+ new_color_button_for (\%pr::col, 'log_in', \%HPVALUE),
+ new_color_button_for (\%pr::col, 'log_msg', \%HPVALUE),
+ new_color_button_for (\%pr::col, 'log_out', \%HPVALUE),
+ new_color_button_for (\%pr::col, 'log_warn', \%HPVALUE)),
$xl::s{log_frame}, 'not-packed'),
new_subpage_frame (
new_vbox_pack (
- new_color_button_for (\%pr::col, 'diff_add'),
- new_color_button_for (\%pr::col, 'diff_del'),
- new_color_button_for (\%pr::col, 'diff_hunk')),
+ new_color_button_for (\%pr::col, 'diff_add', \%HPVALUE),
+ new_color_button_for (\%pr::col, 'diff_del', \%HPVALUE),
+ new_color_button_for (\%pr::col, 'diff_hunk', \%HPVALUE)),
$xl::s{diff_frame}, 'not-packed')
);
}
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'16',
- undef,
],
main_y => [
'mainwin_y',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'16',
- undef,
],
main_w => [
'mainwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'779',
- undef,
],
main_h => [
'mainwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'568',
- undef,
],
main_mx => [
'mainwin_maximised',
'bool',
'0.0.0',
'0',
- undef,
],
main_fs => [
'mainwin_fullscreen',
'bool',
'0.0.0',
'0',
- undef,
],
msgs_x => [
'main_messagewin_x',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'256',
- undef,
],
msgs_y => [
'main_messagewin_y',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'210',
- undef,
],
msgs_w => [
'messagewin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'600',
- undef,
],
msgs_h => [
'messagewin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'540',
- undef,
],
send_w => [
'sendwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'460',
- undef,
],
send_h => [
'sendwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
recv_w => [
'receivewin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'460',
- undef,
],
recv_h => [
'receivewin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
fold_x => [
'folderwin_x',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'16',
- undef,
],
fold_y => [
'folderwin_y',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'16',
- undef,
],
fold_w => [
'folderitemwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'500',
- undef,
],
fold_h => [
'folderitemwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
fsel_w => [
'folderselwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'300',
- undef,
],
fsel_h => [
'folderselwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
sour_w => [
'sourcewin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'600',
- undef,
],
sour_h => [
'sourcewin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'500',
- undef,
],
addr_w => [
'addressbookwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'520',
- undef,
],
addr_h => [
'addressbookwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
adep_w => [
'addressbookeditpersonwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'640',
- undef,
],
adep_h => [
'addressbookeditpersonwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'320',
- undef,
],
adeg_w => [
'addressbookeditgroupwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'580',
- undef,
],
adeg_h => [
'addressbookeditgroupwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'340',
- undef,
],
adda_w => [
'addressaddwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'300',
- undef,
],
adda_h => [
'addressaddwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
addf_w => [
'addressbook_folderselwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'300',
- undef,
],
addf_h => [
'addressbook_folderselwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
acce_w => [
'editaccountwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'500',
- undef,
],
acce_h => [
'editaccountwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
acco_w => [
'accountswin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'500',
- undef,
],
acco_h => [
'accountswin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
filt_w => [
'filteringwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'500',
- undef,
],
filt_h => [
'filteringwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
fila_w => [
'filteringactionwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'490',
- undef,
],
fila_h => [
'filteringactionwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
fild_w => [
'filtering_debugwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'600',
- undef,
],
fild_h => [
'filtering_debugwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
matc_w => [
'matcherwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'520',
- undef,
],
matc_h => [
'matcherwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
pref_w => [
'prefswin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'600',
- undef,
],
pref_h => [
'prefswin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
temp_w => [
'templateswin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'480',
- undef,
],
temp_h => [
'templateswin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
acti_w => [
'actionswin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'486',
- undef,
],
acti_h => [
'actionswin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
tags_w => [
'tagswin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'486',
- undef,
],
tags_h => [
'tagswin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
plug_w => [
'pluginswin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
plug_h => [
'pluginswin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
logw_w => [
'logwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'520',
- undef,
],
logw_h => [
'logwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
prin_w => [
'print_previewwin_width',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'600',
- undef,
],
prin_h => [
'print_previewwin_height',
'int,0,3000', # 0 pixels - 3000 pixels
'0.0.0',
'-1',
- undef,
],
);
return new_subpage_frame (
new_vbox_pack_compact (
new_vbox_pack (
- new_text_box_for_int (\%pr::win, 'main_x'),
- new_text_box_for_int (\%pr::win, 'main_y')),
+ new_text_box_for_int (\%pr::win, 'main_x', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'main_y', \%HPVALUE)),
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'main_w'),
- new_text_box_for_int (\%pr::win, 'main_h')),
+ new_text_box_for_int (\%pr::win, 'main_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'main_h', \%HPVALUE)),
new_vbox_pack (
- new_check_button_for (\%pr::win, 'main_fs'),
- new_check_button_for (\%pr::win, 'main_mx'))),
+ new_check_button_for (\%pr::win, 'main_fs', \%HPVALUE),
+ new_check_button_for (\%pr::win, 'main_mx', \%HPVALUE))),
_('Main window')
);
}
return new_subpage_frame (
new_vbox_pack_compact (
new_vbox_pack (
- new_text_box_for_int (\%pr::win, 'msgs_x'),
- new_text_box_for_int (\%pr::win, 'msgs_y')),
+ new_text_box_for_int (\%pr::win, 'msgs_x', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'msgs_y', \%HPVALUE)),
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'msgs_w'),
- new_text_box_for_int (\%pr::win, 'msgs_h'))),
+ new_text_box_for_int (\%pr::win, 'msgs_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'msgs_h', \%HPVALUE))),
_('Message window')
);
}
return new_vbox_pack (
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'send_w'),
- new_text_box_for_int (\%pr::win, 'send_h')),
+ new_text_box_for_int (\%pr::win, 'send_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'send_h', \%HPVALUE)),
_('Send window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'recv_w'),
- new_text_box_for_int (\%pr::win, 'recv_h')),
+ new_text_box_for_int (\%pr::win, 'recv_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'recv_h', \%HPVALUE)),
_('Receive window'), 'not-packed')
);
}
new_subpage_frame (
new_vbox_pack_compact (
new_vbox_pack (
- new_text_box_for_int (\%pr::win, 'fold_x'),
- new_text_box_for_int (\%pr::win, 'fold_y')),
+ new_text_box_for_int (\%pr::win, 'fold_x', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'fold_y', \%HPVALUE)),
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'fold_w'),
- new_text_box_for_int (\%pr::win, 'fold_h'))),
+ new_text_box_for_int (\%pr::win, 'fold_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'fold_h', \%HPVALUE))),
_('Folder window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'fsel_w'),
- new_text_box_for_int (\%pr::win, 'fsel_h')),
+ new_text_box_for_int (\%pr::win, 'fsel_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'fsel_h', \%HPVALUE)),
_('Folder selection window'), 'not-packed')
);
}
return new_vbox_pack (
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'addr_w'),
- new_text_box_for_int (\%pr::win, 'addr_h')),
+ new_text_box_for_int (\%pr::win, 'addr_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'addr_h', \%HPVALUE)),
_('Addressbook main window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'adep_w'),
- new_text_box_for_int (\%pr::win, 'adep_h')),
+ new_text_box_for_int (\%pr::win, 'adep_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'adep_h', \%HPVALUE)),
_('Edit person window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'adeg_w'),
- new_text_box_for_int (\%pr::win, 'adeg_h')),
+ new_text_box_for_int (\%pr::win, 'adeg_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'adeg_h', \%HPVALUE)),
_('Edit group window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'adda_w'),
- new_text_box_for_int (\%pr::win, 'adda_h')),
+ new_text_box_for_int (\%pr::win, 'adda_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'adda_h', \%HPVALUE)),
_('Add address window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'addf_w'),
- new_text_box_for_int (\%pr::win, 'addf_h')),
+ new_text_box_for_int (\%pr::win, 'addf_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'addf_h', \%HPVALUE)),
_('Folder select window'), 'not-packed')
);
}
return new_vbox_pack (
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'acco_w'),
- new_text_box_for_int (\%pr::win, 'acco_h')),
+ new_text_box_for_int (\%pr::win, 'acco_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'acco_h', \%HPVALUE)),
_('Accounts window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'acce_w'),
- new_text_box_for_int (\%pr::win, 'acce_h')),
+ new_text_box_for_int (\%pr::win, 'acce_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'acce_h', \%HPVALUE)),
_('Edit account window'), 'not-packed')
);
}
return new_vbox_pack (
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'filt_w'),
- new_text_box_for_int (\%pr::win, 'filt_h')),
+ new_text_box_for_int (\%pr::win, 'filt_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'filt_h', \%HPVALUE)),
_('Filtering window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'fila_w'),
- new_text_box_for_int (\%pr::win, 'fila_h')),
+ new_text_box_for_int (\%pr::win, 'fila_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'fila_h', \%HPVALUE)),
_('Filtering actions window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'fild_w'),
- new_text_box_for_int (\%pr::win, 'fild_h')),
+ new_text_box_for_int (\%pr::win, 'fild_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'fild_h', \%HPVALUE)),
_('Filtering debug window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'matc_w'),
- new_text_box_for_int (\%pr::win, 'matc_h')),
+ new_text_box_for_int (\%pr::win, 'matc_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'matc_h', \%HPVALUE)),
_('Matcher window'), 'not-packed')
);
}
return new_vbox_pack (
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'pref_w'),
- new_text_box_for_int (\%pr::win, 'pref_h')),
+ new_text_box_for_int (\%pr::win, 'pref_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'pref_h', \%HPVALUE)),
_('Preferences window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'temp_w'),
- new_text_box_for_int (\%pr::win, 'temp_h')),
+ new_text_box_for_int (\%pr::win, 'temp_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'temp_h', \%HPVALUE)),
_('Templates window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'acti_w'),
- new_text_box_for_int (\%pr::win, 'acti_h')),
+ new_text_box_for_int (\%pr::win, 'acti_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'acti_h', \%HPVALUE)),
_('Actions window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'tags_w'),
- new_text_box_for_int (\%pr::win, 'tags_h')),
+ new_text_box_for_int (\%pr::win, 'tags_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'tags_h', \%HPVALUE)),
_('Tags window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'plug_w'),
- new_text_box_for_int (\%pr::win, 'plug_h')),
+ new_text_box_for_int (\%pr::win, 'plug_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'plug_h', \%HPVALUE)),
_('Plugins window'), 'not-packed')
);
}
return new_vbox_pack (
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'logw_w'),
- new_text_box_for_int (\%pr::win, 'logw_h')),
+ new_text_box_for_int (\%pr::win, 'logw_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'logw_h', \%HPVALUE)),
_('Log window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'prin_w'),
- new_text_box_for_int (\%pr::win, 'prin_h')),
+ new_text_box_for_int (\%pr::win, 'prin_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'prin_h', \%HPVALUE)),
_('Print preview window'), 'not-packed'),
new_subpage_frame (
new_hbox_pack (
- new_text_box_for_int (\%pr::win, 'sour_w'),
- new_text_box_for_int (\%pr::win, 'sour_h')),
+ new_text_box_for_int (\%pr::win, 'sour_w', \%HPVALUE),
+ new_text_box_for_int (\%pr::win, 'sour_h', \%HPVALUE)),
_('View source window'), 'not-packed')
);
}
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',
+ ],
+ 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',
+ ],
+);
+
+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');
+ my @akeys = sort {
+ $ACPREFS{$a}{'account_name'} cmp $ACPREFS{$b}{'account_name'}
+ } keys %ACPREFS;
+ foreach (@akeys) {
+ my $name = $ACPREFS{$_}{'account_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;
+}
+
+%pr::plu = ( # plugins hidden preferences
+ # att_remover
+ arm_winw => [
+ 'win_width',
+ $xl::s{l_win_w},
+ $xl::s{h_win_w},
+ 'int,0,3000', # 0 pixels - 3000 pixels
+ '3.9.0.74',
+ '-1',
+ 'AttRemover',
+ ],
+ arm_winh => [
+ 'win_height',
+ $xl::s{l_win_h},
+ $xl::s{h_win_h},
+ 'int,0,3000', # 0 pixels - 3000 pixels
+ '3.9.0.74',
+ '-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',
+ $xl::s{l_plu_lav_burl},
+ $xl::s{h_plu_lav_burl},
+ 'char,0,1024,32',
+ '3.9.3.32',
+ 'http://cdn.libravatar.org/avatar',
+ 'Libravatar',
+ ],
+ # perl
+ prl_flvb => [
+ 'filter_log_verbosity',
+ $xl::s{l_plu_prl_flvb},
+ $xl::s{h_plu_prl_flvb},
+ '0=l_plu_prl_none;1=l_plu_prl_manual;2=l_plu_prl_action;3=l_plu_prl_match',
+ '3.9.0.75',
+ '2',
+ 'PerlPlugin',
+ ],
+);
+
+sub new_plugins_page() {
+ 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');
+ $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');
+ $frame{'PerlPlugin'} =
+ new_subpage_frame (
+ new_hbox_pack (
+ new_selection_box_for (\%pr::plu, 'prl_flvb', $PLHPVALUE{'PerlPlugin'})),
+ _('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";
+ my $clawsver = ($CLAWSV eq "") ?
+ _("Claws Mail was not found!") :
+ _("Claws Mail returned version {cmv}.", cmv => $CLAWSV);
+ print $clawsver . "\n";
}
# the command line help
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 _(" -b|--verbose More messages on standard output.\n");
print _(" -c|--clawsrc <file> Uses <file> as full resource name.\n");
+ print _(" -h|--help Prints this help screen.\n");
+ print _(" -r|--read-only Disables writing changes to disk.\n");
+ print _(" -v|--version Prints version infos.\n");
}
sub parse_command_line {
GetOptions('h|help' => sub { print_help (); $cont = FALSE },
'v|version' => sub { print_version (); $cont = FALSE },
'b|verbose' => sub { $VERBOSE = TRUE },
+ 'r|read-only' => sub { $READONLY = TRUE },
'u|use-claws-version=s' => \&opt_use_claws_version,
'a|alternate-config-dir=s' => \&opt_alternate_config_dir,
- 'r|clawsrc=s' => \&opt_clawsrc)
+ 'c|clawsrc=s' => \&opt_clawsrc)
or die _("try -h or --help for syntax.\n");
};
if ($@) {
# update the hidden preferences status from loaded values
sub init_hidden_preferences {
foreach my $hash (\%pr::beh, \%pr::col, \%pr::gui, \%pr::oth, \%pr::win) {
- foreach my $key (keys %$hash) {
+ foreach my $key (keys %$hash) {
$HPVALUE{${$hash}{$key}[NAME]} = $PREFS{${$hash}{$key}[NAME]};
}
}
+ foreach my $akey (keys %ACPREFS) {
+ foreach my $key (keys %pr::acc) {
+ my $pname = $pr::acc{$key}[NAME];
+ $ACHPVALUE{$akey}{$pname} = $ACPREFS{$akey}{$pname};
+ }
+ }
+ foreach my $key (keys %pr::plu) {
+ my $plugin = $pr::plu{$key}[PLUGIN];
+ my $pname = $pr::plu{$key}[NAME];
+ if (defined $PLPREFS{$plugin}) {
+ $PLHPVALUE{$plugin}{$pname} = $PLPREFS{$plugin}{$pname};
+ }
+ }
return TRUE;
}
+# generic load/save resource files
+sub load_resource {
+ my $rc = shift;
+ my %data = ();
+ my %meta = ();
+ my $line = 0;
+ open (RCF, '<:encoding(utf8)', $rc)
+ or die _("Error: opening '{file}' for reading", file => $rc) . ": $!\n";
+ my $section = '_'; # default unnamed section
+ while (<RCF>) {
+ chomp;
+ ++$line;
+ next if (/^\s*$/);
+ if (/^\[([^\]]+)\]$/) { # new section
+ $section = $1;
+ die _("Error: duplicate section '{sect}' in resource file '{file}'\n",
+ sect => $section, file => $rc) if ($data{$section});
+ $data{$section} = {};
+ $meta{$section}{'#'} = $line;
+ }
+ elsif (/^([0-9a-z_]+)=(.*)$/) { # key=value
+ $data{$section}{$1} = $2;
+ $meta{$section}{$1} = $line;
+ }
+ elsif (/^(.*)$/) { # lone value
+ push (@{$data{$section}{'_'}}, $1);
+ }
+ }
+ close (RCF);
+ return (\%data, \%meta);
+}
+
+sub save_resource {
+ my ($rc, $data, $meta) = @_;
+ open (RCF, '>:utf8', $rc)
+ or die _("Error: opening '{file}' for writing", file => $rc) . ": $!\n";
+ my @sections = keys %$data;
+ if (defined $meta) {
+ @sections = sort {
+ $meta->{$a}{'#'} <=> $meta->{$b}{'#'}
+ } @sections
+ }
+ foreach my $section (@sections) {
+ say RCF "[$section]";
+ if (ref ($data->{$section}{'_'}) eq 'ARRAY') {
+ foreach my $val (@{$data->{$section}{'_'}}) {
+ say RCF $val;
+ }
+ } else {
+ my @keys = keys %{$data->{$section}};
+ if (defined $meta) {
+ @keys = sort {
+ $meta->{$section}{$a} <=> $meta->{$section}{$b}
+ } @keys
+ }
+ foreach my $key (@keys) {
+ my $val = $data->{$section}{$key};
+ say RCF "$key=$val";
+ }
+ }
+ say RCF "";
+ }
+ close (RCF);
+}
+
# load current status from disc
sub load_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 ();
- open (RCF, "<$rc");
- while (<RCF>) {
- chomp;
- if (/^([8a-z_]+)=(.*)$/) {
- $PREFS{$1} = decode('UTF-8', $2);
+ ($CONFIGDATA, $CONFIGMETA) = load_resource ($rc);
+ foreach (keys %{$CONFIGDATA->{'Common'}}) {
+ $PREFS{$_} = $CONFIGDATA->{'Common'}{$_};
+ }
+ foreach my $plugin (@PLUGINS) {
+ if (defined $CONFIGDATA->{$plugin}) {
+ push (@AVPLUGINS, $plugin);
+ foreach (keys %{$CONFIGDATA->{$plugin}}) {
+ $PLPREFS{$plugin}{$_} = $CONFIGDATA->{$plugin}{$_};
+ }
+ }
+ }
+ 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 ();
+ ($ACCOUNTDATA, $ACCOUNTMETA) = load_resource ($rc);
+ foreach my $asect (keys %$ACCOUNTDATA) {
+ if ($asect =~ /^Account: (\d+)$/) {
+ foreach (keys %{$ACCOUNTDATA->{$asect}}) {
+ $ACPREFS{$1}{$_} = $ACCOUNTDATA->{$asect}{$_};
+ }
}
}
- close (RCF);
return TRUE;
}
return FALSE unless check_claws_not_running ();
my $rcbak = "$rc.backup";
rename ($rc, $rcbak);
- open (RCF, ">$rc");
- open (RCB, "<$rcbak");
- while (<RCB>) {
- chomp;
- if (/^([8a-z_]+)=(.*)$/) {
- if (defined($HPVALUE{$1})) {
- print RCF $1 . "=" . $HPVALUE{$1} . "\n";
- }
- else {
- print RCF $_ . "\n";
+ foreach (keys %PREFS) {
+ if (defined $HPVALUE{$_}) {
+ $CONFIGDATA->{'Common'}{$_} = $HPVALUE{$_};
+ }
+ }
+ foreach my $plugin (@AVPLUGINS) {
+ foreach (keys %{$CONFIGDATA->{$plugin}}) {
+ if (defined $PLHPVALUE{$plugin}{$_}) {
+ $CONFIGDATA->{$plugin}{$_} = $PLHPVALUE{$plugin}{$_};
}
}
- else {
- print RCF $_ . "\n";
+ }
+ save_resource ($rc, $CONFIGDATA, $CONFIGMETA);
+ 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);
+ foreach my $asect (keys %$ACCOUNTDATA) {
+ if ($asect =~ /^Account: (\d+)$/) {
+ foreach (keys %{$ACCOUNTDATA->{$asect}}) {
+ if (defined $ACHPVALUE{$1}{$_}) {
+ $ACCOUNTDATA->{$asect}{$_} = $ACHPVALUE{$1}{$_};
+ }
+ }
}
}
- close (RCB);
- close (RCF);
+ save_resource ($rc, $ACCOUNTDATA, $ACCOUNTMETA);
return TRUE;
}
# create notebook
sub new_notebook {
my $nb = Gtk2::Notebook->new;
- #
+ #
$nb->append_page (new_behaviour_page (), $xl::s{tab_behaviour});
$nb->append_page (new_colours_page (), $xl::s{tab_colours});
$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});
+ $nb->append_page (new_plugins_page (), $xl::s{tab_plugins});
+ $nb->append_page (new_info_page (), $xl::s{tab_info});
return $nb;
}
my $title = $xl::s{about_title};
my $lic = $xl::s{about_license};
my $vers = $xl::s{about_version} . " $VERSION";
- my $license =
+ my $license =
"This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
my $holder = "Ricardo Mones <ricardo\@mones.org>";
my $url = "http://www.claws-mail.org/clawsker.php";
- my $dialog = Gtk2::MessageDialog->new_with_markup ($parent,
- [qw/modal destroy-with-parent/],
- 'info', 'close',
+ my $dialog = Gtk2::MessageDialog->new_with_markup ($parent,
+ [qw/modal destroy-with-parent/],
+ 'info', 'close',
"<span size=\"x-large\" weight=\"bold\">$title</span>\n"
. "<span size=\"large\">$vers</span>\n\n"
. "<span color=\"blue\" size=\"large\">$url</span>\n\n"
. "<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;
}
# disable button until is really implemented
# my $b_undo = Gtk2::Button->new_from_stock ('gtk-undo');
my $hbox = Gtk2::HBox->new (FALSE, 5);
- # signal handlers
+ # signal handlers
$b_exit->signal_connect (clicked => sub { Gtk2->main_quit });
- $b_apply->signal_connect (clicked => sub { save_preferences ($parent) });
+ $b_apply->set_sensitive (not $READONLY);
+ $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
}
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 ();
# create main GUI
my $box = Gtk2::VBox->new (FALSE, 5);