mirror of https://github.com/xzeldon/htop.git
Begin add supporting for multiple screens
This commit is contained in:
parent
52b5beb4e4
commit
ece89b8df0
7
CRT.c
7
CRT.c
|
@ -128,6 +128,7 @@ typedef enum ColorElements_ {
|
||||||
CPU_SOFTIRQ,
|
CPU_SOFTIRQ,
|
||||||
CPU_STEAL,
|
CPU_STEAL,
|
||||||
CPU_GUEST,
|
CPU_GUEST,
|
||||||
|
PANEL_EDIT,
|
||||||
LAST_COLORELEMENT
|
LAST_COLORELEMENT
|
||||||
} ColorElements;
|
} ColorElements;
|
||||||
|
|
||||||
|
@ -232,6 +233,7 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
||||||
[CPU_SOFTIRQ] = ColorPair(Magenta,Black),
|
[CPU_SOFTIRQ] = ColorPair(Magenta,Black),
|
||||||
[CPU_STEAL] = ColorPair(Cyan,Black),
|
[CPU_STEAL] = ColorPair(Cyan,Black),
|
||||||
[CPU_GUEST] = ColorPair(Cyan,Black),
|
[CPU_GUEST] = ColorPair(Cyan,Black),
|
||||||
|
[PANEL_EDIT] = ColorPair(White,Blue),
|
||||||
},
|
},
|
||||||
[COLORSCHEME_MONOCHROME] = {
|
[COLORSCHEME_MONOCHROME] = {
|
||||||
[RESET_COLOR] = A_NORMAL,
|
[RESET_COLOR] = A_NORMAL,
|
||||||
|
@ -291,6 +293,7 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
||||||
[CPU_SOFTIRQ] = A_BOLD,
|
[CPU_SOFTIRQ] = A_BOLD,
|
||||||
[CPU_STEAL] = A_REVERSE,
|
[CPU_STEAL] = A_REVERSE,
|
||||||
[CPU_GUEST] = A_REVERSE,
|
[CPU_GUEST] = A_REVERSE,
|
||||||
|
[PANEL_EDIT] = A_BOLD,
|
||||||
},
|
},
|
||||||
[COLORSCHEME_BLACKONWHITE] = {
|
[COLORSCHEME_BLACKONWHITE] = {
|
||||||
[RESET_COLOR] = ColorPair(Black,White),
|
[RESET_COLOR] = ColorPair(Black,White),
|
||||||
|
@ -350,6 +353,7 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
||||||
[CPU_SOFTIRQ] = ColorPair(Blue,White),
|
[CPU_SOFTIRQ] = ColorPair(Blue,White),
|
||||||
[CPU_STEAL] = ColorPair(Cyan,White),
|
[CPU_STEAL] = ColorPair(Cyan,White),
|
||||||
[CPU_GUEST] = ColorPair(Cyan,White),
|
[CPU_GUEST] = ColorPair(Cyan,White),
|
||||||
|
[PANEL_EDIT] = ColorPair(White,Blue),
|
||||||
},
|
},
|
||||||
[COLORSCHEME_LIGHTTERMINAL] = {
|
[COLORSCHEME_LIGHTTERMINAL] = {
|
||||||
[RESET_COLOR] = ColorPair(Black,Black),
|
[RESET_COLOR] = ColorPair(Black,Black),
|
||||||
|
@ -409,6 +413,7 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
||||||
[CPU_SOFTIRQ] = ColorPair(Blue,Black),
|
[CPU_SOFTIRQ] = ColorPair(Blue,Black),
|
||||||
[CPU_STEAL] = ColorPair(Black,Black),
|
[CPU_STEAL] = ColorPair(Black,Black),
|
||||||
[CPU_GUEST] = ColorPair(Black,Black),
|
[CPU_GUEST] = ColorPair(Black,Black),
|
||||||
|
[PANEL_EDIT] = ColorPair(White,Blue),
|
||||||
},
|
},
|
||||||
[COLORSCHEME_MIDNIGHT] = {
|
[COLORSCHEME_MIDNIGHT] = {
|
||||||
[RESET_COLOR] = ColorPair(White,Blue),
|
[RESET_COLOR] = ColorPair(White,Blue),
|
||||||
|
@ -468,6 +473,7 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
||||||
[CPU_SOFTIRQ] = ColorPair(Black,Blue),
|
[CPU_SOFTIRQ] = ColorPair(Black,Blue),
|
||||||
[CPU_STEAL] = ColorPair(White,Blue),
|
[CPU_STEAL] = ColorPair(White,Blue),
|
||||||
[CPU_GUEST] = ColorPair(White,Blue),
|
[CPU_GUEST] = ColorPair(White,Blue),
|
||||||
|
[PANEL_EDIT] = ColorPair(White,Blue),
|
||||||
},
|
},
|
||||||
[COLORSCHEME_BLACKNIGHT] = {
|
[COLORSCHEME_BLACKNIGHT] = {
|
||||||
[RESET_COLOR] = ColorPair(Cyan,Black),
|
[RESET_COLOR] = ColorPair(Cyan,Black),
|
||||||
|
@ -527,6 +533,7 @@ int CRT_colorSchemes[LAST_COLORSCHEME][LAST_COLORELEMENT] = {
|
||||||
[CPU_SOFTIRQ] = ColorPair(Blue,Black),
|
[CPU_SOFTIRQ] = ColorPair(Blue,Black),
|
||||||
[CPU_STEAL] = ColorPair(Cyan,Black),
|
[CPU_STEAL] = ColorPair(Cyan,Black),
|
||||||
[CPU_GUEST] = ColorPair(Cyan,Black),
|
[CPU_GUEST] = ColorPair(Cyan,Black),
|
||||||
|
[PANEL_EDIT] = ColorPair(White,Cyan),
|
||||||
},
|
},
|
||||||
[COLORSCHEME_BROKENGRAY] = { 0 } // dynamically generated.
|
[COLORSCHEME_BROKENGRAY] = { 0 } // dynamically generated.
|
||||||
};
|
};
|
||||||
|
|
1
CRT.h
1
CRT.h
|
@ -116,6 +116,7 @@ typedef enum ColorElements_ {
|
||||||
CPU_SOFTIRQ,
|
CPU_SOFTIRQ,
|
||||||
CPU_STEAL,
|
CPU_STEAL,
|
||||||
CPU_GUEST,
|
CPU_GUEST,
|
||||||
|
PANEL_EDIT,
|
||||||
LAST_COLORELEMENT
|
LAST_COLORELEMENT
|
||||||
} ColorElements;
|
} ColorElements;
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ in the source distribution for its full text.
|
||||||
#include "MetersPanel.h"
|
#include "MetersPanel.h"
|
||||||
#include "DisplayOptionsPanel.h"
|
#include "DisplayOptionsPanel.h"
|
||||||
#include "ColumnsPanel.h"
|
#include "ColumnsPanel.h"
|
||||||
|
#include "ScreensPanel.h"
|
||||||
#include "ColorsPanel.h"
|
#include "ColorsPanel.h"
|
||||||
#include "AvailableColumnsPanel.h"
|
#include "AvailableColumnsPanel.h"
|
||||||
|
|
||||||
|
@ -64,9 +65,11 @@ static void CategoriesPanel_makeColorsPage(CategoriesPanel* this) {
|
||||||
ScreenManager_add(this->scr, colors, -1);
|
ScreenManager_add(this->scr, colors, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CategoriesPanel_makeColumnsPage(CategoriesPanel* this) {
|
static void CategoriesPanel_makeScreensPage(CategoriesPanel* this) {
|
||||||
|
Panel* screens = (Panel*) ScreensPanel_new(this->settings);
|
||||||
Panel* columns = (Panel*) ColumnsPanel_new(this->settings);
|
Panel* columns = (Panel*) ColumnsPanel_new(this->settings);
|
||||||
Panel* availableColumns = (Panel*) AvailableColumnsPanel_new(columns);
|
Panel* availableColumns = (Panel*) AvailableColumnsPanel_new(columns);
|
||||||
|
ScreenManager_add(this->scr, screens, 20);
|
||||||
ScreenManager_add(this->scr, columns, 20);
|
ScreenManager_add(this->scr, columns, 20);
|
||||||
ScreenManager_add(this->scr, availableColumns, -1);
|
ScreenManager_add(this->scr, availableColumns, -1);
|
||||||
}
|
}
|
||||||
|
@ -118,7 +121,7 @@ static HandlerResult CategoriesPanel_eventHandler(Panel* super, int ch) {
|
||||||
CategoriesPanel_makeColorsPage(this);
|
CategoriesPanel_makeColorsPage(this);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
CategoriesPanel_makeColumnsPage(this);
|
CategoriesPanel_makeScreensPage(this);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,6 +150,6 @@ CategoriesPanel* CategoriesPanel_new(ScreenManager* scr, Settings* settings, Hea
|
||||||
Panel_add(super, (Object*) ListItem_new("Meters", 0));
|
Panel_add(super, (Object*) ListItem_new("Meters", 0));
|
||||||
Panel_add(super, (Object*) ListItem_new("Display options", 0));
|
Panel_add(super, (Object*) ListItem_new("Display options", 0));
|
||||||
Panel_add(super, (Object*) ListItem_new("Colors", 0));
|
Panel_add(super, (Object*) ListItem_new("Colors", 0));
|
||||||
Panel_add(super, (Object*) ListItem_new("Columns", 0));
|
Panel_add(super, (Object*) ListItem_new("Screens", 0));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ ClockMeter.c ColorsPanel.c ColumnsPanel.c CPUMeter.c CRT.c MainPanel.c \
|
||||||
DisplayOptionsPanel.c FunctionBar.c Hashtable.c Header.c htop.c ListItem.c \
|
DisplayOptionsPanel.c FunctionBar.c Hashtable.c Header.c htop.c ListItem.c \
|
||||||
LoadAverageMeter.c MemoryMeter.c Meter.c MetersPanel.c Object.c Panel.c \
|
LoadAverageMeter.c MemoryMeter.c Meter.c MetersPanel.c Object.c Panel.c \
|
||||||
BatteryMeter.c Process.c ProcessList.c RichString.c ScreenManager.c Settings.c \
|
BatteryMeter.c Process.c ProcessList.c RichString.c ScreenManager.c Settings.c \
|
||||||
SignalsPanel.c StringUtils.c SwapMeter.c TasksMeter.c UptimeMeter.c \
|
SignalsPanel.c StringUtils.c SwapMeter.c TasksMeter.c UptimeMeter.c ScreensPanel.c \
|
||||||
TraceScreen.c UsersTable.c Vector.c AvailableColumnsPanel.c AffinityPanel.c \
|
TraceScreen.c UsersTable.c Vector.c AvailableColumnsPanel.c AffinityPanel.c \
|
||||||
HostnameMeter.c OpenFilesScreen.c Affinity.c IncSet.c Action.c EnvScreen.c \
|
HostnameMeter.c OpenFilesScreen.c Affinity.c IncSet.c Action.c EnvScreen.c \
|
||||||
InfoScreen.c XAlloc.c
|
InfoScreen.c XAlloc.c
|
||||||
|
@ -31,7 +31,7 @@ CategoriesPanel.h CheckItem.h ClockMeter.h ColorsPanel.h ColumnsPanel.h \
|
||||||
CPUMeter.h CRT.h MainPanel.h DisplayOptionsPanel.h FunctionBar.h \
|
CPUMeter.h CRT.h MainPanel.h DisplayOptionsPanel.h FunctionBar.h \
|
||||||
Hashtable.h Header.h htop.h ListItem.h LoadAverageMeter.h MemoryMeter.h \
|
Hashtable.h Header.h htop.h ListItem.h LoadAverageMeter.h MemoryMeter.h \
|
||||||
BatteryMeter.h Meter.h MetersPanel.h Object.h Panel.h ProcessList.h RichString.h \
|
BatteryMeter.h Meter.h MetersPanel.h Object.h Panel.h ProcessList.h RichString.h \
|
||||||
ScreenManager.h Settings.h SignalsPanel.h StringUtils.h SwapMeter.h \
|
ScreenManager.h Settings.h SignalsPanel.h StringUtils.h SwapMeter.h ScreensPanel.h \
|
||||||
TasksMeter.h UptimeMeter.h TraceScreen.h UsersTable.h Vector.h Process.h \
|
TasksMeter.h UptimeMeter.h TraceScreen.h UsersTable.h Vector.h Process.h \
|
||||||
AffinityPanel.h HostnameMeter.h OpenFilesScreen.h Affinity.h IncSet.h Action.h \
|
AffinityPanel.h HostnameMeter.h OpenFilesScreen.h Affinity.h IncSet.h Action.h \
|
||||||
EnvScreen.h InfoScreen.h XAlloc.h
|
EnvScreen.h InfoScreen.h XAlloc.h
|
||||||
|
|
|
@ -0,0 +1,254 @@
|
||||||
|
/*
|
||||||
|
htop - ScreensPanel.c
|
||||||
|
(C) 2004-2011 Hisham H. Muhammad
|
||||||
|
Released under the GNU GPL, see the COPYING file
|
||||||
|
in the source distribution for its full text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ScreensPanel.h"
|
||||||
|
#include "Platform.h"
|
||||||
|
|
||||||
|
#include "StringUtils.h"
|
||||||
|
#include "ListItem.h"
|
||||||
|
#include "CRT.h"
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/*{
|
||||||
|
#include "Panel.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
#ifndef SCREEN_NAME_LEN
|
||||||
|
#define SCREEN_NAME_LEN 20
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct ScreensPanel_ {
|
||||||
|
Panel super;
|
||||||
|
|
||||||
|
Settings* settings;
|
||||||
|
char buffer[SCREEN_NAME_LEN + 1];
|
||||||
|
char* saved;
|
||||||
|
int cursor;
|
||||||
|
bool moving;
|
||||||
|
bool renaming;
|
||||||
|
} ScreensPanel;
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
|
static const char* const ScreensFunctions[] = {" ", "Rename", " ", " ", " ", " ", "MoveUp", "MoveDn", "Remove", "Done ", NULL};
|
||||||
|
|
||||||
|
static void ScreensPanel_delete(Object* object) {
|
||||||
|
Panel* super = (Panel*) object;
|
||||||
|
ScreensPanel* this = (ScreensPanel*) object;
|
||||||
|
Panel_done(super);
|
||||||
|
free(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HandlerResult ScreensPanel_eventHandlerRenaming(Panel* super, int ch) {
|
||||||
|
ScreensPanel* const this = (ScreensPanel*) super;
|
||||||
|
|
||||||
|
//ListItem* item = (ListItem*)Panel_getSelected(super);
|
||||||
|
if (ch >= 32 && ch < 127 && ch != 61 && ch != 22) {
|
||||||
|
if (this->cursor < SCREEN_NAME_LEN - 1) {
|
||||||
|
this->buffer[this->cursor] = ch;
|
||||||
|
this->cursor++;
|
||||||
|
super->selectedLen = strlen(this->buffer);
|
||||||
|
Panel_setCursorToSelection(super);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch(ch) {
|
||||||
|
case 127:
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
{
|
||||||
|
if (this->cursor > 0) {
|
||||||
|
this->cursor--;
|
||||||
|
this->buffer[this->cursor] = '\0';
|
||||||
|
super->selectedLen = strlen(this->buffer);
|
||||||
|
Panel_setCursorToSelection(super);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0a:
|
||||||
|
case 0x0d:
|
||||||
|
case KEY_ENTER:
|
||||||
|
{
|
||||||
|
ListItem* item = (ListItem*) Panel_getSelected(super);
|
||||||
|
free(this->saved);
|
||||||
|
item->value = xStrdup(this->buffer);
|
||||||
|
this->renaming = false;
|
||||||
|
super->cursorOn = false;
|
||||||
|
Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOCUS]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 27: // Esc
|
||||||
|
{
|
||||||
|
ListItem* item = (ListItem*) Panel_getSelected(super);
|
||||||
|
item->value = this->saved;
|
||||||
|
this->renaming = false;
|
||||||
|
super->cursorOn = false;
|
||||||
|
Panel_setSelectionColor(super, CRT_colors[PANEL_SELECTION_FOCUS]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ScreensPanel_update(super);
|
||||||
|
return HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void startRenaming(Panel* super) {
|
||||||
|
ScreensPanel* const this = (ScreensPanel*) super;
|
||||||
|
|
||||||
|
ListItem* item = (ListItem*) Panel_getSelected(super);
|
||||||
|
this->renaming = true;
|
||||||
|
super->cursorOn = true;
|
||||||
|
char* name = item->value;
|
||||||
|
this->saved = name;
|
||||||
|
strncpy(this->buffer, name, SCREEN_NAME_LEN);
|
||||||
|
this->buffer[SCREEN_NAME_LEN] = '\0';
|
||||||
|
this->cursor = strlen(this->buffer);
|
||||||
|
item->value = this->buffer;
|
||||||
|
Panel_setSelectionColor(super, CRT_colors[PANEL_EDIT]);
|
||||||
|
super->selectedLen = strlen(this->buffer);
|
||||||
|
Panel_setCursorToSelection(super);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HandlerResult ScreensPanel_eventHandlerNormal(Panel* super, int ch) {
|
||||||
|
ScreensPanel* const this = (ScreensPanel*) super;
|
||||||
|
|
||||||
|
int selected = Panel_getSelectedIndex(super);
|
||||||
|
HandlerResult result = IGNORED;
|
||||||
|
switch(ch) {
|
||||||
|
case 0x0a:
|
||||||
|
case 0x0d:
|
||||||
|
case KEY_ENTER:
|
||||||
|
case KEY_MOUSE:
|
||||||
|
case KEY_RECLICK:
|
||||||
|
{
|
||||||
|
this->moving = !(this->moving);
|
||||||
|
Panel_setSelectionColor(super, this->moving ? CRT_colors[PANEL_SELECTION_FOLLOW] : CRT_colors[PANEL_SELECTION_FOCUS]);
|
||||||
|
((ListItem*)Panel_getSelected(super))->moving = this->moving;
|
||||||
|
result = HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case KEY_F(2):
|
||||||
|
case 0x12: /* Ctrl+R */
|
||||||
|
{
|
||||||
|
startRenaming(super);
|
||||||
|
result = HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case KEY_F(5):
|
||||||
|
case 0x0e: /* Ctrl+N */
|
||||||
|
{
|
||||||
|
ListItem* item = ListItem_new("", 0);
|
||||||
|
int idx = Panel_getSelectedIndex(super);
|
||||||
|
Panel_insert(super, idx + 1, (Object*) item);
|
||||||
|
Panel_setSelected(super, idx + 1);
|
||||||
|
startRenaming(super);
|
||||||
|
result = HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case KEY_UP:
|
||||||
|
{
|
||||||
|
if (!this->moving) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* else fallthrough */
|
||||||
|
}
|
||||||
|
case KEY_F(7):
|
||||||
|
case '[':
|
||||||
|
case '-':
|
||||||
|
{
|
||||||
|
Panel_moveSelectedUp(super);
|
||||||
|
result = HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case KEY_DOWN:
|
||||||
|
{
|
||||||
|
if (!this->moving) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* else fallthrough */
|
||||||
|
}
|
||||||
|
case KEY_F(8):
|
||||||
|
case ']':
|
||||||
|
case '+':
|
||||||
|
{
|
||||||
|
Panel_moveSelectedDown(super);
|
||||||
|
result = HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case KEY_F(9):
|
||||||
|
//case KEY_DC:
|
||||||
|
{
|
||||||
|
Panel_remove(super, selected);
|
||||||
|
result = HANDLED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (ch < 255 && isalpha(ch))
|
||||||
|
result = Panel_selectByTyping(super, ch);
|
||||||
|
if (result == BREAK_LOOP)
|
||||||
|
result = IGNORED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (result == HANDLED)
|
||||||
|
ScreensPanel_update(super);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HandlerResult ScreensPanel_eventHandler(Panel* super, int ch) {
|
||||||
|
ScreensPanel* const this = (ScreensPanel*) super;
|
||||||
|
|
||||||
|
if (this->renaming) {
|
||||||
|
return ScreensPanel_eventHandlerRenaming(super, ch);
|
||||||
|
} else {
|
||||||
|
return ScreensPanel_eventHandlerNormal(super, ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PanelClass ScreensPanel_class = {
|
||||||
|
.super = {
|
||||||
|
.extends = Class(Panel),
|
||||||
|
.delete = ScreensPanel_delete
|
||||||
|
},
|
||||||
|
.eventHandler = ScreensPanel_eventHandler
|
||||||
|
};
|
||||||
|
|
||||||
|
ScreensPanel* ScreensPanel_new(Settings* settings) {
|
||||||
|
ScreensPanel* this = AllocThis(ScreensPanel);
|
||||||
|
Panel* super = (Panel*) this;
|
||||||
|
FunctionBar* fuBar = FunctionBar_new(ScreensFunctions, NULL, NULL);
|
||||||
|
Panel_init(super, 1, 1, 1, 1, Class(ListItem), true, fuBar);
|
||||||
|
|
||||||
|
this->settings = settings;
|
||||||
|
this->moving = false;
|
||||||
|
this->renaming = false;
|
||||||
|
super->cursorOn = false;
|
||||||
|
this->cursor = 0;
|
||||||
|
Panel_setHeader(super, "Screens");
|
||||||
|
|
||||||
|
char** screens = this->settings->screens;
|
||||||
|
for (; *screens; screens++) {
|
||||||
|
char* name = *screens;
|
||||||
|
Panel_add(super, (Object*) ListItem_new(name, 0));
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreensPanel_update(Panel* super) {
|
||||||
|
ScreensPanel* this = (ScreensPanel*) super;
|
||||||
|
int size = Panel_size(super);
|
||||||
|
this->settings->changed = true;
|
||||||
|
this->settings->screens = xRealloc(this->settings->screens, sizeof(char*) * (size+1));
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
char* name = ((ListItem*) Panel_get(super, i))->value;
|
||||||
|
this->settings->screens[i] = xStrdup(name);
|
||||||
|
}
|
||||||
|
this->settings->screens[size] = NULL;
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/* Do not edit this file. It was automatically generated. */
|
||||||
|
|
||||||
|
#ifndef HEADER_ScreensPanel
|
||||||
|
#define HEADER_ScreensPanel
|
||||||
|
/*
|
||||||
|
htop - ScreensPanel.h
|
||||||
|
(C) 2004-2011 Hisham H. Muhammad
|
||||||
|
Released under the GNU GPL, see the COPYING file
|
||||||
|
in the source distribution for its full text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Panel.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
|
||||||
|
#ifndef SCREEN_NAME_LEN
|
||||||
|
#define SCREEN_NAME_LEN 20
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct ScreensPanel_ {
|
||||||
|
Panel super;
|
||||||
|
|
||||||
|
Settings* settings;
|
||||||
|
char buffer[SCREEN_NAME_LEN + 1];
|
||||||
|
char* saved;
|
||||||
|
int cursor;
|
||||||
|
bool moving;
|
||||||
|
bool renaming;
|
||||||
|
} ScreensPanel;
|
||||||
|
|
||||||
|
|
||||||
|
void startRenaming(Panel* super);
|
||||||
|
|
||||||
|
extern PanelClass ScreensPanel_class;
|
||||||
|
|
||||||
|
ScreensPanel* ScreensPanel_new(Settings* settings);
|
||||||
|
|
||||||
|
void ScreensPanel_update(Panel* super);
|
||||||
|
|
||||||
|
#endif
|
80
Settings.c
80
Settings.c
|
@ -34,6 +34,9 @@ typedef struct Settings_ {
|
||||||
|
|
||||||
MeterColumnSettings columns[2];
|
MeterColumnSettings columns[2];
|
||||||
|
|
||||||
|
char** screens;
|
||||||
|
int nScreens;
|
||||||
|
|
||||||
ProcessField* fields;
|
ProcessField* fields;
|
||||||
int flags;
|
int flags;
|
||||||
int colorScheme;
|
int colorScheme;
|
||||||
|
@ -68,6 +71,53 @@ typedef struct Settings_ {
|
||||||
|
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
static void writeList(FILE* fd, char** list, int len) {
|
||||||
|
const char* sep = "";
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
fprintf(fd, "%s%s", sep, list[i]);
|
||||||
|
sep = " ";
|
||||||
|
}
|
||||||
|
fprintf(fd, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static char** readQuotedList(char* line, int* size) {
|
||||||
|
*size = 0;
|
||||||
|
char** list = xCalloc(sizeof(char*), 1);
|
||||||
|
int start = 0;
|
||||||
|
for (;;) {
|
||||||
|
while (line[start] && line[start] == ' ') {
|
||||||
|
start++;
|
||||||
|
}
|
||||||
|
if (line[start] != '"') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
start++;
|
||||||
|
int close = start;
|
||||||
|
while (line[close] && line[close] != '"') {
|
||||||
|
close++;
|
||||||
|
}
|
||||||
|
int len = close - start;
|
||||||
|
char* item = xMalloc(len + 1);
|
||||||
|
strncpy(item, line + start, len);
|
||||||
|
item[len] = '\0';
|
||||||
|
list[*size] = item;
|
||||||
|
(*size)++;
|
||||||
|
list = xRealloc(list, sizeof(char*) * (*size + 1));
|
||||||
|
start = close + 1;
|
||||||
|
}
|
||||||
|
list[*size] = NULL;
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void writeQuotedList(FILE* fd, char** list, int len) {
|
||||||
|
const char* sep = "";
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
fprintf(fd, "%s\"%s\"", sep, list[i]);
|
||||||
|
sep = " ";
|
||||||
|
}
|
||||||
|
fprintf(fd, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
void Settings_delete(Settings* this) {
|
void Settings_delete(Settings* this) {
|
||||||
free(this->filename);
|
free(this->filename);
|
||||||
free(this->fields);
|
free(this->fields);
|
||||||
|
@ -75,6 +125,7 @@ void Settings_delete(Settings* this) {
|
||||||
String_freeArray(this->columns[i].names);
|
String_freeArray(this->columns[i].names);
|
||||||
free(this->columns[i].modes);
|
free(this->columns[i].modes);
|
||||||
}
|
}
|
||||||
|
String_freeArray(this->screens);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +137,12 @@ static void Settings_readMeters(Settings* this, char* line, int column) {
|
||||||
this->columns[column].names = ids;
|
this->columns[column].names = ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Settings_readScreens(Settings* this, char* line) {
|
||||||
|
char* trim = String_trim(line);
|
||||||
|
this->screens = readQuotedList(trim, &(this->nScreens));
|
||||||
|
free(trim);
|
||||||
|
}
|
||||||
|
|
||||||
static void Settings_readMeterModes(Settings* this, char* line, int column) {
|
static void Settings_readMeterModes(Settings* this, char* line, int column) {
|
||||||
char* trim = String_trim(line);
|
char* trim = String_trim(line);
|
||||||
int nIds;
|
int nIds;
|
||||||
|
@ -143,6 +200,13 @@ static void Settings_defaultMeters(Settings* this) {
|
||||||
this->columns[1].modes[r++] = TEXT_METERMODE;
|
this->columns[1].modes[r++] = TEXT_METERMODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Settings_defaultScreens(Settings* this) {
|
||||||
|
this->screens = xMalloc(sizeof(char*) * 3);
|
||||||
|
this->screens[0] = xStrdup("Overview");
|
||||||
|
this->screens[1] = xStrdup("I/O");
|
||||||
|
this->screens[2] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void readFields(ProcessField* fields, int* flags, const char* line) {
|
static void readFields(ProcessField* fields, int* flags, const char* line) {
|
||||||
char* trim = String_trim(line);
|
char* trim = String_trim(line);
|
||||||
int nIds;
|
int nIds;
|
||||||
|
@ -242,10 +306,15 @@ static bool Settings_read(Settings* this, const char* fileName) {
|
||||||
} else if (String_eq(option[0], "right_meter_modes")) {
|
} else if (String_eq(option[0], "right_meter_modes")) {
|
||||||
Settings_readMeterModes(this, option[1], 1);
|
Settings_readMeterModes(this, option[1], 1);
|
||||||
readMeters = true;
|
readMeters = true;
|
||||||
|
} else if (String_eq(option[0], "screens")) {
|
||||||
|
Settings_readScreens(this, option[1]);
|
||||||
}
|
}
|
||||||
String_freeArray(option);
|
String_freeArray(option);
|
||||||
}
|
}
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
|
if (!this->screens) {
|
||||||
|
Settings_defaultScreens(this);
|
||||||
|
}
|
||||||
if (!readMeters) {
|
if (!readMeters) {
|
||||||
Settings_defaultMeters(this);
|
Settings_defaultMeters(this);
|
||||||
}
|
}
|
||||||
|
@ -264,12 +333,7 @@ static void writeFields(FILE* fd, ProcessField* fields, const char* name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeMeters(Settings* this, FILE* fd, int column) {
|
static void writeMeters(Settings* this, FILE* fd, int column) {
|
||||||
const char* sep = "";
|
writeList(fd, this->columns[column].names, this->columns[column].len);
|
||||||
for (int i = 0; i < this->columns[column].len; i++) {
|
|
||||||
fprintf(fd, "%s%s", sep, this->columns[column].names[i]);
|
|
||||||
sep = " ";
|
|
||||||
}
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeMeterModes(Settings* this, FILE* fd, int column) {
|
static void writeMeterModes(Settings* this, FILE* fd, int column) {
|
||||||
|
@ -318,6 +382,9 @@ bool Settings_write(Settings* this) {
|
||||||
fprintf(fd, "left_meter_modes="); writeMeterModes(this, fd, 0);
|
fprintf(fd, "left_meter_modes="); writeMeterModes(this, fd, 0);
|
||||||
fprintf(fd, "right_meters="); writeMeters(this, fd, 1);
|
fprintf(fd, "right_meters="); writeMeters(this, fd, 1);
|
||||||
fprintf(fd, "right_meter_modes="); writeMeterModes(this, fd, 1);
|
fprintf(fd, "right_meter_modes="); writeMeterModes(this, fd, 1);
|
||||||
|
if (this->nScreens > 0) {
|
||||||
|
fprintf(fd, "screens="); writeQuotedList(fd, this->screens, this->nScreens);
|
||||||
|
}
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -407,6 +474,7 @@ Settings* Settings_new(int cpuCount) {
|
||||||
free(systemSettings);
|
free(systemSettings);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
Settings_defaultMeters(this);
|
Settings_defaultMeters(this);
|
||||||
|
Settings_defaultScreens(this);
|
||||||
this->hideKernelThreads = true;
|
this->hideKernelThreads = true;
|
||||||
this->highlightMegabytes = true;
|
this->highlightMegabytes = true;
|
||||||
this->highlightThreads = true;
|
this->highlightThreads = true;
|
||||||
|
|
|
@ -25,6 +25,9 @@ typedef struct Settings_ {
|
||||||
|
|
||||||
MeterColumnSettings columns[2];
|
MeterColumnSettings columns[2];
|
||||||
|
|
||||||
|
char** screens;
|
||||||
|
int nScreens;
|
||||||
|
|
||||||
ProcessField* fields;
|
ProcessField* fields;
|
||||||
int flags;
|
int flags;
|
||||||
int colorScheme;
|
int colorScheme;
|
||||||
|
|
Loading…
Reference in New Issue