+#ifdef __UNIX__
+
+extern "C" {
+static gboolean EndProcessDetector(GIOChannel* source, GIOCondition, void* data)
+{
+ wxEndProcessData * const
+ proc_data = static_cast<wxEndProcessData *>(data);
+
+ // child exited, end waiting
+ 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)
+{
+ 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);
+}
+
+#endif // __UNIX__
+
+// ----------------------------------------------------------------------------
+// wxPlatformInfo-related
+// ----------------------------------------------------------------------------
+
+wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
+{
+ if ( verMaj )
+ *verMaj = gtk_major_version;
+ if ( verMin )
+ *verMin = gtk_minor_version;
+
+ return wxPORT_GTK;
+}
+
+#if wxUSE_TIMER
+
+wxTimerImpl *wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
+{
+ return new wxGTKTimerImpl(timer);
+}
+
+#endif // wxUSE_TIMER
+
+#if wxUSE_DETECT_SM
+static wxString GetSM()
+{
+ wxX11Display dpy;
+ if ( !dpy )
+ return wxEmptyString;
+
+ char smerr[256];
+ char *client_id;
+ SmcConn smc_conn = SmcOpenConnection(NULL, NULL,
+ 999, 999,
+ 0 /* mask */, NULL /* callbacks */,
+ NULL, &client_id,
+ WXSIZEOF(smerr), smerr);
+
+ if ( !smc_conn )
+ {
+ wxLogDebug("Failed to connect to session manager: %s", smerr);
+ return wxEmptyString;
+ }
+
+ char *vendor = SmcVendor(smc_conn);
+ wxString ret = wxString::FromAscii( vendor );
+ free(vendor);
+
+ SmcCloseConnection(smc_conn, 0, NULL);
+ free(client_id);
+
+ return ret;
+}
+#endif // wxUSE_DETECT_SM
+
+
+//-----------------------------------------------------------------------------
+// wxGUIAppTraits
+//-----------------------------------------------------------------------------
+
+wxEventLoopBase *wxGUIAppTraits::CreateEventLoop()
+{
+ return new wxEventLoop();
+}
+
+
+#if wxUSE_INTL && defined(__UNIX__)
+void wxGUIAppTraits::SetLocale()
+{
+#ifdef __WXGTK3__
+ setlocale(LC_ALL, "");
+#else
+ gtk_set_locale();
+#endif
+ wxUpdateLocaleIsUtf8();
+}
+#endif
+
+#ifdef __UNIX__
+
+#if wxDEBUG_LEVEL && wxUSE_STACKWALKER
+
+// private helper class
+class StackDump : public wxStackWalker