Use param instead of global for colour selectors
[clawsker.git] / clawsker
index e0b4cc69ff78b6591299a8da71ec13675a24e42d..05f86f1ac1c589338c31a436724523c3e4bda796 100755 (executable)
--- a/clawsker
+++ b/clawsker
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 #
 # Clawsker :: A Claws Mail Tweaker
-# Copyright 2007-2015 Ricardo Mones <ricardo@mones.org>
+# Copyright 2007-2016 Ricardo Mones <ricardo@mones.org>
 #
 # 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
@@ -14,6 +14,7 @@
 
 binmode STDOUT, ":encoding(utf8)";
 
+use 5.010_000;
 use strict;
 use utf8;
 use Glib qw(TRUE FALSE);
@@ -27,6 +28,7 @@ use Getopt::Long;
 my $NAME = 'clawsker';
 my $PREFIX = '@PREFIX@';
 my $LIBDIR = '@LIBDIR@';
+my $DATADIR = '@DATADIR@';
 my $VERSION = '@VERSION@';
 my $VERBOSE = FALSE;
 my $CLAWSV = undef;
@@ -82,6 +84,7 @@ sub _ {
     compo_frame => _('Compose window'),
     netm_frame => _('NetworkManager'),
     diff_frame => _('Viewing patches'),
+    mpass_frame => _('Master passphrase'),
 
     l_oth_use_dlg => _('Use detached address book edit dialogue'),
     h_oth_use_dlg => _('If true use a separate dialogue to edit a person\'s details. Otherwise will use a form embedded in the address book\'s main window.'),
@@ -91,6 +94,8 @@ sub _ {
     h_oth_min_time => _('The minimum time in minutes to keep a cache in memory. Caches more recent than this time will not be freed, even if the memory usage is too high.'),
     l_oth_use_netm => _('Use NetworkManager'),
     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.'),
@@ -132,6 +137,8 @@ sub _ {
     h_gui_zero_char => _('Replaces \'0\' with the given character in Folder List.'),
     l_gui_type_any => _('Editable headers'),
     h_gui_type_any => _('Allows to manually type any value in Compose Window header entries or just select from the available choices in the associated dropdown list.'),
+    l_gui_next_del => _('Select next message on delete'),
+    h_gui_next_del => _('When deleting a message, toggles between selecting the next one (newer message) or the previous one (older message).'),
 
     l_beh_hover_t => _('Drag \'n\' drop hover timeout (ms)'),
     h_beh_hover_t => _('Time in milliseconds that will cause a folder tree to expand when the mouse cursor is held over it during drag and drop.'),
@@ -160,7 +167,7 @@ sub _ {
     l_beh_inline_at => _('Show inline attachments'),
     h_beh_inline_at => _('Allows hiding 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.'),
 
@@ -263,7 +270,7 @@ sub get_claws_version {
     my @ver = split (/\./, $fver[3]);
     $res .= "$ver[0].";
     $res .= "$ver[1].";
-    if ($ver[2] =~ /(\d+)cvs(\d+)/) {
+    if ($ver[2] =~ /(\d+)git(\d+)/) {
         $res .= "$1.$2";
     }
     else {
@@ -379,16 +386,12 @@ sub claws_is_running {
 sub check_claws_not_running {
     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 ();
+        $_ = $CONFIGDIR;
+        s/\/$//;
+        my $socket = "$lockdir/" . md5_hex ($_);
+        -S $socket and return claws_is_running ();
     };
     return TRUE;
 }
@@ -427,20 +430,20 @@ sub set_widget_sens {
 
 # 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]);
@@ -449,8 +452,8 @@ sub new_check_button_for {
     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]);
@@ -460,12 +463,14 @@ sub new_text_box_for_int {
     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});
+    $gentry->set_value ($value);
     $$hash{$key}[GUI] = $gentry;
     $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]);
@@ -476,8 +481,8 @@ sub new_text_box_for_int {
     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
@@ -486,11 +491,13 @@ sub new_text_box_for_nchar {
     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});
+    my $value = $$vhash{$name};
+    $value //= $$hash{$key}[CMDEF];
+    $gentry->set_text ($value);
     $$hash{$key}[GUI] = $gentry;
     $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]);
         });
     set_widget_hint ($gentry, $$hash{$key}[DESC]);
     set_widget_sens ($gentry, $$hash{$key}[CMVER]);
@@ -501,12 +508,14 @@ sub new_text_box_for_nchar {
     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);
@@ -515,7 +524,7 @@ sub new_color_button_for {
     $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]);
@@ -544,7 +553,9 @@ sub new_selection_box_for {
             my ($w, $e) = @_;
             handle_selection_value ($w, $e, \$HPVALUE{$name});
         });
-    $combo->set_active ($HPVALUE{$name});
+    my $value = $HPVALUE{$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);
@@ -630,23 +641,36 @@ sub new_subpage_frame {
         '1',
         undef,
     ],
+    mp_rounds => [
+        'master_passphrase_pbkdf2_rounds',
+        $xl::s{l_oth_mp_rounds},
+        $xl::s{h_oth_mp_rounds},
+        'int,50000,1000000',
+        '3.13.2.110',
+        '50000',
+        undef,
+    ],
 );
 
 sub new_other_page() {
     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')),
-                   $xl::s{netm_frame}, 'not-packed')
+                       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', \%HPVALUE)),
+                   $xl::s{mpass_frame}, 'not-packed')
            );
 }
 
@@ -804,49 +828,59 @@ sub new_other_page() {
         '0',
         undef,
     ],
+    next_del => [
+        'next_on_delete',
+        $xl::s{l_gui_next_del},
+        $xl::s{h_gui_next_del},
+        'bool',
+        '3.13.0.5',
+        '0',
+        undef,
+    ],
 );
 
 sub new_gui_page() {
     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, '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')),
                          $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')),
+                             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')),
+                             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_check_button_for (\%pr::gui, 'h_scroll', \%HPVALUE),
                              new_selection_box_for (\%pr::gui, 'v_scroll')),
                          $xl::s{sbar_frame}, 'not-packed'),
                      FALSE, FALSE, FRAME_SPC);
@@ -976,7 +1010,7 @@ sub new_gui_page() {
     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',
@@ -985,7 +1019,7 @@ sub new_gui_page() {
     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',
@@ -997,38 +1031,38 @@ sub new_behaviour_page() {
     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')),
+                             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)),
                          $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;
@@ -1122,21 +1156,21 @@ sub new_colours_page() {
     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')
            );
 }
@@ -1670,14 +1704,14 @@ sub new_winpos_subpage_main() {
     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')
            );
 }
@@ -1686,11 +1720,11 @@ sub new_winpos_subpage_msgs() {
     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')
            );
 }
@@ -1699,13 +1733,13 @@ sub new_winpos_subpage_sendrecv() {
     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')
            );
 }
@@ -1715,16 +1749,16 @@ sub new_winpos_subpage_fold() {
                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')
            );
 }
@@ -1733,28 +1767,28 @@ sub new_winpos_subpage_addrbook() {
     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')
            );
 }
@@ -1763,13 +1797,13 @@ sub new_winpos_subpage_accounts() {
     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')
            );
 }
@@ -1778,23 +1812,23 @@ sub new_winpos_subpage_filtering() {
     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')
            );
 }
@@ -1803,28 +1837,28 @@ sub new_winpos_subpage_prefs() {
     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')
            );
 }
@@ -1833,18 +1867,18 @@ sub new_winpos_subpage_misc() {
     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')
            );
 }
@@ -2039,7 +2073,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.";
-    my $year = "2007-2015";
+    my $year = "2007-2016";
     my $holder = "Ricardo Mones &lt;ricardo\@mones.org&gt;";
     my $url = "http://www.claws-mail.org/clawsker.php";
 
@@ -2080,6 +2114,20 @@ sub new_button_box {
     return $hbox;
 }
 
+sub get_app_icons {
+    my $dir = $DATADIR . '/icons/hicolor';
+    my @names = map {
+      join ('/', ($dir, , $_ . 'x' . $_, 'apps', $NAME . '.png'))
+    } (64, 128);
+    my @icons = ();
+    foreach (@names) {
+        my $icon = undef;
+        $icon = Gtk2::Gdk::Pixbuf->new_from_file($_) if (-f $_);
+        push @icons, $icon if ($icon);
+    }
+    return @icons;
+}
+
 # initialise
 exit unless parse_command_line ();
 Gtk2->init;
@@ -2094,6 +2142,7 @@ $box->pack_start (new_notebook (), FALSE, FALSE, 0);
 $box->pack_end (new_button_box ($main_window, $about), FALSE, FALSE, 0);
 $main_window->signal_connect (delete_event => sub { Gtk2->main_quit });
 $main_window->set_title ($xl::s{win_title});
+$main_window->set_icon_list (get_app_icons ());
 $main_window->add ($box);
 $main_window->show_all;
 Gtk2->main;