author | josef <josef> | 2002-10-15 22:36:10 (UTC) |
---|---|---|
committer | josef <josef> | 2002-10-15 22:36:10 (UTC) |
commit | 65ef0e86a879332cbf8b1575886d3c36c7d2d9bd (patch) (unidiff) | |
tree | b0b3f192c52dc15d639977e1d592412531d826eb | |
parent | 626b45872e1774b694727792f7306a39277e413e (diff) | |
download | opie-65ef0e86a879332cbf8b1575886d3c36c7d2d9bd.zip opie-65ef0e86a879332cbf8b1575886d3c36c7d2d9bd.tar.gz opie-65ef0e86a879332cbf8b1575886d3c36c7d2d9bd.tar.bz2 |
- 3 small fixes, please review:
- disable all relevant menu items when last session has been closed
(but this might not be the correct bugfix, so consider it temporary)
- don't set menu status to connected when connection fails
- modem sessions: when user cancels connection, close serial connection first
again, so we can reconnect (re-dial) later without problems
-rw-r--r-- | noncore/apps/opie-console/io_modem.cpp | 6 | ||||
-rw-r--r-- | noncore/apps/opie-console/io_serial.cpp | 1 | ||||
-rw-r--r-- | noncore/apps/opie-console/mainwindow.cpp | 10 |
3 files changed, 13 insertions, 4 deletions
diff --git a/noncore/apps/opie-console/io_modem.cpp b/noncore/apps/opie-console/io_modem.cpp index 22a3673..41f553b 100644 --- a/noncore/apps/opie-console/io_modem.cpp +++ b/noncore/apps/opie-console/io_modem.cpp | |||
@@ -1,78 +1,82 @@ | |||
1 | 1 | ||
2 | #include "io_modem.h" | 2 | #include "io_modem.h" |
3 | 3 | ||
4 | #include "dialer.h" | 4 | #include "dialer.h" |
5 | 5 | ||
6 | IOModem::IOModem( const Profile &profile ) | 6 | IOModem::IOModem( const Profile &profile ) |
7 | : IOSerial( profile ) { | 7 | : IOSerial( profile ) { |
8 | m_profile = profile; | 8 | m_profile = profile; |
9 | } | 9 | } |
10 | 10 | ||
11 | 11 | ||
12 | IOModem::~IOModem() { | 12 | IOModem::~IOModem() { |
13 | 13 | ||
14 | } | 14 | } |
15 | 15 | ||
16 | 16 | ||
17 | void IOModem::close() { | 17 | void IOModem::close() { |
18 | // maybe do a hangup here just in case...? | 18 | // maybe do a hangup here just in case...? |
19 | 19 | ||
20 | IOSerial::close(); | 20 | IOSerial::close(); |
21 | } | 21 | } |
22 | 22 | ||
23 | bool IOModem::open() { | 23 | bool IOModem::open() { |
24 | bool ret = IOSerial::open(); | 24 | bool ret = IOSerial::open(); |
25 | if(!ret) return false; | 25 | if(!ret) return false; |
26 | 26 | ||
27 | Dialer d(m_profile); | 27 | Dialer d(m_profile); |
28 | 28 | ||
29 | int result = d.exec(); | 29 | int result = d.exec(); |
30 | if(result == QDialog::Accepted) | 30 | if(result == QDialog::Accepted) |
31 | { | 31 | { |
32 | return true; | 32 | return true; |
33 | } | 33 | } |
34 | else return false; | 34 | else |
35 | { | ||
36 | close(); | ||
37 | return false; | ||
38 | } | ||
35 | } | 39 | } |
36 | 40 | ||
37 | void IOModem::reload( const Profile &config ) { | 41 | void IOModem::reload( const Profile &config ) { |
38 | 42 | ||
39 | m_device = config.readEntry("Device", MODEM_DEFAULT_DEVICE); | 43 | m_device = config.readEntry("Device", MODEM_DEFAULT_DEVICE); |
40 | m_baud = config.readNumEntry("Baud", MODEM_DEFAULT_BAUD); | 44 | m_baud = config.readNumEntry("Baud", MODEM_DEFAULT_BAUD); |
41 | m_parity = config.readNumEntry("Parity", MODEM_DEFAULT_PARITY); | 45 | m_parity = config.readNumEntry("Parity", MODEM_DEFAULT_PARITY); |
42 | m_dbits = config.readNumEntry("DataBits", MODEM_DEFAULT_DBITS); | 46 | m_dbits = config.readNumEntry("DataBits", MODEM_DEFAULT_DBITS); |
43 | m_sbits = config.readNumEntry("StopBits", MODEM_DEFAULT_SBITS); | 47 | m_sbits = config.readNumEntry("StopBits", MODEM_DEFAULT_SBITS); |
44 | m_flow = config.readNumEntry("Flow", MODEM_DEFAULT_FLOW); | 48 | m_flow = config.readNumEntry("Flow", MODEM_DEFAULT_FLOW); |
45 | 49 | ||
46 | m_initString = config.readEntry("InitString", MODEM_DEFAULT_INIT_STRING ); | 50 | m_initString = config.readEntry("InitString", MODEM_DEFAULT_INIT_STRING ); |
47 | m_resetString = config.readEntry("ResetString", MODEM_DEFAULT_RESET_STRING ); | 51 | m_resetString = config.readEntry("ResetString", MODEM_DEFAULT_RESET_STRING ); |
48 | m_dialPref1 = config.readEntry("DialPrefix1", MODEM_DEFAULT_DIAL_PREFIX1 ); | 52 | m_dialPref1 = config.readEntry("DialPrefix1", MODEM_DEFAULT_DIAL_PREFIX1 ); |
49 | m_dialSuf1 = config.readEntry("DialSuffix1", MODEM_DEFAULT_DIAL_SUFFIX1 ); | 53 | m_dialSuf1 = config.readEntry("DialSuffix1", MODEM_DEFAULT_DIAL_SUFFIX1 ); |
50 | m_dialPref2 = config.readEntry("DialPrefix2", MODEM_DEFAULT_DIAL_PREFIX1 ); | 54 | m_dialPref2 = config.readEntry("DialPrefix2", MODEM_DEFAULT_DIAL_PREFIX1 ); |
51 | m_dialSuf2 = config.readEntry("DialSuffix2", MODEM_DEFAULT_DIAL_SUFFIX1 ); | 55 | m_dialSuf2 = config.readEntry("DialSuffix2", MODEM_DEFAULT_DIAL_SUFFIX1 ); |
52 | m_dialPref3 = config.readEntry("DialPrefix3", MODEM_DEFAULT_DIAL_PREFIX1 ); | 56 | m_dialPref3 = config.readEntry("DialPrefix3", MODEM_DEFAULT_DIAL_PREFIX1 ); |
53 | m_dialSuf3 = config.readEntry("DialSuffix3", MODEM_DEFAULT_DIAL_SUFFIX1 ); | 57 | m_dialSuf3 = config.readEntry("DialSuffix3", MODEM_DEFAULT_DIAL_SUFFIX1 ); |
54 | m_connect = config.readEntry("DefaultConnect" MODEM_DEFAULT_CONNECT_STRING ); | 58 | m_connect = config.readEntry("DefaultConnect" MODEM_DEFAULT_CONNECT_STRING ); |
55 | m_hangup = config.readEntry("HangupString", MODEM_DEFAULT_HANGUP_STRING ); | 59 | m_hangup = config.readEntry("HangupString", MODEM_DEFAULT_HANGUP_STRING ); |
56 | m_cancel = config.readEntry("CancelString", MODEM_DEFAULT_CANCEL_STRING ); | 60 | m_cancel = config.readEntry("CancelString", MODEM_DEFAULT_CANCEL_STRING ); |
57 | m_dialTime = config.readNumEntry("DialTime", MODEM_DEFAULT_DIAL_TIME ); | 61 | m_dialTime = config.readNumEntry("DialTime", MODEM_DEFAULT_DIAL_TIME ); |
58 | m_delayRedial = config.readNumEntry("DelayRedial", MODEM_DEFAULT_DELAY_REDIAL ); | 62 | m_delayRedial = config.readNumEntry("DelayRedial", MODEM_DEFAULT_DELAY_REDIAL ); |
59 | m_numberTries = config.readNumEntry("NumberTries", MODEM_DEFAULT_NUMBER_TRIES ); | 63 | m_numberTries = config.readNumEntry("NumberTries", MODEM_DEFAULT_NUMBER_TRIES ); |
60 | m_dtrDropTime = config.readNumEntry("DTRDRopTime", MODEM_DEFAULT_DTR_DROP_TIME ); | 64 | m_dtrDropTime = config.readNumEntry("DTRDRopTime", MODEM_DEFAULT_DTR_DROP_TIME ); |
61 | m_bpsDetect = config.readBoolEntry("BPSDetect", MODEM_DEFAULT_BPS_DETECT ); | 65 | m_bpsDetect = config.readBoolEntry("BPSDetect", MODEM_DEFAULT_BPS_DETECT ); |
62 | m_dcdLines = config.readBoolEntry("DCDLines", MODEM_DEFAULT_DCD_LINES ); | 66 | m_dcdLines = config.readBoolEntry("DCDLines", MODEM_DEFAULT_DCD_LINES ); |
63 | m_multiLineUntag = config.readBoolEntry("MultiLineUntag", MODEM_DEFAULT_MULTI_LINE_UNTAG ); | 67 | m_multiLineUntag = config.readBoolEntry("MultiLineUntag", MODEM_DEFAULT_MULTI_LINE_UNTAG ); |
64 | } | 68 | } |
65 | 69 | ||
66 | 70 | ||
67 | QString IOModem::identifier() const { | 71 | QString IOModem::identifier() const { |
68 | return "modem"; | 72 | return "modem"; |
69 | } | 73 | } |
70 | 74 | ||
71 | QString IOModem::name() const { | 75 | QString IOModem::name() const { |
72 | return "Modem IO Layer"; | 76 | return "Modem IO Layer"; |
73 | } | 77 | } |
74 | 78 | ||
75 | void IOModem::slotExited(OProcess* proc ){ | 79 | void IOModem::slotExited(OProcess* proc ){ |
76 | close(); | 80 | close(); |
77 | } | 81 | } |
78 | 82 | ||
diff --git a/noncore/apps/opie-console/io_serial.cpp b/noncore/apps/opie-console/io_serial.cpp index b89a53b..cc63c58 100644 --- a/noncore/apps/opie-console/io_serial.cpp +++ b/noncore/apps/opie-console/io_serial.cpp | |||
@@ -1,176 +1,177 @@ | |||
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 | m_connected = false; | 11 | m_connected = false; |
12 | reload(config); | 12 | reload(config); |
13 | } | 13 | } |
14 | 14 | ||
15 | 15 | ||
16 | IOSerial::~IOSerial() { | 16 | IOSerial::~IOSerial() { |
17 | if (m_fd) { | 17 | if (m_fd) { |
18 | close(); | 18 | close(); |
19 | } | 19 | } |
20 | } | 20 | } |
21 | 21 | ||
22 | void IOSerial::send(const QByteArray &data) { | 22 | void IOSerial::send(const QByteArray &data) { |
23 | if (m_fd) { | 23 | if (m_fd) { |
24 | write(m_fd, data.data(), data.size()); | 24 | write(m_fd, data.data(), data.size()); |
25 | } else { | 25 | } else { |
26 | emit error(Refuse, tr("Not connected")); | 26 | emit error(Refuse, tr("Not connected")); |
27 | } | 27 | } |
28 | } | 28 | } |
29 | 29 | ||
30 | void IOSerial::close() { | 30 | void IOSerial::close() { |
31 | if (m_fd) { | 31 | if (m_fd) { |
32 | delete m_read; | 32 | delete m_read; |
33 | delete m_error; | 33 | delete m_error; |
34 | ::close(m_fd); | 34 | ::close(m_fd); |
35 | m_fd = 0; | 35 | m_fd = 0; |
36 | m_connected = false; | 36 | m_connected = false; |
37 | } else { | 37 | } else { |
38 | m_connected = false; | 38 | m_connected = false; |
39 | emit error(Refuse, tr("Not connected")); | 39 | emit error(Refuse, tr("Not connected")); |
40 | } | 40 | } |
41 | } | 41 | } |
42 | 42 | ||
43 | bool IOSerial::open() { | 43 | bool IOSerial::open() { |
44 | if (!m_fd) { | 44 | if (!m_fd) { |
45 | struct termios tty; | 45 | struct termios tty; |
46 | m_fd = ::open(m_device, O_RDWR | O_NOCTTY | O_NONBLOCK); | 46 | m_fd = ::open(m_device, O_RDWR | O_NOCTTY | O_NONBLOCK); |
47 | if (m_fd < 0) { | 47 | if (m_fd < 0) { |
48 | emit error(CouldNotOpen, strerror(errno)); | 48 | emit error(CouldNotOpen, strerror(errno)); |
49 | m_fd = 0; | ||
49 | return FALSE; | 50 | return FALSE; |
50 | } | 51 | } |
51 | tcgetattr(m_fd, &tty); | 52 | tcgetattr(m_fd, &tty); |
52 | 53 | ||
53 | /* Baud rate */ | 54 | /* Baud rate */ |
54 | int speed = baud(m_baud); | 55 | int speed = baud(m_baud); |
55 | if (speed == -1) { | 56 | if (speed == -1) { |
56 | emit error(Refuse, tr("Invalid baud rate")); | 57 | emit error(Refuse, tr("Invalid baud rate")); |
57 | } | 58 | } |
58 | cfsetospeed(&tty, speed); | 59 | cfsetospeed(&tty, speed); |
59 | cfsetispeed(&tty, speed); | 60 | cfsetispeed(&tty, speed); |
60 | 61 | ||
61 | /* Take care of Space / Mark parity */ | 62 | /* Take care of Space / Mark parity */ |
62 | if (m_dbits == 7 && (m_parity == ParitySpace || m_parity == ParityMark)) { | 63 | if (m_dbits == 7 && (m_parity == ParitySpace || m_parity == ParityMark)) { |
63 | m_dbits = 8; | 64 | m_dbits = 8; |
64 | } | 65 | } |
65 | 66 | ||
66 | /* Data bits */ | 67 | /* Data bits */ |
67 | switch (m_dbits) { | 68 | switch (m_dbits) { |
68 | case 5: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5; break; | 69 | case 5: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5; break; |
69 | case 6: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6; break; | 70 | case 6: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6; break; |
70 | case 7: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7; break; | 71 | case 7: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7; break; |
71 | case 8: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; break; | 72 | case 8: tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; break; |
72 | default: break; | 73 | default: break; |
73 | } | 74 | } |
74 | 75 | ||
75 | /* Raw, no echo mode */ | 76 | /* Raw, no echo mode */ |
76 | tty.c_iflag = IGNBRK; | 77 | tty.c_iflag = IGNBRK; |
77 | tty.c_lflag = 0; | 78 | tty.c_lflag = 0; |
78 | tty.c_oflag = 0; | 79 | tty.c_oflag = 0; |
79 | tty.c_cflag |= CLOCAL | CREAD; | 80 | tty.c_cflag |= CLOCAL | CREAD; |
80 | 81 | ||
81 | /* Stop bits */ | 82 | /* Stop bits */ |
82 | if (m_sbits == 2) { | 83 | if (m_sbits == 2) { |
83 | tty.c_cflag |= CSTOPB; | 84 | tty.c_cflag |= CSTOPB; |
84 | } else { | 85 | } else { |
85 | tty.c_cflag &= ~CSTOPB; | 86 | tty.c_cflag &= ~CSTOPB; |
86 | } | 87 | } |
87 | 88 | ||
88 | tty.c_cc[VMIN] = 1; | 89 | tty.c_cc[VMIN] = 1; |
89 | tty.c_cc[VTIME] = 5; | 90 | tty.c_cc[VTIME] = 5; |
90 | 91 | ||
91 | /* Flow control */ | 92 | /* Flow control */ |
92 | if (m_flow & FlowSW) | 93 | if (m_flow & FlowSW) |
93 | tty.c_iflag |= IXON | IXOFF; | 94 | tty.c_iflag |= IXON | IXOFF; |
94 | else | 95 | else |
95 | tty.c_iflag &= ~(IXON|IXOFF|IXANY); | 96 | tty.c_iflag &= ~(IXON|IXOFF|IXANY); |
96 | 97 | ||
97 | if (m_flow & FlowHW) | 98 | if (m_flow & FlowHW) |
98 | tty.c_cflag |= CRTSCTS; | 99 | tty.c_cflag |= CRTSCTS; |
99 | else | 100 | else |
100 | tty.c_cflag &= ~CRTSCTS; | 101 | tty.c_cflag &= ~CRTSCTS; |
101 | 102 | ||
102 | /* Parity */ | 103 | /* Parity */ |
103 | tty.c_cflag &= ~(PARENB | PARODD); | 104 | tty.c_cflag &= ~(PARENB | PARODD); |
104 | if (m_parity & ParityEven) | 105 | if (m_parity & ParityEven) |
105 | tty.c_cflag |= PARENB; | 106 | tty.c_cflag |= PARENB; |
106 | else if (m_parity & ParityOdd) | 107 | else if (m_parity & ParityOdd) |
107 | tty.c_cflag |= (PARENB | PARODD); | 108 | tty.c_cflag |= (PARENB | PARODD); |
108 | 109 | ||
109 | /* Set the changes */ | 110 | /* Set the changes */ |
110 | tcsetattr(m_fd, TCSANOW, &tty); | 111 | tcsetattr(m_fd, TCSANOW, &tty); |
111 | 112 | ||
112 | /* Notifications on read & errors */ | 113 | /* Notifications on read & errors */ |
113 | m_read = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); | 114 | m_read = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); |
114 | m_error = new QSocketNotifier(m_fd, QSocketNotifier::Exception, this); | 115 | m_error = new QSocketNotifier(m_fd, QSocketNotifier::Exception, this); |
115 | connect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived())); | 116 | connect(m_read, SIGNAL(activated(int)), this, SLOT(dataArrived())); |
116 | connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured())); | 117 | connect(m_error, SIGNAL(activated(int)), this, SLOT(errorOccured())); |
117 | m_connected = false; | 118 | m_connected = false; |
118 | return TRUE; | 119 | return TRUE; |
119 | } else { | 120 | } else { |
120 | emit error(Refuse, tr("Device is already connected")); | 121 | emit error(Refuse, tr("Device is already connected")); |
121 | m_fd = 0; | 122 | m_fd = 0; |
122 | return FALSE; | 123 | return FALSE; |
123 | } | 124 | } |
124 | } | 125 | } |
125 | 126 | ||
126 | void IOSerial::reload(const Profile &config) { | 127 | void IOSerial::reload(const Profile &config) { |
127 | m_device = config.readEntry("Device", SERIAL_DEFAULT_DEVICE); | 128 | m_device = config.readEntry("Device", SERIAL_DEFAULT_DEVICE); |
128 | m_baud = config.readNumEntry("Speed", SERIAL_DEFAULT_BAUD); | 129 | m_baud = config.readNumEntry("Speed", SERIAL_DEFAULT_BAUD); |
129 | m_parity = config.readNumEntry("Parity", SERIAL_DEFAULT_PARITY); | 130 | m_parity = config.readNumEntry("Parity", SERIAL_DEFAULT_PARITY); |
130 | m_dbits = config.readNumEntry("DataBits", SERIAL_DEFAULT_DBITS); | 131 | m_dbits = config.readNumEntry("DataBits", SERIAL_DEFAULT_DBITS); |
131 | m_sbits = config.readNumEntry("StopBits", SERIAL_DEFAULT_SBITS); | 132 | m_sbits = config.readNumEntry("StopBits", SERIAL_DEFAULT_SBITS); |
132 | m_flow = config.readNumEntry("Flow", SERIAL_DEFAULT_FLOW); | 133 | m_flow = config.readNumEntry("Flow", SERIAL_DEFAULT_FLOW); |
133 | 134 | ||
134 | } | 135 | } |
135 | 136 | ||
136 | int IOSerial::baud(int baud) const { | 137 | int IOSerial::baud(int baud) const { |
137 | switch (baud) { | 138 | switch (baud) { |
138 | case 300: return B300; break; | 139 | case 300: return B300; break; |
139 | case 600: return B600; break; | 140 | case 600: return B600; break; |
140 | case 1200: return B1200; break; | 141 | case 1200: return B1200; break; |
141 | case 2400: return B2400; break; | 142 | case 2400: return B2400; break; |
142 | case 4800: return B4800; break; | 143 | case 4800: return B4800; break; |
143 | case 9600: return B9600; break; | 144 | case 9600: return B9600; break; |
144 | case 19200: return B19200; break; | 145 | case 19200: return B19200; break; |
145 | case 38400: return B38400; break; | 146 | case 38400: return B38400; break; |
146 | case 57600: return B57600; break; | 147 | case 57600: return B57600; break; |
147 | case 115200: return B115200; break; | 148 | case 115200: return B115200; break; |
148 | } | 149 | } |
149 | return -1; | 150 | return -1; |
150 | } | 151 | } |
151 | 152 | ||
152 | void IOSerial::errorOccured() { | 153 | void IOSerial::errorOccured() { |
153 | emit error(ClosedUnexpected, strerror(errno)); | 154 | emit error(ClosedUnexpected, strerror(errno)); |
154 | close(); | 155 | close(); |
155 | } | 156 | } |
156 | 157 | ||
157 | void IOSerial::dataArrived() { | 158 | void IOSerial::dataArrived() { |
158 | QByteArray array(4097); | 159 | QByteArray array(4097); |
159 | 160 | ||
160 | int len = read(m_fd, array.data(), 4096); | 161 | int len = read(m_fd, array.data(), 4096); |
161 | if (len == 0) | 162 | if (len == 0) |
162 | close(); | 163 | close(); |
163 | if (len < 0) | 164 | if (len < 0) |
164 | return; | 165 | return; |
165 | array.resize( len ); | 166 | array.resize( len ); |
166 | emit received(array); | 167 | emit received(array); |
167 | } | 168 | } |
168 | 169 | ||
169 | QString IOSerial::identifier() const { | 170 | QString IOSerial::identifier() const { |
170 | return "serial"; | 171 | return "serial"; |
171 | } | 172 | } |
172 | 173 | ||
173 | QString IOSerial::name() const { | 174 | QString IOSerial::name() const { |
174 | return "RS232 Serial IO Layer"; | 175 | return "RS232 Serial IO Layer"; |
175 | } | 176 | } |
176 | int IOSerial::rawIO()const { | 177 | int IOSerial::rawIO()const { |
diff --git a/noncore/apps/opie-console/mainwindow.cpp b/noncore/apps/opie-console/mainwindow.cpp index 4326609..9ccefa0 100644 --- a/noncore/apps/opie-console/mainwindow.cpp +++ b/noncore/apps/opie-console/mainwindow.cpp | |||
@@ -193,302 +193,306 @@ void MainWindow::initUI() { | |||
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 | connect(m_kb, SIGNAL(keyPressed(ushort, ushort, bool, bool, bool)), | 208 | connect(m_kb, SIGNAL(keyPressed(ushort, ushort, bool, bool, bool)), |
209 | this, SLOT(slotKeyReceived(ushort, ushort, bool, bool, bool))); | 209 | this, SLOT(slotKeyReceived(ushort, ushort, bool, bool, bool))); |
210 | 210 | ||
211 | 211 | ||
212 | 212 | ||
213 | m_connect->setEnabled( false ); | 213 | m_connect->setEnabled( false ); |
214 | m_disconnect->setEnabled( false ); | 214 | m_disconnect->setEnabled( false ); |
215 | m_terminate->setEnabled( false ); | 215 | m_terminate->setEnabled( false ); |
216 | m_transfer->setEnabled( false ); | 216 | m_transfer->setEnabled( false ); |
217 | m_recordScript->setEnabled( false ); | 217 | m_recordScript->setEnabled( false ); |
218 | m_saveScript->setEnabled( false ); | 218 | m_saveScript->setEnabled( false ); |
219 | m_runScript->setEnabled( false ); | 219 | m_runScript->setEnabled( false ); |
220 | m_fullscreen->setEnabled( false ); | 220 | m_fullscreen->setEnabled( false ); |
221 | m_closewindow->setEnabled( false ); | 221 | m_closewindow->setEnabled( false ); |
222 | 222 | ||
223 | /* | 223 | /* |
224 | * connect to the menu activation | 224 | * connect to the menu activation |
225 | */ | 225 | */ |
226 | connect( m_sessionsPop, SIGNAL(activated( int ) ), | 226 | connect( m_sessionsPop, SIGNAL(activated( int ) ), |
227 | this, SLOT(slotProfile( int ) ) ); | 227 | this, SLOT(slotProfile( int ) ) ); |
228 | 228 | ||
229 | m_consoleWindow = new TabWidget( this, "blah"); | 229 | m_consoleWindow = new TabWidget( this, "blah"); |
230 | connect(m_consoleWindow, SIGNAL(activated(Session*) ), | 230 | connect(m_consoleWindow, SIGNAL(activated(Session*) ), |
231 | this, SLOT(slotSessionChanged(Session*) ) ); | 231 | this, SLOT(slotSessionChanged(Session*) ) ); |
232 | setCentralWidget( m_consoleWindow ); | 232 | setCentralWidget( m_consoleWindow ); |
233 | 233 | ||
234 | } | 234 | } |
235 | 235 | ||
236 | ProfileManager* MainWindow::manager() { | 236 | ProfileManager* MainWindow::manager() { |
237 | return m_manager; | 237 | return m_manager; |
238 | } | 238 | } |
239 | TabWidget* MainWindow::tabWidget() { | 239 | TabWidget* MainWindow::tabWidget() { |
240 | return m_consoleWindow; | 240 | return m_consoleWindow; |
241 | } | 241 | } |
242 | void MainWindow::populateProfiles() { | 242 | void MainWindow::populateProfiles() { |
243 | m_sessionsPop->clear(); | 243 | m_sessionsPop->clear(); |
244 | Profile::ValueList list = manager()->all(); | 244 | Profile::ValueList list = manager()->all(); |
245 | for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) { | 245 | for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) { |
246 | m_sessionsPop->insertItem( (*it).name() ); | 246 | m_sessionsPop->insertItem( (*it).name() ); |
247 | } | 247 | } |
248 | 248 | ||
249 | } | 249 | } |
250 | MainWindow::~MainWindow() { | 250 | MainWindow::~MainWindow() { |
251 | delete m_factory; | 251 | delete m_factory; |
252 | manager()->save(); | 252 | manager()->save(); |
253 | } | 253 | } |
254 | 254 | ||
255 | MetaFactory* MainWindow::factory() { | 255 | MetaFactory* MainWindow::factory() { |
256 | return m_factory; | 256 | return m_factory; |
257 | } | 257 | } |
258 | 258 | ||
259 | Session* MainWindow::currentSession() { | 259 | Session* MainWindow::currentSession() { |
260 | return m_curSession; | 260 | return m_curSession; |
261 | } | 261 | } |
262 | 262 | ||
263 | QList<Session> MainWindow::sessions() { | 263 | QList<Session> MainWindow::sessions() { |
264 | return m_sessions; | 264 | return m_sessions; |
265 | } | 265 | } |
266 | 266 | ||
267 | void MainWindow::slotNew() { | 267 | void MainWindow::slotNew() { |
268 | ProfileEditorDialog dlg(factory() ); | 268 | ProfileEditorDialog dlg(factory() ); |
269 | dlg.showMaximized(); | 269 | dlg.showMaximized(); |
270 | int ret = dlg.exec(); | 270 | int ret = dlg.exec(); |
271 | 271 | ||
272 | if ( ret == QDialog::Accepted ) { | 272 | if ( ret == QDialog::Accepted ) { |
273 | create( dlg.profile() ); | 273 | create( dlg.profile() ); |
274 | } | 274 | } |
275 | } | 275 | } |
276 | 276 | ||
277 | void MainWindow::slotRecordScript() { | 277 | void MainWindow::slotRecordScript() { |
278 | /* if (currentSession()) { | 278 | /* if (currentSession()) { |
279 | currentSession()->emulationLayer()->startRecording(); | 279 | currentSession()->emulationLayer()->startRecording(); |
280 | } | 280 | } |
281 | */ | 281 | */ |
282 | } | 282 | } |
283 | 283 | ||
284 | void MainWindow::slotSaveScript() { | 284 | void MainWindow::slotSaveScript() { |
285 | /* if (currentSession() && currentSession()->emulationLayer()->isRecording()) { | 285 | /* if (currentSession() && currentSession()->emulationLayer()->isRecording()) { |
286 | MimeTypes types; | 286 | MimeTypes types; |
287 | QStringList script; | 287 | QStringList script; |
288 | script << "text/plain"; | 288 | script << "text/plain"; |
289 | types.insert("Script", script); | 289 | types.insert("Script", script); |
290 | QString filename = OFileDialog::getSaveFileName(2, "/", QString::null, types); | 290 | QString filename = OFileDialog::getSaveFileName(2, "/", QString::null, types); |
291 | if (!filename.isEmpty()) { | 291 | if (!filename.isEmpty()) { |
292 | currentSession()->emulationLayer()->script()->saveTo(filename); | 292 | currentSession()->emulationLayer()->script()->saveTo(filename); |
293 | currentSession()->emulationLayer()->clearScript(); | 293 | currentSession()->emulationLayer()->clearScript(); |
294 | } | 294 | } |
295 | } | 295 | } |
296 | */ | 296 | */ |
297 | } | 297 | } |
298 | 298 | ||
299 | void MainWindow::slotRunScript() { | 299 | void MainWindow::slotRunScript() { |
300 | /* | 300 | /* |
301 | if (currentSession()) { | 301 | if (currentSession()) { |
302 | MimeTypes types; | 302 | MimeTypes types; |
303 | QStringList script; | 303 | QStringList script; |
304 | script << "text/plain"; | 304 | script << "text/plain"; |
305 | types.insert("Script", script); | 305 | types.insert("Script", script); |
306 | QString filename = OFileDialog::getOpenFileName(2, "/", QString::null, types); | 306 | QString filename = OFileDialog::getOpenFileName(2, "/", QString::null, types); |
307 | if (!filename.isEmpty()) { | 307 | if (!filename.isEmpty()) { |
308 | Script script(DocLnk(filename).file()); | 308 | Script script(DocLnk(filename).file()); |
309 | currentSession()->emulationLayer()->runScript(&script); | 309 | currentSession()->emulationLayer()->runScript(&script); |
310 | } | 310 | } |
311 | } | 311 | } |
312 | */ | 312 | */ |
313 | } | 313 | } |
314 | 314 | ||
315 | void MainWindow::slotConnect() { | 315 | void MainWindow::slotConnect() { |
316 | if ( currentSession() ) { | 316 | if ( currentSession() ) { |
317 | bool ret = currentSession()->layer()->open(); | 317 | bool ret = currentSession()->layer()->open(); |
318 | if(!ret) QMessageBox::warning(currentSession()->widgetStack(), | 318 | if(!ret) QMessageBox::warning(currentSession()->widgetStack(), |
319 | QObject::tr("Failed"), | 319 | QObject::tr("Failed"), |
320 | QObject::tr("Connecting failed for this session.")); | 320 | QObject::tr("Connecting failed for this session.")); |
321 | m_connect->setEnabled( false ); | 321 | else { |
322 | m_disconnect->setEnabled( true ); | 322 | m_connect->setEnabled( false ); |
323 | m_disconnect->setEnabled( true ); | ||
324 | } | ||
323 | } | 325 | } |
324 | } | 326 | } |
325 | 327 | ||
326 | void MainWindow::slotDisconnect() { | 328 | void MainWindow::slotDisconnect() { |
327 | if ( currentSession() ) { | 329 | if ( currentSession() ) { |
328 | currentSession()->layer()->close(); | 330 | currentSession()->layer()->close(); |
329 | m_connect->setEnabled( true ); | 331 | m_connect->setEnabled( true ); |
330 | m_disconnect->setEnabled( false ); | 332 | m_disconnect->setEnabled( false ); |
331 | } | 333 | } |
332 | } | 334 | } |
333 | 335 | ||
334 | void MainWindow::slotTerminate() { | 336 | void MainWindow::slotTerminate() { |
335 | if ( currentSession() ) | 337 | if ( currentSession() ) |
336 | currentSession()->layer()->close(); | 338 | currentSession()->layer()->close(); |
337 | 339 | ||
338 | slotClose(); | 340 | slotClose(); |
339 | /* FIXME move to the next session */ | 341 | /* FIXME move to the next session */ |
340 | } | 342 | } |
341 | 343 | ||
342 | void MainWindow::slotConfigure() { | 344 | void MainWindow::slotConfigure() { |
343 | ConfigDialog conf( manager()->all(), factory() ); | 345 | ConfigDialog conf( manager()->all(), factory() ); |
344 | conf.showMaximized(); | 346 | conf.showMaximized(); |
345 | 347 | ||
346 | int ret = conf.exec(); | 348 | int ret = conf.exec(); |
347 | 349 | ||
348 | if ( QDialog::Accepted == ret ) { | 350 | if ( QDialog::Accepted == ret ) { |
349 | manager()->setProfiles( conf.list() ); | 351 | manager()->setProfiles( conf.list() ); |
350 | manager()->save(); | 352 | manager()->save(); |
351 | populateProfiles(); | 353 | populateProfiles(); |
352 | } | 354 | } |
353 | } | 355 | } |
354 | /* | 356 | /* |
355 | * we will remove | 357 | * we will remove |
356 | * this window from the tabwidget | 358 | * this window from the tabwidget |
357 | * remove it from the list | 359 | * remove it from the list |
358 | * delete it | 360 | * delete it |
359 | * and set the currentSession() | 361 | * and set the currentSession() |
360 | */ | 362 | */ |
361 | void MainWindow::slotClose() { | 363 | void MainWindow::slotClose() { |
362 | if (!currentSession() ) | 364 | if (!currentSession() ) |
363 | return; | 365 | return; |
364 | 366 | ||
365 | Session* ses = currentSession(); | 367 | Session* ses = currentSession(); |
366 | qWarning("removing! currentSession %s", currentSession()->name().latin1() ); | 368 | qWarning("removing! currentSession %s", currentSession()->name().latin1() ); |
367 | tabWidget()->remove( currentSession() ); | 369 | /* set to NULL to be safe, if its needed slotSessionChanged resets it automatically */ |
370 | m_curSession = NULL; | ||
371 | tabWidget()->remove( /*currentSession()*/ses ); | ||
368 | /*it's autodelete */ | 372 | /*it's autodelete */ |
369 | m_sessions.remove( ses ); | 373 | m_sessions.remove( ses ); |
370 | qWarning("after remove!!"); | 374 | qWarning("after remove!!"); |
371 | 375 | ||
372 | if (!currentSession() ) { | 376 | if (!currentSession() ) { |
373 | m_connect->setEnabled( false ); | 377 | m_connect->setEnabled( false ); |
374 | m_disconnect->setEnabled( false ); | 378 | m_disconnect->setEnabled( false ); |
375 | m_terminate->setEnabled( false ); | 379 | m_terminate->setEnabled( false ); |
376 | m_transfer->setEnabled( false ); | 380 | m_transfer->setEnabled( false ); |
377 | m_recordScript->setEnabled( false ); | 381 | m_recordScript->setEnabled( false ); |
378 | m_saveScript->setEnabled( false ); | 382 | m_saveScript->setEnabled( false ); |
379 | m_runScript->setEnabled( false ); | 383 | m_runScript->setEnabled( false ); |
380 | m_fullscreen->setEnabled( false ); | 384 | m_fullscreen->setEnabled( false ); |
381 | m_closewindow->setEnabled( false ); | 385 | m_closewindow->setEnabled( false ); |
382 | } | 386 | } |
383 | } | 387 | } |
384 | 388 | ||
385 | /* | 389 | /* |
386 | * We will get the name | 390 | * We will get the name |
387 | * Then the profile | 391 | * Then the profile |
388 | * and then we will make a profile | 392 | * and then we will make a profile |
389 | */ | 393 | */ |
390 | void MainWindow::slotProfile( int id) { | 394 | void MainWindow::slotProfile( int id) { |
391 | Profile prof = manager()->profile( m_sessionsPop->text( id) ); | 395 | Profile prof = manager()->profile( m_sessionsPop->text( id) ); |
392 | create( prof ); | 396 | create( prof ); |
393 | } | 397 | } |
394 | void MainWindow::create( const Profile& prof ) { | 398 | void MainWindow::create( const Profile& prof ) { |
395 | Session *ses = manager()->fromProfile( prof, tabWidget() ); | 399 | Session *ses = manager()->fromProfile( prof, tabWidget() ); |
396 | 400 | ||
397 | if((!ses) || (!ses->layer()) || (!ses->widgetStack())) | 401 | if((!ses) || (!ses->layer()) || (!ses->widgetStack())) |
398 | { | 402 | { |
399 | QMessageBox::warning(this, | 403 | QMessageBox::warning(this, |
400 | QObject::tr("Session failed"), | 404 | QObject::tr("Session failed"), |
401 | QObject::tr("<qt>Cannot open session: Not all components were found.</qt>")); | 405 | QObject::tr("<qt>Cannot open session: Not all components were found.</qt>")); |
402 | //if(ses) delete ses; | 406 | //if(ses) delete ses; |
403 | return; | 407 | return; |
404 | } | 408 | } |
405 | 409 | ||
406 | m_sessions.append( ses ); | 410 | m_sessions.append( ses ); |
407 | tabWidget()->add( ses ); | 411 | tabWidget()->add( ses ); |
408 | m_curSession = ses; | 412 | m_curSession = ses; |
409 | 413 | ||
410 | // dicide if its a local term ( then no connction and no tranfer), maybe make a wrapper method out of it | 414 | // dicide if its a local term ( then no connction and no tranfer), maybe make a wrapper method out of it |
411 | m_connect->setEnabled( true ); | 415 | m_connect->setEnabled( true ); |
412 | m_disconnect->setEnabled( false ); | 416 | m_disconnect->setEnabled( false ); |
413 | m_terminate->setEnabled( true ); | 417 | m_terminate->setEnabled( true ); |
414 | m_transfer->setEnabled( true ); | 418 | m_transfer->setEnabled( true ); |
415 | m_recordScript->setEnabled( true ); | 419 | m_recordScript->setEnabled( true ); |
416 | m_saveScript->setEnabled( true ); | 420 | m_saveScript->setEnabled( true ); |
417 | m_runScript->setEnabled( true ); | 421 | m_runScript->setEnabled( true ); |
418 | m_fullscreen->setEnabled( true ); | 422 | m_fullscreen->setEnabled( true ); |
419 | m_closewindow->setEnabled( true ); | 423 | m_closewindow->setEnabled( true ); |
420 | } | 424 | } |
421 | 425 | ||
422 | void MainWindow::slotTransfer() | 426 | void MainWindow::slotTransfer() |
423 | { | 427 | { |
424 | if ( currentSession() ) { | 428 | if ( currentSession() ) { |
425 | TransferDialog dlg(this); | 429 | TransferDialog dlg(this); |
426 | dlg.showMaximized(); | 430 | dlg.showMaximized(); |
427 | dlg.exec(); | 431 | dlg.exec(); |
428 | } | 432 | } |
429 | } | 433 | } |
430 | 434 | ||
431 | 435 | ||
432 | void MainWindow::slotOpenKeb(bool state) { | 436 | void MainWindow::slotOpenKeb(bool state) { |
433 | 437 | ||
434 | if (state) m_keyBar->show(); | 438 | if (state) m_keyBar->show(); |
435 | else m_keyBar->hide(); | 439 | else m_keyBar->hide(); |
436 | 440 | ||
437 | } | 441 | } |
438 | void MainWindow::slotSessionChanged( Session* ses ) { | 442 | void MainWindow::slotSessionChanged( Session* ses ) { |
439 | qWarning("changed!"); | 443 | qWarning("changed!"); |
440 | if ( ses ) { | 444 | if ( ses ) { |
441 | m_curSession = ses; | 445 | m_curSession = ses; |
442 | qDebug(QString("is connected : %1").arg( m_curSession->layer()->isConnected() ) ); | 446 | qDebug(QString("is connected : %1").arg( m_curSession->layer()->isConnected() ) ); |
443 | if ( m_curSession->layer()->isConnected() ) { | 447 | if ( m_curSession->layer()->isConnected() ) { |
444 | m_connect->setEnabled( false ); | 448 | m_connect->setEnabled( false ); |
445 | m_disconnect->setEnabled( true ); | 449 | m_disconnect->setEnabled( true ); |
446 | } else { | 450 | } else { |
447 | m_connect->setEnabled( true ); | 451 | m_connect->setEnabled( true ); |
448 | m_disconnect->setEnabled( false ); | 452 | m_disconnect->setEnabled( false ); |
449 | } | 453 | } |
450 | } | 454 | } |
451 | } | 455 | } |
452 | 456 | ||
453 | void MainWindow::slotFullscreen() { | 457 | void MainWindow::slotFullscreen() { |
454 | 458 | ||
455 | if ( m_isFullscreen ) { | 459 | if ( m_isFullscreen ) { |
456 | ( m_curSession->widgetStack() )->reparent( m_consoleWindow, 0, QPoint(0,0), false ); | 460 | ( m_curSession->widgetStack() )->reparent( m_consoleWindow, 0, QPoint(0,0), false ); |
457 | ( m_curSession->widgetStack() )->setFrameStyle( QFrame::Panel | QFrame::Sunken ); | 461 | ( m_curSession->widgetStack() )->setFrameStyle( QFrame::Panel | QFrame::Sunken ); |
458 | setCentralWidget( m_consoleWindow ); | 462 | setCentralWidget( m_consoleWindow ); |
459 | ( m_curSession->widgetStack() )->show(); | 463 | ( m_curSession->widgetStack() )->show(); |
460 | m_fullscreen->setText( tr("Full screen") ); | 464 | m_fullscreen->setText( tr("Full screen") ); |
461 | 465 | ||
462 | } else { | 466 | } else { |
463 | ( m_curSession->widgetStack() )->setFrameStyle( QFrame::NoFrame ); | 467 | ( m_curSession->widgetStack() )->setFrameStyle( QFrame::NoFrame ); |
464 | ( m_curSession->widgetStack() )->reparent( 0,WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop, | 468 | ( m_curSession->widgetStack() )->reparent( 0,WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop, |
465 | QPoint(0,0), false); | 469 | QPoint(0,0), false); |
466 | ( m_curSession->widgetStack() )->resize(qApp->desktop()->width(), qApp->desktop()->height()); | 470 | ( m_curSession->widgetStack() )->resize(qApp->desktop()->width(), qApp->desktop()->height()); |
467 | ( m_curSession->widgetStack() )->setFocus(); | 471 | ( m_curSession->widgetStack() )->setFocus(); |
468 | ( m_curSession->widgetStack() )->show(); | 472 | ( m_curSession->widgetStack() )->show(); |
469 | 473 | ||
470 | //QPushButton *cornerButton = new QPushButton( ); | 474 | //QPushButton *cornerButton = new QPushButton( ); |
471 | //cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) ); | 475 | //cornerButton->setPixmap( QPixmap( (const char**)menu_xpm ) ); |
472 | //connect( cornerButton, SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) ); | 476 | //connect( cornerButton, SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) ); |
473 | // need teh scrollbar | 477 | // need teh scrollbar |
474 | // ( m_curSession->widgetStack() )->setCornerWidget( cornerButton ); | 478 | // ( m_curSession->widgetStack() )->setCornerWidget( cornerButton ); |
475 | m_fullscreen->setText( tr("Stop full screen") ); | 479 | m_fullscreen->setText( tr("Stop full screen") ); |
476 | } | 480 | } |
477 | 481 | ||
478 | m_isFullscreen = !m_isFullscreen; | 482 | m_isFullscreen = !m_isFullscreen; |
479 | 483 | ||
480 | } | 484 | } |
481 | 485 | ||
482 | 486 | ||
483 | void MainWindow::slotKeyReceived(ushort u, ushort q, bool, bool, bool) { | 487 | void MainWindow::slotKeyReceived(ushort u, ushort q, bool, bool, bool) { |
484 | 488 | ||
485 | qWarning("received key event! relay to TE widget"); | 489 | qWarning("received key event! relay to TE widget"); |
486 | 490 | ||
487 | if ( m_curSession ) { | 491 | if ( m_curSession ) { |
488 | QKeyEvent ke(QEvent::KeyPress, q, u, 0); | 492 | QKeyEvent ke(QEvent::KeyPress, q, u, 0); |
489 | 493 | ||
490 | ke.ignore(); | 494 | ke.ignore(); |
491 | // where should i send this event? doesnt work sending it here | 495 | // where should i send this event? doesnt work sending it here |
492 | QApplication::sendEvent((QObject *)m_curSession->widgetStack(), &ke); | 496 | QApplication::sendEvent((QObject *)m_curSession->widgetStack(), &ke); |
493 | } | 497 | } |
494 | } | 498 | } |