#!/usr/bin/perl -w use strict; use Gtk2 '-init'; ################################################## # README # # Enlightenment_Remote Made Easy # # Changelog # *version 0.2 (28.09.2005) # - add signal and wheel binding # - write a general binding code - i'm still not happy with it # - fix a delete bug - no repetition # - fix other bugs # # This code is release under a public domain licence # # You will need GTK2::Perl to run this script. # # # Enlightenment_remote change often and you must keep # this script updated. # # The combo box values may change frequently so please # update them # # The code from Mouse and key bindings is a mess # The code from Options and Winlist is designed to be # modified very easy. So you should modify it # very easy. # # KEY and ACTION field are STRICT, please add your option into # @key_vals or @action_vals arrays. YOU can not add new values # from the program # # When you press NEW button a new row will be create at the bottom # of the list. you must scrool to see it. It will be initialized with # a -> exec Eterm # # When you press DELETE button the row will be unmaped. i was to lasy to # unpack and remap the whole table. # # Options and Winlist tabs are very simple. If you want to modify the code # just use one of the following functions add_bool, add_string, # add_string_free, add_num. # ####################### # values for COMBO BOXE ### this value must be updated at each change of e17 my @context_vals =('ANY','ZONE','BORDER','CONTAINER','POPUP'); my @key_vals = ('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', 'Insert','Tab','Menu','Delete','Meta','Home','End', 'Prior','Next','Pause','Print', 'bracketright','bracketleft','apostrophe','backslash','semicolon', 'coma','period','slash','space', 'F1','F2','F3','F4','F5','F6','F7','F8','F9','F10','F11','F12', 'Left','Up','Down','Right'); my @action_vals = ('desktop_linear_flip_to', 'desktop_linear_flip_by', 'desk_flip_by', 'window_menu','window_close','window_kill','window_raise','window_lower', 'window_sticky_toggle','window_iconic_toggle','window_maximized_toggle','window_shaded_toggle', 'edit_mode_toggle', 'menu_show', 'winlist', 'exec'); my @mouse_button_vals = ('1','2','3'); my @mouse_context_vals = ('ZONE','BORDER','CONTAINER'); my @par_vals = ('','main','favorites','clients'); my @signal_context_vals = ('ZONE','BORDER','CONTAINER'); my @signal_source_vals = ( 'title','icon','close','maximize','minimize', 'resize_tl','resize_t','resize_tr', 'resize_r','resize_l', 'resize_b','resize_bl','resize_br', 'resize_*', ); my @wheel_z_vals = ('1','-1'); my @wheel_direction_vals = ('1','0'); # the end ########################################## ########################################## # GLOBAL CONSTANTS use constant TRUE => 1; use constant FALSE => 0; use constant LOAD => 1; use constant ADD => 0; use constant DEBUG => 0; use constant VERBOSE => 1; use constant PRETEND => 0; # ADD THIS in the order they are # added to notepad use constant TAB_KEYS => 0; use constant TAB_MOUSE => 1; use constant TAB_SIGNAL => 2; use constant TAB_WHEEL => 3; use constant TAB_OPTIONS => 4; use constant TAB_WINLIST => 5; use constant TAB_DESKTOP => 6; ########################################## # GLOBAL VARIABLES #for keys tab my @context; my @key; my @mod_alt; my @mod_ctrl; my @mod_shift; my @any; my @action; my @par; my @delete; #for keys tab initial field values my @init_key; my @init_mod; my @init_action; my @init_par; ################################# #for mouse tab my @mouse_context; my @mouse_button; my @mouse_mod_alt; my @mouse_mod_ctrl; my @mouse_mod_shift; my @mouse_action; my @mouse_par; my @mouse_delete; my @mouse_init_context; my @mouse_init_button; my @mouse_init_mod; my @mouse_init_action; my @mouse_init_par; my @mouse_deleted; ############################ # for signal tab my @signal_context; my @signal_signal; my @signal_source; my @signal_any; my @signal_action; my @signal_params; my @signal_mod_alt; my @signal_mod_ctrl; my @signal_mod_shift; my @signal_del_button; my @signal_deleted; my @signal_hbox; my @signal_init_mod; my @signal_init_context; my @signal_init_signal; my @signal_init_source; my @signal_init_any; my @signal_init_action; my @signal_init_params; my $signal_i; my $signal_vbox; ############################ # for signal tab my @wheel_context; my @wheel_direction; my @wheel_z; my @wheel_any; my @wheel_action; my @wheel_params; my @wheel_mod_alt; my @wheel_mod_ctrl; my @wheel_mod_shift; my @wheel_del_button; my @wheel_deleted; my @wheel_hbox; my @wheel_init_mod; my @wheel_init_context; my @wheel_init_direction; my @wheel_init_z; my @wheel_init_any; my @wheel_init_action; my @wheel_init_params; my $wheel_i; my $wheel_vbox; ################################## #general layout my $hbox; my $vbox_key; my $vbox_mouse; my $notebook; my $init_nr = 0; my $i = 0; my $m_i = 0; my @deleted_keys; #containers for fields my $vboxk_context; my $vboxk_key; my $vboxk_mod_alt; my $vboxk_mod_ctrl; my $vboxk_mod_shift; my $vboxk_any; my $vboxk_action; my $vboxk_par; my $vboxk_delete; my %value_bool; my %value_num; my %value_string; my %value_string_free; my %widget_bool; my %widget_num; my %widget_string; my %widget_string_free; #######################################3 # WINDOW my $window = Gtk2::Window->new; $window->set_title ('enlightenment_remote made easy'); $window->resize (750, 400); # signal 1, attached to the main window, when it is destroyed, clicked close # button, , etc., quit the main loop $window->signal_connect (destroy => sub { Gtk2->main_quit; }); # END OF WINDOW DEF #=================================== #create and pack the containers my $vboxmain = Gtk2::VBox->new(FALSE, 5); my $temp_cont; $notebook=Gtk2::Notebook->new(); $window->add($vboxmain); #add top buttons if (VERBOSE) {print "Adding control buttons\n"} add_buttons($vboxmain); #add notebook $vboxmain->pack_start($notebook,TRUE,TRUE, 0); #add keys if (VERBOSE) {print "Adding keys binding\n"} $temp_cont = Gtk2::HBox->new(TRUE, 5); $notebook->append_page ($temp_cont, "Keys"); add_keys($temp_cont); #add mouse if (VERBOSE) {print "Adding mouse binding\n"} $temp_cont = Gtk2::HBox->new(TRUE, 5); $notebook->append_page ($temp_cont, "Mouse"); add_mouse($temp_cont); #add signal bindings if (VERBOSE) {print "Adding signal binding\n"} $temp_cont = Gtk2::HBox->new(TRUE, 5); $notebook->append_page ($temp_cont, "Signal"); add_signal($temp_cont); #add wheel bindigns if (VERBOSE) {print "Adding wheel binding\n"} $temp_cont = Gtk2::HBox->new(TRUE, 5); $notebook->append_page ($temp_cont, "Wheel"); add_wheel($temp_cont); #add options if (VERBOSE) {print "Adding general options\n"} $temp_cont = Gtk2::HBox->new(TRUE, 5); $notebook->append_page ($temp_cont, "Options"); add_options($temp_cont); #add winlist if (VERBOSE) {print "Adding winlist options\n"} $temp_cont = Gtk2::HBox->new(TRUE, 5); $notebook->append_page ($temp_cont, "Winlist"); add_winlist($temp_cont); #add desktop if (VERBOSE) {print "Adding desktop options\n"} $temp_cont = Gtk2::HBox->new(TRUE, 5); $notebook->append_page ($temp_cont, "Desktops"); add_desktop($temp_cont); #start the fire $window->show_all; Gtk2->main; ################################ # TOP BUTToNS sub add_buttons { my $hboxb = Gtk2::HBox->new(FALSE, 5); $_[0]->pack_start($hboxb, FALSE, TRUE, 0); my $button_new = Gtk2::Button->new ('New'); $button_new->signal_connect (clicked => \&action_new); my $button_ok = Gtk2::Button->new ('OK'); $button_ok->signal_connect (clicked => \&action_ok); my $button_cancel = Gtk2::Button->new ('Cancel'); $button_cancel->signal_connect (clicked => sub { Gtk2->main_quit; }); my $button_apply = Gtk2::Button->new ('Apply'); $button_apply->signal_connect (clicked => \&action_apply); $hboxb->pack_start($button_new, FALSE, TRUE, 0); $hboxb->pack_start($button_apply, FALSE, TRUE, 0); $hboxb->pack_start($button_ok, FALSE, TRUE, 0); $hboxb->pack_start($button_cancel, FALSE, TRUE, 0); } #################################################################### # KEYS tab ##################################################################### sub add_keys { # my $pane_box = Gtk2::VBox->new(FALSE,0); $_[0]->pack_start($pane_box, TRUE, TRUE, 0); my $hboxk = Gtk2::HBox->new(FALSE, 5); $pane_box->pack_start($hboxk, FALSE, FALSE,0); my $table_header; #create table header #CONTEXT IS OUT #$table_header = Gtk2::Label->new('Context'); #$vboxk_context = Gtk2::VBox->new(FALSE, 5); #$vboxk_context->pack_start($table_header,FALSE,FALSE,5); #$hboxk->pack_start($vboxk_context,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Key'); $vboxk_key = Gtk2::VBox->new(FALSE, 5); $vboxk_key->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vboxk_key,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Alt'); $vboxk_mod_alt = Gtk2::VBox->new(FALSE, 5); $vboxk_mod_alt->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vboxk_mod_alt,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Ctrl'); $vboxk_mod_ctrl = Gtk2::VBox->new(FALSE, 5); $vboxk_mod_ctrl->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vboxk_mod_ctrl,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Shift'); $vboxk_mod_shift = Gtk2::VBox->new(FALSE, 5); $vboxk_mod_shift->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vboxk_mod_shift,FALSE,FALSE,0); #ANY IS OUT #$table_header = Gtk2::Label->new('Any'); #$vboxk_any = Gtk2::VBox->new(FALSE, 5); #$vboxk_any->pack_start($table_header,FALSE,FALSE,5); #$hboxk->pack_start($vboxk_any,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Action'); $vboxk_action = Gtk2::VBox->new(FALSE, 5); $vboxk_action->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vboxk_action,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Parameters'); $vboxk_par = Gtk2::VBox->new(FALSE, 5); $vboxk_par->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vboxk_par,FALSE,FALSE,0); $table_header = Gtk2::Label->new(''); $vboxk_delete = Gtk2::VBox->new(FALSE, 5); $vboxk_delete->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vboxk_delete,FALSE,FALSE,0); #end of table header #define scrooled windows my $sw = Gtk2::ScrolledWindow->new(undef,undef); $pane_box->pack_start($sw,TRUE,TRUE, 0); #define layout $vbox_key = Gtk2::VBox->new(FALSE, 5); $sw->add_with_viewport ($vbox_key); $hboxk = Gtk2::HBox->new(FALSE, 5); $vbox_key->pack_start($hboxk, FALSE, FALSE,0); my $key_i; my $key_field; my $mod_alt_i; my $mod_ctrl_i; my $mod_field; my $any_i; my $action_i; my $action_field; my $par_i; my $par_field; my $delete_i; #now parse the output of e_remote -bind-key-list and create the widgets open(KBL, "enlightenment_remote -binding-key-list|"); while (){ if (/REPLY: BINDING CONTEXT=(.*) KEY="(.*)" MODIFIERS=(.*) ANY_MOD=(.*) ACTION="(.*)" PARAMS="(.*)".*/){ if (DEBUG) {print "context=$1 key=$2 mod=$3 any=$4 action=$5 par=$6\n";} $mod_field=$3; $key_field=$2; $action_field=$5; $par_field=$6; #instance variables - created temporarly and then added to the array - are overwrited # in the next iteration if ($i > 0) { $hbox = Gtk2::HBox->new(FALSE, 5); $vbox_key->pack_start($hbox, TRUE, TRUE, 0); } #CONTEXT IS OUT #add_field_context(); add_field_key(LOAD,$key_field); add_field_mod_alt(LOAD,$mod_field); add_field_mod_ctrl(LOAD,$mod_field); add_field_mod_shift(LOAD,$mod_field); add_field_action(LOAD,$action_field); add_field_par(LOAD,$par_field); add_key_field_delete(); #====ANY #$any_i = Gtk2::Label->new('0'); #$vboxk_any->pack_start($any_i, FALSE, FALSE, 4); #increment i $i++; } } $init_nr = $i; } #################################################################3 # FIELDS sub add_field_key { my $key_field = $_[1]; if ($_[0] == LOAD) { push(@init_key,$key_field); }else{ push(@init_key,"a"); } #====KeY my $key_i = Gtk2::Combo->new (); @key = (@key, $key_i); $key[$i]->set_popdown_strings(@key_vals); $key[$i]->set('enable-arrow-keys',TRUE); $key[$i]->set('value-in-list',TRUE); $key[$i]->set('allow-empty' ,FALSE); $key[$i]->entry->set_text ($key_field); if ($i == 0) { $vboxk_key->pack_start($key[$i], FALSE, FALSE, 0); }else{ $hbox->pack_start($key[$i], FALSE, FALSE, 0); } } sub add_field_mod_alt { my $mod_field = $_[1]; if ($_[0] == LOAD) { push(@init_mod,$mod_field); }else{ push(@init_mod,""); } #====MOD ALT my $mod_alt_i = Gtk2::CheckButton->new(); if ( $mod_field =~ /.*ALT.*/) {$mod_alt_i->set_active (TRUE);} @mod_alt = (@mod_alt, $mod_alt_i); if ($i == 0) { $vboxk_mod_alt->pack_start($mod_alt[$i],FALSE,FALSE,0); }else{ $hbox->pack_start($mod_alt[$i], FALSE, FALSE, 0); } } sub add_field_mod_ctrl { my $mod_field = $_[1]; #==== MOD CTRL my $mod_ctrl_i = Gtk2::CheckButton->new(); if ( $mod_field =~ /.*CTRL.*/) {$mod_ctrl_i->set_active (TRUE);} @mod_ctrl = (@mod_ctrl, $mod_ctrl_i); if ($i == 0) { $vboxk_mod_ctrl->pack_start($mod_ctrl[$i],FALSE,FALSE,0); }else{ $hbox->pack_start($mod_ctrl[$i], FALSE, FALSE, 0); } } sub add_field_mod_shift { my $mod_field = $_[1]; #==== MOD CTRL my $mod_shift_i = Gtk2::CheckButton->new(); if ( $mod_field =~ /.*SHIFT.*/) {$mod_shift_i->set_active (TRUE);} @mod_shift = (@mod_shift, $mod_shift_i); if ($i == 0) { $vboxk_mod_shift->pack_start($mod_shift[$i],FALSE,FALSE,0); }else{ $hbox->pack_start($mod_shift[$i], FALSE, FALSE, 0); } } sub add_field_action { my $field_action = $_[1]; if ($_[0] == LOAD) { push(@init_action,$field_action); }else{ push(@init_action,"exec"); } #====ACTION my $action_i = Gtk2::Combo->new (); @action = (@action, $action_i); $action[$i]->set_popdown_strings(@action_vals); $action[$i]->set('enable-arrow-keys',TRUE); $action[$i]->set('value-in-list',TRUE); $action[$i]->set('allow-empty' ,FALSE); $action[$i]->entry->set_text ($field_action); if ($i == 0) { $vboxk_action->pack_start($action[$i], FALSE, FALSE, 0); }else{ $hbox->pack_start($action[$i], FALSE, FALSE, 0); } } sub add_field_par { my $field_par = $_[1]; if ($_[0] == LOAD) { push(@init_par,$field_par); }else{ push(@init_par,"xterm"); } #====PAR my $par_i = Gtk2::Combo->new (); @par = (@par, $par_i); $par[$i]->set_popdown_strings(@par_vals); $par[$i]->set('enable-arrow-keys',TRUE); #$action[$i]->set('value-in-list',TRUE); #$action[$i]->set('allow-empty' ,FALSE); $par[$i]->entry->set_text ($field_par); if ($i == 0) { $vboxk_par->pack_start($par[$i], FALSE, FALSE, 0); }else{ $hbox->pack_start($par[$i], FALSE, FALSE, 0); } } sub add_key_field_delete { #====DETELE button my $delete_i = Gtk2::Button->new ('Delete'); $delete_i->signal_connect (clicked => \&action_delete_key, $i); @delete = (@delete,$delete_i); if ($i == 0) { $vboxk_delete->pack_start($delete_i, FALSE, FALSE, 1); }else{ $hbox->pack_start($delete_i, FALSE, FALSE, 0); } } #APPLY KEYS sub action_apply_keys { my @keys_probably_updated; my @keys_updated; my $iter; #FIRST DELETE ALL KEY FROM @deleted_keys foreach $iter (@deleted_keys){ my $cmd_del = "enlightenment_remote -binding-key-del ANY $init_key[$iter] \"$init_mod[$iter]\" 0 $init_action[$iter] \"$init_par[$iter]\""; print "$cmd_del \n"; system ($cmd_del); } @deleted_keys = (); for (my $j=0; $j<$i; $j++){ if (!member(@deleted_keys,$j)) {push (@keys_probably_updated,$j);} } if (DEBUG) {print "Keys probably updated @keys_probably_updated \n";} foreach $iter (@keys_probably_updated){ my $has_changed = FALSE; $has_changed=FALSE; my $new_mod = ""; my $new_key = $key[$iter]->entry->get_text(); my $new_action = $action[$iter]->entry->get_text(); my $new_par = $par[$iter]->entry->get_text(); #if ($iter < $init_nr) { if ($init_key[$iter] ne $new_key) {$has_changed=TRUE;} if ($init_action[$iter] ne $new_action) {$has_changed=TRUE;} if ($init_par[$iter] ne $new_par) {$has_changed=TRUE;} if ($mod_shift[$iter]->get_active()) {$new_mod=$new_mod."|SHIFT"}; if ($mod_ctrl[$iter]->get_active()) {$new_mod=$new_mod."|CTRL"}; if ($mod_alt[$iter]->get_active()) {$new_mod=$new_mod."|ALT"}; if ($new_mod eq "") {$new_mod="NONE";} if (substr($new_mod,0,1) eq '|') {$new_mod=substr($new_mod,1);} if ($init_mod[$iter] ne $new_mod) {$has_changed=TRUE;} #}else {$has_changed = TRUE;} if ($has_changed == TRUE) { my $cmd_add = "enlightenment_remote -binding-key-add ANY $new_key \"$new_mod\" 0 \"$new_action\" \"$new_par\""; my $cmd_del = "enlightenment_remote -binding-key-del ANY $init_key[$iter] \"$init_mod[$iter]\" 0 \"$init_action[$iter]\" \"$init_par[$iter]\""; system ($cmd_del) if !PRETEND; print "$iter: $cmd_del \n"; system ($cmd_add) if !PRETEND; print "$iter: $cmd_add \n"; #after we have added a key we update the init fields $init_key[$iter]=$new_key; $init_mod[$iter]=$new_mod; $init_action[$iter]=$new_action; $init_par[$iter]=$new_par; } } } sub action_delete_key { my $id = $_[1]; my $widget = $_[0]; push (@deleted_keys,$id); #hide the row TODO $delete[$id]->unmap; #CONTEXT IS OUT #$context[$id]->unmap; $key[$id]->unmap; $mod_alt[$id]->unmap; $mod_ctrl[$id]->unmap; $mod_shift[$id]->unmap; $action[$id]->unmap; $par[$id]->unmap; #print "s-a apasat $_[1] in $_[0] nr $i\n"; $window->show_all; } sub action_new_keys { if ($i > 0) { $hbox = Gtk2::HBox->new(FALSE, 5); $vbox_key->pack_start($hbox, TRUE, TRUE, 0); } add_field_key(ADD,'a'); add_field_mod_alt(ADD,'NONE'); add_field_mod_ctrl(ADD,'NONE'); add_field_mod_shift(ADD,'NONE'); add_field_action(ADD,'exec'); add_field_par(ADD,'xterm'); add_field_delete(); $i++; $window->show_all; } ################################################################# # MOUSE TAB ############################################################# sub add_mouse { #binding-mouse-list /add del # CONTEXT BUTTON MODIFIERS ACTION # my $pane_box = Gtk2::VBox->new(FALSE,0); $_[0]->pack_start($pane_box, TRUE, TRUE, 0); my $hboxk = Gtk2::HBox->new(FALSE, 5); $pane_box->pack_start($hboxk, FALSE, FALSE,0); #create table header my $table_header; my $vbox_temp; $table_header = Gtk2::Label->new('Context'); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Button'); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Alt'); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Ctrl'); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Shift'); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Action'); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); $table_header = Gtk2::Label->new('Parameters'); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); $table_header = Gtk2::Label->new(''); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); #end of table header #define scrooled windows my $sw = Gtk2::ScrolledWindow->new(undef,undef); $pane_box->pack_start($sw,TRUE,TRUE, 0); #define layout $vbox_mouse = Gtk2::VBox->new(FALSE, 5); $sw->add_with_viewport ($vbox_mouse); $hboxk = Gtk2::HBox->new(FALSE, 5); $vbox_mouse->pack_start($hboxk, FALSE, FALSE,0); my $context_field; my $key_i; my $button_field; my $mod_alt_i; my $mod_ctrl_i; my $mod_field; my $any_i; my $action_i; my $action_field; my $par_i; my $par_field; my $delete_i; #now parse the output of e_remote -bind-key-list and create the widgets open(KBL, "enlightenment_remote -binding-mouse-list|"); while (){ if (/REPLY: BINDING CONTEXT=(.*) BUTTON=(.*) MODIFIERS=(.*) ANY_MOD=(.*) ACTION="(.*)" PARAMS="(.*)".*/){ if (DEBUG) {print "context=$1 button=$2 mod=$3 any=$4 action=$5 par=$6\n";} $context_field=$1; $mod_field=$3; $button_field=$2; $action_field=$5; $par_field=$6; #instance variables - created temporarly and then added to the array - are overwrited # in the next iteration $hbox = Gtk2::HBox->new(FALSE, 5); $vbox_mouse->pack_start($hbox, FALSE, FALSE, 0); #ADD fields add_field_mouse_context($context_field); add_field_mouse_button($button_field); add_field_mouse_mod_alt($mod_field); add_field_mouse_mod_ctrl($mod_field); add_field_mouse_mod_shift($mod_field); add_field_mouse_action($action_field); add_field_mouse_par($par_field); add_field_mouse_delete(); #increment i $m_i++; } } $init_nr = $i; } ### #MOUSE - field - context sub add_field_mouse_context { my $field_content = $_[0]; push(@mouse_init_context,$field_content); #====context my $field = Gtk2::Combo->new (); $field->set_popdown_strings(@mouse_context_vals); $field->set('enable-arrow-keys',TRUE); $field->set('value-in-list',TRUE); $field->set('allow-empty' ,FALSE); $field->entry->set_text ($field_content); $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_context, $field); } sub add_field_mouse_button { my $field_content = $_[0]; push(@mouse_init_button,$field_content); #====context my $field = Gtk2::Combo->new (); $field->set_popdown_strings(@mouse_button_vals); $field->set('enable-arrow-keys',TRUE); $field->set('value-in-list',TRUE); $field->set('allow-empty' ,FALSE); $field->entry->set_text ($field_content); $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_button, $field); } sub add_field_mouse_mod_alt { my $field_content = $_[0]; push(@mouse_init_mod,$field_content); #====MOD ALT my $field = Gtk2::CheckButton->new(); if ( $field_content =~ /.*ALT.*/) {$field->set_active (TRUE);} $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_mod_alt, $field); } sub add_field_mouse_mod_ctrl { my $field_content = $_[0]; #====MOD CTRL my $field = Gtk2::CheckButton->new(); if ( $field_content =~ /.*CTRL.*/) {$field->set_active (TRUE);} $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_mod_ctrl, $field); } sub add_field_mouse_mod_shift { my $field_content = $_[0]; #====MOD SHIFT my $field = Gtk2::CheckButton->new(); if ( $field_content =~ /.*SHIFT.*/) {$field->set_active (TRUE);} $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_mod_shift, $field); } sub add_field_mouse_action { my $field_content = $_[0]; push(@mouse_init_action,$field_content); #====context my $field = Gtk2::Combo->new (); $field->set_popdown_strings(@action_vals); $field->set('enable-arrow-keys',TRUE); $field->set('value-in-list',TRUE); $field->set('allow-empty' ,FALSE); $field->entry->set_text ($field_content); $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_action, $field); } sub add_field_mouse_par { my $field_content = $_[0]; push(@mouse_init_par,$field_content); #====context my $field = Gtk2::Combo->new (); $field->set_popdown_strings(@par_vals); $field->set('enable-arrow-keys',TRUE); $field->set('value-in-list',TRUE); $field->set('allow-empty' ,FALSE); $field->entry->set_text ($field_content); $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_par, $field); } sub add_field_mouse_delete { #====DETELE button my $field = Gtk2::Button->new ('Delete'); $field->signal_connect (clicked => \&action_delete_mouse, $m_i); $hbox->pack_start($field, FALSE, FALSE, 0); push (@mouse_delete,$field); } sub action_delete_mouse { my $id = $_[1]; my $widget = $_[0]; push (@mouse_deleted,$id); #hide the row TODO $mouse_delete[$id]->unmap; $mouse_context[$id]->unmap; $mouse_button[$id]->unmap; $mouse_mod_alt[$id]->unmap; $mouse_mod_ctrl[$id]->unmap; $mouse_mod_shift[$id]->unmap; $mouse_action[$id]->unmap; $mouse_par[$id]->unmap; $window->show_all; } sub action_new_button { $hbox = Gtk2::HBox->new(FALSE, 5); $vbox_mouse->pack_start($hbox, FALSE, FALSE, 0); #ADD fields add_field_mouse_context("ZONE"); add_field_mouse_button("1"); add_field_mouse_mod_alt("NONE"); add_field_mouse_mod_ctrl(""); add_field_mouse_mod_shift(""); add_field_mouse_action("menu_show"); add_field_mouse_par("clients"); add_field_mouse_delete(); #increment i $m_i++; $window->show_all; } sub action_apply_mouse { my @fields_probably_updated; my @fields_updated; my $iter; #FIRST DELETE ALL KEY FROM @deleted_keys foreach $iter (@mouse_deleted){ my $cmd_del = "enlightenment_remote -binding-mouse-del $mouse_init_context[$iter] $mouse_init_button[$iter] \"$mouse_init_mod[$iter]\" 0 $mouse_init_action[$iter] \"$mouse_init_par[$iter]\""; print "$cmd_del \n"; system ($cmd_del) if !PRETEND; } @mouse_deleted = (); for (my $j=0; $j<$m_i; $j++){ if (!member(@mouse_deleted,$j)) {push (@fields_probably_updated,$j);} } if (DEBUG) {print "Mouse probably updated @fields_probably_updated \n";} foreach $iter (@fields_probably_updated){ my $has_changed = FALSE; $has_changed=FALSE; my $new_mod = ""; my $new_context = $mouse_context[$iter]->entry->get_text(); my $new_button = $mouse_button[$iter]->entry->get_text(); my $new_action = $mouse_action[$iter]->entry->get_text(); my $new_par = $mouse_par[$iter]->entry->get_text(); #if ($iter < $init_nr) { if ($mouse_init_button[$iter] ne $new_button) {$has_changed=TRUE;} if ($mouse_init_action[$iter] ne $new_action) {$has_changed=TRUE;} if ($mouse_init_par[$iter] ne $new_par) {$has_changed=TRUE;} if ($mouse_init_context[$iter] ne $new_context) {$has_changed=TRUE;} if ($mouse_mod_shift[$iter]->get_active()) {$new_mod=$new_mod."|SHIFT"}; if ($mouse_mod_ctrl[$iter]->get_active()) {$new_mod=$new_mod."|CTRL"}; if ($mouse_mod_alt[$iter]->get_active()) {$new_mod=$new_mod."|ALT"}; if ($new_mod eq "") {$new_mod="NONE";} if (substr($new_mod,0,1) eq '|') {$new_mod=substr($new_mod,1);} if ($mouse_init_mod[$iter] ne $new_mod) {$has_changed=TRUE;} #}else {$has_changed = TRUE;} if ($has_changed == TRUE) { my $cmd_add = "enlightenment_remote -binding-mouse-add $new_context $new_button \"$new_mod\" 0 $new_action \"$new_par\""; my $cmd_del = "enlightenment_remote -binding-mouse-del $mouse_init_context[$iter] $mouse_init_button[$iter] \"$mouse_init_mod[$iter]\" 0 $mouse_init_action[$iter] \"$mouse_init_par[$iter]\""; system ($cmd_del) if !PRETEND; print "$iter: $cmd_del \n"; system ($cmd_add) if !PRETEND; print "$iter: $cmd_add \n"; #after we have added a key we update the init fields $mouse_init_context[$iter]=$new_context; $mouse_init_button[$iter]=$new_button; $mouse_init_mod[$iter]=$new_mod; $mouse_init_action[$iter]=$new_action; $mouse_init_par[$iter]=$new_par; } } } ########################################################################### # SIGNAL TAB ############################################################################ sub add_signal { my $pane_box = Gtk2::VBox->new(FALSE,0); $_[0]->pack_start($pane_box, TRUE, TRUE, 0); my $hbox = Gtk2::HBox->new(FALSE, 5); $pane_box->pack_start($hbox, FALSE, FALSE,0); add_binding_header($hbox, " Context ,". " Signal ,". "Source,Alt Ctrl Shift,Any_Mod,Action,Params"); #define scrooled windows my $sw = Gtk2::ScrolledWindow->new(undef,undef); $pane_box->pack_start($sw,TRUE,TRUE, 0); #define layout $signal_vbox = Gtk2::VBox->new(FALSE, 5); $sw->add_with_viewport ($signal_vbox); $hbox = Gtk2::HBox->new(FALSE, 5); $signal_vbox->pack_start($hbox, FALSE, FALSE,0); signal_add_rows($signal_vbox); } sub signal_add_rows { my $vbox=$_[0]; my $context_field; my $signal_field; my $source_field; my $mod_field; my $any_field; my $action_field; my $par_field; my $hbox; $signal_i=0; #now parse the output of e_remote -bind-key-list and create the widgets open(KBL, "enlightenment_remote -binding-signal-list|"); while (){ if (/REPLY: BINDING CONTEXT=(.*) SIGNAL=(.*) SOURCE=(.*) MODIFIERS=(.*) ANY_MOD=(.*) ACTION="(.*)" PARAMS="(.*)".*/){ if (DEBUG) {print "context=$1 signal=$2 source=$3 mod=$4 any=$5 action=$6 par=$7\n";} $context_field=$1; $mod_field=$4; $signal_field=$2; $source_field=$3; $any_field=$5; $action_field=$6; $par_field=$7; signal_add_row( $vbox, $context_field, $signal_field, $source_field, $mod_field, $any_field, $action_field, $par_field ); } } } sub signal_add_row { my $vbox = $_[0]; my $context_field = $_[1]; my $signal_field = $_[2]; my $source_field =$_[3]; my $mod_field = $_[4]; my $any_field = $_[5]; my $action_field = $_[6]; my $par_field = $_[7]; my $hbox = Gtk2::HBox->new(FALSE, 5); $vbox->pack_start($hbox, FALSE, FALSE, 0); push(@signal_hbox, $hbox); #ADD fields #context add_field_string( $hbox, $context_field, \@signal_context_vals, \@signal_context, \@signal_init_context ); #signal add_field_string_free( $hbox, $signal_field, \@signal_signal, \@signal_init_signal ); #source add_field_string( $hbox, $source_field, \@signal_source_vals, \@signal_source, \@signal_init_source ); #modifiers add_field_mod( $hbox, $mod_field, \@signal_init_mod, \@signal_mod_alt, \@signal_mod_ctrl, \@signal_mod_shift ); add_field_bool( $hbox, $any_field, \@signal_any, \@signal_init_any ); #actions add_field_string( $hbox, $action_field, \@action_vals, \@signal_action, \@signal_init_action, ); add_field_string_free( $hbox, $par_field, \@signal_params, \@signal_init_params ); add_field_delete($hbox,$signal_i,TAB_SIGNAL); #increment i $signal_i++; } sub signal_action_new { signal_add_row( $signal_vbox, "BORDER", "mouse,down,1", "title", "NONE", "1", "window_menu", "" ); $signal_hbox[$signal_i-1]->show_all; } sub signal_action_delete { my $id = $_[1]; my $widget = $_[0]; push (@signal_deleted,$id); $signal_hbox[$id]->unmap; } sub signal_action_apply { my @fields_probably_updated; my @fields_updated; my $iter; #FIRST DELETE ALL KEY FROM @deleted_keys foreach $iter (@signal_deleted){ my $cmd_del = "enlightenment_remote -binding-signal-del \"$signal_init_context[$iter]\" \"$signal_init_signal[$iter]\" \"$signal_init_source[$iter]\" \"$signal_init_mod[$iter]\" 1 \"$signal_init_action[$iter]\" \"$signal_init_params[$iter]\""; print "$cmd_del \n" if VERBOSE; system ($cmd_del) if !PRETEND; } @signal_deleted = (); for (my $j=0; $j<$signal_i; $j++){ if (!member(@signal_deleted,$j)) {push (@fields_probably_updated,$j);} } if (DEBUG) {print "Signal probably updated @fields_probably_updated \n";} foreach $iter (@fields_probably_updated){ my $has_changed = FALSE; $has_changed=FALSE; my $new_context = $signal_context[$iter]->entry->get_text(); if ($signal_init_context[$iter] ne $new_context) {$has_changed=TRUE;} my $new_signal = $signal_signal[$iter]->get_text(); if ($signal_init_signal[$iter] ne $new_signal) {$has_changed=TRUE;} my $new_source = $signal_source[$iter]->entry->get_text(); if ($signal_init_source[$iter] ne $new_source) {$has_changed=TRUE;} my $new_action = $signal_action[$iter]->entry->get_text(); if ($signal_init_action[$iter] ne $new_action) {$has_changed=TRUE;} my $new_params = $signal_params[$iter]->get_text(); if ($signal_init_params[$iter] ne $new_params) {$has_changed=TRUE;} my $new_any = 0; if ($signal_any[$iter]->get_active()) {$new_any=1}; if ($signal_init_any[$iter] != $new_any) {$has_changed=TRUE;} my $new_mod = ""; if ($signal_mod_shift[$iter]->get_active()) {$new_mod=$new_mod."|SHIFT"}; if ($signal_mod_ctrl[$iter]->get_active()) {$new_mod=$new_mod."|CTRL"}; if ($signal_mod_alt[$iter]->get_active()) {$new_mod=$new_mod."|ALT"}; if ($new_mod eq "") {$new_mod="NONE";} if (substr($new_mod,0,1) eq '|') {$new_mod=substr($new_mod,1);} if ($signal_init_mod[$iter] ne $new_mod) {$has_changed=TRUE;} if ($has_changed == TRUE) { my $cmd_add = "enlightenment_remote -binding-signal-add \"$new_context\" \"$new_signal\" \"$new_source\" \"$new_mod\" \"$new_any\" \"$new_action\" \"$new_params\""; my $cmd_del = "enlightenment_remote -binding-signal-del \"$signal_init_context[$iter]\" \"$signal_init_signal[$iter]\" \"$signal_init_source[$iter]\" \"$signal_init_mod[$iter]\" \"$signal_init_any[$iter]\" \"$signal_init_action[$iter]\" \"$signal_init_params[$iter]\""; system ($cmd_del) if !PRETEND; print "$iter: $cmd_del \n"; system ($cmd_add) if !PRETEND; print "$iter: $cmd_add \n"; # we update the init fields $signal_init_context[$iter]=$new_context; $signal_init_signal[$iter]=$new_signal; $signal_init_source[$iter]=$new_source; $signal_init_mod[$iter]=$new_mod; $signal_init_any[$iter]=$new_any; $signal_init_action[$iter]=$new_action; $signal_init_params[$iter]=$new_params; } } } ########################################################################### # WHELL TAB ############################################################################ sub add_wheel { my $pane_box = Gtk2::VBox->new(FALSE,0); $_[0]->pack_start($pane_box, TRUE, TRUE, 0); my $hbox = Gtk2::HBox->new(FALSE, 5); $pane_box->pack_start($hbox, FALSE, FALSE,0); add_binding_header($hbox, "Context,". "Direction,". "Z,". "Alt Ctrl Shift,Any_Mod,Action,Params"); #define scrooled windows my $sw = Gtk2::ScrolledWindow->new(undef,undef); $pane_box->pack_start($sw,TRUE,TRUE, 0); #define layout $wheel_vbox = Gtk2::VBox->new(FALSE, 5); $sw->add_with_viewport ($wheel_vbox); $hbox = Gtk2::HBox->new(FALSE, 5); $wheel_vbox->pack_start($hbox, FALSE, FALSE,0); wheel_add_rows($wheel_vbox); } sub wheel_add_rows { my $vbox=$_[0]; my $context_field; my $direction_field; my $z_field; my $mod_field; my $any_field; my $action_field; my $par_field; my $hbox; $wheel_i=0; #now parse the output of e_remote and create the widgets open(KBL, "enlightenment_remote -binding-wheel-list|"); while (){ if (/REPLY: BINDING CONTEXT=(.*) DIRECTION=(.*) Z=(.*) MODIFIERS=(.*) ANY_MOD=(.*) ACTION="(.*)" PARAMS="(.*)".*/){ if (DEBUG) {print "context=$1 DIRECTION=$2 Z=$3 mod=$4 any=$5 action=$6 par=$7\n";} $context_field=$1; $mod_field=$4; $direction_field=$2; $z_field=$3; $any_field=$5; $action_field=$6; $par_field=$7; wheel_add_row( $vbox, $context_field, $direction_field, $z_field, $mod_field, $any_field, $action_field, $par_field ); } } } sub wheel_add_row { my $vbox = $_[0]; my $context_field = $_[1]; my $direction_field = $_[2]; my $z_field =$_[3]; my $mod_field = $_[4]; my $any_field = $_[5]; my $action_field = $_[6]; my $par_field = $_[7]; my $hbox = Gtk2::HBox->new(FALSE, 5); $vbox->pack_start($hbox, FALSE, FALSE, 0); push(@wheel_hbox, $hbox); #ADD fields #context add_field_string( $hbox, $context_field, \@context_vals, \@wheel_context, \@wheel_init_context ); #direction 0 1 add_field_string( $hbox, $direction_field, \@wheel_direction_vals, \@wheel_direction, \@wheel_init_direction ); #Z 1 -1 add_field_string( $hbox, $z_field, \@wheel_z_vals, \@wheel_z, \@wheel_init_z ); #modifiers add_field_mod( $hbox, $mod_field, \@wheel_init_mod, \@wheel_mod_alt, \@wheel_mod_ctrl, \@wheel_mod_shift ); #ANY_MOD add_field_bool( $hbox, $any_field, \@wheel_any, \@wheel_init_any ); #actions add_field_string( $hbox, $action_field, \@action_vals, \@wheel_action, \@wheel_init_action, ); add_field_string_free( $hbox, $par_field, \@wheel_params, \@wheel_init_params ); add_field_delete($hbox,$wheel_i,TAB_WHEEL); #increment i $wheel_i++; } sub wheel_action_new { wheel_add_row( $wheel_vbox, "CONTAINER", "0", "-1", "NONE", "1", "desk_linear_flip_by", "-1" ); $wheel_hbox[$wheel_i-1]->show_all; } sub wheel_action_delete { my $id = $_[1]; my $widget = $_[0]; push (@wheel_deleted,$id); $wheel_hbox[$id]->unmap; } sub wheel_action_apply { my @fields_probably_updated; my @fields_updated; my $iter; #FIRST DELETE ALL KEY FROM @deleted_keys foreach $iter (@wheel_deleted){ my $cmd_del = "enlightenment_remote -binding-wheel-del \"$wheel_init_context[$iter]\" \"$wheel_init_direction[$iter]\" \"$wheel_init_z[$iter]\" \"$wheel_init_mod[$iter]\" \"$wheel_init_any[$iter]\" \"$wheel_init_action[$iter]\" \"$wheel_init_params[$iter]\""; print "$cmd_del \n" if VERBOSE; system ($cmd_del) if !PRETEND; } @wheel_deleted = (); for (my $j=0; $j<$wheel_i; $j++){ if (!member(@wheel_deleted,$j)) {push (@fields_probably_updated,$j);} } if (DEBUG) {print "Wheel probably updated @fields_probably_updated \n";} foreach $iter (@fields_probably_updated){ my $has_changed = FALSE; $has_changed=FALSE; my $new_context = $wheel_context[$iter]->entry->get_text(); if ($wheel_init_context[$iter] ne $new_context) {$has_changed=TRUE;} my $new_direction = $wheel_direction[$iter]->entry->get_text(); if ($wheel_init_direction[$iter] ne $new_direction) {$has_changed=TRUE;} my $new_z = $wheel_z[$iter]->entry->get_text(); if ($wheel_init_z[$iter] ne $new_z) {$has_changed=TRUE;} my $new_action = $wheel_action[$iter]->entry->get_text(); if ($wheel_init_action[$iter] ne $new_action) {$has_changed=TRUE;} my $new_params = $wheel_params[$iter]->get_text(); if ($wheel_init_params[$iter] ne $new_params) {$has_changed=TRUE;} my $new_any = 0; if ($wheel_any[$iter]->get_active()) {$new_any=1}; if ($wheel_init_any[$iter] != $new_any) {$has_changed=TRUE;} my $new_mod = ""; if ($wheel_mod_shift[$iter]->get_active()) {$new_mod=$new_mod."|SHIFT"}; if ($wheel_mod_ctrl[$iter]->get_active()) {$new_mod=$new_mod."|CTRL"}; if ($wheel_mod_alt[$iter]->get_active()) {$new_mod=$new_mod."|ALT"}; if ($new_mod eq "") {$new_mod="NONE";} if (substr($new_mod,0,1) eq '|') {$new_mod=substr($new_mod,1);} if ($wheel_init_mod[$iter] ne $new_mod) {$has_changed=TRUE;} if ($has_changed == TRUE) { my $cmd_add = "enlightenment_remote -binding-wheel-add \"$new_context\" \"$new_direction\" \"$new_z\" \"$new_mod\" \"$new_any\" \"$new_action\" \"$new_params\""; my $cmd_del = "enlightenment_remote -binding-wheel-del \"$wheel_init_context[$iter]\" \"$wheel_init_direction[$iter]\" \"$wheel_init_z[$iter]\" \"$wheel_init_mod[$iter]\" \"$wheel_init_any[$iter]\" \"$wheel_init_action[$iter]\" \"$wheel_init_params[$iter]\""; system ($cmd_del) if !PRETEND; print "$iter: $cmd_del \n"; system ($cmd_add) if !PRETEND; print "$iter: $cmd_add \n"; # we update the init fields $wheel_init_context[$iter]=$new_context; $wheel_init_direction[$iter]=$new_direction; $wheel_init_z[$iter]=$new_z; $wheel_init_mod[$iter]=$new_mod; $wheel_init_any[$iter]=$new_any; $wheel_init_action[$iter]=$new_action; $wheel_init_params[$iter]=$new_params; } } } ########################################################################### # GENERAL BINDINGS FUNCTIONS ############################################################################ sub add_binding_header { my $hboxk = $_[0]; my @header_rows = split(/,/,$_[1]); my $row; my $table_header; my $vbox_temp; foreach $row (@header_rows){ #print ("$row \n"); #create table header $table_header = Gtk2::Label->new("$row"); $vbox_temp = Gtk2::VBox->new(FALSE, 5); $vbox_temp->pack_start($table_header,FALSE,FALSE,5); $hboxk->pack_start($vbox_temp,FALSE,FALSE,0); } #end of table header } sub add_field_mod { my $hbox = $_[0]; my $field_content = $_[1]; my $init_mod = $_[2]; my $mod_alt = $_[3]; my $mod_ctrl = $_[4]; my $mod_shift = $_[5]; my ($field_alt, $field_ctrl, $field_shift); #====MOD ALT $field_alt = Gtk2::CheckButton->new(); if ( $field_content =~ /.*ALT.*/) {$field_alt->set_active (TRUE);} $hbox->pack_start($field_alt, FALSE, FALSE, 0); #====MOD CTRL $field_ctrl = Gtk2::CheckButton->new(); if ( $field_content =~ /.*CTRL.*/) {$field_ctrl->set_active (TRUE);} $hbox->pack_start($field_ctrl, FALSE, FALSE, 0); #====MOD SHIFT $field_shift = Gtk2::CheckButton->new(); if ( $field_content =~ /.*SHIFT.*/) {$field_shift->set_active (TRUE);} $hbox->pack_start($field_shift, FALSE, FALSE, 0); push(@$init_mod,$field_content); push(@$mod_alt,$field_alt); push(@$mod_ctrl,$field_ctrl); push(@$mod_shift,$field_shift); } sub add_field_bool { my $hbox = $_[0]; my $field_content = $_[1]; my $references = $_[2]; my $init_values=$_[3]; my $field; $field = Gtk2::CheckButton->new(); if ( $field_content == 1) {$field->set_active (TRUE);} $hbox->pack_start($field, FALSE, FALSE, 0); push(@$init_values,$field_content); push(@$references, $field); } sub add_field_string { my $hbox=$_[0]; my $field_content = $_[1]; my $vals=$_[2]; my $init_values=$_[4]; my $references = $_[3]; #====context my $field = Gtk2::Combo->new (); $field->set_popdown_strings(@$vals); $field->set('enable-arrow-keys',TRUE); $field->set('value-in-list',TRUE); $field->set('allow-empty' ,FALSE); $field->entry->set_text ($field_content); $hbox->pack_start($field, FALSE, FALSE, 0); push(@$init_values,$field_content); push (@$references, $field); } sub add_field_string_free { my $hbox=$_[0]; my $field_content = $_[1]; my $init_values=$_[3]; my $references = $_[2]; #====context my $field = Gtk2::Entry->new (); $field->set_text ($field_content); $hbox->pack_start($field, FALSE, FALSE, 0); push(@$init_values,$field_content); push (@$references, $field); } sub add_field_delete { my $hbox = $_[0]; my $i = $_[1]; my $tab = $_[2]; #====DETELE button my $field = Gtk2::Button->new ('Delete'); if ($tab == TAB_SIGNAL){ $field->signal_connect (clicked => \&signal_action_delete, $i); push (@signal_del_button,$field); }elsif ($tab == TAB_WHEEL){ $field->signal_connect (clicked => \&wheel_action_delete, $i); push (@wheel_del_button,$field); } $hbox->pack_start($field, FALSE, FALSE, 0); } ########################################################################### # OPTIONS TAB ############################################################################ sub add_options { my $sw = Gtk2::ScrolledWindow->new(undef,undef); $_[0]->pack_start($sw,TRUE,TRUE, 0); my $vbox_options = Gtk2::VBox->new(FALSE, 0); my $hbox_options; $sw->add_with_viewport($vbox_options); my $pack; #create a new row $hbox_options = Gtk2::HBox->new(FALSE, 5); $vbox_options->pack_start($hbox_options, FALSE, FALSE, 0); # FOCUS $pack = frame_new($hbox_options,"Focus"); add_string($pack,"focus-policy","CLICK,MOUSE,SLOPPY"); add_string($pack,"focus-setting","NONE,NEW_WINDOW,NEW_DIALOG,NEW_DIALOG_IF_OWNER_FOCUSED"); add_bool($pack,"focus-last-focused-per-desktop"); add_bool($pack,"focus-revert-on-hide-or-close"); #resist $pack = frame_new($hbox_options,"Resist"); add_bool($pack,"use-resist"); add_num($pack,"drag-resist"); add_num($pack,"window-resist"); add_num($pack,"gadget-resist"); #create a new row $hbox_options = Gtk2::HBox->new(FALSE, 5); $vbox_options->pack_start($hbox_options, FALSE, FALSE, 0); #MISC $pack = frame_new($hbox_options,"Misc"); add_string($pack,"maximize-policy","FULLSCREEN,SMART,EXPAND,FILL"); add_string($pack,"window-placement-policy","SMART,CURSOR"); add_bool($pack,"pass-click-on"); add_num($pack,"cursor-size"); add_num($pack,"framerate"); #managed window $pack = frame_new($hbox_options,"Managed window"); add_bool($pack,"kill-if-close-not-possible"); add_bool($pack,"kill-process"); add_num($pack,"kill-timer-wait"); add_bool($pack,"ping-clients"); add_num($pack,"ping-clients-wait"); #create a new row $hbox_options = Gtk2::HBox->new(FALSE, 5); $vbox_options->pack_start($hbox_options, FALSE, FALSE, 0); # Border shade $pack = frame_new($hbox_options,"Border shade and raise"); add_bool($pack,"border-shade-animate"); add_string($pack,"border-shade-transition","0,1,2,3"); add_num($pack,"border-shade-speed"); add_bool($pack,"always-click-to-raise"); add_bool($pack,"use-auto-raise"); add_num($pack,"auto-raise-delay"); #transition $pack = frame_new($hbox_options,"Transition"); add_string_free($pack,"transition-start"); add_string_free($pack,"transition-desk"); add_string_free($pack,"transition-change"); #create a new row $hbox_options = Gtk2::HBox->new(FALSE, 5); $vbox_options->pack_start($hbox_options, FALSE, FALSE, 0); # MENU $pack = frame_new($hbox_options,"Menu"); add_num($pack,"menus-scroll-speed"); add_num($pack,"menus-fast-move-threshold"); add_num($pack,"menus-click-drag-timeout"); add_num($pack,"menu-autoscroll-margin"); add_bool($pack,"menu-autoscroll-cursor-margin"); # EDGE $pack = frame_new($hbox_options,"Edge"); add_bool($pack,"edge-flip"); add_num($pack,"edge-flip-timeout"); #create a new row $hbox_options = Gtk2::HBox->new(FALSE, 5); $vbox_options->pack_start($hbox_options, FALSE, FALSE, 0); #Transient $pack = frame_new($hbox_options,"Transient"); add_bool($pack,"transient-move"); add_bool($pack,"transient-resize"); add_bool($pack,"transient-raise"); add_bool($pack,"transient-lower"); add_bool($pack,"transient-layer"); add_bool($pack,"transient-desktop"); add_bool($pack,"transient-iconify"); #WINDOWS $pack = frame_new($hbox_options,"Windows"); add_bool($pack,"resize-info-follows"); add_bool($pack,"move-info-follows"); add_bool($pack,"modal-windows"); } #################################################################### # WINLIST tab ##################################################################### sub add_winlist { my $sw = Gtk2::ScrolledWindow->new(undef,undef); $_[0]->pack_start($sw,TRUE,TRUE, 0); my $vbox_options = Gtk2::VBox->new(FALSE, 0); my $hbox_options; $sw->add_with_viewport($vbox_options); my $pack; #create a new row $hbox_options = Gtk2::HBox->new(FALSE, 5); $vbox_options->pack_start($hbox_options, FALSE, FALSE, 0); # FOCUS $pack = frame_new($hbox_options,"Warp"); add_bool($pack,"winlist-warp-while-selecting"); add_bool($pack,"winlist-warp-at-end"); add_num($pack,"winlist-warp-speed"); # Misc $pack = frame_new($hbox_options,"Misc"); add_bool($pack,"winlist-scroll-animate"); add_num($pack,"winlist-scroll-speed"); #create a new row $hbox_options = Gtk2::HBox->new(FALSE, 5); $vbox_options->pack_start($hbox_options, FALSE, FALSE, 0); # LIST $pack = frame_new($hbox_options,"List"); add_bool($pack,"winlist-list-show-iconified"); add_bool($pack,"winlist-list-show-other-desk-windows"); add_bool($pack,"winlist-list-show-other-screen-windows"); add_bool($pack,"winlist-list-uncover-while-selecting"); add_bool($pack,"winlist-list-jump-desk-while-selecting"); # Position $pack = frame_new($hbox_options,"Position"); add_num($pack,"winlist-pos-align-x"); add_num($pack,"winlist-pos-align-y"); add_num($pack,"winlist-pos-size-w"); add_num($pack,"winlist-pos-size-h"); add_num($pack,"winlist-pos-min-w"); add_num($pack,"winlist-pos-min-h"); add_num($pack,"winlist-pos-max-w"); add_num($pack,"winlist-pos-max-h"); } #################################################################### # DESKTOP tab ##################################################################### sub add_desktop { my $sw = Gtk2::ScrolledWindow->new(undef,undef); $_[0]->pack_start($sw,TRUE,TRUE, 0); my $vbox_options = Gtk2::VBox->new(FALSE, 0); $sw->add_with_viewport($vbox_options); my $pack; # FOCUS $pack = frame_new($vbox_options,"Desktop numbers"); add_string_free($pack,"desks"); #desktop-name-list } ##################################################################3 # GENERAL APPLY ################################################################### sub options_action_apply { apply_bool(); apply_num(); apply_string(); apply_string_free(); } sub apply_bool { my ($key,$value); my $cmd; while (($key,$value) = each(%value_bool)){ if ($widget_bool{$key}->get_active() xor $value){ if ($value){$value="0";}else{$value="1"}; $value_bool{"$key"}=$value; $cmd = "enlightenment_remote -".$key."-set ".$value; system ($cmd); if (VERBOSE){print "$cmd\n";} } } } sub apply_num { my ($key,$prev_value); my $cmd; my $cur_value; while (($key,$prev_value) = each(%value_num)){ $cur_value = $widget_num{$key}->get_text(); if ( $cur_value ne $prev_value){ $value_num{"$key"}=$cur_value; $cmd = "enlightenment_remote -".$key."-set ".$cur_value; system ($cmd); if (VERBOSE){print "$cmd\n"; } } } } sub apply_string { my ($key,$prev_value); my $cmd; my $cur_value; while (($key,$prev_value) = each(%value_string)){ $cur_value = $widget_string{$key}->entry->get_text(); if ( $cur_value ne $prev_value){ $value_string{"$key"}=$cur_value; $cmd = "enlightenment_remote -".$key."-set ".$cur_value; system ($cmd); if (VERBOSE){ print "$cmd\n";} } } } sub apply_string_free { my ($key,$prev_value); my $cmd; my $cur_value; while (($key,$prev_value) = each(%value_string_free)){ $cur_value = $widget_string_free{$key}->get_text(); if ( $cur_value ne $prev_value){ $value_string_free{"$key"}=$cur_value; $cmd = "enlightenment_remote -".$key."-set ".$cur_value; system ($cmd); if (VERBOSE){print "$cmd\n"; }; } } } #######################################################################3 # CALLBACKS ###################################################################### #===CALLBACK===ACTION= sub action_new{ my $page = $notebook->get_current_page(); action_new_keys() if ($page == TAB_KEYS); action_new_button() if ($page == TAB_MOUSE); signal_action_new() if ($page == TAB_SIGNAL); wheel_action_new() if ($page == TAB_WHEEL); } #===CALLBACK===OK=== sub action_ok { action_apply(); Gtk2->main_quit(); } #===CALLBACK===APPLY=== sub action_apply { action_apply_keys(); action_apply_mouse(); signal_action_apply(); options_action_apply(); wheel_action_apply(); } ######################################################## # AUX FUNCTION ######################### # add a string option sub add_bool { my $pack = shift(@_); my $name = shift(@_); my $pack_hbox = Gtk2::HBox->new(FALSE, 1); $pack->pack_start($pack_hbox,TRUE,TRUE,0); my $label = Gtk2::Label->new($name); $pack_hbox->pack_start($label,FALSE,FALSE,0); my $value = get_value ($name); #handle exceptions if ($value =~ /[POLICY|KILL]=(.)/){$value=$1;} my $check_button = Gtk2::CheckButton->new(); if ( $value eq "1") {$check_button->set_active (TRUE);} $pack_hbox->pack_start($check_button,FALSE,FALSE,0); $value_bool{"$name"}=$value; $widget_bool{"$name"}=$check_button; } ########################333 # add a string option sub add_string { my $pack = shift(@_); my $name = shift(@_); my @options = split(/,/,$_[0]); my $pack_hbox = Gtk2::HBox->new(FALSE, 1); $pack->pack_start($pack_hbox,TRUE,TRUE,0); my $label = Gtk2::Label->new($name); $pack_hbox->pack_start($label,FALSE,FALSE,0); my $value = get_value ($name); #====context my $field = Gtk2::Combo->new (); $field->set_popdown_strings(@options); $field->set('enable-arrow-keys',TRUE); $field->set('value-in-list',TRUE); $field->set('allow-empty' ,FALSE); $field->entry->set_text ($value); $pack_hbox->pack_start($field, FALSE, FALSE, 0); $value_string{"$name"}=$value; $widget_string{"$name"}=$field; } ######################## # add a free string option (no constrains in value) sub add_string_free { my $pack = shift(@_); my $name = shift(@_); my $pack_hbox = Gtk2::HBox->new(FALSE, 1); $pack->pack_start($pack_hbox,TRUE,TRUE,0); my $label = Gtk2::Label->new($name); $pack_hbox->pack_start($label,FALSE,FALSE,0); my $value = get_value ($name); #clear quotes if ($value =~ /"(.*)"/){$value=$1;} my $field = Gtk2::Entry->new (); $field->set_text ($value); $pack_hbox->pack_start($field, FALSE, FALSE, 0); $value_string_free{"$name"}=$value; $widget_string_free{"$name"}=$field; } ########################333 # add a numeric option sub add_num { my $pack = shift(@_); my $name = shift(@_); my $pack_hbox = Gtk2::HBox->new(FALSE, 1); $pack->pack_start($pack_hbox,TRUE,TRUE,0); my $label = Gtk2::Label->new($name); $pack_hbox->pack_start($label,FALSE,FALSE,0); my $value = get_value ($name); # handle exceptions if ($value =~ /[DELAY|THRESHOLD]=(.*)/){$value=$1;} my $field = Gtk2::Entry->new; $field->set_text($value); $pack_hbox->pack_start($field, FALSE, FALSE, 0); # set initial value $value_num{"$name"}=$value; $widget_num{"$name"}=$field; } ################################33 # GET option curren value sub get_value { my $value; open (ER,"enlightenment_remote -".$_[0]."-get|"); my @buf = ; $value = shift(@buf); $value = shift(@buf); chomp($value); if ($value=~/REPLY: (.*)/){$value = $1;}else{} if (DEBUG){ print ("$_[0] $value\n");} return $value; } ################# #CREATE A NEW frame sub frame_new { my $frame_focus = Gtk2::Frame->new ($_[1]); $_[0]->pack_start($frame_focus, FALSE, FALSE, 0); my $frame_vbox = Gtk2::VBox->new(TRUE, 5); $frame_focus->add($frame_vbox); return $frame_vbox; } sub member { my @set = @_; my $m = pop (@set); my $iter; foreach $iter (@set){ if ($iter == $m) {return TRUE;} } return FALSE; } ############################## # TODO# ####### #desktop-bg-add # -display OPT1 Connect to E running on display 'OPT1' # -module-load OPT1 Loads the module named 'OPT1' into memory # -module-unload OPT1 Unloads the module named 'OPT1' from memory # -module-enable OPT1 Enable the module named 'OPT1' # -module-disable OPT1 Disable the module named 'OPT1' # -module-list List all loaded modules # -default-bg-set OPT1 Set the default background edje to the desktop background in the file 'OPT1' (must be a full path) # -default-bg-get Get the default background edje file path # -font-available-list List all available fonts # -font-apply Apply font settings changes # -font-fallback-append OPT1 Append OPT1 to the fontset # -font-fallback-prepend OPT1 Prepend OPT1 to the fontset # -font-fallback-list List the fallback fonts in order # -font-fallback-remove OPT1 Remove OPT1 from the fontset # -font-default-set OPT1 OPT2 OPT3 Set textclass (OPT1) font (OPT2) and size (OPT3) # -font-default-get OPT1 List the default font associated with OPT1 # -font-default-remove OPT1 Remove the default text class OPT1 # -font-default-list List all configured text classes # -font-fallback-clear Clear list of fallback fonts # -restart Restart Enlightenment # -shutdown Shutdown (exit) Enlightenment # -lang-list List all available languages # -lang-set OPT1 Set the current language to 'OPT1' # -lang-get Get the current language # -dirs-list OPT1 List the directory of type specified by 'OPT1', try 'themes' # -dirs-list-append OPT1 Append the directory of type specified by 'OPT2 to the list in 'OPT1' # -dirs-list-prepend OPT1 Prepend the directory of type specified by 'OPT2 to the list in 'OPT1' # -dirs-list-remove OPT1 Remove the directory of type specified by 'OPT2 to the list in 'OPT1' # #-font-cache-set OPT1 Set the font cache size (Kb) # -font-cache-get Get the speculative font cache size (Kb) # -image-cache-set OPT1 Set the image cache size (Kb) # -image-cache-get Ge