diff options
56 files changed, 1113 insertions, 249 deletions
@@ -58,7 +58,7 @@ Object* Action_pickFromVector(State* st, Panel* list, int x, bool followProcess) header->pl->following = pid; unfollow = true; } - ScreenManager_run(scr, &panelFocus, &ch); + ScreenManager_run(scr, &panelFocus, &ch, NULL); if (unfollow) { header->pl->following = -1; } @@ -85,7 +85,7 @@ Object* Action_pickFromVector(State* st, Panel* list, int x, bool followProcess) static void Action_runSetup(State* st) { ScreenManager* scr = ScreenManager_new(st->header, st->settings, st, true); CategoriesPanel_new(scr, st->settings, st->header, st->pl); - ScreenManager_run(scr, NULL, NULL); + ScreenManager_run(scr, NULL, NULL, "Setup"); ScreenManager_delete(scr); if (st->settings->changed) { Header_writeBackToSettings(st->header); @@ -154,7 +154,7 @@ static bool collapseIntoParent(Panel* panel) { } Htop_Reaction Action_setSortKey(Settings* settings, ProcessField sortKey) { - Settings_setSortKey(settings, sortKey); + ScreenSettings_setSortKey(settings->ss, sortKey); return HTOP_REFRESH | HTOP_SAVE_SETTINGS | HTOP_UPDATE_PANELHDR | HTOP_KEEP_FOLLOWING; } @@ -164,8 +164,9 @@ static Htop_Reaction actionSetSortColumn(State* st) { Htop_Reaction reaction = HTOP_OK; Panel* sortPanel = Panel_new(0, 0, 0, 0, Class(ListItem), true, FunctionBar_newEnterEsc("Sort ", "Cancel ")); Panel_setHeader(sortPanel, "Sort by"); - const ProcessField* fields = st->settings->fields; - Hashtable* dynamicColumns = st->settings->dynamicColumns; + const Settings* settings = st->settings; + const ProcessField* fields = settings->ss->fields; + Hashtable* dynamicColumns = settings->dynamicColumns; for (int i = 0; fields[i]; i++) { char* name = NULL; if (fields[i] >= LAST_PROCESSFIELD) { @@ -177,7 +178,7 @@ static Htop_Reaction actionSetSortColumn(State* st) { name = String_trim(Process_fields[fields[i]].name); } Panel_add(sortPanel, (Object*) ListItem_new(name, fields[i])); - if (fields[i] == Settings_getActiveSortKey(st->settings)) + if (fields[i] == ScreenSettings_getActiveSortKey(settings->ss)) Panel_setSelected(sortPanel, i); free(name); @@ -231,16 +232,18 @@ static Htop_Reaction actionToggleMergedCommand(State* st) { } static Htop_Reaction actionToggleTreeView(State* st) { - st->settings->treeView = !st->settings->treeView; + ScreenSettings* ss = st->settings->ss; + ss->treeView = !ss->treeView; - if (!st->settings->allBranchesCollapsed) + if (!ss->allBranchesCollapsed) ProcessList_expandTree(st->pl); return HTOP_REFRESH | HTOP_SAVE_SETTINGS | HTOP_KEEP_FOLLOWING | HTOP_REDRAW_BAR | HTOP_UPDATE_PANELHDR; } static Htop_Reaction actionExpandOrCollapseAllBranches(State* st) { - st->settings->allBranchesCollapsed = !st->settings->allBranchesCollapsed; - if (st->settings->allBranchesCollapsed) + ScreenSettings* ss = st->settings->ss; + ss->allBranchesCollapsed = !ss->allBranchesCollapsed; + if (ss->allBranchesCollapsed) ProcessList_collapseAllBranches(st->pl); else ProcessList_expandTree(st->pl); @@ -277,7 +280,7 @@ static Htop_Reaction actionLowerPriority(State* st) { } static Htop_Reaction actionInvertSortOrder(State* st) { - Settings_invertSortOrder(st->settings); + ScreenSettings_invertSortOrder(st->settings->ss); if (st->pauseProcessUpdate) ProcessList_sort(st->pl); return HTOP_REFRESH | HTOP_SAVE_SETTINGS | HTOP_KEEP_FOLLOWING; @@ -289,7 +292,7 @@ static Htop_Reaction actionExpandOrCollapse(State* st) { } static Htop_Reaction actionCollapseIntoParent(State* st) { - if (!st->settings->treeView) { + if (!st->settings->ss->treeView) { return HTOP_OK; } bool changed = collapseIntoParent((Panel*)st->mainPanel); @@ -297,7 +300,46 @@ static Htop_Reaction actionCollapseIntoParent(State* st) { } static Htop_Reaction actionExpandCollapseOrSortColumn(State* st) { - return st->settings->treeView ? actionExpandOrCollapse(st) : actionSetSortColumn(st); + return st->settings->ss->treeView ? actionExpandOrCollapse(st) : actionSetSortColumn(st); +} + +static Htop_Reaction actionNextScreen(State* st) { + Settings* settings = st->settings; + settings->ssIndex++; + if (settings->ssIndex == settings->nScreens) { + settings->ssIndex = 0; + } + settings->ss = settings->screens[settings->ssIndex]; + return HTOP_REFRESH; +} + +static Htop_Reaction actionPrevScreen(State* st) { + Settings* settings = st->settings; + if (settings->ssIndex == 0) { + settings->ssIndex = settings->nScreens - 1; + } else { + settings->ssIndex--; + } + settings->ss = settings->screens[settings->ssIndex]; + return HTOP_REFRESH; +} + +Htop_Reaction Action_setScreenTab(Settings* settings, int x) { + int s = 2; + for (unsigned int i = 0; i < settings->nScreens; i++) { + if (x < s) { + return 0; + } + const char* name = settings->screens[i]->name; + int len = strlen(name); + if (x <= s + len + 1) { + settings->ssIndex = i; + settings->ss = settings->screens[i]; + return HTOP_REFRESH; + } + s += len + 3; + } + return 0; } static Htop_Reaction actionQuit(ATTR_UNUSED State* st) { @@ -714,4 +756,6 @@ void Action_setBindings(Htop_Action* keys) { keys[KEY_F(10)] = actionQuit; keys[KEY_F(18)] = actionExpandCollapseOrSortColumn; keys[KEY_RECLICK] = actionExpandOrCollapse; + keys[KEY_SHIFT_TAB] = actionPrevScreen; + keys['\t'] = actionNextScreen; } @@ -57,6 +57,8 @@ bool Action_setUserOnly(const char* userName, uid_t* userId); Htop_Reaction Action_setSortKey(Settings* settings, ProcessField sortKey); +Htop_Reaction Action_setScreenTab(Settings* settings, int x); + Htop_Reaction Action_follow(State* st); void Action_setBindings(Htop_Action* keys); @@ -193,6 +193,11 @@ static int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { [CPU_SOFTIRQ] = ColorPair(Magenta, Black), [CPU_STEAL] = ColorPair(Cyan, Black), [CPU_GUEST] = ColorPair(Cyan, Black), + [PANEL_EDIT] = ColorPair(White, Blue), + [SCREENS_OTH_BORDER] = ColorPair(Blue, Blue), + [SCREENS_OTH_TEXT] = ColorPair(Black, Blue), + [SCREENS_CUR_BORDER] = ColorPair(Green, Green), + [SCREENS_CUR_TEXT] = ColorPair(Black, Green), [PRESSURE_STALL_THREEHUNDRED] = ColorPair(Cyan, Black), [PRESSURE_STALL_SIXTY] = A_BOLD | ColorPair(Cyan, Black), [PRESSURE_STALL_TEN] = A_BOLD | ColorPair(White, Black), @@ -295,6 +300,11 @@ static int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { [CPU_SOFTIRQ] = A_BOLD, [CPU_STEAL] = A_DIM, [CPU_GUEST] = A_DIM, + [PANEL_EDIT] = A_BOLD, + [SCREENS_OTH_BORDER] = A_DIM, + [SCREENS_OTH_TEXT] = A_DIM, + [SCREENS_CUR_BORDER] = A_REVERSE, + [SCREENS_CUR_TEXT] = A_REVERSE, [PRESSURE_STALL_THREEHUNDRED] = A_DIM, [PRESSURE_STALL_SIXTY] = A_NORMAL, [PRESSURE_STALL_TEN] = A_BOLD, @@ -397,6 +407,11 @@ static int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { [CPU_SOFTIRQ] = ColorPair(Blue, White), [CPU_STEAL] = ColorPair(Cyan, White), [CPU_GUEST] = ColorPair(Cyan, White), + [PANEL_EDIT] = ColorPair(White,Blue), + [SCREENS_OTH_BORDER] = A_BOLD | ColorPair(Black,White), + [SCREENS_OTH_TEXT] = A_BOLD | ColorPair(Black,White), + [SCREENS_CUR_BORDER] = ColorPair(Green,Green), + [SCREENS_CUR_TEXT] = ColorPair(Black,Green), [PRESSURE_STALL_THREEHUNDRED] = ColorPair(Black, White), [PRESSURE_STALL_SIXTY] = ColorPair(Black, White), [PRESSURE_STALL_TEN] = ColorPair(Black, White), @@ -499,6 +514,11 @@ static int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { [CPU_SOFTIRQ] = ColorPair(Blue, Black), [CPU_STEAL] = ColorPair(Black, Black), [CPU_GUEST] = ColorPair(Black, Black), + [PANEL_EDIT] = ColorPair(White,Blue), + [SCREENS_OTH_BORDER] = ColorPair(Blue,Black), + [SCREENS_OTH_TEXT] = ColorPair(Blue,Black), + [SCREENS_CUR_BORDER] = ColorPair(Green,Green), + [SCREENS_CUR_TEXT] = ColorPair(Black,Green), [PRESSURE_STALL_THREEHUNDRED] = ColorPair(Black, Black), [PRESSURE_STALL_SIXTY] = ColorPair(Black, Black), [PRESSURE_STALL_TEN] = ColorPair(Black, Black), @@ -601,6 +621,11 @@ static int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { [CPU_SOFTIRQ] = ColorPair(Black, Blue), [CPU_STEAL] = ColorPair(White, Blue), [CPU_GUEST] = ColorPair(White, Blue), + [PANEL_EDIT] = ColorPair(White,Blue), + [SCREENS_OTH_BORDER] = A_BOLD | ColorPair(Yellow,Blue), + [SCREENS_OTH_TEXT] = ColorPair(Cyan,Blue), + [SCREENS_CUR_BORDER] = ColorPair(Cyan,Cyan), + [SCREENS_CUR_TEXT] = ColorPair(Black,Cyan), [PRESSURE_STALL_THREEHUNDRED] = A_BOLD | ColorPair(Black, Blue), [PRESSURE_STALL_SIXTY] = A_NORMAL | ColorPair(White, Blue), [PRESSURE_STALL_TEN] = A_BOLD | ColorPair(White, Blue), @@ -701,6 +726,11 @@ static int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { [CPU_SOFTIRQ] = ColorPair(Blue, Black), [CPU_STEAL] = ColorPair(Cyan, Black), [CPU_GUEST] = ColorPair(Cyan, Black), + [PANEL_EDIT] = ColorPair(White,Cyan), + [SCREENS_OTH_BORDER] = ColorPair(White,Black), + [SCREENS_OTH_TEXT] = ColorPair(Cyan,Black), + [SCREENS_CUR_BORDER] = A_BOLD | ColorPair(White,Black), + [SCREENS_CUR_TEXT] = A_BOLD | ColorPair(Green,Black), [PRESSURE_STALL_THREEHUNDRED] = ColorPair(Green, Black), [PRESSURE_STALL_SIXTY] = ColorPair(Green, Black), [PRESSURE_STALL_TEN] = A_BOLD | ColorPair(Green, Black), @@ -725,8 +755,6 @@ static int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = { [COLORSCHEME_BROKENGRAY] = { 0 } // dynamically generated. }; -int CRT_cursorX = 0; - int CRT_scrollHAmount = 5; int CRT_scrollWheelVAmount = 10; @@ -915,6 +943,7 @@ IGNORE_WCASTQUAL_BEGIN define_key("\033[14~", KEY_F(4)); define_key("\033[14;2~", KEY_F(15)); define_key("\033[17;2~", KEY_F(18)); + define_key("\033[Z", KEY_SHIFT_TAB); char sequence[3] = "\033a"; for (char c = 'a'; c <= 'z'; c++) { sequence[1] = c; @@ -925,6 +954,9 @@ IGNORE_WCASTQUAL_END #undef define_key #endif } + if (termType && (String_startsWith(termType, "rxvt"))) { + define_key("\033[Z", KEY_SHIFT_TAB); + } CRT_installSignalHandlers(); @@ -120,6 +120,11 @@ typedef enum ColorElements_ { CPU_SOFTIRQ, CPU_STEAL, CPU_GUEST, + PANEL_EDIT, + SCREENS_OTH_BORDER, + SCREENS_OTH_TEXT, + SCREENS_CUR_BORDER, + SCREENS_CUR_TEXT, PRESSURE_STALL_TEN, PRESSURE_STALL_SIXTY, PRESSURE_STALL_THREEHUNDRED, @@ -150,6 +155,7 @@ void CRT_handleSIGSEGV(int signal) ATTR_NORETURN; #define KEY_WHEELUP KEY_F(30) #define KEY_WHEELDOWN KEY_F(31) #define KEY_RECLICK KEY_F(32) +#define KEY_SHIFT_TAB KEY_F(33) #define KEY_ALT(x) (KEY_F(64 - 26) + ((x) - 'A')) extern const char* CRT_degreeSign; diff --git a/CategoriesPanel.c b/CategoriesPanel.c index 30867ee9..6e905ce9 100644 --- a/CategoriesPanel.c +++ b/CategoriesPanel.c @@ -14,7 +14,6 @@ in the source distribution for its full text. #include "AvailableColumnsPanel.h" #include "AvailableMetersPanel.h" #include "ColorsPanel.h" -#include "ColumnsPanel.h" #include "DisplayOptionsPanel.h" #include "FunctionBar.h" #include "Header.h" @@ -25,6 +24,7 @@ in the source distribution for its full text. #include "MetersPanel.h" #include "Object.h" #include "ProvideCurses.h" +#include "ScreensPanel.h" #include "Vector.h" #include "XUtils.h" @@ -69,9 +69,11 @@ static void CategoriesPanel_makeColorsPage(CategoriesPanel* this) { ScreenManager_add(this->scr, colors, -1); } -static void CategoriesPanel_makeColumnsPage(CategoriesPanel* this) { - Panel* columns = (Panel*) ColumnsPanel_new(this->settings); +static void CategoriesPanel_makeScreensPage(CategoriesPanel* this) { + Panel* screens = (Panel*) ScreensPanel_new(this->settings); + Panel* columns = (Panel*) ((ScreensPanel*)screens)->columns; Panel* availableColumns = (Panel*) AvailableColumnsPanel_new(columns, this->settings->dynamicColumns); + ScreenManager_add(this->scr, screens, 20); ScreenManager_add(this->scr, columns, 20); ScreenManager_add(this->scr, availableColumns, -1); } @@ -91,7 +93,7 @@ static const CategoriesPanelPage categoriesPanelPages[] = { { .name = "Display options", .ctor = CategoriesPanel_makeDisplayOptionsPage }, { .name = "Header layout", .ctor = CategoriesPanel_makeHeaderOptionsPage }, { .name = "Meters", .ctor = CategoriesPanel_makeMetersPage }, - { .name = "Columns", .ctor = CategoriesPanel_makeColumnsPage }, + { .name = "Screens", .ctor = CategoriesPanel_makeScreensPage }, { .name = "Colors", .ctor = CategoriesPanel_makeColorsPage }, }; @@ -157,7 +159,7 @@ CategoriesPanel* CategoriesPanel_new(ScreenManager* scr, Settings* settings, Hea this->settings = settings; this->header = header; this->pl = pl; - Panel_setHeader(super, "Setup"); + Panel_setHeader(super, "Categories"); for (size_t i = 0; i < ARRAYSIZE(categoriesPanelPages); i++) Panel_add(super, (Object*) ListItem_new(categoriesPanelPages[i].name, 0)); diff --git a/ColumnsPanel.c b/ColumnsPanel.c index a1450bb0..24826936 100644 --- a/ColumnsPanel.c +++ b/ColumnsPanel.c @@ -138,20 +138,26 @@ static void ColumnsPanel_add(Panel* super, unsigned int key, Hashtable* columns) Panel_add(super, (Object*) ListItem_new(name, key)); } -ColumnsPanel* ColumnsPanel_new(Settings* settings) { +void ColumnsPanel_fill(ColumnsPanel* this, ScreenSettings* ss, Hashtable* columns) { + Panel* super = (Panel*) this; + Panel_prune(super); + for (const ProcessField* fields = ss->fields; *fields; fields++) + ColumnsPanel_add(super, *fields, columns); + this->ss = ss; +} + +ColumnsPanel* ColumnsPanel_new(ScreenSettings* ss, Hashtable* columns, bool* changed) { ColumnsPanel* this = AllocThis(ColumnsPanel); Panel* super = (Panel*) this; FunctionBar* fuBar = FunctionBar_new(ColumnsFunctions, NULL, NULL); Panel_init(super, 1, 1, 1, 1, Class(ListItem), true, fuBar); - this->settings = settings; + this->ss = ss; + this->changed = changed; this->moving = false; Panel_setHeader(super, "Active Columns"); - Hashtable* dynamicColumns = settings->dynamicColumns; - const ProcessField* fields = settings->fields; - for (; *fields; fields++) - ColumnsPanel_add(super, *fields, dynamicColumns); + ColumnsPanel_fill(this, ss, columns); return this; } @@ -159,14 +165,14 @@ ColumnsPanel* ColumnsPanel_new(Settings* settings) { void ColumnsPanel_update(Panel* super) { ColumnsPanel* this = (ColumnsPanel*) super; int size = Panel_size(super); - this->settings->changed = true; - this->settings->fields = xRealloc(this->settings->fields, sizeof(ProcessField) * (size + 1)); - this->settings->flags = 0; + *(this->changed) = true; + this->ss->fields = xRealloc(this->ss->fields, sizeof(ProcessField) * (size + 1)); + this->ss->flags = 0; for (int i = 0; i < size; i++) { int key = ((ListItem*) Panel_get(super, i))->key; - this->settings->fields[i] = key; + this->ss->fields[i] = key; if (key < LAST_PROCESSFIELD) - this->settings->flags |= Process_fields[key].flags; + this->ss->flags |= Process_fields[key].flags; } - this->settings->fields[size] = 0; + this->ss->fields[size] = 0; } diff --git a/ColumnsPanel.h b/ColumnsPanel.h index d9360f46..63f6f92b 100644 --- a/ColumnsPanel.h +++ b/ColumnsPanel.h @@ -15,14 +15,17 @@ in the source distribution for its full text. typedef struct ColumnsPanel_ { Panel super; + ScreenSettings* ss; + bool* changed; - Settings* settings; bool moving; } ColumnsPanel; extern const PanelClass ColumnsPanel_class; -ColumnsPanel* ColumnsPanel_new(Settings* settings); +ColumnsPanel* ColumnsPanel_new(ScreenSettings* ss, Hashtable* columns, bool* changed); + +void ColumnsPanel_fill(ColumnsPanel* this, ScreenSettings* ss, Hashtable* columns); void ColumnsPanel_update(Panel* super); diff --git a/CommandLine.c b/CommandLine.c index 3a45d820..4416864b 100644 --- a/CommandLine.c +++ b/CommandLine.c @@ -328,7 +328,7 @@ int CommandLine_run(const char* name, int argc, char** argv) { settings->enableMouse = false; #endif if (flags.treeView) - settings->treeView = true; + settings->ss->treeView = true; if (flags.highlightChanges) settings->highlightChanges = true; if (flags.highlightDelaySecs != -1) @@ -337,9 +337,9 @@ int CommandLine_run(const char* name, int argc, char** argv) { // -t -s <key> means "tree sorted by key" // -s <key> means "list sorted by key" (previous existing behavior) if (!flags.treeView) { - settings->treeView = false; + settings->ss->treeView = false; } - Settings_setSortKey(settings, flags.sortKey); + ScreenSettings_setSortKey(settings->ss, flags.sortKey); } CRT_init(settings, flags.allowUnicode); @@ -347,7 +347,7 @@ int CommandLine_run(const char* name, int argc, char** argv) { MainPanel* panel = MainPanel_new(); ProcessList_setPanel(pl, (Panel*) panel); - MainPanel_updateTreeFunctions(panel, settings->treeView); + MainPanel_updateTreeFunctions(panel, settings->ss->treeView); State state = { .settings = settings, @@ -370,10 +370,10 @@ int CommandLine_run(const char* name, int argc, char** argv) { CommandLine_delay(pl, 75); ProcessList_scan(pl, false); - if (settings->allBranchesCollapsed) + if (settings->ss->allBranchesCollapsed) ProcessList_collapseAllBranches(pl); - ScreenManager_run(scr, NULL, NULL); + ScreenManager_run(scr, NULL, NULL, NULL); Platform_done(); diff --git a/DisplayOptionsPanel.c b/DisplayOptionsPanel.c index 82121204..25e6d759 100644 --- a/DisplayOptionsPanel.c +++ b/DisplayOptionsPanel.c @@ -97,9 +97,10 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager* this->scr = scr; Panel_setHeader(super, "Display options"); - Panel_add(super, (Object*) CheckItem_newByRef("Tree view", &(settings->treeView))); - Panel_add(super, (Object*) CheckItem_newByRef("- Tree view is always sorted by PID (htop 2 behavior)", &(settings->treeViewAlwaysByPID))); - Panel_add(super, (Object*) CheckItem_newByRef("- Tree view is collapsed by default", &(settings->allBranchesCollapsed))); + Panel_add(super, (Object*) CheckItem_newByRef("Tree view", &(settings->ss->treeView))); + Panel_add(super, (Object*) CheckItem_newByRef("- Tree view is always sorted by PID (htop 2 behavior)", &(settings->ss->treeViewAlwaysByPID))); + Panel_add(super, (Object*) CheckItem_newByRef("- Tree view is collapsed by default", &(settings->ss->allBranchesCollapsed))); + Panel_add(super, (Object*) CheckItem_newByRef("Show tabs for screens", &(settings->screenTabs))); Panel_add(super, (Object*) CheckItem_newByRef("Shadow other users' processes", &(settings->shadowOtherUsers))); Panel_add(super, (Object*) CheckItem_newByRef("Hide kernel threads", &(settings->hideKernelThreads))); Panel_add(super, (Object*) CheckItem_newByRef("Hide userland process threads", &(settings->hideUserlandThreads))); diff --git a/FunctionBar.c b/FunctionBar.c index fc3304ae..08500373 100644 --- a/FunctionBar.c +++ b/FunctionBar.c @@ -88,11 +88,12 @@ void FunctionBar_setLabel(FunctionBar* this, int event, const char* text) { } } -void FunctionBar_draw(const FunctionBar* this) { - FunctionBar_drawExtra(this, NULL, -1, false); +int FunctionBar_draw(const FunctionBar* this) { + return FunctionBar_drawExtra(this, NULL, -1, false); } -void FunctionBar_drawExtra(const FunctionBar* this, const char* buffer, int attr, bool setCursor) { +int FunctionBar_drawExtra(const FunctionBar* this, const char* buffer, int attr, bool setCursor) { + int cursorX = 0; attrset(CRT_colors[FUNCTION_BAR]); mvhline(LINES - 1, 0, ' ', COLS); int x = 0; @@ -113,18 +114,20 @@ void FunctionBar_drawExtra(const FunctionBar* this, const char* buffer, int attr } mvaddstr(LINES - 1, x, buffer); x += strlen(buffer); + cursorX = x; } attrset(CRT_colors[RESET_COLOR]); if (setCursor) { - CRT_cursorX = x; curs_set(1); } else { curs_set(0); } currentLen = x; + + return cursorX; } void FunctionBar_append(const char* buffer, int attr) { diff --git a/FunctionBar.h b/FunctionBar.h index ebe405f3..f01a5ef5 100644 --- a/FunctionBar.h +++ b/FunctionBar.h @@ -29,9 +29,9 @@ void FunctionBar_delete(FunctionBar* this); void FunctionBar_setLabel(FunctionBar* this, int event, const char* text); -void FunctionBar_draw(const FunctionBar* this); +int FunctionBar_draw(const FunctionBar* this); -void FunctionBar_drawExtra(const FunctionBar* this, const char* buffer, int attr, bool setCursor); +int FunctionBar_drawExtra(const FunctionBar* this, const char* buffer, int attr, bool setCursor); |