]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/utilsgtk.cpp
remove run-time check for now-required GTK 2.4
[wxWidgets.git] / src / gtk / utilsgtk.cpp
index bfcbbc8ab20497ec8a771cf321381e7600418f1f..0d1add821a5f4df361239cfc164b12d5bda2eb89 100644 (file)
 #include "wx/gtk/private/timer.h"
 #include "wx/evtloop.h"
 
+#include <gtk/gtk.h>
+#ifdef GDK_WINDOWING_WIN32
+#include <gdk/gdkwin32.h>
+#endif
+#ifdef GDK_WINDOWING_X11
+#include <gdk/gdkx.h>
+#endif
+
 #if wxDEBUG_LEVEL
     #include "wx/gtk/assertdlg_gtk.h"
     #if wxUSE_STACKWALKER
 #include <string.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <sys/wait.h>   // for WNOHANG
+#ifdef __UNIX__
 #include <unistd.h>
-
-#include "glib.h"
-#include "gdk/gdk.h"
-#include "gtk/gtk.h"
-#include "gdk/gdkx.h"
+#endif
 
 #if wxUSE_DETECT_SM
-    #include "X11/Xlib.h"
-    #include "X11/SM/SMlib.h"
+    #include <X11/SM/SMlib.h>
+
+    #include "wx/unix/utilsx11.h"
 #endif
 
 //-----------------------------------------------------------------------------
@@ -91,7 +96,7 @@ void wxDisplaySizeMM( int *width, int *height )
 
 void wxGetMousePosition( int* x, int* y )
 {
-    gdk_window_get_pointer( NULL, x, y, NULL );
+    gdk_window_get_pointer(gtk_widget_get_root_window(wxGetRootWindow()), x, y, NULL);
 }
 
 bool wxColourDisplay()
@@ -101,7 +106,7 @@ bool wxColourDisplay()
 
 int wxDisplayDepth()
 {
-    return gdk_drawable_get_visual( wxGetRootWindow()->window )->depth;
+    return gtk_widget_get_visual(wxGetRootWindow())->depth;
 }
 
 wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
@@ -187,31 +192,28 @@ const gchar *wx_pango_version_check (int major, int minor, int micro)
 // ----------------------------------------------------------------------------
 
 extern "C" {
-static
-void GTK_EndProcessDetector(gpointer data, gint source,
-                            GdkInputCondition WXUNUSED(condition))
+static gboolean EndProcessDetector(GIOChannel* source, GIOCondition, void* data)
 {
     wxEndProcessData * const
         proc_data = static_cast<wxEndProcessData *>(data);
 
     // child exited, end waiting
-    close(source);
-
-    // don't call us again!
-    gdk_input_remove(proc_data->tag);
+    close(g_io_channel_unix_get_fd(source));
 
     wxHandleProcessTermination(proc_data);
+
+    // don't call us again!
+    return false;
 }
 }
 
 int wxGUIAppTraits::AddProcessCallback(wxEndProcessData *proc_data, int fd)
 {
-    int tag = gdk_input_add(fd,
-                            GDK_INPUT_READ,
-                            GTK_EndProcessDetector,
-                            (gpointer)proc_data);
-
-    return tag;
+    GIOChannel* channel = g_io_channel_unix_new(fd);
+    GIOCondition cond = GIOCondition(G_IO_IN | G_IO_HUP | G_IO_ERR);
+    unsigned id = g_io_add_watch(channel, cond, EndProcessDetector, proc_data);
+    g_io_channel_unref(channel);
+    return int(id);
 }
 
 
@@ -242,17 +244,7 @@ wxTimerImpl *wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
 #if wxUSE_DETECT_SM
 static wxString GetSM()
 {
-    class Dpy
-    {
-    public:
-        Dpy() { m_dpy = XOpenDisplay(NULL); }
-        ~Dpy() { if ( m_dpy ) XCloseDisplay(m_dpy); }
-
-        operator Display *() const { return m_dpy; }
-    private:
-        Display *m_dpy;
-    } dpy;
-
+    wxX11Display dpy;
     if ( !dpy )
         return wxEmptyString;
 
@@ -339,14 +331,11 @@ private:
     GtkAssertDialog *m_dlg;
 };
 
-// the callback functions must be extern "C" to comply with GTK+ declarations
-extern "C"
+static void get_stackframe_callback(void* p)
 {
-    void get_stackframe_callback(StackDump *dump)
-    {
-        // skip over frames up to including wxOnAssert()
-        dump->ProcessFrames(3);
-    }
+    StackDump* dump = static_cast<StackDump*>(p);
+    // skip over frames up to including wxOnAssert()
+    dump->ProcessFrames(3);
 }
 
 #endif // wxDEBUG_LEVEL && wxUSE_STACKWALKER
@@ -354,55 +343,55 @@ extern "C"
 bool wxGUIAppTraits::ShowAssertDialog(const wxString& msg)
 {
 #if wxDEBUG_LEVEL
-    // under GTK2 we prefer to use a dialog widget written using directly in
-    // GTK+ as use a dialog written using wxWidgets would need the wxWidgets
-    // idle processing to work correctly which might not be the case when
-    // assert happens
-    GtkWidget *dialog = gtk_assert_dialog_new();
-    gtk_assert_dialog_set_message(GTK_ASSERT_DIALOG(dialog), msg.mb_str());
+    // we can't show the dialog from another thread
+    if ( wxIsMainThread() )
+    {
+        // under GTK2 we prefer to use a dialog widget written using directly
+        // in GTK+ as use a dialog written using wxWidgets would need the
+        // wxWidgets idle processing to work correctly which might not be the
+        // case when assert happens
+        GtkWidget *dialog = gtk_assert_dialog_new();
+        gtk_assert_dialog_set_message(GTK_ASSERT_DIALOG(dialog), msg.mb_str());
 
 #if wxUSE_STACKWALKER
-    // don't show more than maxLines or we could get a dialog too tall to be
-    // shown on screen: 20 should be ok everywhere as even with 15 pixel high
-    // characters it is still only 300 pixels...
-    static const int maxLines = 20;
-
-    // save current stack frame...
-    StackDump dump(GTK_ASSERT_DIALOG(dialog));
-    dump.SaveStack(maxLines);
-
-    // ...but process it only if the user needs it
-    gtk_assert_dialog_set_backtrace_callback(GTK_ASSERT_DIALOG(dialog),
-                                             (GtkAssertDialogStackFrameCallback)get_stackframe_callback,
-                                             &dump);
-#endif      // wxUSE_STACKWALKER
-
-    gint result = gtk_dialog_run(GTK_DIALOG (dialog));
-    bool returnCode = false;
-    switch (result)
-    {
-    case GTK_ASSERT_DIALOG_STOP:
-        wxTrap();
-        break;
-    case GTK_ASSERT_DIALOG_CONTINUE:
-        // nothing to do
-        break;
-    case GTK_ASSERT_DIALOG_CONTINUE_SUPPRESSING:
-        // no more asserts
-        returnCode = true;
-        break;
-
-    default:
-        wxFAIL_MSG( wxT("unexpected return code from GtkAssertDialog") );
+        // save the current stack ow...
+        StackDump dump(GTK_ASSERT_DIALOG(dialog));
+        dump.SaveStack(100); // showing more than 100 frames is not very useful
+
+        // ...but process it only if the user needs it
+        gtk_assert_dialog_set_backtrace_callback
+        (
+            GTK_ASSERT_DIALOG(dialog),
+            get_stackframe_callback,
+            &dump
+        );
+#endif // wxUSE_STACKWALKER
+
+        gint result = gtk_dialog_run(GTK_DIALOG (dialog));
+        bool returnCode = false;
+        switch (result)
+        {
+            case GTK_ASSERT_DIALOG_STOP:
+                wxTrap();
+                break;
+            case GTK_ASSERT_DIALOG_CONTINUE:
+                // nothing to do
+                break;
+            case GTK_ASSERT_DIALOG_CONTINUE_SUPPRESSING:
+                // no more asserts
+                returnCode = true;
+                break;
+
+            default:
+                wxFAIL_MSG( wxT("unexpected return code from GtkAssertDialog") );
+        }
+
+        gtk_widget_destroy(dialog);
+        return returnCode;
     }
+#endif // wxDEBUG_LEVEL
 
-    gtk_widget_destroy(dialog);
-    return returnCode;
-#else // !wxDEBUG_LEVEL
-    // this function is never called in this case
-    wxUnusedVar(msg);
-    return false;
-#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL
+    return wxAppTraitsBase::ShowAssertDialog(msg);
 }
 
 wxString wxGUIAppTraits::GetDesktopEnvironment() const
@@ -483,11 +472,11 @@ wxGUIAppTraits::GetStandardCmdLineOptions(wxArrayString& names,
     {
         // since GTK>=2.6, we can use the glib_check_version() symbol...
 
-        // check whether GLib version is greater than 2.6 but also lower than 2.19
+        // check whether GLib version is greater than 2.6 but also lower than 2.31
         // because, as we use the undocumented _GOptionGroup struct, we don't want
-        // to run this code with future versions which might change it (2.19 is the
+        // to run this code with future versions which might change it (2.30 is the
         // latest one at the time of this writing)
-        if (!glib_check_version(2,6,0) && glib_check_version(2,20,0))
+        if (glib_check_version(2,6,0) == NULL && glib_check_version(2,31,0))
         {
             usage << _("The following standard GTK+ options are also supported:\n");