#include "wx/dcclient.h"
#include "wx/utils.h"
#include "wx/app.h"
-#include "wx/panel.h"
#include "wx/layout.h"
-#include "wx/dialog.h"
-#include "wx/listbox.h"
#include "wx/button.h"
#include "wx/settings.h"
-#include "wx/msgdlg.h"
#include "wx/frame.h"
#include "wx/scrolwin.h"
#include "wx/module.h"
#include "wx/menuitem.h"
#include "wx/log.h"
+#include "wx/evtloop.h"
+#include "wx/hash.h"
#if wxUSE_DRAG_AND_DROP
#include "wx/dnd.h"
#endif
+// DoSetSizeIntr and DoMoveWindowIntr
+// PROBLEM:
+// under Motif composite controls (such as wxCalendarCtrl or generic wxSpinCtrl
+// did nott work and/or segfaulted 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
+
#ifdef __VMS__
#pragma message disable nosimpint
#endif
}
}
-bool wxWindow::MapOrUnmap(WXWidget widget, bool map)
+bool wxWindow::MapOrUnmap(WXWidget widget, bool domap)
{
Widget w = (Widget)widget;
if ( !w )
return FALSE;
- if ( map )
+ if ( domap )
XtMapWidget(w);
else
XtUnmapWidget(w);
+ // Rationale: a lot of common operations (including but not
+ // limited to moving, resizing and appending items to a listbox)
+ // unmamange the widget, do their work, then manage it again.
+ // This means that, for example adding an item to a listbox will show it,
+ // or that most controls are shown every time they are moved or resized!
+ XtSetMappedWhenManaged( w, domap );
+
return TRUE;
}
// sample).
SetCursor(*wxSTANDARD_CURSOR);
SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
- SetSize(pos.x, pos.y, size.x, size.y);
-
+ DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, TRUE);
return TRUE;
}
wxWindow::~wxWindow()
{
if (g_captureWindow == this)
- g_captureWindow = NULL;
+ g_captureWindow = NULL;
m_isBeingDeleted = TRUE;
if (w)
{
XtDestroyWidget(w);
- m_drawingArea = (WXWidget) 0;
+ m_drawingArea = (WXWidget) 0;
}
// Only if we're _really_ a canvas (not a dialog box/panel)
if (m_hScrollBar)
{
wxDeleteWindowFromTable((Widget) m_hScrollBar);
- XtUnmanageChild((Widget) m_hScrollBar);
+ XtUnmanageChild((Widget) m_hScrollBar);
}
if (m_vScrollBar)
{
wxDeleteWindowFromTable((Widget) m_vScrollBar);
- XtUnmanageChild((Widget) m_vScrollBar);
+ XtUnmanageChild((Widget) m_vScrollBar);
}
if (m_hScrollBar)
- XtDestroyWidget((Widget) m_hScrollBar);
+ XtDestroyWidget((Widget) m_hScrollBar);
if (m_vScrollBar)
- XtDestroyWidget((Widget) m_vScrollBar);
+ XtDestroyWidget((Widget) m_vScrollBar);
UnmanageAndDestroy(m_scrolledWindow);
MapOrUnmap(GetMainWidget(), show);
}
-#if 0
- Window xwin = (Window) GetXWindow();
- Display *xdisp = (Display*) GetXDisplay();
- if (show)
- XMapWindow(xdisp, xwin);
- else
- XUnmapWindow(xdisp, xwin);
-#endif
-
return TRUE;
}
GetClientSize(& w, & h);
}
- wxNode *cnode = m_children.First();
- while (cnode)
- {
- wxWindow *child = (wxWindow*) cnode->Data();
- int sx = 0;
- int sy = 0;
- child->GetSize( &sx, &sy );
- wxPoint pos( child->GetPosition() );
- child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE );
- cnode = cnode->Next();
- }
-
int x1 = (dx >= 0) ? x : x - dx;
int y1 = (dy >= 0) ? y : y - dy;
int w1 = w - abs(dx);
wxBrush brush(GetBackgroundColour(), wxSOLID);
dc.SetBrush(brush); // FIXME: needed?
+ wxWindowList::Node *cnode = m_children.GetFirst();
+ while (cnode)
+ {
+ wxWindow *child = cnode->GetData();
+ int sx = 0;
+ int sy = 0;
+ child->GetSize( &sx, &sy );
+ wxPoint pos( child->GetPosition() );
+ child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE );
+ cnode = cnode->GetNext();
+ }
+
// We'll add rectangles to the list of update rectangles according to which
// bits we've exposed.
wxList updateRects;
// Now send expose events
- wxNode* node = updateRects.First();
+ wxList::Node* node = updateRects.GetFirst();
while (node)
{
- wxRect* rect = (wxRect*) node->Data();
+ wxRect* rect = (wxRect*) node->GetData();
XExposeEvent event;
event.type = Expose;
XSendEvent(display, window, False, ExposureMask, (XEvent *)&event);
- node = node->Next();
+ node = node->GetNext();
}
// Delete the update rects
- node = updateRects.First();
+ node = updateRects.GetFirst();
while (node)
{
- wxRect* rect = (wxRect*) node->Data();
+ wxRect* rect = (wxRect*) node->GetData();
delete rect;
- node = node->Next();
+ node = node->GetNext();
}
XmUpdateDisplay((Widget) GetMainWidget());
// popup menus
// ----------------------------------------------------------------------------
+#if wxUSE_MENUS
+
bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
{
Widget widget = (Widget) GetMainWidget();
if (menu->GetParent() && (menu->GetId() != -1))
return FALSE;
- if (menu->GetMainWidget()) {
+ if (menu->GetMainWidget())
+ {
menu->DestroyMenu(TRUE);
}
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
+ // 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
+ // 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);
+ wxEventLoop evtLoop;
- 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
- }
- }
+ while (menu->GetId() == 1)
+ {
+ wxDoEventLoopIteration( evtLoop );
}
+
return TRUE;
}
+#endif
+
// ---------------------------------------------------------------------------
// moving and resizing
// ---------------------------------------------------------------------------
// Get total size
void wxWindow::DoGetSize(int *x, int *y) const
{
- if (m_drawingArea)
- {
- CanvasGetSize(x, y);
- return;
- }
-
- Widget widget = (Widget) GetTopWidget();
+ Widget widget = (Widget)( !m_drawingArea ? GetTopWidget() :
+ ( m_borderWidget ? m_borderWidget :
+ m_scrolledWindow ? m_scrolledWindow :
+ m_drawingArea ) );
Dimension xx, yy;
- XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
- if(x) *x = xx; if(y) *y = yy;
+
+ XtVaGetValues( widget,
+ XmNwidth, &xx,
+ XmNheight, &yy,
+ NULL );
+ if(x) *x = xx;
+ if(y) *y = yy;
}
void wxWindow::DoGetPosition(int *x, int *y) const
{
- if (m_drawingArea)
- {
- CanvasGetPosition(x, y);
- return;
- }
- Widget widget = (Widget) GetTopWidget();
+ Widget widget = (Widget)
+ ( m_drawingArea ?
+ ( m_borderWidget ? m_borderWidget : m_scrolledWindow ) :
+ GetTopWidget() );
+
Position xx, yy;
XtVaGetValues(widget, XmNx, &xx, XmNy, &yy, NULL);
yy -= pt.y;
}
- if(x) *x = xx; if(y) *y = yy;
+ if(x) *x = xx;
+ if(y) *y = yy;
}
void wxWindow::DoScreenToClient(int *x, int *y) const
}
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) )
{
y = oldY;
}
- if ( width == -1 )
- width = oldW;
- if ( height == -1 )
- height = oldH;
-
- bool nothingChanged = (x == oldX) && (y == oldY) &&
- (width == oldW) && (height == oldH);
+ wxSize size(-1, -1);
+ if ( width <= 0 )
+ {
+ if ( sizeFlags & wxSIZE_AUTO_WIDTH && !fromCtor )
+ {
+ size = DoGetBestSize();
+ width = size.x;
+ }
+ else
+ {
+ width = oldW;
+ }
+ }
- if (!wxNoOptimize::CanOptimize())
+ if ( height == -1 )
{
- nothingChanged = FALSE;
+ if( sizeFlags & wxSIZE_AUTO_HEIGHT && !fromCtor )
+ {
+ if( size.x == -1 ) size = DoGetBestSize();
+ height = size.y;
+ }
+ else
+ {
+ height = oldH;
+ }
}
- if ( !nothingChanged )
+ if ( x != oldX || y != oldY || width != oldW || height != oldH
+ || !wxNoOptimize::CanOptimize() )
{
if (m_drawingArea)
{
- CanvasSetSize(x, y, width, height, sizeFlags);
+ int flags = 0;
+
+ if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ flags |= wxMOVE_X;
+
+ if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ flags |= wxMOVE_Y;
+
+ if (width > 0)
+ flags |= wxMOVE_WIDTH;
+
+ if (height > 0)
+ flags |= wxMOVE_HEIGHT;
+
+ int xx = x; int yy = y;
+ AdjustForParentClientOrigin(xx, yy, sizeFlags);
+ if( !fromCtor )
+ DoMoveWindow( xx, yy, width, height );
+ else
+ DoMoveWindowIntr( xx, yy, width, height, flags );
+
return;
}
if (managed)
XtManageChild(widget);
-
- // How about this bit. Maybe we don't need to generate size events
- // all the time -- they'll be generated when the window is sized anyway.
-#if 0
- wxSizeEvent sizeEvent(wxSize(width, height), GetId());
- sizeEvent.SetEventObject(this);
-
- GetEventHandler()->ProcessEvent(sizeEvent);
-#endif // 0
}
}
{
if (m_drawingArea)
{
- CanvasSetClientSize(width, height);
+ Widget drawingArea = (Widget) m_drawingArea;
+
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
+
+ if (width > -1)
+ XtVaSetValues(drawingArea, XmNwidth, width, NULL);
+ if (height > -1)
+ XtVaSetValues(drawingArea, XmNheight, height, NULL);
+
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
return;
}
XtVaSetValues(widget, XmNwidth, width, NULL);
if (height > -1)
XtVaSetValues(widget, XmNheight, height, NULL);
-
- wxSizeEvent sizeEvent(wxSize(width, height), GetId());
- sizeEvent.SetEventObject(this);
-
- GetEventHandler()->ProcessEvent(sizeEvent);
}
// For implementation purposes - sometimes decorations make the client area
XtVaSetValues(widget, XmNheightInc, incH, NULL);
}
+void wxWindow::DoMoveWindowIntr(int xx, int yy, int w, int h,
+ int flags)
+{
+ if (m_drawingArea)
+ {
+ Widget drawingArea = (Widget) m_drawingArea;
+ Widget borderOrScrolled = m_borderWidget ?
+ (Widget) m_borderWidget :
+ (Widget) m_scrolledWindow;
+
+ bool managed = XtIsManaged(borderOrScrolled);
+
+ if (managed)
+ XtUnmanageChild (borderOrScrolled);
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
+
+ if (flags & wxMOVE_X)
+ XtVaSetValues (borderOrScrolled,
+ XmNx, xx,
+ NULL);
+ if (flags & wxMOVE_Y)
+ XtVaSetValues (borderOrScrolled,
+ XmNy, yy,
+ NULL);
+
+ if (flags & wxMOVE_WIDTH)
+ {
+ if (m_borderWidget)
+ {
+ XtVaSetValues ((Widget) m_borderWidget, XmNwidth, w, NULL);
+ short thick, margin;
+ XtVaGetValues ((Widget) m_borderWidget,
+ XmNshadowThickness, &thick,
+ XmNmarginWidth, &margin,
+ NULL);
+ w -= 2 * (thick + margin);
+ }
+
+ XtVaSetValues ((Widget) m_scrolledWindow, XmNwidth, w, NULL);
+ }
+
+ if (flags & wxMOVE_HEIGHT)
+ {
+ if (m_borderWidget)
+ {
+ XtVaSetValues ((Widget) m_borderWidget, XmNheight, h, NULL);
+ short thick, margin;
+ XtVaGetValues ((Widget) m_borderWidget,
+ XmNshadowThickness, &thick,
+ XmNmarginHeight, &margin,
+ NULL);
+ h -= 2 * (thick + margin);
+ }
+
+ XtVaSetValues ((Widget) m_scrolledWindow, XmNheight, h, NULL);
+ }
+
+ if (managed)
+ XtManageChild (borderOrScrolled);
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
+ }
+ else
+ {
+ if( w < 1 ) w = 1;
+ if( h < 1 ) h = 1;
+
+ XtVaSetValues((Widget)GetTopWidget(),
+ XmNx, xx,
+ XmNy, yy,
+ XmNwidth, w,
+ XmNheight, h,
+ NULL);
+ }
+}
+
void wxWindow::DoMoveWindow(int x, int y, int width, int height)
{
- XtVaSetValues((Widget)GetTopWidget(),
- XmNx, x,
- XmNy, y,
- XmNwidth, width,
- XmNheight, height,
- NULL);
+ DoMoveWindowIntr (x, y, width, height,
+ wxMOVE_X|wxMOVE_Y|wxMOVE_WIDTH|wxMOVE_HEIGHT);
}
// ---------------------------------------------------------------------------
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;
}
else
{
+ wxWindowDC dc(this);
// Set an erase event first
- wxEraseEvent eraseEvent(GetId());
+ wxEraseEvent eraseEvent(GetId(), &dc);
eraseEvent.SetEventObject(this);
GetEventHandler()->ProcessEvent(eraseEvent);
bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
{
+#if wxUSE_ACCEL
if (!m_acceleratorTable.Ok())
return FALSE;
if (entry->MatchesEvent(event))
{
// Bingo, we have a match. Now find a control that matches the
- // entry command id.
+ // entry command id.
// Need to go up to the top of the window hierarchy, since it might
// be e.g. a menu item
wxFrame* frame = wxDynamicCast(parent, wxFrame);
if ( frame )
{
+#if wxUSE_MENUS
// Try for a menu command
if (frame->GetMenuBar())
{
return frame->GetEventHandler()->ProcessEvent(commandEvent);
}
}
+#endif
}
// Find a child matching the command id
return FALSE;
} // matches event
}// for
+#endif
// We didn't match the key event against an accelerator.
return FALSE;
wxWidgetHashTable->Put((long) w, win);
- wxLogTrace("widget", "Widget 0x%08x <-> window %p (%s)",
- w, win, win->GetClassInfo()->GetClassName());
+ wxLogTrace("widget", "Widget 0x%p <-> window %p (%s)",
+ (WXWidget)w, win, win->GetClassInfo()->GetClassName());
return TRUE;
}
void wxDeleteWindowFromTable(Widget w)
{
+ wxLogTrace("widget", "Widget 0x%p", (WXWidget)w);
+
wxWidgetHashTable->Delete((long)w);
}
}
// Fix to make it work under Motif 1.0 (!)
-static void wxCanvasMotionEvent (Widget WXUNUSED(drawingArea), XButtonEvent * WXUNUSED(event))
+static void wxCanvasMotionEvent (Widget WXUNUSED(drawingArea),
+ XButtonEvent *WXUNUSED(event))
{
#if XmVersion <= 1000
XmDrawingAreaCallbackStruct cbs;
}
case KeyPress:
{
- KeySym keySym;
- static char buf[100];
-#if 0
- XComposeStatus compose;
- (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, &compose);
-#endif // 0
-
- (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL);
- int id = wxCharCodeXToWX (keySym);
-
- wxEventType eventType = wxEVT_CHAR;
-
- wxKeyEvent event (eventType);
-
- if (local_event.xkey.state & ShiftMask)
- event.m_shiftDown = TRUE;
- if (local_event.xkey.state & ControlMask)
- event.m_controlDown = TRUE;
- if (local_event.xkey.state & Mod3Mask)
- event.m_altDown = TRUE;
- if (local_event.xkey.state & Mod1Mask)
- event.m_metaDown = TRUE;
- event.SetEventObject(canvas);
- event.m_keyCode = id;
- event.SetTimestamp(local_event.xkey.time);
-
- if (id > -1)
+ wxKeyEvent event (wxEVT_CHAR);
+ if (wxTranslateKeyEvent (event, canvas, (Widget) 0, &local_event))
{
// Implement wxFrame::OnCharHook by checking ancestor.
wxWindow *parent = canvas->GetParent();
}
case KeyRelease:
{
- static char buf[100];
- KeySym keySym;
- (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL);
- int id = wxCharCodeXToWX (keySym);
-
wxKeyEvent event (wxEVT_KEY_UP);
-
- if (local_event.xkey.state & ShiftMask)
- event.m_shiftDown = TRUE;
- if (local_event.xkey.state & ControlMask)
- event.m_controlDown = TRUE;
- if (local_event.xkey.state & Mod3Mask)
- event.m_altDown = TRUE;
- if (local_event.xkey.state & Mod1Mask)
- event.m_metaDown = TRUE;
- event.SetEventObject(canvas);
- event.m_keyCode = id;
- event.SetTimestamp(local_event.xkey.time);
-
- if (id > -1)
+ if (wxTranslateKeyEvent (event, canvas, (Widget) 0, &local_event))
{
canvas->GetEventHandler()->ProcessEvent (event);
}
}
}
-// ----------------------------------------------------------------------------
-// CanvaseXXXSize() functions
-// ----------------------------------------------------------------------------
-
-// SetSize, but as per old wxCanvas (with drawing widget etc.)
-void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
-{
- // A bit of optimization to help sort out the flickers.
- int oldX, oldY, oldW, oldH;
- GetSize(& oldW, & oldH);
- GetPosition(& oldX, & oldY);
-
- bool useOldPos = FALSE;
- bool useOldSize = FALSE;
-
- if ((x == -1) && (x == -1) && ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0))
- useOldPos = TRUE;
- else if (x == oldX && y == oldY)
- useOldPos = TRUE;
-
- if ((w == -1) && (h == -1))
- useOldSize = TRUE;
- else if (w == oldW && h == oldH)
- useOldSize = TRUE;
-
- if (!wxNoOptimize::CanOptimize())
- {
- useOldSize = FALSE; useOldPos = FALSE;
- }
-
- if (useOldPos && useOldSize)
- return;
-
- Widget drawingArea = (Widget) m_drawingArea;
- bool managed = XtIsManaged(m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow);
-
- if (managed)
- XtUnmanageChild (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow);
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
-
- int xx = x; int yy = y;
- AdjustForParentClientOrigin(xx, yy, sizeFlags);
-
- if (!useOldPos)
- {
- if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
- {
- XtVaSetValues (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow,
- XmNx, xx, NULL);
- }
-
- if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
- {
- XtVaSetValues (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow,
- XmNy, yy, NULL);
- }
- }
-
- if (!useOldSize)
- {
-
- if (w > -1)
- {
- if (m_borderWidget)
- {
- XtVaSetValues ((Widget) m_borderWidget, XmNwidth, w, NULL);
- short thick, margin;
- XtVaGetValues ((Widget) m_borderWidget,
- XmNshadowThickness, &thick,
- XmNmarginWidth, &margin,
- NULL);
- w -= 2 * (thick + margin);
- }
-
- XtVaSetValues ((Widget) m_scrolledWindow, XmNwidth, w, NULL);
-
- Dimension spacing;
- Widget sbar;
- XtVaGetValues ((Widget) m_scrolledWindow,
- XmNspacing, &spacing,
- XmNverticalScrollBar, &sbar,
- NULL);
- Dimension wsbar;
- if (sbar)
- XtVaGetValues (sbar, XmNwidth, &wsbar, NULL);
- else
- wsbar = 0;
-
- w -= (spacing + wsbar);
-
-#if 0
- XtVaSetValues(drawingArea, XmNwidth, w, NULL);
-#endif // 0
- }
- if (h > -1)
- {
- if (m_borderWidget)
- {
- XtVaSetValues ((Widget) m_borderWidget, XmNheight, h, NULL);
- short thick, margin;
- XtVaGetValues ((Widget) m_borderWidget,
- XmNshadowThickness, &thick,
- XmNmarginHeight, &margin,
- NULL);
- h -= 2 * (thick + margin);
- }
-
- XtVaSetValues ((Widget) m_scrolledWindow, XmNheight, h, NULL);
-
- Dimension spacing;
- Widget sbar;
- XtVaGetValues ((Widget) m_scrolledWindow,
- XmNspacing, &spacing,
- XmNhorizontalScrollBar, &sbar,
- NULL);
- Dimension wsbar;
- if (sbar)
- XtVaGetValues (sbar, XmNheight, &wsbar, NULL);
- else
- wsbar = 0;
-
- h -= (spacing + wsbar);
-
-#if 0
- XtVaSetValues(drawingArea, XmNheight, h, NULL);
-#endif // 0
- }
- }
-
- if (managed)
- XtManageChild (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow);
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
-
-#if 0
- int ww, hh;
- GetClientSize (&ww, &hh);
- wxSizeEvent sizeEvent(wxSize(ww, hh), GetId());
- sizeEvent.SetEventObject(this);
-
- GetEventHandler()->ProcessEvent(sizeEvent);
-#endif // 0
-}
-
-void wxWindow::CanvasSetClientSize (int w, int h)
-{
- Widget drawingArea = (Widget) m_drawingArea;
-
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
-
- if (w > -1)
- XtVaSetValues(drawingArea, XmNwidth, w, NULL);
- if (h > -1)
- XtVaSetValues(drawingArea, XmNheight, h, NULL);
-
-#if 0
- // TODO: is this necessary?
- allowRepainting = FALSE;
-
- XSync (XtDisplay (drawingArea), FALSE);
- XEvent event;
- while (XtAppPending (wxTheApp->appContext))
- {
- XFlush (XtDisplay (drawingArea));
- XtAppNextEvent (wxTheApp->appContext, &event);
- XtDispatchEvent (&event);
- }
-#endif // 0
-
- XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
-
-#if 0
- allowRepainting = TRUE;
- DoRefresh ();
-
- wxSizeEvent sizeEvent(wxSize(w, h), GetId());
- sizeEvent.SetEventObject(this);
-
- GetEventHandler()->ProcessEvent(sizeEvent);
-#endif // 0
-}
-
-void wxWindow::CanvasGetClientSize (int *w, int *h) const
-{
- // Must return the same thing that was set via SetClientSize
- Dimension xx, yy;
- XtVaGetValues ((Widget) m_drawingArea, XmNwidth, &xx, XmNheight, &yy, NULL);
- *w = xx;
- *h = yy;
-}
-
-void wxWindow::CanvasGetSize (int *w, int *h) const
-{
- Dimension xx, yy;
- if ((Widget) m_borderWidget)
- XtVaGetValues ((Widget) m_borderWidget, XmNwidth, &xx, XmNheight, &yy, NULL);
- else if ((Widget) m_scrolledWindow)
- XtVaGetValues ((Widget) m_scrolledWindow, XmNwidth, &xx, XmNheight, &yy, NULL);
- else
- XtVaGetValues ((Widget) m_drawingArea, XmNwidth, &xx, XmNheight, &yy, NULL);
-
- *w = xx;
- *h = yy;
-}
-
-void wxWindow::CanvasGetPosition (int *x, int *y) const
-{
- Position xx, yy;
- XtVaGetValues (m_borderWidget ? (Widget) m_borderWidget : (Widget) m_scrolledWindow, XmNx, &xx, XmNy, &yy, NULL);
-
- // We may be faking the client origin.
- // So a window that's really at (0, 30) may appear
- // (to wxWin apps) to be at (0, 0).
- if (GetParent())
- {
- wxPoint pt(GetParent()->GetClientAreaOrigin());
- xx -= pt.x;
- yy -= pt.y;
- }
-
- *x = xx;
- *y = yy;
-}
-
// ----------------------------------------------------------------------------
// TranslateXXXEvent() functions
// ----------------------------------------------------------------------------
return FALSE;
}
-bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, Widget WXUNUSED(widget), XEvent *xevent)
+bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win,
+ Widget WXUNUSED(widget), XEvent *xevent)
{
switch (xevent->xany.type)
{
char buf[20];
KeySym keySym;
-#if 0
- XComposeStatus compose;
- (void) XLookupString ((XKeyEvent *) xevent, buf, 20, &keySym, &compose);
-#endif // 0
- (void) XLookupString ((XKeyEvent *) xevent, buf, 20, &keySym, NULL);
+ (void) XLookupString((XKeyEvent *)xevent, buf, 20, &keySym, NULL);
int id = wxCharCodeXToWX (keySym);
+ // id may be WXK_xxx code - these are outside ASCII range, so we
+ // can't just use toupper() on id
+ if (id >= 'a' && id <= 'z')
+ id = toupper(id);
if (xevent->xkey.state & ShiftMask)
wxevent.m_shiftDown = TRUE;
result = wxNO_COLORS;
}
- return (result);
-
+ return result;
}
// Changes the foreground and background colours to be derived from the current
WXWidget mainWidget = GetMainWidget();
if ( mainWidget )
DoChangeBackgroundColour(mainWidget, m_backgroundColour);
-
- // This not necessary
-#if 0
-
- if (m_scrolledWindow && (GetMainWidget() != m_scrolledWindow))
- {
- DoChangeBackgroundColour(m_scrolledWindow, m_backgroundColour);
- // Have to set the scrollbar colours back since
- // the scrolled window seemed to change them
- wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
-
- if (m_hScrollBar)
- DoChangeBackgroundColour(m_hScrollBar, backgroundColour);
- if (m_vScrollBar)
- DoChangeBackgroundColour(m_vScrollBar, backgroundColour);
- }
-#endif
}
void wxWindow::ChangeForegroundColour()
}
// Change a widget's foreground and background colours.
-void wxWindow::DoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
+void wxWindow::DoChangeForegroundColour(WXWidget widget,
+ wxColour& foregroundColour)
{
- // When should we specify the foreground, if it's calculated
- // by wxComputeColours?
- // Solution: say we start with the default (computed) foreground colour.
- // If we call SetForegroundColour explicitly for a control or window,
- // then the foreground is changed.
- // Therefore SetBackgroundColour computes the foreground colour, and
- // SetForegroundColour changes the foreground colour. The ordering is
- // important.
-
- Widget w = (Widget)widget;
- XtVaSetValues(
- w,
- XmNforeground, foregroundColour.AllocColour(XtDisplay(w)),
- NULL
- );
+ wxDoChangeForegroundColour( widget, foregroundColour );
}
-void wxWindow::DoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour)
+void wxWindow::DoChangeBackgroundColour(WXWidget widget,
+ wxColour& backgroundColour,
+ bool changeArmColour)
{
- wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,
- (wxColour*) NULL);
-
- XtVaSetValues ((Widget) widget,
- XmNbackground, g_itemColors[wxBACK_INDEX].pixel,
- XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel,
- XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel,
- XmNforeground, g_itemColors[wxFORE_INDEX].pixel,
- NULL);
-
- if (changeArmColour)
- XtVaSetValues ((Widget) widget,
- XmNarmColor, g_itemColors[wxSELE_INDEX].pixel,
- NULL);
+ wxDoChangeBackgroundColour( widget, backgroundColour, changeArmColour );
}
bool wxWindow::SetBackgroundColour(const wxColour& col)
int width, height, width1, height1;
GetSize(& width, & height);
- // lesstif 0.87 hangs here
-#ifndef LESSTIF_VERSION
- XtVaSetValues (w,
- XmNfontList, (XmFontList) m_font.GetFontList(1.0, XtDisplay(w)),
- NULL);
-#endif
+ wxDoChangeFont( GetLabelWidget(), m_font );
GetSize(& width1, & height1);
if (keepOriginalSize && (width != width1 || height != height1))
unsigned int maskReturn;
XQueryPointer (display,
- rootWindow,
- &rootReturn,
+ rootWindow,
+ &rootReturn,
&childReturn,
&rootX, &rootY, &winX, &winY, &maskReturn);
return wxPoint(rootX, rootY);