- 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
- Widget widget = XtWindowToWidget((Display*) wxGetDisplay(), xEvent->xany.window);
- wxWindow* win = NULL;
-
- // Find the first wxWindow that corresponds to this event window
- while (widget && !(win = wxGetWindowFromTable(widget)))
- widget = XtParent(widget);
-
- if (!widget || !win)
- return FALSE;
-
- wxKeyEvent keyEvent(wxEVT_CHAR);
- wxTranslateKeyEvent(keyEvent, win, (Widget) 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;
+ wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display );
+
+ if( it != m_perDisplayData->end() && it->second.m_visualInfo )
+ return it->second.m_visualInfo;
+
+ wxXVisualInfo* vi = new wxXVisualInfo;
+ wxFillXVisualInfo( vi, (Display*)display );
+
+ (*m_perDisplayData)[display].m_visualInfo = vi;
+
+ return vi;
+}
+
+static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
+ XtPointer ptr)
+{
+ if( wxTheApp )
+ wxTheApp->SetTopLevelWidget( (WXDisplay*)XtDisplay(w),
+ (WXWidget)NULL );
+}
+
+WXWidget wxCreateTopLevelWidget( WXDisplay* display )
+{
+ Widget tlw = XtAppCreateShell( (String)NULL,
+ wxTheApp->GetClassName().c_str(),
+ applicationShellWidgetClass,
+ (Display*)display,
+ NULL, 0 );
+ XtRealizeWidget( tlw );
+
+ XtAddCallback( tlw, XmNdestroyCallback,
+ (XtCallbackProc)wxTLWidgetDestroyCallback,
+ (XtPointer)NULL );
+
+ return (WXWidget)tlw;
+}
+
+WXWidget wxApp::GetTopLevelWidget()
+{
+ WXDisplay* display = wxGetDisplay();
+ wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display );
+
+ if( it != m_perDisplayData->end() && it->second.m_topLevelWidget )
+ return (WXWidget)it->second.m_topLevelWidget;
+
+ WXWidget tlw = wxCreateTopLevelWidget( display );
+ SetTopLevelWidget( display, tlw );
+
+ return tlw;
+}
+
+void wxApp::SetTopLevelWidget(WXDisplay* display, WXWidget widget)
+{
+ (*m_perDisplayData)[display].m_topLevelWidget = (Widget)widget;