]> git.saurik.com Git - wxWidgets.git/commitdiff
Main change is that we now close X11 display on program exit: as this couldn't
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 19 Oct 2006 14:39:53 +0000 (14:39 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 19 Oct 2006 14:39:53 +0000 (14:39 +0000)
be done in wxApp dtor (too early), a special module had to be created for it
and module dependencies added for the other modules which have to be cleaned
up while the display is still open.

Also a few minor formatting changes and removed a couple of unused variables
from wxApp.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42119 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/x11/app.h
src/unix/utilsx11.cpp
src/x11/app.cpp
src/x11/dcclient.cpp
src/x11/utils.cpp
src/x11/window.cpp

index 416a3e2ae3d43e57188cf365e5a01751aa7237e9..b78e4abae924b4fa8141d435c4c35cd2ec6b5c33 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        app.h
+// Name:        wx/x11/app.h
 // Purpose:     wxApp class
 // Author:      Julian Smart
 // Modified by:
@@ -9,8 +9,8 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef _WX_APP_H_
-#define _WX_APP_H_
+#ifndef _WX_X11_APP_H_
+#define _WX_X11_APP_H_
 
 // ----------------------------------------------------------------------------
 // headers
@@ -36,8 +36,6 @@ class WXDLLEXPORT wxXVisualInfo;
 
 class WXDLLEXPORT wxApp : public wxAppBase
 {
-    DECLARE_DYNAMIC_CLASS(wxApp)
-
 public:
     wxApp();
     virtual ~wxApp();
@@ -62,9 +60,6 @@ public:
     virtual void OnAssert(const wxChar *file, int line, const wxChar* cond, const wxChar *msg);
 #endif // __WXDEBUG__
 
-protected:
-    bool                  m_showOnInit;
-
 public:
     // Implementation
     virtual bool Initialize(int& argc, wxChar **argv);
@@ -96,10 +91,6 @@ public:
         return m_visualInfo;
     }
 
-    // We need this before creating the app
-    static   WXDisplay* GetDisplay() { return ms_display; }
-    static   WXDisplay* ms_display;
-
 public:
     static long           sm_lastMessageTime;
     bool                  m_showIconic;
@@ -110,14 +101,13 @@ public:
 #endif
 
 protected:
-    bool                  m_keepGoing;
-
     WXWindow              m_topLevelWidget;
     WXColormap            m_mainColormap;
     long                  m_maxRequestSize;
 
+    DECLARE_DYNAMIC_CLASS(wxApp)
     DECLARE_EVENT_TABLE()
 };
 
-#endif // _WX_APP_H_
+#endif // _WX_X11_APP_H_
 
index e1cf437119b0bf21bd3753732ef1b3991eec425a..aa349b3efc354fa17d4f2fc33535c980cd35162f 100644 (file)
@@ -804,15 +804,7 @@ bool wxGetKeyState(wxKeyCode key)
     wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key !=
         WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons"));
 
-#if defined(__WXX11__)
-    Display *pDisplay = (Display*) wxApp::GetDisplay();
-#elif defined(__WXGTK__)
-    Display *pDisplay = GDK_DISPLAY();
-#elif defined(__WXMOTIF__)
-    Display *pDisplay = (Display*) (wxTheApp ? wxTheApp->GetInitialDisplay() : NULL);
-#else
-#error  Add code to get the DISPLAY for this platform
-#endif
+    Display *pDisplay = (Display*) wxGetDisplay();
 
     int iKey = wxCharCodeWXToX(key);
     int          iKeyMask = 0;
@@ -825,19 +817,21 @@ bool wxGetKeyState(wxKeyCode key)
         return false;
 
     if ( IsModifierKey(iKey) )  // If iKey is a modifier key, use a different method
-        {  for (int i = 0; i < 8; ++i)
     {
-        if ( map->modifiermap[map->max_keypermod * i] == keyCode)
+        for (int i = 0; i < 8; ++i)
         {
-            iKeyMask = 1 << i;
+            if ( map->modifiermap[map->max_keypermod * i] == keyCode)
+            {
+                iKeyMask = 1 << i;
+            }
         }
+
+        XQueryPointer(pDisplay, DefaultRootWindow(pDisplay), &wDummy1, &wDummy2,
+                        &iDummy3, &iDummy4, &iDummy5, &iDummy6, &iMask );
+        XFreeModifiermap(map);
+        return (iMask & iKeyMask) != 0;
     }
 
-    XQueryPointer(pDisplay, DefaultRootWindow(pDisplay), &wDummy1, &wDummy2,
-                  &iDummy3, &iDummy4, &iDummy5, &iDummy6, &iMask );
-    XFreeModifiermap(map);
-    return (iMask & iKeyMask) != 0;
-        }
     // From the XLib manual:
     // The XQueryKeymap() function returns a bit vector for the logical state of the keyboard, 
     // where each bit set to 1 indicates that the corresponding key is currently pressed down. 
index e5dc6785da67ecc9d0327d685f2683b065cb2016..2d35f3b63026d7da9a0b128a1178d15d3099de3f 100644 (file)
@@ -83,7 +83,6 @@ static int wxXErrorHandler(Display *dpy, XErrorEvent *xevent)
 //------------------------------------------------------------------------
 
 long wxApp::sm_lastMessageTime = 0;
-WXDisplay *wxApp::ms_display = NULL;
 
 IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
 
@@ -165,34 +164,24 @@ bool wxApp::Initialize(int& argC, wxChar **argV)
         }
     }
 
-    // X11 display stuff
-    Display *xdisplay;
-    if ( displayName.empty() )
-        xdisplay = XOpenDisplay( NULL );
-    else
-        xdisplay = XOpenDisplay( displayName.ToAscii() );
-    if (!xdisplay)
+    // open and set up the X11 display
+    if ( !wxSetDisplay(displayName) )
     {
-        wxLogError( _("wxWidgets could not open display. Exiting.") );
+        wxLogError(_("wxWidgets could not open display. Exiting."));
         return false;
     }
 
+    Display *dpy = wxGlobalDisplay();
     if (syncDisplay)
-        XSynchronize(xdisplay, True);
-
-    ms_display = (WXDisplay*) xdisplay;
+        XSynchronize(dpy, True);
 
-    XSelectInput( xdisplay, XDefaultRootWindow(xdisplay), PropertyChangeMask);
+    XSelectInput(dpy, XDefaultRootWindow(dpy), PropertyChangeMask);
 
-    // Misc.
     wxSetDetectableAutoRepeat( true );
 
-    if ( !wxAppBase::Initialize(argC, argV) )
-    {
-        XCloseDisplay(xdisplay);
 
+    if ( !wxAppBase::Initialize(argC, argV) )
         return false;
-    }
 
 #if wxUSE_UNICODE
     // Glib's type system required by Pango
@@ -221,12 +210,8 @@ void wxApp::CleanUp()
 
 wxApp::wxApp()
 {
-    // TODO: parse the command line
-    argc = 0;
-    argv = NULL;
-
-    m_mainColormap = (WXColormap) NULL;
-    m_topLevelWidget = (WXWindow) NULL;
+    m_mainColormap = NULL;
+    m_topLevelWidget = NULL;
     m_maxRequestSize = 0;
     m_showIconic = false;
     m_initialSize = wxDefaultSize;
@@ -678,13 +663,14 @@ bool wxApp::OnInitGui()
     if (!wxAppBase::OnInitGui())
         return false;
 
-    GetMainColormap( wxApp::GetDisplay() );
+    Display *dpy = wxGlobalDisplay();
+    GetMainColormap(dpy);
 
-    m_maxRequestSize = XMaxRequestSize( (Display*) wxApp::GetDisplay() );
+    m_maxRequestSize = XMaxRequestSize(dpy);
 
 #if !wxUSE_NANOX
     m_visualInfo = new wxXVisualInfo;
-    wxFillXVisualInfo( m_visualInfo, (Display*) wxApp::GetDisplay() );
+    wxFillXVisualInfo(m_visualInfo, dpy);
 #endif
 
     return true;
@@ -700,33 +686,34 @@ bool wxApp::OnInitGui()
 
 PangoContext* wxApp::GetPangoContext()
 {
-    static PangoContext *ret = NULL;
-    if (ret)
-        return ret;
-
-    Display *xdisplay = (Display*) wxApp::GetDisplay();
+    static PangoContext *s_pangoContext = NULL;
+    if ( !s_pangoContext )
+    {
+        Display *dpy = wxGlobalDisplay();
 
 #ifdef HAVE_PANGO_XFT
-    int xscreen = DefaultScreen(xdisplay);
-    static int use_xft = -1;
-    if (use_xft == -1)
-    {
-        wxString val = wxGetenv( L"GDK_USE_XFT" );
-        use_xft = (val == L"1");
-    }
+        int xscreen = DefaultScreen(dpy);
+        static int use_xft = -1;
+        if (use_xft == -1)
+        {
+            wxString val = wxGetenv( L"GDK_USE_XFT" );
+            use_xft = val == L"1";
+        }
 
-    if (use_xft)
-        ret = pango_xft_get_context( xdisplay, xscreen );
-    else
-#endif
-        ret = pango_x_get_context( xdisplay );
+        if (use_xft)
+            s_pangoContext = pango_xft_get_context(dpy, xscreen);
+        else
+#endif // HAVE_PANGO_XFT
+            s_pangoContext = pango_x_get_context(dpy);
 
-    if (!PANGO_IS_CONTEXT(ret))
-        wxLogError( wxT("No pango context.") );
+        if (!PANGO_IS_CONTEXT(s_pangoContext))
+            wxLogError( wxT("No pango context.") );
+    }
 
-    return ret;
+    return s_pangoContext;
 }
-#endif
+
+#endif // wxUSE_UNICODE
 
 WXColormap wxApp::GetMainColormap(WXDisplay* display)
 {
index 849911fa69ce5e925a3f0b8f52741b9765446fe7..c799f1fbedc596a1dd600302f35dd650323d42d5 100644 (file)
@@ -2366,8 +2366,15 @@ wxPaintDC::wxPaintDC(wxWindow* window)
 class wxDCModule : public wxModule
 {
 public:
-    bool OnInit();
-    void OnExit();
+    // we must be cleaned up before wxDisplayModule which closes the global
+    // display
+    wxDCModule()
+    {
+        AddDependency(wxClassInfo::FindClass(_T("wxX11DisplayModule")));
+    }
+
+    bool OnInit() { wxInitGCPool(); return true; }
+    void OnExit() { wxCleanUpGCPool(); }
 
 private:
     DECLARE_DYNAMIC_CLASS(wxDCModule)
@@ -2375,13 +2382,3 @@ private:
 
 IMPLEMENT_DYNAMIC_CLASS(wxDCModule, wxModule)
 
-bool wxDCModule::OnInit()
-{
-    wxInitGCPool();
-    return true;
-}
-
-void wxDCModule::OnExit()
-{
-    wxCleanUpGCPool();
-}
index 6c8fa963cb9d4f3f654dc83dc5118c340dbd41e2..df9d4f9da5b42e29040cc2e3a1017e953feec1c7 100644 (file)
@@ -239,40 +239,54 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
     wxDisplaySize(width, height);
 }
 
+wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
+{
+    return wxGenericFindWindowAtPoint(pt);
+}
+
 
 // Configurable display in wxX11 and wxMotif
-static WXDisplay *gs_currentDisplay = NULL;
+static Display *gs_currentDisplay = NULL;
 static wxString gs_displayName;
 
 WXDisplay *wxGetDisplay()
 {
-    if (gs_currentDisplay)
-        return gs_currentDisplay;
-    return wxApp::GetDisplay();
+    return (WXDisplay *)gs_currentDisplay;
 }
 
-bool wxSetDisplay(const wxString& display_name)
+// close the current display
+void wxCloseDisplay()
 {
-    gs_displayName = display_name;
-
-    if ( display_name.empty() )
+    if ( gs_currentDisplay )
     {
-        gs_currentDisplay = NULL;
+        if ( XCloseDisplay(gs_currentDisplay) != 0 )
+        {
+            wxLogWarning(_("Failed to close the display \"%s\""),
+                         gs_displayName.c_str());
+        }
 
-        return true;
+        gs_currentDisplay = NULL;
+        gs_displayName.clear();
     }
-    else
-    {
-        Display* display = XOpenDisplay((char*) display_name.c_str());
+}
 
-        if (display)
-        {
-            gs_currentDisplay = (WXDisplay*) display;
-            return true;
-        }
-        else
-            return false;
+bool wxSetDisplay(const wxString& displayName)
+{
+    Display *
+        dpy = XOpenDisplay(displayName.empty() ? NULL : displayName.mb_str());
+
+    if ( !dpy )
+    {
+        wxLogError(_("Failed to open display \"%s\"."), displayName.c_str());
+        return false;
     }
+
+    wxCloseDisplay();
+
+    gs_currentDisplay = dpy;
+    gs_displayName = displayName;
+
+    return true;
 }
 
 wxString wxGetDisplayName()
@@ -280,10 +294,20 @@ wxString wxGetDisplayName()
     return gs_displayName;
 }
 
-wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
+#include "wx/module.h"
+
+// the module responsible for closing the X11 display at the program end
+class wxX11DisplayModule : public wxModule
 {
-    return wxGenericFindWindowAtPoint(pt);
-}
+public:
+    virtual bool OnInit() { return true; }
+    virtual void OnExit() { wxCloseDisplay(); }
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxX11DisplayModule)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxX11DisplayModule, wxModule)
 
 // ----------------------------------------------------------------------------
 // Some colour manipulation routines
index d51631aacedbafffb441f43608b49023841b7c51..9c5f6f49b87cf537af724f28cb18972ab28d51b5 100644 (file)
@@ -1694,8 +1694,14 @@ int wxNoOptimize::ms_count = 0;
 class wxWinModule : public wxModule
 {
 public:
-    bool OnInit();
-    void OnExit();
+    wxWinModule()
+    {
+        // we must be cleaned up before the display is closed
+        AddDependency(wxClassInfo::FindClass(_T("wxX11DisplayModule")));
+    }
+
+    virtual bool OnInit();
+    virtual void OnExit();
 
 private:
     DECLARE_DYNAMIC_CLASS(wxWinModule)