From 0128d222b94adab6b258f417722f298013a33327 Mon Sep 17 00:00:00 2001 From: Hisham Date: Wed, 15 Jun 2016 12:45:23 -0300 Subject: Added Ctrl+A and Ctrl+E to go to beginning and end of line. (Also, '^' and '$') Closes #508. --- CategoriesPanel.c | 4 ++-- MainPanel.c | 14 -------------- Panel.c | 26 +++++++++++++++++--------- Panel.h | 6 ++---- ScreenManager.c | 11 +++++++++-- 5 files changed, 30 insertions(+), 31 deletions(-) diff --git a/CategoriesPanel.c b/CategoriesPanel.c index d67be86a..afc32305 100644 --- a/CategoriesPanel.c +++ b/CategoriesPanel.c @@ -82,9 +82,9 @@ static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) { result = HANDLED; break; case KEY_UP: - case KEY_CTRLP: + case KEY_CTRL('P'): case KEY_DOWN: - case KEY_CTRLN: + case KEY_CTRL('N'): case KEY_NPAGE: case KEY_PPAGE: case KEY_HOME: diff --git a/MainPanel.c b/MainPanel.c index 708a0775..7aca7ed0 100644 --- a/MainPanel.c +++ b/MainPanel.c @@ -105,20 +105,6 @@ static HandlerResult MainPanel_eventHandler(Panel* super, int ch) { } else { reaction |= HTOP_KEEP_FOLLOWING; } - switch (ch) { - case KEY_LEFT: - case KEY_CTRLB: - if (super->scrollH > 0) { - super->scrollH -= CRT_scrollHAmount; - super->needsRedraw = true; - } - return HANDLED; - case KEY_RIGHT: - case KEY_CTRLF: - super->scrollH += CRT_scrollHAmount; - super->needsRedraw = true; - return HANDLED; - } } if (reaction & HTOP_REDRAW_BAR) { diff --git a/Panel.c b/Panel.c index 65d13423..a22b36f0 100644 --- a/Panel.c +++ b/Panel.c @@ -61,6 +61,7 @@ struct Panel_ { Vector* items; int selected; int oldSelected; + int selectedLen; void* eventHandlerState; int scrollV; short scrollH; @@ -82,10 +83,7 @@ struct Panel_ { #define MAX(a,b) ((a)>(b)?(a):(b)) #endif -#define KEY_CTRLN 0016 /* control-n key */ -#define KEY_CTRLP 0020 /* control-p key */ -#define KEY_CTRLF 0006 /* control-f key */ -#define KEY_CTRLB 0002 /* control-b key */ +#define KEY_CTRL(l) ((l)-'A'+1) PanelClass Panel_class = { .super = { @@ -327,6 +325,7 @@ void Panel_draw(Panel* this, bool focus) { if (selected) { attrset(selectionColor); RichString_setAttr(&item, selectionColor); + this->selectedLen = itemLen; } mvhline(y + line, x, ' ', this->w); if (amt > 0) @@ -352,6 +351,7 @@ void Panel_draw(Panel* this, bool focus) { RichString_begin(new); Object_display(newObj, &new); int newLen = RichString_sizeVal(new); + this->selectedLen = newLen; mvhline(y+ this->oldSelected - first, x+0, ' ', this->w); if (scrollH < oldLen) RichString_printoffnVal(old, y+this->oldSelected - first, x, @@ -376,11 +376,11 @@ bool Panel_onKey(Panel* this, int key) { int size = Vector_size(this->items); switch (key) { case KEY_DOWN: - case KEY_CTRLN: + case KEY_CTRL('N'): this->selected++; break; case KEY_UP: - case KEY_CTRLP: + case KEY_CTRL('P'): this->selected--; break; #ifdef KEY_C_DOWN @@ -394,14 +394,14 @@ bool Panel_onKey(Panel* this, int key) { break; #endif case KEY_LEFT: - case KEY_CTRLB: + case KEY_CTRL('B'): if (this->scrollH > 0) { - this->scrollH -= CRT_scrollHAmount; + this->scrollH -= MAX(CRT_scrollHAmount, 0); this->needsRedraw = true; } break; case KEY_RIGHT: - case KEY_CTRLF: + case KEY_CTRL('F'): this->scrollH += CRT_scrollHAmount; this->needsRedraw = true; break; @@ -436,6 +436,14 @@ bool Panel_onKey(Panel* this, int key) { case KEY_END: this->selected = size - 1; break; + case KEY_CTRL('A'): + case '^': + this->scrollH = 0; + break; + case KEY_CTRL('E'): + case '$': + this->scrollH = MAX(this->selectedLen - this->w, 0); + break; default: return false; } diff --git a/Panel.h b/Panel.h index 67897706..5253fc2e 100644 --- a/Panel.h +++ b/Panel.h @@ -50,6 +50,7 @@ struct Panel_ { Vector* items; int selected; int oldSelected; + int selectedLen; void* eventHandlerState; int scrollV; short scrollH; @@ -70,10 +71,7 @@ struct Panel_ { #define MAX(a,b) ((a)>(b)?(a):(b)) #endif -#define KEY_CTRLN 0016 /* control-n key */ -#define KEY_CTRLP 0020 /* control-p key */ -#define KEY_CTRLF 0006 /* control-f key */ -#define KEY_CTRLB 0002 /* control-b key */ +#define KEY_CTRL(l) ((l)-'A'+1) extern PanelClass Panel_class; diff --git a/ScreenManager.c b/ScreenManager.c index 44e74e05..05e1c024 100644 --- a/ScreenManager.c +++ b/ScreenManager.c @@ -279,7 +279,10 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { continue; } case KEY_LEFT: - case KEY_CTRLB: + case KEY_CTRL('B'): + if (this->panelCount < 2) { + goto defaultHandler; + } if (!this->allowFocusChange) break; tryLeft: @@ -290,8 +293,11 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { goto tryLeft; break; case KEY_RIGHT: - case KEY_CTRLF: + case KEY_CTRL('F'): case 9: + if (this->panelCount < 2) { + goto defaultHandler; + } if (!this->allowFocusChange) break; tryRight: @@ -307,6 +313,7 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { quit = true; continue; default: + defaultHandler: sortTimeout = resetSortTimeout; Panel_onKey(panelFocus, ch); break; -- cgit v1.2.3