]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/preferences.cpp
rebuilt gtk binary dependencies file
[xonotic/netradiant.git] / radiant / preferences.cpp
index 709642082b2f281ad583fc590120ea6283a27da3..faff442e3510d4d6c5009c4f74af2a96e8dd1ff8 100644 (file)
@@ -39,6 +39,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include "missing.h"
 #include "gtkmisc.h"
 
+#ifdef _WIN32
+       // sanity check - some gtk2 win32 runtimes replace sprintf
+       #if defined( sprintf )
+               #error sprintf is a macro. are you sure?
+       #endif
+#endif
+
 #ifdef _WIN32
 #include <io.h>
 #define X_OK 0
@@ -96,6 +103,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #define WIDETOOLBAR_KEY         "WideToolBar"
 #define PLUGINTOOLBAR_KEY "PluginToolBar"
 #define NOCLAMP_KEY             "NoClamp"
+#define SNAP_KEY                "Snap"
 #define PREFAB_KEY              "PrefabPath"
 #define USERINI_KEY             "UserINIPath"
 #define ROTATION_KEY            "Rotation"
@@ -283,7 +291,6 @@ void CXMLPropertyBag::GetPref(const char *name, Str *pV, const char *V)
     if ( pNode->children && pNode->children->content ) {
       *pV = pNode->children->content;
     } else {
-      // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=427
       // means the pref exists, and that the value is ""
       *pV = "";
     }
@@ -636,6 +643,7 @@ PrefsDlg::PrefsDlg ()
   m_bWideToolbar = TRUE;
   m_bPluginToolbar = TRUE;
   m_bNoClamp = FALSE;
+  m_bSnap = TRUE;
   m_strUserPath = "";
   m_nRotation = 0;
   m_bChaseMouse = FALSE;
@@ -695,6 +703,25 @@ Games selection dialog
 =========================================================
 */
 
+#if defined(WIN32)
+#define TOOLS_ATTRIBUTE "gametools_win32"
+#define ENGINE_ATTRIBUTE "engine_win32"
+#define ENGINEPATH_ATTRIBUTE "enginepath_win32"
+#define MP_ENGINE_ATTRIBUTE "mp_engine_win32"
+#elif defined(__linux__) || defined (__FreeBSD__)
+#define TOOLS_ATTRIBUTE "gametools_linux"
+#define ENGINE_ATTRIBUTE "engine_linux"
+#define ENGINEPATH_ATTRIBUTE "enginepath_linux"
+#define MP_ENGINE_ATTRIBUTE "mp_engine_linux"
+#elif defined(__APPLE__)
+#define TOOLS_ATTRIBUTE "gametools_macos"
+#define ENGINE_ATTRIBUTE "engine_macos"
+#define ENGINEPATH_ATTRIBUTE "enginepath_macos"
+#define MP_ENGINE_ATTRIBUTE "mp_engine_macos"
+#else
+#error "unsupported platform"
+#endif
+
 CGameDescription::CGameDescription(xmlDocPtr pDoc, const Str &GameFile)
 {
   char *p, *prop;
@@ -709,9 +736,9 @@ CGameDescription::CGameDescription(xmlDocPtr pDoc, const Str &GameFile)
     Error("Didn't find 'game' node in the game description file '%s'\n", pDoc->URL);
   }
   // on win32, game tools path can now be specified relative to the exe's cwd
-  prop = (char*)xmlGetProp( pNode, (xmlChar*)"gametools" );
+  prop = (char*)xmlGetProp( pNode, (xmlChar*)TOOLS_ATTRIBUTE);
   if ( prop == NULL ) {
-         Error( "Didn't find 'gametools' node in the game description file '%s'\n", pDoc->URL );
+       Error( "Didn't find '"TOOLS_ATTRIBUTE"' node in the game description file '%s'\n", pDoc->URL );
   }
   {
        char full[PATH_MAX];
@@ -785,58 +812,78 @@ CGameDescription::CGameDescription(xmlDocPtr pDoc, const Str &GameFile)
     xmlFree(prop);
   }
 
-  // on win32, engine path can now be specified relative to the exe's cwd
-  prop = (char*)xmlGetProp(pNode, (const xmlChar *)"enginepath");
-  if ( prop != NULL ) {
-    char full[PATH_MAX];
+
+       prop = (char*)xmlGetProp(pNode, (const xmlChar*)ENGINE_ATTRIBUTE);
+       if (prop == NULL)
+       {
 #ifdef _WIN32
-       _fullpath( full, prop, PATH_MAX );
-#else
-       strncpy( full, prop, PATH_MAX );
+               mEngine = "quake3.exe";
+#elif __linux__
+               mEngine = "quake3";
+#elif __APPLE__
+               mEngine = "Quake3.app";
 #endif
-    xmlFree( prop );
-       prop = NULL;
-    // process seperators
-    for ( p = full; *p != '\0'; p++ ) {
-         if ( *p == '\\' ) {
-           *p = '/';
-         }
-       }
-    mEnginePath = full;
-       if ( p != full && *(p-1) != '/' ) {
-         mEnginePath += "/";
        }
-  }
-  else
-  {
-    // if engine path was not specified in the .game, it implies we can guess it from the gametools path
-    // on win32, and for most game package, the gametools are installed with the game
-    char aux_path[PATH_MAX]; // aux
-    strcpy( aux_path, mGameToolsPath.GetBuffer() );
-       if ( ( aux_path[ strlen(aux_path)-1 ] == '/' ) || ( aux_path[ strlen(aux_path)-1 ] == '\\' ) ) {
-      aux_path[strlen(aux_path)-1] = '\0'; // strip ending '/' if any
+       else
+       {
+               mEngine = prop;
+               xmlFree(prop);
        }
-    char up_path[PATH_MAX]; // up one level
-    ExtractFilePath( aux_path, up_path );
-    mEnginePath = up_path;
-  }
 
-  prop = (char*)xmlGetProp(pNode, (xmlChar*)"engine");
-  if (prop == NULL)
-  {
+       prop = (char*)xmlGetProp(pNode, (const xmlChar*)MP_ENGINE_ATTRIBUTE);
+       if (prop == NULL)
+       {
 #ifdef _WIN32
-    mEngine = "quake3.exe";
+               mMultiplayerEngine = "quake3.exe";
 #elif __linux__
-    mEngine = "quake3";
+               mMultiplayerEngine = "quake3";
 #elif __APPLE__
-    mEngine = "Quake3.app";
+               mMultiplayerEngine = "Quake3.app";
 #endif
-  }
-  else
-  {
-    mEngine = prop;
-    xmlFree(prop);
-  }
+       }
+       else
+       {
+               mMultiplayerEngine = prop;
+               xmlFree(prop);
+       }
+
+       {
+               // on win32, engine path can now be specified relative to the exe's cwd
+               prop = (char*)xmlGetProp(pNode, (const xmlChar *)ENGINEPATH_ATTRIBUTE);
+               if ( prop != NULL ) {
+                       char full[PATH_MAX];
+               #ifdef _WIN32
+                       _fullpath( full, prop, PATH_MAX );
+               #else
+                       strncpy( full, prop, PATH_MAX );
+               #endif
+                       xmlFree( prop );
+                       prop = NULL;
+                       // process seperators
+                       for ( p = full; *p != '\0'; p++ ) {
+                               if ( *p == '\\' ) {
+                                       *p = '/';
+                               }
+                       }
+                       mEnginePath = full;
+                       if ( p != full && *(p-1) != '/' ) {
+                               mEnginePath += "/";
+                       }
+               }
+               else
+               {
+                       // if engine path was not specified in the .game, it implies we can guess it from the gametools path
+                       // on win32, and for most game package, the gametools are installed with the game
+                       char aux_path[PATH_MAX]; // aux
+                       strcpy( aux_path, mGameToolsPath.GetBuffer() );
+                       if ( ( aux_path[ strlen(aux_path)-1 ] == '/' ) || ( aux_path[ strlen(aux_path)-1 ] == '\\' ) ) {
+                               aux_path[strlen(aux_path)-1] = '\0'; // strip ending '/' if any
+                       }
+                       char up_path[PATH_MAX]; // up one level
+                       ExtractFilePath( aux_path, up_path );
+                       mEnginePath = up_path;
+               }
+       }
 
 #if defined (__linux__) || defined (__APPLE__)
   // *nix specific
@@ -1375,7 +1422,6 @@ void CGameDialog::UpdateNetrun(bool retrieve)
   strNetrun = g_strAppPath; strNetrun += NETRUN_FILENAME;
   if (!retrieve)
   {
-    // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=639
     // now check if we are running from a network installation
     // use a dummy file as the flag
     f_netrun = fopen(strNetrun.GetBuffer(), "r");
@@ -1774,7 +1820,6 @@ void PrefsDlg::BuildDialog ()
 
 #ifdef ATIHACK_812
        // ATI bugs
-       // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=812
        check = gtk_check_button_new_with_label (_("ATI cards with broken drivers - bug #802"));
        gtk_widget_show(check);
        gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
@@ -2300,6 +2345,12 @@ void PrefsDlg::BuildDialog ()
   gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
   AddDialogData (check, &m_bNoClamp, DLG_CHECK_BOOL);
 
+  // Snap to grid
+  check = gtk_check_button_new_with_label (_("Snap to grid"));
+  gtk_widget_show (check);
+  gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
+  AddDialogData (check, &m_bSnap, DLG_CHECK_BOOL);
+
   // Select patch by bounding box
   check = gtk_check_button_new_with_label (_("Select patches by bounding box"));
   gtk_widget_show (check);
@@ -2460,7 +2511,6 @@ void PrefsDlg::BuildDialog ()
                    (GtkAttachOptions) (0), 1, 0);
   AddDialogData (entry, &m_strPrefabPath, DLG_ENTRY_TEXT);
 
-  // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=805
 #if 0
   // browse button
   button = gtk_button_new_with_label ("...");
@@ -2871,6 +2921,7 @@ void PrefsDlg::LoadPrefs ()
   m_nShader = m_nLatchedShader;
 
   mLocalPrefs.GetPref(NOCLAMP_KEY,            &m_bNoClamp,                    FALSE);
+  mLocalPrefs.GetPref(SNAP_KEY,               &m_bSnap,                       TRUE);
   mLocalPrefs.GetPref(USERINI_KEY,            &m_strUserPath,                 "");
   mLocalPrefs.GetPref(ROTATION_KEY,           &m_nRotation,                   45);
   mLocalPrefs.GetPref(CHASEMOUSE_KEY,         &m_bChaseMouse,                 TRUE);
@@ -2888,7 +2939,7 @@ void PrefsDlg::LoadPrefs ()
     // Texture subset on by default (HL specific really, because of halflife.wad's size)
     mLocalPrefs.GetPref(TEXTURE_KEY,            &m_bTextureWindow,              TRUE);
   }
-  else if ( ( g_pGameDescription->mGameFile == "q2.game" ) || ( g_pGameDescription->mGameFile == "heretic2.game" ) )
+  else if (g_pGameDescription->quake2)
   {
     // BSP monitoring is implemented in Quake2 and Heretic2 tools
     mLocalPrefs.GetPref(WATCHBSP_KEY,           &m_bWatchBSP,                   TRUE);
@@ -3185,14 +3236,14 @@ void CGameInstall::OnBtnBrowseEngine( GtkWidget *widget, gpointer data ) {
        Sys_Printf( "OnBtnBrowseEngine\n" );
 
        CGameInstall* i = static_cast<CGameInstall*>( data );
-       char *dir = dir_dialog( widget, _("Select game directory"), NULL );
+       char *dir = dir_dialog( i->m_pWidget, _("Select game directory"), NULL );
 
        i->UpdateData( TRUE );
 
        if ( dir != NULL ) {
                i->m_strEngine = dir;
                i->UpdateData( FALSE );
-               free( dir );
+               g_free( dir );
        }
 }
 
@@ -3248,6 +3299,12 @@ void CGameInstall::BuildDialog() {
                case GAME_NEXUIZ:
                        gtk_combo_box_append_text( GTK_COMBO_BOX( combo ), _("Nexuiz") );
                        break;
+               case GAME_TREMULOUS:
+                       gtk_combo_box_append_text( GTK_COMBO_BOX( combo ), _("Tremulous") );
+                       break;
+               case GAME_JA:
+                       gtk_combo_box_append_text( GTK_COMBO_BOX( combo ), _("Jedi Academy and mods") );
+                       break;
                }
                iGame++;
        }
@@ -3309,6 +3366,9 @@ void CGameInstall::BuildDialog() {
 
 void CGameInstall::Run() {
        ScanGames();
+       if ( m_availGames[0] == GAME_NONE ) {
+               return;
+       }
        if ( DoModal() == IDCANCEL ) {
                Sys_Printf( "game dialog cancelled\n" );
                return;
@@ -3322,16 +3382,16 @@ void CGameInstall::Run() {
        gameFilePath += ".game";
        Sys_Printf( "game file: %s\n", gameFilePath.GetBuffer() );
 
-       FILE *fg = fopen( gameFilePath.GetBuffer(), "w" );
+       FILE * fg = fopen( gameFilePath.GetBuffer(), "w" );
        if ( fg == NULL ) {
                Error( "Failed to open %s for writing\n", gameFilePath.GetBuffer() );
        }
        fprintf( fg, "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>\n<game\n" );
        fprintf( fg, "  name=\"%s\"\n", m_strName.GetBuffer() );
-       fprintf( fg, "  enginepath=\"%s\"\n", m_strEngine.GetBuffer() );
+       fprintf( fg, "  "ENGINEPATH_ATTRIBUTE"=\"%s\"\n", m_strEngine.GetBuffer() );
        switch ( m_availGames[ m_nComboSelect ] ) {
        case GAME_Q2: {
-               fprintf( fg, "  gametools=\"%sinstalls/Quake2Pack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/Quake2Pack/game\"\n", g_strAppPath.GetBuffer() );
                fprintf( fg, "  prefix=\".quake2\"\n" );
                Str source = g_strAppPath.GetBuffer();
                source += "installs/";
@@ -3343,7 +3403,7 @@ void CGameInstall::Run() {
                break;
        }
        case GAME_Q3: {
-               fprintf( fg, "  gametools=\"%sinstalls/Q3Pack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/Q3Pack/game\"\n", g_strAppPath.GetBuffer() );
                fprintf( fg, "  prefix=\".q3a\"\n" );
                Str source = g_strAppPath.GetBuffer();
                source += "installs/";
@@ -3355,7 +3415,7 @@ void CGameInstall::Run() {
                break;
        }
        case GAME_URT: {
-               fprintf( fg, "  gametools=\"%sinstalls/UrTPack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/UrTPack/game\"\n", g_strAppPath.GetBuffer() );
                fprintf( fg, "  prefix=\".q3a\"\n" );
                Str source = g_strAppPath.GetBuffer();
                source += "installs/";
@@ -3367,7 +3427,7 @@ void CGameInstall::Run() {
                break;
        }
        case GAME_UFOAI: {
-               fprintf( fg, "  gametools=\"%sinstalls/UFOAIPack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/UFOAIPack/game\"\n", g_strAppPath.GetBuffer() );
                fprintf( fg, "  prefix=\".ufoai\"\n" );
                Str source = g_strAppPath.GetBuffer();
                source += "installs/";
@@ -3379,7 +3439,7 @@ void CGameInstall::Run() {
                break;
        }
        case GAME_Q2W: {
-               fprintf( fg, "  gametools=\"%sinstalls/Q2WPack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/Q2WPack/game\"\n", g_strAppPath.GetBuffer() );
                fprintf( fg, "  prefix=\".quake2world\"\n" );
                Str source = g_strAppPath.GetBuffer();
                source += "installs/";
@@ -3391,7 +3451,7 @@ void CGameInstall::Run() {
                break;
        }
        case GAME_WARSOW: {
-               fprintf( fg, "  gametools=\"%sinstalls/WarsowPack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/WarsowPack/game\"\n", g_strAppPath.GetBuffer() );
                fprintf( fg, "  prefix=\".warsow\"\n" );
                Str source = g_strAppPath.GetBuffer();
                source += "installs/";
@@ -3403,7 +3463,7 @@ void CGameInstall::Run() {
                break;
        }
        case GAME_NEXUIZ: {
-               fprintf( fg, "  gametools=\"%sinstalls/NexuizPack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/NexuizPack/game\"\n", g_strAppPath.GetBuffer() );
                fprintf( fg, "  prefix=\".nexuiz\"\n" );
                Str source = g_strAppPath.GetBuffer();
                source += "installs/";
@@ -3414,6 +3474,30 @@ void CGameInstall::Run() {
                fprintf( fg, "  basegame=\"data\"\n" );
                break;
        }
+       case GAME_TREMULOUS: {
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/TremulousPack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  prefix=\".tremulous\"\n" );
+               Str source = g_strAppPath.GetBuffer();
+               source += "installs/";
+               source += TREMULOUS_PACK;
+               source += "/install/";
+               Str dest = m_strEngine.GetBuffer();
+               CopyTree( source.GetBuffer(), dest.GetBuffer() );
+               fprintf( fg, "  basegame=\"base\"\n" );
+               break;
+       }
+       case GAME_JA: {
+               fprintf( fg, "  "TOOLS_ATTRIBUTE"=\"%sinstalls/JAPack/game\"\n", g_strAppPath.GetBuffer() );
+               fprintf( fg, "  prefix=\".ja\"\n" );
+               Str source = g_strAppPath.GetBuffer();
+               source += "installs/";
+               source += JA_PACK;
+               source += "/install/";
+               Str dest = m_strEngine.GetBuffer();
+               CopyTree( source.GetBuffer(), dest.GetBuffer() );
+               fprintf( fg, "  basegame=\"base\"\n" );
+               break;
+       }
        }
        fprintf( fg, "/>\n" );
        fclose( fg );
@@ -3454,6 +3538,14 @@ void CGameInstall::ScanGames() {
                if ( stricmp( dirname, Q2_PACK ) == 0 ) {
                        m_availGames[ iGame++ ] = GAME_Q2;
                }
+               if ( stricmp( dirname, TREMULOUS_PACK ) == 0 ) {
+                       m_availGames[ iGame++ ] = GAME_TREMULOUS;
+               }
+               if ( stricmp( dirname, JA_PACK ) == 0 ) {
+                       m_availGames[ iGame++ ] = GAME_JA;
+               }
        }
+       Sys_Printf("No installable games found in: %s\n",
+               pakPaths.GetBuffer() );
 }