]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/window.cpp
Someone need to make the clientdata be void* instead of this char*
[wxWidgets.git] / src / motif / window.cpp
index 0cae0d05d1d14bea55f6a90507e9c300c1585a09..87a3090c26fdddafba7d0f154cc63d6515f22d1a 100644 (file)
@@ -36,7 +36,7 @@
 #include "wx/msgdlg.h"
 #include "wx/frame.h"
 #include "wx/scrolwin.h"
-
+#include "wx/module.h"
 #include "wx/menuitem.h"
 #include "wx/log.h"
 
@@ -53,6 +53,7 @@
 #include <Xm/ScrollBar.h>
 #include <Xm/Frame.h>
 #include <Xm/Label.h>
+#include <Xm/RowColumn.h>           // for XmMenuPosition
 
 #include "wx/motif/private.h"
 
@@ -68,7 +69,7 @@ static const int SCROLL_MARGIN = 4;
 // global variables for this module
 // ----------------------------------------------------------------------------
 
-static wxHashTable *gs_wxWidgetHashTable;
+extern wxHashTable *wxWidgetHashTable;
 
 // ----------------------------------------------------------------------------
 // private functions
@@ -369,6 +370,9 @@ wxWindow::~wxWindow()
 
     ClearUpdateRects();
 
+    if ( m_parent )
+        m_parent->RemoveChild( this );
+
     // If m_drawingArea, we're a fully-fledged window with drawing area,
     // scrollbars etc. (what wxCanvas used to be)
     if ( m_drawingArea )
@@ -1040,6 +1044,76 @@ void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip))
 
 #endif // wxUSE_TOOLTIPS
 
+// ----------------------------------------------------------------------------
+// popup menus
+// ----------------------------------------------------------------------------
+
+bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
+{
+    Widget widget = (Widget) GetMainWidget();
+
+    /* The menuId field seems to be usused, so we'll use it to
+    indicate whether a menu is popped up or not:
+    0: Not currently created as a popup
+    -1: Created as a popup, but not active
+    1: Active popup.
+    */
+
+    if (menu->GetParent() && (menu->GetId() != -1))
+        return FALSE;
+
+    if (menu->GetMainWidget()) {
+        menu->DestroyMenu(TRUE);
+    }
+
+    menu->SetId(1); /* Mark as popped-up */
+    menu->CreateMenu(NULL, widget, menu);
+    menu->SetInvokingWindow(this);
+
+    menu->UpdateUI();
+
+    //  menu->SetParent(parent);
+    //  parent->children->Append(menu);  // Store menu for later deletion
+
+    Widget menuWidget = (Widget) menu->GetMainWidget();
+
+    int rootX = 0;
+    int rootY = 0;
+
+    int deviceX = x;
+    int deviceY = y;
+    /*
+    if (this->IsKindOf(CLASSINFO(wxCanvas)))
+    {
+    wxCanvas *canvas = (wxCanvas *) this;
+    deviceX = canvas->GetDC ()->LogicalToDeviceX (x);
+    deviceY = canvas->GetDC ()->LogicalToDeviceY (y);
+    }
+    */
+
+    Display *display = XtDisplay (widget);
+    Window rootWindow = RootWindowOfScreen (XtScreen((Widget)widget));
+    Window thisWindow = XtWindow (widget);
+    Window childWindow;
+    XTranslateCoordinates (display, thisWindow, rootWindow, (int) deviceX, (int) deviceY,
+        &rootX, &rootY, &childWindow);
+
+    XButtonPressedEvent event;
+    event.type = ButtonPress;
+    event.button = 1;
+
+    event.x = deviceX;
+    event.y = deviceY;
+
+    event.x_root = rootX;
+    event.y_root = rootY;
+
+    XmMenuPosition (menuWidget, &event);
+    XtManageChild (menuWidget);
+
+    return TRUE;
+}
+
 // ---------------------------------------------------------------------------
 // moving and resizing
 // ---------------------------------------------------------------------------
@@ -1588,26 +1662,26 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
 bool wxAddWindowToTable(Widget w, wxWindow *win)
 {
     wxWindow *oldItem = NULL;
-    if ((oldItem = (wxWindow *)gs_wxWidgetHashTable->Get ((long) w)))
+    if ((oldItem = (wxWindow *)wxWidgetHashTable->Get ((long) w)))
     {
         wxLogDebug("Widget table clash: new widget is %ld, %s",
                    (long)w, win->GetClassInfo()->GetClassName());
         return FALSE;
     }
 
-    gs_wxWidgetHashTable->Put((long) w, win);
+    wxWidgetHashTable->Put((long) w, win);
 
     return TRUE;
 }
 
 wxWindow *wxGetWindowFromTable(Widget w)
 {
-    return (wxWindow *)gs_wxWidgetHashTable->Get((long) w);
+    return (wxWindow *)wxWidgetHashTable->Get((long) w);
 }
 
 void wxDeleteWindowFromTable(Widget w)
 {
-    gs_wxWidgetHashTable->Delete((long)w);
+    wxWidgetHashTable->Delete((long)w);
 }
 
 // ----------------------------------------------------------------------------