Better handling of text entries
[clawsker.git] / clawsker
index df2713424729af5a846d8351fe1b711325100c13..3957fef7303366dc9a0b81ab3c6ad367cfd98380 100755 (executable)
--- a/clawsker
+++ b/clawsker
@@ -68,6 +68,7 @@ sub _ {
     tab_gui => _('GUI'),
     tab_other => _('Other'),
     tab_winpos => _('Windows'),
+    tab_accounts => _('Accounts'),
 
     ab_frame => _('Addressbook'),
     mem_frame => _('Memory'),
@@ -205,6 +206,11 @@ sub _ {
     l_win_main_fs => _('Full-screen'),
     h_win_main_fs => _('Changes full screen status.'),
 
+    l_acc_gtls_set => _('Use custom GnuTLS priority'),
+    h_acc_gtls_set => _('Enables using user provided GnuTLS priority string.'),
+    l_acc_gtls_pri => _('GnuTLS priority'),
+    h_acc_gtls_pri => _('Value to use as GnuTLS priority string if custom priority check is enabled. Otherwise this value is ignored.'),
+
     e_error => _('Error: '),
     e_noclawsrc => _('resource file for Claws Mail was not found.'),
     e_running => _('seems Claws Mail is currently running, close it first.'),
@@ -212,12 +218,15 @@ sub _ {
 
 # all preferences read by load_preferences
 my %PREFS = ();
+my %ACPREFS = ();
 # values of all preferences handled by clawsker
 my %HPVALUE = ();
+my %ACHPVALUE = ();
 # default config dir and file name
 my $ALTCONFIGDIR = FALSE;
 my $CONFIGDIR = $ENV{HOME} . '/.claws-mail/';
 my $CONFIGRC = 'clawsrc';
+my $ACCOUNTRC = 'accountrc';
 
 # index constants for preference arrays
 use constant NAME  => 0; # the name on the rc file
@@ -253,16 +262,10 @@ sub version_greater_or_equal {
 }
 
 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 (/ /);
@@ -306,8 +309,8 @@ sub handle_string_value {
 }
 
 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 = $_;
 }
@@ -349,6 +352,10 @@ sub get_rc_filename {
     return $CONFIGDIR . $CONFIGRC;
 }
 
+sub get_ac_rc_filename {
+    return $CONFIGDIR . $ACCOUNTRC;
+}
+
 sub set_rc_filename {
     my ($fullname) = @_;
     my @parts = split ('/', $fullname);
@@ -483,18 +490,20 @@ 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]);
+    my $width = $type[3];
+    $width //= $type[2];
+    $gentry->set_width_chars(int ($width) + 2) if defined ($width);
     my $value = $$vhash{$name};
     $value //= $$hash{$key}[CMDEF];
     $gentry->set_text ($value);
     $gentry->signal_connect('key-release-event' => sub {
             my ($w, $e) = @_;
-            handle_nchar_value ($w, $e, \$$vhash{$name}, $type[1]);
+            handle_nchar_value ($w, $e, \$$vhash{$name}, $type[1], $type[2]);
         });
     set_widget_hint ($gentry, $$hash{$key}[DESC]);
     set_widget_sens ($gentry, $$hash{$key}[CMVER]);
@@ -1893,6 +1902,48 @@ sub new_winpos_page() {
     return $winbook;
 }
 
+%pr::acc = ( # per account hidden preferences
+    tls_set => [
+        'gnutls_set_priority',
+        $xl::s{l_acc_gtls_set},
+        $xl::s{h_acc_gtls_set},
+        'bool',
+        '3.9.0.181',
+        '0',
+        undef,
+    ],
+    tls_pri => [
+        'gnutls_priority',
+        $xl::s{l_acc_gtls_pri},
+        $xl::s{h_acc_gtls_pri},
+        'char,0,256,32',
+        '3.9.0.181',
+        '0',
+        undef,
+    ],
+);
+
+sub new_account_subpage($) {
+    my ($akey) = @_;
+    return new_vbox_pack (
+                new_subpage_frame (
+                    new_vbox_pack (
+                        new_check_button_for (\%pr::acc, 'tls_set', $ACHPVALUE{$akey}),
+                        new_text_box_for_nchar (\%pr::acc, 'tls_pri', $ACHPVALUE{$akey})),
+                    _('GnuTLS priority'), 'not-packed')
+           );
+}
+
+sub new_accounts_page() {
+    my $accbook = Gtk2::Notebook->new;
+    $accbook->set_tab_pos ('right');
+    foreach (keys %ACPREFS) {
+        my $name = $ACPREFS{$_}{'account_name'};
+        $accbook->append_page (new_account_subpage ($_), $name);
+    }
+    return $accbook;
+}
+
 # version info
 sub print_version() {
     print $xl::s{about_title} . "\n";
@@ -1990,6 +2041,16 @@ sub init_hidden_preferences {
     return TRUE;
 }
 
+sub init_ac_hidden_preferences {
+    foreach my $akey (keys %ACPREFS) {
+        foreach my $key (keys %pr::acc) {
+            my $pname = $pr::acc{$key}[NAME];
+            $ACHPVALUE{$akey}{$pname} = $ACPREFS{$akey}{$pname};
+        }
+    }
+    return TRUE;
+}
+
 # load current status from disc
 sub load_preferences {
     my $rc = get_rc_filename ();
@@ -2007,6 +2068,27 @@ sub load_preferences {
     return TRUE;
 }
 
+sub load_ac_preferences {
+    my $rc = get_ac_rc_filename ();
+    log_message ("Loading account preferences from $rc\n");
+    return FALSE unless check_rc_file ($rc);
+    return FALSE unless check_claws_not_running ();
+    open (RCF, "<$rc");
+    my $akey;
+    while (<RCF>) {
+        chomp;
+        if (/^\[Account: (\d+)\]$/) {
+          $akey = $1;
+          next;
+        }
+        if (/^([8a-z_]+)=(.*)$/) {
+            $ACPREFS{$akey}{$1} = decode('UTF-8', $2);
+        }
+    }
+    close (RCF);
+    return TRUE;
+}
+
 # save current preferences to disc
 sub save_preferences {
     my $rc = get_rc_filename ();
@@ -2036,6 +2118,40 @@ sub save_preferences {
     return TRUE;
 }
 
+sub save_ac_preferences {
+    my $rc = get_ac_rc_filename ();
+    log_message ("Saving account preferences to $rc\n");
+    return FALSE unless check_rc_file ($rc);
+    return FALSE unless check_claws_not_running ();
+    my $rcbak = "$rc.backup";
+    rename ($rc, $rcbak);
+    open (RCF, ">$rc");
+    open (RCB, "<$rcbak");
+    my $akey;
+    while (<RCB>) {
+        chomp;
+        if (/^\[Account: (\d+)\]$/) {
+          $akey = $1;
+          print RCF $_ . "\n";
+          next;
+        }
+        if (/^([8a-z_]+)=(.*)$/) {
+            if (defined($ACHPVALUE{$akey}{$1})) {
+                print RCF $1 . "=" . $ACHPVALUE{$akey}{$1} . "\n";
+            }
+            else {
+                print RCF $_ . "\n";
+            }
+        }
+        else {
+            print RCF $_ . "\n";
+        }
+    }
+    close (RCB);
+    close (RCF);
+    return TRUE;
+}
+
 # create notebook
 sub new_notebook {
     my $nb = Gtk2::Notebook->new;
@@ -2045,6 +2161,7 @@ sub new_notebook {
     $nb->append_page (new_gui_page (), $xl::s{tab_gui});
     $nb->append_page (new_other_page (), $xl::s{tab_other});
     $nb->append_page (new_winpos_page (), $xl::s{tab_winpos});
+    $nb->append_page (new_accounts_page (), $xl::s{tab_accounts});
 
     return $nb;
 }
@@ -2097,7 +2214,10 @@ 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_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
@@ -2128,7 +2248,9 @@ exit unless parse_command_line ();
 Gtk2->init;
 $main_window = Gtk2::Window->new ('toplevel');
 exit unless load_preferences ();
+exit unless load_ac_preferences ();
 exit unless init_hidden_preferences ();
+exit unless init_ac_hidden_preferences ();
 # create main GUI
 my $box = Gtk2::VBox->new (FALSE, 5);
 $box->set_border_width(3);