-rw-r--r-- | noncore/apps/opie-console/BUGS | 9 | ||||
-rw-r--r-- | noncore/apps/opie-console/MyPty.cpp | 23 | ||||
-rw-r--r-- | noncore/apps/opie-console/MyPty.h | 2 | ||||
-rw-r--r-- | noncore/apps/opie-console/io_layer.h | 14 | ||||
-rw-r--r-- | noncore/apps/opie-console/io_serial.cpp | 7 | ||||
-rw-r--r-- | noncore/apps/opie-console/io_serial.h | 4 | ||||
-rw-r--r-- | noncore/apps/opie-console/mainwindow.cpp | 10 | ||||
-rw-r--r-- | noncore/apps/opie-console/profilemanager.cpp | 15 | ||||
-rw-r--r-- | noncore/apps/opie-console/session.cpp | 6 | ||||
-rw-r--r-- | noncore/apps/opie-console/session.h | 1 | ||||
-rw-r--r-- | noncore/apps/opie-console/tabwidget.cpp | 1 |
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 @@ | |||
1 | Ok we all know we write perfect code | ||
2 | but sometimes the compiler produces bad code | ||
3 | and we need to work around some compiler bugs!! -zecke | ||
4 | |||
5 | MyPty 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 | |||
9 | OTabWidget 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 | ||
99 | void MyPty::setSize(int lines, int columns) | 99 | void 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 | ||
109 | void MyPty::donePty() | 109 | void 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 | ||
128 | const char* MyPty::deviceName() | 131 | const char* MyPty::deviceName() |
129 | { | 132 | { |
130 | return m_ttynam; | 133 | return m_ttynam; |
131 | } | 134 | } |
132 | 135 | ||
133 | 136 | ||
134 | void MyPty::error() | 137 | void 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 | ||
140 | void MyPty::start() { | 143 | void 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 | */ |
149 | int MyPty::run(const char* cmd, QStrList &, const char*, int) | 152 | int 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 | ||
197 | int MyPty::openPty() | 201 | int 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 | */ |
234 | MyPty::MyPty(const Profile&) : m_cpid(0) | 238 | MyPty::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 | */ |
246 | MyPty::~MyPty() | 251 | MyPty::~MyPty() |
247 | { | 252 | { |
248 | donePty(); | 253 | donePty(); |
249 | } | 254 | } |
250 | QString MyPty::identifier()const { | 255 | QString MyPty::identifier()const { |
251 | return QString::fromLatin1("term"); | 256 | return QString::fromLatin1("term"); |
252 | } | 257 | } |
253 | QString MyPty::name()const{ | 258 | QString MyPty::name()const{ |
254 | return identifier(); | 259 | return identifier(); |
255 | } | 260 | } |
256 | bool MyPty::open() { | 261 | bool MyPty::open() { |
262 | if (m_fd < 0) | ||
263 | m_fd = openPty(); | ||
264 | |||
257 | start(); | 265 | start(); |
258 | return true; | 266 | return true; |
259 | } | 267 | } |
260 | void MyPty::close() { | 268 | void MyPty::close() { |
261 | donePty(); | 269 | donePty(); |
270 | m_fd = openPty(); | ||
262 | } | 271 | } |
263 | void MyPty::reload( const Profile& ) { | 272 | void MyPty::reload( const Profile& ) { |
264 | 273 | ||
265 | } | 274 | } |
266 | /*! sends len bytes through the line */ | 275 | /*! sends len bytes through the line */ |
267 | void MyPty::send(const QByteArray& ar) | 276 | void 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 */ |
281 | void MyPty::readPty() | 290 | void 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 | } |
317 | QBitArray 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 | ||
30 | class Profile; | 30 | class Profile; |
31 | class QSocketNotifier; | 31 | class QSocketNotifier; |
32 | class MyPty : public IOLayer | 32 | class MyPty : public IOLayer |
33 | { | 33 | { |
34 | Q_OBJECT | 34 | Q_OBJECT |
35 | public: | 35 | public: |
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 | ||
78 | private: | 79 | private: |
79 | const char* deviceName(); | 80 | const char* deviceName(); |
80 | 81 | ||
81 | protected slots: | 82 | protected slots: |
82 | void readPty(); | 83 | void readPty(); |
83 | void donePty(); | 84 | void donePty(); |
84 | 85 | ||
85 | private: | 86 | private: |
86 | int openPty(); | 87 | int openPty(); |
87 | 88 | ||
88 | private: | 89 | private: |
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 | */ |
14 | class IOLayer : public QObject { | 17 | class IOLayer : public QObject { |
15 | Q_OBJECT | 18 | Q_OBJECT |
16 | public: | 19 | public: |
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 | ||
69 | signals: | 82 | signals: |
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(); | ||
82 | public slots: | 96 | public 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 | ||
7 | IOSerial::IOSerial(const Profile &config) : IOLayer(config) { | 7 | IOSerial::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 | ||
15 | IOSerial::~IOSerial() { | 15 | IOSerial::~IOSerial() { |
16 | if (m_fd) { | 16 | if (m_fd) { |
17 | close(); | 17 | close(); |
18 | } | 18 | } |
19 | } | 19 | } |
20 | 20 | ||
21 | void IOSerial::send(const QByteArray &data) { | 21 | void 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 | ||
29 | void IOSerial::close() { | 29 | void 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 | ||
40 | bool IOSerial::open() { | 40 | bool 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 | ||
122 | void IOSerial::reload(const Profile &config) { | 122 | void 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 | ||
132 | int IOSerial::baud(int baud) const { | 132 | int 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 | ||
148 | void IOSerial::errorOccured() { | 148 | void IOSerial::errorOccured() { |
149 | emit error(ClosedUnexpected, strerror(errno)); | 149 | emit error(ClosedUnexpected, strerror(errno)); |
150 | close(); | 150 | close(); |
151 | } | 151 | } |
152 | 152 | ||
153 | void IOSerial::dataArrived() { | 153 | void 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 | ||
165 | QString IOSerial::identifier() const { | 165 | QString IOSerial::identifier() const { |
166 | return "serial"; | 166 | return "serial"; |
167 | } | 167 | } |
168 | 168 | ||
169 | QString IOSerial::name() const { | 169 | QString IOSerial::name() const { |
170 | return "RS232 Serial IO Layer"; | 170 | return "RS232 Serial IO Layer"; |
171 | } | 171 | } |
172 | int IOSerial::rawIO()const { | 172 | int 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 | }; |
182 | void IOSerial::closeRawIO(int fd) { | 182 | void 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 | } |
190 | QBitArray 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 | ||
17 | class IOSerial : public IOLayer { | 17 | class IOSerial : public IOLayer { |
18 | Q_OBJECT | 18 | Q_OBJECT |
19 | public: | 19 | public: |
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 ); |
40 | signals: | 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 | */ | ||
43 | public slots: | 45 | public 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 &); |
48 | protected: | 50 | protected: |
49 | int baud(int baud) const; | 51 | int baud(int baud) const; |
50 | protected slots: | 52 | protected slots: |
51 | void dataArrived(); | 53 | void dataArrived(); |
52 | void errorOccured(); | 54 | void errorOccured(); |
53 | protected: | 55 | protected: |
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 | ||
32 | static char * menu_xpm[] = { | 32 | static 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 | ||
53 | MainWindow::MainWindow() { | 53 | MainWindow::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 | } |
69 | void MainWindow::initUI() { | 69 | void 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 | ||
234 | ProfileManager* MainWindow::manager() { | 234 | ProfileManager* MainWindow::manager() { |
235 | return m_manager; | 235 | return m_manager; |
236 | } | 236 | } |
237 | TabWidget* MainWindow::tabWidget() { | 237 | TabWidget* MainWindow::tabWidget() { |
238 | return m_consoleWindow; | 238 | return m_consoleWindow; |
239 | } | 239 | } |
240 | void MainWindow::populateProfiles() { | 240 | void 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 | } |
248 | MainWindow::~MainWindow() { | 248 | MainWindow::~MainWindow() { |
249 | delete m_factory; | 249 | delete m_factory; |
250 | manager()->save(); | 250 | manager()->save(); |
251 | } | 251 | } |
252 | 252 | ||
253 | MetaFactory* MainWindow::factory() { | 253 | MetaFactory* MainWindow::factory() { |
254 | return m_factory; | 254 | return m_factory; |
255 | } | 255 | } |
256 | 256 | ||
257 | Session* MainWindow::currentSession() { | 257 | Session* MainWindow::currentSession() { |
258 | return m_curSession; | 258 | return m_curSession; |
259 | } | 259 | } |
260 | 260 | ||
261 | QList<Session> MainWindow::sessions() { | 261 | QList<Session> MainWindow::sessions() { |
262 | return m_sessions; | 262 | return m_sessions; |
263 | } | 263 | } |
264 | 264 | ||
265 | void MainWindow::slotNew() { | 265 | void 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 | ||
275 | void MainWindow::slotRecordScript() { | 275 | void MainWindow::slotRecordScript() { |
276 | /* if (currentSession()) { | 276 | /* if (currentSession()) { |
277 | currentSession()->emulationLayer()->startRecording(); | 277 | currentSession()->emulationLayer()->startRecording(); |
278 | } | 278 | } |
279 | */ | 279 | */ |
280 | } | 280 | } |
281 | 281 | ||
282 | void MainWindow::slotSaveScript() { | 282 | void 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 | ||
297 | void MainWindow::slotRunScript() { | 297 | void 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 | ||
313 | void MainWindow::slotConnect() { | 313 | void 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 | ||
324 | void MainWindow::slotDisconnect() { | 324 | void 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 | ||
332 | void MainWindow::slotTerminate() { | 332 | void 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 | ||
340 | void MainWindow::slotConfigure() { | 340 | void 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 | */ |
359 | void MainWindow::slotClose() { | 359 | void 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 | */ |
387 | void MainWindow::slotProfile( int id) { | 388 | void 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 | } |
391 | void MainWindow::create( const Profile& prof ) { | 392 | void 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 | ||
419 | void MainWindow::slotTransfer() | 420 | void 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 | ||
429 | void MainWindow::slotOpenKeb(bool state) { | 430 | void 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 | } |
435 | void MainWindow::slotSessionChanged( Session* ses ) { | 436 | void 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 | ||
449 | void MainWindow::slotFullscreen() { | 451 | void 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 | ||
17 | ProfileManager::ProfileManager( MetaFactory* fact ) | 18 | ProfileManager::ProfileManager( MetaFactory* fact ) |
18 | : m_fact( fact ) | 19 | : m_fact( fact ) |
19 | { | 20 | { |
20 | 21 | ||
21 | } | 22 | } |
22 | ProfileManager::~ProfileManager() { | 23 | ProfileManager::~ProfileManager() { |
23 | 24 | ||
24 | } | 25 | } |
25 | void ProfileManager::load() { | 26 | void 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 | } |
52 | void ProfileManager::clear() { | 53 | void ProfileManager::clear() { |
53 | m_list.clear(); | 54 | m_list.clear(); |
54 | } | 55 | } |
55 | Profile::ValueList ProfileManager::all()const { | 56 | Profile::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 | */ |
71 | Session* ProfileManager::fromProfile( const Profile& prof, QWidget* parent) { | 72 | Session* 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 | } |
105 | void ProfileManager::save( ) { | 98 | void 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 | } |
129 | void ProfileManager::setProfiles( const Profile::ValueList& list ) { | 122 | void ProfileManager::setProfiles( const Profile::ValueList& list ) { |
130 | m_list = list; | 123 | m_list = list; |
131 | }; | 124 | }; |
132 | Profile ProfileManager::profile( const QString& name )const { | 125 | Profile 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 | ||
9 | Session::Session() { | 9 | Session::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 | } |
14 | Session::Session( const QString& na, QWidgetStack* widget, IOLayer* lay) | 14 | Session::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 | } |
21 | Session::~Session() { | 21 | Session::~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 | } |
27 | QString Session::name()const { | 27 | QString Session::name()const { |
28 | return m_name; | 28 | return m_name; |
29 | } | 29 | } |
30 | QWidgetStack* Session::widgetStack() { | 30 | QWidgetStack* Session::widgetStack() { |
31 | return m_widget; | 31 | return m_widget; |
32 | } | 32 | } |
33 | IOLayer* Session::layer() { | 33 | IOLayer* Session::layer() { |
34 | return m_layer; | 34 | return m_layer; |
35 | } | 35 | } |
36 | EmulationHandler* Session::emulationHandler() { | 36 | EmulationHandler* Session::emulationHandler() { |
37 | return m_emu; | 37 | return m_emu; |
38 | } | 38 | } |
39 | QWidget* Session::widget() { | ||
40 | if (!m_emu ) | ||
41 | return 0l; | ||
42 | |||
43 | return m_emu->widget(); | ||
44 | } | ||
39 | /* | 45 | /* |
40 | WidgetLayer* Session::emulationWidget() { | 46 | WidgetLayer* Session::emulationWidget() { |
41 | return m_widLay; | 47 | return m_widLay; |
42 | } | 48 | } |
43 | */ | 49 | */ |
44 | void Session::connect() { | 50 | void 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 | ||
56 | void Session::disconnect() { | 62 | void 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 | ||
69 | void Session::setName( const QString& na){ | 75 | void Session::setName( const QString& na){ |
70 | m_name = na; | 76 | m_name = na; |
71 | } | 77 | } |
72 | 78 | ||
73 | void Session::setWidgetStack( QWidgetStack* wid ) { | 79 | void 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 | } |
81 | void Session::setIOLayer( IOLayer* lay ) { | 87 | void Session::setIOLayer( IOLayer* lay ) { |
82 | delete m_layer; | 88 | delete m_layer; |
83 | m_layer = lay; | 89 | m_layer = lay; |
84 | } | 90 | } |
85 | 91 | ||
86 | void Session::setEmulationHandler( EmulationHandler* lay ) { | 92 | void Session::setEmulationHandler( EmulationHandler* lay ) { |
87 | delete m_emu; | 93 | delete m_emu; |
88 | m_emu = lay; | 94 | m_emu = lay; |
89 | } | 95 | } |
90 | /* | 96 | /* |
91 | void Session::setEmulationWidget( WidgetLayer* lay ) { | 97 | void 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 | ||
97 | bool Session::isConnected() { | 103 | bool 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 | ||
6 | class IOLayer; | 6 | class IOLayer; |
7 | class EmulationHandler; | 7 | class 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 | */ |
14 | class Session { | 14 | class Session { |
15 | public: | 15 | public: |
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 | ||
64 | private: | 65 | private: |
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 | ||
4 | TabWidget::TabWidget( QWidget* parent, const char* name ) | 4 | TabWidget::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 | ||
10 | TabWidget::~TabWidget() { | 10 | TabWidget::~TabWidget() { |
11 | } | 11 | } |
12 | 12 | ||
13 | void TabWidget::add( Session* ses ) { | 13 | void 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 | ||
21 | void TabWidget::remove( Session* ses ) { | 22 | void 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 | ||
26 | void TabWidget::slotCurChanged( QWidget* wid ) { | 27 | void 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 | } |
35 | void TabWidget::setCurrent( Session* ses ) { | 36 | void 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 | ||