X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b0fb34be895a9596131233edd1bf68b10c052b4..5229b11d2c3163370106668381c2498abe6f792f:/src/x11/app.cpp diff --git a/src/x11/app.cpp b/src/x11/app.cpp index ef1b07b838..c21c217a82 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -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 - 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