#!/usr/bin/perl -w
#
# Clawsker :: A Claws Mail Tweaker
-# Copyright 2007-2017 Ricardo Mones <ricardo@mones.org>
+# Copyright 2007-2018 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
use utf8;
use version 0.77;
use Glib qw(TRUE FALSE);
-use Gtk2;
+use Gtk3;
use POSIX qw(setlocale);
use Locale::gettext;
use Encode;
bindtextdomain ($NAME, sprintf ('%s/share/locale', $PREFIX));
textdomain ($NAME);
-my $SHOWHINTS = FALSE;
-$SHOWHINTS = TRUE if ($Gtk2::VERSION >= 1.040 and Gtk2->CHECK_VERSION (2, 12, 0));
-
sub _ {
my $str = shift;
my %par = @_;
# default messages
%xl::s = (
win_title => _('Claws Mail Hidden Preferences'),
- about => _('About...'),
about_title => _('Clawsker :: A Claws Mail Tweaker'),
- about_license => _('License:'),
- about_version => _('Version:'),
+ about_web_label => _("Visit Clawsker's web page"),
+
+ error_title => _('Clawsker error'),
exit_title => _('Clawsker warning'),
exit_fact => _('There are unapplied modifications.'),
my ($widget, $event, $dataref) = @_;
$$dataref->[VALUE] = ($widget->get_active ())? '1': '0';
$MODIFIED += $$dataref->[VALUE] != $$dataref->[IVALUE]? 1: -1
- if $$dataref->[IVALUE];
+ if defined $$dataref->[IVALUE];
}
sub handle_int_value {
$widget->set_text ($$dataref->[VALUE]);
}
$MODIFIED += $$dataref->[VALUE] != $$dataref->[IVALUE]? 1: -1
- if $$dataref->[IVALUE];
+ if defined $$dataref->[IVALUE];
}
sub handle_string_value {
my ($widget, $event, $dataref) = @_;
$$dataref->[VALUE] = $widget->get_text ();
$MODIFIED += $$dataref->[VALUE] ne $$dataref->[IVALUE]? 1: -1
- if $$dataref->[IVALUE];
+ if defined $$dataref->[IVALUE];
}
sub handle_nchar_value {
$widget->set_text ($_);
$$dataref->[VALUE] = $_;
$MODIFIED += $$dataref->[VALUE] ne $$dataref->[IVALUE]? 1: -1
- if $$dataref->[IVALUE];
+ if defined $$dataref->[IVALUE];
}
-sub gdk_color_from_str {
+sub gdk_rgba_from_str {
my ($str) = @_;
my ($rr, $gg, $bb) = (0, 0 ,0);
$_ = 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;
- $bb = hex($3) * 256;
+ $rr = hex($1) / 256;
+ $gg = hex($2) / 256;
+ $bb = hex($3) / 256;
}
- my $color = Gtk2::Gdk::Color->new ($rr, $gg, $bb);
+ my $color = Gtk3::Gdk::RGBA->new ($rr, $gg, $bb, 1.0);
return $color;
}
-sub str_from_gdk_color {
+sub str_from_gdk_rgba {
my ($color) = @_;
- my $rr = $color->red / 256;
- my $gg = $color->green / 256;
- my $bb = $color->blue / 256;
+ my $rr = $color->red * 256;
+ my $gg = $color->green * 256;
+ my $bb = $color->blue * 256;
my $str = sprintf ("#%.2x%.2x%.2x", $rr, $gg, $bb);
return $str;
}
sub handle_color_value {
my ($widget, $event, $dataref) = @_;
- my $newcol = $widget->get_color;
- $$dataref->[VALUE] = str_from_gdk_color ($newcol);
+ my $newcol = $widget->get_rgba;
+ $$dataref->[VALUE] = str_from_gdk_rgba ($newcol);
$MODIFIED += $$dataref->[VALUE] ne $$dataref->[IVALUE]? 1: -1
- if $$dataref->[IVALUE];
+ if defined $$dataref->[IVALUE];
}
sub handle_selection_value {
my ($widget, $event, $dataref) = @_;
$$dataref->[VALUE] = $widget->get_active;
$MODIFIED += $$dataref->[VALUE] ne $$dataref->[IVALUE]? 1: -1
- if $$dataref->[IVALUE];
+ if defined $$dataref->[IVALUE];
}
sub get_rc_filename {
}
}
+sub message_dialog {
+ my ($parent, $title, $markup, $type, $buttons) = @_;
+ my $flags = [qw/modal destroy-with-parent/];
+ my $dialog = Gtk3::Dialog->new_with_buttons (
+ $title, $parent, $flags, @$buttons
+ );
+ my $label = Gtk3::Label->new;
+ $label->set_markup ($markup);
+ my $icon = undef;
+ if ($type eq 'error') {
+ $icon = Gtk3::Image->new_from_icon_name('dialog-error', 'GTK_ICON_SIZE_DIALOG');
+ } elsif ($type eq 'warning') {
+ $icon = Gtk3::Image->new_from_icon_name('dialog-warning', 'GTK_ICON_SIZE_DIALOG');
+ } elsif ($type eq 'question') {
+ $icon = Gtk3::Image->new_from_icon_name('dialog-question', 'GTK_ICON_SIZE_DIALOG');
+ }
+ my $hbox = Gtk3::Box->new ('horizontal', 5);
+ $hbox->pack_start ($icon, FALSE, FALSE, 5) if defined $icon;
+ $hbox->pack_start ($label, FALSE, FALSE, 5);
+ my $dialogbox = $dialog->get_content_area;
+ $dialogbox->add ($hbox);
+ $dialogbox->show_all;
+ return $dialog;
+}
+
sub error_dialog {
my ($emsg) = @_;
my $markup = "<span weight=\"bold\" size=\"large\">" . $emsg . "</span>";
- my $errordlg = Gtk2::MessageDialog->new_with_markup ($main_window, 'modal', 'error', 'cancel', $markup);
- $errordlg->set_title (_('Clawsker error'));
+ my $errordlg = message_dialog (
+ $main_window, $xl::s{error_title}, $markup, 'error', [ 'gtk-cancel', 0 ]
+ );
$errordlg->run;
$errordlg->destroy;
}
}
sub set_widget_hint {
- if ($SHOWHINTS) {
- my ($wdgt, $hint) = @_;
- $wdgt->set_tooltip_text ($hint);
- $wdgt->set_has_tooltip (TRUE);
- }
+ my ($wdgt, $hint) = @_;
+ $wdgt->set_tooltip_text ($hint);
+ $wdgt->set_has_tooltip (TRUE);
}
sub set_widget_sens {
# graphic element creation
sub new_hbox_spaced_pack {
- my $hbox = Gtk2::HBox->new (FALSE);
+ my $hbox = Gtk3::HBox->new (FALSE);
foreach (@_) {
$hbox->pack_start ($_, FALSE, FALSE, HBOX_PAD);
}
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
#
- my $cb = Gtk2::CheckButton->new ($label);
+ my $cb = Gtk3::CheckButton->new ($label);
my $value = $$vhash{$name}[VALUE];
$value //= $$hash{$key}[CMDEF];
$cb->set_active ($value eq '1');
#
my $gunits = undef;
if (ref $label eq 'ARRAY') {
- $gunits = Gtk2::Label->new ($label->[1]);
+ $gunits = Gtk3::Label->new ($label->[1]);
$label = $label->[0];
}
- my $glabel = Gtk2::Label->new ($label);
+ my $glabel = Gtk3::Label->new ($label);
my $pagei = int (($type[2] - $type[1]) / 10);
- my $gentry = Gtk2::SpinButton->new_with_range ($type[1], $type[2], $pagei);
+ my $gentry = Gtk3::SpinButton->new_with_range ($type[1], $type[2], $pagei);
my $value = $$vhash{$name}[VALUE];
$value //= $$hash{$key}[CMDEF];
$gentry->set_numeric (TRUE);
});
set_widget_hint ($gentry, $$hash{$key}[DESC]);
set_widget_sens ($gentry, $$hash{$key}[CMVER]);
- $glabel->set_sensitive ($gentry->sensitive);
- $gunits->set_sensitive ($gentry->sensitive) if ($gunits);
+ $glabel->set_sensitive ($gentry->get_sensitive);
+ $gunits->set_sensitive ($gentry->get_sensitive) if ($gunits);
#
return new_hbox_spaced_pack ($glabel, $gentry, $gunits) if ($gunits);
return new_hbox_spaced_pack ($glabel, $gentry);
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
my @type = split (/,/, $$hash{$key}[TYPE]); # char,minlen,maxlen,width
- my $glabel = Gtk2::Label->new ($label);
- my $gentry = Gtk2::Entry->new ();
+ my $glabel = Gtk3::Label->new ($label);
+ my $gentry = Gtk3::Entry->new ();
$gentry->set_max_length($type[2]) if defined ($type[2]);
my $width = $type[3];
$width //= $type[2];
});
set_widget_hint ($gentry, $$hash{$key}[DESC]);
set_widget_sens ($gentry, $$hash{$key}[CMVER]);
- $glabel->set_sensitive ($gentry->sensitive);
+ $glabel->set_sensitive ($gentry->get_sensitive);
#
return new_hbox_spaced_pack ($glabel, $gentry);
}
#
my $value = $$vhash{$name}[VALUE];
$value //= $$hash{$key}[CMDEF];
- my $col = gdk_color_from_str ($value);
- my $glabel = Gtk2::Label->new ($label);
- my $button = Gtk2::ColorButton->new_with_color ($col);
+ my $col = gdk_rgba_from_str ($value);
+ my $glabel = Gtk3::Label->new ($label);
+ my $button = Gtk3::ColorButton->new_with_rgba ($col);
$button->set_title ($label);
$button->set_relief ('none');
$button->signal_connect ('color-set' => sub {
});
set_widget_hint ($button, $$hash{$key}[DESC]);
set_widget_sens ($button, $$hash{$key}[CMVER]);
- $glabel->set_sensitive ($button->sensitive);
+ $glabel->set_sensitive ($button->get_sensitive);
#
return new_hbox_spaced_pack ($button, $glabel);
}
my $name = $$hash{$key}[NAME];
my $label = $$hash{$key}[LABEL];
#
- my $glabel = Gtk2::Label->new ($label);
- my $combo = Gtk2::ComboBox->new_text;
+ my $glabel = Gtk3::Label->new ($label);
+ my $combo = Gtk3::ComboBoxText->new;
my @options = split (';', $$hash{$key}[TYPE]);
foreach my $opt (@options) {
my ($index, $textkey) = split ('=', $opt);
- $combo->insert_text ($index, $xl::s{$textkey});
+ $combo->insert (-1, $index, $xl::s{$textkey});
}
$combo->signal_connect ('changed' => sub {
my ($w, $e) = @_;
$combo->set_active ($value);
set_widget_hint ($combo, $$hash{$key}[DESC]);
set_widget_sens ($combo, $$hash{$key}[CMVER]);
- $glabel->set_sensitive ($combo->sensitive);
+ $glabel->set_sensitive ($combo->get_sensitive);
#
return new_hbox_spaced_pack ($glabel, $combo);
}
# more graphic helpers
sub new_hbox_pack {
- my $hbox = Gtk2::HBox->new (FALSE);
+ my $hbox = Gtk3::HBox->new (FALSE);
$hbox->set_border_width (PAGE_SPC);
foreach (@_) {
$hbox->pack_start ($_, FALSE, FALSE, 0);
}
sub new_hbox_pack_compact {
- my $hbox = Gtk2::HBox->new (FALSE);
+ my $hbox = Gtk3::HBox->new (FALSE);
$hbox->set_border_width (0);
foreach (@_) {
$hbox->pack_start ($_, FALSE, FALSE, 0);
}
sub new_vbox_pack {
- my $vbox = Gtk2::VBox->new (FALSE, 5);
+ my $vbox = Gtk3::VBox->new (FALSE, 5);
$vbox->set_border_width (PAGE_SPC);
foreach (@_) {
$vbox->pack_start ($_, FALSE, FALSE, 0);
}
sub new_vbox_pack_compact {
- my $vbox = Gtk2::VBox->new (FALSE, 0);
+ my $vbox = Gtk3::VBox->new (FALSE, 0);
$vbox->set_border_width (0);
foreach (@_) {
$vbox->pack_start ($_, FALSE, FALSE, 0);
sub new_subpage_frame {
my ($box, $title, $notpacked) = @_;
- my $frame = Gtk2::Frame->new ($title);
+ my $frame = Gtk3::Frame->new ($title);
$frame->add ($box);
return new_vbox_pack ($frame) unless defined ($notpacked);
return $frame;
);
sub new_gui_page() {
- my $gf = Gtk2::VBox->new (FALSE, 5);
+ my $gf = Gtk3::VBox->new (FALSE, 5);
$gf->set_border_width (PAGE_SPC);
my $cb_dot_lines = new_check_button_for (\%pr::gui, 'dot_lines', \%HPVALUE);
);
sub new_behaviour_page() {
- my $bf = Gtk2::VBox->new (FALSE, 5);
+ my $bf = Gtk3::VBox->new (FALSE, 5);
$bf->set_border_width (PAGE_SPC);
my $tb_up_step = new_text_box_for_int (\%pr::beh, 'up_step', \%HPVALUE);
}
sub new_winpos_page() {
- my $winbook = Gtk2::Notebook->new;
+ my $winbook = Gtk3::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_useractions, _('User Actions'));
- $winbook->append_page (new_winpos_subpage_prefs, _('Preferences'));
- $winbook->append_page (new_winpos_subpage_misc, _('Other'));
+ $winbook->append_page (new_winpos_subpage_main,
+ Gtk3::Label->new (_('Main')));
+ $winbook->append_page (new_winpos_subpage_msgs,
+ Gtk3::Label->new (_('Message')));
+ $winbook->append_page (new_winpos_subpage_sendrecv,
+ Gtk3::Label->new (_('Send/Receive')));
+ $winbook->append_page (new_winpos_subpage_fold,
+ Gtk3::Label->new (_('Folder')));
+ $winbook->append_page (new_winpos_subpage_addrbook,
+ Gtk3::Label->new (_('Addressbook')));
+ $winbook->append_page (new_winpos_subpage_accounts,
+ Gtk3::Label->new (_('Accounts')));
+ $winbook->append_page (new_winpos_subpage_filtering,
+ Gtk3::Label->new (_('Filtering')));
+ $winbook->append_page (new_winpos_subpage_useractions,
+ Gtk3::Label->new (_('User Actions')));
+ $winbook->append_page (new_winpos_subpage_prefs,
+ Gtk3::Label->new (_('Preferences')));
+ $winbook->append_page (new_winpos_subpage_misc,
+ Gtk3::Label->new (_('Other')));
return $winbook;
}
}
sub new_accounts_page() {
- my $accbook = Gtk2::Notebook->new;
+ my $accbook = Gtk3::Notebook->new;
$accbook->set_tab_pos ('right');
my @akeys = sort {
$ACPREFS{$a}{'account_name'} cmp $ACPREFS{$b}{'account_name'}
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);
+ $accbook->append_page ($page,
+ Gtk3::Label->new ($isdef? '<b>' . $name . '</b>': $name));
if ($isdef) {
my $label = $accbook->get_tab_label ($page);
$label->set_use_markup (TRUE);
};
sub new_hotkeys_list_label {
- my $renderer = Gtk2::CellRendererText->new ();
+ my $renderer = Gtk3::CellRendererText->new ();
$renderer->set_property('alignment' => 'left');
$renderer->set_property('editable' => FALSE);
- $renderer->set_property('size-points' => 8);
- $renderer->set_property('size-set' => TRUE);
return $renderer;
}
sub new_hotkeys_list_hotkey {
- my $renderer = Gtk2::CellRendererAccel->new ();
+ my $renderer = Gtk3::CellRendererAccel->new ();
$renderer->set_property ('accel-mode' => 'gtk');
$renderer->set_property ('editable' => TRUE);
$renderer->signal_connect ('accel-edited' => sub {
my ($w, $path, $key, $mods, $keycode) = @_;
- my $accel = Gtk2::Accelerator->name ($key, $mods);
+ my $accel = Gtk3::Accelerator->name ($key, $mods);
my ($model, $iter) = $SELHOTKEY->get_selected ();
$model->set($iter, C_HOTKEY, "\"$accel\"");
my $gkey = $model->get_value ($iter, C_GROUP);
sub new_hotkeys_list {
my ($gkey, $group) = @_;
- my $store = Gtk2::ListStore->new(
+ my $store = Gtk3::ListStore->new(
qw/Glib::String Glib::String Glib::String Glib::String Glib::String/);
my $even = FALSE;
foreach my $akey (sort keys %$group) {
C_GROUP, $gkey, C_ACCEL, $akey, C_BCOLOR, $bgcol);
$even = not $even;
}
- my $treeview = Gtk2::TreeView->new_with_model ($store);
+ my $treeview = Gtk3::TreeView->new_with_model ($store);
# labels column
$treeview->insert_column_with_data_func (
0, _("Menu path"), new_hotkeys_list_label (),
sub {
my ($col, $renderer, $model, $iter, $data) = @_;
$renderer->set_property (
- 'text' => $model->get_value ($iter, C_LABEL));
+ 'markup' => '<span size="smaller">'
+ . $model->get_value ($iter, C_LABEL)
+ . '</span>');
$renderer->set_property (
'background' => $model->get_value ($iter, C_BCOLOR));
}
my ($col, $renderer, $model, $iter, $data) = @_;
my $hkey = $model->get_value ($iter, C_HOTKEY);
$hkey =~ s/\"//g;
- my ($acckey, $accmod) = Gtk2::Accelerator->parse ($hkey);
+ my ($acckey, $accmod) = Gtk3::accelerator_parse ($hkey);
$renderer->set_property ('accel-key' => $acckey);
$renderer->set_property ('accel-mods' => $accmod);
$renderer->set_property (
}
sub new_hotkeys_page() {
- my $swin = Gtk2::ScrolledWindow->new ();
- my $vbox = Gtk2::VBox->new (FALSE, 5);
+ my $swin = Gtk3::ScrolledWindow->new ();
+ my $vbox = Gtk3::VBox->new (FALSE, 5);
foreach my $gkey (sort keys %$HOTKEYS) {
my $group = $HOTKEYS->{$gkey};
# group title
- my $glabel = Gtk2::Label->new ('<b>' . $gkey . '</b>');
+ my $glabel = Gtk3::Label->new ('<b>' . $gkey . '</b>');
$glabel->set_use_markup (TRUE);
$glabel->set_alignment (0, 0.5);
$glabel->set_padding (5, 1);
}
sub new_info_page() {
- my $t0 = Gtk2::Table->new (7, 2, FALSE);
+ my $t0 = Gtk3::Table->new (7, 2, FALSE);
my $v = get_toolkit_versions ();
my %labels = (
'glib' => 'Perl-GLib',
my $row = 0;
foreach (sort keys %$v) {
if (defined $v->{$_}) {
- my $label = Gtk2::Label->new ($labels{$_});
- my $value = Gtk2::Label->new ('<b>' . $v->{$_} . '</b>');
+ my $label = Gtk3::Label->new ($labels{$_});
+ my $value = Gtk3::Label->new ('<b>' . $v->{$_} . '</b>');
$label->set_alignment (0, 0.5);
$value->set_alignment (0, 0.5);
$value->set_use_markup (TRUE);
++$row;
}
}
- my $t1 = Gtk2::Table->new (2, 2, FALSE);
+ my $t1 = Gtk3::Table->new (2, 2, FALSE);
my @lbl = map { $_->set_alignment (0, 0.5); $_ } (
- Gtk2::Label->new (_('Binary')),
- Gtk2::Label->new (_('Configuration'))
+ Gtk3::Label->new (_('Binary')),
+ Gtk3::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>')
+ Gtk3::Label->new ('<b>' . $CLAWSV . '</b>'),
+ Gtk3::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);
$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'} = $Gtk3::VERSION;
+ if ($Gtk3::VERSION >= 1.040) {
+ $versions{'gtk2-b'} = join('.', Gtk3->GET_VERSION_INFO);
$versions{'gtk2-r'} = join('.',
- &Gtk2::major_version, &Gtk2::minor_version, &Gtk2::micro_version);
+ &Gtk3::major_version, &Gtk3::minor_version, &Gtk3::micro_version);
}
return \%versions;
}
if ($@) {
my $msg = _("Error in options: {msg}\n", msg => $@);
if (defined $ENV{'DISPLAY'} and $ENV{'DISPLAY'} ne '') {
- eval { Gtk2->init };
+ eval { Gtk3->init };
error_dialog ($msg) unless $@;
}
die $msg;
close (RCF);
}
+sub backup_resource {
+ my $rc = shift;
+ my $rcbak = "$rc.backup";
+ do {
+ my $emsg = _("Unable to create backup file '{name}'\n", name => $rcbak);
+ log_message ($emsg);
+ error_dialog ($emsg);
+ return FALSE;
+ } unless rename ($rc, $rcbak);
+ return TRUE;
+}
+
# specific loaders
sub load_menurc {
my $rc = shift;
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);
+ return FALSE unless backup_resource ($rc);
foreach (keys %PREFS) {
if (defined $HPVALUE{$_}) {
$CONFIGDATA->{'Common'}{$_} = $HPVALUE{$_}[VALUE];
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);
+ return FALSE unless backup_resource ($rc);
foreach my $asect (keys %$ACCOUNTDATA) {
if ($asect =~ /^Account: (\d+)$/) {
foreach (keys %{$ACCOUNTDATA->{$asect}}) {
log_message ("Saving hotkey preferences to $rc\n");
return FALSE unless check_rc_file ($rc);
return FALSE unless check_claws_not_running ();
+ return FALSE unless backup_resource ($rc);
save_menurc ($rc, $HOTKEYS);
return TRUE;
}
# create notebook
sub new_notebook {
- my $nb = Gtk2::Notebook->new;
+ my $nb = Gtk3::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_hotkeys_page (), $xl::s{tab_hotkeys});
- $nb->append_page (new_info_page (), $xl::s{tab_info});
+ $nb->append_page (new_behaviour_page (),
+ Gtk3::Label->new ($xl::s{tab_behaviour}));
+ $nb->append_page (new_colours_page (),
+ Gtk3::Label->new ($xl::s{tab_colours}));
+ $nb->append_page (new_gui_page (),
+ Gtk3::Label->new ($xl::s{tab_gui}));
+ $nb->append_page (new_other_page (),
+ Gtk3::Label->new ($xl::s{tab_other}));
+ $nb->append_page (new_winpos_page (),
+ Gtk3::Label->new ($xl::s{tab_winpos}));
+ $nb->append_page (new_accounts_page (),
+ Gtk3::Label->new ($xl::s{tab_accounts}));
+ $nb->append_page (new_plugins_page (),
+ Gtk3::Label->new ($xl::s{tab_plugins}));
+ $nb->append_page (new_hotkeys_page (),
+ Gtk3::Label->new ($xl::s{tab_hotkeys}));
+ $nb->append_page (new_info_page (),
+ Gtk3::Label->new ($xl::s{tab_info}));
return $nb;
}
# create an about dialog
sub new_about_dialog {
my ($parent) = @_;
- my $title = $xl::s{about_title};
- my $lic = $xl::s{about_license};
- my $vers = $xl::s{about_version} . " $VERSION";
- 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
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-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 <http://www.gnu.org/licenses/>.";
- my $year = "2007-2017";
- 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',
- "<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>Copyright $year by $holder</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);
- }
- #
+ my $year = '2007-2018';
+ my $holder = 'Ricardo Mones <ricardo@mones.org>';
+ my $url = 'http://www.claws-mail.org/clawsker.php';
+ my $icons = &get_app_icons;
+
+ my $dialog = Gtk3::AboutDialog->new;
+ $dialog->set_transient_for ($parent);
+ $dialog->set_program_name ('Clawsker');
+ $dialog->set_version ($VERSION);
+ $dialog->set_copyright ("Copyright © $year $holder");
+ $dialog->set_license_type ('gpl-3-0');
+ $dialog->set_website ($url);
+ $dialog->set_website_label ($xl::s{about_web_label});
+ # committers, by number of commits
+ $dialog->set_authors ([
+ $holder,
+ 'Tristan Chabredier (wwp) <subscript@free.fr>',
+ 'Andreas Rönnquist <gusnan@openmailbox.org>',
+ 'Christian Hesse <mail@eworm.de>',
+ ]);
+ $dialog->set_artists ([
+ 'Jesper Schultz <jesper@schultz-net.dk>',
+ $holder,
+ ]);
+ $dialog->set_documenters ([
+ $holder,
+ 'Paul Mangan <paul@claws-mail.org>',
+ ]);
+ # active translators, in alphabetical order
+ $dialog->set_translator_credits (join ("\n",
+ 'Andreas Rönnquist <andreas@ronnquist.net>',
+ 'Axel Köllhofer <AxelKoellhofer@web.de>',
+ 'David Medina <opensusecatala@gmail.com>',
+ 'Erik P. Olsen <erik@epo.dk>',
+ 'Frederico Goncalves Guimaraes <frederico@teia.bio.br>',
+ 'Marcel Pol <marcel@timelord.nl>',
+ 'Mark Chang <mark.cyj@gmail.com>',
+ 'M. Sulchan Darmawan <bleketux@gmail.com>',
+ 'Numan Demirdöğen <if.gnu.linux@gmail.com>',
+ 'Petter Adsen <petter@synth.no>',
+ $holder,
+ 'Tristan Chabredier (wwp) <subscript@free.fr>',
+ ));
+ $dialog->set_title ($xl::s{about_title});
+ $dialog->set_logo ($icons->[-1]);
+
return $dialog;
}
sub exit_handler {
my ($parent) = @_;
if ($MODIFIED != 0 and not $READONLY) {
- my $fact = $xl::s{exit_fact};
- my $question = $xl::s{exit_question};
- my $dialog = Gtk2::MessageDialog->new_with_markup ($parent,
- [qw/modal destroy-with-parent/],
- 'warning', 'yes-no',
- "<span>$fact</span>\n\n"
- . "<span weight=\"bold\">$question</span>");
- $dialog->set_title ($xl::s{exit_title});
+ my $markup = "<span>" . $xl::s{exit_fact} . "</span>\n\n"
+ . "<span weight=\"bold\">" . $xl::s{exit_question} . "</span>\n";
+ my $dialog = message_dialog (
+ $parent, $xl::s{exit_title}, $markup, 'question',
+ [ 'gtk-no', 1, 'gtk-yes', 0 ]
+ );
my $resp = $dialog->run;
$dialog->hide;
- return TRUE if ($resp eq 'no');
+ return TRUE if ($resp == 1);
}
- Gtk2->main_quit;
+ Gtk3->main_quit;
}
# create buttons 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');
- my $b_apply = Gtk2::Button->new_from_stock ('gtk-apply');
+ my $b_about = Gtk3::Button->new_from_stock ('gtk-about');
+ my $b_exit = Gtk3::Button->new_from_stock ('gtk-quit');
+ my $b_apply = Gtk3::Button->new_from_stock ('gtk-apply');
# disable button until is really implemented
- # my $b_undo = Gtk2::Button->new_from_stock ('gtk-undo');
- my $hbox = Gtk2::HBox->new (FALSE, 5);
+ # my $b_undo = Gtk3::Button->new_from_stock ('gtk-undo');
+ my $hbox = Gtk3::HBox->new (FALSE, 5);
# signal handlers
$b_exit->signal_connect (clicked => sub { exit_handler($parent) });
$b_apply->set_sensitive (not $READONLY);
}
sub get_app_icons {
- return @APPICONS if (@APPICONS);
+ return \@APPICONS if (@APPICONS);
my @names;
if (-d $DATADIR) { # installed
my $dir = $DATADIR . '/icons/hicolor';
}
foreach (@names) {
my $icon = undef;
- $icon = Gtk2::Gdk::Pixbuf->new_from_file($_) if (-f $_);
+ $icon = Gtk3::Gdk::Pixbuf->new_from_file($_) if (-f $_);
push @APPICONS, $icon if ($icon);
}
- return @APPICONS;
+ return \@APPICONS;
+}
+
+sub escape_key_handler {
+ my ($widget, $event) = @_;
+ if ($event->keyval == Gtk3::Gdk::keyval_from_name('Escape')) {
+ exit_handler($widget);
+ }
}
# initialise
exit unless parse_command_line ();
-Gtk2->init;
-$main_window = Gtk2::Window->new ('toplevel');
+Gtk3->init;
+$main_window = Gtk3::Window->new ('toplevel');
exit unless load_preferences ();
exit unless init_hidden_preferences ();
# create main GUI
-my $box = Gtk2::VBox->new (FALSE, 5);
+my $box = Gtk3::VBox->new (FALSE, 5);
$box->set_border_width(3);
-my $about = new_about_dialog ();
+my $about = new_about_dialog ($main_window);
$box->pack_start (new_notebook (), TRUE, TRUE, 0);
$box->pack_end (new_button_box ($main_window, $about), FALSE, FALSE, 0);
$main_window->signal_connect (delete_event => sub { exit_handler($main_window) });
+$main_window->signal_connect (key_press_event => \&escape_key_handler);
$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;
+$MODIFIED = 0;
+Gtk3->main;