summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/BUGS9
-rw-r--r--noncore/apps/opie-console/MyPty.cpp23
-rw-r--r--noncore/apps/opie-console/MyPty.h2
-rw-r--r--noncore/apps/opie-console/io_layer.h14
-rw-r--r--noncore/apps/opie-console/io_serial.cpp7
-rw-r--r--noncore/apps/opie-console/io_serial.h4
-rw-r--r--noncore/apps/opie-console/mainwindow.cpp10
-rw-r--r--noncore/apps/opie-console/profilemanager.cpp15
-rw-r--r--noncore/apps/opie-console/session.cpp6
-rw-r--r--noncore/apps/opie-console/session.h1
-rw-r--r--noncore/apps/opie-console/tabwidget.cpp1
11 files changed, 72 insertions, 20 deletions
diff --git a/noncore/apps/opie-console/BUGS b/noncore/apps/opie-console/BUGS
new file mode 100644
index 0000000..ffaceef
--- a/dev/null
+++ b/noncore/apps/opie-console/BUGS
@@ -0,0 +1,9 @@
1Ok we all know we write perfect code
2but sometimes the compiler produces bad code
3and we need to work around some compiler bugs!! -zecke
4
5MyPty is broken in some ways
6 if you do connect/disconnect/connect sh will be executed in the
7 process of opie-console.... funny aye?
8
9OTabWidget seems to give us problems too
diff --git a/noncore/apps/opie-console/MyPty.cpp b/noncore/apps/opie-console/MyPty.cpp
index b6ae1d9..565d03f 100644
--- a/noncore/apps/opie-console/MyPty.cpp
+++ b/noncore/apps/opie-console/MyPty.cpp
@@ -1,309 +1,324 @@
1/* -------------------------------------------------------------------------- */ 1/* -------------------------------------------------------------------------- */
2/* */ 2/* */
3/* [MyPty.C] Pseudo Terminal Device */ 3/* [MyPty.C] Pseudo Terminal Device */
4/* */ 4/* */
5/* -------------------------------------------------------------------------- */ 5/* -------------------------------------------------------------------------- */
6/* */ 6/* */
7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ 7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */
8/* */ 8/* */
9/* This file is part of Konsole - an X terminal for KDE */ 9/* This file is part of Konsole - an X terminal for KDE */
10/* -------------------------------------------------------------------------- */ 10/* -------------------------------------------------------------------------- */
11 /* */ 11 /* */
12/* Ported Konsole to Qt/Embedded */ 12/* Ported Konsole to Qt/Embedded */
13 /* */ 13 /* */
14/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ 14/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */
15 /* */ 15 /* */
16/* -------------------------------------------------------------------------- */ 16/* -------------------------------------------------------------------------- */
17 17
18/* If you're compiling konsole on non-Linux platforms and find 18/* If you're compiling konsole on non-Linux platforms and find
19 problems that you can track down to this file, please have 19 problems that you can track down to this file, please have
20 a look into ../README.ports, too. 20 a look into ../README.ports, too.
21*/ 21*/
22 22
23/*! \file 23/*! \file
24*/ 24*/
25 25
26/*! \class TEPty 26/*! \class TEPty
27 27
28 \brief Ptys provide a pseudo terminal connection to a program. 28 \brief Ptys provide a pseudo terminal connection to a program.
29 29
30 Although closely related to pipes, these pseudo terminal connections have 30 Although closely related to pipes, these pseudo terminal connections have
31 some ability, that makes it nessesary to uses them. Most importent, they 31 some ability, that makes it nessesary to uses them. Most importent, they
32 know about changing screen sizes and UNIX job control. 32 know about changing screen sizes and UNIX job control.
33 33
34 Within the terminal emulation framework, this class represents the 34 Within the terminal emulation framework, this class represents the
35 host side of the terminal together with the connecting serial line. 35 host side of the terminal together with the connecting serial line.
36 36
37 One can create many instances of this class within a program. 37 One can create many instances of this class within a program.
38 As a side effect of using this class, a signal(2) handler is 38 As a side effect of using this class, a signal(2) handler is
39 installed on SIGCHLD. 39 installed on SIGCHLD.
40 40
41 \par FIXME 41 \par FIXME
42 42
43 [NOTE: much of the technical stuff below will be replaced by forkpty.] 43 [NOTE: much of the technical stuff below will be replaced by forkpty.]
44 44
45 publish the SIGCHLD signal if not related to an instance. 45 publish the SIGCHLD signal if not related to an instance.
46 46
47 clearify TEPty::done vs. TEPty::~TEPty semantics. 47 clearify TEPty::done vs. TEPty::~TEPty semantics.
48 check if pty is restartable via run after done. 48 check if pty is restartable via run after done.
49 49
50 \par Pseudo terminals 50 \par Pseudo terminals
51 51
52 Pseudo terminals are a unique feature of UNIX, and always come in form of 52 Pseudo terminals are a unique feature of UNIX, and always come in form of
53 pairs of devices (/dev/ptyXX and /dev/ttyXX), which are connected to each 53 pairs of devices (/dev/ptyXX and /dev/ttyXX), which are connected to each
54 other by the operating system. One may think of them as two serial devices 54 other by the operating system. One may think of them as two serial devices
55 linked by a null-modem cable. Being based on devices the number of 55 linked by a null-modem cable. Being based on devices the number of
56 simultanous instances of this class is (globally) limited by the number of 56 simultanous instances of this class is (globally) limited by the number of
57 those device pairs, which is 256. 57 those device pairs, which is 256.
58 58
59 Another technic are UNIX 98 PTY's. These are supported also, and prefered 59 Another technic are UNIX 98 PTY's. These are supported also, and prefered
60 over the (obsolete) predecessor. 60 over the (obsolete) predecessor.
61 61
62 There's a sinister ioctl(2), signal(2) and job control stuff 62 There's a sinister ioctl(2), signal(2) and job control stuff
63 nessesary to make everything work as it should. 63 nessesary to make everything work as it should.
64*/ 64*/
65 65
66 66
67#include <qapplication.h> 67#include <qapplication.h>
68#include <qsocketnotifier.h> 68#include <qsocketnotifier.h>
69#include <qstring.h> 69#include <qstring.h>
70 70
71#include <stdlib.h> 71#include <stdlib.h>
72#include <stdio.h> 72#include <stdio.h>
73#include <signal.h> 73#include <signal.h>
74#include <fcntl.h> 74#include <fcntl.h>
75#include <unistd.h> 75#include <unistd.h>
76#include <termios.h> 76#include <termios.h>
77#include <sys/types.h> 77#include <sys/types.h>
78#include <sys/ioctl.h> 78#include <sys/ioctl.h>
79#include <sys/wait.h> 79#include <sys/wait.h>
80 80
81#ifdef HAVE_OPENPTY 81#ifdef HAVE_OPENPTY
82#include <pty.h> 82#include <pty.h>
83#endif 83#endif
84 84
85#include "procctl.h" 85#include "procctl.h"
86#include "MyPty.h" 86#include "MyPty.h"
87 87
88 88
89#undef VERBOSE_DEBUG 89#undef VERBOSE_DEBUG
90 90
91 91
92/* -------------------------------------------------------------------------- */ 92/* -------------------------------------------------------------------------- */
93 93
94/*! 94/*!
95 Informs the client program about the 95 Informs the client program about the
96 actual size of the window. 96 actual size of the window.
97*/ 97*/
98 98
99void MyPty::setSize(int lines, int columns) 99void MyPty::setSize(int lines, int columns)
100{ 100{
101 struct winsize wsize; 101 struct winsize wsize;
102 wsize.ws_row = (unsigned short)lines; 102 wsize.ws_row = (unsigned short)lines;
103 wsize.ws_col = (unsigned short)columns; 103 wsize.ws_col = (unsigned short)columns;
104 if(m_fd < 0) return; 104 if(m_fd < 0) return;
105 ioctl(m_fd,TIOCSWINSZ,(char *)&wsize); 105 ioctl(m_fd,TIOCSWINSZ,(char *)&wsize);
106} 106}
107 107
108 108
109void MyPty::donePty() 109void MyPty::donePty()
110{ 110{
111 // This is code from the Qt DumbTerminal example 111 // This is code from the Qt DumbTerminal example
112 int status = 0; 112 int status = 0;
113 113
114 ::close(m_fd); 114 ::close(m_fd);
115 115
116 if (m_cpid) { 116 if (m_cpid) {
117 kill(m_cpid, SIGHUP); 117 kill(m_cpid, SIGHUP);
118 //waitpid(m_cpid, &status, 0); 118 //waitpid(m_cpid, &status, 0);
119 delete m_sn_e; 119 delete m_sn_e;
120 delete m_sn_r;
120 m_sn_e = 0l; 121 m_sn_e = 0l;
122 m_sn_r = 0l;
121 } 123 }
122 124
123 m_cpid = 0; 125 m_cpid = 0;
126 m_fd = -1;
124// emit done(status); 127// emit done(status);
125} 128}
126 129
127 130
128const char* MyPty::deviceName() 131const char* MyPty::deviceName()
129{ 132{
130 return m_ttynam; 133 return m_ttynam;
131} 134}
132 135
133 136
134void MyPty::error() 137void MyPty::error()
135{ 138{
136 // This is code from the Qt DumbTerminal example 139 // This is code from the Qt DumbTerminal example
137 donePty(); 140 donePty();
138} 141}
139 142
140void MyPty::start() { 143void MyPty::start() {
141 char* cmd = "/bin/sh"; 144 char* cmd = "/bin/sh";
142 QStrList lis; 145 QStrList lis;
143 int r =run(cmd, lis, 0, 0); 146 int r =run(cmd, lis, 0, 0);
144 r = r; 147 r = r;
145} 148}
146/*! 149/*!
147 start the client program. 150 start the client program.
148*/ 151*/
149int MyPty::run(const char* cmd, QStrList &, const char*, int) 152int MyPty::run(const char* cmd, QStrList &, const char*, int)
150{ 153{
151 // This is code from the Qt DumbTerminal example 154 // This is code from the Qt DumbTerminal example
152 m_cpid = fork(); 155 m_cpid = fork();
153 156
154 if ( !m_cpid ) { 157 if ( !m_cpid ) {
155 // child - exec shell on tty 158 // child - exec shell on tty
156 for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL); 159 for (int sig = 1; sig < NSIG; sig++) signal(sig,SIG_DFL);
157 int ttyfd = ::open(m_ttynam, O_RDWR); 160 int ttyfd = ::open(m_ttynam, O_RDWR);
158 dup2(ttyfd, STDIN_FILENO); 161 dup2(ttyfd, STDIN_FILENO);
159 dup2(ttyfd, STDOUT_FILENO); 162 dup2(ttyfd, STDOUT_FILENO);
160 dup2(ttyfd, STDERR_FILENO); 163 dup2(ttyfd, STDERR_FILENO);
161 // should be done with tty, so close it 164 // should be done with tty, so close it
162 ::close(ttyfd); 165 ::close(ttyfd);
163 static struct termios ttmode; 166 static struct termios ttmode;
164 if ( setsid() < 0 ) 167 if ( setsid() < 0 )
165 perror( "failed to set process group" ); 168 perror( "failed to set process group" );
166#if defined (TIOCSCTTY) 169#if defined (TIOCSCTTY)
167 // grabbed from APUE by Stevens 170 // grabbed from APUE by Stevens
168 ioctl(STDIN_FILENO, TIOCSCTTY, 0); 171 ioctl(STDIN_FILENO, TIOCSCTTY, 0);
169#endif 172#endif
170 tcgetattr( STDIN_FILENO, &ttmode ); 173 tcgetattr( STDIN_FILENO, &ttmode );
171 ttmode.c_cc[VINTR] = 3; 174 ttmode.c_cc[VINTR] = 3;
172 ttmode.c_cc[VERASE] = 8; 175 ttmode.c_cc[VERASE] = 8;
173 tcsetattr( STDIN_FILENO, TCSANOW, &ttmode ); 176 tcsetattr( STDIN_FILENO, TCSANOW, &ttmode );
174 setenv("TERM","vt100",1); 177 setenv("TERM","vt100",1);
175 setenv("COLORTERM","0",1); 178 setenv("COLORTERM","0",1);
176 179
177 if (getuid() == 0) { 180 if (getuid() == 0) {
178 char msg[] = "WARNING: You are running this shell as root!\n"; 181 char msg[] = "WARNING: You are running this shell as root!\n";
179 write(ttyfd, msg, sizeof(msg)); 182 write(ttyfd, msg, sizeof(msg));
180 } 183 }
181 execl(cmd, cmd, 0); 184 execl(cmd, cmd, 0);
182 185
183 donePty(); 186 donePty();
184 exit(-1); 187 exit(-1);
185 } 188 }
186 189
187 // parent - continue as a widget 190 // parent - continue as a widget
188 QSocketNotifier* sn_r = new QSocketNotifier(m_fd,QSocketNotifier::Read,this); 191 delete m_sn_r;
192 m_sn_r = new QSocketNotifier(m_fd,QSocketNotifier::Read,this);
189 delete m_sn_e; 193 delete m_sn_e;
190 m_sn_e = new QSocketNotifier(m_fd,QSocketNotifier::Exception,this); 194 m_sn_e = new QSocketNotifier(m_fd,QSocketNotifier::Exception,this);
191 connect(sn_r,SIGNAL(activated(int)),this,SLOT(readPty())); 195 connect(m_sn_r,SIGNAL(activated(int)),this,SLOT(readPty()));
192 connect(m_sn_e,SIGNAL(activated(int)),this,SLOT(error())); 196 connect(m_sn_e,SIGNAL(activated(int)),this,SLOT(error()));
193 197
194 return 0; 198 return 0;
195} 199}
196 200
197int MyPty::openPty() 201int MyPty::openPty()
198{ 202{
199 // This is code from the Qt DumbTerminal example 203 // This is code from the Qt DumbTerminal example
200 int ptyfd = -1; 204 int ptyfd = -1;
201 205
202#ifdef HAVE_OPENPTY 206#ifdef HAVE_OPENPTY
203 int ttyfd; 207 int ttyfd;
204 if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) ) 208 if ( openpty(&ptyfd,&ttyfd,ttynam,0,0) )
205 ptyfd = -1; 209 ptyfd = -1;
206 else 210 else
207 close(ttyfd); // we open the ttynam ourselves. 211 close(ttyfd); // we open the ttynam ourselves.
208#else 212#else
209 for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) { 213 for (const char* c0 = "pqrstuvwxyzabcde"; ptyfd < 0 && *c0 != 0; c0++) {
210 for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) { 214 for (const char* c1 = "0123456789abcdef"; ptyfd < 0 && *c1 != 0; c1++) {
211 sprintf(m_ptynam,"/dev/pty%c%c",*c0,*c1); 215 sprintf(m_ptynam,"/dev/pty%c%c",*c0,*c1);
212 sprintf(m_ttynam,"/dev/tty%c%c",*c0,*c1); 216 sprintf(m_ttynam,"/dev/tty%c%c",*c0,*c1);
213 if ((ptyfd = ::open(m_ptynam,O_RDWR)) >= 0) { 217 if ((ptyfd = ::open(m_ptynam,O_RDWR)) >= 0) {
214 if (geteuid() != 0 && !access(m_ttynam,R_OK|W_OK) == 0) { 218 if (geteuid() != 0 && !access(m_ttynam,R_OK|W_OK) == 0) {
215 ::close(ptyfd); 219 ::close(ptyfd);
216 ptyfd = -1; 220 ptyfd = -1;
217 } 221 }
218 } 222 }
219 } 223 }
220 } 224 }
221#endif 225#endif
222 226
223 if ( ptyfd < 0 ) { 227 if ( ptyfd < 0 ) {
224 qApp->exit(1); 228 //qApp->exit(1);
225 return -1; 229 return -1;
226 } 230 }
227 231
228 return ptyfd; 232 return ptyfd;
229} 233}
230 234
231/*! 235/*!
232 Create an instance. 236 Create an instance.
233*/ 237*/
234MyPty::MyPty(const Profile&) : m_cpid(0) 238MyPty::MyPty(const Profile&) : m_cpid(0)
235{ 239{
236 m_sn_e = 0l; 240 m_sn_e = 0l;
241 m_sn_r = 0l;
237 m_fd = openPty(); 242 m_fd = openPty();
238 ProcCtl* ctl = ProcCtl::self(); 243 ProcCtl* ctl = ProcCtl::self();
239} 244}
240 245
241/*! 246/*!
242 Destructor. 247 Destructor.
243 Note that the related client program is not killed 248 Note that the related client program is not killed
244 (yet) when a instance is deleted. 249 (yet) when a instance is deleted.
245*/ 250*/
246MyPty::~MyPty() 251MyPty::~MyPty()
247{ 252{
248 donePty(); 253 donePty();
249} 254}
250QString MyPty::identifier()const { 255QString MyPty::identifier()const {
251 return QString::fromLatin1("term"); 256 return QString::fromLatin1("term");
252} 257}
253QString MyPty::name()const{ 258QString MyPty::name()const{
254 return identifier(); 259 return identifier();
255} 260}
256bool MyPty::open() { 261bool MyPty::open() {
262 if (m_fd < 0)
263 m_fd = openPty();
264
257 start(); 265 start();
258 return true; 266 return true;
259} 267}
260void MyPty::close() { 268void MyPty::close() {
261 donePty(); 269 donePty();
270 m_fd = openPty();
262} 271}
263void MyPty::reload( const Profile& ) { 272void MyPty::reload( const Profile& ) {
264 273
265} 274}
266/*! sends len bytes through the line */ 275/*! sends len bytes through the line */
267void MyPty::send(const QByteArray& ar) 276void MyPty::send(const QByteArray& ar)
268{ 277{
269#ifdef VERBOSE_DEBUG 278#ifdef VERBOSE_DEBUG
270 // verbose debug 279 // verbose debug
271 printf("sending bytes:\n"); 280 printf("sending bytes:\n");
272 for (uint i = 0; i < ar.count(); i++) 281 for (uint i = 0; i < ar.count(); i++)
273 printf("%c", ar[i]); 282 printf("%c", ar[i]);
274 printf("\n"); 283 printf("\n");
275#endif 284#endif
276 285
277 ::write(m_fd, ar.data(), ar.count()); 286 ::write(m_fd, ar.data(), ar.count());
278} 287}
279 288
280/*! indicates that a block of data is received */ 289/*! indicates that a block of data is received */
281void MyPty::readPty() 290void MyPty::readPty()
282{ 291{
283 QByteArray buf(4096); 292 QByteArray buf(4096);
284 293
285 int len = ::read( m_fd, buf.data(), 4096 ); 294 int len = ::read( m_fd, buf.data(), 4096 );
286 295
287 if (len == -1 || len == 0) { 296 if (len == -1 || len == 0) {
288 donePty(); 297 donePty();
289 delete sender();
290 return; 298 return;
291 } 299 }
292 300
293 if (len < 0) 301 if (len < 0)
294 return; 302 return;
295 303
296 304
297 buf.resize(len); 305 buf.resize(len);
298 emit received(buf); 306 emit received(buf);
299 307
300#ifdef VERBOSE_DEBUG 308#ifdef VERBOSE_DEBUG
301 // verbose debug 309 // verbose debug
302 printf("read bytes:\n"); 310 printf("read bytes:\n");
303 for (uint i = 0; i < buf.count(); i++) 311 for (uint i = 0; i < buf.count(); i++)
304 printf("%c", buf[i]); 312 printf("%c", buf[i]);
305 printf("\n"); 313 printf("\n");
306#endif 314#endif
307 315
308} 316}
317QBitArray MyPty::supports()const {
318 QBitArray ar(3);
319 ar[0] = 1;
320 ar[1] = 0;
321 ar[2] = 0;
309 322
323 return ar;
324}
diff --git a/noncore/apps/opie-console/MyPty.h b/noncore/apps/opie-console/MyPty.h
index 3166fa0..ad271df 100644
--- a/noncore/apps/opie-console/MyPty.h
+++ b/noncore/apps/opie-console/MyPty.h
@@ -1,97 +1,99 @@
1/* -------------------------------------------------------------------------- */ 1/* -------------------------------------------------------------------------- */
2/* */ 2/* */
3/* [MyPty.h] Pseudo Terminal Device */ 3/* [MyPty.h] Pseudo Terminal Device */
4/* */ 4/* */
5/* -------------------------------------------------------------------------- */ 5/* -------------------------------------------------------------------------- */
6/* */ 6/* */
7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */ 7/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */
8/* */ 8/* */
9/* This file is part of Konsole - an X terminal for KDE */ 9/* This file is part of Konsole - an X terminal for KDE */
10/* */ 10/* */
11/* -------------------------------------------------------------------------- */ 11/* -------------------------------------------------------------------------- */
12 /* */ 12 /* */
13/* Ported Konsole to Qt/Embedded */ 13/* Ported Konsole to Qt/Embedded */
14 /* */ 14 /* */
15/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */ 15/* Copyright (C) 2000 by John Ryland <jryland@trolltech.com> */
16 /* */ 16 /* */
17/* -------------------------------------------------------------------------- */ 17/* -------------------------------------------------------------------------- */
18 18
19/*! \file 19/*! \file
20*/ 20*/
21 21
22#ifndef MY_PTY_H 22#ifndef MY_PTY_H
23#define MY_PTY_H 23#define MY_PTY_H
24 24
25#include <qobject.h> 25#include <qobject.h>
26#include <qstrlist.h> 26#include <qstrlist.h>
27 27
28#include "io_layer.h" 28#include "io_layer.h"
29 29
30class Profile; 30class Profile;
31class QSocketNotifier; 31class QSocketNotifier;
32class MyPty : public IOLayer 32class MyPty : public IOLayer
33{ 33{
34 Q_OBJECT 34 Q_OBJECT
35public: 35public:
36 36
37 MyPty(const Profile&); 37 MyPty(const Profile&);
38 ~MyPty(); 38 ~MyPty();
39 39
40 40
41 41
42 QString identifier()const; 42 QString identifier()const;
43 QString name()const; 43 QString name()const;
44 QBitArray supports()const;
44 45
45 public slots: 46 public slots:
46 /*! 47 /*!
47 having a `run' separate from the constructor allows to make 48 having a `run' separate from the constructor allows to make
48 the necessary connections to the signals and slots of the 49 the necessary connections to the signals and slots of the
49 instance before starting the execution of the client. 50 instance before starting the execution of the client.
50 */ 51 */
51 void start(); 52 void start();
52 int run(const char* pgm, QStrList & args , const char* term, int addutmp); 53 int run(const char* pgm, QStrList & args , const char* term, int addutmp);
53 bool open(); 54 bool open();
54 void close(); 55 void close();
55 void reload( const Profile& ); 56 void reload( const Profile& );
56 void setSize(int lines, int columns); 57 void setSize(int lines, int columns);
57 void error(); 58 void error();
58 59
59 signals: 60 signals:
60 61
61 /*! 62 /*!
62 emitted when the client program terminates. 63 emitted when the client program terminates.
63 \param status the wait(2) status code of the terminated client program. 64 \param status the wait(2) status code of the terminated client program.
64 */ 65 */
65 void done(int status); 66 void done(int status);
66 67
67 /*! 68 /*!
68 emitted when a new block of data comes in. 69 emitted when a new block of data comes in.
69 \param s - the data 70 \param s - the data
70 \param len - the length of the block 71 \param len - the length of the block
71 */ 72 */
72 void received(const QByteArray&); 73 void received(const QByteArray&);
73 74
74 public slots: 75 public slots:
75 76
76 void send(const QByteArray& ); 77 void send(const QByteArray& );
77 78
78private: 79private:
79 const char* deviceName(); 80 const char* deviceName();
80 81
81protected slots: 82protected slots:
82 void readPty(); 83 void readPty();
83 void donePty(); 84 void donePty();
84 85
85private: 86private:
86 int openPty(); 87 int openPty();
87 88
88private: 89private:
89 90
90 char m_ptynam[16]; // "/dev/ptyxx" | "/dev/ptmx" 91 char m_ptynam[16]; // "/dev/ptyxx" | "/dev/ptmx"
91 char m_ttynam[16]; // "/dev/ttyxx" | "/dev/pts/########..." 92 char m_ttynam[16]; // "/dev/ttyxx" | "/dev/pts/########..."
92 int m_fd; 93 int m_fd;
93 int m_cpid; 94 int m_cpid;
94 QSocketNotifier* m_sn_e; 95 QSocketNotifier* m_sn_e;
96 QSocketNotifier* m_sn_r;
95}; 97};
96 98
97#endif 99#endif
diff --git a/noncore/apps/opie-console/io_layer.h b/noncore/apps/opie-console/io_layer.h
index 5f2fa3c..4977e94 100644
--- a/noncore/apps/opie-console/io_layer.h
+++ b/noncore/apps/opie-console/io_layer.h
@@ -1,110 +1,124 @@
1#ifndef OPIE_IO_LAYER_H 1#ifndef OPIE_IO_LAYER_H
2#define OPIE_IO_LAYER_H 2#define OPIE_IO_LAYER_H
3 3
4#include <qbitarray.h>
4#include <qobject.h> 5#include <qobject.h>
6
7
5#include <qpe/config.h> 8#include <qpe/config.h>
6 9
7#include "profile.h" 10#include "profile.h"
8 11
9/** 12/**
10 * This is the base class for IO Layers 13 * This is the base class for IO Layers
11 * It will used to sent and recv data( QByteArray ) 14 * It will used to sent and recv data( QByteArray )
12 * it 15 * it
13 */ 16 */
14class IOLayer : public QObject { 17class IOLayer : public QObject {
15 Q_OBJECT 18 Q_OBJECT
16public: 19public:
17 enum Error { 20 enum Error {
18 NoError = -1, 21 NoError = -1,
19 Refuse = 0, 22 Refuse = 0,
20 CouldNotOpen =1, 23 CouldNotOpen =1,
21 ClosedUnexpected =2, 24 ClosedUnexpected =2,
22 ClosedError =3, 25 ClosedError =3,
23 Terminate = 4 26 Terminate = 4
24 /* add more errors here */ 27 /* add more errors here */
25 }; 28 };
29 enum Feature {
30 AutoConnect = 0,
31 TransferFile =1,
32 Close =2
33 };
26 /** 34 /**
27 * a small c'tor 35 * a small c'tor
28 */ 36 */
29 IOLayer(); 37 IOLayer();
30 38
31 /** 39 /**
32 * create an IOLayer instance from a config file 40 * create an IOLayer instance from a config file
33 * the currently set group stores the profile/session 41 * the currently set group stores the profile/session
34 * information 42 * information
35 */ 43 */
36 IOLayer( const Profile& ); 44 IOLayer( const Profile& );
37 45
38 /** 46 /**
39 * destructor 47 * destructor
40 */ 48 */
41 virtual ~IOLayer(); 49 virtual ~IOLayer();
42 50
43 /** 51 /**
44 * a small internal identifier 52 * a small internal identifier
45 */ 53 */
46 virtual QString identifier() const = 0; 54 virtual QString identifier() const = 0;
47 55
48 /** 56 /**
49 * a short name 57 * a short name
50 */ 58 */
51 virtual QString name() const = 0; 59 virtual QString name() const = 0;
52 60
53 /** 61 /**
54 * a file descriptor which opens 62 * a file descriptor which opens
55 * the device for io but does not 63 * the device for io but does not
56 * do any ioctling on it... 64 * do any ioctling on it...
57 * and it'll stop listening to the before opened 65 * and it'll stop listening to the before opened
58 * device 66 * device
59 */ 67 */
60 virtual int rawIO()const; 68 virtual int rawIO()const;
61 69
62 /** 70 /**
63 * will close the rawIO stuff 71 * will close the rawIO stuff
64 * and will listen to it's data again... 72 * and will listen to it's data again...
65 */ 73 */
66 virtual void closeRawIO(int); 74 virtual void closeRawIO(int);
67 75
76 /**
77 * What does the IOLayer support?
78 * Bits are related to features
79 */
80 virtual QBitArray supports()const = 0;
68 81
69signals: 82signals:
70 /** 83 /**
71 * received input as QCString 84 * received input as QCString
72 */ 85 */
73 virtual void received( const QByteArray& ); 86 virtual void received( const QByteArray& );
74 87
75 /** 88 /**
76 * an error occured 89 * an error occured
77 * int for the error number 90 * int for the error number
78 * and QString for a text 91 * and QString for a text
79 */ 92 */
80 virtual void error( int, const QString& ); 93 virtual void error( int, const QString& );
81 94
95 virtual void closed();
82public slots: 96public slots:
83 /** 97 /**
84 * send a QCString to the device 98 * send a QCString to the device
85 */ 99 */
86 virtual void send( const QByteArray& ) = 0; 100 virtual void send( const QByteArray& ) = 0;
87 101
88 /** 102 /**
89 * bool open 103 * bool open
90 */ 104 */
91 virtual bool open() = 0; 105 virtual bool open() = 0;
92 106
93 /** 107 /**
94 * close the io 108 * close the io
95 */ 109 */
96 virtual void close() = 0; 110 virtual void close() = 0;
97 111
98 /** 112 /**
99 * closes and reloads the settings 113 * closes and reloads the settings
100 */ 114 */
101 virtual void reload( const Profile& ) = 0; 115 virtual void reload( const Profile& ) = 0;
102 116
103 /** 117 /**
104 * set the size 118 * set the size
105 * needed for pty 119 * needed for pty
106 */ 120 */
107 virtual void setSize(int rows, int cols ); 121 virtual void setSize(int rows, int cols );
108}; 122};
109 123
110#endif 124#endif
diff --git a/noncore/apps/opie-console/io_serial.cpp b/noncore/apps/opie-console/io_serial.cpp
index a4a6f0b..c10d5a8 100644
--- a/noncore/apps/opie-console/io_serial.cpp
+++ b/noncore/apps/opie-console/io_serial.cpp
@@ -1,189 +1,196 @@
1#include <fcntl.h> 1#include <fcntl.h>
2#include <termios.h> 2#include <termios.h>
3#include <errno.h> 3#include <errno.h>
4#include <unistd.h> 4#include <unistd.h>
5#include "io_serial.h" 5#include "io_serial.h"
6 6
7IOSerial::IOSerial(const Profile &config) : IOLayer(config) { 7IOSerial::IOSerial(const Profile &config) : IOLayer(config) {
8 m_read = 0l; 8 m_read = 0l;
9 m_error = 0l; 9 m_error = 0l;
10 m_fd = 0; 10 m_fd = 0;
11 reload(config); 11 reload(config);
12} 12}
13 13
14 14
15IOSerial::~IOSerial() { 15IOSerial::~IOSerial() {
16 if (m_fd) { 16 if (m_fd) {
17 close(); 17 close();
18 } 18 }
19} 19}
20 20
21void IOSerial::send(const QByteArray &data) { 21void IOSerial::send(const QByteArray &data) {
22 if (m_fd) { 22 if (m_fd) {
23 write(m_fd, data.data(), data.size()); 23 write(m_fd, data.data(), data.size());
24 } else { 24 } else {
25 emit error(Refuse, tr("Not connected")); 25 emit error(Refuse, tr("Not connected"));
26 } 26 }
27} 27}
28 28
29void IOSerial::close() { 29void IOSerial::close() {
30 if (m_fd) { 30 if (m_fd) {
31 delete m_read; 31 delete m_read;
32 delete m_error; 32 delete m_error;
33 ::close(m_fd); 33 ::close(m_fd);
34 m_fd = 0; 34 m_fd = 0;
35 } else { 35 } else {
36 emit error(Refuse, tr("Not connected")); 36 emit error(Refuse, tr("Not connected"));
37 } 37 }
38} 38}
39 39
40bool IOSerial::open() { 40bool IOSerial::open() {
41 if (!m_fd) { 41 if (!m_fd) {
42 struct termios tty; 42 struct termios tty;
43 m_fd = ::open(m_device, O_RDWR | O_NOCTTY | O_NONBLOCK); 43 m_fd = ::open(m_device, O_RDWR | O_NOCTTY | O_NONBLOCK);
44 if (m_fd < 0) { 44 if (m_fd < 0) {
45 emit error(CouldNotOpen, strerror(errno)); 45 emit error(CouldNotOpen, strerror(errno));
46 return FALSE; 46 return FALSE;
47 } 47 }
48 tcgetattr(m_fd, &tty); 48 tcgetattr(m_fd, &tty);
49 49
50 /* Baud rate */ 50 /* Baud rate */
51 int speed = baud(m_baud); 51 int speed = baud(m_baud);
52 if (speed == -1) { 52 if (speed == -1) {
53 emit error(Refuse, tr("Invalid baud rate")); 53 emit error(Refuse, tr("Invalid baud rate"));
54 } 54 }
55 cfsetospeed(&tty, speed); 55 cfsetospeed(&tty, speed);
56 cfsetispeed(&tty, speed); 56 cfsetispeed(&tty, speed);
57 57
58 /* Take care of Space / Mark parity */ 58 /* Take care of Space / Mark parity */
59 if (m_dbits == 7 && (m_parity == ParitySpace || m_parity == ParityMark)) { 59 if (m_dbits == 7 && (m_parity == ParitySpace || m_parity == ParityMark)) {
60 m_dbits = 8; 60 m_dbits = 8;
61 } 61 }
62 62
63 /* Data bits */ 63 /* Data bits */
64 switch (m_dbits) { 64 switch (m_dbits) {
65 case 5: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5; break; 65 case 5: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5; break;
66 case 6: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6; break; 66 case 6: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6; break;
67 case 7: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7; break; 67 case 7: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7; break;
68 case 8: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; break; 68 case 8: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; break;
69 default: break; 69 default: break;
70 } 70 }
71 71
72 /* Raw, no echo mode */ 72 /* Raw, no echo mode */
73 tty.c_iflag = IGNBRK; 73 tty.c_iflag = IGNBRK;
74 tty.c_lflag = 0; 74 tty.c_lflag = 0;
75 tty.c_oflag = 0; 75 tty.c_oflag = 0;
76 tty.c_cflag |= CLOCAL | CREAD; 76 tty.c_cflag |= CLOCAL | CREAD;
77 77
78 /* Stop bits */ 78 /* Stop bits */
79 if (m_sbits == 2) { 79 if (m_sbits == 2) {
80 tty.c_cflag |= CSTOPB; 80 tty.c_cflag |= CSTOPB;
81 } else { 81 } else {
82 tty.c_cflag &= ~CSTOPB; 82 tty.c_cflag &= ~CSTOPB;
83 } 83 }
84 84
85 tty.c_cc[VMIN] = 1; 85 tty.c_cc[VMIN] = 1;
86 tty.c_cc[VTIME] = 5; 86 tty.c_cc[VTIME] = 5;
87 87
88 /* Flow control */ 88 /* Flow control */
89 if (m_flow & FlowSW) 89 if (m_flow & FlowSW)
90 tty.c_iflag |= IXON | IXOFF; 90 tty.c_iflag |= IXON | IXOFF;
91 else 91 else
92 tty.c_iflag &= ~(IXON|IXOFF|IXANY); 92 tty.c_iflag &= ~(IXON|IXOFF|IXANY);
93 93
94 if (m_flow & FlowHW) 94 if (m_flow & FlowHW)
95 tty.c_cflag |= CRTSCTS; 95 tty.c_cflag |= CRTSCTS;
96 else 96 else
97 tty.c_cflag &= ~CRTSCTS; 97 tty.c_cflag &= ~CRTSCTS;
98 98
99 /* Parity */ 99 /* Parity */
100 tty.c_cflag &= ~(PARENB | PARODD); 100 tty.c_cflag &= ~(PARENB | PARODD);
101 if (m_parity & ParityEven) 101 if (m_parity & ParityEven)
102 tty.c_cflag |= PARENB; 102 tty.c_cflag |= PARENB;
103 else if (m_parity & ParityOdd) 103 else if (m_parity & ParityOdd)
104 tty.c_cflag |= (PARENB | PARODD); 104 tty.c_cflag |= (PARENB | PARODD);
105 105
106 /* Set the changes */ 106 /* Set the changes */
107 tcsetattr(m_fd, TCSANOW, &tty); 107 tcsetattr(m_fd, TCSANOW, &tty);
108 108
109 /* Notifications on read & errors */ 109 /* Notifications on read & errors */
110 m_read = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); 110 m_read = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
111 m_error = new QSocketNotifier(m_fd, QSocketNotifier::Exception, this); 111 m_error = new QSocketNotifier(m_fd, QSocketNotifier::Exception, this);
112 connect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived())); 112 connect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived()));
113 connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured())); 113 connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured()));
114 return TRUE; 114 return TRUE;
115 } else { 115 } else {
116 emit error(Refuse, tr("Device is already connected")); 116 emit error(Refuse, tr("Device is already connected"));
117 m_fd = 0; 117 m_fd = 0;
118 return FALSE; 118 return FALSE;
119 } 119 }
120} 120}
121 121
122void IOSerial::reload(const Profile &config) { 122void IOSerial::reload(const Profile &config) {
123 m_device = config.readEntry("Device", SERIAL_DEFAULT_DEVICE); 123 m_device = config.readEntry("Device", SERIAL_DEFAULT_DEVICE);
124 m_baud = config.readNumEntry("Speed", SERIAL_DEFAULT_BAUD); 124 m_baud = config.readNumEntry("Speed", SERIAL_DEFAULT_BAUD);
125 m_parity = config.readNumEntry("Parity", SERIAL_DEFAULT_PARITY); 125 m_parity = config.readNumEntry("Parity", SERIAL_DEFAULT_PARITY);
126 m_dbits = config.readNumEntry("DataBits", SERIAL_DEFAULT_DBITS); 126 m_dbits = config.readNumEntry("DataBits", SERIAL_DEFAULT_DBITS);
127 m_sbits = config.readNumEntry("StopBits", SERIAL_DEFAULT_SBITS); 127 m_sbits = config.readNumEntry("StopBits", SERIAL_DEFAULT_SBITS);
128 m_flow = config.readNumEntry("Flow", SERIAL_DEFAULT_FLOW); 128 m_flow = config.readNumEntry("Flow", SERIAL_DEFAULT_FLOW);
129 129
130} 130}
131 131
132int IOSerial::baud(int baud) const { 132int IOSerial::baud(int baud) const {
133 switch (baud) { 133 switch (baud) {
134 case 300: return B300; break; 134 case 300: return B300; break;
135 case 600: return B600; break; 135 case 600: return B600; break;
136 case 1200: return B1200; break; 136 case 1200: return B1200; break;
137 case 2400: return B2400; break; 137 case 2400: return B2400; break;
138 case 4800: return B4800; break; 138 case 4800: return B4800; break;
139 case 9600: return B9600; break; 139 case 9600: return B9600; break;
140 case 19200: return B19200; break; 140 case 19200: return B19200; break;
141 case 38400: return B38400; break; 141 case 38400: return B38400; break;
142 case 57600: return B57600; break; 142 case 57600: return B57600; break;
143 case 115200: return B115200; break; 143 case 115200: return B115200; break;
144 } 144 }
145 return -1; 145 return -1;
146} 146}
147 147
148void IOSerial::errorOccured() { 148void IOSerial::errorOccured() {
149 emit error(ClosedUnexpected, strerror(errno)); 149 emit error(ClosedUnexpected, strerror(errno));
150 close(); 150 close();
151} 151}
152 152
153void IOSerial::dataArrived() { 153void IOSerial::dataArrived() {
154 QByteArray array(4097); 154 QByteArray array(4097);
155 155
156 int len = read(m_fd, array.data(), 4096); 156 int len = read(m_fd, array.data(), 4096);
157 if (len == 0) 157 if (len == 0)
158 close(); 158 close();
159 if (len < 0) 159 if (len < 0)
160 return; 160 return;
161 array.resize( len ); 161 array.resize( len );
162 emit received(array); 162 emit received(array);
163} 163}
164 164
165QString IOSerial::identifier() const { 165QString IOSerial::identifier() const {
166 return "serial"; 166 return "serial";
167} 167}
168 168
169QString IOSerial::name() const { 169QString IOSerial::name() const {
170 return "RS232 Serial IO Layer"; 170 return "RS232 Serial IO Layer";
171} 171}
172int IOSerial::rawIO()const { 172int IOSerial::rawIO()const {
173 if (m_read ) 173 if (m_read )
174 disconnect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived())); 174 disconnect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived()));
175 if (m_error ) 175 if (m_error )
176 disconnect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured())); 176 disconnect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured()));
177 177
178 int fd = ::open(m_device, O_RDWR ); 178 int fd = ::open(m_device, O_RDWR );
179 179
180 return fd; 180 return fd;
181}; 181};
182void IOSerial::closeRawIO(int fd) { 182void IOSerial::closeRawIO(int fd) {
183 if (m_read ) 183 if (m_read )
184 connect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived())); 184 connect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived()));
185 if (m_error ) 185 if (m_error )
186 connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured())); 186 connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured()));
187 187
188 ::close( fd ); 188 ::close( fd );
189} 189}
190QBitArray IOSerial::supports()const {
191 QBitArray ar(3);
192 ar[0] = ar[2] = 0;
193 ar[1] = 1;
194
195 return ar;
196}
diff --git a/noncore/apps/opie-console/io_serial.h b/noncore/apps/opie-console/io_serial.h
index facbbc1..b1d1be1 100644
--- a/noncore/apps/opie-console/io_serial.h
+++ b/noncore/apps/opie-console/io_serial.h
@@ -1,65 +1,67 @@
1#ifndef OPIE_IO_SERIAL 1#ifndef OPIE_IO_SERIAL
2#define OPIE_IO_SERIAL 2#define OPIE_IO_SERIAL
3 3
4#include <qsocketnotifier.h> 4#include <qsocketnotifier.h>
5#include "io_layer.h" 5#include "io_layer.h"
6 6
7/* Default values to be used if the profile information is incomplete */ 7/* Default values to be used if the profile information is incomplete */
8#define SERIAL_DEFAULT_DEVICE "/dev/ttyS0" 8#define SERIAL_DEFAULT_DEVICE "/dev/ttyS0"
9#define SERIAL_DEFAULT_BAUD 9600 9#define SERIAL_DEFAULT_BAUD 9600
10#define SERIAL_DEFAULT_PARITY 0 10#define SERIAL_DEFAULT_PARITY 0
11#define SERIAL_DEFAULT_DBITS 8 11#define SERIAL_DEFAULT_DBITS 8
12#define SERIAL_DEFAULT_SBITS 1 12#define SERIAL_DEFAULT_SBITS 1
13#define SERIAL_DEFAULT_FLOW 0 13#define SERIAL_DEFAULT_FLOW 0
14 14
15/* IOSerial implements a RS232 IO Layer */ 15/* IOSerial implements a RS232 IO Layer */
16 16
17class IOSerial : public IOLayer { 17class IOSerial : public IOLayer {
18 Q_OBJECT 18 Q_OBJECT
19public: 19public:
20 enum Parity { 20 enum Parity {
21 ParityNone = 0, 21 ParityNone = 0,
22 ParityEven, 22 ParityEven,
23 ParityOdd, 23 ParityOdd,
24 ParitySpace, 24 ParitySpace,
25 ParityMark 25 ParityMark
26 }; 26 };
27 27
28 enum Flow { 28 enum Flow {
29 FlowHW = 0x01, 29 FlowHW = 0x01,
30 FlowSW = 0x02 30 FlowSW = 0x02
31 }; 31 };
32 32
33 IOSerial(const Profile &); 33 IOSerial(const Profile &);
34 ~IOSerial(); 34 ~IOSerial();
35 35
36 QString identifier() const; 36 QString identifier() const;
37 QString name() const; 37 QString name() const;
38 int rawIO()const; 38 int rawIO()const;
39 void closeRawIO(int fd ); 39 void closeRawIO(int fd );
40signals: 40 QBitArray supports()const;
41/*signals:
41 void received(const QByteArray &); 42 void received(const QByteArray &);
42 void error(int, const QString &); 43 void error(int, const QString &);
44*/
43public slots: 45public slots:
44 void send(const QByteArray &); 46 void send(const QByteArray &);
45 bool open(); 47 bool open();
46 void close(); 48 void close();
47 void reload(const Profile &); 49 void reload(const Profile &);
48protected: 50protected:
49 int baud(int baud) const; 51 int baud(int baud) const;
50protected slots: 52protected slots:
51 void dataArrived(); 53 void dataArrived();
52 void errorOccured(); 54 void errorOccured();
53protected: 55protected:
54 QSocketNotifier *m_read; 56 QSocketNotifier *m_read;
55 QSocketNotifier *m_error; 57 QSocketNotifier *m_error;
56 QString m_device; 58 QString m_device;
57 int m_baud; 59 int m_baud;
58 int m_parity; 60 int m_parity;
59 int m_dbits; 61 int m_dbits;
60 int m_sbits; 62 int m_sbits;
61 int m_flow; 63 int m_flow;
62 int m_fd; 64 int m_fd;
63}; 65};
64 66
65#endif /* OPIE_IO_SERIAL */ 67#endif /* OPIE_IO_SERIAL */
diff --git a/noncore/apps/opie-console/mainwindow.cpp b/noncore/apps/opie-console/mainwindow.cpp
index 94c99bc..29dbcf3 100644
--- a/noncore/apps/opie-console/mainwindow.cpp
+++ b/noncore/apps/opie-console/mainwindow.cpp
@@ -1,476 +1,478 @@
1#include <assert.h> 1#include <assert.h>
2 2
3 3
4 4
5#include <qaction.h> 5#include <qaction.h>
6#include <qmenubar.h> 6#include <qmenubar.h>
7#include <qlabel.h> 7#include <qlabel.h>
8#include <qpopupmenu.h> 8#include <qpopupmenu.h>
9#include <qtoolbar.h> 9#include <qtoolbar.h>
10#include <qmessagebox.h> 10#include <qmessagebox.h>
11#include <qpushbutton.h> 11#include <qpushbutton.h>
12 12
13#include <qpe/resource.h> 13#include <qpe/resource.h>
14#include <opie/ofiledialog.h> 14#include <opie/ofiledialog.h>
15 15
16 16
17#include "keytrans.h" 17#include "keytrans.h"
18#include "profileeditordialog.h" 18#include "profileeditordialog.h"
19#include "configdialog.h" 19#include "configdialog.h"
20#include "default.h" 20#include "default.h"
21#include "metafactory.h" 21#include "metafactory.h"
22#include "profile.h" 22#include "profile.h"
23#include "profilemanager.h" 23#include "profilemanager.h"
24#include "mainwindow.h" 24#include "mainwindow.h"
25#include "tabwidget.h" 25#include "tabwidget.h"
26#include "transferdialog.h" 26#include "transferdialog.h"
27#include "function_keyboard.h" 27#include "function_keyboard.h"
28#include "script.h" 28#include "script.h"
29 29
30 30
31 31
32static char * menu_xpm[] = { 32static char * menu_xpm[] = {
33"12 12 5 1", 33"12 12 5 1",
34 " c None", 34 " c None",
35 ".c #000000", 35 ".c #000000",
36 "+c #FFFDAD", 36 "+c #FFFDAD",
37 "@c #FFFF00", 37 "@c #FFFF00",
38 "#c #E5E100", 38 "#c #E5E100",
39" ", 39" ",
40" ", 40" ",
41" ......... ", 41" ......... ",
42" .+++++++. ", 42" .+++++++. ",
43" .+@@@@#. ", 43" .+@@@@#. ",
44" .+@@@#. ", 44" .+@@@#. ",
45" .+@@#. ", 45" .+@@#. ",
46" .+@#. ", 46" .+@#. ",
47" .+#. ", 47" .+#. ",
48" .+. ", 48" .+. ",
49" .. ", 49" .. ",
50" "}; 50" "};
51 51
52 52
53MainWindow::MainWindow() { 53MainWindow::MainWindow() {
54 KeyTrans::loadAll(); 54 KeyTrans::loadAll();
55 for (int i = 0; i < KeyTrans::count(); i++ ) { 55 for (int i = 0; i < KeyTrans::count(); i++ ) {
56 KeyTrans* s = KeyTrans::find(i ); 56 KeyTrans* s = KeyTrans::find(i );
57 assert( s ); 57 assert( s );
58 } 58 }
59 m_factory = new MetaFactory(); 59 m_factory = new MetaFactory();
60 Default def(m_factory); 60 Default def(m_factory);
61 m_sessions.setAutoDelete( TRUE ); 61 m_sessions.setAutoDelete( TRUE );
62 m_curSession = 0; 62 m_curSession = 0;
63 m_manager = new ProfileManager( m_factory ); 63 m_manager = new ProfileManager( m_factory );
64 m_manager->load(); 64 m_manager->load();
65 65
66 initUI(); 66 initUI();
67 populateProfiles(); 67 populateProfiles();
68} 68}
69void MainWindow::initUI() { 69void MainWindow::initUI() {
70 setToolBarsMovable( FALSE ); 70 setToolBarsMovable( FALSE );
71 71
72 /* tool bar for the menu */ 72 /* tool bar for the menu */
73 m_tool = new QToolBar( this ); 73 m_tool = new QToolBar( this );
74 m_tool->setHorizontalStretchable( TRUE ); 74 m_tool->setHorizontalStretchable( TRUE );
75 75
76 m_bar = new QMenuBar( m_tool ); 76 m_bar = new QMenuBar( m_tool );
77 m_console = new QPopupMenu( this ); 77 m_console = new QPopupMenu( this );
78 m_scripts = new QPopupMenu( this ); 78 m_scripts = new QPopupMenu( this );
79 m_sessionsPop= new QPopupMenu( this ); 79 m_sessionsPop= new QPopupMenu( this );
80 m_settings = new QPopupMenu( this ); 80 m_settings = new QPopupMenu( this );
81 81
82 /* add a toolbar for icons */ 82 /* add a toolbar for icons */
83 m_icons = new QToolBar(this); 83 m_icons = new QToolBar(this);
84 84
85 /* 85 /*
86 * new Action for new sessions 86 * new Action for new sessions
87 */ 87 */
88 QAction* a = new QAction(tr("New Connection"), 88 QAction* a = new QAction(tr("New Connection"),
89 Resource::loadPixmap( "new" ), 89 Resource::loadPixmap( "new" ),
90 QString::null, 0, this, 0); 90 QString::null, 0, this, 0);
91 a->addTo( m_console ); 91 a->addTo( m_console );
92 a->addTo( m_icons ); 92 a->addTo( m_icons );
93 connect(a, SIGNAL(activated() ), 93 connect(a, SIGNAL(activated() ),
94 this, SLOT(slotNew() ) ); 94 this, SLOT(slotNew() ) );
95 95
96 /* 96 /*
97 * connect action 97 * connect action
98 */ 98 */
99 m_connect = new QAction(); 99 m_connect = new QAction();
100 m_connect->setText( tr("Connect") ); 100 m_connect->setText( tr("Connect") );
101 m_connect->addTo( m_console ); 101 m_connect->addTo( m_console );
102 connect(m_connect, SIGNAL(activated() ), 102 connect(m_connect, SIGNAL(activated() ),
103 this, SLOT(slotConnect() ) ); 103 this, SLOT(slotConnect() ) );
104 104
105 /* 105 /*
106 * disconnect action 106 * disconnect action
107 */ 107 */
108 m_disconnect = new QAction(); 108 m_disconnect = new QAction();
109 m_disconnect->setText( tr("Disconnect") ); 109 m_disconnect->setText( tr("Disconnect") );
110 m_disconnect->addTo( m_console ); 110 m_disconnect->addTo( m_console );
111 connect(m_disconnect, SIGNAL(activated() ), 111 connect(m_disconnect, SIGNAL(activated() ),
112 this, SLOT(slotDisconnect() ) ); 112 this, SLOT(slotDisconnect() ) );
113 113
114 m_transfer = new QAction(); 114 m_transfer = new QAction();
115 m_transfer->setText( tr("Transfer file...") ); 115 m_transfer->setText( tr("Transfer file...") );
116 m_transfer->addTo( m_console ); 116 m_transfer->addTo( m_console );
117 connect(m_transfer, SIGNAL(activated() ), 117 connect(m_transfer, SIGNAL(activated() ),
118 this, SLOT(slotTransfer() ) ); 118 this, SLOT(slotTransfer() ) );
119 119
120 120
121 /* 121 /*
122 * fullscreen 122 * fullscreen
123 */ 123 */
124 m_isFullscreen = false; 124 m_isFullscreen = false;
125 125
126 m_fullscreen = new QAction( tr("Full screen"), Resource::loadPixmap( "fullscreen" ) 126 m_fullscreen = new QAction( tr("Full screen"), Resource::loadPixmap( "fullscreen" )
127 , QString::null, 0, this, 0); 127 , QString::null, 0, this, 0);
128 m_fullscreen->addTo( m_console ); 128 m_fullscreen->addTo( m_console );
129 m_fullscreen->addTo( m_icons ); 129 m_fullscreen->addTo( m_icons );
130 connect( m_fullscreen, SIGNAL( activated() ), 130 connect( m_fullscreen, SIGNAL( activated() ),
131 this, SLOT( slotFullscreen() ) ); 131 this, SLOT( slotFullscreen() ) );
132 132
133 /* 133 /*
134 * terminate action 134 * terminate action
135 */ 135 */
136 m_terminate = new QAction(); 136 m_terminate = new QAction();
137 m_terminate->setText( tr("Terminate") ); 137 m_terminate->setText( tr("Terminate") );
138 m_terminate->addTo( m_console ); 138 m_terminate->addTo( m_console );
139 connect(m_terminate, SIGNAL(activated() ), 139 connect(m_terminate, SIGNAL(activated() ),
140 this, SLOT(slotTerminate() ) ); 140 this, SLOT(slotTerminate() ) );
141 141
142 m_closewindow = new QAction(); 142 m_closewindow = new QAction();
143 m_closewindow->setText( tr("Close Window") ); 143 m_closewindow->setText( tr("Close Window") );
144 m_closewindow->addTo( m_console ); 144 m_closewindow->addTo( m_console );
145 connect( m_closewindow, SIGNAL(activated() ), 145 connect( m_closewindow, SIGNAL(activated() ),
146 this, SLOT(slotClose() ) ); 146 this, SLOT(slotClose() ) );
147 147
148 /* 148 /*
149 * the settings action 149 * the settings action
150 */ 150 */
151 m_setProfiles = new QAction(tr("Configure Profiles"), 151 m_setProfiles = new QAction(tr("Configure Profiles"),
152 Resource::loadPixmap( "SettingsIcon" ), 152 Resource::loadPixmap( "SettingsIcon" ),
153 QString::null, 0, this, 0); 153 QString::null, 0, this, 0);
154 m_setProfiles->addTo( m_settings ); 154 m_setProfiles->addTo( m_settings );
155 m_setProfiles->addTo( m_icons ); 155 m_setProfiles->addTo( m_icons );
156 connect( m_setProfiles, SIGNAL(activated() ), 156 connect( m_setProfiles, SIGNAL(activated() ),
157 this, SLOT(slotConfigure() ) ); 157 this, SLOT(slotConfigure() ) );
158 158
159 /* 159 /*
160 * script actions 160 * script actions
161 */ 161 */
162 m_recordScript = new QAction(tr("Record Script"), QString::null, 0, this, 0); 162 m_recordScript = new QAction(tr("Record Script"), QString::null, 0, this, 0);
163 m_recordScript->addTo(m_scripts); 163 m_recordScript->addTo(m_scripts);
164 connect(m_recordScript, SIGNAL(activated()), this, SLOT(slotRecordScript())); 164 connect(m_recordScript, SIGNAL(activated()), this, SLOT(slotRecordScript()));
165 165
166 m_saveScript = new QAction(tr("Save Script"), QString::null, 0, this, 0); 166 m_saveScript = new QAction(tr("Save Script"), QString::null, 0, this, 0);
167 m_saveScript->addTo(m_scripts); 167 m_saveScript->addTo(m_scripts);
168 connect(m_saveScript, SIGNAL(activated()), this, SLOT(slotSaveScript())); 168 connect(m_saveScript, SIGNAL(activated()), this, SLOT(slotSaveScript()));
169 169
170 m_runScript = new QAction(tr("Run Script"), QString::null, 0, this, 0); 170 m_runScript = new QAction(tr("Run Script"), QString::null, 0, this, 0);
171 m_runScript->addTo(m_scripts); 171 m_runScript->addTo(m_scripts);
172 connect(m_runScript, SIGNAL(activated()), this, SLOT(slotRunScript())); 172 connect(m_runScript, SIGNAL(activated()), this, SLOT(slotRunScript()));
173 173
174 /* 174 /*
175 * action that open/closes the keyboard 175 * action that open/closes the keyboard
176 */ 176 */
177 m_openKeys = new QAction (tr("Open Keyboard..."), 177 m_openKeys = new QAction (tr("Open Keyboard..."),
178 Resource::loadPixmap( "down" ), 178 Resource::loadPixmap( "down" ),
179 QString::null, 0, this, 0); 179 QString::null, 0, this, 0);
180 180
181 m_openKeys->setToggleAction(true); 181 m_openKeys->setToggleAction(true);
182 182
183 connect (m_openKeys, SIGNAL(toggled(bool)), 183 connect (m_openKeys, SIGNAL(toggled(bool)),
184 this, SLOT(slotOpenKeb(bool))); 184 this, SLOT(slotOpenKeb(bool)));
185 m_openKeys->addTo(m_icons); 185 m_openKeys->addTo(m_icons);
186 186
187 187
188 /* insert the submenu */ 188 /* insert the submenu */
189 m_console->insertItem(tr("New from Profile"), m_sessionsPop, 189 m_console->insertItem(tr("New from Profile"), m_sessionsPop,
190 -1, 0); 190 -1, 0);
191 191
192 /* insert the connection menu */ 192 /* insert the connection menu */
193 m_bar->insertItem( tr("Connection"), m_console ); 193 m_bar->insertItem( tr("Connection"), m_console );
194 194
195 /* the scripts menu */ 195 /* the scripts menu */
196 m_bar->insertItem( tr("Scripts"), m_scripts ); 196 m_bar->insertItem( tr("Scripts"), m_scripts );
197 197
198 /* the settings menu */ 198 /* the settings menu */
199 m_bar->insertItem( tr("Settings"), m_settings ); 199 m_bar->insertItem( tr("Settings"), m_settings );
200 200
201 /* and the keyboard */ 201 /* and the keyboard */
202 m_keyBar = new QToolBar(this); 202 m_keyBar = new QToolBar(this);
203 addToolBar( m_keyBar, "Keyboard", QMainWindow::Top, TRUE ); 203 addToolBar( m_keyBar, "Keyboard", QMainWindow::Top, TRUE );
204 m_keyBar->setHorizontalStretchable( TRUE ); 204 m_keyBar->setHorizontalStretchable( TRUE );
205 m_keyBar->hide(); 205 m_keyBar->hide();
206 206
207 m_kb = new FunctionKeyboard(m_keyBar); 207 m_kb = new FunctionKeyboard(m_keyBar);
208 208
209 209
210 210
211 m_connect->setEnabled( false ); 211 m_connect->setEnabled( false );
212 m_disconnect->setEnabled( false ); 212 m_disconnect->setEnabled( false );
213 m_terminate->setEnabled( false ); 213 m_terminate->setEnabled( false );
214 m_transfer->setEnabled( false ); 214 m_transfer->setEnabled( false );
215 m_recordScript->setEnabled( false ); 215 m_recordScript->setEnabled( false );
216 m_saveScript->setEnabled( false ); 216 m_saveScript->setEnabled( false );
217 m_runScript->setEnabled( false ); 217 m_runScript->setEnabled( false );
218 m_fullscreen->setEnabled( false ); 218 m_fullscreen->setEnabled( false );
219 m_closewindow->setEnabled( false ); 219 m_closewindow->setEnabled( false );
220 220
221 /* 221 /*
222 * connect to the menu activation 222 * connect to the menu activation
223 */ 223 */
224 connect( m_sessionsPop, SIGNAL(activated( int ) ), 224 connect( m_sessionsPop, SIGNAL(activated( int ) ),
225 this, SLOT(slotProfile( int ) ) ); 225 this, SLOT(slotProfile( int ) ) );
226 226
227 m_consoleWindow = new TabWidget( this, "blah"); 227 m_consoleWindow = new TabWidget( this, "blah");
228 connect(m_consoleWindow, SIGNAL(activated(Session*) ), 228 connect(m_consoleWindow, SIGNAL(activated(Session*) ),
229 this, SLOT(slotSessionChanged(Session*) ) ); 229 this, SLOT(slotSessionChanged(Session*) ) );
230 setCentralWidget( m_consoleWindow ); 230 setCentralWidget( m_consoleWindow );
231 231
232} 232}
233 233
234ProfileManager* MainWindow::manager() { 234ProfileManager* MainWindow::manager() {
235 return m_manager; 235 return m_manager;
236} 236}
237TabWidget* MainWindow::tabWidget() { 237TabWidget* MainWindow::tabWidget() {
238 return m_consoleWindow; 238 return m_consoleWindow;
239} 239}
240void MainWindow::populateProfiles() { 240void MainWindow::populateProfiles() {
241 m_sessionsPop->clear(); 241 m_sessionsPop->clear();
242 Profile::ValueList list = manager()->all(); 242 Profile::ValueList list = manager()->all();
243 for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) { 243 for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) {
244 m_sessionsPop->insertItem( (*it).name() ); 244 m_sessionsPop->insertItem( (*it).name() );
245 } 245 }
246 246
247} 247}
248MainWindow::~MainWindow() { 248MainWindow::~MainWindow() {
249 delete m_factory; 249 delete m_factory;
250 manager()->save(); 250 manager()->save();
251} 251}
252 252
253MetaFactory* MainWindow::factory() { 253MetaFactory* MainWindow::factory() {
254 return m_factory; 254 return m_factory;
255} 255}
256 256
257Session* MainWindow::currentSession() { 257Session* MainWindow::currentSession() {
258 return m_curSession; 258 return m_curSession;
259} 259}
260 260
261QList<Session> MainWindow::sessions() { 261QList<Session> MainWindow::sessions() {
262 return m_sessions; 262 return m_sessions;
263} 263}
264 264
265void MainWindow::slotNew() { 265void MainWindow::slotNew() {
266 ProfileEditorDialog dlg(factory() ); 266 ProfileEditorDialog dlg(factory() );
267 dlg.showMaximized(); 267 dlg.showMaximized();
268 int ret = dlg.exec(); 268 int ret = dlg.exec();
269 269
270 if ( ret == QDialog::Accepted ) { 270 if ( ret == QDialog::Accepted ) {
271 create( dlg.profile() ); 271 create( dlg.profile() );
272 } 272 }
273} 273}
274 274
275void MainWindow::slotRecordScript() { 275void MainWindow::slotRecordScript() {
276/* if (currentSession()) { 276/* if (currentSession()) {
277 currentSession()->emulationLayer()->startRecording(); 277 currentSession()->emulationLayer()->startRecording();
278 } 278 }
279 */ 279 */
280} 280}
281 281
282void MainWindow::slotSaveScript() { 282void MainWindow::slotSaveScript() {
283/* if (currentSession() && currentSession()->emulationLayer()->isRecording()) { 283/* if (currentSession() && currentSession()->emulationLayer()->isRecording()) {
284 MimeTypes types; 284 MimeTypes types;
285 QStringList script; 285 QStringList script;
286 script << "text/plain"; 286 script << "text/plain";
287 types.insert("Script", script); 287 types.insert("Script", script);
288 QString filename = OFileDialog::getSaveFileName(2, "/", QString::null, types); 288 QString filename = OFileDialog::getSaveFileName(2, "/", QString::null, types);
289 if (!filename.isEmpty()) { 289 if (!filename.isEmpty()) {
290 currentSession()->emulationLayer()->script()->saveTo(filename); 290 currentSession()->emulationLayer()->script()->saveTo(filename);
291 currentSession()->emulationLayer()->clearScript(); 291 currentSession()->emulationLayer()->clearScript();
292 } 292 }
293 } 293 }
294 */ 294 */
295} 295}
296 296
297void MainWindow::slotRunScript() { 297void MainWindow::slotRunScript() {
298/* 298/*
299 if (currentSession()) { 299 if (currentSession()) {
300 MimeTypes types; 300 MimeTypes types;
301 QStringList script; 301 QStringList script;
302 script << "text/plain"; 302 script << "text/plain";
303 types.insert("Script", script); 303 types.insert("Script", script);
304 QString filename = OFileDialog::getOpenFileName(2, "/", QString::null, types); 304 QString filename = OFileDialog::getOpenFileName(2, "/", QString::null, types);
305 if (!filename.isEmpty()) { 305 if (!filename.isEmpty()) {
306 Script script(DocLnk(filename).file()); 306 Script script(DocLnk(filename).file());
307 currentSession()->emulationLayer()->runScript(&script); 307 currentSession()->emulationLayer()->runScript(&script);
308 } 308 }
309 } 309 }
310 */ 310 */
311} 311}
312 312
313void MainWindow::slotConnect() { 313void MainWindow::slotConnect() {
314 if ( currentSession() ) { 314 if ( currentSession() ) {
315 bool ret = currentSession()->layer()->open(); 315 bool ret = currentSession()->layer()->open();
316 if(!ret) QMessageBox::warning(currentSession()->widgetStack(), 316 if(!ret) QMessageBox::warning(currentSession()->widgetStack(),
317 QObject::tr("Failed"), 317 QObject::tr("Failed"),
318 QObject::tr("Connecting failed for this session.")); 318 QObject::tr("Connecting failed for this session."));
319 m_connect->setEnabled( false ); 319 m_connect->setEnabled( false );
320 m_disconnect->setEnabled( true ); 320 m_disconnect->setEnabled( true );
321 } 321 }
322} 322}
323 323
324void MainWindow::slotDisconnect() { 324void MainWindow::slotDisconnect() {
325 if ( currentSession() ) { 325 if ( currentSession() ) {
326 currentSession()->layer()->close(); 326 currentSession()->layer()->close();
327 m_connect->setEnabled( true ); 327 m_connect->setEnabled( true );
328 m_disconnect->setEnabled( false ); 328 m_disconnect->setEnabled( false );
329 } 329 }
330} 330}
331 331
332void MainWindow::slotTerminate() { 332void MainWindow::slotTerminate() {
333 if ( currentSession() ) 333 if ( currentSession() )
334 currentSession()->layer()->close(); 334 currentSession()->layer()->close();
335 335
336 slotClose(); 336 slotClose();
337 /* FIXME move to the next session */ 337 /* FIXME move to the next session */
338} 338}
339 339
340void MainWindow::slotConfigure() { 340void MainWindow::slotConfigure() {
341 ConfigDialog conf( manager()->all(), factory() ); 341 ConfigDialog conf( manager()->all(), factory() );
342 conf.showMaximized(); 342 conf.showMaximized();
343 343
344 int ret = conf.exec(); 344 int ret = conf.exec();
345 345
346 if ( QDialog::Accepted == ret ) { 346 if ( QDialog::Accepted == ret ) {
347 manager()->setProfiles( conf.list() ); 347 manager()->setProfiles( conf.list() );
348 manager()->save(); 348 manager()->save();
349 populateProfiles(); 349 populateProfiles();
350 } 350 }
351} 351}
352/* 352/*
353 * we will remove 353 * we will remove
354 * this window from the tabwidget 354 * this window from the tabwidget
355 * remove it from the list 355 * remove it from the list
356 * delete it 356 * delete it
357 * and set the currentSession() 357 * and set the currentSession()
358 */ 358 */
359void MainWindow::slotClose() { 359void MainWindow::slotClose() {
360 if (!currentSession() ) 360 if (!currentSession() )
361 return; 361 return;
362 362
363 Session* ses = currentSession();
364 qWarning("removing! currentSession %s", currentSession()->name().latin1() );
363 tabWidget()->remove( currentSession() ); 365 tabWidget()->remove( currentSession() );
364 /*it's autodelete */ 366 /*it's autodelete */
365 m_sessions.remove( m_curSession ); 367 m_sessions.remove( ses );
366 m_curSession = m_sessions.first(); 368 qWarning("after remove!!");
367 tabWidget()->setCurrent( m_curSession );
368 369
369 if (!currentSession() ) { 370 if (!currentSession() ) {
370 m_connect->setEnabled( false ); 371 m_connect->setEnabled( false );
371 m_disconnect->setEnabled( false ); 372 m_disconnect->setEnabled( false );
372 m_terminate->setEnabled( false ); 373 m_terminate->setEnabled( false );
373 m_transfer->setEnabled( false ); 374 m_transfer->setEnabled( false );
374 m_recordScript->setEnabled( false ); 375 m_recordScript->setEnabled( false );
375 m_saveScript->setEnabled( false ); 376 m_saveScript->setEnabled( false );
376 m_runScript->setEnabled( false ); 377 m_runScript->setEnabled( false );
377 m_fullscreen->setEnabled( false ); 378 m_fullscreen->setEnabled( false );
378 m_closewindow->setEnabled( false ); 379 m_closewindow->setEnabled( false );
379 } 380 }
380} 381}
381 382
382/* 383/*
383 * We will get the name 384 * We will get the name
384 * Then the profile 385 * Then the profile
385 * and then we will make a profile 386 * and then we will make a profile
386 */ 387 */
387void MainWindow::slotProfile( int id) { 388void MainWindow::slotProfile( int id) {
388 Profile prof = manager()->profile( m_sessionsPop->text( id) ); 389 Profile prof = manager()->profile( m_sessionsPop->text( id) );
389 create( prof ); 390 create( prof );
390} 391}
391void MainWindow::create( const Profile& prof ) { 392void MainWindow::create( const Profile& prof ) {
392 Session *ses = manager()->fromProfile( prof, tabWidget() ); 393 Session *ses = manager()->fromProfile( prof, tabWidget() );
393 394
394 if((!ses) || (!ses->layer()) || (!ses->widgetStack())) 395 if((!ses) || (!ses->layer()) || (!ses->widgetStack()))
395 { 396 {
396 QMessageBox::warning(this, 397 QMessageBox::warning(this,
397 QObject::tr("Session failed"), 398 QObject::tr("Session failed"),
398 QObject::tr("Cannot open session: Not all components were found.")); 399 QObject::tr("<qt>Cannot open session: Not all components were found.</qt>"));
399 //if(ses) delete ses; 400 //if(ses) delete ses;
400 return; 401 return;
401 } 402 }
402 403
403 m_sessions.append( ses ); 404 m_sessions.append( ses );
404 tabWidget()->add( ses ); 405 tabWidget()->add( ses );
405 m_curSession = ses; 406 m_curSession = ses;
406 407
407 // dicide if its a local term ( then no connction and no tranfer), maybe make a wrapper method out of it 408 // dicide if its a local term ( then no connction and no tranfer), maybe make a wrapper method out of it
408 m_connect->setEnabled( true ); 409 m_connect->setEnabled( true );
409 m_disconnect->setEnabled( false ); 410 m_disconnect->setEnabled( false );
410 m_terminate->setEnabled( true ); 411 m_terminate->setEnabled( true );
411 m_transfer->setEnabled( true ); 412 m_transfer->setEnabled( true );
412 m_recordScript->setEnabled( true ); 413 m_recordScript->setEnabled( true );
413 m_saveScript->setEnabled( true ); 414 m_saveScript->setEnabled( true );
414 m_runScript->setEnabled( true ); 415 m_runScript->setEnabled( true );
415 m_fullscreen->setEnabled( true ); 416 m_fullscreen->setEnabled( true );
416 m_closewindow->setEnabled( true ); 417 m_closewindow->setEnabled( true );
417} 418}
418 419
419void MainWindow::slotTransfer() 420void MainWindow::slotTransfer()
420{ 421{
421 if ( currentSession() ) { 422 if ( currentSession() ) {
422 TransferDialog dlg(this); 423 TransferDialog dlg(this);
423 dlg.showMaximized(); 424 dlg.showMaximized();
424 dlg.exec(); 425 dlg.exec();
425 } 426 }
426} 427}
427 428
428 429
429void MainWindow::slotOpenKeb(bool state) { 430void MainWindow::slotOpenKeb(bool state) {
430 431
431 if (state) m_keyBar->show(); 432 if (state) m_keyBar->show();
432 else m_keyBar->hide(); 433 else m_keyBar->hide();
433 434
434} 435}
435void MainWindow::slotSessionChanged( Session* ses ) { 436void MainWindow::slotSessionChanged( Session* ses ) {
437 qWarning("changed!");
436 if ( ses ) { 438 if ( ses ) {
437 m_curSession = ses; 439 m_curSession = ses;
438 440
439 if ( m_curSession->isConnected() ) { 441 if ( m_curSession->isConnected() ) {
440 m_connect->setEnabled( false ); 442 m_connect->setEnabled( false );
441 m_disconnect->setEnabled( true ); 443 m_disconnect->setEnabled( true );
442 } else { 444 } else {
443 m_connect->setEnabled( true ); 445 m_connect->setEnabled( true );
444 m_disconnect->setEnabled( false ); 446 m_disconnect->setEnabled( false );
445 } 447 }
446 } 448 }
447} 449}
448 450
449void MainWindow::slotFullscreen() { 451void MainWindow::slotFullscreen() {
450 452
451 if ( m_isFullscreen ) { 453 if ( m_isFullscreen ) {
452 ( m_curSession->widgetStack() )->reparent( m_consoleWindow, 0, QPoint(0,0), false ); 454 ( m_curSession->widgetStack() )->reparent( m_consoleWindow, 0, QPoint(0,0), false );
453 ( m_curSession->widgetStack() )->setFrameStyle( QFrame::Panel | QFrame::Sunken ); 455 ( m_curSession->widgetStack() )->setFrameStyle( QFrame::Panel | QFrame::Sunken );
454 setCentralWidget( m_consoleWindow ); 456 setCentralWidget( m_consoleWindow );
455 ( m_curSession->widgetStack() )->show(); 457 ( m_curSession->widgetStack() )->show();
456 m_fullscreen->setText( tr("Full screen") ); 458 m_fullscreen->setText( tr("Full screen") );
457 459
458 } else { 460 } else {
459 ( m_curSession->widgetStack() )->setFrameStyle( QFrame::NoFrame ); 461 ( m_curSession->widgetStack() )->setFrameStyle( QFrame::NoFrame );
460 ( m_curSession->widgetStack() )->reparent( 0,WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop, 462 ( m_curSession->widgetStack() )->reparent( 0,WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop,
461 QPoint(0,0), false); 463 QPoint(0,0), false);
462 ( m_curSession->widgetStack() )->resize(qApp->desktop()->width(), qApp->desktop()->height()); 464 ( m_curSession->widgetStack() )->resize(qApp->desktop()->width(), qApp->desktop()->height());
463 ( m_curSession->widgetStack() )->setFocus(); 465 ( m_curSession->widgetStack() )->setFocus();
464 ( m_curSession->widgetStack() )->show(); 466 ( m_curSession->widgetStack() )->show();
465 467
466 //QPushButton *cornerButton = new QPushButton( ); 468 //QPushButton *cornerButton = new QPushButton( );
467 //cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) ); 469 //cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) );
468 //connect( cornerButton, SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) ); 470 //connect( cornerButton, SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) );
469 // need teh scrollbar 471 // need teh scrollbar
470 // ( m_curSession->widgetStack() )->setCornerWidget( cornerButton ); 472 // ( m_curSession->widgetStack() )->setCornerWidget( cornerButton );
471 m_fullscreen->setText( tr("Stop full screen") ); 473 m_fullscreen->setText( tr("Stop full screen") );
472 } 474 }
473 475
474 m_isFullscreen = !m_isFullscreen; 476 m_isFullscreen = !m_isFullscreen;
475 477
476} 478}
diff --git a/noncore/apps/opie-console/profilemanager.cpp b/noncore/apps/opie-console/profilemanager.cpp
index e5aedb6..7c15560 100644
--- a/noncore/apps/opie-console/profilemanager.cpp
+++ b/noncore/apps/opie-console/profilemanager.cpp
@@ -1,142 +1,135 @@
1#include <stdio.h> 1#include <stdio.h>
2#include <stdlib.h> 2#include <stdlib.h>
3 3
4#include <qfile.h> 4#include <qfile.h>
5#include <qhbox.h>
5#include <qlayout.h> 6#include <qlayout.h>
6#include <qwidgetstack.h> 7#include <qwidgetstack.h>
7 8
8#include <qpe/config.h> 9#include <qpe/config.h>
9 10
10#include "emulation_handler.h" 11#include "emulation_handler.h"
11#include "widget_layer.h" 12#include "widget_layer.h"
12#include "emulation_widget.h" 13#include "emulation_widget.h"
13#include "metafactory.h" 14#include "metafactory.h"
14#include "profileconfig.h" 15#include "profileconfig.h"
15#include "profilemanager.h" 16#include "profilemanager.h"
16 17
17ProfileManager::ProfileManager( MetaFactory* fact ) 18ProfileManager::ProfileManager( MetaFactory* fact )
18 : m_fact( fact ) 19 : m_fact( fact )
19{ 20{
20 21
21} 22}
22ProfileManager::~ProfileManager() { 23ProfileManager::~ProfileManager() {
23 24
24} 25}
25void ProfileManager::load() { 26void ProfileManager::load() {
26 m_list.clear(); 27 m_list.clear();
27 ProfileConfig conf("opie-console-profiles"); 28 ProfileConfig conf("opie-console-profiles");
28 QStringList groups = conf.groups(); 29 QStringList groups = conf.groups();
29 QStringList::Iterator it; 30 QStringList::Iterator it;
30 31
31 /* 32 /*
32 * for each profile 33 * for each profile
33 */ 34 */
34 for ( it = groups.begin(); it != groups.end(); ++it ) { 35 for ( it = groups.begin(); it != groups.end(); ++it ) {
35 conf.setGroup( (*it) ); 36 conf.setGroup( (*it) );
36 Profile prof; 37 Profile prof;
37 prof.setName( conf.readEntry("name") ); 38 prof.setName( conf.readEntry("name") );
38 prof.setIOLayer( conf.readEntry("iolayer").utf8() ); 39 prof.setIOLayer( conf.readEntry("iolayer").utf8() );
39 prof.setTerminalName( conf.readEntry("term").utf8() ); 40 prof.setTerminalName( conf.readEntry("term").utf8() );
40 prof.setBackground( conf.readNumEntry("back") ); 41 prof.setBackground( conf.readNumEntry("back") );
41 prof.setForeground( conf.readNumEntry("fore") ); 42 prof.setForeground( conf.readNumEntry("fore") );
42 prof.setTerminal( conf.readNumEntry("terminal") ); 43 prof.setTerminal( conf.readNumEntry("terminal") );
43 44
44 // THIS is evil because all data get's reset 45 // THIS is evil because all data get's reset
45 prof.setConf( conf.items( (*it) ) ); 46 prof.setConf( conf.items( (*it) ) );
46 47
47 /* now add it */ 48 /* now add it */
48 m_list.append( prof ); 49 m_list.append( prof );
49 } 50 }
50 51
51} 52}
52void ProfileManager::clear() { 53void ProfileManager::clear() {
53 m_list.clear(); 54 m_list.clear();
54} 55}
55Profile::ValueList ProfileManager::all()const { 56Profile::ValueList ProfileManager::all()const {
56 return m_list; 57 return m_list;
57} 58}
58/* 59/*
59 * Our goal is to create a Session 60 * Our goal is to create a Session
60 * We will load the the IOLayer and EmulationLayer 61 * We will load the the IOLayer and EmulationLayer
61 * from the factory 62 * from the factory
62 * we will generate a QWidgetStack 63 * we will generate a QWidgetStack
63 * add a dummy widget with layout 64 * add a dummy widget with layout
64 * add "Widget" to the layout 65 * add "Widget" to the layout
65 * add the dummy to the stack 66 * add the dummy to the stack
66 * raise the dummy 67 * raise the dummy
67 * call session->connect(= 68 * call session->connect(=
68 * this way we only need to reparent 69 * this way we only need to reparent
69 * in TabWidget 70 * in TabWidget
70 */ 71 */
71Session* ProfileManager::fromProfile( const Profile& prof, QWidget* parent) { 72Session* ProfileManager::fromProfile( const Profile& prof, QWidget* parent) {
72/* TEST PROFILE!!! 73/* TEST PROFILE!!!
73 Profile prof; 74 Profile prof;
74 QString str = "/dev/ttyS0"; 75 QString str = "/dev/ttyS0";
75 prof.writeEntry("Device",str ); 76 prof.writeEntry("Device",str );
76 prof.writeEntry("Baud", 115200 ); 77 prof.writeEntry("Baud", 115200 );
77 prof.setIOLayer("serial"); 78 prof.setIOLayer("serial");
78 prof.setName( "test"); 79 prof.setName( "test");
79*/ 80*/
80 Session* session = new Session(); 81 Session* session = new Session();
81 session->setName( prof.name() ); 82 session->setName( prof.name() );
82 /* translate the internal name to the external */ 83 /* translate the internal name to the external */
83 session->setIOLayer(m_fact->newIOLayer( m_fact->external(prof.ioLayerName()) , 84 session->setIOLayer(m_fact->newIOLayer( m_fact->external(prof.ioLayerName()) ,
84 prof) ); 85 prof) );
85 86
86 QWidgetStack *stack = new QWidgetStack( parent ); 87 QWidgetStack *stack = new QWidgetStack( parent );
87 session->setWidgetStack( stack ); 88 session->setWidgetStack( stack );
88 QWidget* dummy = new QWidget( stack ); 89 QWidget* dummy = new QHBox( stack );
89 QHBoxLayout* lay = new QHBoxLayout( dummy ); 90 stack->raiseWidget( dummy );
90 stack->addWidget( dummy, 0 ); 91
91 stack->raiseWidget( 0 );
92 EmulationHandler* handler = new EmulationHandler(prof,dummy ); 92 EmulationHandler* handler = new EmulationHandler(prof,dummy );
93 session->setEmulationHandler( handler ); 93 session->setEmulationHandler( handler );
94 lay->addWidget( handler->widget() );
95// WidgetLayer* wid = new EmulationWidget( prof, dummy );
96// lay->addWidget( wid );
97
98// session->setEmulationWidget( wid );
99// session->setEmulationLayer( m_fact->newEmulationLayer( m_fact->external( prof.terminalName() ),
100// wid ) );
101 session->connect(); 94 session->connect();
102 95
103 return session; 96 return session;
104} 97}
105void ProfileManager::save( ) { 98void ProfileManager::save( ) {
106 QFile::remove( (QString(getenv("HOME") )+ "/Settings/opie-console-profiles.conf" ) ); 99 QFile::remove( (QString(getenv("HOME") )+ "/Settings/opie-console-profiles.conf" ) );
107 ProfileConfig conf("opie-console-profiles"); 100 ProfileConfig conf("opie-console-profiles");
108 Profile::ValueList::Iterator it2; 101 Profile::ValueList::Iterator it2;
109 for (it2 = m_list.begin(); it2 != m_list.end(); ++it2 ) { 102 for (it2 = m_list.begin(); it2 != m_list.end(); ++it2 ) {
110 conf.setGroup( (*it2).name() ); 103 conf.setGroup( (*it2).name() );
111 104
112 /* now the config stuff */ 105 /* now the config stuff */
113 QMap<QString, QString> map = (*it2).conf(); 106 QMap<QString, QString> map = (*it2).conf();
114 QMap<QString, QString>::Iterator confIt; 107 QMap<QString, QString>::Iterator confIt;
115 for ( confIt = map.begin(); confIt != map.end(); ++confIt ) { 108 for ( confIt = map.begin(); confIt != map.end(); ++confIt ) {
116 conf.writeEntry( confIt.key(), confIt.data() ); 109 conf.writeEntry( confIt.key(), confIt.data() );
117 } 110 }
118 111
119 conf.writeEntry( "name", (*it2).name() ); 112 conf.writeEntry( "name", (*it2).name() );
120 QString str = QString::fromUtf8( (*it2).ioLayerName() ); 113 QString str = QString::fromUtf8( (*it2).ioLayerName() );
121 114
122 conf.writeEntry( "iolayer", str ); 115 conf.writeEntry( "iolayer", str );
123 conf.writeEntry( "term", QString::fromUtf8( (*it2).terminalName() ) ); 116 conf.writeEntry( "term", QString::fromUtf8( (*it2).terminalName() ) );
124 conf.writeEntry( "back", (*it2).background() ); 117 conf.writeEntry( "back", (*it2).background() );
125 conf.writeEntry( "fore", (*it2).foreground() ); 118 conf.writeEntry( "fore", (*it2).foreground() );
126 conf.writeEntry( "terminal", (*it2).terminal() ); 119 conf.writeEntry( "terminal", (*it2).terminal() );
127 } 120 }
128} 121}
129void ProfileManager::setProfiles( const Profile::ValueList& list ) { 122void ProfileManager::setProfiles( const Profile::ValueList& list ) {
130 m_list = list; 123 m_list = list;
131}; 124};
132Profile ProfileManager::profile( const QString& name )const { 125Profile ProfileManager::profile( const QString& name )const {
133 Profile prof; 126 Profile prof;
134 Profile::ValueList::ConstIterator it; 127 Profile::ValueList::ConstIterator it;
135 for ( it = m_list.begin(); it != m_list.end(); ++it ) { 128 for ( it = m_list.begin(); it != m_list.end(); ++it ) {
136 if ( name == (*it).name() ) { 129 if ( name == (*it).name() ) {
137 prof = (*it); 130 prof = (*it);
138 break; 131 break;
139 } 132 }
140 } 133 }
141 return prof; 134 return prof;
142} 135}
diff --git a/noncore/apps/opie-console/session.cpp b/noncore/apps/opie-console/session.cpp
index e53dbc4..aad100d 100644
--- a/noncore/apps/opie-console/session.cpp
+++ b/noncore/apps/opie-console/session.cpp
@@ -1,99 +1,105 @@
1 1
2 2
3#include "io_layer.h" 3#include "io_layer.h"
4#include "file_layer.h" 4#include "file_layer.h"
5#include "emulation_handler.h" 5#include "emulation_handler.h"
6#include "session.h" 6#include "session.h"
7 7
8 8
9Session::Session() { 9Session::Session() {
10 m_widget = 0l; 10 m_widget = 0l;
11 m_layer = 0l; 11 m_layer = 0l;
12 m_emu = 0l; 12 m_emu = 0l;
13} 13}
14Session::Session( const QString& na, QWidgetStack* widget, IOLayer* lay) 14Session::Session( const QString& na, QWidgetStack* widget, IOLayer* lay)
15 : m_name( na ), m_widget( widget ), m_layer( lay ) 15 : m_name( na ), m_widget( widget ), m_layer( lay )
16{ 16{
17// m_widLay = 0l; 17// m_widLay = 0l;
18// m_emLay = 0l; 18// m_emLay = 0l;
19 m_emu = 0l; 19 m_emu = 0l;
20} 20}
21Session::~Session() { 21Session::~Session() {
22 delete m_layer; 22 delete m_layer;
23 delete m_emu; 23 delete m_emu;
24 delete m_widget; 24 delete m_widget;
25 /* the widget layer should be deleted by the m_widget */ 25 /* the widget layer should be deleted by the m_widget */
26} 26}
27QString Session::name()const { 27QString Session::name()const {
28 return m_name; 28 return m_name;
29} 29}
30QWidgetStack* Session::widgetStack() { 30QWidgetStack* Session::widgetStack() {
31 return m_widget; 31 return m_widget;
32} 32}
33IOLayer* Session::layer() { 33IOLayer* Session::layer() {
34 return m_layer; 34 return m_layer;
35} 35}
36EmulationHandler* Session::emulationHandler() { 36EmulationHandler* Session::emulationHandler() {
37 return m_emu; 37 return m_emu;
38} 38}
39QWidget* Session::widget() {
40 if (!m_emu )
41 return 0l;
42
43 return m_emu->widget();
44}
39/* 45/*
40WidgetLayer* Session::emulationWidget() { 46WidgetLayer* Session::emulationWidget() {
41 return m_widLay; 47 return m_widLay;
42} 48}
43*/ 49*/
44void Session::connect() { 50void Session::connect() {
45 if ( !m_layer || !m_emu ) 51 if ( !m_layer || !m_emu )
46 return; 52 return;
47 53
48 m_connected = true; 54 m_connected = true;
49 55
50 QObject::connect(m_layer, SIGNAL(received(const QByteArray&) ), 56 QObject::connect(m_layer, SIGNAL(received(const QByteArray&) ),
51 m_emu, SLOT(recv(const QByteArray&) ) ); 57 m_emu, SLOT(recv(const QByteArray&) ) );
52 QObject::connect(m_emu, SIGNAL(send(const QByteArray&) ), 58 QObject::connect(m_emu, SIGNAL(send(const QByteArray&) ),
53 m_layer, SLOT(send(const QByteArray&) ) ); 59 m_layer, SLOT(send(const QByteArray&) ) );
54} 60}
55 61
56void Session::disconnect() { 62void Session::disconnect() {
57 63
58 if ( !m_layer || !m_emu ) 64 if ( !m_layer || !m_emu )
59 return; 65 return;
60 66
61 m_connected = false; 67 m_connected = false;
62 68
63 QObject::disconnect(m_layer, SIGNAL(received(const QByteArray&) ), 69 QObject::disconnect(m_layer, SIGNAL(received(const QByteArray&) ),
64 m_emu, SLOT(recv(const QByteArray&) ) ); 70 m_emu, SLOT(recv(const QByteArray&) ) );
65 QObject::disconnect(m_emu, SIGNAL(send(const QByteArray&) ), 71 QObject::disconnect(m_emu, SIGNAL(send(const QByteArray&) ),
66 m_layer, SLOT(send(const QByteArray&) ) ); 72 m_layer, SLOT(send(const QByteArray&) ) );
67} 73}
68 74
69void Session::setName( const QString& na){ 75void Session::setName( const QString& na){
70 m_name = na; 76 m_name = na;
71} 77}
72 78
73void Session::setWidgetStack( QWidgetStack* wid ) { 79void Session::setWidgetStack( QWidgetStack* wid ) {
74 delete m_emu; 80 delete m_emu;
75 m_emu = 0l; 81 m_emu = 0l;
76 delete m_widget; 82 delete m_widget;
77 /* the EmulationLayer was destroyed... */ 83 /* the EmulationLayer was destroyed... */
78 84
79 m_widget = wid; 85 m_widget = wid;
80} 86}
81void Session::setIOLayer( IOLayer* lay ) { 87void Session::setIOLayer( IOLayer* lay ) {
82 delete m_layer; 88 delete m_layer;
83 m_layer = lay; 89 m_layer = lay;
84} 90}
85 91
86void Session::setEmulationHandler( EmulationHandler* lay ) { 92void Session::setEmulationHandler( EmulationHandler* lay ) {
87 delete m_emu; 93 delete m_emu;
88 m_emu = lay; 94 m_emu = lay;
89} 95}
90/* 96/*
91void Session::setEmulationWidget( WidgetLayer* lay ) { 97void Session::setEmulationWidget( WidgetLayer* lay ) {
92 delete m_widLay; 98 delete m_widLay;
93 m_widLay = lay; 99 m_widLay = lay;
94} 100}
95*/ 101*/
96 102
97bool Session::isConnected() { 103bool Session::isConnected() {
98 return m_connected; 104 return m_connected;
99} 105}
diff --git a/noncore/apps/opie-console/session.h b/noncore/apps/opie-console/session.h
index a1121d3..ff92df3 100644
--- a/noncore/apps/opie-console/session.h
+++ b/noncore/apps/opie-console/session.h
@@ -1,73 +1,74 @@
1#ifndef OPIE_SESSION_H 1#ifndef OPIE_SESSION_H
2#define OPIE_SESSION_H 2#define OPIE_SESSION_H
3 3
4#include <qwidgetstack.h> 4#include <qwidgetstack.h>
5 5
6class IOLayer; 6class IOLayer;
7class EmulationHandler; 7class EmulationHandler;
8/** 8/**
9 * This is a Session. A session contains 9 * This is a Session. A session contains
10 * a QWidget pointer and a IOLayer 10 * a QWidget pointer and a IOLayer
11 * Imagine a session like a collection of what 11 * Imagine a session like a collection of what
12 * is needed to show your widget in a tab ;) 12 * is needed to show your widget in a tab ;)
13 */ 13 */
14class Session { 14class Session {
15public: 15public:
16 /** 16 /**
17 * c'tor with widget and layer 17 * c'tor with widget and layer
18 * ownership get's transfered 18 * ownership get's transfered
19 */ 19 */
20 Session(); 20 Session();
21 Session( const QString&, QWidgetStack* widget, IOLayer* ); 21 Session( const QString&, QWidgetStack* widget, IOLayer* );
22 ~Session(); 22 ~Session();
23 23
24 /** 24 /**
25 * return the name of the session 25 * return the name of the session
26 */ 26 */
27 QString name()const; 27 QString name()const;
28 28
29 /** 29 /**
30 * return the widgetstack 30 * return the widgetstack
31 * this is used to be semi modal 31 * this is used to be semi modal
32 * for FileTransfer 32 * for FileTransfer
33 * 33 *
34 * semi modal == SessionModal 34 * semi modal == SessionModal
35 */ 35 */
36 QWidgetStack* widgetStack(); 36 QWidgetStack* widgetStack();
37 QWidget* widget();
37 38
38 /** 39 /**
39 * return the layer 40 * return the layer
40 */ 41 */
41 IOLayer* layer(); 42 IOLayer* layer();
42 43
43 EmulationHandler* emulationHandler(); 44 EmulationHandler* emulationHandler();
44 45
45 /* 46 /*
46 * connects the data flow from 47 * connects the data flow from
47 * the IOLayer to the EmulationLayer 48 * the IOLayer to the EmulationLayer
48 */ 49 */
49 void connect(); 50 void connect();
50 51
51 /* 52 /*
52 * disconnect the dataflow 53 * disconnect the dataflow
53 * this will be done for ft 54 * this will be done for ft
54 */ 55 */
55 void disconnect(); 56 void disconnect();
56 57
57 void setWidgetStack( QWidgetStack* widget ); 58 void setWidgetStack( QWidgetStack* widget );
58 void setEmulationHandler( EmulationHandler* lay ); 59 void setEmulationHandler( EmulationHandler* lay );
59 void setIOLayer( IOLayer* ); 60 void setIOLayer( IOLayer* );
60 void setName( const QString& ); 61 void setName( const QString& );
61 62
62 bool isConnected(); 63 bool isConnected();
63 64
64private: 65private:
65 QString m_name; 66 QString m_name;
66 QWidgetStack* m_widget; 67 QWidgetStack* m_widget;
67 IOLayer* m_layer; 68 IOLayer* m_layer;
68 EmulationHandler* m_emu; 69 EmulationHandler* m_emu;
69 bool m_connected; 70 bool m_connected;
70 71
71}; 72};
72 73
73#endif 74#endif
diff --git a/noncore/apps/opie-console/tabwidget.cpp b/noncore/apps/opie-console/tabwidget.cpp
index 8a691f9..419f8ac 100644
--- a/noncore/apps/opie-console/tabwidget.cpp
+++ b/noncore/apps/opie-console/tabwidget.cpp
@@ -1,43 +1,44 @@
1 1
2#include "tabwidget.h" 2#include "tabwidget.h"
3 3
4TabWidget::TabWidget( QWidget* parent, const char* name ) 4TabWidget::TabWidget( QWidget* parent, const char* name )
5 : OTabWidget( parent, name ) { 5 : OTabWidget( parent, name ) {
6 connect(this, SIGNAL( currentChanged(QWidget*) ), 6 connect(this, SIGNAL( currentChanged(QWidget*) ),
7 this, SLOT( slotCurChanged(QWidget*) ) ); 7 this, SLOT( slotCurChanged(QWidget*) ) );
8} 8}
9 9
10TabWidget::~TabWidget() { 10TabWidget::~TabWidget() {
11} 11}
12 12
13void TabWidget::add( Session* ses ) { 13void TabWidget::add( Session* ses ) {
14 qWarning("session ses " + ses->name() );
14 if ( !ses->widgetStack() ) return; 15 if ( !ses->widgetStack() ) return;
15 //reparent( ses->widgetStack(), QPoint() ); 16 //reparent( ses->widgetStack(), QPoint() );
16 addTab( ses->widgetStack(), "console/konsole", ses->name() ); 17 addTab( ses->widgetStack(), "console/konsole", ses->name() );
17 //addTab( ses->widgetStack(), ses->name() ); 18 //addTab( ses->widgetStack(), ses->name() );
18 m_map.insert( ses->widgetStack(), ses ); 19 m_map.insert( ses->widgetStack(), ses );
19} 20}
20 21
21void TabWidget::remove( Session* ses ) { 22void TabWidget::remove( Session* ses ) {
22 m_map.remove( ses->widgetStack() ); 23 m_map.remove( ses->widgetStack() );
23 removePage( ses->widgetStack() ); 24 removePage( ses->widgetStack() );
24} 25}
25 26
26void TabWidget::slotCurChanged( QWidget* wid ) { 27void TabWidget::slotCurChanged( QWidget* wid ) {
27 QMap<QWidget*, Session*>::Iterator it; 28 QMap<QWidget*, Session*>::Iterator it;
28 it = m_map.find( wid ); 29 it = m_map.find( wid );
29 if ( it == m_map.end() ) { 30 if ( it == m_map.end() ) {
30 return; 31 return;
31 } 32 }
32 33
33 emit activated( it.data() ); 34 emit activated( it.data() );
34} 35}
35void TabWidget::setCurrent( Session* ses ) { 36void TabWidget::setCurrent( Session* ses ) {
36 if (!ses ) 37 if (!ses )
37 return; 38 return;
38 39
39 //showPage( ses->widgetStack() ); 40 //showPage( ses->widgetStack() );
40 setCurrentTab( ses->widgetStack() ); 41 setCurrentTab( ses->widgetStack() );
41} 42}
42 43
43 44