package PACConfig;
###################################################################
# This file is part of PAC( Perl Auto Connector)
#
# Copyright (C) 2010 David Torrejon Vaquerizas
#
# 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/>.
###################################################################
$|++;
###################################################################
# Import Modules
# Standard
use strict;
use warnings;
use FindBin qw ( $RealBin $Bin $Script );
use YAML qw ( LoadFile DumpFile );
use Storable;
#use Data::Dumper;
# GTK2
use Gtk2 '-init';
use Gtk2::GladeXML;
use Gtk2::Ex::Simple::List;
# PAC modules
use PACUtils;
use PACGlobalVarEntry;
# END: Import Modules
###################################################################
###################################################################
# Define GLOBAL CLASS variables
my $APPNAME = $PACUtils::APPNAME;
my $APPVERSION = $PACUtils::APPVERSION;
my $APPICON = $RealBin . '/res/pac64x64.png';
my $TRAYICON = $RealBin . '/res/pac_tray.png';
my $TABICON = $RealBin . '/res/pac_tab.png';
my $AUTOSTART_FILE = $RealBin . '/res/pac_start.desktop';
my $GLADE_FILE = $RealBin . '/res/pac.glade';
my $INIT_CFG_FILE = $RealBin . '/res/pac.yml';
my $CFG_DIR = $ENV{'HOME'} . '/.pac';
my $CFG_FILE = $CFG_DIR . '/pac.yml';
# END: Define GLOBAL CLASS variables
###################################################################
###################################################################
# START: Define PUBLIC CLASS methods
sub new
{
my $class = shift;
my $self = {};
$self -> {_CFG} = shift;
$self -> {_WINDOWCONFIG} = undef;
$self -> {_TXTOPTSBUFFER} = undef;
$self -> { _GLADE} = undef;
%{ $self -> {_CURSOR} } = (
'block' => 0,
'ibeam' => 1,
'underline' => 2
);
# Setup known connection methods
%{ $self -> {_METHODS} } = _getMethods( $self );
# Build the GUI
_initGUI( $self ) or return 0;
# Setup callbacks
_setupCallbacks( $self );
bless( $self, $class );
return $self;
}
# DESTRUCTOR
sub DESTROY
{
my $self = shift;
undef $self;
return 1;
}
# Start GUI
sub show
{
my $self = shift;
_updateGUIPreferences( $self );
$self -> {_WINDOWCONFIG} -> set_title( "Default Global Options : $APPNAME (v$APPVERSION)" );
$$self{_WINDOWCONFIG} -> present;
return 1;
}
# END: Define PUBLIC CLASS methods
###################################################################
###################################################################
# START: Define PRIVATE CLASS functions
sub _initGUI
{
my $self = shift;
my $opt = shift;
# Load XML Glade file
$self -> {_GLADE} = Gtk2::GladeXML -> new( $GLADE_FILE ) or die "ERROR: Could not load GLADE file '$GLADE_FILE' ($!)";
# Save main, about and add windows
$self -> {_WINDOWCONFIG} = $self -> {_GLADE} -> get_widget ('windowConfig');
# Setup the check-button that defined whether PAC is auto-started on session init
_( $self, 'cbCfgAutoStart' ) -> set_active( -f $ENV{'HOME'} . '/.config/autostart/pac_start.desktop' );
# Initialize main window
$self -> {_WINDOWCONFIG} -> set_default_icon_from_file( $APPICON );
_( $self, 'btnResetDefaults' ) -> set_image( Gtk2::Image -> new_from_stock( 'gtk-undo', 'menu' ) );
_( $self, 'btnResetDefaults' ) -> set_label( 'Reset to DEFAULT values' );
_( $self, 'alignGlobalVar' ) -> add( ( $$self{_VARIABLES} = PACGlobalVarEntry -> new() ) -> {container} );
_( $self, 'nbPreferences' ) -> show_all;
_updateGUIPreferences( $self );
return 1;
}
sub _setupCallbacks
{
my $self = shift;
# Capture 'autostart' checkbox toggled state
_( $self, 'cbCfgAutoStart' ) -> signal_connect( 'toggled' => sub
{
if( _( $self, 'cbCfgAutoStart' ) -> get_active )
{
link( $AUTOSTART_FILE, $ENV{'HOME'} . '/.config/autostart/pac_start.desktop' );
}
else
{
unlink( $ENV{'HOME'} . '/.config/autostart/pac_start.desktop' );
}
return 1;
} );
# Capture 'use proxy' checkbox toggled state
_( $self, 'cbCfgProxyToggle' ) -> signal_connect( 'toggled' => sub
{
_( $self, 'aCfgProxy' ) -> set_sensitive( _( $self, 'cbCfgProxyToggle' ) -> get_active );
return 1;
} );
# Capture 'use system proxy' checkbox toggled state
_( $self, 'cbCfgProxySystem' ) -> signal_connect( 'toggled' => sub
{
_( $self, 'aCfgProxySystem' ) -> set_sensitive( ! _( $self, 'cbCfgProxySystem' ) -> get_active );
return 1;
} );
# Capture 'show password' checkbox toggled state
_( $self, 'cbConnShowPass' ) -> signal_connect( 'toggled' => sub
{
_( $self, 'entryPassword' ) -> set_visibility( _( $self, 'cbConnShowPass' ) -> get_active );
return 1;
} );
# Capture 'ping before connect' checkbox toggled state
_( $self, 'cbCfgPreConnPingPort' ) -> signal_connect( 'toggled' => sub
{
_( $self, 'spCfgPingTimeout' ) -> set_sensitive( _( $self, 'cbCfgPreConnPingPort' ) -> get_active );
return 1;
} );
# Capture 'save session logs' checkbox toggled state
_( $self, 'cbCfgSaveSessionLogs' ) -> signal_connect( 'toggled' => sub
{
_( $self, 'hboxCfgSaveSessionLogs' ) -> set_sensitive( _( $self, 'cbCfgSaveSessionLogs' ) -> get_active );
return 1;
} );
# Capture 'save' button clicked
_( $self, 'btnSaveConfig' ) -> signal_connect( 'clicked' => sub { $self -> _saveConfiguration; _( $self, 'btnCloseConfig' ) -> activate } );
# Capture 'open folder' button clicked
_( $self, 'btnCfgOpenSessionLogs' ) -> signal_connect( 'clicked' => sub { system( '/usr/bin/xdg-open ' . ( _( $self, 'btnCfgSaveSessionLogs' ) -> get_current_folder ) ); } );
# Capture 'close' button clicked
_( $self, 'btnCloseConfig' ) -> signal_connect( 'clicked' => sub { $$self{_WINDOWCONFIG} -> hide; } );
# Capture 'reset defaults' button clicked
_( $self, 'btnResetDefaults' ) -> signal_connect( 'clicked' => sub { $self -> _resetDefaults; } );
# Capture window closing
$self -> {_WINDOWCONFIG} -> signal_connect( 'delete_event' => sub
{
$self -> {_WINDOWCONFIG} -> hide();
return 1;
} );
$$self{_WINDOWCONFIG} -> signal_connect( 'key_press_event' => sub
{
my ( $widget, $event ) = @_;
# Capture 'Esc' keypress to close window
$event -> keyval == 65307 and $$self{_WINDOWCONFIG} -> hide;
return 0;
} );
return 1;
}
sub _resetDefaults
{
my $self = shift;
my %default_cfg;
defined $default_cfg{'defaults'}{1} or 1;
PACUtils::_cfgSanityCheck( \%default_cfg );
$self -> _updateGUIPreferences( \%default_cfg );
return 1;
}
sub _updateGUIPreferences
{
my $self = shift;
my $cfg = shift // $$self{_CFG};
_( $self, 'entryCfgPrompt' ) -> set_text( $$cfg{'defaults'}{'command prompt'} );
_( $self, 'spCfgTmoutConnect' ) -> set_value( $$cfg{'defaults'}{'timeout connect'} );
_( $self, 'spCfgTmoutCommand' ) -> set_value( $$cfg{'defaults'}{'timeout command'} );
_( $self, 'spCfgTerminalScrollback' ) -> set_value( $$cfg{'defaults'}{'terminal scrollback lines'} || 5000 );
_( $self, 'spCfgTerminalTransparency' ) -> set_value( $$cfg{'defaults'}{'terminal transparency'} );
_( $self, 'cbCfgAutoAcceptKeys' ) -> set_active( $$cfg{'defaults'}{'auto accept key'} );
_( $self, 'cbCfgRecordHistory' ) -> set_active( $$cfg{'defaults'}{'record command history'} );
_( $self, 'cbCfgExpectDebug' ) -> set_active( $$cfg{'defaults'}{'debug'} );
_( $self, 'cbCfgCloseToTray' ) -> set_active( $$cfg{'defaults'}{'close to tray'} );
_( $self, 'cbCfgTabsInMain' ) -> set_active( $$cfg{'defaults'}{'tabs in main window'} );
_( $self, 'cbCfgBWTrayIcon' ) -> set_active( $$cfg{'defaults'}{'use bw icon'} );
_( $self, 'cbCfgSaveShowScreenshots' ) -> set_active( $$cfg{'defaults'}{'show screenshots'} );
_( $self, 'cbCfgHideOnConnect' ) -> set_active( $$cfg{'defaults'}{'hide on connect'} );
_( $self, 'cbCfgPreConnPingPort' ) -> set_active( $$cfg{'defaults'}{'ping port before connect'} );
_( $self, 'spCfgPingTimeout' ) -> set_value( $$cfg{'defaults'}{'ping port timeout'} );
_( $self, 'spCfgPingTimeout' ) -> set_sensitive( _( $self, 'cbCfgPreConnPingPort' ) -> get_active );
_( $self, 'cbCfgStartIconified' ) -> set_active( $$cfg{'defaults'}{'start iconified'} );
_( $self, 'cbCfgStartMaximized' ) -> set_active( $$cfg{'defaults'}{'start maximized'} );
_( $self, 'cbCfgStartMainMaximized' ) -> set_active( $$cfg{'defaults'}{'start main maximized'} );
_( $self, 'cbCfgSaveOnExit' ) -> set_active( $$cfg{'defaults'}{'save on exit'} );
_( $self, 'cbCfgProxyToggle' ) -> set_active( $$cfg{'defaults'}{'use proxy'} );
_( $self, 'aCfgProxy' ) -> set_sensitive( _( $self, 'cbCfgProxyToggle' ) -> get_active );
_( $self, 'cbCfgProxySystem' ) -> set_active( $$cfg{'defaults'}{'use system proxy'} );
_( $self, 'aCfgProxySystem' ) -> set_sensitive( ! _( $self, 'cbCfgProxySystem' ) -> get_active );
_( $self, 'entryCfgProxyIP' ) -> set_text( $$cfg{'defaults'}{'proxy ip'} );
_( $self, 'entryCfgProxyPort' ) -> set_text( $$cfg{'defaults'}{'proxy port'} );
_( $self, 'entryCfgProxyUser' ) -> set_text( $$cfg{'defaults'}{'proxy user'} );
_( $self, 'entryCfgProxyPassword' ) -> set_text( $$cfg{'defaults'}{'proxy pass'} );
_( $self, 'entryCfgShellBinary' ) -> set_text( $$cfg{'defaults'}{'shell binary'} || '/bin/bash' );
_( $self, 'entryCfgShellOptions' ) -> set_text( $$cfg{'defaults'}{'shell options'} );
_( $self, 'entryCfgShellDirectory' ) -> set_text( $$cfg{'defaults'}{'shell directory'} );
_( $self, 'radioCfgTabsTop' ) -> set_active( $$cfg{'defaults'}{'tabs position'} eq 'top' );
_( $self, 'radioCfgTabsBottom' ) -> set_active( $$cfg{'defaults'}{'tabs position'} eq 'bottom' );
_( $self, 'radioCfgTabsLeft' ) -> set_active( $$cfg{'defaults'}{'tabs position'} eq 'left' );
_( $self, 'radioCfgTabsRight' ) -> set_active( $$cfg{'defaults'}{'tabs position'} eq 'right' );
_( $self, 'cbCfgCloseTermOnDisconn' ) -> set_active( $$cfg{'defaults'}{'close terminal on disconnect'} );
_( $self, 'cbCfgNewInTab' ) -> set_active( $$cfg{'defaults'}{'open connections in tabs'} // 1 );
_( $self, 'colorText' ) -> set_color( _( $self, 'colorText' ) -> get_color -> parse( $$cfg{'defaults'}{'text color'} // _( $self, 'colorText' ) -> get_color -> to_string ) );
_( $self, 'colorBack' ) -> set_color( _( $self, 'colorBack' ) -> get_color -> parse( $$cfg{'defaults'}{'back color'} // _( $self, 'colorBack' ) -> get_color -> to_string ) );
_( $self, 'colorConnected' ) -> set_color( _( $self, 'colorConnected' ) -> get_color -> parse( $$cfg{'defaults'}{'connected color'} // _( $self, 'colorText' ) -> get_color -> to_string ) );
_( $self, 'colorDisconnected' ) -> set_color( _( $self, 'colorDisconnected' ) -> get_color -> parse( $$cfg{'defaults'}{'disconnected color'} // _( $self, 'colorBack' ) -> get_color -> to_string ) );
_( $self, 'colorNewData' ) -> set_color( _( $self, 'colorNewData' ) -> get_color -> parse( $$cfg{'defaults'}{'new data color'} // _( $self, 'colorNewData' ) -> get_color -> to_string ) );
_( $self, 'fontTerminal' ) -> set_font_name( $$cfg{'defaults'}{'terminal font'} // _( $self, 'fontTerminal' ) -> get_font_name );
_( $self, 'comboCursorShape' ) -> set_active( $self -> {_CURSOR}{ $$cfg{'defaults'}{'cursor shape'} // 'block' } );
_( $self, 'cbCfgOneInstance' ) -> set_active( $$cfg{'defaults'}{'only one instance'} );
_( $self, 'cbCfgSaveSessionLogs' ) -> set_active( $$cfg{'defaults'}{'save session logs'} );
_( $self, 'hboxCfgSaveSessionLogs' ) -> set_sensitive( $$cfg{'defaults'}{'save session logs'} );
_( $self, 'btnCfgSaveSessionLogs' ) -> set_current_folder( $$cfg{'defaults'}{'session logs folder'} );
_( $self, 'spCfgSaveSessionLogs' ) -> set_value( $$cfg{'defaults'}{'session logs amount'} );
# Update the global variables tab
$$self{_VARIABLES} -> update( $$self{_CFG}{'defaults'}{'global variables'} );
return 1;
}
sub _saveConfiguration
{
my $self = shift;
$$self{_CFG}{'defaults'}{'command prompt'} = _( $self, 'entryCfgPrompt' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'timeout connect'} = _( $self, 'spCfgTmoutConnect' ) -> get_value();
$$self{_CFG}{'defaults'}{'timeout command'} = _( $self, 'spCfgTmoutCommand' ) -> get_value();
$$self{_CFG}{'defaults'}{'terminal scrollback lines'} = _( $self, 'spCfgTerminalScrollback' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'terminal transparency'} = _( $self, 'spCfgTerminalTransparency' ) -> get_value;
$$self{_CFG}{'defaults'}{'auto accept key'} = _( $self, 'cbCfgAutoAcceptKeys' ) -> get_active();
$$self{_CFG}{'defaults'}{'record command history'} = _( $self, 'cbCfgRecordHistory' ) -> get_active();
$$self{_CFG}{'defaults'}{'debug'} = _( $self, 'cbCfgExpectDebug' ) -> get_active();
$$self{_CFG}{'defaults'}{'use bw icon'} = _( $self, 'cbCfgBWTrayIcon' ) -> get_active();
$$self{_CFG}{'defaults'}{'close to tray'} = _( $self, 'cbCfgCloseToTray' ) -> get_active();
$$self{_CFG}{'defaults'}{'show screenshots'} = _( $self, 'cbCfgSaveShowScreenshots' ) -> get_active();
$$self{_CFG}{'defaults'}{'tabs in main window'} = _( $self, 'cbCfgTabsInMain' ) -> get_active();
$$self{_CFG}{'defaults'}{'hide on connect'} = _( $self, 'cbCfgHideOnConnect' ) -> get_active();
$$self{_CFG}{'defaults'}{'ping port before connect'} = _( $self, 'cbCfgPreConnPingPort' ) -> get_active();
$$self{_CFG}{'defaults'}{'ping port timeout'} = _( $self, 'spCfgPingTimeout' ) -> get_value();
$$self{_CFG}{'defaults'}{'start iconified'} = _( $self, 'cbCfgStartIconified' ) -> get_active();
$$self{_CFG}{'defaults'}{'start maximized'} = _( $self, 'cbCfgStartMaximized' ) -> get_active();
$$self{_CFG}{'defaults'}{'start main maximized'} = _( $self, 'cbCfgStartMainMaximized' ) -> get_active();
$$self{_CFG}{'defaults'}{'save on exit'} = _( $self, 'cbCfgSaveOnExit' ) -> get_active();
$$self{_CFG}{'defaults'}{'use proxy'} = _( $self, 'cbCfgProxyToggle' ) -> get_active();
$$self{_CFG}{'defaults'}{'use system proxy'} = _( $self, 'cbCfgProxySystem' ) -> get_active();
$$self{_CFG}{'defaults'}{'proxy ip'} = _( $self, 'entryCfgProxyIP' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'proxy port'} = _( $self, 'entryCfgProxyPort' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'proxy user'} = _( $self, 'entryCfgProxyUser' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'proxy pass'} = _( $self, 'entryCfgProxyPassword' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'shell binary'} = _( $self, 'entryCfgShellBinary' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'shell options'} = _( $self, 'entryCfgShellOptions' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'shell directory'} = _( $self, 'entryCfgShellDirectory' ) -> get_chars( 0, -1 );
$$self{_CFG}{'defaults'}{'tabs position'} = 'top' if _( $self, 'radioCfgTabsTop' ) -> get_active;
$$self{_CFG}{'defaults'}{'tabs position'} = 'bottom' if _( $self, 'radioCfgTabsBottom' ) -> get_active;
$$self{_CFG}{'defaults'}{'tabs position'} = 'left' if _( $self, 'radioCfgTabsLeft' ) -> get_active;
$$self{_CFG}{'defaults'}{'tabs position'} = 'right' if _( $self, 'radioCfgTabsRight' ) -> get_active;
$$self{_CFG}{'defaults'}{'close terminal on disconnect'} = _( $self, 'cbCfgCloseTermOnDisconn' ) -> get_active();
$$self{_CFG}{'defaults'}{'open connections in tabs'} = _( $self, 'cbCfgNewInTab' ) -> get_active();
$$self{_CFG}{'defaults'}{'text color'} = _( $self, 'colorText' ) -> get_color -> to_string;
$$self{_CFG}{'defaults'}{'back color'} = _( $self, 'colorBack' ) -> get_color -> to_string;
$$self{_CFG}{'defaults'}{'connected color'} = _( $self, 'colorConnected' ) -> get_color -> to_string;
$$self{_CFG}{'defaults'}{'disconnected color'} = _( $self, 'colorDisconnected' ) -> get_color -> to_string;
$$self{_CFG}{'defaults'}{'new data color'} = _( $self, 'colorNewData' ) -> get_color -> to_string;
$$self{_CFG}{'defaults'}{'terminal font'} = _( $self, 'fontTerminal' ) -> get_font_name();
$$self{_CFG}{'defaults'}{'cursor shape'} = _( $self, 'comboCursorShape' ) -> get_active_text();
$$self{_CFG}{'defaults'}{'only one instance'} = _( $self, 'cbCfgOneInstance' ) -> get_active;
$$self{_CFG}{'defaults'}{'save session logs'} = _( $self, 'cbCfgSaveSessionLogs' ) -> get_active;
$$self{_CFG}{'defaults'}{'session logs folder'} = _( $self, 'btnCfgSaveSessionLogs' ) -> get_current_folder;
$$self{_CFG}{'defaults'}{'session logs amount'} = _( $self, 'spCfgSaveSessionLogs' ) -> get_value;
# Save the global variables tab options
$$self{_CFG}{'defaults'}{'global variables'} = $$self{_VARIABLES} -> get_cfg;
#DumpFile( $CFG_FILE, $$self{_CFG} );
$$self{_CFG}{'tmp'}{'changed'} = 1;
$self -> _updateGUIPreferences;
$PACMain::FUNCS{_MAIN} -> _updateGUIPreferences;
return 1;
}
# END: Define PRIVATE CLASS functions
###################################################################
1;