summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/sysinfo/processinfo.cpp5
1 files changed, 1 insertions, 4 deletions
diff --git a/noncore/settings/sysinfo/processinfo.cpp b/noncore/settings/sysinfo/processinfo.cpp
index 9a5446a..769410f 100644
--- a/noncore/settings/sysinfo/processinfo.cpp
+++ b/noncore/settings/sysinfo/processinfo.cpp
@@ -1,190 +1,187 @@
1/********************************************************************** 1/**********************************************************************
2** ProcessInfo 2** ProcessInfo
3** 3**
4** Display process information 4** Display process information
5** 5**
6** Copyright (C) 2002, Dan Williams 6** Copyright (C) 2002, Dan Williams
7** williamsdr@acm.org 7** williamsdr@acm.org
8** http://draknor.net 8** http://draknor.net
9** 9**
10** This file may be distributed and/or modified under the terms of the 10** This file may be distributed and/or modified under the terms of the
11** GNU General Public License version 2 as published by the Free Software 11** GNU General Public License version 2 as published by the Free Software
12** Foundation and appearing in the file LICENSE.GPL included in the 12** Foundation and appearing in the file LICENSE.GPL included in the
13** packaging of this file. 13** packaging of this file.
14** 14**
15** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 15** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17** 17**
18**********************************************************************/ 18**********************************************************************/
19 19
20#include <qpe/qpeapplication.h> 20#include <qpe/qpeapplication.h>
21 21
22#include <qdir.h> 22#include <qdir.h>
23#include <qfile.h> 23#include <qfile.h>
24#include <qheader.h> 24#include <qheader.h>
25#include <qlayout.h> 25#include <qlayout.h>
26#include <qlistview.h> 26#include <qlistview.h>
27#include <qmessagebox.h> 27#include <qmessagebox.h>
28#include <qtimer.h> 28#include <qtimer.h>
29#include <qwhatsthis.h> 29#include <qwhatsthis.h>
30 30
31#include <sys/types.h> 31#include <sys/types.h>
32#include <signal.h> 32#include <signal.h>
33 33
34#include "processinfo.h" 34#include "processinfo.h"
35#include "detail.h" 35#include "detail.h"
36 36
37ProcessInfo::ProcessInfo( QWidget* parent, const char* name, WFlags fl ) 37ProcessInfo::ProcessInfo( QWidget* parent, const char* name, WFlags fl )
38 : QWidget( parent, name, fl ) 38 : QWidget( parent, name, fl )
39{ 39{
40 QGridLayout *layout = new QGridLayout( this ); 40 QGridLayout *layout = new QGridLayout( this );
41 layout->setSpacing( 4 ); 41 layout->setSpacing( 4 );
42 layout->setMargin( 4 ); 42 layout->setMargin( 4 );
43 43
44 44
45 ProcessView = new QListView( this, "ProcessView" ); 45 ProcessView = new QListView( this, "ProcessView" );
46 int colnum = ProcessView->addColumn( tr( "PID" ) ); 46 int colnum = ProcessView->addColumn( tr( "PID" ) );
47 ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); 47 ProcessView->setColumnAlignment( colnum, Qt::AlignRight );
48 colnum = ProcessView->addColumn( tr( "Command" ),96 ); 48 colnum = ProcessView->addColumn( tr( "Command" ),96 );
49 colnum = ProcessView->addColumn( tr( "Status" ) ); 49 colnum = ProcessView->addColumn( tr( "Status" ) );
50 colnum = ProcessView->addColumn( tr( "Time" ) ); 50 colnum = ProcessView->addColumn( tr( "Time" ) );
51 ProcessView->setColumnAlignment( colnum, Qt::AlignRight ); 51 ProcessView->setColumnAlignment( colnum, Qt::AlignRight );
52 ProcessView->setAllColumnsShowFocus( TRUE ); 52 ProcessView->setAllColumnsShowFocus( TRUE );
53 QPEApplication::setStylusOperation( ProcessView->viewport(), QPEApplication::RightOnHold ); 53 QPEApplication::setStylusOperation( ProcessView->viewport(), QPEApplication::RightOnHold );
54 connect( ProcessView, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int ) ), 54 connect( ProcessView, SIGNAL( rightButtonPressed( QListViewItem *, const QPoint &, int ) ),
55 this, SLOT( viewProcess( QListViewItem * ) ) ); 55 this, SLOT( viewProcess( QListViewItem * ) ) );
56 layout->addMultiCellWidget( ProcessView, 0, 0, 0, 1 ); 56 layout->addMultiCellWidget( ProcessView, 0, 0, 0, 1 );
57 QWhatsThis::add( ProcessView, tr( "This is a list of all the processes on this handheld device.\n\nClick and hold on a process to see additional information about the process, or to send a signal to it." ) ); 57 QWhatsThis::add( ProcessView, tr( "This is a list of all the processes on this handheld device.\n\nClick and hold on a process to see additional information about the process, or to send a signal to it." ) );
58 58
59 SignalCB = new QComboBox( FALSE, this, "SignalCB" ); 59 SignalCB = new QComboBox( FALSE, this, "SignalCB" );
60 SignalCB->insertItem( " 1: SIGHUP" ); 60 SignalCB->insertItem( " 1: SIGHUP" );
61 SignalCB->insertItem( " 2: SIGINT" ); 61 SignalCB->insertItem( " 2: SIGINT" );
62 SignalCB->insertItem( " 3: SIGQUIT" ); 62 SignalCB->insertItem( " 3: SIGQUIT" );
63 SignalCB->insertItem( " 5: SIGTRAP" ); 63 SignalCB->insertItem( " 5: SIGTRAP" );
64 SignalCB->insertItem( " 6: SIGABRT" ); 64 SignalCB->insertItem( " 6: SIGABRT" );
65 SignalCB->insertItem( " 9: SIGKILL" ); 65 SignalCB->insertItem( " 9: SIGKILL" );
66 SignalCB->insertItem( "14: SIGALRM" ); 66 SignalCB->insertItem( "14: SIGALRM" );
67 SignalCB->insertItem( "15: SIGTERM" ); 67 SignalCB->insertItem( "15: SIGTERM" );
68 SignalCB->insertItem( "18: SIGCONT" ); 68 SignalCB->insertItem( "18: SIGCONT" );
69 SignalCB->insertItem( "19: SIGSTOP" ); 69 SignalCB->insertItem( "19: SIGSTOP" );
70 layout->addWidget( SignalCB, 1, 0 ); 70 layout->addWidget( SignalCB, 1, 0 );
71 QWhatsThis::add( SignalCB, tr( "Select a signal here and then click the Send button to the right to send to this process." ) ); 71 QWhatsThis::add( SignalCB, tr( "Select a signal here and then click the Send button to the right to send to this process." ) );
72 72
73 SendButton = new QPushButton( this, "SendButton" ); 73 SendButton = new QPushButton( this, "SendButton" );
74 SendButton->setMinimumSize( QSize( 50, 24 ) ); 74 SendButton->setMinimumSize( QSize( 50, 24 ) );
75 SendButton->setMaximumSize( QSize( 50, 24 ) ); 75 SendButton->setMaximumSize( QSize( 50, 24 ) );
76 SendButton->setText( tr( "Send" ) ); 76 SendButton->setText( tr( "Send" ) );
77 connect( SendButton, SIGNAL( clicked() ), this, SLOT( slotSendClicked() ) ); 77 connect( SendButton, SIGNAL( clicked() ), this, SLOT( slotSendClicked() ) );
78 layout->addWidget( SendButton, 1, 1 ); 78 layout->addWidget( SendButton, 1, 1 );
79 QWhatsThis::add( SendButton, tr( "Click here to send the selected signal to this process." ) ); 79 QWhatsThis::add( SendButton, tr( "Click here to send the selected signal to this process." ) );
80 80
81 QTimer *t = new QTimer( this ); 81 QTimer *t = new QTimer( this );
82 connect( t, SIGNAL( timeout() ), this, SLOT( updateData() ) ); 82 connect( t, SIGNAL( timeout() ), this, SLOT( updateData() ) );
83 t->start( 5000 ); 83 t->start( 5000 );
84 84
85 updateData(); 85 updateData();
86 86
87 ProcessDtl = new Detail(); 87 ProcessDtl = new Detail();
88 QWhatsThis::add( ProcessDtl->detailView, tr( "This area shows detailed information about this process." ) ); 88 QWhatsThis::add( ProcessDtl->detailView, tr( "This area shows detailed information about this process." ) );
89} 89}
90 90
91ProcessInfo::~ProcessInfo() 91ProcessInfo::~ProcessInfo()
92{ 92{
93} 93}
94 94
95void ProcessInfo::updateData() 95void ProcessInfo::updateData()
96{ 96{
97 int pid, ppid, pgrp, session, tty, tpgid, utime, stime, cutime, cstime, counter, priority, starttime, 97 int pid, ppid, pgrp, session, tty, tpgid, utime, stime, cutime, cstime, counter, priority, starttime,
98 signal, blocked, sigignore, sigcatch; 98 signal, blocked, sigignore, sigcatch;
99 uint flags, minflt, cminflt, majflt, cmajflt, timeout, itrealvalue, vsize, rss, rlim, startcode, 99 uint flags, minflt, cminflt, majflt, cmajflt, timeout, itrealvalue, vsize, rss, rlim, startcode,
100 endcode, startstack, kstkesp, kstkeip, wchan; 100 endcode, startstack, kstkesp, kstkeip, wchan;
101 char state; 101 char state;
102 char comm[64]; 102 char comm[64];
103 103
104 ProcessView->clear(); 104 ProcessView->clear();
105 105
106 QDir *procdir = new QDir("/proc", 0, QDir::Name, QDir::Dirs); 106 QDir *procdir = new QDir("/proc", 0, QDir::Name, QDir::Dirs);
107 QFileInfoList *proclist = new QFileInfoList(*(procdir->entryInfoList())); 107 QFileInfoList *proclist = new QFileInfoList(*(procdir->entryInfoList()));
108 if ( proclist ) 108 if ( proclist )
109 { 109 {
110 QFileInfoListIterator it(*proclist); 110 QFileInfoListIterator it(*proclist);
111 QFileInfo *f; 111 QFileInfo *f;
112 while ( ( f = it.current() ) != 0 ) 112 while ( ( f = it.current() ) != 0 )
113 { 113 {
114 ++it; 114 ++it;
115 QString processnum = f->fileName(); 115 QString processnum = f->fileName();
116 if ( processnum >= "1" && processnum <= "99999" ) 116 if ( processnum >= "1" && processnum <= "99999" )
117 { 117 {
118 FILE *procfile = fopen( ( QString ) ( "/proc/" + processnum + "/stat"), "r"); 118 FILE *procfile = fopen( ( QString ) ( "/proc/" + processnum + "/stat"), "r");
119 119
120 if ( procfile ) 120 if ( procfile )
121 { 121 {
122 fscanf( procfile, 122 fscanf( procfile,
123 "%d %s %c %d %d %d %d %d %u %u %u %u %u %d %d %d %d %d %d %u %u %d %u %u %u %u %u %u %u %u %d %d %d %d %u", 123 "%d %s %c %d %d %d %d %d %u %u %u %u %u %d %d %d %d %d %d %u %u %d %u %u %u %u %u %u %u %u %d %d %d %d %u",
124 &pid, comm, &state, &ppid, &pgrp, &session,&tty, &tpgid, &flags, &minflt, &cminflt, 124 &pid, comm, &state, &ppid, &pgrp, &session,&tty, &tpgid, &flags, &minflt, &cminflt,
125 &majflt, &cmajflt, &utime, &stime, &cutime, &cstime, &counter, &priority, &timeout, 125 &majflt, &cmajflt, &utime, &stime, &cutime, &cstime, &counter, &priority, &timeout,
126 &itrealvalue, &starttime, &vsize, &rss, &rlim, &startcode, &endcode, &startstack, 126 &itrealvalue, &starttime, &vsize, &rss, &rlim, &startcode, &endcode, &startstack,
127 &kstkesp, &kstkeip, &signal, &blocked, &sigignore, &sigcatch, &wchan ); 127 &kstkesp, &kstkeip, &signal, &blocked, &sigignore, &sigcatch, &wchan );
128 processnum = processnum.rightJustify( 5, ' ' ); 128 processnum = processnum.rightJustify( 5, ' ' );
129 QString processcmd = QString( comm ).replace( QRegExp( "[()]" ), "" ); 129 QString processcmd = QString( comm ).replace( QRegExp( "[()]" ), "" );
130 QString processstatus = QChar(state); 130 QString processstatus = QChar(state);
131 QString processtime = QString::number( ( utime + stime ) / 100 ); 131 QString processtime = QString::number( ( utime + stime ) / 100 );
132 processtime = processtime.rightJustify( 9, ' ' ); 132 processtime = processtime.rightJustify( 9, ' ' );
133 fclose( procfile ); 133 fclose( procfile );
134 134
135 ( void ) new QListViewItem( ProcessView, processnum, processcmd, processstatus, processtime ); 135 ( void ) new QListViewItem( ProcessView, processnum, processcmd, processstatus, processtime );
136 } 136 }
137 } 137 }
138 } 138 }
139 } 139 }
140 140
141 delete proclist; 141 delete proclist;
142 delete procdir; 142 delete procdir;
143} 143}
144 144
145void ProcessInfo::slotSendClicked() 145void ProcessInfo::slotSendClicked()
146{ 146{
147 QListViewItem *currprocess = ProcessView->currentItem(); 147 QListViewItem *currprocess = ProcessView->currentItem();
148 if ( !currprocess ) 148 if ( !currprocess )
149 { 149 {
150 return; 150 return;
151 } 151 }
152 152
153 QString capstr = tr( "You really want to send\n" ); 153 QString capstr = tr( "You really want to send\n" );
154 capstr.append( SignalCB->currentText() ); 154 capstr.append( SignalCB->currentText() );
155 capstr.append( "\nto this process?" ); 155 capstr.append( "\nto this process?" );
156 156
157 157
158 if ( QMessageBox::warning( this, currprocess->text( 1 ), capstr, 158 if ( QMessageBox::warning( this, currprocess->text( 1 ), capstr,
159 QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape ) == QMessageBox::Yes ) 159 QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape ) == QMessageBox::Yes )
160 { 160 {
161 QString sigstr = SignalCB->currentText(); 161 QString sigstr = SignalCB->currentText();
162 sigstr.truncate(2); 162 sigstr.truncate(2);
163 int sigid = sigstr.toUInt(); 163 int sigid = sigstr.toUInt();
164 if ( kill( currprocess->text( 0 ).stripWhiteSpace().toUInt(), sigid ) == 0 ) 164 kill( currprocess->text( 0 ).stripWhiteSpace().toUInt(), sigid );
165 {
166 hide();
167 }
168 } 165 }
169 166
170} 167}
171 168
172void ProcessInfo::viewProcess( QListViewItem *process ) 169void ProcessInfo::viewProcess( QListViewItem *process )
173{ 170{
174 QString pid= process->text( 0 ).stripWhiteSpace(); 171 QString pid= process->text( 0 ).stripWhiteSpace();
175 QString command = process->text( 1 ); 172 QString command = process->text( 1 );
176 ProcessDtl->setCaption( pid + " - " + command ); 173 ProcessDtl->setCaption( pid + " - " + command );
177 FILE *statfile = fopen( ( QString ) ( "/proc/" + pid + "/status"), "r"); 174 FILE *statfile = fopen( ( QString ) ( "/proc/" + pid + "/status"), "r");
178 if ( statfile ) 175 if ( statfile )
179 { 176 {
180 char line[81]; 177 char line[81];
181 fgets( line, 81, statfile ); 178 fgets( line, 81, statfile );
182 ProcessDtl->detailView->setText( line ); 179 ProcessDtl->detailView->setText( line );
183 while ( fgets( line, 81, statfile ) ) 180 while ( fgets( line, 81, statfile ) )
184 { 181 {
185 ProcessDtl->detailView->append( line ); 182 ProcessDtl->detailView->append( line );
186 } 183 }
187 fclose( statfile ); 184 fclose( statfile );
188 } 185 }
189 ProcessDtl->showMaximized(); 186 ProcessDtl->showMaximized();
190} 187}