aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormathias <mathias>2005-05-06 10:02:03 (GMT)
committermathias <mathias>2005-05-06 10:02:03 (GMT)
commitd6ee96775dfdf0ee8bb2f00537f11a335c9b5a18 (patch)
tree6f3330b8c48a83cc852f7f07f938cb9a57fcdfc5
parent6c057c6903151aab92309310087d5af455ecefce (diff)
downloadfluxbox-d6ee96775dfdf0ee8bb2f00537f11a335c9b5a18.zip
fluxbox-d6ee96775dfdf0ee8bb2f00537f11a335c9b5a18.tar.bz2
more keyactions for textbox-patch from Vadim <suhanov_vadim at mail dot ru>
-rw-r--r--ChangeLog7
-rw-r--r--src/FbTk/TextBox.cc91
-rw-r--r--src/FbTk/TextBox.hh5
3 files changed, 98 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index d5072d6..a9198ca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
1(Format: Year/Month/Day) 1(Format: Year/Month/Day)
2Changes for 0.9.13 2Changes for 0.9.13
3*05/05/06:
4 * Added more KeyActions to TextBox (thanx to Vadim <suhanov_vadim@mail.ru>
5 Control + LeftArrow -> Moves cursor to the left direction, up to next word.
6 Control + RightArrow -> to the right direction.
7 Control + BackSpace -> Removes everything from the cursor left side, up to next left word.
8 Control + Delete -> like above but removes to the right direction.
9 FbTk/TextBox.cc/hh
3*05/05/05: 10*05/05/05:
4 * Fix #1160244, #1099704, #1094107 Mutiple keyboard layout (Mathias + thanx 11 * Fix #1160244, #1099704, #1094107 Mutiple keyboard layout (Mathias + thanx
5 to Vadim) 12 to Vadim)
diff --git a/src/FbTk/TextBox.cc b/src/FbTk/TextBox.cc
index 2ebd6c0..8e54ec7 100644
--- a/src/FbTk/TextBox.cc
+++ b/src/FbTk/TextBox.cc
@@ -35,6 +35,8 @@
35#include <X11/keysym.h> 35#include <X11/keysym.h>
36#include <X11/Xutil.h> 36#include <X11/Xutil.h>
37 37
38#include <iostream>
39
38namespace FbTk { 40namespace FbTk {
39 41
40TextBox::TextBox(int screen_num, 42TextBox::TextBox(int screen_num,
@@ -141,11 +143,8 @@ void TextBox::insertText(const std::string &val) {
141 m_text.insert(m_start_pos + cursorPosition(), val); 143 m_text.insert(m_start_pos + cursorPosition(), val);
142 m_cursor_pos += val.size(); 144 m_cursor_pos += val.size();
143 m_end_pos += val.size(); 145 m_end_pos += val.size();
144 146
145 if (m_start_pos + cursorPosition() < m_end_pos) 147 adjustPos();
146 adjustEndPos();
147 else
148 adjustStartPos();
149} 148}
150 149
151void TextBox::killToEnd() { 150void TextBox::killToEnd() {
@@ -247,6 +246,47 @@ void TextBox::keyPressEvent(XKeyEvent &event) {
247 m_cursor_pos = 0; 246 m_cursor_pos = 0;
248 m_end_pos = 0; 247 m_end_pos = 0;
249 break; 248 break;
249 case XK_Left:
250 if (m_cursor_pos && m_text.size()){
251 m_cursor_pos = findEmptySpaceLeft();
252 adjustPos();
253 }
254 break;
255 case XK_Right:
256 if (m_text.size() && m_cursor_pos < m_text.size()){
257 m_cursor_pos = findEmptySpaceRight();
258 adjustPos();
259 }
260 break;
261
262 case XK_BackSpace: {
263 if (!m_cursor_pos || !m_text.size())
264 break;
265
266 int pos = findEmptySpaceLeft();
267
268 m_text.erase(pos, m_cursor_pos - pos);
269 m_start_pos = 0;
270 m_cursor_pos = pos;
271 m_end_pos = m_text.size();
272 adjustPos();
273 }
274 break;
275 case XK_Delete: {
276
277 if (!m_text.size() || m_cursor_pos >= m_text.size())
278 break;
279
280 int pos = findEmptySpaceRight();
281
282 m_text.erase(m_cursor_pos, pos - m_cursor_pos);
283 m_start_pos = 0;
284 m_cursor_pos = m_cursor_pos;
285 m_end_pos = m_text.size();
286
287 adjustPos();
288 }
289 break;
250 } 290 }
251 } else if ((event.state & ShiftMask)== ShiftMask || 291 } else if ((event.state & ShiftMask)== ShiftMask ||
252 (event.state & 0x80) == 0x80) { // shif and altgr 292 (event.state & 0x80) == 0x80) { // shif and altgr
@@ -356,6 +396,47 @@ void TextBox::adjustStartPos() {
356 m_start_pos = start_pos; 396 m_start_pos = start_pos;
357} 397}
358 398
399int TextBox::findEmptySpaceLeft(){
359 400
401 // found the first left space symbol
402 int pos = m_text.rfind(' ', m_cursor_pos - 1);
360 403
404 // do we have one more space symbol near?
405 int next_pos = -1;
406 while ( pos > 0 && (next_pos = m_text.rfind(' ', pos - 1)) > -1 ){
407 if (next_pos + 1 < pos)
408 break;
409 pos = next_pos;
410 }
411 if (pos < 0)
412 pos = 0;
413
414 return pos;
415
416}
417int TextBox::findEmptySpaceRight(){
418
419 // found the first right space symbol
420 int pos = m_text.find(' ', m_cursor_pos);
421
422 // do we have one more space symbol near?
423 int next_pos = -1;
424 while (pos > -1 && pos < m_text.size() && (next_pos = m_text.find(' ', pos + 1)) > -1 ){
425 if (next_pos - 1 > pos)
426 break;
427 pos = next_pos;
428 }
429 if (pos < 0)
430 pos = m_text.size();
431
432 return pos + 1; // (+1) - sets cursor at the right.
433
434}
435void TextBox::adjustPos(){
436 if (m_start_pos + cursorPosition() < m_end_pos)
437 adjustEndPos();
438 else
439 adjustStartPos();
440
441}
361}; // end namespace FbTk 442}; // end namespace FbTk
diff --git a/src/FbTk/TextBox.hh b/src/FbTk/TextBox.hh
index ea3d00c..6b68f28 100644
--- a/src/FbTk/TextBox.hh
+++ b/src/FbTk/TextBox.hh
@@ -69,10 +69,15 @@ public:
69 GC gc() const { return m_gc; } 69 GC gc() const { return m_gc; }
70 int cursorPosition() const { return m_cursor_pos; } 70 int cursorPosition() const { return m_cursor_pos; }
71 71
72 int findEmptySpaceLeft();
73 int findEmptySpaceRight();
74
72private: 75private:
73 void adjustEndPos(); 76 void adjustEndPos();
74 void adjustStartPos(); 77 void adjustStartPos();
75 78
79 void adjustPos();
80
76 const FbTk::Font *m_font; 81 const FbTk::Font *m_font;
77 std::string m_text; 82 std::string m_text;
78 GC m_gc; 83 GC m_gc;