diff options
author | bssb | 2019-02-11 01:12:38 -0500 |
---|---|---|
committer | bssb | 2019-02-11 01:12:38 -0500 |
commit | f4d3102894f6db0d0106069d9b30074b9e1b3cc0 (patch) | |
tree | fb817e7c1471bde0b3da7220cebae6ec799a56d6 | |
download | aur-htop-vim-temperature.tar.gz |
initial commit
-rw-r--r-- | .SRCINFO | 28 | ||||
-rw-r--r-- | 0001-fix-option-string.patch | 25 | ||||
-rw-r--r-- | PKGBUILD | 57 | ||||
-rw-r--r-- | htop-temperature.patch | 261 | ||||
-rw-r--r-- | vim-keybindings.patch | 203 |
5 files changed, 574 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..9e47fc64ab81 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,28 @@ +pkgbase = htop-vim-temperature + pkgdesc = Interactive process viewer with CPU temperature and vim keybindings patches + pkgver = 2.2.0 + pkgrel = 1 + url = http://hisham.hm/htop/ + arch = i686 + arch = x86_64 + license = GPL + makedepends = python + depends = ncurses + depends = libnl + depends = lm_sensors + optdepends = lsof: show files opened by a process + optdepends = strace: attach to a running process + provides = htop + conflicts = htop + options = !emptydirs + source = http://hisham.hm/htop/releases/2.2.0/htop-2.2.0.tar.gz + source = htop-temperature.patch + source = vim-keybindings.patch + source = 0001-fix-option-string.patch + sha256sums = d9d6826f10ce3887950d709b53ee1d8c1849a70fa38e91d5896ad8cbc6ba3c57 + sha256sums = a4c9dfbc3c2f7e08904656b53b9c08d19014cf6238fb75f1ed5ecbef2905964c + sha256sums = 2a5ca32899e901956068f8a0f4f7532486faba1d1b34103d8f9e588e99037053 + sha256sums = 343cfd8e01f2d47e54b38f725bb05a9825511b502acdb6803507e5fa4d52bed7 + +pkgname = htop-vim-temperature + diff --git a/0001-fix-option-string.patch b/0001-fix-option-string.patch new file mode 100644 index 000000000000..b595b03759cc --- /dev/null +++ b/0001-fix-option-string.patch @@ -0,0 +1,25 @@ +From 731acc8bced18c90fbe0e18381c32f007f71e0d9 Mon Sep 17 00:00:00 2001 +From: Christian Hesse <mail@eworm.de> +Date: Tue, 10 Apr 2018 16:21:46 +0200 +Subject: [PATCH 1/1] fix option string + +This broke with commit db05ba61065f64b59d0014518be0786b5439e54c. + +Signed-off-by: Christian Hesse <mail@eworm.de> +--- + htop.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/htop.c b/htop.c +index 6db81dd..678a3b8 100644 +--- a/htop.c ++++ b/htop.c +@@ -93,7 +93,7 @@ static CommandLineSettings parseArguments(int argc, char** argv) { + + int opt, opti=0; + /* Parse arguments */ +- while ((opt = getopt_long(argc, argv, "hvCst::d:u:p:i", long_opts, &opti))) { ++ while ((opt = getopt_long(argc, argv, "hvCs:td:u:p:i", long_opts, &opti))) { + if (opt == EOF) break; + switch (opt) { + case 'h': diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..dbf8791c0d2e --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,57 @@ +# Maintainer: Maxim Kurnosenko <asusx2@mail.ru> +# Contributor: Blair Bonnett <blair.bonnett at gmail dot com> + +_pkgname=htop +pkgname=htop-vim-temperature +pkgver=2.2.0 +pkgrel=1 +pkgdesc="Interactive process viewer with CPU temperature and vim keybindings patches" +arch=('i686' 'x86_64') +url="http://hisham.hm/htop/" +license=('GPL') +depends=('ncurses' 'libnl' 'lm_sensors') +makedepends=('python') +optdepends=('lsof: show files opened by a process' + 'strace: attach to a running process') +provides=($_pkgname) +conflicts=($_pkgname) +options=('!emptydirs') +source=("http://hisham.hm/$_pkgname/releases/$pkgver/$_pkgname-$pkgver.tar.gz" + "htop-temperature.patch" + "vim-keybindings.patch" + "0001-fix-option-string.patch") +sha256sums=('d9d6826f10ce3887950d709b53ee1d8c1849a70fa38e91d5896ad8cbc6ba3c57' + 'a4c9dfbc3c2f7e08904656b53b9c08d19014cf6238fb75f1ed5ecbef2905964c' + '2a5ca32899e901956068f8a0f4f7532486faba1d1b34103d8f9e588e99037053' + '343cfd8e01f2d47e54b38f725bb05a9825511b502acdb6803507e5fa4d52bed7') + +prepare() { + cd "$_pkgname-$pkgver" + + patch -Np1 < "$srcdir"/0001-fix-option-string.patch + + # Add CPU temperature patch. + patch -Np1 < "$srcdir"/htop-temperature.patch + + patch -Np1 < "$srcdir"/vim-keybindings.patch +} + +build() { + cd "$_pkgname-$pkgver" + + ./autogen.sh + ./configure \ + --prefix=/usr \ + --sysconfdir=/etc \ + --enable-cgroup \ + --enable-delayacct \ + --enable-openvz \ + --enable-unicode \ + --enable-vserver + + make $MAKEFLAGS +} + +package() { + make -C "$_pkgname-$pkgver" DESTDIR="$pkgdir" install +} diff --git a/htop-temperature.patch b/htop-temperature.patch new file mode 100644 index 000000000000..e57f326c7ce5 --- /dev/null +++ b/htop-temperature.patch @@ -0,0 +1,261 @@ +diff --git a/CRT.c b/CRT.c +index 0d51698..4eab74d 100644 +--- a/CRT.c ++++ b/CRT.c +@@ -78,6 +78,9 @@ typedef enum ColorElements_ { + UPTIME, + BATTERY, + TASKS_RUNNING, ++ TEMPERATURE_COOL, ++ TEMPERATURE_MEDIUM, ++ TEMPERATURE_HOT, + SWAP, + PROCESS, + PROCESS_SHADOW, +@@ -182,6 +185,9 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { + [METER_VALUE] = A_BOLD | ColorPair(Cyan,Black), + [LED_COLOR] = ColorPair(Green,Black), + [TASKS_RUNNING] = A_BOLD | ColorPair(Green,Black), ++ [TEMPERATURE_COOL] = A_DIM | ColorPair(Green,Black), ++ [TEMPERATURE_MEDIUM] = A_NORMAL | ColorPair(Yellow,Black), ++ [TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black), + [PROCESS] = A_NORMAL, + [PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black), + [PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Black), +@@ -241,6 +247,9 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { + [METER_VALUE] = A_BOLD, + [LED_COLOR] = A_NORMAL, + [TASKS_RUNNING] = A_BOLD, ++ [TEMPERATURE_COOL] = A_DIM, ++ [TEMPERATURE_MEDIUM] = A_NORMAL, ++ [TEMPERATURE_HOT] = A_BOLD, + [PROCESS] = A_NORMAL, + [PROCESS_SHADOW] = A_DIM, + [PROCESS_TAG] = A_BOLD, +@@ -300,6 +309,9 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { + [METER_VALUE] = ColorPair(Black,White), + [LED_COLOR] = ColorPair(Green,White), + [TASKS_RUNNING] = ColorPair(Green,White), ++ [TEMPERATURE_COOL] = ColorPair(Green,White), ++ [TEMPERATURE_MEDIUM] = ColorPair(Yellow,White), ++ [TEMPERATURE_HOT] = ColorPair(Red,White), + [PROCESS] = ColorPair(Black,White), + [PROCESS_SHADOW] = A_BOLD | ColorPair(Black,White), + [PROCESS_TAG] = ColorPair(White,Blue), +@@ -359,6 +371,9 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { + [METER_VALUE] = ColorPair(Black,Black), + [LED_COLOR] = ColorPair(Green,Black), + [TASKS_RUNNING] = ColorPair(Green,Black), ++ [TEMPERATURE_COOL] = ColorPair(Green,Black), ++ [TEMPERATURE_MEDIUM] = ColorPair(Yellow,Black), ++ [TEMPERATURE_HOT] = ColorPair(Red,Black), + [PROCESS] = ColorPair(Black,Black), + [PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black), + [PROCESS_TAG] = ColorPair(White,Blue), +@@ -418,6 +433,9 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { + [METER_VALUE] = A_BOLD | ColorPair(Cyan,Blue), + [LED_COLOR] = ColorPair(Green,Blue), + [TASKS_RUNNING] = A_BOLD | ColorPair(Green,Blue), ++ [TEMPERATURE_COOL] = A_DIM | ColorPair(Green,Blue), ++ [TEMPERATURE_MEDIUM] = A_NORMAL | ColorPair(Yellow,Blue), ++ [TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Blue), + [PROCESS] = ColorPair(White,Blue), + [PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Blue), + [PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Blue), +@@ -477,6 +495,9 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { + [METER_VALUE] = ColorPair(Green,Black), + [LED_COLOR] = ColorPair(Green,Black), + [TASKS_RUNNING] = A_BOLD | ColorPair(Green,Black), ++ [TEMPERATURE_COOL] = A_DIM | ColorPair(Green,Black), ++ [TEMPERATURE_MEDIUM] = A_NORMAL | ColorPair(Yellow,Black), ++ [TEMPERATURE_HOT] = A_BOLD | ColorPair(Red,Black), + [PROCESS] = ColorPair(Cyan,Black), + [PROCESS_SHADOW] = A_BOLD | ColorPair(Black,Black), + [PROCESS_TAG] = A_BOLD | ColorPair(Yellow,Black), +diff --git a/CRT.h b/CRT.h +index fb82413..bda5318 100644 +--- a/CRT.h ++++ b/CRT.h +@@ -68,6 +68,9 @@ typedef enum ColorElements_ { + UPTIME, + BATTERY, + TASKS_RUNNING, ++ TEMPERATURE_COOL, ++ TEMPERATURE_MEDIUM, ++ TEMPERATURE_HOT, + SWAP, + PROCESS, + PROCESS_SHADOW, +diff --git a/TemperatureMeter.c b/TemperatureMeter.c +new file mode 100644 +index 0000000..9ee9185 +--- /dev/null ++++ b/TemperatureMeter.c +@@ -0,0 +1,100 @@ ++/* ++htop - TemperatureMeter.c ++(C) 2013 Ralf Stemmer ++(C) 2014 Blair Bonnett ++Released under the GNU GPL, see the COPYING file ++in the source distribution for its full text. ++*/ ++ ++#include "TemperatureMeter.h" ++ ++#include "ProcessList.h" ++#include "CRT.h" ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <limits.h> ++ ++/*{ ++#include "Meter.h" ++}*/ ++ ++int TemperatureMeter_attributes[] = { ++ TEMPERATURE_COOL, ++ TEMPERATURE_MEDIUM, ++ TEMPERATURE_HOT, ++}; ++ ++static void TemperatureMeter_setValues(Meter* this, char* buffer, int len) { ++ ProcessList* pl = this->pl; ++ this->total = pl->totalTasks; ++ this->values[0] = pl->runningTasks; ++ snprintf(buffer, len, "%d/%d", (int) this->values[0], (int) this->total); ++} ++ ++static void TemperatureMeter_display(Object* cast, RichString* out) { ++ FILE *p; ++ p = popen("sensors", "r"); ++ if(p == NULL) return 1; ++ ++ int textColor = CRT_colors[METER_TEXT]; ++ int coolColor = CRT_colors[TEMPERATURE_COOL]; ++ int mediumColor = CRT_colors[TEMPERATURE_MEDIUM]; ++ int hotColor = CRT_colors[TEMPERATURE_HOT]; ++ ++ size_t read, len; ++ char *line = NULL; ++ char *entry = NULL; ++ char *tstart = NULL, *tend = NULL; ++ int temperature; ++ while ((read = getline(&line, &len, p)) != -1) { ++ // contains this line a core-temperature? ++ entry = strstr(line, "Core "); ++ if (entry == NULL) continue; ++ ++ // find the begin of the temperature value ++ tstart = strchr(entry, '+'); // no negative temperatures expected :) ++ if (tstart == NULL) continue; ++ tstart++; // jump over the '+' ++ ++ // find the end of the temperature. Remember, it can be above 99°C ;) ++ tend = strchr(tstart, '.'); // just the integer ++ if (tend == NULL) continue; ++ ++ // convert the string into an integer, this is necessary for further steps ++ temperature = strtol(tstart, &tend, 10); ++ if (temperature == LONG_MAX || temperature == LONG_MIN) continue; ++ if (tstart == tend) continue; ++ ++ // choose the color for the temperature ++ int tempColor; ++ if (temperature < 60) tempColor = coolColor; ++ else if (temperature >= 60 && temperature < 70) tempColor = mediumColor; ++ else tempColor = hotColor; ++ ++ // output the temperature ++ char buffer[20]; ++ sprintf(buffer, "%d", temperature); ++ RichString_append(out, tempColor, buffer); ++ RichString_append(out, textColor, "°C "); ++ } ++ ++ free(line); ++ pclose(p); ++} ++ ++MeterClass TemperatureMeter_class = { ++ .super = { ++ .extends = Class(Meter), ++ .display = TemperatureMeter_display, ++ .delete = Meter_delete, ++ }, ++ .updateValues = TemperatureMeter_setValues, ++ .defaultMode = TEXT_METERMODE, ++ .total = 100.0, ++ .attributes = TemperatureMeter_attributes, ++ .name = "Temperature", ++ .uiName = "Temperature Sensors", ++ .caption = "Temperature: " ++}; +diff --git a/TemperatureMeter.h b/TemperatureMeter.h +new file mode 100644 +index 0000000..b86ddd8 +--- /dev/null ++++ b/TemperatureMeter.h +@@ -0,0 +1,19 @@ ++/* Do not edit this file. It was automatically generated. */ ++ ++#ifndef HEADER_TemperatureMeter ++#define HEADER_TemperatureMeter ++/* ++htop - TemperatureMeter.h ++(C) 2013 Ralf Stemmer ++(C) 2014 Blair Bonnett ++Released under the GNU GPL, see the COPYING file ++in the source distribution for its full text. ++*/ ++ ++#include "Meter.h" ++ ++extern int TemperatureMeter_attributes[]; ++ ++extern MeterClass TemperatureMeter_class; ++ ++#endif +diff --git a/linux/Platform.c b/linux/Platform.c +index de7bb84..a8e8a6f 100644 +--- a/linux/Platform.c ++++ b/linux/Platform.c +@@ -22,6 +22,7 @@ in the source distribution for its full text. + #include "ClockMeter.h" + #include "HostnameMeter.h" + #include "LinuxProcess.h" ++#include "TemperatureMeter.h" + + #include <math.h> + #include <assert.h> +@@ -116,6 +117,7 @@ MeterClass* Platform_meterTypes[] = { + &MemoryMeter_class, + &SwapMeter_class, + &TasksMeter_class, ++ &TemperatureMeter_class, + &UptimeMeter_class, + &BatteryMeter_class, + &HostnameMeter_class, +diff --git a/Makefile.am b/Makefile.am +index cd5209c..c700e34 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -48,14 +48,15 @@ linux_platform_headers = \ + linux/LinuxProcess.h \ + linux/LinuxProcessList.h \ + linux/LinuxCRT.h \ +- linux/Battery.h ++ linux/Battery.h \ ++ TemperatureMeter.h + + all_platform_headers += $(linux_platform_headers) + + if HTOP_LINUX + AM_CFLAGS += -rdynamic + myhtopplatsources = linux/Platform.c linux/IOPriorityPanel.c linux/IOPriority.c \ +-linux/LinuxProcess.c linux/LinuxProcessList.c linux/LinuxCRT.c linux/Battery.c ++linux/LinuxProcess.c linux/LinuxProcessList.c linux/LinuxCRT.c linux/Battery.c TemperatureMeter.c + + myhtopplatheaders = $(linux_platform_headers) + endif diff --git a/vim-keybindings.patch b/vim-keybindings.patch new file mode 100644 index 000000000000..e8d6bfa5b4ff --- /dev/null +++ b/vim-keybindings.patch @@ -0,0 +1,203 @@ +diff --git a/Action.c b/Action.c +index a6394ac..089ee27 100644 +--- a/Action.c ++++ b/Action.c +@@ -382,7 +382,7 @@ static Htop_Reaction actionRedraw() { + } + + static const struct { const char* key; const char* info; } helpLeft[] = { +- { .key = " Arrows: ", .info = "scroll process list" }, ++ { .key = " hjkl: ", .info = "scroll process list" }, + { .key = " Digits: ", .info = "incremental PID search" }, + { .key = " F3 /: ", .info = "incremental name search" }, + { .key = " F4 \\: ",.info = "incremental name filtering" }, +@@ -403,7 +403,7 @@ static const struct { const char* key; const char* info; } helpRight[] = { + { .key = " Space: ", .info = "tag process" }, + { .key = " c: ", .info = "tag process and its children" }, + { .key = " U: ", .info = "untag all processes" }, +- { .key = " F9 k: ", .info = "kill process/tagged processes" }, ++ { .key = " F9 x: ", .info = "kill process/tagged processes" }, + { .key = " F7 ]: ", .info = "higher priority (root only)" }, + { .key = " F8 [: ", .info = "lower priority (+ nice)" }, + #if (HAVE_LIBHWLOC || HAVE_LINUX_AFFINITY) +@@ -411,7 +411,7 @@ static const struct { const char* key; const char* info; } helpRight[] = { + #endif + { .key = " e: ", .info = "show process environment" }, + { .key = " i: ", .info = "set IO priority" }, +- { .key = " l: ", .info = "list open files with lsof" }, ++ { .key = " L: ", .info = "list open files with lsof" }, + { .key = " s: ", .info = "trace syscalls with strace" }, + { .key = " ", .info = "" }, + { .key = " F2 C S: ", .info = "setup" }, +@@ -543,6 +543,7 @@ void Action_setBindings(Htop_Action* keys) { + keys['I'] = actionInvertSortOrder; + keys[KEY_F(6)] = actionExpandCollapseOrSortColumn; + keys[KEY_F(18)] = actionExpandCollapseOrSortColumn; ++ keys['o'] = actionExpandCollapseOrSortColumn; + keys['<'] = actionSetSortColumn; + keys[','] = actionSetSortColumn; + keys['>'] = actionSetSortColumn; +@@ -551,7 +552,7 @@ void Action_setBindings(Htop_Action* keys) { + keys['q'] = actionQuit; + keys['a'] = actionSetAffinity; + keys[KEY_F(9)] = actionKill; +- keys['k'] = actionKill; ++ keys['x'] = actionKill; + keys[KEY_RECLICK] = actionExpandOrCollapse; + keys['+'] = actionExpandOrCollapse; + keys['='] = actionExpandOrCollapse; +@@ -561,12 +562,11 @@ void Action_setBindings(Htop_Action* keys) { + keys['S'] = actionSetup; + keys['C'] = actionSetup; + keys[KEY_F(2)] = actionSetup; +- keys['l'] = actionLsof; ++ keys['L'] = actionLsof; + keys['s'] = actionStrace; + keys[' '] = actionTag; + keys['\014'] = actionRedraw; // Ctrl+L + keys[KEY_F(1)] = actionHelp; +- keys['h'] = actionHelp; + keys['?'] = actionHelp; + keys['U'] = actionUntagAll; + keys['c'] = actionTagAllChildren; +diff --git a/Panel.c b/Panel.c +index 1e53b4a..7f6580b 100644 +--- a/Panel.c ++++ b/Panel.c +@@ -372,14 +372,16 @@ void Panel_draw(Panel* this, bool focus) { + + bool Panel_onKey(Panel* this, int key) { + assert (this != NULL); +- ++ + int size = Vector_size(this->items); + switch (key) { + case KEY_DOWN: ++ case 'j': + case KEY_CTRL('N'): + this->selected++; + break; + case KEY_UP: ++ case 'k': + case KEY_CTRL('P'): + this->selected--; + break; +@@ -394,23 +396,33 @@ bool Panel_onKey(Panel* this, int key) { + break; + #endif + case KEY_LEFT: +- case KEY_CTRL('B'): ++ case 'h': + if (this->scrollH > 0) { + this->scrollH -= MAX(CRT_scrollHAmount, 0); + this->needsRedraw = true; + } + break; + case KEY_RIGHT: +- case KEY_CTRL('F'): ++ case 'l': + this->scrollH += CRT_scrollHAmount; + this->needsRedraw = true; + break; ++ case KEY_CTRL('U'): ++ this->selected -= (this->h - 1) / 2; ++ this->needsRedraw = true; ++ break; ++ case KEY_CTRL('D'): ++ this->selected += (this->h - 1) / 2; ++ this->needsRedraw = true; ++ break; + case KEY_PPAGE: ++ case KEY_CTRL('B'): + this->selected -= (this->h - 1); + this->scrollV = MAX(0, this->scrollV - this->h + 1); + this->needsRedraw = true; + break; + case KEY_NPAGE: ++ case KEY_CTRL('F'): + this->selected += (this->h - 1); + this->scrollV = MAX(0, MIN(Vector_size(this->items) - this->h, + this->scrollV + this->h - 1)); +@@ -432,9 +444,11 @@ bool Panel_onKey(Panel* this, int key) { + break; + } + case KEY_HOME: ++ case 'g': + this->selected = 0; + break; + case KEY_END: ++ case 'G': + this->selected = size - 1; + break; + case KEY_CTRL('A'): +diff --git a/README b/README +index 33a8739..d0b00ae 100644 +--- a/README ++++ b/README +@@ -17,6 +17,44 @@ but we also have code for running under FreeBSD and Mac OS X + This software has evolved considerably over the years, + and is reasonably complete, but there is always room for improvement. + ++Vim keybindings ++---------------- ++ ++These are the keybindings added in this fork of htop: ++ ++``` ++ g to the top (gg in vim) ++ ++ <C-b> up 1 page ++ ++ <C-u> up 1/2 page ++ ++ k ++ ++h l one character ++ ++ j ++ ++ <C-d> down 1/2 page ++ ++ <C-f> down 1 page ++ ++ G to the end ++ ++-------------------------------------------------- ++ ++ o Expand/collapse (like in NERDTree) ++``` ++ ++In order to accomodate these keybindings, the following changes ++were made to the original keybindings: ++ ++* Ctrl+F and Ctrt+B can no longer be used to navigate horizontally ++* 'h' can no longer be used to access the help, leaving Ctrl+F1 & '?' ++* 'k' can no longer be used to kill processes, being replaced with 'x' ++* 'l' can no longer be used to list open files, being replaced with 'L' ++ ++ + Comparison between `htop` and classic `top` + ------------------------------------------- + +diff --git a/ScreenManager.c b/ScreenManager.c +index 05e1c02..df2ac4a 100644 +--- a/ScreenManager.c ++++ b/ScreenManager.c +@@ -279,7 +279,7 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { + continue; + } + case KEY_LEFT: +- case KEY_CTRL('B'): ++ case 'h': + if (this->panelCount < 2) { + goto defaultHandler; + } +@@ -293,7 +293,7 @@ void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) { + goto tryLeft; + break; + case KEY_RIGHT: +- case KEY_CTRL('F'): ++ case 'l': + case 9: + if (this->panelCount < 2) { + goto defaultHandler; |