#pragma implementation "window.h"
#endif
+#ifdef __VMS
+#define XtDisplay XTDISPLAY
+#define XtWindow XTWINDOW
+#define XtScreen XTSCREEN
+#endif
+
#include "wx/setup.h"
#include "wx/menu.h"
#include "wx/dc.h"
#include "wx/dnd.h"
#endif
+// DoSetSizeIntr and CanvasSetSizeIntr
+// PROBLEM:
+// under Motif composite controls (such as wxCalendarCtrl or generic wxSpinCtrl
+// don't work and/or segfault because
+// 1) wxWindow::Create calls SetSize,
+// which results in a call to DoSetSize much earlier than in the other ports
+// 2) if wxWindow::Create is called (wxControl::Create calls it)
+// then DoSetSize is never called, causing layout problems in composite
+// controls
+//
+// SOLUTION:
+// 1) don't call SetSize, DoSetSize, DoMoveWindow, DoGetPosition,
+// DoSetPosition directly or indirectly from wxWindow::Create
+// 2) call DoMoveWindow from DoSetSize, allowing controls to override it,
+// but make wxWindow::DoMoveWindow a no-op if it is called from
+// an overridden DoMoveWindow (i.e. wxFoo::DoMoveWindow calls
+// wxWindow::DoMoveWindow; this is to preserve the behaviour
+// before this change
+
#ifdef __VMS__
#pragma message disable nosimpint
#endif
// ----------------------------------------------------------------------------
extern wxHashTable *wxWidgetHashTable;
+static wxWindow* g_captureWindow = NULL;
+
// ----------------------------------------------------------------------------
// private functions
parent->AddChild(this);
- m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+ m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
m_foregroundColour = *wxBLACK;
//// TODO: we should probably optimize by only creating a
// Scrolled widget needs to have its colour changed or we get a little blue
// square where the scrollbars abutt
- wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+ wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
DoChangeBackgroundColour(m_scrolledWindow, backgroundColour, TRUE);
DoChangeBackgroundColour(m_drawingArea, backgroundColour, TRUE);
// Without this, the cursor may not be restored properly (e.g. in splitter
// sample).
SetCursor(*wxSTANDARD_CURSOR);
- SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT));
- SetSize(pos.x, pos.y, size.x, size.y);
-
+ SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+ DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, TRUE);
return TRUE;
}
// Destructor
wxWindow::~wxWindow()
{
+ if (g_captureWindow == this)
+ g_captureWindow = NULL;
+
m_isBeingDeleted = TRUE;
// Motif-specific actions first
m_hScrollBar = (WXWidget) hScrollBar;
- wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+ wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
DoChangeBackgroundColour(m_hScrollBar, backgroundColour, TRUE);
XtRealizeWidget(hScrollBar);
NULL);
m_vScrollBar = (WXWidget) vScrollBar;
- wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+ wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
DoChangeBackgroundColour(m_vScrollBar, backgroundColour, TRUE);
XtRealizeWidget(vScrollBar);
return wxString(title);
}
-void wxWindow::CaptureMouse()
+void wxWindow::DoCaptureMouse()
{
+ g_captureWindow = this;
if ( m_winCaptured )
return;
m_winCaptured = TRUE;
}
-void wxWindow::ReleaseMouse()
+void wxWindow::DoReleaseMouse()
{
+ g_captureWindow = NULL;
if ( !m_winCaptured )
return;
Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient);
wxCHECK_MSG( scrollBar, 0, "no such scrollbar" );
- int range;
- XtVaGetValues(scrollBar, XmNmaximum, &range, NULL);
+ int range = 0;
+ if (scrollBar)
+ XtVaGetValues(scrollBar, XmNmaximum, &range, NULL);
return range;
}
XmMenuPosition (menuWidget, &event);
XtManageChild (menuWidget);
+ XEvent x_event;
+ // The ID of a pop-up menu is 1 when active, and is set to 0 by the
+ // idle-time destroy routine.
+ // Waiting until this ID changes causes this function to block until
+ // the menu has been dismissed and the widgets cleaned up.
+ // In other words, once this routine returns, it is safe to delete
+ // the menu object.
+ // Ian Brown <ian.brown@printsoft.de>
+ while (menu->GetId() == 1)
+ {
+ XtAppNextEvent( (XtAppContext) wxTheApp->GetAppContext(), &x_event);
+
+ wxTheApp->ProcessXEvent((WXEvent*) & x_event);
+
+ if (XtAppPending( (XtAppContext) wxTheApp->GetAppContext() ) == 0)
+ {
+ if (!wxTheApp->ProcessIdle())
+ {
+#if wxUSE_THREADS
+ // leave the main loop to give other threads a chance to
+ // perform their GUI work
+ wxMutexGuiLeave();
+ wxUsleep(20);
+ wxMutexGuiEnter();
+#endif
+ }
+ }
+ }
return TRUE;
}
Widget widget = (Widget) GetTopWidget();
Dimension xx, yy;
XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
- *x = xx; *y = yy;
+ if(x) *x = xx; if(y) *y = yy;
}
void wxWindow::DoGetPosition(int *x, int *y) const
yy -= pt.y;
}
- *x = xx; *y = yy;
+ if(x) *x = xx; if(y) *y = yy;
}
void wxWindow::DoScreenToClient(int *x, int *y) const
Widget widget = (Widget) GetClientWidget();
Dimension xx, yy;
XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
- *x = xx; *y = yy;
+ if(x) *x = xx; if(y) *y = yy;
}
void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+ DoSetSizeIntr(x, y, width, height, sizeFlags, FALSE);
+}
+
+void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
+ int sizeFlags, bool fromCtor)
{
// A bit of optimization to help sort out the flickers.
- int oldX, oldY, oldW, oldH;
- GetSize(& oldW, & oldH);
- GetPosition(& oldX, & oldY);
+ int oldX = -1, oldY = -1, oldW = -1, oldH = -1;
+ if( !fromCtor )
+ {
+ GetSize(& oldW, & oldH);
+ GetPosition(& oldX, & oldY);
+ }
if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
{
{
if (m_drawingArea)
{
- CanvasSetSize(x, y, width, height, sizeFlags);
+ CanvasSetSizeIntr(x, y, width, height, sizeFlags, fromCtor);
+ if( !fromCtor ) DoMoveWindow(x, y, width, height);
return;
}
return wxPoint(0, 0);
}
-// Makes an adjustment to the window position (for example, a frame that has
-// a toolbar that it manages itself).
-void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
-{
- if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent())
- {
- wxPoint pt(GetParent()->GetClientAreaOrigin());
- x += pt.x; y += pt.y;
- }
-}
-
void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH)
{
m_minWidth = minW;
void wxWindow::DoMoveWindow(int x, int y, int width, int height)
{
+ // see the top of the file, near DoSetSizeIntr
+ if (m_drawingArea)
+ return;
+
XtVaSetValues((Widget)GetTopWidget(),
XmNx, x,
XmNy, y,
wxCHECK_RET( fontToUse->Ok(), "valid window font needed" );
- WXFontStructPtr pFontStruct = theFont->GetFontStruct(1.0, GetXDisplay());
+ WXFontStructPtr pFontStruct = fontToUse->GetFontStruct(1.0, GetXDisplay());
int direction, ascent, descent2;
XCharStruct overall;
wxAcceleratorEntry* entry = & (entries[i]);
if (entry->MatchesEvent(event))
{
- // Bingo, we have a match. Now find a control that matches the entry
- // command id.
+ // Bingo, we have a match. Now find a control that matches the
+ // entry command id.
// Need to go up to the top of the window hierarchy, since it might
// be e.g. a menu item
{
// I have a dclick
canvas->SetLastClick(0, ts);
- switch ( eventType )
+
+ wxEventType typeDouble;
+ if ( eventType == wxEVT_LEFT_DOWN )
+ typeDouble = wxEVT_LEFT_DCLICK;
+ else if ( eventType == wxEVT_MIDDLE_DOWN )
+ typeDouble = wxEVT_MIDDLE_DCLICK;
+ else if ( eventType == wxEVT_RIGHT_DOWN )
+ typeDouble = wxEVT_RIGHT_DCLICK;
+ else
+ typeDouble = wxEVT_NULL;
+
+ if ( typeDouble != wxEVT_NULL )
{
- case wxEVT_LEFT_DOWN:
- wxevent.SetEventType(wxEVT_LEFT_DCLICK);
- break;
- case wxEVT_MIDDLE_DOWN:
- wxevent.SetEventType(wxEVT_MIDDLE_DCLICK);
- break;
- case wxEVT_RIGHT_DOWN:
- wxevent.SetEventType(wxEVT_RIGHT_DCLICK);
- break;
-
- default :
- break;
+ wxevent.SetEventType(typeDouble);
}
-
}
else
{
case KeyPress:
{
KeySym keySym;
+ static char buf[100];
#if 0
XComposeStatus compose;
- (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, &compose);
+ (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, &compose);
#endif // 0
- (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
+ (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL);
int id = wxCharCodeXToWX (keySym);
wxEventType eventType = wxEVT_CHAR;
}
case KeyRelease:
{
+ static char buf[100];
KeySym keySym;
- (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
+ (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL);
int id = wxCharCodeXToWX (keySym);
wxKeyEvent event (wxEVT_KEY_UP);
// CanvaseXXXSize() functions
// ----------------------------------------------------------------------------
+void wxWindow::CanvasSetSize(int x, int y, int w, int h, int sizeFlags)
+{
+ CanvasSetSizeIntr(x, y, w, h, sizeFlags, FALSE);
+}
+
// SetSize, but as per old wxCanvas (with drawing widget etc.)
-void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
+void wxWindow::CanvasSetSizeIntr(int x, int y, int w, int h, int sizeFlags,
+ bool fromCtor)
{
// A bit of optimization to help sort out the flickers.
- int oldX, oldY, oldW, oldH;
- GetSize(& oldW, & oldH);
- GetPosition(& oldX, & oldY);
+ int oldX = -1, oldY = -1, oldW = -1, oldH = -1;
+ // see the top of the file, near DoSetSizeIntr
+ if( !fromCtor )
+ {
+ GetSize(& oldW, & oldH);
+ GetPosition(& oldX, & oldY);
+ }
bool useOldPos = FALSE;
bool useOldSize = FALSE;
{
// I have a dclick
win->SetLastClick(0, ts);
- switch ( eventType )
- {
- case wxEVT_LEFT_DOWN:
- eventType = wxEVT_LEFT_DCLICK;
- break;
- case wxEVT_MIDDLE_DOWN:
- eventType = wxEVT_MIDDLE_DCLICK;
- break;
- case wxEVT_RIGHT_DOWN:
- eventType = wxEVT_RIGHT_DCLICK;
- break;
-
- default :
- break;
- }
-
+ if ( eventType == wxEVT_LEFT_DOWN )
+ eventType = wxEVT_LEFT_DCLICK;
+ else if ( eventType == wxEVT_MIDDLE_DOWN )
+ eventType = wxEVT_MIDDLE_DCLICK;
+ else if ( eventType == wxEVT_RIGHT_DOWN )
+ eventType = wxEVT_RIGHT_DCLICK;
}
else
{
DoChangeBackgroundColour(m_scrolledWindow, m_backgroundColour);
// Have to set the scrollbar colours back since
// the scrolled window seemed to change them
- wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
+ wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
if (m_hScrollBar)
DoChangeBackgroundColour(m_hScrollBar, backgroundColour);
wxWindow *wxGetActiveWindow()
{
// TODO
+ wxFAIL_MSG("Not implemented");
return NULL;
}
+/* static */
+wxWindow *wxWindowBase::GetCapture()
+{
+ return (wxWindow *)g_captureWindow;
+}
+
+
+// Find the wxWindow at the current mouse position, returning the mouse
+// position.
+wxWindow* wxFindWindowAtPointer(wxPoint& pt)
+{
+ return wxFindWindowAtPoint(wxGetMousePosition());
+}
+
+// Get the current mouse position.
+wxPoint wxGetMousePosition()
+{
+ Display *display = (Display*) wxGetDisplay();
+ Window rootWindow = RootWindowOfScreen (DefaultScreenOfDisplay(display));
+ Window rootReturn, childReturn;
+ int rootX, rootY, winX, winY;
+ unsigned int maskReturn;
+
+ XQueryPointer (display,
+ rootWindow,
+ &rootReturn,
+ &childReturn,
+ &rootX, &rootY, &winX, &winY, &maskReturn);
+ return wxPoint(rootX, rootY);
+}
+
+
// ----------------------------------------------------------------------------
// wxNoOptimize: switch off size optimization
// ----------------------------------------------------------------------------
int wxNoOptimize::ms_count = 0;
-
-
-