mirror of
https://github.com/TTimo/GtkRadiant.git
synced 2025-01-24 18:31:36 +00:00
use XDG_STATE_HOME if set for g_strTempPath (.pid file, radiant.log etc.), and related cleanups
This commit is contained in:
parent
1fe273a212
commit
d97f00e0e9
4 changed files with 24 additions and 120 deletions
136
radiant/main.cpp
136
radiant/main.cpp
|
@ -120,39 +120,10 @@ static void create_splash() {
|
|||
|
||||
#if defined( __linux__ ) || defined( __FreeBSD__ ) || defined( __APPLE__ )
|
||||
|
||||
/* A short game name, could be used as argv[0] */
|
||||
static char game_name[100] = "";
|
||||
|
||||
/* The directory where the data files can be found (run directory) */
|
||||
static char datapath[PATH_MAX];
|
||||
|
||||
char *loki_gethomedir( void ){
|
||||
char *home = NULL;
|
||||
|
||||
home = getenv( "HOME" );
|
||||
if ( home == NULL ) {
|
||||
uid_t id = getuid();
|
||||
struct passwd *pwd;
|
||||
|
||||
setpwent();
|
||||
while ( ( pwd = getpwent() ) != NULL )
|
||||
{
|
||||
if ( pwd->pw_uid == id ) {
|
||||
home = pwd->pw_dir;
|
||||
break;
|
||||
}
|
||||
}
|
||||
endpwent();
|
||||
}
|
||||
return home;
|
||||
}
|
||||
|
||||
/* Must be called BEFORE loki_initialize */
|
||||
void loki_setgamename( const char *n ){
|
||||
strncpy( game_name, n, sizeof( game_name ) );
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
#ifdef __linux__
|
||||
/* Code to determine the mount point of a CD-ROM */
|
||||
int loki_getmountpoint( const char *device, char *mntpt, int max_size ){
|
||||
char devpath[PATH_MAX], mntdevpath[PATH_MAX];
|
||||
|
@ -209,86 +180,32 @@ int loki_getmountpoint( const char *device, char *mntpt, int max_size ){
|
|||
}
|
||||
return( mounted );
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
This function gets the directory containing the running program.
|
||||
argv0 - the 0'th argument to the program
|
||||
*/
|
||||
// FIXME TTimo
|
||||
// I don't understand this function. It looks like something cut from another piece of software
|
||||
// we somehow get the g_strAppPath from it, but it's done through a weird scan across $PATH env. var.
|
||||
// even worse, it doesn't behave the same in all cases .. works well when ran through gdb and borks when ran from a shell
|
||||
void loki_initpaths( char *argv0 ){
|
||||
char temppath[PATH_MAX]; //, env[100];
|
||||
char *home; //, *ptr, *data_env;
|
||||
char* loki_init_datapath( char *argv0 ){
|
||||
char temppath[PATH_MAX];
|
||||
char *home;
|
||||
|
||||
home = loki_gethomedir();
|
||||
home = g_get_home_dir();
|
||||
if ( home == NULL ) {
|
||||
home = const_cast<char*>(".");
|
||||
}
|
||||
|
||||
if ( *game_name == 0 ) { /* Game name defaults to argv[0] */
|
||||
loki_setgamename( argv0 );
|
||||
}
|
||||
|
||||
strcpy( temppath, argv0 ); /* If this overflows, it's your own fault :) */
|
||||
if ( !strrchr( temppath, '/' ) ) {
|
||||
char *path;
|
||||
char *last;
|
||||
int found;
|
||||
|
||||
found = 0;
|
||||
path = getenv( "PATH" );
|
||||
do
|
||||
{
|
||||
/* Initialize our filename variable */
|
||||
temppath[0] = '\0';
|
||||
|
||||
/* Get next entry from path variable */
|
||||
last = strchr( path, ':' );
|
||||
if ( !last ) {
|
||||
last = path + strlen( path );
|
||||
}
|
||||
|
||||
/* Perform tilde expansion */
|
||||
if ( *path == '~' ) {
|
||||
strcpy( temppath, home );
|
||||
++path;
|
||||
}
|
||||
|
||||
/* Fill in the rest of the filename */
|
||||
if ( last > ( path + 1 ) ) {
|
||||
strncat( temppath, path, ( last - path ) );
|
||||
strcat( temppath, "/" );
|
||||
}
|
||||
strcat( temppath, "./" );
|
||||
strcat( temppath, argv0 );
|
||||
|
||||
/* See if it exists, and update path */
|
||||
if ( access( temppath, X_OK ) == 0 ) {
|
||||
++found;
|
||||
}
|
||||
path = last + 1;
|
||||
|
||||
} while ( *last && !found );
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Increment argv0 to the basename */
|
||||
argv0 = strrchr( argv0, '/' ) + 1;
|
||||
}
|
||||
strcpy( temppath, argv0 );
|
||||
|
||||
/* Now canonicalize it to a full pathname for the data path */
|
||||
if ( realpath( temppath, datapath ) ) {
|
||||
/* There should always be '/' in the path */
|
||||
*( strrchr( datapath, '/' ) ) = '\0';
|
||||
/* There should always be '/' in the path, cut after so we end our directories with a slash */
|
||||
*( strrchr( datapath, '/' ) + 1 ) = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
char *loki_getdatapath( void ){
|
||||
return( datapath );
|
||||
char *loki_get_datapath( void ){
|
||||
return datapath;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -581,27 +498,20 @@ int mainRadiant( int argc, char* argv[] ) {
|
|||
#endif
|
||||
|
||||
#if defined( __linux__ ) || defined( __FreeBSD__ ) || defined( __APPLE__ )
|
||||
Str home;
|
||||
home = g_get_home_dir();
|
||||
AddSlash( home );
|
||||
home += ".radiant/";
|
||||
Q_mkdir( home.GetBuffer(), 0775 );
|
||||
home += RADIANT_VERSION;
|
||||
Q_mkdir( home.GetBuffer(), 0775 );
|
||||
g_strTempPath = home.GetBuffer();
|
||||
const char *xdg_state_home = getenv( "XDG_STATE_HOME" );
|
||||
if ( xdg_state_home != nullptr ) {
|
||||
g_strTempPath = xdg_state_home;
|
||||
} else {
|
||||
g_strTempPath = g_get_home_dir();
|
||||
}
|
||||
g_strTempPath += "/.radiant/";
|
||||
Q_mkdir( g_strTempPath.GetBuffer(), 0775 );
|
||||
g_strTempPath += RADIANT_VERSION;
|
||||
Q_mkdir( g_strTempPath.GetBuffer(), 0775 );
|
||||
AddSlash( g_strTempPath );
|
||||
|
||||
loki_initpaths( argv[0] );
|
||||
|
||||
// NOTE: we build g_strAppPath with a '/' (or '\' on WIN32)
|
||||
// it's a general convention in Radiant to have the slash at the end of directories
|
||||
char real[PATH_MAX];
|
||||
realpath( loki_getdatapath(), real );
|
||||
if ( real[strlen( real ) - 1] != '/' ) {
|
||||
strcat( real, "/" );
|
||||
}
|
||||
|
||||
g_strAppPath = real;
|
||||
loki_init_datapath( argv[0] );
|
||||
g_strAppPath = loki_get_datapath();
|
||||
|
||||
// radiant is installed in the parent dir of "tools/"
|
||||
// NOTE: this is not very easy for debugging
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
#endif
|
||||
|
||||
// globals
|
||||
CString g_strAppPath; ///< holds the full path of the executable
|
||||
CString g_strAppPath; ///< holds the full path of the executable - readonly! (in flatpak at least)
|
||||
CString g_strDTDPath; ///< path to the DTD files
|
||||
CString g_pidFile; ///< the global .pid file (only for global part of the startup)
|
||||
CString g_pidGameFile; ///< the game-specific .pid file
|
||||
|
|
|
@ -1922,10 +1922,6 @@ XVisualInfo* QEX_ChooseVisual( bool zbuffer ){
|
|||
|
||||
#endif
|
||||
|
||||
/*!
|
||||
\todo FIXME TTimo broken most likely
|
||||
actually .. that's not enough, you have to go down for the game pack specific?
|
||||
*/
|
||||
const char* WINAPI QERApp_ProfileGetDirectory(){
|
||||
return g_strTempPath;
|
||||
}
|
||||
|
|
|
@ -1271,8 +1271,6 @@ CGameDescription* CGameDialog::GameDescriptionForComboItem(){
|
|||
|
||||
void CGameDialog::InitGlobalPrefPath(){
|
||||
GString *global_rc_path;
|
||||
// configure m_global_rc_path
|
||||
// this is the g_strTempPath, and it has already been mkdir'ed
|
||||
global_rc_path = g_string_new( g_strTempPath.GetBuffer() );
|
||||
g_PrefsDlg.m_global_rc_path = global_rc_path;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue