aboutsummaryrefslogtreecommitdiff
path: root/util/fbrun
diff options
context:
space:
mode:
authorsimonb <simonb>2006-04-25 02:42:05 (GMT)
committersimonb <simonb>2006-04-25 02:42:05 (GMT)
commitcb65dae95fb3bd01cb4e43286ba2a56c41838d2e (patch)
tree8e0aba840aed873956b2c061c1d631b76577bd33 /util/fbrun
parent3707b74c40256c09465171d39e2c4d95aeaefb0e (diff)
downloadfluxbox_pavel-cb65dae95fb3bd01cb4e43286ba2a56c41838d2e.zip
fluxbox_pavel-cb65dae95fb3bd01cb4e43286ba2a56c41838d2e.tar.bz2
fbrun: Move the cursor to the end when tab completing
+ thanks Jonas Koelker, sf.net rfe #1333003, patch #1475578
Diffstat (limited to 'util/fbrun')
-rw-r--r--util/fbrun/FbRun.cc33
-rw-r--r--util/fbrun/FbRun.hh1
2 files changed, 24 insertions, 10 deletions
diff --git a/util/fbrun/FbRun.cc b/util/fbrun/FbRun.cc
index 41c7474..7392083 100644
--- a/util/fbrun/FbRun.cc
+++ b/util/fbrun/FbRun.cc
@@ -64,6 +64,7 @@ FbRun::FbRun(int x, int y, size_t width):
64 m_gc(*this), 64 m_gc(*this),
65 m_end(false), 65 m_end(false),
66 m_current_history_item(0), 66 m_current_history_item(0),
67 m_last_completion_prefix(""),
67 m_current_apps_item(0), 68 m_current_apps_item(0),
68 m_cursor(XCreateFontCursor(FbTk::App::instance()->display(), XC_xterm)) { 69 m_cursor(XCreateFontCursor(FbTk::App::instance()->display(), XC_xterm)) {
69 70
@@ -222,10 +223,11 @@ void FbRun::redrawLabel() {
222} 223}
223 224
224void FbRun::keyPressEvent(XKeyEvent &ke) { 225void FbRun::keyPressEvent(XKeyEvent &ke) {
225 226 // reset last completion prefix if we don't do a tab completion thing
227 bool did_tab_complete = false;
228
226 ke.state = FbTk::KeyUtil::instance().cleanMods(ke.state); 229 ke.state = FbTk::KeyUtil::instance().cleanMods(ke.state);
227 230
228 int cp= cursorPosition();
229 FbTk::TextBox::keyPressEvent(ke); 231 FbTk::TextBox::keyPressEvent(ke);
230 KeySym ks; 232 KeySym ks;
231 char keychar[1]; 233 char keychar[1];
@@ -238,22 +240,26 @@ void FbRun::keyPressEvent(XKeyEvent &ke) {
238 if ((ke.state & ControlMask) == ControlMask) { 240 if ((ke.state & ControlMask) == ControlMask) {
239 switch (ks) { 241 switch (ks) {
240 case XK_p: 242 case XK_p:
243 did_tab_complete = true;
241 prevHistoryItem(); 244 prevHistoryItem();
242 break; 245 break;
243 case XK_n: 246 case XK_n:
247 did_tab_complete = true;
244 nextHistoryItem(); 248 nextHistoryItem();
245 break; 249 break;
246 case XK_Tab: 250 case XK_Tab:
251 did_tab_complete = true;
247 tabCompleteHistory(); 252 tabCompleteHistory();
248 setCursorPosition(cp);
249 break; 253 break;
250 } 254 }
251 } else if ((ke.state & (Mod1Mask|ShiftMask)) == (Mod1Mask | ShiftMask)) { 255 } else if ((ke.state & (Mod1Mask|ShiftMask)) == (Mod1Mask | ShiftMask)) {
252 switch (ks) { 256 switch (ks) {
253 case XK_less: 257 case XK_less:
258 did_tab_complete = true;
254 firstHistoryItem(); 259 firstHistoryItem();
255 break; 260 break;
256 case XK_greater: 261 case XK_greater:
262 did_tab_complete = true;
257 lastHistoryItem(); 263 lastHistoryItem();
258 break; 264 break;
259 } 265 }
@@ -276,12 +282,14 @@ void FbRun::keyPressEvent(XKeyEvent &ke) {
276 nextHistoryItem(); 282 nextHistoryItem();
277 break; 283 break;
278 case XK_Tab: 284 case XK_Tab:
285 did_tab_complete = true;
279 tabCompleteApps(); 286 tabCompleteApps();
280 setCursorPosition(cp);
281 break; 287 break;
282 } 288 }
283 } 289 }
284 clear(); 290 clear();
291 if (!did_tab_complete)
292 m_last_completion_prefix = "";
285} 293}
286 294
287void FbRun::lockPosition(bool size_too) { 295void FbRun::lockPosition(bool size_too) {
@@ -347,11 +355,14 @@ void FbRun::tabCompleteHistory() {
347 } else { 355 } else {
348 unsigned int nr= 0; 356 unsigned int nr= 0;
349 unsigned int history_item = m_current_history_item - 1; 357 unsigned int history_item = m_current_history_item - 1;
350 string prefix = text().substr(0, textStartPos() + cursorPosition()); 358 if (m_last_completion_prefix.empty())
359 m_last_completion_prefix = text().substr(0, textStartPos() + cursorPosition());
360
351 while (history_item != m_current_history_item && nr++ < m_history.size()) { 361 while (history_item != m_current_history_item && nr++ < m_history.size()) {
352 if (m_history[history_item].find(prefix) == 0) { 362 if (m_history[history_item].find(m_last_completion_prefix) == 0) {
353 m_current_history_item = history_item; 363 m_current_history_item = history_item;
354 setText(m_history[m_current_history_item]); 364 setText(m_history[m_current_history_item]);
365 cursorEnd();
355 break; 366 break;
356 } 367 }
357 if (history_item == 0) // loop 368 if (history_item == 0) // loop
@@ -365,15 +376,16 @@ void FbRun::tabCompleteHistory() {
365void FbRun::tabCompleteApps() { 376void FbRun::tabCompleteApps() {
366 377
367 static bool first_run= true; 378 static bool first_run= true;
368 static string saved_prefix= ""; 379 if (m_last_completion_prefix.empty())
369 string prefix= text().substr(0, textStartPos() + cursorPosition()); 380 m_last_completion_prefix = text().substr(0, textStartPos() + cursorPosition());
381 string prefix = m_last_completion_prefix;
370 FbTk::Directory dir; 382 FbTk::Directory dir;
371 383
372 bool add_dirs= false; 384 bool add_dirs= false;
373 bool changed_prefix= false; 385 bool changed_prefix= false;
374 386
375 // (re)build m_apps-container 387 // (re)build m_apps-container
376 if (first_run || saved_prefix != prefix) { 388 if (first_run || m_last_completion_prefix != prefix) {
377 first_run= false; 389 first_run= false;
378 390
379 string path; 391 string path;
@@ -430,7 +442,7 @@ void FbRun::tabCompleteApps() {
430 sort(m_apps.begin(), m_apps.end()); 442 sort(m_apps.begin(), m_apps.end());
431 unique(m_apps.begin(), m_apps.end()); 443 unique(m_apps.begin(), m_apps.end());
432 444
433 saved_prefix= prefix; 445 m_last_completion_prefix = prefix;
434 changed_prefix= true; 446 changed_prefix= true;
435 m_current_apps_item= 0; 447 m_current_apps_item= 0;
436 } 448 }
@@ -456,6 +468,7 @@ void FbRun::tabCompleteApps() {
456 setText(m_apps[m_current_apps_item] + "/"); 468 setText(m_apps[m_current_apps_item] + "/");
457 else 469 else
458 setText(m_apps[m_current_apps_item]); 470 setText(m_apps[m_current_apps_item]);
471 cursorEnd();
459 break; 472 break;
460 } 473 }
461 apps_item++; 474 apps_item++;
diff --git a/util/fbrun/FbRun.hh b/util/fbrun/FbRun.hh
index f34f691..9d2705e 100644
--- a/util/fbrun/FbRun.hh
+++ b/util/fbrun/FbRun.hh
@@ -93,6 +93,7 @@ private:
93 std::vector<std::string> m_history; ///< history list of commands 93 std::vector<std::string> m_history; ///< history list of commands
94 std::string m_history_file; ///< holds filename for command history file 94 std::string m_history_file; ///< holds filename for command history file
95 size_t m_current_history_item; ///< holds current position in command history 95 size_t m_current_history_item; ///< holds current position in command history
96 std::string m_last_completion_prefix; ///< last prefix we completed on
96 97
97 typedef std::vector<std::string> AppsContainer; 98 typedef std::vector<std::string> AppsContainer;
98 typedef AppsContainer::iterator AppsContainerIt; 99 typedef AppsContainer::iterator AppsContainerIt;