# $Id: KeyEdit.pm,v 1.6 2002/05/16 12:00:50 muhri Exp $
# -*- perl -*-
package Pronto::KeyEdit;
use strict;
use vars qw ( %gdk_key %realkey );
sub get_hash
{
my @gdk_keys = &get_array("gdk_keys");
my $i = 0;
foreach(&get_array("keys")) {
$gdk_key{$_} = $gdk_keys[$i];
$realkey{$gdk_keys[$i]} = $_;
$i++;
}
my ($alt,$ctl,$none) = &get_array("mods");
$gdk_key{'Empty-Folder'} = 0x064;
$gdk_key{'Empty-Folder'.'mod'} = $ctl;
$gdk_key{'Mini-Browser'} = 0x062;
$gdk_key{'Mini-Browser'.'mod'} = $alt;
$gdk_key{'Save'} = 0x073;
$gdk_key{'Save'.'mod'} = $alt;
$gdk_key{'Exit'} = 0x078;
$gdk_key{'Exit'.'mod'} = $alt;
$gdk_key{'Send-and-Receive'} = 0x06d;
$gdk_key{'Send-and-Receive'.'mod'} = $alt;
$gdk_key{'AdressBook'} = 0x061;
$gdk_key{'AdressBook'.'mod'} = $alt;
$gdk_key{'New-Message'} = 0x06e;
$gdk_key{'New-Message'.'mod'} = $alt;
$gdk_key{'Options'} = 0x06f;
$gdk_key{'Options'.'mod'} = $ctl;
$gdk_key{'Reply'} = 0x072;
$gdk_key{'Reply'.'mod'} = $alt;
$gdk_key{'Reply-To-List'} = 0x06c;
$gdk_key{'Reply-To-List'.'mod'} = $alt;
$gdk_key{'Forward'} = 0x066;
$gdk_key{'Forward'.'mod'} = $alt;
$gdk_key{'View-Win'} = 0x076;
$gdk_key{'View-Win'.'mod'} = $ctl;
$gdk_key{'View-Header'} = 0x068;
$gdk_key{'View-Header'.'mod'} = $ctl;
$gdk_key{'View-Source'} = 0x073;
$gdk_key{'View-Source'.'mod'} = $ctl;
$gdk_key{'Delete'} = 0x064;
$gdk_key{'Delete'.'mod'} = $alt;
$gdk_key{'Select-All'} = 0x061;
$gdk_key{'Select-All'.'mod'} = $ctl;
$gdk_key{'Thread-Subject'} = 0x073;
$gdk_key{'Thread-Subject'.'mod'} = $none;
$gdk_key{'KeyEdit'} = 0x06b;
$gdk_key{'KeyEdit'.'mod'} = $alt;
$gdk_key{'NextUnread'} = 0x020;
$gdk_key{'NextUnread'.'mod'} = $alt;
$gdk_key{'Reply-All-Including-Self'} = 0x069;
$gdk_key{'Reply-All-Including-Self'.'mod'} = $alt;
$gdk_key{'Reply-All-Execluding-Self'} = 0x077;
$gdk_key{'Reply-All-Execluding-Self'.'mod'} = $alt;
$gdk_key{'Edit'} = 0x065;
$gdk_key{'Edit'.'mod'} = $alt;
$gdk_key{'Toggle-Threads'} = 0x074;
$gdk_key{'Toggle-Threads'.'mod'} = $alt;
$gdk_key{'HTML-View'} = 0x06d;
$gdk_key{'HTML-View'.'mod'} = $ctl;
$gdk_key{'Verify'} = 0x076;
$gdk_key{'Verify' . 'mod'} = $alt;
$gdk_key{'Decrypt'} = 0x06b;
$gdk_key{'Decrypt' . 'mod'} = $ctl;
read_keys();
return %gdk_key;
}
sub init_key_editor
{
my ($dialog,@titles);
$dialog = new Gtk::Dialog;
$dialog->set_title(_("Pronto's Key bindings Editor"));
$dialog->set_default_size(300,300);
$dialog->signal_connect("destroy", sub { $dialog->destroy; });
@titles = (_("Action"),_("Modifier"),_("Key"));
$dialog->{'clist'} = new_with_titles Gtk::CList(@titles);
$dialog->{'clist'}->set_column_width(0,100);
for (1..2) {
$dialog->{'clist'}->set_column_width($_,60);
$dialog->{'clist'}->set_column_justification($_,"center");
}
$dialog->{'sw'} = new Gtk::ScrolledWindow(undef,undef);
$dialog->{'sw'}->set_policy('automatic','automatic');
$dialog->{'sw'}->add($dialog->{'clist'});
$dialog->vbox->pack_start($dialog->{'sw'},1,1,0);
$dialog->{'ok'} = new Gtk::Button(_("Ok"));
$dialog->{'ok'}->signal_connect("clicked" => \&ok, $dialog);
$dialog->{'edit'} = new Gtk::Button(_("Edit"));
$dialog->{'edit'}->signal_connect("clicked" => \&edit, $dialog->{'clist'});
$dialog->{'cancel'} = new Gtk::Button(_("Cancel"));
$dialog->{'cancel'}->signal_connect("clicked", sub { $dialog->destroy; });
$dialog->action_area->pack_start($dialog->{'ok'},1,1,0);
$dialog->action_area->pack_start($dialog->{'edit'},1,1,0);
$dialog->action_area->pack_start($dialog->{'cancel'},1,1,0);
insert_into_list($dialog->{'clist'});
show_all $dialog;
}
sub insert_into_list
{
my ($clist) = @_;
foreach(&get_array("commands")) {
$clist->append($_,$gdk_key{$_."mod"},$realkey{$gdk_key{$_}});
}
}
sub get_array
{
my ($array) = @_;
if (!$array) { return undef; }
if ($array eq "commands") {
my @commands = ("Mini-Browser","Save","Exit",
"Select-All","Options","Send-and-Receive",
"AdressBook","New-Message","Reply",
"Reply-To-List","Edit","View-Win","View-Header",
"View-Source", "Delete","Thread-Subject"
,"Forward","KeyEdit","NextUnread","Reply-All-Including-Self",
"Reply-All-Execluding-Self","Toggle-Threads",
"HTML-View", "Empty-Folder","Verify","Decrypt");
return @commands;
}
if ($array eq "mods") {
my @mods = ("Alt","Ctrl","None");
return @mods;
}
if ($array eq "keys") {
my @key = (
"a","b","c","d","e",
"f","g","h","i","j",
"k","l","m","n","o",
"p","q","r","s","t",
"u","v","w","x","y",
"z","space"
);
return @key;
}
if ($array eq "gdk_keys") {
my @gdk_keys = (
0x061,0x062,0x063,0x064,
0x065,0x066,0x067,0x068,
0x069,0x06a,0x06b,0x06c,
0x06d,0x06e,0x06f,0x070,
0x071,0x072,0x073,0x074,
0x075,0x076,0x077,0x078,
0x079,0x07a,0x020
);
return @gdk_keys;
}
}
sub ok
{
my ($button, $dialog) = @_;
$dialog->destroy();
}
sub edit
{
my ($button,$clist) = @_;
my (@selection,$dialog,$action,$mod,$key);
@selection = $clist->selection();
if (!@selection) { return 1; }
$dialog = new Gtk::Dialog;
$dialog->set_title(_("Edit Key"));
$action = $clist->get_text($selection[0],0);
$mod = $clist->get_text($selection[0],1);
$key = $clist->get_text($selection[0],2);
$dialog->{'action'} = new Gtk::Entry;
$dialog->{'action'}->set_editable(0);
$dialog->{'mod'} = new Gtk::Combo;
$dialog->{'key'} = new Gtk::Combo;
$dialog->{'mod'}->set_popdown_strings(&get_array("mods"));
$dialog->{'key'}->set_popdown_strings(&get_array("keys"));
$dialog->{'action'}->set_text($action);
$dialog->{'mod'}->entry->set_text($mod);
$dialog->{'key'}->entry->set_text($key);
$dialog->{'ok'} = new Gtk::Button(_("Ok"));
$dialog->{'ok'}->signal_connect("clicked" => \&process_entry, $dialog, $clist, @selection);
$dialog->{'cancel'} = new Gtk::Button("Cancel");
$dialog->{'cancel'}->signal_connect("clicked", sub { $dialog->destroy });
$dialog->vbox->pack_start($dialog->{'action'},0,0,0);
$dialog->vbox->pack_start($dialog->{'mod'},0,0,0);
$dialog->vbox->pack_start($dialog->{'key'},0,0,0);
$dialog->action_area->pack_start($dialog->{'ok'},1,1,0);
$dialog->action_area->pack_start($dialog->{'cancel'},1,1,0);
show_all $dialog;
return 1;
}
sub process_entry
{
my ($button,$dialog,$clist, @selection) = @_;
my ($action,$mod,$key);
$action = $dialog->{'action'}->get_text;
$mod = $dialog->{'mod'}->entry->get_text;
$key = $dialog->{'key'}->entry->get_text;
$gdk_key{$action} = $gdk_key{$key};
$gdk_key{$action.'mod'} = $mod;
$dialog->destroy;
$clist->set_text($selection[0],1,$mod);
$clist->set_text($selection[0],2,$key);
make_key_config();
return 1;
}
sub read_keys
{
if (!-f "$main::prefs{'MailDir'}/pronto.keys") {
make_key_config();
}
open(KEYS, "$main::prefs{'MailDir'}/pronto.keys");
while (<KEYS>) {
chomp;
my @key = split(/,/,$_);
$gdk_key{$key[0].'mod'} = $key[1];
$gdk_key{$key[0]} = $key[2];
}
close(KEYS);
make_key_config();
}
sub make_key_config
{
open(TMP, ">$main::prefs{'MailDir'}/pronto.keys");
foreach (&get_array("commands")) {
print TMP $_ . "," . $gdk_key{$_.'mod'} . "," . $gdk_key{$_} . "\n";
}
close(TMP);
chmod(0600, "$main::prefs{'MailDir'}/pronto.keys");
}
1;
syntax highlighted by Code2HTML, v. 0.9.1