-rw-r--r-- | inputmethods/multikey/keyboard.cpp | 19 | ||||
-rw-r--r-- | inputmethods/multikey/keyboard.h | 6 |
2 files changed, 13 insertions, 12 deletions
diff --git a/inputmethods/multikey/keyboard.cpp b/inputmethods/multikey/keyboard.cpp index e3d3928..3f6f73b 100644 --- a/inputmethods/multikey/keyboard.cpp +++ b/inputmethods/multikey/keyboard.cpp | |||
@@ -164,102 +164,103 @@ void Keyboard::drawKeyboard(QPainter &p, int row, int col) | |||
164 | 164 | ||
165 | if (row != -1 && col != -1) { //just redraw one key | 165 | if (row != -1 && col != -1) { //just redraw one key |
166 | 166 | ||
167 | int x = 0; | 167 | int x = 0; |
168 | for (int i = 0; i < col; i++) { | 168 | for (int i = 0; i < col; i++) { |
169 | 169 | ||
170 | x += keys->width(row, i) * defaultKeyWidth; | 170 | x += keys->width(row, i) * defaultKeyWidth; |
171 | } | 171 | } |
172 | int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); | 172 | int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); |
173 | 173 | ||
174 | int keyWidth = keys->width(row, col); | 174 | int keyWidth = keys->width(row, col); |
175 | 175 | ||
176 | p.fillRect(x + 1, y + 1, | 176 | p.fillRect(x + 1, y + 1, |
177 | keyWidth * defaultKeyWidth - 1, keyHeight - 1, | 177 | keyWidth * defaultKeyWidth - 1, keyHeight - 1, |
178 | pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor); | 178 | pressed || keys->pressed(row, col) ? keycolor_pressed : keycolor); |
179 | 179 | ||
180 | QPixmap *pix = keys->pix(row,col); | 180 | QImage *pix = keys->pix(row,col); |
181 | 181 | ||
182 | ushort c = keys->uni(row, col); | 182 | ushort c = keys->uni(row, col); |
183 | 183 | ||
184 | p.setPen(textcolor); | 184 | p.setPen(textcolor); |
185 | if (!pix) { | 185 | if (!pix) { |
186 | if (shift || lock) | 186 | if (shift || lock) |
187 | c = keys->shift(c); | 187 | c = keys->shift(c); |
188 | if (meta) { | 188 | if (meta) { |
189 | 189 | ||
190 | c = keys->meta(c); | 190 | c = keys->meta(c); |
191 | } | 191 | } |
192 | p.drawText(x, y, | 192 | p.drawText(x, y, |
193 | defaultKeyWidth * keyWidth + 3, keyHeight, | 193 | defaultKeyWidth * keyWidth + 3, keyHeight, |
194 | AlignCenter, (QChar)c); | 194 | AlignCenter, (QChar)c); |
195 | } | 195 | } |
196 | else | 196 | else |
197 | // center the image in the middle of the key | 197 | // center the image in the middle of the key |
198 | p.drawPixmap( x + (defaultKeyWidth * keyWidth - pix->width())/2, | 198 | p.drawImage( x + (defaultKeyWidth * keyWidth - pix->width())/2, |
199 | y + (keyHeight - pix->height())/2 + 1, | 199 | y + (keyHeight - pix->height())/2 + 1, |
200 | *pix ); | 200 | *pix ); |
201 | 201 | ||
202 | // this fixes the problem that the very right end of the board's vertical line | 202 | // this fixes the problem that the very right end of the board's vertical line |
203 | // gets painted over, because it's one pixel shorter than all other keys | 203 | // gets painted over, because it's one pixel shorter than all other keys |
204 | p.setPen(keycolor_lines); | 204 | p.setPen(keycolor_lines); |
205 | p.drawLine(width() - 1, 0, width() - 1, height()); | 205 | p.drawLine(width() - 1, 0, width() - 1, height()); |
206 | 206 | ||
207 | } else { | 207 | } else { |
208 | 208 | ||
209 | 209 | ||
210 | p.fillRect(0, 0, width(), height(), keycolor); | 210 | p.fillRect(0, 0, width(), height(), keycolor); |
211 | 211 | ||
212 | for (row = 1; row <= 5; row++) { | 212 | for (row = 1; row <= 5; row++) { |
213 | 213 | ||
214 | int x = 0; | 214 | int x = 0; |
215 | int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); | 215 | int y = (row - 1) * keyHeight + (usePicks ? picks->height() : 0); |
216 | 216 | ||
217 | p.setPen(keycolor_lines); | 217 | p.setPen(keycolor_lines); |
218 | p.drawLine(x, y, x + width(), y); | 218 | p.drawLine(x, y, x + width(), y); |
219 | 219 | ||
220 | for (int col = 0; col < keys->numKeys(row); col++) { | 220 | for (int col = 0; col < keys->numKeys(row); col++) { |
221 | 221 | ||
222 | QPixmap *pix = keys->pix(row, col); | 222 | QImage *pix = keys->pix(row, col); |
223 | int keyWidth = keys->width(row, col); | 223 | int keyWidth = keys->width(row, col); |
224 | 224 | ||
225 | 225 | ||
226 | int keyWidthPix = defaultKeyWidth * keyWidth; | 226 | int keyWidthPix = defaultKeyWidth * keyWidth; |
227 | 227 | ||
228 | if (keys->pressed(row, col)) | 228 | if (keys->pressed(row, col)) |
229 | p.fillRect(x+1, y+1, keyWidthPix - 1, | 229 | p.fillRect(x+1, y+1, keyWidthPix - 1, |
230 | keyHeight - 1, keycolor_pressed); | 230 | keyHeight - 1, keycolor_pressed); |
231 | 231 | ||
232 | ushort c = keys->uni(row, col); | 232 | ushort c = keys->uni(row, col); |
233 | 233 | ||
234 | p.setPen(textcolor); | 234 | p.setPen(textcolor); |
235 | if (!pix) { | 235 | if (!pix) { |
236 | if ((shift || lock) && keys->shift(c)) | 236 | if ((shift || lock) && keys->shift(c)) |
237 | c = keys->shift(c); | 237 | c = keys->shift(c); |
238 | else if (meta && keys->meta(c)) | 238 | else if (meta && keys->meta(c)) |
239 | c = keys->meta(c); | 239 | c = keys->meta(c); |
240 | 240 | ||
241 | p.drawText(x, y, | 241 | p.drawText(x, y, |
242 | keyWidthPix + 3, keyHeight, | 242 | keyWidthPix + 3, keyHeight, |
243 | AlignCenter, (QChar)c); | 243 | AlignCenter, (QChar)c); |
244 | } | 244 | } |
245 | else { | 245 | else { |
246 | // center the image in the middle of the key | 246 | // center the image in the middle of the key |
247 | p.drawPixmap( x + (keyWidthPix - pix->width())/2, | 247 | pix->setColor(1, textcolor.rgb()); |
248 | p.drawImage( x + (keyWidthPix - pix->width())/2, | ||
248 | y + (keyHeight - pix->height())/2 + 1, | 249 | y + (keyHeight - pix->height())/2 + 1, |
249 | QPixmap(*pix) ); | 250 | QImage(*pix) ); |
250 | } | 251 | } |
251 | 252 | ||
252 | p.setPen(keycolor_lines); | 253 | p.setPen(keycolor_lines); |
253 | p.drawLine(x, y, x, y + keyHeight); | 254 | p.drawLine(x, y, x, y + keyHeight); |
254 | 255 | ||
255 | x += keyWidthPix; | 256 | x += keyWidthPix; |
256 | } | 257 | } |
257 | 258 | ||
258 | 259 | ||
259 | } | 260 | } |
260 | p.setPen(keycolor_lines); | 261 | p.setPen(keycolor_lines); |
261 | p.drawLine(0, height() - 1, width(), height() - 1); | 262 | p.drawLine(0, height() - 1, width(), height() - 1); |
262 | p.drawLine(width() - 1, 0, width() - 1, height()); | 263 | p.drawLine(width() - 1, 0, width() - 1, height()); |
263 | } | 264 | } |
264 | 265 | ||
265 | } | 266 | } |
@@ -1031,33 +1032,33 @@ Keys::Keys(const char * filename) { | |||
1031 | 1032 | ||
1032 | // Keys::setKeysFromFile {{{2 | 1033 | // Keys::setKeysFromFile {{{2 |
1033 | void Keys::setKeysFromFile(const char * filename) { | 1034 | void Keys::setKeysFromFile(const char * filename) { |
1034 | 1035 | ||
1035 | QFile f(filename); | 1036 | QFile f(filename); |
1036 | 1037 | ||
1037 | if (f.open(IO_ReadOnly)) { | 1038 | if (f.open(IO_ReadOnly)) { |
1038 | 1039 | ||
1039 | QTextStream t(&f); | 1040 | QTextStream t(&f); |
1040 | int row; | 1041 | int row; |
1041 | int qcode; | 1042 | int qcode; |
1042 | ushort unicode; | 1043 | ushort unicode; |
1043 | int width; | 1044 | int width; |
1044 | QString buf; | 1045 | QString buf; |
1045 | QString comment; | 1046 | QString comment; |
1046 | char * xpm[256]; //couldnt be larger than that... could it? | 1047 | char * xpm[256]; //couldnt be larger than that... could it? |
1047 | QPixmap *xpm2pix = 0; | 1048 | QImage *xpm2pix = 0; |
1048 | 1049 | ||
1049 | buf = t.readLine(); | 1050 | buf = t.readLine(); |
1050 | while (buf) { | 1051 | while (buf) { |
1051 | 1052 | ||
1052 | // get rid of comments | 1053 | // get rid of comments |
1053 | buf.replace(QRegExp("#.*$", FALSE, FALSE), ""); | 1054 | buf.replace(QRegExp("#.*$", FALSE, FALSE), ""); |
1054 | 1055 | ||
1055 | // key definition | 1056 | // key definition |
1056 | if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) { | 1057 | if (buf.contains(QRegExp("^\\d+\\s+[0-1a-fx]+", FALSE, FALSE))) { |
1057 | // no $1 type referencing!!! this implementation of regexp sucks | 1058 | // no $1 type referencing!!! this implementation of regexp sucks |
1058 | 1059 | ||
1059 | // dont know of any sscanf() type funcs in Qt lib | 1060 | // dont know of any sscanf() type funcs in Qt lib |
1060 | QTextStream tmp (buf, IO_ReadOnly); | 1061 | QTextStream tmp (buf, IO_ReadOnly); |
1061 | tmp >> row >> qcode >> unicode >> width >> comment; | 1062 | tmp >> row >> qcode >> unicode >> width >> comment; |
1062 | 1063 | ||
1063 | buf = t.readLine(); | 1064 | buf = t.readLine(); |
@@ -1077,33 +1078,33 @@ void Keys::setKeysFromFile(const char * filename) { | |||
1077 | for (ushort i = 0; i < xpmBuf.length(); i++) { | 1078 | for (ushort i = 0; i < xpmBuf.length(); i++) { |
1078 | if (xpmBuf[i].latin1() != '"') { | 1079 | if (xpmBuf[i].latin1() != '"') { |
1079 | 1080 | ||
1080 | ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1(); | 1081 | ((char *)xpm[xpmLineCount])[j] = xpmBuf.at(i).latin1(); |
1081 | j++; | 1082 | j++; |
1082 | } | 1083 | } |
1083 | 1084 | ||
1084 | } | 1085 | } |
1085 | // have to close that facker up | 1086 | // have to close that facker up |
1086 | ((char *)xpm[xpmLineCount])[j] = '\0'; | 1087 | ((char *)xpm[xpmLineCount])[j] = '\0'; |
1087 | 1088 | ||
1088 | xpmLineCount++; | 1089 | xpmLineCount++; |
1089 | buf = t.readLine(); | 1090 | buf = t.readLine(); |
1090 | } | 1091 | } |
1091 | if (xpmLineCount) { | 1092 | if (xpmLineCount) { |
1092 | 1093 | ||
1093 | xpm2pix = new QPixmap((const char **)xpm); | 1094 | xpm2pix = new QImage((const char **)xpm); |
1094 | for (int i = 0; i < xpmLineCount; i++) | 1095 | for (int i = 0; i < xpmLineCount; i++) |
1095 | 1096 | ||
1096 | delete [] (xpm[i]); | 1097 | delete [] (xpm[i]); |
1097 | 1098 | ||
1098 | } | 1099 | } |
1099 | setKey(row, qcode, unicode, width, xpm2pix); | 1100 | setKey(row, qcode, unicode, width, xpm2pix); |
1100 | } | 1101 | } |
1101 | 1102 | ||
1102 | // shift map | 1103 | // shift map |
1103 | else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { | 1104 | else if (buf.contains(QRegExp("^[0-9a-fx]+\\s+[0-9a-fx]+\\s*$", FALSE, FALSE))) { |
1104 | 1105 | ||
1105 | QTextStream tmp (buf, IO_ReadOnly); | 1106 | QTextStream tmp (buf, IO_ReadOnly); |
1106 | ushort lower, shift; | 1107 | ushort lower, shift; |
1107 | tmp >> lower >> shift; | 1108 | tmp >> lower >> shift; |
1108 | 1109 | ||
1109 | shiftMap.insert(lower, shift); | 1110 | shiftMap.insert(lower, shift); |
@@ -1146,33 +1147,33 @@ void Keys::setKeysFromFile(const char * filename) { | |||
1146 | buf = t.readLine(); | 1147 | buf = t.readLine(); |
1147 | 1148 | ||
1148 | } else { // blank line, or garbage | 1149 | } else { // blank line, or garbage |
1149 | 1150 | ||
1150 | buf = t.readLine(); | 1151 | buf = t.readLine(); |
1151 | 1152 | ||
1152 | } | 1153 | } |
1153 | 1154 | ||
1154 | } | 1155 | } |
1155 | f.close(); | 1156 | f.close(); |
1156 | } | 1157 | } |
1157 | 1158 | ||
1158 | } | 1159 | } |
1159 | 1160 | ||
1160 | // Keys::setKey {{{2 | 1161 | // Keys::setKey {{{2 |
1161 | void Keys::setKey(const int row, const int qcode, const ushort unicode, | 1162 | void Keys::setKey(const int row, const int qcode, const ushort unicode, |
1162 | const int width, QPixmap *pix) { | 1163 | const int width, QImage *pix) { |
1163 | 1164 | ||
1164 | Key * key; | 1165 | Key * key; |
1165 | key = new Key; | 1166 | key = new Key; |
1166 | key->qcode = qcode; | 1167 | key->qcode = qcode; |
1167 | key->unicode = unicode; | 1168 | key->unicode = unicode; |
1168 | key->width = width; | 1169 | key->width = width; |
1169 | 1170 | ||
1170 | // share key->pressed between same keys | 1171 | // share key->pressed between same keys |
1171 | bool found = 0; | 1172 | bool found = 0; |
1172 | for (int i = 1; i <= 5; i++) { | 1173 | for (int i = 1; i <= 5; i++) { |
1173 | for (unsigned int j = 0; j < keys[i].count(); j++) | 1174 | for (unsigned int j = 0; j < keys[i].count(); j++) |
1174 | if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { | 1175 | if (keys[i].at(j)->qcode == qcode && keys[i].at(j)->unicode == unicode) { |
1175 | 1176 | ||
1176 | key->pressed = keys[i].at(j)->pressed; | 1177 | key->pressed = keys[i].at(j)->pressed; |
1177 | found = 1; | 1178 | found = 1; |
1178 | } | 1179 | } |
@@ -1203,33 +1204,33 @@ Keys::~Keys() { | |||
1203 | int Keys::width(const int row, const int col) { | 1204 | int Keys::width(const int row, const int col) { |
1204 | 1205 | ||
1205 | return keys[row].at(col)->width; | 1206 | return keys[row].at(col)->width; |
1206 | 1207 | ||
1207 | } | 1208 | } |
1208 | ushort Keys::uni(const int row, const int col) { | 1209 | ushort Keys::uni(const int row, const int col) { |
1209 | 1210 | ||
1210 | return keys[row].at(col)->unicode; | 1211 | return keys[row].at(col)->unicode; |
1211 | 1212 | ||
1212 | } | 1213 | } |
1213 | 1214 | ||
1214 | int Keys::qcode(const int row, const int col) { | 1215 | int Keys::qcode(const int row, const int col) { |
1215 | 1216 | ||
1216 | return keys[row].at(col)->qcode; | 1217 | return keys[row].at(col)->qcode; |
1217 | } | 1218 | } |
1218 | 1219 | ||
1219 | QPixmap *Keys::pix(const int row, const int col) { | 1220 | QImage *Keys::pix(const int row, const int col) { |
1220 | 1221 | ||
1221 | return keys[row].at(col)->pix; | 1222 | return keys[row].at(col)->pix; |
1222 | 1223 | ||
1223 | } | 1224 | } |
1224 | bool Keys::pressed(const int row, const int col) { | 1225 | bool Keys::pressed(const int row, const int col) { |
1225 | 1226 | ||
1226 | return *(keys[row].at(col)->pressed); | 1227 | return *(keys[row].at(col)->pressed); |
1227 | } | 1228 | } |
1228 | 1229 | ||
1229 | int Keys::numKeys(const int row) { | 1230 | int Keys::numKeys(const int row) { |
1230 | 1231 | ||
1231 | return keys[row].count(); | 1232 | return keys[row].count(); |
1232 | } | 1233 | } |
1233 | 1234 | ||
1234 | void Keys::setPressed(const int row, const int col, const bool pressed) { | 1235 | void Keys::setPressed(const int row, const int col, const bool pressed) { |
1235 | 1236 | ||
diff --git a/inputmethods/multikey/keyboard.h b/inputmethods/multikey/keyboard.h index b692975..1aa7a35 100644 --- a/inputmethods/multikey/keyboard.h +++ b/inputmethods/multikey/keyboard.h | |||
@@ -50,51 +50,51 @@ public: | |||
50 | }; | 50 | }; |
51 | 51 | ||
52 | 52 | ||
53 | class Keys { | 53 | class Keys { |
54 | public: | 54 | public: |
55 | 55 | ||
56 | Keys(); | 56 | Keys(); |
57 | Keys(const char * filename); | 57 | Keys(const char * filename); |
58 | ~Keys(); | 58 | ~Keys(); |
59 | ushort uni(const int row, const int col); | 59 | ushort uni(const int row, const int col); |
60 | int qcode(const int row, const int col); | 60 | int qcode(const int row, const int col); |
61 | int width(const int row, const int col); | 61 | int width(const int row, const int col); |
62 | bool pressed(const int row, const int col); | 62 | bool pressed(const int row, const int col); |
63 | bool *pressedPtr(const int row, const int col); | 63 | bool *pressedPtr(const int row, const int col); |
64 | ushort shift(const ushort); | 64 | ushort shift(const ushort); |
65 | ushort meta(const ushort); | 65 | ushort meta(const ushort); |
66 | QPixmap *pix(const int row, const int col); | 66 | QImage *pix(const int row, const int col); |
67 | int numKeys(const int row); | 67 | int numKeys(const int row); |
68 | void setKeysFromFile(const char *filename); | 68 | void setKeysFromFile(const char *filename); |
69 | void setKey(const int row, const int qcode, const ushort unicode, | 69 | void setKey(const int row, const int qcode, const ushort unicode, |
70 | const int width, QPixmap *pix); | 70 | const int width, QImage *pix); |
71 | void setPressed(const int row, const int col, const bool pressed); | 71 | void setPressed(const int row, const int col, const bool pressed); |
72 | QString lang; | 72 | QString lang; |
73 | QString label; | 73 | QString label; |
74 | 74 | ||
75 | private: | 75 | private: |
76 | 76 | ||
77 | typedef struct Key { | 77 | typedef struct Key { |
78 | int qcode; // are qt key codes just unicode values? | 78 | int qcode; // are qt key codes just unicode values? |
79 | ushort unicode; | 79 | ushort unicode; |
80 | int width; // not pixels but relative key width. normal key is 2 | 80 | int width; // not pixels but relative key width. normal key is 2 |
81 | 81 | ||
82 | // only needed for keys like ctrl that can have multiple keys pressed at once | 82 | // only needed for keys like ctrl that can have multiple keys pressed at once |
83 | bool *pressed; | 83 | bool *pressed; |
84 | QPixmap *pix; | 84 | QImage *pix; |
85 | }; | 85 | }; |
86 | 86 | ||
87 | QList<Key> keys[6]; | 87 | QList<Key> keys[6]; |
88 | QMap<ushort,ushort> shiftMap; | 88 | QMap<ushort,ushort> shiftMap; |
89 | QMap<ushort,ushort> metaMap; | 89 | QMap<ushort,ushort> metaMap; |
90 | 90 | ||
91 | }; | 91 | }; |
92 | 92 | ||
93 | class Keyboard : public QFrame | 93 | class Keyboard : public QFrame |
94 | { | 94 | { |
95 | Q_OBJECT | 95 | Q_OBJECT |
96 | public: | 96 | public: |
97 | Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); | 97 | Keyboard( QWidget* parent=0, const char* name=0, WFlags f=0 ); |
98 | ~Keyboard(); | 98 | ~Keyboard(); |
99 | 99 | ||
100 | void resetState(); | 100 | void resetState(); |