summaryrefslogtreecommitdiffstats
path: root/lib/util/kdevshellwidget.cpp
blob: f9a61feae54db5ccb318c41cd201598923a986bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/***************************************************************************
 *   Copyright (C) 2006 by Jens Dagerbo                                    *
 *   [email protected]                                               *
 *                                                                         *
 *   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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include <qtimer.h>
#include <qframe.h>

#include <kdebug.h>
#include <kparts/part.h>
#include <klibloader.h>
#include <kde_terminal_interface.h>
#include <kprocess.h>

#include "kdevshellwidget.h"

KDevShellWidget::KDevShellWidget(QWidget *parent, const char *name)
 : QVBox(parent, name), m_doAutoActivate( false ), m_isRunning( false )
{
}


KDevShellWidget::~KDevShellWidget()
{
}

void KDevShellWidget::setShell( const QString & shell, const QStrList & arguments )
{
	m_shellName = shell;
	m_shellArguments = arguments;
}

void KDevShellWidget::activate( )
{
	KLibFactory *factory = KLibLoader::self()->factory("libkonsolepart");
	if ( !factory ) return;

  	m_konsolePart = (KParts::ReadOnlyPart *) factory->create( this, "libkonsolepart", "KParts::ReadOnlyPart" );
	if ( !m_konsolePart ) return;

	connect( m_konsolePart, SIGNAL( processExited(KProcess *) ), this, SLOT( processExited(KProcess *) ) );
	connect( m_konsolePart, SIGNAL( receivedData( const QString& ) ), this, SIGNAL( receivedData( const QString& ) ) );
	connect( m_konsolePart, SIGNAL(destroyed()), this, SLOT(partDestroyed()) );

 	m_konsolePart->widget()->setFocusPolicy( QWidget::WheelFocus );
 	setFocusProxy( m_konsolePart->widget() );
 	m_konsolePart->widget()->setFocus();

 	if ( m_konsolePart->widget()->inherits("QFrame") )
 		((QFrame*)m_konsolePart->widget())->setFrameStyle( QFrame::Panel | QFrame::Sunken );

	m_konsolePart->widget()->show();

	TerminalInterface* ti = static_cast<TerminalInterface*>( m_konsolePart->qt_cast( "TerminalInterface" ) );
	if( !ti ) return;

	if ( !m_shellName.isEmpty() )
		ti->startProgram( m_shellName, m_shellArguments );

	m_isRunning = true;

}

void KDevShellWidget::partDestroyed( )
{
	if ( m_doAutoActivate )
	{
		activate();
	}
}

void KDevShellWidget::processExited( KProcess * proc )
{
	m_isRunning = false;

	if ( !proc ) return;

	kdDebug(9000) << proc->args() << endl;

	if ( proc->normalExit() )
		emit shellExited( proc->exitStatus() );
	else if ( proc->signalled() )
		emit shellSignalled( proc->exitSignal() );
}

void KDevShellWidget::sendInput( const QString & text )
{
	if ( !m_konsolePart ) return;
	TerminalInterface* ti = static_cast<TerminalInterface*>( m_konsolePart->qt_cast( "TerminalInterface" ) );
	if( !ti ) return;

	ti->sendInput( text );
}

bool KDevShellWidget::isRunning( )
{
	return m_isRunning;
}

void KDevShellWidget::setAutoReactivateOnClose( bool doAutoActivate )
{
	// to auto reactivate can be dangerous, do it like this to avoid
	// reactivating with a non-working setting (the partDestroyed()
	// slot will have ran before m_doAutoActivate is set)
	if ( doAutoActivate )
		QTimer::singleShot( 3000, this, SLOT(setAutoReactivateOnCloseDelayed()) );
	else
		m_doAutoActivate = false;
}

void KDevShellWidget::setAutoReactivateOnCloseDelayed( )
{
	m_doAutoActivate = true;
}


#include "kdevshellwidget.moc"

// kate: space-indent off; indent-width 4; tab-width 4; show-tabs off;