]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/main.cpp
Merge commit '4645e19ce9e8f8034233ac965a4103a13b75714c' into garux-merge
[xonotic/netradiant.git] / radiant / main.cpp
index c04867108bf4dfb4c102c71b5b94b3bcf327f7dc..88cd0cad4fd89e7a774ca8941be1a9fbd5b60144 100644 (file)
@@ -49,7 +49,7 @@
    \link math/plane.h math/plane.h \endlink - Planes \n
    \link math/aabb.h math/aabb.h \endlink - AABBs \n
 
-   Callback MemberCaller FunctionCaller - callbacks similar to using boost::function with boost::bind \n
+   Callback MemberCaller0 FunctionCaller - callbacks similar to using boost::function with boost::bind \n
    SmartPointer SmartReference - smart-pointer and smart-reference similar to Loki's SmartPtr \n
 
    \link generic/bitfield.h generic/bitfield.h \endlink - Type-safe bitfield \n
@@ -62,6 +62,7 @@
  */
 
 #include "main.h"
+#include "globaldefs.h"
 
 #include "version.h"
 
@@ -69,7 +70,7 @@
 
 #include "iundo.h"
 
-#include <gtk/gtkmain.h>
+#include "uilib/uilib.h"
 
 #include "cmdlib.h"
 #include "os/file.h"
@@ -89,7 +90,7 @@
 #include "referencecache.h"
 #include "stacktrace.h"
 
-#ifdef WIN32
+#if GDEF_OS_WINDOWS
 #include <windows.h>
 #endif
 
@@ -213,12 +214,12 @@ void error_redirect( const gchar *domain, GLogLevelFlags log_level, const gchar
     }
 }
 
-#if defined ( _DEBUG ) && defined ( WIN32 ) && defined ( _MSC_VER )
+#if GDEF_COMPILER_MSVC && GDEF_DEBUG
 #include "crtdbg.h"
 #endif
 
 void crt_init(){
-#if defined ( _DEBUG ) && defined ( WIN32 ) && defined ( _MSC_VER )
+#if GDEF_COMPILER_MSVC && GDEF_DEBUG
        _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
 #endif
 }
@@ -301,16 +302,16 @@ bool handleMessage(){
        globalErrorStream() << m_buffer.c_str();
        if ( !m_lock.locked() ) {
                ScopedLock lock( m_lock );
-#if defined _DEBUG
-               m_buffer << "Break into the debugger?\n";
-               bool handled = gtk_MessageBox( 0, m_buffer.c_str(), "Radiant - Runtime Error", eMB_YESNO, eMB_ICONERROR ) == eIDNO;
-               m_buffer.clear();
-               return handled;
-#else
-               m_buffer << "Please report this error to the developers\n";
-               gtk_MessageBox( 0, m_buffer.c_str(), "Radiant - Runtime Error", eMB_OK, eMB_ICONERROR );
-               m_buffer.clear();
-#endif
+        if (GDEF_DEBUG) {
+            m_buffer << "Break into the debugger?\n";
+            bool handled = ui::alert(ui::root, m_buffer.c_str(), "Radiant - Runtime Error", ui::alert_type::YESNO, ui::alert_icon::Error) == ui::alert_response::NO;
+            m_buffer.clear();
+            return handled;
+        } else {
+            m_buffer << "Please report this error to the developers\n";
+            ui::alert(ui::root, m_buffer.c_str(), "Radiant - Runtime Error", ui::alert_type::OK, ui::alert_icon::Error);
+            m_buffer.clear();
+        }
        }
        return true;
 }
@@ -324,14 +325,7 @@ void streams_init(){
 }
 
 void paths_init(){
-       const char* home = environment_get_home_path();
-       Q_mkdir( home );
-
-       {
-               StringOutputStream path( 256 );
-               path << home << "1." << RADIANT_MAJOR_VERSION "." << RADIANT_MINOR_VERSION << '/';
-               g_strSettingsPath = path.c_str();
-       }
+       g_strSettingsPath = environment_get_home_path();
 
        Q_mkdir( g_strSettingsPath.c_str() );
 
@@ -374,34 +368,31 @@ bool check_version(){
        // make something idiot proof and someone will make better idiots, this may be overkill
        // let's leave it disabled in debug mode in any case
        // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=431
-#ifndef _DEBUG
-#define CHECK_VERSION
-#endif
-#ifdef CHECK_VERSION
-       // locate and open RADIANT_MAJOR and RADIANT_MINOR
-       bool bVerIsGood = true;
-       {
-               StringOutputStream ver_file_name( 256 );
-               ver_file_name << AppPath_get() << "RADIANT_MAJOR";
-               bVerIsGood = check_version_file( ver_file_name.c_str(), RADIANT_MAJOR_VERSION );
-       }
-       {
-               StringOutputStream ver_file_name( 256 );
-               ver_file_name << AppPath_get() << "RADIANT_MINOR";
-               bVerIsGood = check_version_file( ver_file_name.c_str(), RADIANT_MINOR_VERSION );
-       }
+    if (GDEF_DEBUG) {
+        return true;
+    }
+    // locate and open RADIANT_MAJOR and RADIANT_MINOR
+    bool bVerIsGood = true;
+    {
+        StringOutputStream ver_file_name(256);
+        ver_file_name << AppPath_get() << "RADIANT_MAJOR";
+        bVerIsGood = check_version_file(ver_file_name.c_str(), RADIANT_MAJOR_VERSION);
+    }
+    {
+        StringOutputStream ver_file_name(256);
+        ver_file_name << AppPath_get() << "RADIANT_MINOR";
+        bVerIsGood = check_version_file(ver_file_name.c_str(), RADIANT_MINOR_VERSION);
+    }
 
-       if ( !bVerIsGood ) {
-               StringOutputStream msg( 256 );
-               msg << "This editor binary (" RADIANT_VERSION ") doesn't match what the latest setup has configured in this directory\n"
-                                                                                                         "Make sure you run the right/latest editor binary you installed\n"
-                       << AppPath_get();
-               gtk_MessageBox( 0, msg.c_str(), "Radiant", eMB_OK, eMB_ICONDEFAULT );
-       }
-       return bVerIsGood;
-#else
-       return true;
-#endif
+    if (!bVerIsGood) {
+        StringOutputStream msg(256);
+        msg
+                << "This editor binary (" RADIANT_VERSION ") doesn't match what the latest setup has configured in this directory\n"
+                        "Make sure you run the right/latest editor binary you installed\n"
+                << AppPath_get();
+        ui::alert(ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Default);
+    }
+    return bVerIsGood;
 }
 
 void create_global_pid(){
@@ -424,25 +415,26 @@ void create_global_pid(){
                if ( remove( g_pidFile.c_str() ) == -1 ) {
                        StringOutputStream msg( 256 );
                        msg << "WARNING: Could not delete " << g_pidFile.c_str();
-                       gtk_MessageBox( 0, msg.c_str(), "Radiant", eMB_OK, eMB_ICONERROR );
+                       ui::alert( ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error );
                }
 
                // in debug, never prompt to clean registry, turn console logging auto after a failed start
-#if !defined( _DEBUG )
-               StringOutputStream msg( 256 );
-               msg << "Radiant failed to start properly the last time it was run.\n"
-                          "The failure may be related to current global preferences.\n"
-                          "Do you want to reset global preferences to defaults?";
-
-               if ( gtk_MessageBox( 0, msg.c_str(), "Radiant - Startup Failure", eMB_YESNO, eMB_ICONQUESTION ) == eIDYES ) {
-                       g_GamesDialog.Reset();
-               }
+               if (!GDEF_DEBUG) {
+                       StringOutputStream msg(256);
+                       msg << "Radiant failed to start properly the last time it was run.\n"
+                                       "The failure may be related to current global preferences.\n"
+                                       "Do you want to reset global preferences to defaults?";
+
+                       if (ui::alert(ui::root, msg.c_str(), "Radiant - Startup Failure", ui::alert_type::YESNO, ui::alert_icon::Question) == ui::alert_response::YES) {
+                               g_GamesDialog.Reset();
+                       }
 
-               msg.clear();
-               msg << "Logging console output to " << SettingsPath_get() << "radiant.log\nRefer to the log if Radiant fails to start again.";
+                       msg.clear();
+                       msg << "Logging console output to " << SettingsPath_get()
+                               << "radiant.log\nRefer to the log if Radiant fails to start again.";
 
-               gtk_MessageBox( 0, msg.c_str(), "Radiant - Console Log", eMB_OK );
-#endif
+                       ui::alert(ui::root, msg.c_str(), "Radiant - Console Log", ui::alert_type::OK);
+               }
 
                // set without saving, the class is not in a coherent state yet
                // just do the value change and call to start logging, CGamesDialog will pickup when relevant
@@ -465,7 +457,7 @@ void remove_global_pid(){
        if ( remove( g_pidFile.c_str() ) == -1 ) {
                StringOutputStream msg( 256 );
                msg << "WARNING: Could not delete " << g_pidFile.c_str();
-               gtk_MessageBox( 0, msg.c_str(), "Radiant", eMB_OK, eMB_ICONERROR );
+               ui::alert( ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error );
        }
 }
 
@@ -483,25 +475,26 @@ void create_local_pid(){
                if ( remove( g_pidGameFile.c_str() ) == -1 ) {
                        StringOutputStream msg;
                        msg << "WARNING: Could not delete " << g_pidGameFile.c_str();
-                       gtk_MessageBox( 0, msg.c_str(), "Radiant", eMB_OK, eMB_ICONERROR );
+                       ui::alert( ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error );
                }
 
                // in debug, never prompt to clean registry, turn console logging auto after a failed start
-#if !defined( _DEBUG )
-               StringOutputStream msg;
-               msg << "Radiant failed to start properly the last time it was run.\n"
-                          "The failure may be caused by current preferences.\n"
-                          "Do you want to reset all preferences to defaults?";
-
-               if ( gtk_MessageBox( 0, msg.c_str(), "Radiant - Startup Failure", eMB_YESNO, eMB_ICONQUESTION ) == eIDYES ) {
-                       Preferences_Reset();
-               }
+               if (!GDEF_DEBUG) {
+                       StringOutputStream msg;
+                       msg << "Radiant failed to start properly the last time it was run.\n"
+                                       "The failure may be caused by current preferences.\n"
+                                       "Do you want to reset all preferences to defaults?";
 
-               msg.clear();
-               msg << "Logging console output to " << SettingsPath_get() << "radiant.log\nRefer to the log if Radiant fails to start again.";
+                       if (ui::alert(ui::root, msg.c_str(), "Radiant - Startup Failure", ui::alert_type::YESNO, ui::alert_icon::Question) == ui::alert_response::YES) {
+                               Preferences_Reset();
+                       }
 
-               gtk_MessageBox( 0, msg.c_str(), "Radiant - Console Log", eMB_OK );
-#endif
+                       msg.clear();
+                       msg << "Logging console output to " << SettingsPath_get()
+                               << "radiant.log\nRefer to the log if Radiant fails to start again.";
+
+                       ui::alert(ui::root, msg.c_str(), "Radiant - Console Log", ui::alert_type::OK);
+               }
 
                // force console logging on! (will go in prefs too)
                g_GamesDialog.m_bForceLogConsole = true;
@@ -541,32 +534,64 @@ void user_shortcuts_save(){
        SaveCommandMap( path.c_str() );
 }
 
+void add_local_rc_files(){
+#define GARUX_DISABLE_GTKTHEME
+#ifndef GARUX_DISABLE_GTKTHEME
+/* FIXME: HACK: not GTK3 compatible
+ https://developer.gnome.org/gtk2/stable/gtk2-Resource-Files.html#gtk-rc-add-default-file
+ https://developer.gnome.org/gtk3/stable/gtk3-Resource-Files.html#gtk-rc-add-default-file
+ > gtk_rc_add_default_file has been deprecated since version 3.0 and should not be used in newly-written code.
+ > Use GtkStyleContext with a custom GtkStyleProvider instead
+*/
+
+       {
+               StringOutputStream path( 512 );
+               path << AppPath_get() << ".gtkrc-2.0.radiant";
+               gtk_rc_add_default_file( path.c_str() );
+       }
+#ifdef WIN32
+       {
+               StringOutputStream path( 512 );
+               path << AppPath_get() << ".gtkrc-2.0.win";
+               gtk_rc_add_default_file( path.c_str() );
+       }
+#endif
+#endif // GARUX_DISABLE_GTKTHEME
+}
+
 int main( int argc, char* argv[] ){
        crt_init();
 
        streams_init();
 
-#ifdef WIN32
+#if GDEF_OS_WINDOWS
        HMODULE lib;
        lib = LoadLibrary( "dwmapi.dll" );
        if ( lib != 0 ) {
                void ( WINAPI *qDwmEnableComposition )( bool bEnable ) = ( void (WINAPI *) ( bool bEnable ) )GetProcAddress( lib, "DwmEnableComposition" );
                if ( qDwmEnableComposition ) {
-                       qDwmEnableComposition( FALSE );
+                       bool Aero = false;
+                       for ( int i = 1; i < argc; ++i ){
+                               if ( !stricmp( argv[i], "-aero" ) ){
+                                       Aero = true;
+                                       qDwmEnableComposition( TRUE );
+                                       break;
+                               }
+                       }
+                       // disable Aero
+                       if ( !Aero ){
+                               qDwmEnableComposition( FALSE );
+                       }
                }
                FreeLibrary( lib );
        }
+       _setmaxstdio(2048);
 #endif
 
-       static GOptionEntry entries[] = {
-               { NULL }
-       };
-       GError *error = NULL;
        const char* mapname = NULL;
-
-       gtk_disable_setlocale();
-       if ( !gtk_init_with_args( &argc, &argv, "<filename.map>", entries, NULL, &error) ) {
-               g_print( "%s\n", error->message );
+    char const *error = NULL;
+       if ( !ui::init( &argc, &argv, "<filename.map>", &error) ) {
+               g_print( "%s\n", error );
                return -1;
        }
 
@@ -605,10 +630,12 @@ int main( int argc, char* argv[] ){
 
        GlobalDebugMessageHandler::instance().setHandler( GlobalPopupDebugMessageHandler::instance() );
 
-       environment_init( argc, argv );
+       environment_init(argc, (char const **) argv);
 
        paths_init();
 
+       add_local_rc_files();
+
        if ( !check_version() ) {
                return EXIT_FAILURE;
        }
@@ -641,8 +668,6 @@ int main( int argc, char* argv[] ){
 
        Radiant_Initialise();
 
-       global_accel_init();
-
        user_shortcuts_init();
 
        g_pParentWnd = 0;
@@ -650,6 +675,12 @@ int main( int argc, char* argv[] ){
 
        hide_splash();
 
+#ifdef WIN32
+       if( openCmdMap && *openCmdMap ){
+               Map_LoadFile( openCmdMap );
+       }
+       else
+#endif // WIN32
        if ( mapname != NULL ) {
                Map_LoadFile( mapname );
        }
@@ -668,7 +699,7 @@ int main( int argc, char* argv[] ){
 
        remove_local_pid();
 
-       gtk_main();
+       ui::main();
 
        // avoid saving prefs when the app is minimized
        if ( g_pParentWnd->IsSleeping() ) {
@@ -686,8 +717,6 @@ int main( int argc, char* argv[] ){
 
        user_shortcuts_save();
 
-       global_accel_destroy();
-
        Radiant_Shutdown();
 
        // close the log file if any