]> git.saurik.com Git - wxWidgets.git/blobdiff - src/x11/app.cpp
use wxHashMap, not wxHashTable in wxXPMDecoder
[wxWidgets.git] / src / x11 / app.cpp
index ef1b07b838980c49a83fc3c76cbe70740d61724e..c21c217a82574af1ce79911b25f5c88878ceecd0 100644 (file)
@@ -21,8 +21,6 @@
 #include "wx/brush.h"
 #include "wx/cursor.h"
 #include "wx/icon.h"
-#include "wx/palette.h"
-#include "wx/dc.h"
 #include "wx/dialog.h"
 #include "wx/msgdlg.h"
 #include "wx/log.h"
@@ -295,34 +293,37 @@ void wxApp::ProcessXEvent(WXEvent* _event)
     // Find the first wxWindow that corresponds to this event window
     // TODO: may need to translate coordinates from actualWindow
     // to window, if the receiving window != wxWindow window
-    while (window && !(win = wxGetWindowFromTable(window)))
-        window = XGetParent(window);
+    //    while (window && !(win = wxGetWindowFromTable(window)))
+    //        window = wxGetWindowParent(window);
+
+    // Because we're receiving events after a window
+    // has been destroyed, assume a 1:1 match between
+    // Window and wxWindow, so if it's not in the table,
+    // it must have been destroyed.
+
+    win = wxGetWindowFromTable(window);
+    if (!win)
+       return;
 
-    // TODO: shouldn't all the ProcessEvents below
-    // be win->GetEventHandler()->ProcessEvent?
     switch (event->type)
     {
         case KeyPress:
         {
-            if (CheckForAccelerator(_event))
-            {
-                // Do nothing! We intercepted and processed the event as an
-                // accelerator.
+            if (win && !win->IsEnabled())
                 return;
-            }
-            else
+
             {
                 if (win)
                 {
                     wxKeyEvent keyEvent(wxEVT_KEY_DOWN);
-                    wxTranslateKeyEvent(keyEvent, win, window, xEvent);
+                    wxTranslateKeyEvent(keyEvent, win, window, event);
         
                     // We didn't process wxEVT_KEY_DOWN, so send
-                    // wxEVT_KEY_CHAR
-                    if (!win->ProcessEvent( keyEvent ))
+                    // wxEVT_CHAR
+                    if (!win->GetEventHandler()->ProcessEvent( keyEvent ))
                     {
-                        keyEvent.SetEventType(wxEVT_KEY_CHAR);
-                        win->ProcessEvent( keyEvent );
+                        keyEvent.SetEventType(wxEVT_CHAR);
+                        win->GetEventHandler()->ProcessEvent( keyEvent );
                     }
 
                     // We intercepted and processed the key down event
@@ -333,12 +334,15 @@ void wxApp::ProcessXEvent(WXEvent* _event)
         }
         case KeyRelease:
         {
+            if (win && !win->IsEnabled())
+                return;
+
             if (win)
             {
                 wxKeyEvent keyEvent(wxEVT_KEY_UP);
                 wxTranslateKeyEvent(keyEvent, win, window, event);
         
-                win->ProcessEvent( keyEvent );
+                win->GetEventHandler()->ProcessEvent( keyEvent );
             }
             return;
         }
@@ -347,6 +351,33 @@ void wxApp::ProcessXEvent(WXEvent* _event)
             HandlePropertyChange(_event);
             return;
         }
+        case ClientMessage:
+        {           
+            Atom wm_delete_window = XInternAtom(wxGlobalDisplay(), "WM_DELETE_WINDOW", True);;
+            Atom wm_protocols = XInternAtom(wxGlobalDisplay(), "WM_PROTOCOLS", True);;
+
+            if (event->xclient.message_type == wm_protocols)
+            {
+                if ((Atom) (event->xclient.data.l[0]) == wm_delete_window)
+                {
+                    if (win)
+                    {
+                        win->Close(FALSE);
+                    }
+                }
+            }
+            return;
+        }
+        case ConfigureNotify:
+        {
+            if (win)
+            {
+                wxSizeEvent sizeEvent( wxSize(event->xconfigure.width,event->xconfigure.height), win->GetId() );
+                sizeEvent.SetEventObject( win );
+                
+                win->GetEventHandler()->ProcessEvent( sizeEvent );
+            }
+        }
         case ResizeRequest:
         {
             /* Terry Gitnick <terryg@scientech.com> - 1/21/98
@@ -354,7 +385,7 @@ void wxApp::ProcessXEvent(WXEvent* _event)
             * window is recieved. Prevents flicker as windows are resized.
             */
         
-            Display *disp = wxGetDisplay();
+            Display *disp = (Display*) wxGetDisplay();
             XEvent report;
             
             //  to avoid flicker
@@ -370,7 +401,7 @@ void wxApp::ProcessXEvent(WXEvent* _event)
                 wxSizeEvent sizeEvent(sz, win->GetId());
                 sizeEvent.SetEventObject(win);
 
-                win->ProcessEvent( wxevent );
+                win->GetEventHandler()->ProcessEvent( sizeEvent );
             }
 
             return;
@@ -379,13 +410,11 @@ void wxApp::ProcessXEvent(WXEvent* _event)
         {
             if (win)
             {
-                win->AddUpdateRect(event->xexpose.x, event->xexpose.y,
-                               event->xexpose.width, event->xexpose.height);
-            
-                if (event -> xexpose.count == 0)
+                win->GetUpdateRegion().Union( event->xexpose.x, event->xexpose.y,
+                                              event->xexpose.width, event->xexpose.height);
+                if (event->xexpose.count == 0)
                 {
-                    win->DoPaint();
-                    win->ClearUpdateRects();
+                    win->X11SendPaintEvents();  // TODO let an idle handler do that
                 }
             }
 
@@ -397,11 +426,14 @@ void wxApp::ProcessXEvent(WXEvent* _event)
         case ButtonRelease:
         case MotionNotify:
         {
+            if (win && !win->IsEnabled())
+                return;
+
             if (win)
             {
                 wxMouseEvent wxevent;
                 wxTranslateMouseEvent(wxevent, win, window, event);
-                win->ProcessEvent( wxevent );
+                win->GetEventHandler()->ProcessEvent( wxevent );
             }
             return;
         }
@@ -411,7 +443,7 @@ void wxApp::ProcessXEvent(WXEvent* _event)
                 {
                     wxFocusEvent focusEvent(wxEVT_SET_FOCUS, win->GetId());
                     focusEvent.SetEventObject(win);
-                    win->ProcessEvent(focusEvent);
+                    win->GetEventHandler()->ProcessEvent(focusEvent);
                 }
                 break;
             }
@@ -421,10 +453,16 @@ void wxApp::ProcessXEvent(WXEvent* _event)
                 {
                     wxFocusEvent focusEvent(wxEVT_KILL_FOCUS, win->GetId());
                     focusEvent.SetEventObject(win);
-                    win->ProcessEvent(focusEvent);
+                    win->GetEventHandler()->ProcessEvent(focusEvent);
                 }
                 break;
             }
+        case DestroyNotify:
+            {
+                // Do we want to process this (for top-level windows)?
+                // But we want to be able to veto closes, anyway
+                break;
+            }
         default:
         {
             break;
@@ -579,6 +617,13 @@ void wxApp::DeletePendingObjects()
 // Create an application context
 bool wxApp::OnInitGui()
 {
+    // Eventually this line will be removed, but for
+    // now we don't want to try popping up a dialog
+    // for error messages.
+    delete wxLog::SetActiveTarget(new wxLogStderr);
+    if (!wxAppBase::OnInitGui())
+       return FALSE;
+    
     // TODO: parse argv and get display to pass to XOpenDisplay
     Display* dpy = XOpenDisplay(NULL);
     m_initialDisplay = (WXDisplay*) dpy;
@@ -589,8 +634,8 @@ bool wxApp::OnInitGui()
             (const char*) className);
         exit(-1);
     }
-    XSelectInput(m_initialDisplay,
-        XDefaultRootWindow(m_initialDisplay),
+    XSelectInput((Display*) m_initialDisplay,
+        XDefaultRootWindow((Display*) m_initialDisplay),
         PropertyChangeMask);
 
 #ifdef __WXDEBUG__
@@ -620,52 +665,21 @@ WXColormap wxApp::GetMainColormap(WXDisplay* display)
     return (WXColormap) c;
 }
 
-static Window XGetParent(Window window)
+Window wxGetWindowParent(Window window)
 {
     Window parent, root = 0;
     unsigned int noChildren = 0;
-    if (XQueryTree(wxGetDisplay(), window, & root, & parent,
-        NULL, & noChildren))
+    Window* children = NULL;
+    int res = XQueryTree((Display*) wxGetDisplay(), window, & root, & parent,
+                        & children, & noChildren);
+    if (children)
+        XFree(children);
+    if (res)
         return parent;
     else
         return (Window) 0;
 }
 
-// Returns TRUE if an accelerator has been processed
-bool wxApp::CheckForAccelerator(WXEvent* event)
-{
-    XEvent* xEvent = (XEvent*) event;
-    if (xEvent->xany.type == KeyPress)
-    {
-        // Find a wxWindow for this window
-        // TODO: should get display for the window, not the current display
-        Window window = xEvent->xany.window;
-        wxWindow* win = NULL;
-
-        // Find the first wxWindow that corresponds to this event window
-        while (window && !(win = wxGetWindowFromTable(window)))
-            window = XGetParent(window);
-
-        if (!window || !win)
-            return FALSE;
-
-        wxKeyEvent keyEvent(wxEVT_CHAR);
-        wxTranslateKeyEvent(keyEvent, win, (Window) 0, xEvent);
-
-        // Now we have a wxKeyEvent and we have a wxWindow.
-        // Go up the hierarchy until we find a matching accelerator,
-        // or we get to the top.
-        while (win)
-        {
-            if (win->ProcessAccelerator(keyEvent))
-                return TRUE;
-            win = win->GetParent();
-        }
-        return FALSE;
-    }
-    return FALSE;
-}
-
 void wxExit()
 {
     int retValue = 0;
@@ -750,4 +764,4 @@ extern "C" XtAppContext wxGetAppContext()
 {
     return (XtAppContext)wxTheApp->GetAppContext();
 }
-#endif
\ No newline at end of file
+#endif