author | clem <clem> | 2004-10-07 19:36:30 (UTC) |
---|---|---|
committer | clem <clem> | 2004-10-07 19:36:30 (UTC) |
commit | b2e0fd018e1122f65dbbf8ab564e992988f35385 (patch) (unidiff) | |
tree | d47db77ff4ba1e9d397bc682f5d65b05b049dd02 | |
parent | 33c90b7be9d675e8e5b39cfd569997bfcbb5decf (diff) | |
download | opie-b2e0fd018e1122f65dbbf8ab564e992988f35385.zip opie-b2e0fd018e1122f65dbbf8ab564e992988f35385.tar.gz opie-b2e0fd018e1122f65dbbf8ab564e992988f35385.tar.bz2 |
small documentation format fixes
-rw-r--r-- | core/launcher/qprocess.cpp | 6 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice.cpp | 6 | ||||
-rw-r--r-- | libopie2/opiecore/oconfig.h | 2 | ||||
-rw-r--r-- | libopie2/opiecore/odebug.h | 6 | ||||
-rw-r--r-- | libopie2/opiecore/okeyconfigmanager.cpp | 2 | ||||
-rw-r--r-- | libopie2/opiecore/okeyfilter.h | 8 | ||||
-rw-r--r-- | libopie2/opiecore/opluginloader.cpp | 5 | ||||
-rw-r--r-- | libopie2/opiecore/oprocess.h | 8 | ||||
-rw-r--r-- | libopie2/opieui/oimageeffect.h | 6 | ||||
-rw-r--r-- | libopie2/opieui/opixmapeffect.h | 11 | ||||
-rw-r--r-- | libopie2/qt3/opieui/ocombobox.h | 4 | ||||
-rw-r--r-- | libopie2/qt3/opieui/olineedit.h | 6 |
12 files changed, 33 insertions, 37 deletions
diff --git a/core/launcher/qprocess.cpp b/core/launcher/qprocess.cpp index 3fe1238..aef7967 100644 --- a/core/launcher/qprocess.cpp +++ b/core/launcher/qprocess.cpp | |||
@@ -1,639 +1,639 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of the Qtopia Environment. | 4 | ** This file is part of the Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | 20 | ||
21 | #include <stdio.h> | 21 | #include <stdio.h> |
22 | #include <stdlib.h> | 22 | #include <stdlib.h> |
23 | 23 | ||
24 | #include "qprocess.h" | 24 | #include "qprocess.h" |
25 | 25 | ||
26 | #ifndef QT_NO_PROCESS | 26 | #ifndef QT_NO_PROCESS |
27 | 27 | ||
28 | #include "qapplication.h" | 28 | #include "qapplication.h" |
29 | 29 | ||
30 | 30 | ||
31 | //#define QT_QPROCESS_DEBUG | 31 | //#define QT_QPROCESS_DEBUG |
32 | 32 | ||
33 | 33 | ||
34 | /*! | 34 | /*! |
35 | \class QProcess qprocess.h | 35 | \class QProcess qprocess.h |
36 | 36 | ||
37 | \brief The QProcess class is used to start external programs and to | 37 | \brief The QProcess class is used to start external programs and to |
38 | communicate with them. | 38 | communicate with them. |
39 | 39 | ||
40 | This is a temporary class. This will be replaced by Qt 3's QProcess class. | 40 | This is a temporary class. This will be replaced by Qt 3's QProcess class. |
41 | 41 | ||
42 | \ingroup qtopiaemb | 42 | \ingroup qtopiaemb |
43 | */ | 43 | */ |
44 | 44 | ||
45 | /*! | 45 | /*! |
46 | \enum QProcess::Communication | 46 | \enum QProcess::Communication |
47 | 47 | ||
48 | This enum type defines the communication channels connected to the | 48 | This enum type defines the communication channels connected to the |
49 | process. | 49 | process. |
50 | 50 | ||
51 | \value Stdin Data can be written to the process's standard input. | 51 | \value Stdin Data can be written to the process's standard input. |
52 | 52 | ||
53 | \value Stdout Data can be read from the process's standard output. | 53 | \value Stdout Data can be read from the process's standard output. |
54 | 54 | ||
55 | \value Stderr Data can be read from the process's standard error. | 55 | \value Stderr Data can be read from the process's standard error. |
56 | 56 | ||
57 | \value DupStderr Duplicates standard error to standard output for new | 57 | \value DupStderr Duplicates standard error to standard output for new |
58 | processes; i.e. everything that the process writes to standard error, is | 58 | processes; i.e. everything that the process writes to standard error, is |
59 | reported by QProcess on standard output instead. This is especially useful if | 59 | reported by QProcess on standard output instead. This is especially useful if |
60 | your application requires that the output on standard output and standard | 60 | your application requires that the output on standard output and standard |
61 | error is read in the same order as the process output it. Please note that | 61 | error is read in the same order as the process output it. Please note that |
62 | this is a binary flag, so if you want to activate this together with standard | 62 | this is a binary flag, so if you want to activate this together with standard |
63 | input, output and error redirection (the default), you have to specify | 63 | input, output and error redirection (the default), you have to specify |
64 | \c{Stdin|Stdout|Stderr|DupStderr} for the setCommunication() call. | 64 | \c {Stdin|Stdout|Stderr|DupStderr} for the setCommunication() call. |
65 | 65 | ||
66 | \sa setCommunication() communication() | 66 | \sa setCommunication() communication() |
67 | */ | 67 | */ |
68 | 68 | ||
69 | /*! | 69 | /*! |
70 | Constructs a QProcess object. The \a parent and \a name parameters are passed | 70 | Constructs a QProcess object. The \a parent and \a name parameters are passed |
71 | to the QObject constructor. | 71 | to the QObject constructor. |
72 | 72 | ||
73 | \sa setArguments() addArgument() start() | 73 | \sa setArguments() addArgument() start() |
74 | */ | 74 | */ |
75 | QProcess::QProcess( QObject *parent, const char *name ) | 75 | QProcess::QProcess( QObject *parent, const char *name ) |
76 | : QObject( parent, name ), ioRedirection( FALSE ), notifyOnExit( FALSE ), | 76 | : QObject( parent, name ), ioRedirection( FALSE ), notifyOnExit( FALSE ), |
77 | wroteToStdinConnected( FALSE ), | 77 | wroteToStdinConnected( FALSE ), |
78 | readStdoutCalled( FALSE ), readStderrCalled( FALSE ), | 78 | readStdoutCalled( FALSE ), readStderrCalled( FALSE ), |
79 | comms( Stdin|Stdout|Stderr ) | 79 | comms( Stdin|Stdout|Stderr ) |
80 | { | 80 | { |
81 | init(); | 81 | init(); |
82 | } | 82 | } |
83 | 83 | ||
84 | /*! | 84 | /*! |
85 | Constructs a QProcess with \a arg0 as the command to be executed. The | 85 | Constructs a QProcess with \a arg0 as the command to be executed. The |
86 | \a parent and \a name parameters are passed to the QObject constructor. | 86 | \a parent and \a name parameters are passed to the QObject constructor. |
87 | 87 | ||
88 | The process is not started. You must call start() or launch() | 88 | The process is not started. You must call start() or launch() |
89 | to start the process. | 89 | to start the process. |
90 | 90 | ||
91 | \sa setArguments() addArgument() start() | 91 | \sa setArguments() addArgument() start() |
92 | */ | 92 | */ |
93 | QProcess::QProcess( const QString& arg0, QObject *parent, const char *name ) | 93 | QProcess::QProcess( const QString& arg0, QObject *parent, const char *name ) |
94 | : QObject( parent, name ), ioRedirection( FALSE ), notifyOnExit( FALSE ), | 94 | : QObject( parent, name ), ioRedirection( FALSE ), notifyOnExit( FALSE ), |
95 | wroteToStdinConnected( FALSE ), | 95 | wroteToStdinConnected( FALSE ), |
96 | readStdoutCalled( FALSE ), readStderrCalled( FALSE ), | 96 | readStdoutCalled( FALSE ), readStderrCalled( FALSE ), |
97 | comms( Stdin|Stdout|Stderr ) | 97 | comms( Stdin|Stdout|Stderr ) |
98 | { | 98 | { |
99 | init(); | 99 | init(); |
100 | addArgument( arg0 ); | 100 | addArgument( arg0 ); |
101 | } | 101 | } |
102 | 102 | ||
103 | /*! | 103 | /*! |
104 | Constructs a QProcess with \a args as the arguments of the process. The first | 104 | Constructs a QProcess with \a args as the arguments of the process. The first |
105 | element in the list is the command to be executed. The other elements in the | 105 | element in the list is the command to be executed. The other elements in the |
106 | list are the arguments to this command. The \a parent and \a name | 106 | list are the arguments to this command. The \a parent and \a name |
107 | parameters are passed to the QObject constructor. | 107 | parameters are passed to the QObject constructor. |
108 | 108 | ||
109 | The process is not started. You must call start() or launch() | 109 | The process is not started. You must call start() or launch() |
110 | to start the process. | 110 | to start the process. |
111 | 111 | ||
112 | \sa setArguments() addArgument() start() | 112 | \sa setArguments() addArgument() start() |
113 | */ | 113 | */ |
114 | QProcess::QProcess( const QStringList& args, QObject *parent, const char *name ) | 114 | QProcess::QProcess( const QStringList& args, QObject *parent, const char *name ) |
115 | : QObject( parent, name ), ioRedirection( FALSE ), notifyOnExit( FALSE ), | 115 | : QObject( parent, name ), ioRedirection( FALSE ), notifyOnExit( FALSE ), |
116 | wroteToStdinConnected( FALSE ), | 116 | wroteToStdinConnected( FALSE ), |
117 | readStdoutCalled( FALSE ), readStderrCalled( FALSE ), | 117 | readStdoutCalled( FALSE ), readStderrCalled( FALSE ), |
118 | comms( Stdin|Stdout|Stderr ) | 118 | comms( Stdin|Stdout|Stderr ) |
119 | { | 119 | { |
120 | init(); | 120 | init(); |
121 | setArguments( args ); | 121 | setArguments( args ); |
122 | } | 122 | } |
123 | 123 | ||
124 | 124 | ||
125 | /*! | 125 | /*! |
126 | Returns the list of arguments that are set for the process. Arguments can be | 126 | Returns the list of arguments that are set for the process. Arguments can be |
127 | specified with the constructor or with the functions setArguments() and | 127 | specified with the constructor or with the functions setArguments() and |
128 | addArgument(). | 128 | addArgument(). |
129 | 129 | ||
130 | \sa setArguments() addArgument() | 130 | \sa setArguments() addArgument() |
131 | */ | 131 | */ |
132 | QStringList QProcess::arguments() const | 132 | QStringList QProcess::arguments() const |
133 | { | 133 | { |
134 | return _arguments; | 134 | return _arguments; |
135 | } | 135 | } |
136 | 136 | ||
137 | /*! | 137 | /*! |
138 | Clears the list of arguments that are set for the process. | 138 | Clears the list of arguments that are set for the process. |
139 | 139 | ||
140 | \sa setArguments() addArgument() | 140 | \sa setArguments() addArgument() |
141 | */ | 141 | */ |
142 | void QProcess::clearArguments() | 142 | void QProcess::clearArguments() |
143 | { | 143 | { |
144 | _arguments.clear(); | 144 | _arguments.clear(); |
145 | } | 145 | } |
146 | 146 | ||
147 | /*! | 147 | /*! |
148 | Sets \a args as the arguments for the process. The first element in the list | 148 | Sets \a args as the arguments for the process. The first element in the list |
149 | is the command to be executed. The other elements in the list are the | 149 | is the command to be executed. The other elements in the list are the |
150 | arguments to the command. Any previous arguments are deleted. | 150 | arguments to the command. Any previous arguments are deleted. |
151 | 151 | ||
152 | \sa arguments() addArgument() | 152 | \sa arguments() addArgument() |
153 | */ | 153 | */ |
154 | void QProcess::setArguments( const QStringList& args ) | 154 | void QProcess::setArguments( const QStringList& args ) |
155 | { | 155 | { |
156 | _arguments = args; | 156 | _arguments = args; |
157 | } | 157 | } |
158 | 158 | ||
159 | /*! | 159 | /*! |
160 | Adds \a arg to the end of the list of arguments. | 160 | Adds \a arg to the end of the list of arguments. |
161 | 161 | ||
162 | The first element in the list of arguments is the command to be | 162 | The first element in the list of arguments is the command to be |
163 | executed; the following elements are the arguments to the command. | 163 | executed; the following elements are the arguments to the command. |
164 | 164 | ||
165 | \sa arguments() setArguments() | 165 | \sa arguments() setArguments() |
166 | */ | 166 | */ |
167 | void QProcess::addArgument( const QString& arg ) | 167 | void QProcess::addArgument( const QString& arg ) |
168 | { | 168 | { |
169 | _arguments.append( arg ); | 169 | _arguments.append( arg ); |
170 | } | 170 | } |
171 | 171 | ||
172 | #ifndef QT_NO_DIR | 172 | #ifndef QT_NO_DIR |
173 | /*! | 173 | /*! |
174 | Returns the working directory that was set with | 174 | Returns the working directory that was set with |
175 | setWorkingDirectory(), or the current directory if none has been | 175 | setWorkingDirectory(), or the current directory if none has been |
176 | set. | 176 | set. |
177 | 177 | ||
178 | \sa setWorkingDirectory() QDir::current() | 178 | \sa setWorkingDirectory() QDir::current() |
179 | */ | 179 | */ |
180 | QDir QProcess::workingDirectory() const | 180 | QDir QProcess::workingDirectory() const |
181 | { | 181 | { |
182 | return workingDir; | 182 | return workingDir; |
183 | } | 183 | } |
184 | 184 | ||
185 | /*! | 185 | /*! |
186 | Sets \a dir as the working directory for a process. This does not affect | 186 | Sets \a dir as the working directory for a process. This does not affect |
187 | running processes; only processes that are started afterwards are affected. | 187 | running processes; only processes that are started afterwards are affected. |
188 | 188 | ||
189 | Setting the working directory is especially useful for processes that try to | 189 | Setting the working directory is especially useful for processes that try to |
190 | access files with relative filenames. | 190 | access files with relative filenames. |
191 | 191 | ||
192 | \sa workingDirectory() start() | 192 | \sa workingDirectory() start() |
193 | */ | 193 | */ |
194 | void QProcess::setWorkingDirectory( const QDir& dir ) | 194 | void QProcess::setWorkingDirectory( const QDir& dir ) |
195 | { | 195 | { |
196 | workingDir = dir; | 196 | workingDir = dir; |
197 | } | 197 | } |
198 | #endif //QT_NO_DIR | 198 | #endif //QT_NO_DIR |
199 | 199 | ||
200 | /*! | 200 | /*! |
201 | Returns the communication required with the process. | 201 | Returns the communication required with the process. |
202 | 202 | ||
203 | \sa setCommunication() | 203 | \sa setCommunication() |
204 | */ | 204 | */ |
205 | int QProcess::communication() const | 205 | int QProcess::communication() const |
206 | { | 206 | { |
207 | return comms; | 207 | return comms; |
208 | } | 208 | } |
209 | 209 | ||
210 | /*! | 210 | /*! |
211 | Sets \a commFlags as the communication required with the process. | 211 | Sets \a commFlags as the communication required with the process. |
212 | 212 | ||
213 | \a commFlags is a bitwise OR between the flags defined in \c Communication. | 213 | \a commFlags is a bitwise OR between the flags defined in \c Communication. |
214 | 214 | ||
215 | The default is \c{Stdin|Stdout|Stderr}. | 215 | The default is \c {Stdin|Stdout|Stderr}. |
216 | 216 | ||
217 | \sa communication() | 217 | \sa communication() |
218 | */ | 218 | */ |
219 | void QProcess::setCommunication( int commFlags ) | 219 | void QProcess::setCommunication( int commFlags ) |
220 | { | 220 | { |
221 | comms = commFlags; | 221 | comms = commFlags; |
222 | } | 222 | } |
223 | 223 | ||
224 | /*! | 224 | /*! |
225 | Returns TRUE if the process has exited normally; otherwise returns | 225 | Returns TRUE if the process has exited normally; otherwise returns |
226 | FALSE. This implies that this function returns FALSE if the process | 226 | FALSE. This implies that this function returns FALSE if the process |
227 | is still running. | 227 | is still running. |
228 | 228 | ||
229 | \sa isRunning() exitStatus() processExited() | 229 | \sa isRunning() exitStatus() processExited() |
230 | */ | 230 | */ |
231 | bool QProcess::normalExit() const | 231 | bool QProcess::normalExit() const |
232 | { | 232 | { |
233 | // isRunning() has the side effect that it determines the exit status! | 233 | // isRunning() has the side effect that it determines the exit status! |
234 | if ( isRunning() ) | 234 | if ( isRunning() ) |
235 | return FALSE; | 235 | return FALSE; |
236 | else | 236 | else |
237 | return exitNormal; | 237 | return exitNormal; |
238 | } | 238 | } |
239 | 239 | ||
240 | /*! | 240 | /*! |
241 | Returns the exit status of the process or 0 if the process is still | 241 | Returns the exit status of the process or 0 if the process is still |
242 | running. This function returns immediately and does not wait until | 242 | running. This function returns immediately and does not wait until |
243 | the process is finished. | 243 | the process is finished. |
244 | 244 | ||
245 | If normalExit() is FALSE (e.g. if the program was killed or | 245 | If normalExit() is FALSE (e.g. if the program was killed or |
246 | crashed), this function returns 0, so you should check the return | 246 | crashed), this function returns 0, so you should check the return |
247 | value of normalExit() before relying on this value. | 247 | value of normalExit() before relying on this value. |
248 | 248 | ||
249 | \sa normalExit() processExited() | 249 | \sa normalExit() processExited() |
250 | */ | 250 | */ |
251 | int QProcess::exitStatus() const | 251 | int QProcess::exitStatus() const |
252 | { | 252 | { |
253 | // isRunning() has the side effect that it determines the exit status! | 253 | // isRunning() has the side effect that it determines the exit status! |
254 | if ( isRunning() ) | 254 | if ( isRunning() ) |
255 | return 0; | 255 | return 0; |
256 | else | 256 | else |
257 | return exitStat; | 257 | return exitStat; |
258 | } | 258 | } |
259 | 259 | ||
260 | 260 | ||
261 | /*! | 261 | /*! |
262 | Reads the data that the process has written to standard output. When | 262 | Reads the data that the process has written to standard output. When |
263 | new data is written to standard output, the class emits the signal | 263 | new data is written to standard output, the class emits the signal |
264 | readyReadStdout(). | 264 | readyReadStdout(). |
265 | 265 | ||
266 | If there is no data to read, this function returns a QByteArray of | 266 | If there is no data to read, this function returns a QByteArray of |
267 | size 0: it does not wait until there is something to read. | 267 | size 0: it does not wait until there is something to read. |
268 | 268 | ||
269 | \sa readyReadStdout() readLineStdout() readStderr() writeToStdin() | 269 | \sa readyReadStdout() readLineStdout() readStderr() writeToStdin() |
270 | */ | 270 | */ |
271 | QByteArray QProcess::readStdout() | 271 | QByteArray QProcess::readStdout() |
272 | { | 272 | { |
273 | if ( readStdoutCalled ) { | 273 | if ( readStdoutCalled ) { |
274 | return QByteArray(); | 274 | return QByteArray(); |
275 | } | 275 | } |
276 | readStdoutCalled = TRUE; | 276 | readStdoutCalled = TRUE; |
277 | 277 | ||
278 | QByteArray buf = bufStdout()->copy(); | 278 | QByteArray buf = bufStdout()->copy(); |
279 | consumeBufStdout( -1 ); // consume everything | 279 | consumeBufStdout( -1 ); // consume everything |
280 | 280 | ||
281 | readStdoutCalled = FALSE; | 281 | readStdoutCalled = FALSE; |
282 | return buf; | 282 | return buf; |
283 | } | 283 | } |
284 | 284 | ||
285 | /*! | 285 | /*! |
286 | Reads the data that the process has written to standard error. When | 286 | Reads the data that the process has written to standard error. When |
287 | new data is written to standard error, the class emits the signal | 287 | new data is written to standard error, the class emits the signal |
288 | readyReadStderr(). | 288 | readyReadStderr(). |
289 | 289 | ||
290 | If there is no data to read, this function returns a QByteArray of | 290 | If there is no data to read, this function returns a QByteArray of |
291 | size 0: it does not wait until there is something to read. | 291 | size 0: it does not wait until there is something to read. |
292 | 292 | ||
293 | \sa readyReadStderr() readLineStderr() readStdout() writeToStdin() | 293 | \sa readyReadStderr() readLineStderr() readStdout() writeToStdin() |
294 | */ | 294 | */ |
295 | QByteArray QProcess::readStderr() | 295 | QByteArray QProcess::readStderr() |
296 | { | 296 | { |
297 | if ( readStderrCalled ) { | 297 | if ( readStderrCalled ) { |
298 | return QByteArray(); | 298 | return QByteArray(); |
299 | } | 299 | } |
300 | readStderrCalled = TRUE; | 300 | readStderrCalled = TRUE; |
301 | 301 | ||
302 | QByteArray buf = bufStderr()->copy(); | 302 | QByteArray buf = bufStderr()->copy(); |
303 | consumeBufStderr( -1 ); // consume everything | 303 | consumeBufStderr( -1 ); // consume everything |
304 | 304 | ||
305 | readStderrCalled = FALSE; | 305 | readStderrCalled = FALSE; |
306 | return buf; | 306 | return buf; |
307 | } | 307 | } |
308 | 308 | ||
309 | /*! | 309 | /*! |
310 | Returns TRUE if it's possible to read an entire line of text from | 310 | Returns TRUE if it's possible to read an entire line of text from |
311 | standard output at this time; otherwise returns FALSE. | 311 | standard output at this time; otherwise returns FALSE. |
312 | 312 | ||
313 | \sa readLineStdout() canReadLineStderr() | 313 | \sa readLineStdout() canReadLineStderr() |
314 | */ | 314 | */ |
315 | bool QProcess::canReadLineStdout() const | 315 | bool QProcess::canReadLineStdout() const |
316 | { | 316 | { |
317 | QProcess *that = (QProcess*)this; | 317 | QProcess *that = (QProcess*)this; |
318 | return that->scanNewline( TRUE, 0 ); | 318 | return that->scanNewline( TRUE, 0 ); |
319 | } | 319 | } |
320 | 320 | ||
321 | /*! | 321 | /*! |
322 | Returns TRUE if it's possible to read an entire line of text from | 322 | Returns TRUE if it's possible to read an entire line of text from |
323 | standard error at this time; otherwise returns FALSE. | 323 | standard error at this time; otherwise returns FALSE. |
324 | 324 | ||
325 | \sa readLineStderr() canReadLineStdout() | 325 | \sa readLineStderr() canReadLineStdout() |
326 | */ | 326 | */ |
327 | bool QProcess::canReadLineStderr() const | 327 | bool QProcess::canReadLineStderr() const |
328 | { | 328 | { |
329 | QProcess *that = (QProcess*)this; | 329 | QProcess *that = (QProcess*)this; |
330 | return that->scanNewline( FALSE, 0 ); | 330 | return that->scanNewline( FALSE, 0 ); |
331 | } | 331 | } |
332 | 332 | ||
333 | /*! | 333 | /*! |
334 | Reads a line of text from standard output, excluding any trailing newline or | 334 | Reads a line of text from standard output, excluding any trailing newline or |
335 | carriage return characters, and returns it. Returns QString::null if | 335 | carriage return characters, and returns it. Returns QString::null if |
336 | canReadLineStdout() returns FALSE. | 336 | canReadLineStdout() returns FALSE. |
337 | 337 | ||
338 | \sa canReadLineStdout() readyReadStdout() readStdout() readLineStderr() | 338 | \sa canReadLineStdout() readyReadStdout() readStdout() readLineStderr() |
339 | */ | 339 | */ |
340 | QString QProcess::readLineStdout() | 340 | QString QProcess::readLineStdout() |
341 | { | 341 | { |
342 | QByteArray a; | 342 | QByteArray a; |
343 | QString s; | 343 | QString s; |
344 | if ( scanNewline( TRUE, &a ) ) { | 344 | if ( scanNewline( TRUE, &a ) ) { |
345 | if ( a.isEmpty() ) | 345 | if ( a.isEmpty() ) |
346 | s = ""; | 346 | s = ""; |
347 | else | 347 | else |
348 | s = QString( a ); | 348 | s = QString( a ); |
349 | } | 349 | } |
350 | return s; | 350 | return s; |
351 | } | 351 | } |
352 | 352 | ||
353 | /*! | 353 | /*! |
354 | Reads a line of text from standard error, excluding any trailing newline or | 354 | Reads a line of text from standard error, excluding any trailing newline or |
355 | carriage return characters and returns it. Returns QString::null if | 355 | carriage return characters and returns it. Returns QString::null if |
356 | canReadLineStderr() returns FALSE. | 356 | canReadLineStderr() returns FALSE. |
357 | 357 | ||
358 | \sa canReadLineStderr() readyReadStderr() readStderr() readLineStdout() | 358 | \sa canReadLineStderr() readyReadStderr() readStderr() readLineStdout() |
359 | */ | 359 | */ |
360 | QString QProcess::readLineStderr() | 360 | QString QProcess::readLineStderr() |
361 | { | 361 | { |
362 | QByteArray a; | 362 | QByteArray a; |
363 | QString s; | 363 | QString s; |
364 | if ( scanNewline( FALSE, &a ) ) { | 364 | if ( scanNewline( FALSE, &a ) ) { |
365 | if ( a.isEmpty() ) | 365 | if ( a.isEmpty() ) |
366 | s = ""; | 366 | s = ""; |
367 | else | 367 | else |
368 | s = QString( a ); | 368 | s = QString( a ); |
369 | } | 369 | } |
370 | return s; | 370 | return s; |
371 | } | 371 | } |
372 | 372 | ||
373 | /*! | 373 | /*! |
374 | This private function scans for any occurrence of \n or \r\n in the | 374 | This private function scans for any occurrence of \\n or \\r\\n in the |
375 | buffer \e buf. It stores the text in the byte array \a store if it is | 375 | buffer \e buf. It stores the text in the byte array \a store if it is |
376 | non-null. | 376 | non-null. |
377 | */ | 377 | */ |
378 | bool QProcess::scanNewline( bool stdOut, QByteArray *store ) | 378 | bool QProcess::scanNewline( bool stdOut, QByteArray *store ) |
379 | { | 379 | { |
380 | QByteArray *buf; | 380 | QByteArray *buf; |
381 | if ( stdOut ) | 381 | if ( stdOut ) |
382 | buf = bufStdout(); | 382 | buf = bufStdout(); |
383 | else | 383 | else |
384 | buf = bufStderr(); | 384 | buf = bufStderr(); |
385 | uint n = buf->size(); | 385 | uint n = buf->size(); |
386 | uint i; | 386 | uint i; |
387 | for ( i=0; i<n; i++ ) { | 387 | for ( i=0; i<n; i++ ) { |
388 | if ( buf->at(i) == '\n' ) { | 388 | if ( buf->at(i) == '\n' ) { |
389 | break; | 389 | break; |
390 | } | 390 | } |
391 | } | 391 | } |
392 | if ( i >= n ) | 392 | if ( i >= n ) |
393 | return FALSE; | 393 | return FALSE; |
394 | 394 | ||
395 | if ( store ) { | 395 | if ( store ) { |
396 | uint lineLength = i; | 396 | uint lineLength = i; |
397 | if ( lineLength>0 && buf->at(lineLength-1) == '\r' ) | 397 | if ( lineLength>0 && buf->at(lineLength-1) == '\r' ) |
398 | lineLength--; // (if there are two \r, let one stay) | 398 | lineLength--; // (if there are two \r, let one stay) |
399 | store->resize( lineLength ); | 399 | store->resize( lineLength ); |
400 | memcpy( store->data(), buf->data(), lineLength ); | 400 | memcpy( store->data(), buf->data(), lineLength ); |
401 | if ( stdOut ) | 401 | if ( stdOut ) |
402 | consumeBufStdout( i+1 ); | 402 | consumeBufStdout( i+1 ); |
403 | else | 403 | else |
404 | consumeBufStderr( i+1 ); | 404 | consumeBufStderr( i+1 ); |
405 | } | 405 | } |
406 | return TRUE; | 406 | return TRUE; |
407 | } | 407 | } |
408 | 408 | ||
409 | /*! | 409 | /*! |
410 | \fn void QProcess::launchFinished() | 410 | \fn void QProcess::launchFinished() |
411 | 411 | ||
412 | This signal is emitted when the process was started with launch(). | 412 | This signal is emitted when the process was started with launch(). |
413 | If the start was successful, this signal is emitted after all the | 413 | If the start was successful, this signal is emitted after all the |
414 | data has been written to standard input. If the start failed, then | 414 | data has been written to standard input. If the start failed, then |
415 | this signal is emitted immediately. | 415 | this signal is emitted immediately. |
416 | 416 | ||
417 | \sa launch() QObject::deleteLater() | 417 | \sa launch() QObject::deleteLater() |
418 | */ | 418 | */ |
419 | 419 | ||
420 | /*! | 420 | /*! |
421 | Runs the process and writes the data \a buf to the process's standard input. | 421 | Runs the process and writes the data \a buf to the process's standard input. |
422 | If all the data is written to standard input, standard input is | 422 | If all the data is written to standard input, standard input is |
423 | closed. The command is searched for in the path for executable programs; | 423 | closed. The command is searched for in the path for executable programs; |
424 | you can also use an absolute path in the command itself. | 424 | you can also use an absolute path in the command itself. |
425 | 425 | ||
426 | If \a env is null, then the process is started with the same environment as | 426 | If \a env is null, then the process is started with the same environment as |
427 | the starting process. If \a env is non-null, then the values in the | 427 | the starting process. If \a env is non-null, then the values in the |
428 | stringlist are interpreted as environment setttings of the form \c | 428 | stringlist are interpreted as environment setttings of the form \c |
429 | {key=value} and the process is started with these environment settings. For | 429 | {key=value} and the process is started with these environment settings. For |
430 | convenience, there is a small exception to this rule under Unix: if \a env | 430 | convenience, there is a small exception to this rule under Unix: if \a env |
431 | does not contain any settings for the environment variable \c | 431 | does not contain any settings for the environment variable \c |
432 | LD_LIBRARY_PATH, then this variable is inherited from the starting process. | 432 | LD_LIBRARY_PATH, then this variable is inherited from the starting process. |
433 | 433 | ||
434 | Returns TRUE if the process could be started; otherwise returns FALSE. | 434 | Returns TRUE if the process could be started; otherwise returns FALSE. |
435 | 435 | ||
436 | Note that you should not use the slots writeToStdin() and closeStdin() on | 436 | Note that you should not use the slots writeToStdin() and closeStdin() on |
437 | processes started with launch(), since the result is not well-defined. If you | 437 | processes started with launch(), since the result is not well-defined. If you |
438 | need these slots, use start() instead. | 438 | need these slots, use start() instead. |
439 | 439 | ||
440 | The process may or may not read the \a buf data sent to its standard | 440 | The process may or may not read the \a buf data sent to its standard |
441 | input. | 441 | input. |
442 | 442 | ||
443 | You can call this function even when a process that was started with | 443 | You can call this function even when a process that was started with |
444 | this instance is still running. Be aware that if you do this the | 444 | this instance is still running. Be aware that if you do this the |
445 | standard input of the process that was launched first will be | 445 | standard input of the process that was launched first will be |
446 | closed, with any pending data being deleted, and the process will be | 446 | closed, with any pending data being deleted, and the process will be |
447 | left to run out of your control. Similarly, if the process could not | 447 | left to run out of your control. Similarly, if the process could not |
448 | be started the standard input will be closed and the pending data | 448 | be started the standard input will be closed and the pending data |
449 | deleted. (On operating systems that have zombie processes, Qt will | 449 | deleted. (On operating systems that have zombie processes, Qt will |
450 | also wait() on the old process.) | 450 | also wait() on the old process.) |
451 | 451 | ||
452 | The object emits the signal launchFinished() when this function | 452 | The object emits the signal launchFinished() when this function |
453 | call is finished. If the start was successful, this signal is | 453 | call is finished. If the start was successful, this signal is |
454 | emitted after all the data has been written to standard input. If | 454 | emitted after all the data has been written to standard input. If |
455 | the start failed, then this signal is emitted immediately. | 455 | the start failed, then this signal is emitted immediately. |
456 | 456 | ||
457 | \sa start() launchFinished(); | 457 | \sa start() launchFinished(); |
458 | */ | 458 | */ |
459 | bool QProcess::launch( const QByteArray& buf, QStringList *env ) | 459 | bool QProcess::launch( const QByteArray& buf, QStringList *env ) |
460 | { | 460 | { |
461 | if ( start( env ) ) { | 461 | if ( start( env ) ) { |
462 | if ( !buf.isEmpty() ) { | 462 | if ( !buf.isEmpty() ) { |
463 | connect( this, SIGNAL(wroteToStdin()), | 463 | connect( this, SIGNAL(wroteToStdin()), |
464 | this, SLOT(closeStdinLaunch()) ); | 464 | this, SLOT(closeStdinLaunch()) ); |
465 | writeToStdin( buf ); | 465 | writeToStdin( buf ); |
466 | } else { | 466 | } else { |
467 | closeStdin(); | 467 | closeStdin(); |
468 | emit launchFinished(); | 468 | emit launchFinished(); |
469 | } | 469 | } |
470 | return TRUE; | 470 | return TRUE; |
471 | } else { | 471 | } else { |
472 | emit launchFinished(); | 472 | emit launchFinished(); |
473 | return FALSE; | 473 | return FALSE; |
474 | } | 474 | } |
475 | } | 475 | } |
476 | 476 | ||
477 | /*! \overload | 477 | /*! \overload |
478 | 478 | ||
479 | The data \a buf is written to standard input with writeToStdin() | 479 | The data \a buf is written to standard input with writeToStdin() |
480 | using the QString::local8Bit() representation of the strings. | 480 | using the QString::local8Bit() representation of the strings. |
481 | */ | 481 | */ |
482 | bool QProcess::launch( const QString& buf, QStringList *env ) | 482 | bool QProcess::launch( const QString& buf, QStringList *env ) |
483 | { | 483 | { |
484 | if ( start( env ) ) { | 484 | if ( start( env ) ) { |
485 | if ( !buf.isEmpty() ) { | 485 | if ( !buf.isEmpty() ) { |
486 | connect( this, SIGNAL(wroteToStdin()), | 486 | connect( this, SIGNAL(wroteToStdin()), |
487 | this, SLOT(closeStdinLaunch()) ); | 487 | this, SLOT(closeStdinLaunch()) ); |
488 | writeToStdin( buf ); | 488 | writeToStdin( buf ); |
489 | } else { | 489 | } else { |
490 | closeStdin(); | 490 | closeStdin(); |
491 | emit launchFinished(); | 491 | emit launchFinished(); |
492 | } | 492 | } |
493 | return TRUE; | 493 | return TRUE; |
494 | } else { | 494 | } else { |
495 | emit launchFinished(); | 495 | emit launchFinished(); |
496 | return FALSE; | 496 | return FALSE; |
497 | } | 497 | } |
498 | } | 498 | } |
499 | 499 | ||
500 | /*! | 500 | /*! |
501 | This private slot is used by the launch() functions to close standard input. | 501 | This private slot is used by the launch() functions to close standard input. |
502 | */ | 502 | */ |
503 | void QProcess::closeStdinLaunch() | 503 | void QProcess::closeStdinLaunch() |
504 | { | 504 | { |
505 | disconnect( this, SIGNAL(wroteToStdin()), | 505 | disconnect( this, SIGNAL(wroteToStdin()), |
506 | this, SLOT(closeStdinLaunch()) ); | 506 | this, SLOT(closeStdinLaunch()) ); |
507 | closeStdin(); | 507 | closeStdin(); |
508 | emit launchFinished(); | 508 | emit launchFinished(); |
509 | } | 509 | } |
510 | 510 | ||
511 | 511 | ||
512 | /*! | 512 | /*! |
513 | \fn void QProcess::readyReadStdout() | 513 | \fn void QProcess::readyReadStdout() |
514 | 514 | ||
515 | This signal is emitted when the process has written data to standard output. | 515 | This signal is emitted when the process has written data to standard output. |
516 | You can read the data with readStdout(). | 516 | You can read the data with readStdout(). |
517 | 517 | ||
518 | Note that this signal is only emitted when there is new data and not | 518 | Note that this signal is only emitted when there is new data and not |
519 | when there is old, but unread data. In the slot connected to this signal, you | 519 | when there is old, but unread data. In the slot connected to this signal, you |
520 | should always read everything that is available at that moment to make sure | 520 | should always read everything that is available at that moment to make sure |
521 | that you don't lose any data. | 521 | that you don't lose any data. |
522 | 522 | ||
523 | \sa readStdout() readLineStdout() readyReadStderr() | 523 | \sa readStdout() readLineStdout() readyReadStderr() |
524 | */ | 524 | */ |
525 | /*! | 525 | /*! |
526 | \fn void QProcess::readyReadStderr() | 526 | \fn void QProcess::readyReadStderr() |
527 | 527 | ||
528 | This signal is emitted when the process has written data to standard error. | 528 | This signal is emitted when the process has written data to standard error. |
529 | You can read the data with readStderr(). | 529 | You can read the data with readStderr(). |
530 | 530 | ||
531 | Note that this signal is only emitted when there is new data and not | 531 | Note that this signal is only emitted when there is new data and not |
532 | when there is old, but unread data. In the slot connected to this signal, you | 532 | when there is old, but unread data. In the slot connected to this signal, you |
533 | should always read everything that is available at that moment to make sure | 533 | should always read everything that is available at that moment to make sure |
534 | that you don't lose any data. | 534 | that you don't lose any data. |
535 | 535 | ||
536 | \sa readStderr() readLineStderr() readyReadStdout() | 536 | \sa readStderr() readLineStderr() readyReadStdout() |
537 | */ | 537 | */ |
538 | /*! | 538 | /*! |
539 | \fn void QProcess::processExited() | 539 | \fn void QProcess::processExited() |
540 | 540 | ||
541 | This signal is emitted when the process has exited. | 541 | This signal is emitted when the process has exited. |
542 | 542 | ||
543 | \sa isRunning() normalExit() exitStatus() start() launch() | 543 | \sa isRunning() normalExit() exitStatus() start() launch() |
544 | */ | 544 | */ |
545 | /*! | 545 | /*! |
546 | \fn void QProcess::wroteToStdin() | 546 | \fn void QProcess::wroteToStdin() |
547 | 547 | ||
548 | This signal is emitted if the data sent to standard input (via | 548 | This signal is emitted if the data sent to standard input (via |
549 | writeToStdin()) was actually written to the process. This does not | 549 | writeToStdin()) was actually written to the process. This does not |
550 | imply that the process really read the data, since this class only detects | 550 | imply that the process really read the data, since this class only detects |
551 | when it was able to write the data to the operating system. But it is now | 551 | when it was able to write the data to the operating system. But it is now |
552 | safe to close standard input without losing pending data. | 552 | safe to close standard input without losing pending data. |
553 | 553 | ||
554 | \sa writeToStdin() closeStdin() | 554 | \sa writeToStdin() closeStdin() |
555 | */ | 555 | */ |
556 | 556 | ||
557 | 557 | ||
558 | /*! \overload | 558 | /*! \overload |
559 | 559 | ||
560 | The string \a buf is handled as text using | 560 | The string \a buf is handled as text using |
561 | the QString::local8Bit() representation. | 561 | the QString::local8Bit() representation. |
562 | */ | 562 | */ |
563 | void QProcess::writeToStdin( const QString& buf ) | 563 | void QProcess::writeToStdin( const QString& buf ) |
564 | { | 564 | { |
565 | QByteArray tmp = buf.local8Bit(); | 565 | QByteArray tmp = buf.local8Bit(); |
566 | tmp.resize( buf.length() ); | 566 | tmp.resize( buf.length() ); |
567 | writeToStdin( tmp ); | 567 | writeToStdin( tmp ); |
568 | } | 568 | } |
569 | 569 | ||
570 | 570 | ||
571 | /* | 571 | /* |
572 | * Under Windows the implementation is not so nice: it is not that easy to | 572 | * Under Windows the implementation is not so nice: it is not that easy to |
573 | * detect when one of the signals should be emitted; therefore there are some | 573 | * detect when one of the signals should be emitted; therefore there are some |
574 | * timers that query the information. | 574 | * timers that query the information. |
575 | * To keep it a little efficient, use the timers only when they are needed. | 575 | * To keep it a little efficient, use the timers only when they are needed. |
576 | * They are needed, if you are interested in the signals. So use | 576 | * They are needed, if you are interested in the signals. So use |
577 | * connectNotify() and disconnectNotify() to keep track of your interest. | 577 | * connectNotify() and disconnectNotify() to keep track of your interest. |
578 | */ | 578 | */ |
579 | /*! \reimp | 579 | /*! \reimp |
580 | */ | 580 | */ |
581 | void QProcess::connectNotify( const char * signal ) | 581 | void QProcess::connectNotify( const char * signal ) |
582 | { | 582 | { |
583 | #if defined(QT_QPROCESS_DEBUG) | 583 | #if defined(QT_QPROCESS_DEBUG) |
584 | odebug << "QProcess::connectNotify(): signal " << signal << " has been connected" << oendl; | 584 | odebug << "QProcess::connectNotify(): signal " << signal << " has been connected" << oendl; |
585 | #endif | 585 | #endif |
586 | if ( !ioRedirection ) | 586 | if ( !ioRedirection ) |
587 | if ( qstrcmp( signal, SIGNAL(readyReadStdout()) )==0 || | 587 | if ( qstrcmp( signal, SIGNAL(readyReadStdout()) )==0 || |
588 | qstrcmp( signal, SIGNAL(readyReadStderr()) )==0 | 588 | qstrcmp( signal, SIGNAL(readyReadStderr()) )==0 |
589 | ) { | 589 | ) { |
590 | #if defined(QT_QPROCESS_DEBUG) | 590 | #if defined(QT_QPROCESS_DEBUG) |
591 | odebug << "QProcess::connectNotify(): set ioRedirection to TRUE" << oendl; | 591 | odebug << "QProcess::connectNotify(): set ioRedirection to TRUE" << oendl; |
592 | #endif | 592 | #endif |
593 | setIoRedirection( TRUE ); | 593 | setIoRedirection( TRUE ); |
594 | return; | 594 | return; |
595 | } | 595 | } |
596 | if ( !notifyOnExit && qstrcmp( signal, SIGNAL(processExited()) )==0 ) { | 596 | if ( !notifyOnExit && qstrcmp( signal, SIGNAL(processExited()) )==0 ) { |
597 | #if defined(QT_QPROCESS_DEBUG) | 597 | #if defined(QT_QPROCESS_DEBUG) |
598 | odebug << "QProcess::connectNotify(): set notifyOnExit to TRUE" << oendl; | 598 | odebug << "QProcess::connectNotify(): set notifyOnExit to TRUE" << oendl; |
599 | #endif | 599 | #endif |
600 | setNotifyOnExit( TRUE ); | 600 | setNotifyOnExit( TRUE ); |
601 | return; | 601 | return; |
602 | } | 602 | } |
603 | if ( !wroteToStdinConnected && qstrcmp( signal, SIGNAL(wroteToStdin()) )==0 ) { | 603 | if ( !wroteToStdinConnected && qstrcmp( signal, SIGNAL(wroteToStdin()) )==0 ) { |
604 | #if defined(QT_QPROCESS_DEBUG) | 604 | #if defined(QT_QPROCESS_DEBUG) |
605 | odebug << "QProcess::connectNotify(): set wroteToStdinConnected to TRUE" << oendl; | 605 | odebug << "QProcess::connectNotify(): set wroteToStdinConnected to TRUE" << oendl; |
606 | #endif | 606 | #endif |
607 | setWroteStdinConnected( TRUE ); | 607 | setWroteStdinConnected( TRUE ); |
608 | return; | 608 | return; |
609 | } | 609 | } |
610 | } | 610 | } |
611 | 611 | ||
612 | /*! \reimp | 612 | /*! \reimp |
613 | */ | 613 | */ |
614 | void QProcess::disconnectNotify( const char * ) | 614 | void QProcess::disconnectNotify( const char * ) |
615 | { | 615 | { |
616 | if ( ioRedirection && | 616 | if ( ioRedirection && |
617 | receivers( SIGNAL(readyReadStdout()) ) ==0 && | 617 | receivers( SIGNAL(readyReadStdout()) ) ==0 && |
618 | receivers( SIGNAL(readyReadStderr()) ) ==0 | 618 | receivers( SIGNAL(readyReadStderr()) ) ==0 |
619 | ) { | 619 | ) { |
620 | #if defined(QT_QPROCESS_DEBUG) | 620 | #if defined(QT_QPROCESS_DEBUG) |
621 | odebug << "QProcess::disconnectNotify(): set ioRedirection to FALSE" << oendl; | 621 | odebug << "QProcess::disconnectNotify(): set ioRedirection to FALSE" << oendl; |
622 | #endif | 622 | #endif |
623 | setIoRedirection( FALSE ); | 623 | setIoRedirection( FALSE ); |
624 | } | 624 | } |
625 | if ( notifyOnExit && receivers( SIGNAL(processExited()) ) == 0 ) { | 625 | if ( notifyOnExit && receivers( SIGNAL(processExited()) ) == 0 ) { |
626 | #if defined(QT_QPROCESS_DEBUG) | 626 | #if defined(QT_QPROCESS_DEBUG) |
627 | odebug << "QProcess::disconnectNotify(): set notifyOnExit to FALSE" << oendl; | 627 | odebug << "QProcess::disconnectNotify(): set notifyOnExit to FALSE" << oendl; |
628 | #endif | 628 | #endif |
629 | setNotifyOnExit( FALSE ); | 629 | setNotifyOnExit( FALSE ); |
630 | } | 630 | } |
631 | if ( wroteToStdinConnected && receivers( SIGNAL(wroteToStdin()) ) == 0 ) { | 631 | if ( wroteToStdinConnected && receivers( SIGNAL(wroteToStdin()) ) == 0 ) { |
632 | #if defined(QT_QPROCESS_DEBUG) | 632 | #if defined(QT_QPROCESS_DEBUG) |
633 | odebug << "QProcess::disconnectNotify(): set wroteToStdinConnected to FALSE" << oendl; | 633 | odebug << "QProcess::disconnectNotify(): set wroteToStdinConnected to FALSE" << oendl; |
634 | #endif | 634 | #endif |
635 | setWroteStdinConnected( FALSE ); | 635 | setWroteStdinConnected( FALSE ); |
636 | } | 636 | } |
637 | } | 637 | } |
638 | 638 | ||
639 | #endif // QT_NO_PROCESS | 639 | #endif // QT_NO_PROCESS |
diff --git a/libopie2/opiecore/device/odevice.cpp b/libopie2/opiecore/device/odevice.cpp index b5ae4e5..8b64c41 100644 --- a/libopie2/opiecore/device/odevice.cpp +++ b/libopie2/opiecore/device/odevice.cpp | |||
@@ -1,852 +1,852 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) The Opie Team <opie-devel@handhelds.org> | 3 | Copyright (C) The Opie Team <opie-devel@handhelds.org> |
4 | =. | 4 | =. |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "odevice_beagle.h" | 30 | #include "odevice_beagle.h" |
31 | #include "odevice_ipaq.h" | 31 | #include "odevice_ipaq.h" |
32 | #include "odevice_jornada.h" | 32 | #include "odevice_jornada.h" |
33 | #include "odevice_ramses.h" | 33 | #include "odevice_ramses.h" |
34 | #include "odevice_simpad.h" | 34 | #include "odevice_simpad.h" |
35 | #include "odevice_yopy.h" | 35 | #include "odevice_yopy.h" |
36 | #include "odevice_zaurus.h" | 36 | #include "odevice_zaurus.h" |
37 | 37 | ||
38 | /* QT */ | 38 | /* QT */ |
39 | #include <qapplication.h> | 39 | #include <qapplication.h> |
40 | #include <qfile.h> | 40 | #include <qfile.h> |
41 | #include <qtextstream.h> | 41 | #include <qtextstream.h> |
42 | #include <qwindowsystem_qws.h> | 42 | #include <qwindowsystem_qws.h> |
43 | 43 | ||
44 | /* OPIE */ | 44 | /* OPIE */ |
45 | #include <qpe/config.h> | 45 | #include <qpe/config.h> |
46 | #include <qpe/resource.h> | 46 | #include <qpe/resource.h> |
47 | #include <qpe/sound.h> | 47 | #include <qpe/sound.h> |
48 | #include <qpe/qcopenvelope_qws.h> | 48 | #include <qpe/qcopenvelope_qws.h> |
49 | #include <qpe/sound.h> | 49 | #include <qpe/sound.h> |
50 | #include <opie2/okeyfilter.h> | 50 | #include <opie2/okeyfilter.h> |
51 | 51 | ||
52 | /* STD */ | 52 | /* STD */ |
53 | #include <fcntl.h> | 53 | #include <fcntl.h> |
54 | #include <math.h> | 54 | #include <math.h> |
55 | #include <stdlib.h> | 55 | #include <stdlib.h> |
56 | #include <signal.h> | 56 | #include <signal.h> |
57 | #include <sys/ioctl.h> | 57 | #include <sys/ioctl.h> |
58 | #include <sys/time.h> | 58 | #include <sys/time.h> |
59 | #include <unistd.h> | 59 | #include <unistd.h> |
60 | #ifndef QT_NO_SOUND | 60 | #ifndef QT_NO_SOUND |
61 | #include <linux/soundcard.h> | 61 | #include <linux/soundcard.h> |
62 | #endif | 62 | #endif |
63 | 63 | ||
64 | namespace Opie { | 64 | namespace Opie { |
65 | namespace Core { | 65 | namespace Core { |
66 | 66 | ||
67 | static const char* PATH_PROC_CPUINFO = "/proc/cpuinfo"; | 67 | static const char* PATH_PROC_CPUINFO = "/proc/cpuinfo"; |
68 | 68 | ||
69 | 69 | ||
70 | /* STATIC and common implementation */ | 70 | /* STATIC and common implementation */ |
71 | /* EXPORT */ ODistribution distributions[] = { | 71 | /* EXPORT */ ODistribution distributions[] = { |
72 | { System_Familiar, "FamiliarLinux", "/etc/familiar-version" }, | 72 | { System_Familiar, "FamiliarLinux", "/etc/familiar-version" }, |
73 | { System_OpenZaurus, "OpenZaurus", "/etc/oz_version" }, | 73 | { System_OpenZaurus, "OpenZaurus", "/etc/oz_version" }, |
74 | { System_OpenEmbedded, "OpenEmbedded", "/etc/oe-version" }, | 74 | { System_OpenEmbedded, "OpenEmbedded", "/etc/oe-version" }, |
75 | { System_Unknown, "Linux", "/etc/issue" }, | 75 | { System_Unknown, "Linux", "/etc/issue" }, |
76 | }; | 76 | }; |
77 | 77 | ||
78 | 78 | ||
79 | /* EXPORT */ bool isQWS(){ | 79 | /* EXPORT */ bool isQWS(){ |
80 | return qApp ? ( qApp->type() == QApplication::GuiServer ) : false; | 80 | return qApp ? ( qApp->type() == QApplication::GuiServer ) : false; |
81 | } | 81 | } |
82 | 82 | ||
83 | /* EXPORT */ QCString makeChannel ( const char *str ){ | 83 | /* EXPORT */ QCString makeChannel ( const char *str ){ |
84 | if ( str && !::strchr ( str, '/' )) | 84 | if ( str && !::strchr ( str, '/' )) |
85 | return QCString ( "QPE/Application/" ) + str; | 85 | return QCString ( "QPE/Application/" ) + str; |
86 | else | 86 | else |
87 | return str; | 87 | return str; |
88 | } | 88 | } |
89 | 89 | ||
90 | 90 | ||
91 | 91 | ||
92 | /* Now the default implementation of ODevice */ | 92 | /* Now the default implementation of ODevice */ |
93 | 93 | ||
94 | struct default_button default_buttons [] = { | 94 | struct default_button default_buttons [] = { |
95 | { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), | 95 | { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), |
96 | "devicebuttons/z_calendar", | 96 | "devicebuttons/z_calendar", |
97 | "datebook", "nextView()", | 97 | "datebook", "nextView()", |
98 | "today", "raise()" }, | 98 | "today", "raise()" }, |
99 | { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), | 99 | { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), |
100 | "devicebuttons/z_contact", | 100 | "devicebuttons/z_contact", |
101 | "addressbook", "raise()", | 101 | "addressbook", "raise()", |
102 | "addressbook", "beamBusinessCard()" }, | 102 | "addressbook", "beamBusinessCard()" }, |
103 | { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), | 103 | { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), |
104 | "devicebuttons/z_home", | 104 | "devicebuttons/z_home", |
105 | "QPE/Launcher", "home()", | 105 | "QPE/Launcher", "home()", |
106 | "buttonsettings", "raise()" }, | 106 | "buttonsettings", "raise()" }, |
107 | { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), | 107 | { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), |
108 | "devicebuttons/z_menu", | 108 | "devicebuttons/z_menu", |
109 | "QPE/TaskBar", "toggleMenu()", | 109 | "QPE/TaskBar", "toggleMenu()", |
110 | "QPE/TaskBar", "toggleStartMenu()" }, | 110 | "QPE/TaskBar", "toggleStartMenu()" }, |
111 | { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), | 111 | { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), |
112 | "devicebuttons/z_mail", | 112 | "devicebuttons/z_mail", |
113 | "opiemail", "raise()", | 113 | "opiemail", "raise()", |
114 | "opiemail", "newMail()" }, | 114 | "opiemail", "newMail()" }, |
115 | }; | 115 | }; |
116 | 116 | ||
117 | ODevice *ODevice::inst() | 117 | ODevice *ODevice::inst() |
118 | { | 118 | { |
119 | static ODevice *dev = 0; | 119 | static ODevice *dev = 0; |
120 | 120 | ||
121 | // rewrite this to only use /proc/cpuinfo or so | 121 | // rewrite this to only use /proc/cpuinfo or so |
122 | QString cpu_info; | 122 | QString cpu_info; |
123 | 123 | ||
124 | if ( !dev ) | 124 | if ( !dev ) |
125 | { | 125 | { |
126 | QFile f( PATH_PROC_CPUINFO ); | 126 | QFile f( PATH_PROC_CPUINFO ); |
127 | if ( f.open( IO_ReadOnly ) ) | 127 | if ( f.open( IO_ReadOnly ) ) |
128 | { | 128 | { |
129 | QTextStream s( &f ); | 129 | QTextStream s( &f ); |
130 | while ( !s.atEnd() ) | 130 | while ( !s.atEnd() ) |
131 | { | 131 | { |
132 | QString line; | 132 | QString line; |
133 | line = s.readLine(); | 133 | line = s.readLine(); |
134 | if ( line.startsWith( "Hardware" ) ) | 134 | if ( line.startsWith( "Hardware" ) ) |
135 | { | 135 | { |
136 | qDebug( "ODevice() - found '%s'", (const char*) line ); | 136 | qDebug( "ODevice() - found '%s'", (const char*) line ); |
137 | cpu_info = line; | 137 | cpu_info = line; |
138 | if ( line.contains( "sharp", false ) ) dev = new Internal::Zaurus(); | 138 | if ( line.contains( "sharp", false ) ) dev = new Internal::Zaurus(); |
139 | else if ( line.contains( "ipaq", false ) ) dev = new Internal::iPAQ(); | 139 | else if ( line.contains( "ipaq", false ) ) dev = new Internal::iPAQ(); |
140 | else if ( line.contains( "simpad", false ) ) dev = new Internal::SIMpad(); | 140 | else if ( line.contains( "simpad", false ) ) dev = new Internal::SIMpad(); |
141 | else if ( line.contains( "jornada", false ) ) dev = new Internal::Jornada(); | 141 | else if ( line.contains( "jornada", false ) ) dev = new Internal::Jornada(); |
142 | else if ( line.contains( "ramses", false ) ) dev = new Internal::Ramses(); | 142 | else if ( line.contains( "ramses", false ) ) dev = new Internal::Ramses(); |
143 | else if ( line.contains( "Tradesquare.NL", false ) ) dev = new Internal::Beagle(); | 143 | else if ( line.contains( "Tradesquare.NL", false ) ) dev = new Internal::Beagle(); |
144 | else qWarning( "ODevice() - unknown hardware - using default." ); | 144 | else qWarning( "ODevice() - unknown hardware - using default." ); |
145 | break; | 145 | break; |
146 | } | 146 | } |
147 | } | 147 | } |
148 | } | 148 | } |
149 | else | 149 | else |
150 | { | 150 | { |
151 | qWarning( "ODevice() - can't open '%s' - unknown hardware - using default.", PATH_PROC_CPUINFO ); | 151 | qWarning( "ODevice() - can't open '%s' - unknown hardware - using default.", PATH_PROC_CPUINFO ); |
152 | } | 152 | } |
153 | if ( !dev ) dev = new ODevice(); | 153 | if ( !dev ) dev = new ODevice(); |
154 | dev->init(cpu_info); | 154 | dev->init(cpu_info); |
155 | } | 155 | } |
156 | return dev; | 156 | return dev; |
157 | } | 157 | } |
158 | 158 | ||
159 | ODevice::ODevice() | 159 | ODevice::ODevice() |
160 | { | 160 | { |
161 | d = new ODeviceData; | 161 | d = new ODeviceData; |
162 | 162 | ||
163 | d->m_modelstr = "Unknown"; | 163 | d->m_modelstr = "Unknown"; |
164 | d->m_model = Model_Unknown; | 164 | d->m_model = Model_Unknown; |
165 | d->m_vendorstr = "Unknown"; | 165 | d->m_vendorstr = "Unknown"; |
166 | d->m_vendor = Vendor_Unknown; | 166 | d->m_vendor = Vendor_Unknown; |
167 | d->m_systemstr = "Unknown"; | 167 | d->m_systemstr = "Unknown"; |
168 | d->m_system = System_Unknown; | 168 | d->m_system = System_Unknown; |
169 | d->m_sysverstr = "0.0"; | 169 | d->m_sysverstr = "0.0"; |
170 | d->m_rotation = Rot0; | 170 | d->m_rotation = Rot0; |
171 | d->m_direction = CW; | 171 | d->m_direction = CW; |
172 | 172 | ||
173 | d->m_holdtime = 1000; // 1000ms | 173 | d->m_holdtime = 1000; // 1000ms |
174 | d->m_buttons = 0; | 174 | d->m_buttons = 0; |
175 | d->m_cpu_frequencies = new QStrList; | 175 | d->m_cpu_frequencies = new QStrList; |
176 | 176 | ||
177 | 177 | ||
178 | /* mixer */ | 178 | /* mixer */ |
179 | d->m_sound = d->m_vol = d->m_mixer = -1; | 179 | d->m_sound = d->m_vol = d->m_mixer = -1; |
180 | 180 | ||
181 | // New distribution detection code first checks for legacy distributions, | 181 | // New distribution detection code first checks for legacy distributions, |
182 | // identified by /etc/familiar-version or /etc/oz_version. | 182 | // identified by /etc/familiar-version or /etc/oz_version. |
183 | // Then check for OpenEmbedded and lastly, read /etc/issue | 183 | // Then check for OpenEmbedded and lastly, read /etc/issue |
184 | 184 | ||
185 | for ( unsigned int i = 0; i < sizeof distributions; ++i ) | 185 | for ( unsigned int i = 0; i < sizeof distributions; ++i ) |
186 | { | 186 | { |
187 | if ( QFile::exists( distributions[i].sysvfile ) ) | 187 | if ( QFile::exists( distributions[i].sysvfile ) ) |
188 | { | 188 | { |
189 | d->m_systemstr = distributions[i].sysstr; | 189 | d->m_systemstr = distributions[i].sysstr; |
190 | d->m_system = distributions[i].system; | 190 | d->m_system = distributions[i].system; |
191 | d->m_sysverstr = "<Unknown>"; | 191 | d->m_sysverstr = "<Unknown>"; |
192 | QFile f( distributions[i].sysvfile ); | 192 | QFile f( distributions[i].sysvfile ); |
193 | if ( f.open( IO_ReadOnly ) ) | 193 | if ( f.open( IO_ReadOnly ) ) |
194 | { | 194 | { |
195 | QTextStream ts( &f ); | 195 | QTextStream ts( &f ); |
196 | d->m_sysverstr = ts.readLine().replace( QRegExp( "\\\\." ), "" ); | 196 | d->m_sysverstr = ts.readLine().replace( QRegExp( "\\\\." ), "" ); |
197 | } | 197 | } |
198 | break; | 198 | break; |
199 | } | 199 | } |
200 | } | 200 | } |
201 | } | 201 | } |
202 | 202 | ||
203 | void ODevice::systemMessage( const QCString &msg, const QByteArray & ) | 203 | void ODevice::systemMessage( const QCString &msg, const QByteArray & ) |
204 | { | 204 | { |
205 | if ( msg == "deviceButtonMappingChanged()" ) { | 205 | if ( msg == "deviceButtonMappingChanged()" ) { |
206 | reloadButtonMapping(); | 206 | reloadButtonMapping(); |
207 | } | 207 | } |
208 | } | 208 | } |
209 | 209 | ||
210 | void ODevice::init(const QString&) | 210 | void ODevice::init(const QString&) |
211 | { | 211 | { |
212 | } | 212 | } |
213 | 213 | ||
214 | /** | 214 | /** |
215 | * This method initialises the button mapping | 215 | * This method initialises the button mapping |
216 | */ | 216 | */ |
217 | void ODevice::initButtons() | 217 | void ODevice::initButtons() |
218 | { | 218 | { |
219 | if ( d->m_buttons ) | 219 | if ( d->m_buttons ) |
220 | return; | 220 | return; |
221 | 221 | ||
222 | qDebug ( "init Buttons" ); | 222 | qDebug ( "init Buttons" ); |
223 | d->m_buttons = new QValueList <ODeviceButton>; | 223 | d->m_buttons = new QValueList <ODeviceButton>; |
224 | for ( uint i = 0; i < ( sizeof( default_buttons ) / sizeof( default_button )); i++ ) { | 224 | for ( uint i = 0; i < ( sizeof( default_buttons ) / sizeof( default_button )); i++ ) { |
225 | default_button *db = default_buttons + i; | 225 | default_button *db = default_buttons + i; |
226 | ODeviceButton b; | 226 | ODeviceButton b; |
227 | b. setKeycode ( db->code ); | 227 | b. setKeycode ( db->code ); |
228 | b. setUserText ( QObject::tr ( "Button", db->utext )); | 228 | b. setUserText ( QObject::tr ( "Button", db->utext )); |
229 | b. setPixmap ( Resource::loadPixmap ( db->pix )); | 229 | b. setPixmap ( Resource::loadPixmap ( db->pix )); |
230 | b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( db->fpressedservice ), db->fpressedaction )); | 230 | b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( db->fpressedservice ), db->fpressedaction )); |
231 | b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( db->fheldservice ), db->fheldaction )); | 231 | b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( db->fheldservice ), db->fheldaction )); |
232 | d->m_buttons->append ( b ); | 232 | d->m_buttons->append ( b ); |
233 | } | 233 | } |
234 | 234 | ||
235 | reloadButtonMapping(); | 235 | reloadButtonMapping(); |
236 | 236 | ||
237 | QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); | 237 | QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); |
238 | connect ( sysch, SIGNAL( received(const QCString&,const QByteArray&)), this, SLOT( systemMessage(const QCString&,const QByteArray&))); | 238 | connect ( sysch, SIGNAL( received(const QCString&,const QByteArray&)), this, SLOT( systemMessage(const QCString&,const QByteArray&))); |
239 | } | 239 | } |
240 | 240 | ||
241 | ODevice::~ODevice() | 241 | ODevice::~ODevice() |
242 | { | 242 | { |
243 | // we leak m_devicebuttons and m_cpu_frequency | 243 | // we leak m_devicebuttons and m_cpu_frequency |
244 | // but it's a singleton and it is not so importantant | 244 | // but it's a singleton and it is not so importantant |
245 | // -zecke | 245 | // -zecke |
246 | delete d; | 246 | delete d; |
247 | } | 247 | } |
248 | 248 | ||
249 | bool ODevice::setSoftSuspend ( bool /*soft*/ ) | 249 | bool ODevice::setSoftSuspend ( bool /*soft*/ ) |
250 | { | 250 | { |
251 | return false; | 251 | return false; |
252 | } | 252 | } |
253 | 253 | ||
254 | //#include <linux/apm_bios.h> | 254 | //#include <linux/apm_bios.h> |
255 | 255 | ||
256 | #define APM_IOC_SUSPEND OD_IO( 'A', 2 ) | 256 | #define APM_IOC_SUSPEND OD_IO( 'A', 2 ) |
257 | 257 | ||
258 | /** | 258 | /** |
259 | * This method will try to suspend the device | 259 | * This method will try to suspend the device |
260 | * It only works if the user is the QWS Server and the apm application | 260 | * It only works if the user is the QWS Server and the apm application |
261 | * is installed. | 261 | * is installed. |
262 | * It tries to suspend and then waits some time cause some distributions | 262 | * It tries to suspend and then waits some time cause some distributions |
263 | * do have asynchronus apm implementations. | 263 | * do have asynchronus apm implementations. |
264 | * This method will either fail and return false or it'll suspend the | 264 | * This method will either fail and return false or it'll suspend the |
265 | * device and return once the device got woken up | 265 | * device and return once the device got woken up |
266 | * | 266 | * |
267 | * @return if the device got suspended | 267 | * @return if the device got suspended |
268 | */ | 268 | */ |
269 | bool ODevice::suspend() | 269 | bool ODevice::suspend() |
270 | { | 270 | { |
271 | if ( !isQWS( ) ) // only qwsserver is allowed to suspend | 271 | if ( !isQWS( ) ) // only qwsserver is allowed to suspend |
272 | return false; | 272 | return false; |
273 | 273 | ||
274 | if ( d->m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices | 274 | if ( d->m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices |
275 | return false; | 275 | return false; |
276 | 276 | ||
277 | bool res = false; | 277 | bool res = false; |
278 | ODevice::sendSuspendmsg(); | 278 | ODevice::sendSuspendmsg(); |
279 | 279 | ||
280 | struct timeval tvs, tvn; | 280 | struct timeval tvs, tvn; |
281 | ::gettimeofday ( &tvs, 0 ); | 281 | ::gettimeofday ( &tvs, 0 ); |
282 | 282 | ||
283 | ::sync(); // flush fs caches | 283 | ::sync(); // flush fs caches |
284 | res = ( ::system ( "apm --suspend" ) == 0 ); | 284 | res = ( ::system ( "apm --suspend" ) == 0 ); |
285 | 285 | ||
286 | // This is needed because the iPAQ apm implementation is asynchronous and we | 286 | // This is needed because the iPAQ apm implementation is asynchronous and we |
287 | // can not be sure when exactly the device is really suspended | 287 | // can not be sure when exactly the device is really suspended |
288 | // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists. | 288 | // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists. |
289 | 289 | ||
290 | if ( res ) { | 290 | if ( res ) { |
291 | do { // wait at most 1.5 sec: either suspend didn't work or the device resumed | 291 | do { // wait at most 1.5 sec: either suspend didn't work or the device resumed |
292 | ::usleep ( 200 * 1000 ); | 292 | ::usleep ( 200 * 1000 ); |
293 | ::gettimeofday ( &tvn, 0 ); | 293 | ::gettimeofday ( &tvn, 0 ); |
294 | } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); | 294 | } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); |
295 | } | 295 | } |
296 | 296 | ||
297 | return res; | 297 | return res; |
298 | } | 298 | } |
299 | 299 | ||
300 | //#include <linux/fb.h> better not rely on kernel headers in userspace ... | 300 | //#include <linux/fb.h> better not rely on kernel headers in userspace ... |
301 | 301 | ||
302 | #define FBIOBLANK OD_IO( 'F', 0x11 ) // 0x4611 | 302 | #define FBIOBLANK OD_IO( 'F', 0x11 ) // 0x4611 |
303 | 303 | ||
304 | /* VESA Blanking Levels */ | 304 | /* VESA Blanking Levels */ |
305 | #define VESA_NO_BLANKING 0 | 305 | #define VESA_NO_BLANKING 0 |
306 | #define VESA_VSYNC_SUSPEND 1 | 306 | #define VESA_VSYNC_SUSPEND 1 |
307 | #define VESA_HSYNC_SUSPEND 2 | 307 | #define VESA_HSYNC_SUSPEND 2 |
308 | #define VESA_POWERDOWN 3 | 308 | #define VESA_POWERDOWN 3 |
309 | 309 | ||
310 | /** | 310 | /** |
311 | * This sets the display on or off | 311 | * This sets the display on or off |
312 | */ | 312 | */ |
313 | bool ODevice::setDisplayStatus ( bool on ) | 313 | bool ODevice::setDisplayStatus ( bool on ) |
314 | { | 314 | { |
315 | qDebug("ODevice::setDisplayStatus(%d)", on); | 315 | qDebug("ODevice::setDisplayStatus(%d)", on); |
316 | 316 | ||
317 | if ( d->m_model == Model_Unknown ) | 317 | if ( d->m_model == Model_Unknown ) |
318 | return false; | 318 | return false; |
319 | 319 | ||
320 | bool res = false; | 320 | bool res = false; |
321 | int fd; | 321 | int fd; |
322 | 322 | ||
323 | #ifdef QT_QWS_DEVFS | 323 | #ifdef QT_QWS_DEVFS |
324 | if (( fd = ::open ( "/dev/fb/0", O_RDWR )) >= 0 ) { | 324 | if (( fd = ::open ( "/dev/fb/0", O_RDWR )) >= 0 ) { |
325 | #else | 325 | #else |
326 | if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) { | 326 | if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) { |
327 | #endif | 327 | #endif |
328 | res = ( ::ioctl ( fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN ) == 0 ); | 328 | res = ( ::ioctl ( fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN ) == 0 ); |
329 | ::close ( fd ); | 329 | ::close ( fd ); |
330 | } | 330 | } |
331 | return res; | 331 | return res; |
332 | } | 332 | } |
333 | 333 | ||
334 | /** | 334 | /** |
335 | * This sets the display brightness | 335 | * This sets the display brightness |
336 | * | 336 | * |
337 | * @param p The brightness to be set on a scale from 0 to 255 | 337 | * @param b The brightness to be set on a scale from 0 to 255 |
338 | * @return success or failure | 338 | * @return success or failure |
339 | */ | 339 | */ |
340 | bool ODevice::setDisplayBrightness ( int p) | 340 | bool ODevice::setDisplayBrightness ( int b) |
341 | { | 341 | { |
342 | Q_UNUSED( p ) | 342 | Q_UNUSED( b ) |
343 | return false; | 343 | return false; |
344 | } | 344 | } |
345 | 345 | ||
346 | /** | 346 | /** |
347 | * | 347 | * |
348 | * @return Returns the number of steppings on the brightness slider | 348 | * @return Returns the number of steppings on the brightness slider |
349 | * in the Light-'n-Power settings. Values smaller zero and bigger | 349 | * in the Light-'n-Power settings. Values smaller zero and bigger |
350 | * than 255 do not make sense. | 350 | * than 255 do not make sense. |
351 | * | 351 | * |
352 | * \sa QSlider::setLineStep | 352 | * \sa QSlider::setLineStep |
353 | * \sa QSlider::setPageStep | 353 | * \sa QSlider::setPageStep |
354 | */ | 354 | */ |
355 | int ODevice::displayBrightnessResolution() const | 355 | int ODevice::displayBrightnessResolution() const |
356 | { | 356 | { |
357 | return 16; | 357 | return 16; |
358 | } | 358 | } |
359 | 359 | ||
360 | /** | 360 | /** |
361 | * This sets the display contrast | 361 | * This sets the display contrast |
362 | * @param p The contrast to be set on a scale from 0 to 255 | 362 | * @param p The contrast to be set on a scale from 0 to 255 |
363 | * @return success or failure | 363 | * @return success or failure |
364 | */ | 364 | */ |
365 | bool ODevice::setDisplayContrast ( int p) | 365 | bool ODevice::setDisplayContrast ( int p) |
366 | { | 366 | { |
367 | Q_UNUSED( p ) | 367 | Q_UNUSED( p ) |
368 | return false; | 368 | return false; |
369 | } | 369 | } |
370 | 370 | ||
371 | /** | 371 | /** |
372 | * @return return the max value for the brightness settings slider | 372 | * @return return the max value for the brightness settings slider |
373 | * or 0 if the device doesn't support setting of a contrast | 373 | * or 0 if the device doesn't support setting of a contrast |
374 | */ | 374 | */ |
375 | int ODevice::displayContrastResolution() const | 375 | int ODevice::displayContrastResolution() const |
376 | { | 376 | { |
377 | return 0; | 377 | return 0; |
378 | } | 378 | } |
379 | 379 | ||
380 | /** | 380 | /** |
381 | * This returns the vendor as string | 381 | * This returns the vendor as string |
382 | * @return Vendor as QString | 382 | * @return Vendor as QString |
383 | */ | 383 | */ |
384 | QString ODevice::vendorString() const | 384 | QString ODevice::vendorString() const |
385 | { | 385 | { |
386 | return d->m_vendorstr; | 386 | return d->m_vendorstr; |
387 | } | 387 | } |
388 | 388 | ||
389 | /** | 389 | /** |
390 | * This returns the vendor as one of the values of OVendor | 390 | * This returns the vendor as one of the values of OVendor |
391 | * @return OVendor | 391 | * @return OVendor |
392 | */ | 392 | */ |
393 | OVendor ODevice::vendor() const | 393 | OVendor ODevice::vendor() const |
394 | { | 394 | { |
395 | return d->m_vendor; | 395 | return d->m_vendor; |
396 | } | 396 | } |
397 | 397 | ||
398 | /** | 398 | /** |
399 | * This returns the model as a string | 399 | * This returns the model as a string |
400 | * @return A string representing the model | 400 | * @return A string representing the model |
401 | */ | 401 | */ |
402 | QString ODevice::modelString() const | 402 | QString ODevice::modelString() const |
403 | { | 403 | { |
404 | return d->m_modelstr; | 404 | return d->m_modelstr; |
405 | } | 405 | } |
406 | 406 | ||
407 | /** | 407 | /** |
408 | * This does return the OModel used | 408 | * This does return the OModel used |
409 | */ | 409 | */ |
410 | OModel ODevice::model() const | 410 | OModel ODevice::model() const |
411 | { | 411 | { |
412 | return d->m_model; | 412 | return d->m_model; |
413 | } | 413 | } |
414 | 414 | ||
415 | /** | 415 | /** |
416 | * This does return the systen name | 416 | * This does return the systen name |
417 | */ | 417 | */ |
418 | QString ODevice::systemString() const | 418 | QString ODevice::systemString() const |
419 | { | 419 | { |
420 | return d->m_systemstr; | 420 | return d->m_systemstr; |
421 | } | 421 | } |
422 | 422 | ||
423 | /** | 423 | /** |
424 | * Return System as OSystem value | 424 | * Return System as OSystem value |
425 | */ | 425 | */ |
426 | OSystem ODevice::system() const | 426 | OSystem ODevice::system() const |
427 | { | 427 | { |
428 | return d->m_system; | 428 | return d->m_system; |
429 | } | 429 | } |
430 | 430 | ||
431 | /** | 431 | /** |
432 | * @return the version string of the base system | 432 | * @return the version string of the base system |
433 | */ | 433 | */ |
434 | QString ODevice::systemVersionString() const | 434 | QString ODevice::systemVersionString() const |
435 | { | 435 | { |
436 | return d->m_sysverstr; | 436 | return d->m_sysverstr; |
437 | } | 437 | } |
438 | 438 | ||
439 | /** | 439 | /** |
440 | * @return the current Transformation | 440 | * @return the current Transformation |
441 | */ | 441 | */ |
442 | Transformation ODevice::rotation() const | 442 | Transformation ODevice::rotation() const |
443 | { | 443 | { |
444 | return d->m_rotation; | 444 | return d->m_rotation; |
445 | } | 445 | } |
446 | 446 | ||
447 | /** | 447 | /** |
448 | * @return the current rotation direction | 448 | * @return the current rotation direction |
449 | */ | 449 | */ |
450 | ODirection ODevice::direction() const | 450 | ODirection ODevice::direction() const |
451 | { | 451 | { |
452 | return d->m_direction; | 452 | return d->m_direction; |
453 | } | 453 | } |
454 | 454 | ||
455 | /** | 455 | /** |
456 | * This plays an alarm sound | 456 | * This plays an alarm sound |
457 | */ | 457 | */ |
458 | void ODevice::playAlarmSound() | 458 | void ODevice::playAlarmSound() |
459 | { | 459 | { |
460 | #ifndef QT_NO_SOUND | 460 | #ifndef QT_NO_SOUND |
461 | static Sound snd ( "alarm" ); | 461 | static Sound snd ( "alarm" ); |
462 | 462 | ||
463 | if ( snd. isFinished()) | 463 | if ( snd. isFinished()) |
464 | snd. play(); | 464 | snd. play(); |
465 | #endif | 465 | #endif |
466 | } | 466 | } |
467 | 467 | ||
468 | /** | 468 | /** |
469 | * This plays a key sound | 469 | * This plays a key sound |
470 | */ | 470 | */ |
471 | void ODevice::playKeySound() | 471 | void ODevice::playKeySound() |
472 | { | 472 | { |
473 | #ifndef QT_NO_SOUND | 473 | #ifndef QT_NO_SOUND |
474 | static Sound snd ( "keysound" ); | 474 | static Sound snd ( "keysound" ); |
475 | 475 | ||
476 | if ( snd. isFinished()) | 476 | if ( snd. isFinished()) |
477 | snd. play(); | 477 | snd. play(); |
478 | #endif | 478 | #endif |
479 | } | 479 | } |
480 | 480 | ||
481 | /** | 481 | /** |
482 | * This plays a touch sound | 482 | * This plays a touch sound |
483 | */ | 483 | */ |
484 | void ODevice::playTouchSound() | 484 | void ODevice::playTouchSound() |
485 | { | 485 | { |
486 | #ifndef QT_NO_SOUND | 486 | #ifndef QT_NO_SOUND |
487 | static Sound snd ( "touchsound" ); | 487 | static Sound snd ( "touchsound" ); |
488 | 488 | ||
489 | if ( snd. isFinished()) | 489 | if ( snd. isFinished()) |
490 | snd. play(); | 490 | snd. play(); |
491 | #endif | 491 | #endif |
492 | } | 492 | } |
493 | 493 | ||
494 | /** | 494 | /** |
495 | * This method will return a list of leds | 495 | * This method will return a list of leds |
496 | * available on this device | 496 | * available on this device |
497 | * @return a list of LEDs. | 497 | * @return a list of LEDs. |
498 | */ | 498 | */ |
499 | QValueList <OLed> ODevice::ledList() const | 499 | QValueList <OLed> ODevice::ledList() const |
500 | { | 500 | { |
501 | return QValueList <OLed>(); | 501 | return QValueList <OLed>(); |
502 | } | 502 | } |
503 | 503 | ||
504 | /** | 504 | /** |
505 | * This does return the state of the LEDs | 505 | * This does return the state of the LEDs |
506 | */ | 506 | */ |
507 | QValueList <OLedState> ODevice::ledStateList ( OLed /*which*/ ) const | 507 | QValueList <OLedState> ODevice::ledStateList ( OLed /*which*/ ) const |
508 | { | 508 | { |
509 | return QValueList <OLedState>(); | 509 | return QValueList <OLedState>(); |
510 | } | 510 | } |
511 | 511 | ||
512 | /** | 512 | /** |
513 | * @return the state for a given OLed | 513 | * @return the state for a given OLed |
514 | */ | 514 | */ |
515 | OLedState ODevice::ledState ( OLed /*which*/ ) const | 515 | OLedState ODevice::ledState ( OLed /*which*/ ) const |
516 | { | 516 | { |
517 | return Led_Off; | 517 | return Led_Off; |
518 | } | 518 | } |
519 | 519 | ||
520 | /** | 520 | /** |
521 | * Set the state for a LED | 521 | * Set the state for a LED |
522 | * @param which Which OLed to use | 522 | * @param which Which OLed to use |
523 | * @param st The state to set | 523 | * @param st The state to set |
524 | * @return success or failure | 524 | * @return success or failure |
525 | */ | 525 | */ |
526 | bool ODevice::setLedState ( OLed which, OLedState st ) | 526 | bool ODevice::setLedState ( OLed which, OLedState st ) |
527 | { | 527 | { |
528 | Q_UNUSED( which ) | 528 | Q_UNUSED( which ) |
529 | Q_UNUSED( st ) | 529 | Q_UNUSED( st ) |
530 | return false; | 530 | return false; |
531 | } | 531 | } |
532 | 532 | ||
533 | /** | 533 | /** |
534 | * @return if the device has a light sensor | 534 | * @return if the device has a light sensor |
535 | */ | 535 | */ |
536 | bool ODevice::hasLightSensor() const | 536 | bool ODevice::hasLightSensor() const |
537 | { | 537 | { |
538 | return false; | 538 | return false; |
539 | } | 539 | } |
540 | 540 | ||
541 | /** | 541 | /** |
542 | * @return a value from the light sensor | 542 | * @return a value from the light sensor |
543 | */ | 543 | */ |
544 | int ODevice::readLightSensor() | 544 | int ODevice::readLightSensor() |
545 | { | 545 | { |
546 | return -1; | 546 | return -1; |
547 | } | 547 | } |
548 | 548 | ||
549 | /** | 549 | /** |
550 | * @return the light sensor resolution | 550 | * @return the light sensor resolution |
551 | */ | 551 | */ |
552 | int ODevice::lightSensorResolution() const | 552 | int ODevice::lightSensorResolution() const |
553 | { | 553 | { |
554 | return 0; | 554 | return 0; |
555 | } | 555 | } |
556 | 556 | ||
557 | /** | 557 | /** |
558 | * @return if the device has a hinge sensor | 558 | * @return if the device has a hinge sensor |
559 | */ | 559 | */ |
560 | bool ODevice::hasHingeSensor() const | 560 | bool ODevice::hasHingeSensor() const |
561 | { | 561 | { |
562 | return false; | 562 | return false; |
563 | } | 563 | } |
564 | 564 | ||
565 | /** | 565 | /** |
566 | * @return a value from the hinge sensor | 566 | * @return a value from the hinge sensor |
567 | */ | 567 | */ |
568 | OHingeStatus ODevice::readHingeSensor() | 568 | OHingeStatus ODevice::readHingeSensor() |
569 | { | 569 | { |
570 | return CASE_UNKNOWN; | 570 | return CASE_UNKNOWN; |
571 | } | 571 | } |
572 | 572 | ||
573 | /** | 573 | /** |
574 | * @return a list with CPU frequencies supported by the hardware | 574 | * @return a list with CPU frequencies supported by the hardware |
575 | */ | 575 | */ |
576 | const QStrList &ODevice::allowedCpuFrequencies() const | 576 | const QStrList &ODevice::allowedCpuFrequencies() const |
577 | { | 577 | { |
578 | return *d->m_cpu_frequencies; | 578 | return *d->m_cpu_frequencies; |
579 | } | 579 | } |
580 | 580 | ||
581 | 581 | ||
582 | /** | 582 | /** |
583 | * Set desired CPU frequency | 583 | * Set desired CPU frequency |
584 | * | 584 | * |
585 | * @param index index into d->m_cpu_frequencies of the frequency to be set | 585 | * @param index index into d->m_cpu_frequencies of the frequency to be set |
586 | */ | 586 | */ |
587 | bool ODevice::setCurrentCpuFrequency(uint index) | 587 | bool ODevice::setCurrentCpuFrequency(uint index) |
588 | { | 588 | { |
589 | if (index >= d->m_cpu_frequencies->count()) | 589 | if (index >= d->m_cpu_frequencies->count()) |
590 | return false; | 590 | return false; |
591 | 591 | ||
592 | char *freq = d->m_cpu_frequencies->at(index); | 592 | char *freq = d->m_cpu_frequencies->at(index); |
593 | qWarning("set freq to %s", freq); | 593 | qWarning("set freq to %s", freq); |
594 | 594 | ||
595 | int fd; | 595 | int fd; |
596 | 596 | ||
597 | if ((fd = ::open("/proc/sys/cpu/0/speed", O_WRONLY)) >= 0) { | 597 | if ((fd = ::open("/proc/sys/cpu/0/speed", O_WRONLY)) >= 0) { |
598 | char writeCommand[50]; | 598 | char writeCommand[50]; |
599 | const int count = sprintf(writeCommand, "%s\n", freq); | 599 | const int count = sprintf(writeCommand, "%s\n", freq); |
600 | int res = (::write(fd, writeCommand, count) != -1); | 600 | int res = (::write(fd, writeCommand, count) != -1); |
601 | ::close(fd); | 601 | ::close(fd); |
602 | return res; | 602 | return res; |
603 | } | 603 | } |
604 | 604 | ||
605 | return false; | 605 | return false; |
606 | } | 606 | } |
607 | 607 | ||
608 | 608 | ||
609 | /** | 609 | /** |
610 | * @return a list of hardware buttons | 610 | * @return a list of hardware buttons |
611 | */ | 611 | */ |
612 | const QValueList <ODeviceButton> &ODevice::buttons() | 612 | const QValueList <ODeviceButton> &ODevice::buttons() |
613 | { | 613 | { |
614 | initButtons(); | 614 | initButtons(); |
615 | 615 | ||
616 | return *d->m_buttons; | 616 | return *d->m_buttons; |
617 | } | 617 | } |
618 | 618 | ||
619 | /** | 619 | /** |
620 | * @return The amount of time that would count as a hold | 620 | * @return The amount of time that would count as a hold |
621 | */ | 621 | */ |
622 | uint ODevice::buttonHoldTime() const | 622 | uint ODevice::buttonHoldTime() const |
623 | { | 623 | { |
624 | return d->m_holdtime; | 624 | return d->m_holdtime; |
625 | } | 625 | } |
626 | 626 | ||
627 | /** | 627 | /** |
628 | * This method return a ODeviceButton for a key code | 628 | * This method return a ODeviceButton for a key code |
629 | * or 0 if no special hardware button is available for the device | 629 | * or 0 if no special hardware button is available for the device |
630 | * | 630 | * |
631 | * @return The devicebutton or 0l | 631 | * @return The devicebutton or 0l |
632 | * @see ODeviceButton | 632 | * @see ODeviceButton |
633 | */ | 633 | */ |
634 | const ODeviceButton *ODevice::buttonForKeycode ( ushort code ) | 634 | const ODeviceButton *ODevice::buttonForKeycode ( ushort code ) |
635 | { | 635 | { |
636 | initButtons(); | 636 | initButtons(); |
637 | 637 | ||
638 | for ( QValueListConstIterator<ODeviceButton> it = d->m_buttons->begin(); it != d->m_buttons->end(); ++it ) { | 638 | for ( QValueListConstIterator<ODeviceButton> it = d->m_buttons->begin(); it != d->m_buttons->end(); ++it ) { |
639 | if ( (*it). keycode() == code ) | 639 | if ( (*it). keycode() == code ) |
640 | return &(*it); | 640 | return &(*it); |
641 | } | 641 | } |
642 | return 0; | 642 | return 0; |
643 | } | 643 | } |
644 | 644 | ||
645 | void ODevice::reloadButtonMapping() | 645 | void ODevice::reloadButtonMapping() |
646 | { | 646 | { |
647 | initButtons(); | 647 | initButtons(); |
648 | 648 | ||
649 | Config cfg ( "ButtonSettings" ); | 649 | Config cfg ( "ButtonSettings" ); |
650 | 650 | ||
651 | for ( uint i = 0; i < d->m_buttons->count(); i++ ) { | 651 | for ( uint i = 0; i < d->m_buttons->count(); i++ ) { |
652 | ODeviceButton &b = ( *d->m_buttons ) [i]; | 652 | ODeviceButton &b = ( *d->m_buttons ) [i]; |
653 | QString group = "Button" + QString::number ( i ); | 653 | QString group = "Button" + QString::number ( i ); |
654 | 654 | ||
655 | QCString pch, hch; | 655 | QCString pch, hch; |
656 | QCString pm, hm; | 656 | QCString pm, hm; |
657 | QByteArray pdata, hdata; | 657 | QByteArray pdata, hdata; |
658 | 658 | ||
659 | if ( cfg. hasGroup ( group )) { | 659 | if ( cfg. hasGroup ( group )) { |
660 | cfg. setGroup ( group ); | 660 | cfg. setGroup ( group ); |
661 | pch = cfg. readEntry ( "PressedActionChannel" ). latin1(); | 661 | pch = cfg. readEntry ( "PressedActionChannel" ). latin1(); |
662 | pm = cfg. readEntry ( "PressedActionMessage" ). latin1(); | 662 | pm = cfg. readEntry ( "PressedActionMessage" ). latin1(); |
663 | // pdata = decodeBase64 ( buttonFile. readEntry ( "PressedActionArgs" )); | 663 | // pdata = decodeBase64 ( buttonFile. readEntry ( "PressedActionArgs" )); |
664 | 664 | ||
665 | hch = cfg. readEntry ( "HeldActionChannel" ). latin1(); | 665 | hch = cfg. readEntry ( "HeldActionChannel" ). latin1(); |
666 | hm = cfg. readEntry ( "HeldActionMessage" ). latin1(); | 666 | hm = cfg. readEntry ( "HeldActionMessage" ). latin1(); |
667 | // hdata = decodeBase64 ( buttonFile. readEntry ( "HeldActionArgs" )); | 667 | // hdata = decodeBase64 ( buttonFile. readEntry ( "HeldActionArgs" )); |
668 | } | 668 | } |
669 | 669 | ||
670 | b. setPressedAction ( OQCopMessage ( pch, pm, pdata )); | 670 | b. setPressedAction ( OQCopMessage ( pch, pm, pdata )); |
671 | 671 | ||
672 | b. setHeldAction ( OQCopMessage ( hch, hm, hdata )); | 672 | b. setHeldAction ( OQCopMessage ( hch, hm, hdata )); |
673 | } | 673 | } |
674 | } | 674 | } |
675 | 675 | ||
676 | void ODevice::remapPressedAction ( int button, const OQCopMessage &action ) | 676 | void ODevice::remapPressedAction ( int button, const OQCopMessage &action ) |
677 | { | 677 | { |
678 | initButtons(); | 678 | initButtons(); |
679 | 679 | ||
680 | QString mb_chan; | 680 | QString mb_chan; |
681 | 681 | ||
682 | if ( button >= (int) d->m_buttons->count()) | 682 | if ( button >= (int) d->m_buttons->count()) |
683 | return; | 683 | return; |
684 | 684 | ||
685 | ODeviceButton &b = ( *d->m_buttons ) [button]; | 685 | ODeviceButton &b = ( *d->m_buttons ) [button]; |
686 | b. setPressedAction ( action ); | 686 | b. setPressedAction ( action ); |
687 | 687 | ||
688 | mb_chan=b. pressedAction(). channel(); | 688 | mb_chan=b. pressedAction(). channel(); |
689 | 689 | ||
690 | Config buttonFile ( "ButtonSettings" ); | 690 | Config buttonFile ( "ButtonSettings" ); |
691 | buttonFile. setGroup ( "Button" + QString::number ( button )); | 691 | buttonFile. setGroup ( "Button" + QString::number ( button )); |
692 | buttonFile. writeEntry ( "PressedActionChannel", (const char*) mb_chan); | 692 | buttonFile. writeEntry ( "PressedActionChannel", (const char*) mb_chan); |
693 | buttonFile. writeEntry ( "PressedActionMessage", (const char*) b. pressedAction(). message()); | 693 | buttonFile. writeEntry ( "PressedActionMessage", (const char*) b. pressedAction(). message()); |
694 | 694 | ||
695 | // buttonFile. writeEntry ( "PressedActionArgs", encodeBase64 ( b. pressedAction(). data())); | 695 | // buttonFile. writeEntry ( "PressedActionArgs", encodeBase64 ( b. pressedAction(). data())); |
696 | 696 | ||
697 | QCopEnvelope ( "QPE/System", "deviceButtonMappingChanged()" ); | 697 | QCopEnvelope ( "QPE/System", "deviceButtonMappingChanged()" ); |
698 | } | 698 | } |
699 | 699 | ||
700 | void ODevice::remapHeldAction ( int button, const OQCopMessage &action ) | 700 | void ODevice::remapHeldAction ( int button, const OQCopMessage &action ) |
701 | { | 701 | { |
702 | initButtons(); | 702 | initButtons(); |
703 | 703 | ||
704 | if ( button >= (int) d->m_buttons->count()) | 704 | if ( button >= (int) d->m_buttons->count()) |
705 | return; | 705 | return; |
706 | 706 | ||
707 | ODeviceButton &b = ( *d->m_buttons ) [button]; | 707 | ODeviceButton &b = ( *d->m_buttons ) [button]; |
708 | b. setHeldAction ( action ); | 708 | b. setHeldAction ( action ); |
709 | 709 | ||
710 | Config buttonFile ( "ButtonSettings" ); | 710 | Config buttonFile ( "ButtonSettings" ); |
711 | buttonFile. setGroup ( "Button" + QString::number ( button )); | 711 | buttonFile. setGroup ( "Button" + QString::number ( button )); |
712 | buttonFile. writeEntry ( "HeldActionChannel", (const char *) b. heldAction(). channel()); | 712 | buttonFile. writeEntry ( "HeldActionChannel", (const char *) b. heldAction(). channel()); |
713 | buttonFile. writeEntry ( "HeldActionMessage", (const char *) b. heldAction(). message()); | 713 | buttonFile. writeEntry ( "HeldActionMessage", (const char *) b. heldAction(). message()); |
714 | 714 | ||
715 | // buttonFile. writeEntry ( "HeldActionArgs", decodeBase64 ( b. heldAction(). data())); | 715 | // buttonFile. writeEntry ( "HeldActionArgs", decodeBase64 ( b. heldAction(). data())); |
716 | 716 | ||
717 | QCopEnvelope ( "QPE/System", "deviceButtonMappingChanged()" ); | 717 | QCopEnvelope ( "QPE/System", "deviceButtonMappingChanged()" ); |
718 | } | 718 | } |
719 | 719 | ||
720 | /** | 720 | /** |
721 | * @internal | 721 | * @internal |
722 | */ | 722 | */ |
723 | void ODevice::virtual_hook(int, void* ){ | 723 | void ODevice::virtual_hook(int, void* ){ |
724 | 724 | ||
725 | } | 725 | } |
726 | 726 | ||
727 | /** | 727 | /** |
728 | * \brief Send a QCOP Message before suspending | 728 | * \brief Send a QCOP Message before suspending |
729 | * | 729 | * |
730 | * Sends a QCOP message to channel QPE/System | 730 | * Sends a QCOP message to channel QPE/System |
731 | * with the message "aboutToSuspend()" if this | 731 | * with the message "aboutToSuspend()" if this |
732 | * is the windowing server. | 732 | * is the windowing server. |
733 | * | 733 | * |
734 | * Call this in your custom \sa suspend() Method | 734 | * Call this in your custom \sa suspend() Method |
735 | * before going to suspend. | 735 | * before going to suspend. |
736 | * | 736 | * |
737 | */ | 737 | */ |
738 | void ODevice::sendSuspendmsg() | 738 | void ODevice::sendSuspendmsg() |
739 | { | 739 | { |
740 | if ( isQWS() ) | 740 | if ( isQWS() ) |
741 | return; | 741 | return; |
742 | 742 | ||
743 | QCopEnvelope ( "QPE/System", "aboutToSuspend()" ); | 743 | QCopEnvelope ( "QPE/System", "aboutToSuspend()" ); |
744 | } | 744 | } |
745 | 745 | ||
746 | /** | 746 | /** |
747 | * \brief Prepend the QWSServer::KeyboardFilter to the list of installed KeyFilters | 747 | * \brief Prepend the QWSServer::KeyboardFilter to the list of installed KeyFilters |
748 | * | 748 | * |
749 | * Prepend a QWSServer::KeyboardFilter to the List of Keyboard | 749 | * Prepend a QWSServer::KeyboardFilter to the List of Keyboard |
750 | * Filters. This function is the only way to prepend a KeyFilter. | 750 | * Filters. This function is the only way to prepend a KeyFilter. |
751 | * | 751 | * |
752 | * @param aFilter The KeyFilter to be prepended to the list of filters | 752 | * @param aFilter The KeyFilter to be prepended to the list of filters |
753 | * | 753 | * |
754 | * @see Opie::Core::OKeyFilter | 754 | * @see Opie::Core::OKeyFilter |
755 | * @see Opie::Core::OKeyFilter::inst() | 755 | * @see Opie::Core::OKeyFilter::inst() |
756 | */ | 756 | */ |
757 | void ODevice::addPreHandler(QWSServer::KeyboardFilter*aFilter) | 757 | void ODevice::addPreHandler(QWSServer::KeyboardFilter*aFilter) |
758 | { | 758 | { |
759 | Opie::Core::OKeyFilter::inst()->addPreHandler(aFilter); | 759 | Opie::Core::OKeyFilter::inst()->addPreHandler(aFilter); |
760 | } | 760 | } |
761 | 761 | ||
762 | /** | 762 | /** |
763 | * \brief Remove the QWSServer::KeyboardFilter in the param from the list | 763 | * \brief Remove the QWSServer::KeyboardFilter in the param from the list |
764 | * | 764 | * |
765 | * Remove the QWSServer::KeyboardFilter \par aFilter from the List | 765 | * Remove the QWSServer::KeyboardFilter \par aFilter from the List |
766 | * of Keyfilters. Call this when you delete the KeyFilter! | 766 | * of Keyfilters. Call this when you delete the KeyFilter! |
767 | * | 767 | * |
768 | * @param aFilter The filter to be removed from the Opie::Core::OKeyFilter | 768 | * @param aFilter The filter to be removed from the Opie::Core::OKeyFilter |
769 | * @see Opie::Core::ODevice::addPreHandler | 769 | * @see Opie::Core::ODevice::addPreHandler |
770 | */ | 770 | */ |
771 | void ODevice::remPreHandler(QWSServer::KeyboardFilter*aFilter) | 771 | void ODevice::remPreHandler(QWSServer::KeyboardFilter*aFilter) |
772 | { | 772 | { |
773 | Opie::Core::OKeyFilter::inst()->remPreHandler(aFilter); | 773 | Opie::Core::OKeyFilter::inst()->remPreHandler(aFilter); |
774 | } | 774 | } |
775 | 775 | ||
776 | 776 | ||
777 | /** | 777 | /** |
778 | * @internal | 778 | * @internal |
779 | * | 779 | * |
780 | * @see changeMixerForAlarm | 780 | * @see changeMixerForAlarm |
781 | */ | 781 | */ |
782 | void ODevice::playingStopped() { | 782 | void ODevice::playingStopped() { |
783 | if ( sender() ) | 783 | if ( sender() ) |
784 | const_cast<QObject*>(sender())->disconnect( this ); | 784 | const_cast<QObject*>(sender())->disconnect( this ); |
785 | 785 | ||
786 | #ifndef QT_NO_SOUND | 786 | #ifndef QT_NO_SOUND |
787 | if ( d->m_sound >= 0 ) { | 787 | if ( d->m_sound >= 0 ) { |
788 | ::ioctl ( d->m_sound, MIXER_WRITE( d->m_mixer ), &d->m_vol ); | 788 | ::ioctl ( d->m_sound, MIXER_WRITE( d->m_mixer ), &d->m_vol ); |
789 | ::close ( d->m_sound ); | 789 | ::close ( d->m_sound ); |
790 | } | 790 | } |
791 | #endif | 791 | #endif |
792 | } | 792 | } |
793 | 793 | ||
794 | 794 | ||
795 | /** | 795 | /** |
796 | * \brief Change the Volume for the Alarm and set it back after playing is finished | 796 | * \brief Change the Volume for the Alarm and set it back after playing is finished |
797 | * | 797 | * |
798 | * If you play an Alarm Sound you might want to change the Mixer to | 798 | * If you play an Alarm Sound you might want to change the Mixer to |
799 | * full volume and ignore the user setting. After it \sa Sound::isFinished | 799 | * full volume and ignore the user setting. After it \sa Sound::isFinished |
800 | * you would turn the volume back to the user preference. | 800 | * you would turn the volume back to the user preference. |
801 | * The problem is that we used to enter the event loop while waiting | 801 | * The problem is that we used to enter the event loop while waiting |
802 | * for the sound to be finished triggering all kind of reentrance | 802 | * for the sound to be finished triggering all kind of reentrance |
803 | * problems what a library shouldn't introduce. | 803 | * problems what a library shouldn't introduce. |
804 | * Instead of manually waiting for the sound to be finished use | 804 | * Instead of manually waiting for the sound to be finished use |
805 | * this Method and it will automatically restore the Mixer to | 805 | * this Method and it will automatically restore the Mixer to |
806 | * the user configuration after the sound finished playing. | 806 | * the user configuration after the sound finished playing. |
807 | * | 807 | * |
808 | * Note: The onwership of \param snd is not transfered and playing | 808 | * Note: The onwership of \param snd is not transfered and playing |
809 | * is not started in this method. If 'snd' gets deleted before | 809 | * is not started in this method. If 'snd' gets deleted before |
810 | * playing is finished the volume doesn't get set back to | 810 | * playing is finished the volume doesn't get set back to |
811 | * the user preference! | 811 | * the user preference! |
812 | * | 812 | * |
813 | * \code | 813 | * \code |
814 | * static Sound snd("alarm"); | 814 | * static Sound snd("alarm"); |
815 | * if(!snd.isFinished()) | 815 | * if(!snd.isFinished()) |
816 | * return; | 816 | * return; |
817 | * | 817 | * |
818 | * changeMixerForAlarm( my_channel, "/dev/mixer", &snd ); | 818 | * changeMixerForAlarm( my_channel, "/dev/mixer", &snd ); |
819 | * snd.play() | 819 | * snd.play() |
820 | * \endcode | 820 | * \endcode |
821 | * | 821 | * |
822 | * | 822 | * |
823 | * | 823 | * |
824 | * @param mixer The mixer number/channel to use | 824 | * @param mixer The mixer number/channel to use |
825 | * @param file The file name. If you convert from QString use QFile::encodeName | 825 | * @param file The file name. If you convert from QString use QFile::encodeName |
826 | * @param snd The sound to wait for finishing | 826 | * @param snd The sound to wait for finishing |
827 | * | 827 | * |
828 | */ | 828 | */ |
829 | void ODevice::changeMixerForAlarm( int mixer, const char* file, Sound *snd ) { | 829 | void ODevice::changeMixerForAlarm( int mixer, const char* file, Sound *snd ) { |
830 | #ifndef QT_NO_SOUND | 830 | #ifndef QT_NO_SOUND |
831 | if (( d->m_sound = ::open ( file, O_RDWR )) >= 0 ) { | 831 | if (( d->m_sound = ::open ( file, O_RDWR )) >= 0 ) { |
832 | if ( ::ioctl ( d->m_sound, MIXER_READ( mixer ), &d->m_vol ) >= 0 ) { | 832 | if ( ::ioctl ( d->m_sound, MIXER_READ( mixer ), &d->m_vol ) >= 0 ) { |
833 | Config cfg ( "qpe" ); | 833 | Config cfg ( "qpe" ); |
834 | cfg. setGroup ( "Volume" ); | 834 | cfg. setGroup ( "Volume" ); |
835 | 835 | ||
836 | int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 ); | 836 | int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 ); |
837 | if ( volalarm < 0 ) | 837 | if ( volalarm < 0 ) |
838 | volalarm = 0; | 838 | volalarm = 0; |
839 | else if ( volalarm > 100 ) | 839 | else if ( volalarm > 100 ) |
840 | volalarm = 100; | 840 | volalarm = 100; |
841 | volalarm |= ( volalarm << 8 ); | 841 | volalarm |= ( volalarm << 8 ); |
842 | 842 | ||
843 | if ( ::ioctl ( d->m_sound, MIXER_WRITE( mixer ), &volalarm ) >= 0 ) | 843 | if ( ::ioctl ( d->m_sound, MIXER_WRITE( mixer ), &volalarm ) >= 0 ) |
844 | register_qpe_sound_finished(snd, this, SLOT(playingStopped())); | 844 | register_qpe_sound_finished(snd, this, SLOT(playingStopped())); |
845 | } | 845 | } |
846 | d->m_mixer = mixer; | 846 | d->m_mixer = mixer; |
847 | } | 847 | } |
848 | #endif | 848 | #endif |
849 | } | 849 | } |
850 | 850 | ||
851 | } | 851 | } |
852 | } | 852 | } |
diff --git a/libopie2/opiecore/oconfig.h b/libopie2/opiecore/oconfig.h index ab95dc3..05a1a25 100644 --- a/libopie2/opiecore/oconfig.h +++ b/libopie2/opiecore/oconfig.h | |||
@@ -1,163 +1,163 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | 3 | ||
4 | (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 4 | (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
5 | 5 | ||
6 | Inspired by the config classes from the KDE Project which are | 6 | Inspired by the config classes from the KDE Project which are |
7 | =. (C) 1997 Matthias Kalle Dalheimer <kalle@kde.org> | 7 | =. (C) 1997 Matthias Kalle Dalheimer <kalle@kde.org> |
8 | .=l. | 8 | .=l. |
9 | .>+-= | 9 | .>+-= |
10 | _;:, .> :=|. This program is free software; you can | 10 | _;:, .> :=|. This program is free software; you can |
11 | .> <`_, > . <= redistribute it and/or modify it under | 11 | .> <`_, > . <= redistribute it and/or modify it under |
12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
13 | .="- .-=="i, .._ License as published by the Free Software | 13 | .="- .-=="i, .._ License as published by the Free Software |
14 | - . .-<_> .<> Foundation; either version 2 of the License, | 14 | - . .-<_> .<> Foundation; either version 2 of the License, |
15 | ._= =} : or (at your option) any later version. | 15 | ._= =} : or (at your option) any later version. |
16 | .%`+i> _;_. | 16 | .%`+i> _;_. |
17 | .i_,=:_. -<s. This program is distributed in the hope that | 17 | .i_,=:_. -<s. This program is distributed in the hope that |
18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
19 | : .. .:, . . . without even the implied warranty of | 19 | : .. .:, . . . without even the implied warranty of |
20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
22 | ..}^=.= = ; Library General Public License for more | 22 | ..}^=.= = ; Library General Public License for more |
23 | ++= -. .` .: details. | 23 | ++= -. .` .: details. |
24 | : = ...= . :.=- | 24 | : = ...= . :.=- |
25 | -. .:....=;==+<; You should have received a copy of the GNU | 25 | -. .:....=;==+<; You should have received a copy of the GNU |
26 | -_. . . )=. = Library General Public License along with | 26 | -_. . . )=. = Library General Public License along with |
27 | -- :-=` this library; see the file COPYING.LIB. | 27 | -- :-=` this library; see the file COPYING.LIB. |
28 | If not, write to the Free Software Foundation, | 28 | If not, write to the Free Software Foundation, |
29 | Inc., 59 Temple Place - Suite 330, | 29 | Inc., 59 Temple Place - Suite 330, |
30 | Boston, MA 02111-1307, USA. | 30 | Boston, MA 02111-1307, USA. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #ifndef OCONFIG_H | 33 | #ifndef OCONFIG_H |
34 | #define OCONFIG_H | 34 | #define OCONFIG_H |
35 | 35 | ||
36 | //FIXME: Implement for X11 or reuse libqpe/Config there also? | 36 | //FIXME: Implement for X11 or reuse libqpe/Config there also? |
37 | //FIXME: Or rather use QSettings also for libqpe? | 37 | //FIXME: Or rather use QSettings also for libqpe? |
38 | 38 | ||
39 | #include <qpe/config.h> | 39 | #include <qpe/config.h> |
40 | 40 | ||
41 | class QColor; | 41 | class QColor; |
42 | class QFont; | 42 | class QFont; |
43 | 43 | ||
44 | namespace Opie { | 44 | namespace Opie { |
45 | namespace Core { | 45 | namespace Core { |
46 | 46 | ||
47 | /** | 47 | /** |
48 | * A Configuration class based on the Qtopia @ref Config class | 48 | * A Configuration class based on the Qtopia @ref Config class |
49 | * featuring additional handling of color and font entries | 49 | * featuring additional handling of color and font entries |
50 | */ | 50 | */ |
51 | 51 | ||
52 | class OConfig : public Config | 52 | class OConfig : public Config |
53 | { | 53 | { |
54 | public: | 54 | public: |
55 | /** | 55 | /** |
56 | * Constructs a OConfig object with a @a name. | 56 | * Constructs a OConfig object with a @a name. |
57 | */ | 57 | */ |
58 | OConfig( const QString &name, Domain domain = User ); | 58 | OConfig( const QString &name, Domain domain = User ); |
59 | /** | 59 | /** |
60 | * Destructs the OConfig object. | 60 | * Destructs the OConfig object. |
61 | * | 61 | * |
62 | * Writes back any dirty configuration entries, and destroys | 62 | * Writes back any dirty configuration entries, and destroys |
63 | * dynamically created objects. | 63 | * dynamically created objects. |
64 | */ | 64 | */ |
65 | virtual ~OConfig(); | 65 | virtual ~OConfig(); |
66 | /** | 66 | /** |
67 | * @returns the name of the current group. | 67 | * @returns the name of the current group. |
68 | * The current group is used for searching keys and accessing entries. | 68 | * The current group is used for searching keys and accessing entries. |
69 | * @todo make const | 69 | * @todo make const |
70 | */ | 70 | */ |
71 | const QString& group()const { return git.key(); }; | 71 | const QString& group()const { return git.key(); }; |
72 | /** | 72 | /** |
73 | * @returns a @ref QColor entry or a @a default value if the key is not found. | 73 | * @returns a @ref QColor entry or a @a default value if the key is not found. |
74 | */ | 74 | */ |
75 | QColor readColorEntry( const QString& key, const QColor* pDefault ) const; | 75 | QColor readColorEntry( const QString& key, const QColor* pDefault ) const; |
76 | /** | 76 | /** |
77 | * @returns a @ref QFont value or a @a default value if the key is not found. | 77 | * @returns a @ref QFont value or a @a default value if the key is not found. |
78 | */ | 78 | */ |
79 | QFont readFontEntry( const QString& key, const QFont* pDefault ) const; | 79 | QFont readFontEntry( const QString& key, const QFont* pDefault ) const; |
80 | 80 | ||
81 | private: | 81 | private: |
82 | class Private; | 82 | class Private; |
83 | Private *d; | 83 | Private *d; |
84 | }; | 84 | }; |
85 | 85 | ||
86 | /** | 86 | /** |
87 | * @brief Helper class for easier use of OConfig groups. | 87 | * @brief Helper class for easier use of OConfig groups. |
88 | * | 88 | * |
89 | * Careful programmers always set the group of a | 89 | * Careful programmers always set the group of a |
90 | * @ref OConfig object to the group they want to read from | 90 | * @ref OConfig object to the group they want to read from |
91 | * and set it back to the old one of afterwards. This is usually | 91 | * and set it back to the old one of afterwards. This is usually |
92 | * written as: | 92 | * written as: |
93 | * <pre> | 93 | * <pre> |
94 | * | 94 | * |
95 | * QString oldgroup config()->group(); | 95 | * QString oldgroup config()->group(); |
96 | * config()->setGroup( "TheGroupThatIWant" ); | 96 | * config()->setGroup( "TheGroupThatIWant" ); |
97 | * ... | 97 | * ... |
98 | * config()->writeEntry( "Blah", "Blubb" ); | 98 | * config()->writeEntry( "Blah", "Blubb" ); |
99 | * | 99 | * |
100 | * config()->setGroup( oldgroup ); | 100 | * config()->setGroup( oldgroup ); |
101 | * </pre> | 101 | * </pre> |
102 | * | 102 | * |
103 | * In order to facilitate this task, you can use | 103 | * In order to facilitate this task, you can use |
104 | * OConfigGroupSaver. Simply construct such an object ON THE STACK | 104 | * OConfigGroupSaver. Simply construct such an object ON THE STACK |
105 | * when you want to switch to a new group. Then, when the object goes | 105 | * when you want to switch to a new group. Then, when the object goes |
106 | * out of scope, the group will automatically be restored. If you | 106 | * out of scope, the group will automatically be restored. If you |
107 | * want to use several different groups within a function or method, | 107 | * want to use several different groups within a function or method, |
108 | * you can still use OConfigGroupSaver: Simply enclose all work with | 108 | * you can still use OConfigGroupSaver: Simply enclose all work with |
109 | * one group (including the creation of the OConfigGroupSaver object) | 109 | * one group (including the creation of the OConfigGroupSaver object) |
110 | * in one block. | 110 | * in one block. |
111 | * | 111 | * |
112 | * \code | 112 | * \code |
113 | * OConfigGroupSaver saver(cfg,"TheGroupThatInWhat"); | 113 | * OConfigGroupSaver saver(cfg,"TheGroupThatInWhat"); |
114 | * \endcode | 114 | * \endcode |
115 | * | 115 | * |
116 | * Note that OConfigGroupSaver (cfg,"TheGroupThatInWhat"); would get imediately | 116 | * Note that OConfigGroupSaver (cfg,"TheGroupThatInWhat"); would get imediately |
117 | * destructed after created and that you would save in the old group which | 117 | * destructed after created and that you would save in the old group which |
118 | * is unwished. | 118 | * is unwished. |
119 | * | 119 | * |
120 | * @author Matthias Kalle Dalheimer <Kalle@kde.org> | 120 | * @author Matthias Kalle Dalheimer <Kalle@kde.org> |
121 | * @version $Id$ | 121 | * @version $Id$ |
122 | * @see OConfig | 122 | * @see OConfig |
123 | */ | 123 | */ |
124 | 124 | ||
125 | class OConfigGroupSaver | 125 | class OConfigGroupSaver |
126 | { | 126 | { |
127 | public: | 127 | public: |
128 | /** | 128 | /** |
129 | * Constructor. | 129 | * Constructor. |
130 | * Create the object giving a @config object and a @a group to become | 130 | * Create the object giving a OConfig object and a @a group to become |
131 | * the current group. | 131 | * the current group. |
132 | */ | 132 | */ |
133 | OConfigGroupSaver( OConfig* config, QString group ) :_config(config), _oldgroup(config->group() ) | 133 | OConfigGroupSaver( OConfig* config, QString group ) :_config(config), _oldgroup(config->group() ) |
134 | { _config->setGroup( group ); } | 134 | { _config->setGroup( group ); } |
135 | 135 | ||
136 | OConfigGroupSaver( OConfig* config, const char *group ) :_config(config), _oldgroup(config->group()) | 136 | OConfigGroupSaver( OConfig* config, const char *group ) :_config(config), _oldgroup(config->group()) |
137 | { _config->setGroup( group ); } | 137 | { _config->setGroup( group ); } |
138 | 138 | ||
139 | OConfigGroupSaver( OConfig* config, const QCString &group ) : _config(config), _oldgroup(config->group()) | 139 | OConfigGroupSaver( OConfig* config, const QCString &group ) : _config(config), _oldgroup(config->group()) |
140 | { _config->setGroup( group ); } | 140 | { _config->setGroup( group ); } |
141 | /** | 141 | /** |
142 | * Destructor. | 142 | * Destructor. |
143 | * Restores the last current group. | 143 | * Restores the last current group. |
144 | * @todo make it not inline for bc reasons. See KDE BC guide | 144 | * @todo make it not inline for bc reasons. See KDE BC guide |
145 | */ | 145 | */ |
146 | ~OConfigGroupSaver() { _config->setGroup( _oldgroup ); } | 146 | ~OConfigGroupSaver() { _config->setGroup( _oldgroup ); } |
147 | 147 | ||
148 | OConfig* config() { return _config; }; | 148 | OConfig* config() { return _config; }; |
149 | 149 | ||
150 | private: | 150 | private: |
151 | OConfig* _config; | 151 | OConfig* _config; |
152 | QString _oldgroup; | 152 | QString _oldgroup; |
153 | 153 | ||
154 | OConfigGroupSaver( const OConfigGroupSaver& ); | 154 | OConfigGroupSaver( const OConfigGroupSaver& ); |
155 | OConfigGroupSaver& operator=( const OConfigGroupSaver& ); | 155 | OConfigGroupSaver& operator=( const OConfigGroupSaver& ); |
156 | 156 | ||
157 | class Private; | 157 | class Private; |
158 | Private *d; | 158 | Private *d; |
159 | }; | 159 | }; |
160 | } | 160 | } |
161 | } | 161 | } |
162 | 162 | ||
163 | #endif // OCONFIG_H | 163 | #endif // OCONFIG_H |
diff --git a/libopie2/opiecore/odebug.h b/libopie2/opiecore/odebug.h index 21a6c26..18dc09e 100644 --- a/libopie2/opiecore/odebug.h +++ b/libopie2/opiecore/odebug.h | |||
@@ -1,491 +1,491 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | (C) 2003 Michael 'Mickey' Lauer (mickey@tm.informatik.uni-frankfurt.de) | 3 | (C) 2003 Michael 'Mickey' Lauer (mickey@tm.informatik.uni-frankfurt.de) |
4 | Inspired by the KDE debug classes, which are | 4 | Inspired by the KDE debug classes, which are |
5 | (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) | 5 | (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) |
6 | (C) 2002 Holger Freyther (freyther@kde.org) | 6 | (C) 2002 Holger Freyther (freyther@kde.org) |
7 | =. | 7 | =. |
8 | .=l. | 8 | .=l. |
9 | .>+-= | 9 | .>+-= |
10 | _;:, .> :=|. This program is free software; you can | 10 | _;:, .> :=|. This program is free software; you can |
11 | .> <`_, > . <= redistribute it and/or modify it under | 11 | .> <`_, > . <= redistribute it and/or modify it under |
12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 12 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
13 | .="- .-=="i, .._ License as published by the Free Software | 13 | .="- .-=="i, .._ License as published by the Free Software |
14 | - . .-<_> .<> Foundation; either version 2 of the License, | 14 | - . .-<_> .<> Foundation; either version 2 of the License, |
15 | ._= =} : or (at your option) any later version. | 15 | ._= =} : or (at your option) any later version. |
16 | .%`+i> _;_. | 16 | .%`+i> _;_. |
17 | .i_,=:_. -<s. This program is distributed in the hope that | 17 | .i_,=:_. -<s. This program is distributed in the hope that |
18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 18 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
19 | : .. .:, . . . without even the implied warranty of | 19 | : .. .:, . . . without even the implied warranty of |
20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 20 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 21 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
22 | ..}^=.= = ; Library General Public License for more | 22 | ..}^=.= = ; Library General Public License for more |
23 | ++= -. .` .: details. | 23 | ++= -. .` .: details. |
24 | : = ...= . :.=- | 24 | : = ...= . :.=- |
25 | -. .:....=;==+<; You should have received a copy of the GNU | 25 | -. .:....=;==+<; You should have received a copy of the GNU |
26 | -_. . . )=. = Library General Public License along with | 26 | -_. . . )=. = Library General Public License along with |
27 | -- :-=` this library; see the file COPYING.LIB. | 27 | -- :-=` this library; see the file COPYING.LIB. |
28 | If not, write to the Free Software Foundation, | 28 | If not, write to the Free Software Foundation, |
29 | Inc., 59 Temple Place - Suite 330, | 29 | Inc., 59 Temple Place - Suite 330, |
30 | Boston, MA 02111-1307, USA. | 30 | Boston, MA 02111-1307, USA. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #ifndef ODEBUG_H | 33 | #ifndef ODEBUG_H |
34 | #define ODEBUG_H | 34 | #define ODEBUG_H |
35 | 35 | ||
36 | #include <qstring.h> | 36 | #include <qstring.h> |
37 | 37 | ||
38 | class QWidget; | 38 | class QWidget; |
39 | class QDateTime; | 39 | class QDateTime; |
40 | class QDate; | 40 | class QDate; |
41 | class QTime; | 41 | class QTime; |
42 | class QPoint; | 42 | class QPoint; |
43 | class QSize; | 43 | class QSize; |
44 | class QRect; | 44 | class QRect; |
45 | class QRegion; | 45 | class QRegion; |
46 | class QStringList; | 46 | class QStringList; |
47 | class QColor; | 47 | class QColor; |
48 | class QBrush; | 48 | class QBrush; |
49 | 49 | ||
50 | namespace Opie { | 50 | namespace Opie { |
51 | namespace Core { | 51 | namespace Core { |
52 | 52 | ||
53 | class odbgstream; | 53 | class odbgstream; |
54 | class ondbgstream; | 54 | class ondbgstream; |
55 | 55 | ||
56 | #ifdef __GNUC__ | 56 | #ifdef __GNUC__ |
57 | #define o_funcinfo "[" << __PRETTY_FUNCTION__ << "] " | 57 | #define o_funcinfo "[" << __PRETTY_FUNCTION__ << "] " |
58 | #else | 58 | #else |
59 | #define o_funcinfo "[" << __FILE__ << ":" << __LINE__ << "] " | 59 | #define o_funcinfo "[" << __FILE__ << ":" << __LINE__ << "] " |
60 | #endif | 60 | #endif |
61 | 61 | ||
62 | #define o_lineinfo "[" << __FILE__ << ":" << __LINE__ << "] " | 62 | #define o_lineinfo "[" << __FILE__ << ":" << __LINE__ << "] " |
63 | 63 | ||
64 | #define owarn Opie::Core::odWarning() | 64 | #define owarn Opie::Core::odWarning() |
65 | #define oerr Opie::Core::odError() | 65 | #define oerr Opie::Core::odError() |
66 | #define odebug Opie::Core::odDebug() | 66 | #define odebug Opie::Core::odDebug() |
67 | #define ofatal Opie::Core::odFatal() | 67 | #define ofatal Opie::Core::odFatal() |
68 | #define oendl "\n" | 68 | #define oendl "\n" |
69 | 69 | ||
70 | const int ODEBUG_IGNORE = -1; | 70 | const int ODEBUG_IGNORE = -1; |
71 | const int ODEBUG_FILE = 0; | 71 | const int ODEBUG_FILE = 0; |
72 | const int ODEBUG_MSGBOX = 1; | 72 | const int ODEBUG_MSGBOX = 1; |
73 | const int ODEBUG_STDERR = 2; | 73 | const int ODEBUG_STDERR = 2; |
74 | const int ODEBUG_SYSLOG = 3; | 74 | const int ODEBUG_SYSLOG = 3; |
75 | const int ODEBUG_SOCKET = 4; | 75 | const int ODEBUG_SOCKET = 4; |
76 | 76 | ||
77 | class odbgstreamprivate; | 77 | class odbgstreamprivate; |
78 | /** | 78 | /** |
79 | * odbgstream is a text stream that allows you to print debug messages. | 79 | * odbgstream is a text stream that allows you to print debug messages. |
80 | * Using the overloaded "<<" operator you can send messages. Usually | 80 | * Using the overloaded "<<" operator you can send messages. Usually |
81 | * you do not create the odbgstream yourself, but use @ref odDebug() (odebug) | 81 | * you do not create the odbgstream yourself, but use @ref odDebug() (odebug) |
82 | * @ref odWarning() (owarn), @ref odError() (oerr) or @ref odFatal (ofatal) to obtain one. | 82 | * @ref odWarning() (owarn), @ref odError() (oerr) or @ref odFatal (ofatal) to obtain one. |
83 | * | 83 | * |
84 | * Example: | 84 | * Example: |
85 | * <pre> | 85 | * <pre> |
86 | * int i = 5; | 86 | * int i = 5; |
87 | * odebug << "The value of i is " << i << oendl; | 87 | * odebug << "The value of i is " << i << oendl; |
88 | * </pre> | 88 | * </pre> |
89 | * @see odbgstream | 89 | * @see odbgstream |
90 | */ | 90 | */ |
91 | 91 | ||
92 | /*====================================================================================== | 92 | /*====================================================================================== |
93 | * odbgstream | 93 | * odbgstream |
94 | *======================================================================================*/ | 94 | *======================================================================================*/ |
95 | 95 | ||
96 | class odbgstream | 96 | class odbgstream |
97 | { | 97 | { |
98 | public: | 98 | public: |
99 | /** | 99 | /** |
100 | * @internal | 100 | * @internal |
101 | */ | 101 | */ |
102 | odbgstream(unsigned int _area, unsigned int _level, bool _print = true); | 102 | odbgstream(unsigned int _area, unsigned int _level, bool _print = true); |
103 | odbgstream(const char * initialString, unsigned int _area, unsigned int _level, bool _print = true); | 103 | odbgstream(const char * initialString, unsigned int _area, unsigned int _level, bool _print = true); |
104 | odbgstream(odbgstream &str); | 104 | odbgstream(odbgstream &str); |
105 | odbgstream(const odbgstream &str); | 105 | odbgstream(const odbgstream &str); |
106 | virtual ~odbgstream(); | 106 | virtual ~odbgstream(); |
107 | 107 | ||
108 | /** | 108 | /** |
109 | * Prints the given value. | 109 | * Prints the given value. |
110 | * @param i the boolean to print (as "true" or "false") | 110 | * @param i the boolean to print (as "true" or "false") |
111 | * @return this stream | 111 | * @return this stream |
112 | */ | 112 | */ |
113 | odbgstream &operator<<(bool i); | 113 | odbgstream &operator<<(bool i); |
114 | /** | 114 | /** |
115 | * Prints the given value. | 115 | * Prints the given value. |
116 | * @param i the short to print | 116 | * @param i the short to print |
117 | * @return this stream | 117 | * @return this stream |
118 | */ | 118 | */ |
119 | odbgstream &operator<<(short i); | 119 | odbgstream &operator<<(short i); |
120 | /** | 120 | /** |
121 | * Prints the given value. | 121 | * Prints the given value. |
122 | * @param i the unsigned short to print | 122 | * @param i the unsigned short to print |
123 | * @return this stream | 123 | * @return this stream |
124 | */ | 124 | */ |
125 | odbgstream &operator<<(unsigned short i); | 125 | odbgstream &operator<<(unsigned short i); |
126 | /** | 126 | /** |
127 | * Prints the given value. | 127 | * Prints the given value. |
128 | * @param i the char to print | 128 | * @param i the char to print |
129 | * @return this stream | 129 | * @return this stream |
130 | */ | 130 | */ |
131 | odbgstream &operator<<(char i); | 131 | odbgstream &operator<<(char i); |
132 | /** | 132 | /** |
133 | * Prints the given value. | 133 | * Prints the given value. |
134 | * @param i the unsigned char to print | 134 | * @param i the unsigned char to print |
135 | * @return this stream | 135 | * @return this stream |
136 | */ | 136 | */ |
137 | odbgstream &operator<<(unsigned char i); | 137 | odbgstream &operator<<(unsigned char i); |
138 | /** | 138 | /** |
139 | * Prints the given value. | 139 | * Prints the given value. |
140 | * @param i the int to print | 140 | * @param i the int to print |
141 | * @return this stream | 141 | * @return this stream |
142 | */ | 142 | */ |
143 | odbgstream &operator<<(int i); | 143 | odbgstream &operator<<(int i); |
144 | /** | 144 | /** |
145 | * Prints the given value. | 145 | * Prints the given value. |
146 | * @param i the unsigned int to print | 146 | * @param i the unsigned int to print |
147 | * @return this stream | 147 | * @return this stream |
148 | */ | 148 | */ |
149 | odbgstream &operator<<(unsigned int i); | 149 | odbgstream &operator<<(unsigned int i); |
150 | /** | 150 | /** |
151 | * Prints the given value. | 151 | * Prints the given value. |
152 | * @param i the long to print | 152 | * @param i the long to print |
153 | * @return this stream | 153 | * @return this stream |
154 | */ | 154 | */ |
155 | odbgstream &operator<<(long i); | 155 | odbgstream &operator<<(long i); |
156 | /** | 156 | /** |
157 | * Prints the given value. | 157 | * Prints the given value. |
158 | * @param i the unsigned long to print | 158 | * @param i the unsigned long to print |
159 | * @return this stream | 159 | * @return this stream |
160 | */ | 160 | */ |
161 | odbgstream &operator<<(unsigned long i); | 161 | odbgstream &operator<<(unsigned long i); |
162 | /** | 162 | /** |
163 | * Flushes the output. | 163 | * Flushes the output. |
164 | */ | 164 | */ |
165 | virtual void flush(); | 165 | virtual void flush(); |
166 | /** | 166 | /** |
167 | * Prints the given value. | 167 | * Prints the given value. |
168 | * @param string the string to print | 168 | * @param string the string to print |
169 | * @return this stream | 169 | * @return this stream |
170 | */ | 170 | */ |
171 | odbgstream &operator<<(const QString& string); | 171 | odbgstream &operator<<(const QString& string); |
172 | /** | 172 | /** |
173 | * Prints the given value. | 173 | * Prints the given value. |
174 | * @param string the string to print | 174 | * @param string the string to print |
175 | * @return this stream | 175 | * @return this stream |
176 | */ | 176 | */ |
177 | odbgstream &operator<<(const char *string); | 177 | odbgstream &operator<<(const char *string); |
178 | /** | 178 | /** |
179 | * Prints the given value. | 179 | * Prints the given value. |
180 | * @param string the string to print | 180 | * @param string the string to print |
181 | * @return this stream | 181 | * @return this stream |
182 | */ | 182 | */ |
183 | odbgstream &operator<<(const QCString& string); | 183 | odbgstream &operator<<(const QCString& string); |
184 | /** | 184 | /** |
185 | * Prints the given value. | 185 | * Prints the given value. |
186 | * @param p a pointer to print (in number form) | 186 | * @param p a pointer to print (in number form) |
187 | * @return this stream | 187 | * @return this stream |
188 | */ | 188 | */ |
189 | odbgstream& operator<<(const void * p); | 189 | odbgstream& operator<<(const void * p); |
190 | /** | 190 | /** |
191 | * Prints the given value. | 191 | * Prints the given value. |
192 | * @param d the double to print | 192 | * @param d the double to print |
193 | * @return this stream | 193 | * @return this stream |
194 | */ | 194 | */ |
195 | odbgstream& operator<<(double d); | 195 | odbgstream& operator<<(double d); |
196 | /** | 196 | /** |
197 | * Prints the string @p format which can contain | 197 | * Prints the string @p format which can contain |
198 | * printf-style formatted values. | 198 | * printf-style formatted values. |
199 | * @param format the printf-style format | 199 | * @param format the printf-style format |
200 | * @return this stream | 200 | * @return this stream |
201 | */ | 201 | */ |
202 | odbgstream &form(const char *format, ...); | 202 | odbgstream &form(const char *format, ...); |
203 | /** Operator to print out basic information about a QWidget. | 203 | /** Operator to print out basic information about a QWidget. |
204 | * Output of class names only works if the class is moc'ified. | 204 | * Output of class names only works if the class is moc'ified. |
205 | * @param widget the widget to print | 205 | * @param widget the widget to print |
206 | * @return this stream | 206 | * @return this stream |
207 | */ | 207 | */ |
208 | odbgstream& operator<< (QWidget* widget); | 208 | odbgstream& operator<< (QWidget* widget); |
209 | 209 | ||
210 | /** | 210 | /** |
211 | * Prints the given value. | 211 | * Prints the given value. |
212 | * @param dateTime the datetime to print | 212 | * @param dateTime the datetime to print |
213 | * @return this stream | 213 | * @return this stream |
214 | */ | 214 | */ |
215 | odbgstream& operator<< ( const QDateTime& dateTime ); | 215 | odbgstream& operator<< ( const QDateTime& dateTime ); |
216 | 216 | ||
217 | /** | 217 | /** |
218 | * Prints the given value. | 218 | * Prints the given value. |
219 | * @param date the date to print | 219 | * @param date the date to print |
220 | * @return this stream | 220 | * @return this stream |
221 | */ | 221 | */ |
222 | odbgstream& operator<< ( const QDate& date ); | 222 | odbgstream& operator<< ( const QDate& date ); |
223 | 223 | ||
224 | /** | 224 | /** |
225 | * Prints the given value. | 225 | * Prints the given value. |
226 | * @param time the time to print | 226 | * @param time the time to print |
227 | * @return this stream | 227 | * @return this stream |
228 | */ | 228 | */ |
229 | odbgstream& operator<< ( const QTime& time ); | 229 | odbgstream& operator<< ( const QTime& time ); |
230 | 230 | ||
231 | /** | 231 | /** |
232 | * Prints the given value. | 232 | * Prints the given value. |
233 | * @param point the point to print | 233 | * @param point the point to print |
234 | * @return this stream | 234 | * @return this stream |
235 | */ | 235 | */ |
236 | odbgstream& operator<< ( const QPoint& point ); | 236 | odbgstream& operator<< ( const QPoint& point ); |
237 | 237 | ||
238 | /** | 238 | /** |
239 | * Prints the given value. | 239 | * Prints the given value. |
240 | * @param size the QSize to print | 240 | * @param size the QSize to print |
241 | * @return this stream | 241 | * @return this stream |
242 | */ | 242 | */ |
243 | odbgstream& operator<< ( const QSize& size ); | 243 | odbgstream& operator<< ( const QSize& size ); |
244 | 244 | ||
245 | /** | 245 | /** |
246 | * Prints the given value. | 246 | * Prints the given value. |
247 | * @param rect the QRect to print | 247 | * @param rect the QRect to print |
248 | * @return this stream | 248 | * @return this stream |
249 | */ | 249 | */ |
250 | odbgstream& operator<< ( const QRect& rect); | 250 | odbgstream& operator<< ( const QRect& rect); |
251 | 251 | ||
252 | /** | 252 | /** |
253 | * Prints the given value. | 253 | * Prints the given value. |
254 | * @param region the QRegion to print | 254 | * @param region the QRegion to print |
255 | * @return this stream | 255 | * @return this stream |
256 | */ | 256 | */ |
257 | odbgstream& operator<< ( const QRegion& region); | 257 | odbgstream& operator<< ( const QRegion& region); |
258 | 258 | ||
259 | /** | 259 | /** |
260 | * Prints the given value. | 260 | * Prints the given value. |
261 | * @param list the stringlist to print | 261 | * @param list the stringlist to print |
262 | * @return this stream | 262 | * @return this stream |
263 | */ | 263 | */ |
264 | odbgstream& operator<< ( const QStringList& list); | 264 | odbgstream& operator<< ( const QStringList& list); |
265 | 265 | ||
266 | /** | 266 | /** |
267 | * Prints the given value. | 267 | * Prints the given value. |
268 | * @param color the color to print | 268 | * @param color the color to print |
269 | * @return this stream | 269 | * @return this stream |
270 | */ | 270 | */ |
271 | odbgstream& operator<< ( const QColor& color); | 271 | odbgstream& operator<< ( const QColor& color); |
272 | 272 | ||
273 | /** | 273 | /** |
274 | * Prints the given value. | 274 | * Prints the given value. |
275 | * @param brush the brush to print | 275 | * @param brush the brush to print |
276 | * @return this stream | 276 | * @return this stream |
277 | */ | 277 | */ |
278 | odbgstream& operator<< ( const QBrush& brush ); | 278 | odbgstream& operator<< ( const QBrush& brush ); |
279 | 279 | ||
280 | private: | 280 | private: |
281 | QString output; | 281 | QString output; |
282 | unsigned int area, level; | 282 | unsigned int area, level; |
283 | bool print; | 283 | bool print; |
284 | odbgstreamprivate* d; | 284 | odbgstreamprivate* d; |
285 | }; | 285 | }; |
286 | 286 | ||
287 | /** | 287 | /** |
288 | * Prints an "\n". | 288 | * Prints an "\n". |
289 | * @param s the debug stream to write to | 289 | * @param s the debug stream to write to |
290 | * @return the debug stream (@p s) | 290 | * @return the debug stream (@p s) |
291 | */ | 291 | */ |
292 | inline odbgstream& endl( odbgstream &s) { s << "\n"; return s; } | 292 | inline odbgstream& endl( odbgstream &s) { s << "\n"; return s; } |
293 | /** | 293 | /** |
294 | * Flushes the stream. | 294 | * Flushes the stream. |
295 | * @param s the debug stream to write to | 295 | * @param s the debug stream to write to |
296 | * @return the debug stream (@p s) | 296 | * @return the debug stream (@p s) |
297 | */ | 297 | */ |
298 | inline odbgstream& flush( odbgstream &s) { s.flush(); return s; } | 298 | inline odbgstream& flush( odbgstream &s) { s.flush(); return s; } |
299 | 299 | ||
300 | odbgstream &perror( odbgstream &s); | 300 | odbgstream &perror( odbgstream &s); |
301 | 301 | ||
302 | /** | 302 | /** |
303 | * ondbgstream is a dummy variant of @ref odbgstream. All functions do | 303 | * ondbgstream is a dummy variant of @ref odbgstream. All functions do |
304 | * nothing. | 304 | * nothing. |
305 | * @see ondDebug() | 305 | * @see ondDebug() |
306 | */ | 306 | */ |
307 | class ondbgstream { | 307 | class ondbgstream { |
308 | public: | 308 | public: |
309 | /// Empty constructor. | 309 | /// Empty constructor. |
310 | ondbgstream() {} | 310 | ondbgstream() {} |
311 | ~ondbgstream() {} | 311 | ~ondbgstream() {} |
312 | /** | 312 | /** |
313 | * Does nothing. | 313 | * Does nothing. |
314 | * @return this stream | 314 | * @return this stream |
315 | */ | 315 | */ |
316 | ondbgstream &operator<<(short int ) { return *this; } | 316 | ondbgstream &operator<<(short int ) { return *this; } |
317 | /** | 317 | /** |
318 | * Does nothing. | 318 | * Does nothing. |
319 | * @return this stream | 319 | * @return this stream |
320 | */ | 320 | */ |
321 | ondbgstream &operator<<(unsigned short int ) { return *this; } | 321 | ondbgstream &operator<<(unsigned short int ) { return *this; } |
322 | /** | 322 | /** |
323 | * Does nothing. | 323 | * Does nothing. |
324 | * @return this stream | 324 | * @return this stream |
325 | */ | 325 | */ |
326 | ondbgstream &operator<<(char ) { return *this; } | 326 | ondbgstream &operator<<(char ) { return *this; } |
327 | /** | 327 | /** |
328 | * Does nothing. | 328 | * Does nothing. |
329 | * @return this stream | 329 | * @return this stream |
330 | */ | 330 | */ |
331 | ondbgstream &operator<<(unsigned char ) { return *this; } | 331 | ondbgstream &operator<<(unsigned char ) { return *this; } |
332 | /** | 332 | /** |
333 | * Does nothing. | 333 | * Does nothing. |
334 | * @return this stream | 334 | * @return this stream |
335 | */ | 335 | */ |
336 | ondbgstream &operator<<(int ) { return *this; } | 336 | ondbgstream &operator<<(int ) { return *this; } |
337 | /** | 337 | /** |
338 | * Does nothing. | 338 | * Does nothing. |
339 | * @return this stream | 339 | * @return this stream |
340 | */ | 340 | */ |
341 | ondbgstream &operator<<(unsigned int ) { return *this; } | 341 | ondbgstream &operator<<(unsigned int ) { return *this; } |
342 | /** | 342 | /** |
343 | * Does nothing. | 343 | * Does nothing. |
344 | */ | 344 | */ |
345 | void flush() {} | 345 | void flush() {} |
346 | /** | 346 | /** |
347 | * Does nothing. | 347 | * Does nothing. |
348 | * @return this stream | 348 | * @return this stream |
349 | */ | 349 | */ |
350 | ondbgstream &operator<<(const QString& ) { return *this; } | 350 | ondbgstream &operator<<(const QString& ) { return *this; } |
351 | /** | 351 | /** |
352 | * Does nothing. | 352 | * Does nothing. |
353 | * @return this stream | 353 | * @return this stream |
354 | */ | 354 | */ |
355 | ondbgstream &operator<<(const QCString& ) { return *this; } | 355 | ondbgstream &operator<<(const QCString& ) { return *this; } |
356 | /** | 356 | /** |
357 | * Does nothing. | 357 | * Does nothing. |
358 | * @return this stream | 358 | * @return this stream |
359 | */ | 359 | */ |
360 | ondbgstream &operator<<(const char *) { return *this; } | 360 | ondbgstream &operator<<(const char *) { return *this; } |
361 | /** | 361 | /** |
362 | * Does nothing. | 362 | * Does nothing. |
363 | * @return this stream | 363 | * @return this stream |
364 | */ | 364 | */ |
365 | ondbgstream& operator<<(const void *) { return *this; } | 365 | ondbgstream& operator<<(const void *) { return *this; } |
366 | /** | 366 | /** |
367 | * Does nothing. | 367 | * Does nothing. |
368 | * @return this stream | 368 | * @return this stream |
369 | */ | 369 | */ |
370 | ondbgstream& operator<<(void *) { return *this; } | 370 | ondbgstream& operator<<(void *) { return *this; } |
371 | /** | 371 | /** |
372 | * Does nothing. | 372 | * Does nothing. |
373 | * @return this stream | 373 | * @return this stream |
374 | */ | 374 | */ |
375 | ondbgstream& operator<<(double) { return *this; } | 375 | ondbgstream& operator<<(double) { return *this; } |
376 | /** | 376 | /** |
377 | * Does nothing. | 377 | * Does nothing. |
378 | * @return this stream | 378 | * @return this stream |
379 | */ | 379 | */ |
380 | ondbgstream& operator<<(long) { return *this; } | 380 | ondbgstream& operator<<(long) { return *this; } |
381 | /** | 381 | /** |
382 | * Does nothing. | 382 | * Does nothing. |
383 | * @return this stream | 383 | * @return this stream |
384 | */ | 384 | */ |
385 | ondbgstream& operator<<(unsigned long) { return *this; } | 385 | ondbgstream& operator<<(unsigned long) { return *this; } |
386 | /** | 386 | /** |
387 | * Does nothing. | 387 | * Does nothing. |
388 | * @return this stream | 388 | * @return this stream |
389 | */ | 389 | */ |
390 | ondbgstream& operator << (QWidget*) { return *this; } | 390 | ondbgstream& operator << (QWidget*) { return *this; } |
391 | /** | 391 | /** |
392 | * Does nothing. | 392 | * Does nothing. |
393 | * @return this stream | 393 | * @return this stream |
394 | */ | 394 | */ |
395 | ondbgstream &form(const char *, ...) { return *this; } | 395 | ondbgstream &form(const char *, ...) { return *this; } |
396 | 396 | ||
397 | ondbgstream& operator<<( const QDateTime& ) { return *this; } | 397 | ondbgstream& operator<<( const QDateTime& ) { return *this; } |
398 | ondbgstream& operator<<( const QDate& ) { return *this; } | 398 | ondbgstream& operator<<( const QDate& ) { return *this; } |
399 | ondbgstream& operator<<( const QTime& ) { return *this; } | 399 | ondbgstream& operator<<( const QTime& ) { return *this; } |
400 | ondbgstream& operator<<( const QPoint & ) { return *this; } | 400 | ondbgstream& operator<<( const QPoint & ) { return *this; } |
401 | ondbgstream& operator<<( const QSize & ) { return *this; } | 401 | ondbgstream& operator<<( const QSize & ) { return *this; } |
402 | ondbgstream& operator<<( const QRect & ) { return *this; } | 402 | ondbgstream& operator<<( const QRect & ) { return *this; } |
403 | ondbgstream& operator<<( const QRegion & ) { return *this; } | 403 | ondbgstream& operator<<( const QRegion & ) { return *this; } |
404 | ondbgstream& operator<<( const QStringList & ) { return *this; } | 404 | ondbgstream& operator<<( const QStringList & ) { return *this; } |
405 | ondbgstream& operator<<( const QColor & ) { return *this; } | 405 | ondbgstream& operator<<( const QColor & ) { return *this; } |
406 | ondbgstream& operator<<( const QBrush & ) { return *this; } | 406 | ondbgstream& operator<<( const QBrush & ) { return *this; } |
407 | 407 | ||
408 | private: | 408 | private: |
409 | class Private; | 409 | class Private; |
410 | Private *d; | 410 | Private *d; |
411 | }; | 411 | }; |
412 | 412 | ||
413 | /*====================================================================================== | 413 | /*====================================================================================== |
414 | * related functions | 414 | * related functions |
415 | *======================================================================================*/ | 415 | *======================================================================================*/ |
416 | 416 | ||
417 | /** | 417 | /** |
418 | * Does nothing. | 418 | * Does nothing. |
419 | * @param a stream | 419 | * @param s stream |
420 | * @return the given @p s | 420 | * @return the given @p s |
421 | */ | 421 | */ |
422 | inline ondbgstream& endl( ondbgstream & s) { return s; } | 422 | inline ondbgstream& endl( ondbgstream & s) { return s; } |
423 | /** | 423 | /** |
424 | * Does nothing. | 424 | * Does nothing. |
425 | * @param a stream | 425 | * @param s stream |
426 | * @return the given @p s | 426 | * @return the given @p s |
427 | */ | 427 | */ |
428 | inline ondbgstream& flush( ondbgstream & s) { return s; } | 428 | inline ondbgstream& flush( ondbgstream & s) { return s; } |
429 | inline ondbgstream& perror( ondbgstream & s) { return s; } | 429 | inline ondbgstream& perror( ondbgstream & s) { return s; } |
430 | 430 | ||
431 | /** | 431 | /** |
432 | * Returns a debug stream. You can use it to print debug | 432 | * Returns a debug stream. You can use it to print debug |
433 | * information. | 433 | * information. |
434 | * @param area an id to identify the output, 0 for default | 434 | * @param area an id to identify the output, 0 for default |
435 | */ | 435 | */ |
436 | odbgstream odDebug(int area = 0); | 436 | odbgstream odDebug(int area = 0); |
437 | odbgstream odDebug(bool cond, int area = 0); | 437 | odbgstream odDebug(bool cond, int area = 0); |
438 | /** | 438 | /** |
439 | * Returns a backtrace. | 439 | * Returns a backtrace. |
440 | * @param levels the number of levels (-1 for unlimited) of the backtrace | 440 | * @param levels the number of levels (-1 for unlimited) of the backtrace |
441 | * @return a backtrace | 441 | * @return a backtrace |
442 | */ | 442 | */ |
443 | QString odBacktrace(int levels = -1); | 443 | QString odBacktrace(int levels = -1); |
444 | /** | 444 | /** |
445 | * Returns a dummy debug stream. The stream does not print anything. | 445 | * Returns a dummy debug stream. The stream does not print anything. |
446 | * @param area an id to identify the output, 0 for default | 446 | * @param area an id to identify the output, 0 for default |
447 | * @see odDebug() | 447 | * @see odDebug() |
448 | */ | 448 | */ |
449 | inline ondbgstream ondDebug(int = 0) { return ondbgstream(); } | 449 | inline ondbgstream ondDebug(int area = 0) { return ondbgstream(); } |
450 | inline ondbgstream ondDebug(bool , int = 0) { return ondbgstream(); } | 450 | inline ondbgstream ondDebug(bool , int = 0) { return ondbgstream(); } |
451 | inline QString ondBacktrace() { return QString::null; } | 451 | inline QString ondBacktrace() { return QString::null; } |
452 | inline QString ondBacktrace(int) { return QString::null; } | 452 | inline QString ondBacktrace(int) { return QString::null; } |
453 | 453 | ||
454 | /** | 454 | /** |
455 | * Returns a warning stream. You can use it to print warning | 455 | * Returns a warning stream. You can use it to print warning |
456 | * information. | 456 | * information. |
457 | * @param area an id to identify the output, 0 for default | 457 | * @param area an id to identify the output, 0 for default |
458 | */ | 458 | */ |
459 | odbgstream odWarning(int area = 0); | 459 | odbgstream odWarning(int area = 0); |
460 | odbgstream odWarning(bool cond, int area = 0); | 460 | odbgstream odWarning(bool cond, int area = 0); |
461 | /** | 461 | /** |
462 | * Returns an error stream. You can use it to print error | 462 | * Returns an error stream. You can use it to print error |
463 | * information. | 463 | * information. |
464 | * @param area an id to identify the output, 0 for default | 464 | * @param area an id to identify the output, 0 for default |
465 | */ | 465 | */ |
466 | odbgstream odError(int area = 0); | 466 | odbgstream odError(int area = 0); |
467 | odbgstream odError(bool cond, int area = 0); | 467 | odbgstream odError(bool cond, int area = 0); |
468 | /** | 468 | /** |
469 | * Returns a fatal error stream. You can use it to print fatal error | 469 | * Returns a fatal error stream. You can use it to print fatal error |
470 | * information. | 470 | * information. |
471 | * @param area an id to identify the output, 0 for default | 471 | * @param area an id to identify the output, 0 for default |
472 | */ | 472 | */ |
473 | odbgstream odFatal(int area = 0); | 473 | odbgstream odFatal(int area = 0); |
474 | odbgstream odFatal(bool cond, int area = 0); | 474 | odbgstream odFatal(bool cond, int area = 0); |
475 | 475 | ||
476 | /** | 476 | /** |
477 | * Deletes the odebugrc cache and therefore forces KDebug to reread the | 477 | * Deletes the odebugrc cache and therefore forces KDebug to reread the |
478 | * config file | 478 | * config file |
479 | */ | 479 | */ |
480 | void odClearDebugConfig(); | 480 | void odClearDebugConfig(); |
481 | 481 | ||
482 | #ifdef OPIE_NO_DEBUG | 482 | #ifdef OPIE_NO_DEBUG |
483 | #define odDebug ondDebug | 483 | #define odDebug ondDebug |
484 | #define odBacktrace ondBacktrace | 484 | #define odBacktrace ondBacktrace |
485 | #endif | 485 | #endif |
486 | 486 | ||
487 | } | 487 | } |
488 | } | 488 | } |
489 | 489 | ||
490 | #endif | 490 | #endif |
491 | 491 | ||
diff --git a/libopie2/opiecore/okeyconfigmanager.cpp b/libopie2/opiecore/okeyconfigmanager.cpp index 891cda7..48546bd 100644 --- a/libopie2/opiecore/okeyconfigmanager.cpp +++ b/libopie2/opiecore/okeyconfigmanager.cpp | |||
@@ -1,761 +1,761 @@ | |||
1 | #include "okeyconfigmanager.h" | 1 | #include "okeyconfigmanager.h" |
2 | 2 | ||
3 | #include "okeyconfigmanager_p.h" | 3 | #include "okeyconfigmanager_p.h" |
4 | 4 | ||
5 | namespace Opie { | 5 | namespace Opie { |
6 | namespace Core { | 6 | namespace Core { |
7 | namespace Internal { | 7 | namespace Internal { |
8 | /* | 8 | /* |
9 | * the virtual and hardware key events have both issues... | 9 | * the virtual and hardware key events have both issues... |
10 | */ | 10 | */ |
11 | void fixupKeys( int& key, int &mod, QKeyEvent* e ) { | 11 | void fixupKeys( int& key, int &mod, QKeyEvent* e ) { |
12 | key = e->key(); | 12 | key = e->key(); |
13 | mod = e->state(); | 13 | mod = e->state(); |
14 | /* | 14 | /* |
15 | * virtual keyboard | 15 | * virtual keyboard |
16 | * else change the button mod only | 16 | * else change the button mod only |
17 | */ | 17 | */ |
18 | if ( key == 0 ) { | 18 | if ( key == 0 ) { |
19 | key = e->ascii(); | 19 | key = e->ascii(); |
20 | if ( key > 96 && key < 123) | 20 | if ( key > 96 && key < 123) |
21 | key -= 32; | 21 | key -= 32; |
22 | }else{ | 22 | }else{ |
23 | int new_mod = 0; | 23 | int new_mod = 0; |
24 | if ( mod & 256 ) | 24 | if ( mod & 256 ) |
25 | new_mod |= Qt::ShiftButton; | 25 | new_mod |= Qt::ShiftButton; |
26 | else if ( mod & 512 ) | 26 | else if ( mod & 512 ) |
27 | new_mod |= Qt::ControlButton; | 27 | new_mod |= Qt::ControlButton; |
28 | else if ( mod & 1024 ) | 28 | else if ( mod & 1024 ) |
29 | new_mod |= Qt::AltButton; | 29 | new_mod |= Qt::AltButton; |
30 | 30 | ||
31 | mod = new_mod == 0? mod : new_mod; | 31 | mod = new_mod == 0? mod : new_mod; |
32 | } | 32 | } |
33 | } | 33 | } |
34 | } | 34 | } |
35 | 35 | ||
36 | /** | 36 | /** |
37 | * The default Constructor of a OKeyPair. | 37 | * The default Constructor of a OKeyPair. |
38 | * A Key and a Modifier ( Alt/Shift/Ctrl ) | 38 | * A Key and a Modifier ( Alt/Shift/Ctrl ) |
39 | * needs to be supplied. | 39 | * needs to be supplied. |
40 | * Use Qt::Key for the information. | 40 | * Use Qt::Key for the information. |
41 | * The default arguments create an Empty OKeyPair. If you | 41 | * The default arguments create an Empty OKeyPair. If you |
42 | * want to get an empty OKeyPair use the static method for getting | 42 | * want to get an empty OKeyPair use the static method for getting |
43 | * the emptyKey() | 43 | * the emptyKey() |
44 | * | 44 | * |
45 | * @see OKeyPair OKeyPair::emptyKey() | 45 | * @see OKeyPair OKeyPair::emptyKey() |
46 | */ | 46 | */ |
47 | OKeyPair::OKeyPair( int key, int mod ) | 47 | OKeyPair::OKeyPair( int key, int mod ) |
48 | : m_key( key ), m_mod( mod ) | 48 | : m_key( key ), m_mod( mod ) |
49 | {} | 49 | {} |
50 | 50 | ||
51 | /** | 51 | /** |
52 | * The destructor | 52 | * The destructor |
53 | */ | 53 | */ |
54 | OKeyPair::~OKeyPair() {} | 54 | OKeyPair::~OKeyPair() {} |
55 | 55 | ||
56 | 56 | ||
57 | /** | 57 | /** |
58 | * Is this OKeyPair empty/valid? | 58 | * Is this OKeyPair empty/valid? |
59 | */ | 59 | */ |
60 | bool OKeyPair::isEmpty()const { | 60 | bool OKeyPair::isEmpty()const { |
61 | return ( ( m_key == -1 )&& ( m_mod == -1 ) ); | 61 | return ( ( m_key == -1 )&& ( m_mod == -1 ) ); |
62 | } | 62 | } |
63 | 63 | ||
64 | /** | 64 | /** |
65 | * get the keycode for this OKeyPair. The Key relates to Qt::Key. | 65 | * get the keycode for this OKeyPair. The Key relates to Qt::Key. |
66 | * | 66 | * |
67 | * @see Qt::Key | 67 | * @see Qt::Key |
68 | * @see setKey | 68 | * @see setKey |
69 | */ | 69 | */ |
70 | int OKeyPair::keycode()const { | 70 | int OKeyPair::keycode()const { |
71 | return m_key; | 71 | return m_key; |
72 | } | 72 | } |
73 | 73 | ||
74 | /** | 74 | /** |
75 | * get the modifier key for this OKeyPair. The Modifier State relates | 75 | * get the modifier key for this OKeyPair. The Modifier State relates |
76 | * to the Qt::ButtonState | 76 | * to the Qt::ButtonState |
77 | * | 77 | * |
78 | * @see Qt::ButtonState | 78 | * @see Qt::ButtonState |
79 | * @see setModifier | 79 | * @see setModifier |
80 | */ | 80 | */ |
81 | int OKeyPair::modifier()const { | 81 | int OKeyPair::modifier()const { |
82 | return m_mod; | 82 | return m_mod; |
83 | } | 83 | } |
84 | 84 | ||
85 | 85 | ||
86 | /** | 86 | /** |
87 | * Set the keycode | 87 | * Set the keycode |
88 | * @param key The Keycode to set | 88 | * @param key The Keycode to set |
89 | * | 89 | * |
90 | * @see keycode() | 90 | * @see keycode() |
91 | * @see Qt::Key | 91 | * @see Qt::Key |
92 | */ | 92 | */ |
93 | void OKeyPair::setKeycode( int key ) { | 93 | void OKeyPair::setKeycode( int key ) { |
94 | m_key = key; | 94 | m_key = key; |
95 | } | 95 | } |
96 | 96 | ||
97 | /** | 97 | /** |
98 | * Set the modifier key | 98 | * Set the modifier key |
99 | * | 99 | * |
100 | * @param the Modifier key | 100 | * @param mod the Modifier key |
101 | * @see Qt::ButtonState | 101 | * @see Qt::ButtonState |
102 | * @see modifier() | 102 | * @see modifier() |
103 | */ | 103 | */ |
104 | void OKeyPair::setModifier( int mod ) { | 104 | void OKeyPair::setModifier( int mod ) { |
105 | m_mod = mod; | 105 | m_mod = mod; |
106 | } | 106 | } |
107 | 107 | ||
108 | /** | 108 | /** |
109 | * Return an OKeyPair for the Return Key without any modifier. | 109 | * Return an OKeyPair for the Return Key without any modifier. |
110 | */ | 110 | */ |
111 | OKeyPair OKeyPair::returnKey() { | 111 | OKeyPair OKeyPair::returnKey() { |
112 | return OKeyPair( Qt::Key_Return, 0 ); | 112 | return OKeyPair( Qt::Key_Return, 0 ); |
113 | } | 113 | } |
114 | 114 | ||
115 | /** | 115 | /** |
116 | * Return an OKeyPair for the Left Arrow Key | 116 | * Return an OKeyPair for the Left Arrow Key |
117 | * without any modifier Key | 117 | * without any modifier Key |
118 | */ | 118 | */ |
119 | OKeyPair OKeyPair::leftArrowKey() { | 119 | OKeyPair OKeyPair::leftArrowKey() { |
120 | return OKeyPair( Qt::Key_Left, 0 ); | 120 | return OKeyPair( Qt::Key_Left, 0 ); |
121 | } | 121 | } |
122 | 122 | ||
123 | /** | 123 | /** |
124 | * Return an OKeyPair for the Right Arrow Key | 124 | * Return an OKeyPair for the Right Arrow Key |
125 | * without any modifier Key | 125 | * without any modifier Key |
126 | */ | 126 | */ |
127 | OKeyPair OKeyPair::rightArrowKey() { | 127 | OKeyPair OKeyPair::rightArrowKey() { |
128 | return OKeyPair( Qt::Key_Right, 0 ); | 128 | return OKeyPair( Qt::Key_Right, 0 ); |
129 | } | 129 | } |
130 | 130 | ||
131 | /** | 131 | /** |
132 | * Return an OKeyPair for the Up Arrow Key | 132 | * Return an OKeyPair for the Up Arrow Key |
133 | * without any modifier Key | 133 | * without any modifier Key |
134 | */ | 134 | */ |
135 | OKeyPair OKeyPair::upArrowKey() { | 135 | OKeyPair OKeyPair::upArrowKey() { |
136 | return OKeyPair( Qt::Key_Up, 0 ); | 136 | return OKeyPair( Qt::Key_Up, 0 ); |
137 | } | 137 | } |
138 | 138 | ||
139 | /** | 139 | /** |
140 | * Return an OKeyPair for the Down Arrow Key | 140 | * Return an OKeyPair for the Down Arrow Key |
141 | * without any modifier Key | 141 | * without any modifier Key |
142 | */ | 142 | */ |
143 | OKeyPair OKeyPair::downArrowKey() { | 143 | OKeyPair OKeyPair::downArrowKey() { |
144 | return OKeyPair( Qt::Key_Down, 0 ); | 144 | return OKeyPair( Qt::Key_Down, 0 ); |
145 | } | 145 | } |
146 | 146 | ||
147 | /** | 147 | /** |
148 | * Return an Empty OKeyPair | 148 | * Return an Empty OKeyPair |
149 | */ | 149 | */ |
150 | OKeyPair OKeyPair::emptyKey() { | 150 | OKeyPair OKeyPair::emptyKey() { |
151 | return OKeyPair(); | 151 | return OKeyPair(); |
152 | } | 152 | } |
153 | 153 | ||
154 | /** | 154 | /** |
155 | * This functions uses the Opie::Core::ODevice::buttons | 155 | * This functions uses the Opie::Core::ODevice::buttons |
156 | * for OKeyPairList | 156 | * for OKeyPairList |
157 | * | 157 | * |
158 | * @see Opie::Core::ODevice | 158 | * @see Opie::Core::ODevice |
159 | * @see Opie::Core::ODeviceButton | 159 | * @see Opie::Core::ODeviceButton |
160 | * @see Opie::Core::ODevice::button | 160 | * @see Opie::Core::ODevice::button |
161 | */ | 161 | */ |
162 | OKeyPair::List OKeyPair::hardwareKeys() { | 162 | OKeyPair::List OKeyPair::hardwareKeys() { |
163 | const QValueList<Opie::Core::ODeviceButton> but = Opie::Core::ODevice::inst()->buttons(); | 163 | const QValueList<Opie::Core::ODeviceButton> but = Opie::Core::ODevice::inst()->buttons(); |
164 | OKeyPair::List lst; | 164 | OKeyPair::List lst; |
165 | 165 | ||
166 | for ( QValueList<Opie::Core::ODeviceButton>::ConstIterator it = but.begin(); | 166 | for ( QValueList<Opie::Core::ODeviceButton>::ConstIterator it = but.begin(); |
167 | it != but.end(); ++it ) | 167 | it != but.end(); ++it ) |
168 | lst.append( OKeyPair( (*it).keycode(), 0 ) ); | 168 | lst.append( OKeyPair( (*it).keycode(), 0 ) ); |
169 | 169 | ||
170 | 170 | ||
171 | return lst; | 171 | return lst; |
172 | } | 172 | } |
173 | 173 | ||
174 | /** | 174 | /** |
175 | * Equals operator. Check if two OKeyPairs have the same key and modifier | 175 | * Equals operator. Check if two OKeyPairs have the same key and modifier |
176 | * @see operator!= | 176 | * @see operator!= |
177 | */ | 177 | */ |
178 | bool OKeyPair::operator==( const OKeyPair& pair)const { | 178 | bool OKeyPair::operator==( const OKeyPair& pair)const { |
179 | if ( m_key != pair.m_key ) return false; | 179 | if ( m_key != pair.m_key ) return false; |
180 | if ( m_mod != pair.m_mod ) return false; | 180 | if ( m_mod != pair.m_mod ) return false; |
181 | 181 | ||
182 | return true; | 182 | return true; |
183 | } | 183 | } |
184 | 184 | ||
185 | /** | 185 | /** |
186 | * Not equal operator. calls the equal operator internally | 186 | * Not equal operator. calls the equal operator internally |
187 | */ | 187 | */ |
188 | bool OKeyPair::operator!=( const OKeyPair& pair)const { | 188 | bool OKeyPair::operator!=( const OKeyPair& pair)const { |
189 | return !(*this == pair); | 189 | return !(*this == pair); |
190 | } | 190 | } |
191 | 191 | ||
192 | 192 | ||
193 | /** | 193 | /** |
194 | * The normal Constructor to create a OKeyConfigItem | 194 | * The normal Constructor to create a OKeyConfigItem |
195 | * | 195 | * |
196 | * You can set the the key paramater of this item but if | 196 | * You can set the the key paramater of this item but if |
197 | * you use this item with the OKeyConfigManager your setting | 197 | * you use this item with the OKeyConfigManager your setting |
198 | * will be overwritten. | 198 | * will be overwritten. |
199 | * You can also specify a QObject and slot which sould get called | 199 | * You can also specify a QObject and slot which sould get called |
200 | * once this item is activated. This slot only works if you | 200 | * once this item is activated. This slot only works if you |
201 | * use the OKeyConfigManager. | 201 | * use the OKeyConfigManager. |
202 | * The actual Key is read by load() | 202 | * The actual Key is read by load() |
203 | * | 203 | * |
204 | * \code | 204 | * \code |
205 | * void MySlot::create(){ | 205 | * void MySlot::create(){ |
206 | * OKeyConfigItem item(tr("Delete"),"delete",Resource::loadPixmap("trash"), | 206 | * OKeyConfigItem item(tr("Delete"),"delete",Resource::loadPixmap("trash"), |
207 | * 123, OKeyPair(Qt::Key_D,Qt::ControlButton), | 207 | * 123, OKeyPair(Qt::Key_D,Qt::ControlButton), |
208 | * this,SLOT(slotDelete(QWidget*,QKeyEvent*))); | 208 | * this,SLOT(slotDelete(QWidget*,QKeyEvent*))); |
209 | * } | 209 | * } |
210 | * \endcode | 210 | * \endcode |
211 | * | 211 | * |
212 | * @param text The text exposed to the user | 212 | * @param text The text exposed to the user |
213 | * @param config_key The key used in the config | 213 | * @param config_key The key used in the config |
214 | * @param pix A Pixmap associated with this Item | 214 | * @param pix A Pixmap associated with this Item |
215 | * @param def The OKeyPair used as default | 215 | * @param def The OKeyPair used as default |
216 | * @param caller The object where the slot exists | 216 | * @param caller The object where the slot exists |
217 | * @param slot The slot which should get called | 217 | * @param slot The slot which should get called |
218 | * | 218 | * |
219 | */ | 219 | */ |
220 | OKeyConfigItem::OKeyConfigItem( const QString& text, const QCString& config_key, | 220 | OKeyConfigItem::OKeyConfigItem( const QString& text, const QCString& config_key, |
221 | const QPixmap& pix, int id, const OKeyPair& def, | 221 | const QPixmap& pix, int id, const OKeyPair& def, |
222 | QObject *caller, | 222 | QObject *caller, |
223 | const char* slot ) | 223 | const char* slot ) |
224 | : m_text( text ), m_config( config_key ), m_pix( pix ), | 224 | : m_text( text ), m_config( config_key ), m_pix( pix ), |
225 | m_id( id ), m_def( def ), | 225 | m_id( id ), m_def( def ), |
226 | m_obj( caller ), m_str( slot ) {} | 226 | m_obj( caller ), m_str( slot ) {} |
227 | 227 | ||
228 | /** | 228 | /** |
229 | * A special Constructor for converting from an Opie::Core::ODeviceButton | 229 | * A special Constructor for converting from an Opie::Core::ODeviceButton |
230 | * delivered by Opie::Core::ODevice::buttons() | 230 | * delivered by Opie::Core::ODevice::buttons() |
231 | * There is no Config Key set and both default key and key are set | 231 | * There is no Config Key set and both default key and key are set |
232 | * to Opie::Core::ODeviceButton::keycode() and 0 to modifier | 232 | * to Opie::Core::ODeviceButton::keycode() and 0 to modifier |
233 | * | 233 | * |
234 | * @see Opie::Core::ODevice | 234 | * @see Opie::Core::ODevice |
235 | * @see Opie::Core::ODeviceButton | 235 | * @see Opie::Core::ODeviceButton |
236 | * @see Opie::Core::ODevice::buttons() | 236 | * @see Opie::Core::ODevice::buttons() |
237 | */ | 237 | */ |
238 | OKeyConfigItem::OKeyConfigItem( const Opie::Core::ODeviceButton& b ) | 238 | OKeyConfigItem::OKeyConfigItem( const Opie::Core::ODeviceButton& b ) |
239 | : m_text( b.userText() ), m_pix( b.pixmap() ), m_id( -1 ), | 239 | : m_text( b.userText() ), m_pix( b.pixmap() ), m_id( -1 ), |
240 | m_key( OKeyPair( b.keycode(), 0 ) ), m_def( OKeyPair( b.keycode(), 0 ) ) | 240 | m_key( OKeyPair( b.keycode(), 0 ) ), m_def( OKeyPair( b.keycode(), 0 ) ) |
241 | {} | 241 | {} |
242 | 242 | ||
243 | 243 | ||
244 | /** | 244 | /** |
245 | * Destructor | 245 | * Destructor |
246 | */ | 246 | */ |
247 | OKeyConfigItem::~OKeyConfigItem() {} | 247 | OKeyConfigItem::~OKeyConfigItem() {} |
248 | 248 | ||
249 | 249 | ||
250 | /** | 250 | /** |
251 | * The text exposed to the user | 251 | * The text exposed to the user |
252 | * | 252 | * |
253 | * @see setText | 253 | * @see setText |
254 | */ | 254 | */ |
255 | QString OKeyConfigItem::text()const { | 255 | QString OKeyConfigItem::text()const { |
256 | return m_text; | 256 | return m_text; |
257 | } | 257 | } |
258 | 258 | ||
259 | /** | 259 | /** |
260 | * The pixmap shown to the user for your action/key | 260 | * The pixmap shown to the user for your action/key |
261 | * | 261 | * |
262 | * @see setPixmap | 262 | * @see setPixmap |
263 | */ | 263 | */ |
264 | QPixmap OKeyConfigItem::pixmap()const { | 264 | QPixmap OKeyConfigItem::pixmap()const { |
265 | return m_pix; | 265 | return m_pix; |
266 | } | 266 | } |
267 | 267 | ||
268 | /** | 268 | /** |
269 | * Return the OKeyPair this OKeyConfigItem is configured for. | 269 | * Return the OKeyPair this OKeyConfigItem is configured for. |
270 | * | 270 | * |
271 | * @see setKeyPair | 271 | * @see setKeyPair |
272 | */ | 272 | */ |
273 | OKeyPair OKeyConfigItem::keyPair()const { | 273 | OKeyPair OKeyConfigItem::keyPair()const { |
274 | return m_key; | 274 | return m_key; |
275 | } | 275 | } |
276 | 276 | ||
277 | /** | 277 | /** |
278 | * Return the default OKeyPair | 278 | * Return the default OKeyPair |
279 | * @see setDefaultKeyPair | 279 | * @see setDefaultKeyPair |
280 | */ | 280 | */ |
281 | OKeyPair OKeyConfigItem::defaultKeyPair()const { | 281 | OKeyPair OKeyConfigItem::defaultKeyPair()const { |
282 | return m_def; | 282 | return m_def; |
283 | } | 283 | } |
284 | 284 | ||
285 | 285 | ||
286 | /** | 286 | /** |
287 | * Return the Id you assigned to this item. | 287 | * Return the Id you assigned to this item. |
288 | * setting is only possible by the constructor | 288 | * setting is only possible by the constructor |
289 | */ | 289 | */ |
290 | int OKeyConfigItem::id()const{ | 290 | int OKeyConfigItem::id()const{ |
291 | return m_id; | 291 | return m_id; |
292 | } | 292 | } |
293 | 293 | ||
294 | /** | 294 | /** |
295 | * reutrn the Config Key. Setting it is only possible | 295 | * reutrn the Config Key. Setting it is only possible |
296 | * by the constructor | 296 | * by the constructor |
297 | */ | 297 | */ |
298 | QCString OKeyConfigItem::configKey()const { | 298 | QCString OKeyConfigItem::configKey()const { |
299 | return m_config; | 299 | return m_config; |
300 | } | 300 | } |
301 | 301 | ||
302 | /** | 302 | /** |
303 | * @internal | 303 | * @internal |
304 | */ | 304 | */ |
305 | QObject* OKeyConfigItem::object()const{ | 305 | QObject* OKeyConfigItem::object()const{ |
306 | return m_obj; | 306 | return m_obj; |
307 | } | 307 | } |
308 | 308 | ||
309 | /** | 309 | /** |
310 | * @internal | 310 | * @internal |
311 | */ | 311 | */ |
312 | QCString OKeyConfigItem::slot()const { | 312 | QCString OKeyConfigItem::slot()const { |
313 | return m_str; | 313 | return m_str; |
314 | } | 314 | } |
315 | 315 | ||
316 | /** | 316 | /** |
317 | * Set the text | 317 | * Set the text |
318 | * | 318 | * |
319 | * @param text Set the Text of this Action to text | 319 | * @param text Set the Text of this Action to text |
320 | * @see text() | 320 | * @see text() |
321 | */ | 321 | */ |
322 | void OKeyConfigItem::setText( const QString& text ) { | 322 | void OKeyConfigItem::setText( const QString& text ) { |
323 | m_text = text; | 323 | m_text = text; |
324 | } | 324 | } |
325 | 325 | ||
326 | /** | 326 | /** |
327 | * Set the pixmap of this action | 327 | * Set the pixmap of this action |
328 | * | 328 | * |
329 | * @param pix The Pixmap to set | 329 | * @param pix The Pixmap to set |
330 | * @see pixmap() | 330 | * @see pixmap() |
331 | */ | 331 | */ |
332 | void OKeyConfigItem::setPixmap( const QPixmap& pix ) { | 332 | void OKeyConfigItem::setPixmap( const QPixmap& pix ) { |
333 | m_pix = pix; | 333 | m_pix = pix; |
334 | } | 334 | } |
335 | 335 | ||
336 | /** | 336 | /** |
337 | * Set the KeyPair the OKeyConfigItem uses. | 337 | * Set the KeyPair the OKeyConfigItem uses. |
338 | * Your set Key could get overwritten if you use | 338 | * Your set Key could get overwritten if you use |
339 | * the manager or GUI to configure the key | 339 | * the manager or GUI to configure the key |
340 | * | 340 | * |
341 | * @param key Set the OKeyPair used | 341 | * @param key Set the OKeyPair used |
342 | * @see keyPair() | 342 | * @see keyPair() |
343 | */ | 343 | */ |
344 | void OKeyConfigItem::setKeyPair( const OKeyPair& key) { | 344 | void OKeyConfigItem::setKeyPair( const OKeyPair& key) { |
345 | m_key = key; | 345 | m_key = key; |
346 | } | 346 | } |
347 | 347 | ||
348 | /** | 348 | /** |
349 | * Set the default KeyPair. | 349 | * Set the default KeyPair. |
350 | * | 350 | * |
351 | * @param key The default keypair | 351 | * @param key The default keypair |
352 | * @see defaultKeyPair() | 352 | * @see defaultKeyPair() |
353 | */ | 353 | */ |
354 | void OKeyConfigItem::setDefaultKeyPair( const OKeyPair& key ) { | 354 | void OKeyConfigItem::setDefaultKeyPair( const OKeyPair& key ) { |
355 | m_def = key; | 355 | m_def = key; |
356 | } | 356 | } |
357 | 357 | ||
358 | /** | 358 | /** |
359 | * @internal | 359 | * @internal |
360 | */ | 360 | */ |
361 | void OKeyConfigItem::setConfigKey( const QCString& str) { | 361 | void OKeyConfigItem::setConfigKey( const QCString& str) { |
362 | m_config = str; | 362 | m_config = str; |
363 | m_config.detach(); | 363 | m_config.detach(); |
364 | } | 364 | } |
365 | 365 | ||
366 | /** | 366 | /** |
367 | * @internal | 367 | * @internal |
368 | */ | 368 | */ |
369 | void OKeyConfigItem::setId( int id ) { | 369 | void OKeyConfigItem::setId( int id ) { |
370 | m_id = id; | 370 | m_id = id; |
371 | } | 371 | } |
372 | 372 | ||
373 | /** | 373 | /** |
374 | * If the item is not configured isEmpty() will return true | 374 | * If the item is not configured isEmpty() will return true |
375 | * It is empty if no text is present and no default | 375 | * It is empty if no text is present and no default |
376 | * and no configured key | 376 | * and no configured key |
377 | */ | 377 | */ |
378 | bool OKeyConfigItem::isEmpty()const { | 378 | bool OKeyConfigItem::isEmpty()const { |
379 | if ( !m_def.isEmpty() ) return false; | 379 | if ( !m_def.isEmpty() ) return false; |
380 | if ( !m_key.isEmpty() ) return false; | 380 | if ( !m_key.isEmpty() ) return false; |
381 | if ( !m_text.isEmpty() ) return false; | 381 | if ( !m_text.isEmpty() ) return false; |
382 | if ( m_id != -1 ) return false; | 382 | if ( m_id != -1 ) return false; |
383 | 383 | ||
384 | return true; | 384 | return true; |
385 | } | 385 | } |
386 | 386 | ||
387 | /** | 387 | /** |
388 | * Check if the KeyPairs are the same | 388 | * Check if the KeyPairs are the same |
389 | */ | 389 | */ |
390 | bool OKeyConfigItem::operator==( const OKeyConfigItem& conf )const { | 390 | bool OKeyConfigItem::operator==( const OKeyConfigItem& conf )const { |
391 | /* if ( isEmpty() == conf.isEmpty() ) return true; | 391 | /* if ( isEmpty() == conf.isEmpty() ) return true; |
392 | else if ( isEmpty() != conf.isEmpty() ) return false; | 392 | else if ( isEmpty() != conf.isEmpty() ) return false; |
393 | else if ( !isEmpty()!= conf.isEmpty() ) return false; | 393 | else if ( !isEmpty()!= conf.isEmpty() ) return false; |
394 | */ | 394 | */ |
395 | 395 | ||
396 | if ( m_id != conf.m_id ) return false; | 396 | if ( m_id != conf.m_id ) return false; |
397 | if ( m_obj != conf.m_obj ) return false; | 397 | if ( m_obj != conf.m_obj ) return false; |
398 | if ( m_text != conf.m_text ) return false; | 398 | if ( m_text != conf.m_text ) return false; |
399 | if ( m_key != conf.m_key ) return false; | 399 | if ( m_key != conf.m_key ) return false; |
400 | if ( m_def != conf.m_def ) return false; | 400 | if ( m_def != conf.m_def ) return false; |
401 | 401 | ||
402 | 402 | ||
403 | 403 | ||
404 | return true; | 404 | return true; |
405 | 405 | ||
406 | } | 406 | } |
407 | 407 | ||
408 | bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf )const { | 408 | bool OKeyConfigItem::operator!=( const OKeyConfigItem& conf )const { |
409 | return !( *this == conf ); | 409 | return !( *this == conf ); |
410 | } | 410 | } |
411 | 411 | ||
412 | /*! \enum OKeyConfigManager::EventMask | 412 | /*! \enum OKeyConfigManager::EventMask |
413 | <a name="Eventmask flags"></a> | 413 | <a name="Eventmask flags"></a> |
414 | This enum is used to tell OKeyConfigManager which type of key events should inspected. | 414 | This enum is used to tell OKeyConfigManager which type of key events should inspected. |
415 | 415 | ||
416 | <ul> | 416 | <ul> |
417 | <li>\c MaskPressed When a key is pressed an action performs | 417 | <li>\c MaskPressed When a key is pressed an action performs |
418 | <li>\c MaskReleased When a key is released an action performs | 418 | <li>\c MaskReleased When a key is released an action performs |
419 | </ul> | 419 | </ul> |
420 | */ | 420 | */ |
421 | 421 | ||
422 | /** | 422 | /** |
423 | * \brief c'tor | 423 | * \brief c'tor |
424 | * The Constructor for a OKeyConfigManager | 424 | * The Constructor for a OKeyConfigManager |
425 | * | 425 | * |
426 | * You can use this manager in multiple ways. Either make it handle | 426 | * You can use this manager in multiple ways. Either make it handle |
427 | * QKeyEvents. The EventMask is set to OKeyConfigManager::MaskReleased by default. | 427 | * QKeyEvents. The EventMask is set to OKeyConfigManager::MaskReleased by default. |
428 | * | 428 | * |
429 | * \code | 429 | * \code |
430 | * Opie::Core::Config conf = oApp->config(); | 430 | * Opie::Core::Config conf = oApp->config(); |
431 | * Opie::Core::OKeyPairList blackList; | 431 | * Opie::Core::OKeyPairList blackList; |
432 | * blackList.append(Opie::Core::OKeyPair::leftArrowKey()); | 432 | * blackList.append(Opie::Core::OKeyPair::leftArrowKey()); |
433 | * blackList.append(Opie::Core::OKeyPair::rightArrowKey()); | 433 | * blackList.append(Opie::Core::OKeyPair::rightArrowKey()); |
434 | * Opie::Core::OKeyConfigManager *manager = new Opie::Core::OKeyConfigManager(conf,"key_actions",blackList, | 434 | * Opie::Core::OKeyConfigManager *manager = new Opie::Core::OKeyConfigManager(conf,"key_actions",blackList, |
435 | * false); | 435 | * false); |
436 | * QListView *view = new QListView(); | 436 | * QListView *view = new QListView(); |
437 | * manager->handleWidget(view); | 437 | * manager->handleWidget(view); |
438 | * manager->addKeyConfig( Opie::Core::OKeyPair::returnKey()); | 438 | * manager->addKeyConfig( Opie::Core::OKeyPair::returnKey()); |
439 | * manager->load(); | 439 | * manager->load(); |
440 | * | 440 | * |
441 | * connect(manager,SIGNAL(actionActivated(QWidget*,QKeyEvent*,const Opie::Core::OKeyConfigItem&)), | 441 | * connect(manager,SIGNAL(actionActivated(QWidget*,QKeyEvent*,const Opie::Core::OKeyConfigItem&)), |
442 | * this,SLOT(slotHandleKey(QWidget*,QKeyEvent*,const Opie::Core::OKeyConfigItem&))); | 442 | * this,SLOT(slotHandleKey(QWidget*,QKeyEvent*,const Opie::Core::OKeyConfigItem&))); |
443 | * | 443 | * |
444 | * .... | 444 | * .... |
445 | * | 445 | * |
446 | * void update(){ | 446 | * void update(){ |
447 | * QDialog diag(true); | 447 | * QDialog diag(true); |
448 | * QHBoxLayout *lay = new QHBoxLayout(&diag); | 448 | * QHBoxLayout *lay = new QHBoxLayout(&diag); |
449 | * Opie::Ui::OKeyConfigWidget *wid = new Opie::Ui::OKeyConfigWidget(manager,&diag); | 449 | * Opie::Ui::OKeyConfigWidget *wid = new Opie::Ui::OKeyConfigWidget(manager,&diag); |
450 | * wid->setChangeMode(Opie::Ui::OKeyConfigWidget::Queu); | 450 | * wid->setChangeMode(Opie::Ui::OKeyConfigWidget::Queu); |
451 | * lay->addWidget(wid); | 451 | * lay->addWidget(wid); |
452 | * if(QPEApplication::execDialog( &diag)== QDialog::Accepted){ | 452 | * if(QPEApplication::execDialog( &diag)== QDialog::Accepted){ |
453 | * wid->save(); | 453 | * wid->save(); |
454 | * } | 454 | * } |
455 | * } | 455 | * } |
456 | * | 456 | * |
457 | * .... | 457 | * .... |
458 | * MyListView::keyPressEvent( QKeyEvent* e ){ | 458 | * MyListView::keyPressEvent( QKeyEvent* e ){ |
459 | * Opie::Ui::OKeyConfigItem item = manager->handleKeyEvent(e); | 459 | * Opie::Ui::OKeyConfigItem item = manager->handleKeyEvent(e); |
460 | * if(!item.isEmpty() ){ | 460 | * if(!item.isEmpty() ){ |
461 | * switch(item.id()){ | 461 | * switch(item.id()){ |
462 | * case My_Delete_Key: | 462 | * case My_Delete_Key: |
463 | * break; | 463 | * break; |
464 | * } | 464 | * } |
465 | * } | 465 | * } |
466 | * } | 466 | * } |
467 | * | 467 | * |
468 | * \endcode | 468 | * \endcode |
469 | * | 469 | * |
470 | * @param conf The Config where the KeySetting should be stored | 470 | * @param conf The Config where the KeySetting should be stored |
471 | * @param group The group where the KeySetting will be stored | 471 | * @param group The group where the KeySetting will be stored |
472 | * @param black Which keys shouldn't be allowed to handle | 472 | * @param black Which keys shouldn't be allowed to handle |
473 | * @param grabkeyboard Calls QPEApplication::grabKeyboard to allow handling of DeviceButtons | 473 | * @param grabkeyboard Calls QPEApplication::grabKeyboard to allow handling of DeviceButtons |
474 | * @param par The parent/owner of this manager | 474 | * @param par The parent/owner of this manager |
475 | * @param name The name of this object | 475 | * @param name The name of this object |
476 | */ | 476 | */ |
477 | OKeyConfigManager::OKeyConfigManager( Opie::Core::OConfig* conf, | 477 | OKeyConfigManager::OKeyConfigManager( Opie::Core::OConfig* conf, |
478 | const QString& group, | 478 | const QString& group, |
479 | const OKeyPair::List& black, | 479 | const OKeyPair::List& black, |
480 | bool grabkeyboard, QObject* par, | 480 | bool grabkeyboard, QObject* par, |
481 | const char* name) | 481 | const char* name) |
482 | : QObject( par, name ), m_conf( conf ), m_group( group ), | 482 | : QObject( par, name ), m_conf( conf ), m_group( group ), |
483 | m_blackKeys( black ), m_grab( grabkeyboard ), m_map( 0 ){ | 483 | m_blackKeys( black ), m_grab( grabkeyboard ), m_map( 0 ){ |
484 | if ( m_grab ) | 484 | if ( m_grab ) |
485 | QPEApplication::grabKeyboard(); | 485 | QPEApplication::grabKeyboard(); |
486 | m_event_mask = OKeyConfigManager::MaskReleased; | 486 | m_event_mask = OKeyConfigManager::MaskReleased; |
487 | } | 487 | } |
488 | 488 | ||
489 | 489 | ||
490 | /** | 490 | /** |
491 | * Destructor | 491 | * Destructor |
492 | */ | 492 | */ |
493 | OKeyConfigManager::~OKeyConfigManager() { | 493 | OKeyConfigManager::~OKeyConfigManager() { |
494 | if ( m_grab ) | 494 | if ( m_grab ) |
495 | QPEApplication::ungrabKeyboard(); | 495 | QPEApplication::ungrabKeyboard(); |
496 | delete m_map; | 496 | delete m_map; |
497 | } | 497 | } |
498 | 498 | ||
499 | /** | 499 | /** |
500 | * Load the Configuration from the OConfig | 500 | * Load the Configuration from the OConfig |
501 | * If a Key is restricted but was in the config we will | 501 | * If a Key is restricted but was in the config we will |
502 | * make it be the empty key paur | 502 | * make it be the empty key paur |
503 | * We will change the group but restore to the previous. | 503 | * We will change the group but restore to the previous. |
504 | * | 504 | * |
505 | * @see OKeyPair::emptyKey | 505 | * @see OKeyPair::emptyKey |
506 | */ | 506 | */ |
507 | void OKeyConfigManager::load() { | 507 | void OKeyConfigManager::load() { |
508 | Opie::Core::OConfigGroupSaver grp( m_conf, m_group ); | 508 | Opie::Core::OConfigGroupSaver grp( m_conf, m_group ); |
509 | 509 | ||
510 | /* | 510 | /* |
511 | * Read each item | 511 | * Read each item |
512 | */ | 512 | */ |
513 | int key, mod; | 513 | int key, mod; |
514 | for( OKeyConfigItem::List::Iterator it = m_keys.begin(); it != m_keys.end(); ++it ) { | 514 | for( OKeyConfigItem::List::Iterator it = m_keys.begin(); it != m_keys.end(); ++it ) { |
515 | key = m_conf->readNumEntry( (*it).configKey()+"key", | 515 | key = m_conf->readNumEntry( (*it).configKey()+"key", |
516 | (*it).defaultKeyPair().keycode() ); | 516 | (*it).defaultKeyPair().keycode() ); |
517 | mod = m_conf->readNumEntry( (*it).configKey()+"mod", | 517 | mod = m_conf->readNumEntry( (*it).configKey()+"mod", |
518 | (*it).defaultKeyPair().modifier() ); | 518 | (*it).defaultKeyPair().modifier() ); |
519 | OKeyPair okey( key, mod ); | 519 | OKeyPair okey( key, mod ); |
520 | 520 | ||
521 | if ( !m_blackKeys.contains( okey ) && key != -1 && mod != -1 ) | 521 | if ( !m_blackKeys.contains( okey ) && key != -1 && mod != -1 ) |
522 | (*it).setKeyPair( okey ); | 522 | (*it).setKeyPair( okey ); |
523 | else | 523 | else |
524 | (*it).setKeyPair( OKeyPair::emptyKey() ); | 524 | (*it).setKeyPair( OKeyPair::emptyKey() ); |
525 | } | 525 | } |
526 | delete m_map; m_map = 0; | 526 | delete m_map; m_map = 0; |
527 | } | 527 | } |
528 | 528 | ||
529 | /** | 529 | /** |
530 | * We will save the current configuration | 530 | * We will save the current configuration |
531 | * to the OConfig. We will change the group but restore | 531 | * to the OConfig. We will change the group but restore |
532 | * to the previous | 532 | * to the previous |
533 | */ | 533 | */ |
534 | void OKeyConfigManager::save() { | 534 | void OKeyConfigManager::save() { |
535 | Opie::Core::OConfigGroupSaver grp( m_conf, m_group ); | 535 | Opie::Core::OConfigGroupSaver grp( m_conf, m_group ); |
536 | 536 | ||
537 | /* | 537 | /* |
538 | * Write each item | 538 | * Write each item |
539 | */ | 539 | */ |
540 | for( OKeyConfigItem::List::Iterator it = m_keys.begin();it != m_keys.end(); ++it ) { | 540 | for( OKeyConfigItem::List::Iterator it = m_keys.begin();it != m_keys.end(); ++it ) { |
541 | /* skip empty items */ | 541 | /* skip empty items */ |
542 | if ( (*it).isEmpty() ) | 542 | if ( (*it).isEmpty() ) |
543 | continue; | 543 | continue; |
544 | OKeyPair pair = (*it).keyPair(); | 544 | OKeyPair pair = (*it).keyPair(); |
545 | OKeyPair deft = (*it).defaultKeyPair(); | 545 | OKeyPair deft = (*it).defaultKeyPair(); |
546 | /* | 546 | /* |
547 | * don't write if it is the default setting | 547 | * don't write if it is the default setting |
548 | * FIXME allow to remove Keys from config | 548 | * FIXME allow to remove Keys from config |
549 | if ( (pair.keycode() == deft.keycode()) && | 549 | if ( (pair.keycode() == deft.keycode()) && |
550 | (pair.modifier()== deft.modifier() ) ) | 550 | (pair.modifier()== deft.modifier() ) ) |
551 | return; | 551 | return; |
552 | */ | 552 | */ |
553 | 553 | ||
554 | m_conf->writeEntry((*it).configKey()+"key", pair.keycode() ); | 554 | m_conf->writeEntry((*it).configKey()+"key", pair.keycode() ); |
555 | m_conf->writeEntry((*it).configKey()+"mod", pair.modifier() ); | 555 | m_conf->writeEntry((*it).configKey()+"mod", pair.modifier() ); |
556 | } | 556 | } |
557 | m_conf->write(); | 557 | m_conf->write(); |
558 | } | 558 | } |
559 | 559 | ||
560 | /** | 560 | /** |
561 | * This is function uses a QMap internally but you can have the same keycode | 561 | * This is function uses a QMap internally but you can have the same keycode |
562 | * with different modifier key. The behaviour is undefined if you add a OKeyConfigItem | 562 | * with different modifier key. The behaviour is undefined if you add a OKeyConfigItem |
563 | * with same keycode and modifier key. The GUI takes care that a user can't | 563 | * with same keycode and modifier key. The GUI takes care that a user can't |
564 | * cofigure two keys. | 564 | * cofigure two keys. |
565 | * | 565 | * |
566 | * Make sure you call e->ignore if you don't want to handle this event | 566 | * Make sure you call e->ignore if you don't want to handle this event |
567 | */ | 567 | */ |
568 | OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) { | 568 | OKeyConfigItem OKeyConfigManager::handleKeyEvent( QKeyEvent* e ) { |
569 | /* | 569 | /* |
570 | * Fix Up issues with Qt/E, my keybard, and virtual input | 570 | * Fix Up issues with Qt/E, my keybard, and virtual input |
571 | * methods | 571 | * methods |
572 | * First my Keyboard delivers 256,512,1024 for shift/ctrl/alt instead of the button state | 572 | * First my Keyboard delivers 256,512,1024 for shift/ctrl/alt instead of the button state |
573 | * Also key() on virtual inputmethods are zero and only ascii. We need to fix upper and lower | 573 | * Also key() on virtual inputmethods are zero and only ascii. We need to fix upper and lower |
574 | * case ascii | 574 | * case ascii |
575 | */ | 575 | */ |
576 | int key, mod; | 576 | int key, mod; |
577 | Opie::Core::Internal::fixupKeys( key, mod, e ); | 577 | Opie::Core::Internal::fixupKeys( key, mod, e ); |
578 | 578 | ||
579 | OKeyConfigItem::List _keyList = keyList( key ); | 579 | OKeyConfigItem::List _keyList = keyList( key ); |
580 | if ( _keyList.isEmpty() ) | 580 | if ( _keyList.isEmpty() ) |
581 | return OKeyConfigItem(); | 581 | return OKeyConfigItem(); |
582 | 582 | ||
583 | OKeyConfigItem item; | 583 | OKeyConfigItem item; |
584 | for ( OKeyConfigItem::List::Iterator it = _keyList.begin(); it != _keyList.end(); | 584 | for ( OKeyConfigItem::List::Iterator it = _keyList.begin(); it != _keyList.end(); |
585 | ++it ) { | 585 | ++it ) { |
586 | if ( (*it).keyPair().modifier() == mod ) { | 586 | if ( (*it).keyPair().modifier() == mod ) { |
587 | item = *it; | 587 | item = *it; |
588 | break; | 588 | break; |
589 | } | 589 | } |
590 | 590 | ||
591 | } | 591 | } |
592 | 592 | ||
593 | return item; | 593 | return item; |
594 | } | 594 | } |
595 | 595 | ||
596 | /** | 596 | /** |
597 | * Return the associated id of the item or -1 if no item | 597 | * Return the associated id of the item or -1 if no item |
598 | * matched the key | 598 | * matched the key |
599 | * | 599 | * |
600 | * @see handleKeyEvent | 600 | * @see handleKeyEvent |
601 | */ | 601 | */ |
602 | int OKeyConfigManager::handleKeyEventId( QKeyEvent* ev) { | 602 | int OKeyConfigManager::handleKeyEventId( QKeyEvent* ev) { |
603 | return handleKeyEvent( ev ).id(); | 603 | return handleKeyEvent( ev ).id(); |
604 | } | 604 | } |
605 | 605 | ||
606 | /** | 606 | /** |
607 | * Add Key Config to the List of items | 607 | * Add Key Config to the List of items |
608 | */ | 608 | */ |
609 | void OKeyConfigManager::addKeyConfig( const OKeyConfigItem& item ) { | 609 | void OKeyConfigManager::addKeyConfig( const OKeyConfigItem& item ) { |
610 | m_keys.append( item ); | 610 | m_keys.append( item ); |
611 | delete m_map; m_map = 0; | 611 | delete m_map; m_map = 0; |
612 | } | 612 | } |
613 | 613 | ||
614 | /** | 614 | /** |
615 | * Remove the Key from the Config. Internal lists will be destroyed | 615 | * Remove the Key from the Config. Internal lists will be destroyed |
616 | * and rebuild on demand later | 616 | * and rebuild on demand later |
617 | */ | 617 | */ |
618 | void OKeyConfigManager::removeKeyConfig( const OKeyConfigItem& item ) { | 618 | void OKeyConfigManager::removeKeyConfig( const OKeyConfigItem& item ) { |
619 | m_keys.remove( item ); | 619 | m_keys.remove( item ); |
620 | delete m_map; m_map = 0; | 620 | delete m_map; m_map = 0; |
621 | } | 621 | } |
622 | 622 | ||
623 | /** | 623 | /** |
624 | * Clears the complete list | 624 | * Clears the complete list |
625 | */ | 625 | */ |
626 | void OKeyConfigManager::clearKeyConfig() { | 626 | void OKeyConfigManager::clearKeyConfig() { |
627 | m_keys.clear(); | 627 | m_keys.clear(); |
628 | delete m_map; m_map = 0; | 628 | delete m_map; m_map = 0; |
629 | } | 629 | } |
630 | 630 | ||
631 | /** | 631 | /** |
632 | * | 632 | * |
633 | */ | 633 | */ |
634 | Opie::Core::OKeyConfigItem::List OKeyConfigManager::keyConfigList()const{ | 634 | Opie::Core::OKeyConfigItem::List OKeyConfigManager::keyConfigList()const{ |
635 | return m_keys; | 635 | return m_keys; |
636 | } | 636 | } |
637 | 637 | ||
638 | /** | 638 | /** |
639 | * Add this OKeyPair to the blackList. | 639 | * Add this OKeyPair to the blackList. |
640 | * Internal lists will be destroyed | 640 | * Internal lists will be destroyed |
641 | * | 641 | * |
642 | * @see clearBlackList | 642 | * @see clearBlackList |
643 | * @see removeFromBlackList | 643 | * @see removeFromBlackList |
644 | */ | 644 | */ |
645 | void OKeyConfigManager::addToBlackList( const OKeyPair& key) { | 645 | void OKeyConfigManager::addToBlackList( const OKeyPair& key) { |
646 | m_blackKeys.append( key ); | 646 | m_blackKeys.append( key ); |
647 | delete m_map; m_map = 0; | 647 | delete m_map; m_map = 0; |
648 | } | 648 | } |
649 | 649 | ||
650 | 650 | ||
651 | /** | 651 | /** |
652 | * Remove this OKeyPair from the black List | 652 | * Remove this OKeyPair from the black List |
653 | * Internal lists will be destroyed | 653 | * Internal lists will be destroyed |
654 | * | 654 | * |
655 | * @see addToBlackList | 655 | * @see addToBlackList |
656 | * @see clearBlackList | 656 | * @see clearBlackList |
657 | */ | 657 | */ |
658 | void OKeyConfigManager::removeFromBlackList( const OKeyPair& key ) { | 658 | void OKeyConfigManager::removeFromBlackList( const OKeyPair& key ) { |
659 | m_blackKeys.remove( key ); | 659 | m_blackKeys.remove( key ); |
660 | delete m_map; m_map = 0; | 660 | delete m_map; m_map = 0; |
661 | } | 661 | } |
662 | 662 | ||
663 | 663 | ||
664 | /** | 664 | /** |
665 | * Clear the blackList | 665 | * Clear the blackList |
666 | */ | 666 | */ |
667 | void OKeyConfigManager::clearBlackList() { | 667 | void OKeyConfigManager::clearBlackList() { |
668 | m_blackKeys.clear(); | 668 | m_blackKeys.clear(); |
669 | delete m_map; m_map = 0; | 669 | delete m_map; m_map = 0; |
670 | } | 670 | } |
671 | 671 | ||
672 | 672 | ||
673 | /** | 673 | /** |
674 | * Return a copy of the blackList | 674 | * Return a copy of the blackList |
675 | * | 675 | * |
676 | * @see addToBlackList | 676 | * @see addToBlackList |
677 | * @see clearBlackList | 677 | * @see clearBlackList |
678 | * @see removeFromBlackList | 678 | * @see removeFromBlackList |
679 | */ | 679 | */ |
680 | OKeyPair::List OKeyConfigManager::blackList()const { | 680 | OKeyPair::List OKeyConfigManager::blackList()const { |
681 | return m_blackKeys; | 681 | return m_blackKeys; |
682 | } | 682 | } |
683 | 683 | ||
684 | 684 | ||
685 | /** | 685 | /** |
686 | * Ask the Manager to handle KeyEvents for you. | 686 | * Ask the Manager to handle KeyEvents for you. |
687 | * All handled keys will emit a QSignal and return true | 687 | * All handled keys will emit a QSignal and return true |
688 | * that it handled the keyevent | 688 | * that it handled the keyevent |
689 | */ | 689 | */ |
690 | void OKeyConfigManager::handleWidget( QWidget* wid ) { | 690 | void OKeyConfigManager::handleWidget( QWidget* wid ) { |
691 | wid->installEventFilter( this ); | 691 | wid->installEventFilter( this ); |
692 | } | 692 | } |
693 | 693 | ||
694 | /** | 694 | /** |
695 | * @internal | 695 | * @internal |
696 | */ | 696 | */ |
697 | bool OKeyConfigManager::eventFilter( QObject* obj, QEvent* ev) { | 697 | bool OKeyConfigManager::eventFilter( QObject* obj, QEvent* ev) { |
698 | if ( !obj->isWidgetType() ) | 698 | if ( !obj->isWidgetType() ) |
699 | return false; | 699 | return false; |
700 | 700 | ||
701 | /* | 701 | /* |
702 | * check if we care for the event | 702 | * check if we care for the event |
703 | */ | 703 | */ |
704 | if ( (ev->type() != QEvent::KeyPress||!testEventMask(MaskPressed)) && | 704 | if ( (ev->type() != QEvent::KeyPress||!testEventMask(MaskPressed)) && |
705 | (ev->type() != QEvent::KeyRelease||!testEventMask(MaskReleased)) ) | 705 | (ev->type() != QEvent::KeyRelease||!testEventMask(MaskReleased)) ) |
706 | return false; | 706 | return false; |
707 | 707 | ||
708 | QKeyEvent *key = static_cast<QKeyEvent*>( ev ); | 708 | QKeyEvent *key = static_cast<QKeyEvent*>( ev ); |
709 | OKeyConfigItem item = handleKeyEvent( key ); | 709 | OKeyConfigItem item = handleKeyEvent( key ); |
710 | 710 | ||
711 | if ( item.isEmpty() ) | 711 | if ( item.isEmpty() ) |
712 | return false; | 712 | return false; |
713 | 713 | ||
714 | QWidget *wid = static_cast<QWidget*>( obj ); | 714 | QWidget *wid = static_cast<QWidget*>( obj ); |
715 | 715 | ||
716 | if ( item.object() && !item.slot().isEmpty() ) { | 716 | if ( item.object() && !item.slot().isEmpty() ) { |
717 | connect( this, SIGNAL( actionActivated(QWidget*, QKeyEvent*)), | 717 | connect( this, SIGNAL( actionActivated(QWidget*, QKeyEvent*)), |
718 | item.object(), item.slot().data() ); | 718 | item.object(), item.slot().data() ); |
719 | emit actionActivated(wid, key); | 719 | emit actionActivated(wid, key); |
720 | disconnect( this, SIGNAL(actionActivated(QWidget*,QKeyEvent*)), | 720 | disconnect( this, SIGNAL(actionActivated(QWidget*,QKeyEvent*)), |
721 | item.object(), item.slot().data() ); | 721 | item.object(), item.slot().data() ); |
722 | } | 722 | } |
723 | emit actionActivated( wid, key, item ); | 723 | emit actionActivated( wid, key, item ); |
724 | 724 | ||
725 | return true; | 725 | return true; |
726 | } | 726 | } |
727 | 727 | ||
728 | /** | 728 | /** |
729 | * @internal | 729 | * @internal |
730 | */ | 730 | */ |
731 | OKeyConfigItem::List OKeyConfigManager::keyList( int keycode) { | 731 | OKeyConfigItem::List OKeyConfigManager::keyList( int keycode) { |
732 | /* | 732 | /* |
733 | * Create the map if not existing anymore | 733 | * Create the map if not existing anymore |
734 | */ | 734 | */ |
735 | if ( !m_map ) { | 735 | if ( !m_map ) { |
736 | m_map = new OKeyMapConfigPrivate; | 736 | m_map = new OKeyMapConfigPrivate; |
737 | /* for every key */ | 737 | /* for every key */ |
738 | for ( OKeyConfigItem::List::Iterator it = m_keys.begin(); | 738 | for ( OKeyConfigItem::List::Iterator it = m_keys.begin(); |
739 | it!= m_keys.end(); ++it ) { | 739 | it!= m_keys.end(); ++it ) { |
740 | 740 | ||
741 | bool add = true; | 741 | bool add = true; |
742 | /* see if this key is blocked */ | 742 | /* see if this key is blocked */ |
743 | OKeyPair pair = (*it).keyPair(); | 743 | OKeyPair pair = (*it).keyPair(); |
744 | for ( OKeyPair::List::Iterator pairIt = m_blackKeys.begin(); | 744 | for ( OKeyPair::List::Iterator pairIt = m_blackKeys.begin(); |
745 | pairIt != m_blackKeys.end(); ++pairIt ) { | 745 | pairIt != m_blackKeys.end(); ++pairIt ) { |
746 | if ( (*pairIt).keycode() == pair.keycode() && | 746 | if ( (*pairIt).keycode() == pair.keycode() && |
747 | (*pairIt).modifier() == pair.modifier() ) { | 747 | (*pairIt).modifier() == pair.modifier() ) { |
748 | add = false; | 748 | add = false; |
749 | break; | 749 | break; |
750 | } | 750 | } |
751 | } | 751 | } |
752 | /* check if we added it */ | 752 | /* check if we added it */ |
753 | if ( add ) | 753 | if ( add ) |
754 | (*m_map)[pair.keycode()].append( *it ); | 754 | (*m_map)[pair.keycode()].append( *it ); |
755 | } | 755 | } |
756 | } | 756 | } |
757 | return (*m_map)[keycode]; | 757 | return (*m_map)[keycode]; |
758 | } | 758 | } |
759 | 759 | ||
760 | } | 760 | } |
761 | } | 761 | } |
diff --git a/libopie2/opiecore/okeyfilter.h b/libopie2/opiecore/okeyfilter.h index d183641..1871247 100644 --- a/libopie2/opiecore/okeyfilter.h +++ b/libopie2/opiecore/okeyfilter.h | |||
@@ -1,100 +1,100 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | =. Copyright (C) 2004 Rajko 'Alwin' Albrecht <alwin@handhelds.org> | 3 | =. Copyright (C) 2004 Rajko 'Alwin' Albrecht <alwin@handhelds.org> |
4 | .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | .=l. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .>+-= | 5 | .>+-= |
6 | _;:, .> :=|. This program is free software; you can | 6 | _;:, .> :=|. This program is free software; you can |
7 | .> <`_, > . <= redistribute it and/or modify it under | 7 | .> <`_, > . <= redistribute it and/or modify it under |
8 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 8 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
9 | .="- .-=="i, .._ License as published by the Free Software | 9 | .="- .-=="i, .._ License as published by the Free Software |
10 | - . .-<_> .<> Foundation; either version 2 of the License, | 10 | - . .-<_> .<> Foundation; either version 2 of the License, |
11 | ._= =} : or (at your option) any later version. | 11 | ._= =} : or (at your option) any later version. |
12 | .%`+i> _;_. | 12 | .%`+i> _;_. |
13 | .i_,=:_. -<s. This program is distributed in the hope that | 13 | .i_,=:_. -<s. This program is distributed in the hope that |
14 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 14 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
15 | : .. .:, . . . without even the implied warranty of | 15 | : .. .:, . . . without even the implied warranty of |
16 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 16 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
17 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 17 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
18 | ..}^=.= = ; Library General Public License for more | 18 | ..}^=.= = ; Library General Public License for more |
19 | ++= -. .` .: details. | 19 | ++= -. .` .: details. |
20 | : = ...= . :.=- | 20 | : = ...= . :.=- |
21 | -. .:....=;==+<; You should have received a copy of the GNU | 21 | -. .:....=;==+<; You should have received a copy of the GNU |
22 | -_. . . )=. = Library General Public License along with | 22 | -_. . . )=. = Library General Public License along with |
23 | -- :-=` this library; see the file COPYING.LIB. | 23 | -- :-=` this library; see the file COPYING.LIB. |
24 | If not, write to the Free Software Foundation, | 24 | If not, write to the Free Software Foundation, |
25 | Inc., 59 Temple Place - Suite 330, | 25 | Inc., 59 Temple Place - Suite 330, |
26 | Boston, MA 02111-1307, USA. | 26 | Boston, MA 02111-1307, USA. |
27 | */ | 27 | */ |
28 | 28 | ||
29 | /* QT */ | 29 | /* QT */ |
30 | #include <qwindowsystem_qws.h> | 30 | #include <qwindowsystem_qws.h> |
31 | #include <qvaluelist.h> | 31 | #include <qvaluelist.h> |
32 | 32 | ||
33 | namespace Opie { | 33 | namespace Opie { |
34 | namespace Core { | 34 | namespace Core { |
35 | class ODevice; | 35 | class ODevice; |
36 | 36 | ||
37 | 37 | ||
38 | /** | 38 | /** |
39 | * A singleton which will manage all possible keyboard filters inside opie. | 39 | * A singleton which will manage all possible keyboard filters inside opie. |
40 | * It makes sure that key handlers of odevice are checked first than the | 40 | * It makes sure that key handlers of odevice are checked first than the |
41 | * keyfilters of software. | 41 | * keyfilters of software. |
42 | * @short a keyfilter proxy | 42 | * @short a keyfilter proxy |
43 | * @see QWSServer::KeyboardFilter | 43 | * @see QWSServer::KeyboardFilter |
44 | * @author Rajko Albrecht | 44 | * @author Rajko Albrecht |
45 | * @version 1.0 | 45 | * @version 1.0 |
46 | */ | 46 | */ |
47 | class OKeyFilter | 47 | class OKeyFilter |
48 | { | 48 | { |
49 | friend class Opie::Core::ODevice; | 49 | friend class Opie::Core::ODevice; |
50 | 50 | ||
51 | protected: | 51 | protected: |
52 | /** | 52 | /** |
53 | * Protected constructor - generate class via inst() | 53 | * Protected constructor - generate class via inst() |
54 | * @see inst() | 54 | * @see inst() |
55 | */ | 55 | */ |
56 | OKeyFilter(); | 56 | OKeyFilter(); |
57 | /** | 57 | /** |
58 | * Protected constructor - generate class via inst() | 58 | * Protected constructor - generate class via inst() |
59 | * @see inst() | 59 | * @see inst() |
60 | */ | 60 | */ |
61 | OKeyFilter(const OKeyFilter&){}; | 61 | OKeyFilter(const OKeyFilter&){}; |
62 | /** | 62 | /** |
63 | * Append filter to the primary list. | 63 | * Append filter to the primary list. |
64 | * This is only allowed for friend classes from odevice | 64 | * This is only allowed for friend classes from odevice |
65 | * @param aFilter a filter to append | 65 | * @param aFilter a filter to append |
66 | * @see addHandler | 66 | * @see addHandler |
67 | */ | 67 | */ |
68 | virtual void addPreHandler(QWSServer::KeyboardFilter*aFilter)=0; | 68 | virtual void addPreHandler(QWSServer::KeyboardFilter *aFilter)=0; |
69 | /** | 69 | /** |
70 | * Remove the specified filter from list and give back ownership. | 70 | * Remove the specified filter from list and give back ownership. |
71 | * This is only allowed for friend classes from odevice | 71 | * This is only allowed for friend classes from odevice |
72 | * @param aFilter a filter to remove | 72 | * @param aFilter a filter to remove |
73 | * @see remHandler | 73 | * @see remHandler |
74 | */ | 74 | */ |
75 | virtual void remPreHandler(QWSServer::KeyboardFilter*aFilter)=0; | 75 | virtual void remPreHandler(QWSServer::KeyboardFilter *aFilter)=0; |
76 | 76 | ||
77 | public: | 77 | public: |
78 | virtual ~OKeyFilter(); | 78 | virtual ~OKeyFilter(); |
79 | /** | 79 | /** |
80 | * Append filter to the secondary list. | 80 | * Append filter to the secondary list. |
81 | * @param aFilter a filter to append | 81 | * @param aFilter a filter to append |
82 | * @see addPreHandler | 82 | * @see addPreHandler |
83 | */ | 83 | */ |
84 | virtual void addHandler(QWSServer::KeyboardFilter*)=0; | 84 | virtual void addHandler(QWSServer::KeyboardFilter *aFilter)=0; |
85 | /** | 85 | /** |
86 | * Remove the specified filter from list and give back ownership. | 86 | * Remove the specified filter from list and give back ownership. |
87 | * @param aFilter a filter to remove | 87 | * @param aFilter a filter to remove |
88 | * @see remPreHandler | 88 | * @see remPreHandler |
89 | */ | 89 | */ |
90 | virtual void remHandler(QWSServer::KeyboardFilter*)=0; | 90 | virtual void remHandler(QWSServer::KeyboardFilter *aFilter)=0; |
91 | 91 | ||
92 | /** | 92 | /** |
93 | * Returns a handler to an instance of OKeyFilter | 93 | * Returns a handler to an instance of OKeyFilter |
94 | * @return a pointer to a working OKeyFilter | 94 | * @return a pointer to a working OKeyFilter |
95 | */ | 95 | */ |
96 | static OKeyFilter*inst(); | 96 | static OKeyFilter*inst(); |
97 | }; | 97 | }; |
98 | 98 | ||
99 | } | 99 | } |
100 | } | 100 | } |
diff --git a/libopie2/opiecore/opluginloader.cpp b/libopie2/opiecore/opluginloader.cpp index ec19fa0..2a6e369 100644 --- a/libopie2/opiecore/opluginloader.cpp +++ b/libopie2/opiecore/opluginloader.cpp | |||
@@ -1,906 +1,905 @@ | |||
1 | /* | 1 | /* |
2 | * LGPLv2 or later | 2 | * LGPLv2 or later |
3 | * zecke@handhelds.org | 3 | * zecke@handhelds.org |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include "opluginloader.h" | 6 | #include "opluginloader.h" |
7 | #include "oconfig.h" | 7 | #include "oconfig.h" |
8 | #include "odebug.h" | 8 | #include "odebug.h" |
9 | 9 | ||
10 | #include <qpe/qpeapplication.h> | 10 | #include <qpe/qpeapplication.h> |
11 | 11 | ||
12 | #include <qdir.h> | 12 | #include <qdir.h> |
13 | #include <qdict.h> | 13 | #include <qdict.h> |
14 | #include <qtl.h> | 14 | #include <qtl.h> |
15 | #include <qfile.h> | 15 | #include <qfile.h> |
16 | 16 | ||
17 | #include <stdlib.h> | 17 | #include <stdlib.h> |
18 | 18 | ||
19 | 19 | ||
20 | 20 | ||
21 | namespace Opie { | 21 | namespace Opie { |
22 | namespace Core { | 22 | namespace Core { |
23 | namespace Internal { | 23 | namespace Internal { |
24 | struct OPluginLibraryHolder { | 24 | struct OPluginLibraryHolder { |
25 | static OPluginLibraryHolder *self(); | 25 | static OPluginLibraryHolder *self(); |
26 | QLibrary *ref( const QString& ); | 26 | QLibrary *ref( const QString& ); |
27 | void deref( QLibrary* ); | 27 | void deref( QLibrary* ); |
28 | private: | 28 | private: |
29 | 29 | ||
30 | OPluginLibraryHolder(); | 30 | OPluginLibraryHolder(); |
31 | ~OPluginLibraryHolder(); | 31 | ~OPluginLibraryHolder(); |
32 | QDict<QLibrary> m_libs; | 32 | QDict<QLibrary> m_libs; |
33 | static OPluginLibraryHolder* m_self; | 33 | static OPluginLibraryHolder* m_self; |
34 | }; | 34 | }; |
35 | 35 | ||
36 | OPluginLibraryHolder* OPluginLibraryHolder::m_self = 0; | 36 | OPluginLibraryHolder* OPluginLibraryHolder::m_self = 0; |
37 | OPluginLibraryHolder* OPluginLibraryHolder::self() { | 37 | OPluginLibraryHolder* OPluginLibraryHolder::self() { |
38 | if ( !m_self ) | 38 | if ( !m_self ) |
39 | m_self = new OPluginLibraryHolder; | 39 | m_self = new OPluginLibraryHolder; |
40 | 40 | ||
41 | return m_self; | 41 | return m_self; |
42 | } | 42 | } |
43 | 43 | ||
44 | OPluginLibraryHolder::OPluginLibraryHolder() {} | 44 | OPluginLibraryHolder::OPluginLibraryHolder() {} |
45 | OPluginLibraryHolder::~OPluginLibraryHolder() {} | 45 | OPluginLibraryHolder::~OPluginLibraryHolder() {} |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * We do simple ref counting... We will add the QLibrary again | 48 | * We do simple ref counting... We will add the QLibrary again |
49 | * and again to the dictionary and on deref we will pop and pop it | 49 | * and again to the dictionary and on deref we will pop and pop it |
50 | * until there are no more library and we will unload and delete the library | 50 | * until there are no more library and we will unload and delete the library |
51 | * luckily dlopen does some ref counting as well so we don't need | 51 | * luckily dlopen does some ref counting as well so we don't need |
52 | * to hack QPEApplication | 52 | * to hack QPEApplication |
53 | */ | 53 | */ |
54 | QLibrary* OPluginLibraryHolder::ref(const QString& str) { | 54 | QLibrary* OPluginLibraryHolder::ref(const QString& str) { |
55 | QLibrary *lib = m_libs[str]; | 55 | QLibrary *lib = m_libs[str]; |
56 | 56 | ||
57 | /* if not in the dict try to load it */ | 57 | /* if not in the dict try to load it */ |
58 | if ( !lib ) { | 58 | if ( !lib ) { |
59 | lib = new QLibrary( str, QLibrary::Immediately ); | 59 | lib = new QLibrary( str, QLibrary::Immediately ); |
60 | if ( !lib->isLoaded() ) { | 60 | if ( !lib->isLoaded() ) { |
61 | delete lib; | 61 | delete lib; |
62 | return 0l; | 62 | return 0l; |
63 | } | 63 | } |
64 | } | 64 | } |
65 | 65 | ||
66 | /* now refcount one up */ | 66 | /* now refcount one up */ |
67 | m_libs.insert( str, lib ); | 67 | m_libs.insert( str, lib ); |
68 | return lib; | 68 | return lib; |
69 | } | 69 | } |
70 | 70 | ||
71 | /* | 71 | /* |
72 | * 'unshadow' the items until we're the last then unload and delete | 72 | * 'unshadow' the items until we're the last then unload and delete |
73 | */ | 73 | */ |
74 | void OPluginLibraryHolder::deref( QLibrary* lib ) { | 74 | void OPluginLibraryHolder::deref( QLibrary* lib ) { |
75 | if ( !lib ) | 75 | if ( !lib ) |
76 | return; | 76 | return; |
77 | 77 | ||
78 | QString str = lib->library(); | 78 | QString str = lib->library(); |
79 | /* no need to check if the lib was inserted or such */ | 79 | /* no need to check if the lib was inserted or such */ |
80 | (void) m_libs.take( str ); | 80 | (void) m_libs.take( str ); |
81 | if ( !m_libs[str] ) { | 81 | if ( !m_libs[str] ) { |
82 | lib->unload(); | 82 | lib->unload(); |
83 | delete lib; | 83 | delete lib; |
84 | } | 84 | } |
85 | } | 85 | } |
86 | } | 86 | } |
87 | 87 | ||
88 | /** | 88 | /** |
89 | * We want values with 30,29,28 at the beginning of the list | 89 | * We want values with 30,29,28 at the beginning of the list |
90 | */ | 90 | */ |
91 | 91 | ||
92 | bool operator<( const OPluginItem& l, const OPluginItem& r ) { | 92 | bool operator<( const OPluginItem& l, const OPluginItem& r ) { |
93 | return l.position() > r.position(); | 93 | return l.position() > r.position(); |
94 | } | 94 | } |
95 | 95 | ||
96 | bool operator>( const OPluginItem& l, const OPluginItem& r ) { | 96 | bool operator>( const OPluginItem& l, const OPluginItem& r ) { |
97 | return l.position() < r.position(); | 97 | return l.position() < r.position(); |
98 | } | 98 | } |
99 | 99 | ||
100 | bool operator<=( const OPluginItem& l, const OPluginItem& r ) { | 100 | bool operator<=( const OPluginItem& l, const OPluginItem& r ) { |
101 | return l.position() >= r.position(); | 101 | return l.position() >= r.position(); |
102 | } | 102 | } |
103 | 103 | ||
104 | /** | 104 | /** |
105 | * \brief Creates an Empty OPluginItem | 105 | * \brief Creates an Empty OPluginItem |
106 | * | 106 | * |
107 | * create an empty pluginitem. Position is set to -1 and the | 107 | * create an empty pluginitem. Position is set to -1 and the |
108 | * other things are used with the default ctors | 108 | * other things are used with the default ctors |
109 | */ | 109 | */ |
110 | OPluginItem::OPluginItem() | 110 | OPluginItem::OPluginItem() |
111 | : m_pos( -1 ) { | 111 | : m_pos( -1 ) { |
112 | } | 112 | } |
113 | 113 | ||
114 | /** | 114 | /** |
115 | * @todo Create Internal name so we can have the plugin names translated. Or only for the gui? I'm not yet sure | 115 | * @todo Create Internal name so we can have the plugin names translated. Or only for the gui? I'm not yet sure |
116 | * \brief Create an OPluginItem | 116 | * \brief Create an OPluginItem |
117 | * | 117 | * |
118 | * Create a Plugin Item with all information. If you for some reasons | 118 | * Create a Plugin Item with all information. If you for some reasons |
119 | * need to create your own OPluginItems make sure that 'name' is always the same | 119 | * need to create your own OPluginItems make sure that 'name' is always the same |
120 | * as it if used for positions and exclude list. | 120 | * as it if used for positions and exclude list. |
121 | * | 121 | * |
122 | * @param name The if available translated Name | 122 | * @param name The if available translated Name |
123 | * @param path The path to the plugin must be absolute. | 123 | * @param path The path to the plugin must be absolute. |
124 | * @param b If the OPluginItem is enabled or not | 124 | * @param b If the OPluginItem is enabled or not |
125 | * @param pos The position of the plugin if used for sorting | 125 | * @param pos The position of the plugin if used for sorting |
126 | * | 126 | * |
127 | */ | 127 | */ |
128 | OPluginItem::OPluginItem( const QString& name, const QString& path, bool b, int pos ) | 128 | OPluginItem::OPluginItem( const QString& name, const QString& path, bool b, int pos ) |
129 | : m_name( name ), m_path( path ), m_enabled( b ), m_pos( pos ) | 129 | : m_name( name ), m_path( path ), m_enabled( b ), m_pos( pos ) |
130 | {} | 130 | {} |
131 | 131 | ||
132 | /** | 132 | /** |
133 | * \brief simple d'tor | 133 | * \brief simple d'tor |
134 | */ | 134 | */ |
135 | OPluginItem::~OPluginItem() { | 135 | OPluginItem::~OPluginItem() { |
136 | } | 136 | } |
137 | 137 | ||
138 | /** | 138 | /** |
139 | * \brief Test if this Item is Empty and does not represent a loadable plugin | 139 | * \brief Test if this Item is Empty and does not represent a loadable plugin |
140 | * Test if a OPluginItem is empty. A OPluginItem is empty if name and path are empty | 140 | * Test if a OPluginItem is empty. A OPluginItem is empty if name and path are empty |
141 | * ,pos equals -1 and the item is disabled | 141 | * ,pos equals -1 and the item is disabled |
142 | * | 142 | * |
143 | * @see QString::isEmpty() | 143 | * @see QString::isEmpty() |
144 | * | 144 | * |
145 | */ | 145 | */ |
146 | bool OPluginItem::isEmpty()const { | 146 | bool OPluginItem::isEmpty()const { |
147 | if ( m_pos != -1 ) return false; | 147 | if ( m_pos != -1 ) return false; |
148 | if ( m_enabled ) return false; | 148 | if ( m_enabled ) return false; |
149 | if ( !m_name.isEmpty() ) return false; | 149 | if ( !m_name.isEmpty() ) return false; |
150 | if ( !m_path.isEmpty() ) return false; | 150 | if ( !m_path.isEmpty() ) return false; |
151 | 151 | ||
152 | return true; | 152 | return true; |
153 | } | 153 | } |
154 | 154 | ||
155 | /** | 155 | /** |
156 | * \brief test equality | 156 | * \brief test equality |
157 | * operator to test equalness of two OPluginItem | 157 | * operator to test equalness of two OPluginItem |
158 | */ | 158 | */ |
159 | bool OPluginItem::operator==( const OPluginItem& r )const{ | 159 | bool OPluginItem::operator==( const OPluginItem& r )const{ |
160 | if ( m_pos != r.m_pos ) return false; | 160 | if ( m_pos != r.m_pos ) return false; |
161 | if ( m_enabled != r.m_enabled) return false; | 161 | if ( m_enabled != r.m_enabled) return false; |
162 | if ( m_name != r.m_name ) return false; | 162 | if ( m_name != r.m_name ) return false; |
163 | if ( m_path != r.m_path ) return false; | 163 | if ( m_path != r.m_path ) return false; |
164 | return true; | 164 | return true; |
165 | } | 165 | } |
166 | 166 | ||
167 | /** | 167 | /** |
168 | * \brief test non equality | 168 | * \brief test non equality |
169 | * operator to test non-equalness of two OPluginItem | 169 | * operator to test non-equalness of two OPluginItem |
170 | */ | 170 | */ |
171 | bool OPluginItem::operator!=( const OPluginItem& r )const{ | 171 | bool OPluginItem::operator!=( const OPluginItem& r )const{ |
172 | return !( *this == r ); | 172 | return !( *this == r ); |
173 | } | 173 | } |
174 | 174 | ||
175 | /** | 175 | /** |
176 | * \brief returns the name of the plugin | 176 | * \brief returns the name of the plugin |
177 | * return the name of this Plugin | 177 | * return the name of this Plugin |
178 | */ | 178 | */ |
179 | QString OPluginItem::name()const { | 179 | QString OPluginItem::name()const { |
180 | return m_name; | 180 | return m_name; |
181 | } | 181 | } |
182 | 182 | ||
183 | /** | 183 | /** |
184 | * \brief return the path of the plugin | 184 | * \brief return the path of the plugin |
185 | */ | 185 | */ |
186 | QString OPluginItem::path()const { | 186 | QString OPluginItem::path()const { |
187 | return m_path; | 187 | return m_path; |
188 | } | 188 | } |
189 | 189 | ||
190 | /** | 190 | /** |
191 | * \brief Return if this item is enabled. | 191 | * \brief Return if this item is enabled. |
192 | */ | 192 | */ |
193 | bool OPluginItem::isEnabled()const { | 193 | bool OPluginItem::isEnabled()const { |
194 | return m_enabled; | 194 | return m_enabled; |
195 | } | 195 | } |
196 | 196 | ||
197 | /** | 197 | /** |
198 | * \brief return the position of a plugin. | 198 | * \brief return the position of a plugin. |
199 | * return the position of the item | 199 | * return the position of the item |
200 | * -1 is the default value and means normally that the whole items are unsorted. | 200 | * -1 is the default value and means normally that the whole items are unsorted. |
201 | * Higher numbers belong to an upper position. With plugins with the postions 20,19,5,3 | 201 | * Higher numbers belong to an upper position. With plugins with the postions 20,19,5,3 |
202 | * the item with pos 20 would be the first in the list returned by the OGenericPluginLoader | 202 | * the item with pos 20 would be the first in the list returned by the OGenericPluginLoader |
203 | * | 203 | * |
204 | * @see OGenericPluginLoader::allAvailable | 204 | * @see OGenericPluginLoader::allAvailable |
205 | * @see OGenericPluginLoader::filtered | 205 | * @see OGenericPluginLoader::filtered |
206 | */ | 206 | */ |
207 | int OPluginItem::position()const{ | 207 | int OPluginItem::position()const{ |
208 | return m_pos; | 208 | return m_pos; |
209 | } | 209 | } |
210 | 210 | ||
211 | /** | 211 | /** |
212 | * \brief set the name of a plugin | 212 | * \brief set the name of a plugin |
213 | * Set the name of the Plugin Item | 213 | * Set the name of the Plugin Item |
214 | * @param name | 214 | * @param name |
215 | */ | 215 | */ |
216 | void OPluginItem::setName( const QString& name ) { | 216 | void OPluginItem::setName( const QString& name ) { |
217 | m_name = name; | 217 | m_name = name; |
218 | } | 218 | } |
219 | 219 | ||
220 | /** | 220 | /** |
221 | * \brief set the path of a plugin | 221 | * \brief set the path of a plugin |
222 | * Set the path of Plugin Item. The path must be absolute. | 222 | * Set the path of Plugin Item. The path must be absolute. |
223 | * @param name The path of the plugin | 223 | * @param name The path of the plugin |
224 | */ | 224 | */ |
225 | void OPluginItem::setPath( const QString& name ) { | 225 | void OPluginItem::setPath( const QString& name ) { |
226 | m_path = name; | 226 | m_path = name; |
227 | } | 227 | } |
228 | 228 | ||
229 | /** | 229 | /** |
230 | * \brief enable or disable the to load attribute | 230 | * \brief enable or disable the to load attribute |
231 | * Set the Enabled attribute. Such changes won't be saved. If you want to save it | 231 | * Set the Enabled attribute. Such changes won't be saved. If you want to save it |
232 | * use a OPluginManager to configure your plugins manually or Opie::Ui::OPluginConfig | 232 | * use a OPluginManager to configure your plugins manually or Opie::Ui::OPluginConfig |
233 | * for a graphical frontend. | 233 | * for a graphical frontend. |
234 | * | 234 | * |
235 | * @param enabled Enable or Disable the Enabled Attribute | 235 | * @param enabled Enable or Disable the Enabled Attribute |
236 | */ | 236 | */ |
237 | void OPluginItem::setEnabled( bool enabled ) { | 237 | void OPluginItem::setEnabled( bool enabled ) { |
238 | m_enabled = enabled; | 238 | m_enabled = enabled; |
239 | } | 239 | } |
240 | 240 | ||
241 | /** | 241 | /** |
242 | * \brief Set the position. | 242 | * \brief Set the position. |
243 | * Set the position | 243 | * Set the position |
244 | * @param pos The position | 244 | * @param pos The position |
245 | * | 245 | * |
246 | * @see position() | 246 | * @see position() |
247 | */ | 247 | */ |
248 | void OPluginItem::setPosition( int pos ) { | 248 | void OPluginItem::setPosition( int pos ) { |
249 | m_pos = pos; | 249 | m_pos = pos; |
250 | } | 250 | } |
251 | 251 | ||
252 | 252 | ||
253 | 253 | ||
254 | /** | 254 | /** |
255 | * \brief create a PluginLoader | 255 | * \brief create a PluginLoader |
256 | * | 256 | * |
257 | * Create a PluginLoader autoDelete is set to false | 257 | * Create a PluginLoader autoDelete is set to false |
258 | * | 258 | * |
259 | * \code | 259 | * \code |
260 | * Opie::Core::OGenericPluginLoader loader("myapp-plugin"); | 260 | * Opie::Core::OGenericPluginLoader loader("myapp-plugin"); |
261 | * Opie::Core::OPluginItem::List lst = loader.filtered(); | 261 | * Opie::Core::OPluginItem::List lst = loader.filtered(); |
262 | * for(Opie::Core::OPluginItem::List::Iterator it = lst.begin(); it!=lst.end();++it){ | 262 | * for(Opie::Core::OPluginItem::List::Iterator it = lst.begin(); it!=lst.end();++it){ |
263 | * MyIface* iface = static_cast<MyIface*>(loader.load(*it,IID_MyIface)); | 263 | * MyIface* iface = static_cast<MyIface*>(loader.load(*it,IID_MyIface)); |
264 | * } | 264 | * } |
265 | * \endcode | 265 | * \endcode |
266 | * | 266 | * |
267 | * \code | 267 | * \code |
268 | * Opie::Core::OGenericPluginLoader loader("myapp-plugin"); | 268 | * Opie::Core::OGenericPluginLoader loader("myapp-plugin"); |
269 | * Opie::Core::OPluginItem::List lst = loader.filtered(); | 269 | * Opie::Core::OPluginItem::List lst = loader.filtered(); |
270 | * for(Opie::Core::OPluginItem::List::Iterator it = lst.begin(); it!=lst.end();++it){ | 270 | * for(Opie::Core::OPluginItem::List::Iterator it = lst.begin(); it!=lst.end();++it){ |
271 | * MyIface* iface = static_cast<MyIface*>(loader.load(*it,IID_MyIface)); | 271 | * MyIface* iface = static_cast<MyIface*>(loader.load(*it,IID_MyIface)); |
272 | * } | 272 | * } |
273 | * ... | 273 | * ... |
274 | * loader.clear(); | 274 | * loader.clear(); |
275 | * | 275 | * |
276 | * \endcode | 276 | * \endcode |
277 | * | 277 | * |
278 | * @param name The name of the plugin directory. | 278 | * @param name The name of the plugin directory. |
279 | * @param isSorted Tell the PluginLoader if your Plugins are sorted | 279 | * @param isSorted Tell the PluginLoader if your Plugins are sorted |
280 | */ | 280 | */ |
281 | OGenericPluginLoader::OGenericPluginLoader( const QString& name, bool isSorted) | 281 | OGenericPluginLoader::OGenericPluginLoader( const QString& name, bool isSorted) |
282 | : m_dir( name ), m_autoDelete( false ), m_isSafeMode( false ), | 282 | : m_dir( name ), m_autoDelete( false ), m_isSafeMode( false ), |
283 | m_isSorted( isSorted ) | 283 | m_isSorted( isSorted ) |
284 | { | 284 | { |
285 | setPluginDir( QPEApplication::qpeDir() + "plugins/"+name ); | 285 | setPluginDir( QPEApplication::qpeDir() + "plugins/"+name ); |
286 | readConfig(); | 286 | readConfig(); |
287 | } | 287 | } |
288 | 288 | ||
289 | 289 | ||
290 | /** | 290 | /** |
291 | * \brief simple d'tor that cleans up depending on autoDelete | 291 | * \brief simple d'tor that cleans up depending on autoDelete |
292 | * | 292 | * |
293 | * calls clear if autoDelete is true. This will release all interfaces | 293 | * calls clear if autoDelete is true. This will release all interfaces |
294 | * and remove the library from this process if the refcount falls to zero | 294 | * and remove the library from this process if the refcount falls to zero |
295 | */ | 295 | */ |
296 | OGenericPluginLoader::~OGenericPluginLoader() { | 296 | OGenericPluginLoader::~OGenericPluginLoader() { |
297 | if ( m_autoDelete ) | 297 | if ( m_autoDelete ) |
298 | clear(); | 298 | clear(); |
299 | } | 299 | } |
300 | 300 | ||
301 | /** | 301 | /** |
302 | * \brief Enable or disable autoDelete on destruction | 302 | * \brief Enable or disable autoDelete on destruction |
303 | * | 303 | * |
304 | * enable autoDelete. This will call clear on the d'tor | 304 | * enable autoDelete. This will call clear on the d'tor |
305 | * | 305 | * |
306 | * @see ~OGenericPluginLoader | 306 | * @see ~OGenericPluginLoader |
307 | * @see clear() | 307 | * @see clear() |
308 | */ | 308 | */ |
309 | void OGenericPluginLoader::setAutoDelete( bool t ) { | 309 | void OGenericPluginLoader::setAutoDelete( bool t ) { |
310 | m_autoDelete = t; | 310 | m_autoDelete = t; |
311 | } | 311 | } |
312 | 312 | ||
313 | /** | 313 | /** |
314 | * \brief See if autoDelete is enabled. | 314 | * \brief See if autoDelete is enabled. |
315 | */ | 315 | */ |
316 | bool OGenericPluginLoader::autoDelete()const{ | 316 | bool OGenericPluginLoader::autoDelete()const{ |
317 | return m_autoDelete; | 317 | return m_autoDelete; |
318 | } | 318 | } |
319 | 319 | ||
320 | /** | 320 | /** |
321 | * \brief unload all loaded Plugins | 321 | * \brief unload all loaded Plugins |
322 | * | 322 | * |
323 | * This will unload all returned QUnknownInterfaces by load. Unload | 323 | * This will unload all returned QUnknownInterfaces by load. Unload |
324 | * will be called. | 324 | * will be called. |
325 | */ | 325 | */ |
326 | void OGenericPluginLoader::clear() { | 326 | void OGenericPluginLoader::clear() { |
327 | QPtrDictIterator<QLibrary> it( m_library ); | 327 | QPtrDictIterator<QLibrary> it( m_library ); |
328 | for ( ;it.current(); ) | 328 | for ( ;it.current(); ) |
329 | unload( static_cast<QUnknownInterface*>( it.currentKey() ) ); | 329 | unload( static_cast<QUnknownInterface*>( it.currentKey() ) ); |
330 | } | 330 | } |
331 | 331 | ||
332 | /** | 332 | /** |
333 | * \brief unload the Plugin and the accompanied Resources. | 333 | * \brief unload the Plugin and the accompanied Resources. |
334 | * | 334 | * |
335 | * This will take the iface from the internal QPtrDict, Release it, | 335 | * This will take the iface from the internal QPtrDict, Release it, |
336 | * and deref the libray used. | 336 | * and deref the libray used. |
337 | * The visibility depends on the QPtrDict. | 337 | * The visibility depends on the QPtrDict. |
338 | * @see QPtrDict::insert | 338 | * @see QPtrDict::insert |
339 | */ | 339 | */ |
340 | void OGenericPluginLoader::unload( QUnknownInterface* iface ) { | 340 | void OGenericPluginLoader::unload( QUnknownInterface* iface ) { |
341 | if ( !iface ) | 341 | if ( !iface ) |
342 | return; | 342 | return; |
343 | 343 | ||
344 | iface->release(); | 344 | iface->release(); |
345 | Internal::OPluginLibraryHolder::self()->deref( m_library.take( iface ) ); | 345 | Internal::OPluginLibraryHolder::self()->deref( m_library.take( iface ) ); |
346 | } | 346 | } |
347 | 347 | ||
348 | /** | 348 | /** |
349 | * \brief The name of the plugins. | 349 | * \brief The name of the plugins. |
350 | * | 350 | * |
351 | * Return the name/type you specified in the constructor. | 351 | * Return the name/type you specified in the constructor. |
352 | * This is at least used by the OPluginManager to find the right config | 352 | * This is at least used by the OPluginManager to find the right config |
353 | */ | 353 | */ |
354 | QString OGenericPluginLoader::name()const { | 354 | QString OGenericPluginLoader::name()const { |
355 | return m_dir; | 355 | return m_dir; |
356 | } | 356 | } |
357 | 357 | ||
358 | 358 | ||
359 | /** | 359 | /** |
360 | * \brief See if loading of a plugin segfaulted | 360 | * \brief See if loading of a plugin segfaulted |
361 | * This tells you | 361 | * This tells you |
362 | * if by previous tries to load, loading crashed your application. | 362 | * if by previous tries to load, loading crashed your application. |
363 | * If isInSafeMode you can use the GUI to configure the plugins prior to loading | 363 | * If isInSafeMode you can use the GUI to configure the plugins prior to loading |
364 | * | 364 | * |
365 | * @return true if prior loading failed | 365 | * @return true if prior loading failed |
366 | */ | 366 | */ |
367 | bool OGenericPluginLoader::isInSafeMode()const { | 367 | bool OGenericPluginLoader::isInSafeMode()const { |
368 | return m_isSafeMode; | 368 | return m_isSafeMode; |
369 | } | 369 | } |
370 | 370 | ||
371 | 371 | ||
372 | /** | 372 | /** |
373 | * \brief Return all Plugins found in the plugins dirs. | 373 | * \brief Return all Plugins found in the plugins dirs. |
374 | * Return the list of all available plugins. This will go through all plugin | 374 | * Return the list of all available plugins. This will go through all plugin |
375 | * directories and search for your type of plugins ( by subdir ) | 375 | * directories and search for your type of plugins ( by subdir ) |
376 | * | 376 | * |
377 | * @param sorted Tell if you want to have the positions sorted. This only makes sense if you | 377 | * @param sorted Tell if you want to have the positions sorted. This only makes sense if you |
378 | */ | 378 | */ |
379 | OPluginItem::List OGenericPluginLoader::allAvailable( bool sorted )const { | 379 | OPluginItem::List OGenericPluginLoader::allAvailable( bool sorted )const { |
380 | OPluginItem::List lst; | 380 | OPluginItem::List lst; |
381 | for ( QStringList::ConstIterator it = m_plugDirs.begin(); it != m_plugDirs.end(); ++it ) | 381 | for ( QStringList::ConstIterator it = m_plugDirs.begin(); it != m_plugDirs.end(); ++it ) |
382 | lst += plugins( *it, sorted, false ); | 382 | lst += plugins( *it, sorted, false ); |
383 | 383 | ||
384 | if ( sorted ) | 384 | if ( sorted ) |
385 | qHeapSort( lst ); | 385 | qHeapSort( lst ); |
386 | return lst; | 386 | return lst; |
387 | } | 387 | } |
388 | 388 | ||
389 | /** | 389 | /** |
390 | * \brief Return only the enabled plugins | 390 | * \brief Return only the enabled plugins |
391 | * Return only activated plugins. | 391 | * Return only activated plugins. |
392 | * | 392 | * |
393 | * @param sorted If the list should be sorted | 393 | * @param sorted If the list should be sorted |
394 | */ | 394 | */ |
395 | OPluginItem::List OGenericPluginLoader::filtered( bool sorted )const { | 395 | OPluginItem::List OGenericPluginLoader::filtered( bool sorted )const { |
396 | OPluginItem::List lst; | 396 | OPluginItem::List lst; |
397 | for ( QStringList::ConstIterator it = m_plugDirs.begin(); it != m_plugDirs.end(); ++it ) | 397 | for ( QStringList::ConstIterator it = m_plugDirs.begin(); it != m_plugDirs.end(); ++it ) |
398 | lst += plugins( *it, sorted, true ); | 398 | lst += plugins( *it, sorted, true ); |
399 | 399 | ||
400 | if ( sorted ) | 400 | if ( sorted ) |
401 | qHeapSort( lst ); | 401 | qHeapSort( lst ); |
402 | return lst; | 402 | return lst; |
403 | } | 403 | } |
404 | 404 | ||
405 | 405 | ||
406 | /** | 406 | /** |
407 | * \brief Load a OPluginItem for the specified interface | 407 | * \brief Load a OPluginItem for the specified interface |
408 | * This will open the resource of the OPluginItem::path() and then will query | 408 | * This will open the resource of the OPluginItem::path() and then will query |
409 | * if the Interface specified in the uuid is available and then will manage the | 409 | * if the Interface specified in the uuid is available and then will manage the |
410 | * resource and Interface. | 410 | * resource and Interface. |
411 | * | 411 | * |
412 | * @param item The OPluginItem that should be loaded | 412 | * @param item The OPluginItem that should be loaded |
413 | * @param uuid The Interface to query for | 413 | * @param uuid The Interface to query for |
414 | * | 414 | * |
415 | * @return Either 0 in case of failure or the Plugin as QUnknownInterface* | 415 | * @return Either 0 in case of failure or the Plugin as QUnknownInterface* |
416 | */ | 416 | */ |
417 | QUnknownInterface* OGenericPluginLoader::load( const OPluginItem& item, const QUuid& uuid) { | 417 | QUnknownInterface* OGenericPluginLoader::load( const OPluginItem& item, const QUuid& uuid) { |
418 | /* | 418 | /* |
419 | * Check if there could be a library | 419 | * Check if there could be a library |
420 | */ | 420 | */ |
421 | QString pa = item.path(); | 421 | QString pa = item.path(); |
422 | if ( pa.isEmpty() ) | 422 | if ( pa.isEmpty() ) |
423 | return 0l; | 423 | return 0l; |
424 | 424 | ||
425 | /* | 425 | /* |
426 | * See if we get a library | 426 | * See if we get a library |
427 | * return if we've none | 427 | * return if we've none |
428 | */ | 428 | */ |
429 | setSafeMode( pa, true ); | 429 | setSafeMode( pa, true ); |
430 | QLibrary *lib = Internal::OPluginLibraryHolder::self()->ref( pa ); | 430 | QLibrary *lib = Internal::OPluginLibraryHolder::self()->ref( pa ); |
431 | if ( !lib ) { | 431 | if ( !lib ) { |
432 | setSafeMode(); | 432 | setSafeMode(); |
433 | return 0l; | 433 | return 0l; |
434 | } | 434 | } |
435 | 435 | ||
436 | /** | 436 | /** |
437 | * try to load the plugin and just in case initialize the pointer to a pointer again | 437 | * try to load the plugin and just in case initialize the pointer to a pointer again |
438 | */ | 438 | */ |
439 | QUnknownInterface* iface=0; | 439 | QUnknownInterface* iface=0; |
440 | if ( lib->queryInterface( uuid, &iface ) == QS_OK ) { | 440 | if ( lib->queryInterface( uuid, &iface ) == QS_OK ) { |
441 | installTranslators( item.name() ); | 441 | installTranslators( item.name() ); |
442 | m_library.insert( iface, lib ); | 442 | m_library.insert( iface, lib ); |
443 | }else | 443 | }else |
444 | iface = 0; | 444 | iface = 0; |
445 | 445 | ||
446 | setSafeMode(); | 446 | setSafeMode(); |
447 | 447 | ||
448 | return iface; | 448 | return iface; |
449 | } | 449 | } |
450 | 450 | ||
451 | /** | 451 | /** |
452 | * @internal and reads in the safe mode | 452 | * @internal and reads in the safe mode |
453 | */ | 453 | */ |
454 | void OGenericPluginLoader::readConfig() { | 454 | void OGenericPluginLoader::readConfig() { |
455 | 455 | ||
456 | 456 | ||
457 | /* read the config for SafeMode */ | 457 | /* read the config for SafeMode */ |
458 | OConfig conf( m_dir + "-odpplugins" ); | 458 | OConfig conf( m_dir + "-odpplugins" ); |
459 | conf.setGroup( "General" ); | 459 | conf.setGroup( "General" ); |
460 | m_isSafeMode = conf.readBoolEntry( "SafeMode", false ); | 460 | m_isSafeMode = conf.readBoolEntry( "SafeMode", false ); |
461 | } | 461 | } |
462 | 462 | ||
463 | /** | 463 | /** |
464 | * @internal Enter or leave SafeMode | 464 | * @internal Enter or leave SafeMode |
465 | */ | 465 | */ |
466 | void OGenericPluginLoader::setSafeMode(const QString& str, bool b) { | 466 | void OGenericPluginLoader::setSafeMode(const QString& str, bool b) { |
467 | OConfig conf( m_dir + "-odpplugins" ); | 467 | OConfig conf( m_dir + "-odpplugins" ); |
468 | conf.setGroup( "General" ); | 468 | conf.setGroup( "General" ); |
469 | conf.writeEntry( "SafeMode", b ); | 469 | conf.writeEntry( "SafeMode", b ); |
470 | conf.writeEntry( "CrashedPlugin", str ); | 470 | conf.writeEntry( "CrashedPlugin", str ); |
471 | } | 471 | } |
472 | 472 | ||
473 | /** | 473 | /** |
474 | * @internal | 474 | * @internal |
475 | * | 475 | * |
476 | * Set the List of Plugin Dirs to lst. Currently only QPEApplication::qpeDir()+"/plugins/"+mytype | 476 | * Set the List of Plugin Dirs to lst. Currently only QPEApplication::qpeDir()+"/plugins/"+mytype |
477 | * is used as plugin dir | 477 | * is used as plugin dir |
478 | */ | 478 | */ |
479 | void OGenericPluginLoader::setPluginDirs( const QStringList& lst ) { | 479 | void OGenericPluginLoader::setPluginDirs( const QStringList& lst ) { |
480 | m_plugDirs = lst; | 480 | m_plugDirs = lst; |
481 | } | 481 | } |
482 | 482 | ||
483 | /** | 483 | /** |
484 | * | 484 | * |
485 | * @internal | 485 | * @internal |
486 | * Set the Plugin Dir to str. Str will be the only element in the list of plugin dirs | 486 | * Set the Plugin Dir to str. Str will be the only element in the list of plugin dirs |
487 | */ | 487 | */ |
488 | void OGenericPluginLoader::setPluginDir( const QString& str) { | 488 | void OGenericPluginLoader::setPluginDir( const QString& str) { |
489 | m_plugDirs.clear(); | 489 | m_plugDirs.clear(); |
490 | m_plugDirs.append( str ); | 490 | m_plugDirs.append( str ); |
491 | } | 491 | } |
492 | 492 | ||
493 | 493 | ||
494 | /** | 494 | /** |
495 | * @internal | 495 | * @internal |
496 | */ | 496 | */ |
497 | bool OGenericPluginLoader::isSorted()const{ | 497 | bool OGenericPluginLoader::isSorted()const{ |
498 | return m_isSorted; | 498 | return m_isSorted; |
499 | } | 499 | } |
500 | 500 | ||
501 | /* | 501 | /* |
502 | * make libfoo.so.1.0.0 -> foo on UNIX | 502 | * make libfoo.so.1.0.0 -> foo on UNIX |
503 | * make libfoo.dylib -> foo on MAC OS X Unix | 503 | * make libfoo.dylib -> foo on MAC OS X Unix |
504 | * windows is obviously missing | 504 | * windows is obviously missing |
505 | */ | 505 | */ |
506 | /** | 506 | /** |
507 | * @internal | 507 | * @internal |
508 | */ | 508 | */ |
509 | QString OGenericPluginLoader::unlibify( const QString& str ) { | 509 | QString OGenericPluginLoader::unlibify( const QString& str ) { |
510 | QString st = str.mid( str.find( "lib" )+3 ); | 510 | QString st = str.mid( str.find( "lib" )+3 ); |
511 | #ifdef Q_OS_MACX | 511 | #ifdef Q_OS_MACX |
512 | return st.left( st.findRev( ".dylib" ) ); | 512 | return st.left( st.findRev( ".dylib" ) ); |
513 | #else | 513 | #else |
514 | return st.left( st.findRev( ".so" ) ); | 514 | return st.left( st.findRev( ".so" ) ); |
515 | #endif | 515 | #endif |
516 | } | 516 | } |
517 | 517 | ||
518 | /** | 518 | /** |
519 | * @internal | 519 | * @internal |
520 | * | 520 | * |
521 | * \brief method to return available plugins. Internal and for reeimplementations | 521 | * \brief method to return available plugins. Internal and for reeimplementations |
522 | * | 522 | * |
523 | *Return a List of Plugins for a dir and add positions and remove disabled. | 523 | *Return a List of Plugins for a dir and add positions and remove disabled. |
524 | * If a plugin is on the excluded list assign position -2 | 524 | * If a plugin is on the excluded list assign position -2 |
525 | * | 525 | * |
526 | * @param dir The dir to look in | 526 | * @param _dir The dir to look in |
527 | * @param sorted Should positions be read? | 527 | * @param sorted Should positions be read? |
528 | * @param disabled Remove excluded from the list | 528 | * @param disabled Remove excluded from the list |
529 | */ | 529 | */ |
530 | OPluginItem::List OGenericPluginLoader::plugins( const QString& _dir, bool sorted, bool disabled )const { | 530 | OPluginItem::List OGenericPluginLoader::plugins( const QString& _dir, bool sorted, bool disabled )const { |
531 | #ifdef Q_OS_MACX | 531 | #ifdef Q_OS_MACX |
532 | QDir dir( _dir, "lib*.dylib" ); | 532 | QDir dir( _dir, "lib*.dylib" ); |
533 | #else | 533 | #else |
534 | QDir dir( _dir, "lib*.so" ); | 534 | QDir dir( _dir, "lib*.so" ); |
535 | #endif | 535 | #endif |
536 | 536 | ||
537 | 537 | ||
538 | OPluginItem::List lst; | 538 | OPluginItem::List lst; |
539 | 539 | ||
540 | /* | 540 | /* |
541 | * get excluded list and then iterate over them | 541 | * get excluded list and then iterate over them |
542 | * Excluded list contains the name | 542 | * Excluded list contains the name |
543 | * Position is a list with 'name.pos.name.pos.name.pos' | 543 | * Position is a list with 'name.pos.name.pos.name.pos' |
544 | * | 544 | * |
545 | * For the look up we will create two QMap<QString,pos> | 545 | * For the look up we will create two QMap<QString,pos> |
546 | */ | 546 | */ |
547 | QMap<QString, int> positionMap; | 547 | QMap<QString, int> positionMap; |
548 | QMap<QString, int> excludedMap; | 548 | QMap<QString, int> excludedMap; |
549 | 549 | ||
550 | 550 | ||
551 | OConfig cfg( m_dir+"-odpplugins" ); | 551 | OConfig cfg( m_dir+"-odpplugins" ); |
552 | cfg.setGroup( _dir ); | 552 | cfg.setGroup( _dir ); |
553 | 553 | ||
554 | 554 | ||
555 | QStringList excludes = cfg.readListEntry( "Excluded", ',' ); | 555 | QStringList excludes = cfg.readListEntry( "Excluded", ',' ); |
556 | for ( QStringList::Iterator it = excludes.begin(); it != excludes.end(); ++it ) | 556 | for ( QStringList::Iterator it = excludes.begin(); it != excludes.end(); ++it ) |
557 | excludedMap.insert( *it, -2 ); | 557 | excludedMap.insert( *it, -2 ); |
558 | 558 | ||
559 | if ( sorted ) { | 559 | if ( sorted ) { |
560 | QStringList pos = cfg.readListEntry( "Positions", '.' ); | 560 | QStringList pos = cfg.readListEntry( "Positions", '.' ); |
561 | QStringList::Iterator it = pos.begin(); | 561 | QStringList::Iterator it = pos.begin(); |
562 | QString tmp; int i; | 562 | QString tmp; int i; |
563 | while ( it != pos.end() ) { | 563 | while ( it != pos.end() ) { |
564 | tmp = *it++; i = (*it++).toInt(); | 564 | tmp = *it++; i = (*it++).toInt(); |
565 | positionMap.insert( tmp, i ); | 565 | positionMap.insert( tmp, i ); |
566 | } | 566 | } |
567 | 567 | ||
568 | } | 568 | } |
569 | 569 | ||
570 | 570 | ||
571 | 571 | ||
572 | 572 | ||
573 | QStringList list = dir.entryList(); | 573 | QStringList list = dir.entryList(); |
574 | for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { | 574 | for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { |
575 | QString str = unlibify( *it ); | 575 | QString str = unlibify( *it ); |
576 | OPluginItem item( str, _dir + "/" + *it ); | 576 | OPluginItem item( str, _dir + "/" + *it ); |
577 | 577 | ||
578 | bool ex = excludedMap.contains( str ); | 578 | bool ex = excludedMap.contains( str ); |
579 | /* | 579 | /* |
580 | * if disabled but we should show all mark it as disabled | 580 | * if disabled but we should show all mark it as disabled |
581 | * else continue because we don't want to add the item | 581 | * else continue because we don't want to add the item |
582 | * else if sorted we assign the right position | 582 | * else if sorted we assign the right position |
583 | */ | 583 | */ |
584 | if ( ex && !disabled) | 584 | if ( ex && !disabled) |
585 | item.setEnabled( false ); | 585 | item.setEnabled( false ); |
586 | else if ( ex && disabled ) | 586 | else if ( ex && disabled ) |
587 | continue; | 587 | continue; |
588 | else if ( sorted ) | 588 | else if ( sorted ) |
589 | item.setPosition( positionMap[str] ); | 589 | item.setPosition( positionMap[str] ); |
590 | 590 | ||
591 | 591 | ||
592 | lst.append( item ); | 592 | lst.append( item ); |
593 | } | 593 | } |
594 | 594 | ||
595 | return lst; | 595 | return lst; |
596 | } | 596 | } |
597 | 597 | ||
598 | /** | 598 | /** |
599 | * @internal generate a list of languages from $LANG | 599 | * @internal generate a list of languages from $LANG |
600 | */ | 600 | */ |
601 | QStringList OGenericPluginLoader::languageList() { | 601 | QStringList OGenericPluginLoader::languageList() { |
602 | if ( m_languages.isEmpty() ) { | 602 | if ( m_languages.isEmpty() ) { |
603 | /* | 603 | /* |
604 | * be_BY.CP1251 We will add, be_BY.CP1251,be_BY,be | 604 | * be_BY.CP1251 We will add, be_BY.CP1251,be_BY,be |
605 | * to our list of languages. | 605 | * to our list of languages. |
606 | * Also for de_DE@euro we will add de_DE@eurp, de_DE, de | 606 | * Also for de_DE@euro we will add de_DE@eurp, de_DE, de |
607 | * to our list of languages | 607 | * to our list of languages |
608 | */ | 608 | */ |
609 | QString str = ::getenv( "LANG" ); | 609 | QString str = ::getenv( "LANG" ); |
610 | m_languages += str; | 610 | m_languages += str; |
611 | int pos = str.find( '@' ); | 611 | int pos = str.find( '@' ); |
612 | if( pos > 0 ) | 612 | if( pos > 0 ) |
613 | m_languages += str.left( pos ); | 613 | m_languages += str.left( pos ); |
614 | 614 | ||
615 | 615 | ||
616 | pos = str.find( '.' ); | 616 | pos = str.find( '.' ); |
617 | if ( pos > 0 ) | 617 | if ( pos > 0 ) |
618 | m_languages += str.left( pos ); | 618 | m_languages += str.left( pos ); |
619 | 619 | ||
620 | int n_pos = str.find( '_' ); | 620 | int n_pos = str.find( '_' ); |
621 | if ( n_pos > 0 ) | 621 | if ( n_pos > 0 ) |
622 | m_languages += str.left( n_pos ); | 622 | m_languages += str.left( n_pos ); |
623 | 623 | ||
624 | } | 624 | } |
625 | return m_languages; | 625 | return m_languages; |
626 | } | 626 | } |
627 | 627 | ||
628 | /** | 628 | /** |
629 | * @internal | 629 | * @internal |
630 | * Tries to install languages using the languageList for the type | 630 | * Tries to install languages using the languageList for the type |
631 | */ | 631 | */ |
632 | void OGenericPluginLoader::installTranslators(const QString& type) { | 632 | void OGenericPluginLoader::installTranslators(const QString& type) { |
633 | QStringList lst = languageList(); | 633 | QStringList lst = languageList(); |
634 | 634 | ||
635 | /* | 635 | /* |
636 | * for each language and maybe later for each language dir... | 636 | * for each language and maybe later for each language dir... |
637 | * try to load a Translator | 637 | * try to load a Translator |
638 | */ | 638 | */ |
639 | for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) { | 639 | for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it ) { |
640 | QTranslator* trans = new QTranslator( qApp ); | 640 | QTranslator* trans = new QTranslator( qApp ); |
641 | QString tfn = QPEApplication::qpeDir()+"/i18n/" + *it + "/lib" + type + ".qm" ; | 641 | QString tfn = QPEApplication::qpeDir()+"/i18n/" + *it + "/lib" + type + ".qm" ; |
642 | 642 | ||
643 | /* | 643 | /* |
644 | * If loaded then install else clean up and don't leak | 644 | * If loaded then install else clean up and don't leak |
645 | */ | 645 | */ |
646 | if ( trans->load( tfn ) ) | 646 | if ( trans->load( tfn ) ) |
647 | qApp->installTranslator( trans ); | 647 | qApp->installTranslator( trans ); |
648 | else | 648 | else |
649 | delete trans; | 649 | delete trans; |
650 | } | 650 | } |
651 | } | 651 | } |
652 | 652 | ||
653 | /** | 653 | /** |
654 | * \brief Simple c'tor. | 654 | * \brief Simple c'tor. |
655 | * | 655 | * |
656 | * Simple C'tor same as the one of the base class. Additional this | 656 | * Simple C'tor same as the one of the base class. Additional this |
657 | * class can cast for you if you nee it. | 657 | * class can cast for you if you nee it. |
658 | * | 658 | * |
659 | * | 659 | * |
660 | * @param name The name of your plugin class | 660 | * @param name The name of your plugin class |
661 | * @param sorted If plugins are sorted | 661 | * @param sorted If plugins are sorted |
662 | * | 662 | * |
663 | * @see OGenericPluginLoader | 663 | * @see OGenericPluginLoader |
664 | */ | 664 | */ |
665 | OPluginLoader::OPluginLoader( const QString& name, bool sorted ) | 665 | OPluginLoader::OPluginLoader( const QString& name, bool sorted ) |
666 | : OGenericPluginLoader( name, sorted ) | 666 | : OGenericPluginLoader( name, sorted ) |
667 | { | 667 | { |
668 | } | 668 | } |
669 | 669 | ||
670 | /** | 670 | /** |
671 | * d'tor | 671 | * d'tor |
672 | * @see OGenericPluginLoader::~OGenericPluginLoader | 672 | * @see OGenericPluginLoader::~OGenericPluginLoader |
673 | */ | 673 | */ |
674 | OPluginLoader::~OPluginLoader() { | 674 | OPluginLoader::~OPluginLoader() { |
675 | } | 675 | } |
676 | 676 | ||
677 | /** | 677 | /** |
678 | * \brief C'Tor using a OGenericPluginLoader | 678 | * \brief C'Tor using a OGenericPluginLoader |
679 | * The C'tor. Pass your OGenericPluginLoader to manage | 679 | * The C'tor. Pass your OGenericPluginLoader to manage |
680 | * OGenericPluginLoader::allAvailable plugins. | 680 | * OGenericPluginLoader::allAvailable plugins. |
681 | * | 681 | * |
682 | * | 682 | * |
683 | * @param loader A Pointer to your OGenericPluginLoader | 683 | * @param loader A Pointer to your OGenericPluginLoader |
684 | * @param name The name | ||
685 | */ | 684 | */ |
686 | OPluginManager::OPluginManager( OGenericPluginLoader* loader) | 685 | OPluginManager::OPluginManager( OGenericPluginLoader* loader) |
687 | : m_loader( loader ), m_isSorted( false ) | 686 | : m_loader( loader ), m_isSorted( false ) |
688 | { | 687 | { |
689 | } | 688 | } |
690 | 689 | ||
691 | /** | 690 | /** |
692 | * \brief Overloaded c'tor using a List of Plugins and a type name | 691 | * \brief Overloaded c'tor using a List of Plugins and a type name |
693 | * Overloaded Constructor to work with a 'Type' of plugins | 692 | * Overloaded Constructor to work with a 'Type' of plugins |
694 | * and a correspending list of those. In this case calling load | 693 | * and a correspending list of those. In this case calling load |
695 | * is a no operation. | 694 | * is a no operation. |
696 | * | 695 | * |
697 | * @param name The name of your plugin ('today','inputmethods','applets') | 696 | * @param name The name of your plugin ('today','inputmethods','applets') |
698 | * @param lst A List with plugins of your type to manage | 697 | * @param lst A List with plugins of your type to manage |
699 | * @param isSorted If the List should be treated sorted | 698 | * @param isSorted If the List should be treated sorted |
700 | */ | 699 | */ |
701 | OPluginManager::OPluginManager( const QString& name, const OPluginItem::List& lst, bool isSorted) | 700 | OPluginManager::OPluginManager( const QString& name, const OPluginItem::List& lst, bool isSorted) |
702 | : m_loader( 0l ), m_cfgName( name ), m_plugins( lst ), m_isSorted( isSorted ) | 701 | : m_loader( 0l ), m_cfgName( name ), m_plugins( lst ), m_isSorted( isSorted ) |
703 | { | 702 | { |
704 | } | 703 | } |
705 | 704 | ||
706 | /** | 705 | /** |
707 | * \brief A simple d'tor | 706 | * \brief A simple d'tor |
708 | */ | 707 | */ |
709 | OPluginManager::~OPluginManager() { | 708 | OPluginManager::~OPluginManager() { |
710 | } | 709 | } |
711 | 710 | ||
712 | /** | 711 | /** |
713 | * \brief Return the OPluginItem where loading is likely to have crashed on. | 712 | * \brief Return the OPluginItem where loading is likely to have crashed on. |
714 | 713 | ||
715 | * Return the Item that made the OGenericPluginLoader crash | 714 | * Return the Item that made the OGenericPluginLoader crash |
716 | * the returned OPluginItem could be empty if no crash occured | 715 | * the returned OPluginItem could be empty if no crash occured |
717 | * which should apply most of the time. It could also be empty if the crashed | 716 | * which should apply most of the time. It could also be empty if the crashed |
718 | * plugin is not in the current list of available/managed plugins | 717 | * plugin is not in the current list of available/managed plugins |
719 | * | 718 | * |
720 | * @see OPluginItem::isEmpty | 719 | * @see OPluginItem::isEmpty |
721 | * @return OPluginItem that crashed the loader | 720 | * @return OPluginItem that crashed the loader |
722 | */ | 721 | */ |
723 | OPluginItem OPluginManager::crashedPlugin()const { | 722 | OPluginItem OPluginManager::crashedPlugin()const { |
724 | return m_crashed; | 723 | return m_crashed; |
725 | } | 724 | } |
726 | 725 | ||
727 | /** | 726 | /** |
728 | * \brief Return a list of plugins that are managed by this OPluginManager | 727 | * \brief Return a list of plugins that are managed by this OPluginManager |
729 | * | 728 | * |
730 | * Return the list of managed plugins. This could either result | 729 | * Return the list of managed plugins. This could either result |
731 | * from passing a OGenericPluginLoader and calling load or by | 730 | * from passing a OGenericPluginLoader and calling load or by |
732 | * giving name and a list of plugins. | 731 | * giving name and a list of plugins. |
733 | */ | 732 | */ |
734 | OPluginItem::List OPluginManager::managedPlugins()const { | 733 | OPluginItem::List OPluginManager::managedPlugins()const { |
735 | return m_plugins; | 734 | return m_plugins; |
736 | } | 735 | } |
737 | 736 | ||
738 | /** | 737 | /** |
739 | * \brief Set the position of the items | 738 | * \brief Set the position of the items |
740 | * | 739 | * |
741 | * Replace the OPluginItem with the name and path and this way | 740 | * Replace the OPluginItem with the name and path and this way |
742 | * apply the new position. The search is linear and this way O(n/2) | 741 | * apply the new position. The search is linear and this way O(n/2) |
743 | * You still need to call save() to make your changes effective. After saving | 742 | * You still need to call save() to make your changes effective. After saving |
744 | * a call to OGenericPluginLoader::filtered() returns the newly configured order and items | 743 | * a call to OGenericPluginLoader::filtered() returns the newly configured order and items |
745 | * | 744 | * |
746 | * @param item The OPluginItem to be replaced internall | 745 | * @param item The OPluginItem to be replaced internall |
747 | * | 746 | * |
748 | */ | 747 | */ |
749 | void OPluginManager::setPosition( const OPluginItem& item) { | 748 | void OPluginManager::setPosition( const OPluginItem& item) { |
750 | replace( item ); | 749 | replace( item ); |
751 | } | 750 | } |
752 | 751 | ||
753 | /** | 752 | /** |
754 | * \brief Enable the item specified as argument | 753 | * \brief Enable the item specified as argument |
755 | * | 754 | * |
756 | * This will make sure that OPluginItem::setEnabled is called and then will replace | 755 | * This will make sure that OPluginItem::setEnabled is called and then will replace |
757 | * the item with one that matches name and path internally. | 756 | * the item with one that matches name and path internally. |
758 | * @see setPosition | 757 | * @see setPosition |
759 | * | 758 | * |
760 | * @param the Item to enable | 759 | * @param item the Item to enable |
761 | */ | 760 | */ |
762 | void OPluginManager::enable( const OPluginItem& item ) { | 761 | void OPluginManager::enable( const OPluginItem& item ) { |
763 | setEnabled( item, true ); | 762 | setEnabled( item, true ); |
764 | } | 763 | } |
765 | 764 | ||
766 | /** | 765 | /** |
767 | * \brief disable the Item. | 766 | * \brief disable the Item. |
768 | * | 767 | * |
769 | * Disable the OPluginItem. Same applies as in | 768 | * Disable the OPluginItem. Same applies as in |
770 | * @see setPosition and @see enable | 769 | * @see setPosition and @see enable |
771 | * | 770 | * |
772 | * @param item Item to disable | 771 | * @param item Item to disable |
773 | */ | 772 | */ |
774 | void OPluginManager::disable( const OPluginItem& item) { | 773 | void OPluginManager::disable( const OPluginItem& item) { |
775 | setEnabled( item, false ); | 774 | setEnabled( item, false ); |
776 | } | 775 | } |
777 | 776 | ||
778 | /** | 777 | /** |
779 | * \brief Enable or disable the OPluginItem. | 778 | * \brief Enable or disable the OPluginItem. |
780 | * Depending on the value of the parameter this will either disable | 779 | * Depending on the value of the parameter this will either disable |
781 | * or enable the pluginitem. | 780 | * or enable the pluginitem. |
782 | * Beside that same as in @see disable, @see enable, @see setPosition | 781 | * Beside that same as in @see disable, @see enable, @see setPosition |
783 | * applies. | 782 | * applies. |
784 | * | 783 | * |
785 | * @param _item The OPluginItem to enable or to disable. | 784 | * @param _item The OPluginItem to enable or to disable. |
786 | * @param b Enable or disable the plugin. | 785 | * @param b Enable or disable the plugin. |
787 | * | 786 | * |
788 | */ | 787 | */ |
789 | void OPluginManager::setEnabled( const OPluginItem& _item, bool b ) { | 788 | void OPluginManager::setEnabled( const OPluginItem& _item, bool b ) { |
790 | OPluginItem item = _item; | 789 | OPluginItem item = _item; |
791 | item.setEnabled( b ); | 790 | item.setEnabled( b ); |
792 | replace( item ); | 791 | replace( item ); |
793 | } | 792 | } |
794 | 793 | ||
795 | /** | 794 | /** |
796 | * \brief Load necessary information after constructing the object | 795 | * \brief Load necessary information after constructing the object |
797 | * If you speified a OGenericPluginLoader you need to call this method | 796 | * If you speified a OGenericPluginLoader you need to call this method |
798 | * so that this manager knows what to manage and have a right value for \sa crashedPlugin | 797 | * so that this manager knows what to manage and have a right value for \sa crashedPlugin |
799 | * For the name and the list of plugins this does only try to find out the crashed plugin | 798 | * For the name and the list of plugins this does only try to find out the crashed plugin |
800 | */ | 799 | */ |
801 | void OPluginManager::load() { | 800 | void OPluginManager::load() { |
802 | OConfig cfg( configName() ); | 801 | OConfig cfg( configName() ); |
803 | cfg.setGroup( "General" ); | 802 | cfg.setGroup( "General" ); |
804 | QString crashedPath = cfg.readEntry( "CrashedPlugin" ); | 803 | QString crashedPath = cfg.readEntry( "CrashedPlugin" ); |
805 | 804 | ||
806 | /* if we've a loader this applies if we were called from the first part */ | 805 | /* if we've a loader this applies if we were called from the first part */ |
807 | if ( m_loader ) | 806 | if ( m_loader ) |
808 | m_plugins = m_loader->allAvailable( m_loader->isSorted() ); | 807 | m_plugins = m_loader->allAvailable( m_loader->isSorted() ); |
809 | 808 | ||
810 | /* fast and normal route if we did not crash... */ | 809 | /* fast and normal route if we did not crash... */ |
811 | if ( crashedPath.isEmpty() ) | 810 | if ( crashedPath.isEmpty() ) |
812 | return; | 811 | return; |
813 | 812 | ||
814 | /* lets try to find the plugin path and this way the associated item */ | 813 | /* lets try to find the plugin path and this way the associated item */ |
815 | for ( OPluginItem::List::Iterator it = m_plugins.begin(); it != m_plugins.end(); ++it ) | 814 | for ( OPluginItem::List::Iterator it = m_plugins.begin(); it != m_plugins.end(); ++it ) |
816 | if ( (*it).path() == crashedPath ) { | 815 | if ( (*it).path() == crashedPath ) { |
817 | m_crashed = *it; | 816 | m_crashed = *it; |
818 | break; | 817 | break; |
819 | } | 818 | } |
820 | } | 819 | } |
821 | 820 | ||
822 | 821 | ||
823 | /** | 822 | /** |
824 | * \brief Save the values and this way make it available. | 823 | * \brief Save the values and this way make it available. |
825 | * | 824 | * |
826 | * Save the current set of data. A call to @see OGenericPluginLoader::filtered | 825 | * Save the current set of data. A call to @see OGenericPluginLoader::filtered |
827 | * now would return your saved changes. | 826 | * now would return your saved changes. |
828 | */ | 827 | */ |
829 | void OPluginManager::save() { | 828 | void OPluginManager::save() { |
830 | QMap<QString, QStringList> excluded; // map for path to excluded name | 829 | QMap<QString, QStringList> excluded; // map for path to excluded name |
831 | QMap<QString, QStringList> positions; // if positions matter contains splitted up by dirs | 830 | QMap<QString, QStringList> positions; // if positions matter contains splitted up by dirs |
832 | bool sorted = m_loader ? m_loader->isSorted() : m_isSorted; | 831 | bool sorted = m_loader ? m_loader->isSorted() : m_isSorted; |
833 | 832 | ||
834 | /* | 833 | /* |
835 | * We will create some maps for the groups to include positions a | 834 | * We will create some maps for the groups to include positions a |
836 | */ | 835 | */ |
837 | for ( OPluginItem::List::Iterator it = m_plugins.begin(); it != m_plugins.end(); ++it ) { | 836 | for ( OPluginItem::List::Iterator it = m_plugins.begin(); it != m_plugins.end(); ++it ) { |
838 | OPluginItem item = *it; | 837 | OPluginItem item = *it; |
839 | QString path = QFileInfo( item.path() ).dirPath(true); | 838 | QString path = QFileInfo( item.path() ).dirPath(true); |
840 | if ( sorted ) { | 839 | if ( sorted ) { |
841 | positions[path].append( item.name() ); | 840 | positions[path].append( item.name() ); |
842 | positions[path].append( QString::number( item.position() ) ); | 841 | positions[path].append( QString::number( item.position() ) ); |
843 | } | 842 | } |
844 | 843 | ||
845 | if ( !item.isEnabled() ) | 844 | if ( !item.isEnabled() ) |
846 | excluded[path].append( item.name() ); | 845 | excluded[path].append( item.name() ); |
847 | if ( !excluded.contains( path ) ) | 846 | if ( !excluded.contains( path ) ) |
848 | excluded[path] = QString::null; | 847 | excluded[path] = QString::null; |
849 | 848 | ||
850 | } | 849 | } |
851 | 850 | ||
852 | /* | 851 | /* |
853 | * The code below wouldn't work because we can't delete groups/keys from the config | 852 | * The code below wouldn't work because we can't delete groups/keys from the config |
854 | * ### for ODP make Config right! | 853 | * ### for ODP make Config right! |
855 | */ | 854 | */ |
856 | // if ( excluded.isEmpty() && positions.isEmpty() ) return; | 855 | // if ( excluded.isEmpty() && positions.isEmpty() ) return; |
857 | /* | 856 | /* |
858 | * Now safe for each path | 857 | * Now safe for each path |
859 | */ | 858 | */ |
860 | OConfig cfg( configName() ); | 859 | OConfig cfg( configName() ); |
861 | 860 | ||
862 | /* safe excluded items */ | 861 | /* safe excluded items */ |
863 | for ( QMap<QString, QStringList>::Iterator it = excluded.begin(); it != excluded.end(); ++it ) { | 862 | for ( QMap<QString, QStringList>::Iterator it = excluded.begin(); it != excluded.end(); ++it ) { |
864 | OConfigGroupSaver saver( &cfg, it.key() ); | 863 | OConfigGroupSaver saver( &cfg, it.key() ); |
865 | cfg.writeEntry("Excluded", it.data(), ',' ); | 864 | cfg.writeEntry("Excluded", it.data(), ',' ); |
866 | } | 865 | } |
867 | 866 | ||
868 | /* safe positions we could also see if positions.contains(path) and remove/write in the above loop | 867 | /* safe positions we could also see if positions.contains(path) and remove/write in the above loop |
869 | * ### Write a Test Suite that can profile these runs... | 868 | * ### Write a Test Suite that can profile these runs... |
870 | */ | 869 | */ |
871 | for ( QMap<QString, QStringList>::Iterator it = positions.begin(); it != positions.end(); ++it ) { | 870 | for ( QMap<QString, QStringList>::Iterator it = positions.begin(); it != positions.end(); ++it ) { |
872 | OConfigGroupSaver saver( &cfg, it.key() ); | 871 | OConfigGroupSaver saver( &cfg, it.key() ); |
873 | cfg.writeEntry("Positions", it.data(), '.' ); | 872 | cfg.writeEntry("Positions", it.data(), '.' ); |
874 | } | 873 | } |
875 | } | 874 | } |
876 | 875 | ||
877 | /** | 876 | /** |
878 | * @internal | 877 | * @internal |
879 | */ | 878 | */ |
880 | QString OPluginManager::configName()const { | 879 | QString OPluginManager::configName()const { |
881 | QString str = m_loader ? m_loader->name() : m_cfgName; | 880 | QString str = m_loader ? m_loader->name() : m_cfgName; |
882 | return str + "-odpplugins"; | 881 | return str + "-odpplugins"; |
883 | } | 882 | } |
884 | 883 | ||
885 | /** | 884 | /** |
886 | * @internal.. replace in m_plugins by path... this is linear search O(n/2) | 885 | * @internal.. replace in m_plugins by path... this is linear search O(n/2) |
887 | */ | 886 | */ |
888 | void OPluginManager::replace( const OPluginItem& item ) { | 887 | void OPluginManager::replace( const OPluginItem& item ) { |
889 | OPluginItem _item; | 888 | OPluginItem _item; |
890 | 889 | ||
891 | /* for all plugins */ | 890 | /* for all plugins */ |
892 | for ( OPluginItem::List::Iterator it=m_plugins.begin();it != m_plugins.end(); ++it ) { | 891 | for ( OPluginItem::List::Iterator it=m_plugins.begin();it != m_plugins.end(); ++it ) { |
893 | _item = *it; | 892 | _item = *it; |
894 | /* if path and name are the same we will remove, readd and return */ | 893 | /* if path and name are the same we will remove, readd and return */ |
895 | if ( _item.path() == item.path() && | 894 | if ( _item.path() == item.path() && |
896 | _item.name() == item.name() ) { | 895 | _item.name() == item.name() ) { |
897 | it = m_plugins.remove( it ); | 896 | it = m_plugins.remove( it ); |
898 | m_plugins.append( item ); | 897 | m_plugins.append( item ); |
899 | return; | 898 | return; |
900 | } | 899 | } |
901 | 900 | ||
902 | } | 901 | } |
903 | } | 902 | } |
904 | 903 | ||
905 | } | 904 | } |
906 | } | 905 | } |
diff --git a/libopie2/opiecore/oprocess.h b/libopie2/opiecore/oprocess.h index be1436c..ac6be98 100644 --- a/libopie2/opiecore/oprocess.h +++ b/libopie2/opiecore/oprocess.h | |||
@@ -1,761 +1,763 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2003-2004 Holger Freyther <zecke@handhelds.org> | 3 | Copyright (C) 2003-2004 Holger Freyther <zecke@handhelds.org> |
4 | Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at) | 5 | =. Based on KProcess (C) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at) |
6 | .=l. | 6 | .=l. |
7 | .>+-= | 7 | .>+-= |
8 | _;:, .> :=|. This program is free software; you can | 8 | _;:, .> :=|. This program is free software; you can |
9 | .> <`_, > . <= redistribute it and/or modify it under | 9 | .> <`_, > . <= redistribute it and/or modify it under |
10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 10 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
11 | .="- .-=="i, .._ License as published by the Free Software | 11 | .="- .-=="i, .._ License as published by the Free Software |
12 | - . .-<_> .<> Foundation; either version 2 of the License, | 12 | - . .-<_> .<> Foundation; either version 2 of the License, |
13 | ._= =} : or (at your option) any later version. | 13 | ._= =} : or (at your option) any later version. |
14 | .%`+i> _;_. | 14 | .%`+i> _;_. |
15 | .i_,=:_. -<s. This program is distributed in the hope that | 15 | .i_,=:_. -<s. This program is distributed in the hope that |
16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 16 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
17 | : .. .:, . . . without even the implied warranty of | 17 | : .. .:, . . . without even the implied warranty of |
18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 18 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 19 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
20 | ..}^=.= = ; Library General Public License for more | 20 | ..}^=.= = ; Library General Public License for more |
21 | ++= -. .` .: details. | 21 | ++= -. .` .: details. |
22 | : = ...= . :.=- | 22 | : = ...= . :.=- |
23 | -. .:....=;==+<; You should have received a copy of the GNU | 23 | -. .:....=;==+<; You should have received a copy of the GNU |
24 | -_. . . )=. = Library General Public License along with | 24 | -_. . . )=. = Library General Public License along with |
25 | -- :-=` this library; see the file COPYING.LIB. | 25 | -- :-=` this library; see the file COPYING.LIB. |
26 | If not, write to the Free Software Foundation, | 26 | If not, write to the Free Software Foundation, |
27 | Inc., 59 Temple Place - Suite 330, | 27 | Inc., 59 Temple Place - Suite 330, |
28 | Boston, MA 02111-1307, USA. | 28 | Boston, MA 02111-1307, USA. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #ifndef OPROCESS_H | 31 | #ifndef OPROCESS_H |
32 | #define OPROCESS_H | 32 | #define OPROCESS_H |
33 | 33 | ||
34 | /* QT */ | 34 | /* QT */ |
35 | #include <qcstring.h> | 35 | #include <qcstring.h> |
36 | #include <qobject.h> | 36 | #include <qobject.h> |
37 | #include <qvaluelist.h> | 37 | #include <qvaluelist.h> |
38 | 38 | ||
39 | /* STD */ | 39 | /* STD */ |
40 | #include <sys/types.h> // for pid_t | 40 | #include <sys/types.h> // for pid_t |
41 | #include <sys/wait.h> | 41 | #include <sys/wait.h> |
42 | #include <signal.h> | 42 | #include <signal.h> |
43 | #include <unistd.h> | 43 | #include <unistd.h> |
44 | 44 | ||
45 | class QSocketNotifier; | 45 | class QSocketNotifier; |
46 | 46 | ||
47 | namespace Opie { | 47 | namespace Opie { |
48 | namespace Core { | 48 | namespace Core { |
49 | namespace Internal { | 49 | namespace Internal { |
50 | class OProcessController; | 50 | class OProcessController; |
51 | class OProcessPrivate; | 51 | class OProcessPrivate; |
52 | } | 52 | } |
53 | 53 | ||
54 | /** | 54 | /** |
55 | * Child process invocation, monitoring and control. | 55 | * Child process invocation, monitoring and control. |
56 | * | 56 | * |
57 | * @sect General usage and features | 57 | * @par General usage and features |
58 | * | 58 | * |
59 | *This class allows a KDE and OPIE application to start child processes without having | 59 | *This class allows a KDE and OPIE application to start child processes without having |
60 | *to worry about UN*X signal handling issues and zombie process reaping. | 60 | *to worry about UN*X signal handling issues and zombie process reaping. |
61 | * | 61 | * |
62 | *@see KProcIO | 62 | *@see KProcIO |
63 | * | 63 | * |
64 | *Basically, this class distinguishes three different ways of running | 64 | *Basically, this class distinguishes three different ways of running |
65 | *child processes: | 65 | *child processes: |
66 | * | 66 | * |
67 | *@li OProcess::DontCare -- The child process is invoked and both the child | 67 | *@li OProcess::DontCare -- The child process is invoked and both the child |
68 | *process and the parent process continue concurrently. | 68 | *process and the parent process continue concurrently. |
69 | * | 69 | * |
70 | *Starting a DontCare child process means that the application is | 70 | *Starting a DontCare child process means that the application is |
71 | *not interested in any notification to determine whether the | 71 | *not interested in any notification to determine whether the |
72 | *child process has already exited or not. | 72 | *child process has already exited or not. |
73 | * | 73 | * |
74 | *@li OProcess::NotifyOnExit -- The child process is invoked and both the | 74 | *@li OProcess::NotifyOnExit -- The child process is invoked and both the |
75 | *child and the parent process run concurrently. | 75 | *child and the parent process run concurrently. |
76 | * | 76 | * |
77 | *When the child process exits, the OProcess instance | 77 | *When the child process exits, the OProcess instance |
78 | *corresponding to it emits the Qt signal @ref processExited(). | 78 | *corresponding to it emits the Qt signal @ref processExited(). |
79 | * | 79 | * |
80 | *Since this signal is @em not emitted from within a UN*X | 80 | *Since this signal is @em not emitted from within a UN*X |
81 | *signal handler, arbitrary function calls can be made. | 81 | *signal handler, arbitrary function calls can be made. |
82 | * | 82 | * |
83 | *Be aware: When the OProcess objects gets destructed, the child | 83 | *Be aware: When the OProcess objects gets destructed, the child |
84 | *process will be killed if it is still running! | 84 | *process will be killed if it is still running! |
85 | *This means in particular, that you cannot use a OProcess on the stack | 85 | *This means in particular, that you cannot use a OProcess on the stack |
86 | *with OProcess::NotifyOnExit. | 86 | *with OProcess::NotifyOnExit. |
87 | * | 87 | * |
88 | *@li OProcess::Block -- The child process starts and the parent process | 88 | *@li OProcess::Block -- The child process starts and the parent process |
89 | *is suspended until the child process exits. (@em Really not recommended | 89 | *is suspended until the child process exits. (@em Really not recommended |
90 | *for programs with a GUI.) | 90 | *for programs with a GUI.) |
91 | * | 91 | * |
92 | *OProcess also provides several functions for determining the exit status | 92 | *OProcess also provides several functions for determining the exit status |
93 | *and the pid of the child process it represents. | 93 | *and the pid of the child process it represents. |
94 | * | 94 | * |
95 | *Furthermore it is possible to supply command-line arguments to the process | 95 | *Furthermore it is possible to supply command-line arguments to the process |
96 | *in a clean fashion (no null -- terminated stringlists and such...) | 96 | *in a clean fashion (no null -- terminated stringlists and such...) |
97 | * | 97 | * |
98 | *A small usage example: | 98 | *A small usage example: |
99 | *<pre> | 99 | *<pre> |
100 | *OProcess *proc = new OProcess; | 100 | *OProcess *proc = new OProcess; |
101 | * | 101 | * |
102 | **proc << "my_executable"; | 102 | **proc << "my_executable"; |
103 | **proc << "These" << "are" << "the" << "command" << "line" << "args"; | 103 | **proc << "These" << "are" << "the" << "command" << "line" << "args"; |
104 | *QApplication::connect(proc, SIGNAL(processExited(Opie::Core::OProcess *)), | 104 | *QApplication::connect(proc, SIGNAL(processExited(Opie::Core::OProcess *)), |
105 | * pointer_to_my_object, SLOT(my_objects_slot(Opie::Core::OProcess *))); | 105 | * pointer_to_my_object, SLOT(my_objects_slot(Opie::Core::OProcess *))); |
106 | *proc->start(); | 106 | *proc->start(); |
107 | *</pre> | 107 | *</pre> |
108 | * | 108 | * |
109 | *This will start "my_executable" with the commandline arguments "These"... | 109 | *This will start "my_executable" with the commandline arguments "These"... |
110 | * | 110 | * |
111 | *When the child process exits, the respective Qt signal will be emitted. | 111 | *When the child process exits, the respective Qt signal will be emitted. |
112 | * | 112 | * |
113 | *@sect Communication with the child process | 113 | *@par Communication with the child process |
114 | * | 114 | * |
115 | *OProcess supports communication with the child process through | 115 | *OProcess supports communication with the child process through |
116 | *stdin/stdout/stderr. | 116 | *stdin/stdout/stderr. |
117 | * | 117 | * |
118 | *The following functions are provided for getting data from the child | 118 | *The following functions are provided for getting data from the child |
119 | *process or sending data to the child's stdin (For more information, | 119 | *process or sending data to the child's stdin (For more information, |
120 | *have a look at the documentation of each function): | 120 | *have a look at the documentation of each function): |
121 | * | 121 | * |
122 | *@li bool @ref writeStdin(char *buffer, int buflen); | 122 | *@li bool @ref writeStdin(char *buffer, int buflen); |
123 | *@li -- Transmit data to the child process's stdin. | 123 | *@li -- Transmit data to the child process's stdin. |
124 | * | 124 | * |
125 | *@li bool @ref closeStdin(); | 125 | *@li bool @ref closeStdin(); |
126 | *@li -- Closes the child process's stdin (which causes it to see an feof(stdin)). | 126 | *@li -- Closes the child process's stdin (which causes it to see an feof(stdin)). |
127 | *Returns false if you try to close stdin for a process that has been started | 127 | *Returns false if you try to close stdin for a process that has been started |
128 | *without a communication channel to stdin. | 128 | *without a communication channel to stdin. |
129 | * | 129 | * |
130 | *@li bool @ref closeStdout(); | 130 | *@li bool @ref closeStdout(); |
131 | *@li -- Closes the child process's stdout. | 131 | *@li -- Closes the child process's stdout. |
132 | *Returns false if you try to close stdout for a process that has been started | 132 | *Returns false if you try to close stdout for a process that has been started |
133 | *without a communication channel to stdout. | 133 | *without a communication channel to stdout. |
134 | * | 134 | * |
135 | *@li bool @ref closeStderr(); | 135 | *@li bool @ref closeStderr(); |
136 | *@li -- Closes the child process's stderr. | 136 | *@li -- Closes the child process's stderr. |
137 | *Returns false if you try to close stderr for a process that has been started | 137 | *Returns false if you try to close stderr for a process that has been started |
138 | *without a communication channel to stderr. | 138 | *without a communication channel to stderr. |
139 | * | 139 | * |
140 | * | 140 | * |
141 | *@sect QT signals: | 141 | *@par QT signals: |
142 | * | 142 | * |
143 | *@li void @ref receivedStdout(OProcess *proc, char *buffer, int buflen); | 143 | *@li void @ref receivedStdout(OProcess *proc, char *buffer, int buflen); |
144 | *@li void @ref receivedStderr(OProcess *proc, char *buffer, int buflen); | 144 | *@li void @ref receivedStderr(OProcess *proc, char *buffer, int buflen); |
145 | *@li -- Indicates that new data has arrived from either the | 145 | *@li -- Indicates that new data has arrived from either the |
146 | *child process's stdout or stderr. | 146 | *child process's stdout or stderr. |
147 | * | 147 | * |
148 | *@li void @ref wroteStdin(OProcess *proc); | 148 | *@li void @ref wroteStdin(OProcess *proc); |
149 | *@li -- Indicates that all data that has been sent to the child process | 149 | *@li -- Indicates that all data that has been sent to the child process |
150 | *by a prior call to @ref writeStdin() has actually been transmitted to the | 150 | *by a prior call to @ref writeStdin() has actually been transmitted to the |
151 | *client . | 151 | *client . |
152 | * | 152 | * |
153 | *@author Christian Czezakte e9025461@student.tuwien.ac.at | 153 | *@author Christian Czezakte e9025461@student.tuwien.ac.at |
154 | *@author Holger Freyther (Opie Port) | 154 | *@author Holger Freyther (Opie Port) |
155 | * | 155 | * |
156 | **/ | 156 | **/ |
157 | class OProcess : public QObject | 157 | class OProcess : public QObject |
158 | { | 158 | { |
159 | Q_OBJECT | 159 | Q_OBJECT |
160 | 160 | ||
161 | public: | 161 | public: |
162 | 162 | ||
163 | /** | 163 | /** |
164 | * Modes in which the communication channel can be opened. | 164 | * Modes in which the communication channel can be opened. |
165 | * | 165 | * |
166 | * If communication for more than one channel is required, | 166 | * If communication for more than one channel is required, |
167 | * the values have to be or'ed together, for example to get | 167 | * the values have to be or'ed together, for example to get |
168 | * communication with stdout as well as with stdin, you would | 168 | * communication with stdout as well as with stdin, you would |
169 | * specify @p Stdin @p | @p Stdout | 169 | * specify @p Stdin @p | @p Stdout |
170 | * | 170 | * |
171 | * If @p NoRead is specified in conjunction with @p Stdout, | 171 | * If @p NoRead is specified in conjunction with @p Stdout, |
172 | * no data is actually read from @p Stdout but only | 172 | * no data is actually read from @p Stdout but only |
173 | * the signal @ref childOutput(int fd) is emitted. | 173 | * the signal @ref childOutput(int fd) is emitted. |
174 | */ | 174 | */ |
175 | enum Communication { NoCommunication = 0, Stdin = 1, Stdout = 2, Stderr = 4, | 175 | enum Communication { NoCommunication = 0, Stdin = 1, Stdout = 2, Stderr = 4, |
176 | AllOutput = 6, All = 7, | 176 | AllOutput = 6, All = 7, |
177 | NoRead }; | 177 | NoRead }; |
178 | 178 | ||
179 | /** | 179 | /** |
180 | * Run-modes for a child process. | 180 | * Run-modes for a child process. |
181 | */ | 181 | */ |
182 | enum RunMode { | 182 | enum RunMode { |
183 | /** | 183 | /** |
184 | * The application does not receive notifications from the subprocess when | 184 | * The application does not receive notifications from the subprocess when |
185 | * it is finished or aborted. | 185 | * it is finished or aborted. |
186 | */ | 186 | */ |
187 | DontCare, | 187 | DontCare, |
188 | /** | 188 | /** |
189 | * The application is notified when the subprocess dies. | 189 | * The application is notified when the subprocess dies. |
190 | */ | 190 | */ |
191 | NotifyOnExit, | 191 | NotifyOnExit, |
192 | /** | 192 | /** |
193 | * The application is suspended until the started process is finished. | 193 | * The application is suspended until the started process is finished. |
194 | */ | 194 | */ |
195 | Block }; | 195 | Block }; |
196 | 196 | ||
197 | /** | 197 | /** |
198 | * Constructor | 198 | * Constructor |
199 | */ | 199 | */ |
200 | OProcess( QObject *parent = 0, const char *name = 0 ); | 200 | OProcess( QObject *parent = 0, const char *name = 0 ); |
201 | /** | 201 | /** |
202 | * Constructor | 202 | * Constructor |
203 | */ | 203 | */ |
204 | OProcess( const QString &arg0, QObject *parent = 0, const char *name = 0 ); | 204 | OProcess( const QString &arg0, QObject *parent = 0, const char *name = 0 ); |
205 | /** | 205 | /** |
206 | * Constructor | 206 | * Constructor |
207 | */ | 207 | */ |
208 | OProcess( const QStringList &args, QObject *parent = 0, const char *name = 0 ); | 208 | OProcess( const QStringList &args, QObject *parent = 0, const char *name = 0 ); |
209 | 209 | ||
210 | /** | 210 | /** |
211 | *Destructor: | 211 | *Destructor: |
212 | * | 212 | * |
213 | * If the process is running when the destructor for this class | 213 | * If the process is running when the destructor for this class |
214 | * is called, the child process is killed with a SIGKILL, but | 214 | * is called, the child process is killed with a SIGKILL, but |
215 | * only if the run mode is not of type @p DontCare. | 215 | * only if the run mode is not of type @p DontCare. |
216 | * Processes started as @p DontCare keep running anyway. | 216 | * Processes started as @p DontCare keep running anyway. |
217 | */ | 217 | */ |
218 | virtual ~OProcess(); | 218 | virtual ~OProcess(); |
219 | 219 | ||
220 | /** | 220 | /** |
221 | @deprecated | 221 | @deprecated |
222 | 222 | ||
223 | The use of this function is now deprecated. -- Please use the | 223 | The use of this function is now deprecated. -- Please use the |
224 | "operator<<" instead of "setExecutable". | 224 | "operator<<" instead of "setExecutable". |
225 | 225 | ||
226 | Sets the executable to be started with this OProcess object. | 226 | Sets the executable to be started with this OProcess object. |
227 | Returns false if the process is currently running (in that | 227 | Returns false if the process is currently running (in that |
228 | case the executable remains unchanged.) | 228 | case the executable remains unchanged.) |
229 | 229 | ||
230 | @see operator<< | 230 | @see operator<< |
231 | 231 | ||
232 | */ | 232 | */ |
233 | bool setExecutable( const QString& proc ); | 233 | bool setExecutable( const QString& proc ); |
234 | 234 | ||
235 | 235 | ||
236 | /** | 236 | /** |
237 | * Sets the executable and the command line argument list for this process. | 237 | * Sets the executable and the command line argument list for this process. |
238 | * | 238 | * |
239 | * For example, doing an "ls -l /usr/local/bin" can be achieved by: | 239 | * For example, doing an "ls -l /usr/local/bin" can be achieved by: |
240 | * <pre> | 240 | * <pre> |
241 | * OProcess p; | 241 | * OProcess p; |
242 | * ... | 242 | * ... |
243 | * p << "ls" << "-l" << "/usr/local/bin" | 243 | * p << "ls" << "-l" << "/usr/local/bin" |
244 | * </pre> | 244 | * </pre> |
245 | * | 245 | * |
246 | **/ | 246 | **/ |
247 | OProcess &operator<<( const QString& arg ); | 247 | OProcess &operator<<( const QString& arg ); |
248 | /** | 248 | /** |
249 | * Similar to previous method, takes a char *, supposed to be in locale 8 bit already. | 249 | * Similar to previous method, takes a char *, supposed to be in locale 8 bit already. |
250 | */ | 250 | */ |
251 | OProcess &operator<<( const char * arg ); | 251 | OProcess &operator<<( const char * arg ); |
252 | /** | 252 | /** |
253 | * Similar to previous method, takes a QCString, supposed to be in locale 8 bit already. | 253 | * Similar to previous method, takes a QCString, supposed to be in locale 8 bit already. |
254 | */ | 254 | */ |
255 | OProcess &operator<<( const QCString & arg ); | 255 | OProcess &operator<<( const QCString & arg ); |
256 | 256 | ||
257 | /** | 257 | /** |
258 | * Sets the executable and the command line argument list for this process, | 258 | * Sets the executable and the command line argument list for this process, |
259 | * in a single method call, or add a list of arguments. | 259 | * in a single method call, or add a list of arguments. |
260 | **/ | 260 | **/ |
261 | OProcess &operator<<( const QStringList& args ); | 261 | OProcess &operator<<( const QStringList& args ); |
262 | 262 | ||
263 | /** | 263 | /** |
264 | * Clear a command line argument list that has been set by using | 264 | * Clear a command line argument list that has been set by using |
265 | * the "operator<<". | 265 | * the "operator<<". |
266 | */ | 266 | */ |
267 | void clearArguments(); | 267 | void clearArguments(); |
268 | 268 | ||
269 | /** | 269 | /** |
270 | * Starts the process. | 270 | * Starts the process. |
271 | * For a detailed description of the | 271 | * For a detailed description of the |
272 | * various run modes and communication semantics, have a look at the | 272 | * various run modes and communication semantics, have a look at the |
273 | * general description of the OProcess class. | 273 | * general description of the OProcess class. |
274 | * | 274 | * |
275 | * The following problems could cause this function to | 275 | * The following problems could cause this function to |
276 | * return false: | 276 | * return false: |
277 | * | 277 | * |
278 | * @li The process is already running. | 278 | * @li The process is already running. |
279 | * @li The command line argument list is empty. | 279 | * @li The command line argument list is empty. |
280 | * @li The starting of the process failed (could not fork). | 280 | * @li The starting of the process failed (could not fork). |
281 | * @li The executable was not found. | 281 | * @li The executable was not found. |
282 | * | 282 | * |
283 | * @param comm Specifies which communication links should be | 283 | * @param comm Specifies which communication links should be |
284 | * established to the child process (stdin/stdout/stderr). By default, | 284 | * established to the child process (stdin/stdout/stderr). By default, |
285 | * no communication takes place and the respective communication | 285 | * no communication takes place and the respective communication |
286 | * signals will never get emitted. | 286 | * signals will never get emitted. |
287 | * | 287 | * |
288 | * @return true on success, false on error | 288 | * @return true on success, false on error |
289 | * (see above for error conditions) | 289 | * (see above for error conditions) |
290 | **/ | 290 | **/ |
291 | virtual bool start( RunMode runmode = NotifyOnExit, | 291 | virtual bool start( RunMode runmode = NotifyOnExit, |
292 | Communication comm = NoCommunication ); | 292 | Communication comm = NoCommunication ); |
293 | 293 | ||
294 | /** | 294 | /** |
295 | * Stop the process (by sending it a signal). | 295 | * Stop the process (by sending it a signal). |
296 | * | 296 | * |
297 | * @param signoThe signal to send. The default is SIGTERM. | 297 | * @param signoThe signal to send. The default is SIGTERM. |
298 | * @return @p true if the signal was delivered successfully. | 298 | * @return @p true if the signal was delivered successfully. |
299 | */ | 299 | */ |
300 | virtual bool kill( int signo = SIGTERM ); | 300 | virtual bool kill( int signo = SIGTERM ); |
301 | 301 | ||
302 | /** | 302 | /** |
303 | @return @p true if the process is (still) considered to be running | 303 | @return @p true if the process is (still) considered to be running |
304 | */ | 304 | */ |
305 | bool isRunning() const; | 305 | bool isRunning() const; |
306 | 306 | ||
307 | /** Returns the process id of the process. | 307 | /** Returns the process id of the process. |
308 | * | 308 | * |
309 | * If it is called after | 309 | * If it is called after |
310 | * the process has exited, it returns the process id of the last | 310 | * the process has exited, it returns the process id of the last |
311 | * child process that was created by this instance of OProcess. | 311 | * child process that was created by this instance of OProcess. |
312 | * | 312 | * |
313 | * Calling it before any child process has been started by this | 313 | * Calling it before any child process has been started by this |
314 | * OProcess instance causes pid() to return 0. | 314 | * OProcess instance causes pid() to return 0. |
315 | **/ | 315 | **/ |
316 | pid_t pid() const; | 316 | pid_t pid() const; |
317 | 317 | ||
318 | /** | 318 | /** |
319 | * Suspend processing of data from stdout of the child process. | 319 | * Suspend processing of data from stdout of the child process. |
320 | */ | 320 | */ |
321 | void suspend(); | 321 | void suspend(); |
322 | 322 | ||
323 | /** | 323 | /** |
324 | * Resume processing of data from stdout of the child process. | 324 | * Resume processing of data from stdout of the child process. |
325 | */ | 325 | */ |
326 | void resume(); | 326 | void resume(); |
327 | 327 | ||
328 | /** | 328 | /** |
329 | * @return @p true if the process has already finished and has exited | 329 | * @return @p true if the process has already finished and has exited |
330 | * "voluntarily", ie: it has not been killed by a signal. | 330 | * "voluntarily", ie: it has not been killed by a signal. |
331 | * | 331 | * |
332 | * Note that you should check @ref OProcess::exitStatus() to determine | 332 | * Note that you should check @ref OProcess::exitStatus() to determine |
333 | * whether the process completed its task successful or not. | 333 | * whether the process completed its task successful or not. |
334 | */ | 334 | */ |
335 | bool normalExit() const; | 335 | bool normalExit() const; |
336 | 336 | ||
337 | /** | 337 | /** |
338 | * Returns the exit status of the process. | 338 | * Returns the exit status of the process. |
339 | * | 339 | * |
340 | * Please use | 340 | * Please use |
341 | * @ref OProcess::normalExit() to check whether the process has exited | 341 | * @ref OProcess::normalExit() to check whether the process has exited |
342 | * cleanly (i.e., @ref OProcess::normalExit() returns @p true) before calling | 342 | * cleanly (i.e., @ref OProcess::normalExit() returns @p true) before calling |
343 | * this function because if the process did not exit normally, | 343 | * this function because if the process did not exit normally, |
344 | * it does not have a valid exit status. | 344 | * it does not have a valid exit status. |
345 | */ | 345 | */ |
346 | int exitStatus() const; | 346 | int exitStatus() const; |
347 | 347 | ||
348 | 348 | ||
349 | /** | 349 | /** |
350 | * Transmit data to the child process's stdin. | 350 | * Transmit data to the child process's stdin. |
351 | * | 351 | * |
352 | * OProcess::writeStdin may return false in the following cases: | 352 | * OProcess::writeStdin may return false in the following cases: |
353 | * | 353 | * |
354 | * @li The process is not currently running. | 354 | * @li The process is not currently running. |
355 | * | 355 | * |
356 | * @li Communication to stdin has not been requested in the @ref start() call. | 356 | * @li Communication to stdin has not been requested in the @ref start() call. |
357 | * | 357 | * |
358 | * @li Transmission of data to the child process by a previous call to | 358 | * @li Transmission of data to the child process by a previous call to |
359 | * @ref writeStdin() is still in progress. | 359 | * @ref writeStdin() is still in progress. |
360 | * | 360 | * |
361 | * Please note that the data is sent to the client asynchronously, | 361 | * Please note that the data is sent to the client asynchronously, |
362 | * so when this function returns, the data might not have been | 362 | * so when this function returns, the data might not have been |
363 | * processed by the child process. | 363 | * processed by the child process. |
364 | * | 364 | * |
365 | * If all the data has been sent to the client, the signal | 365 | * If all the data has been sent to the client, the signal |
366 | * @ref wroteStdin() will be emitted. | 366 | * @ref wroteStdin() will be emitted. |
367 | * | 367 | * |
368 | * Please note that you must not free "buffer" or call @ref writeStdin() | 368 | * Please note that you must not free "buffer" or call @ref writeStdin() |
369 | * again until either a @ref wroteStdin() signal indicates that the | 369 | * again until either a @ref wroteStdin() signal indicates that the |
370 | * data has been sent or a @ref processHasExited() signal shows that | 370 | * data has been sent or a @ref processHasExited() signal shows that |
371 | * the child process is no longer alive... | 371 | * the child process is no longer alive... |
372 | **/ | 372 | **/ |
373 | bool writeStdin( const char *buffer, int buflen ); | 373 | bool writeStdin( const char *buffer, int buflen ); |
374 | 374 | ||
375 | void flushStdin(); | 375 | void flushStdin(); |
376 | 376 | ||
377 | /** | 377 | /** |
378 | * This causes the stdin file descriptor of the child process to be | 378 | * This causes the stdin file descriptor of the child process to be |
379 | * closed indicating an "EOF" to the child. | 379 | * closed indicating an "EOF" to the child. |
380 | * | 380 | * |
381 | * @return @p false if no communication to the process's stdin | 381 | * @return @p false if no communication to the process's stdin |
382 | * had been specified in the call to @ref start(). | 382 | * had been specified in the call to @ref start(). |
383 | */ | 383 | */ |
384 | bool closeStdin(); | 384 | bool closeStdin(); |
385 | 385 | ||
386 | /** | 386 | /** |
387 | * This causes the stdout file descriptor of the child process to be | 387 | * This causes the stdout file descriptor of the child process to be |
388 | * closed. | 388 | * closed. |
389 | * | 389 | * |
390 | * @return @p false if no communication to the process's stdout | 390 | * @return @p false if no communication to the process's stdout |
391 | * had been specified in the call to @ref start(). | 391 | * had been specified in the call to @ref start(). |
392 | */ | 392 | */ |
393 | bool closeStdout(); | 393 | bool closeStdout(); |
394 | 394 | ||
395 | /** | 395 | /** |
396 | * This causes the stderr file descriptor of the child process to be | 396 | * This causes the stderr file descriptor of the child process to be |
397 | * closed. | 397 | * closed. |
398 | * | 398 | * |
399 | * @return @p false if no communication to the process's stderr | 399 | * @return @p false if no communication to the process's stderr |
400 | * had been specified in the call to @ref start(). | 400 | * had been specified in the call to @ref start(). |
401 | */ | 401 | */ |
402 | bool closeStderr(); | 402 | bool closeStderr(); |
403 | 403 | ||
404 | /** | 404 | /** |
405 | * Lets you see what your arguments are for debugging. | 405 | * Lets you see what your arguments are for debugging. |
406 | * \todo make const | 406 | * \todo make const |
407 | */ | 407 | */ |
408 | 408 | ||
409 | const QValueList<QCString> &args() | 409 | const QValueList<QCString> &args() |
410 | { | 410 | { |
411 | return arguments; | 411 | return arguments; |
412 | } | 412 | } |
413 | 413 | ||
414 | /** | 414 | /** |
415 | * Controls whether the started process should drop any | 415 | * Controls whether the started process should drop any |
416 | * setuid/segid privileges or whether it should keep them | 416 | * setuid/segid privileges or whether it should keep them |
417 | * | 417 | * |
418 | * The default is @p false : drop privileges | 418 | * The default is @p false : drop privileges |
419 | */ | 419 | */ |
420 | void setRunPrivileged( bool keepPrivileges ); | 420 | void setRunPrivileged( bool keepPrivileges ); |
421 | 421 | ||
422 | /** | 422 | /** |
423 | * Returns whether the started process will drop any | 423 | * Returns whether the started process will drop any |
424 | * setuid/segid privileges or whether it will keep them | 424 | * setuid/segid privileges or whether it will keep them |
425 | */ | 425 | */ |
426 | bool runPrivileged() const; | 426 | bool runPrivileged() const; |
427 | 427 | ||
428 | /** | 428 | /** |
429 | * Modifies the environment of the process to be started. | 429 | * Modifies the environment of the process to be started. |
430 | * This function must be called before starting the process. | 430 | * This function must be called before starting the process. |
431 | */ | 431 | */ |
432 | void setEnvironment( const QString &name, const QString &value ); | 432 | void setEnvironment( const QString &name, const QString &value ); |
433 | 433 | ||
434 | /** | 434 | /** |
435 | * Changes the current working directory (CWD) of the process | 435 | * Changes the current working directory (CWD) of the process |
436 | * to be started. | 436 | * to be started. |
437 | * This function must be called before starting the process. | 437 | * This function must be called before starting the process. |
438 | */ | 438 | */ |
439 | void setWorkingDirectory( const QString &dir ); | 439 | void setWorkingDirectory( const QString &dir ); |
440 | 440 | ||
441 | /** | 441 | /** |
442 | * Specify whether to start the command via a shell or directly. | 442 | * Specify whether to start the command via a shell or directly. |
443 | * The default is to start the command directly. | 443 | * The default is to start the command directly. |
444 | * If @p useShell is true @p shell will be used as shell, or | 444 | * If @p useShell is true @p shell will be used as shell, or |
445 | * if shell is empty, the standard shell is used. | 445 | * if shell is empty, the standard shell is used. |
446 | * @p quote A flag indicating whether to quote the arguments. | 446 | * @p quote A flag indicating whether to quote the arguments. |
447 | * | 447 | * |
448 | * When using a shell, the caller should make sure that all filenames etc. | 448 | * When using a shell, the caller should make sure that all filenames etc. |
449 | * are properly quoted when passed as argument. | 449 | * are properly quoted when passed as argument. |
450 | * @see quote() | 450 | * @see quote() |
451 | */ | 451 | */ |
452 | void setUseShell( bool useShell, const char *shell = 0 ); | 452 | void setUseShell( bool useShell, const char *shell = 0 ); |
453 | 453 | ||
454 | /** | 454 | /** |
455 | * This function can be used to quote an argument string such that | 455 | * This function can be used to quote an argument string such that |
456 | * the shell processes it properly. This is e. g. necessary for | 456 | * the shell processes it properly. This is e. g. necessary for |
457 | * user-provided file names which may contain spaces or quotes. | 457 | * user-provided file names which may contain spaces or quotes. |
458 | * It also prevents expansion of wild cards and environment variables. | 458 | * It also prevents expansion of wild cards and environment variables. |
459 | */ | 459 | */ |
460 | static QString quote( const QString &arg ); | 460 | static QString quote( const QString &arg ); |
461 | 461 | ||
462 | /** | 462 | /** |
463 | * Detaches OProcess from child process. All communication is closed. | 463 | * Detaches OProcess from child process. All communication is closed. |
464 | * No exit notification is emitted any more for the child process. | 464 | * No exit notification is emitted any more for the child process. |
465 | * Deleting the OProcess will no longer kill the child process. | 465 | * Deleting the OProcess will no longer kill the child process. |
466 | * Note that the current process remains the parent process of the | 466 | * Note that the current process remains the parent process of the |
467 | * child process. | 467 | * child process. |
468 | */ | 468 | */ |
469 | void detach(); | 469 | void detach(); |
470 | 470 | ||
471 | /** | 471 | /** |
472 | * @return the PID of @a process, or -1 if the process is not running | 472 | * @return the PID of @a process, or -1 if the process is not running |
473 | */ | 473 | */ |
474 | static int processPID( const QString& process ); | 474 | static int processPID( const QString& process ); |
475 | 475 | ||
476 | signals: | 476 | signals: |
477 | 477 | ||
478 | /** | 478 | /** |
479 | * Emitted after the process has terminated when | 479 | * Emitted after the process has terminated when |
480 | * the process was run in the @p NotifyOnExit (==default option to | 480 | * the process was run in the @p NotifyOnExit (==default option to |
481 | * @ref start()) or the @ref Block mode. | 481 | * @ref start()) or the @ref Block mode. |
482 | **/ | 482 | **/ |
483 | void processExited( Opie::Core::OProcess *proc ); | 483 | void processExited( Opie::Core::OProcess *proc ); |
484 | 484 | ||
485 | 485 | ||
486 | /** | 486 | /** |
487 | * Emitted, when output from the child process has | 487 | * Emitted, when output from the child process has |
488 | * been received on stdout. | 488 | * been received on stdout. |
489 | * | 489 | * |
490 | * To actually get | 490 | * To actually get |
491 | * these signals, the respective communication link (stdout/stderr) | 491 | * these signals, the respective communication link (stdout/stderr) |
492 | * has to be turned on in @ref start(). | 492 | * has to be turned on in @ref start(). |
493 | * | 493 | * |
494 | * @param proc The process | ||
494 | * @param buffer The data received. | 495 | * @param buffer The data received. |
495 | * @param buflen The number of bytes that are available. | 496 | * @param buflen The number of bytes that are available. |
496 | * | 497 | * |
497 | * You should copy the information contained in @p buffer to your private | 498 | * You should copy the information contained in @p buffer to your private |
498 | * data structures before returning from this slot. | 499 | * data structures before returning from this slot. |
499 | **/ | 500 | **/ |
500 | void receivedStdout( Opie::Core::OProcess *proc, char *buffer, int buflen ); | 501 | void receivedStdout( Opie::Core::OProcess *proc, char *buffer, int buflen ); |
501 | 502 | ||
502 | /** | 503 | /** |
503 | * Emitted when output from the child process has | 504 | * Emitted when output from the child process has |
504 | * been received on stdout. | 505 | * been received on stdout. |
505 | * | 506 | * |
506 | * To actually get these signals, the respective communications link | 507 | * To actually get these signals, the respective communications link |
507 | * (stdout/stderr) has to be turned on in @ref start() and the | 508 | * (stdout/stderr) has to be turned on in @ref start() and the |
508 | * @p NoRead flag should have been passed. | 509 | * @p NoRead flag should have been passed. |
509 | * | 510 | * |
510 | * You will need to explicitly call resume() after your call to start() | 511 | * You will need to explicitly call resume() after your call to start() |
511 | * to begin processing data from the child process's stdout. This is | 512 | * to begin processing data from the child process's stdout. This is |
512 | * to ensure that this signal is not emitted when no one is connected | 513 | * to ensure that this signal is not emitted when no one is connected |
513 | * to it, otherwise this signal will not be emitted. | 514 | * to it, otherwise this signal will not be emitted. |
514 | * | 515 | * |
515 | * The data still has to be read from file descriptor @p fd. | 516 | * The data still has to be read from file descriptor @p fd. |
516 | **/ | 517 | **/ |
517 | void receivedStdout( int fd, int &len ); | 518 | void receivedStdout( int fd, int &len ); |
518 | 519 | ||
519 | 520 | ||
520 | /** | 521 | /** |
521 | * Emitted, when output from the child process has | 522 | * Emitted, when output from the child process has |
522 | * been received on stderr. | 523 | * been received on stderr. |
523 | * To actually get | 524 | * To actually get |
524 | * these signals, the respective communication link (stdout/stderr) | 525 | * these signals, the respective communication link (stdout/stderr) |
525 | * has to be turned on in @ref start(). | 526 | * has to be turned on in @ref start(). |
526 | * | 527 | * |
528 | * @param proc The process | ||
527 | * @param buffer The data received. | 529 | * @param buffer The data received. |
528 | * @param buflen The number of bytes that are available. | 530 | * @param buflen The number of bytes that are available. |
529 | * | 531 | * |
530 | * You should copy the information contained in @p buffer to your private | 532 | * You should copy the information contained in @p buffer to your private |
531 | * data structures before returning from this slot. | 533 | * data structures before returning from this slot. |
532 | */ | 534 | */ |
533 | void receivedStderr( Opie::Core::OProcess *proc, char *buffer, int buflen ); | 535 | void receivedStderr( Opie::Core::OProcess *proc, char *buffer, int buflen ); |
534 | 536 | ||
535 | /** | 537 | /** |
536 | * Emitted after all the data that has been | 538 | * Emitted after all the data that has been |
537 | * specified by a prior call to @ref writeStdin() has actually been | 539 | * specified by a prior call to @ref writeStdin() has actually been |
538 | * written to the child process. | 540 | * written to the child process. |
539 | **/ | 541 | **/ |
540 | void wroteStdin( Opie::Core::OProcess *proc ); | 542 | void wroteStdin( Opie::Core::OProcess *proc ); |
541 | 543 | ||
542 | protected slots: | 544 | protected slots: |
543 | 545 | ||
544 | /** | 546 | /** |
545 | * This slot gets activated when data from the child's stdout arrives. | 547 | * This slot gets activated when data from the child's stdout arrives. |
546 | * It usually calls "childOutput" | 548 | * It usually calls "childOutput" |
547 | */ | 549 | */ |
548 | void slotChildOutput( int fdno ); | 550 | void slotChildOutput( int fdno ); |
549 | 551 | ||
550 | /** | 552 | /** |
551 | * This slot gets activated when data from the child's stderr arrives. | 553 | * This slot gets activated when data from the child's stderr arrives. |
552 | * It usually calls "childError" | 554 | * It usually calls "childError" |
553 | */ | 555 | */ |
554 | void slotChildError( int fdno ); | 556 | void slotChildError( int fdno ); |
555 | /* | 557 | /* |
556 | Slot functions for capturing stdout and stderr of the child | 558 | Slot functions for capturing stdout and stderr of the child |
557 | */ | 559 | */ |
558 | 560 | ||
559 | /** | 561 | /** |
560 | * Called when another bulk of data can be sent to the child's | 562 | * Called when another bulk of data can be sent to the child's |
561 | * stdin. If there is no more data to be sent to stdin currently | 563 | * stdin. If there is no more data to be sent to stdin currently |
562 | * available, this function must disable the QSocketNotifier "innot". | 564 | * available, this function must disable the QSocketNotifier "innot". |
563 | */ | 565 | */ |
564 | void slotSendData( int dummy ); | 566 | void slotSendData( int dummy ); |
565 | 567 | ||
566 | protected: | 568 | protected: |
567 | 569 | ||
568 | /** | 570 | /** |
569 | * Sets up the environment according to the data passed via | 571 | * Sets up the environment according to the data passed via |
570 | * setEnvironment(...) | 572 | * setEnvironment(...) |
571 | */ | 573 | */ |
572 | void setupEnvironment(); | 574 | void setupEnvironment(); |
573 | 575 | ||
574 | /** | 576 | /** |
575 | * The list of the process' command line arguments. The first entry | 577 | * The list of the process' command line arguments. The first entry |
576 | * in this list is the executable itself. | 578 | * in this list is the executable itself. |
577 | */ | 579 | */ |
578 | QValueList<QCString> arguments; | 580 | QValueList<QCString> arguments; |
579 | /** | 581 | /** |
580 | * How to run the process (Block, NotifyOnExit, DontCare). You should | 582 | * How to run the process (Block, NotifyOnExit, DontCare). You should |
581 | * not modify this data member directly from derived classes. | 583 | * not modify this data member directly from derived classes. |
582 | */ | 584 | */ |
583 | RunMode run_mode; | 585 | RunMode run_mode; |
584 | /** | 586 | /** |
585 | * true if the process is currently running. You should not | 587 | * true if the process is currently running. You should not |
586 | * modify this data member directly from derived classes. For | 588 | * modify this data member directly from derived classes. For |
587 | * reading the value of this data member, please use "isRunning()" | 589 | * reading the value of this data member, please use "isRunning()" |
588 | * since "runs" will probably be made private in later versions | 590 | * since "runs" will probably be made private in later versions |
589 | * of OProcess. | 591 | * of OProcess. |
590 | */ | 592 | */ |
591 | bool runs; | 593 | bool runs; |
592 | 594 | ||
593 | /** | 595 | /** |
594 | * The PID of the currently running process (see "getPid()"). | 596 | * The PID of the currently running process (see "getPid()"). |
595 | * You should not modify this data member in derived classes. | 597 | * You should not modify this data member in derived classes. |
596 | * Please use "getPid()" instead of directly accessing this | 598 | * Please use "getPid()" instead of directly accessing this |
597 | * member function since it will probably be made private in | 599 | * member function since it will probably be made private in |
598 | * later versions of OProcess. | 600 | * later versions of OProcess. |
599 | */ | 601 | */ |
600 | pid_t pid_; | 602 | pid_t pid_; |
601 | 603 | ||
602 | /** | 604 | /** |
603 | * The process' exit status as returned by "waitpid". You should not | 605 | * The process' exit status as returned by "waitpid". You should not |
604 | * modify the value of this data member from derived classes. You should | 606 | * modify the value of this data member from derived classes. You should |
605 | * rather use @ref exitStatus than accessing this data member directly | 607 | * rather use @ref exitStatus than accessing this data member directly |
606 | * since it will probably be made private in further versions of | 608 | * since it will probably be made private in further versions of |
607 | * OProcess. | 609 | * OProcess. |
608 | */ | 610 | */ |
609 | int status; | 611 | int status; |
610 | 612 | ||
611 | 613 | ||
612 | /** | 614 | /** |
613 | * See setRunPrivileged() | 615 | * See setRunPrivileged() |
614 | */ | 616 | */ |
615 | bool keepPrivs; | 617 | bool keepPrivs; |
616 | 618 | ||
617 | /* | 619 | /* |
618 | Functions for setting up the sockets for communication. | 620 | Functions for setting up the sockets for communication. |
619 | setupCommunication | 621 | setupCommunication |
620 | -- is called from "start" before "fork"ing. | 622 | -- is called from "start" before "fork"ing. |
621 | commSetupDoneP | 623 | commSetupDoneP |
622 | -- completes communication socket setup in the parent | 624 | -- completes communication socket setup in the parent |
623 | commSetupDoneC | 625 | commSetupDoneC |
624 | -- completes communication setup in the child process | 626 | -- completes communication setup in the child process |
625 | commClose | 627 | commClose |
626 | -- frees all allocated communication resources in the parent | 628 | -- frees all allocated communication resources in the parent |
627 | after the process has exited | 629 | after the process has exited |
628 | */ | 630 | */ |
629 | 631 | ||
630 | /** | 632 | /** |
631 | * This function is called from "OProcess::start" right before a "fork" takes | 633 | * This function is called from "OProcess::start" right before a "fork" takes |
632 | * place. According to | 634 | * place. According to |
633 | * the "comm" parameter this function has to initialize the "in", "out" and | 635 | * the "comm" parameter this function has to initialize the "in", "out" and |
634 | * "err" data member of OProcess. | 636 | * "err" data member of OProcess. |
635 | * | 637 | * |
636 | * This function should return 0 if setting the needed communication channels | 638 | * This function should return 0 if setting the needed communication channels |
637 | * was successful. | 639 | * was successful. |
638 | * | 640 | * |
639 | * The default implementation is to create UNIX STREAM sockets for the communication, | 641 | * The default implementation is to create UNIX STREAM sockets for the communication, |
640 | * but you could overload this function and establish a TCP/IP communication for | 642 | * but you could overload this function and establish a TCP/IP communication for |
641 | * network communication, for example. | 643 | * network communication, for example. |
642 | */ | 644 | */ |
643 | virtual int setupCommunication( Communication comm ); | 645 | virtual int setupCommunication( Communication comm ); |
644 | 646 | ||
645 | /** | 647 | /** |
646 | * Called right after a (successful) fork on the parent side. This function | 648 | * Called right after a (successful) fork on the parent side. This function |
647 | * will usually do some communications cleanup, like closing the reading end | 649 | * will usually do some communications cleanup, like closing the reading end |
648 | * of the "stdin" communication channel. | 650 | * of the "stdin" communication channel. |
649 | * | 651 | * |
650 | * Furthermore, it must also create the QSocketNotifiers "innot", "outnot" and | 652 | * Furthermore, it must also create the QSocketNotifiers "innot", "outnot" and |
651 | * "errnot" and connect their Qt slots to the respective OProcess member functions. | 653 | * "errnot" and connect their Qt slots to the respective OProcess member functions. |
652 | * | 654 | * |
653 | * For a more detailed explanation, it is best to have a look at the default | 655 | * For a more detailed explanation, it is best to have a look at the default |
654 | * implementation of "setupCommunication" in kprocess.cpp. | 656 | * implementation of "setupCommunication" in kprocess.cpp. |
655 | */ | 657 | */ |
656 | virtual int commSetupDoneP(); | 658 | virtual int commSetupDoneP(); |
657 | 659 | ||
658 | /** | 660 | /** |
659 | * Called right after a (successful) fork, but before an "exec" on the child | 661 | * Called right after a (successful) fork, but before an "exec" on the child |
660 | * process' side. It usually just closes the unused communication ends of | 662 | * process' side. It usually just closes the unused communication ends of |
661 | * "in", "out" and "err" (like the writing end of the "in" communication | 663 | * "in", "out" and "err" (like the writing end of the "in" communication |
662 | * channel. | 664 | * channel. |
663 | */ | 665 | */ |
664 | virtual int commSetupDoneC(); | 666 | virtual int commSetupDoneC(); |
665 | 667 | ||
666 | 668 | ||
667 | /** | 669 | /** |
668 | * Immediately called after a process has exited. This function normally | 670 | * Immediately called after a process has exited. This function normally |
669 | * calls commClose to close all open communication channels to this | 671 | * calls commClose to close all open communication channels to this |
670 | * process and emits the "processExited" signal (if the process was | 672 | * process and emits the "processExited" signal (if the process was |
671 | * not running in the "DontCare" mode). | 673 | * not running in the "DontCare" mode). |
672 | */ | 674 | */ |
673 | virtual void processHasExited( int state ); | 675 | virtual void processHasExited( int state ); |
674 | 676 | ||
675 | /** | 677 | /** |
676 | * Should clean up the communication links to the child after it has | 678 | * Should clean up the communication links to the child after it has |
677 | * exited. Should be called from "processHasExited". | 679 | * exited. Should be called from "processHasExited". |
678 | */ | 680 | */ |
679 | virtual void commClose(); | 681 | virtual void commClose(); |
680 | 682 | ||
681 | 683 | ||
682 | /** | 684 | /** |
683 | * the socket descriptors for stdin/stdout/stderr. | 685 | * the socket descriptors for stdin/stdout/stderr. |
684 | */ | 686 | */ |
685 | int out[ 2 ]; | 687 | int out[ 2 ]; |
686 | int in[ 2 ]; | 688 | int in[ 2 ]; |
687 | int err[ 2 ]; | 689 | int err[ 2 ]; |
688 | 690 | ||
689 | /** | 691 | /** |
690 | * The socket notifiers for the above socket descriptors. | 692 | * The socket notifiers for the above socket descriptors. |
691 | */ | 693 | */ |
692 | QSocketNotifier *innot; | 694 | QSocketNotifier *innot; |
693 | QSocketNotifier *outnot; | 695 | QSocketNotifier *outnot; |
694 | QSocketNotifier *errnot; | 696 | QSocketNotifier *errnot; |
695 | 697 | ||
696 | /** | 698 | /** |
697 | * Lists the communication links that are activated for the child | 699 | * Lists the communication links that are activated for the child |
698 | * process. Should not be modified from derived classes. | 700 | * process. Should not be modified from derived classes. |
699 | */ | 701 | */ |
700 | Communication communication; | 702 | Communication communication; |
701 | 703 | ||
702 | /** | 704 | /** |
703 | * Called by "slotChildOutput" this function copies data arriving from the | 705 | * Called by "slotChildOutput" this function copies data arriving from the |
704 | * child process's stdout to the respective buffer and emits the signal | 706 | * child process's stdout to the respective buffer and emits the signal |
705 | * "@ref receivedStderr". | 707 | * "@ref receivedStderr". |
706 | */ | 708 | */ |
707 | int childOutput( int fdno ); | 709 | int childOutput( int fdno ); |
708 | 710 | ||
709 | /** | 711 | /** |
710 | * Called by "slotChildOutput" this function copies data arriving from the | 712 | * Called by "slotChildOutput" this function copies data arriving from the |
711 | * child process's stdout to the respective buffer and emits the signal | 713 | * child process's stdout to the respective buffer and emits the signal |
712 | * "@ref receivedStderr" | 714 | * "@ref receivedStderr" |
713 | */ | 715 | */ |
714 | int childError( int fdno ); | 716 | int childError( int fdno ); |
715 | 717 | ||
716 | // information about the data that has to be sent to the child: | 718 | // information about the data that has to be sent to the child: |
717 | 719 | ||
718 | const char *input_data; // the buffer holding the data | 720 | const char *input_data; // the buffer holding the data |
719 | int input_sent; // # of bytes already transmitted | 721 | int input_sent; // # of bytes already transmitted |
720 | int input_total; // total length of input_data | 722 | int input_total; // total length of input_data |
721 | 723 | ||
722 | /** | 724 | /** |
723 | * @ref OProcessController is a friend of OProcess because it has to have | 725 | * @ref OProcessController is a friend of OProcess because it has to have |
724 | * access to various data members. | 726 | * access to various data members. |
725 | */ | 727 | */ |
726 | friend class Internal::OProcessController; | 728 | friend class Internal::OProcessController; |
727 | 729 | ||
728 | private: | 730 | private: |
729 | /** | 731 | /** |
730 | * Searches for a valid shell. | 732 | * Searches for a valid shell. |
731 | * Here is the algorithm used for finding an executable shell: | 733 | * Here is the algorithm used for finding an executable shell: |
732 | * | 734 | * |
733 | * @li Try the executable pointed to by the "SHELL" environment | 735 | * @li Try the executable pointed to by the "SHELL" environment |
734 | * variable with white spaces stripped off | 736 | * variable with white spaces stripped off |
735 | * | 737 | * |
736 | * @li If your process runs with uid != euid or gid != egid, a shell | 738 | * @li If your process runs with uid != euid or gid != egid, a shell |
737 | * not listed in /etc/shells will not used. | 739 | * not listed in /etc/shells will not used. |
738 | * | 740 | * |
739 | * @li If no valid shell could be found, "/bin/sh" is used as a last resort. | 741 | * @li If no valid shell could be found, "/bin/sh" is used as a last resort. |
740 | */ | 742 | */ |
741 | QCString searchShell(); | 743 | QCString searchShell(); |
742 | 744 | ||
743 | /** | 745 | /** |
744 | * Used by @ref searchShell in order to find out whether the shell found | 746 | * Used by @ref searchShell in order to find out whether the shell found |
745 | * is actually executable at all. | 747 | * is actually executable at all. |
746 | */ | 748 | */ |
747 | bool isExecutable( const QCString &filename ); | 749 | bool isExecutable( const QCString &filename ); |
748 | 750 | ||
749 | // Disallow assignment and copy-construction | 751 | // Disallow assignment and copy-construction |
750 | OProcess( const OProcess& ); | 752 | OProcess( const OProcess& ); |
751 | OProcess& operator= ( const OProcess& ); | 753 | OProcess& operator= ( const OProcess& ); |
752 | 754 | ||
753 | private: | 755 | private: |
754 | void init ( ); | 756 | void init ( ); |
755 | Internal::OProcessPrivate *d; | 757 | Internal::OProcessPrivate *d; |
756 | }; | 758 | }; |
757 | } | 759 | } |
758 | } | 760 | } |
759 | 761 | ||
760 | #endif | 762 | #endif |
761 | 763 | ||
diff --git a/libopie2/opieui/oimageeffect.h b/libopie2/opieui/oimageeffect.h index 4f86d5b..4422741 100644 --- a/libopie2/opieui/oimageeffect.h +++ b/libopie2/opieui/oimageeffect.h | |||
@@ -1,564 +1,564 @@ | |||
1 | //FIXME: Revise for Opie - do we really need such fancy stuff on PDA's? | 1 | //FIXME: Revise for Opie - do we really need such fancy stuff on PDA's? |
2 | //FIXME: Maybe not on SL5xxx, but surely on C700 :)) | 2 | //FIXME: Maybe not on SL5xxx, but surely on C700 :)) |
3 | //FIXME: I think we don#t need that -zecke | 3 | //FIXME: I think we don#t need that -zecke |
4 | 4 | ||
5 | /* This file is part of the KDE libraries | 5 | /* This file is part of the KDE libraries |
6 | Copyright (C) 1998, 1999, 2001, 2002 Daniel M. Duley <mosfet@interaccess.com> | 6 | Copyright (C) 1998, 1999, 2001, 2002 Daniel M. Duley <mosfet@interaccess.com> |
7 | (C) 1998, 1999 Christian Tibirna <ctibirna@total.net> | 7 | (C) 1998, 1999 Christian Tibirna <ctibirna@total.net> |
8 | (C) 1998, 1999 Dirk A. Mueller <mueller@kde.org> | 8 | (C) 1998, 1999 Dirk A. Mueller <mueller@kde.org> |
9 | 9 | ||
10 | Redistribution and use in source and binary forms, with or without | 10 | Redistribution and use in source and binary forms, with or without |
11 | modification, are permitted provided that the following conditions | 11 | modification, are permitted provided that the following conditions |
12 | are met: | 12 | are met: |
13 | 13 | ||
14 | 1. Redistributions of source code must retain the above copyright | 14 | 1. Redistributions of source code must retain the above copyright |
15 | notice, this list of conditions and the following disclaimer. | 15 | notice, this list of conditions and the following disclaimer. |
16 | 2. Redistributions in binary form must reproduce the above copyright | 16 | 2. Redistributions in binary form must reproduce the above copyright |
17 | notice, this list of conditions and the following disclaimer in the | 17 | notice, this list of conditions and the following disclaimer in the |
18 | documentation and/or other materials provided with the distribution. | 18 | documentation and/or other materials provided with the distribution. |
19 | 19 | ||
20 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | 20 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
21 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 21 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
22 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 22 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
23 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 23 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
24 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 24 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
25 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 25 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
26 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 26 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
27 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 27 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 28 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
29 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 29 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
30 | 30 | ||
31 | */ | 31 | */ |
32 | 32 | ||
33 | // $Id$ | 33 | // $Id$ |
34 | 34 | ||
35 | #ifndef OIMAGEEFFECT_H | 35 | #ifndef OIMAGEEFFECT_H |
36 | #define OIMAGEEFFECT_H | 36 | #define OIMAGEEFFECT_H |
37 | 37 | ||
38 | class QImage; | 38 | class QImage; |
39 | class QSize; | 39 | class QSize; |
40 | class QColor; | 40 | class QColor; |
41 | 41 | ||
42 | namespace Opie { | 42 | namespace Opie { |
43 | namespace Ui { | 43 | namespace Ui { |
44 | /** | 44 | /** |
45 | * This class includes various @ref QImage based graphical effects. | 45 | * This class includes various @ref QImage based graphical effects. |
46 | * | 46 | * |
47 | * Everything is | 47 | * Everything is |
48 | * static, so there is no need to create an instance of this class. You can | 48 | * static, so there is no need to create an instance of this class. You can |
49 | * just call the static methods. They are encapsulated here merely to provide | 49 | * just call the static methods. They are encapsulated here merely to provide |
50 | * a common namespace. | 50 | * a common namespace. |
51 | */ | 51 | */ |
52 | 52 | ||
53 | class OImageEffect | 53 | class OImageEffect |
54 | { | 54 | { |
55 | public: | 55 | public: |
56 | enum GradientType { VerticalGradient, HorizontalGradient, | 56 | enum GradientType { VerticalGradient, HorizontalGradient, |
57 | DiagonalGradient, CrossDiagonalGradient, | 57 | DiagonalGradient, CrossDiagonalGradient, |
58 | PyramidGradient, RectangleGradient, | 58 | PyramidGradient, RectangleGradient, |
59 | PipeCrossGradient, EllipticGradient }; | 59 | PipeCrossGradient, EllipticGradient }; |
60 | enum RGBComponent { Red, Green, Blue, Gray, All }; | 60 | enum RGBComponent { Red, Green, Blue, Gray, All }; |
61 | 61 | ||
62 | enum Lighting {NorthLite, NWLite, WestLite, SWLite, | 62 | enum Lighting {NorthLite, NWLite, WestLite, SWLite, |
63 | SouthLite, SELite, EastLite, NELite}; | 63 | SouthLite, SELite, EastLite, NELite}; |
64 | 64 | ||
65 | enum ModulationType { Intensity, Saturation, HueShift, Contrast }; | 65 | enum ModulationType { Intensity, Saturation, HueShift, Contrast }; |
66 | 66 | ||
67 | enum NoiseType { UniformNoise=0, GaussianNoise, MultiplicativeGaussianNoise, | 67 | enum NoiseType { UniformNoise=0, GaussianNoise, MultiplicativeGaussianNoise, |
68 | ImpulseNoise, LaplacianNoise, PoissonNoise}; | 68 | ImpulseNoise, LaplacianNoise, PoissonNoise}; |
69 | 69 | ||
70 | enum RotateDirection{ Rotate90, Rotate180, Rotate270 }; | 70 | enum RotateDirection{ Rotate90, Rotate180, Rotate270 }; |
71 | 71 | ||
72 | /** | 72 | /** |
73 | * Create a gradient from color a to color b of the specified type. | 73 | * Create a gradient from color a to color b of the specified type. |
74 | * | 74 | * |
75 | * @param size The desired size of the gradient. | 75 | * @param size The desired size of the gradient. |
76 | * @param ca Color a | 76 | * @param ca Color a |
77 | * @param cb Color b | 77 | * @param cb Color b |
78 | * @param type The type of gradient. | 78 | * @param type The type of gradient. |
79 | * @param ncols The number of colors to use when not running on a | 79 | * @param ncols The number of colors to use when not running on a |
80 | * truecolor display. The gradient will be dithered to this number of | 80 | * truecolor display. The gradient will be dithered to this number of |
81 | * colors. Pass 0 to prevent dithering. | 81 | * colors. Pass 0 to prevent dithering. |
82 | */ | 82 | */ |
83 | static QImage gradient(const QSize &size, const QColor &ca, | 83 | static QImage gradient(const QSize &size, const QColor &ca, |
84 | const QColor &cb, GradientType type, int ncols=3); | 84 | const QColor &cb, GradientType type, int ncols=3); |
85 | 85 | ||
86 | /** | 86 | /** |
87 | * Create an unbalanced gradient. | 87 | * Create an unbalanced gradient. |
88 | 88 | ||
89 | * An unbalanced gradient is a gradient where the transition from | 89 | * An unbalanced gradient is a gradient where the transition from |
90 | * color a to color b is not linear, but in this case, exponential. | 90 | * color a to color b is not linear, but in this case, exponential. |
91 | * | 91 | * |
92 | * @param size The desired size of the gradient. | 92 | * @param size The desired size of the gradient. |
93 | * @param ca Color a | 93 | * @param ca Color a |
94 | * @param cb Color b | 94 | * @param cb Color b |
95 | * @param type The type of gradient. | 95 | * @param type The type of gradient. |
96 | * @param xfactor The x decay length. Use a value between -200 and 200. | 96 | * @param xfactor The x decay length. Use a value between -200 and 200. |
97 | * @param yfactor The y decay length. | 97 | * @param yfactor The y decay length. |
98 | * @param ncols The number of colors. See OPixmapEffect:gradient. | 98 | * @param ncols The number of colors. See OPixmapEffect:gradient. |
99 | */ | 99 | */ |
100 | static QImage unbalancedGradient(const QSize &size, const QColor &ca, | 100 | static QImage unbalancedGradient(const QSize &size, const QColor &ca, |
101 | const QColor &cb, GradientType type, int xfactor = 100, | 101 | const QColor &cb, GradientType type, int xfactor = 100, |
102 | int yfactor = 100, int ncols = 3); | 102 | int yfactor = 100, int ncols = 3); |
103 | 103 | ||
104 | /** | 104 | /** |
105 | * Blends a color into the destination image, using an opacity | 105 | * Blends a color into the destination image, using an opacity |
106 | * value for blending one into another. Very fast direct pixel | 106 | * value for blending one into another. Very fast direct pixel |
107 | * manipulation is used. | 107 | * manipulation is used. |
108 | * | 108 | * |
109 | * @author Karol Szwed (gallium@kde.org) | 109 | * @author Karol Szwed (gallium@kde.org) |
110 | * @param clr source color to be blended into the destination image. | 110 | * @param clr source color to be blended into the destination image. |
111 | * @param dst destination image in which the source will be blended into. | 111 | * @param dst destination image in which the source will be blended into. |
112 | * @param opacity opacity (in percent) which determines how much the source | 112 | * @param opacity opacity (in percent) which determines how much the source |
113 | * color will be blended into the destination image. | 113 | * color will be blended into the destination image. |
114 | * @return The destination image (dst) containing the result. | 114 | * @return The destination image (dst) containing the result. |
115 | */ | 115 | */ |
116 | static QImage& blend(const QColor& clr, QImage& dst, float opacity); | 116 | static QImage& blend(const QColor& clr, QImage& dst, float opacity); |
117 | 117 | ||
118 | /** | 118 | /** |
119 | * Blend the src image into the destination image, using an opacity | 119 | * Blend the src image into the destination image, using an opacity |
120 | * value for blending one into another. Very fast direct pixel | 120 | * value for blending one into another. Very fast direct pixel |
121 | * manipulation is used. | 121 | * manipulation is used. |
122 | * | 122 | * |
123 | * @author Karol Szwed (gallium@kde.org) | 123 | * @author Karol Szwed (gallium@kde.org) |
124 | * @param src source image to be blended into the destination image. | 124 | * @param src source image to be blended into the destination image. |
125 | * @param dst destination image in which the source will be blended into. | 125 | * @param dst destination image in which the source will be blended into. |
126 | * @param opacity opacity (in percent) which determines how much the source | 126 | * @param opacity opacity (in percent) which determines how much the source |
127 | * image will be blended into the destination image. | 127 | * image will be blended into the destination image. |
128 | * @return The destination image (dst) containing the result. | 128 | * @return The destination image (dst) containing the result. |
129 | */ | 129 | */ |
130 | static QImage& blend(QImage& src, QImage& dst, float opacity); | 130 | static QImage& blend(QImage& src, QImage& dst, float opacity); |
131 | 131 | ||
132 | /** | 132 | /** |
133 | * Blend the provided image into a background of the indicated color. | 133 | * Blend the provided image into a background of the indicated color. |
134 | * | 134 | * |
135 | * @param initial_intensity this parameter takes values from -1 to 1: | 135 | * @param initial_intensity this parameter takes values from -1 to 1: |
136 | * a) if positive: how much to fade the image in its | 136 | * a) if positive: how much to fade the image in its |
137 | * less affected spot | 137 | * less affected spot |
138 | * b) if negative: roughly indicates how much of the image | 138 | * b) if negative: roughly indicates how much of the image |
139 | * remains unaffected | 139 | * remains unaffected |
140 | * @param bgnd indicates the color of the background to blend in | 140 | * @param bgnd indicates the color of the background to blend in |
141 | * @param eff lets you choose what kind of blending you like | 141 | * @param eff lets you choose what kind of blending you like |
142 | * @param anti_dir blend in the opposite direction (makes no much sense | 142 | * @param anti_dir blend in the opposite direction (makes no much sense |
143 | * with concentric blending effects) | 143 | * with concentric blending effects) |
144 | * @param image must be 32bpp | 144 | * @param image must be 32bpp |
145 | */ | 145 | */ |
146 | static QImage& blend(QImage &image, float initial_intensity, | 146 | static QImage& blend(QImage &image, float initial_intensity, |
147 | const QColor &bgnd, GradientType eff, | 147 | const QColor &bgnd, GradientType eff, |
148 | bool anti_dir=false); | 148 | bool anti_dir=false); |
149 | 149 | ||
150 | /** | 150 | /** |
151 | * Blend an image into another one, using a gradient type | 151 | * Blend an image into another one, using a gradient type |
152 | * for blending from one to another. | 152 | * for blending from one to another. |
153 | * | 153 | * |
154 | * @param image1 source1 and result of blending | 154 | * @param image1 source1 and result of blending |
155 | * @param image2 source2 of blending | 155 | * @param image2 source2 of blending |
156 | * @param gt gradient type for blending between source1 and source2 | 156 | * @param gt gradient type for blending between source1 and source2 |
157 | * @param xf x decay length for unbalanced gradient tpye | 157 | * @param xf x decay length for unbalanced gradient tpye |
158 | * @param yf y decay length for unbalanced gradient tpye | 158 | * @param yf y decay length for unbalanced gradient tpye |
159 | */ | 159 | */ |
160 | static QImage& blend(QImage &image1,QImage &image2, | 160 | static QImage& blend(QImage &image1,QImage &image2, |
161 | GradientType gt, int xf=100, int yf=100); | 161 | GradientType gt, int xf=100, int yf=100); |
162 | 162 | ||
163 | /** | 163 | /** |
164 | * Blend an image into another one, using a color channel of a | 164 | * Blend an image into another one, using a color channel of a |
165 | * third image for the decision of blending from one to another. | 165 | * third image for the decision of blending from one to another. |
166 | * | 166 | * |
167 | * @param image1 Source 1 and result of blending | 167 | * @param image1 Source 1 and result of blending |
168 | * @param image2 Source 2 of blending | 168 | * @param image2 Source 2 of blending |
169 | * @param blendImage If the gray value of of pixel is 0, the result | 169 | * @param blendImage If the gray value of of pixel is 0, the result |
170 | * for this pixel is that of image1; for a gray value | 170 | * for this pixel is that of image1; for a gray value |
171 | * of 1, the pixel of image2 is used; for a value | 171 | * of 1, the pixel of image2 is used; for a value |
172 | * inbetween, a corresponding blending is used. | 172 | * inbetween, a corresponding blending is used. |
173 | * @param channel The RBG channel to use for the blending decision. | 173 | * @param channel The RBG channel to use for the blending decision. |
174 | */ | 174 | */ |
175 | static QImage& blend(QImage &image1, QImage &image2, | 175 | static QImage& blend(QImage &image1, QImage &image2, |
176 | QImage &blendImage, RGBComponent channel); | 176 | QImage &blendImage, RGBComponent channel); |
177 | 177 | ||
178 | /** | 178 | /** |
179 | * Blend an image into another one, using alpha in the expected way. | 179 | * Blend an image into another one, using alpha in the expected way. |
180 | * @author Rik Hemsley (rikkus) <rik@kde.org> | 180 | * @author Rik Hemsley (rikkus) <rik@kde.org> |
181 | */ | 181 | */ |
182 | static bool blend(const QImage & upper, const QImage & lower, QImage & output); | 182 | static bool blend(const QImage & upper, const QImage & lower, QImage & output); |
183 | // Not yet... static bool blend(const QImage & image1, const QImage & image2, QImage & output, const QRect & destRect); | 183 | // Not yet... static bool blend(const QImage & image1, const QImage & image2, QImage & output, const QRect & destRect); |
184 | 184 | ||
185 | /** | 185 | /** |
186 | * Blend an image into another one, using alpha in the expected way and | 186 | * Blend an image into another one, using alpha in the expected way and |
187 | * over coordinates @p x and @p y with respect to the lower image. | 187 | * over coordinates @p x and @p y with respect to the lower image. |
188 | * The output is a QImage which is the @p upper image already blended | 188 | * The output is a QImage which is the @p upper image already blended |
189 | * with the @p lower one, so its size will be (in general) the same than | 189 | * with the @p lower one, so its size will be (in general) the same than |
190 | * @p upper instead of the same size than @p lower like the method above. | 190 | * @p upper instead of the same size than @p lower like the method above. |
191 | * In fact, the size of @p output is like upper's one only when it can be | 191 | * In fact, the size of @p output is like upper's one only when it can be |
192 | * painted on lower, if there has to be some clipping, output's size will | 192 | * painted on lower, if there has to be some clipping, output's size will |
193 | * be the clipped area and x and y will be set to the correct up-left corner | 193 | * be the clipped area and x and y will be set to the correct up-left corner |
194 | * where the clipped rectangle begins. | 194 | * where the clipped rectangle begins. |
195 | */ | 195 | */ |
196 | static bool blend(int &x, int &y, const QImage & upper, const QImage & lower, QImage & output); | 196 | static bool blend(int &x, int &y, const QImage & upper, const QImage & lower, QImage & output); |
197 | /** | 197 | /** |
198 | * Blend an image into another one, using alpha in the expected way and | 198 | * Blend an image into another one, using alpha in the expected way and |
199 | * over coordinates @p x and @p y with respect to the lower image. | 199 | * over coordinates @p x and @p y with respect to the lower image. |
200 | * The output is painted in the own @p lower image. This is an optimization | 200 | * The output is painted in the own @p lower image. This is an optimization |
201 | * of the blend method above provided by convenience. | 201 | * of the blend method above provided by convenience. |
202 | */ | 202 | */ |
203 | static bool blendOnLower(int x, int y, const QImage & upper, const QImage & lower); | 203 | static bool blendOnLower(int x, int y, const QImage & upper, const QImage & lower); |
204 | 204 | ||
205 | /** | 205 | /** |
206 | * Modifies the intensity of a pixmap's RGB channel component. | 206 | * Modifies the intensity of a pixmap's RGB channel component. |
207 | * | 207 | * |
208 | * @author Daniel M. Duley (mosfet) | 208 | * @author Daniel M. Duley (mosfet) |
209 | * @param image The QImage to process. | 209 | * @param image The QImage to process. |
210 | * @param percent Percent value. Use a negative value to dim. | 210 | * @param percent Percent value. Use a negative value to dim. |
211 | * @param channel Which channel(s) should be modified | 211 | * @param channel Which channel(s) should be modified |
212 | * @return The @p image, provided for convenience. | 212 | * @return The @p image, provided for convenience. |
213 | */ | 213 | */ |
214 | static QImage& channelIntensity(QImage &image, float percent, | 214 | static QImage& channelIntensity(QImage &image, float percent, |
215 | RGBComponent channel); | 215 | RGBComponent channel); |
216 | 216 | ||
217 | /** | 217 | /** |
218 | * Fade an image to a certain background color. | 218 | * Fade an image to a certain background color. |
219 | * | 219 | * |
220 | * The number of colors will not be changed. | 220 | * The number of colors will not be changed. |
221 | * | 221 | * |
222 | * @param image The QImage to process. | 222 | * @param img The QImage to process. |
223 | * @param val The strength of the effect. 0 <= val <= 1. | 223 | * @param val The strength of the effect. 0 <= val <= 1. |
224 | * @param color The background color. | 224 | * @param color The background color. |
225 | * @return Returns the @ref image(), provided for convenience. | 225 | * @return Returns the @ref image(), provided for convenience. |
226 | */ | 226 | */ |
227 | static QImage& fade(QImage &img, float val, const QColor &color); | 227 | static QImage& fade(QImage &img, float val, const QColor &color); |
228 | 228 | ||
229 | 229 | ||
230 | /** | 230 | /** |
231 | * This recolors a pixmap. The most dark color will become color a, | 231 | * This recolors a pixmap. The most dark color will become color a, |
232 | * the most bright one color b, and in between. | 232 | * the most bright one color b, and in between. |
233 | * | 233 | * |
234 | * @param image A QImage to process. | 234 | * @param image A QImage to process. |
235 | * @param ca Color a | 235 | * @param ca Color a |
236 | * @param cb Color b | 236 | * @param cb Color b |
237 | */ | 237 | */ |
238 | static QImage& flatten(QImage &image, const QColor &ca, | 238 | static QImage& flatten(QImage &image, const QColor &ca, |
239 | const QColor &cb, int ncols=0); | 239 | const QColor &cb, int ncols=0); |
240 | 240 | ||
241 | /** | 241 | /** |
242 | * Build a hash on any given @ref QImage | 242 | * Build a hash on any given @ref QImage |
243 | * | 243 | * |
244 | * @param image The QImage to process | 244 | * @param image The QImage to process |
245 | * @param lite The hash faces the indicated lighting (cardinal poles). | 245 | * @param lite The hash faces the indicated lighting (cardinal poles). |
246 | * @param spacing How many unmodified pixels inbetween hashes. | 246 | * @param spacing How many unmodified pixels inbetween hashes. |
247 | * @return Returns the @ref image(), provided for convenience. | 247 | * @return Returns the @ref image(), provided for convenience. |
248 | */ | 248 | */ |
249 | static QImage& hash(QImage &image, Lighting lite=NorthLite, | 249 | static QImage& hash(QImage &image, Lighting lite=NorthLite, |
250 | unsigned int spacing=0); | 250 | unsigned int spacing=0); |
251 | 251 | ||
252 | /** | 252 | /** |
253 | * Either brighten or dim the image by a specified percent. | 253 | * Either brighten or dim the image by a specified percent. |
254 | * For example, .50 will modify the colors by 50%. | 254 | * For example, .50 will modify the colors by 50%. |
255 | * | 255 | * |
256 | * @author Daniel M. Duley (mosfet) | 256 | * @author Daniel M. Duley (mosfet) |
257 | * @param image The QImage to process. | 257 | * @param image The QImage to process. |
258 | * @param percent The percent value. Use a negative value to dim. | 258 | * @param percent The percent value. Use a negative value to dim. |
259 | * @return Returns The @ref image(), provided for convenience. | 259 | * @return Returns The @ref image(), provided for convenience. |
260 | */ | 260 | */ |
261 | static QImage& intensity(QImage &image, float percent); | 261 | static QImage& intensity(QImage &image, float percent); |
262 | 262 | ||
263 | /** | 263 | /** |
264 | * Modulate the image with a color channel of another image. | 264 | * Modulate the image with a color channel of another image. |
265 | * | 265 | * |
266 | * @param image The QImage to modulate and result. | 266 | * @param image The QImage to modulate and result. |
267 | * @param modImage The QImage to use for modulation. | 267 | * @param modImage The QImage to use for modulation. |
268 | * @param reverse Invert the meaning of image/modImage; result is image! | 268 | * @param reverse Invert the meaning of image/modImage; result is image! |
269 | * @param type The modulation Type to use. | 269 | * @param type The modulation Type to use. |
270 | * @param factor The modulation amplitude; with 0 no effect [-200;200]. | 270 | * @param factor The modulation amplitude; with 0 no effect [-200;200]. |
271 | * @param channel The RBG channel of image2 to use for modulation. | 271 | * @param channel The RBG channel of image2 to use for modulation. |
272 | * @return Returns the @ref image(), provided for convenience. | 272 | * @return Returns the @ref image(), provided for convenience. |
273 | */ | 273 | */ |
274 | static QImage& modulate(QImage &image, QImage &modImage, bool reverse, | 274 | static QImage& modulate(QImage &image, QImage &modImage, bool reverse, |
275 | ModulationType type, int factor, RGBComponent channel); | 275 | ModulationType type, int factor, RGBComponent channel); |
276 | 276 | ||
277 | /** | 277 | /** |
278 | * Convert an image to grayscale. | 278 | * Convert an image to grayscale. |
279 | * | 279 | * |
280 | * @author Daniel M. Duley (mosfet) | 280 | * @author Daniel M. Duley (mosfet) |
281 | * @param image The @ref QImage to process. | 281 | * @param image The @ref QImage to process. |
282 | * @param fast Set to @p true in order to use a faster but non-photographic | 282 | * @param fast Set to @p true in order to use a faster but non-photographic |
283 | * quality algorithm. Appropriate for things such as toolbar icons. | 283 | * quality algorithm. Appropriate for things such as toolbar icons. |
284 | * @return Returns the @ref image(), provided for convenience. | 284 | * @return Returns the @ref image(), provided for convenience. |
285 | */ | 285 | */ |
286 | static QImage& toGray(QImage &image, bool fast = false); | 286 | static QImage& toGray(QImage &image, bool fast = false); |
287 | 287 | ||
288 | /** | 288 | /** |
289 | * Desaturate an image evenly. | 289 | * Desaturate an image evenly. |
290 | * | 290 | * |
291 | * @param image The QImage to process. | 291 | * @param image The QImage to process. |
292 | * @param desat A value between 0 and 1 setting the degree of desaturation | 292 | * @param desat A value between 0 and 1 setting the degree of desaturation |
293 | * @return Returns the @ref image(), provided for convenience. | 293 | * @return Returns the @ref image(), provided for convenience. |
294 | */ | 294 | */ |
295 | static QImage& desaturate(QImage &image, float desat = 0.3); | 295 | static QImage& desaturate(QImage &image, float desat = 0.3); |
296 | 296 | ||
297 | /** | 297 | /** |
298 | * Fast, but low quality contrast of an image. Also see contrastHSV. | 298 | * Fast, but low quality contrast of an image. Also see contrastHSV. |
299 | * | 299 | * |
300 | * @author Daniel M. Duley (mosfet) | 300 | * @author Daniel M. Duley (mosfet) |
301 | * @param image The QImage to process. | 301 | * @param image The QImage to process. |
302 | * @param c A contrast value between -255 to 255. | 302 | * @param c A contrast value between -255 to 255. |
303 | * @return The @ref image(), provided for convenience. | 303 | * @return The @ref image(), provided for convenience. |
304 | */ | 304 | */ |
305 | static QImage& contrast(QImage &image, int c); | 305 | static QImage& contrast(QImage &image, int c); |
306 | 306 | ||
307 | /** | 307 | /** |
308 | * Dither an image using Floyd-Steinberg dithering for low-color | 308 | * Dither an image using Floyd-Steinberg dithering for low-color |
309 | * situations. | 309 | * situations. |
310 | * | 310 | * |
311 | * @param image The QImage to process. | 311 | * @param img The QImage to process. |
312 | * @param palette The color palette to use | 312 | * @param palette The color palette to use |
313 | * @param size The size of the palette | 313 | * @param size The size of the palette |
314 | * @return Returns the @ref image(), provided for convenience. | 314 | * @return Returns the @ref image(), provided for convenience. |
315 | */ | 315 | */ |
316 | static QImage& dither(QImage &img, const QColor *palette, int size); | 316 | static QImage& dither(QImage &img, const QColor *palette, int size); |
317 | 317 | ||
318 | /** | 318 | /** |
319 | * Calculate the image for a selected image, for instance a selected icon | 319 | * Calculate the image for a selected image, for instance a selected icon |
320 | * on the desktop. | 320 | * on the desktop. |
321 | * @param img the QImage to select | 321 | * @param img the QImage to select |
322 | * @param col the selected color, usually from QColorGroup::highlight(). | 322 | * @param col the selected color, usually from QColorGroup::highlight(). |
323 | */ | 323 | */ |
324 | static QImage& selectedImage( QImage &img, const QColor &col ); | 324 | static QImage& selectedImage( QImage &img, const QColor &col ); |
325 | 325 | ||
326 | /** | 326 | /** |
327 | * High quality, expensive HSV contrast. You can do a faster one by just | 327 | * High quality, expensive HSV contrast. You can do a faster one by just |
328 | * taking a intensity threshold (ie: 128) and incrementing RGB color | 328 | * taking a intensity threshold (ie: 128) and incrementing RGB color |
329 | * channels above it and decrementing those below it, but this gives much | 329 | * channels above it and decrementing those below it, but this gives much |
330 | * better results. | 330 | * better results. |
331 | * | 331 | * |
332 | * @author Daniel M. Duley (mosfet) | 332 | * @author Daniel M. Duley (mosfet) |
333 | * @param img The QImage to process. | 333 | * @param img The QImage to process. |
334 | * @param sharpen If true sharpness is increase, (spiffed). Otherwise | 334 | * @param sharpen If true sharpness is increase, (spiffed). Otherwise |
335 | * it is decreased, (dulled). | 335 | * it is decreased, (dulled). |
336 | */ | 336 | */ |
337 | static void contrastHSV(QImage &img, bool sharpen=true); | 337 | static void contrastHSV(QImage &img, bool sharpen=true); |
338 | 338 | ||
339 | /** | 339 | /** |
340 | * Normalizes the pixel values to span the full range of color values. | 340 | * Normalizes the pixel values to span the full range of color values. |
341 | * This is a contrast enhancement technique. | 341 | * This is a contrast enhancement technique. |
342 | * @author Daniel M. Duley (mosfet) | 342 | * @author Daniel M. Duley (mosfet) |
343 | */ | 343 | */ |
344 | static void normalize(QImage &img); | 344 | static void normalize(QImage &img); |
345 | 345 | ||
346 | /** | 346 | /** |
347 | * Performs histogram equalization on the reference | 347 | * Performs histogram equalization on the reference |
348 | * image. | 348 | * image. |
349 | * @author Daniel M. Duley (mosfet) | 349 | * @author Daniel M. Duley (mosfet) |
350 | */ | 350 | */ |
351 | static void equalize(QImage &img); | 351 | static void equalize(QImage &img); |
352 | 352 | ||
353 | /** | 353 | /** |
354 | * Thresholds the reference image. You can also threshold images by using | 354 | * Thresholds the reference image. You can also threshold images by using |
355 | * ThresholdDither in the various QPixmap/QImage convert methods, but this | 355 | * ThresholdDither in the various QPixmap/QImage convert methods, but this |
356 | * lets you specify a threshold value. | 356 | * lets you specify a threshold value. |
357 | * | 357 | * |
358 | * @author Daniel M. Duley (mosfet) | 358 | * @author Daniel M. Duley (mosfet) |
359 | * @param img The QImage to process. | 359 | * @param img The QImage to process. |
360 | * @param value The threshold value. | 360 | * @param value The threshold value. |
361 | */ | 361 | */ |
362 | static void threshold(QImage &img, unsigned int value=128); | 362 | static void threshold(QImage &img, unsigned int value=128); |
363 | 363 | ||
364 | /** | 364 | /** |
365 | * Produces a 'solarization' effect seen when exposing a photographic | 365 | * Produces a 'solarization' effect seen when exposing a photographic |
366 | * film to light during the development process. | 366 | * film to light during the development process. |
367 | * | 367 | * |
368 | * @author Daniel M. Duley (mosfet) | 368 | * @author Daniel M. Duley (mosfet) |
369 | * @param img The QImage to process. | 369 | * @param img The QImage to process. |
370 | * @param factor The extent of the solarization (0-99.9) | 370 | * @param factor The extent of the solarization (0-99.9) |
371 | */ | 371 | */ |
372 | static void solarize(QImage &img, double factor=50.0); | 372 | static void solarize(QImage &img, double factor=50.0); |
373 | 373 | ||
374 | /** | 374 | /** |
375 | * Embosses the source image. This involves highlighting the edges | 375 | * Embosses the source image. This involves highlighting the edges |
376 | * and applying various other enhancements in order to get a metal | 376 | * and applying various other enhancements in order to get a metal |
377 | * effect. | 377 | * effect. |
378 | * | 378 | * |
379 | * @author Daniel M. Duley (mosfet) | 379 | * @author Daniel M. Duley (mosfet) |
380 | * @param src The QImage to process. | 380 | * @param src The QImage to process. |
381 | * @return The embossed image. The original is not changed. | 381 | * @return The embossed image. The original is not changed. |
382 | */ | 382 | */ |
383 | static QImage emboss(QImage &src); | 383 | static QImage emboss(QImage &src); |
384 | 384 | ||
385 | /** | 385 | /** |
386 | * Minimizes speckle noise in the source image using the 8 hull | 386 | * Minimizes speckle noise in the source image using the 8 hull |
387 | * algorithm. | 387 | * algorithm. |
388 | * | 388 | * |
389 | * @author Daniel M. Duley (mosfet) | 389 | * @author Daniel M. Duley (mosfet) |
390 | * @param src The QImage to process. | 390 | * @param src The QImage to process. |
391 | * @return The despeckled image. The original is not changed. | 391 | * @return The despeckled image. The original is not changed. |
392 | */ | 392 | */ |
393 | static QImage despeckle(QImage &src); | 393 | static QImage despeckle(QImage &src); |
394 | 394 | ||
395 | /** | 395 | /** |
396 | * Produces a neat little "charcoal" effect. | 396 | * Produces a neat little "charcoal" effect. |
397 | * | 397 | * |
398 | * @author Daniel M. Duley (mosfet) | 398 | * @author Daniel M. Duley (mosfet) |
399 | * @param src The QImage to process. | 399 | * @param src The QImage to process. |
400 | * @param factor The factor for detecting lines (0-99.0). | 400 | * @param factor The factor for detecting lines (0-99.0). |
401 | * @return The charcoal image. The original is not changed. | 401 | * @return The charcoal image. The original is not changed. |
402 | */ | 402 | */ |
403 | static QImage charcoal(QImage &src, double factor=50.0); | 403 | static QImage charcoal(QImage &src, double factor=50.0); |
404 | 404 | ||
405 | /** | 405 | /** |
406 | * Rotates the image by the specified amount | 406 | * Rotates the image by the specified amount |
407 | * | 407 | * |
408 | * @author Daniel M. Duley (mosfet) | 408 | * @author Daniel M. Duley (mosfet) |
409 | * @param src The QImage to process. | 409 | * @param src The QImage to process. |
410 | * @param r The rotate direction. | 410 | * @param r The rotate direction. |
411 | * @return The rotated image. The original is not changed. | 411 | * @return The rotated image. The original is not changed. |
412 | */ | 412 | */ |
413 | static QImage rotate(QImage &src, RotateDirection r); | 413 | static QImage rotate(QImage &src, RotateDirection r); |
414 | 414 | ||
415 | /** | 415 | /** |
416 | * Scales an image using simple pixel sampling. This does not produce | 416 | * Scales an image using simple pixel sampling. This does not produce |
417 | * nearly as nice a result as QImage::smoothScale(), but has the | 417 | * nearly as nice a result as QImage::smoothScale(), but has the |
418 | * advantage of being much faster - only a few milliseconds. | 418 | * advantage of being much faster - only a few milliseconds. |
419 | * | 419 | * |
420 | * @author Daniel M. Duley (mosfet) | 420 | * @author Daniel M. Duley (mosfet) |
421 | * @param src The QImage to process. | 421 | * @param src The QImage to process. |
422 | * @param w The new width. | 422 | * @param w The new width. |
423 | * @param h The new height. | 423 | * @param h The new height. |
424 | * @return The scaled image. The original is not changed. | 424 | * @return The scaled image. The original is not changed. |
425 | */ | 425 | */ |
426 | static QImage sample(QImage &src, int w, int h); | 426 | static QImage sample(QImage &src, int w, int h); |
427 | 427 | ||
428 | /** | 428 | /** |
429 | * Adds noise to an image. | 429 | * Adds noise to an image. |
430 | * | 430 | * |
431 | * @author Daniel M. Duley (mosfet) | 431 | * @author Daniel M. Duley (mosfet) |
432 | * @param src The QImage to process. | 432 | * @param src The QImage to process. |
433 | * @param type The algorithm used to generate the noise. | 433 | * @param type The algorithm used to generate the noise. |
434 | * @return The image with noise added. The original is not changed. | 434 | * @return The image with noise added. The original is not changed. |
435 | */ | 435 | */ |
436 | static QImage addNoise(QImage &src, NoiseType type = GaussianNoise); | 436 | static QImage addNoise(QImage &src, NoiseType type = GaussianNoise); |
437 | 437 | ||
438 | /** | 438 | /** |
439 | * Blurs an image by convolving pixel neighborhoods. | 439 | * Blurs an image by convolving pixel neighborhoods. |
440 | * | 440 | * |
441 | * @author Daniel M. Duley (mosfet) | 441 | * @author Daniel M. Duley (mosfet) |
442 | * @param src The QImage to process. | 442 | * @param src The QImage to process. |
443 | * @param factor The percent weight to give to the center pixel. | 443 | * @param factor The percent weight to give to the center pixel. |
444 | * @return The blurred image. The original is not changed. | 444 | * @return The blurred image. The original is not changed. |
445 | */ | 445 | */ |
446 | static QImage blur(QImage &src, double factor=50.0); | 446 | static QImage blur(QImage &src, double factor=50.0); |
447 | 447 | ||
448 | /** | 448 | /** |
449 | * Detects edges in an image using pixel neighborhoods and an edge | 449 | * Detects edges in an image using pixel neighborhoods and an edge |
450 | * detection mask. | 450 | * detection mask. |
451 | * | 451 | * |
452 | * @author Daniel M. Duley (mosfet) | 452 | * @author Daniel M. Duley (mosfet) |
453 | * @param src The QImage to process. | 453 | * @param src The QImage to process. |
454 | * @param factor The percent weight to give to the center pixel. | 454 | * @param factor The percent weight to give to the center pixel. |
455 | * @return The image with edges detected. The original is not changed. | 455 | * @return The image with edges detected. The original is not changed. |
456 | */ | 456 | */ |
457 | static QImage edge(QImage &src, double factor=50.0); | 457 | static QImage edge(QImage &src, double factor=50.0); |
458 | 458 | ||
459 | /** | 459 | /** |
460 | * Implodes an image by a specified percent. | 460 | * Implodes an image by a specified percent. |
461 | * | 461 | * |
462 | * @author Daniel M. Duley (mosfet) | 462 | * @author Daniel M. Duley (mosfet) |
463 | * @param src The QImage to process. | 463 | * @param src The QImage to process. |
464 | * @param factor The extent of the implosion. | 464 | * @param factor The extent of the implosion. |
465 | * @param background An RGBA value to use for the background. After the | 465 | * @param background An RGBA value to use for the background. After the |
466 | * effect some pixels may be "empty". This value is used for those pixels. | 466 | * effect some pixels may be "empty". This value is used for those pixels. |
467 | * @return The imploded image. The original is not changed. | 467 | * @return The imploded image. The original is not changed. |
468 | */ | 468 | */ |
469 | static QImage implode(QImage &src, double factor=30.0, | 469 | static QImage implode(QImage &src, double factor=30.0, |
470 | unsigned int background = 0xFFFFFFFF); | 470 | unsigned int background = 0xFFFFFFFF); |
471 | /** | 471 | /** |
472 | * Produces an oil painting effect. | 472 | * Produces an oil painting effect. |
473 | * | 473 | * |
474 | * @author Daniel M. Duley (mosfet) | 474 | * @author Daniel M. Duley (mosfet) |
475 | * @param src The QImage to process. | 475 | * @param src The QImage to process. |
476 | * @param radius The radius of the pixel neighborhood used in applying the | 476 | * @param radius The radius of the pixel neighborhood used in applying the |
477 | * effect. | 477 | * effect. |
478 | * @return The new image. The original is not changed. | 478 | * @return The new image. The original is not changed. |
479 | */ | 479 | */ |
480 | static QImage oilPaint(QImage &src, int radius=3); | 480 | static QImage oilPaint(QImage &src, int radius=3); |
481 | 481 | ||
482 | /** | 482 | /** |
483 | * Sharpens the pixels in the image using pixel neighborhoods. | 483 | * Sharpens the pixels in the image using pixel neighborhoods. |
484 | * | 484 | * |
485 | * @author Daniel M. Duley (mosfet) | 485 | * @author Daniel M. Duley (mosfet) |
486 | * @param src The QImage to process. | 486 | * @param src The QImage to process. |
487 | * @param factor The percent weight to give to the center pixel. | 487 | * @param factor The percent weight to give to the center pixel. |
488 | * @return The sharpened image. The original is not changed. | 488 | * @return The sharpened image. The original is not changed. |
489 | */ | 489 | */ |
490 | static QImage sharpen(QImage &src, double factor=30.0); | 490 | static QImage sharpen(QImage &src, double factor=30.0); |
491 | 491 | ||
492 | /** | 492 | /** |
493 | * Randomly displaces pixels. | 493 | * Randomly displaces pixels. |
494 | * | 494 | * |
495 | * @author Daniel M. Duley (mosfet) | 495 | * @author Daniel M. Duley (mosfet) |
496 | * @param src The QImage to process. | 496 | * @param src The QImage to process. |
497 | * @param amount The vicinity for choosing a random pixel to swap. | 497 | * @param amount The vicinity for choosing a random pixel to swap. |
498 | * @return The image with pixels displaced. The original is not changed. | 498 | * @return The image with pixels displaced. The original is not changed. |
499 | */ | 499 | */ |
500 | static QImage spread(QImage &src, unsigned int amount=3); | 500 | static QImage spread(QImage &src, unsigned int amount=3); |
501 | 501 | ||
502 | /** | 502 | /** |
503 | * Shades the image using a distance light source. | 503 | * Shades the image using a distance light source. |
504 | * | 504 | * |
505 | * @author Daniel M. Duley (mosfet) | 505 | * @author Daniel M. Duley (mosfet) |
506 | * @param src The QImage to process. | 506 | * @param src The QImage to process. |
507 | * @param color_shading If true do color shading, otherwise do grayscale. | 507 | * @param color_shading If true do color shading, otherwise do grayscale. |
508 | * @param azimuth Determines the light source and direction. | 508 | * @param azimuth Determines the light source and direction. |
509 | * @param elevation Determines the light source and direction. | 509 | * @param elevation Determines the light source and direction. |
510 | * @return The shaded image. The original is not changed. | 510 | * @return The shaded image. The original is not changed. |
511 | */ | 511 | */ |
512 | static QImage shade(QImage &src, bool color_shading=true, double azimuth=30.0, | 512 | static QImage shade(QImage &src, bool color_shading=true, double azimuth=30.0, |
513 | double elevation=30.0); | 513 | double elevation=30.0); |
514 | /** | 514 | /** |
515 | * Swirls the image by a specified amount | 515 | * Swirls the image by a specified amount |
516 | * | 516 | * |
517 | * @author Daniel M. Duley (mosfet) | 517 | * @author Daniel M. Duley (mosfet) |
518 | * @param src The QImage to process. | 518 | * @param src The QImage to process. |
519 | * @param degrees The tightness of the swirl. | 519 | * @param degrees The tightness of the swirl. |
520 | * @param background An RGBA value to use for the background. After the | 520 | * @param background An RGBA value to use for the background. After the |
521 | * effect some pixels may be "empty". This value is used for those pixels. | 521 | * effect some pixels may be "empty". This value is used for those pixels. |
522 | * @return The swirled image. The original is not changed. | 522 | * @return The swirled image. The original is not changed. |
523 | */ | 523 | */ |
524 | static QImage swirl(QImage &src, double degrees=50.0, unsigned int background = | 524 | static QImage swirl(QImage &src, double degrees=50.0, unsigned int background = |
525 | 0xFFFFFFFF); | 525 | 0xFFFFFFFF); |
526 | 526 | ||
527 | /** | 527 | /** |
528 | * Modifies the pixels along a sine wave. | 528 | * Modifies the pixels along a sine wave. |
529 | * | 529 | * |
530 | * @author Daniel M. Duley (mosfet) | 530 | * @author Daniel M. Duley (mosfet) |
531 | * @param src The QImage to process. | 531 | * @param src The QImage to process. |
532 | * @param amplitude The amplitude of the sine wave. | 532 | * @param amplitude The amplitude of the sine wave. |
533 | * @param wavelength The frequency of the sine wave. | 533 | * @param frequency The frequency of the sine wave. |
534 | * @return The new image. The original is not changed. | 534 | * @return The new image. The original is not changed. |
535 | */ | 535 | */ |
536 | static QImage wave(QImage &src, double amplitude=25.0, double frequency=150.0, | 536 | static QImage wave(QImage &src, double amplitude=25.0, double frequency=150.0, |
537 | unsigned int background = 0xFFFFFFFF); | 537 | unsigned int background = 0xFFFFFFFF); |
538 | 538 | ||
539 | private: | 539 | private: |
540 | 540 | ||
541 | /** | 541 | /** |
542 | * Helper function to fast calc some altered (lighten, shaded) colors | 542 | * Helper function to fast calc some altered (lighten, shaded) colors |
543 | * | 543 | * |
544 | */ | 544 | */ |
545 | static unsigned int lHash(unsigned int c); | 545 | static unsigned int lHash(unsigned int c); |
546 | static unsigned int uHash(unsigned int c); | 546 | static unsigned int uHash(unsigned int c); |
547 | 547 | ||
548 | /** | 548 | /** |
549 | * Helper function to find the nearest color to the RBG triplet | 549 | * Helper function to find the nearest color to the RBG triplet |
550 | */ | 550 | */ |
551 | static int nearestColor( int r, int g, int b, const QColor *pal, int size ); | 551 | static int nearestColor( int r, int g, int b, const QColor *pal, int size ); |
552 | 552 | ||
553 | static void hull(const int x_offset, const int y_offset, const int polarity, | 553 | static void hull(const int x_offset, const int y_offset, const int polarity, |
554 | const int width, const int height, | 554 | const int width, const int height, |
555 | unsigned int *f, unsigned int *g); | 555 | unsigned int *f, unsigned int *g); |
556 | static unsigned int generateNoise(unsigned int pixel, NoiseType type); | 556 | static unsigned int generateNoise(unsigned int pixel, NoiseType type); |
557 | static unsigned int interpolateColor(QImage *image, double x, double y, | 557 | static unsigned int interpolateColor(QImage *image, double x, double y, |
558 | unsigned int background); | 558 | unsigned int background); |
559 | }; | 559 | }; |
560 | 560 | ||
561 | } | 561 | } |
562 | } | 562 | } |
563 | 563 | ||
564 | #endif | 564 | #endif |
diff --git a/libopie2/opieui/opixmapeffect.h b/libopie2/opieui/opixmapeffect.h index b780f9f..85a1e25 100644 --- a/libopie2/opieui/opixmapeffect.h +++ b/libopie2/opieui/opixmapeffect.h | |||
@@ -1,219 +1,214 @@ | |||
1 | /* This file is part of the KDE libraries | 1 | /* This file is part of the KDE libraries |
2 | Copyright (C) 1998, 1999 Christian Tibirna <ctibirna@total.net> | 2 | Copyright (C) 1998, 1999 Christian Tibirna <ctibirna@total.net> |
3 | (C) 1998, 1999 Daniel M. Duley <mosfet@kde.org> | 3 | (C) 1998, 1999 Daniel M. Duley <mosfet@kde.org> |
4 | (C) 1998, 1999 Dirk A. Mueller <mueller@kde.org> | 4 | (C) 1998, 1999 Dirk A. Mueller <mueller@kde.org> |
5 | 5 | ||
6 | */ | 6 | */ |
7 | 7 | ||
8 | // $Id$ | 8 | // $Id$ |
9 | 9 | ||
10 | #ifndef __OPIXMAP_EFFECT_H | 10 | #ifndef __OPIXMAP_EFFECT_H |
11 | #define __OPIXMAP_EFFECT_H | 11 | #define __OPIXMAP_EFFECT_H |
12 | 12 | ||
13 | 13 | ||
14 | #include <qsize.h> | 14 | #include <qsize.h> |
15 | typedef QPixmap OPixmap; | 15 | typedef QPixmap OPixmap; |
16 | class QColor; | 16 | class QColor; |
17 | 17 | ||
18 | 18 | ||
19 | namespace Opie { | 19 | namespace Opie { |
20 | namespace Ui { | 20 | namespace Ui { |
21 | /** | 21 | /** |
22 | * This class includes various pixmap-based graphical effects. | 22 | * This class includes various pixmap-based graphical effects. |
23 | * | 23 | * |
24 | * Everything is | 24 | * Everything is |
25 | * static, so there is no need to create an instance of this class. You can | 25 | * static, so there is no need to create an instance of this class. You can |
26 | * just call the static methods. They are encapsulated here merely to provide | 26 | * just call the static methods. They are encapsulated here merely to provide |
27 | * a common namespace. | 27 | * a common namespace. |
28 | */ | 28 | */ |
29 | class OPixmapEffect | 29 | class OPixmapEffect |
30 | { | 30 | { |
31 | public: | 31 | public: |
32 | enum GradientType { VerticalGradient, HorizontalGradient, | 32 | enum GradientType { VerticalGradient, HorizontalGradient, |
33 | DiagonalGradient, CrossDiagonalGradient, | 33 | DiagonalGradient, CrossDiagonalGradient, |
34 | PyramidGradient, RectangleGradient, | 34 | PyramidGradient, RectangleGradient, |
35 | PipeCrossGradient, EllipticGradient }; | 35 | PipeCrossGradient, EllipticGradient }; |
36 | enum RGBComponent { Red, Green, Blue }; | 36 | enum RGBComponent { Red, Green, Blue }; |
37 | 37 | ||
38 | enum Lighting {NorthLite, NWLite, WestLite, SWLite, | 38 | enum Lighting {NorthLite, NWLite, WestLite, SWLite, |
39 | SouthLite, SELite, EastLite, NELite}; | 39 | SouthLite, SELite, EastLite, NELite}; |
40 | 40 | ||
41 | /** | 41 | /** |
42 | * Creates a gradient from color a to color b of the specified type. | 42 | * Creates a gradient from color a to color b of the specified type. |
43 | * | 43 | * |
44 | * @param pixmap The pixmap to process. | 44 | * @param pixmap The pixmap to process. |
45 | * @param ca Color a. | 45 | * @param ca Color a. |
46 | * @param cb Color b. | 46 | * @param cb Color b. |
47 | * @param type The type of gradient. | 47 | * @param type The type of gradient. |
48 | * @param ncols The number of colors to use when not running on a | 48 | * @param ncols The number of colors to use when not running on a |
49 | * truecolor display. The gradient will be dithered to this number of | 49 | * truecolor display. The gradient will be dithered to this number of |
50 | * colors. Pass 0 to prevent dithering. | 50 | * colors. Pass 0 to prevent dithering. |
51 | * @return Returns the generated pixmap, for convenience. | 51 | * @return Returns the generated pixmap, for convenience. |
52 | */ | 52 | */ |
53 | static OPixmap& gradient(OPixmap& pixmap, const QColor &ca, const QColor &cb, | 53 | static OPixmap& gradient(OPixmap& pixmap, const QColor &ca, const QColor &cb, |
54 | GradientType type, int ncols=3); | 54 | GradientType type, int ncols=3); |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * Creates an unbalanced gradient. | 57 | * Creates an unbalanced gradient. |
58 | * | 58 | * |
59 | * An unbalanced gradient is a gradient where the transition from | 59 | * An unbalanced gradient is a gradient where the transition from |
60 | * color a to color b is not linear, but in this case, exponential. | 60 | * color a to color b is not linear, but in this case, exponential. |
61 | * | 61 | * |
62 | * @param pixmap The pixmap that should be written. | 62 | * @param pixmap The pixmap that should be written. |
63 | * @param ca Color a. | 63 | * @param ca Color a. |
64 | * @param cb Color b. | 64 | * @param cb Color b. |
65 | * @param type The type of gradient. | 65 | * @param type The type of gradient. |
66 | * @param xfactor The x decay length. Use a value between -200 and 200. | 66 | * @param xfactor The x decay length. Use a value between -200 and 200. |
67 | * @param yfactor The y decay length. | 67 | * @param yfactor The y decay length. |
68 | * @param ncols The number of colors. See #gradient. | 68 | * @param ncols The number of colors. See #gradient. |
69 | * @return The generated pixmap, for convencience. | 69 | * @return The generated pixmap, for convencience. |
70 | */ | 70 | */ |
71 | static OPixmap& unbalancedGradient(OPixmap& pixmap, const QColor &ca, | 71 | static OPixmap& unbalancedGradient(OPixmap& pixmap, const QColor &ca, |
72 | const QColor &cb, GradientType type, int xfactor = 100, | 72 | const QColor &cb, GradientType type, int xfactor = 100, |
73 | int yfactor = 100, int ncols=3); | 73 | int yfactor = 100, int ncols=3); |
74 | 74 | ||
75 | /** | 75 | /** |
76 | * Creates a pixmap of a given size with the given pixmap. | 76 | * Creates a pixmap of a given size with the given pixmap. |
77 | * | 77 | * |
78 | * if the | 78 | * if the |
79 | * given size is bigger than the size of the pixmap, the pixmap is | 79 | * given size is bigger than the size of the pixmap, the pixmap is |
80 | * tiled. | 80 | * tiled. |
81 | * | 81 | * |
82 | * @param pixmap This is the source pixmap | 82 | * @param pixmap This is the source pixmap |
83 | * @param size The size the new pixmap should have. | 83 | * @param size The size the new pixmap should have. |
84 | * @return The generated, tiled pixmap. | 84 | * @return The generated, tiled pixmap. |
85 | */ | 85 | */ |
86 | static OPixmap createTiled(const OPixmap& pixmap, QSize size); | 86 | static OPixmap createTiled(const OPixmap& pixmap, QSize size); |
87 | 87 | ||
88 | /** | 88 | /** |
89 | * Either brightens or dims a pixmap by a specified ratio. | 89 | * Either brightens or dims a pixmap by a specified ratio. |
90 | * | 90 | * |
91 | * @param pixmap The pixmap to process. | 91 | * @param pixmap The pixmap to process. |
92 | * @param ratio The ratio to use. Use negative value to dim. | 92 | * @param ratio The ratio to use. Use negative value to dim. |
93 | * @return Returns The @ref pixmap(), provided for convenience. | 93 | * @return Returns The @ref pixmap(), provided for convenience. |
94 | */ | 94 | */ |
95 | static OPixmap& intensity(OPixmap& pixmap, float ratio); | 95 | static OPixmap& intensity(OPixmap& pixmap, float ratio); |
96 | 96 | ||
97 | /** | 97 | /** |
98 | * Modifies the intensity of a pixmap's RGB channel component. | 98 | * Modifies the intensity of a pixmap's RGB channel component. |
99 | * | 99 | * |
100 | * @param pixmap The pixmap to process. | 100 | * @param pixmap The pixmap to process. |
101 | * @param ratio value. Use negative value to dim. | 101 | * @param ratio value. Use negative value to dim. |
102 | * @param channel Which channel(s) should be modified | 102 | * @param channel Which channel(s) should be modified |
103 | * @return Returns the @ref pixmap(), provided for convenience. | 103 | * @return Returns the @ref pixmap(), provided for convenience. |
104 | */ | 104 | */ |
105 | static OPixmap& channelIntensity(OPixmap& pixmap, float ratio, | 105 | static OPixmap& channelIntensity(OPixmap& pixmap, float ratio, |
106 | RGBComponent channel); | 106 | RGBComponent channel); |
107 | 107 | ||
108 | /** | 108 | /** |
109 | * Blends the provided pixmap into a background of the indicated color. | 109 | * Blends the provided pixmap into a background of the indicated color. |
110 | * | 110 | * |
111 | * @param pixmap The pixmap to process. | 111 | * @param pixmap The pixmap to process. |
112 | * @param initial_intensity this parameter takes values from -1 to 1: | 112 | * @param initial_intensity this parameter takes values from -1 to 1: |
113 | * @li If positive, it tells how much to fade the image in its | 113 | * @li If positive, it tells how much to fade the image in its |
114 | * less affected spot. | 114 | * less affected spot. |
115 | * @li If negative, it tells roughly indicates how much of the image | 115 | * @li If negative, it tells roughly indicates how much of the image |
116 | * remains unaffected | 116 | * remains unaffected |
117 | * @param bgnd Indicates the color of the background to blend in. | 117 | * @param bgnd Indicates the color of the background to blend in. |
118 | * @param eff Lets you choose what kind of blending you like. | 118 | * @param eff Lets you choose what kind of blending you like. |
119 | * @param anti_dir Blend in the opposite direction (makes no much sense | 119 | * @param anti_dir Blend in the opposite direction (makes no much sense |
120 | * with concentric blending effects). | 120 | * with concentric blending effects). |
121 | * @return Returns the @ref pixmap(), provided for convenience. | 121 | * @return Returns the @ref pixmap(), provided for convenience. |
122 | */ | 122 | */ |
123 | static OPixmap& blend(OPixmap& pixmap, float initial_intensity, | 123 | static OPixmap& blend(OPixmap& pixmap, float initial_intensity, |
124 | const QColor &bgnd, GradientType eff, | 124 | const QColor &bgnd, GradientType eff, |
125 | bool anti_dir=false, int ncols=3); | 125 | bool anti_dir=false, int ncols=3); |
126 | 126 | ||
127 | /** | 127 | /** |
128 | * Builds a hash on any given pixmap. | 128 | * Builds a hash on any given pixmap. |
129 | * | 129 | * |
130 | * @param pixmap The pixmap to process. | 130 | * @param pixmap The pixmap to process. |
131 | * @param lite The hash faces the indicated lighting (cardinal poles) | 131 | * @param lite The hash faces the indicated lighting (cardinal poles) |
132 | * @param spacing How many unmodified pixels inbetween hashes. | 132 | * @param spacing How many unmodified pixels inbetween hashes. |
133 | * @return Returns The @ref pixmap(), provided for convenience. | 133 | * @return Returns The @ref pixmap(), provided for convenience. |
134 | */ | 134 | */ |
135 | static OPixmap& hash(OPixmap& pixmap, Lighting lite=NorthLite, | 135 | static OPixmap& hash(OPixmap& pixmap, Lighting lite=NorthLite, |
136 | unsigned int spacing=0, int ncols=3); | 136 | unsigned int spacing=0, int ncols=3); |
137 | 137 | ||
138 | /** | 138 | /** |
139 | * Creates a pattern from a pixmap. | 139 | * Creates a pattern from a pixmap. |
140 | * | 140 | * |
141 | * The given pixmap is "flattened" | 141 | * The given pixmap is "flattened" |
142 | * between color a to color b. | 142 | * between color a to color b. |
143 | * | 143 | * |
144 | * @param pixmap The pixmap to process. | 144 | * @param pixmap The pixmap to process. |
145 | * @param ca Color a. | 145 | * @param ca Color a. |
146 | * @param cb Color b. | 146 | * @param cb Color b. |
147 | * @param ncols The number of colors to use. The image will be | 147 | * @param ncols The number of colors to use. The image will be |
148 | * dithered to this depth. Pass zero to prevent dithering. | 148 | * dithered to this depth. Pass zero to prevent dithering. |
149 | * @return The @ref pixmap(), provided for convenience. | 149 | * @return The @ref pixmap(), provided for convenience. |
150 | */ | 150 | */ |
151 | static OPixmap pattern(const OPixmap& pixmap, QSize size, | 151 | static OPixmap pattern(const OPixmap& pixmap, QSize size, |
152 | const QColor &ca, const QColor &cb, int ncols=8); | 152 | const QColor &ca, const QColor &cb, int ncols=8); |
153 | 153 | ||
154 | /** | 154 | /** |
155 | * Recolors a pixmap. | 155 | * Fades a pixmap to a certain color. |
156 | * | ||
157 | * The most dark color will become color a, | ||
158 | * the most bright one color b, and in between. | ||
159 | * | 156 | * |
160 | * @param pixmap The pixmap to process. | 157 | * @param pixmap The pixmap to process. |
161 | * @param ca Color a. | 158 | * @param val The strength of the effect. 0 <= val <= 1. |
162 | * @param cb Color b. | 159 | * @param color The color to blend to. |
163 | * @param ncols The number of colors to use. Pass zero to prevent | ||
164 | * dithering. | ||
165 | * @return Returns the @ref pixmap(), provided for convenience. | 160 | * @return Returns the @ref pixmap(), provided for convenience. |
166 | */ | 161 | */ |
167 | static OPixmap& fade(OPixmap& pixmap, double val, const QColor &color); | 162 | static OPixmap& fade(OPixmap& pixmap, double val, const QColor &color); |
168 | 163 | ||
169 | /** | 164 | /** |
170 | * Converts a pixmap to grayscale. | 165 | * Converts a pixmap to grayscale. |
171 | * | 166 | * |
172 | * @param pixmap The pixmap to process. | 167 | * @param pixmap The pixmap to process. |
173 | * @param fast Set to @p true in order to use a faster but non-photographic | 168 | * @param fast Set to @p true in order to use a faster but non-photographic |
174 | * quality algorithm. Appropriate for things such as toolbar icons. | 169 | * quality algorithm. Appropriate for things such as toolbar icons. |
175 | * @return Returns the @ref pixmap(), provided for convenience. | 170 | * @return Returns the @ref pixmap(), provided for convenience. |
176 | */ | 171 | */ |
177 | static OPixmap& toGray(OPixmap& pixmap, bool fast=false); | 172 | static OPixmap& toGray(OPixmap& pixmap, bool fast=false); |
178 | 173 | ||
179 | /** | 174 | /** |
180 | * Desaturates a pixmap. | 175 | * Desaturates a pixmap. |
181 | * | 176 | * |
182 | * @param pixmap The pixmap to process. | 177 | * @param pixmap The pixmap to process. |
183 | * @param desat A value between 0 and 1 setting the degree of desaturation | 178 | * @param desat A value between 0 and 1 setting the degree of desaturation |
184 | * @return Returns The @ref pixmap(), provided for convenience. | 179 | * @return Returns The @ref pixmap(), provided for convenience. |
185 | */ | 180 | */ |
186 | static OPixmap& desaturate(OPixmap& pixmap, float desat = 0.3); | 181 | static OPixmap& desaturate(OPixmap& pixmap, float desat = 0.3); |
187 | 182 | ||
188 | /** | 183 | /** |
189 | * Modifies the contrast of a pixmap. | 184 | * Modifies the contrast of a pixmap. |
190 | * | 185 | * |
191 | * @param pixmap The pixmap to process. | 186 | * @param pixmap The pixmap to process. |
192 | * @param c A contrast value between -255 and 255. | 187 | * @param c A contrast value between -255 and 255. |
193 | * @return Returns the @ref pixmap(), provided for convenience. | 188 | * @return Returns the @ref pixmap(), provided for convenience. |
194 | */ | 189 | */ |
195 | static OPixmap& contrast(OPixmap& pixmap, int c); | 190 | static OPixmap& contrast(OPixmap& pixmap, int c); |
196 | 191 | ||
197 | /** | 192 | /** |
198 | * Dithers a pixmap using Floyd-Steinberg dithering for low-color | 193 | * Dithers a pixmap using Floyd-Steinberg dithering for low-color |
199 | * situations. | 194 | * situations. |
200 | * | 195 | * |
201 | * @param pixmap The pixmap to process. | 196 | * @param pixmap The pixmap to process. |
202 | * @param palette The color palette to use. | 197 | * @param palette The color palette to use. |
203 | * @param size The size of the palette. | 198 | * @param size The size of the palette. |
204 | * @return Returns the @ref pixmap(), provided for convenience. | 199 | * @return Returns the @ref pixmap(), provided for convenience. |
205 | */ | 200 | */ |
206 | static OPixmap& dither(OPixmap &pixmap, const QColor *palette, int size); | 201 | static OPixmap& dither(OPixmap &pixmap, const QColor *palette, int size); |
207 | 202 | ||
208 | /** | 203 | /** |
209 | * Calculate a 'selected' pixmap, for instance a selected icon | 204 | * Calculate a 'selected' pixmap, for instance a selected icon |
210 | * on the desktop. | 205 | * on the desktop. |
211 | * @param pixmap the pixmap to select | 206 | * @param pixmap the pixmap to select |
212 | * @param col the selected color, usually from QColorGroup::highlight(). | 207 | * @param col the selected color, usually from QColorGroup::highlight(). |
213 | */ | 208 | */ |
214 | static OPixmap selectedPixmap( const OPixmap &pixmap, const QColor &col ); | 209 | static OPixmap selectedPixmap( const OPixmap &pixmap, const QColor &col ); |
215 | }; | 210 | }; |
216 | } | 211 | } |
217 | } | 212 | } |
218 | 213 | ||
219 | #endif | 214 | #endif |
diff --git a/libopie2/qt3/opieui/ocombobox.h b/libopie2/qt3/opieui/ocombobox.h index 4e35b61..3f60f54 100644 --- a/libopie2/qt3/opieui/ocombobox.h +++ b/libopie2/qt3/opieui/ocombobox.h | |||
@@ -1,790 +1,790 @@ | |||
1 | /* | 1 | /* |
2 | This file Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 2 | This file Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
3 | is part of the Copyright (C) 2000 Carsten Pfeiffer <pfeiffer@kde.org> | 3 | is part of the Copyright (C) 2000 Carsten Pfeiffer <pfeiffer@kde.org> |
4 | Opie Project Copyright (C) 2000 Dawit Alemayehu <adawit@kde.org> | 4 | Opie Project Copyright (C) 2000 Dawit Alemayehu <adawit@kde.org> |
5 | 5 | ||
6 | =. Originally part of the KDE projects | 6 | =. Originally part of the KDE projects |
7 | .=l. | 7 | .=l. |
8 | .>+-= | 8 | .>+-= |
9 | _;:, .> :=|. This program is free software; you can | 9 | _;:, .> :=|. This program is free software; you can |
10 | .> <`_, > . <= redistribute it and/or modify it under | 10 | .> <`_, > . <= redistribute it and/or modify it under |
11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
12 | .="- .-=="i, .._ License as published by the Free Software | 12 | .="- .-=="i, .._ License as published by the Free Software |
13 | - . .-<_> .<> Foundation; either version 2 of the License, | 13 | - . .-<_> .<> Foundation; either version 2 of the License, |
14 | ._= =} : or (at your option) any later version. | 14 | ._= =} : or (at your option) any later version. |
15 | .%`+i> _;_. | 15 | .%`+i> _;_. |
16 | .i_,=:_. -<s. This program is distributed in the hope that | 16 | .i_,=:_. -<s. This program is distributed in the hope that |
17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
18 | : .. .:, . . . without even the implied warranty of | 18 | : .. .:, . . . without even the implied warranty of |
19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
21 | ..}^=.= = ; Library General Public License for more | 21 | ..}^=.= = ; Library General Public License for more |
22 | ++= -. .` .: details. | 22 | ++= -. .` .: details. |
23 | : = ...= . :.=- | 23 | : = ...= . :.=- |
24 | -. .:....=;==+<; You should have received a copy of the GNU | 24 | -. .:....=;==+<; You should have received a copy of the GNU |
25 | -_. . . )=. = Library General Public License along with | 25 | -_. . . )=. = Library General Public License along with |
26 | -- :-=` this library; see the file COPYING.LIB. | 26 | -- :-=` this library; see the file COPYING.LIB. |
27 | If not, write to the Free Software Foundation, | 27 | If not, write to the Free Software Foundation, |
28 | Inc., 59 Temple Place - Suite 330, | 28 | Inc., 59 Temple Place - Suite 330, |
29 | Boston, MA 02111-1307, USA. | 29 | Boston, MA 02111-1307, USA. |
30 | 30 | ||
31 | */ | 31 | */ |
32 | 32 | ||
33 | #ifndef OCOMBOBOX_H | 33 | #ifndef OCOMBOBOX_H |
34 | #define OCOMBOBOX_H | 34 | #define OCOMBOBOX_H |
35 | 35 | ||
36 | /* QT */ | 36 | /* QT */ |
37 | 37 | ||
38 | #include <qcombobox.h> | 38 | #include <qcombobox.h> |
39 | 39 | ||
40 | /* OPIE */ | 40 | /* OPIE */ |
41 | 41 | ||
42 | #include <opie2/olineedit.h> | 42 | #include <opie2/olineedit.h> |
43 | #include <opie2/ocompletion.h> | 43 | #include <opie2/ocompletion.h> |
44 | #include <opie2/ocompletionbase.h> | 44 | #include <opie2/ocompletionbase.h> |
45 | 45 | ||
46 | /* FORWARDS */ | 46 | /* FORWARDS */ |
47 | 47 | ||
48 | class QListBoxItem; | 48 | class QListBoxItem; |
49 | class QPopupMenu; | 49 | class QPopupMenu; |
50 | class OCompletionBox; | 50 | class OCompletionBox; |
51 | typedef QString OURL; | 51 | typedef QString OURL; |
52 | 52 | ||
53 | /** | 53 | /** |
54 | * A combined button, line-edit and a popup list widget. | 54 | * A combined button, line-edit and a popup list widget. |
55 | * | 55 | * |
56 | * @sect Detail | 56 | * @par Detail |
57 | * | 57 | * |
58 | * This widget inherits from @ref QComboBox and implements | 58 | * This widget inherits from @ref QComboBox and implements |
59 | * the following additional functionalities: a completion | 59 | * the following additional functionalities: a completion |
60 | * object that provides both automatic and manual text | 60 | * object that provides both automatic and manual text |
61 | * completion as well as text rotation features, configurable | 61 | * completion as well as text rotation features, configurable |
62 | * key-bindings to activate these features, and a popup-menu | 62 | * key-bindings to activate these features, and a popup-menu |
63 | * item that can be used to allow the user to set text completion | 63 | * item that can be used to allow the user to set text completion |
64 | * modes on the fly based on their preference. | 64 | * modes on the fly based on their preference. |
65 | * | 65 | * |
66 | * To support these new features OComboBox also emits a few | 66 | * To support these new features OComboBox also emits a few |
67 | * more additional signals as well. The main ones are the | 67 | * more additional signals as well. The main ones are the |
68 | * @ref completion( const QString& ) and @ref textRotation( KeyBindingType ) | 68 | * @ref completion( const QString& ) and @ref textRotation( KeyBindingType ) |
69 | * signals. The completion signal is intended to be connected to a slot | 69 | * signals. The completion signal is intended to be connected to a slot |
70 | * that will assist the user in filling out the remaining text while | 70 | * that will assist the user in filling out the remaining text while |
71 | * the rotation signals is intended to be used to traverse through all | 71 | * the rotation signals is intended to be used to traverse through all |
72 | * possible matches whenever text completion results in multiple matches. | 72 | * possible matches whenever text completion results in multiple matches. |
73 | * The @ref returnPressed() and @ref returnPressed( const QString& ) | 73 | * The @ref returnPressed() and @ref returnPressed( const QString& ) |
74 | * signal is emitted when the user presses the Enter/Return key. | 74 | * signal is emitted when the user presses the Enter/Return key. |
75 | * | 75 | * |
76 | * This widget by default creates a completion object when you invoke | 76 | * This widget by default creates a completion object when you invoke |
77 | * the @ref completionObject( bool ) member function for the first time | 77 | * the @ref completionObject( bool ) member function for the first time |
78 | * or use @ref setCompletionObject( OCompletion*, bool ) to assign your | 78 | * or use @ref setCompletionObject( OCompletion*, bool ) to assign your |
79 | * own completion object. Additionally, to make this widget more functional, | 79 | * own completion object. Additionally, to make this widget more functional, |
80 | * OComboBox will by default handle the text rotation and completion | 80 | * OComboBox will by default handle the text rotation and completion |
81 | * events internally whenever a completion object is created through either | 81 | * events internally whenever a completion object is created through either |
82 | * one of the methods mentioned above. If you do not need this functionality, | 82 | * one of the methods mentioned above. If you do not need this functionality, |
83 | * simply use @ref OCompletionBase::setHandleSignals( bool ) or alternatively | 83 | * simply use @ref OCompletionBase::setHandleSignals( bool ) or alternatively |
84 | * set the boolean parameter in the above methods to FALSE. | 84 | * set the boolean parameter in the above methods to FALSE. |
85 | * | 85 | * |
86 | * The default key-bindings for completion and rotation is determined | 86 | * The default key-bindings for completion and rotation is determined |
87 | * from the global settings in @ref OStdAccel. These values, however, | 87 | * from the global settings in @ref OStdAccel. These values, however, |
88 | * can be overriden locally by invoking @ref OCompletionBase::setKeyBinding(). | 88 | * can be overriden locally by invoking @ref OCompletionBase::setKeyBinding(). |
89 | * The values can easily be reverted back to the default setting, by simply | 89 | * The values can easily be reverted back to the default setting, by simply |
90 | * calling @ref useGlobalSettings(). An alternate method would be to default | 90 | * calling @ref useGlobalSettings(). An alternate method would be to default |
91 | * individual key-bindings by usning @ref setKeyBinding() with the default | 91 | * individual key-bindings by usning @ref setKeyBinding() with the default |
92 | * second argument. | 92 | * second argument. |
93 | * | 93 | * |
94 | * Note that if this widget is not editable ( i.e. select-only ), then only | 94 | * Note that if this widget is not editable ( i.e. select-only ), then only |
95 | * one completion mode, @p CompletionAuto, will work. All the other modes are | 95 | * one completion mode, @p CompletionAuto, will work. All the other modes are |
96 | * simply ignored. The @p CompletionAuto mode in this case allows you to | 96 | * simply ignored. The @p CompletionAuto mode in this case allows you to |
97 | * automatically select an item from the list by trying to match the pressed | 97 | * automatically select an item from the list by trying to match the pressed |
98 | * keycode with the first letter of the enteries in the combo box. | 98 | * keycode with the first letter of the enteries in the combo box. |
99 | * | 99 | * |
100 | * @sect Useage | 100 | * @par Usage |
101 | * | 101 | * |
102 | * To enable the basic completion feature: | 102 | * To enable the basic completion feature: |
103 | * | 103 | * |
104 | * <pre> | 104 | * <pre> |
105 | * OComboBox *combo = new OComboBox( true, this, "mywidget" ); | 105 | * OComboBox *combo = new OComboBox( true, this, "mywidget" ); |
106 | * OCompletion *comp = combo->completionObject(); | 106 | * OCompletion *comp = combo->completionObject(); |
107 | * // Connect to the return pressed signal - optional | 107 | * // Connect to the return pressed signal - optional |
108 | * connect(combo,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); | 108 | * connect(combo,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); |
109 | * </pre> | 109 | * </pre> |
110 | * | 110 | * |
111 | * To use your own completion object: | 111 | * To use your own completion object: |
112 | * | 112 | * |
113 | * <pre> | 113 | * <pre> |
114 | * OComboBox *combo = new OComboBox( this,"mywidget" ); | 114 | * OComboBox *combo = new OComboBox( this,"mywidget" ); |
115 | * OURLCompletion *comp = new OURLCompletion(); | 115 | * OURLCompletion *comp = new OURLCompletion(); |
116 | * combo->setCompletionObject( comp ); | 116 | * combo->setCompletionObject( comp ); |
117 | * // Connect to the return pressed signal - optional | 117 | * // Connect to the return pressed signal - optional |
118 | * connect(combo,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); | 118 | * connect(combo,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); |
119 | * </pre> | 119 | * </pre> |
120 | * | 120 | * |
121 | * Note that you have to either delete the allocated completion object | 121 | * Note that you have to either delete the allocated completion object |
122 | * when you don't need it anymore, or call | 122 | * when you don't need it anymore, or call |
123 | * setAutoDeleteCompletionObject( true ); | 123 | * setAutoDeleteCompletionObject( true ); |
124 | * | 124 | * |
125 | * Miscellaneous function calls: | 125 | * Miscellaneous function calls: |
126 | * | 126 | * |
127 | * <pre> | 127 | * <pre> |
128 | * // Tell the widget not to handle completion and rotation | 128 | * // Tell the widget not to handle completion and rotation |
129 | * combo->setHandleSignals( false ); | 129 | * combo->setHandleSignals( false ); |
130 | * // Set your own completion key for manual completions. | 130 | * // Set your own completion key for manual completions. |
131 | * combo->setKeyBinding( OCompletionBase::TextCompletion, Qt::End ); | 131 | * combo->setKeyBinding( OCompletionBase::TextCompletion, Qt::End ); |
132 | * // Hide the context (popup) menu | 132 | * // Hide the context (popup) menu |
133 | * combo->setContextMenuEnabled( false ); | 133 | * combo->setContextMenuEnabled( false ); |
134 | * // Temporarly disable signal emition | 134 | * // Temporarly disable signal emition |
135 | * combo->disableSignals(); | 135 | * combo->disableSignals(); |
136 | * // Default the all key-bindings to their system-wide settings. | 136 | * // Default the all key-bindings to their system-wide settings. |
137 | * combo->useGlobalKeyBindings(); | 137 | * combo->useGlobalKeyBindings(); |
138 | * </pre> | 138 | * </pre> |
139 | * | 139 | * |
140 | * @short An enhanced combo box. | 140 | * @short An enhanced combo box. |
141 | * @author Dawit Alemayehu <adawit@kde.org> | 141 | * @author Dawit Alemayehu <adawit@kde.org> |
142 | */ | 142 | */ |
143 | class OComboBox : public QComboBox, public OCompletionBase | 143 | class OComboBox : public QComboBox, public OCompletionBase |
144 | { | 144 | { |
145 | Q_OBJECT | 145 | Q_OBJECT |
146 | 146 | ||
147 | //Q_PROPERTY( bool autoCompletion READ autoCompletion WRITE setAutoCompletion ) | 147 | //Q_PROPERTY( bool autoCompletion READ autoCompletion WRITE setAutoCompletion ) |
148 | //Q_PROPERTY( bool contextMenuEnabled READ isContextMenuEnabled WRITE setContextMenuEnabled ) | 148 | //Q_PROPERTY( bool contextMenuEnabled READ isContextMenuEnabled WRITE setContextMenuEnabled ) |
149 | //Q_PROPERTY( bool urlDropsEnabled READ isURLDropsEnabled WRITE setURLDropsEnabled ) | 149 | //Q_PROPERTY( bool urlDropsEnabled READ isURLDropsEnabled WRITE setURLDropsEnabled ) |
150 | 150 | ||
151 | public: | 151 | public: |
152 | 152 | ||
153 | /** | 153 | /** |
154 | * Constructs a read-only or rather select-only combo box with a | 154 | * Constructs a read-only or rather select-only combo box with a |
155 | * parent object and a name. | 155 | * parent object and a name. |
156 | * | 156 | * |
157 | * @param parent The parent object of this widget | 157 | * @param parent The parent object of this widget |
158 | * @param name The name of this widget | 158 | * @param name The name of this widget |
159 | */ | 159 | */ |
160 | OComboBox( QWidget *parent=0, const char *name=0 ); | 160 | OComboBox( QWidget *parent=0, const char *name=0 ); |
161 | 161 | ||
162 | /** | 162 | /** |
163 | * Constructs a "read-write" or "read-only" combo box depending on | 163 | * Constructs a "read-write" or "read-only" combo box depending on |
164 | * the value of the first argument( @p rw ) with a parent, a | 164 | * the value of the first argument( @p rw ) with a parent, a |
165 | * name. | 165 | * name. |
166 | * | 166 | * |
167 | * @param rw When @p true, widget will be editable. | 167 | * @param rw When @p true, widget will be editable. |
168 | * @param parent The parent object of this widget. | 168 | * @param parent The parent object of this widget. |
169 | * @param name The name of this widget. | 169 | * @param name The name of this widget. |
170 | */ | 170 | */ |
171 | OComboBox( bool rw, QWidget *parent=0, const char *name=0 ); | 171 | OComboBox( bool rw, QWidget *parent=0, const char *name=0 ); |
172 | 172 | ||
173 | /** | 173 | /** |
174 | * Destructor. | 174 | * Destructor. |
175 | */ | 175 | */ |
176 | virtual ~OComboBox(); | 176 | virtual ~OComboBox(); |
177 | 177 | ||
178 | /** | 178 | /** |
179 | * Sets @p url into the edit field of the combobox. It uses | 179 | * Sets @p url into the edit field of the combobox. It uses |
180 | * @ref OURL::prettyURL() so that the url is properly decoded for | 180 | * @ref OURL::prettyURL() so that the url is properly decoded for |
181 | * displaying. | 181 | * displaying. |
182 | */ | 182 | */ |
183 | //void setEditURL( const OURL& url ); | 183 | //void setEditURL( const OURL& url ); |
184 | 184 | ||
185 | /** | 185 | /** |
186 | * Inserts @p url at position @p index into the combobox. The item will | 186 | * Inserts @p url at position @p index into the combobox. The item will |
187 | * be appended if @p index is negative. @ref OURL::prettyURL() is used | 187 | * be appended if @p index is negative. @ref OURL::prettyURL() is used |
188 | * so that the url is properly decoded for displaying. | 188 | * so that the url is properly decoded for displaying. |
189 | */ | 189 | */ |
190 | //void insertURL( const OURL& url, int index = -1 ); | 190 | //void insertURL( const OURL& url, int index = -1 ); |
191 | 191 | ||
192 | /** | 192 | /** |
193 | * Inserts @p url with the pixmap &p pixmap at position @p index into | 193 | * Inserts @p url with the pixmap &p pixmap at position @p index into |
194 | * the combobox. The item will be appended if @p index is negative. | 194 | * the combobox. The item will be appended if @p index is negative. |
195 | * @ref OURL::prettyURL() is used so that the url is properly decoded | 195 | * @ref OURL::prettyURL() is used so that the url is properly decoded |
196 | * for displaying. | 196 | * for displaying. |
197 | */ | 197 | */ |
198 | //void insertURL( const QPixmap& pixmap, const OURL& url, int index = -1 ); | 198 | //void insertURL( const QPixmap& pixmap, const OURL& url, int index = -1 ); |
199 | 199 | ||
200 | /** | 200 | /** |
201 | * Replaces the item at position @p index with @p url. | 201 | * Replaces the item at position @p index with @p url. |
202 | * @ref OURL::prettyURL() is used so that the url is properly decoded | 202 | * @ref OURL::prettyURL() is used so that the url is properly decoded |
203 | * for displaying. | 203 | * for displaying. |
204 | */ | 204 | */ |
205 | //void changeURL( const OURL& url, int index ); | 205 | //void changeURL( const OURL& url, int index ); |
206 | 206 | ||
207 | /** | 207 | /** |
208 | * Replaces the item at position @p index with @p url and pixmap @p pixmap. | 208 | * Replaces the item at position @p index with @p url and pixmap @p pixmap. |
209 | * @ref OURL::prettyURL() is used so that the url is properly decoded | 209 | * @ref OURL::prettyURL() is used so that the url is properly decoded |
210 | * for displaying. | 210 | * for displaying. |
211 | */ | 211 | */ |
212 | //void changeURL( const QPixmap& pixmap, const OURL& url, int index ); | 212 | //void changeURL( const QPixmap& pixmap, const OURL& url, int index ); |
213 | 213 | ||
214 | /** | 214 | /** |
215 | * Returns the current cursor position. | 215 | * Returns the current cursor position. |
216 | * | 216 | * |
217 | * This method always returns a -1 if the combo-box is @em not | 217 | * This method always returns a -1 if the combo-box is @em not |
218 | * editable (read-write). | 218 | * editable (read-write). |
219 | * | 219 | * |
220 | * @return Current cursor position. | 220 | * @return Current cursor position. |
221 | */ | 221 | */ |
222 | int cursorPosition() const { return ( lineEdit() ) ? lineEdit()->cursorPosition() : -1; } | 222 | int cursorPosition() const { return ( lineEdit() ) ? lineEdit()->cursorPosition() : -1; } |
223 | 223 | ||
224 | /** | 224 | /** |
225 | * Re-implemented from @ref QComboBox. | 225 | * Re-implemented from @ref QComboBox. |
226 | * | 226 | * |
227 | * If @p true, the completion mode will be set to automatic. | 227 | * If @p true, the completion mode will be set to automatic. |
228 | * Otherwise, it is defaulted to the global setting. This | 228 | * Otherwise, it is defaulted to the global setting. This |
229 | * method has been replaced by the more comprehensive | 229 | * method has been replaced by the more comprehensive |
230 | * @ref setCompletionMode(). | 230 | * @ref setCompletionMode(). |
231 | * | 231 | * |
232 | * @param autocomplete Flag to enable/disable automatic completion mode. | 232 | * @param autocomplete Flag to enable/disable automatic completion mode. |
233 | */ | 233 | */ |
234 | virtual void setAutoCompletion( bool autocomplete ); | 234 | virtual void setAutoCompletion( bool autocomplete ); |
235 | 235 | ||
236 | /** | 236 | /** |
237 | * Re-implemented from QComboBox. | 237 | * Re-implemented from QComboBox. |
238 | * | 238 | * |
239 | * Returns @p true if the current completion mode is set | 239 | * Returns @p true if the current completion mode is set |
240 | * to automatic. See its more comprehensive replacement | 240 | * to automatic. See its more comprehensive replacement |
241 | * @ref completionMode(). | 241 | * @ref completionMode(). |
242 | * | 242 | * |
243 | * @return @p true when completion mode is automatic. | 243 | * @return @p true when completion mode is automatic. |
244 | */ | 244 | */ |
245 | bool autoCompletion() const { | 245 | bool autoCompletion() const { |
246 | return completionMode() == OGlobalSettings::CompletionAuto; | 246 | return completionMode() == OGlobalSettings::CompletionAuto; |
247 | } | 247 | } |
248 | 248 | ||
249 | /** | 249 | /** |
250 | * Enables or disable the popup (context) menu. | 250 | * Enables or disable the popup (context) menu. |
251 | * | 251 | * |
252 | * This method only works if this widget is editable, i.e. | 252 | * This method only works if this widget is editable, i.e. |
253 | * read-write and allows you to enable/disable the context | 253 | * read-write and allows you to enable/disable the context |
254 | * menu. It does nothing if invoked for a none-editable | 254 | * menu. It does nothing if invoked for a none-editable |
255 | * combo-box. Note that by default the mode changer item | 255 | * combo-box. Note that by default the mode changer item |
256 | * is made visiable whenever the context menu is enabled. | 256 | * is made visiable whenever the context menu is enabled. |
257 | * Use @ref hideModechanger() if you want to hide this | 257 | * Use @ref hideModechanger() if you want to hide this |
258 | * item. Also by default, the context menu is created if | 258 | * item. Also by default, the context menu is created if |
259 | * this widget is editable. Call this function with the | 259 | * this widget is editable. Call this function with the |
260 | * argument set to false to disable the popup menu. | 260 | * argument set to false to disable the popup menu. |
261 | * | 261 | * |
262 | * @param showMenu If @p true, show the context menu. | 262 | * @param showMenu If @p true, show the context menu. |
263 | * @param showMode If @p true, show the mode changer. | 263 | * @param showMode If @p true, show the mode changer. |
264 | */ | 264 | */ |
265 | virtual void setContextMenuEnabled( bool showMenu ); | 265 | virtual void setContextMenuEnabled( bool showMenu ); |
266 | 266 | ||
267 | /** | 267 | /** |
268 | * Returns @p true when the context menu is enabled. | 268 | * Returns @p true when the context menu is enabled. |
269 | */ | 269 | */ |
270 | bool isContextMenuEnabled() const { return m_bEnableMenu; } | 270 | bool isContextMenuEnabled() const { return m_bEnableMenu; } |
271 | 271 | ||
272 | /** | 272 | /** |
273 | * Enables/Disables handling of URL drops. If enabled and the user | 273 | * Enables/Disables handling of URL drops. If enabled and the user |
274 | * drops an URL, the decoded URL will be inserted. Otherwise the default | 274 | * drops an URL, the decoded URL will be inserted. Otherwise the default |
275 | * behaviour of QComboBox is used, which inserts the encoded URL. | 275 | * behaviour of QComboBox is used, which inserts the encoded URL. |
276 | * | 276 | * |
277 | * @param enable If @p true, insert decoded URLs | 277 | * @param enable If @p true, insert decoded URLs |
278 | */ | 278 | */ |
279 | //void setURLDropsEnabled( bool enable ); | 279 | //void setURLDropsEnabled( bool enable ); |
280 | 280 | ||
281 | /** | 281 | /** |
282 | * Returns @p true when decoded URL drops are enabled | 282 | * Returns @p true when decoded URL drops are enabled |
283 | */ | 283 | */ |
284 | //bool isURLDropsEnabled() const; | 284 | //bool isURLDropsEnabled() const; |
285 | 285 | ||
286 | /** | 286 | /** |
287 | * Convenience method which iterates over all items and checks if | 287 | * Convenience method which iterates over all items and checks if |
288 | * any of them is equal to @p text. | 288 | * any of them is equal to @p text. |
289 | * | 289 | * |
290 | * If @p text is an empty string, @p false | 290 | * If @p text is an empty string, @p false |
291 | * is returned. | 291 | * is returned. |
292 | * | 292 | * |
293 | * @return @p true if an item with the string @p text is in the combobox. | 293 | * @return @p true if an item with the string @p text is in the combobox. |
294 | */ | 294 | */ |
295 | bool contains( const QString& text ) const; | 295 | bool contains( const QString& text ) const; |
296 | 296 | ||
297 | /** | 297 | /** |
298 | * By default, OComboBox recognizes Key_Return and Key_Enter | 298 | * By default, OComboBox recognizes Key_Return and Key_Enter |
299 | * and emits | 299 | * and emits |
300 | * the @ref returnPressed() signals, but it also lets the event pass, | 300 | * the @ref returnPressed() signals, but it also lets the event pass, |
301 | * for example causing a dialog's default-button to be called. | 301 | * for example causing a dialog's default-button to be called. |
302 | * | 302 | * |
303 | * Call this method with @p trap equal to true to make OComboBox | 303 | * Call this method with @p trap equal to true to make OComboBox |
304 | * stop these | 304 | * stop these |
305 | * events. The signals will still be emitted of course. | 305 | * events. The signals will still be emitted of course. |
306 | * | 306 | * |
307 | * Only affects read-writable comboboxes. | 307 | * Only affects read-writable comboboxes. |
308 | * | 308 | * |
309 | * @see setTrapReturnKey() | 309 | * @see setTrapReturnKey() |
310 | */ | 310 | */ |
311 | void setTrapReturnKey( bool trap ); | 311 | void setTrapReturnKey( bool trap ); |
312 | 312 | ||
313 | /** | 313 | /** |
314 | * @return @p true if keyevents of Key_Return or Key_Enter will | 314 | * @return @p true if keyevents of Key_Return or Key_Enter will |
315 | * be stopped or if they will be propagated. | 315 | * be stopped or if they will be propagated. |
316 | * | 316 | * |
317 | * @see setTrapReturnKey () | 317 | * @see setTrapReturnKey () |
318 | */ | 318 | */ |
319 | bool trapReturnKey() const; | 319 | bool trapReturnKey() const; |
320 | 320 | ||
321 | /** | 321 | /** |
322 | * Re-implemented for internal reasons. API not affected. | 322 | * Re-implemented for internal reasons. API not affected. |
323 | * | 323 | * |
324 | * @reimplemented | 324 | * @reimplemented |
325 | */ | 325 | */ |
326 | virtual bool eventFilter( QObject *, QEvent * ); | 326 | virtual bool eventFilter( QObject *, QEvent * ); |
327 | 327 | ||
328 | /** | 328 | /** |
329 | * @returns the completion-box, that is used in completion mode | 329 | * @returns the completion-box, that is used in completion mode |
330 | * @ref OGlobalSettings::CompletionPopup and @ref OGlobalSettings::CompletionPopupAuto. | 330 | * @ref OGlobalSettings::CompletionPopup and @ref OGlobalSettings::CompletionPopupAuto. |
331 | * This method will create a completion-box by calling | 331 | * This method will create a completion-box by calling |
332 | * @ref OLineEdit::completionBox, if none is there, yet. | 332 | * @ref OLineEdit::completionBox, if none is there, yet. |
333 | * | 333 | * |
334 | * @param create Set this to false if you don't want the box to be created | 334 | * @param create Set this to false if you don't want the box to be created |
335 | * i.e. to test if it is available. | 335 | * i.e. to test if it is available. |
336 | */ | 336 | */ |
337 | OCompletionBox * completionBox( bool create = true ); | 337 | OCompletionBox * completionBox( bool create = true ); |
338 | 338 | ||
339 | virtual void setLineEdit( OLineEdit * ); | 339 | virtual void setLineEdit( OLineEdit * ); |
340 | 340 | ||
341 | signals: | 341 | signals: |
342 | /** | 342 | /** |
343 | * Emitted when the user presses the Enter key. | 343 | * Emitted when the user presses the Enter key. |
344 | * | 344 | * |
345 | * Note that this signal is only | 345 | * Note that this signal is only |
346 | * emitted if this widget is editable. | 346 | * emitted if this widget is editable. |
347 | */ | 347 | */ |
348 | void returnPressed(); | 348 | void returnPressed(); |
349 | 349 | ||
350 | /** | 350 | /** |
351 | * Emitted when the user presses | 351 | * Emitted when the user presses |
352 | * the Enter key. | 352 | * the Enter key. |
353 | * | 353 | * |
354 | * The argument is the current | 354 | * The argument is the current |
355 | * text being edited. This signal is just like | 355 | * text being edited. This signal is just like |
356 | * @ref returnPressed() except it contains the | 356 | * @ref returnPressed() except it contains the |
357 | * current text as its argument. | 357 | * current text as its argument. |
358 | * | 358 | * |
359 | * Note that this signal is only emitted if this | 359 | * Note that this signal is only emitted if this |
360 | * widget is editable. | 360 | * widget is editable. |
361 | */ | 361 | */ |
362 | void returnPressed( const QString& ); | 362 | void returnPressed( const QString& ); |
363 | 363 | ||
364 | /** | 364 | /** |
365 | * This signal is emitted when the completion key | 365 | * This signal is emitted when the completion key |
366 | * is pressed. | 366 | * is pressed. |
367 | * | 367 | * |
368 | * The argument is the current text | 368 | * The argument is the current text |
369 | * being edited. | 369 | * being edited. |
370 | * | 370 | * |
371 | * Note that this signal is @em not available if this | 371 | * Note that this signal is @em not available if this |
372 | * widget is non-editable or the completion mode is | 372 | * widget is non-editable or the completion mode is |
373 | * set to @p OGlobalSettings::CompletionNone. | 373 | * set to @p OGlobalSettings::CompletionNone. |
374 | */ | 374 | */ |
375 | void completion( const QString& ); | 375 | void completion( const QString& ); |
376 | 376 | ||
377 | /** | 377 | /** |
378 | * Emitted when the shortcut for substring completion is pressed. | 378 | * Emitted when the shortcut for substring completion is pressed. |
379 | */ | 379 | */ |
380 | void substringCompletion( const QString& ); | 380 | void substringCompletion( const QString& ); |
381 | 381 | ||
382 | /** | 382 | /** |
383 | * Emitted when the text rotation key-bindings are pressed. | 383 | * Emitted when the text rotation key-bindings are pressed. |
384 | * | 384 | * |
385 | * The argument indicates which key-binding was pressed. | 385 | * The argument indicates which key-binding was pressed. |
386 | * In this case this can be either one of four values: | 386 | * In this case this can be either one of four values: |
387 | * @p PrevCompletionMatch, @p NextCompletionMatch, @p RotateUp or | 387 | * @p PrevCompletionMatch, @p NextCompletionMatch, @p RotateUp or |
388 | * @p RotateDown. See @ref OCompletionBase::setKeyBinding() for | 388 | * @p RotateDown. See @ref OCompletionBase::setKeyBinding() for |
389 | * details. | 389 | * details. |
390 | * | 390 | * |
391 | * Note that this signal is @em NOT emitted if the completion | 391 | * Note that this signal is @em NOT emitted if the completion |
392 | * mode is set to CompletionNone. | 392 | * mode is set to CompletionNone. |
393 | */ | 393 | */ |
394 | void textRotation( OCompletionBase::KeyBindingType ); | 394 | void textRotation( OCompletionBase::KeyBindingType ); |
395 | 395 | ||
396 | /** | 396 | /** |
397 | * Emitted when the user changed the completion mode by using the | 397 | * Emitted when the user changed the completion mode by using the |
398 | * popupmenu. | 398 | * popupmenu. |
399 | */ | 399 | */ |
400 | void completionModeChanged( OGlobalSettings::Completion ); | 400 | void completionModeChanged( OGlobalSettings::Completion ); |
401 | 401 | ||
402 | /** | 402 | /** |
403 | * Emitted before the context menu is displayed. | 403 | * Emitted before the context menu is displayed. |
404 | * | 404 | * |
405 | * The signal allows you to add your own entries into the | 405 | * The signal allows you to add your own entries into the |
406 | * the context menu that is created on demand. | 406 | * the context menu that is created on demand. |
407 | * | 407 | * |
408 | * NOTE: Do not store the pointer to the QPopupMenu | 408 | * NOTE: Do not store the pointer to the QPopupMenu |
409 | * provided through since it is created and deleted | 409 | * provided through since it is created and deleted |
410 | * on demand. | 410 | * on demand. |
411 | * | 411 | * |
412 | * @param the context menu about to be displayed | 412 | * @param the context menu about to be displayed |
413 | */ | 413 | */ |
414 | void aboutToShowContextMenu( QPopupMenu * ); | 414 | void aboutToShowContextMenu( QPopupMenu * ); |
415 | 415 | ||
416 | public slots: | 416 | public slots: |
417 | 417 | ||
418 | /** | 418 | /** |
419 | * Iterates through all possible matches of the completed text | 419 | * Iterates through all possible matches of the completed text |
420 | * or the history list. | 420 | * or the history list. |
421 | * | 421 | * |
422 | * Depending on the value of the argument, this function either | 422 | * Depending on the value of the argument, this function either |
423 | * iterates through the history list of this widget or the all | 423 | * iterates through the history list of this widget or the all |
424 | * possible matches in whenever multiple matches result from a | 424 | * possible matches in whenever multiple matches result from a |
425 | * text completion request. Note that the all-possible-match | 425 | * text completion request. Note that the all-possible-match |
426 | * iteration will not work if there are no previous matches, i.e. | 426 | * iteration will not work if there are no previous matches, i.e. |
427 | * no text has been completed and the *nix shell history list | 427 | * no text has been completed and the *nix shell history list |
428 | * rotation is only available if the insertion policy for this | 428 | * rotation is only available if the insertion policy for this |
429 | * widget is set either @p QComobBox::AtTop or @p QComboBox::AtBottom. | 429 | * widget is set either @p QComobBox::AtTop or @p QComboBox::AtBottom. |
430 | * For other insertion modes whatever has been typed by the user | 430 | * For other insertion modes whatever has been typed by the user |
431 | * when the rotation event was initiated will be lost. | 431 | * when the rotation event was initiated will be lost. |
432 | * | 432 | * |
433 | * @param type The key-binding invoked. | 433 | * @param type The key-binding invoked. |
434 | */ | 434 | */ |
435 | void rotateText( OCompletionBase::KeyBindingType /* type */ ); | 435 | void rotateText( OCompletionBase::KeyBindingType /* type */ ); |
436 | 436 | ||
437 | /** | 437 | /** |
438 | * Sets the completed text in the line-edit appropriately. | 438 | * Sets the completed text in the line-edit appropriately. |
439 | * | 439 | * |
440 | * This function is an implementation for | 440 | * This function is an implementation for |
441 | * @ref OCompletionBase::setCompletedText. | 441 | * @ref OCompletionBase::setCompletedText. |
442 | */ | 442 | */ |
443 | virtual void setCompletedText( const QString& ); | 443 | virtual void setCompletedText( const QString& ); |
444 | 444 | ||
445 | /** | 445 | /** |
446 | * Sets @p items into the completion-box if @ref completionMode() is | 446 | * Sets @p items into the completion-box if @ref completionMode() is |
447 | * CompletionPopup. The popup will be shown immediately. | 447 | * CompletionPopup. The popup will be shown immediately. |
448 | */ | 448 | */ |
449 | void setCompletedItems( const QStringList& items ); | 449 | void setCompletedItems( const QStringList& items ); |
450 | 450 | ||
451 | public: | 451 | public: |
452 | /** | 452 | /** |
453 | * Selects the first item that matches @p item. If there is no such item, | 453 | * Selects the first item that matches @p item. If there is no such item, |
454 | * it is inserted at position @p index if @p insert is true. Otherwise, | 454 | * it is inserted at position @p index if @p insert is true. Otherwise, |
455 | * no item is selected. | 455 | * no item is selected. |
456 | */ | 456 | */ |
457 | void setCurrentItem( const QString& item, bool insert = false, int index = -1 ); | 457 | void setCurrentItem( const QString& item, bool insert = false, int index = -1 ); |
458 | void setCurrentItem(int index); | 458 | void setCurrentItem(int index); |
459 | 459 | ||
460 | protected slots: | 460 | protected slots: |
461 | 461 | ||
462 | /** | 462 | /** |
463 | * @deprecated. | 463 | * @deprecated. |
464 | */ | 464 | */ |
465 | virtual void itemSelected( QListBoxItem* ) {}; | 465 | virtual void itemSelected( QListBoxItem* ) {}; |
466 | 466 | ||
467 | /** | 467 | /** |
468 | * Completes text according to the completion mode. | 468 | * Completes text according to the completion mode. |
469 | * | 469 | * |
470 | * Note: this method is @p not invoked if the completion mode is | 470 | * Note: this method is @p not invoked if the completion mode is |
471 | * set to CompletionNone. Also if the mode is set to @p CompletionShell | 471 | * set to CompletionNone. Also if the mode is set to @p CompletionShell |
472 | * and multiple matches are found, this method will complete the | 472 | * and multiple matches are found, this method will complete the |
473 | * text to the first match with a beep to inidicate that there are | 473 | * text to the first match with a beep to inidicate that there are |
474 | * more matches. Then any successive completion key event iterates | 474 | * more matches. Then any successive completion key event iterates |
475 | * through the remaining matches. This way the rotation functionality | 475 | * through the remaining matches. This way the rotation functionality |
476 | * is left to iterate through the list as usual. | 476 | * is left to iterate through the list as usual. |
477 | */ | 477 | */ |
478 | virtual void makeCompletion( const QString& ); | 478 | virtual void makeCompletion( const QString& ); |
479 | 479 | ||
480 | protected: | 480 | protected: |
481 | /* | 481 | /* |
482 | * This function simply sets the lineedit text and | 482 | * This function simply sets the lineedit text and |
483 | * highlights the text appropriately if the boolean | 483 | * highlights the text appropriately if the boolean |
484 | * value is set to true. | 484 | * value is set to true. |
485 | * | 485 | * |
486 | * @param | 486 | * @param |
487 | * @param | 487 | * @param |
488 | */ | 488 | */ |
489 | virtual void setCompletedText( const QString& /* */, bool /*marked*/ ); | 489 | virtual void setCompletedText( const QString& /* */, bool /*marked*/ ); |
490 | 490 | ||
491 | /** | 491 | /** |
492 | * Reimplemented for internal reasons, the API is not affected. | 492 | * Reimplemented for internal reasons, the API is not affected. |
493 | */ | 493 | */ |
494 | virtual void create( WId = 0, bool initializeWindow = true, | 494 | virtual void create( WId = 0, bool initializeWindow = true, |
495 | bool destroyOldWindow = true ); | 495 | bool destroyOldWindow = true ); |
496 | 496 | ||
497 | private: | 497 | private: |
498 | // Constants that represent the ID's of the popup menu. | 498 | // Constants that represent the ID's of the popup menu. |
499 | // TODO: See if we can replace this mess with OActionMenu | 499 | // TODO: See if we can replace this mess with OActionMenu |
500 | // in the future though this is working lovely. | 500 | // in the future though this is working lovely. |
501 | enum MenuID { | 501 | enum MenuID { |
502 | Default=0, | 502 | Default=0, |
503 | Cut, | 503 | Cut, |
504 | Copy, | 504 | Copy, |
505 | Paste, | 505 | Paste, |
506 | Clear, | 506 | Clear, |
507 | Unselect, | 507 | Unselect, |
508 | SelectAll, | 508 | SelectAll, |
509 | NoCompletion, | 509 | NoCompletion, |
510 | AutoCompletion, | 510 | AutoCompletion, |
511 | ShellCompletion, | 511 | ShellCompletion, |
512 | PopupCompletion, | 512 | PopupCompletion, |
513 | SemiAutoCompletion | 513 | SemiAutoCompletion |
514 | }; | 514 | }; |
515 | 515 | ||
516 | /** | 516 | /** |
517 | * Initializes the variables upon construction. | 517 | * Initializes the variables upon construction. |
518 | */ | 518 | */ |
519 | void init(); | 519 | void init(); |
520 | /** | 520 | /** |
521 | * Temporary functions to delete words back and foward until | 521 | * Temporary functions to delete words back and foward until |
522 | * alternatives are available in QT3 (Seth Chaiklin, 21 may 2001) | 522 | * alternatives are available in QT3 (Seth Chaiklin, 21 may 2001) |
523 | */ | 523 | */ |
524 | void deleteWordBack(); | 524 | void deleteWordBack(); |
525 | void deleteWordForward(); | 525 | void deleteWordForward(); |
526 | 526 | ||
527 | bool m_bEnableMenu; | 527 | bool m_bEnableMenu; |
528 | 528 | ||
529 | // indicating if we should stop return-key events from propagating | 529 | // indicating if we should stop return-key events from propagating |
530 | bool m_trapReturnKey; | 530 | bool m_trapReturnKey; |
531 | 531 | ||
532 | //protected: | 532 | //protected: |
533 | // virtual void virtual_hook( int id, void* data ); | 533 | // virtual void virtual_hook( int id, void* data ); |
534 | private: | 534 | private: |
535 | class OComboBoxPrivate; | 535 | class OComboBoxPrivate; |
536 | OComboBoxPrivate *d; | 536 | OComboBoxPrivate *d; |
537 | }; | 537 | }; |
538 | 538 | ||
539 | 539 | ||
540 | class OPixmapProvider; | 540 | class OPixmapProvider; |
541 | 541 | ||
542 | /** | 542 | /** |
543 | * A combobox which implements a history like a unix shell. You can navigate | 543 | * A combobox which implements a history like a unix shell. You can navigate |
544 | * through all the items by using the Up or Down arrows (configurable of | 544 | * through all the items by using the Up or Down arrows (configurable of |
545 | * course). Additionally, weighted completion is available. So you should | 545 | * course). Additionally, weighted completion is available. So you should |
546 | * load and save the completion list to preserve the weighting between | 546 | * load and save the completion list to preserve the weighting between |
547 | * sessions. | 547 | * sessions. |
548 | * | 548 | * |
549 | * @author Carsten Pfeiffer <pfeiffer@kde.org> | 549 | * @author Carsten Pfeiffer <pfeiffer@kde.org> |
550 | * @short A combobox for offering a history and completion | 550 | * @short A combobox for offering a history and completion |
551 | */ | 551 | */ |
552 | class OHistoryCombo : public OComboBox | 552 | class OHistoryCombo : public OComboBox |
553 | { | 553 | { |
554 | Q_OBJECT | 554 | Q_OBJECT |
555 | Q_PROPERTY( QStringList historyItems READ historyItems WRITE setHistoryItems ) | 555 | Q_PROPERTY( QStringList historyItems READ historyItems WRITE setHistoryItems ) |
556 | 556 | ||
557 | public: | 557 | public: |
558 | /** | 558 | /** |
559 | * Constructs a "read-write" combobox. A read-only history combobox | 559 | * Constructs a "read-write" combobox. A read-only history combobox |
560 | * doesn't make much sense, so it is only available as read-write. | 560 | * doesn't make much sense, so it is only available as read-write. |
561 | * Completion will be used automatically for the items in the combo. | 561 | * Completion will be used automatically for the items in the combo. |
562 | * | 562 | * |
563 | * The insertion-policy is set to NoInsertion, you have to add the items | 563 | * The insertion-policy is set to NoInsertion, you have to add the items |
564 | * yourself via the slot @ref addToHistory. If you want every item added, | 564 | * yourself via the slot @ref addToHistory. If you want every item added, |
565 | * use | 565 | * use |
566 | * | 566 | * |
567 | * <pre> | 567 | * <pre> |
568 | * connect( combo, SIGNAL( activated( const QString& )), | 568 | * connect( combo, SIGNAL( activated( const QString& )), |
569 | * combo, SLOT( addToHistory( const QString& ))); | 569 | * combo, SLOT( addToHistory( const QString& ))); |
570 | * </pre> | 570 | * </pre> |
571 | * | 571 | * |
572 | * Use @ref QComboBox::setMaxCount() to limit the history. | 572 | * Use @ref QComboBox::setMaxCount() to limit the history. |
573 | * | 573 | * |
574 | * @p parent the parent object of this widget. | 574 | * @p parent the parent object of this widget. |
575 | * @p name the name of this widget. | 575 | * @p name the name of this widget. |
576 | */ | 576 | */ |
577 | OHistoryCombo( QWidget *parent = 0L, const char *name = 0L ); | 577 | OHistoryCombo( QWidget *parent = 0L, const char *name = 0L ); |
578 | 578 | ||
579 | // ### merge these two constructors | 579 | // ### merge these two constructors |
580 | /** | 580 | /** |
581 | * Same as the previous constructor, but additionally has the option | 581 | * Same as the previous constructor, but additionally has the option |
582 | * to specify whether you want to let OHistoryCombo handle completion | 582 | * to specify whether you want to let OHistoryCombo handle completion |
583 | * or not. If set to @p true, OHistoryCombo will sync the completion to the | 583 | * or not. If set to @p true, OHistoryCombo will sync the completion to the |
584 | * contents of the combobox. | 584 | * contents of the combobox. |
585 | */ | 585 | */ |
586 | OHistoryCombo( bool useCompletion, | 586 | OHistoryCombo( bool useCompletion, |
587 | QWidget *parent = 0L, const char *name = 0L ); | 587 | QWidget *parent = 0L, const char *name = 0L ); |
588 | 588 | ||
589 | /** | 589 | /** |
590 | * Destructs the combo, the completion-object and the pixmap-provider | 590 | * Destructs the combo, the completion-object and the pixmap-provider |
591 | */ | 591 | */ |
592 | ~OHistoryCombo(); | 592 | ~OHistoryCombo(); |
593 | 593 | ||
594 | /** | 594 | /** |
595 | * Inserts @p items into the combobox. @p items might get | 595 | * Inserts @p items into the combobox. @p items might get |
596 | * truncated if it is longer than @ref maxCount() | 596 | * truncated if it is longer than @ref maxCount() |
597 | * | 597 | * |
598 | * @see #historyItems | 598 | * @see #historyItems |
599 | */ | 599 | */ |
600 | inline void setHistoryItems( QStringList items ) { | 600 | inline void setHistoryItems( QStringList items ) { |
601 | setHistoryItems(items, false); | 601 | setHistoryItems(items, false); |
602 | } | 602 | } |
603 | 603 | ||
604 | /** | 604 | /** |
605 | * Inserts @p items into the combobox. @p items might get | 605 | * Inserts @p items into the combobox. @p items might get |
606 | * truncated if it is longer than @ref maxCount() | 606 | * truncated if it is longer than @ref maxCount() |
607 | * | 607 | * |
608 | * Set @p setCompletionList to true, if you don't have a list of | 608 | * Set @p setCompletionList to true, if you don't have a list of |
609 | * completions. This tells OHistoryCombo to use all the items for the | 609 | * completions. This tells OHistoryCombo to use all the items for the |
610 | * completion object as well. | 610 | * completion object as well. |
611 | * You won't have the benefit of weighted completion though, so normally | 611 | * You won't have the benefit of weighted completion though, so normally |
612 | * you should do something like | 612 | * you should do something like |
613 | * <pre> | 613 | * <pre> |
614 | * OConfig *config = kapp->config(); | 614 | * OConfig *config = kapp->config(); |
615 | * QStringList list; | 615 | * QStringList list; |
616 | * | 616 | * |
617 | * // load the history and completion list after creating the history combo | 617 | * // load the history and completion list after creating the history combo |
618 | * list = config->readListEntry( "Completion list" ); | 618 | * list = config->readListEntry( "Completion list" ); |
619 | * combo->completionObject()->setItems( list ); | 619 | * combo->completionObject()->setItems( list ); |
620 | * list = config->readListEntry( "History list" ); | 620 | * list = config->readListEntry( "History list" ); |
621 | * combo->setHistoryItems( list ); | 621 | * combo->setHistoryItems( list ); |
622 | * | 622 | * |
623 | * [...] | 623 | * [...] |
624 | * | 624 | * |
625 | * // save the history and completion list when the history combo is | 625 | * // save the history and completion list when the history combo is |
626 | * // destroyed | 626 | * // destroyed |
627 | * list = combo->completionObject()->items() | 627 | * list = combo->completionObject()->items() |
628 | * config->writeEntry( "Completion list", list ); | 628 | * config->writeEntry( "Completion list", list ); |
629 | * list = combo->historyItems(); | 629 | * list = combo->historyItems(); |
630 | * config->writeEntry( "History list", list ); | 630 | * config->writeEntry( "History list", list ); |
631 | * </pre> | 631 | * </pre> |
632 | * | 632 | * |
633 | * Be sure to use different names for saving with OConfig if you have more | 633 | * Be sure to use different names for saving with OConfig if you have more |
634 | * than one OHistoryCombo. | 634 | * than one OHistoryCombo. |
635 | * | 635 | * |
636 | * Note: When @p setCompletionList is true, the items are inserted into the | 636 | * Note: When @p setCompletionList is true, the items are inserted into the |
637 | * OCompletion object with mode OCompletion::Insertion and the mode is set | 637 | * OCompletion object with mode OCompletion::Insertion and the mode is set |
638 | * to OCompletion::Weighted afterwards. | 638 | * to OCompletion::Weighted afterwards. |
639 | * | 639 | * |
640 | * @see #historyItems | 640 | * @see #historyItems |
641 | * @see OComboBox::completionObject | 641 | * @see OComboBox::completionObject |
642 | * @see OCompletion::setItems | 642 | * @see OCompletion::setItems |
643 | * @see OCompletion::items | 643 | * @see OCompletion::items |
644 | */ | 644 | */ |
645 | void setHistoryItems( QStringList items, bool setCompletionList ); | 645 | void setHistoryItems( QStringList items, bool setCompletionList ); |
646 | 646 | ||
647 | /** | 647 | /** |
648 | * Returns the list of history items. Empty, when this is not a read-write | 648 | * Returns the list of history items. Empty, when this is not a read-write |
649 | * combobox. | 649 | * combobox. |
650 | * | 650 | * |
651 | * @see #setHistoryItems | 651 | * @see #setHistoryItems |
652 | */ | 652 | */ |
653 | QStringList historyItems() const; | 653 | QStringList historyItems() const; |
654 | 654 | ||
655 | /** | 655 | /** |
656 | * Removes all items named @p item. | 656 | * Removes all items named @p item. |
657 | * | 657 | * |
658 | * @return @p true if at least one item was removed. | 658 | * @return @p true if at least one item was removed. |
659 | * | 659 | * |
660 | * @see #addToHistory | 660 | * @see #addToHistory |
661 | */ | 661 | */ |
662 | bool removeFromHistory( const QString& item ); | 662 | bool removeFromHistory( const QString& item ); |
663 | 663 | ||
664 | /** | 664 | /** |
665 | * Sets a pixmap provider, so that items in the combobox can have a pixmap. | 665 | * Sets a pixmap provider, so that items in the combobox can have a pixmap. |
666 | * @ref OPixmapProvider is just an abstract class with the one pure virtual | 666 | * @ref OPixmapProvider is just an abstract class with the one pure virtual |
667 | * method @ref OPixmapProvider::pixmapFor(). This method is called whenever | 667 | * method @ref OPixmapProvider::pixmapFor(). This method is called whenever |
668 | * an item is added to the OHistoryComboBox. Implement it to return your | 668 | * an item is added to the OHistoryComboBox. Implement it to return your |
669 | * own custom pixmaps, or use the @ref OURLPixmapProvider from libkio, | 669 | * own custom pixmaps, or use the @ref OURLPixmapProvider from libkio, |
670 | * which uses @ref OMimeType::pixmapForURL to resolve icons. | 670 | * which uses @ref OMimeType::pixmapForURL to resolve icons. |
671 | * | 671 | * |
672 | * Set @p prov to 0L if you want to disable pixmaps. Default no pixmaps. | 672 | * Set @p prov to 0L if you want to disable pixmaps. Default no pixmaps. |
673 | * | 673 | * |
674 | * @see #pixmapProvider | 674 | * @see #pixmapProvider |
675 | */ | 675 | */ |
676 | void setPixmapProvider( OPixmapProvider *prov ); | 676 | void setPixmapProvider( OPixmapProvider *prov ); |
677 | 677 | ||
678 | /** | 678 | /** |
679 | * @returns the current pixmap provider. | 679 | * @returns the current pixmap provider. |
680 | * @see #setPixmapProvider | 680 | * @see #setPixmapProvider |
681 | * @see OPixmapProvider | 681 | * @see OPixmapProvider |
682 | */ | 682 | */ |
683 | OPixmapProvider * pixmapProvider() const { return myPixProvider; } | 683 | OPixmapProvider * pixmapProvider() const { return myPixProvider; } |
684 | 684 | ||
685 | /** | 685 | /** |
686 | * Resets the current position of the up/down history. Call this | 686 | * Resets the current position of the up/down history. Call this |
687 | * when you manually call @ref setCurrentItem() or @ref clearEdit(). | 687 | * when you manually call @ref setCurrentItem() or @ref clearEdit(). |
688 | */ | 688 | */ |
689 | void reset() { slotReset(); } | 689 | void reset() { slotReset(); } |
690 | 690 | ||
691 | public slots: | 691 | public slots: |
692 | /** | 692 | /** |
693 | * Adds an item to the end of the history list and to the completion list. | 693 | * Adds an item to the end of the history list and to the completion list. |
694 | * If @ref maxCount() is reached, the first item of the list will be | 694 | * If @ref maxCount() is reached, the first item of the list will be |
695 | * removed. | 695 | * removed. |
696 | * | 696 | * |
697 | * If the last inserted item is the same as @p item, it will not be | 697 | * If the last inserted item is the same as @p item, it will not be |
698 | * inserted again. | 698 | * inserted again. |
699 | * | 699 | * |
700 | * If @ref duplicatesEnabled() is false, any equal existing item will be | 700 | * If @ref duplicatesEnabled() is false, any equal existing item will be |
701 | * removed before @p item is added. | 701 | * removed before @p item is added. |
702 | * | 702 | * |
703 | * Note: By using this method and not the Q and OComboBox insertItem() | 703 | * Note: By using this method and not the Q and OComboBox insertItem() |
704 | * methods, you make sure that the combobox stays in sync with the | 704 | * methods, you make sure that the combobox stays in sync with the |
705 | * completion. It would be annoying if completion would give an item | 705 | * completion. It would be annoying if completion would give an item |
706 | * not in the combobox, and vice versa. | 706 | * not in the combobox, and vice versa. |
707 | * | 707 | * |
708 | * @see #removeFromHistory | 708 | * @see #removeFromHistory |
709 | * @see QComboBox::setDuplicatesEnabled | 709 | * @see QComboBox::setDuplicatesEnabled |
710 | */ | 710 | */ |
711 | void addToHistory( const QString& item ); | 711 | void addToHistory( const QString& item ); |
712 | 712 | ||
713 | /** | 713 | /** |
714 | * Clears the history and the completion list. | 714 | * Clears the history and the completion list. |
715 | */ | 715 | */ |
716 | void clearHistory(); | 716 | void clearHistory(); |
717 | 717 | ||
718 | signals: | 718 | signals: |
719 | /** | 719 | /** |
720 | * Emitted when the history was cleared by the entry in the popup menu. | 720 | * Emitted when the history was cleared by the entry in the popup menu. |
721 | */ | 721 | */ |
722 | void cleared(); | 722 | void cleared(); |
723 | 723 | ||
724 | protected: | 724 | protected: |
725 | /** | 725 | /** |
726 | * Handling key-events, the shortcuts to rotate the items. | 726 | * Handling key-events, the shortcuts to rotate the items. |
727 | */ | 727 | */ |
728 | virtual void keyPressEvent( QKeyEvent * ); | 728 | virtual void keyPressEvent( QKeyEvent * ); |
729 | 729 | ||
730 | 730 | ||
731 | /** | 731 | /** |
732 | * Inserts @p items into the combo, honouring @ref pixmapProvider() | 732 | * Inserts @p items into the combo, honouring @ref pixmapProvider() |
733 | * Does not update the completionObject. | 733 | * Does not update the completionObject. |
734 | * | 734 | * |
735 | * Note: @ref duplicatesEnabled() is not honored here. | 735 | * Note: @ref duplicatesEnabled() is not honored here. |
736 | * | 736 | * |
737 | * Called from @ref setHistoryItems() and @ref setPixmapProvider() | 737 | * Called from @ref setHistoryItems() and @ref setPixmapProvider() |
738 | */ | 738 | */ |
739 | void insertItems( const QStringList& items ); | 739 | void insertItems( const QStringList& items ); |
740 | 740 | ||
741 | /** | 741 | /** |
742 | * @returns if we can modify the completion object or not. | 742 | * @returns if we can modify the completion object or not. |
743 | */ | 743 | */ |
744 | bool useCompletion() const { return compObj() != 0L; } | 744 | bool useCompletion() const { return compObj() != 0L; } |
745 | 745 | ||
746 | private slots: | 746 | private slots: |
747 | /** | 747 | /** |
748 | * Resets the iterate index to -1 | 748 | * Resets the iterate index to -1 |
749 | */ | 749 | */ |
750 | void slotReset(); | 750 | void slotReset(); |
751 | 751 | ||
752 | /** | 752 | /** |
753 | * Called from the popupmenu, | 753 | * Called from the popupmenu, |
754 | * calls clearHistory() and emits cleared() | 754 | * calls clearHistory() and emits cleared() |
755 | */ | 755 | */ |
756 | void slotClear(); | 756 | void slotClear(); |
757 | 757 | ||
758 | /** | 758 | /** |
759 | * Appends our own context menu entry. | 759 | * Appends our own context menu entry. |
760 | */ | 760 | */ |
761 | void addContextMenuItems( QPopupMenu* ); | 761 | void addContextMenuItems( QPopupMenu* ); |
762 | 762 | ||
763 | private: | 763 | private: |
764 | void init( bool useCompletion ); | 764 | void init( bool useCompletion ); |
765 | 765 | ||
766 | /** | 766 | /** |
767 | * The current position (index) in the combobox, used for Up and Down | 767 | * The current position (index) in the combobox, used for Up and Down |
768 | */ | 768 | */ |
769 | int myIterateIndex; | 769 | int myIterateIndex; |
770 | 770 | ||
771 | /** | 771 | /** |
772 | * The text typed before Up or Down was pressed. | 772 | * The text typed before Up or Down was pressed. |
773 | */ | 773 | */ |
774 | QString myText; | 774 | QString myText; |
775 | 775 | ||
776 | /** | 776 | /** |
777 | * Indicates that the user at least once rotated Up through the entire list | 777 | * Indicates that the user at least once rotated Up through the entire list |
778 | * Needed to allow going back after rotation. | 778 | * Needed to allow going back after rotation. |
779 | */ | 779 | */ |
780 | bool myRotated; | 780 | bool myRotated; |
781 | OPixmapProvider *myPixProvider; | 781 | OPixmapProvider *myPixProvider; |
782 | 782 | ||
783 | private: | 783 | private: |
784 | class OHistoryComboPrivate; | 784 | class OHistoryComboPrivate; |
785 | OHistoryComboPrivate *d; | 785 | OHistoryComboPrivate *d; |
786 | }; | 786 | }; |
787 | 787 | ||
788 | 788 | ||
789 | #endif | 789 | #endif |
790 | 790 | ||
diff --git a/libopie2/qt3/opieui/olineedit.h b/libopie2/qt3/opieui/olineedit.h index ecfca27..db3d7ef 100644 --- a/libopie2/qt3/opieui/olineedit.h +++ b/libopie2/qt3/opieui/olineedit.h | |||
@@ -1,498 +1,498 @@ | |||
1 | /* | 1 | /* |
2 | This file Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> | 2 | This file Copyright (C) 2003 Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> |
3 | is part of the Copyright (C) 2001 Carsten Pfeiffer <pfeiffer@kde.org>, Dawit Alemayehu <adawit@kde.org> | 3 | is part of the Copyright (C) 2001 Carsten Pfeiffer <pfeiffer@kde.org>, Dawit Alemayehu <adawit@kde.org> |
4 | Opie Project Copyright (C) 1999 Preston Brown <pbrown@kde.org>, Patrick Ward <PAT_WARD@HP-USA-om5.om.hp.com> | 4 | Opie Project Copyright (C) 1999 Preston Brown <pbrown@kde.org>, Patrick Ward <PAT_WARD@HP-USA-om5.om.hp.com> |
5 | Copyright (C) 1997 Sven Radej (sven.radej@iname.com) | 5 | Copyright (C) 1997 Sven Radej (sven.radej@iname.com) |
6 | =. | 6 | =. |
7 | .=l. | 7 | .=l. |
8 | .>+-= | 8 | .>+-= |
9 | _;:, .> :=|. This program is free software; you can | 9 | _;:, .> :=|. This program is free software; you can |
10 | .> <`_, > . <= redistribute it and/or modify it under | 10 | .> <`_, > . <= redistribute it and/or modify it under |
11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 11 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
12 | .="- .-=="i, .._ License as published by the Free Software | 12 | .="- .-=="i, .._ License as published by the Free Software |
13 | - . .-<_> .<> Foundation; either version 2 of the License, | 13 | - . .-<_> .<> Foundation; either version 2 of the License, |
14 | ._= =} : or (at your option) any later version. | 14 | ._= =} : or (at your option) any later version. |
15 | .%`+i> _;_. | 15 | .%`+i> _;_. |
16 | .i_,=:_. -<s. This program is distributed in the hope that | 16 | .i_,=:_. -<s. This program is distributed in the hope that |
17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 17 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
18 | : .. .:, . . . without even the implied warranty of | 18 | : .. .:, . . . without even the implied warranty of |
19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 19 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 20 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
21 | ..}^=.= = ; Library General Public License for more | 21 | ..}^=.= = ; Library General Public License for more |
22 | ++= -. .` .: details. | 22 | ++= -. .` .: details. |
23 | : = ...= . :.=- | 23 | : = ...= . :.=- |
24 | -. .:....=;==+<; You should have received a copy of the GNU | 24 | -. .:....=;==+<; You should have received a copy of the GNU |
25 | -_. . . )=. = Library General Public License along with | 25 | -_. . . )=. = Library General Public License along with |
26 | -- :-=` this library; see the file COPYING.LIB. | 26 | -- :-=` this library; see the file COPYING.LIB. |
27 | If not, write to the Free Software Foundation, | 27 | If not, write to the Free Software Foundation, |
28 | Inc., 59 Temple Place - Suite 330, | 28 | Inc., 59 Temple Place - Suite 330, |
29 | Boston, MA 02111-1307, USA. | 29 | Boston, MA 02111-1307, USA. |
30 | 30 | ||
31 | */ | 31 | */ |
32 | 32 | ||
33 | #ifndef OLINEEDIT_H | 33 | #ifndef OLINEEDIT_H |
34 | #define OLINEEDIT_H | 34 | #define OLINEEDIT_H |
35 | 35 | ||
36 | /* QT */ | 36 | /* QT */ |
37 | 37 | ||
38 | #include <qlineedit.h> | 38 | #include <qlineedit.h> |
39 | 39 | ||
40 | /* OPIE */ | 40 | /* OPIE */ |
41 | 41 | ||
42 | #include <opie2/ocompletion.h> | 42 | #include <opie2/ocompletion.h> |
43 | #include <opie2/ocompletionbase.h> | 43 | #include <opie2/ocompletionbase.h> |
44 | 44 | ||
45 | class QPopupMenu; | 45 | class QPopupMenu; |
46 | 46 | ||
47 | class OCompletionBox; | 47 | class OCompletionBox; |
48 | typedef QString KURL; //class KURL; | 48 | typedef QString KURL; //class KURL; |
49 | 49 | ||
50 | /** | 50 | /** |
51 | * An enhanced QLineEdit widget for inputting text. | 51 | * An enhanced QLineEdit widget for inputting text. |
52 | * | 52 | * |
53 | * @sect Detail | 53 | * @par Detail |
54 | * | 54 | * |
55 | * This widget inherits from @ref QLineEdit and implements the following | 55 | * This widget inherits from @ref QLineEdit and implements the following |
56 | * additional functionalities: q completion object that provides both | 56 | * additional functionalities: q completion object that provides both |
57 | * automatic and manual text completion as well as multiple match iteration | 57 | * automatic and manual text completion as well as multiple match iteration |
58 | * features, configurable key-bindings to activate these features and a | 58 | * features, configurable key-bindings to activate these features and a |
59 | * popup-menu item that can be used to allow the user to set text completion | 59 | * popup-menu item that can be used to allow the user to set text completion |
60 | * modes on the fly based on their preference. | 60 | * modes on the fly based on their preference. |
61 | * | 61 | * |
62 | * To support these new features OLineEdit also emits a few more | 62 | * To support these new features OLineEdit also emits a few more |
63 | * additional signals. These are: @ref completion( const QString& ), | 63 | * additional signals. These are: @ref completion( const QString& ), |
64 | * textRotation( KeyBindingType ), and @ref returnPressed( const QString& ). | 64 | * textRotation( KeyBindingType ), and @ref returnPressed( const QString& ). |
65 | * The completion signal can be connected to a slot that will assist the | 65 | * The completion signal can be connected to a slot that will assist the |
66 | * user in filling out the remaining text. The text rotation signal is | 66 | * user in filling out the remaining text. The text rotation signal is |
67 | * intended to be used to iterate through the list of all possible matches | 67 | * intended to be used to iterate through the list of all possible matches |
68 | * whenever there is more than one match for the entered text. The | 68 | * whenever there is more than one match for the entered text. The |
69 | * @p returnPressed( const QString& ) signals are the same as QLineEdit's | 69 | * @p returnPressed( const QString& ) signals are the same as QLineEdit's |
70 | * except it provides the current text in the widget as its argument whenever | 70 | * except it provides the current text in the widget as its argument whenever |
71 | * appropriate. | 71 | * appropriate. |
72 | * | 72 | * |
73 | * This widget by default creates a completion object when you invoke | 73 | * This widget by default creates a completion object when you invoke |
74 | * the @ref completionObject( bool ) member function for the first time or | 74 | * the @ref completionObject( bool ) member function for the first time or |
75 | * use @ref setCompletionObject( OCompletion*, bool ) to assign your own | 75 | * use @ref setCompletionObject( OCompletion*, bool ) to assign your own |
76 | * completion object. Additionally, to make this widget more functional, | 76 | * completion object. Additionally, to make this widget more functional, |
77 | * OLineEdit will by default handle the text rotation and completion | 77 | * OLineEdit will by default handle the text rotation and completion |
78 | * events internally when a completion object is created through either one | 78 | * events internally when a completion object is created through either one |
79 | * of the methods mentioned above. If you do not need this functionality, | 79 | * of the methods mentioned above. If you do not need this functionality, |
80 | * simply use @ref OCompletionBase::setHandleSignals( bool ) or set the | 80 | * simply use @ref OCompletionBase::setHandleSignals( bool ) or set the |
81 | * boolean parameter in the above functions to FALSE. | 81 | * boolean parameter in the above functions to FALSE. |
82 | * | 82 | * |
83 | * The default key-bindings for completion and rotation is determined | 83 | * The default key-bindings for completion and rotation is determined |
84 | * from the global settings in @ref OStdAccel. These values, however, | 84 | * from the global settings in @ref OStdAccel. These values, however, |
85 | * can be overriden locally by invoking @ref OCompletionBase::setKeyBinding(). | 85 | * can be overriden locally by invoking @ref OCompletionBase::setKeyBinding(). |
86 | * The values can easily be reverted back to the default setting, by simply | 86 | * The values can easily be reverted back to the default setting, by simply |
87 | * calling @ref useGlobalSettings(). An alternate method would be to default | 87 | * calling @ref useGlobalSettings(). An alternate method would be to default |
88 | * individual key-bindings by usning @ref setKeyBinding() with the default | 88 | * individual key-bindings by usning @ref setKeyBinding() with the default |
89 | * second argument. | 89 | * second argument. |
90 | * | 90 | * |
91 | * NOTE that if the @p EchoMode for this widget is set to something other | 91 | * NOTE that if the @p EchoMode for this widget is set to something other |
92 | * than @p QLineEdit::Normal, the completion mode will always be defaulted | 92 | * than @p QLineEdit::Normal, the completion mode will always be defaulted |
93 | * to @ref PGlobalSettings::CompletionNone. This is done purposefully to guard | 93 | * to @ref PGlobalSettings::CompletionNone. This is done purposefully to guard |
94 | * against protected entries such as passwords being cached in @ref OCompletion's | 94 | * against protected entries such as passwords being cached in @ref OCompletion's |
95 | * list. Hence, if the @p EchoMode is not @ref QLineEdit::Normal, the completion | 95 | * list. Hence, if the @p EchoMode is not @ref QLineEdit::Normal, the completion |
96 | * mode is automatically disabled. | 96 | * mode is automatically disabled. |
97 | * | 97 | * |
98 | * @sect Useage | 98 | * @par Usage |
99 | * | 99 | * |
100 | * To enable the basic completion feature : | 100 | * To enable the basic completion feature : |
101 | * | 101 | * |
102 | * <pre> | 102 | * <pre> |
103 | * OLineEdit *edit = new OLineEdit( this, "mywidget" ); | 103 | * OLineEdit *edit = new OLineEdit( this, "mywidget" ); |
104 | * OCompletion *comp = edit->completionObject(); | 104 | * OCompletion *comp = edit->completionObject(); |
105 | * // Fill the completion object with a list of possible matches | 105 | * // Fill the completion object with a list of possible matches |
106 | * QStringList list; | 106 | * QStringList list; |
107 | * list << "mickeyl@handhelds.org" << "mickey@tm.informatik.uni-frankfurt.de>" << "mickey@Vanille.de"; | 107 | * list << "mickeyl@handhelds.org" << "mickey@tm.informatik.uni-frankfurt.de>" << "mickey@Vanille.de"; |
108 | * comp->setItems( list ); | 108 | * comp->setItems( list ); |
109 | * // Connect to the return pressed signal (optional) | 109 | * // Connect to the return pressed signal (optional) |
110 | * connect(edit,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); | 110 | * connect(edit,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); |
111 | * </pre> | 111 | * </pre> |
112 | * | 112 | * |
113 | * To use a customized completion objects or your | 113 | * To use a customized completion objects or your |
114 | * own completion object : | 114 | * own completion object : |
115 | * | 115 | * |
116 | * <pre> | 116 | * <pre> |
117 | * OLineEdit *edit = new OLineEdit( this,"mywidget" ); | 117 | * OLineEdit *edit = new OLineEdit( this,"mywidget" ); |
118 | * KURLCompletion *comp = new KURLCompletion(); | 118 | * KURLCompletion *comp = new KURLCompletion(); |
119 | * edit->setCompletionObject( comp ); | 119 | * edit->setCompletionObject( comp ); |
120 | * // Connect to the return pressed signal - optional | 120 | * // Connect to the return pressed signal - optional |
121 | * connect(edit,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); | 121 | * connect(edit,SIGNAL(returnPressed(const QString&)),comp,SLOT(addItem(const QString&)); |
122 | * </pre> | 122 | * </pre> |
123 | * | 123 | * |
124 | * Note that you have to either delete the allocated completion object | 124 | * Note that you have to either delete the allocated completion object |
125 | * when you don't need it anymore, or call | 125 | * when you don't need it anymore, or call |
126 | * setAutoDeleteCompletionObject( true ); | 126 | * setAutoDeleteCompletionObject( true ); |
127 | * | 127 | * |
128 | * @sect Miscellaneous function calls : | 128 | * @par Miscellaneous function calls : |
129 | * | 129 | * |
130 | * <pre> | 130 | * <pre> |
131 | * // Tell the widget not to handle completion and | 131 | * // Tell the widget not to handle completion and |
132 | * // iteration internally. | 132 | * // iteration internally. |
133 | * edit->setHandleSignals( false ); | 133 | * edit->setHandleSignals( false ); |
134 | * // Set your own completion key for manual completions. | 134 | * // Set your own completion key for manual completions. |
135 | * edit->setKeyBinding( OCompletionBase::TextCompletion, Qt::End ); | 135 | * edit->setKeyBinding( OCompletionBase::TextCompletion, Qt::End ); |
136 | * // Hide the context (popup) menu | 136 | * // Hide the context (popup) menu |
137 | * edit->setContextMenuEnabled( false ); | 137 | * edit->setContextMenuEnabled( false ); |
138 | * // Temporarly disable signal emitions | 138 | * // Temporarly disable signal emitions |
139 | * // (both completion & iteration signals) | 139 | * // (both completion & iteration signals) |
140 | * edit->disableSignals(); | 140 | * edit->disableSignals(); |
141 | * // Default the key-bindings to system settings. | 141 | * // Default the key-bindings to system settings. |
142 | * edit->useGlobalKeyBindings(); | 142 | * edit->useGlobalKeyBindings(); |
143 | * </pre> | 143 | * </pre> |
144 | * | 144 | * |
145 | * @short An enhanced single line input widget. | 145 | * @short An enhanced single line input widget. |
146 | * @author Dawit Alemayehu <adawit@kde.org> | 146 | * @author Dawit Alemayehu <adawit@kde.org> |
147 | * @author Opie adaption by Michael Lauer <mickey@tm.informatik.uni-frankfurt.de> | 147 | * @author Opie adaption by Michael Lauer <mickey@tm.informatik.uni-frankfurt.de> |
148 | */ | 148 | */ |
149 | 149 | ||
150 | class OLineEdit : public QLineEdit, public OCompletionBase | 150 | class OLineEdit : public QLineEdit, public OCompletionBase |
151 | { | 151 | { |
152 | friend class OComboBox; | 152 | friend class OComboBox; |
153 | 153 | ||
154 | Q_OBJECT | 154 | Q_OBJECT |
155 | Q_PROPERTY( bool contextMenuEnabled READ isContextMenuEnabled WRITE setContextMenuEnabled ) | 155 | Q_PROPERTY( bool contextMenuEnabled READ isContextMenuEnabled WRITE setContextMenuEnabled ) |
156 | Q_PROPERTY( bool urlDropsEnabled READ isURLDropsEnabled WRITE setURLDropsEnabled ) | 156 | Q_PROPERTY( bool urlDropsEnabled READ isURLDropsEnabled WRITE setURLDropsEnabled ) |
157 | 157 | ||
158 | public: | 158 | public: |
159 | 159 | ||
160 | /** | 160 | /** |
161 | * Constructs a OLineEdit object with a default text, a parent, | 161 | * Constructs a OLineEdit object with a default text, a parent, |
162 | * and a name. | 162 | * and a name. |
163 | * | 163 | * |
164 | * @param string Text to be shown in the edit widget. | 164 | * @param string Text to be shown in the edit widget. |
165 | * @param parent The parent object of this widget. | 165 | * @param parent The parent object of this widget. |
166 | * @param name the name of this widget | 166 | * @param name the name of this widget |
167 | */ | 167 | */ |
168 | OLineEdit( const QString &string, QWidget *parent, const char *name = 0 ); | 168 | OLineEdit( const QString &string, QWidget *parent, const char *name = 0 ); |
169 | 169 | ||
170 | /** | 170 | /** |
171 | * Constructs a OLineEdit object with a parent and a name. | 171 | * Constructs a OLineEdit object with a parent and a name. |
172 | * | 172 | * |
173 | * @param string Text to be shown in the edit widget. | 173 | * @param string Text to be shown in the edit widget. |
174 | * @param parent The parent object of this widget. | 174 | * @param parent The parent object of this widget. |
175 | * @param name The name of this widget. | 175 | * @param name The name of this widget. |
176 | */ | 176 | */ |
177 | OLineEdit ( QWidget *parent=0, const char *name=0 ); | 177 | OLineEdit ( QWidget *parent=0, const char *name=0 ); |
178 | 178 | ||
179 | /** | 179 | /** |
180 | * Destructor. | 180 | * Destructor. |
181 | */ | 181 | */ |
182 | virtual ~OLineEdit (); | 182 | virtual ~OLineEdit (); |
183 | 183 | ||
184 | /** | 184 | /** |
185 | * Sets @p url into the lineedit. It uses @ref KURL::prettyURL() so | 185 | * Sets @p url into the lineedit. It uses @ref KURL::prettyURL() so |
186 | * that the url is properly decoded for displaying. | 186 | * that the url is properly decoded for displaying. |
187 | */ | 187 | */ |
188 | void setURL( const KURL& url ); | 188 | void setURL( const KURL& url ); |
189 | 189 | ||
190 | /** | 190 | /** |
191 | * Puts the text cursor at the end of the string. | 191 | * Puts the text cursor at the end of the string. |
192 | * | 192 | * |
193 | * This method is deprecated. Use @ref QLineEdit::end() | 193 | * This method is deprecated. Use @ref QLineEdit::end() |
194 | * instead. | 194 | * instead. |
195 | * | 195 | * |
196 | * @deprecated | 196 | * @deprecated |
197 | * @ref QLineEdit::end() | 197 | * @ref QLineEdit::end() |
198 | */ | 198 | */ |
199 | void cursorAtEnd() { end( false ); } | 199 | void cursorAtEnd() { end( false ); } |
200 | 200 | ||
201 | /** | 201 | /** |
202 | * Re-implemented from @ref OCompletionBase for internal reasons. | 202 | * Re-implemented from @ref OCompletionBase for internal reasons. |
203 | * | 203 | * |
204 | * This function is re-implemented in order to make sure that | 204 | * This function is re-implemented in order to make sure that |
205 | * the EchoMode is acceptable before we set the completion mode. | 205 | * the EchoMode is acceptable before we set the completion mode. |
206 | * | 206 | * |
207 | * See @ref OCompletionBase::setCompletionMode | 207 | * See @ref OCompletionBase::setCompletionMode |
208 | */ | 208 | */ |
209 | virtual void setCompletionMode( OGlobalSettings::Completion mode ); | 209 | virtual void setCompletionMode( OGlobalSettings::Completion mode ); |
210 | 210 | ||
211 | /** | 211 | /** |
212 | * Enables/disables the popup (context) menu. | 212 | * Enables/disables the popup (context) menu. |
213 | * | 213 | * |
214 | * Note that when this function is invoked with its argument | 214 | * Note that when this function is invoked with its argument |
215 | * set to @p true, then both the context menu and the completion | 215 | * set to @p true, then both the context menu and the completion |
216 | * menu item are enabled. If you do not want to the completion | 216 | * menu item are enabled. If you do not want to the completion |
217 | * item to be visible simply invoke @ref hideModechanger() right | 217 | * item to be visible simply invoke @ref hideModechanger() right |
218 | * after calling this method. Also by default, the context | 218 | * after calling this method. Also by default, the context |
219 | * menu is automatically created if this widget is editable. Thus | 219 | * menu is automatically created if this widget is editable. Thus |
220 | * you need to call this function with the argument set to false | 220 | * you need to call this function with the argument set to false |
221 | * if you do not want this behaviour. | 221 | * if you do not want this behaviour. |
222 | * | 222 | * |
223 | * @param showMenu If @p true, show the context menu. | 223 | * @param showMenu If @p true, show the context menu. |
224 | */ | 224 | */ |
225 | virtual void setContextMenuEnabled( bool showMenu ) { m_bEnableMenu = showMenu; } | 225 | virtual void setContextMenuEnabled( bool showMenu ) { m_bEnableMenu = showMenu; } |
226 | 226 | ||
227 | /** | 227 | /** |
228 | * Returns @p true when the context menu is enabled. | 228 | * Returns @p true when the context menu is enabled. |
229 | */ | 229 | */ |
230 | bool isContextMenuEnabled() const { return m_bEnableMenu; } | 230 | bool isContextMenuEnabled() const { return m_bEnableMenu; } |
231 | 231 | ||
232 | /** | 232 | /** |
233 | * Enables/Disables handling of URL drops. If enabled and the user | 233 | * Enables/Disables handling of URL drops. If enabled and the user |
234 | * drops an URL, the decoded URL will be inserted. Otherwise the default | 234 | * drops an URL, the decoded URL will be inserted. Otherwise the default |
235 | * behaviour of QLineEdit is used, which inserts the encoded URL. | 235 | * behaviour of QLineEdit is used, which inserts the encoded URL. |
236 | * | 236 | * |
237 | * @param enable If @p true, insert decoded URLs | 237 | * @param enable If @p true, insert decoded URLs |
238 | */ | 238 | */ |
239 | void setURLDropsEnabled( bool enable ); | 239 | void setURLDropsEnabled( bool enable ); |
240 | 240 | ||
241 | /** | 241 | /** |
242 | * Returns @p true when decoded URL drops are enabled | 242 | * Returns @p true when decoded URL drops are enabled |
243 | */ | 243 | */ |
244 | bool isURLDropsEnabled() const; | 244 | bool isURLDropsEnabled() const; |
245 | 245 | ||
246 | /** | 246 | /** |
247 | * By default, OLineEdit recognizes @p Key_Return and @p Key_Enter and emits | 247 | * By default, OLineEdit recognizes @p Key_Return and @p Key_Enter and emits |
248 | * the @ref returnPressed() signals, but it also lets the event pass, | 248 | * the @ref returnPressed() signals, but it also lets the event pass, |
249 | * for example causing a dialog's default-button to be called. | 249 | * for example causing a dialog's default-button to be called. |
250 | * | 250 | * |
251 | * Call this method with @p trap = @p true to make @p OLineEdit stop these | 251 | * Call this method with @p trap = @p true to make @p OLineEdit stop these |
252 | * events. The signals will still be emitted of course. | 252 | * events. The signals will still be emitted of course. |
253 | * | 253 | * |
254 | * @see trapReturnKey() | 254 | * @see trapReturnKey() |
255 | */ | 255 | */ |
256 | void setTrapReturnKey( bool trap ); | 256 | void setTrapReturnKey( bool trap ); |
257 | 257 | ||
258 | /** | 258 | /** |
259 | * @returns @p true if keyevents of @p Key_Return or | 259 | * @returns @p true if keyevents of @p Key_Return or |
260 | * @p Key_Enter will be stopped or if they will be propagated. | 260 | * @p Key_Enter will be stopped or if they will be propagated. |
261 | * | 261 | * |
262 | * @see setTrapReturnKey () | 262 | * @see setTrapReturnKey () |
263 | */ | 263 | */ |
264 | bool trapReturnKey() const; | 264 | bool trapReturnKey() const; |
265 | 265 | ||
266 | /** | 266 | /** |
267 | * Re-implemented for internal reasons. API not affected. | 267 | * Re-implemented for internal reasons. API not affected. |
268 | * | 268 | * |
269 | * @reimplemented | 269 | * @reimplemented |
270 | */ | 270 | */ |
271 | virtual bool eventFilter( QObject *, QEvent * ); | 271 | virtual bool eventFilter( QObject *, QEvent * ); |
272 | 272 | ||
273 | /** | 273 | /** |
274 | * @returns the completion-box, that is used in completion mode | 274 | * @returns the completion-box, that is used in completion mode |
275 | * @ref KGlobalSettings::CompletionPopup. | 275 | * @ref KGlobalSettings::CompletionPopup. |
276 | * This method will create a completion-box if none is there, yet. | 276 | * This method will create a completion-box if none is there, yet. |
277 | * | 277 | * |
278 | * @param create Set this to false if you don't want the box to be created | 278 | * @param create Set this to false if you don't want the box to be created |
279 | * i.e. to test if it is available. | 279 | * i.e. to test if it is available. |
280 | */ | 280 | */ |
281 | OCompletionBox * completionBox( bool create = true ); | 281 | OCompletionBox * completionBox( bool create = true ); |
282 | 282 | ||
283 | /** | 283 | /** |
284 | * Reimplemented for internal reasons, the API is not affected. | 284 | * Reimplemented for internal reasons, the API is not affected. |
285 | */ | 285 | */ |
286 | virtual void setCompletionObject( OCompletion *, bool hsig = true ); | 286 | virtual void setCompletionObject( OCompletion *, bool hsig = true ); |
287 | 287 | ||
288 | 288 | ||
289 | signals: | 289 | signals: |
290 | 290 | ||
291 | /** | 291 | /** |
292 | * Emitted when the user presses the return key. | 292 | * Emitted when the user presses the return key. |
293 | * | 293 | * |
294 | * The argument is the current text. Note that this | 294 | * The argument is the current text. Note that this |
295 | * signal is @em not emitted if the widget's @p EchoMode is set to | 295 | * signal is @em not emitted if the widget's @p EchoMode is set to |
296 | * @ref QLineEdit::EchoMode. | 296 | * @ref QLineEdit::EchoMode. |
297 | */ | 297 | */ |
298 | void returnPressed( const QString& ); | 298 | void returnPressed( const QString& ); |
299 | 299 | ||
300 | /** | 300 | /** |
301 | * Emitted when the completion key is pressed. | 301 | * Emitted when the completion key is pressed. |
302 | * | 302 | * |
303 | * Please note that this signal is @em not emitted if the | 303 | * Please note that this signal is @em not emitted if the |
304 | * completion mode is set to @p CompletionNone or @p EchoMode is | 304 | * completion mode is set to @p CompletionNone or @p EchoMode is |
305 | * @em normal. | 305 | * @em normal. |
306 | */ | 306 | */ |
307 | void completion( const QString& ); | 307 | void completion( const QString& ); |
308 | 308 | ||
309 | /** | 309 | /** |
310 | * Emitted when the shortcut for substring completion is pressed. | 310 | * Emitted when the shortcut for substring completion is pressed. |
311 | */ | 311 | */ |
312 | void substringCompletion( const QString& ); | 312 | void substringCompletion( const QString& ); |
313 | 313 | ||
314 | /** | 314 | /** |
315 | * Emitted when the text rotation key-bindings are pressed. | 315 | * Emitted when the text rotation key-bindings are pressed. |
316 | * | 316 | * |
317 | * The argument indicates which key-binding was pressed. | 317 | * The argument indicates which key-binding was pressed. |
318 | * In OLineEdit's case this can be either one of two values: | 318 | * In OLineEdit's case this can be either one of two values: |
319 | * @ref PrevCompletionMatch or @ref NextCompletionMatch. See | 319 | * @ref PrevCompletionMatch or @ref NextCompletionMatch. See |
320 | * @ref OCompletionBase::setKeyBinding for details. | 320 | * @ref OCompletionBase::setKeyBinding for details. |
321 | * | 321 | * |
322 | * Note that this signal is @em not emitted if the completion | 322 | * Note that this signal is @em not emitted if the completion |
323 | * mode is set to @p KGlobalSettings::CompletionNone or @p echoMode() is @em not normal. | 323 | * mode is set to @p KGlobalSettings::CompletionNone or @p echoMode() is @em not normal. |
324 | */ | 324 | */ |
325 | void textRotation( OCompletionBase::KeyBindingType ); | 325 | void textRotation( OCompletionBase::KeyBindingType ); |
326 | 326 | ||
327 | /** | 327 | /** |
328 | * Emitted when the user changed the completion mode by using the | 328 | * Emitted when the user changed the completion mode by using the |
329 | * popupmenu. | 329 | * popupmenu. |
330 | */ | 330 | */ |
331 | void completionModeChanged( OGlobalSettings::Completion ); | 331 | void completionModeChanged( OGlobalSettings::Completion ); |
332 | 332 | ||
333 | /** | 333 | /** |
334 | * Emitted before the context menu is displayed. | 334 | * Emitted before the context menu is displayed. |
335 | * | 335 | * |
336 | * The signal allows you to add your own entries into the | 336 | * The signal allows you to add your own entries into the |
337 | * the context menu that is created on demand. | 337 | * the context menu that is created on demand. |
338 | * | 338 | * |
339 | * NOTE: Do not store the pointer to the QPopupMenu | 339 | * NOTE: Do not store the pointer to the QPopupMenu |
340 | * provided through since it is created and deleted | 340 | * provided through since it is created and deleted |
341 | * on demand. | 341 | * on demand. |
342 | * | 342 | * |
343 | * @param the context menu about to be displayed | 343 | * @param the context menu about to be displayed |
344 | */ | 344 | */ |
345 | void aboutToShowContextMenu( QPopupMenu* ); | 345 | void aboutToShowContextMenu( QPopupMenu* ); |
346 | 346 | ||
347 | public slots: | 347 | public slots: |
348 | 348 | ||
349 | /** | 349 | /** |
350 | * Re-implemented for internal reasons. API not changed. | 350 | * Re-implemented for internal reasons. API not changed. |
351 | */ | 351 | */ |
352 | virtual void setReadOnly(bool); | 352 | virtual void setReadOnly(bool); |
353 | 353 | ||
354 | /** | 354 | /** |
355 | * Iterates through all possible matches of the completed text or | 355 | * Iterates through all possible matches of the completed text or |
356 | * the history list. | 356 | * the history list. |
357 | * | 357 | * |
358 | * This function simply iterates over all possible matches in case | 358 | * This function simply iterates over all possible matches in case |
359 | * multimple matches are found as a result of a text completion request. | 359 | * multimple matches are found as a result of a text completion request. |
360 | * It will have no effect if only a single match is found. | 360 | * It will have no effect if only a single match is found. |
361 | * | 361 | * |
362 | * @param type The key-binding invoked. | 362 | * @param type The key-binding invoked. |
363 | */ | 363 | */ |
364 | void rotateText( OCompletionBase::KeyBindingType /* type */ ); | 364 | void rotateText( OCompletionBase::KeyBindingType /* type */ ); |
365 | 365 | ||
366 | /** | 366 | /** |
367 | * See @ref OCompletionBase::setCompletedText. | 367 | * See @ref OCompletionBase::setCompletedText. |
368 | */ | 368 | */ |
369 | virtual void setCompletedText( const QString& ); | 369 | virtual void setCompletedText( const QString& ); |
370 | 370 | ||
371 | /** | 371 | /** |
372 | * Sets @p items into the completion-box if @ref completionMode() is | 372 | * Sets @p items into the completion-box if @ref completionMode() is |
373 | * CompletionPopup. The popup will be shown immediately. | 373 | * CompletionPopup. The popup will be shown immediately. |
374 | */ | 374 | */ |
375 | void setCompletedItems( const QStringList& items ); | 375 | void setCompletedItems( const QStringList& items ); |
376 | 376 | ||
377 | /** | 377 | /** |
378 | * Reimplemented to workaround a buggy QLineEdit::clear() | 378 | * Reimplemented to workaround a buggy QLineEdit::clear() |
379 | * (changing the clipboard to the text we just had in the lineedit) | 379 | * (changing the clipboard to the text we just had in the lineedit) |
380 | */ | 380 | */ |
381 | virtual void clear(); | 381 | virtual void clear(); |
382 | 382 | ||
383 | protected slots: | 383 | protected slots: |
384 | 384 | ||
385 | /** | 385 | /** |
386 | * Completes the remaining text with a matching one from | 386 | * Completes the remaining text with a matching one from |
387 | * a given list. | 387 | * a given list. |
388 | */ | 388 | */ |
389 | virtual void makeCompletion( const QString& ); | 389 | virtual void makeCompletion( const QString& ); |
390 | 390 | ||
391 | /** | 391 | /** |
392 | * @deprecated. Will be removed in the next major release! | 392 | * @deprecated. Will be removed in the next major release! |
393 | */ | 393 | */ |
394 | void slotAboutToShow() {} | 394 | void slotAboutToShow() {} |
395 | 395 | ||
396 | /** | 396 | /** |
397 | * @deprecated. Will be removed in the next major release! | 397 | * @deprecated. Will be removed in the next major release! |
398 | */ | 398 | */ |
399 | void slotCancelled() {} | 399 | void slotCancelled() {} |
400 | 400 | ||
401 | protected: | 401 | protected: |
402 | 402 | ||
403 | /** | 403 | /** |
404 | * Re-implemented for internal reasons. API not affected. | 404 | * Re-implemented for internal reasons. API not affected. |
405 | * | 405 | * |
406 | * See @ref QLineEdit::keyPressEvent(). | 406 | * See @ref QLineEdit::keyPressEvent(). |
407 | */ | 407 | */ |
408 | virtual void keyPressEvent( QKeyEvent * ); | 408 | virtual void keyPressEvent( QKeyEvent * ); |
409 | 409 | ||
410 | /** | 410 | /** |
411 | * Re-implemented for internal reasons. API not affected. | 411 | * Re-implemented for internal reasons. API not affected. |
412 | * | 412 | * |
413 | * See @ref QLineEdit::mousePressEvent(). | 413 | * See @ref QLineEdit::mousePressEvent(). |
414 | */ | 414 | */ |
415 | virtual void mousePressEvent( QMouseEvent * ); | 415 | virtual void mousePressEvent( QMouseEvent * ); |
416 | 416 | ||
417 | /** | 417 | /** |
418 | * Re-implemented for internal reasons. API not affected. | 418 | * Re-implemented for internal reasons. API not affected. |
419 | * | 419 | * |
420 | * See @ref QWidget::mouseDoubleClickEvent(). | 420 | * See @ref QWidget::mouseDoubleClickEvent(). |
421 | */ | 421 | */ |
422 | virtual void mouseDoubleClickEvent( QMouseEvent * ); | 422 | virtual void mouseDoubleClickEvent( QMouseEvent * ); |
423 | 423 | ||
424 | /** | 424 | /** |
425 | * Re-implemented for internal reasons. API not affected. | 425 | * Re-implemented for internal reasons. API not affected. |
426 | * | 426 | * |
427 | * See @ref QLineEdit::createPopupMenu(). | 427 | * See @ref QLineEdit::createPopupMenu(). |
428 | */ | 428 | */ |
429 | virtual QPopupMenu *createPopupMenu(); | 429 | virtual QPopupMenu *createPopupMenu(); |
430 | 430 | ||
431 | /** | 431 | /** |
432 | * Re-implemented to handle URI drops. | 432 | * Re-implemented to handle URI drops. |
433 | * | 433 | * |
434 | * See @ref QLineEdit::dropEvent(). | 434 | * See @ref QLineEdit::dropEvent(). |
435 | */ | 435 | */ |
436 | //virtual void dropEvent( QDropEvent * ); | 436 | //virtual void dropEvent( QDropEvent * ); |
437 | 437 | ||
438 | /* | 438 | /* |
439 | * This function simply sets the lineedit text and | 439 | * This function simply sets the lineedit text and |
440 | * highlights the text appropriately if the boolean | 440 | * highlights the text appropriately if the boolean |
441 | * value is set to true. | 441 | * value is set to true. |
442 | * | 442 | * |
443 | * @param text | 443 | * @param text |
444 | * @param marked | 444 | * @param marked |
445 | */ | 445 | */ |
446 | virtual void setCompletedText( const QString& /*text*/, bool /*marked*/ ); | 446 | virtual void setCompletedText( const QString& /*text*/, bool /*marked*/ ); |
447 | 447 | ||
448 | /** | 448 | /** |
449 | * Reimplemented for internal reasons, the API is not affected. | 449 | * Reimplemented for internal reasons, the API is not affected. |
450 | */ | 450 | */ |
451 | virtual void create( WId = 0, bool initializeWindow = true, | 451 | virtual void create( WId = 0, bool initializeWindow = true, |
452 | bool destroyOldWindow = true ); | 452 | bool destroyOldWindow = true ); |
453 | 453 | ||
454 | private slots: | 454 | private slots: |
455 | void completionMenuActivated( int id ); | 455 | void completionMenuActivated( int id ); |
456 | void tripleClickTimeout(); // resets possibleTripleClick | 456 | void tripleClickTimeout(); // resets possibleTripleClick |
457 | 457 | ||
458 | private: | 458 | private: |
459 | // Constants that represent the ID's of the popup menu. | 459 | // Constants that represent the ID's of the popup menu. |
460 | // TODO: See if we can replace this mess with KActionMenu | 460 | // TODO: See if we can replace this mess with KActionMenu |
461 | // in the future though it's working lovely. | 461 | // in the future though it's working lovely. |
462 | enum MenuID { | 462 | enum MenuID { |
463 | Default = 42, | 463 | Default = 42, |
464 | NoCompletion, | 464 | NoCompletion, |
465 | AutoCompletion, | 465 | AutoCompletion, |
466 | ShellCompletion, | 466 | ShellCompletion, |
467 | PopupCompletion, | 467 | PopupCompletion, |
468 | SemiAutoCompletion | 468 | SemiAutoCompletion |
469 | }; | 469 | }; |
470 | 470 | ||
471 | /** | 471 | /** |
472 | * Initializes variables. Called from the constructors. | 472 | * Initializes variables. Called from the constructors. |
473 | */ | 473 | */ |
474 | void init(); | 474 | void init(); |
475 | 475 | ||
476 | /** | 476 | /** |
477 | * Creates the completion box | 477 | * Creates the completion box |
478 | */ | 478 | */ |
479 | void makeCompletionBox(); | 479 | void makeCompletionBox(); |
480 | 480 | ||
481 | /** | 481 | /** |
482 | * Checks whether we should/should not consume a key used as | 482 | * Checks whether we should/should not consume a key used as |
483 | * an accelerator. | 483 | * an accelerator. |
484 | */ | 484 | */ |
485 | //bool overrideAccel (const QKeyEvent* e); | 485 | //bool overrideAccel (const QKeyEvent* e); |
486 | 486 | ||
487 | bool m_bEnableMenu; | 487 | bool m_bEnableMenu; |
488 | 488 | ||
489 | bool possibleTripleClick; // set in mousePressEvent, deleted in tripleClickTimeout | 489 | bool possibleTripleClick; // set in mousePressEvent, deleted in tripleClickTimeout |
490 | 490 | ||
491 | protected: | 491 | protected: |
492 | //virtual void virtual_hook( int id, void* data ); | 492 | //virtual void virtual_hook( int id, void* data ); |
493 | private: | 493 | private: |
494 | class OLineEditPrivate; | 494 | class OLineEditPrivate; |
495 | OLineEditPrivate *d; | 495 | OLineEditPrivate *d; |
496 | }; | 496 | }; |
497 | 497 | ||
498 | #endif | 498 | #endif |