// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
-#ifdef __VMS
-#define XtDisplay XTDISPLAY
-#define XtWindow XTWINDOW
-#define XtScreen XTSCREEN
-#endif
-
#ifndef WX_PRECOMP
#include "wx/hash.h"
#include "wx/log.h"
#endif
#include "wx/motif/private.h"
+#include "wx/motif/dcclient.h"
#include <string.h>
long style,
const wxString& name)
{
+ // Get default border
+ wxBorder border = GetBorder(style);
+ style &= ~wxBORDER_MASK;
+ style |= border;
+
wxCHECK_MSG( parent, false, "can't create wxWindow without parent" );
CreateBase(parent, id, pos, size, style, wxDefaultValidator, name);
// Destructor
wxWindow::~wxWindow()
{
+ SendDestroyEvent();
+
if (g_captureWindow == this)
g_captureWindow = NULL;
- m_isBeingDeleted = true;
-
// Motif-specific actions first
WXWidget wMain = GetMainWidget();
if ( wMain )
// currently active.
// (2) The widget with the focus may not be in the widget table
// depending on which widgets I put in the table
- wxWindow *winFocus = (wxWindow *)NULL;
+ wxWindow *winFocus = NULL;
for ( wxWindowList::compatibility_iterator node = wxTopLevelWindows.GetFirst();
node;
node = node->GetNext() )
int y2 = (dy >= 0) ? y + dy : y;
wxClientDC dc(this);
+ wxClientDCImpl * const
+ dcimpl = static_cast<wxClientDCImpl *>(dc.GetImpl());
+ GC const gc = (GC) dcimpl->GetGC();
dc.SetLogicalFunction (wxCOPY);
Window window = XtWindow(widget);
Display* display = XtDisplay(widget);
- XCopyArea(display, window, window, (GC) dc.GetGC(),
- x1, y1, w1, h1, x2, y2);
+ XCopyArea(display, window, window, gc, x1, y1, w1, h1, x2, y2);
- dc.SetAutoSetting(true);
+ dcimpl->SetAutoSetting(true);
wxBrush brush(GetBackgroundColour(), wxSOLID);
dc.SetBrush(brush); // FIXME: needed?
rect->width = dx;
rect->height = h;
- XFillRectangle(display, window,
- (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
+ XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
rect->x = rect->x;
rect->y = rect->y;
rect->width = -dx;
rect->height = h;
- XFillRectangle(display, window,
- (GC) dc.GetGC(), rect->x, rect->y, rect->width,
- rect->height);
+ XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
rect->x = rect->x;
rect->y = rect->y;
rect->width = w;
rect->height = dy;
- XFillRectangle(display, window,
- (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
+ XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
rect->x = rect->x;
rect->y = rect->y;
rect->width = w;
rect->height = -dy;
- XFillRectangle(display, window,
- (GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
+ XFillRectangle(display, window, gc, rect->x, rect->y, rect->width, rect->height);
rect->x = rect->x;
rect->y = rect->y;
menu->SetId(1); /* Mark as popped-up */
menu->CreateMenu(NULL, widget, menu, 0);
- menu->SetInvokingWindow(this);
menu->UpdateUI();
XmNwidth, &xx,
XmNheight, &yy,
NULL );
- if(x) *x = widget ? xx : -1;
+ if(x) *x = widget ? xx : -1;
if(y) *y = widget ? yy : -1;
}
return width;
}
-void wxWindow::GetTextExtent(const wxString& string,
- int *x, int *y,
- int *descent, int *externalLeading,
- const wxFont *theFont) const
+void wxWindow::DoGetTextExtent(const wxString& string,
+ int *x, int *y,
+ int *descent,
+ int *externalLeading,
+ const wxFont *theFont) const
{
const wxFont *fontToUse = theFont ? theFont : &m_font;
wxClientDC dc(this);
wxBrush backgroundBrush(GetBackgroundColour(), wxSOLID);
dc.SetBackground(backgroundBrush);
+
+ wxClientDCImpl * const
+ dcimpl = static_cast<wxClientDCImpl *>(dc.GetImpl());
if (rect)
- dc.Clear(*rect);
+ dcimpl->Clear(*rect);
else
- dc.Clear();
+ dcimpl->Clear();
}
XSendEvent(display, thisWindow, False, ExposureMask, (XEvent *)&dummyEvent);
{
wxPaintDC dc(this);
- GC tempGC = (GC) dc.GetBackingGC();
+ wxPaintDCImpl * const
+ dcimpl = static_cast<wxPaintDCImpl *>(dc.GetImpl());
+
+ GC tempGC = (GC) dcimpl->GetBackingGC();
Widget widget = (Widget) GetMainWidget();
// Set an erase event first
wxEraseEvent eraseEvent(GetId(), &dc);
eraseEvent.SetEventObject(this);
- GetEventHandler()->ProcessEvent(eraseEvent);
+ HandleWindowEvent(eraseEvent);
wxPaintEvent event(GetId());
event.SetEventObject(this);
- GetEventHandler()->ProcessEvent(event);
+ HandleWindowEvent(event);
m_needsRefresh = false;
}
{
wxSysColourChangedEvent event2;
event.SetEventObject(win);
- win->GetEventHandler()->ProcessEvent(event2);
+ win->HandleWindowEvent(event2);
}
node = node->GetNext();
{
// This calls the UI-update mechanism (querying windows for
// menu/toolbar/control state information)
- if (wxUpdateUIEvent::CanUpdate(this))
+ if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen())
UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
}
// If ProcessEvent returns true (it was handled), then
// the calling code will skip the event handling.
- return frame->GetEventHandler()->ProcessEvent(commandEvent);
+ return frame->HandleWindowEvent(commandEvent);
}
}
#endif
{
wxCommandEvent commandEvent (wxEVT_COMMAND_BUTTON_CLICKED, child->GetId());
commandEvent.SetEventObject(child);
- return child->GetEventHandler()->ProcessEvent(commandEvent);
+ return child->HandleWindowEvent(commandEvent);
}
return false;
if ( wMain )
return (WXDisplay*) XtDisplay(wMain);
else
- return (WXDisplay*) NULL;
+ return NULL;
}
WXWidget wxWindow::GetMainWidget() const
wxSize newSize(win->GetSize());
wxSizeEvent sizeEvent(newSize, win->GetId());
sizeEvent.SetEventObject(win);
- win->GetEventHandler()->ProcessEvent(sizeEvent);
+ win->HandleWindowEvent(sizeEvent);
}
}
wxMouseEvent wxevent(0);
if (wxTranslateMouseEvent(wxevent, canvas, drawingArea, xevent))
{
- canvas->GetEventHandler()->ProcessEvent(wxevent);
+ canvas->HandleWindowEvent(wxevent);
}
break;
}
if (parent)
{
event.SetEventType(wxEVT_CHAR_HOOK);
- if (parent->GetEventHandler()->ProcessEvent(event))
+ if (parent->HandleWindowEvent(event))
return;
}
event.SetEventType(wxEVT_KEY_DOWN);
// Only process OnChar if OnKeyDown didn't swallow it
- if (!canvas->GetEventHandler()->ProcessEvent (event))
+ if (!canvas->HandleWindowEvent (event))
{
event.SetEventType(wxEVT_CHAR);
- canvas->GetEventHandler()->ProcessEvent (event);
+ canvas->HandleWindowEvent (event);
}
}
break;
wxKeyEvent event (wxEVT_KEY_UP);
if (wxTranslateKeyEvent (event, canvas, (Widget) 0, xevent))
{
- canvas->GetEventHandler()->ProcessEvent (event);
+ canvas->HandleWindowEvent (event);
}
break;
}
{
wxFocusEvent event(wxEVT_SET_FOCUS, canvas->GetId());
event.SetEventObject(canvas);
- canvas->GetEventHandler()->ProcessEvent(event);
+ canvas->HandleWindowEvent(event);
}
break;
}
{
wxFocusEvent event(wxEVT_KILL_FOCUS, canvas->GetId());
event.SetEventObject(canvas);
- canvas->GetEventHandler()->ProcessEvent(event);
+ canvas->HandleWindowEvent(event);
}
break;
}
wxMouseEvent wxevent(0);
if (wxTranslateMouseEvent(wxevent, window, wid, event))
{
- window->GetEventHandler()->ProcessEvent(wxevent);
+ window->HandleWindowEvent(wxevent);
}
}
XmScrollBarCallbackStruct *cbs)
{
wxWindow *win = wxGetWindowFromTable(scrollbar);
- wxCHECK_RET( win, _T("invalid widget in scrollbar callback") );
+ wxCHECK_RET( win, wxT("invalid widget in scrollbar callback") );
wxOrientation orientation = (wxOrientation)wxPtrToUInt(clientData);
cbs->value,
orientation);
event.SetEventObject( win );
- win->GetEventHandler()->ProcessEvent(event);
+ win->HandleWindowEvent(event);
}
// For repainting arbitrary windows
{
XRectangle ink, logical;
WXFontSet fset = (WXFontSet) args[0].value;
-
+
XmbTextExtents( (XFontSet)fset, str.c_str(), str.length(),
&ink, &logical);
if( width ) *width = logical.width;
if( height ) *height = logical.height;
- if( ascent ) *ascent = -logical.y;
- if( descent ) *descent = logical.height + logical.y;
+ if( ascent ) *ascent = -logical.y;
+ if( descent ) *descent = logical.height + logical.y;
}
else
{
if (type == XmFONT_IS_FONTSET)
{
XRectangle ink, logical;
-
+
XmbTextExtents( (XFontSet)thing, str.c_str(), str.length(),
&ink, &logical);
if( width ) *width = logical.width;
if( height ) *height = logical.height;
- if( ascent ) *ascent = -logical.y;
- if( descent ) *descent = logical.height + logical.y;
+ if( ascent ) *ascent = -logical.y;
+ if( descent ) *descent = logical.height + logical.y;
}
else
{