Move .htoprc to XDG-compliant path ~/.config/htop/htoprc,

respecting $XDG_CONFIG_HOME 
(thanks to Hadzhimurad Ustarkhan for the suggestion.)
This commit is contained in:
Hisham Muhammad 2011-12-25 20:22:41 +00:00
parent 5b0b2255ef
commit 93233a67ea
1 changed files with 42 additions and 18 deletions

View File

@ -5,6 +5,7 @@ Released under the GNU GPL, see the COPYING file
in the source distribution for its full text.
*/
#include "config.h"
#include "Settings.h"
#include "String.h"
#include "ProcessList.h"
@ -56,13 +57,10 @@ static void Settings_readMeterModes(Settings* this, char* line, HeaderSide side)
}
static bool Settings_read(Settings* this, char* fileName, int cpuCount) {
// TODO: implement File object and make
// file I/O object-oriented.
FILE* fd;
fd = fopen(fileName, "r");
if (fd == NULL) {
FILE* fd = fopen(fileName, "r");
if (!fd)
return false;
}
const int maxLine = 2048;
char buffer[maxLine];
bool readMeters = false;
@ -212,21 +210,47 @@ Settings* Settings_new(ProcessList* pl, Header* header, int cpuCount) {
Settings* this = malloc(sizeof(Settings));
this->pl = pl;
this->header = header;
const char* home;
char* rcfile;
home = getenv("HOME_ETC");
if (!home) home = getenv("HOME");
char* legacyDotfile = NULL;
char* rcfile = getenv("HTOPRC");
if (rcfile) {
this->userSettings = strdup(rcfile);
} else {
const char* home = getenv("HOME");
if (!home) home = "";
rcfile = getenv("HTOPRC");
if (!rcfile)
this->userSettings = String_cat(home, "/.htoprc");
else
this->userSettings = String_copy(rcfile);
const char* xdgConfigHome = getenv("XDG_CONFIG_HOME");
char* configDir = NULL;
char* htopDir = NULL;
if (xdgConfigHome) {
this->userSettings = String_cat(xdgConfigHome, "/htop/htoprc");
configDir = strdup(xdgConfigHome);
htopDir = String_cat(xdgConfigHome, "/htop");
} else {
this->userSettings = String_cat(home, "/.config/htop/htoprc");
configDir = String_cat(home, "/.config");
htopDir = String_cat(home, "/.config/htop");
}
legacyDotfile = String_cat(home, "/.htoprc");
mkdir(configDir, 0700);
mkdir(htopDir, 0700);
free(htopDir);
free(configDir);
if (access(legacyDotfile, R_OK) != 0) {
free(legacyDotfile);
legacyDotfile = NULL;
}
}
this->colorScheme = 0;
this->changed = false;
this->delay = DEFAULT_DELAY;
bool ok = Settings_read(this, this->userSettings, cpuCount);
if (!ok) {
bool ok = Settings_read(this, legacyDotfile ? legacyDotfile : this->userSettings, cpuCount);
if (ok) {
if (legacyDotfile) {
// Transition to new location and delete old configuration file
if (Settings_write(this))
unlink(legacyDotfile);
free(legacyDotfile);
}
} else {
this->changed = true;
// TODO: how to get SYSCONFDIR correctly through Autoconf?
char* systemSettings = String_cat(SYSCONFDIR, "/htoprc");