summaryrefslogtreecommitdiff
path: root/noncore/applets/zkbapplet/zkbwidget.cpp
Unidiff
Diffstat (limited to 'noncore/applets/zkbapplet/zkbwidget.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/applets/zkbapplet/zkbwidget.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/noncore/applets/zkbapplet/zkbwidget.cpp b/noncore/applets/zkbapplet/zkbwidget.cpp
new file mode 100644
index 0000000..05a76e7
--- a/dev/null
+++ b/noncore/applets/zkbapplet/zkbwidget.cpp
@@ -0,0 +1,150 @@
1#include <qpe/qcopenvelope_qws.h>
2#include <qpe/applnk.h>
3#include <qpe/qpeapplication.h>
4#include <qpe/resource.h>
5#include <stdio.h>
6#include <unistd.h>
7#include "zkbwidget.h"
8#include "zkbcfg.h"
9
10ZkbWidget::ZkbWidget(QWidget* parent):QLabel(parent),keymap(0),
11 disabled(Resource::loadPixmap("zkb-disabled")) {
12
13 labels = new QPopupMenu();
14 connect(labels, SIGNAL(activated(int)), this,
15 SLOT(labelChanged(int)));
16
17 loadKeymap();
18
19 channel = new QCopChannel("QPE/zkb", this);
20 connect(channel, SIGNAL(received(const QCString&, const QByteArray&)),
21 this, SLOT(signalReceived(const QCString&, const QByteArray&)));
22 setFixedWidth ( AppLnk::smallIconSize() );
23 setFixedHeight ( AppLnk::smallIconSize() );
24}
25
26ZkbWidget::~ZkbWidget() {
27}
28
29bool ZkbWidget::loadKeymap() {
30 ZkbConfig c(QPEApplication::qpeDir()+"/share/zkb");
31 QFontMetrics fm(font());
32
33 if (keymap != 0) {
34 delete keymap;
35 keymap = 0;
36 }
37
38 Keymap* km = new Keymap();
39
40 if (!c.load("zkb.xml", *km, "")) {
41 delete km;
42 setPixmap(disabled);
43 return false;
44 }
45
46 connect(km, SIGNAL(stateChanged(const QString&)),
47 this, SLOT(stateChanged(const QString&)));
48
49 qwsServer->setKeyboardFilter(km);
50
51 Keymap* oldkm = keymap;
52 keymap = km;
53
54 if (oldkm != 0) {
55 delete oldkm;
56 }
57
58 setText(keymap->getCurrentLabel());
59
60 labels->clear();
61 QStringList l = keymap->listLabels();
62 labels->insertItem(disabled, 0, 0);
63 int n = 1;
64 w = 0;
65 for(QStringList::Iterator it = l.begin(); it != l.end();
66 ++it, n++) {
67
68 // printf("label: %s\n", (const char*) (*it).utf8());
69
70 labels->insertItem(*it, n, n);
71 int lw = fm.width(*it);
72 if (lw > w) {
73 w = lw;
74 }
75 }
76
77 if (w == 0) {
78 hide();
79 } else {
80 show();
81 }
82 return true;
83}
84
85QSize ZkbWidget::sizeHint() const {
86 return QSize(AppLnk::smallIconSize(),AppLnk::smallIconSize());
87}
88
89void ZkbWidget::stateChanged(const QString& s) {
90 //qDebug("stateChanged: %s\n", (const char*) s.utf8());
91 setText(s);
92}
93
94void ZkbWidget::labelChanged(int id) {
95 if (id == 0) {
96 keymap->disable();
97 setPixmap(disabled);
98 return;
99 }
100
101 keymap->enable();
102
103 QStringList l = keymap->listLabels();
104 QString lbl = l[id-1];
105
106 //printf("labelChanged: %s\n", (const char*) lbl.utf8());
107 State* state = keymap->getStateByLabel(lbl);
108 if (state != 0) {
109 keymap->setCurrentState(state);
110 setText(lbl);
111 }
112}
113
114void ZkbWidget::mouseReleaseEvent(QMouseEvent*) {
115 QSize sh = labels->sizeHint();
116 QPoint p = mapToGlobal(QPoint((width()-sh.width())/2,-sh.height()));
117 labels->exec(p);
118}
119
120void ZkbWidget::signalReceived(const QCString& msg, const QByteArray& data) {
121 QDataStream stream(data, IO_ReadOnly);
122
123 if (msg == "enable()") {
124 keymap->enable();
125 } else if (msg == "disable()") {
126 keymap->disable();
127 } else if (msg == "reload()") {
128 QCopEnvelope("QPE/System", "busy()");
129 QTimer::singleShot(0, this, SLOT(reload()));
130 } else if (msg == "switch(QString)") {
131 QString lbl;
132 stream >> lbl;
133
134 if (keymap != 0) {
135 State* state = keymap->getStateByLabel(lbl);
136 if (state != 0) {
137 keymap->setCurrentState(state);
138 setText(lbl);
139 }
140 }
141 } else if (msg == "debug(QString)") {
142 QString flag;
143 stream >> flag;
144 }
145}
146
147void ZkbWidget::reload() {
148 loadKeymap();
149 QCopEnvelope("QPE/System", "notBusy()");
150}