Commit a9c0ea37 authored by Hisham Muhammad's avatar Hisham Muhammad
Browse files

* Option for counting CPUs from zero

  (thanks to Sean Noonan)
* Meters update in every screen (no longer halting while on Setup, etc.)
parent b5619566
......@@ -3,6 +3,7 @@
#include "Panel.h"
#include "CheckItem.h"
#include "ProcessList.h"
#include "debug.h"
#include <assert.h>
......@@ -25,14 +26,14 @@ static HandlerResult AffinityPanel_eventHandler(Panel* this, int ch) {
return result;
}
Panel* AffinityPanel_new(int processorCount, unsigned long mask) {
Panel* AffinityPanel_new(ProcessList* pl, unsigned long mask) {
Panel* this = Panel_new(1, 1, 1, 1, CHECKITEM_CLASS, true, ListItem_compare);
this->eventHandler = AffinityPanel_eventHandler;
Panel_setHeader(this, "Use CPUs:");
for (int i = 0; i < processorCount; i++) {
for (int i = 0; i < pl->cpuCount; i++) {
char number[10];
snprintf(number, 9, "%d", i+1);
snprintf(number, 9, "%d", ProcessList_cpuId(pl, i) + 1);
Panel_add(this, (Object*) CheckItem_new(String_copy(number), NULL, mask & (1 << i)));
}
return this;
......
......@@ -6,11 +6,12 @@
#include "Panel.h"
#include "CheckItem.h"
#include "ProcessList.h"
#include "debug.h"
#include <assert.h>
Panel* AffinityPanel_new(int processorCount, unsigned long mask);
Panel* AffinityPanel_new(ProcessList* pl, unsigned long mask);
unsigned long AffinityPanel_getAffinity(Panel* this);
......
......@@ -33,7 +33,7 @@ static void CPUMeter_init(Meter* this) {
int cpu = this->param;
if (this->pl->cpuCount > 1) {
char caption[10];
sprintf(caption, "%-3d", cpu);
sprintf(caption, "%-3d ", ProcessList_cpuId(this->pl, cpu));
Meter_setCaption(this, caption);
}
if (this->param == 0)
......@@ -124,8 +124,8 @@ static void CPUMeter_display(Object* cast, RichString* out) {
static void AllCPUsMeter_init(Meter* this) {
int cpus = this->pl->cpuCount;
this->drawBuffer = malloc(sizeof(Meter*) * cpus);
Meter** meters = (Meter**) this->drawBuffer;
this->drawData = malloc(sizeof(Meter*) * cpus);
Meter** meters = (Meter**) this->drawData;
for (int i = 0; i < cpus; i++)
meters[i] = Meter_new(this->pl, i+1, &CPUMeter);
this->h = cpus;
......@@ -134,7 +134,7 @@ static void AllCPUsMeter_init(Meter* this) {
static void AllCPUsMeter_done(Meter* this) {
int cpus = this->pl->cpuCount;
Meter** meters = (Meter**) this->drawBuffer;
Meter** meters = (Meter**) this->drawData;
for (int i = 0; i < cpus; i++)
Meter_delete((Object*)meters[i]);
}
......@@ -148,7 +148,7 @@ static void AllCPUsMeter_setMode(Meter* this, int mode) {
static void AllCPUsMeter_draw(Meter* this, int x, int y, int w) {
int cpus = this->pl->cpuCount;
Meter** meters = (Meter**) this->drawBuffer;
Meter** meters = (Meter**) this->drawData;
for (int i = 0; i < cpus; i++) {
Meter_setMode(meters[i], this->mode);
meters[i]->draw(meters[i], x, y, w);
......
What's new in version 0.9.1
* Option for counting CPUs from zero
(thanks to Sean Noonan)
* Meters update in every screen (no longer halting while on Setup, etc.)
What's new in version 0.9
* Add support for "steal"/guest CPU time measurement
......
......@@ -90,7 +90,7 @@ void* DebugMemory_realloc(void* ptr, int size, char* file, int line, char* str)
return data;
}
void* DebugMemory_strdup(char* str, char* file, int line) {
void* DebugMemory_strdup(const char* str, char* file, int line) {
assert(str);
char* data = strdup(str);
DebugMemory_registerAllocation(data, file, line);
......@@ -102,7 +102,7 @@ void* DebugMemory_strdup(char* str, char* file, int line) {
}
void DebugMemory_free(void* data, char* file, int line) {
assert(data);
if (!data) return;
DebugMemory_registerDeallocation(data, file, line);
if (singleton->file) {
if (singleton->totals) fprintf(singleton->file, "%d\t", singleton->size);
......
......@@ -48,7 +48,7 @@ void* DebugMemory_calloc(int a, int b, char* file, int line);
void* DebugMemory_realloc(void* ptr, int size, char* file, int line, char* str);
void* DebugMemory_strdup(char* str, char* file, int line);
void* DebugMemory_strdup(const char* str, char* file, int line);
void DebugMemory_free(void* data, char* file, int line);
......
......@@ -47,6 +47,7 @@ static HandlerResult DisplayOptionsPanel_eventHandler(Panel* super, int ch) {
this->settings->changed = true;
Header* header = this->settings->header;
Header_calculateHeight(header);
Header_reinit(header);
Header_draw(header);
ScreenManager_resize(this->scr, this->scr->x1, header->height, this->scr->x2, this->scr->y2);
}
......@@ -74,5 +75,6 @@ DisplayOptionsPanel* DisplayOptionsPanel_new(Settings* settings, ScreenManager*
Panel_add(super, (Object*) CheckItem_new(String_copy("Highlight large numbers in memory counters"), &(settings->pl->highlightMegabytes), false));
Panel_add(super, (Object*) CheckItem_new(String_copy("Leave a margin around header"), &(settings->header->margin), false));
Panel_add(super, (Object*) CheckItem_new(String_copy("Detailed CPU time (System/IO-Wait/Hard-IRQ/Soft-IRQ/Steal/Guest)"), &(settings->pl->detailedCPUTime), false));
Panel_add(super, (Object*) CheckItem_new(String_copy("Count CPUs from 0 instead of 1"), &(settings->pl->countCPUsFromZero), false));
return this;
}
......@@ -95,11 +95,11 @@ void FunctionBar_setLabel(FunctionBar* this, int event, const char* text) {
}
}
void FunctionBar_draw(FunctionBar* this, char* buffer) {
void FunctionBar_draw(const FunctionBar* this, char* buffer) {
FunctionBar_drawAttr(this, buffer, CRT_colors[FUNCTION_BAR]);
}
void FunctionBar_drawAttr(FunctionBar* this, char* buffer, int attr) {
void FunctionBar_drawAttr(const FunctionBar* this, char* buffer, int attr) {
attrset(CRT_colors[FUNCTION_BAR]);
mvhline(LINES-1, 0, ' ', COLS);
int x = 0;
......@@ -118,7 +118,7 @@ void FunctionBar_drawAttr(FunctionBar* this, char* buffer, int attr) {
attrset(CRT_colors[RESET_COLOR]);
}
int FunctionBar_synthesizeEvent(FunctionBar* this, int pos) {
int FunctionBar_synthesizeEvent(const FunctionBar* this, int pos) {
int x = 0;
for (int i = 0; i < this->size; i++) {
x += strlen(this->keys[i]);
......
......@@ -43,10 +43,10 @@ void FunctionBar_delete(Object* cast);
void FunctionBar_setLabel(FunctionBar* this, int event, const char* text);
void FunctionBar_draw(FunctionBar* this, char* buffer);
void FunctionBar_draw(const FunctionBar* this, char* buffer);
void FunctionBar_drawAttr(FunctionBar* this, char* buffer, int attr);
void FunctionBar_drawAttr(const FunctionBar* this, char* buffer, int attr);
int FunctionBar_synthesizeEvent(FunctionBar* this, int pos);
int FunctionBar_synthesizeEvent(const FunctionBar* this, int pos);
#endif
......@@ -10,6 +10,7 @@ in the source distribution for its full text.
#include "debug.h"
#include <assert.h>
#include <time.h>
/*{
......@@ -34,7 +35,7 @@ typedef struct Header_ {
#endif
Header* Header_new(ProcessList* pl) {
Header* this = malloc(sizeof(Header));
Header* this = calloc(sizeof(Header), 1);
this->leftMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
this->rightMeters = Vector_new(METER_CLASS, true, DEFAULT_SIZE, NULL);
this->margin = true;
......@@ -132,7 +133,18 @@ void Header_defaultMeters(Header* this) {
Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter));
}
void Header_draw(Header* this) {
void Header_reinit(Header* this) {
for (int i = 0; i < Vector_size(this->leftMeters); i++) {
Meter* meter = (Meter*) Vector_get(this->leftMeters, i);
meter->type->init(meter);
}
for (int i = 0; i < Vector_size(this->rightMeters); i++) {
Meter* meter = (Meter*) Vector_get(this->rightMeters, i);
meter->type->init(meter);
}
}
void Header_draw(const Header* this) {
int height = this->height;
int pad = this->pad;
......
......@@ -13,6 +13,7 @@ in the source distribution for its full text.
#include "debug.h"
#include <assert.h>
#include <time.h>
typedef enum HeaderSide_ {
......@@ -52,7 +53,9 @@ MeterModeId Header_readMeterMode(Header* this, int i, HeaderSide side);
void Header_defaultMeters(Header* this);
void Header_draw(Header* this);
void Header_reinit(Header* this);
void Header_draw(const Header* this);
int Header_calculateHeight(Header* this);
......
......@@ -23,6 +23,7 @@ in the source distribution for its full text.
#include <assert.h>
#ifndef USE_FUNKY_MODES
#include <time.h>
#define USE_FUNKY_MODES 1
#endif
......@@ -69,13 +70,20 @@ struct Meter_ {
int mode;
int param;
Meter_Draw draw;
void* drawBuffer;
void* drawData;
int h;
ProcessList* pl;
double* values;
double total;
};
#ifdef USE_FUNKY_MODES
typedef struct GraphData_ {
time_t time;
double values[METER_BUFFER_LEN];
} GraphData;
#endif
typedef enum {
CUSTOM_METERMODE = 0,
BAR_METERMODE,
......@@ -152,8 +160,8 @@ void Meter_delete(Object* cast) {
if (this->type->done) {
this->type->done(this);
}
if (this->drawBuffer)
free(this->drawBuffer);
if (this->drawData)
free(this->drawData);
free(this->caption);
free(this->values);
free(this);
......@@ -186,9 +194,9 @@ void Meter_setMode(Meter* this, int modeIndex) {
this->type->setMode(this, modeIndex);
} else {
assert(modeIndex >= 1);
if (this->drawBuffer)
free(this->drawBuffer);
this->drawBuffer = NULL;
if (this->drawData)
free(this->drawData);
this->drawData = NULL;
MeterMode* mode = Meter_modes[modeIndex];
this->draw = mode->draw;
......@@ -328,23 +336,30 @@ static const char* GraphMeterMode_characters = "^`'-.,_~'`-.,_~'`-.,_";
static void GraphMeterMode_draw(Meter* this, int x, int y, int w) {
if (!this->drawBuffer) this->drawBuffer = calloc(sizeof(double), METER_BUFFER_LEN);
double* drawBuffer = (double*) this->drawBuffer;
for (int i = 0; i < METER_BUFFER_LEN - 1; i++)
drawBuffer[i] = drawBuffer[i+1];
MeterType* type = this->type;
char buffer[METER_BUFFER_LEN];
type->setValues(this, buffer, METER_BUFFER_LEN - 1);
if (!this->drawData) this->drawData = calloc(sizeof(GraphData), 1);
GraphData* data = (GraphData*) this->drawData;
const int nValues = METER_BUFFER_LEN;
time_t now = time(NULL);
if (now > data->time) {
data->time = now;
double value = 0.0;
for (int i = 0; i < type->items; i++)
value += this->values[i];
value /= this->total;
drawBuffer[METER_BUFFER_LEN - 1] = value;
for (int i = METER_BUFFER_LEN - w, k = 0; i < METER_BUFFER_LEN; i++, k++) {
value = drawBuffer[i];
for (int i = 0; i < nValues - 1; i++)
data->values[i] = data->values[i+1];
MeterType* type = this->type;
char buffer[nValues];
type->setValues(this, buffer, nValues - 1);
double value = 0.0;
for (int i = 0; i < type->items; i++)
value += this->values[i];
value /= this->total;
data->values[nValues - 1] = value;
}
for (int i = nValues - w, k = 0; i < nValues; i++, k++) {
double value = data->values[i];
DrawDot( CRT_colors[DEFAULT_COLOR], y, ' ' );
DrawDot( CRT_colors[DEFAULT_COLOR], y+1, ' ' );
DrawDot( CRT_colors[DEFAULT_COLOR], y+2, ' ' );
......
......@@ -26,6 +26,7 @@ in the source distribution for its full text.
#include <assert.h>
#ifndef USE_FUNKY_MODES
#include <time.h>
#define USE_FUNKY_MODES 1
#endif
......@@ -71,13 +72,20 @@ struct Meter_ {
int mode;
int param;
Meter_Draw draw;
void* drawBuffer;
void* drawData;
int h;
ProcessList* pl;
double* values;
double total;
};
#ifdef USE_FUNKY_MODES
typedef struct GraphData_ {
time_t time;
double values[METER_BUFFER_LEN];
} GraphData;
#endif
typedef enum {
CUSTOM_METERMODE = 0,
BAR_METERMODE,
......
......@@ -332,7 +332,7 @@ static void Process_writeField(Process* this, RichString* str, ProcessField fiel
case TTY_NR: snprintf(buffer, n, "%5u ", this->tty_nr); break;
case TGID: snprintf(buffer, n, "%5u ", this->tgid); break;
case TPGID: snprintf(buffer, n, "%5d ", this->tpgid); break;
case PROCESSOR: snprintf(buffer, n, "%3d ", this->processor+1); break;
case PROCESSOR: snprintf(buffer, n, "%3d ", ProcessList_cpuId(this->pl, this->processor)); break;
case NLWP: snprintf(buffer, n, "%4ld ", this->nlwp); break;
case COMM: {
if (this->pl->highlightThreads && Process_isThread(this)) {
......@@ -471,7 +471,7 @@ static void Process_display(Object* cast, RichString* out) {
RichString_setAttr(out, CRT_colors[PROCESS_SHADOW]);
if (this->tag == true)
RichString_setAttr(out, CRT_colors[PROCESS_TAG]);
assert(out->len > 0);
assert(out->chlen > 0);
}
void Process_delete(Object* cast) {
......
......@@ -54,6 +54,9 @@ in the source distribution for its full text.
#define MAX_READ 2048
#endif
#ifndef ProcessList_cpuId
#define ProcessList_cpuId(pl, cpu) ((pl)->countCPUsFromZero ? (cpu)-1 : (cpu))
#endif
}*/
/*{
......@@ -124,6 +127,7 @@ typedef struct ProcessList_ {
bool highlightMegabytes;
bool highlightThreads;
bool detailedCPUTime;
bool countCPUsFromZero;
} ProcessList;
}*/
......@@ -132,7 +136,7 @@ static ProcessField defaultHeaders[] = { PID, USER, PRIORITY, NICE, M_SIZE, M_RE
ProcessList* ProcessList_new(UsersTable* usersTable) {
ProcessList* this;
this = malloc(sizeof(ProcessList));
this = calloc(sizeof(ProcessList), 1);
this->processes = Vector_new(PROCESS_CLASS, true, DEFAULT_SIZE, Process_compare);
this->processTable = Hashtable_new(70, false);
assert(Hashtable_count(this->processTable) == Vector_count(this->processes));
......@@ -177,6 +181,7 @@ ProcessList* ProcessList_new(UsersTable* usersTable) {
this->highlightBaseName = false;
this->highlightMegabytes = false;
this->detailedCPUTime = false;
this->countCPUsFromZero = false;
return this;
}
......
......@@ -56,6 +56,9 @@ in the source distribution for its full text.
#define MAX_READ 2048
#endif
#ifndef ProcessList_cpuId
#define ProcessList_cpuId(pl, cpu) ((pl)->countCPUsFromZero ? (cpu)-1 : (cpu))
#endif
typedef struct CPUData_ {
......@@ -124,6 +127,7 @@ typedef struct ProcessList_ {
bool highlightMegabytes;
bool highlightThreads;
bool detailedCPUTime;
bool countCPUsFromZero;
} ProcessList;
......
......@@ -9,10 +9,12 @@ in the source distribution for its full text.
#include "Panel.h"
#include "Object.h"
#include "Vector.h"
#include "Header.h"
#include "FunctionBar.h"
#include "debug.h"
#include <assert.h>
#include <time.h>
#include <stdbool.h>
......@@ -32,13 +34,15 @@ typedef struct ScreenManager_ {
Vector* items;
Vector* fuBars;
int itemCount;
FunctionBar* fuBar;
const FunctionBar* fuBar;
const Header* header;
time_t lastScan;
bool owner;
} ScreenManager;
}*/
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, bool owner) {
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, const Header* header, bool owner) {
ScreenManager* this;
this = malloc(sizeof(ScreenManager));
this->x1 = x1;
......@@ -50,6 +54,7 @@ ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation ori
this->items = Vector_new(PANEL_CLASS, owner, DEFAULT_SIZE, NULL);
this->fuBars = Vector_new(FUNCTIONBAR_CLASS, true, DEFAULT_SIZE, NULL);
this->itemCount = 0;
this->header = header;
this->owner = owner;
return this;
}
......@@ -119,14 +124,24 @@ void ScreenManager_resize(ScreenManager* this, int x1, int y1, int x2, int y2) {
void ScreenManager_run(ScreenManager* this, Panel** lastFocus, int* lastKey) {
bool quit = false;
int focus = 0;
Panel* panelFocus = (Panel*) Vector_get(this->items, focus);
if (this->fuBar)
FunctionBar_draw(this->fuBar, NULL);
this->lastScan = 0;
int ch = 0;
while (!quit) {
int items = this->itemCount;
if (this->header) {
time_t now = time(NULL);
if (now > this->lastScan) {
ProcessList_scan(this->header->pl);
this->lastScan = now;
}
Header_draw(this->header);
}
for (int i = 0; i < items; i++) {
Panel* panel = (Panel*) Vector_get(this->items, i);
Panel_draw(panel, i == focus);
......
......@@ -12,10 +12,12 @@ in the source distribution for its full text.
#include "Panel.h"
#include "Object.h"
#include "Vector.h"
#include "Header.h"
#include "FunctionBar.h"
#include "debug.h"
#include <assert.h>
#include <time.h>
#include <stdbool.h>
......@@ -34,12 +36,14 @@ typedef struct ScreenManager_ {
Vector* items;
Vector* fuBars;
int itemCount;
FunctionBar* fuBar;
const FunctionBar* fuBar;
const Header* header;
time_t lastScan;
bool owner;
} ScreenManager;
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, bool owner);
ScreenManager* ScreenManager_new(int x1, int y1, int x2, int y2, Orientation orientation, const Header* header, bool owner);
void ScreenManager_delete(ScreenManager* this);
......
......@@ -113,6 +113,8 @@ static bool Settings_read(Settings* this, char* fileName) {
this->pl->detailedCPUTime = atoi(option[1]);
} else if (String_eq(option[0], "detailed_cpu_time")) {
this->pl->detailedCPUTime = atoi(option[1]);
} else if (String_eq(option[0], "cpu_count_from_zero")) {
this->pl->countCPUsFromZero = atoi(option[1]);
} else if (String_eq(option[0], "delay")) {
this->delay = atoi(option[1]);
} else if (String_eq(option[0], "color_scheme")) {
......@@ -172,6 +174,7 @@ bool Settings_write(Settings* this) {
fprintf(fd, "tree_view=%d\n", (int) this->pl->treeView);
fprintf(fd, "header_margin=%d\n", (int) this->header->margin);
fprintf(fd, "detailed_cpu_time=%d\n", (int) this->pl->detailedCPUTime);
fprintf(fd, "cpu_count_from_zero=%d\n", (int) this->pl->countCPUsFromZero);
fprintf(fd, "color_scheme=%d\n", (int) this->colorScheme);
fprintf(fd, "delay=%d\n", (int) this->delay);
fprintf(fd, "left_meters=");
......
......@@ -164,8 +164,8 @@ static void showHelp(ProcessList* pl) {
static const char* CategoriesFunctions[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", "Done ", NULL};
static void Setup_run(Settings* settings, int headerHeight) {
ScreenManager* scr = ScreenManager_new(0, headerHeight, 0, -1, HORIZONTAL, true);
static void Setup_run(Settings* settings, const Header* header) {
ScreenManager* scr = ScreenManager_new(0, header->height, 0, -1, HORIZONTAL, header, true);
CategoriesPanel* panelCategories = CategoriesPanel_new(settings, scr);
ScreenManager_add(scr, (Panel*) panelCategories, FunctionBar_new(CategoriesFunctions, NULL, NULL), 16);
CategoriesPanel_makeMetersPage(panelCategories);
......@@ -201,12 +201,12 @@ static HandlerResult pickWithEnter(Panel* panel, int ch) {
return IGNORED;
}
static Object* pickFromVector(Panel* panel, Panel* list, int x, int y, const char** keyLabels, FunctionBar* prevBar) {
static Object* pickFromVector(Panel* panel, Panel* list, int x, int y, const char** keyLabels, FunctionBar* prevBar, Header* header) {
const char* fuKeys[] = {"Enter", "Esc", NULL};
int fuEvents[] = {13, 27};
if (!list->eventHandler)
Panel_setEventHandler(list, pickWithEnter);
ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, false);
ScreenManager* scr = ScreenManager_new(0, y, 0, -1, HORIZONTAL, header, false);
ScreenManager_add(scr, list, FunctionBar_new(keyLabels, fuKeys, fuEvents), x - 1);
ScreenManager_add(scr, panel, NULL, -1);
Panel* panelFocus;
......@@ -376,7 +376,7 @@ int main(int argc, char** argv) {
double oldTime = 0.0;
bool recalculate;
int ch = 0;
int ch = ERR;
int closeTimeout = 0;
while (!quit) {
......@@ -606,7 +606,7 @@ int main(int argc, char** argv) {
case 'C':
case KEY_F(2):
{
Setup_run(settings, headerHeight);
Setup_run(settings, header);
// TODO: shouldn't need this, colors should be dynamic
ProcessList_printHeader(pl, Panel_getHeader(panel));
headerHeight = Header_calculateHeight(header);
......@@ -630,7 +630,7 @@ int main(int argc, char** argv) {
ListItem* allUsers = ListItem_new("All users", -1);
Panel_insert(usersPanel, 0, (Object*) allUsers);
const char* fuFunctions[] = {"Show ", "Cancel ", NULL};
ListItem* picked = (ListItem*) pickFromVector(panel, usersPanel, 20, headerHeight, fuFunctions, defaultBar);
ListItem* picked = (ListItem*) pickFromVector(panel, usersPanel, 20, headerHeight, fuFunctions, defaultBar, header);
if (picked) {
if (picked == allUsers) {
userOnly = false;
......@@ -659,7 +659,7 @@ int main(int argc, char** argv) {
}
SignalsPanel_reset((SignalsPanel*) killPanel);
const char* fuFunctions[] = {"Send ", "Cancel ", NULL};
Signal* sgn = (Signal*) pickFromVector(panel, killPanel, 15, headerHeight, fuFunctions, defaultBar);
Signal* sgn = (Signal*) pickFromVector(panel, killPanel, 15, headerHeight, fuFunctions, defaultBar, header);
if (sgn) {
if (sgn->number != 0) {
Panel_setHeader(panel, "Sending...");
......@@ -692,10 +692,10 @@ int main(int argc, char** argv) {
unsigned long curr = Process_getAffinity((Process*) Panel_getSelected(panel));
Panel* affinityPanel = AffinityPanel_new(pl->cpuCount, curr);
Panel* affinityPanel = AffinityPanel_new(pl, curr);
const char* fuFunctions[] = {"Set ", "Cancel ", NULL};
void* set = pickFromVector(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar);
void* set = pickFromVector(panel, affinityPanel, 15, headerHeight, fuFunctions, defaultBar, header);
if (set) {
unsigned long new = AffinityPanel_getAffinity(affinityPanel);
bool anyTagged = false;
......@@ -742,7 +742,7 @@ int main(int argc, char** argv) {
Panel_setSelected(sortPanel, i);
free(name);
}
ListItem* field = (ListItem*) pickFromVector(panel, sortPanel, 15, headerHeight, fuFunctions, defaultBar);
ListItem* field = (ListItem*) pickFromVector(panel, sortPanel, 15, headerHeight, fuFunctions, defaultBar, header);
if (field) {
settings->changed = true;
setSortKey(pl, field->key, panel, settings);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment