diff options
author | Daniel Lange <DLange@git.local> | 2023-02-05 04:25:56 +0100 |
---|---|---|
committer | Daniel Lange <DLange@git.local> | 2023-02-05 04:25:56 +0100 |
commit | f288666edc9180a2e81e6655951878124f321df6 (patch) | |
tree | da70bf44b2423f6f8e9a070c063fed79d190b489 /ScreensPanel.c | |
parent | 937052b231259a47d881d539ad5748245ef55b99 (diff) | |
download | debian_htop-f288666edc9180a2e81e6655951878124f321df6.tar.gz debian_htop-f288666edc9180a2e81e6655951878124f321df6.tar.bz2 debian_htop-f288666edc9180a2e81e6655951878124f321df6.zip |
New upstream version 3.2.2upstream/3.2.2
Diffstat (limited to 'ScreensPanel.c')
-rw-r--r-- | ScreensPanel.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/ScreensPanel.c b/ScreensPanel.c index 785c387..cb664ac 100644 --- a/ScreensPanel.c +++ b/ScreensPanel.c @@ -55,6 +55,10 @@ static void ScreensPanel_delete(Object* object) { item->ss = NULL; } + /* during renaming the ListItem's value points to our static buffer */ + if (this->renamingItem) + this->renamingItem->value = this->saved; + Panel_done(super); free(this); } @@ -70,7 +74,7 @@ static HandlerResult ScreensPanel_eventHandlerRenaming(Panel* super, int ch) { Panel_setCursorToSelection(super); } } else { - switch(ch) { + switch (ch) { case 127: case KEY_BACKSPACE: { @@ -89,9 +93,10 @@ static HandlerResult ScreensPanel_eventHandlerRenaming(Panel* super, int ch) { ListItem* item = (ListItem*) Panel_getSelected(super); if (!item) break; + assert(item == this->renamingItem); free(this->saved); item->value = xStrdup(this->buffer); - this->renaming = false; + this->renamingItem = NULL; super->cursorOn = false; Panel_setSelectionColor(super, PANEL_SELECTION_FOCUS); ScreensPanel_update(super); @@ -102,8 +107,9 @@ static HandlerResult ScreensPanel_eventHandlerRenaming(Panel* super, int ch) { ListItem* item = (ListItem*) Panel_getSelected(super); if (!item) break; + assert(item == this->renamingItem); item->value = this->saved; - this->renaming = false; + this->renamingItem = NULL; super->cursorOn = false; Panel_setSelectionColor(super, PANEL_SELECTION_FOCUS); break; @@ -119,7 +125,7 @@ static void startRenaming(Panel* super) { ListItem* item = (ListItem*) Panel_getSelected(super); if (item == NULL) return; - this->renaming = true; + this->renamingItem = item; super->cursorOn = true; char* name = item->value; this->saved = name; @@ -132,7 +138,7 @@ static void startRenaming(Panel* super) { Panel_setCursorToSelection(super); } -static void rebuildSettingsArray(Panel* super) { +static void rebuildSettingsArray(Panel* super, int selected) { ScreensPanel* const this = (ScreensPanel*) super; int n = Panel_size(super); @@ -144,13 +150,20 @@ static void rebuildSettingsArray(Panel* super) { this->settings->screens[i] = item->ss; } this->settings->nScreens = n; + /* ensure selection is in valid range */ + if (selected > n - 1) + selected = n - 1; + else if (selected < 0) + selected = 0; + this->settings->ssIndex = selected; + this->settings->ss = this->settings->screens[selected]; } static void addNewScreen(Panel* super) { ScreensPanel* const this = (ScreensPanel*) super; const char* name = "New"; - ScreenSettings* ss = Settings_newScreen(this->settings, &(const ScreenDefaults){ .name = name, .columns = "PID Command", .sortKey = "PID" }); + ScreenSettings* ss = Settings_newScreen(this->settings, &(const ScreenDefaults) { .name = name, .columns = "PID Command", .sortKey = "PID" }); ScreenListItem* item = ScreenListItem_new(name, ss); int idx = Panel_getSelectedIndex(super); Panel_insert(super, idx + 1, (Object*) item); @@ -164,7 +177,7 @@ static HandlerResult ScreensPanel_eventHandlerNormal(Panel* super, int ch) { ScreenListItem* oldFocus = (ScreenListItem*) Panel_getSelected(super); bool shouldRebuildArray = false; HandlerResult result = IGNORED; - switch(ch) { + switch (ch) { case '\n': case '\r': case KEY_ENTER: @@ -242,9 +255,8 @@ static HandlerResult ScreensPanel_eventHandlerNormal(Panel* super, int ch) { case KEY_F(9): //case KEY_DC: { - if (Panel_size(super) > 1) { + if (Panel_size(super) > 1) Panel_remove(super, selected); - } shouldRebuildArray = true; result = HANDLED; break; @@ -264,7 +276,7 @@ static HandlerResult ScreensPanel_eventHandlerNormal(Panel* super, int ch) { result = HANDLED; } if (shouldRebuildArray) - rebuildSettingsArray(super); + rebuildSettingsArray(super, selected); if (result == HANDLED) ScreensPanel_update(super); return result; @@ -273,7 +285,7 @@ static HandlerResult ScreensPanel_eventHandlerNormal(Panel* super, int ch) { static HandlerResult ScreensPanel_eventHandler(Panel* super, int ch) { ScreensPanel* const this = (ScreensPanel*) super; - if (this->renaming) { + if (this->renamingItem) { return ScreensPanel_eventHandlerRenaming(super, ch); } else { return ScreensPanel_eventHandlerNormal(super, ch); @@ -298,7 +310,7 @@ ScreensPanel* ScreensPanel_new(Settings* settings) { this->settings = settings; this->columns = ColumnsPanel_new(settings->screens[0], columns, &(settings->changed)); this->moving = false; - this->renaming = false; + this->renamingItem = NULL; super->cursorOn = false; this->cursor = 0; Panel_setHeader(super, "Screens"); |