summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-console/emulation_layer.cpp36
-rw-r--r--noncore/apps/opie-console/emulation_layer.h19
-rw-r--r--noncore/apps/opie-console/mainwindow.cpp56
-rw-r--r--noncore/apps/opie-console/mainwindow.h8
-rw-r--r--noncore/apps/opie-console/opie-console.pro4
-rw-r--r--noncore/apps/opie-console/script.cpp30
-rw-r--r--noncore/apps/opie-console/script.h30
7 files changed, 178 insertions, 5 deletions
diff --git a/noncore/apps/opie-console/emulation_layer.cpp b/noncore/apps/opie-console/emulation_layer.cpp
index 5baf05c..265c11f 100644
--- a/noncore/apps/opie-console/emulation_layer.cpp
+++ b/noncore/apps/opie-console/emulation_layer.cpp
@@ -14,339 +14,375 @@
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/* Modified to suit opie-console */ 19/* Modified to suit opie-console */
20 /* */ 20 /* */
21/* Copyright (C) 2002 by opie developers <opie@handhelds.org> */ 21/* Copyright (C) 2002 by opie developers <opie@handhelds.org> */
22 /* */ 22 /* */
23/* -------------------------------------------------------------------------- */ 23/* -------------------------------------------------------------------------- */
24 24
25/*! \class EmulationLayer 25/*! \class EmulationLayer
26 26
27 \brief Mediator between Widget and Screen. 27 \brief Mediator between Widget and Screen.
28 28
29 This class is responsible to scan the escapes sequences of the terminal 29 This class is responsible to scan the escapes sequences of the terminal
30 emulation and to map it to their corresponding semantic complements. 30 emulation and to map it to their corresponding semantic complements.
31 Thus this module knows mainly about decoding escapes sequences and 31 Thus this module knows mainly about decoding escapes sequences and
32 is a stateless device w.r.t. the semantics. 32 is a stateless device w.r.t. the semantics.
33 33
34 It is also responsible to refresh the Widget by certain rules. 34 It is also responsible to refresh the Widget by certain rules.
35 35
36 \sa Widget \sa Screen 36 \sa Widget \sa Screen
37 37
38 \par A note on refreshing 38 \par A note on refreshing
39 39
40 Although the modifications to the current screen image could immediately 40 Although the modifications to the current screen image could immediately
41 be propagated via `Widget' to the graphical surface, we have chosen 41 be propagated via `Widget' to the graphical surface, we have chosen
42 another way here. 42 another way here.
43 43
44 The reason for doing so is twofold. 44 The reason for doing so is twofold.
45 45
46 First, experiments show that directly displaying the operation results 46 First, experiments show that directly displaying the operation results
47 in slowing down the overall performance of emulations. Displaying 47 in slowing down the overall performance of emulations. Displaying
48 individual characters using X11 creates a lot of overhead. 48 individual characters using X11 creates a lot of overhead.
49 49
50 Second, by using the following refreshing method, the screen operations 50 Second, by using the following refreshing method, the screen operations
51 can be completely separated from the displaying. This greatly simplifies 51 can be completely separated from the displaying. This greatly simplifies
52 the programmer's task of coding and maintaining the screen operations, 52 the programmer's task of coding and maintaining the screen operations,
53 since one need not worry about differential modifications on the 53 since one need not worry about differential modifications on the
54 display affecting the operation of concern. 54 display affecting the operation of concern.
55 55
56 We use a refreshing algorithm here that has been adoped from rxvt/kvt. 56 We use a refreshing algorithm here that has been adoped from rxvt/kvt.
57 57
58 By this, refreshing is driven by a timer, which is (re)started whenever 58 By this, refreshing is driven by a timer, which is (re)started whenever
59 a new bunch of data to be interpreted by the emulation arives at `onRcvBlock'. 59 a new bunch of data to be interpreted by the emulation arives at `onRcvBlock'.
60 As soon as no more data arrive for `BULK_TIMEOUT' milliseconds, we trigger 60 As soon as no more data arrive for `BULK_TIMEOUT' milliseconds, we trigger
61 refresh. This rule suits both bulk display operation as done by curses as 61 refresh. This rule suits both bulk display operation as done by curses as
62 well as individual characters typed. 62 well as individual characters typed.
63 (BULK_TIMEOUT < 1000 / max characters received from keyboard per second). 63 (BULK_TIMEOUT < 1000 / max characters received from keyboard per second).
64 64
65 Additionally, we trigger refreshing by newlines comming in to make visual 65 Additionally, we trigger refreshing by newlines comming in to make visual
66 snapshots of lists as produced by `cat', `ls' and likely programs, thereby 66 snapshots of lists as produced by `cat', `ls' and likely programs, thereby
67 producing the illusion of a permanent and immediate display operation. 67 producing the illusion of a permanent and immediate display operation.
68 68
69 As a sort of catch-all needed for cases where none of the above 69 As a sort of catch-all needed for cases where none of the above
70 conditions catch, the screen refresh is also triggered by a count 70 conditions catch, the screen refresh is also triggered by a count
71 of incoming bulks (`bulk_incnt'). 71 of incoming bulks (`bulk_incnt').
72*/ 72*/
73 73
74/* FIXME 74/* FIXME
75 - evtl. the bulk operations could be made more transparent. 75 - evtl. the bulk operations could be made more transparent.
76*/ 76*/
77 77
78#include "emulation_layer.h" 78#include "emulation_layer.h"
79#include "widget_layer.h" 79#include "widget_layer.h"
80#include "screen.h" 80#include "screen.h"
81#include <stdio.h> 81#include <stdio.h>
82#include <stdlib.h> 82#include <stdlib.h>
83#include <unistd.h> 83#include <unistd.h>
84#include <qkeycode.h> 84#include <qkeycode.h>
85 85
86 86
87/* ------------------------------------------------------------------------- */ 87/* ------------------------------------------------------------------------- */
88/* */ 88/* */
89/* EmulationLayer */ 89/* EmulationLayer */
90/* */ 90/* */
91/* ------------------------------------------------------------------------- */ 91/* ------------------------------------------------------------------------- */
92 92
93#define CNTL(c) ((c)-'@') 93#define CNTL(c) ((c)-'@')
94 94
95/*! 95/*!
96*/ 96*/
97 97
98EmulationLayer::EmulationLayer( WidgetLayer* gui ) 98EmulationLayer::EmulationLayer( WidgetLayer* gui )
99: decoder((QTextDecoder*)NULL) 99: decoder((QTextDecoder*)NULL)
100{ 100{
101 this->gui = gui; 101 this->gui = gui;
102 102
103 screen[0] = new Screen(gui->lines(),gui->columns()); 103 screen[0] = new Screen(gui->lines(),gui->columns());
104 screen[1] = new Screen(gui->lines(),gui->columns()); 104 screen[1] = new Screen(gui->lines(),gui->columns());
105 scr = screen[0]; 105 scr = screen[0];
106 106
107 bulk_nlcnt = 0; // reset bulk newline counter 107 bulk_nlcnt = 0; // reset bulk newline counter
108 bulk_incnt = 0; // reset bulk counter 108 bulk_incnt = 0; // reset bulk counter
109 connected = FALSE; 109 connected = FALSE;
110 m_script = 0;
110 111
111 QObject::connect(&bulk_timer, SIGNAL( timeout() ), this, SLOT( showBulk() ) ); 112 QObject::connect(&bulk_timer, SIGNAL( timeout() ), this, SLOT( showBulk() ) );
112 QObject::connect(gui,SIGNAL( imageSizeChanged( int, int ) ), 113 QObject::connect(gui,SIGNAL( imageSizeChanged( int, int ) ),
113 this,SLOT( onImageSizeChange( int, int ) ) ); 114 this,SLOT( onImageSizeChange( int, int ) ) );
114 QObject::connect(gui,SIGNAL( changedHistoryCursor( int ) ), 115 QObject::connect(gui,SIGNAL( changedHistoryCursor( int ) ),
115 this,SLOT( historyCursorChange( int ) ) ); 116 this,SLOT( historyCursorChange( int ) ) );
116 QObject::connect(gui,SIGNAL( keyPressed( QKeyEvent* ) ), 117 QObject::connect(gui,SIGNAL( keyPressed( QKeyEvent* ) ),
117 this,SLOT( onKeyPress( QKeyEvent* ) ) ); 118 this,SLOT( onKeyPress( QKeyEvent* ) ) );
118 QObject::connect(gui,SIGNAL( selectionBegin( const int, const int) ), 119 QObject::connect(gui,SIGNAL( selectionBegin( const int, const int) ),
119 this,SLOT( onSelectionBegin( const int, const int ) ) ); 120 this,SLOT( onSelectionBegin( const int, const int ) ) );
120 QObject::connect(gui,SIGNAL( selectionExtended( const int, const int ) ), 121 QObject::connect(gui,SIGNAL( selectionExtended( const int, const int ) ),
121 this,SLOT( onSelectionExtend( const int,const int ) ) ); 122 this,SLOT( onSelectionExtend( const int,const int ) ) );
122 QObject::connect(gui,SIGNAL( selectionEnd( const bool ) ), 123 QObject::connect(gui,SIGNAL( selectionEnd( const bool ) ),
123 this,SLOT( setSelection( const bool ) ) ); 124 this,SLOT( setSelection( const bool ) ) );
124 QObject::connect(gui,SIGNAL( selectionCleared() ), 125 QObject::connect(gui,SIGNAL( selectionCleared() ),
125 this,SLOT( clearSelection() ) ); 126 this,SLOT( clearSelection() ) );
126} 127}
127 128
128/*! 129/*!
129*/ 130*/
130 131
131EmulationLayer::~EmulationLayer() 132EmulationLayer::~EmulationLayer()
132{ 133{
133 delete screen[0]; 134 delete screen[0];
134 delete screen[1]; 135 delete screen[1];
136 if (isRecording())
137 clearScript();
135 bulk_timer.stop(); 138 bulk_timer.stop();
136} 139}
137 140
138/*! change between primary and alternate screen 141/*! change between primary and alternate screen
139*/ 142*/
140 143
141void EmulationLayer::setScreen(int n) 144void EmulationLayer::setScreen(int n)
142{ 145{
143 scr = screen[n&1]; 146 scr = screen[n&1];
144} 147}
145 148
146void EmulationLayer::setHistory(bool on) 149void EmulationLayer::setHistory(bool on)
147{ 150{
148 screen[0]->setScroll(on); 151 screen[0]->setScroll(on);
149 if (!connected) return; 152 if (!connected) return;
150 showBulk(); 153 showBulk();
151} 154}
152 155
153bool EmulationLayer::history() 156bool EmulationLayer::history()
154{ 157{
155 return screen[0]->hasScroll(); 158 return screen[0]->hasScroll();
156} 159}
157 160
158void EmulationLayer::setCodec(int c) 161void EmulationLayer::setCodec(int c)
159{ 162{
160 //FIXME: check whether we have to free codec 163 //FIXME: check whether we have to free codec
161 codec = c ? QTextCodec::codecForName("utf8") 164 codec = c ? QTextCodec::codecForName("utf8")
162 : QTextCodec::codecForLocale(); 165 : QTextCodec::codecForLocale();
163 if (decoder) delete decoder; 166 if (decoder) delete decoder;
164 decoder = codec->makeDecoder(); 167 decoder = codec->makeDecoder();
165} 168}
166 169
167void EmulationLayer::setKeytrans(int no) 170void EmulationLayer::setKeytrans(int no)
168{ 171{
169 keytrans = KeyTrans::find(no); 172 keytrans = KeyTrans::find(no);
170} 173}
171 174
172void EmulationLayer::setKeytrans(const char * no) 175void EmulationLayer::setKeytrans(const char * no)
173{ 176{
174 keytrans = KeyTrans::find(no); 177 keytrans = KeyTrans::find(no);
175} 178}
176 179
177// Interpreting Codes --------------------------------------------------------- 180// Interpreting Codes ---------------------------------------------------------
178 181
179/* 182/*
180 This section deals with decoding the incoming character stream. 183 This section deals with decoding the incoming character stream.
181 Decoding means here, that the stream is first seperated into `tokens' 184 Decoding means here, that the stream is first seperated into `tokens'
182 which are then mapped to a `meaning' provided as operations by the 185 which are then mapped to a `meaning' provided as operations by the
183 `Screen' class. 186 `Screen' class.
184*/ 187*/
185 188
186/*! 189/*!
187*/ 190*/
188 191
189void EmulationLayer::onRcvChar(int c) 192void EmulationLayer::onRcvChar(int c)
190// process application unicode input to terminal 193// process application unicode input to terminal
191// this is a trivial scanner 194// this is a trivial scanner
192{ 195{
193 c &= 0xff; 196 c &= 0xff;
194 switch (c) 197 switch (c)
195 { 198 {
196 case '\b' : scr->BackSpace(); break; 199 case '\b' : scr->BackSpace(); break;
197 case '\t' : scr->Tabulate(); break; 200 case '\t' : scr->Tabulate(); break;
198 case '\n' : scr->NewLine(); break; 201 case '\n' : scr->NewLine(); break;
199 case '\r' : scr->Return(); break; 202 case '\r' : scr->Return(); break;
200 case 0x07 : gui->bell(); break; 203 case 0x07 : gui->bell(); break;
201 default : scr->ShowCharacter(c); break; 204 default : scr->ShowCharacter(c); break;
202 }; 205 };
203} 206}
204 207
205/* ------------------------------------------------------------------------- */ 208/* ------------------------------------------------------------------------- */
206/* */ 209/* */
207/* Keyboard Handling */ 210/* Keyboard Handling */
208/* */ 211/* */
209/* ------------------------------------------------------------------------- */ 212/* ------------------------------------------------------------------------- */
210 213
211/*! 214/*!
212*/ 215*/
213 216
214void EmulationLayer::onKeyPress( QKeyEvent* ev ) 217void EmulationLayer::onKeyPress( QKeyEvent* ev )
215{ 218{
216 if (!connected) return; // someone else gets the keys 219 if (!connected) return; // someone else gets the keys
217 if (scr->getHistCursor() != scr->getHistLines()); 220 if (scr->getHistCursor() != scr->getHistLines());
218 scr->setHistCursor(scr->getHistLines()); 221 scr->setHistCursor(scr->getHistLines());
219 if (!ev->text().isEmpty()) 222 if (!ev->text().isEmpty())
220 { // A block of text 223 { // A block of text
221 // Note that the text is proper unicode. 224 // Note that the text is proper unicode.
222 // We should do a conversion here, but since this 225 // We should do a conversion here, but since this
223 // routine will never be used, we simply emit plain ascii. 226 // routine will never be used, we simply emit plain ascii.
224 sendString( ev->text().ascii() ); //,ev->text().length()); 227 sendString( ev->text().ascii() ); //,ev->text().length());
225 } 228 }
226 else if (ev->ascii()>0) 229 else if (ev->ascii()>0)
227 { 230 {
228 QByteArray c = QByteArray( 1 ); 231 QByteArray c = QByteArray( 1 );
229 c.at( 0 ) = ev->ascii(); 232 c.at( 0 ) = ev->ascii();
230 // ibot: qbytearray is emited not char* 233 // ibot: qbytearray is emited not char*
234
235 /* Are we currently recording a script? If so, store the typed character */
236 if (isRecording())
237 m_script->appendString(ev->text());
231 emit sndBlock( (QByteArray) c ); 238 emit sndBlock( (QByteArray) c );
232 } 239 }
233} 240}
234 241
235// Unblocking, Byte to Unicode translation --------------------------------- -- 242// Unblocking, Byte to Unicode translation --------------------------------- --
236 243
237/* 244/*
238 We are doing code conversion from locale to unicode first. 245 We are doing code conversion from locale to unicode first.
239*/ 246*/
240 247
241void EmulationLayer::onRcvBlock(const QByteArray &s ) 248void EmulationLayer::onRcvBlock(const QByteArray &s )
242{ 249{
243 bulkStart(); 250 bulkStart();
244 bulk_incnt += 1; 251 bulk_incnt += 1;
245 for (int i = 0; i < s.size(); i++) 252 for (int i = 0; i < s.size(); i++)
246 { 253 {
247 //TODO: ibot: maybe decoding qbytearray to unicode in io_layer? 254 //TODO: ibot: maybe decoding qbytearray to unicode in io_layer?
248 QString result = decoder->toUnicode(&s[i],1); 255 QString result = decoder->toUnicode(&s[i],1);
249 int reslen = result.length(); 256 int reslen = result.length();
250 for (int j = 0; j < reslen; j++) 257 for (int j = 0; j < reslen; j++)
251 onRcvChar(result[j].unicode()); 258 onRcvChar(result[j].unicode());
252 if (s[i] == '\n') bulkNewline(); 259 if (s[i] == '\n') bulkNewline();
253 } 260 }
254 bulkEnd(); 261 bulkEnd();
255} 262}
256 263
264// Scripts ----------------------------------------------------------------- --
265
266
267Script *EmulationLayer::script() {
268 return m_script;
269}
270
271bool EmulationLayer::isRecording() {
272 return (m_script != 0);
273}
274
275void EmulationLayer::startRecording() {
276 if (!isRecording())
277 m_script = new Script();
278}
279
280void EmulationLayer::clearScript() {
281 if (isRecording()) {
282
283 }
284}
285
286void EmulationLayer::runScript(const Script *script) {
287 QByteArray a = QByteArray();
288 QString str = script->script();
289 a.setRawData(str.ascii(), str.length());
290 emit sndBlock(a);
291}
292
257// Selection --------------------------------------------------------------- -- 293// Selection --------------------------------------------------------------- --
258 294
259void EmulationLayer::onSelectionBegin(const int x, const int y) { 295void EmulationLayer::onSelectionBegin(const int x, const int y) {
260 if (!connected) return; 296 if (!connected) return;
261 scr->setSelBeginXY(x,y); 297 scr->setSelBeginXY(x,y);
262 showBulk(); 298 showBulk();
263} 299}
264 300
265void EmulationLayer::onSelectionExtend(const int x, const int y) { 301void EmulationLayer::onSelectionExtend(const int x, const int y) {
266 if (!connected) return; 302 if (!connected) return;
267 scr->setSelExtentXY(x,y); 303 scr->setSelExtentXY(x,y);
268 showBulk(); 304 showBulk();
269} 305}
270 306
271void EmulationLayer::setSelection(const BOOL preserve_line_breaks) { 307void EmulationLayer::setSelection(const BOOL preserve_line_breaks) {
272 if (!connected) return; 308 if (!connected) return;
273 QString t = scr->getSelText(preserve_line_breaks); 309 QString t = scr->getSelText(preserve_line_breaks);
274 if (!t.isNull()) gui->setSelection(t); 310 if (!t.isNull()) gui->setSelection(t);
275} 311}
276 312
277void EmulationLayer::clearSelection() { 313void EmulationLayer::clearSelection() {
278 if (!connected) return; 314 if (!connected) return;
279 scr->clearSelection(); 315 scr->clearSelection();
280 showBulk(); 316 showBulk();
281} 317}
282 318
283// Refreshing -------------------------------------------------------------- -- 319// Refreshing -------------------------------------------------------------- --
284 320
285#define BULK_TIMEOUT 20 321#define BULK_TIMEOUT 20
286 322
287/*! 323/*!
288 called when \n comes in. Evtl. triggers showBulk at endBulk 324 called when \n comes in. Evtl. triggers showBulk at endBulk
289*/ 325*/
290 326
291void EmulationLayer::bulkNewline() 327void EmulationLayer::bulkNewline()
292{ 328{
293 bulk_nlcnt += 1; 329 bulk_nlcnt += 1;
294 bulk_incnt = 0; // reset bulk counter since `nl' rule applies 330 bulk_incnt = 0; // reset bulk counter since `nl' rule applies
295} 331}
296 332
297/*! 333/*!
298*/ 334*/
299 335
300void EmulationLayer::showBulk() 336void EmulationLayer::showBulk()
301{ 337{
302 bulk_nlcnt = 0; // reset bulk newline counter 338 bulk_nlcnt = 0; // reset bulk newline counter
303 bulk_incnt = 0; // reset bulk counter 339 bulk_incnt = 0; // reset bulk counter
304 if (connected) 340 if (connected)
305 { 341 {
306 QArray<Character> image = scr->getCookedImage(); // get the image 342 QArray<Character> image = scr->getCookedImage(); // get the image
307 gui->setImage(image, 343 gui->setImage(image,
308 scr->getLines(), 344 scr->getLines(),
309 scr->getColumns()); // actual refresh 345 scr->getColumns()); // actual refresh
310 delete image; 346 delete image;
311 //FIXME: check that we do not trigger other draw event here. 347 //FIXME: check that we do not trigger other draw event here.
312 gui->setScroll(scr->getHistCursor(),scr->getHistLines()); 348 gui->setScroll(scr->getHistCursor(),scr->getHistLines());
313 } 349 }
314} 350}
315 351
316void EmulationLayer::bulkStart() 352void EmulationLayer::bulkStart()
317{ 353{
318 if (bulk_timer.isActive()) bulk_timer.stop(); 354 if (bulk_timer.isActive()) bulk_timer.stop();
319} 355}
320 356
321void EmulationLayer::bulkEnd() 357void EmulationLayer::bulkEnd()
322{ 358{
323 if ( bulk_nlcnt > gui->lines() || bulk_incnt > 20 ) 359 if ( bulk_nlcnt > gui->lines() || bulk_incnt > 20 )
324 showBulk(); // resets bulk_??cnt to 0, too. 360 showBulk(); // resets bulk_??cnt to 0, too.
325 else 361 else
326 bulk_timer.start(BULK_TIMEOUT,TRUE); 362 bulk_timer.start(BULK_TIMEOUT,TRUE);
327} 363}
328 364
329void EmulationLayer::setConnect(bool c) 365void EmulationLayer::setConnect(bool c)
330{ 366{
331 connected = c; 367 connected = c;
332 if ( connected) 368 if ( connected)
333 { 369 {
334 onImageSizeChange(gui->lines(), gui->columns()); 370 onImageSizeChange(gui->lines(), gui->columns());
335 showBulk(); 371 showBulk();
336 } 372 }
337 else 373 else
338 { 374 {
339 scr->clearSelection(); 375 scr->clearSelection();
340 } 376 }
341} 377}
342 378
343// --------------------------------------------------------------------------- 379// ---------------------------------------------------------------------------
344 380
345/*! triggered by image size change of the Widget `gui'. 381/*! triggered by image size change of the Widget `gui'.
346 382
347 This event is simply propagated to the attached screens 383 This event is simply propagated to the attached screens
348 and to the related serial line. 384 and to the related serial line.
349*/ 385*/
350 386
351void EmulationLayer::onImageSizeChange(int lines, int columns) 387void EmulationLayer::onImageSizeChange(int lines, int columns)
352{ 388{
diff --git a/noncore/apps/opie-console/emulation_layer.h b/noncore/apps/opie-console/emulation_layer.h
index 91a4856..928ad04 100644
--- a/noncore/apps/opie-console/emulation_layer.h
+++ b/noncore/apps/opie-console/emulation_layer.h
@@ -1,146 +1,163 @@
1/* -------------------------------------------------------------------------- */ 1/* -------------------------------------------------------------------------- */
2/* */ 2/* */
3/* [emulation.h] Fundamental Terminal Emulation */ 3/* [emulation.h] Fundamental Terminal Emulation */
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 /* */ 19 /* */
20/* made to a layer between io_layer and widget */ 20/* made to a layer between io_layer and widget */
21 /* */ 21 /* */
22/* Copyright (C) 2002 by opie developers <opie@handhelds.org> */ 22/* Copyright (C) 2002 by opie developers <opie@handhelds.org> */
23 /* */ 23 /* */
24/* -------------------------------------------------------------------------- */ 24/* -------------------------------------------------------------------------- */
25 25
26#ifndef EMULATION_LAYER_H 26#ifndef EMULATION_LAYER_H
27#define EMULATION_LAYER_H 27#define EMULATION_LAYER_H
28 28
29#include "widget_layer.h" 29#include "widget_layer.h"
30#include "screen.h" 30#include "screen.h"
31#include <qtimer.h> 31#include <qtimer.h>
32#include <stdio.h> 32#include <stdio.h>
33#include <qtextcodec.h> 33#include <qtextcodec.h>
34#include "keytrans.h" 34#include "keytrans.h"
35#include "script.h"
35 36
36class EmulationLayer : public QObject 37class EmulationLayer : public QObject
37{ Q_OBJECT 38{ Q_OBJECT
38 39
39public: 40public:
40 41
41 EmulationLayer( WidgetLayer* gui ); 42 EmulationLayer( WidgetLayer* gui );
42 ~EmulationLayer(); 43 ~EmulationLayer();
43 44
44public: 45public:
45 virtual void setHistory(bool on); 46 virtual void setHistory(bool on);
46 virtual bool history(); 47 virtual bool history();
47 48
48public slots: // signals incoming from Widget 49public slots: // signals incoming from Widget
49 50
50 virtual void onImageSizeChange(int lines, int columns); 51 virtual void onImageSizeChange(int lines, int columns);
51 virtual void onHistoryCursorChange(int cursor); 52 virtual void onHistoryCursorChange(int cursor);
52 virtual void onKeyPress(QKeyEvent*); 53 virtual void onKeyPress(QKeyEvent*);
53 54
54 virtual void clearSelection(); 55 virtual void clearSelection();
55 virtual void onSelectionBegin(const int x, const int y); 56 virtual void onSelectionBegin(const int x, const int y);
56 virtual void onSelectionExtend(const int x, const int y); 57 virtual void onSelectionExtend(const int x, const int y);
57 virtual void setSelection(const bool preserve_line_breaks); 58 virtual void setSelection(const bool preserve_line_breaks);
58 59
59public slots: // signals incoming from data source 60public slots: // signals incoming from data source
60 61
61 /** 62 /**
62 * to be called, when new data arrives 63 * to be called, when new data arrives
63 */ 64 */
64 void onRcvBlock(const QByteArray&); 65 void onRcvBlock(const QByteArray&);
65 66
66signals: 67signals:
67 68
68 /** 69 /**
69 * will send data, encoded to suit emulation 70 * will send data, encoded to suit emulation
70 */ 71 */
71 void sndBlock(const QByteArray&); 72 void sndBlock(const QByteArray&);
72 73
73 void ImageSizeChanged(int lines, int columns); 74 void ImageSizeChanged(int lines, int columns);
74 75
75 void changeColumns(int columns); 76 void changeColumns(int columns);
76 77
77 void changeTitle(int arg, const char* str); 78 void changeTitle(int arg, const char* str);
78 79
79 80
80public: 81public:
81 82
82 /** 83 /**
83 * process single char (decode) 84 * process single char (decode)
84 */ 85 */
85 virtual void onRcvChar(int); 86 virtual void onRcvChar(int);
86 87
87 virtual void setMode (int) = 0; 88 virtual void setMode (int) = 0;
88 virtual void resetMode(int) = 0; 89 virtual void resetMode(int) = 0;
89 90
90 /** 91 /**
91 * @deprecated use qbytearray instead 92 * @deprecated use qbytearray instead
92 */ 93 */
93 virtual void sendString(const char*) = 0; 94 virtual void sendString(const char*) = 0;
94 95
95 /** 96 /**
96 * sends a string to IOLayer 97 * sends a string to IOLayer
97 * encodes to suit emulation before 98 * encodes to suit emulation before
98 */ 99 */
99 virtual void sendString(const QByteArray&) = 0; 100 virtual void sendString(const QByteArray&) = 0;
100 101
101 virtual void setConnect(bool r); 102 virtual void setConnect(bool r);
102 void setColumns(int columns); 103 void setColumns(int columns);
103 104
104 void setKeytrans(int no); 105 void setKeytrans(int no);
105 void setKeytrans(const char * no); 106 void setKeytrans(const char * no);
106 107
108 /* Scripts */
109
110 /* Create a new script and record all typed characters */
111 void startRecording();
112
113 /* Return whether we are currently recording a script */
114 bool isRecording();
115
116 /* Return the current script (or NULL) */
117 Script *script();
118
119 /* Stop recording and remove the current script from memory */
120 void clearScript();
121
122 /* Run a script by forwarding its keys to the EmulationLayer */
123 void runScript(const Script *);
107protected: 124protected:
108 125
109 WidgetLayer* gui; 126 WidgetLayer* gui;
110 Screen* scr; // referes to one `screen' 127 Screen* scr; // referes to one `screen'
111 Screen* screen[2]; // 0 = primary, 1 = alternate 128 Screen* screen[2]; // 0 = primary, 1 = alternate
112 void setScreen(int n); // set `scr' to `screen[n]' 129 void setScreen(int n); // set `scr' to `screen[n]'
113 130
114 bool connected; // communicate with widget 131 bool connected; // communicate with widget
115 132
116 void setCodec(int c); // codec number, 0 = locale, 1=utf8 133 void setCodec(int c); // codec number, 0 = locale, 1=utf8
117 134
118 QTextCodec* codec; 135 QTextCodec* codec;
119 QTextCodec* localeCodec; 136 QTextCodec* localeCodec;
120 QTextDecoder* decoder; 137 QTextDecoder* decoder;
121 138
122 KeyTrans* keytrans; 139 KeyTrans* keytrans;
123 140
124// refreshing related material. 141// refreshing related material.
125// this is localized in the class. 142// this is localized in the class.
126private slots: // triggered by timer 143private slots: // triggered by timer
127 144
128 void showBulk(); 145 void showBulk();
129 146
130private: 147private:
131 148
132 void bulkNewline(); 149 void bulkNewline();
133 void bulkStart(); 150 void bulkStart();
134 void bulkEnd(); 151 void bulkEnd();
135 152
136private: 153private:
137 154
138 QTimer bulk_timer; 155 QTimer bulk_timer;
139 int bulk_nlcnt; // bulk newline counter 156 int bulk_nlcnt; // bulk newline counter
140 char* SelectedText; 157 char* SelectedText;
141 int bulk_incnt; // bulk counter 158 int bulk_incnt; // bulk counter
142 159 Script *m_script;
143 160
144}; 161};
145 162
146#endif // ifndef EMULATION_H 163#endif // ifndef EMULATION_H
diff --git a/noncore/apps/opie-console/mainwindow.cpp b/noncore/apps/opie-console/mainwindow.cpp
index 8f5d56b..46c5bed 100644
--- a/noncore/apps/opie-console/mainwindow.cpp
+++ b/noncore/apps/opie-console/mainwindow.cpp
@@ -1,275 +1,329 @@
1 1
2#include <qaction.h> 2#include <qaction.h>
3#include <qmenubar.h> 3#include <qmenubar.h>
4#include <qlabel.h> 4#include <qlabel.h>
5#include <qpopupmenu.h> 5#include <qpopupmenu.h>
6#include <qtoolbar.h> 6#include <qtoolbar.h>
7#include <qpe/resource.h> 7#include <qpe/resource.h>
8 8#include <opie/ofiledialog.h>
9 9
10#include "profileeditordialog.h" 10#include "profileeditordialog.h"
11#include "configdialog.h" 11#include "configdialog.h"
12#include "default.h" 12#include "default.h"
13#include "metafactory.h" 13#include "metafactory.h"
14#include "profile.h" 14#include "profile.h"
15#include "profilemanager.h" 15#include "profilemanager.h"
16#include "mainwindow.h" 16#include "mainwindow.h"
17#include "tabwidget.h" 17#include "tabwidget.h"
18#include "transferdialog.h" 18#include "transferdialog.h"
19#include "function_keyboard.h" 19#include "function_keyboard.h"
20#include "script.h"
20 21
21MainWindow::MainWindow() { 22MainWindow::MainWindow() {
22 m_factory = new MetaFactory(); 23 m_factory = new MetaFactory();
23 Default def(m_factory); 24 Default def(m_factory);
24 m_sessions.setAutoDelete( TRUE ); 25 m_sessions.setAutoDelete( TRUE );
25 m_curSession = 0; 26 m_curSession = 0;
26 m_manager = new ProfileManager( m_factory ); 27 m_manager = new ProfileManager( m_factory );
27 m_manager->load(); 28 m_manager->load();
28 29
29 initUI(); 30 initUI();
30 populateProfiles(); 31 populateProfiles();
31} 32}
32void MainWindow::initUI() { 33void MainWindow::initUI() {
33 setToolBarsMovable( FALSE ); 34 setToolBarsMovable( FALSE );
34 35
35 /* tool bar for the menu */ 36 /* tool bar for the menu */
36 m_tool = new QToolBar( this ); 37 m_tool = new QToolBar( this );
37 m_tool->setHorizontalStretchable( TRUE ); 38 m_tool->setHorizontalStretchable( TRUE );
38 39
39 m_bar = new QMenuBar( m_tool ); 40 m_bar = new QMenuBar( m_tool );
40 m_console = new QPopupMenu( this ); 41 m_console = new QPopupMenu( this );
42 m_scripts = new QPopupMenu( this );
41 m_sessionsPop= new QPopupMenu( this ); 43 m_sessionsPop= new QPopupMenu( this );
42 m_settings = new QPopupMenu( this ); 44 m_settings = new QPopupMenu( this );
43 45
44 /* add a toolbar for icons */ 46 /* add a toolbar for icons */
45 m_icons = new QToolBar(this); 47 m_icons = new QToolBar(this);
46 48
47 /* 49 /*
48 * new Action for new sessions 50 * new Action for new sessions
49 */ 51 */
50 QAction* a = new QAction(tr("New Connection"), 52 QAction* a = new QAction(tr("New Connection"),
51 Resource::loadPixmap( "new" ), 53 Resource::loadPixmap( "new" ),
52 QString::null, 0, this, 0); 54 QString::null, 0, this, 0);
53 a->addTo( m_console ); 55 a->addTo( m_console );
54 a->addTo( m_icons ); 56 a->addTo( m_icons );
55 connect(a, SIGNAL(activated() ), 57 connect(a, SIGNAL(activated() ),
56 this, SLOT(slotNew() ) ); 58 this, SLOT(slotNew() ) );
57 59
58 /* 60 /*
59 * connect action 61 * connect action
60 */ 62 */
61 m_connect = new QAction(); 63 m_connect = new QAction();
62 m_connect->setText( tr("Connect") ); 64 m_connect->setText( tr("Connect") );
63 m_connect->addTo( m_console ); 65 m_connect->addTo( m_console );
64 connect(m_connect, SIGNAL(activated() ), 66 connect(m_connect, SIGNAL(activated() ),
65 this, SLOT(slotConnect() ) ); 67 this, SLOT(slotConnect() ) );
66 68
67 /* 69 /*
68 * disconnect action 70 * disconnect action
69 */ 71 */
70 m_disconnect = new QAction(); 72 m_disconnect = new QAction();
71 m_disconnect->setText( tr("Disconnect") ); 73 m_disconnect->setText( tr("Disconnect") );
72 m_disconnect->addTo( m_console ); 74 m_disconnect->addTo( m_console );
73 connect(m_disconnect, SIGNAL(activated() ), 75 connect(m_disconnect, SIGNAL(activated() ),
74 this, SLOT(slotDisconnect() ) ); 76 this, SLOT(slotDisconnect() ) );
75 77
76 m_transfer = new QAction(); 78 m_transfer = new QAction();
77 m_transfer->setText( tr("Transfer file...") ); 79 m_transfer->setText( tr("Transfer file...") );
78 m_transfer->addTo( m_console ); 80 m_transfer->addTo( m_console );
79 connect(m_transfer, SIGNAL(activated() ), 81 connect(m_transfer, SIGNAL(activated() ),
80 this, SLOT(slotTransfer() ) ); 82 this, SLOT(slotTransfer() ) );
81 83
82 /* 84 /*
83 * terminate action 85 * terminate action
84 */ 86 */
85 m_terminate = new QAction(); 87 m_terminate = new QAction();
86 m_terminate->setText( tr("Terminate") ); 88 m_terminate->setText( tr("Terminate") );
87 m_terminate->addTo( m_console ); 89 m_terminate->addTo( m_console );
88 connect(m_terminate, SIGNAL(activated() ), 90 connect(m_terminate, SIGNAL(activated() ),
89 this, SLOT(slotTerminate() ) ); 91 this, SLOT(slotTerminate() ) );
90 92
91 a = new QAction(); 93 a = new QAction();
92 a->setText( tr("Close Window") ); 94 a->setText( tr("Close Window") );
93 a->addTo( m_console ); 95 a->addTo( m_console );
94 connect(a, SIGNAL(activated() ), 96 connect(a, SIGNAL(activated() ),
95 this, SLOT(slotClose() ) ); 97 this, SLOT(slotClose() ) );
96 98
97 /* 99 /*
98 * the settings action 100 * the settings action
99 */ 101 */
100 m_setProfiles = new QAction(tr("Configure Profiles"), 102 m_setProfiles = new QAction(tr("Configure Profiles"),
101 Resource::loadPixmap( "SettingsIcon" ), 103 Resource::loadPixmap( "SettingsIcon" ),
102 QString::null, 0, this, 0); 104 QString::null, 0, this, 0);
103 m_setProfiles->addTo( m_settings ); 105 m_setProfiles->addTo( m_settings );
104 m_setProfiles->addTo( m_icons ); 106 m_setProfiles->addTo( m_icons );
105 connect( m_setProfiles, SIGNAL(activated() ), 107 connect( m_setProfiles, SIGNAL(activated() ),
106 this, SLOT(slotConfigure() ) ); 108 this, SLOT(slotConfigure() ) );
107 109
108 /* 110 /*
111 * script actions
112 */
113 m_recordScript = new QAction(tr("Record Script"), QString::null, 0, this, 0);
114 m_recordScript->addTo(m_scripts);
115 connect(m_recordScript, SIGNAL(activated()), this, SLOT(slotRecordScript()));
116
117 m_saveScript = new QAction(tr("Save Script"), QString::null, 0, this, 0);
118 m_saveScript->addTo(m_scripts);
119 connect(m_saveScript, SIGNAL(activated()), this, SLOT(slotSaveScript()));
120
121 m_runScript = new QAction(tr("Run Script"), QString::null, 0, this, 0);
122 m_runScript->addTo(m_scripts);
123 connect(m_runScript, SIGNAL(activated()), this, SLOT(slotRunScript()));
124
125 /*
109 * action that open/closes the keyboard 126 * action that open/closes the keyboard
110 */ 127 */
111 m_openKeys = new QAction (tr("Open Keyboard..."), 128 m_openKeys = new QAction (tr("Open Keyboard..."),
112 Resource::loadPixmap( "down" ), 129 Resource::loadPixmap( "down" ),
113 QString::null, 0, this, 0); 130 QString::null, 0, this, 0);
114 131
115 m_openKeys->setToggleAction(true); 132 m_openKeys->setToggleAction(true);
116 133
117 connect (m_openKeys, SIGNAL(toggled(bool)), 134 connect (m_openKeys, SIGNAL(toggled(bool)),
118 this, SLOT(slotOpenKeb(bool))); 135 this, SLOT(slotOpenKeb(bool)));
119 m_openKeys->addTo(m_icons); 136 m_openKeys->addTo(m_icons);
120 137
121 138
122 /* insert the submenu */ 139 /* insert the submenu */
123 m_console->insertItem(tr("New from Profile"), m_sessionsPop, 140 m_console->insertItem(tr("New from Profile"), m_sessionsPop,
124 -1, 0); 141 -1, 0);
125 142
126 /* insert the connection menu */ 143 /* insert the connection menu */
127 m_bar->insertItem( tr("Connection"), m_console ); 144 m_bar->insertItem( tr("Connection"), m_console );
128 145
146 /* the scripts menu */
147 m_bar->insertItem( tr("Scripts"), m_scripts );
148
129 /* the settings menu */ 149 /* the settings menu */
130 m_bar->insertItem( tr("Settings"), m_settings ); 150 m_bar->insertItem( tr("Settings"), m_settings );
131 151
132 /* and the keyboard */ 152 /* and the keyboard */
133 m_keyBar = new QToolBar(this); 153 m_keyBar = new QToolBar(this);
134 addToolBar( m_keyBar, "Keyboard", QMainWindow::Top, TRUE ); 154 addToolBar( m_keyBar, "Keyboard", QMainWindow::Top, TRUE );
135 m_keyBar->setHorizontalStretchable( TRUE ); 155 m_keyBar->setHorizontalStretchable( TRUE );
136 m_keyBar->hide(); 156 m_keyBar->hide();
137 157
138 m_kb = new FunctionKeyboard(m_keyBar); 158 m_kb = new FunctionKeyboard(m_keyBar);
139 159
140 /* 160 /*
141 * connect to the menu activation 161 * connect to the menu activation
142 */ 162 */
143 connect( m_sessionsPop, SIGNAL(activated( int ) ), 163 connect( m_sessionsPop, SIGNAL(activated( int ) ),
144 this, SLOT(slotProfile( int ) ) ); 164 this, SLOT(slotProfile( int ) ) );
145 165
146 m_consoleWindow = new TabWidget( this, "blah"); 166 m_consoleWindow = new TabWidget( this, "blah");
147 setCentralWidget( m_consoleWindow ); 167 setCentralWidget( m_consoleWindow );
148 168
149} 169}
150 170
151ProfileManager* MainWindow::manager() { 171ProfileManager* MainWindow::manager() {
152 return m_manager; 172 return m_manager;
153} 173}
154TabWidget* MainWindow::tabWidget() { 174TabWidget* MainWindow::tabWidget() {
155 return m_consoleWindow; 175 return m_consoleWindow;
156} 176}
157void MainWindow::populateProfiles() { 177void MainWindow::populateProfiles() {
158 m_sessionsPop->clear(); 178 m_sessionsPop->clear();
159 Profile::ValueList list = manager()->all(); 179 Profile::ValueList list = manager()->all();
160 for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) { 180 for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) {
161 m_sessionsPop->insertItem( (*it).name() ); 181 m_sessionsPop->insertItem( (*it).name() );
162 } 182 }
163 183
164} 184}
165MainWindow::~MainWindow() { 185MainWindow::~MainWindow() {
166 delete m_factory; 186 delete m_factory;
167 manager()->save(); 187 manager()->save();
168} 188}
169 189
170MetaFactory* MainWindow::factory() { 190MetaFactory* MainWindow::factory() {
171 return m_factory; 191 return m_factory;
172} 192}
173 193
174Session* MainWindow::currentSession() { 194Session* MainWindow::currentSession() {
175 return m_curSession; 195 return m_curSession;
176} 196}
177 197
178QList<Session> MainWindow::sessions() { 198QList<Session> MainWindow::sessions() {
179 return m_sessions; 199 return m_sessions;
180} 200}
181 201
182void MainWindow::slotNew() { 202void MainWindow::slotNew() {
183 qWarning("New Connection"); 203 qWarning("New Connection");
184 ProfileEditorDialog dlg(factory() ); 204 ProfileEditorDialog dlg(factory() );
185 int ret = dlg.exec(); 205 int ret = dlg.exec();
186 206
187 if ( ret == QDialog::Accepted ) { 207 if ( ret == QDialog::Accepted ) {
188 create( dlg.profile() ); 208 create( dlg.profile() );
189 } 209 }
190} 210}
191 211
212void MainWindow::slotRecordScript() {
213 if (currentSession()) {
214 currentSession()->emulationLayer()->startRecording();
215 }
216}
217
218void MainWindow::slotSaveScript() {
219 if (currentSession() && currentSession()->emulationLayer()->isRecording()) {
220 MimeTypes types;
221 QStringList script;
222 script << "text/plain";
223 types.insert("Script", script);
224 QString filename = OFileDialog::getSaveFileName(2, "/", QString::null, types);
225 if (!filename.isEmpty()) {
226 currentSession()->emulationLayer()->script()->saveTo(filename);
227 currentSession()->emulationLayer()->clearScript();
228 }
229 }
230}
231
232void MainWindow::slotRunScript() {
233 if (currentSession()) {
234 MimeTypes types;
235 QStringList script;
236 script << "text/plain";
237 types.insert("Script", script);
238 QString filename = OFileDialog::getOpenFileName(2, "/", QString::null, types);
239 if (!filename.isEmpty()) {
240 Script script(DocLnk(filename).file());
241 currentSession()->emulationLayer()->runScript(&script);
242 }
243 }
244}
245
192void MainWindow::slotConnect() { 246void MainWindow::slotConnect() {
193 if ( currentSession() ) 247 if ( currentSession() )
194 currentSession()->layer()->open(); 248 currentSession()->layer()->open();
195} 249}
196 250
197void MainWindow::slotDisconnect() { 251void MainWindow::slotDisconnect() {
198 if ( currentSession() ) 252 if ( currentSession() )
199 currentSession()->layer()->close(); 253 currentSession()->layer()->close();
200} 254}
201 255
202void MainWindow::slotTerminate() { 256void MainWindow::slotTerminate() {
203 if ( currentSession() ) 257 if ( currentSession() )
204 currentSession()->layer()->close(); 258 currentSession()->layer()->close();
205 259
206 slotClose(); 260 slotClose();
207 /* FIXME move to the next session */ 261 /* FIXME move to the next session */
208} 262}
209 263
210void MainWindow::slotConfigure() { 264void MainWindow::slotConfigure() {
211 qWarning("configure"); 265 qWarning("configure");
212 ConfigDialog conf( manager()->all(), factory() ); 266 ConfigDialog conf( manager()->all(), factory() );
213 conf.showMaximized(); 267 conf.showMaximized();
214 268
215 int ret = conf.exec(); 269 int ret = conf.exec();
216 270
217 if ( QDialog::Accepted == ret ) { 271 if ( QDialog::Accepted == ret ) {
218 qWarning("conf %d", conf.list().count() ); 272 qWarning("conf %d", conf.list().count() );
219 manager()->setProfiles( conf.list() ); 273 manager()->setProfiles( conf.list() );
220 populateProfiles(); 274 populateProfiles();
221 } 275 }
222} 276}
223/* 277/*
224 * we will remove 278 * we will remove
225 * this window from the tabwidget 279 * this window from the tabwidget
226 * remove it from the list 280 * remove it from the list
227 * delete it 281 * delete it
228 * and set the currentSession() 282 * and set the currentSession()
229 */ 283 */
230void MainWindow::slotClose() { 284void MainWindow::slotClose() {
231 qWarning("close"); 285 qWarning("close");
232 if (!currentSession() ) 286 if (!currentSession() )
233 return; 287 return;
234 288
235 tabWidget()->remove( currentSession() ); 289 tabWidget()->remove( currentSession() );
236 /*it's autodelete */ 290 /*it's autodelete */
237 m_sessions.remove( m_curSession ); 291 m_sessions.remove( m_curSession );
238 m_curSession = m_sessions.first(); 292 m_curSession = m_sessions.first();
239 tabWidget()->setCurrent( m_curSession ); 293 tabWidget()->setCurrent( m_curSession );
240} 294}
241 295
242/* 296/*
243 * We will get the name 297 * We will get the name
244 * Then the profile 298 * Then the profile
245 * and then we will make a profile 299 * and then we will make a profile
246 */ 300 */
247void MainWindow::slotProfile( int id) { 301void MainWindow::slotProfile( int id) {
248 Profile prof = manager()->profile( m_sessionsPop->text( id) ); 302 Profile prof = manager()->profile( m_sessionsPop->text( id) );
249 create( prof ); 303 create( prof );
250} 304}
251void MainWindow::create( const Profile& prof ) { 305void MainWindow::create( const Profile& prof ) {
252 Session *ses = manager()->fromProfile( prof, tabWidget() ); 306 Session *ses = manager()->fromProfile( prof, tabWidget() );
253 307
254 m_sessions.append( ses ); 308 m_sessions.append( ses );
255 tabWidget()->add( ses ); 309 tabWidget()->add( ses );
256 m_curSession = ses; 310 m_curSession = ses;
257 311
258} 312}
259 313
260void MainWindow::slotTransfer() 314void MainWindow::slotTransfer()
261{ 315{
262 if ( currentSession() ) { 316 if ( currentSession() ) {
263 TransferDialog dlg(this); 317 TransferDialog dlg(this);
264 //dlg.showMaximized(); 318 //dlg.showMaximized();
265 dlg.exec(); 319 dlg.exec();
266 } 320 }
267} 321}
268 322
269 323
270void MainWindow::slotOpenKeb(bool state) { 324void MainWindow::slotOpenKeb(bool state) {
271 325
272 if (state) m_keyBar->show(); 326 if (state) m_keyBar->show();
273 else m_keyBar->hide(); 327 else m_keyBar->hide();
274 328
275} 329}
diff --git a/noncore/apps/opie-console/mainwindow.h b/noncore/apps/opie-console/mainwindow.h
index 73bb285..94144a4 100644
--- a/noncore/apps/opie-console/mainwindow.h
+++ b/noncore/apps/opie-console/mainwindow.h
@@ -1,102 +1,108 @@
1#ifndef OPIE_MAIN_WINDOW_H 1#ifndef OPIE_MAIN_WINDOW_H
2#define OPIE_MAIN_WINDOW_H 2#define OPIE_MAIN_WINDOW_H
3 3
4#include <qmainwindow.h> 4#include <qmainwindow.h>
5#include <qlist.h> 5#include <qlist.h>
6 6
7#include "session.h" 7#include "session.h"
8 8
9/** 9/**
10 * this is the MainWindow of the new opie console 10 * this is the MainWindow of the new opie console
11 * it's also the dispatcher between the different 11 * it's also the dispatcher between the different
12 * actions supported by the gui 12 * actions supported by the gui
13 */ 13 */
14class QToolBar; 14class QToolBar;
15class QToolButton; 15class QToolButton;
16class QMenuBar; 16class QMenuBar;
17class QAction; 17class QAction;
18class MetaFactory; 18class MetaFactory;
19class TabWidget; 19class TabWidget;
20class ProfileManager; 20class ProfileManager;
21class Profile; 21class Profile;
22class FunctionKeyboard; 22class FunctionKeyboard;
23class MainWindow : public QMainWindow { 23class MainWindow : public QMainWindow {
24 Q_OBJECT 24 Q_OBJECT
25public: 25public:
26 MainWindow(); 26 MainWindow();
27 ~MainWindow(); 27 ~MainWindow();
28 28
29 /** 29 /**
30 * our factory to generate IOLayer and so on 30 * our factory to generate IOLayer and so on
31 * 31 *
32 */ 32 */
33 MetaFactory* factory(); 33 MetaFactory* factory();
34 34
35 /** 35 /**
36 * A session contains a QWidget*, 36 * A session contains a QWidget*,
37 * an IOLayer* and some infos for us 37 * an IOLayer* and some infos for us
38 */ 38 */
39 Session* currentSession(); 39 Session* currentSession();
40 40
41 /** 41 /**
42 * the session list 42 * the session list
43 */ 43 */
44 QList<Session> sessions(); 44 QList<Session> sessions();
45 45
46 /** 46 /**
47 * 47 *
48 */ 48 */
49 ProfileManager* manager(); 49 ProfileManager* manager();
50 TabWidget* tabWidget(); 50 TabWidget* tabWidget();
51 51
52private slots: 52private slots:
53 void slotNew(); 53 void slotNew();
54 void slotConnect(); 54 void slotConnect();
55 void slotDisconnect(); 55 void slotDisconnect();
56 void slotTerminate(); 56 void slotTerminate();
57 void slotConfigure(); 57 void slotConfigure();
58 void slotClose(); 58 void slotClose();
59 void slotProfile(int); 59 void slotProfile(int);
60 void slotTransfer(); 60 void slotTransfer();
61 void slotOpenKeb(bool); 61 void slotOpenKeb(bool);
62 62 void slotRecordScript();
63 void slotSaveScript();
64 void slotRunScript();
63private: 65private:
64 void initUI(); 66 void initUI();
65 void populateProfiles(); 67 void populateProfiles();
66 void create( const Profile& ); 68 void create( const Profile& );
67 /** 69 /**
68 * the current session 70 * the current session
69 */ 71 */
70 Session* m_curSession; 72 Session* m_curSession;
71 73
72 /** 74 /**
73 * the session list 75 * the session list
74 */ 76 */
75 QList<Session> m_sessions; 77 QList<Session> m_sessions;
76 78
77 /** 79 /**
78 * the metafactory 80 * the metafactory
79 */ 81 */
80 MetaFactory* m_factory; 82 MetaFactory* m_factory;
81 ProfileManager* m_manager; 83 ProfileManager* m_manager;
82 84
83 TabWidget* m_consoleWindow; 85 TabWidget* m_consoleWindow;
84 QToolBar* m_tool; 86 QToolBar* m_tool;
85 QToolBar* m_icons; 87 QToolBar* m_icons;
86 QToolBar* m_keyBar; 88 QToolBar* m_keyBar;
87 QMenuBar* m_bar; 89 QMenuBar* m_bar;
88 QPopupMenu* m_console; 90 QPopupMenu* m_console;
89 QPopupMenu* m_settings; 91 QPopupMenu* m_settings;
90 QPopupMenu* m_sessionsPop; 92 QPopupMenu* m_sessionsPop;
93 QPopupMenu* m_scripts;
91 QAction* m_connect; 94 QAction* m_connect;
92 QAction* m_disconnect; 95 QAction* m_disconnect;
93 QAction* m_terminate; 96 QAction* m_terminate;
94 QAction* m_transfer; 97 QAction* m_transfer;
95 QAction* m_setProfiles; 98 QAction* m_setProfiles;
96 QAction* m_openKeys; 99 QAction* m_openKeys;
100 QAction* m_recordScript;
101 QAction* m_saveScript;
102 QAction* m_runScript;
97 103
98 FunctionKeyboard *m_kb; 104 FunctionKeyboard *m_kb;
99}; 105};
100 106
101 107
102#endif 108#endif
diff --git a/noncore/apps/opie-console/opie-console.pro b/noncore/apps/opie-console/opie-console.pro
index b07f10a..8e39a48 100644
--- a/noncore/apps/opie-console/opie-console.pro
+++ b/noncore/apps/opie-console/opie-console.pro
@@ -1,68 +1,68 @@
1TEMPLATE = app 1TEMPLATE = app
2#CONFIG = qt warn_on release 2#CONFIG = qt warn_on release
3 CONFIG = qt debug 3 CONFIG = qt debug
4DESTDIR = $(OPIEDIR)/bin 4DESTDIR = $(OPIEDIR)/bin
5HEADERS = io_layer.h io_serial.h io_irda.h io_bt.h\ 5HEADERS = io_layer.h io_serial.h io_irda.h io_bt.h\
6 file_layer.h filetransfer.h \ 6 file_layer.h filetransfer.h \
7 metafactory.h \ 7 metafactory.h \
8 session.h \ 8 session.h \
9 mainwindow.h \ 9 mainwindow.h \
10 profile.h \ 10 profile.h \
11 profileconfig.h \ 11 profileconfig.h \
12 profilemanager.h \ 12 profilemanager.h \
13 configwidget.h \ 13 configwidget.h \
14 tabwidget.h \ 14 tabwidget.h \
15 configdialog.h \ 15 configdialog.h \
16 emulation_layer.h \ 16 emulation_layer.h \
17 vt102emulation.h \ 17 vt102emulation.h \
18 common.h \ 18 common.h \
19 history.h \ 19 history.h \
20 screen.h \ 20 screen.h \
21 keytrans.h \ 21 keytrans.h \
22 widget_layer.h \ 22 widget_layer.h \
23 transferdialog.h \ 23 transferdialog.h \
24 profiledialogwidget.h \ 24 profiledialogwidget.h \
25 profileeditordialog.h \ 25 profileeditordialog.h \
26 default.h \ 26 default.h \
27 terminalwidget.h \ 27 terminalwidget.h \
28 iolayerbase.h \ 28 iolayerbase.h \
29 serialconfigwidget.h irdaconfigwidget.h \ 29 serialconfigwidget.h irdaconfigwidget.h \
30 btconfigwidget.h modemconfigwidget.h \ 30 btconfigwidget.h modemconfigwidget.h \
31 atconfigdialog.h dialdialog.h \ 31 atconfigdialog.h dialdialog.h \
32 emulation_widget.h procctl.h \ 32 emulation_widget.h procctl.h \
33 function_keyboard.h 33 function_keyboard.h script.h
34 34
35SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ 35SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \
36 file_layer.cpp filetransfer.cpp \ 36 file_layer.cpp filetransfer.cpp \
37 main.cpp \ 37 main.cpp \
38 metafactory.cpp \ 38 metafactory.cpp \
39 session.cpp \ 39 session.cpp \
40 mainwindow.cpp \ 40 mainwindow.cpp \
41 profile.cpp \ 41 profile.cpp \
42 profileconfig.cpp \ 42 profileconfig.cpp \
43 profilemanager.cpp \ 43 profilemanager.cpp \
44 tabwidget.cpp \ 44 tabwidget.cpp \
45 configdialog.cpp \ 45 configdialog.cpp \
46 emulation_layer.cpp \ 46 emulation_layer.cpp \
47 vt102emulation.cpp \ 47 vt102emulation.cpp \
48 history.cpp \ 48 history.cpp \
49 screen.cpp \ 49 screen.cpp \
50 keytrans.cpp \ 50 keytrans.cpp \
51 widget_layer.cpp \ 51 widget_layer.cpp \
52 transferdialog.cpp \ 52 transferdialog.cpp \
53 profiledialogwidget.cpp \ 53 profiledialogwidget.cpp \
54 profileeditordialog.cpp \ 54 profileeditordialog.cpp \
55 terminalwidget.cpp \ 55 terminalwidget.cpp \
56 iolayerbase.cpp \ 56 iolayerbase.cpp \
57 serialconfigwidget.cpp irdaconfigwidget.cpp \ 57 serialconfigwidget.cpp irdaconfigwidget.cpp \
58 btconfigwidget.cpp modemconfigwidget.cpp \ 58 btconfigwidget.cpp modemconfigwidget.cpp \
59 atconfigdialog.cpp dialdialog.cpp \ 59 atconfigdialog.cpp dialdialog.cpp \
60 emulation_widget.cpp default.cpp procctl.cpp \ 60 emulation_widget.cpp default.cpp procctl.cpp \
61 function_keyboard.cpp 61 function_keyboard.cpp script.cpp
62 62
63INTERFACES = configurebase.ui editbase.ui 63INTERFACES = configurebase.ui editbase.ui
64INCLUDEPATH += $(OPIEDIR)/include 64INCLUDEPATH += $(OPIEDIR)/include
65DEPENDPATH += $(OPIEDIR)/include 65DEPENDPATH += $(OPIEDIR)/include
66LIBS += -lqpe -lopie 66LIBS += -lqpe -lopie
67TARGET = opie-console 67TARGET = opie-console
68 68
diff --git a/noncore/apps/opie-console/script.cpp b/noncore/apps/opie-console/script.cpp
new file mode 100644
index 0000000..a09fab6
--- a/dev/null
+++ b/noncore/apps/opie-console/script.cpp
@@ -0,0 +1,30 @@
1#include <qfile.h>
2#include <qtextstream.h>
3#include "script.h"
4
5Script::Script() {
6}
7
8Script::Script(const QString fileName) {
9 QFile file(fileName);
10 QTextStream stream(&file);
11 while (!stream.atEnd()) {
12 appendString(stream.readLine());
13 }
14}
15
16void Script::saveTo(const QString fileName) const {
17 QFile file(fileName);
18 file.open(IO_WriteOnly);
19 file.writeBlock(m_script.ascii(), m_script.length());
20 file.close();
21}
22
23
24void Script::appendString(const QString string) {
25 m_script += string;
26}
27
28QString Script::script() const {
29 return m_script;
30}
diff --git a/noncore/apps/opie-console/script.h b/noncore/apps/opie-console/script.h
new file mode 100644
index 0000000..dc2351b
--- a/dev/null
+++ b/noncore/apps/opie-console/script.h
@@ -0,0 +1,30 @@
1#ifndef CONSOLE_SCRIPT_H
2#define CONSOLE_SCRIPT_H
3
4#include <qstring.h>
5
6/* Very simple scripting - this class stores keys received
7 * by emulation_layer */
8
9class Script {
10public:
11 /* Construct an empty script */
12 Script();
13
14 /* Load a script from a text file */
15 Script(const QString fileName);
16
17 /* Append a line to the script */
18 void appendString(const QString string);
19
20 /* Save this script to a file */
21 void saveTo(const QString fileName) const;
22
23 /* Return the script's content */
24 QString script() const;
25protected:
26 QString m_script;
27};
28
29
30#endif /* CONSOLE_SCRIPT_H */