summaryrefslogtreecommitdiff
authoralwin <alwin>2005-02-28 09:40:30 (UTC)
committer alwin <alwin>2005-02-28 09:40:30 (UTC)
commit2b64a84d39eeed5681d0ee5068c7d11a01527750 (patch) (unidiff)
treec8693340dbc5ef5e2f9afa90b690829ddff2c4bd
parent61fa699140c5efbb6ba0bf2a62f7e8fbf62976be (diff)
downloadopie-2b64a84d39eeed5681d0ee5068c7d11a01527750.zip
opie-2b64a84d39eeed5681d0ee5068c7d11a01527750.tar.gz
opie-2b64a84d39eeed5681d0ee5068c7d11a01527750.tar.bz2
other keymapping tool - not working this moment, I have to check it out
- the reason is that the config file is somewhat easier to understand than from zkbapplet and has a nice config tool. Please don't put it into any repositories this moment.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/applets/keyhelper/config.in4
-rw-r--r--noncore/applets/keyhelper/keyhelper.pro2
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.cpp94
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.h45
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.cpp5
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.h56
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.cpp43
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.h44
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/DocLnkWrapper.h47
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/ExecLnk.h38
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.cpp32
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.h33
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/MenuLnk.h41
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp424
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.h114
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.cpp63
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.h34
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.cpp34
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.h38
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.cpp112
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.h42
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.cpp65
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.h26
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp490
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.h75
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.cpp203
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.h51
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.cpp80
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.h48
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.cpp38
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.h23
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.cpp43
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.h56
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.cpp70
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.h46
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.cpp102
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.h48
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp99
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.h48
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.cpp76
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.h39
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.cpp110
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.h35
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionInterface.h26
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.cpp111
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.h40
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.cpp57
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.h63
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.cpp324
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.h110
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.cpp67
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.h29
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/QPopupMenuEx.h28
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp225
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.h85
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.cpp58
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.h61
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/keyhelperapplet.pro80
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.cpp112
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.h89
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.cpp90
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.h15
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.cpp253
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.h87
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.cpp340
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.h72
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.cpp285
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.h80
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.cpp303
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.h37
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.cpp140
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.h86
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.cpp72
-rw-r--r--noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.h14
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/KHCWidget.cpp307
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/KHCWidget.h68
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.cpp162
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.h56
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.ui569
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/KeyNames.cpp274
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/KeyNames.h49
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/keyhelperconf.pro13
-rw-r--r--noncore/applets/keyhelper/keyhelperconf/khcmain.cpp11
-rw-r--r--packages1
84 files changed, 8165 insertions, 0 deletions
diff --git a/noncore/applets/keyhelper/config.in b/noncore/applets/keyhelper/config.in
new file mode 100644
index 0000000..5bba19a
--- a/dev/null
+++ b/noncore/applets/keyhelper/config.in
@@ -0,0 +1,4 @@
1 config KEYHELPER
2 boolean "keyhelper applet (Config keyboard layout on the fly)"
3 default "n"
4 depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE
diff --git a/noncore/applets/keyhelper/keyhelper.pro b/noncore/applets/keyhelper/keyhelper.pro
new file mode 100644
index 0000000..483845d
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelper.pro
@@ -0,0 +1,2 @@
1TEMPLATE = subdirs
2SUBDIRS = keyhelperapplet keyhelperconf
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.cpp
new file mode 100644
index 0000000..3c2298e
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.cpp
@@ -0,0 +1,94 @@
1#include "AnyLnk.h"
2#include "KHUtil.h"
3
4void AnyLnk::loadPixmap()
5{
6 if(m_params.count() >= 3){
7 QString& str = m_params[2];
8 QImage image = Resource::loadImage(str);
9 if(image.isNull() == false){
10 const QSize& size = AppLnkManager::getIconSize();
11 m_pixmap.convertFromImage(
12 image.smoothScale(size.width(), size.height()) );
13 }
14 }
15}
16
17void AnyLnk::parseText()
18{
19 if(m_params.count() >= 2){
20 QString& str = m_params[1];
21 if(str != QString::null && str.length() > 0){
22 replaceKeyword(str);
23 replaceDate(str);
24 }
25 }
26}
27
28void AnyLnk::replaceText(QString& str, const QString& s1, const QString& s2)
29{
30 int index = 0;
31 int idx;
32 int len = s1.length();
33 idx = str.find(s1, index);
34 for(;;){
35 idx = str.find(s1, index);
36 if(idx < 0) break;
37 str.replace(idx, len, s2);
38 index = idx;
39 }
40}
41
42void AnyLnk::replaceDate(QString& str)
43{
44 time_t t;
45 struct tm lct;
46 char buf[4096];
47 int nLen;
48 QString group;
49
50 t = ::time(NULL);
51 ::localtime_r(&t, &lct);
52
53 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
54 group = cfg.getGroup();
55 cfg.setGroup("Global");
56 QString charset = cfg.readEntry("SystemCharSet", "eucJP");
57 if(charset.length() == 0){
58 charset = "eucJP";
59 }
60 cfg.setGroup(group);
61
62 QTextCodec* codec = QTextCodec::codecForName(charset);
63 if(codec == NULL){
64 codec = QTextCodec::codecForLocale();
65 }
66 QTextDecoder* decoder = codec->makeDecoder();
67 QTextEncoder* encoder = codec->makeEncoder();
68 nLen = str.length();
69 QCString localeString = encoder->fromUnicode(str, nLen);
70
71 memset(buf, '\0', sizeof(buf));
72 int n = ::strftime(buf, sizeof(buf), localeString, &lct);
73 if(n > 0){
74 str = decoder->toUnicode(buf, n);
75 }
76 delete decoder;
77 delete encoder;
78}
79
80void AnyLnk::replaceKeyword(QString& str)
81{
82 QString txt;
83 /* clipboard text */
84 QClipboard* cb = QApplication::clipboard();
85 if(cb == NULL){
86 txt == "";
87 } else {
88 txt = cb->text();
89 }
90 replaceText(str, "%clipboard%", txt);
91 /* current app */
92 txt = KHUtil::currentApp();
93 replaceText(str, "%currentapp%", txt);
94}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.h
new file mode 100644
index 0000000..9853942
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AnyLnk.h
@@ -0,0 +1,45 @@
1#ifndef _ANYLNK_H_
2#define _ANYLNK_H_
3
4#include <time.h>
5
6#include <qstring.h>
7#include <qstringlist.h>
8#include <qpixmap.h>
9#include <qimage.h>
10#include <qclipboard.h>
11#include <qtextcodec.h>
12
13#include <qpe/qpeapplication.h>
14#include <qpe/resource.h>
15
16#include "AppLnkManager.h"
17#include "ConfigEx.h"
18
19class AnyLnk
20{
21public:
22 AnyLnk(){}
23 AnyLnk(const QStringList& params){
24 m_params = params;
25 loadPixmap();
26 }
27 virtual ~AnyLnk(){
28 }
29 virtual bool isValid() = 0;
30 virtual void execute() = 0;
31 virtual QString name() = 0;
32 virtual const QPixmap& pixmap() = 0;
33
34protected:
35 QStringList m_params;
36 QPixmap m_pixmap;
37
38 virtual void loadPixmap();
39 virtual void parseText();
40 virtual void replaceText(QString& str, const QString& s1, const QString& s2);
41 virtual void replaceDate(QString& str);
42 virtual void replaceKeyword(QString& str);
43};
44
45#endif /* _ANYLNK_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.cpp
new file mode 100644
index 0000000..5e244a4
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.cpp
@@ -0,0 +1,5 @@
1#include "AppLnkManager.h"
2
3AppLnkSet* AppLnkManager::m_pLnkSet = NULL;
4QSize AppLnkManager::m_oIconSize;
5bool AppLnkManager::m_notfound = true;
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.h
new file mode 100644
index 0000000..8446578
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkManager.h
@@ -0,0 +1,56 @@
1#ifndef _APPLNK_MANAGER_H_
2#define _APPLNK_MANAGER_H_
3
4#include <qsize.h>
5
6#include <qpe/applnk.h>
7#include <qpe/mimetype.h>
8
9class AppLnkManager
10{
11public:
12 AppLnkManager(){
13 }
14 ~AppLnkManager(){
15 if(m_pLnkSet) delete m_pLnkSet;
16 }
17 static void init(bool force=false){
18 if(m_notfound || force){
19 if(m_pLnkSet){
20 delete m_pLnkSet;
21 }
22 qDebug("AppLnkManager::init()");
23 m_pLnkSet = new AppLnkSet(MimeType::appsFolderName());
24 m_notfound = false;
25 }
26 }
27 static AppLnkSet* getInstance(){
28 if(m_pLnkSet == NULL){
29 init(true);
30 }
31 return(m_pLnkSet);
32 }
33 static const QSize& getIconSize(){
34 if(m_oIconSize.isValid()){
35 return(m_oIconSize);
36 }
37 const QList<AppLnk>& lnkList = getInstance()->children();
38 QListIterator<AppLnk> it(lnkList);
39 for(; it.current(); ++it){
40 if((*it)->pixmap().isNull() == false){
41 m_oIconSize = (*it)->pixmap().size();
42 break;
43 }
44 }
45 return(m_oIconSize);
46 }
47 static void notfound(){
48 m_notfound = true;
49 }
50private:
51 static bool m_notfound;
52 static AppLnkSet* m_pLnkSet;
53 static QSize m_oIconSize;
54};
55
56#endif /* _APPLNK_MANAGER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.cpp
new file mode 100644
index 0000000..1c3dbfe
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.cpp
@@ -0,0 +1,43 @@
1#ifndef _APPLNK_WRAPPER_H_
2#define _APPLNK_WRAPPER_H_
3
4#include <qpe/qpeapplication.h>
5#include <qpe/applnk.h>
6#include "AnyLnk.h"
7
8class AppLnkWrapper : public AnyLnk
9{
10public:
11 AppLnkWrapper(){}
12 AppLnkWrapper(const QStringList& params)
13 : AnyLnk(params)
14 {
15 m_pLnk = new AppLnk(QPEApplication::qpeDir()
16 + "apps/" + m_params[0] + ".desktop");
17 }
18 virtual ~AppLnkWrapper(){
19 delete m_pLnk;
20 }
21
22 virtual bool isValid() {
23 return(m_pLnk->isValid());
24 }
25 virtual void execute(){
26 parseText();
27 m_pLnk->execute(m_params[1]);
28 }
29 virtual QString name() {
30 return(m_pLnk->name());
31 }
32 virtual const QPixmap& pixmap(){
33 if(m_pixmap.isNull()){
34 return(m_pLnk->pixmap());
35 } else {
36 return(m_pixmap);
37 }
38 }
39protected:
40 AppLnk* m_pLnk;
41};
42
43#endif /* _APPLNK_WRAPPER_H_ */ \ No newline at end of file
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.h
new file mode 100644
index 0000000..6907dbe
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/AppLnkWrapper.h
@@ -0,0 +1,44 @@
1#ifndef _APPLNK_WRAPPER_H_
2#define _APPLNK_WRAPPER_H_
3
4#include <qpe/qpeapplication.h>
5#include <qpe/applnk.h>
6#include "AnyLnk.h"
7
8class AppLnkWrapper : public AnyLnk
9{
10public:
11 AppLnkWrapper(){}
12 AppLnkWrapper(const QStringList& params)
13 : AnyLnk(params)
14 {
15 m_pLnk = new AppLnk(QPEApplication::qpeDir()
16 + "apps/" + m_params[0] + ".desktop");
17 }
18 virtual ~AppLnkWrapper(){
19 delete m_pLnk;
20 }
21
22 virtual bool isValid() {
23 return(m_pLnk->isValid());
24 }
25 virtual void execute(){
26 parseText();
27 m_pLnk->execute(m_params[1]);
28 }
29 virtual QString name() {
30 return(m_pLnk->name());
31 }
32 virtual const QPixmap& pixmap(){
33 if(m_pixmap.isNull()){
34 return(m_pLnk->pixmap());
35 } else {
36 return(m_pixmap);
37 }
38 }
39protected:
40 AppLnk* m_pLnk;
41};
42
43#endif /* _APPLNK_WRAPPER_H_ */
44
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/DocLnkWrapper.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/DocLnkWrapper.h
new file mode 100644
index 0000000..d6f2be5
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/DocLnkWrapper.h
@@ -0,0 +1,47 @@
1#ifndef _DOCLNK_WRAPPER_H_
2#define _DOCLNK_WRAPPER_H_
3
4#include <qpe/applnk.h>
5#include "AnyLnk.h"
6
7class DocLnkWrapper : public AnyLnk
8{
9public:
10 DocLnkWrapper(){}
11 DocLnkWrapper(const QStringList& params)
12 : AnyLnk(params)
13 {
14 m_pLnk = new DocLnk(m_params[0], false);
15 }
16 virtual ~DocLnkWrapper(){
17 delete m_pLnk;
18 }
19
20 virtual bool isValid() {
21 if(m_pLnk->exec().length() > 0){
22 return(true);
23 } else {
24 return(false);
25 }
26 }
27 virtual void execute(){
28 parseText();
29 m_pLnk->execute(m_params[1]);
30 }
31 virtual QString name() {
32 return(m_pLnk->name());
33 }
34 virtual const QPixmap& pixmap(){
35 if(m_pixmap.isNull()){
36 return(m_pLnk->pixmap());
37 } else {
38 return(m_pixmap);
39 }
40 }
41protected:
42 DocLnk* m_pLnk;
43};
44
45#endif /* _DOCLNK_WRAPPER_H_ */
46
47
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/ExecLnk.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ExecLnk.h
new file mode 100644
index 0000000..7e595df
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ExecLnk.h
@@ -0,0 +1,38 @@
1#ifndef _EXECLNK_H_
2#define _EXECLNK_H_
3
4#include <qpe/qpeapplication.h>
5
6#include "AnyLnk.h"
7#include "ProcessInvoker.h"
8
9class ExecLnk : public AnyLnk
10{
11public:
12 ExecLnk(){}
13 ExecLnk(const QStringList& params)
14 : AnyLnk(params){}
15 virtual ~ExecLnk() {
16 }
17
18 virtual bool isValid() {
19 return(true);
20 }
21 virtual void execute() {
22 parseText();
23 ProcessInvoker& pi = ProcessInvoker::getInstance();
24 pi.setArguments(m_params[1]);
25 pi.setNotify();
26 pi.run();
27 }
28 virtual QString name() {
29 return("exec");
30 }
31 virtual const QPixmap& pixmap() {
32 return(m_pixmap);
33 }
34protected:
35};
36
37#endif /* _EXECLNK_H_ */
38
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.cpp
new file mode 100644
index 0000000..39806e5
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.cpp
@@ -0,0 +1,32 @@
1#include "LnkWrapper.h"
2
3LnkWrapper::LnkWrapper(const QStringList& params)
4{
5 if(params[0][0] == '/'){
6 qDebug("create DocLnk instance");
7 m_pLnk = new DocLnkWrapper(params);
8 } else if(params[0] == "@exec"){
9 qDebug("create ExecLnk instance");
10 m_pLnk = new ExecLnk(params);
11 } else if(params[0] == "@qcop"){
12 qDebug("create QCopLnk instance");
13 m_pLnk = new QCopLnk(params);
14 } else if(params[0] == "@text"){
15 qDebug("create TextLnk instance");
16 m_pLnk = new TextLnk(params);
17 } else if(params[0] == "@menu"){
18 qDebug("create MenuLnk instance");
19 m_pLnk = new MenuLnk(params);
20 } else {
21 qDebug("create AppLnk instance");
22 m_pLnk = new AppLnkWrapper(params);
23 }
24}
25
26LnkWrapper::~LnkWrapper()
27{
28 if(m_pLnk){
29 delete m_pLnk;
30 }
31}
32
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.h
new file mode 100644
index 0000000..6b9536b
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/LnkWrapper.h
@@ -0,0 +1,33 @@
1#ifndef _LNK_WRAPPER_H_
2#define _LNK_WRAPPER_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6
7#include <qpe/applnk.h>
8
9#include "AppLnkWrapper.h"
10#include "DocLnkWrapper.h"
11#include "ExecLnk.h"
12#include "QCopLnk.h"
13#include "TextLnk.h"
14#include "MenuLnk.h"
15
16class LnkWrapper
17{
18public:
19 LnkWrapper(const QStringList& params);
20 virtual ~LnkWrapper();
21
22 bool isValid(){
23 return(m_pLnk && m_pLnk->isValid());
24 }
25 AnyLnk& instance(){
26 return(*m_pLnk);
27 }
28private:
29 AnyLnk* m_pLnk;
30};
31
32#endif /* _LNK_WRAPPER_H_ */
33
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/MenuLnk.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/MenuLnk.h
new file mode 100644
index 0000000..19f75d6
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/MenuLnk.h
@@ -0,0 +1,41 @@
1#ifndef _MENULNK_H_
2#define _MENULNK_H_
3
4#include <qpe/qpeapplication.h>
5
6#include "AnyLnk.h"
7#include "ConfigEx.h"
8
9class MenuLnk : public AnyLnk
10{
11public:
12 MenuLnk(){}
13 MenuLnk(const QStringList& params)
14 : AnyLnk(params){}
15 virtual ~MenuLnk() {
16 }
17
18 virtual bool isValid() {
19 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
20 QString group = cfg.getGroup();
21 cfg.setGroup(name());
22 bool valid = (cfg.getKeys().isEmpty() == false);
23 cfg.setGroup(group);
24 return(valid);
25 }
26 virtual void execute() {
27 }
28 virtual QString name() {
29 QString group;
30 group = m_params[1];
31 group[0] = group[0].upper();
32 return(group);
33 }
34 virtual const QPixmap& pixmap() {
35 return(m_pixmap);
36 }
37protected:
38};
39
40#endif /* _MENULNK_H_ */
41
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp
new file mode 100644
index 0000000..09605bd
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.cpp
@@ -0,0 +1,424 @@
1#include "ProcessInvoker.h"
2
3static ProcessInvoker* g_this;
4/* ------------------------------------------------------------------------ */
5 /* static functions */
6/* ------------------------------------------------------------------------ */
7
8static Sigfunc* setSignalHandler(int signo, Sigfunc* handler)
9{
10 struct sigaction act,oact;
11
12 act.sa_handler = handler;
13 ::sigemptyset(&act.sa_mask);
14 act.sa_flags = 0;
15 #ifdefSA_RESTART
16 act.sa_flags |= SA_RESTART;
17#endif
18 if(::sigaction(signo, &act, &oact) < 0){
19 return(NULL);
20 }
21 return(oact.sa_handler);
22}
23
24static void childHandler(int /*signo*/)
25{
26 pid_t pid;
27 int status;
28 while((pid = ::waitpid(-1, &status, WNOHANG)) > 0){
29 if(pid == g_this->m_child){
30 g_this->notifyFinish(status);
31 }
32 }
33}
34
35/* ------------------------------------------------------------------------ */
36 /* ProcessInvoker Class : parent process */
37/* ------------------------------------------------------------------------ */
38ProcessInvoker::ProcessInvoker()
39{
40 g_this = this;
41 m_isRunning = false;
42 m_child = 0;
43 m_defChildHandler = SIG_DFL;
44 m_pTimer = new QTimer(this);
45 m_stdfd[0] = m_stdfd[1] = -1;
46 m_errfd[0] = m_errfd[1] = -1;
47 connect(m_pTimer, SIGNAL(timeout()),
48 this, SLOT(readOutputs()));
49}
50
51ProcessInvoker::~ProcessInvoker()
52{
53 qDebug("ProcessInvoker::~ProcessInvoker()");
54}
55
56bool ProcessInvoker::openPipe()
57{
58 if(m_stdfd[0] >= 0) closePipe(m_stdfd, 0);
59 if(m_stdfd[1] >= 0) closePipe(m_stdfd, 1);
60 if(::pipe(m_stdfd) < 0){
61 return(false);
62 }
63 if(m_errfd[0] >= 0) closePipe(m_errfd, 0);
64 if(m_errfd[1] >= 0) closePipe(m_errfd, 1);
65 if(::pipe(m_errfd) < 0){
66 closePipe(m_stdfd);
67 return(false);
68 }
69 m_maxfdp1 = m_stdfd[0];
70 if(m_errfd[0] > m_maxfdp1){
71 m_maxfdp1 = m_errfd[0];
72 }
73 m_maxfdp1++;
74 return(true);
75}
76
77void ProcessInvoker::closePipe(int fd[], int n)
78{
79 if(fd == NULL){
80 closePipe(m_stdfd, n);
81 closePipe(m_errfd, n);
82 } else {
83 if(n != 1 && fd[0] >= 0){
84 ::close(fd[0]);
85 fd[0] = -1;
86 }
87 if(n != 0 && fd[1] >= 0){
88 ::close(fd[1]);
89 fd[1] = -1;
90 }
91 }
92}
93
94void ProcessInvoker::setRunning(int pid)
95{
96 m_child = pid;
97 m_isRunning = true;
98}
99
100bool ProcessInvoker::run(const QString& args)
101{
102 //setArguments(KHUtil::parseArgs(args));
103 setArguments(StringParser::split(' ', args));
104 return(run());
105}
106
107bool ProcessInvoker::run()
108{
109 if(m_isRunning){
110 return(false);
111 }
112 m_isRunning = true;
113 if(m_arguments.isEmpty()){
114 m_isRunning = false;
115 return(false);
116 }
117 if(m_arguments[0][0] != '/'){
118 m_isRunning = false;
119 return(false);
120 }
121
122 for(QStringList::Iterator it=m_arguments.begin();
123 it!=m_arguments.end(); ++it){
124 qDebug("arguments[%s]", (*it).ascii());
125 }
126
127 /* open pipe */
128 if(openPipe() == false){
129 m_isRunning = false;
130 return(false);
131 }
132
133 /* signal handler reset */
134 m_defChildHandler = setSignalHandler(SIGCHLD, SIG_DFL);
135
136 m_child = ::fork();
137 if(m_child < 0){
138 /* fork error */
139 closePipe();
140 setSignalHandler(SIGCHLD, m_defChildHandler);
141 m_isRunning = false;
142 return(false);
143 } else if(m_child == 0){
144 /* child process */
145 qDebug("child process[%d]", ::getpid());
146 m_child = ::getpid();
147 //setSignalHandler(SIGCHLD, SIG_DFL);
148 workerProc();
149 /* no return */
150 }
151 /* close pipe(write) */
152 closePipe(NULL, 1);
153#if 0
154 m_pTimer = new QTimer(this);
155 connect(m_pTimer, SIGNAL(timeout()),
156 this, SLOT(readOutputs()));
157#endif
158 m_pTimer->start(500);
159 {
160 emit start(m_child, m_arguments);
161 QCopEnvelope e(SC_CHANNEL, "start(int,QStringList)");
162 e << m_child << m_arguments;
163 if(m_isNotify){
164 int idx = m_arguments[0].findRev('/');
165 notifyStatus(m_arguments[0].mid(idx+1), m_child);
166 }
167 }
168 int status;
169 if(::waitpid(-1, &status, WNOHANG) > 0){
170 qDebug("finish");
171 notifyFinish(status);
172 } else {
173 /* signal handler set */
174 setSignalHandler(SIGCHLD, childHandler);
175 }
176 return(true);
177}
178
179void ProcessInvoker::terminate()
180{
181 if(m_isRunning && m_child > 0){
182 terminate(m_child);
183 }
184}
185
186void ProcessInvoker::terminate(pid_t pid)
187{
188 ::kill(pid, SIGTERM);
189}
190
191void ProcessInvoker::kill()
192{
193 if(m_isRunning && m_child > 0){
194 kill(m_child);
195 }
196}
197
198void ProcessInvoker::kill(pid_t pid)
199{
200 ::kill(pid, SIGKILL);
201}
202
203#if 0
204const QStringList ProcessInvoker::parseArgs(const QString& arguments)
205{
206 QString str;
207 QStringList args;
208 char quote = 0;
209 char c;
210 for(unsigned int i=0; i<arguments.length(); i++){
211 c = arguments[i];
212 switch(c){
213 case '\"':
214 if(quote == 0){
215 quote = c;
216 } else if(quote == '\"'){
217 if(str.length() > 0){
218 args.append(str);
219 }
220 str = "";
221 quote = 0;
222 } else {
223 str += c;
224 }
225 break;
226 case '\'':
227 if(quote == 0){
228 quote = c;
229 } else if(quote == '\''){
230 if(str.length() > 0){
231 args.append(str);
232 }
233 str = "";
234 quote = 0;
235 } else {
236 str += c;
237 }
238 break;
239 case ' ':
240 if(quote == 0){
241 if(str.length() > 0){
242 args.append(str);
243 str = "";
244 }
245 } else {
246 str += c;
247 }
248 break;
249 default:
250 str += c;
251 break;
252 }
253 }
254 if(str.length() > 0){
255 args.append(str);
256 }
257 return(args);
258}
259#endif
260
261void ProcessInvoker::readOutputs()
262{
263 struct timeval tmval;
264 tmval.tv_sec = 0;
265 tmval.tv_usec = 0;
266 fd_set rset;
267
268 QByteArray stdBuf, errBuf, resBuf;
269 QDataStream stdStream(stdBuf, IO_WriteOnly);
270 QDataStream errStream(errBuf, IO_WriteOnly);
271
272 int iRet;
273 bool running;
274 char buf[PIPE_BUF+1];
275 while(true){
276 running = false;
277 FD_ZERO(&rset);
278 if(m_stdfd[0] >= 0){
279 FD_SET(m_stdfd[0], &rset);
280 running = true;
281 }
282 if(m_errfd[0] >= 0){
283 FD_SET(m_errfd[0], &rset);
284 running = true;
285 }
286 if(running == false){
287 m_pTimer->stop();
288 //delete m_pTimer;
289 break;
290 }
291
292 if((iRet = ::select(m_maxfdp1, &rset, NULL, NULL, &tmval)) <= 0){
293 qDebug("select[%d]", iRet);
294 break;
295 }
296
297 if(m_stdfd[0] >= 0 && FD_ISSET(m_stdfd[0], &rset)){
298 int n = ::read(m_stdfd[0], buf, PIPE_BUF);
299 if(n > 0){
300 stdStream.writeRawBytes(buf, n);
301 } else {
302 qDebug("stdout close");
303 closePipe(m_stdfd, 0);
304 }
305 }
306 if(m_errfd[0] >= 0 && FD_ISSET(m_errfd[0], &rset)){
307 int n = ::read(m_errfd[0], buf, PIPE_BUF);
308 if(n > 0){
309 errStream.writeRawBytes(buf, n);
310 } else {
311 qDebug("stderr close");
312 closePipe(m_errfd, 0);
313 }
314 }
315 }
316
317 if(stdBuf.size() > 0){
318 QCopEnvelope e(SC_CHANNEL, "stdout(int,QByteArray)");
319 e << m_child << stdBuf;
320 }
321 if(errBuf.size() > 0){
322 QCopEnvelope e(SC_CHANNEL, "stderr(int,QByteArray)");
323 e << m_child << errBuf;
324 }
325 if(running == false){
326 QCopEnvelope e(SC_CHANNEL, "close(int)");
327 e << m_child;
328 }
329}
330
331#if 0
332void ProcessInvoker::waitFinish()
333{
334 int status;
335 if(::waitpid(m_child, &status, 0) > 0){
336 notifyFinish(status);
337 } else {
338 notifyFinish(0, false);
339 }
340}
341#endif
342
343void ProcessInvoker::notifyFinish(int status, bool success)
344{
345 bool stopped = false;
346 QString result;
347 int code;
348 if(success){
349 if(WIFEXITED(status)){
350 code = WEXITSTATUS(status);
351 if(code == 127){
352 result = "error";
353 } else {
354 result = "exit";
355 }
356 } else if(WIFSIGNALED(status)){
357 result = "terminated";
358 code = WTERMSIG(status);
359 } else if(WIFSTOPPED(status)){
360 result = "stopped";
361 code = WSTOPSIG(status);
362 stopped = true;
363 } else {
364 /* ¤³¤ì¤Ï̵¤¤¤Ï¤º? */
365 result = "error";
366 code = -2;
367 qWarning("ProcessInvoker: unknown status");
368 }
369 } else {
370 result = "error";
371 code = -1;
372 qWarning("ProcessInvoker: wait error");
373 }
374 emit finish(result, code);
375 QCopEnvelope e(SC_CHANNEL, "finish(int,QString,int)");
376 e << m_child << result << code;
377 if(m_isNotify){
378 notifyStatus(result, code);
379 setNotify(false);
380 }
381 if(stopped == false){
382 setSignalHandler(SIGCHLD, m_defChildHandler);
383 m_isRunning = false;
384 }
385}
386
387void ProcessInvoker::notifyStatus(const QString& result, int code)
388{
389 QString message = QString::number(code);
390 message.append(":");
391 message.append(result);
392 Global::statusMessage(message);
393}
394
395/* ------------------------------------------------------------------------ */
396 /* ProcessInvoker Class : child process */
397/* ------------------------------------------------------------------------ */
398void ProcessInvoker::workerProc()
399{
400 closePipe(m_stdfd, 0);
401 closePipe(m_errfd, 0);
402 if(m_stdfd[1] != STDOUT_FILENO){
403 ::dup2(m_stdfd[1], STDOUT_FILENO);
404 closePipe(m_stdfd, 1);
405 }
406 if(m_errfd[1] != STDERR_FILENO){
407 ::dup2(m_errfd[1], STDERR_FILENO);
408 closePipe(m_errfd, 1);
409 }
410
411 QCString* arglist = new QCString[m_arguments.count()+1];
412 const char** argv = new const char*[m_arguments.count()+1];
413 unsigned int i;
414 for(i=0; i<m_arguments.count(); i++){
415 //arglist[i] = m_arguments[i].local8Bit();
416 arglist[i] = m_arguments[i];
417 argv[i] = arglist[i];
418 }
419 argv[i] = 0;
420 ::execv(argv[0], (char*const*)argv);
421 delete[] arglist;
422 delete[] argv;
423 ::_exit(127);
424}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.h
new file mode 100644
index 0000000..1f53cd6
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/ProcessInvoker.h
@@ -0,0 +1,114 @@
1#ifndef _PROCESS_INVOKER_H_
2#define _PROCESS_INVOKER_H_
3
4#include <qobject.h>
5#include <sys/wait.h>
6#include <sys/types.h>
7#include <sys/time.h>
8#include <signal.h>
9#include <stdio.h>
10#include <unistd.h>
11#include <errno.h>
12
13#include <qtimer.h>
14#include <qdatastream.h>
15#include <qcstring.h>
16#include <qpe/qcopenvelope_qws.h>
17#include <qpe/global.h>
18//#include "KHUtil.h"
19#include "StringParser.h"
20
21typedef void Sigfunc(int);
22
23 #define SC_CHANNEL"QPE/ShellCommander"
24
25/* Sigleton Object */
26class ProcessInvoker : public QObject
27{
28 Q_OBJECT
29public:
30 static ProcessInvoker& getInstance()
31 {
32 static ProcessInvoker instance;
33 return(instance);
34 }
35
36 bool run();
37 bool run(const QString& args);
38 void terminate();
39 void terminate(pid_t pid);
40 void kill();
41 void kill(pid_t pid);
42 void setCommand(const QString& command){
43 m_arguments.clear();
44 addArgument(command);
45 }
46 void setArguments(const QStringList& arglist){
47 m_arguments = arglist;
48 }
49 void setArguments(const QString& arguments){
50 //setArguments(KHUtil::parseArgs(arguments));
51 setArguments(StringParser::split(' ', arguments));
52 }
53 void addArgument(const QString& argument){
54 m_arguments.append(argument);
55 }
56 void addArguments(const QString& arguments){
57 QStringList arglist;
58 //arglist = KHUtil::parseArgs(arguments);
59 arglist = StringParser::split(' ', arguments);
60 addArguments(arglist);
61 }
62 void addArguments(const QStringList& arglist){
63 for(QStringList::ConstIterator it=arglist.begin();
64 it!=arglist.end(); ++it){
65 addArgument(*it);
66 }
67 }
68 //const QStringList parseArgs(const QString& arguments);
69 void setRunning(int pid);
70 void setNotify(bool enable=true){
71 m_isNotify = enable;
72 }
73
74 bool isRunning(){
75 return(m_isRunning);
76 }
77 void notifyFinish(int status, bool success=true);
78
79 pid_t m_child;
80
81 friend class Dummy; /* for compile warning */
82signals:
83 void start(int, QStringList);
84 void finish(QString,int);
85private:
86 ProcessInvoker();
87 ProcessInvoker(const ProcessInvoker&);
88 ProcessInvoker& operator=(const ProcessInvoker&);
89 ~ProcessInvoker();
90
91 class Dummy{}; /* for compile warning */
92
93 QTimer* m_pTimer;
94 QStringList m_arguments;
95
96 bool m_isRunning;
97 bool m_isNotify;
98
99 Sigfunc* m_defChildHandler;
100
101 int m_stdfd[2];
102 int m_errfd[2];
103 int m_maxfdp1;
104
105 bool openPipe();
106 void closePipe(int fd[] = NULL, int n = 2);
107 void notifyStatus(const QString& result, int code);
108
109 void workerProc();
110private slots:
111 void readOutputs();
112};
113
114#endif /* _PROCESS_INVOKER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.cpp
new file mode 100644
index 0000000..991bf87
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.cpp
@@ -0,0 +1,63 @@
1#include "QCopLnk.h"
2#include "StringParser.h"
3
4void QCopLnk::execute()
5{
6 parseText();
7 //QStringList argList = KHUtil::parseArgs(m_params[1]);
8 QStringList argList = StringParser::split(' ', m_params[1]);
9 if(argList.count() < 2){
10 return;
11 }
12 QStringList paramList =
13 QStringList::split(QRegExp("[(),]"), argList[1]);
14 if(argList.count() < paramList.count()+1){
15 return;
16 }
17 paramList.remove(paramList.begin());
18 if(paramList.count() == 0){
19 /* send qcop message */
20 QCopEnvelope env(argList[0].latin1(), argList[1].latin1());
21 } else {
22 QCopEnvelope* e = NULL;
23 QStringList::Iterator it=paramList.end();
24 for(unsigned int index = 2; index<argList.count(); index++){
25 if(it == paramList.end()){
26 if(argList.count() - index < paramList.count()){
27 break;
28 }
29 /* initialize */
30 it = paramList.begin();
31 e = new QCopEnvelope(
32 argList[0].latin1(), argList[1].latin1());
33 }
34 QString arg = argList[index];
35 if(*it == "QString"){
36 *e << arg;
37 } else if(*it == "int"){
38 *e << arg.toInt();
39 } else if(*it == "bool"){
40 QString s = arg.lower();
41 int on;
42 if(s == "true"){
43 on = TRUE;
44 } else if(s == "false"){
45 on = FALSE;
46 } else {
47 on = s.toInt();
48 }
49 *e << on;
50 }
51 ++it;
52 if(it == paramList.end()){
53 /* send qcop message */
54 delete e;
55 if(argList.count() - index >= paramList.count()){
56 e = new QCopEnvelope(
57 argList[0].latin1(), argList[1].latin1());
58 it = paramList.begin();
59 }
60 }
61 }
62 }
63}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.h
new file mode 100644
index 0000000..f994149
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/QCopLnk.h
@@ -0,0 +1,34 @@
1#ifndef _QCOPLNK_H_
2#define _QCOPLNK_H_
3
4#include <qpe/qpeapplication.h>
5#include <qpe/qcopenvelope_qws.h>
6
7#include "AnyLnk.h"
8#include "KHUtil.h"
9
10class QCopLnk : public AnyLnk
11{
12public:
13 QCopLnk(){}
14 QCopLnk(const QStringList& params)
15 : AnyLnk(params){}
16 virtual ~QCopLnk() {
17 }
18
19 virtual bool isValid() {
20 return(true);
21 }
22 virtual QString name() {
23 return("qcop");
24 }
25 virtual const QPixmap& pixmap() {
26 return(m_pixmap);
27 }
28
29 virtual void execute();
30protected:
31};
32
33#endif /* _QCOPLNK_H_ */
34
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.cpp b/noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.cpp
new file mode 100644
index 0000000..abb432c
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.cpp
@@ -0,0 +1,34 @@
1#include "TextLnk.h"
2
3void TextLnk::execute()
4{
5 QClipboard* cb = QApplication::clipboard();
6 parseText();
7 cb->setText(m_params[1]);
8 QWSServer::sendKeyEvent('V'-'@',Qt::Key_V, Qt::ControlButton,
9 true, false);
10 QWSServer::sendKeyEvent('V'-'@',Qt::Key_V, Qt::ControlButton,
11 false, false);
12}
13
14void TextLnk::parse(QString& str)
15{
16 replace(str, "\\\\", "\\");
17 replace(str, "\\n", "\n");
18 replace(str, "\\r", "\r");
19 replace(str, "\\t", "\t");
20}
21
22void TextLnk::replace(QString& str, const QString& s1, const QString& s2)
23{
24 int index = 0;
25 int idx;
26 int len = s1.length();
27 idx = str.find(s1, index);
28 for(;;){
29 idx = str.find(s1, index);
30 if(idx < 0) break;
31 str.replace(idx, len, s2);
32 index = idx;
33 }
34}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.h b/noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.h
new file mode 100644
index 0000000..3ae13c5
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/anylnk/TextLnk.h
@@ -0,0 +1,38 @@
1#ifndef _PASTELNK_H_
2#define _PASTELNK_H_
3
4#include <qwindowsystem_qws.h>
5
6#include <qpe/qpeapplication.h>
7#include <qclipboard.h>
8#include <qregexp.h>
9
10#include "AnyLnk.h"
11
12class TextLnk : public AnyLnk
13{
14public:
15 TextLnk(){}
16 TextLnk(const QStringList& params)
17 : AnyLnk(params){}
18 virtual ~TextLnk() {
19 }
20
21 virtual bool isValid() {
22 return(true);
23 }
24 virtual QString name() {
25 return("text");
26 }
27 virtual const QPixmap& pixmap() {
28 return(m_pixmap);
29 }
30
31 virtual void execute();
32protected:
33 virtual void parse(QString& str);
34 virtual void replace(QString& str, const QString& s1, const QString& s2);
35};
36
37#endif /* _PASTELNK_H_ */
38
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.cpp b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.cpp
new file mode 100644
index 0000000..4afdc1f
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.cpp
@@ -0,0 +1,112 @@
1#include "KeyHelper.h"
2#include <opie2/okeyfilter.h>
3
4KeyHelper::KeyHelper()
5{
6 qDebug("KeyHelper::KeyHelper()");
7 load();
8
9 m_oAction.setKeyModifiers(&m_oModifiers);
10 m_oAction.setKeyMappings(&m_oMappings);
11 m_oAction.setKeyExtensions(&m_oExtensions);
12 m_oAction.setKeyRepeater(&m_oRepeater);
13 m_oExtensions.setKeyModifiers(&m_oModifiers);
14}
15
16KeyHelper::~KeyHelper()
17{
18 unset();
19 qDebug("KeyHelper::~KeyHelper()");
20}
21
22bool KeyHelper::filter(int unicode, int keycode, int modifiers,
23 bool isPress, bool autoRepeat)
24{
25 m_oAction.setAction(unicode, keycode, modifiers,
26 isPress, autoRepeat);
27 return(m_oAction.doAction());
28}
29
30void KeyHelper::unset()
31{
32 Opie::Core::OKeyFilter::inst()->remHandler(this);;
33}
34
35void KeyHelper::set()
36{
37 Opie::Core::OKeyFilter::inst()->addHandler(this);
38 m_oModifiers.resetStates();
39}
40
41void KeyHelper::enable()
42{
43 m_oAction.enable();
44}
45
46void KeyHelper::disable()
47{
48 m_oAction.disable();
49 m_oRepeater.stop();
50}
51
52bool KeyHelper::load(const QString& file)
53{
54 KeycfgReader oReader;
55 oReader.setKeyModifiers(&m_oModifiers);
56 oReader.setKeyMappings(&m_oMappings);
57 oReader.setKeyExtensions(&m_oExtensions);
58 oReader.setKeyRepeater(&m_oRepeater);
59
60 bool success;
61 if(file.length() == 0){
62 success = oReader.load();
63 } else if(file[0] == '/'){
64 success = oReader.load(file);
65 } else {
66 //QString filepath = QString(::getenv("HOME")) + "/Settings/" + file;
67 QString filepath = QDir::homeDirPath() + "/Settings/" + file;
68 success = oReader.load(filepath);
69 }
70 if(success == false){
71 qDebug("config xml load error");
72 setDefault();
73 }
74 return(success);
75}
76
77bool KeyHelper::reload(const QString& file)
78{
79 m_oModifiers.reset();
80 m_oMappings.reset();
81 m_oExtensions.reset();
82 m_oRepeater.reset();
83
84 return(load(file));
85}
86
87void KeyHelper::setDefault()
88{
89 /* default settings */
90 m_oExtensions.assign("switch", Qt::Key_F12,
91 m_oModifiers.getMask("Shift"), KeyNames::getCode("Shift"));
92 m_oExtensions.assign("select", Qt::Key_F11,
93 m_oModifiers.getMask("Shift"), KeyNames::getCode("Shift"));
94}
95
96void KeyHelper::statistics()
97{
98 m_oModifiers.statistics();
99 m_oMappings.statistics();
100 m_oExtensions.statistics();
101 m_oRepeater.statistics();
102}
103
104void KeyHelper::dumpkeymap()
105{
106 const QWSServer::KeyMap* m = QWSServer::keyMap();
107 qWarning("KeyHelper::dumpkeymap()");
108 while(m->key_code != 0){
109 qWarning(" [%04x][%04x][%04x][%04x]", m->key_code, m->unicode, m->shift_unicode, m->ctrl_unicode);
110 m++;
111 }
112}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.h b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.h
new file mode 100644
index 0000000..aabb6eb
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelper.h
@@ -0,0 +1,42 @@
1#ifndef _KEY_HELPER_H_
2#define _KEY_HELPER_H_
3
4#include <qdir.h>
5#include <qwindowsystem_qws.h>
6#include "KeyNames.h"
7#include "KeyMappings.h"
8#include "KeyModifiers.h"
9#include "KeyExtensions.h"
10#include "KeyRepeater.h"
11#include "KeyAction.h"
12#include "KeycfgReader.h"
13
14class KeyHelper : public QWSServer::KeyboardFilter
15{
16public:
17 KeyHelper();
18 virtual ~KeyHelper();
19 bool filter(int unicode, int keycode, int modifiers,
20 bool isPress, bool autoRepeat);
21
22 void enable();
23 void disable();
24 void set();
25 void unset();
26 void statistics();
27 void dumpkeymap();
28 bool reload(const QString& file=QString::null);
29private:
30 friend class KeyHelperWidget;
31
32 bool load(const QString& file=QString::null);
33 void setDefault();
34
35 KeyAction m_oAction;
36 KeyMappings m_oMappings;
37 KeyModifiers m_oModifiers;
38 KeyExtensions m_oExtensions;
39 KeyRepeater m_oRepeater;
40};
41
42#endif /* _KEY_HELPER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.cpp b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.cpp
new file mode 100644
index 0000000..28304d7
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.cpp
@@ -0,0 +1,65 @@
1#include "KeyHelperApplet.h"
2#include "KeyHelperWidget.h"
3
4#if 0
5KeyHelperApplet::KeyHelperApplet()
6 : widget(0), ref(0)
7{
8 qDebug("KeyHelperApplet::KeyHelperApplet()");
9}
10
11KeyHelperApplet::~KeyHelperApplet()
12{
13 qDebug("KeyHelperApplet::~KeyHelperApplet()");
14 delete widget;
15}
16
17QWidget* KeyHelperApplet::applet(QWidget* parent)
18{
19 if(!widget){
20 widget = new KeyHelperWidget(parent);
21 }
22 return(widget);
23}
24
25int KeyHelperApplet::position() const
26{
27 return(6);
28}
29
30QRESULT KeyHelperApplet::queryInterface(const QUuid& uuid,
31 QUnknownInterface** iface)
32{
33 *iface = 0;
34
35 if(QFile::exists("/tmp/disable-keyhelper")
36 || QFile::exists("/mnt/card/disable-keyhelper")
37 || QFile::exists("/mnt/cf/disable-keyhelper")){
38 return QS_FALSE;
39 }
40
41 if(uuid == IID_QUnknown){
42 *iface = this;
43 } else if(uuid == IID_TaskbarApplet){
44 *iface = this;
45 }
46
47 if(*iface){
48 (*iface)->addRef();
49 }
50 return QS_OK;
51}
52
53Q_EXPORT_INTERFACE()
54{
55 Q_CREATE_INSTANCE(KeyHelperApplet)
56}
57
58#else
59#include <opie2/otaskbarapplet.h>
60
61using namespace Opie::Ui;
62
63EXPORT_OPIE_APPLET_v1( KeyHelperWidget )
64
65#endif
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.h b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.h
new file mode 100644
index 0000000..ef164dc
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperApplet.h
@@ -0,0 +1,26 @@
1#ifndef _KEY_HELPER_APPLET_H_
2#define _KEY_HELPER_APPLET_H_
3
4#if 0
5#include <qpe/taskbarappletinterface.h>
6#include "KeyHelperWidget.h"
7
8class KeyHelperApplet : public TaskbarAppletInterface
9{
10public:
11 KeyHelperApplet();
12 virtual ~KeyHelperApplet();
13
14 QRESULT queryInterface(const QUuid&, QUnknownInterface**);
15 Q_REFCOUNT
16
17 virtual QWidget* applet(QWidget* parent);
18 virtual int position() const;
19private:
20 KeyHelperWidget* widget;
21 ulong ref;
22};
23
24#endif
25
26#endif /* _KEY_HELPER_APPLET_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp
new file mode 100644
index 0000000..7beb511
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.cpp
@@ -0,0 +1,490 @@
1#include "KeyHelperWidget.h"
2#include "QSafeDataStream.h"
3#include "KHUtil.h"
4
5QWidget* g_Widget = NULL;
6int g_level = 0;
7
8static const char* _version_ = "1.2.2";
9
10KeyHelperWidget::KeyHelperWidget(QWidget* parent, const char* name)
11 : QLabel(parent, name),disabled(Resource::loadPixmap("zkb-disabled"))
12{
13 qDebug("KeyHelperWidget::KeyHelperWidget()");
14 g_Widget = this;
15 m_defHandler = NULL;
16 //m_reset = false;
17 m_reset = true;
18 m_useFilter = false;
19 m_pHelper = NULL;
20 m_status = false;
21
22 //unset();
23 initDebugLevel();
24
25 m_pHelper = new KeyHelper();
26
27 //qApp->installEventFilter(this);
28
29 connect(qwsServer,
30 SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
31 this,
32 SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
33
34 m_pChannel = new QCopChannel("QPE/KeyHelper", this);
35 connect(m_pChannel, SIGNAL(received(const QCString&, const QByteArray&)),
36 this, SLOT(receiveMessage(const QCString&, const QByteArray&)));
37 m_pSysChannel = new QCopChannel("QPE/System", this);
38 connect(m_pSysChannel, SIGNAL(received(const QCString&, const QByteArray&)),
39 this, SLOT(sysMessage(const QCString&, const QByteArray&)));
40
41 //AppLnkManager::init();
42 setFixedWidth ( AppLnk::smallIconSize() );
43 setFixedHeight ( AppLnk::smallIconSize() );
44 setPixmap(disabled);
45 init();
46}
47
48KeyHelperWidget::~KeyHelperWidget()
49{
50 qDebug("KeyHelperWidget::~KeyHelperWidget()");
51 disconnect(qwsServer,
52 SIGNAL(windowEvent(QWSWindow*, QWSServer::WindowEvent)),
53 this,
54 SLOT(windowEvent(QWSWindow*, QWSServer::WindowEvent)));
55 disconnect(m_pChannel, SIGNAL(received(const QCString&, const QByteArray&)),
56 this, SLOT(receiveMessage(const QCString&, const QByteArray&)));
57 unset();
58 if (m_pHelper) delete m_pHelper;
59 if (m_pChannel) delete m_pChannel;
60 if (m_pSysChannel) delete m_pSysChannel;
61 m_pHelper = NULL;
62 setDebugLevel(0);
63}
64
65void KeyHelperWidget::mouseReleaseEvent(QMouseEvent*)
66{
67 ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
68}
69
70void KeyHelperWidget::receiveMessage(
71 const QCString& msg, const QByteArray& data)
72{
73 if(m_pHelper == NULL){
74 return;
75 }
76 QSafeDataStream stream(data, IO_ReadOnly);
77 if(msg == "event(int,int,int,int,int)"){
78 int unicode;
79 int keycode;
80 int modifiers;
81 int isPress;
82 int autoRepeat;
83 stream >> unicode >> keycode >> modifiers >> isPress >> autoRepeat;
84 doEvent(unicode, keycode, modifiers, isPress, autoRepeat);
85 } else if(msg == "event(QString,int)"){
86 QString key;
87 int isPress;
88 stream >> key >> isPress;
89 doEvent(key, isPress);
90 } else if(msg == "enable()"){
91 enable();
92 } else if(msg == "disable()"){
93 disable();
94 } else if(msg == "pause()"){
95 pause();
96 } else if(msg == "restart()"){
97 restart();
98 } else if(msg == "reload()"){
99 m_xmlfile = QString::null;
100 doReload();
101 } else if(msg == "reload(QString)"){
102 stream >> m_xmlfile;
103 doReload(false);
104 } else if(msg == "version()"){
105 version();
106 } else if(msg == "repeater(int)"){
107 int mode;
108 stream >> mode;
109 m_pHelper->m_oRepeater.setMode(mode);
110 } else if(msg == "hook(QString)"){
111 QString s;
112 stream >> s;
113 m_pHelper->m_oAction.setHook(s.local8Bit());
114 } else if(msg == "unhook()"){
115 m_pHelper->m_oAction.setHook("");
116 } else if(msg == "config()"){
117 ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
118 } else if(msg == "config(QString)"){
119 QString name;
120 stream >> name;
121 if(name == QString::null){
122 ConfigEx::getInstance("keyhelper").setConfig("keyhelper");
123 } else {
124 ConfigEx::getInstance("keyhelper").setConfig(name);
125 }
126 } else if(msg == "capture(int)"){
127 int enable;
128 stream >> enable;
129 m_pHelper->m_oAction.setCapture(enable);
130 } else if(msg == "statistics()"){
131 int level = g_level;
132 if(level == 0){
133 setDebugLevel(1);
134 }
135 m_pHelper->statistics();
136 if(level == 0){
137 setDebugLevel(0);
138 }
139 } else if(msg == "dumpkeymap()"){
140 int level = g_level;
141 if(level == 0){
142 setDebugLevel(1);
143 }
144 m_pHelper->dumpkeymap();
145 if(level == 0){
146 setDebugLevel(0);
147 }
148 } else if(msg == "debug(int)"){
149 int level;
150 stream >> level;
151 setDebugLevel(level);
152 }
153}
154
155void KeyHelperWidget::doReload(bool showstatus)
156{
157 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
158 QString oldgroup = cfg.getGroup();
159 cfg.setGroup("Global");
160 m_status = false;
161 if(showstatus && (cfg.readNumEntry("ShowStatusOnReload", 1) == 1)){
162 m_status = true;
163 version();
164 QCopEnvelope("QPE/System", "busy()");
165 }
166 cfg.setGroup(oldgroup);
167 QTimer::singleShot(0, this, SLOT(reload()));
168}
169
170void KeyHelperWidget::doEvent(int unicode, int keycode, int modifiers, int isPress, int autoRepeat)
171{
172 if(isPress == 0 || isPress == 1){
173 m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, isPress, autoRepeat);
174 m_pHelper->m_oAction.doAction();
175 } else {
176 /* press & release */
177 m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, 1, autoRepeat);
178 m_pHelper->m_oAction.doAction();
179 m_pHelper->m_oAction.setAction(unicode, keycode, modifiers, 0, autoRepeat);
180 m_pHelper->m_oAction.doAction();
181 }
182}
183
184void KeyHelperWidget::doEvent(const QString& key, int isPress)
185{
186 int unicode,keycode;
187 int modifiers = 0;
188 int pos;
189 QString keyname = key;
190 pos = keyname.find("+SHIFT", 0, FALSE);
191 if(pos > 0){
192 modifiers |= Qt::ShiftButton;
193 keyname.remove(pos, 6);
194 }
195 pos = keyname.find("+CTRL", 0, FALSE);
196 if(pos > 0){
197 modifiers |= Qt::ControlButton;
198 keyname.remove(pos, 5);
199 }
200 pos = keyname.find("+ALT", 0, FALSE);
201 if(pos > 0){
202 modifiers |= Qt::AltButton;
203 keyname.remove(pos, 4);
204 }
205 if(keyname.length() > 1){
206 unicode = 0xffff;
207 keycode = KeyNames::getCode(keyname);
208 /* get unicode */
209 const QWSServer::KeyMap* m;
210 for(m=QWSServer::keyMap(); m->key_code != 0; m++){
211 if(m->key_code == keycode){
212 if(modifiers & Qt::ControlButton){
213 unicode = m->ctrl_unicode;
214 } else if(modifiers & Qt::ShiftButton){
215 unicode = m->shift_unicode;
216 } else {
217 unicode = m->unicode;
218 }
219 break;
220 }
221 }
222 } else {
223 const QWSServer::KeyMap* m;
224 keycode = 0;
225 unicode = keyname[0].unicode();
226 /* check unicode */
227 for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
228 if(m->unicode == unicode){
229 keycode = m->key_code;
230 break;
231 }
232 }
233 /* check shift_unicode */
234 for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
235 if(m->shift_unicode == unicode){
236 keycode = m->key_code;
237 modifiers |= Qt::ShiftButton;
238 break;
239 }
240 }
241 /* check ctrl_unicode */
242 for(m=QWSServer::keyMap(); keycode == 0 && m->key_code != 0; m++){
243 if(m->ctrl_unicode == unicode){
244 keycode = m->key_code;
245 modifiers |= Qt::ControlButton;
246 break;
247 }
248 }
249 }
250 doEvent(unicode, keycode, modifiers, isPress, 0);
251}
252
253void KeyHelperWidget::sysMessage(
254 const QCString& msg, const QByteArray& data)
255{
256 QSafeDataStream stream(data, IO_ReadOnly);
257 if(msg == "linkChanged(QString)"){
258 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
259 QString oldgroup = cfg.getGroup();
260 if(cfg.readNumEntry("DetectLinkChange", 1) == 1){
261 AppLnkManager::init(true);
262 reload();
263 }
264 cfg.setGroup(oldgroup);
265 }
266}
267
268void MsgHandler(QtMsgType type, const char* msg)
269{
270 switch(type){
271 case QtDebugMsg:
272 if(g_level >= 2){
273 syslog(LOG_LOCAL5|LOG_DEBUG,
274 "<2>%s", msg);
275 }
276 break;
277 case QtWarningMsg:
278 if(g_level >= 1){
279 syslog(LOG_LOCAL5|LOG_DEBUG,
280 "<1>%s", msg);
281 }
282 break;
283 default:
284 break;
285 }
286}
287
288void KeyHelperWidget::initDebugLevel()
289{
290 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
291 cfg.setGroup("Global");
292
293 int level = cfg.readNumEntry("DebugLevel", 0);
294 setDebugLevel(level);
295}
296
297void KeyHelperWidget::setDebugLevel(int level)
298{
299#ifdef QT_QWS_EBX
300 static bool noDebug = true;
301 g_level = level;
302 if(g_level > 0){
303 if(noDebug){
304 m_defHandler = qInstallMsgHandler(MsgHandler);
305 noDebug = false;
306 }
307 } else {
308 qInstallMsgHandler(m_defHandler);
309 noDebug = true;
310 }
311#endif
312}
313
314void KeyHelperWidget::enable()
315{
316 m_enable = true;
317 m_pHelper->enable();
318 //set();
319 QTimer::singleShot(0, this, SLOT(set()));
320}
321
322void KeyHelperWidget::disable()
323{
324 m_enable = false;
325 m_pHelper->disable();
326 unset();
327}
328
329void KeyHelperWidget::pause()
330{
331 m_saved = m_enable;
332 disable();
333}
334
335void KeyHelperWidget::restart()
336{
337 if(m_saved){
338 enable();
339 }
340}
341
342void KeyHelperWidget::reload()
343{
344 disable();
345 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
346 cfg.reload();
347 if(m_pHelper->reload(m_xmlfile) == false){
348 if(m_status){
349 Global::statusMessage("KeyHelper: Load Error");
350 }
351 }
352 init();
353 if(m_status){
354 QCopEnvelope e("QPE/System", "notBusy(QString)");
355 const QString app = KHUtil::currentApp();
356 e << app;
357 m_status = false;
358 }
359}
360
361void KeyHelperWidget::version()
362{
363 QString ver = "KeyHelper ";
364 ver.append(_version_);
365 Global::statusMessage(ver);
366}
367
368void KeyHelperWidget::init()
369{
370 AppLnkManager::init();
371#if 0
372 if(m_pHelper == NULL){
373 m_pHelper = new KeyHelper();
374 }
375#endif
376 loadUseFilterApps();
377 enable();
378}
379
380void KeyHelperWidget::set()
381{
382 if(m_pHelper != NULL && m_enable == true && m_useFilter == false){
383 qWarning("KeyHelperWidget::set()");
384 m_pHelper->set();
385 }
386}
387
388void KeyHelperWidget::unset()
389{
390 m_pHelper->unset();
391}
392
393void KeyHelperWidget::loadUseFilterApps()
394{
395 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
396
397 cfg.setGroup("Global");
398 m_apps = cfg.readListEntry("UseFilterApps", ',');
399
400 if(m_apps.isEmpty()){
401 /* default */
402 m_apps.append("CRIM");
403 m_apps.append("Jpn50Pad");
404 m_apps.append("JpnKtnPad");
405 m_apps.append("JpnNumPad");
406 m_apps.append("JpnSymPad");
407 m_apps.append("Keyboard");
408 m_apps.append("IMWidget"); /* IMKit */
409 m_apps.append("POBox"); /* QPOBox */
410 }
411}
412
413#if 0
414void KeyHelperWidget::windowEvent(QWSWindow* w, QWSServer::WindowEvent e)
415{
416 if(m_apps.contains(w->name())){
417 switch(e){
418 case QWSServer::Hide:
419 case QWSServer::Destroy:
420 m_useFilter = false;
421 //m_reset = true;
422 QTimer::singleShot(0, this, SLOT(set()));
423 break;
424 case QWSServer::Create:
425 case QWSServer::Raise:
426 case QWSServer::Show:
427 m_useFilter = true;
428 //m_reset = false;
429 m_reset = true;
430 break;
431 default:
432 break;
433 }
434 } else if(w->client()->identity() != NULL && w->name() != NULL){
435 switch(e){
436#if 0
437 case QWSServer::Create:
438 case QWSServer::Hide:
439 if(m_useFilter == false && m_reset){
440 m_reset = false;
441 set();
442 //QTimer::singleShot(0, this, SLOT(set()));
443 }
444 break;
445#else
446 case QWSServer::Hide:
447 case QWSServer::Destroy:
448 //if(m_useFilter == false && m_reset){
449 if(m_reset){
450 m_reset = false;
451 set();
452 //QTimer::singleShot(0, this, SLOT(set()));
453 }
454 break;
455 case QWSServer::Create:
456 case QWSServer::Raise:
457 case QWSServer::Show:
458 m_reset = true;
459 break;
460#endif
461 default:
462#if 0
463 if(m_reset == true){
464 m_reset = false;
465 set();
466 }
467#endif
468 break;
469 }
470 }
471 if(w->name() != NULL){
472 qWarning("[%s][%s][%x][%s]",
473 w->name().latin1(),
474 w->caption().latin1(),
475 e,
476 w->client()->identity().latin1());
477 }
478}
479
480#endif
481
482bool KeyHelperWidget::eventFilter(QObject* o, QEvent* e)
483{
484 return QWidget::eventFilter(o, e);
485}
486
487int KeyHelperWidget::position()
488{
489 return 3;
490}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.h b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.h
new file mode 100644
index 0000000..4798c5c
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/KeyHelperWidget.h
@@ -0,0 +1,75 @@
1#ifndef _KEY_HELPER_WIDGET_H_
2#define _KEY_HELPER_WIDGET_H_
3
4#include <qwidget.h>
5#include <qlabel.h>
6#include <qpixmap.h>
7#include <qtimer.h>
8#include <qaccel.h>
9#include <opie2/otaskbarapplet.h>
10#include <opie2/okeyfilter.h>
11
12#include <qpe/qcopenvelope_qws.h>
13#include <qpe/qpeapplication.h>
14#include <qpe/global.h>
15#include <qpe/resource.h>
16#include "KeyHelper.h"
17#include "AppLnkManager.h"
18#include "ConfigEx.h"
19
20#include <syslog.h>
21
22Q_EXPORT void MsgHandler(QtMsgType type, const char* msg);
23
24class KeyHelperWidget : public QLabel
25{
26 Q_OBJECT
27public:
28 KeyHelperWidget(QWidget* parent = 0, const char* name=0);
29 ~KeyHelperWidget();
30 static int position();
31
32 virtual bool eventFilter(QObject* o, QEvent* e);
33
34public slots:
35 //void windowEvent(QWSWindow* w, QWSServer::WindowEvent e);
36protected:
37 QCopChannel* m_pChannel;
38 QCopChannel* m_pSysChannel;
39 QPixmap disabled;
40
41protected slots:
42 void receiveMessage(const QCString& msg, const QByteArray& data);
43 void sysMessage(const QCString& msg, const QByteArray& data);
44 void reload();
45 void set();
46 void unset();
47 void init();
48 void mouseReleaseEvent(QMouseEvent*);
49
50private:
51 void loadUseFilterApps();
52 void enable();
53 void disable();
54 void pause();
55 void restart();
56 void version();
57 void setDebugLevel(int level);
58 void initDebugLevel();
59
60 bool m_reset;
61 bool m_useFilter;
62 bool m_status;
63 QString m_xmlfile;
64 msg_handler m_defHandler;
65 bool m_enable;
66 bool m_saved;
67 QStringList m_apps;
68 KeyHelper* m_pHelper;
69private slots:
70 void doReload(bool showstatus=true);
71 void doEvent(int,int,int,int,int);
72 void doEvent(const QString&, int);
73};
74
75#endif /* _KEY_HELPER_WIDGET_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.cpp b/noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.cpp
new file mode 100644
index 0000000..69ba562
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.cpp
@@ -0,0 +1,203 @@
1#include "QSafeDataStream.h"
2
3#include <qstring.h>
4#include <qstringlist.h>
5#include <qdatetime.h>
6
7QSafeDataStream &QSafeDataStream::operator>>( Q_INT8 &i )
8{
9 if(atEnd()){
10 i = 0;
11 return *this;
12 } else {
13 return (QSafeDataStream&)QDataStream::operator>>(i);
14 }
15}
16
17QSafeDataStream &QSafeDataStream::operator>>( Q_UINT8 &i )
18{
19 if(atEnd()){
20 i = 0;
21 return *this;
22 } else {
23 return (QSafeDataStream&)QDataStream::operator>>(i);
24 }
25}
26
27QSafeDataStream &QSafeDataStream::operator>>( Q_INT16 &i )
28{
29 if(atEnd()){
30 i = 0;
31 return *this;
32 } else {
33 return (QSafeDataStream&)QDataStream::operator>>(i);
34 }
35}
36
37QSafeDataStream &QSafeDataStream::operator>>( Q_UINT16 &i )
38{
39 if(atEnd()){
40 i = 0;
41 return *this;
42 } else {
43 return (QSafeDataStream&)QDataStream::operator>>(i);
44 }
45}
46
47QSafeDataStream &QSafeDataStream::operator>>( Q_INT32 &i )
48{
49 if(atEnd()){
50 i = 0;
51 return *this;
52 } else {
53 return (QSafeDataStream&)QDataStream::operator>>(i);
54 }
55}
56
57QSafeDataStream &QSafeDataStream::operator>>( Q_UINT32 &i )
58{
59 if(atEnd()){
60 i = 0;
61 return *this;
62 } else {
63 return (QSafeDataStream&)QDataStream::operator>>(i);
64 }
65}
66
67QSafeDataStream &QSafeDataStream::operator>>( Q_INT64 &i )
68{
69 if(atEnd()){
70 i = 0;
71 return *this;
72 } else {
73 return (QSafeDataStream&)QDataStream::operator>>(i);
74 }
75}
76
77QSafeDataStream &QSafeDataStream::operator>>( Q_UINT64 &i )
78{
79 if(atEnd()){
80 i = 0;
81 return *this;
82 } else {
83 return (QSafeDataStream&)QDataStream::operator>>(i);
84 }
85}
86
87
88QSafeDataStream &QSafeDataStream::operator>>( float &f )
89{
90 if(atEnd()){
91 f = 0;
92 return *this;
93 } else {
94 return (QSafeDataStream&)QDataStream::operator>>(f);
95 }
96}
97
98QSafeDataStream &QSafeDataStream::operator>>( double &f )
99{
100 if(atEnd()){
101 f = 0;
102 return *this;
103 } else {
104 return (QSafeDataStream&)QDataStream::operator>>(f);
105 }
106}
107
108QSafeDataStream &QSafeDataStream::operator>>( char *&str )
109{
110 if(atEnd()){
111 str = 0;
112 return *this;
113 } else {
114 return (QSafeDataStream&)QDataStream::operator>>(str);
115 }
116}
117
118QSafeDataStream &QSafeDataStream::readBytes( char *&s, uint &len )
119{
120 if(atEnd()){
121 s = 0;
122 len = 0;
123 return *this;
124 } else {
125 return (QSafeDataStream&)QDataStream::readBytes(s, len);
126 }
127}
128
129QSafeDataStream &QSafeDataStream::readRawBytes( char *s, uint len )
130{
131 if(atEnd()){
132 return *this;
133 } else {
134 return (QSafeDataStream&)QDataStream::readRawBytes(s, len);
135 }
136}
137
138QSafeDataStream &QSafeDataStream::operator>>( QString& s )
139{
140 if(atEnd()){
141 s = QString::null;
142 return *this;
143 } else {
144 return (QSafeDataStream&)(*((QDataStream*)this) >> s);
145 }
146}
147
148QSafeDataStream &QSafeDataStream::operator>>( QStringList& list )
149{
150 if(atEnd()){
151 list.clear();
152 return *this;
153 } else {
154 return (QSafeDataStream&)(*((QDataStream*)this) >> list);
155 }
156}
157
158QSafeDataStream &QSafeDataStream::operator>>( QByteArray& a )
159{
160 if(atEnd()){
161 a.resize(0);
162 return *this;
163 } else {
164 return (QSafeDataStream&)(*((QDataStream*)this) >> a);
165 }
166}
167
168QSafeDataStream &QSafeDataStream::operator>>( QCString& s )
169{
170 if(atEnd()){
171 s.resize(0);
172 return *this;
173 } else {
174 return (QSafeDataStream&)(*((QDataStream*)this) >> s);
175 }
176}
177
178QSafeDataStream &QSafeDataStream::operator>>( QDate& d )
179{
180 if(atEnd()){
181 return *this;
182 } else {
183 return (QSafeDataStream&)(*((QDataStream*)this) >> d);
184 }
185}
186
187QSafeDataStream &QSafeDataStream::operator>>( QTime& t )
188{
189 if(atEnd()){
190 return *this;
191 } else {
192 return (QSafeDataStream&)(*((QDataStream*)this) >> t);
193 }
194}
195
196QSafeDataStream &QSafeDataStream::operator>>( QDateTime& dt )
197{
198 if(atEnd()){
199 return *this;
200 } else {
201 return (QSafeDataStream&)(*((QDataStream*)this) >> dt);
202 }
203}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.h b/noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.h
new file mode 100644
index 0000000..2152b23
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/applet/QSafeDataStream.h
@@ -0,0 +1,51 @@
1#ifndef _QSAFEDATASTREAM_H_
2#define _QSAFEDATASTREAM_H_
3
4#include <qdatastream.h>
5
6class QString;
7class QStringList;
8class QCString;
9class QDate;
10class QTime;
11class QDateTime;
12
13class QSafeDataStream : public QDataStream
14{
15public:
16 /* constructors */
17 QSafeDataStream()
18 : QDataStream() {}
19 QSafeDataStream(QIODevice* d)
20 : QDataStream(d) {}
21 QSafeDataStream(QByteArray a, int mode)
22 : QDataStream(a, mode) {}
23
24 /* read functions */
25 QSafeDataStream &operator>>( Q_INT8 &i );
26 QSafeDataStream &operator>>( Q_UINT8 &i );
27 QSafeDataStream &operator>>( Q_INT16 &i );
28 QSafeDataStream &operator>>( Q_UINT16 &i );
29 QSafeDataStream &operator>>( Q_INT32 &i );
30 QSafeDataStream &operator>>( Q_UINT32 &i );
31 QSafeDataStream &operator>>( Q_INT64 &i );
32 QSafeDataStream &operator>>( Q_UINT64 &i );
33
34 QSafeDataStream &operator>>( float &f );
35 QSafeDataStream &operator>>( double &f );
36 QSafeDataStream &operator>>( char *&str );
37
38 QSafeDataStream &readBytes( char *&, uint &len );
39 QSafeDataStream &readRawBytes( char *, uint len );
40
41 QSafeDataStream &operator>>( QString& s );
42 QSafeDataStream &operator>>( QStringList& list );
43 QSafeDataStream &operator>>( QByteArray& a );
44 QSafeDataStream &operator>>( QCString& s );
45 QSafeDataStream &operator>>( QDate& d );
46 QSafeDataStream &operator>>( QTime& t );
47 QSafeDataStream &operator>>( QDateTime& dt );
48
49};
50
51#endif /* _QSAFEDATASTREAM_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.cpp
new file mode 100644
index 0000000..84bb375
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.cpp
@@ -0,0 +1,80 @@
1#include "ExtensionsHandler.h"
2
3void ExtensionsHandler::dispose(QXmlReader* parser, QXmlContentHandler* parent)
4{
5 m_parser = parser;
6 m_parent = parent;
7 m_parser->setContentHandler(this);
8}
9
10bool ExtensionsHandler::startElement(const QString& /* namespaceURI */,
11 const QString& localName,
12 const QString& /* qName */,
13 const QXmlAttributes& attr)
14{
15 if(localName == "define"){
16 /* ÊÑ¿ô½é´ü²½ */
17 m_kind = QString::null;
18 m_code = -1;
19 //m_mask = 0;
20 m_modlist.clear();
21 for(int i=0; i<attr.length(); i++){
22 if(attr.localName(i).lower() == "key"){
23 /* keyname */
24 if(attr.value(i) == "All"){
25 m_code = 0;
26 } else {
27 m_code = KeyNames::getCode(attr.value(i));
28 }
29 } else if(attr.localName(i).lower() == "code"){
30 /* keycode */
31 m_code = KHUtil::hex2int(attr.value(i).lower());
32 } else if(attr.localName(i).lower() == "kind"){
33 /* extension kind */
34 m_kind = attr.value(i);
35 }
36 }
37 } else if(localName == "modifier"){
38 /* modifier keys */
39 for(int i=0; i<attr.length(); i++){
40 if(attr.value(i).lower() == "on"){
41 m_modlist.append(attr.localName(i));
42 //m_mask |= m_pModifiers->getMask(attr.localName(i));
43 }
44 }
45 }
46 return(true);
47}
48
49bool ExtensionsHandler::endElement(const QString& /* namespaceURI */,
50 const QString& localName,
51 const QString& /* qName */)
52{
53 if(localName == "define"){
54#if 0
55 if(m_kind != QString::null
56 && (m_code > 0 || m_modlist.isEmpty() == false)){
57#else
58 if(m_kind != QString::null && m_code >= 0){
59#endif
60 /* assign extension */
61 int keymask = 0;
62 QValueList<int> modcodes;
63 for(QStringList::Iterator it=m_modlist.begin();
64 it!=m_modlist.end(); ++it){
65 keymask |= m_pModifiers->getMask(*it);
66 qDebug("mask[%s][%x][%s]", m_kind.latin1(), keymask, (*it).latin1());
67 int code = KeyNames::getCode(*it);
68 if(code > 0){
69 modcodes.append(code);
70 }
71 }
72 m_pExtensions->assign(m_kind, m_code, keymask, modcodes);
73 }
74 } else if(localName == "extensions"){
75 m_pExtensions->init();
76 /* return parent */
77 m_parser->setContentHandler(m_parent);
78 }
79 return(true);
80}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.h b/noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.h
new file mode 100644
index 0000000..cc2422b
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/ExtensionsHandler.h
@@ -0,0 +1,48 @@
1#ifndef _EXTENSIONS_HANDLER_H_
2#define _EXTENSIONS_HANDLER_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6#include <qvaluelist.h>
7#include <qxml.h>
8#include "KeyModifiers.h"
9#include "KeyExtensions.h"
10#include "KeyNames.h"
11#include "KHUtil.h"
12
13class ExtensionsHandler : public QXmlDefaultHandler
14{
15public:
16 void dispose(QXmlReader* parser, QXmlContentHandler* parent);
17
18 void setKeyModifiers(KeyModifiers* mod)
19 {
20 m_pModifiers = mod;
21 }
22 void setKeyExtensions(KeyExtensions* ext)
23 {
24 m_pExtensions = ext;
25 }
26
27 bool startElement(const QString& namespaceURI,
28 const QString& localName,
29 const QString& qName,
30 const QXmlAttributes& atts);
31 bool endElement(const QString& namespaceURI,
32 const QString& localName,
33 const QString& qName);
34private:
35 QXmlContentHandler* m_parent;
36 QXmlReader* m_parser;
37
38 KeyModifiers* m_pModifiers;
39 KeyExtensions* m_pExtensions;
40
41 QString m_kind;
42 int m_code;
43 QStringList m_modlist;
44 //int m_mask;
45
46};
47
48#endif /* _EXTENSIONS_HANDLER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.cpp
new file mode 100644
index 0000000..e1faf18
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.cpp
@@ -0,0 +1,38 @@
1#include "KeycfgErrorHandler.h"
2
3void KeycfgErrorHandler::setErrorString(const QString& header,
4 const QXmlParseException& exception)
5{
6 m_errstr = header;
7 m_errstr.append(": ");
8 m_errstr.append(exception.message());
9 m_errstr.append(" [");
10 m_errstr.append(QString::number(exception.lineNumber()));
11 m_errstr.append(", ");
12 m_errstr.append(QString::number(exception.columnNumber()));
13 m_errstr.append("]");
14 qWarning(m_errstr.latin1());
15}
16
17bool KeycfgErrorHandler::warning(const QXmlParseException& exception)
18{
19 setErrorString("warning", exception);
20 return(true);
21}
22
23bool KeycfgErrorHandler::error(const QXmlParseException& exception)
24{
25 setErrorString("error", exception);
26 return(false);
27}
28
29bool KeycfgErrorHandler::fatalError(const QXmlParseException& exception)
30{
31 setErrorString("fatal", exception);
32 return(false);
33}
34
35QString KeycfgErrorHandler::errorString()
36{
37 return(m_errstr);
38}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.h b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.h
new file mode 100644
index 0000000..61e7e70
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgErrorHandler.h
@@ -0,0 +1,23 @@
1#ifndef _KEYCFG_ERROR_HANDLER_H_
2#define _KEYCFG_ERROR_HANDLER_H_
3
4#include <qstring.h>
5#include <qxml.h>
6
7class KeycfgErrorHandler : public QXmlErrorHandler
8{
9public:
10 KeycfgErrorHandler(){}
11 virtual ~KeycfgErrorHandler(){}
12
13 bool warning(const QXmlParseException& exception);
14 bool error(const QXmlParseException& exception);
15 bool fatalError(const QXmlParseException& exception);
16 QString errorString();
17private:
18 void setErrorString(const QString& header,
19 const QXmlParseException& exception);
20 QString m_errstr;
21};
22
23#endif /* _KEYCFG_ERROR_HANDLER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.cpp
new file mode 100644
index 0000000..a342e36
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.cpp
@@ -0,0 +1,43 @@
1#include "KeycfgHandler.h"
2
3KeycfgHandler::KeycfgHandler(QXmlReader* parser)
4 : QXmlDefaultHandler()
5{
6 m_parser = parser;
7 m_pModHandler = new ModifiersHandler();
8 m_pMapHandler = new MappingsHandler();
9 m_pExtHandler = new ExtensionsHandler();
10 m_pRepHandler = new RepeaterHandler();
11}
12
13KeycfgHandler::~KeycfgHandler()
14{
15 delete m_pModHandler;
16 delete m_pMapHandler;
17 delete m_pExtHandler;
18 delete m_pRepHandler;
19}
20
21bool KeycfgHandler::startElement(const QString& /* namespaceURI */,
22 const QString& localName,
23 const QString& /* qName */,
24 const QXmlAttributes& /* attr */)
25{
26 if(localName == "modifiers"){
27 m_pModHandler->setKeyModifiers(m_pModifiers);
28 m_pModHandler->setKeyMappings(m_pMappings);
29 m_pModHandler->dispose(m_parser, this);
30 } else if(localName == "mappings"){
31 m_pMapHandler->setKeyModifiers(m_pModifiers);
32 m_pMapHandler->setKeyMappings(m_pMappings);
33 m_pMapHandler->dispose(m_parser, this);
34 } else if(localName == "extensions"){
35 m_pExtHandler->setKeyModifiers(m_pModifiers);
36 m_pExtHandler->setKeyExtensions(m_pExtensions);
37 m_pExtHandler->dispose(m_parser, this);
38 } else if(localName == "repeater"){
39 m_pRepHandler->setKeyRepeater(m_pRepeater);
40 m_pRepHandler->dispose(m_parser, this);
41 }
42 return(true);
43}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.h b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.h
new file mode 100644
index 0000000..9ddded3
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgHandler.h
@@ -0,0 +1,56 @@
1#ifndef _KEYCFG_HANDLER_H_
2#define _KEYCFG_HANDLER_H_
3
4#include <qxml.h>
5#include <qstring.h>
6#include "ModifiersHandler.h"
7#include "MappingsHandler.h"
8#include "ExtensionsHandler.h"
9#include "RepeaterHandler.h"
10
11class KeycfgHandler : public QXmlDefaultHandler
12{
13public:
14 KeycfgHandler(QXmlReader* parser);
15 ~KeycfgHandler();
16
17 void dispose(QXmlReader* parser, QXmlContentHandler* parent);
18
19 void setKeyModifiers(KeyModifiers* mod)
20 {
21 m_pModifiers = mod;
22 }
23 void setKeyMappings(KeyMappings* map)
24 {
25 m_pMappings = map;
26 }
27 void setKeyExtensions(KeyExtensions* ext)
28 {
29 m_pExtensions = ext;
30 }
31 void setKeyRepeater(KeyRepeater* rep)
32 {
33 m_pRepeater = rep;
34 }
35
36
37 bool startElement(const QString& namespaceURI,
38 const QString& localName,
39 const QString& qName,
40 const QXmlAttributes& atts);
41private:
42 QXmlContentHandler* m_parent;
43 QXmlReader* m_parser;
44
45 ModifiersHandler* m_pModHandler;
46 MappingsHandler* m_pMapHandler;
47 ExtensionsHandler* m_pExtHandler;
48 RepeaterHandler* m_pRepHandler;
49
50 KeyModifiers* m_pModifiers;
51 KeyMappings* m_pMappings;
52 KeyExtensions* m_pExtensions;
53 KeyRepeater* m_pRepeater;
54};
55
56#endif /* _KEYCFG_HANDLER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.cpp
new file mode 100644
index 0000000..44b4b2f
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.cpp
@@ -0,0 +1,70 @@
1#include "KeycfgReader.h"
2
3KeycfgReader::KeycfgReader()
4{
5 qDebug("KeycfgReader::KeycfgReader()");
6}
7
8KeycfgReader::~KeycfgReader()
9{
10 qDebug("KeycfgReader::~KeycfgReader()");
11}
12
13bool KeycfgReader::load()
14{
15 QString file;
16 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
17
18 cfg.setGroup("Global");
19
20 file = cfg.readEntry("XmlFile");
21 if(file.length() == 0 || !QFile::exists(file)){
22 /* default */
23 file = QDir::homeDirPath() + "/Settings/keyhelper.xml";
24 }
25 return(load(file));
26}
27
28bool KeycfgReader::load(const QString& path)
29{
30 bool success = false;
31
32 KeyNames::reset();
33
34 QXmlSimpleReader parser;
35 KeycfgHandler handler(&parser);
36 KeycfgErrorHandler errhandler;
37 QFile file(path);
38
39 qWarning("KeycfgReader::load()[%s]", path.latin1());
40
41 if(file.exists()){
42 QXmlInputSource source(file);
43
44 handler.setKeyModifiers(m_pModifiers);
45 handler.setKeyMappings(m_pMappings);
46 handler.setKeyExtensions(m_pExtensions);
47 handler.setKeyRepeater(m_pRepeater);
48
49 parser.setContentHandler(&handler);
50 parser.setErrorHandler(&errhandler);
51 success = parser.parse(source);
52
53 file.close();
54 }
55
56 if(success){
57 m_pModifiers->statistics();
58 m_pMappings->statistics();
59 m_pExtensions->statistics();
60 m_pRepeater->statistics();
61 } else {
62 m_pModifiers->reset();
63 m_pMappings->reset();
64 m_pExtensions->reset();
65 m_pRepeater->reset();
66 }
67 KeyNames::clearCode();
68
69 return(success);
70}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.h b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.h
new file mode 100644
index 0000000..8624a01
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/KeycfgReader.h
@@ -0,0 +1,46 @@
1#ifndef _KEYCFG_READER_H_
2#define _KEYCFG_READER_H_
3
4#include <stdlib.h>
5#include <qxml.h>
6#include <qstring.h>
7#include <qdir.h>
8#include "KeycfgHandler.h"
9#include "KeycfgErrorHandler.h"
10#include "KeyNames.h"
11#include "ConfigEx.h"
12
13class KeycfgReader
14{
15public:
16 KeycfgReader();
17 ~KeycfgReader();
18
19 bool load();
20 bool load(const QString& path);
21
22 inline void setKeyModifiers(KeyModifiers* mod)
23 {
24 m_pModifiers = mod;
25 }
26 inline void setKeyMappings(KeyMappings* map)
27 {
28 m_pMappings = map;
29 }
30 inline void setKeyExtensions(KeyExtensions* ext)
31 {
32 m_pExtensions = ext;
33 }
34 inline void setKeyRepeater(KeyRepeater* rep)
35 {
36 m_pRepeater = rep;
37 }
38
39private:
40 KeyModifiers* m_pModifiers;
41 KeyMappings* m_pMappings;
42 KeyExtensions* m_pExtensions;
43 KeyRepeater* m_pRepeater;
44};
45
46#endif /* _KEYCFG_READER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.cpp
new file mode 100644
index 0000000..3680fbf
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.cpp
@@ -0,0 +1,102 @@
1#include "MappingsHandler.h"
2
3void MappingsHandler::dispose(QXmlReader* parser, QXmlContentHandler* parent)
4{
5 m_parser = parser;
6 m_parent = parent;
7 m_parser->setContentHandler(this);
8}
9
10bool MappingsHandler::startElement(const QString& /* namespaceURI */,
11 const QString& localName,
12 const QString& /* qName */,
13 const QXmlAttributes& attr)
14{
15 if(localName == "define"){
16 /* ÊÑ¿ô½é´ü²½ */
17 m_code = 0;
18 m_mask = 0;
19 m_mapcode = 0;
20 m_unicode = 0;
21 m_mapmodifiers.clear();
22 m_mapunicodes.clear();
23 for(int i=0; i<attr.length(); i++){
24 if(attr.localName(i).lower() == "key"){
25 /* keyname */
26 m_code = KeyNames::getCode(attr.value(i));
27 } else if(attr.localName(i).lower() == "code"){
28 /* keycode */
29 m_code = KHUtil::hex2int(attr.value(i).lower());
30 }
31 }
32 } else if(localName == "modifier"){
33 /* modifier keys */
34 for(int i=0; i<attr.length(); i++){
35 if(attr.value(i).lower() == "on"){
36 m_mask |= m_pModifiers->getMask(attr.localName(i));
37 }
38 }
39 } else if(localName == "map"){
40 /* mapping key */
41 for(int i=0; i<attr.length(); i++){
42 if(attr.localName(i).lower() == "key"){
43 /* keyname */
44 m_mapcode = KeyNames::getCode(attr.value(i));
45 } else if(attr.localName(i).lower() == "code"){
46 /* keycode */
47 m_mapcode = KHUtil::hex2int(attr.value(i).lower());
48 }
49 }
50 } else if(localName == "map_modifier"){
51 /* mapping modifiers */
52 for(int i=0; i<attr.length(); i++){
53 m_mapmodifiers[attr.localName(i)] = attr.value(i);
54 }
55 } else if(localName == "map_unicode"){
56 /* mapping unicodes */
57 for(int i=0; i<attr.length(); i++){
58 if(attr.localName(i).lower() == "char"){
59 /* unicode char */
60 m_unicode = attr.value(i)[0].unicode();
61 } else if(attr.localName(i).lower() == "code"){
62 /* unicode code */
63 m_unicode = KHUtil::hex2int(attr.value(i).lower());
64 } else {
65 m_mapunicodes[attr.localName(i)] = attr.value(i);
66 }
67 }
68 }
69 return(true);
70}
71
72bool MappingsHandler::endElement(const QString& /* namespaceURI */,
73 const QString& localName,
74 const QString& /* qName */)
75{
76 if(localName == "define"){
77 if(m_code > 0){
78 /* assign mapping */
79 m_pMappings->assign(m_code, m_mask, m_mapcode);
80
81 for(QMap<QString,QString>::Iterator it=m_mapmodifiers.begin();
82 it!=m_mapmodifiers.end(); ++it){
83 /* assign mapping modifier state */
84 m_pMappings->assignModifier(it.key(), it.data());
85 }
86
87 if(m_unicode > 0){
88 m_pMappings->assignUnicode(m_unicode);
89 } else {
90 for(QMap<QString,QString>::Iterator it=m_mapunicodes.begin();
91 it!=m_mapunicodes.end(); ++it){
92 /* assign mapping unicode */
93 m_pMappings->assignUnicode(it.key(), it.data());
94 }
95 }
96 }
97 } else if(localName == "mappings"){
98 /* return parent */
99 m_parser->setContentHandler(m_parent);
100 }
101 return(true);
102}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.h b/noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.h
new file mode 100644
index 0000000..d899ea2
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/MappingsHandler.h
@@ -0,0 +1,48 @@
1#ifndef _MAPPINGS_HANDLER_H_
2#define _MAPPINGS_HANDLER_H_
3
4#include <qxml.h>
5#include <qstring.h>
6#include <qmap.h>
7#include "KeyModifiers.h"
8#include "KeyMappings.h"
9#include "KeyNames.h"
10#include "KHUtil.h"
11
12class MappingsHandler : public QXmlDefaultHandler
13{
14public:
15 void dispose(QXmlReader* parser, QXmlContentHandler* parent);
16
17 void setKeyModifiers(KeyModifiers* mod)
18 {
19 m_pModifiers = mod;
20 }
21 void setKeyMappings(KeyMappings* map)
22 {
23 m_pMappings = map;
24 }
25
26 bool startElement(const QString& namespaceURI,
27 const QString& localName,
28 const QString& qName,
29 const QXmlAttributes& atts);
30 bool endElement(const QString& namespaceURI,
31 const QString& localName,
32 const QString& qName);
33private:
34 QXmlContentHandler* m_parent;
35 QXmlReader* m_parser;
36
37 KeyModifiers* m_pModifiers;
38 KeyMappings* m_pMappings;
39
40 int m_code;
41 int m_mask;
42 int m_mapcode;
43 int m_unicode;
44 QMap<QString,QString> m_mapmodifiers;
45 QMap<QString,QString> m_mapunicodes;
46};
47
48#endif /* _MAPPINGS_HANDLER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp
new file mode 100644
index 0000000..b2cde92
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.cpp
@@ -0,0 +1,99 @@
1#include "ModifiersHandler.h"
2
3void ModifiersHandler::dispose(QXmlReader* parser, QXmlContentHandler* parent)
4{
5 m_parser = parser;
6 m_parent = parent;
7 m_parser->setContentHandler(this);
8}
9
10bool ModifiersHandler::startElement(const QString& /* namespaceURI */,
11 const QString& localName,
12 const QString& /* qName */,
13 const QXmlAttributes& attr)
14{
15 if(localName == "define"){
16 /* ÊÑ¿ô½é´ü²½ */
17 m_type = QString::null;
18 m_code = 0;
19 m_mask = 0;
20 m_release.clear();
21 m_toggle = false;
22 m_mapping = false;
23 for(int i=0; i<attr.length(); i++){
24 if(attr.localName(i).lower() == "key"){
25 /* keyname */
26 m_code = KeyNames::getCode(attr.value(i));
27 } else if(attr.localName(i).lower() == "code"){
28 /* keycode */
29 m_code = KHUtil::hex2int(attr.value(i).lower());
30 } else if(attr.localName(i).lower() == "type"){
31 /* modifier type */
32 m_type = attr.value(i);
33 } else if(attr.localName(i).lower() == "mapping"){
34 /* auto mapping */
35 if(attr.value(i).lower() == "true"){
36 m_mapping = true;
37 }
38 } else if(attr.localName(i).lower() == "toggle"){
39 /* toggle mode */
40 if(attr.value(i).lower() == "true"){
41 m_toggle = true;
42 }
43 }
44 }
45 } else if(localName == "modifier"){
46 /* modifier keys */
47 for(int i=0; i<attr.length(); i++){
48 if(attr.value(i).lower() == "on"){
49 m_mask |= m_pModifiers->getMask(attr.localName(i));
50 }
51 }
52 } else if(localName == "release"){
53 /* release keys */
54 int code = 0;
55 for(int i=0; i<attr.length(); i++){
56 if(attr.localName(i) == "key"){
57 /* keyname */
58 code = KeyNames::getCode(attr.value(i));
59 } else if(attr.localName(i) == "code"){
60 /* keycode */
61 code = KHUtil::hex2int(attr.value(i).lower());
62 }
63 }
64 if(code > 0){
65 m_release.append(code);
66 }
67 }
68 return(true);
69}
70
71bool ModifiersHandler::endElement(const QString& /* namespaceURI */,
72 const QString& localName,
73 const QString& /* qName */)
74{
75 if(localName == "define"){
76 if(m_type != QString::null && m_code > 0){
77 /* assign modifier */
78 m_pModifiers->assign(m_type, m_code, m_mask, m_toggle);
79 for(QValueList<int>::Iterator it=m_release.begin();
80 it!=m_release.end(); ++it){
81 /* assign modifier release keys */
82 m_pModifiers->assignRelease(*it);
83 }
84 int code = KeyNames::getCode(m_type);
85 if(code <= 0){
86 qDebug("setCode[%s][%x]", m_type.latin1(), m_code);
87 KeyNames::setCode(m_type, m_code);
88 }
89 if(m_mapping){
90 /* auto mapping */
91 m_pMappings->assign(m_code, m_mask, code, 0);
92 }
93 }
94 } else if(localName == "modifiers"){
95 /* return parent */
96 m_parser->setContentHandler(m_parent);
97 }
98 return(true);
99}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.h b/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.h
new file mode 100644
index 0000000..e2d8785
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/ModifiersHandler.h
@@ -0,0 +1,48 @@
1#ifndef _MODIFIERS_HANDLER_H_
2#define _MODIFIERS_HANDLER_H_
3
4#include <qstring.h>
5#include <qvaluelist.h>
6#include <qxml.h>
7#include "KeyModifiers.h"
8#include "KeyMappings.h"
9#include "KeyNames.h"
10#include "KHUtil.h"
11
12class ModifiersHandler : public QXmlDefaultHandler
13{
14public:
15 void dispose(QXmlReader* parser, QXmlContentHandler* parent);
16
17 void setKeyModifiers(KeyModifiers* mod)
18 {
19 m_pModifiers = mod;
20 }
21 void setKeyMappings(KeyMappings* map)
22 {
23 m_pMappings = map;
24 }
25
26 bool startElement(const QString& namespaceURI,
27 const QString& localName,
28 const QString& qName,
29 const QXmlAttributes& atts);
30 bool endElement(const QString& namespaceURI,
31 const QString& localName,
32 const QString& qName);
33private:
34 QXmlContentHandler* m_parent;
35 QXmlReader* m_parser;
36
37 KeyModifiers* m_pModifiers;
38 KeyMappings* m_pMappings;
39
40 QString m_type;
41 int m_code;
42 int m_mask;
43 QValueList<int> m_release;
44 bool m_mapping;
45 bool m_toggle;
46};
47
48#endif /* _MODIFIERS_HANDLER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.cpp b/noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.cpp
new file mode 100644
index 0000000..aeae761
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.cpp
@@ -0,0 +1,76 @@
1#include "RepeaterHandler.h"
2
3void RepeaterHandler::dispose(QXmlReader* parser, QXmlContentHandler* parent)
4{
5 m_parser = parser;
6 m_parent = parent;
7 m_parser->setContentHandler(this);
8}
9
10bool RepeaterHandler::startElement(const QString& /* namespaceURI */,
11 const QString& localName,
12 const QString& /* qName */,
13 const QXmlAttributes& attr)
14{
15 if(localName == "repeat"){
16 for(int i=0; i<attr.length(); i++){
17 if(attr.localName(i).lower() == "delay"){
18 bool ok;
19 int delay = attr.value(i).toInt(&ok);
20 if(ok){
21 m_pRepeater->setDelay(delay);
22 }
23 } else if(attr.localName(i).lower() == "period"){
24 bool ok;
25 int period = attr.value(i).toInt(&ok);
26 if(ok){
27 m_pRepeater->setPeriod(period);
28 }
29 } else if(attr.localName(i).lower() == "mode"){
30 /* default mode */
31 bool ok;
32 int mode = attr.value(i).toInt(&ok);
33 if(ok){
34 m_pRepeater->setMode(mode);
35 }
36 }
37 }
38 } else if(localName == "define"){
39 /* ÊÑ¿ô½é´ü²½ */
40 m_code = 0;
41 m_enable = true;
42 for(int i=0; i<attr.length(); i++){
43 if(attr.localName(i).lower() == "key"){
44 /* keyname */
45 m_code = KeyNames::getCode(attr.value(i));
46 } else if(attr.localName(i).lower() == "code"){
47 /* keycode */
48 m_code = KHUtil::hex2int(attr.value(i).lower());
49 } else if(attr.localName(i).lower() == "enable"){
50 /* enable/disable */
51 if(attr.value(i).lower() == "false"){
52 m_enable = false;
53 } else {
54 m_enable = true;
55 }
56 }
57 }
58 }
59 return(true);
60}
61
62bool RepeaterHandler::endElement(const QString& /* namespaceURI */,
63 const QString& localName,
64 const QString& /* qName */)
65{
66 if(localName == "define"){
67 if(m_code > 0){
68 /* set repeat enable/disable */
69 m_pRepeater->setRepeatable(m_code, m_enable);
70 }
71 } else if(localName == "repeater"){
72 /* return parent */
73 m_parser->setContentHandler(m_parent);
74 }
75 return(true);
76}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.h b/noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.h
new file mode 100644
index 0000000..d25583b
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/config/RepeaterHandler.h
@@ -0,0 +1,39 @@
1#ifndef _REPEATER_HANDLER_H_
2#define _REPEATER_HANDLER_H_
3
4#include <qstring.h>
5#include <qvaluelist.h>
6#include <qxml.h>
7#include "KeyRepeater.h"
8#include "KeyNames.h"
9#include "KHUtil.h"
10
11class RepeaterHandler : public QXmlDefaultHandler
12{
13public:
14 void dispose(QXmlReader* parser, QXmlContentHandler* parent);
15
16 void setKeyRepeater(KeyRepeater* rep)
17 {
18 m_pRepeater = rep;
19 }
20
21 bool startElement(const QString& namespaceURI,
22 const QString& localName,
23 const QString& qName,
24 const QXmlAttributes& atts);
25 bool endElement(const QString& namespaceURI,
26 const QString& localName,
27 const QString& qName);
28private:
29 QXmlContentHandler* m_parent;
30 QXmlReader* m_parser;
31
32 KeyRepeater* m_pRepeater;
33
34 int m_code;
35 bool m_enable;
36
37};
38
39#endif /* _REPEATER_HANDLER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.cpp
new file mode 100644
index 0000000..00a43d1
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.cpp
@@ -0,0 +1,110 @@
1#include "ExtensionFactory.h"
2
3ExtensionFactory::ExtensionFactory()
4{
5 qDebug("ExtensionFactory::ExtensionFactory()");
6 m_pLoadList = NULL;
7}
8
9ExtensionFactory::~ExtensionFactory()
10{
11 qDebug("ExtensionFactory::~ExtensionFactory()");
12}
13
14ExtensionInterface* ExtensionFactory::createInstance(const QString& kind)
15{
16 ExtensionInterface* ext;
17 QString kindstr = kind.lower();
18
19 if(kindstr == "switch"){
20 ext = new TaskSwitcher(kindstr);
21 } else if(kindstr == "select"){
22 ext = new TaskSelector(kindstr);
23 } else if(kindstr.find("launch") == 0){
24 ext = new KeyLauncher(kindstr);
25 } else if(kindstr.find("menu") == 0){
26 ext = new MenuLauncher(kindstr);
27 } else {
28 return(NULL);
29 }
30 m_oExtList.append(ext);
31 return(ext);
32}
33
34ExtensionInterface* ExtensionFactory::createInstance(const QString& kind,
35 int keycode, int keymask)
36{
37 ExtensionInterface* ext;
38 QString kindstr = kind.lower();
39
40 ext = loadInstance(kindstr, keycode, keymask);
41 if(ext != NULL){
42 return(ext);
43 }
44
45 if(kindstr == "switch"){
46 ext = new TaskSwitcher(kindstr);
47 } else if(kindstr == "select"){
48 ext = new TaskSelector(kindstr);
49 } else if(kindstr.find("launch") == 0){
50 ext = new KeyLauncher(kindstr);
51 } else if(kindstr.find("menu") == 0){
52 ext = new MenuLauncher(kindstr);
53 } else {
54 return(NULL);
55 }
56 ext->setKeycode(keycode);
57 ext->setKeymask(keymask);
58
59 m_oExtList.append(ext);
60 return(ext);
61}
62
63ExtensionInterface* ExtensionFactory::loadInstance(const QString& kindstr,
64 int keycode, int keymask)
65{
66 if(m_pLoadList == NULL){
67 return(NULL);
68 }
69
70 for(ExtensionList::Iterator it=m_pLoadList->begin();
71 it!=m_pLoadList->end(); ++it){
72 if((*it)->kind() == kindstr
73 && (*it)->getKeycode() == keycode
74 && (*it)->getKeymask() == keymask){
75 m_oExtList.append(*it);
76 return(*it);
77 }
78 }
79 return(NULL);
80}
81
82void ExtensionFactory::clear()
83{
84 for(ExtensionList::Iterator it=m_oExtList.begin();
85 it!=m_oExtList.end(); ++it){
86 delete *it;
87 }
88 m_oExtList.clear();
89}
90
91void ExtensionFactory::reset()
92{
93 m_pLoadList = new ExtensionList(m_oExtList);
94 m_oExtList.clear();
95}
96
97void ExtensionFactory::sweep()
98{
99 if(m_pLoadList == NULL){
100 return;
101 }
102 for(ExtensionList::Iterator it=m_pLoadList->begin();
103 it!=m_pLoadList->end(); ++it){
104 if(m_oExtList.contains(*it) == false){
105 delete *it;
106 }
107 }
108 delete m_pLoadList;
109 m_pLoadList = NULL;
110}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.h b/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.h
new file mode 100644
index 0000000..7fa6a5f
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionFactory.h
@@ -0,0 +1,35 @@
1#ifndef _EXTENSION_FACTORY_H_
2#define _EXTENSION_FACTORY_H_
3
4#include "ExtensionInterface.h"
5#include "TaskSwitcher.h"
6#include "KeyLauncher.h"
7#include "TaskSelector.h"
8#include "MenuLauncher.h"
9
10class ExtensionFactory
11{
12public:
13 ExtensionFactory();
14 virtual ~ExtensionFactory();
15
16 ExtensionInterface* createInstance(const QString& kind);
17 ExtensionInterface* createInstance(const QString& kind,
18 int keycode, int keymask);
19 ExtensionList& getList()
20 {
21 return(m_oExtList);
22 }
23 void clear();
24 void reset();
25 void sweep();
26private:
27 ExtensionList m_oExtList;
28 ExtensionList* m_pLoadList;
29
30 ExtensionInterface* loadInstance(const QString& kind,
31 int keycode, int keymask);
32};
33
34#endif /* _EXTENSION_FACTORY_H_ */
35
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionInterface.h b/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionInterface.h
new file mode 100644
index 0000000..1a81141
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/ExtensionInterface.h
@@ -0,0 +1,26 @@
1#ifndef _EXTENSION_INTERFACE_H_
2#define _EXTENSION_INTERFACE_H_
3
4#include <qvaluelist.h>
5
6class ExtensionInterface
7{
8public:
9 //ExtensionInterface();
10 virtual ~ExtensionInterface(){}
11 virtual bool onKeyPress(int keycode) = 0;
12 virtual bool onModRelease(int modcode) = 0;
13 virtual int getKeycode() = 0;
14 virtual int getKeymask() = 0;
15 virtual const QValueList<int>& getModcodes() = 0;
16 virtual void setKeycode(int keycode) = 0;
17 virtual void setKeymask(int keymask) = 0;
18 virtual void setModcodes(const QValueList<int>& modcodes) = 0;
19 virtual const QString& kind() = 0;
20private:
21};
22
23typedef QValueList<ExtensionInterface*> ExtensionList;
24
25#endif /* _EXTENSION_INTERFACE_H_ */
26
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.cpp
new file mode 100644
index 0000000..a61ea0a
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.cpp
@@ -0,0 +1,111 @@
1#include "KeyExtensions.h"
2
3KeyExtensions::KeyExtensions()
4{
5 qDebug("KeyExtensions::KeyExtensions()");
6 m_cancelcode = 0;
7}
8
9KeyExtensions::~KeyExtensions()
10{
11 qDebug("KeyExtensions::~KeyExtensions()");
12 clear();
13}
14
15void KeyExtensions::assign(const QString& kind, int keycode,
16 int keymask, const QValueList<int>& modcodes)
17{
18 ExtensionInterface* ext;
19#if 0
20 ext = m_oExtFactory.createInstance(kind);
21 if(ext != NULL){
22 ext->setKeycode(keycode);
23 ext->setKeymask(keymask);
24 ext->setModcodes(modcodes);
25 }
26#else
27 ext = m_oExtFactory.createInstance(kind, keycode, keymask);
28 if(ext != NULL){
29 ext->setModcodes(modcodes);
30 }
31#endif
32}
33
34void KeyExtensions::assign(const QString& kind, int keycode,
35 int keymask, int modcode)
36{
37 QValueList<int> modcodes;
38 modcodes.append(modcode);
39 assign(kind, keycode, keymask, modcodes);
40}
41
42bool KeyExtensions::doKey(int keycode, int keymask, bool isPress)
43{
44 bool fCancel = false;
45 ExtensionList& list = m_oExtFactory.getList();
46 for(ExtensionList::Iterator it=list.begin();
47 it!=list.end(); ++it){
48 if(isPress){
49 int code = (*it)->getKeycode();
50 if((*it)->getKeymask() == keymask
51 && (code == 0 || code == keycode)){
52 if((*it)->onKeyPress(keycode)){
53 fCancel = true;
54 }
55 qWarning("ext:onKeyPress[%s][%x][%d]",
56 (*it)->kind().latin1(),
57 (*it)->getKeycode(),
58 fCancel);
59 }
60 } else {
61 if(keycode == m_cancelcode){
62 fCancel = true;
63 }
64 const QValueList<int>& rlist = (*it)->getModcodes();
65 if(rlist.contains(keycode)){
66 if((*it)->onModRelease(keycode)){
67 m_pModifiers->resetToggles();
68 }
69 qWarning("ext:onModRelease[%s][%x]",
70 (*it)->kind().latin1(),
71 keycode);
72 }
73 }
74 }
75 if(isPress && fCancel){
76 m_cancelcode = keycode;
77 } else {
78 m_cancelcode = 0;
79 }
80 return(fCancel);
81}
82
83void KeyExtensions::clear()
84{
85 m_oExtFactory.clear();
86}
87
88void KeyExtensions::reset()
89{
90 //clear();
91 m_oExtFactory.reset();
92}
93
94void KeyExtensions::init()
95{
96 m_oExtFactory.sweep();
97}
98
99void KeyExtensions::statistics()
100{
101 qWarning("KeyExtensions::statistics()");
102 ExtensionList& list = m_oExtFactory.getList();
103 for(ExtensionList::Iterator it=list.begin();
104 it!=list.end(); ++it){
105 qWarning(" [%s][%x][%x]",
106 (*it)->kind().latin1(),
107 (*it)->getKeycode(),
108 (*it)->getKeymask());
109 }
110}
111
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.h b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.h
new file mode 100644
index 0000000..20ffc45
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyExtensions.h
@@ -0,0 +1,40 @@
1#ifndef _KEY_EXTENSIONS_H_
2#define _KEY_EXTENSIONS_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6#include "KeyNames.h"
7#include "KeyModifiers.h"
8#include "ExtensionFactory.h"
9
10class KeyExtensions
11{
12public:
13 KeyExtensions();
14 ~KeyExtensions();
15
16 void setKeyModifiers(KeyModifiers* mod)
17 {
18 m_pModifiers = mod;
19 }
20
21 void assign(const QString& kind, int keycode,
22 int keymask, const QValueList<int>& modcodes);
23 void assign(const QString& kind, int keycode,
24 int keymask, int modcode);
25 bool doKey(int keycode, int keymask, bool isPress);
26
27 void statistics();
28
29 void reset();
30 void init();
31private:
32 KeyModifiers* m_pModifiers;
33 ExtensionFactory m_oExtFactory;
34 int m_cancelcode;
35
36 void clear();
37};
38
39#endif /* _KEY_EXTENSIONS_H_ */
40
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.cpp
new file mode 100644
index 0000000..7a0b88c
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.cpp
@@ -0,0 +1,57 @@
1#include "KeyLauncher.h"
2#include "KHUtil.h"
3
4KeyLauncher::KeyLauncher(const QString& kind) : m_kind(kind)
5{
6 qDebug("KeyLauncher::KeyLauncher()");
7}
8
9KeyLauncher::~KeyLauncher()
10{
11 qDebug("KeyLauncher::~KeyLauncher()");
12}
13
14bool KeyLauncher::onKeyPress(int keycode)
15{
16 QString key;
17 QStringList args;
18 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
19
20 key = KeyNames::getName(keycode);
21 if(key == QString::null){
22 return(false);
23 }
24
25 QString group = kind();
26 group[0] = group[0].upper();
27
28 /* read application launcher */
29 QString app = KHUtil::currentApp();
30 if(!app.isEmpty()){
31 cfg.setGroup(group + "_" + app);
32 /* read config */
33 args = cfg.readListEntry(key, '\t');
34 }
35
36 /* read default launcher */
37 if(args.isEmpty()){
38 cfg.setGroup(group);
39
40 /* read config */
41 args = cfg.readListEntry(key, '\t');
42 }
43
44 if(args.isEmpty()){
45 return(false);
46 }
47
48 /* launch application */
49 LnkWrapper lnk(args);
50 if(lnk.isValid()){
51 //args.remove(args.begin());
52 lnk.instance().execute();
53 }
54
55 return(true);
56}
57
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.h b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.h
new file mode 100644
index 0000000..fbad3da
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/KeyLauncher.h
@@ -0,0 +1,63 @@
1#ifndef _KEY_LAUNCHER_H_
2#define _KEY_LAUNCHER_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6#include <qvaluelist.h>
7
8#include <qpe/qpeapplication.h>
9#include <qpe/config.h>
10#include <qpe/applnk.h>
11#include <qpe/global.h>
12#include <qpe/qcopenvelope_qws.h>
13
14#include "ExtensionInterface.h"
15#include "KeyNames.h"
16#include "LnkWrapper.h"
17#include "ConfigEx.h"
18
19class KeyLauncher : public ExtensionInterface
20{
21public:
22 KeyLauncher(const QString& kind = "launch");
23 virtual ~KeyLauncher();
24
25 virtual bool onKeyPress(int keycode);
26 virtual bool onModRelease(int /*modcode*/){return(false);}
27 virtual int getKeycode()
28 {
29 return(m_keycode);
30 }
31 virtual int getKeymask()
32 {
33 return(m_keymask);
34 }
35 virtual const QValueList<int>& getModcodes()
36 {
37 return(m_modcodes);
38 }
39 virtual void setKeycode(int keycode)
40 {
41 m_keycode = keycode;
42 }
43 virtual void setKeymask(int keymask)
44 {
45 m_keymask = keymask;
46 }
47 virtual void setModcodes(const QValueList<int>& modcodes)
48 {
49 m_modcodes = modcodes;
50 }
51 virtual const QString& kind()
52 {
53 return(m_kind);
54 }
55private:
56 int m_keycode;
57 int m_keymask;
58 QString m_kind;
59 QValueList<int> m_modcodes;
60};
61
62#endif /* _KEY_LAUNCHER_H_ */
63
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.cpp
new file mode 100644
index 0000000..0595a3e
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.cpp
@@ -0,0 +1,324 @@
1#include "MenuLauncher.h"
2extern QWidget* g_Widget;
3
4MenuLauncher::MenuLauncher(const QString& kind) : m_kind(kind)
5{
6 qDebug("MenuLauncher::MenuLauncher()");
7 m_pMenu = m_pTopMenu = NULL;
8
9 m_isShowing = false;
10 m_id = -1;
11
12 m_pTimer = new QTimer(this);
13 connect(m_pTimer, SIGNAL(timeout()),
14 this, SLOT(select()));
15
16 init();
17}
18
19MenuLauncher::~MenuLauncher()
20{
21 qDebug("MenuLauncher::~MenuLauncher()");
22 delete m_pTopMenu;
23 delete m_pTimer;
24}
25
26void MenuLauncher::init()
27{
28 buildMenu();
29}
30
31QPopupMenu* MenuLauncher::initMenu(QWidget* parent, const QString& name)
32{
33 QPopupMenu* pMenu;
34 pMenu = new QPopupMenuEx(parent, name);
35 pMenu->installEventFilter(this);
36 connect(pMenu, SIGNAL(activated(int)), this, SLOT(select(int)));
37 connect(pMenu, SIGNAL(highlighted(int)), this, SLOT(highlight(int)));
38 //connect(pMenu, SIGNAL(aboutToHide()), this, SLOT(execute()));
39 return(pMenu);
40}
41
42bool MenuLauncher::onKeyPress(int /*keycode*/)
43{
44 if(m_isShowing){
45 qDebug("showing ...");
46 } else if(m_pMenu->isVisible()){
47 next();
48 } else {
49 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
50 cfg.setGroup("Global");
51 int delay = cfg.readNumEntry("DelayPopup", 5);
52 QTimer::singleShot(delay, this, SLOT(show()));
53 m_isShowing = true;
54 }
55 return true;
56}
57
58bool MenuLauncher::onModRelease(int /*modcode*/)
59{
60 if(m_pMenu->isVisible()){
61 QTimer::singleShot(0, this, SLOT(select()));
62 return(true);
63 } else {
64 return(false);
65 }
66}
67
68QString MenuLauncher::getMenuText(const QString& key, const QString& name)
69{
70 QRegExp rx("^[0-9]+_");
71 QString text;
72 QString ackey;
73 int len;
74 if(rx.match(key, 0, &len) == 0){
75 ackey = key.mid(len);
76 } else {
77 ackey = key;
78 }
79 if(ackey.length() == 1){
80 text = name;
81 text.append("(&");
82 text.append(ackey);
83 text.append(")");
84 } else {
85 text = ackey;
86 }
87 return(text);
88}
89
90int MenuLauncher::buildMenu(const QString& section,
91 QPopupMenu* pMenu, int& id)
92{
93 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
94
95 if(m_oMenuList.contains(pMenu)){
96 /* ̵¸Â¥ë¡¼¥×ËÉ»ß */
97 return(0);
98 }
99 m_oMenuList.append(pMenu);
100
101 QString oldgroup = cfg.getGroup();
102
103 QString group = section;
104 group[0] = group[0].upper();
105
106 cfg.setGroup(group);
107
108 QStringList apps = cfg.getKeys();
109 int cnt = 0;
110 if(apps.isEmpty() == false){
111 for(QStringList::Iterator it=apps.begin();
112 it!=apps.end(); ++it){
113 QStringList args = cfg.readListEntry(*it, '\t');
114 LnkWrapper lnk(args);
115 if(lnk.isValid()){
116 cnt++;
117 QString text = getMenuText(*it, lnk.instance().name());
118 if(args[0] == "@menu"){
119 QPopupMenu* pSubMenu = initMenu(m_pTopMenu, args[1]);
120 pMenu->insertItem(lnk.instance().pixmap(), text,
121 pSubMenu, id);
122 m_oItemList.append(ItemInfo(section));
123 id++;
124 buildMenu(args[1], pSubMenu, id);
125 } else {
126 pMenu->insertItem(lnk.instance().pixmap(), text, id);
127 m_oItemList.append(ItemInfo(section, *it));
128 id++;
129 }
130 }
131 }
132 }
133 cfg.setGroup(oldgroup);
134 return(cnt);
135}
136
137void MenuLauncher::clearSubMenu()
138{
139 for(QValueList<QPopupMenu*>::Iterator it=m_oMenuList.begin();
140 it!=m_oMenuList.end(); ++it){
141 if(*it != m_pTopMenu){
142 delete *it;
143 }
144 }
145 m_oMenuList.clear();
146 m_oItemList.clear();
147}
148
149int MenuLauncher::buildMenu(bool force)
150{
151 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
152 if(!force && m_lastmodify == cfg.lastRead()){
153 return(m_pTopMenu->count());
154 }
155 qDebug("buildMenu");
156
157 QString oldgroup = cfg.getGroup();
158
159 cfg.setGroup("Global");
160 m_submenuTimeout = cfg.readNumEntry("SubMenuTimeout", 500);
161
162 if(m_pTopMenu){
163 delete m_pTopMenu;
164 }
165 m_pMenu = m_pTopMenu = initMenu(g_Widget, kind());
166 m_oLastId.clear();
167 m_oMenuList.clear();
168 m_oItemList.clear();
169
170 MenuTitle* pTitle = new MenuTitle("MenuLauncher",
171 m_pTopMenu->font(), kind());
172 m_pTopMenu->insertItem(pTitle);
173
174 int id = 0;
175 int cnt = buildMenu(kind(), m_pTopMenu, id);
176 if(cnt > 0){
177 m_lastmodify = cfg.lastRead();
178 }
179
180 cfg.setGroup(oldgroup);
181 return(cnt);
182}
183
184void MenuLauncher::show()
185{
186 m_enablePopup = false;
187 int cnt = buildMenu();
188 if(cnt > 0){
189 m_pMenu = m_pTopMenu;
190 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
191 cfg.setGroup("Style");
192 int x,y;
193 QString key = "Position_" + kind();
194 if(cfg.hasKey(key)){
195 const QStringList& list = cfg.readListEntry(key, ',');
196 x = list[0].toInt();
197 y = list[1].toInt();
198 } else {
199 x = (qt_screen->width() - m_pTopMenu->sizeHint().width()) / 2;
200 y = (qt_screen->height() - m_pTopMenu->sizeHint().height()) / 2;
201 }
202 QPoint pos(x, y);
203 m_pTopMenu->popup(pos);
204 m_pTopMenu->setActiveItem(1);
205 }
206 m_isShowing = false;
207}
208
209void MenuLauncher::next()
210{
211 int index = m_pMenu->indexOf(m_id);
212 index++;
213 if(index >= (signed int)m_pMenu->count()){
214 if(m_pMenu == m_pTopMenu){
215 index = 1;
216 } else {
217 index = 0;
218 }
219 }
220 m_pMenu->setActiveItem(index);
221 m_id = m_pMenu->idAt(index);
222}
223
224void MenuLauncher::select()
225{
226 if(m_pMenu->isVisible()){
227 QMenuItem* item = m_pMenu->findItem(m_id);
228 int index = m_pMenu->indexOf(m_id);
229 QPopupMenu* p = m_pMenu;
230 //m_pMenu->activateItemAt(index);
231 if(item && item->popup()){
232 m_pMenu = item->popup();
233 }
234 p->activateItemAt(index);
235 }
236}
237
238void MenuLauncher::select(int id)
239{
240 if(id >= 0 && m_oItemList[id].entry != QString::null){
241 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
242
243 cfg.setGroup("Global");
244 int delay = cfg.readNumEntry("DelayExec", 100);
245
246 QString group = m_oItemList[id].group;
247 group[0] = group[0].upper();
248 cfg.setGroup(group);
249
250 //QStringList args = cfg.readListEntry(m_oItemList[id].entry, '\t');
251 m_args = cfg.readListEntry(m_oItemList[id].entry, '\t');
252
253#if 0
254 LnkWrapper lnk(args);
255 if(lnk.isValid()){
256 lnk.instance().execute();
257 }
258#else
259 QTimer::singleShot(delay, this, SLOT(execute()));
260#endif
261 }
262 m_pMenu = m_pTopMenu;
263 m_id = -1;
264}
265
266void MenuLauncher::execute()
267{
268 LnkWrapper lnk(m_args);
269 if(lnk.isValid()){
270 lnk.instance().execute();
271 }
272 m_args.clear();
273}
274
275void MenuLauncher::highlight(int id)
276{
277 if(m_pMenu && m_pMenu->isVisible()){
278 m_id = id;
279 if(m_enablePopup){
280 QMenuItem* item = m_pMenu->findItem(m_id);
281 if(item && item->popup()){
282 if(m_submenuTimeout > 0){
283 m_pTimer->start(m_submenuTimeout, true);
284 }
285 } else {
286 m_pTimer->stop();
287 }
288 } else {
289 /* ¥á¥Ë¥å¡¼É½¼¨Ä¾¸å¤Ï¥Ý¥Ã¥×¥¢¥Ã¥×¤·¤Ê¤¤ */
290 m_enablePopup = true;
291 }
292 }
293}
294
295bool MenuLauncher::eventFilter(QObject* o, QEvent* e)
296{
297 if(m_pTopMenu->isVisible()){
298 QKeyEvent* ke = (QKeyEvent*)e;
299 switch(e->type()){
300 case QEvent::Accel:
301 if(ke->key() == Qt::Key_Space
302 && ke->isAutoRepeat() == false){
303 select();
304 }
305 break;
306 case QEvent::FocusIn:
307 //qDebug("FocusIn[%p][%p]", o, m_pMenu);
308 m_pMenu = (QPopupMenu*)o;
309 if(m_oLastId.contains(o)){
310 m_id = m_oLastId[o];
311 }
312 m_pMenu->updateItem(m_id);
313 break;
314 case QEvent::FocusOut:
315 //qDebug("FocusOut[%p][%p]", o, m_pMenu);
316 m_oLastId[o] = m_id;
317 break;
318 default:
319 //qDebug(">>>>> [%p][%d] <<<<<", o, e->type());
320 break;
321 }
322 }
323 return QObject::eventFilter(o, e);
324}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.h b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.h
new file mode 100644
index 0000000..5eebe78
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuLauncher.h
@@ -0,0 +1,110 @@
1#ifndef _MENU_LAUNCHER_H_
2#define _MENU_LAUNCHER_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6#include <qvaluelist.h>
7#include <qwindowsystem_qws.h>
8#define INCLUDE_MENUITEM_DEF
9#include <qpopupmenu.h>
10#include <qpoint.h>
11#include <qtimer.h>
12#include <qgfx_qws.h>
13
14#include <qpe/global.h>
15#include <qpe/applnk.h>
16#include <qpe/config.h>
17#include <qpe/qpeapplication.h>
18
19#include "ExtensionInterface.h"
20#include "MenuTitle.h"
21#include "KeyNames.h"
22#include "ConfigEx.h"
23#include "LnkWrapper.h"
24#include "QPopupMenuEx.h"
25
26struct ItemInfo{
27 ItemInfo(QString g=QString::null, QString e=QString::null)
28 : group(g), entry(e){}
29 QString group;
30 QString entry;
31};
32
33class MenuLauncher : public QObject, public ExtensionInterface
34{
35 Q_OBJECT
36public:
37 MenuLauncher(const QString& kind = "menu");
38 virtual ~MenuLauncher();
39
40 typedef QValueList<ItemInfo> ItemList;
41
42 virtual bool onKeyPress(int keycode);
43 virtual bool onModRelease(int modcode);
44 virtual int getKeycode()
45 {
46 return(m_keycode);
47 }
48 virtual int getKeymask()
49 {
50 return(m_keymask);
51 }
52 virtual const QValueList<int>& getModcodes()
53 {
54 return(m_modcodes);
55 }
56 virtual void setKeycode(int keycode)
57 {
58 m_keycode = keycode;
59 }
60 virtual void setKeymask(int keymask)
61 {
62 m_keymask = keymask;
63 }
64 virtual void setModcodes(const QValueList<int>& modcodes)
65 {
66 m_modcodes = modcodes;
67 }
68 virtual const QString& kind()
69 {
70 return(m_kind);
71 }
72public slots:
73 void show();
74 void select();
75 void select(int id);
76 void highlight(int id);
77private:
78 int m_keycode;
79 int m_keymask;
80 QString m_kind;
81 QValueList<int> m_modcodes;
82
83 int m_submenuTimeout;
84 bool m_isShowing;
85 bool m_enablePopup;
86 int m_id;
87 QPopupMenu* m_pMenu;
88 QPopupMenu* m_pTopMenu;
89 QDateTime m_lastmodify;
90
91 QMap<QObject*, int> m_oLastId;
92 QValueList<QPopupMenu*> m_oMenuList;
93 ItemList m_oItemList;
94 QTimer* m_pTimer;
95
96 QStringList m_args;
97
98 QString getMenuText(const QString& key, const QString& name);
99 QPopupMenu* initMenu(QWidget* parent, const QString& name);
100 int buildMenu(bool force=false);
101 int buildMenu(const QString& section, QPopupMenu* pMenu, int& id);
102 void clearSubMenu();
103 void init();
104 void next();
105private slots:
106 bool eventFilter(QObject* o, QEvent* e);
107 void execute();
108};
109
110#endif /* _MENU_LAUNCHER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.cpp
new file mode 100644
index 0000000..d8fd2a3
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.cpp
@@ -0,0 +1,67 @@
1#include "MenuTitle.h"
2
3MenuTitle::MenuTitle(const QString& s, const QFont& f, const QString& k)
4{
5 font = f;
6 kind = k;
7
8 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
9
10 const QString curGroup = cfg.getGroup();
11 cfg.setGroup("Style");
12
13 caption = cfg.readEntry("Caption_" + k, s);
14 cfg.setGroup(curGroup);
15}
16
17bool MenuTitle::fullSpan() const
18{
19 return(true);
20}
21
22bool MenuTitle::isSeparator() const
23{
24 return(true);
25}
26
27void MenuTitle::paint(QPainter* p, const QColorGroup& cg, bool /*act*/,
28 bool /*enabled*/, int x, int y, int w, int h)
29{
30 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
31 const QString& curGroup = cfg.getGroup();
32
33 cfg.setGroup("Style");
34
35 QString name;
36 QColor color;
37
38 p->setFont(font);
39
40 /* set fontcolor */
41 name = cfg.readEntry("FontColor_" + kind, QString::null);
42 if(name != QString::null){
43 color.setNamedColor(name);
44 if(color.isValid()){
45 p->setPen(color);
46 }
47 }
48
49 /* set bgcolor */
50 name = cfg.readEntry("BgColor_" + kind, QString::null);
51 if(name != QString::null){
52 color.setNamedColor(name);
53 if(color.isValid() == false){
54 color = cg.mid();
55 }
56 } else {
57 color = cg.mid();
58 }
59 p->fillRect(x, y, w, h, QBrush(color));
60 p->drawText(x, y, w, h, AlignCenter, caption);
61 cfg.setGroup(curGroup);
62}
63
64QSize MenuTitle::sizeHint()
65{
66 return(QFontMetrics(font).size(AlignCenter, caption));
67}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.h b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.h
new file mode 100644
index 0000000..77e46a5
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/MenuTitle.h
@@ -0,0 +1,29 @@
1#ifndef _MENU_TITLE_ITEM_H_
2#define _MENU_TITLE_ITEM_H_
3
4#include <qmenudata.h>
5#include <qpainter.h>
6#include <qbrush.h>
7#include <qcolor.h>
8#include <qpalette.h>
9#include <qpe/config.h>
10#include "ConfigEx.h"
11
12class MenuTitle : public QCustomMenuItem
13{
14public:
15 MenuTitle(const QString& s, const QFont& f, const QString& k = "default");
16 virtual ~MenuTitle(){}
17
18 bool fullSpan () const;
19 bool isSeparator() const;
20 void paint(QPainter* p, const QColorGroup& cg, bool act,
21 bool enabled, int x, int y, int w, int h);
22 QSize sizeHint();
23private:
24 QString caption;
25 QString kind;
26 QFont font;
27};
28
29#endif /* _MENU_TITLE_ITEM_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/QPopupMenuEx.h b/noncore/applets/keyhelper/keyhelperapplet/extension/QPopupMenuEx.h
new file mode 100644
index 0000000..16e18a1
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/QPopupMenuEx.h
@@ -0,0 +1,28 @@
1#ifndef _QPOPUPMENUEX_H_
2#define _QPOPUPMENUEX_H_
3
4#include <qpopupmenu.h>
5#include <qstring.h>
6#include <qevent.h>
7
8class QPopupMenuEx : public QPopupMenu
9{
10public:
11 QPopupMenuEx(QWidget* parent=0, const char* name=0)
12 : QPopupMenu(parent, name){}
13protected:
14 void keyPressEvent(QKeyEvent* e){
15 QChar c = e->text()[0];
16 QKeyEvent* ke = new QKeyEvent(
17 e->type(),
18 e->key(),
19 c.lower().latin1(),
20 0,
21 c.lower(),
22 e->isAutoRepeat());
23 QPopupMenu::keyPressEvent(ke);
24 }
25private:
26};
27
28#endif /* _QPOPUPMENUEX_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp
new file mode 100644
index 0000000..4fc9cc4
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.cpp
@@ -0,0 +1,225 @@
1#include "TaskSelector.h"
2extern QWidget* g_Widget;
3
4static const char* defkeys =
5"QWERTYUIOPASDFGHJKLZXCVBNM1234567890";
6
7 #define START_INDEX 1
8
9TaskSelector::TaskSelector(const QString& kind) : m_kind(kind)
10{
11 qDebug("TaskSelector::TaskSelector()");
12 m_pMenu = new QPopupMenuEx(g_Widget);
13 m_pMenu->installEventFilter(this);
14
15 m_isShowing = false;
16 m_index = START_INDEX-1;
17 connect(m_pMenu, SIGNAL(activated(int)), this, SLOT(select(int)));
18 connect(m_pMenu, SIGNAL(highlighted(int)), this, SLOT(highlight(int)));
19}
20
21TaskSelector::~TaskSelector()
22{
23 qDebug("TaskSelector::~TaskSelector()");
24 delete m_pMenu;
25}
26
27bool TaskSelector::onKeyPress(int /*keycode*/)
28{
29 if(m_isShowing){
30 qDebug("showing ...");
31 } else if(m_pMenu->isVisible()){
32 next();
33 } else {
34 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
35 cfg.setGroup("Global");
36 int delay = cfg.readNumEntry("DelayPopup", 5);
37 QTimer::singleShot(delay, this, SLOT(show()));
38 m_isShowing = true;
39 }
40 return true;
41}
42
43bool TaskSelector::onModRelease(int /*modcode*/)
44{
45 if(m_pMenu->isVisible()){
46 //m_pMenu->hide();
47 QTimer::singleShot(0, this, SLOT(select()));
48 return(true);
49 } else {
50 return(false);
51 }
52}
53
54int TaskSelector::buildMenu()
55{
56 const AppLnk* lnk;
57
58 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
59 QString oldgroup;
60
61 oldgroup = cfg.getGroup();
62 cfg.setGroup("Global");
63 QString accesskeys = cfg.readEntry("AccessKeys", defkeys);
64 if(accesskeys.length() <= 0){
65 accesskeys = defkeys;
66 }
67 cfg.setGroup(oldgroup);
68
69 /* get list */
70 int cnt = 0;
71 m_index = START_INDEX+1;
72 m_applist.clear();
73 m_pMenu->clear();
74 MenuTitle* pTitle = new MenuTitle("TaskSelector", m_pMenu->font(), kind());
75 m_pMenu->insertItem(pTitle);
76 const QList<QWSWindow>& list = qwsServer->clientWindows();
77 QWSWindow* w;
78 for(QListIterator<QWSWindow> it(list); (w=it.current()); ++it){
79 if(w->isVisible() == false
80 || w->caption() == QString::null){
81 continue;
82 }
83 QString app = w->client()->identity();
84 if(app == NULL || m_applist.contains(app)){
85 continue;
86 }
87 /* exclude "launcher" */
88 if(app == "launcher"){
89 if(cnt == 0){
90 m_index--;
91 }
92 continue;
93 }
94 m_applist.append(app);
95 /* append menu */
96 cnt++;
97 AppLnkSet* lnkSet = AppLnkManager::getInstance();
98 lnk = lnkSet->findExec(app);
99 QString text;
100 QPixmap icon;
101#if 0
102 if(lnk != NULL){
103 icon = lnk->pixmap();
104 text = lnk->name();
105 } else {
106 AppLnkManager::notfound();
107 icon = QPixmap();
108 text = w->caption();
109 }
110#else
111 if(lnk != NULL){
112 icon = lnk->pixmap();
113 if(w->caption().length() > 0){
114 text = w->caption();
115 } else {
116 text = lnk->name();
117 }
118 } else {
119 AppLnkManager::notfound();
120 icon = QPixmap();
121 text = w->caption();
122 }
123#endif
124 if(cnt <= (int)accesskeys.length()){
125 text.append("(&");
126 text.append(accesskeys[cnt-1].upper());
127 text.append(")");
128 }
129 m_pMenu->insertItem(icon, text, cnt);
130 }
131 return(cnt);
132}
133
134void TaskSelector::show()
135{
136 /* build task selector menu */
137 int cnt = buildMenu();
138 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
139 QString oldgroup = cfg.getGroup();
140 cfg.setGroup("Global");
141 int min = cfg.readNumEntry("SelectMenuMin", 2);
142 if(min != 1 && min != 3){
143 min = 2;
144 }
145 cfg.setGroup(oldgroup);
146
147 if(cnt == 0){
148 qDebug("no applications");
149 } else if(cnt < min){
150 //m_index = START_INDEX;
151 if(m_index > cnt){
152 m_index = cnt;
153 }
154 QTimer::singleShot(0, this, SLOT(select()));
155 } else {
156 if(m_index > cnt){
157 m_index = cnt;
158 }
159 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
160 cfg.setGroup("Style");
161 int x,y;
162 QString key = "Position_" + kind();
163 if(cfg.hasKey(key)){
164 const QStringList& list = cfg.readListEntry(key, ',');
165 x = list[0].toInt();
166 y = list[1].toInt();
167 } else {
168 x = (qt_screen->width() - m_pMenu->sizeHint().width()) / 2;
169 y = (qt_screen->height() - m_pMenu->sizeHint().height()) / 2;
170 }
171 QPoint pos(x, y);
172 m_pMenu->popup(pos);
173 m_pMenu->setActiveItem(m_index);
174 }
175 m_isShowing = false;
176}
177
178void TaskSelector::next()
179{
180 m_index++;
181 if(m_index > (signed int)m_applist.count()){
182 m_index = START_INDEX;
183 }
184 m_pMenu->setActiveItem(m_index);
185}
186
187void TaskSelector::select()
188{
189 //select(m_index);
190 m_pMenu->activateItemAt(m_index);
191}
192
193void TaskSelector::select(int index)
194{
195 if(index > 0){
196 Global::execute(m_applist[index-1]);
197 }
198 m_index = 0;
199}
200
201void TaskSelector::highlight(int index)
202{
203 if(m_pMenu->isVisible()){
204 m_index = index;
205 }
206}
207
208bool TaskSelector::eventFilter(QObject* o, QEvent* e)
209{
210 if(m_pMenu->isVisible()){
211 QKeyEvent* ke = (QKeyEvent*)e;
212 switch(e->type()){
213 case QEvent::Accel:
214 if(ke->key() == Qt::Key_Space
215 && ke->isAutoRepeat() == false){
216 select();
217 }
218 break;
219 default:
220 //qDebug(">>>>> [%p][%d] <<<<<", o, e->type());
221 break;
222 }
223 }
224 return QObject::eventFilter(o, e);
225}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.h b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.h
new file mode 100644
index 0000000..ceb157d
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSelector.h
@@ -0,0 +1,85 @@
1#ifndef _TASK_SELECTOR_H_
2#define _TASK_SELECTOR_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6#include <qvaluelist.h>
7#include <qwindowsystem_qws.h>
8#include <qpopupmenu.h>
9#include <qpoint.h>
10#include <qtimer.h>
11#include <qgfx_qws.h>
12
13#include <qpe/global.h>
14#include <qpe/applnk.h>
15#include <qpe/config.h>
16#include <qpe/mimetype.h>
17
18#include "ExtensionInterface.h"
19#include "MenuTitle.h"
20#include "KeyNames.h"
21#include "AppLnkManager.h"
22#include "ConfigEx.h"
23#include "QPopupMenuEx.h"
24
25class TaskSelector : public QObject, public ExtensionInterface
26{
27 Q_OBJECT
28public:
29 TaskSelector(const QString& kind = "select");
30 virtual ~TaskSelector();
31
32 virtual bool onKeyPress(int keycode);
33 virtual bool onModRelease(int modcode);
34 virtual int getKeycode()
35 {
36 return(m_keycode);
37 }
38 virtual int getKeymask()
39 {
40 return(m_keymask);
41 }
42 virtual const QValueList<int>& getModcodes()
43 {
44 return(m_modcodes);
45 }
46 virtual void setKeycode(int keycode)
47 {
48 m_keycode = keycode;
49 }
50 virtual void setKeymask(int keymask)
51 {
52 m_keymask = keymask;
53 }
54 virtual void setModcodes(const QValueList<int>& modcodes)
55 {
56 m_modcodes = modcodes;
57 }
58 virtual const QString& kind()
59 {
60 return(m_kind);
61 }
62public slots:
63 void show();
64 void select();
65 void select(int);
66 void highlight(int id);
67private:
68 int m_keycode;
69 int m_keymask;
70 QString m_kind;
71 QValueList<int> m_modcodes;
72
73 bool m_isShowing;
74 int m_index;
75 QPopupMenu* m_pMenu;
76 QStringList m_applist;
77 QString m_accesskeys;
78
79 int buildMenu();
80 void next();
81private slots:
82 bool eventFilter(QObject* o, QEvent* e);
83};
84
85#endif /* _TASK_SELECTOR_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.cpp b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.cpp
new file mode 100644
index 0000000..c51eba5
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.cpp
@@ -0,0 +1,58 @@
1#include "TaskSwitcher.h"
2
3TaskSwitcher::TaskSwitcher(const QString& kind) : m_kind(kind)
4{
5 qDebug("TaskSwitcher::TaskSwitcher()");
6}
7
8TaskSwitcher::~TaskSwitcher()
9{
10 qDebug("TaskSwitcher::~TaskSwitcher()");
11}
12
13bool TaskSwitcher::onKeyPress(int /*keycode*/)
14{
15 if(m_applist.isEmpty()){
16 /* get list */
17 const QList<QWSWindow>& list = qwsServer->clientWindows();
18 QWSWindow* w;
19 for(QListIterator<QWSWindow> it(list); (w=it.current()); ++it){
20 if(w->isVisible()){
21 QString app = w->client()->identity();
22 qDebug("applist[%s]", app.latin1());
23 if(app != NULL && m_applist.contains(app) == false){
24 m_applist.append(app);
25 }
26 }
27 }
28 m_appit = m_applist.begin();
29 }
30 if(m_applist.count() > 1){
31 /* switch next */
32 next();
33 if(*m_appit == "launcher"){
34 next();
35 }
36 Global::execute(*m_appit);
37 } else if(m_applist.count() == 1
38 && *m_appit != "launcher"){
39 Global::execute(*m_appit);
40 } else {
41 qDebug("no applications");
42 }
43 return(true);
44}
45
46bool TaskSwitcher::onModRelease(int /*keycode*/)
47{
48 m_applist.clear();
49 return(false);
50}
51
52void TaskSwitcher::next()
53{
54 ++m_appit;
55 if(m_appit == m_applist.end()){
56 m_appit = m_applist.begin();
57 }
58}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.h b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.h
new file mode 100644
index 0000000..7bbde55
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/extension/TaskSwitcher.h
@@ -0,0 +1,61 @@
1#ifndef _TASK_SWITCHER_H_
2#define _TASK_SWITCHER_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6#include <qvaluelist.h>
7#include <qwindowsystem_qws.h>
8
9#include <qpe/global.h>
10
11#include "ExtensionInterface.h"
12
13class TaskSwitcher : public ExtensionInterface
14{
15public:
16 TaskSwitcher(const QString& kind = "switch");
17 virtual ~TaskSwitcher();
18
19 virtual bool onKeyPress(int keycode);
20 virtual bool onModRelease(int modcode);
21 virtual int getKeycode()
22 {
23 return(m_keycode);
24 }
25 virtual int getKeymask()
26 {
27 return(m_keymask);
28 }
29 virtual const QValueList<int>& getModcodes()
30 {
31 return(m_modcodes);
32 }
33 virtual void setKeycode(int keycode)
34 {
35 m_keycode = keycode;
36 }
37 virtual void setKeymask(int keymask)
38 {
39 m_keymask = keymask;
40 }
41 virtual void setModcodes(const QValueList<int>& modcodes)
42 {
43 m_modcodes = modcodes;
44 }
45 virtual const QString& kind()
46 {
47 return(m_kind);
48 }
49private:
50 int m_keycode;
51 int m_keymask;
52 QString m_kind;
53 QValueList<int> m_modcodes;
54
55 QStringList m_applist;
56 QStringList::Iterator m_appit;
57
58 void next();
59};
60
61#endif /* _TASK_SWITCHER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/keyhelperapplet.pro b/noncore/applets/keyhelper/keyhelperapplet/keyhelperapplet.pro
new file mode 100644
index 0000000..dafb077
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/keyhelperapplet.pro
@@ -0,0 +1,80 @@
1 TEMPLATE= lib
2 CONFIG = qt plugin warn_on
3 HEADERS = anylnk/AnyLnk.h \
4 anylnk/AppLnkManager.h \
5 anylnk/AppLnkWrapper.h \
6 anylnk/DocLnkWrapper.h \
7 anylnk/ExecLnk.h \
8 anylnk/LnkWrapper.h \
9 anylnk/MenuLnk.h \
10 anylnk/ProcessInvoker.h \
11 anylnk/QCopLnk.h \
12 anylnk/TextLnk.h \
13 applet/KeyHelper.h \
14 applet/KeyHelperApplet.h \
15 applet/KeyHelperWidget.h \
16 applet/QSafeDataStream.h \
17 config/ExtensionsHandler.h \
18 config/KeycfgErrorHandler.h \
19 config/KeycfgHandler.h \
20 config/KeycfgReader.h \
21 config/MappingsHandler.h \
22 config/ModifiersHandler.h \
23 config/RepeaterHandler.h \
24 extension/ExtensionFactory.h \
25 extension/ExtensionInterface.h \
26 extension/KeyExtensions.h \
27 extension/KeyLauncher.h \
28 extension/MenuLauncher.h \
29 extension/MenuTitle.h \
30 extension/QPopupMenuEx.h \
31 extension/TaskSelector.h \
32 extension/TaskSwitcher.h \
33 misc/ConfigEx.h \
34 misc/KHUtil.h \
35 misc/KeyAction.h \
36 misc/KeyMappings.h \
37 misc/KeyModifiers.h \
38 misc/KeyNames.h \
39 misc/KeyRepeater.h \
40 misc/StringParser.h
41 SOURCES = anylnk/AnyLnk.cpp \
42 anylnk/AppLnkManager.cpp \
43 anylnk/AppLnkWrapper.cpp \
44 anylnk/LnkWrapper.cpp \
45 anylnk/ProcessInvoker.cpp \
46 anylnk/QCopLnk.cpp \
47 anylnk/TextLnk.cpp \
48 applet/KeyHelper.cpp \
49 applet/KeyHelperApplet.cpp \
50 applet/KeyHelperWidget.cpp \
51 applet/QSafeDataStream.cpp \
52 config/ExtensionsHandler.cpp \
53 config/KeycfgErrorHandler.cpp \
54 config/KeycfgHandler.cpp \
55 config/KeycfgReader.cpp \
56 config/MappingsHandler.cpp \
57 config/ModifiersHandler.cpp \
58 config/RepeaterHandler.cpp \
59 extension/ExtensionFactory.cpp \
60 extension/KeyExtensions.cpp \
61 extension/KeyLauncher.cpp \
62 extension/MenuLauncher.cpp \
63 extension/MenuTitle.cpp \
64 extension/TaskSelector.cpp \
65 extension/TaskSwitcher.cpp \
66 misc/ConfigEx.cpp \
67 misc/KHUtil.cpp \
68 misc/KeyAction.cpp \
69 misc/KeyMappings.cpp \
70 misc/KeyModifiers.cpp \
71 misc/KeyNames.cpp \
72 misc/KeyRepeater.cpp \
73 misc/StringParser.cpp
74 DESTDIR = $(OPIEDIR)/plugins/applets/
75 INCLUDEPATH += $(OPIEDIR)/include ./misc ./config ./applet ./extension ./anylnk
76 LIBS += -lqpe -lopiecore2
77 TARGET = keyhelperapplet
78 VERSION = 1.2.2
79
80include( $(OPIEDIR)/include.pro )
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.cpp
new file mode 100644
index 0000000..3693dff
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.cpp
@@ -0,0 +1,112 @@
1#include "ConfigEx.h"
2
3ConfigEx::ConfigEx(const QString& name, Domain domain)
4 : Config(name, domain)
5{
6 m_charset = "utf8";
7 decode();
8 m_lastRead = QDateTime::currentDateTime();
9}
10
11#if 0
12void ConfigEx::removeComment()
13{
14 for(QMap<QString,ConfigGroup>::Iterator it=groups.begin();
15 it!=groups.end(); ++it){
16 QStringList removeList;
17 for(ConfigGroup::Iterator it2=(*it).begin();
18 it2!=(*it).end(); ++it2){
19 if(it2.key()[0] == '#'){
20 QString key = it2.key();
21 removeList.append(it2.key());
22 }
23 }
24 for(QStringList::Iterator it3=removeList.begin();
25 it3!=removeList.end(); ++it3){
26 (*it).remove(*it3);
27 }
28 }
29}
30#endif
31
32void ConfigEx::decode()
33{
34 QString group = getGroup();
35 setGroup("Global");
36 QString charset = readEntry("CharSet", "utf8");
37 qWarning("ConfigEx::decode()[%s][%s]", charset.latin1(), m_charset.latin1());
38 setGroup(group);
39 if(charset != m_charset){
40 m_charset = charset;
41 read();
42 }
43 //removeComment();
44}
45
46void ConfigEx::read()
47{
48 qWarning("ConfigEx::read()");
49 groups.clear();
50 changed = FALSE;
51
52 if ( !QFileInfo( filename ).exists() ) {
53 git = groups.end();
54 return;
55 }
56
57 QFile f( filename );
58 if ( !f.open( IO_ReadOnly ) ) {
59 git = groups.end();
60 return;
61 }
62
63 QTextStream s( &f );
64#ifdef CONFIG_MULTICODEC
65 QTextCodec* codec = QTextCodec::codecForName(m_charset);
66 if(codec == NULL){
67 codec = QTextCodec::codecForName("utf8");
68 qWarning("Config CharSet[utf8]");
69 } else {
70 qWarning("Config CharSet[%s]", m_charset.latin1());
71 }
72 s.setCodec(codec);
73#else /* CONFIG_MULTICODEC */
74#if QT_VERSION <= 230 && defined(QT_NO_CODECS)
75 // The below should work, but doesn't in Qt 2.3.0
76 s.setCodec( QTextCodec::codecForMib( 106 ) );
77#else
78 s.setEncoding( QTextStream::UnicodeUTF8 );
79#endif
80#endif /* CONFIG_MULTICODEC */
81
82 QStringList list = QStringList::split('\n', s.read() );
83
84 f.close();
85
86 for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
87 if ( !parse( *it ) ) {
88 git = groups.end();
89 return;
90 }
91 }
92}
93
94QStringList ConfigEx::getKeys()
95{
96 QStringList keys;
97 if(groups.end() != git){
98 for(ConfigGroup::ConstIterator it=(*git).begin();
99 it!=(*git).end(); ++it){
100 if(it.key()[0] != '#'){
101 keys.append(it.key());
102 }
103 }
104 }
105 return(keys);
106}
107
108QDateTime ConfigEx::lastModified()
109{
110 QFileInfo info(filename);
111 return(info.lastModified());
112}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.h b/noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.h
new file mode 100644
index 0000000..32120cc
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/ConfigEx.h
@@ -0,0 +1,89 @@
1#ifndef _CONFIG_EX_H_
2#define _CONFIG_EX_H_
3
4#include <qstringlist.h>
5#include <qdatetime.h>
6#include <qfileinfo.h>
7#include <qtextstream.h>
8#include <qtextcodec.h>
9
10#define QTOPIA_INTERNAL_LANGLIST
11#include <qpe/config.h>
12#include <qpe/global.h>
13
14#define CONFIG_MULTICODEC
15
16/* Singleton Object */
17class ConfigEx : public Config
18{
19public:
20 static ConfigEx& getInstance(const QString& name){
21 static ConfigEx cfg(name);
22 if(/*cfg.flush() ||*/cfg.m_lastRead < cfg.lastModified()){
23 cfg.load(&cfg);
24 }
25 return(cfg);
26 }
27
28#if 0
29 bool flush(){
30 if(changed){
31 write();
32 return(true);
33 } else {
34 return(false);
35 }
36 }
37#endif
38
39 const QString& getGroup(){
40 return(git.key());
41 }
42
43 void load(ConfigEx* cfg){
44 cfg->read();
45 cfg->decode();
46 cfg->m_lastRead = QDateTime::currentDateTime();
47 }
48
49 void setConfig(const QString& name){
50 if(name == QString::null){
51 return;
52 }
53 /*flush();*/
54 filename = configFilename(name, User);
55 load(this);
56 }
57
58 void reload() {
59 /*flush();*/
60 load(this);
61 }
62
63 QStringList getKeys();
64 QDateTime lastModified();
65 QDateTime lastRead(){
66 return(m_lastRead);
67 }
68
69 friend class Dummy; /* for compie warning */
70private:
71 ConfigEx(const QString& name, Domain domain=User);
72 ConfigEx& operator=(const ConfigEx&);
73 virtual ~ConfigEx(){changed = false;}
74
75 class Dummy{}; /* for compile warning */
76
77
78 void read();
79 void decode();
80 //void removeComment();
81
82 QDateTime m_lastRead;
83#ifdef CONFIG_MULTICODEC
84 QString m_charset;
85#endif
86};
87
88#endif /* _CONFIG_EX_H_ */
89
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.cpp
new file mode 100644
index 0000000..b7134d9
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.cpp
@@ -0,0 +1,90 @@
1#include "KHUtil.h"
2#include <qwindowsystem_qws.h>
3
4int KHUtil::hex2int(const QString& hexstr, bool* ok)
5{
6 int val;
7 bool success;
8 if(hexstr.find("0x") == 0){
9 val = hexstr.mid(2).toInt(&success, 16);
10 } else {
11 val = hexstr.toInt(&success, 16);
12 }
13 if(!success){
14 val = 0;
15 }
16 if(ok){
17 *ok = success;
18 }
19 return(val);
20}
21
22const QStringList KHUtil::parseArgs(const QString& arguments)
23{
24 QString str;
25 QStringList args;
26 char quote = 0;
27 char c;
28 for(unsigned int i=0; i<arguments.length(); i++){
29 c = arguments[i];
30 switch(c){
31 case '\"':
32 if(quote == 0){
33 quote = c;
34 } else if(quote == '\"'){
35 if(str.length() > 0){
36 args.append(str);
37 }
38 str = "";
39 quote = 0;
40 } else {
41 str += c;
42 }
43 break;
44 case '\'':
45 if(quote == 0){
46 quote = c;
47 } else if(quote == '\''){
48 if(str.length() > 0){
49 args.append(str);
50 }
51 str = "";
52 quote = 0;
53 } else {
54 str += c;
55 }
56 break;
57 case ' ':
58 if(quote == 0){
59 if(str.length() > 0){
60 args.append(str);
61 str = "";
62 }
63 } else {
64 str += c;
65 }
66 break;
67 default:
68 str += c;
69 break;
70 }
71 }
72 if(str.length() > 0){
73 args.append(str);
74 }
75 return(args);
76}
77
78const QString KHUtil::currentApp()
79{
80 QString app;
81 const QList<QWSWindow>& list = qwsServer->clientWindows();
82 QWSWindow* w;
83 for(QListIterator<QWSWindow> it(list); (w=it.current()); ++it){
84 if(w->isVisible() && w->client()->identity() != QString::null){
85 app = w->client()->identity();
86 break;
87 }
88 }
89 return app;
90}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.h b/noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.h
new file mode 100644
index 0000000..a92a1b2
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KHUtil.h
@@ -0,0 +1,15 @@
1#ifndef _KHUTIL_H_
2#define _KHUTIL_H_
3
4#include <qstring.h>
5#include <qstringlist.h>
6
7class KHUtil
8{
9public:
10 static int hex2int(const QString& hexstr, bool* ok=NULL);
11 static const QStringList parseArgs(const QString& arguments);
12 static const QString currentApp();
13};
14
15#endif /* _KHUTIL_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.cpp
new file mode 100644
index 0000000..f44138c
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.cpp
@@ -0,0 +1,253 @@
1#include "KeyAction.h"
2
3KeyAction::KeyAction()
4{
5 qDebug("KeyAction::KeyAction()");
6 enable();
7}
8
9KeyAction::~KeyAction()
10{
11 qDebug("KeyAction::~KeyAction()");
12}
13
14void KeyAction::init()
15{
16 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
17
18 QString oldgroup = cfg.getGroup();
19 cfg.setGroup("Global");
20
21 m_keepToggle = cfg.readBoolEntry("KeepToggle", true);
22
23 m_excludeKeys.clear();
24 if(cfg.hasKey("ExcludeKeys")){
25 QStringList keys = cfg.readListEntry("ExcludeKeys", ',');
26 for(QStringList::Iterator it=keys.begin();
27 it!=keys.end(); ++it){
28 int code;
29 if((*it).find("0x") == 0){
30 code = KHUtil::hex2int(*it);
31 } else {
32 code = KeyNames::getCode(*it);
33 }
34 if(code > 0){
35 m_excludeKeys.append(code);
36 }
37 }
38 } else {
39 m_excludeKeys.append(Qt::Key_F34);
40 }
41
42 m_presscnt = 0;
43 m_check = true;
44 m_keep_toggle_code = 0;
45 m_capture = false;
46 cfg.setGroup(oldgroup);
47}
48
49void KeyAction::setAction(int unicode, int keycode, int modifiers,
50 bool isPress, bool autoRepeat)
51{
52 m_unicode = unicode;
53 m_keycode = keycode;
54 m_modifiers = modifiers;
55 m_isPress = isPress;
56 m_autoRepeat = autoRepeat;
57}
58
59bool KeyAction::checkState()
60{
61 if(0 < m_unicode && m_unicode < 0xFFFF){
62 QChar ch(m_unicode);
63 QChar::Category category = ch.category();
64 if(category == QChar::Letter_Lowercase){
65 if(m_modifiers == 0){
66 m_pMappings->setCapsLock(false);
67 return(true);
68 } else if(m_modifiers == Qt::ShiftButton){
69 m_pMappings->setCapsLock(true);
70 return(true);
71 }
72 } else if(category == QChar::Letter_Uppercase){
73 if(m_modifiers == 0){
74 m_pMappings->setCapsLock(true);
75 return(true);
76 } else if(m_modifiers == Qt::ShiftButton){
77 m_pMappings->setCapsLock(false);
78 return(true);
79 }
80 }
81 }
82 return(false);
83}
84
85void KeyAction::sendKeyEvent(int unicode, int keycode, int modifiers,
86 bool isPress, bool autoRepeat)
87{
88 if(m_hookChannel.isEmpty()){
89 QWSServer::sendKeyEvent(unicode, keycode, modifiers, isPress, autoRepeat);
90 } else {
91 if(QCopChannel::isRegistered(m_hookChannel)){
92 QCopEnvelope e(m_hookChannel, "keyEvent(int,int,int,int,int)");
93 e << unicode << keycode << modifiers << (int)isPress << (int)autoRepeat;
94 } else {
95 m_hookChannel = "";
96 QWSServer::sendKeyEvent(unicode, keycode, modifiers, isPress, autoRepeat);
97 }
98 }
99}
100
101bool KeyAction::doAction()
102{
103 if(m_enable == false){
104 return(false);
105 }
106#if 0
107 if(m_excludeKeys.contains(m_keycode)){
108 return(false);
109 }
110#endif
111 if(!m_autoRepeat){
112 qDebug("recv[%x][%x][%x][%d]",
113 m_unicode,
114 m_keycode,
115 m_modifiers,
116 m_isPress);
117 }
118
119 if(m_autoRepeat && !m_excludeKeys.contains(m_keycode)){
120 KeyRepeater::RepeaterMode repMode = m_pRepeater->getMode();
121 if(repMode == KeyRepeater::ENABLE
122 || repMode == KeyRepeater::KILL){
123 /* autoRepeat ¤Ï̵»ë */
124 return(true);
125 }
126 }
127
128 if(m_pRepeater->isRepeatable(m_keycode)){
129 if(m_isPress){
130 m_presscnt++;
131 } else {
132 m_presscnt--;
133 if(m_presscnt <= 0){
134 m_pRepeater->stop();
135 m_presscnt = 0;
136 }
137 }
138 }
139
140 if(m_check && m_isPress){
141 /* check capslock state */
142 if(checkState()){
143 m_check = false;
144 }
145 }
146
147 int unicode, keycode, modifiers;
148 /* keep toggle reset */
149 if(m_keepToggle && m_keep_toggle_code != 0){
150 if(m_keep_toggle_code != m_keycode){
151 m_pModifiers->resetToggles();
152 m_keep_toggle_code = 0;
153 } else {
154 m_pModifiers->keepToggles();
155 }
156 }
157
158 /* modifier ¾õÂÖ¼èÆÀ */
159 int keymask = m_pModifiers->getState(m_modifiers);
160 modifiers = m_pModifiers->getModifiers(m_modifiers);
161
162 bool isModMapped = false;
163 /* modifier ¾õÂÖ¹¹¿· */
164 if(m_autoRepeat == false){
165 if(m_isPress){
166 isModMapped = m_pModifiers->pressKey(m_keycode, m_modifiers);
167 } else {
168 m_pModifiers->releaseKey(m_keycode);
169 }
170 }
171
172 if(m_capture && m_isPress && m_autoRepeat == false){
173 QCopEnvelope e("QPE/KeyHelperConf", "event(int,int,int)");
174 e << m_keycode << m_unicode << modifiers;
175 }
176
177 /* keyextension ŬÍÑ */
178 bool fKeyCancel = m_pExtensions->doKey(m_keycode, keymask, m_isPress);
179 if(fKeyCancel){
180 if(m_keepToggle){
181 m_keep_toggle_code = m_keycode;
182 } else {
183 m_pModifiers->resetToggles();
184 }
185 m_pRepeater->stop();
186 return(true);
187 }
188
189 /* keymapping ŬÍÑ */
190#if 0
191 bool isMapped = m_pMappings->apply(m_keycode, keymask, m_isPress);
192 if(isMapped == false){
193 if(m_pMappings->isDefined()){
194 m_pMappings->setOriginal(m_unicode, m_modifiers);
195 } else {
196 m_pMappings->setUnicode(m_unicode);
197 //m_pMappings->setKeycode(m_keycode);
198 }
199 //return(false);
200 }
201#else
202 bool isMapped = m_pMappings->apply(m_unicode, m_keycode, m_modifiers,
203 keymask, m_isPress);
204#endif
205
206 /* modifier ŬÍÑ */
207 m_pMappings->setModifiers(modifiers);
208
209 keycode = m_pMappings->getKeycode();
210 if(keycode <= 0){
211 return(true);
212 }
213
214 if(/*m_autoRepeat == false &&*/ m_isPress){
215 if(isModMapped == false || (isModMapped && isMapped)){
216 if(m_pModifiers->isModifier(keycode) == false){
217 m_pModifiers->resetToggles();
218 }
219 }
220 }
221 unicode = m_pMappings->getUnicode();
222 modifiers = m_pMappings->getModifiers();
223 if(keycode > 0){
224 /* disable mapping */
225 if(m_excludeKeys.contains(keycode)){
226 return(false);
227 }
228 /* send key event */
229 sendKeyEvent(
230 unicode,
231 keycode,
232 modifiers,
233 m_isPress,
234 m_autoRepeat);
235 }
236 if(m_isPress){
237 /* repeater start */
238 m_pRepeater->start(unicode, keycode, modifiers);
239#if 0
240 } else if(m_presscnt <= 0){
241 m_presscnt = 0;
242 m_pRepeater->stop();
243#endif
244 } else {
245 m_pRepeater->stop(keycode);
246 }
247 qWarning("send[%x][%x][%x][%d]",
248 m_pMappings->getUnicode(),
249 m_pMappings->getKeycode(),
250 m_pMappings->getModifiers(),
251 m_isPress);
252 return(true);
253}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.h b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.h
new file mode 100644
index 0000000..4eb5eb6
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyAction.h
@@ -0,0 +1,87 @@
1#ifndef _KEY_ACTION_H_
2#define _KEY_ACTION_H_
3
4#include <qobject.h>
5#include <qwindowsystem_qws.h>
6#include <qtimer.h>
7#include <qpe/power.h>
8#include "KeyMappings.h"
9#include "KeyModifiers.h"
10#include "KeyExtensions.h"
11#include "KeyRepeater.h"
12#include "ConfigEx.h"
13
14class KeyAction : public QObject
15{
16 Q_OBJECT
17public:
18 KeyAction();
19 virtual ~KeyAction();
20
21 void setKeyMappings(KeyMappings* map)
22 {
23 m_pMappings = map;
24 }
25 void setKeyModifiers(KeyModifiers* mod)
26 {
27 m_pModifiers = mod;
28 }
29 void setKeyExtensions(KeyExtensions* ext)
30 {
31 m_pExtensions = ext;
32 }
33 void setKeyRepeater(KeyRepeater* rep)
34 {
35 m_pRepeater = rep;
36 connect(m_pRepeater, SIGNAL(keyEvent(int,int,int,bool,bool)),
37 this, SLOT(sendKeyEvent(int,int,int,bool,bool)));
38 }
39 void setAction(int unicode, int keycode, int modifiers,
40 bool isPress, bool autoRepeat);
41 bool doAction();
42
43 void enable(){
44 init();
45 m_enable = true;
46 };
47 void disable(){
48 m_enable = false;
49 };
50 void setCapture(bool enable){
51 m_capture = enable;
52 }
53
54 void setHook(const QCString& s){
55 m_hookChannel = s;
56 }
57private:
58 int m_unicode;
59 int m_keycode;
60 int m_modifiers;
61 bool m_isPress;
62 bool m_autoRepeat;
63
64 bool m_capture;
65 bool m_enable;
66 int m_presscnt;
67
68 int m_keep_toggle_code;
69 bool m_keepToggle;
70 bool m_check;
71 QValueList<int> m_excludeKeys;
72
73 QCString m_hookChannel;
74
75 KeyMappings* m_pMappings;
76 KeyModifiers* m_pModifiers;
77 KeyExtensions* m_pExtensions;
78 KeyRepeater* m_pRepeater;
79
80 void init();
81 bool checkState();
82private slots:
83 void sendKeyEvent(int unicode, int keycode, int modifiers,
84 bool isPress, bool autoRepeat);
85};
86
87#endif /* _KEY_ACTION_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.cpp
new file mode 100644
index 0000000..0151d39
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.cpp
@@ -0,0 +1,340 @@
1#include "KeyMappings.h"
2
3static QIntDict<QWSServer::KeyMap> g_mapCache(127);
4
5MapInfo::MapInfo(int code, int mod, int uni,
6 int shift_uni, int ctrl_uni)
7{
8 const QWSServer::KeyMap* map;
9 if(uni == 0 || shift_uni == 0 || ctrl_uni == 0){
10 map = MapInfo::findKeyMap(code);
11 if(map != NULL){
12 isDefined = true;
13 unicode = map->unicode;
14 shift_unicode = map->shift_unicode;
15 ctrl_unicode = map->ctrl_unicode;
16 } else {
17 isDefined = false;
18 unicode = 0;
19 shift_unicode = 0;
20 ctrl_unicode = 0;
21 }
22 } else {
23 isDefined = true;
24 }
25 keycode = code;
26 modifiers = mod;
27 if(uni != 0){
28 unicode = uni;
29 }
30 if(shift_uni != 0){
31 shift_unicode = shift_uni;
32 }
33 if(ctrl_uni != 0){
34 ctrl_unicode = ctrl_uni;
35 }
36}
37
38const QWSServer::KeyMap* MapInfo::findKeyMap(int keycode)
39{
40 const QWSServer::KeyMap* m = QWSServer::keyMap();
41
42 while(m->key_code != 0){
43 if(m->key_code == keycode){
44 return(m);
45 }
46 m++;
47 }
48 return(NULL);
49}
50
51KeyMappings::KeyMappings()
52{
53 qDebug("KeyMappings::KeyMappings()");
54 init();
55}
56
57KeyMappings::~KeyMappings()
58{
59 qDebug("KeyMappings::~KeyMappings()");
60 clear();
61}
62
63void KeyMappings::init()
64{
65 m_capslock = false;
66}
67
68void KeyMappings::reset()
69{
70 clear();
71}
72
73void KeyMappings::clear()
74{
75 for(QMap<int, CodeMaps*>::Iterator it = m_keymaps.begin();
76 it!=m_keymaps.end(); ++it){
77 delete (*it);
78 }
79 m_keymaps.clear();
80 g_mapCache.setAutoDelete(true);
81 g_mapCache.clear();
82}
83
84void KeyMappings::assign(int keycode, int keymask, int mapcode,
85 int mapmodifiers, int unicode, int shift_unicode, int ctrl_unicode)
86{
87 CodeMaps* map;
88 if(m_keymaps.contains(keycode)){
89 map = m_keymaps[keycode];
90 } else {
91 map = new CodeMaps();
92 m_keymaps.insert(keycode, map);
93 }
94
95 MapInfo info(mapcode, mapmodifiers, unicode, shift_unicode, ctrl_unicode);
96 m_it = map->insert(keymask, info);
97}
98
99void KeyMappings::assignModifier(const QString& type, const QString& state)
100{
101 int maskbit = 0;
102 QString str;
103 str = type.lower();
104 if(str == "shift"){
105 maskbit = Qt::ShiftButton;
106 } else if(str == "control"){
107 maskbit = Qt::ControlButton;
108 } else if(str == "alt"){
109 maskbit = Qt::AltButton;
110 }
111 str = state.lower();
112 if(str == "off"){
113 maskbit = (maskbit << 16) & 0xFFFF0000;
114 }
115 (*m_it).modifiers |= maskbit;
116}
117
118void KeyMappings::assignUnicode(const QString& kind, const QString& ch)
119{
120 QString str;
121 int code = ch[0].unicode();
122 str = kind.lower();
123 if(str == "unicode"){
124 (*m_it).unicode = code;
125 } else if(str == "shift_unicode"){
126 (*m_it).shift_unicode = code;
127 } else if(str == "ctrl_unicode"){
128 (*m_it).ctrl_unicode = code;
129 }
130}
131
132void KeyMappings::assignUnicode(int unicode)
133{
134 (*m_it).unicode = (*m_it).shift_unicode =
135 (*m_it).ctrl_unicode = unicode;
136}
137
138void KeyMappings::statistics()
139{
140 qWarning("KeyMappings::statistics()");
141 for(QMap<int, CodeMaps*>::Iterator it=m_keymaps.begin();
142 it!=m_keymaps.end(); ++it){
143 qWarning(" code = %x", it.key());
144 for(QMap<int, MapInfo>::Iterator it2=(*it)->begin();
145 it2!=(*it)->end(); ++it2){
146 qDebug(" [%x]-[%x][%x][%x][%x][%x]", it2.key(),
147 (*it2).keycode,
148 (*it2).modifiers,
149 (*it2).unicode,
150 (*it2).shift_unicode,
151 (*it2).ctrl_unicode);
152 }
153 }
154}
155
156bool KeyMappings::apply(int unicode, int keycode, int modifiers,
157 int keymask, bool isPress)
158{
159 CodeMaps* map;
160 m_isMapped = false;
161
162 if(m_keymaps.contains(keycode)){
163 map = m_keymaps[keycode];
164 if(map->contains(keymask)){
165 m_isMapped = true;
166 m_keyinfo = (*map)[keymask];
167 } else {
168 int mask = -1;
169 for(CodeMaps::Iterator it=map->begin();
170 it!=map->end(); ++it){
171 if((keymask & it.key()) == it.key()
172 && it.key() > mask){
173 mask = it.key();
174 }
175 }
176 if(mask != -1){
177 m_isMapped = true;
178 m_keyinfo = (*map)[mask];
179 }
180 }
181 }
182
183 if(m_isMapped == false){
184 QWSServer::KeyMap* cache = g_mapCache[keycode];
185 if(cache == NULL){
186 cache = new QWSServer::KeyMap();
187 g_mapCache.insert(keycode, cache);
188 cache->unicode = cache->shift_unicode = cache->ctrl_unicode = 0;
189 }
190 if(cache->unicode == 0 || cache->shift_unicode == 0 || cache->ctrl_unicode == 0){
191 QChar ch(unicode);
192 if(modifiers & Qt::ControlButton){
193 cache->ctrl_unicode = unicode;
194 } else if(modifiers & Qt::ShiftButton){
195 cache->shift_unicode = ch.upper().unicode();
196 } else {
197 cache->unicode = ch.lower().unicode();
198 }
199 }
200 m_keyinfo = MapInfo(keycode, 0,
201 cache->unicode, cache->shift_unicode, cache->ctrl_unicode);
202 if(m_keyinfo.isDefined){
203 setOriginal(unicode, modifiers);
204 } else {
205 setUnicode(unicode);
206 }
207 }
208
209#if 1
210 if(isPress){
211 if(m_keyinfo.keycode == Qt::Key_CapsLock){
212 m_capslock = !m_capslock;
213 }
214 }
215#endif
216 return(m_isMapped);
217}
218
219bool KeyMappings::apply(int keycode, int keymask, bool isPress)
220{
221 CodeMaps* map;
222 m_isMapped = false;
223
224 if(m_keymaps.contains(keycode)){
225 map = m_keymaps[keycode];
226 if(map->contains(keymask)){
227 m_isMapped = true;
228 m_keyinfo = (*map)[keymask];
229 } else {
230 int mask = -1;
231 for(CodeMaps::Iterator it=map->begin();
232 it!=map->end(); ++it){
233 if((keymask & it.key()) == it.key()
234 && it.key() > mask){
235 mask = it.key();
236 }
237 }
238 if(mask != -1){
239 m_isMapped = true;
240 m_keyinfo = (*map)[mask];
241 }
242 }
243 }
244 if(m_isMapped == false){
245 m_keyinfo = MapInfo(keycode);
246 }
247#if 1
248 if(isPress){
249 if(m_keyinfo.keycode == Qt::Key_CapsLock){
250 m_capslock = !m_capslock;
251 }
252 }
253#endif
254 return(m_isMapped);
255}
256
257/**
258 * set original unicode
259 */
260void KeyMappings::setOriginal(int unicode, int modifiers)
261{
262 if(modifiers & Qt::ControlButton){
263 m_keyinfo.ctrl_unicode = unicode;
264 } else if(modifiers & Qt::ShiftButton){
265 m_keyinfo.shift_unicode = unicode;
266 } else {
267 m_keyinfo.unicode = unicode;
268 }
269}
270
271void KeyMappings::setModifiers(int modifiers)
272{
273 m_modifiers = modifiers;
274 m_modifiers |= (m_keyinfo.modifiers & 0xFFFF);
275 m_modifiers &= ~((m_keyinfo.modifiers >> 16) & 0xFFFF);
276}
277
278void KeyMappings::setUnicode(int unicode)
279{
280 m_keyinfo.unicode = unicode;
281 m_keyinfo.shift_unicode = unicode;
282 m_keyinfo.ctrl_unicode = unicode;
283}
284
285void KeyMappings::setKeycode(int keycode)
286{
287 m_keyinfo.keycode = keycode;
288}
289
290int KeyMappings::getUnicode()
291{
292 int unicode;
293 if(m_modifiers & Qt::ControlButton){
294 unicode = m_keyinfo.ctrl_unicode;
295 } else if(m_modifiers & Qt::ShiftButton){
296 unicode = m_keyinfo.shift_unicode;
297 QChar ch(unicode);
298 if(m_capslock){
299 unicode = ch.lower().unicode();
300 } else {
301 unicode = ch.upper().unicode();
302 }
303 } else {
304 unicode = m_keyinfo.unicode;
305 QChar ch(unicode);
306 if(m_capslock){
307 unicode = ch.upper().unicode();
308 } else {
309 unicode = ch.lower().unicode();
310 }
311 }
312 qDebug("UNICODE[%d][%x][%x]", m_capslock, unicode, m_keyinfo.unicode);
313#if 0
314 if(m_isMapped && m_capslock){
315 QChar ch(unicode);
316 QChar::Category category = ch.category();
317 if(category == QChar::Letter_Uppercase){
318 unicode = ch.lower().unicode();
319 } else if(category == QChar::Letter_Lowercase){
320 unicode = ch.upper().unicode();
321 }
322 }
323#endif
324 return(unicode);
325}
326
327int KeyMappings::getKeycode()
328{
329 return(m_keyinfo.keycode);
330}
331
332int KeyMappings::getModifiers()
333{
334 return(m_modifiers);
335}
336
337bool KeyMappings::isDefined()
338{
339 return(m_keyinfo.isDefined);
340}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.h b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.h
new file mode 100644
index 0000000..9705c8c
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyMappings.h
@@ -0,0 +1,72 @@
1#ifndef _KEY_MAPPINGS_H_
2#define _KEY_MAPPINGS_H_
3
4#include <qwindowsystem_qws.h>
5#include <qmap.h>
6
7#include <qintdict.h>
8
9class MapInfo
10{
11public:
12 MapInfo(){};
13 MapInfo(int code, int mod = 0, int uni = 0,
14 int shift_uni = 0, int ctrl_uni = 0);
15
16 static const QWSServer::KeyMap* findKeyMap(int code);
17
18 int keycode;
19 int modifiers;
20 int unicode;
21 int shift_unicode;
22 int ctrl_unicode;
23 bool isDefined;
24};
25
26class KeyMappings
27{
28public:
29 typedef QWSServer::KeyMap KeyMap;
30 typedef QMap<int, MapInfo> CodeMaps;
31
32 KeyMappings();
33 virtual ~KeyMappings();
34
35 void setOriginal(int unicode, int modifiers);
36 void setModifiers(int modifiers);
37 void setUnicode(int unicode);
38 void setKeycode(int keycode);
39
40 int getUnicode();
41 int getKeycode();
42 int getModifiers();
43 bool isDefined();
44
45 void assign(int keycode, int keymask, int mapcode, int mapmodifiers = 0,
46 int unicode = 0, int shift_unicode = 0, int ctrl_unicode = 0);
47 void assignModifier(const QString& type, const QString& state);
48 void assignUnicode(const QString& kind, const QString& ch);
49 void assignUnicode(int unicode);
50 bool apply(int unicode, int keycode, int modifiers, int keymask, bool isPress);
51 bool apply(int keycode, int keymask, bool isPress);
52 void setCapsLock(bool on=true){
53 m_capslock = on;
54 }
55
56 void reset();
57
58 void statistics();
59private:
60 QMap<int, CodeMaps*> m_keymaps;
61 MapInfo m_keyinfo;
62 int m_modifiers;
63 CodeMaps::Iterator m_it;
64
65 bool m_capslock;
66 bool m_isMapped;
67
68 void init();
69 void clear();
70};
71
72#endif /* _KEY_MAPPINGS_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.cpp
new file mode 100644
index 0000000..4699b11
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.cpp
@@ -0,0 +1,285 @@
1#include "KeyModifiers.h"
2
3KeyModifiers::KeyModifiers()
4{
5 qDebug("KeyModifiers::KeyModifiers()");
6 m_pTimer = new QTimer(this);
7 connect(m_pTimer, SIGNAL(timeout()),
8 this, SLOT(resetToggles()));
9 init();
10}
11
12KeyModifiers::~KeyModifiers()
13{
14 qDebug("KeyModifiers::~KeyModifiers()");
15 delete m_pTimer;
16 clear();
17}
18
19void KeyModifiers::addType(const QString& type)
20{
21 if(m_types.contains(type) == false){
22 qDebug("addType[%s][%x]", type.latin1(), m_bitmask);
23 m_types.insert(type, m_bitmask);
24 m_bitmask = m_bitmask << 1;
25 }
26}
27
28ModifierInfo* KeyModifiers::assign(const QString& type, int keycode,
29 int keymask, bool mode)
30{
31 m_info = new ModifierInfo(type, keycode, keymask, mode);
32 addType(type);
33 m_modifiers.append(m_info);
34 if(mode){
35 m_togglekeys.append(m_info);
36 }
37 assignRelease(m_info, keycode);
38 return(m_info);
39}
40
41void KeyModifiers::assignRelease(int keycode)
42{
43 assignRelease(m_info, keycode);
44}
45
46void KeyModifiers::assignRelease(ModifierInfo* info, int keycode)
47{
48 if(m_releasekeys.contains(keycode) == false){
49 m_releasekeys.insert(keycode, new ModifierList);
50 }
51 m_releasekeys[keycode]->append(info);
52}
53
54void KeyModifiers::setToggle()
55{
56 setToggle(m_info);
57}
58
59void KeyModifiers::setToggle(ModifierInfo* info)
60{
61 info->toggle_mode = true;
62 m_togglekeys.append(info);
63}
64
65void KeyModifiers::keepToggles()
66{
67 if(m_timeout > 0){
68 m_pTimer->start(m_timeout, true);
69 }
70}
71
72bool KeyModifiers::pressKey(int keycode, int modifiers)
73{
74 int keymask;
75
76 keymask = getState(modifiers, true);
77
78 for(ModifierList::Iterator it=m_modifiers.begin();
79 it!=m_modifiers.end(); ++it){
80 if((*it)->keycode == keycode
81 && ((*it)->keymask & keymask) == (*it)->keymask){
82 (*it)->pressed = true;
83 if((*it)->toggle_mode){
84 /* change toggle state */
85 (*it)->toggled = !((*it)->toggled);
86 if((*it)->toggled){
87 keepToggles();
88 } else {
89 m_pTimer->stop();
90 }
91 }
92 return(true);
93 }
94 }
95 return(false);
96}
97
98bool KeyModifiers::isModifier(int keycode)
99{
100 if(keycode == Qt::Key_Shift
101 || keycode == Qt::Key_Control
102 || keycode == Qt::Key_Alt
103 || keycode == Qt::Key_Meta
104 || keycode == Qt::Key_F22){
105 return(true);
106 } else {
107 return(false);
108 }
109}
110
111void KeyModifiers::releaseKey(int keycode)
112{
113 if(m_releasekeys.contains(keycode)){
114 ModifierList* list = m_releasekeys[keycode];
115 for(ModifierList::Iterator it=(*list).begin();
116 it!=(*list).end(); ++it){
117 (*it)->pressed = false;
118 }
119 }
120}
121
122int KeyModifiers::getState()
123{
124 int state = 0;
125 for(ModifierList::Iterator it=m_modifiers.begin();
126 it!=m_modifiers.end(); ++it){
127 if((*it)->pressed || (*it)->toggled){
128 state |= m_types[(*it)->type];
129 }
130 }
131 return(state);
132}
133
134int KeyModifiers::getState(int modifiers, bool reset)
135{
136 int state = getState();
137 int mask;
138
139 mask = getMask("Shift");
140 if(modifiers & Qt::ShiftButton){
141 state |= mask;
142 } else {
143 if(reset){
144 state &= ~mask;
145 }
146 }
147 mask = getMask("Control");
148 if(modifiers & Qt::ControlButton){
149 state |= mask;
150 } else {
151 if(reset){
152 state &= ~mask;
153 }
154 }
155 mask = getMask("Alt");
156 if(modifiers & Qt::AltButton){
157 state |= mask;
158 } else {
159 if(reset){
160 state &= ~mask;
161 }
162 }
163
164 return(state);
165}
166
167int KeyModifiers::getModifiers(int modifiers)
168{
169 int state = getState();
170
171 if(state & getMask("Shift")){
172 modifiers |= Qt::ShiftButton;
173 }
174 if(state & getMask("Control")){
175 modifiers |= Qt::ControlButton;
176 }
177 if(state & getMask("Alt")){
178 modifiers |= Qt::AltButton;
179 }
180
181 return(modifiers);
182}
183
184int KeyModifiers::getMask(const QString& type)
185{
186 if(m_types.contains(type)){
187 return(m_types[type]);
188 } else {
189 return(0);
190 }
191}
192
193void KeyModifiers::clear()
194{
195 m_types.clear();
196
197 m_togglekeys.clear();
198
199 for(ModifierList::Iterator it=m_modifiers.begin();
200 it!=m_modifiers.end(); ++it){
201 delete *it;
202 }
203 m_modifiers.clear();
204
205 for(QMap<int, ModifierList*>::Iterator it=m_releasekeys.begin();
206 it!=m_releasekeys.end(); ++it){
207 delete *it;
208 }
209 m_releasekeys.clear();
210}
211
212void KeyModifiers::init()
213{
214 m_bitmask = 0x00000001;
215 addType("Shift");
216 addType("Control");
217 addType("Alt");
218
219 ConfigEx& cfg = ConfigEx::getInstance("keyhelper");
220
221 cfg.setGroup("Global");
222
223 QString timeout = cfg.readEntry("ToggleTimeout", "10");
224 int msec = timeout.toInt();
225 msec *= 1000; /* sec to msec */
226 m_timeout = msec;
227}
228
229void KeyModifiers::reset()
230{
231 clear();
232 init();
233}
234
235bool KeyModifiers::isToggled()
236{
237 for(ModifierList::Iterator it=m_togglekeys.begin();
238 it!=m_togglekeys.end(); ++it){
239 if((*it)->toggled){
240 return(true);
241 }
242 }
243 return(false);
244}
245
246void KeyModifiers::resetToggles()
247{
248 for(ModifierList::Iterator it=m_togglekeys.begin();
249 it!=m_togglekeys.end(); ++it){
250 (*it)->toggled = false;
251 }
252 m_pTimer->stop();
253}
254
255void KeyModifiers::resetStates()
256{
257 for(ModifierList::Iterator it=m_modifiers.begin();
258 it!=m_modifiers.end(); ++it){
259 (*it)->pressed = false;
260 }
261 resetToggles();
262}
263
264void KeyModifiers::statistics()
265{
266 qWarning("KeyModifiers::statistics()");
267 for(ModifierList::Iterator it=m_modifiers.begin();
268 it!=m_modifiers.end(); ++it){
269 qWarning(" [%s][%x][%x][%d][%d]",
270 (*it)->type.latin1(),
271 (*it)->keycode,
272 (*it)->keymask,
273 (*it)->pressed,
274 (*it)->toggled);
275 for(QMap<int, ModifierList*>::Iterator it2=m_releasekeys.begin();
276 it2!=m_releasekeys.end(); ++it2){
277 for(ModifierList::Iterator it3=(*it2)->begin();
278 it3!=(*it2)->end(); ++it3){
279 if(*it == *it3){
280 qWarning(" release[%x]", it2.key());
281 }
282 }
283 }
284 }
285}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.h b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.h
new file mode 100644
index 0000000..a99c181
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyModifiers.h
@@ -0,0 +1,80 @@
1#ifndef _KEY_MODIFIERS_H_
2#define _KEY_MODIFIERS_H_
3
4#include <qmap.h>
5#include <qtimer.h>
6#include <qvaluelist.h>
7#include <qnamespace.h>
8
9#include <qpe/config.h>
10#include "ConfigEx.h"
11
12struct ModifierInfo {
13public:
14 ModifierInfo(const QString& tp, int code, int mask, bool mode)
15 {
16 type = tp;
17 keycode = code;
18 keymask = mask;
19 pressed = false;
20 toggled = false;
21 toggle_mode = mode;
22 }
23 QString type;
24 int keycode;
25 int keymask;
26 bool pressed;
27 bool toggled;
28 bool toggle_mode;
29private:
30} ;
31
32class KeyModifiers : public QObject
33{
34 Q_OBJECT
35public:
36 typedef QValueList<ModifierInfo*> ModifierList;
37
38 KeyModifiers();
39 virtual ~KeyModifiers();
40 void addType(const QString& type);
41 ModifierInfo* assign(const QString& type, int keycode,
42 int keymask = 0, bool toggle = false);
43 void assignRelease(int keycode);
44 void assignRelease(ModifierInfo* info, int keycode);
45 void setToggle();
46 void setToggle(ModifierInfo* info);
47
48 bool isToggled();
49 void resetStates();
50 void keepToggles();
51
52 bool pressKey(int keycode, int modifiers);
53 void releaseKey(int keycode);
54 int getState();
55 int getState(int modifiers, bool reset = false);
56 int getMask(const QString& type);
57 int getModifiers(int modifiers);
58
59 bool isModifier(int keycode);
60
61 void statistics();
62
63 void reset();
64public slots:
65 void resetToggles();
66private:
67 QMap<QString, int> m_types;
68 int m_bitmask;
69 ModifierList m_modifiers;
70 QMap<int, ModifierList*> m_releasekeys;
71 ModifierList m_togglekeys;
72 ModifierInfo* m_info;
73 QTimer* m_pTimer;
74 int m_timeout;
75
76 void clear();
77 void init();
78};
79
80#endif /* _KEY_MODIFIERS_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.cpp
new file mode 100644
index 0000000..2def857
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.cpp
@@ -0,0 +1,303 @@
1#include "KeyNames.h"
2
3QMap<QString, int> KeyNames::codemap;
4QMap<int, QString> KeyNames::namemap;
5QString KeyNames::tmpname;
6
7static struct {
8 int code;
9 char* name;
10} stKeyNames[] = {
11{Qt::Key_Escape, "Escape"},
12{Qt::Key_Tab, "Tab"},
13{Qt::Key_Backtab, "Backtab"},
14{Qt::Key_BackTab, "BackTab"},
15{Qt::Key_Backtab, "Backtab"},
16{Qt::Key_Backspace, "Backspace"},
17{Qt::Key_BackSpace, "BackSpace"},
18{Qt::Key_Backspace, "Backspace"},
19{Qt::Key_Return, "Return"},
20{Qt::Key_Enter, "Enter"},
21{Qt::Key_Insert, "Insert"},
22{Qt::Key_Delete, "Delete"},
23{Qt::Key_Pause, "Pause"},
24{Qt::Key_Print, "Print"},
25{Qt::Key_SysReq, "SysReq"},
26{Qt::Key_Home, "Home"},
27{Qt::Key_End, "End"},
28{Qt::Key_Left, "Left"},
29{Qt::Key_Up, "Up"},
30{Qt::Key_Right, "Right"},
31{Qt::Key_Down, "Down"},
32{Qt::Key_Prior, "Prior"},
33{Qt::Key_PageUp, "PageUp"},
34{Qt::Key_Prior, "Prior"},
35{Qt::Key_Next, "Next"},
36{Qt::Key_PageDown, "PageDown"},
37{Qt::Key_Next, "Next"},
38{Qt::Key_Shift, "Shift"},
39{Qt::Key_Control, "Control"},
40{Qt::Key_Meta, "Meta"},
41{Qt::Key_Alt, "Alt"},
42{Qt::Key_CapsLock, "CapsLock"},
43{Qt::Key_NumLock, "NumLock"},
44{Qt::Key_ScrollLock, "ScrollLock"},
45{Qt::Key_F1, "F1"},
46{Qt::Key_F2, "F2"},
47{Qt::Key_F3, "F3"},
48{Qt::Key_F4, "F4"},
49{Qt::Key_F5, "F5"},
50{Qt::Key_F6, "F6"},
51{Qt::Key_F7, "F7"},
52{Qt::Key_F8, "F8"},
53{Qt::Key_F9, "F9"},
54{Qt::Key_F10, "F10"},
55{Qt::Key_F11, "F11"},
56{Qt::Key_F12, "F12"},
57{Qt::Key_F13, "F13"},
58{Qt::Key_F14, "F14"},
59{Qt::Key_F15, "F15"},
60{Qt::Key_F16, "F16"},
61{Qt::Key_F17, "F17"},
62{Qt::Key_F18, "F18"},
63{Qt::Key_F19, "F19"},
64{Qt::Key_F20, "F20"},
65{Qt::Key_F21, "F21"},
66{Qt::Key_F22, "F22"},
67{Qt::Key_F23, "F23"},
68{Qt::Key_F24, "F24"},
69{Qt::Key_F25, "F25"},
70{Qt::Key_F26, "F26"},
71{Qt::Key_F27, "F27"},
72{Qt::Key_F28, "F28"},
73{Qt::Key_F29, "F29"},
74{Qt::Key_F30, "F30"},
75{Qt::Key_F31, "F31"},
76{Qt::Key_F32, "F32"},
77{Qt::Key_F33, "F33"},
78{Qt::Key_F34, "F34"},
79{Qt::Key_F35, "F35"},
80{Qt::Key_Super_L, "Super_L"},
81{Qt::Key_Super_R, "Super_R"},
82{Qt::Key_Menu, "Menu"},
83{Qt::Key_Hyper_L, "Hyper_L"},
84{Qt::Key_Hyper_R, "Hyper_R"},
85{Qt::Key_Help, "Help"},
86{Qt::Key_Space, "Space"},
87{Qt::Key_Any, "Any"},
88{Qt::Key_Space, "Space"},
89{Qt::Key_Exclam, "Exclam"},
90{Qt::Key_QuoteDbl, "QuoteDbl"},
91{Qt::Key_NumberSign, "NumberSign"},
92{Qt::Key_Dollar, "Dollar"},
93{Qt::Key_Percent, "Percent"},
94{Qt::Key_Ampersand, "Ampersand"},
95{Qt::Key_Apostrophe, "Apostrophe"},
96{Qt::Key_ParenLeft, "ParenLeft"},
97{Qt::Key_ParenRight, "ParenRight"},
98{Qt::Key_Asterisk, "Asterisk"},
99{Qt::Key_Plus, "Plus"},
100{Qt::Key_Comma, "Comma"},
101{Qt::Key_Minus, "Minus"},
102{Qt::Key_Period, "Period"},
103{Qt::Key_Slash, "Slash"},
104{Qt::Key_0, "0"},
105{Qt::Key_1, "1"},
106{Qt::Key_2, "2"},
107{Qt::Key_3, "3"},
108{Qt::Key_4, "4"},
109{Qt::Key_5, "5"},
110{Qt::Key_6, "6"},
111{Qt::Key_7, "7"},
112{Qt::Key_8, "8"},
113{Qt::Key_9, "9"},
114{Qt::Key_Colon, "Colon"},
115{Qt::Key_Semicolon, "Semicolon"},
116{Qt::Key_Less, "Less"},
117{Qt::Key_Equal, "Equal"},
118{Qt::Key_Greater, "Greater"},
119{Qt::Key_Question, "Question"},
120{Qt::Key_At, "At"},
121{Qt::Key_A, "A"},
122{Qt::Key_B, "B"},
123{Qt::Key_C, "C"},
124{Qt::Key_D, "D"},
125{Qt::Key_E, "E"},
126{Qt::Key_F, "F"},
127{Qt::Key_G, "G"},
128{Qt::Key_H, "H"},
129{Qt::Key_I, "I"},
130{Qt::Key_J, "J"},
131{Qt::Key_K, "K"},
132{Qt::Key_L, "L"},
133{Qt::Key_M, "M"},
134{Qt::Key_N, "N"},
135{Qt::Key_O, "O"},
136{Qt::Key_P, "P"},
137{Qt::Key_Q, "Q"},
138{Qt::Key_R, "R"},
139{Qt::Key_S, "S"},
140{Qt::Key_T, "T"},
141{Qt::Key_U, "U"},
142{Qt::Key_V, "V"},
143{Qt::Key_W, "W"},
144{Qt::Key_X, "X"},
145{Qt::Key_Y, "Y"},
146{Qt::Key_Z, "Z"},
147{Qt::Key_BracketLeft, "BracketLeft"},
148{Qt::Key_Backslash, "Backslash"},
149{Qt::Key_BracketRight, "BracketRight"},
150{Qt::Key_AsciiCircum, "AsciiCircum"},
151{Qt::Key_Underscore, "Underscore"},
152{Qt::Key_QuoteLeft, "QuoteLeft"},
153{Qt::Key_BraceLeft, "BraceLeft"},
154{Qt::Key_Bar, "Bar"},
155{Qt::Key_BraceRight, "BraceRight"},
156{Qt::Key_AsciiTilde, "AsciiTilde"},
157{Qt::Key_nobreakspace, "nobreakspace"},
158{Qt::Key_exclamdown, "exclamdown"},
159{Qt::Key_cent, "cent"},
160{Qt::Key_sterling, "sterling"},
161{Qt::Key_currency, "currency"},
162{Qt::Key_yen, "yen"},
163{Qt::Key_brokenbar, "brokenbar"},
164{Qt::Key_section, "section"},
165{Qt::Key_diaeresis, "diaeresis"},
166{Qt::Key_copyright, "copyright"},
167{Qt::Key_ordfeminine, "ordfeminine"},
168{Qt::Key_guillemotleft, "guillemotleft"},
169{Qt::Key_notsign, "notsign"},
170{Qt::Key_hyphen, "hyphen"},
171{Qt::Key_registered, "registered"},
172{Qt::Key_macron, "macron"},
173{Qt::Key_degree, "degree"},
174{Qt::Key_plusminus, "plusminus"},
175{Qt::Key_twosuperior, "twosuperior"},
176{Qt::Key_threesuperior, "threesuperior"},
177{Qt::Key_acute, "acute"},
178{Qt::Key_mu, "mu"},
179{Qt::Key_paragraph, "paragraph"},
180{Qt::Key_periodcentered, "periodcentered"},
181{Qt::Key_cedilla, "cedilla"},
182{Qt::Key_onesuperior, "onesuperior"},
183{Qt::Key_masculine, "masculine"},
184{Qt::Key_guillemotright, "guillemotright"},
185{Qt::Key_onequarter, "onequarter"},
186{Qt::Key_onehalf, "onehalf"},
187{Qt::Key_threequarters, "threequarters"},
188{Qt::Key_questiondown, "questiondown"},
189{Qt::Key_Agrave, "Agrave"},
190{Qt::Key_Aacute, "Aacute"},
191{Qt::Key_Acircumflex, "Acircumflex"},
192{Qt::Key_Atilde, "Atilde"},
193{Qt::Key_Adiaeresis, "Adiaeresis"},
194{Qt::Key_Aring, "Aring"},
195{Qt::Key_AE, "AE"},
196{Qt::Key_Ccedilla, "Ccedilla"},
197{Qt::Key_Egrave, "Egrave"},
198{Qt::Key_Eacute, "Eacute"},
199{Qt::Key_Ecircumflex, "Ecircumflex"},
200{Qt::Key_Ediaeresis, "Ediaeresis"},
201{Qt::Key_Igrave, "Igrave"},
202{Qt::Key_Iacute, "Iacute"},
203{Qt::Key_Icircumflex, "Icircumflex"},
204{Qt::Key_Idiaeresis, "Idiaeresis"},
205{Qt::Key_ETH, "ETH"},
206{Qt::Key_Ntilde, "Ntilde"},
207{Qt::Key_Ograve, "Ograve"},
208{Qt::Key_Oacute, "Oacute"},
209{Qt::Key_Ocircumflex, "Ocircumflex"},
210{Qt::Key_Otilde, "Otilde"},
211{Qt::Key_Odiaeresis, "Odiaeresis"},
212{Qt::Key_multiply, "multiply"},
213{Qt::Key_Ooblique, "Ooblique"},
214{Qt::Key_Ugrave, "Ugrave"},
215{Qt::Key_Uacute, "Uacute"},
216{Qt::Key_Ucircumflex, "Ucircumflex"},
217{Qt::Key_Udiaeresis, "Udiaeresis"},
218{Qt::Key_Yacute, "Yacute"},
219{Qt::Key_THORN, "THORN"},
220{Qt::Key_ssharp, "ssharp"},
221{Qt::Key_agrave, "agrave"},
222{Qt::Key_aacute, "aacute"},
223{Qt::Key_acircumflex, "acircumflex"},
224{Qt::Key_atilde, "atilde"},
225{Qt::Key_adiaeresis, "adiaeresis"},
226{Qt::Key_aring, "aring"},
227{Qt::Key_ae, "ae"},
228{Qt::Key_ccedilla, "ccedilla"},
229{Qt::Key_egrave, "egrave"},
230{Qt::Key_eacute, "eacute"},
231{Qt::Key_ecircumflex, "ecircumflex"},
232{Qt::Key_ediaeresis, "ediaeresis"},
233{Qt::Key_igrave, "igrave"},
234{Qt::Key_iacute, "iacute"},
235{Qt::Key_icircumflex, "icircumflex"},
236{Qt::Key_idiaeresis, "idiaeresis"},
237{Qt::Key_eth, "eth"},
238{Qt::Key_ntilde, "ntilde"},
239{Qt::Key_ograve, "ograve"},
240{Qt::Key_oacute, "oacute"},
241{Qt::Key_ocircumflex, "ocircumflex"},
242{Qt::Key_otilde, "otilde"},
243{Qt::Key_odiaeresis, "odiaeresis"},
244{Qt::Key_division, "division"},
245{Qt::Key_oslash, "oslash"},
246{Qt::Key_ugrave, "ugrave"},
247{Qt::Key_uacute, "uacute"},
248{Qt::Key_ucircumflex, "ucircumflex"},
249{Qt::Key_udiaeresis, "udiaeresis"},
250{Qt::Key_yacute, "yacute"},
251{Qt::Key_thorn, "thorn"},
252{Qt::Key_ydiaeresis, "ydiaeresis"},
253{Qt::Key_unknown, "unknown"},
254{0,0},
255};
256
257void KeyNames::setCodeMap()
258{
259 int i;
260
261 codemap.clear();
262 for(i=0; stKeyNames[i].code != 0; i++){
263 codemap.insert(stKeyNames[i].name, stKeyNames[i].code);
264 }
265}
266
267void KeyNames::setNameMap()
268{
269 int i;
270
271 namemap.clear();
272 for(i=0; stKeyNames[i].code != 0; i++){
273 namemap.insert(stKeyNames[i].code, stKeyNames[i].name);
274 }
275}
276
277
278int KeyNames::getCode(const QString& s){
279 if(codemap.isEmpty()) setCodeMap();
280 if(codemap.contains(s)){
281 return(codemap[s]);
282 } else {
283 if(s.find("0x") == 0){
284 bool success;
285 int val = s.mid(2).toInt(&success, 16);
286 if(success){
287 return(val);
288 }
289 }
290 return(0);
291 }
292}
293
294const QString& KeyNames::getName(int code){
295 if(namemap.isEmpty()) setNameMap();
296 if(namemap.contains(code)){
297 return(namemap[code]);
298 } else {
299 tmpname.sprintf("0x%x", code);
300 return(tmpname);
301 //return(QString::null);
302 }
303}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.h b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.h
new file mode 100644
index 0000000..3e80763
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyNames.h
@@ -0,0 +1,37 @@
1#ifndef _KEY_NAMES_H_
2#define _KEY_NAMES_H_
3
4#include <qstring.h>
5#include <qmap.h>
6#include <qnamespace.h>
7
8class KeyNames
9{
10public:
11 static const QString& getName(int code);
12 static int getCode(const QString& s);
13
14 static void clearName(){
15 namemap.clear();
16 }
17 static void setCode(const QString& s, int code){
18 if(codemap.contains(s) == false){
19 codemap.insert(s, code);
20 }
21 }
22 static void clearCode(){
23 codemap.clear();
24 }
25 static void reset(){
26 clearCode();
27 }
28private:
29 static QMap<QString, int> codemap;
30 static QMap<int, QString> namemap;
31 static QString tmpname;
32
33 static void setCodeMap();
34 static void setNameMap();
35};
36
37#endif /* _KEY_NAMES_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.cpp
new file mode 100644
index 0000000..84a8a89
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.cpp
@@ -0,0 +1,140 @@
1#include "KeyRepeater.h"
2
3KeyRepeater::KeyRepeater()
4{
5 qDebug("KeyRepeater::KeyRepeater()");
6 m_pTimer = new QTimer(this);
7 connect(m_pTimer, SIGNAL(timeout()), this, SLOT(autoRepeat()));
8 init();
9}
10
11KeyRepeater::~KeyRepeater()
12{
13 qDebug("KeyRepeater::~KeyRepeater()");
14 delete m_pTimer;
15}
16
17void KeyRepeater::start(int unicode, int keycode, int modifiers)
18{
19 m_unicode = unicode;
20 m_keycode = keycode;
21 m_modifiers = modifiers;
22 if(m_mode == ENABLE){
23 m_pTimer->stop();
24 if(isRepeatable(keycode)){
25 /* repeater start */
26 m_pTimer->start(m_repeatdelay, TRUE);
27 }
28 }
29}
30
31void KeyRepeater::stop(int keycode)
32{
33 if(keycode == 0
34 || keycode == m_keycode
35 || isRepeatable(keycode) == false){
36 m_pTimer->stop();
37 }
38}
39
40void KeyRepeater::init()
41{
42 m_mode = ENABLE;
43 m_repeatdelay = 400;
44 m_repeatperiod = 60;
45 m_disablekeys.append(0);
46 m_disablekeys.append(Qt::Key_Escape);
47 m_disablekeys.append(Qt::Key_Shift);
48 m_disablekeys.append(Qt::Key_Control);
49 m_disablekeys.append(Qt::Key_Alt);
50 m_disablekeys.append(Qt::Key_Meta);
51 for(int i=Qt::Key_F1; i<=Qt::Key_F35; i++){
52 m_disablekeys.append(i);
53 }
54}
55
56void KeyRepeater::clear()
57{
58 m_disablekeys.clear();
59}
60
61void KeyRepeater::reset()
62{
63 clear();
64 init();
65}
66
67void KeyRepeater::setRepeatable(int keycode, bool enable)
68{
69 if(enable){
70 QValueList<int>::Iterator it = m_disablekeys.find(keycode);
71 if(it != m_disablekeys.end()){
72 m_disablekeys.remove(it);
73 }
74 } else {
75 if(m_disablekeys.contains(keycode) == false){
76 m_disablekeys.append(keycode);
77 }
78 }
79}
80
81bool KeyRepeater::isRepeatable(int keycode)
82{
83 if(m_disablekeys.contains(keycode)){
84 return(false);
85 } else {
86 return(true);
87 }
88}
89
90void KeyRepeater::autoRepeat()
91{
92 /* key release event */
93#if 0
94 sendKeyEvent(
95 m_unicode,
96 m_keycode,
97 m_modifiers,
98 FALSE,
99 TRUE);
100 /* key press event */
101 sendKeyEvent(
102 m_unicode,
103 m_keycode,
104 m_modifiers,
105 TRUE,
106 TRUE);
107#else
108 emit keyEvent(
109 m_unicode,
110 m_keycode,
111 m_modifiers,
112 FALSE,
113 TRUE);
114 /* key press event */
115 emit keyEvent(
116 m_unicode,
117 m_keycode,
118 m_modifiers,
119 TRUE,
120 TRUE);
121#endif
122 /* start auto repeat */
123 m_pTimer->start(m_repeatperiod);
124#if 0
125 qDebug("autoRepeat[%x][%x][%x]",
126 m_unicode,
127 m_keycode,
128 m_modifiers);
129#endif
130}
131
132void KeyRepeater::statistics()
133{
134 qWarning("KeyRepeater::statistics()");
135 qWarning(" delay[%d] period[%d]", m_repeatdelay, m_repeatperiod);
136 for(QValueList<int>::Iterator it=m_disablekeys.begin();
137 it!=m_disablekeys.end(); ++it){
138 qDebug(" disable[%x]", *it);
139 }
140}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.h b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.h
new file mode 100644
index 0000000..56d6414
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/KeyRepeater.h
@@ -0,0 +1,86 @@
1#ifndef _KEY_REPEATER_H_
2#define _KEY_REPEATER_H_
3
4#include <qobject.h>
5#include <qtimer.h>
6#include <qvaluelist.h>
7#include <qwindowsystem_qws.h>
8
9#include <syslog.h>
10
11class KeyRepeater : public QObject
12{
13 Q_OBJECT
14public:
15 KeyRepeater();
16 virtual ~KeyRepeater();
17
18 typedef enum {
19 DISABLE=0,
20 ENABLE=1,
21 KILL=2,
22 } RepeaterMode;
23
24 void start(int unicode, int keycode, int modifieres);
25 void stop(int keycode = 0);
26 void reset();
27
28 void setRepeatable(int keycode, bool enable);
29 bool isRepeatable(int keycode);
30
31 void setMode(int mode){
32 switch(mode){
33 case DISABLE:
34 m_mode = DISABLE;
35 break;
36 case ENABLE:
37 m_mode = ENABLE;
38 break;
39 case KILL:
40 m_mode = KILL;
41 break;
42 default:
43 m_mode = ENABLE;
44 break;
45 }
46 }
47 RepeaterMode getMode(){
48 return(m_mode);
49 }
50
51 void setDelay(int msec)
52 {
53 m_repeatdelay = msec;
54 }
55 void setPeriod(int msec)
56 {
57 m_repeatperiod = msec;
58 }
59
60 void statistics();
61private slots:
62 void autoRepeat();
63private:
64 int m_unicode;
65 int m_keycode;
66 int m_modifiers;
67
68 int m_repeatdelay;
69 int m_repeatperiod;
70
71 QCString m_hookChannel;
72
73 RepeaterMode m_mode;
74
75 QValueList<int> m_disablekeys;
76
77 QTimer* m_pTimer;
78
79 void init();
80 void clear();
81signals:
82 void keyEvent(int unicode, int keycode, int modifiers,
83 bool isPress, bool autoRepeat);
84};
85
86#endif /* _KEY_REPEATER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.cpp b/noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.cpp
new file mode 100644
index 0000000..72c15f1
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.cpp
@@ -0,0 +1,72 @@
1#include "StringParser.h"
2
3#include <qregexp.h>
4
5QStringList StringParser::split(const QChar& sep, const QString& str,
6 bool allowEmptyEntries)
7{
8 QString line = str + sep;
9 QString quote;
10 QRegExp rxend;
11 QRegExp rxdbl;
12 int pos=0, len, idx=0;
13 QStringList list;
14 while(idx < (int)line.length()-1){
15 if(!quote.isEmpty()){
16 QString s;
17 while((pos = rxend.match(line, idx, &len)) != -1){
18 s += line.mid(idx, len+pos-idx-1);
19 idx = pos+len-1;
20 if(len % 2 == 0){
21 s.replace(rxdbl, quote);
22 list.append(s.left(s.length()-1));
23 idx++;
24 break;
25 }
26 }
27 quote = "";
28 } else if(line[idx] == '\"'){
29 rxend.setPattern(QString("\"+") + sep);
30 rxdbl.setPattern("\"\"");
31 quote = "\"";
32 idx++;
33 } else if(line[idx] == '\''){
34 rxend.setPattern(QString("\'+") + sep);
35 rxdbl.setPattern("\'\'");
36 quote = "\'";
37 idx++;
38 } else if(!allowEmptyEntries && line[idx] == sep){
39 idx++;
40 } else {
41 pos = line.find(sep, idx);
42 if(pos != -1){
43 const QString& s = line.mid(idx, pos-idx);
44 list.append(s);
45 idx = pos+1;
46 }
47 }
48 if(pos == -1) break;
49 }
50 return list;
51}
52
53QString StringParser::join(const QChar& sep, const QStringList& list)
54{
55 QString str;
56 QString s;
57 QStringList tmp;
58 QRegExp quote("\"");
59 for(QStringList::ConstIterator it=list.begin();
60 it!=list.end(); ++it){
61 s = *it;
62 if(s.find(sep) != -1
63 || s[0] == '\"'
64 || s[0] == '\''){
65 s.replace(quote, "\"\"");
66 tmp.append("\"" + s + "\"");
67 } else {
68 tmp.append(s);
69 }
70 }
71 return tmp.join(sep);
72}
diff --git a/noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.h b/noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.h
new file mode 100644
index 0000000..8c1dc58
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperapplet/misc/StringParser.h
@@ -0,0 +1,14 @@
1#ifndef _STRING_PARSER_H_
2#define _STRING_PARSER_H_
3
4#include <qstringlist.h>
5
6class StringParser
7{
8public:
9 static QStringList split(const QChar& sep, const QString& str,
10 bool allowEmptyEntries=FALSE);
11 static QString join(const QChar& sep, const QStringList& list);
12};
13
14#endif /* _STRING_PARSER_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperconf/KHCWidget.cpp b/noncore/applets/keyhelper/keyhelperconf/KHCWidget.cpp
new file mode 100644
index 0000000..b0767cf
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/KHCWidget.cpp
@@ -0,0 +1,307 @@
1#include "KHCWidget.h"
2
3KHCWidget::KHCWidget(QWidget* parent, const char* name, WFlags fl)
4 : KHCWidgetBase(parent, name, fl)
5{
6 m_isEnable = true;
7 setLayout();
8 setHandler();
9
10 txtOrgKey->installEventFilter(this);
11 txtMapKey->installEventFilter(this);
12}
13
14KHCWidget::~KHCWidget()
15{
16}
17
18void KHCWidget::setLayout()
19{
20 QBoxLayout* topLayout = new QVBoxLayout(this, 5);
21
22 QBoxLayout* orgLayout1 = new QHBoxLayout(topLayout);
23 orgLayout1->addWidget(lblOriginal);
24 orgLayout1->addWidget(txtOrgKey);
25
26 QBoxLayout* orgLayout2 = new QHBoxLayout(topLayout);
27 orgLayout2->addWidget(lblOrgK);
28 orgLayout2->addWidget(lblOrgKeycode);
29#if 0
30 orgLayout2->addWidget(lblOrgM);
31 orgLayout2->addWidget(lblOrgModifiers);
32#endif
33 orgLayout2->addWidget(lblOrgU);
34 orgLayout2->addWidget(lblOrgUnicode);
35 orgLayout2->addWidget(chkOrgShift);
36 orgLayout2->addWidget(chkOrgCtrl);
37 orgLayout2->addWidget(chkOrgAlt);
38
39 QBoxLayout* mapLayout1 = new QHBoxLayout(topLayout);
40 mapLayout1->addWidget(lblMapping);
41 mapLayout1->addWidget(txtMapKey);
42
43 QBoxLayout* mapLayout2 = new QHBoxLayout(topLayout);
44 mapLayout2->addWidget(lblMapK);
45 mapLayout2->addWidget(lblMapKeycode);
46#if 0
47 mapLayout2->addWidget(lblMapM);
48 mapLayout2->addWidget(lblMapModifiers);
49#endif
50 mapLayout2->addWidget(lblMapU);
51 mapLayout2->addWidget(lblMapUnicode);
52 mapLayout2->addWidget(chkMapShift);
53 mapLayout2->addWidget(chkMapCtrl);
54 mapLayout2->addWidget(chkMapAlt);
55
56 QBoxLayout* btnLayout = new QHBoxLayout(topLayout);
57 btnLayout->addWidget(btnGen);
58 btnLayout->addWidget(btnCopy);
59 btnLayout->addWidget(btnCtrl);
60
61 topLayout->addWidget(mleDefine);
62}
63
64void KHCWidget::setHandler()
65{
66 connect(btnGen, SIGNAL(clicked()), this, SLOT(onClick_Gen()));
67 connect(btnCopy, SIGNAL(clicked()), this, SLOT(onClick_Copy()));
68 connect(btnCtrl, SIGNAL(clicked()), this, SLOT(onClick_Ctrl()));
69}
70
71bool KHCWidget::eventFilter(QObject* o, QEvent* e)
72{
73 if(::strcmp(o->name(), "txtOrgKey") == 0){
74 if(e->type() == QEvent::KeyPress){
75 QKeyEvent* ke = (QKeyEvent*)e;
76 if(ke->isAutoRepeat() == false){
77 onPress_Org(ke);
78 }
79 return(true);
80 }
81 } else if(::strcmp(o->name(), "txtMapKey") == 0){
82 if(e->type() == QEvent::KeyPress){
83 QKeyEvent* ke = (QKeyEvent*)e;
84 if(ke->isAutoRepeat() == false){
85 onPress_Map(ke);
86 }
87 return(true);
88 }
89 }
90
91 return QWidget::eventFilter(o, e);
92}
93
94void KHCWidget::onPress_Org(QKeyEvent* ke)
95{
96 /* keycode */
97 const QString& name = KeyNames::getName(ke->key());
98 if(name == QString::null){
99 lblOrgKeycode->setText(QString::number(ke->key(), 16));
100 } else {
101 lblOrgKeycode->setText(name);
102 }
103 /* modifiers */
104 chkOrgShift->setChecked(ke->state() & Qt::ShiftButton);
105 chkOrgCtrl->setChecked(ke->state() & Qt::ControlButton);
106 chkOrgAlt->setChecked(ke->state() & Qt::AltButton);
107
108 /* unicode */
109 if(ke->text()[0].isPrint()){
110 lblOrgUnicode->setText(ke->text());
111 } else {
112 lblOrgUnicode->setText(QString::number(ke->ascii(), 16));
113 }
114 m_OrgkeyData.setData(ke);
115}
116
117void KHCWidget::onPress_Map(QKeyEvent* ke)
118{
119 /* keycode */
120 const QString& name = KeyNames::getName(ke->key());
121 if(name == QString::null){
122 lblMapKeycode->setText(QString::number(ke->key(), 16));
123 } else {
124 lblMapKeycode->setText(name);
125 }
126 /* modifiers */
127 chkMapShift->setChecked(ke->state() & Qt::ShiftButton);
128 chkMapCtrl->setChecked(ke->state() & Qt::ControlButton);
129 chkMapAlt->setChecked(ke->state() & Qt::AltButton);
130
131 /* unicode */
132 if(ke->text()[0].isPrint()){
133 lblMapUnicode->setText(ke->text());
134 } else {
135 lblMapUnicode->setText(QString::number(ke->ascii(), 16));
136 }
137 m_MapkeyData.setData(ke);
138}
139
140void KHCWidget::onClick_Gen()
141{
142 mleDefine->clear();
143 if(m_OrgkeyData.key == 0
144 || m_MapkeyData.key == 0){
145 return;
146 }
147 /* original key */
148 QString line;
149 const QString& name = KeyNames::getName(m_OrgkeyData.key);
150 line = "<define ";
151 if(name == QString::null){
152 line.append("code=\"");
153 line.append(QString::number(m_OrgkeyData.key, 16));
154 } else {
155 line.append("key=\"");
156 line.append(name);
157 }
158 line.append("\">");
159 mleDefine->append(line);
160
161 /* original modifiers */
162 bool need = false;
163 line = "<modifier";
164 if(chkOrgShift->isChecked()){
165 line.append(" Shift=\"On\"");
166 need = true;
167 }
168 if(chkOrgCtrl->isChecked()){
169 line.append(" Control=\"On\"");
170 need = true;
171 }
172 if(chkOrgAlt->isChecked()){
173 line.append(" Alt=\"On\"");
174 need = true;
175 }
176 line.append("/>");
177 if(need){
178 mleDefine->append(line);
179 }
180
181 /* mapping key */
182 const QString& mapname = KeyNames::getName(m_MapkeyData.key);
183 line = "<map";
184 if(mapname == QString::null){
185 line.append(" code=\"");
186 line.append(QString::number(m_MapkeyData.key, 16));
187 } else {
188 line.append(" key=\"");
189 line.append(mapname);
190 }
191 line.append("\"/>");
192 mleDefine->append(line);
193
194 /* mapping modifiers */
195 need = false;
196 line = "<map_modifier";
197 bool on = chkMapShift->isChecked();
198 if(chkOrgShift->isChecked() != on){
199 line.append(" Shift=\"");
200 if(on){
201 line.append("On\"");
202 } else {
203 line.append("Off\"");
204 }
205 need = true;
206 }
207 on = chkMapCtrl->isChecked();
208 if(chkOrgCtrl->isChecked() != on){
209 line.append(" Control=\"");
210 if(on){
211 line.append("On\"");
212 } else {
213 line.append("Off\"");
214 }
215 need = true;
216 }
217 on = chkMapAlt->isChecked();
218 if(chkOrgAlt->isChecked() != on){
219 line.append(" Alt=\"");
220 if(on){
221 line.append("On\"");
222 } else {
223 line.append("Off\"");
224 }
225 need = true;
226 }
227 line.append("/>");
228 if(need){
229 mleDefine->append(line);
230 }
231
232 /* mapping unicode */
233 bool found = false;
234 for(const QWSServer::KeyMap* m = QWSServer::keyMap();
235 m->key_code != 0; m++){
236 if(m->key_code == m_MapkeyData.key){
237 if(m_MapkeyData.state & Qt::ControlButton){
238 if(m->ctrl_unicode == m_MapkeyData.ascii){
239 found = true;
240 break;
241 }
242 } else if(m_MapkeyData.state & Qt::ShiftButton){
243 if(m->shift_unicode == m_MapkeyData.ascii){
244 found = true;
245 break;
246 }
247 } else {
248 if(m->unicode == m_MapkeyData.ascii){
249 found = true;
250 break;
251 }
252 }
253 }
254 }
255 if(found == false){
256 if(m_MapkeyData.text[0].isPrint()){
257 line = "<map_unicode";
258 if(m_MapkeyData.state & Qt::ControlButton){
259 line.append(" ctrl_unicode=\"");
260 } else if(m_MapkeyData.state & Qt::ShiftButton){
261 line.append(" shift_unicode=\"");
262 } else {
263 line.append(" unicode=\"");
264 }
265 line.append(m_MapkeyData.text);
266 line.append("\"/>");
267 mleDefine->append(line);
268 } else {
269 mleDefine->clear();
270 mleDefine->append("Not Support");
271 return;
272 }
273 }
274
275 /* close tag */
276 line = "</define>";
277 mleDefine->append(line);
278}
279
280void KHCWidget::onClick_Copy()
281{
282 mleDefine->selectAll();
283 mleDefine->copy();
284 mleDefine->deselect();
285}
286
287void KHCWidget::onClick_Ctrl()
288{
289 if(m_isEnable){
290 QCopEnvelope e("QPE/KeyHelper", "disable()");
291 btnCtrl->setText(tr("Enable"));
292 //btnCtrl->update();
293 } else {
294 QCopEnvelope e("QPE/KeyHelper", "enable()");
295 btnCtrl->setText(tr("Disable"));
296 //btnCtrl->update();
297 }
298 m_isEnable = !m_isEnable;
299}
300
301void KHCWidget::closeEvent(QCloseEvent* ce)
302{
303 qDebug("closeEvent()");
304 QCopEnvelope e("QPE/KeyHelper", "enable()");
305 ce->accept();
306}
307
diff --git a/noncore/applets/keyhelper/keyhelperconf/KHCWidget.h b/noncore/applets/keyhelper/keyhelperconf/KHCWidget.h
new file mode 100644
index 0000000..08b29b3
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/KHCWidget.h
@@ -0,0 +1,68 @@
1#ifndef _KHC_WIDGET_H_
2#define _KHC_WIDGET_H_
3
4#include <stdlib.h>
5
6#include <qlabel.h>
7#include <qpushbutton.h>
8#include <qlineedit.h>
9#include <qmultilineedit.h>
10#include <qgroupbox.h>
11#include <qcheckbox.h>
12#include <qlayout.h>
13
14#include <qwindowsystem_qws.h>
15
16#include <qpe/qcopenvelope_qws.h>
17
18#include "KHCWidgetBase.h"
19#include "KeyNames.h"
20
21struct KeyData
22{
23 KeyData(){
24 key = 0;
25 state = 0;
26 ascii = 0;
27 }
28 void setData(QKeyEvent* ke) {
29 key = ke->key();
30 state = ke->state();
31 ascii = ke->ascii();
32 text = ke->text();
33 }
34 int key;
35 int state;
36 int ascii;
37 QString text;
38};
39
40class KHCWidget : public KHCWidgetBase
41{
42 Q_OBJECT
43public:
44 KHCWidget(QWidget* parent=0, const char* name=0, WFlags fl=0);
45 virtual ~KHCWidget();
46
47protected:
48 void closeEvent(QCloseEvent* ce);
49
50private:
51 void setLayout();
52 void setHandler();
53
54 void onPress_Org(QKeyEvent* ke);
55 void onPress_Map(QKeyEvent* ke);
56
57 bool eventFilter(QObject* o, QEvent* e);
58
59 bool m_isEnable;
60 KeyData m_OrgkeyData;
61 KeyData m_MapkeyData;
62private slots:
63 void onClick_Gen();
64 void onClick_Copy();
65 void onClick_Ctrl();
66};
67
68#endif /* _KHC_WIDGET_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.cpp b/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.cpp
new file mode 100644
index 0000000..16841f1
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.cpp
@@ -0,0 +1,162 @@
1/****************************************************************************
2** Form implementation generated from reading ui file 'KHCWidgetBase.ui'
3**
4** Created: Mon Feb 28 09:58:22 2005
5** by: The User Interface Compiler (uic)
6**
7** WARNING! All changes made in this file will be lost!
8****************************************************************************/
9#include "KHCWidgetBase.h"
10
11#include <qcheckbox.h>
12#include <qlabel.h>
13#include <qlineedit.h>
14#include <qmultilineedit.h>
15#include <qpushbutton.h>
16#include <qlayout.h>
17#include <qvariant.h>
18#include <qtooltip.h>
19#include <qwhatsthis.h>
20
21/*
22 * Constructs a KHCWidgetBase which is a child of 'parent', with the
23 * name 'name' and widget flags set to 'f'
24 */
25KHCWidgetBase::KHCWidgetBase( QWidget* parent, const char* name, WFlags fl )
26 : QWidget( parent, name, fl )
27{
28 if ( !name )
29 setName( "KHCWidgetBase" );
30 resize( 431, 388 );
31 setCaption( tr( "KeyHelperConf" ) );
32
33 btnCtrl = new QPushButton( this, "btnCtrl" );
34 btnCtrl->setGeometry( QRect( 280, 150, 121, 31 ) );
35 btnCtrl->setText( tr( "Disable" ) );
36
37 btnGen = new QPushButton( this, "btnGen" );
38 btnGen->setGeometry( QRect( 10, 150, 110, 31 ) );
39 btnGen->setText( tr( "Generate" ) );
40
41 btnCopy = new QPushButton( this, "btnCopy" );
42 btnCopy->setGeometry( QRect( 140, 150, 121, 31 ) );
43 btnCopy->setText( tr( "Copy" ) );
44
45 lblOrgK = new QLabel( this, "lblOrgK" );
46 lblOrgK->setGeometry( QRect( 20, 50, 50, 20 ) );
47 lblOrgK->setText( tr( "K" ) );
48
49 lblMapK = new QLabel( this, "lblMapK" );
50 lblMapK->setGeometry( QRect( 20, 120, 20, 20 ) );
51 lblMapK->setText( tr( "K" ) );
52
53 lblMapKeycode = new QLabel( this, "lblMapKeycode" );
54 lblMapKeycode->setGeometry( QRect( 40, 120, 80, 21 ) );
55 lblMapKeycode->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)1, lblMapKeycode->sizePolicy().hasHeightForWidth() ) );
56 lblMapKeycode->setFrameShape( QLabel::Panel );
57 lblMapKeycode->setFrameShadow( QLabel::Sunken );
58 lblMapKeycode->setText( tr( "keycode" ) );
59
60 txtMapKey = new QLineEdit( this, "txtMapKey" );
61 txtMapKey->setGeometry( QRect( 200, 80, 200, 22 ) );
62
63 txtOrgKey = new QLineEdit( this, "txtOrgKey" );
64 txtOrgKey->setGeometry( QRect( 190, 10, 200, 22 ) );
65
66 lblOriginal = new QLabel( this, "lblOriginal" );
67 lblOriginal->setGeometry( QRect( 10, 10, 120, 31 ) );
68 lblOriginal->setFrameShape( QLabel::Box );
69 lblOriginal->setFrameShadow( QLabel::Raised );
70 lblOriginal->setText( tr( "Original Key" ) );
71
72 lblMapping = new QLabel( this, "lblMapping" );
73 lblMapping->setGeometry( QRect( 10, 80, 120, 21 ) );
74 lblMapping->setFrameShape( QLabel::Box );
75 lblMapping->setFrameShadow( QLabel::Raised );
76 lblMapping->setText( tr( "Mapping Key" ) );
77
78 mleDefine = new QMultiLineEdit( this, "mleDefine" );
79 mleDefine->setGeometry( QRect( 10, 200, 391, 110 ) );
80 mleDefine->setReadOnly( TRUE );
81
82 lblOrgKeycode = new QLabel( this, "lblOrgKeycode" );
83 lblOrgKeycode->setGeometry( QRect( 50, 50, 70, 21 ) );
84 lblOrgKeycode->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)1, lblOrgKeycode->sizePolicy().hasHeightForWidth() ) );
85 lblOrgKeycode->setFrameShape( QLabel::Panel );
86 lblOrgKeycode->setFrameShadow( QLabel::Sunken );
87 lblOrgKeycode->setText( tr( "keycode" ) );
88
89 lblOrgU = new QLabel( this, "lblOrgU" );
90 lblOrgU->setGeometry( QRect( 130, 50, 20, 21 ) );
91 lblOrgU->setText( tr( "U" ) );
92
93 lblOrgUnicode = new QLabel( this, "lblOrgUnicode" );
94 lblOrgUnicode->setGeometry( QRect( 150, 50, 80, 21 ) );
95 lblOrgUnicode->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)1, lblOrgUnicode->sizePolicy().hasHeightForWidth() ) );
96 lblOrgUnicode->setFrameShape( QLabel::Panel );
97 lblOrgUnicode->setFrameShadow( QLabel::Sunken );
98 lblOrgUnicode->setText( tr( "unicode" ) );
99
100 lblMapU = new QLabel( this, "lblMapU" );
101 lblMapU->setGeometry( QRect( 130, 120, 20, 21 ) );
102 lblMapU->setText( tr( "U" ) );
103
104 lblMapUnicode = new QLabel( this, "lblMapUnicode" );
105 lblMapUnicode->setGeometry( QRect( 150, 120, 80, 21 ) );
106 lblMapUnicode->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)1, lblMapUnicode->sizePolicy().hasHeightForWidth() ) );
107 lblMapUnicode->setFrameShape( QLabel::Panel );
108 lblMapUnicode->setFrameShadow( QLabel::Sunken );
109 lblMapUnicode->setText( tr( "unicode" ) );
110
111 chkMapShift = new QCheckBox( this, "chkMapShift" );
112 chkMapShift->setGeometry( QRect( 260, 120, 33, 19 ) );
113 chkMapShift->setText( tr( "S" ) );
114 chkMapShift->setAutoResize( TRUE );
115
116 chkMapCtrl = new QCheckBox( this, "chkMapCtrl" );
117 chkMapCtrl->setGeometry( QRect( 310, 120, 34, 19 ) );
118 chkMapCtrl->setText( tr( "C" ) );
119 chkMapCtrl->setAutoResize( TRUE );
120
121 chkMapAlt = new QCheckBox( this, "chkMapAlt" );
122 chkMapAlt->setGeometry( QRect( 360, 120, 34, 19 ) );
123 chkMapAlt->setText( tr( "A" ) );
124 chkMapAlt->setAutoResize( TRUE );
125
126 chkOrgShift = new QCheckBox( this, "chkOrgShift" );
127 chkOrgShift->setGeometry( QRect( 250, 50, 33, 19 ) );
128 chkOrgShift->setText( tr( "S" ) );
129 chkOrgShift->setAutoResize( TRUE );
130
131 chkOrgCtrl = new QCheckBox( this, "chkOrgCtrl" );
132 chkOrgCtrl->setGeometry( QRect( 300, 50, 34, 19 ) );
133 chkOrgCtrl->setText( tr( "C" ) );
134 chkOrgCtrl->setAutoResize( TRUE );
135
136 chkOrgAlt = new QCheckBox( this, "chkOrgAlt" );
137 chkOrgAlt->setGeometry( QRect( 350, 50, 34, 19 ) );
138 chkOrgAlt->setText( tr( "A" ) );
139 chkOrgAlt->setAutoResize( TRUE );
140
141 // tab order
142 setTabOrder( txtOrgKey, chkOrgShift );
143 setTabOrder( chkOrgShift, chkOrgCtrl );
144 setTabOrder( chkOrgCtrl, chkOrgAlt );
145 setTabOrder( chkOrgAlt, txtMapKey );
146 setTabOrder( txtMapKey, chkMapShift );
147 setTabOrder( chkMapShift, chkMapCtrl );
148 setTabOrder( chkMapCtrl, chkMapAlt );
149 setTabOrder( chkMapAlt, btnGen );
150 setTabOrder( btnGen, btnCopy );
151 setTabOrder( btnCopy, btnCtrl );
152 setTabOrder( btnCtrl, mleDefine );
153}
154
155/*
156 * Destroys the object and frees any allocated resources
157 */
158KHCWidgetBase::~KHCWidgetBase()
159{
160 // no need to delete child widgets, Qt does it all for us
161}
162
diff --git a/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.h b/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.h
new file mode 100644
index 0000000..8193b61
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.h
@@ -0,0 +1,56 @@
1/****************************************************************************
2** Form interface generated from reading ui file 'KHCWidgetBase.ui'
3**
4** Created: Mon Feb 28 09:54:07 2005
5** by: The User Interface Compiler (uic)
6**
7** WARNING! All changes made in this file will be lost!
8****************************************************************************/
9#ifndef KHCWIDGETBASE_H
10#define KHCWIDGETBASE_H
11
12#include <qvariant.h>
13#include <qwidget.h>
14class QVBoxLayout;
15class QHBoxLayout;
16class QGridLayout;
17class QCheckBox;
18class QLabel;
19class QLineEdit;
20class QMultiLineEdit;
21class QPushButton;
22
23class KHCWidgetBase : public QWidget
24{
25 Q_OBJECT
26
27public:
28 KHCWidgetBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
29 ~KHCWidgetBase();
30
31 QPushButton* btnCtrl;
32 QPushButton* btnGen;
33 QPushButton* btnCopy;
34 QLabel* lblOrgK;
35 QLabel* lblMapK;
36 QLabel* lblMapKeycode;
37 QLineEdit* txtMapKey;
38 QLineEdit* txtOrgKey;
39 QLabel* lblOriginal;
40 QLabel* lblMapping;
41 QMultiLineEdit* mleDefine;
42 QLabel* lblOrgKeycode;
43 QLabel* lblOrgU;
44 QLabel* lblOrgUnicode;
45 QLabel* lblMapU;
46 QLabel* lblMapUnicode;
47 QCheckBox* chkMapShift;
48 QCheckBox* chkMapCtrl;
49 QCheckBox* chkMapAlt;
50 QCheckBox* chkOrgShift;
51 QCheckBox* chkOrgCtrl;
52 QCheckBox* chkOrgAlt;
53
54};
55
56#endif // KHCWIDGETBASE_H
diff --git a/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.ui b/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.ui
new file mode 100644
index 0000000..2be0772
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/KHCWidgetBase.ui
@@ -0,0 +1,569 @@
1<!DOCTYPE UI><UI>
2<class>KHCWidgetBase</class>
3<widget>
4 <class>QWidget</class>
5 <property stdset="1">
6 <name>name</name>
7 <cstring>KHCWidgetBase</cstring>
8 </property>
9 <property stdset="1">
10 <name>geometry</name>
11 <rect>
12 <x>0</x>
13 <y>0</y>
14 <width>431</width>
15 <height>388</height>
16 </rect>
17 </property>
18 <property stdset="1">
19 <name>caption</name>
20 <string>KeyHelperConf</string>
21 </property>
22 <widget>
23 <class>QPushButton</class>
24 <property stdset="1">
25 <name>name</name>
26 <cstring>btnCtrl</cstring>
27 </property>
28 <property stdset="1">
29 <name>geometry</name>
30 <rect>
31 <x>280</x>
32 <y>150</y>
33 <width>121</width>
34 <height>31</height>
35 </rect>
36 </property>
37 <property stdset="1">
38 <name>text</name>
39 <string>Disable</string>
40 </property>
41 </widget>
42 <widget>
43 <class>QPushButton</class>
44 <property stdset="1">
45 <name>name</name>
46 <cstring>btnGen</cstring>
47 </property>
48 <property stdset="1">
49 <name>geometry</name>
50 <rect>
51 <x>10</x>
52 <y>150</y>
53 <width>110</width>
54 <height>31</height>
55 </rect>
56 </property>
57 <property stdset="1">
58 <name>text</name>
59 <string>Generate</string>
60 </property>
61 </widget>
62 <widget>
63 <class>QPushButton</class>
64 <property stdset="1">
65 <name>name</name>
66 <cstring>btnCopy</cstring>
67 </property>
68 <property stdset="1">
69 <name>geometry</name>
70 <rect>
71 <x>140</x>
72 <y>150</y>
73 <width>121</width>
74 <height>31</height>
75 </rect>
76 </property>
77 <property stdset="1">
78 <name>text</name>
79 <string>Copy</string>
80 </property>
81 </widget>
82 <widget>
83 <class>QLabel</class>
84 <property stdset="1">
85 <name>name</name>
86 <cstring>lblOrgK</cstring>
87 </property>
88 <property stdset="1">
89 <name>geometry</name>
90 <rect>
91 <x>20</x>
92 <y>50</y>
93 <width>50</width>
94 <height>20</height>
95 </rect>
96 </property>
97 <property stdset="1">
98 <name>text</name>
99 <string>K</string>
100 </property>
101 </widget>
102 <widget>
103 <class>QLabel</class>
104 <property stdset="1">
105 <name>name</name>
106 <cstring>lblMapK</cstring>
107 </property>
108 <property stdset="1">
109 <name>geometry</name>
110 <rect>
111 <x>20</x>
112 <y>120</y>
113 <width>20</width>
114 <height>20</height>
115 </rect>
116 </property>
117 <property stdset="1">
118 <name>text</name>
119 <string>K</string>
120 </property>
121 </widget>
122 <widget>
123 <class>QLabel</class>
124 <property stdset="1">
125 <name>name</name>
126 <cstring>lblMapKeycode</cstring>
127 </property>
128 <property stdset="1">
129 <name>geometry</name>
130 <rect>
131 <x>40</x>
132 <y>120</y>
133 <width>80</width>
134 <height>21</height>
135 </rect>
136 </property>
137 <property stdset="1">
138 <name>sizePolicy</name>
139 <sizepolicy>
140 <hsizetype>7</hsizetype>
141 <vsizetype>1</vsizetype>
142 </sizepolicy>
143 </property>
144 <property stdset="1">
145 <name>frameShape</name>
146 <enum>Panel</enum>
147 </property>
148 <property stdset="1">
149 <name>frameShadow</name>
150 <enum>Sunken</enum>
151 </property>
152 <property stdset="1">
153 <name>text</name>
154 <string>keycode</string>
155 </property>
156 </widget>
157 <widget>
158 <class>QLineEdit</class>
159 <property stdset="1">
160 <name>name</name>
161 <cstring>txtMapKey</cstring>
162 </property>
163 <property stdset="1">
164 <name>geometry</name>
165 <rect>
166 <x>200</x>
167 <y>80</y>
168 <width>200</width>
169 <height>22</height>
170 </rect>
171 </property>
172 </widget>
173 <widget>
174 <class>QLineEdit</class>
175 <property stdset="1">
176 <name>name</name>
177 <cstring>txtOrgKey</cstring>
178 </property>
179 <property stdset="1">
180 <name>geometry</name>
181 <rect>
182 <x>190</x>
183 <y>10</y>
184 <width>200</width>
185 <height>22</height>
186 </rect>
187 </property>
188 </widget>
189 <widget>
190 <class>QLabel</class>
191 <property stdset="1">
192 <name>name</name>
193 <cstring>lblOriginal</cstring>
194 </property>
195 <property stdset="1">
196 <name>geometry</name>
197 <rect>
198 <x>10</x>
199 <y>10</y>
200 <width>120</width>
201 <height>31</height>
202 </rect>
203 </property>
204 <property stdset="1">
205 <name>frameShape</name>
206 <enum>Box</enum>
207 </property>
208 <property stdset="1">
209 <name>frameShadow</name>
210 <enum>Raised</enum>
211 </property>
212 <property stdset="1">
213 <name>text</name>
214 <string>Original Key</string>
215 </property>
216 </widget>
217 <widget>
218 <class>QLabel</class>
219 <property stdset="1">
220 <name>name</name>
221 <cstring>lblMapping</cstring>
222 </property>
223 <property stdset="1">
224 <name>geometry</name>
225 <rect>
226 <x>10</x>
227 <y>80</y>
228 <width>120</width>
229 <height>21</height>
230 </rect>
231 </property>
232 <property stdset="1">
233 <name>frameShape</name>
234 <enum>Box</enum>
235 </property>
236 <property stdset="1">
237 <name>frameShadow</name>
238 <enum>Raised</enum>
239 </property>
240 <property stdset="1">
241 <name>text</name>
242 <string>Mapping Key</string>
243 </property>
244 </widget>
245 <widget>
246 <class>QMultiLineEdit</class>
247 <property stdset="1">
248 <name>name</name>
249 <cstring>mleDefine</cstring>
250 </property>
251 <property stdset="1">
252 <name>geometry</name>
253 <rect>
254 <x>10</x>
255 <y>200</y>
256 <width>391</width>
257 <height>110</height>
258 </rect>
259 </property>
260 <property stdset="1">
261 <name>readOnly</name>
262 <bool>true</bool>
263 </property>
264 </widget>
265 <widget>
266 <class>QLabel</class>
267 <property stdset="1">
268 <name>name</name>
269 <cstring>lblOrgKeycode</cstring>
270 </property>
271 <property stdset="1">
272 <name>geometry</name>
273 <rect>
274 <x>50</x>
275 <y>50</y>
276 <width>70</width>
277 <height>21</height>
278 </rect>
279 </property>
280 <property stdset="1">
281 <name>sizePolicy</name>
282 <sizepolicy>
283 <hsizetype>7</hsizetype>
284 <vsizetype>1</vsizetype>
285 </sizepolicy>
286 </property>
287 <property stdset="1">
288 <name>frameShape</name>
289 <enum>Panel</enum>
290 </property>
291 <property stdset="1">
292 <name>frameShadow</name>
293 <enum>Sunken</enum>
294 </property>
295 <property stdset="1">
296 <name>text</name>
297 <string>keycode</string>
298 </property>
299 </widget>
300 <widget>
301 <class>QLabel</class>
302 <property stdset="1">
303 <name>name</name>
304 <cstring>lblOrgU</cstring>
305 </property>
306 <property stdset="1">
307 <name>geometry</name>
308 <rect>
309 <x>130</x>
310 <y>50</y>
311 <width>20</width>
312 <height>21</height>
313 </rect>
314 </property>
315 <property stdset="1">
316 <name>text</name>
317 <string>U</string>
318 </property>
319 </widget>
320 <widget>
321 <class>QLabel</class>
322 <property stdset="1">
323 <name>name</name>
324 <cstring>lblOrgUnicode</cstring>
325 </property>
326 <property stdset="1">
327 <name>geometry</name>
328 <rect>
329 <x>150</x>
330 <y>50</y>
331 <width>80</width>
332 <height>21</height>
333 </rect>
334 </property>
335 <property stdset="1">
336 <name>sizePolicy</name>
337 <sizepolicy>
338 <hsizetype>7</hsizetype>
339 <vsizetype>1</vsizetype>
340 </sizepolicy>
341 </property>
342 <property stdset="1">
343 <name>frameShape</name>
344 <enum>Panel</enum>
345 </property>
346 <property stdset="1">
347 <name>frameShadow</name>
348 <enum>Sunken</enum>
349 </property>
350 <property stdset="1">
351 <name>text</name>
352 <string>unicode</string>
353 </property>
354 </widget>
355 <widget>
356 <class>QLabel</class>
357 <property stdset="1">
358 <name>name</name>
359 <cstring>lblMapU</cstring>
360 </property>
361 <property stdset="1">
362 <name>geometry</name>
363 <rect>
364 <x>130</x>
365 <y>120</y>
366 <width>20</width>
367 <height>21</height>
368 </rect>
369 </property>
370 <property stdset="1">
371 <name>text</name>
372 <string>U</string>
373 </property>
374 </widget>
375 <widget>
376 <class>QLabel</class>
377 <property stdset="1">
378 <name>name</name>
379 <cstring>lblMapUnicode</cstring>
380 </property>
381 <property stdset="1">
382 <name>geometry</name>
383 <rect>
384 <x>150</x>
385 <y>120</y>
386 <width>80</width>
387 <height>21</height>
388 </rect>
389 </property>
390 <property stdset="1">
391 <name>sizePolicy</name>
392 <sizepolicy>
393 <hsizetype>7</hsizetype>
394 <vsizetype>1</vsizetype>
395 </sizepolicy>
396 </property>
397 <property stdset="1">
398 <name>frameShape</name>
399 <enum>Panel</enum>
400 </property>
401 <property stdset="1">
402 <name>frameShadow</name>
403 <enum>Sunken</enum>
404 </property>
405 <property stdset="1">
406 <name>text</name>
407 <string>unicode</string>
408 </property>
409 </widget>
410 <widget>
411 <class>QCheckBox</class>
412 <property stdset="1">
413 <name>name</name>
414 <cstring>chkMapShift</cstring>
415 </property>
416 <property stdset="1">
417 <name>geometry</name>
418 <rect>
419 <x>260</x>
420 <y>120</y>
421 <width>33</width>
422 <height>19</height>
423 </rect>
424 </property>
425 <property stdset="1">
426 <name>text</name>
427 <string>S</string>
428 </property>
429 <property stdset="1">
430 <name>autoResize</name>
431 <bool>true</bool>
432 </property>
433 </widget>
434 <widget>
435 <class>QCheckBox</class>
436 <property stdset="1">
437 <name>name</name>
438 <cstring>chkMapCtrl</cstring>
439 </property>
440 <property stdset="1">
441 <name>geometry</name>
442 <rect>
443 <x>310</x>
444 <y>120</y>
445 <width>34</width>
446 <height>19</height>
447 </rect>
448 </property>
449 <property stdset="1">
450 <name>text</name>
451 <string>C</string>
452 </property>
453 <property stdset="1">
454 <name>autoResize</name>
455 <bool>true</bool>
456 </property>
457 </widget>
458 <widget>
459 <class>QCheckBox</class>
460 <property stdset="1">
461 <name>name</name>
462 <cstring>chkMapAlt</cstring>
463 </property>
464 <property stdset="1">
465 <name>geometry</name>
466 <rect>
467 <x>360</x>
468 <y>120</y>
469 <width>34</width>
470 <height>19</height>
471 </rect>
472 </property>
473 <property stdset="1">
474 <name>text</name>
475 <string>A</string>
476 </property>
477 <property stdset="1">
478 <name>autoResize</name>
479 <bool>true</bool>
480 </property>
481 </widget>
482 <widget>
483 <class>QCheckBox</class>
484 <property stdset="1">
485 <name>name</name>
486 <cstring>chkOrgShift</cstring>
487 </property>
488 <property stdset="1">
489 <name>geometry</name>
490 <rect>
491 <x>250</x>
492 <y>50</y>
493 <width>33</width>
494 <height>19</height>
495 </rect>
496 </property>
497 <property stdset="1">
498 <name>text</name>
499 <string>S</string>
500 </property>
501 <property stdset="1">
502 <name>autoResize</name>
503 <bool>true</bool>
504 </property>
505 </widget>
506 <widget>
507 <class>QCheckBox</class>
508 <property stdset="1">
509 <name>name</name>
510 <cstring>chkOrgCtrl</cstring>
511 </property>
512 <property stdset="1">
513 <name>geometry</name>
514 <rect>
515 <x>300</x>
516 <y>50</y>
517 <width>34</width>
518 <height>19</height>
519 </rect>
520 </property>
521 <property stdset="1">
522 <name>text</name>
523 <string>C</string>
524 </property>
525 <property stdset="1">
526 <name>autoResize</name>
527 <bool>true</bool>
528 </property>
529 </widget>
530 <widget>
531 <class>QCheckBox</class>
532 <property stdset="1">
533 <name>name</name>
534 <cstring>chkOrgAlt</cstring>
535 </property>
536 <property stdset="1">
537 <name>geometry</name>
538 <rect>
539 <x>350</x>
540 <y>50</y>
541 <width>34</width>
542 <height>19</height>
543 </rect>
544 </property>
545 <property stdset="1">
546 <name>text</name>
547 <string>A</string>
548 </property>
549 <property stdset="1">
550 <name>autoResize</name>
551 <bool>true</bool>
552 </property>
553 </widget>
554</widget>
555<tabstops>
556 <tabstop>txtOrgKey</tabstop>
557 <tabstop>chkOrgShift</tabstop>
558 <tabstop>chkOrgCtrl</tabstop>
559 <tabstop>chkOrgAlt</tabstop>
560 <tabstop>txtMapKey</tabstop>
561 <tabstop>chkMapShift</tabstop>
562 <tabstop>chkMapCtrl</tabstop>
563 <tabstop>chkMapAlt</tabstop>
564 <tabstop>btnGen</tabstop>
565 <tabstop>btnCopy</tabstop>
566 <tabstop>btnCtrl</tabstop>
567 <tabstop>mleDefine</tabstop>
568</tabstops>
569</UI>
diff --git a/noncore/applets/keyhelper/keyhelperconf/KeyNames.cpp b/noncore/applets/keyhelper/keyhelperconf/KeyNames.cpp
new file mode 100644
index 0000000..e3d90b4
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/KeyNames.cpp
@@ -0,0 +1,274 @@
1#include "KeyNames.h"
2
3QMap<QString, int> KeyNames::codemap;
4QMap<int, QString> KeyNames::namemap;
5
6static struct {
7 int code;
8 char* name;
9} stKeyNames[] = {
10{Qt::Key_Escape, "Escape"},
11{Qt::Key_Tab, "Tab"},
12{Qt::Key_Backtab, "Backtab"},
13{Qt::Key_BackTab, "BackTab"},
14{Qt::Key_Backtab, "Backtab"},
15{Qt::Key_Backspace, "Backspace"},
16{Qt::Key_BackSpace, "BackSpace"},
17{Qt::Key_Backspace, "Backspace"},
18{Qt::Key_Return, "Return"},
19{Qt::Key_Enter, "Enter"},
20{Qt::Key_Insert, "Insert"},
21{Qt::Key_Delete, "Delete"},
22{Qt::Key_Pause, "Pause"},
23{Qt::Key_Print, "Print"},
24{Qt::Key_SysReq, "SysReq"},
25{Qt::Key_Home, "Home"},
26{Qt::Key_End, "End"},
27{Qt::Key_Left, "Left"},
28{Qt::Key_Up, "Up"},
29{Qt::Key_Right, "Right"},
30{Qt::Key_Down, "Down"},
31{Qt::Key_Prior, "Prior"},
32{Qt::Key_PageUp, "PageUp"},
33{Qt::Key_Prior, "Prior"},
34{Qt::Key_Next, "Next"},
35{Qt::Key_PageDown, "PageDown"},
36{Qt::Key_Next, "Next"},
37{Qt::Key_Shift, "Shift"},
38{Qt::Key_Control, "Control"},
39{Qt::Key_Meta, "Meta"},
40{Qt::Key_Alt, "Alt"},
41{Qt::Key_CapsLock, "CapsLock"},
42{Qt::Key_NumLock, "NumLock"},
43{Qt::Key_ScrollLock, "ScrollLock"},
44{Qt::Key_F1, "F1"},
45{Qt::Key_F2, "F2"},
46{Qt::Key_F3, "F3"},
47{Qt::Key_F4, "F4"},
48{Qt::Key_F5, "F5"},
49{Qt::Key_F6, "F6"},
50{Qt::Key_F7, "F7"},
51{Qt::Key_F8, "F8"},
52{Qt::Key_F9, "F9"},
53{Qt::Key_F10, "F10"},
54{Qt::Key_F11, "F11"},
55{Qt::Key_F12, "F12"},
56{Qt::Key_F13, "F13"},
57{Qt::Key_F14, "F14"},
58{Qt::Key_F15, "F15"},
59{Qt::Key_F16, "F16"},
60{Qt::Key_F17, "F17"},
61{Qt::Key_F18, "F18"},
62{Qt::Key_F19, "F19"},
63{Qt::Key_F20, "F20"},
64{Qt::Key_F21, "F21"},
65{Qt::Key_F22, "F22"},
66{Qt::Key_F23, "F23"},
67{Qt::Key_F24, "F24"},
68{Qt::Key_F25, "F25"},
69{Qt::Key_F26, "F26"},
70{Qt::Key_F27, "F27"},
71{Qt::Key_F28, "F28"},
72{Qt::Key_F29, "F29"},
73{Qt::Key_F30, "F30"},
74{Qt::Key_F31, "F31"},
75{Qt::Key_F32, "F32"},
76{Qt::Key_F33, "F33"},
77{Qt::Key_F34, "F34"},
78{Qt::Key_F35, "F35"},
79{Qt::Key_Super_L, "Super_L"},
80{Qt::Key_Super_R, "Super_R"},
81{Qt::Key_Menu, "Menu"},
82{Qt::Key_Hyper_L, "Hyper_L"},
83{Qt::Key_Hyper_R, "Hyper_R"},
84{Qt::Key_Help, "Help"},
85{Qt::Key_Space, "Space"},
86{Qt::Key_Any, "Any"},
87{Qt::Key_Space, "Space"},
88{Qt::Key_Exclam, "Exclam"},
89{Qt::Key_QuoteDbl, "QuoteDbl"},
90{Qt::Key_NumberSign, "NumberSign"},
91{Qt::Key_Dollar, "Dollar"},
92{Qt::Key_Percent, "Percent"},
93{Qt::Key_Ampersand, "Ampersand"},
94{Qt::Key_Apostrophe, "Apostrophe"},
95{Qt::Key_ParenLeft, "ParenLeft"},
96{Qt::Key_ParenRight, "ParenRight"},
97{Qt::Key_Asterisk, "Asterisk"},
98{Qt::Key_Plus, "Plus"},
99{Qt::Key_Comma, "Comma"},
100{Qt::Key_Minus, "Minus"},
101{Qt::Key_Period, "Period"},
102{Qt::Key_Slash, "Slash"},
103{Qt::Key_0, "0"},
104{Qt::Key_1, "1"},
105{Qt::Key_2, "2"},
106{Qt::Key_3, "3"},
107{Qt::Key_4, "4"},
108{Qt::Key_5, "5"},
109{Qt::Key_6, "6"},
110{Qt::Key_7, "7"},
111{Qt::Key_8, "8"},
112{Qt::Key_9, "9"},
113{Qt::Key_Colon, "Colon"},
114{Qt::Key_Semicolon, "Semicolon"},
115{Qt::Key_Less, "Less"},
116{Qt::Key_Equal, "Equal"},
117{Qt::Key_Greater, "Greater"},
118{Qt::Key_Question, "Question"},
119{Qt::Key_At, "At"},
120{Qt::Key_A, "A"},
121{Qt::Key_B, "B"},
122{Qt::Key_C, "C"},
123{Qt::Key_D, "D"},
124{Qt::Key_E, "E"},
125{Qt::Key_F, "F"},
126{Qt::Key_G, "G"},
127{Qt::Key_H, "H"},
128{Qt::Key_I, "I"},
129{Qt::Key_J, "J"},
130{Qt::Key_K, "K"},
131{Qt::Key_L, "L"},
132{Qt::Key_M, "M"},
133{Qt::Key_N, "N"},
134{Qt::Key_O, "O"},
135{Qt::Key_P, "P"},
136{Qt::Key_Q, "Q"},
137{Qt::Key_R, "R"},
138{Qt::Key_S, "S"},
139{Qt::Key_T, "T"},
140{Qt::Key_U, "U"},
141{Qt::Key_V, "V"},
142{Qt::Key_W, "W"},
143{Qt::Key_X, "X"},
144{Qt::Key_Y, "Y"},
145{Qt::Key_Z, "Z"},
146{Qt::Key_BracketLeft, "BracketLeft"},
147{Qt::Key_Backslash, "Backslash"},
148{Qt::Key_BracketRight, "BracketRight"},
149{Qt::Key_AsciiCircum, "AsciiCircum"},
150{Qt::Key_Underscore, "Underscore"},
151{Qt::Key_QuoteLeft, "QuoteLeft"},
152{Qt::Key_BraceLeft, "BraceLeft"},
153{Qt::Key_Bar, "Bar"},
154{Qt::Key_BraceRight, "BraceRight"},
155{Qt::Key_AsciiTilde, "AsciiTilde"},
156{Qt::Key_nobreakspace, "nobreakspace"},
157{Qt::Key_exclamdown, "exclamdown"},
158{Qt::Key_cent, "cent"},
159{Qt::Key_sterling, "sterling"},
160{Qt::Key_currency, "currency"},
161{Qt::Key_yen, "yen"},
162{Qt::Key_brokenbar, "brokenbar"},
163{Qt::Key_section, "section"},
164{Qt::Key_diaeresis, "diaeresis"},
165{Qt::Key_copyright, "copyright"},
166{Qt::Key_ordfeminine, "ordfeminine"},
167{Qt::Key_guillemotleft, "guillemotleft"},
168{Qt::Key_notsign, "notsign"},
169{Qt::Key_hyphen, "hyphen"},
170{Qt::Key_registered, "registered"},
171{Qt::Key_macron, "macron"},
172{Qt::Key_degree, "degree"},
173{Qt::Key_plusminus, "plusminus"},
174{Qt::Key_twosuperior, "twosuperior"},
175{Qt::Key_threesuperior, "threesuperior"},
176{Qt::Key_acute, "acute"},
177{Qt::Key_mu, "mu"},
178{Qt::Key_paragraph, "paragraph"},
179{Qt::Key_periodcentered, "periodcentered"},
180{Qt::Key_cedilla, "cedilla"},
181{Qt::Key_onesuperior, "onesuperior"},
182{Qt::Key_masculine, "masculine"},
183{Qt::Key_guillemotright, "guillemotright"},
184{Qt::Key_onequarter, "onequarter"},
185{Qt::Key_onehalf, "onehalf"},
186{Qt::Key_threequarters, "threequarters"},
187{Qt::Key_questiondown, "questiondown"},
188{Qt::Key_Agrave, "Agrave"},
189{Qt::Key_Aacute, "Aacute"},
190{Qt::Key_Acircumflex, "Acircumflex"},
191{Qt::Key_Atilde, "Atilde"},
192{Qt::Key_Adiaeresis, "Adiaeresis"},
193{Qt::Key_Aring, "Aring"},
194{Qt::Key_AE, "AE"},
195{Qt::Key_Ccedilla, "Ccedilla"},
196{Qt::Key_Egrave, "Egrave"},
197{Qt::Key_Eacute, "Eacute"},
198{Qt::Key_Ecircumflex, "Ecircumflex"},
199{Qt::Key_Ediaeresis, "Ediaeresis"},
200{Qt::Key_Igrave, "Igrave"},
201{Qt::Key_Iacute, "Iacute"},
202{Qt::Key_Icircumflex, "Icircumflex"},
203{Qt::Key_Idiaeresis, "Idiaeresis"},
204{Qt::Key_ETH, "ETH"},
205{Qt::Key_Ntilde, "Ntilde"},
206{Qt::Key_Ograve, "Ograve"},
207{Qt::Key_Oacute, "Oacute"},
208{Qt::Key_Ocircumflex, "Ocircumflex"},
209{Qt::Key_Otilde, "Otilde"},
210{Qt::Key_Odiaeresis, "Odiaeresis"},
211{Qt::Key_multiply, "multiply"},
212{Qt::Key_Ooblique, "Ooblique"},
213{Qt::Key_Ugrave, "Ugrave"},
214{Qt::Key_Uacute, "Uacute"},
215{Qt::Key_Ucircumflex, "Ucircumflex"},
216{Qt::Key_Udiaeresis, "Udiaeresis"},
217{Qt::Key_Yacute, "Yacute"},
218{Qt::Key_THORN, "THORN"},
219{Qt::Key_ssharp, "ssharp"},
220{Qt::Key_agrave, "agrave"},
221{Qt::Key_aacute, "aacute"},
222{Qt::Key_acircumflex, "acircumflex"},
223{Qt::Key_atilde, "atilde"},
224{Qt::Key_adiaeresis, "adiaeresis"},
225{Qt::Key_aring, "aring"},
226{Qt::Key_ae, "ae"},
227{Qt::Key_ccedilla, "ccedilla"},
228{Qt::Key_egrave, "egrave"},
229{Qt::Key_eacute, "eacute"},
230{Qt::Key_ecircumflex, "ecircumflex"},
231{Qt::Key_ediaeresis, "ediaeresis"},
232{Qt::Key_igrave, "igrave"},
233{Qt::Key_iacute, "iacute"},
234{Qt::Key_icircumflex, "icircumflex"},
235{Qt::Key_idiaeresis, "idiaeresis"},
236{Qt::Key_eth, "eth"},
237{Qt::Key_ntilde, "ntilde"},
238{Qt::Key_ograve, "ograve"},
239{Qt::Key_oacute, "oacute"},
240{Qt::Key_ocircumflex, "ocircumflex"},
241{Qt::Key_otilde, "otilde"},
242{Qt::Key_odiaeresis, "odiaeresis"},
243{Qt::Key_division, "division"},
244{Qt::Key_oslash, "oslash"},
245{Qt::Key_ugrave, "ugrave"},
246{Qt::Key_uacute, "uacute"},
247{Qt::Key_ucircumflex, "ucircumflex"},
248{Qt::Key_udiaeresis, "udiaeresis"},
249{Qt::Key_yacute, "yacute"},
250{Qt::Key_thorn, "thorn"},
251{Qt::Key_ydiaeresis, "ydiaeresis"},
252{Qt::Key_unknown, "unknown"},
253{0,0},
254};
255
256void KeyNames::setCodeMap()
257{
258 int i;
259
260 codemap.clear();
261 for(i=0; stKeyNames[i].code != 0; i++){
262 codemap.insert(stKeyNames[i].name, stKeyNames[i].code);
263 }
264}
265
266void KeyNames::setNameMap()
267{
268 int i;
269
270 namemap.clear();
271 for(i=0; stKeyNames[i].code != 0; i++){
272 namemap.insert(stKeyNames[i].code, stKeyNames[i].name);
273 }
274}
diff --git a/noncore/applets/keyhelper/keyhelperconf/KeyNames.h b/noncore/applets/keyhelper/keyhelperconf/KeyNames.h
new file mode 100644
index 0000000..edd7dc5
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/KeyNames.h
@@ -0,0 +1,49 @@
1#ifndef _KEY_NAMES_H_
2#define _KEY_NAMES_H_
3
4#include <qstring.h>
5#include <qmap.h>
6#include <qnamespace.h>
7
8class KeyNames
9{
10public:
11 static const QString& getName(int code){
12 if(namemap.isEmpty()) setNameMap();
13 if(namemap.contains(code)){
14 return(namemap[code]);
15 } else {
16 return(QString::null);
17 }
18 }
19 static void clearName(){
20 namemap.clear();
21 }
22 static int getCode(const QString& s){
23 if(codemap.isEmpty()) setCodeMap();
24 if(codemap.contains(s)){
25 return(codemap[s]);
26 } else {
27 return(0);
28 }
29 }
30 static void setCode(const QString& s, int code){
31 if(codemap.contains(s) == false){
32 codemap.insert(s, code);
33 }
34 }
35 static void clearCode(){
36 codemap.clear();
37 }
38 static void reset(){
39 clearCode();
40 }
41private:
42 static QMap<QString, int> codemap;
43 static QMap<int, QString> namemap;
44
45 static void setCodeMap();
46 static void setNameMap();
47};
48
49#endif /* _KEY_NAMES_H_ */
diff --git a/noncore/applets/keyhelper/keyhelperconf/keyhelperconf.pro b/noncore/applets/keyhelper/keyhelperconf/keyhelperconf.pro
new file mode 100644
index 0000000..f84db3d
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/keyhelperconf.pro
@@ -0,0 +1,13 @@
1 CONFIG = qt warn_on quick-app
2 HEADERS = KHCWidget.h \
3 KeyNames.h
4 SOURCES = KHCWidget.cpp \
5 KeyNames.cpp \
6 khcmain.cpp
7 INTERFACES= KHCWidgetBase.ui
8 DESTDIR =$(OPIEDIR)/bin
9INCLUDEPATH += . $(OPIEDIR)/include
10DEPENDPATH += $(OPIEDIR)/include
11 LIBS +=-lqpe
12
13include( $(OPIEDIR)/include.pro )
diff --git a/noncore/applets/keyhelper/keyhelperconf/khcmain.cpp b/noncore/applets/keyhelper/keyhelperconf/khcmain.cpp
new file mode 100644
index 0000000..757bde0
--- a/dev/null
+++ b/noncore/applets/keyhelper/keyhelperconf/khcmain.cpp
@@ -0,0 +1,11 @@
1#include <qpe/qpeapplication.h>
2#include "KHCWidget.h"
3
4int main(int argc, char* argv[])
5{
6 QPEApplication a(argc, argv);
7
8 KHCWidget w;
9 a.showMainWidget(&w);
10 return a.exec();
11}
diff --git a/packages b/packages
index e897849..f47fca6 100644
--- a/packages
+++ b/packages
@@ -71,6 +71,7 @@ CONFIG_JUMPX inputmethods/jumpx jumpx.pro
71 CONFIG_KBILL noncore/games/kbillkbill.pro 71 CONFIG_KBILL noncore/games/kbillkbill.pro
72 CONFIG_KCHECKERS noncore/games/kcheckerskcheckers.pro 72 CONFIG_KCHECKERS noncore/games/kcheckerskcheckers.pro
73 CONFIG_KEYBOARD inputmethods/keyboardkeyboard.pro 73 CONFIG_KEYBOARD inputmethods/keyboardkeyboard.pro
74CONFIG_KEYHELPER noncore/applets/keyhelper keyhelper.pro
74 CONFIG_KEYPEBBLE noncore/comm/keypebblekeypebble.pro 75 CONFIG_KEYPEBBLE noncore/comm/keypebblekeypebble.pro
75 CONFIG_KEYVIEW development/keyviewkeyview.pro 76 CONFIG_KEYVIEW development/keyviewkeyview.pro
76 CONFIG_KJUMPX inputmethods/kjumpxkjumpx.pro 77 CONFIG_KJUMPX inputmethods/kjumpxkjumpx.pro