foxygit / doom Log in
commit 4d41e7e74d935a87fca669fa86c25ddb1d60695d
Author:     Willy Barro <willybarro@gmail.com>
AuthorDate: Tue Apr 29 16:23:23 2014 -0300
Commit:     Willy Barro <willybarro@gmail.com>
CommitDate: Tue Apr 29 19:23:08 2014 -0300

    Add native notification box for errors on linux.

    Errors will now be shown as a message box, instead of
    only a console message. This fixes the user not seeing
    error messages, like if the IWAD is not provided.

    - Add zenity notification box call on I_Error
---
 src/i_system.c | 42 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

diff --git a/src/i_system.c b/src/i_system.c
index 041217b0..5b6989bf 100644
--- a/src/i_system.c
+++ b/src/i_system.c
@@ -262,6 +262,39 @@ void I_Quit (void)
     exit(0);
 }

+#define ZENITY_BINARY "/usr/bin/zenity"
+
+// returns non-zero if zenity is available
+
+static int ZenityAvailable(void)
+{
+    return system(ZENITY_BINARY " --help >/dev/null 2>&1") == 0;
+}
+
+// Open a native error box with a message using zenity
+
+static int ZenityErrorBox(char *message)
+{
+    int *result;
+    char *errorboxpath;
+    static size_t errorboxpath_size;
+
+    if (!ZenityAvailable())
+    {
+        return 0;
+    }
+
+    errorboxpath_size = strlen(ZENITY_BINARY) + strlen(message) + 19;
+    errorboxpath = malloc(errorboxpath_size);
+    M_snprintf(errorboxpath, errorboxpath_size, "%s --error --text=\"%s\"", ZENITY_BINARY, message);
+
+    result = system(errorboxpath);
+
+    free(errorboxpath);
+
+    return result;
+}
+
 //
 // I_Error
 //
@@ -327,9 +360,7 @@ void I_Error (char *error, ...)

         MessageBoxW(NULL, wmsgbuf, L"", MB_OK);
     }
-#endif
-
-#ifdef __MACOSX__
+#elif defined(__MACOSX__)
     if (exit_gui_popup && !I_ConsoleStdout())
     {
         CFStringRef message;
@@ -365,6 +396,11 @@ void I_Error (char *error, ...)
                                         message,
                                         NULL);
     }
+#else
+    if (exit_gui_popup && !I_ConsoleStdout())
+    {
+        ZenityErrorBox(error);
+    }
 #endif

     // abort();