Use Getopt::Long for option parsing
[clawsker.git] / clawsker
index f15340f9a8a4263c37307e2b589f793f36ab7c88..720d59cf3a91be90bae1d445fb15f9cb40583121 100755 (executable)
--- a/clawsker
+++ b/clawsker
@@ -1,15 +1,28 @@
 #!/usr/bin/perl -w
 #
 # Clawsker :: A Claws Mail Tweaker
+# Copyright 2007-2014 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
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# See COPYING file for license details.
+# See AUTHORS file for a complete list of contributors.
+#
+
+binmode STDOUT, ":encoding(utf8)";
+
 use strict;
 use utf8;
 use Glib qw(TRUE FALSE);
-use Gtk2 -init;
+use Gtk2;
 use POSIX qw(setlocale);
 use Locale::gettext;
 use Encode;
 use Digest::MD5 qw(md5_hex);
+use Getopt::Long;
 
 my $NAME = 'clawsker';
 my $PREFIX = '@PREFIX@';
@@ -186,10 +199,6 @@ sub _ {
     e_error => _('Error: '),
     e_noclawsrc => _('resource file for Claws Mail was not found.'),
     e_running => _('seems Claws Mail is currently running, close it first.'),
-    e_requireddir => _('option requires a directory name.'),
-    e_requiredfile => _('option requires a file name.'),
-    e_notadir => _('specified name is not a directory or does not exist.'),
-    e_notafile => _('specified name is not a file or does not exist.'),
 );
 
 # all preferences read by load_preferences
@@ -206,7 +215,7 @@ use constant NAME  => 0; # the name on the rc file
 use constant LABEL => 1; # the label on the GUI
 use constant DESC  => 2; # the description for the hint/help
 use constant TYPE  => 3; # data type: bool, int, float, string, color
-use constant CMVER => 4; # lowest Claws Mail version the feature exists
+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
 
@@ -217,7 +226,7 @@ use constant PAGE_SPC => 5;
 
 # version functions
 
-sub version_greater_or_equal() {
+sub version_greater_or_equal {
     my ($version, $refvers) = @_;
     my @version = split (/\./, $version);
     my @refvers = split (/\./, $refvers);
@@ -234,7 +243,7 @@ sub version_greater_or_equal() {
     return FALSE;
 }
 
-sub get_claws_version() {
+sub get_claws_version {
     my @cmbin = (
         'claws-mail',
     );
@@ -319,7 +328,7 @@ sub str_from_gdk_color {
 sub handle_color_value {
     my ($widget, $event, $dataref) = @_;
     my $newcol = $widget->get_color;
-    $$dataref = &str_from_gdk_color ($newcol);
+    $$dataref = str_from_gdk_color ($newcol);
 }
 
 sub handle_selection_value {
@@ -358,32 +367,32 @@ sub error_dialog {
     $errordlg->destroy;
 }
 
-sub claws_is_running() {
+sub claws_is_running {
     my $emsg = "$xl::s{e_error}$xl::s{e_running}";
     log_message ($emsg);
     error_dialog ($emsg);
     return FALSE;
 }
 
-sub check_claws_not_running() {
+sub check_claws_not_running {
     my $socket = (not $ALTCONFIGDIR)? "/tmp/": $CONFIGDIR;
     $socket .= "claws-mail-$<";
-    -S $socket and return &claws_is_running;
+    -S $socket and return claws_is_running ();
     # since 3.9.0cvs36
     my $lockdir = "/tmp/claws-mail-$<";
     -d $lockdir and do { 
        $_ = $CONFIGDIR;
        s/\/$//;
-        $socket = "$lockdir/" . md5_hex($_);
-       -S $socket and return &claws_is_running;
+        $socket = "$lockdir/" . md5_hex ($_);
+       -S $socket and return claws_is_running ();
     };
     return TRUE;
 }
 
-sub check_rc_file() {
+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 = "$xl::s{e_error}$xl::s{e_noclawsrc}\n";
         log_message ($emsg);
         error_dialog ($emsg);
         return FALSE;
@@ -391,7 +400,7 @@ sub check_rc_file() {
     return TRUE;
 }
 
-sub set_widget_hint() {
+sub set_widget_hint {
     if ($SHOWHINTS) {
         my ($wdgt, $hint) = @_;    
         $wdgt->set_tooltip_text ($hint);
@@ -399,16 +408,16 @@ sub set_widget_hint() {
     }
 }
 
-sub set_widget_sens() {
+sub set_widget_sens {
     my ($wdgt, $versions) = @_;
     my @ver = split(/,/, $versions);
     if ($#ver == 1) {
       $wdgt->set_sensitive (
-        &version_greater_or_equal ($CLAWSV, $ver[0])
-        and &version_greater_or_equal ($ver[1], $CLAWSV)
+        version_greater_or_equal ($CLAWSV, $ver[0])
+        and version_greater_or_equal ($ver[1], $CLAWSV)
       );
     } else {
-        $wdgt->set_sensitive (&version_greater_or_equal ($CLAWSV, $ver[0]));
+        $wdgt->set_sensitive (version_greater_or_equal ($CLAWSV, $ver[0]));
     }
 }
 
@@ -427,10 +436,10 @@ sub new_check_button_for {
     }
     $cb->signal_connect (clicked => sub {
             my ($w, $e) = @_;
-            &handle_bool_value($w, $e, \$HPVALUE{$name});
+            handle_bool_value ($w, $e, \$HPVALUE{$name});
         });
-    &set_widget_hint ($cb, $$hash{$key}[DESC]);
-    &set_widget_sens ($cb, $$hash{$key}[CMVER]);
+    set_widget_hint ($cb, $$hash{$key}[DESC]);
+    set_widget_sens ($cb, $$hash{$key}[CMVER]);
     $hbox->pack_start ($cb, FALSE, FALSE, HBOX_SPC);
     #
     return $hbox;
@@ -452,10 +461,10 @@ sub new_text_box_for_int {
     $$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, \$HPVALUE{$name});
         });
-    &set_widget_hint ($gentry, $$hash{$key}[DESC]);
-    &set_widget_sens ($gentry, $$hash{$key}[CMVER]);
+    set_widget_hint ($gentry, $$hash{$key}[DESC]);
+    set_widget_sens ($gentry, $$hash{$key}[CMVER]);
     $glabel->set_sensitive ($gentry->sensitive);
     $hbox->pack_start ($glabel, FALSE, FALSE, HBOX_SPC);
     $hbox->pack_start ($gentry, FALSE, FALSE, HBOX_SPC);
@@ -477,10 +486,10 @@ sub new_text_box_for_nchar {
     $$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, \$HPVALUE{$name}, $type[1]);
         });
-    &set_widget_hint ($gentry, $$hash{$key}[DESC]);
-    &set_widget_sens ($gentry, $$hash{$key}[CMVER]);
+    set_widget_hint ($gentry, $$hash{$key}[DESC]);
+    set_widget_sens ($gentry, $$hash{$key}[CMVER]);
     $glabel->set_sensitive ($gentry->sensitive);
     $hbox->pack_start ($glabel, FALSE, FALSE, HBOX_SPC);
     $hbox->pack_start ($gentry, FALSE, FALSE, HBOX_SPC);
@@ -493,7 +502,7 @@ sub new_color_button_for {
     my $name = $$hash{$key}[NAME];
     my $label = $$hash{$key}[LABEL];
     #
-    my $col = &gdk_color_from_str ($HPVALUE{$name});
+    my $col = gdk_color_from_str ($HPVALUE{$name});
     my $hbox = Gtk2::HBox->new (FALSE, 5);
     my $glabel = Gtk2::Label->new ($label);
     my $button = Gtk2::ColorButton->new_with_color ($col);
@@ -502,10 +511,10 @@ 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, \$HPVALUE{$name});
         });
-    &set_widget_hint ($button, $$hash{$key}[DESC]);
-    &set_widget_sens ($button, $$hash{$key}[CMVER]);
+    set_widget_hint ($button, $$hash{$key}[DESC]);
+    set_widget_sens ($button, $$hash{$key}[CMVER]);
     $glabel->set_sensitive ($button->sensitive);
     $hbox->pack_start ($button, FALSE, FALSE, HBOX_SPC);
     $hbox->pack_start ($glabel, FALSE, FALSE, HBOX_SPC);
@@ -529,11 +538,11 @@ sub new_selection_box_for {
     }
     $combo->signal_connect ('changed' => sub {
             my ($w, $e) = @_;
-            &handle_selection_value($w, $e, \$HPVALUE{$name});
+            handle_selection_value ($w, $e, \$HPVALUE{$name});
         });
     $combo->set_active ($HPVALUE{$name});
-    &set_widget_hint ($combo, $$hash{$key}[DESC]);
-    &set_widget_sens ($combo, $$hash{$key}[CMVER]);
+    set_widget_hint ($combo, $$hash{$key}[DESC]);
+    set_widget_sens ($combo, $$hash{$key}[CMVER]);
     $glabel->set_sensitive ($combo->sensitive);
     $hbox->pack_start ($glabel, FALSE, FALSE, HBOX_SPC);
     $hbox->pack_start ($combo, FALSE, FALSE, HBOX_SPC);
@@ -543,7 +552,7 @@ sub new_selection_box_for {
 
 # more graphic helpers
 
-sub new_hbox_pack() {
+sub new_hbox_pack {
     my $hbox = Gtk2::HBox->new (FALSE, 5);
     $hbox->set_border_width (PAGE_SPC);
     foreach my $item (@_) {
@@ -552,7 +561,7 @@ sub new_hbox_pack() {
     return $hbox;
 }    
 
-sub new_vbox_pack() {
+sub new_vbox_pack {
     my $vbox = Gtk2::VBox->new (FALSE, 5);
     $vbox->set_border_width (PAGE_SPC);
     foreach my $item (@_) {
@@ -561,7 +570,7 @@ sub new_vbox_pack() {
     return $vbox;
 }    
 
-sub new_vbox_pack_compact() {
+sub new_vbox_pack_compact {
     my $vbox = Gtk2::VBox->new (FALSE, 0);
     $vbox->set_border_width (0);
     foreach my $item (@_) {
@@ -570,11 +579,11 @@ sub new_vbox_pack_compact() {
     return $vbox;
 }    
 
-sub new_subpage_frame () {
+sub new_subpage_frame {
     my ($box, $title, $notpacked) = @_;
     my $frame = Gtk2::Frame->new ($title);
     $frame->add ($box);    
-    return &new_vbox_pack ($frame) unless defined ($notpacked);
+    return new_vbox_pack ($frame) unless defined ($notpacked);
     return $frame;
 }
 
@@ -620,19 +629,19 @@ sub new_subpage_frame () {
 );
 
 sub new_other_page() {
-    return &new_vbox_pack (
-               &new_subpage_frame (
-                   &new_vbox_pack (
-                       &new_check_button_for(\%pr::oth, 'use_dlg')),
+    return new_vbox_pack (
+               new_subpage_frame (
+                   new_vbox_pack (
+                       new_check_button_for(\%pr::oth, 'use_dlg')),
                    $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_subpage_frame (
+                   new_vbox_pack (
+                       new_text_box_for_int(\%pr::oth, 'max_use'),
+                       new_text_box_for_int(\%pr::oth, 'min_time')),
                    $xl::s{mem_frame}, 'not-packed'),
-               &new_subpage_frame (
-                   &new_vbox_pack (
-                       &new_check_button_for(\%pr::oth, 'use_netm')),
+               new_subpage_frame (
+                   new_vbox_pack (
+                       new_check_button_for(\%pr::oth, 'use_netm')),
                    $xl::s{netm_frame}, 'not-packed')
            );
 }
@@ -661,7 +670,7 @@ sub new_other_page() {
         $xl::s{l_gui_dot_lines},
         $xl::s{h_gui_dot_lines},
         'bool',
-        '0.0.0',
+        '0.0.0,3.7.10.44',
         '0',
         undef,
     ],
@@ -788,43 +797,43 @@ 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');
+    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');
 
-    $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')),
+    $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')),
                          $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_selection_box_for (\%pr::gui, 'from_show')),
+    $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_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')),
+    $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'), 
                      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')),
+    $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')),
                          $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')),
+    $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')),
                          $xl::s{sbar_frame}, 'not-packed'),
                      FALSE, FALSE, FRAME_SPC);
     $gf->pack_start ($tb_zero_char, FALSE, FALSE, 0);
@@ -974,38 +983,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');
+    my $tb_thread_a = new_text_box_for_int (\%pr::beh, 'thread_a');
 
-    $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')),
+    $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'), 
                      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')),
+    $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')),
                          $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')),
+    $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')),
                          $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')),
+    $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')),
                          $xl::s{swc_frame}, 'not-packed'),
                      FALSE, FALSE, FRAME_SPC);
     return $bf;
@@ -1096,24 +1105,24 @@ sub new_behaviour_page() {
 );
 
 sub new_colours_page() {
-    return &new_vbox_pack (
-               &new_subpage_frame (
-                   &new_vbox_pack (
-                       &new_color_button_for (\%pr::col, 'emphasis')),
+    return new_vbox_pack (
+               new_subpage_frame (
+                   new_vbox_pack (
+                       new_color_button_for (\%pr::col, 'emphasis')),
                    $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_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')),
                    $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_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')),
                    $xl::s{diff_frame}, 'not-packed')
            );
 }
@@ -1644,184 +1653,184 @@ sub new_colours_page() {
 );
 
 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_hbox_pack (
-                       &new_text_box_for_int (\%pr::win, 'main_w'), 
-                       &new_text_box_for_int (\%pr::win, 'main_h')), 
-                   &new_vbox_pack (
-                       &new_check_button_for (\%pr::win, 'main_fs'), 
-                       &new_check_button_for (\%pr::win, 'main_mx'))),
+    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_hbox_pack (
+                       new_text_box_for_int (\%pr::win, 'main_w'),
+                       new_text_box_for_int (\%pr::win, 'main_h')),
+                   new_vbox_pack (
+                       new_check_button_for (\%pr::win, 'main_fs'),
+                       new_check_button_for (\%pr::win, 'main_mx'))),
                _('Main window')
            );
 }
 
 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_hbox_pack (
-                       &new_text_box_for_int (\%pr::win, 'msgs_w'),
-                       &new_text_box_for_int (\%pr::win, 'msgs_h'))),
+    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_hbox_pack (
+                       new_text_box_for_int (\%pr::win, 'msgs_w'),
+                       new_text_box_for_int (\%pr::win, 'msgs_h'))),
                _('Message window')
            );
 }
 
 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')),
+    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')),
                    _('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_subpage_frame (
+                   new_hbox_pack (
+                       new_text_box_for_int (\%pr::win, 'recv_w'),
+                       new_text_box_for_int (\%pr::win, 'recv_h')),
                    _('Receive window'), 'not-packed')
            );
 }
 
 sub new_winpos_subpage_fold() {
-    return &new_vbox_pack (
-               &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_hbox_pack (
-                           &new_text_box_for_int (\%pr::win, 'fold_w'), 
-                           &new_text_box_for_int (\%pr::win, 'fold_h'))),
+    return new_vbox_pack (
+               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_hbox_pack (
+                           new_text_box_for_int (\%pr::win, 'fold_w'),
+                           new_text_box_for_int (\%pr::win, 'fold_h'))),
                    _('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_subpage_frame (
+                   new_hbox_pack (
+                       new_text_box_for_int (\%pr::win, 'fsel_w'),
+                       new_text_box_for_int (\%pr::win, 'fsel_h')),
                    _('Folder selection window'), 'not-packed')
            );
 }
 
 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')),
+    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')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'adep_w'),
+                          new_text_box_for_int (\%pr::win, 'adep_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'adeg_w'),
+                          new_text_box_for_int (\%pr::win, 'adeg_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'adda_w'),
+                          new_text_box_for_int (\%pr::win, 'adda_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'addf_w'),
+                          new_text_box_for_int (\%pr::win, 'addf_h')),
                      _('Folder select window'), 'not-packed')
            );
 }
 
 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')),
+    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')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'acce_w'),
+                          new_text_box_for_int (\%pr::win, 'acce_h')),
                      _('Edit account window'), 'not-packed')
            );
 }
 
 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')),
+    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')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'fila_w'),
+                          new_text_box_for_int (\%pr::win, 'fila_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'fild_w'),
+                          new_text_box_for_int (\%pr::win, 'fild_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'matc_w'),
+                          new_text_box_for_int (\%pr::win, 'matc_h')),
                      _('Matcher window'), 'not-packed')
            );
 }
 
 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')),
+    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')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'temp_w'),
+                          new_text_box_for_int (\%pr::win, 'temp_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'acti_w'),
+                          new_text_box_for_int (\%pr::win, 'acti_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'tags_w'),
+                          new_text_box_for_int (\%pr::win, 'tags_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'plug_w'),
+                          new_text_box_for_int (\%pr::win, 'plug_h')),
                      _('Plugins window'), 'not-packed')
            );
 }
 
 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')),
+    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')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'prin_w'),
+                          new_text_box_for_int (\%pr::win, 'prin_h')),
                      _('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_subpage_frame (
+                     new_hbox_pack (
+                          new_text_box_for_int (\%pr::win, 'sour_w'),
+                          new_text_box_for_int (\%pr::win, 'sour_h')),
                      _('View source window'), 'not-packed')
            );
 }
@@ -1829,15 +1838,15 @@ sub new_winpos_subpage_misc() {
 sub new_winpos_page() {
     my $winbook = Gtk2::Notebook->new;
     $winbook->set_tab_pos ('right');
-    $winbook->append_page (&new_winpos_subpage_main, _('Main'));
-    $winbook->append_page (&new_winpos_subpage_msgs, _('Message'));
-    $winbook->append_page (&new_winpos_subpage_sendrecv, _('Send/Receive'));
-    $winbook->append_page (&new_winpos_subpage_fold, _('Folder'));
-    $winbook->append_page (&new_winpos_subpage_addrbook, _('Addressbook'));
-    $winbook->append_page (&new_winpos_subpage_accounts, _('Accounts'));
-    $winbook->append_page (&new_winpos_subpage_filtering, _('Filtering'));
-    $winbook->append_page (&new_winpos_subpage_prefs, _('Preferences'));
-    $winbook->append_page (&new_winpos_subpage_misc, _('Other'));
+    $winbook->append_page (new_winpos_subpage_main, _('Main'));
+    $winbook->append_page (new_winpos_subpage_msgs, _('Message'));
+    $winbook->append_page (new_winpos_subpage_sendrecv, _('Send/Receive'));
+    $winbook->append_page (new_winpos_subpage_fold, _('Folder'));
+    $winbook->append_page (new_winpos_subpage_addrbook, _('Addressbook'));
+    $winbook->append_page (new_winpos_subpage_accounts, _('Accounts'));
+    $winbook->append_page (new_winpos_subpage_filtering, _('Filtering'));
+    $winbook->append_page (new_winpos_subpage_prefs, _('Preferences'));
+    $winbook->append_page (new_winpos_subpage_misc, _('Other'));
     return $winbook;
 }
 
@@ -1873,82 +1882,56 @@ sub print_help() {
     print $xl::s{about_title} . "\n";
     print $line;
     print _("Syntax:\n");
-    print _("    clawsker [options]\n");
+    print _("  clawsker [options]\n");
     print _("Options:\n");
-    print _("    --help                         Prints this help screen.\n");
-    print _("    --version                      Prints version infos.\n");
-    print _("    --verbose                      More messages on standard output.\n");
-    print _("    --alternate-config-dir <dir>   Uses <dir> as Claws Mail config dir.\n");
-    print _("    --clawsrc <file>               Uses <file> as full resource name.\n");
+    print _("  -h|--help                        Prints this help screen.\n");
+    print _("  -v|--version                     Prints version infos.\n");
+    print _("  -b|--verbose                     More messages on standard output.\n");
+    print _("  -a|--alternate-config-dir <dir>  Uses <dir> as Claws Mail config dir.\n");
+    print _("  -c|--clawsrc <file>              Uses <file> as full resource name.\n");
 }
 
-# handle errors which don't allow to run
-sub command_line_fatal() {
-    my $reason = shift;
-    my $emsg = $xl::s{e_error} . $reason;
-    error_dialog ($emsg);
-    log_message ("$emsg", 'die');
+sub parse_command_line {
+    my $cont = TRUE;
+    $CLAWSV = get_claws_version ();
+    eval {
+        GetOptions('h|help' => sub { print_help (); $cont = FALSE },
+            'v|version' => sub { print_version (); $cont = FALSE },
+            'b|verbose' => sub { $VERBOSE = TRUE },
+            'u|use-claws-version=s' => \&opt_use_claws_version,
+            'a|alternate-config-dir=s' => \&opt_alternate_config_dir,
+            'r|clawsrc=s' => \&opt_clawsrc)
+        or die _("try -h or --help for syntax.\n");
+    };
+    die _("Error in options: {msg}\n", msg => $@) if $@;
+    return $cont;
 }
 
-# parse the command line
-sub parse_command_line() {
-    $CLAWSV = &get_claws_version;
-    my $arg = 0;
-    while (defined($ARGV[$arg])) {
-        for ($ARGV[$arg]) {
-            /--help/ && do { 
-                &print_help; 
-                return FALSE;
-            };
-            /--version/ && do { 
-                &print_version; 
-                return FALSE;
-            };
-            /--verbose/ && do {
-                $VERBOSE = TRUE;
-                last;
-            };
-            /--use-claws-version/ && do {
-                ++$arg;
-                &command_line_fatal ("required version")
-                    unless defined($ARGV[$arg]);
-                &command_line_fatal ("required a dotted numeric value")
-                    unless ($ARGV[$arg] =~ /[\d\.]+/);
-                $CLAWSV = $ARGV[$arg];
-                last;
-            };
-            /--alternate-config-dir/ && do {
-                ++$arg;
-                &command_line_fatal ($xl::s{e_requireddir})
-                    unless defined($ARGV[$arg]);
-                &command_line_fatal ($xl::s{e_notadir})
-                    unless -d $ARGV[$arg];
-                $CONFIGDIR = $ARGV[$arg];
-                $CONFIGDIR .= "/" 
-                    unless ($CONFIGDIR =~ /.*\/$/);
-                $ALTCONFIGDIR = TRUE;
-                last;
-            };
-            /--clawsrc/ && do {
-                ++$arg;
-                &command_line_fatal($xl::s{e_requiredfile}) 
-                    unless defined($ARGV[$arg]);
-                &command_line_fatal($xl::s{e_notafile}) 
-                    unless -f $ARGV[$arg];
-                &set_rc_filename ($ARGV[$arg]);
-                last;
-            };
-            /.*/ && &command_line_fatal (
-                _("unknown option '{opt}'.\n", opt => $ARGV[$arg]));
-        }
-        ++$arg;
-    }
-    # eveything continues...
-    return TRUE;
+sub opt_use_claws_version {
+    my ($name, $value) = @_;
+    die _("Error: {opt} requires a dotted numeric value argument\n", opt => $name)
+        unless ($value =~ /^[\d\.]+$/);
+    $CLAWSV = $value;
+}
+
+sub opt_alternate_config_dir {
+    my ($name, $value) = @_;
+    die _("Error: '{dir}' is not a directory or does not exist\n", dir => $value)
+        unless -d $value;
+    $CONFIGDIR = $value;
+    $CONFIGDIR .= "/" unless ($CONFIGDIR =~ /.*\/$/);
+    $ALTCONFIGDIR = TRUE;
+}
+
+sub opt_clawsrc {
+    my ($name, $value) = @_;
+    die _("Error: '{value}' is not a file or does not exist", value => $value)
+        unless -f $value;
+    set_rc_filename ($value);
 }
 
 # update the hidden preferences status from loaded values
-sub init_hidden_preferences() {
+sub init_hidden_preferences {
     foreach my $hash (\%pr::beh, \%pr::col, \%pr::gui, \%pr::oth, \%pr::win) {
         foreach my $key (keys %$hash) { 
             $HPVALUE{${$hash}{$key}[NAME]} = $PREFS{${$hash}{$key}[NAME]};
@@ -1958,16 +1941,16 @@ sub init_hidden_preferences() {
 }
 
 # 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;
+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} = "$2";
+            $PREFS{$1} = decode('UTF-8', $2);
         }
     }
     close (RCF);
@@ -1975,11 +1958,11 @@ sub load_preferences() {
 }
 
 # save current preferences to disc
-sub save_preferences() {
-    my $rc = &get_rc_filename;
-    &log_message ("Saving preferences to $rc\n");
-    return FALSE unless &check_rc_file ($rc);
-    return FALSE unless &check_claws_not_running;
+sub save_preferences {
+    my $rc = get_rc_filename ();
+    log_message ("Saving 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");
@@ -2004,20 +1987,20 @@ sub save_preferences() {
 }
 
 # create notebook
-sub new_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_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});
 
     return $nb;
 }
 
 # create an about dialog
-sub new_about_dialog() {
+sub new_about_dialog {
     my ($parent) = @_;
     my $title = $xl::s{about_title};
     my $lic = $xl::s{about_license};
@@ -2054,7 +2037,7 @@ along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.";
 }
 
 # create buttons box
-sub new_button_box() {
+sub new_button_box {
     my ($parent, $adlg) = @_;
     my $b_about = Gtk2::Button->new_from_stock ('gtk-about');
     my $b_exit = Gtk2::Button->new_from_stock ('gtk-quit');
@@ -2064,8 +2047,8 @@ sub new_button_box() {
     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_undo->signal_connect (clicked => sub { &undo_current_changes });
+    $b_apply->signal_connect (clicked => sub { save_preferences ($parent) });
+    # $b_undo->signal_connect (clicked => sub { undo_current_changes });
     $b_about->signal_connect (clicked => sub { $adlg->run; $adlg->hide });
     # package them
     $hbox->pack_end ($b_apply, FALSE, FALSE, 0);
@@ -2077,16 +2060,17 @@ sub new_button_box() {
 }
 
 # initialise
+exit unless parse_command_line ();
+Gtk2->init;
 $main_window = Gtk2::Window->new ('toplevel');
-exit unless &parse_command_line;
-exit unless &load_preferences;
-exit unless &init_hidden_preferences;
+exit unless load_preferences ();
+exit unless init_hidden_preferences ();
 # create main GUI
 my $box = Gtk2::VBox->new (FALSE, 5);
 $box->set_border_width(3);
-my $about = &new_about_dialog;
-$box->pack_start (&new_notebook, FALSE, FALSE, 0);
-$box->pack_end (&new_button_box ($main_window, $about), FALSE, FALSE, 0);
+my $about = new_about_dialog ();
+$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->add ($box);