X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fmainframe.cpp;h=546ba9d7a772d8df5965d4a74d37b3628d3beeb6;hb=8dcd2d22e6e48f0390b749b00172ddd0437b76e8;hp=1555fa829b4ca3c7b56d56ba40aeec54d5208d5e;hpb=babc991433a25ec5304a20e74c4acc65df2cebe4;p=xonotic%2Fnetradiant.git diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 1555fa82..546ba9d7 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -184,22 +184,88 @@ void VFS_Destroy() // Home Paths +#ifdef WIN32 +#include +#include +const GUID qFOLDERID_SavedGames = {0x4C5C32FF, 0xBB9D, 0x43b0, {0xB5, 0xB4, 0x2D, 0x72, 0xE5, 0x4E, 0xAA, 0xA4}}; +#define qREFKNOWNFOLDERID GUID +#define qKF_FLAG_CREATE 0x8000 +#define qKF_FLAG_NO_ALIAS 0x1000 +typedef HRESULT (WINAPI qSHGetKnownFolderPath_t) (qREFKNOWNFOLDERID rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath); +static qSHGetKnownFolderPath_t *qSHGetKnownFolderPath; +#endif void HomePaths_Realise() { -#if defined(POSIX) - const char* prefix = g_pGameDescription->getKeyValue("prefix"); - if(!string_empty(prefix)) + do { - StringOutputStream path(256); - path << DirectoryCleaned(g_get_home_dir()) << prefix << "/"; - g_qeglobals.m_userEnginePath = path.c_str(); - Q_mkdir(g_qeglobals.m_userEnginePath.c_str()); - } - else + const char* prefix = g_pGameDescription->getKeyValue("prefix"); + if(!string_empty(prefix)) + { + StringOutputStream path(256); + +#if defined(__APPLE__) + path.clear(); + path << DirectoryCleaned(g_get_home_dir()) << "Library/Application Support" << (prefix+1) << "/"; + if(file_is_directory(path.c_str())) + { + g_qeglobals.m_userEnginePath = path.c_str(); + break; + } #endif - { + +#if defined(WIN32) + TCHAR mydocsdir[MAX_PATH + 1]; + wchar_t *mydocsdirw; + HMODULE shfolder = LoadLibrary("shfolder.dll"); + if(shfolder) + qSHGetKnownFolderPath = (qSHGetKnownFolderPath_t *) GetProcAddress(shfolder, "SHGetKnownFolderPath"); + else + qSHGetKnownFolderPath = NULL; + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + if(qSHGetKnownFolderPath && qSHGetKnownFolderPath(qFOLDERID_SavedGames, qKF_FLAG_CREATE | qKF_FLAG_NO_ALIAS, NULL, &mydocsdirw) == S_OK) + { + memset(mydocsdir, 0, sizeof(mydocsdir)); + wcstombs(mydocsdir, mydocsdirw, sizeof(mydocsdir)-1); + CoTaskMemFree(mydocsdirw); + path.clear(); + path << DirectoryCleaned(mydocsdir) << (prefix+1) << "/"; + if(file_is_directory(path.c_str())) + { + g_qeglobals.m_userEnginePath = path.c_str(); + CoUninitialize(); + FreeLibrary(shfolder); + break; + } + } + CoUninitialize(); + if(shfolder) + FreeLibrary(shfolder); + if(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocsdir)) + { + path.clear(); + path << DirectoryCleaned(mydocsdir) << "My Games/" << (prefix+1) << "/"; + // win32: only add it if it already exists + if(file_is_directory(path.c_str())) + { + g_qeglobals.m_userEnginePath = path.c_str(); + break; + } + } +#endif + +#if defined(POSIX) + path.clear(); + path << DirectoryCleaned(g_get_home_dir()) << prefix << "/"; + g_qeglobals.m_userEnginePath = path.c_str(); + break; +#endif + } + g_qeglobals.m_userEnginePath = EnginePath_get(); } + while(0); + + Q_mkdir(g_qeglobals.m_userEnginePath.c_str()); { StringOutputStream path(256); @@ -718,7 +784,7 @@ void PasteToCamera() // Work out the delta Vector3 mid; Select_GetMid(mid); - Vector3 delta = vector3_subtracted(vector3_snapped(Camera_getOrigin(camwnd), GetGridSize()), mid); + Vector3 delta = vector3_subtracted(vector3_snapped(Camera_getOrigin(camwnd), GetSnapGridSize()), mid); // Move to camera GlobalSelectionSystem().translateSelected(delta); @@ -992,9 +1058,9 @@ void OpenUpdateURL() // open the Q3Rad manual void OpenHelpURL() { - // at least on win32, AppPath + "Q3Rad_Manual/index.htm" + // at least on win32, AppPath + "docs/index.html" StringOutputStream help(256); - help << AppPath_get() << "Q3Rad_Manual/index.htm"; + help << AppPath_get() << "docs/index.html"; OpenURL(help.c_str()); } @@ -1189,13 +1255,21 @@ void SelectFaceMode() class CloneSelected : public scene::Graph::Walker { bool doMakeUnique; + NodeSmartReference worldspawn; public: - CloneSelected(bool d): doMakeUnique(d) { } + CloneSelected(bool d): doMakeUnique(d), worldspawn(Map_FindOrInsertWorldspawn(g_map)) + { + } bool pre(const scene::Path& path, scene::Instance& instance) const { if(path.size() == 1) return true; + // ignore worldspawn, but keep checking children + NodeSmartReference me(path.top().get()); + if(me == worldspawn) + return true; + if(!path.top().get().isRoot()) { Selectable* selectable = Instance_getSelectable(instance); @@ -1213,6 +1287,11 @@ public: if(path.size() == 1) return; + // ignore worldspawn, but keep checking children + NodeSmartReference me(path.top().get()); + if(me == worldspawn) + return; + if(!path.top().get().isRoot()) { Selectable* selectable = Instance_getSelectable(instance); @@ -3288,7 +3367,7 @@ void MainFrame::SetGridStatus() { StringOutputStream status(64); const char* lock = (GridStatus_getTextureLockEnabled()) ? "ON" : "OFF"; - status << "G:" << GridStatus_getGridSize() + status << (GetSnapGridSize() > 0 ? "G:" : "g:") << GridStatus_getGridSize() << " R:" << GridStatus_getRotateIncrement() << " C:" << GridStatus_getFarClipDistance() << " L:" << lock; @@ -3303,13 +3382,10 @@ void GridStatus_onTextureLockEnabledChanged() } } -namespace -{ - GLFont g_font(0, 0, 0, 0); -} - void GlobalGL_sharedContextCreated() { + GLFont *g_font = NULL; + // report OpenGL information globalOutputStream() << "GL_VENDOR: " << reinterpret_cast(glGetString (GL_VENDOR)) << "\n"; globalOutputStream() << "GL_RENDERER: " << reinterpret_cast(glGetString (GL_RENDERER)) << "\n"; @@ -3325,19 +3401,15 @@ void GlobalGL_sharedContextCreated() #ifdef WIN32 /* win32 is dodgy here, just use courier new then */ - g_font = glfont_create("courier new 8"); + g_font = glfont_create("arial 9"); #else - /* use default font here (Sans 10 is gtk default) */ GtkSettings *settings = gtk_settings_get_default(); gchar *fontname; g_object_get(settings, "gtk-font-name", &fontname, NULL); g_font = glfont_create(fontname); #endif - GlobalOpenGL().m_font = g_font.getDisplayList(); - GlobalOpenGL().m_fontHeight = g_font.getPixelHeight(); - GlobalOpenGL().m_fontAscent = g_font.getPixelAscent(); - GlobalOpenGL().m_fontDescent = g_font.getPixelDescent(); + GlobalOpenGL().m_font = g_font; } void GlobalGL_sharedContextDestroyed()