Misc. Motif; removed duplicate wxICON; variant compile fix; added wxString form

of wxStripMenuCodes


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@843 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
1998-10-16 14:38:52 +00:00
parent 85ee3474b7
commit 47bc106012
18 changed files with 770 additions and 79 deletions

View File

@@ -52,6 +52,8 @@ void wxCanvasRepaintProc (Widget, XtPointer, XmDrawingAreaCallbackStruct * cbs);
void wxCanvasInputEvent (Widget drawingArea, XtPointer data, XmDrawingAreaCallbackStruct * cbs);
void wxCanvasMotionEvent (Widget, XButtonEvent * event);
void wxCanvasEnterLeave (Widget drawingArea, XtPointer clientData, XCrossingEvent * event);
void wxScrollBarCallback(Widget widget, XtPointer clientData,
XmScaleCallbackStruct *cbs);
void wxPanelItemEventHandler (Widget wid,
XtPointer client_data,
XEvent* event,
@@ -121,8 +123,6 @@ wxWindow::wxWindow()
m_drawingArea = (WXWidget) 0;
m_hScroll = FALSE;
m_vScroll = FALSE;
m_hScrollingEnabled = FALSE;
m_vScrollingEnabled = FALSE;
m_backingPixmap = (WXPixmap) 0;
m_pixmapWidth = 0;
m_pixmapHeight = 0;
@@ -131,6 +131,8 @@ wxWindow::wxWindow()
m_lastTS = 0;
m_lastButton = 0;
m_canAddEventHandler = FALSE;
m_scrollPosX = 0;
m_scrollPosY = 0;
m_paintRegion = (WXRegion) 0;
}
@@ -296,13 +298,13 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
m_drawingArea = (WXWidget) 0;
m_hScroll = FALSE;
m_vScroll = FALSE;
m_hScrollingEnabled = FALSE;
m_vScrollingEnabled = FALSE;
m_backingPixmap = (WXPixmap) 0;
m_pixmapWidth = 0;
m_pixmapHeight = 0;
m_pixmapOffsetX = 0;
m_pixmapOffsetY = 0;
m_scrollPosX = 0;
m_scrollPosY = 0;
m_paintRegion = (WXRegion) 0;
if (!parent)
@@ -322,7 +324,6 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
// m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ; ;
m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE) ;
m_foregroundColour = *wxBLACK;
m_defaultForegroundColour = *wxBLACK ;
m_windowStyle = style;
@@ -418,6 +419,62 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
XtAddEventHandler ((Widget) m_drawingArea, PointerMotionHintMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask,
False, (XtEventHandler) wxCanvasEnterLeave, (XtPointer) this);
// Add scrollbars if required
if (m_windowStyle & wxHSCROLL)
{
Widget hScrollBar = XtVaCreateManagedWidget ("hsb",
xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
XmNorientation, XmHORIZONTAL,
NULL);
// XtAddCallback (hScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNpageIncrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNpageDecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNtoTopCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtAddCallback (hScrollBar, XmNtoBottomCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmHORIZONTAL);
XtVaSetValues (hScrollBar,
XmNincrement, 1,
XmNvalue, 0,
NULL);
m_hScrollBar = (WXWidget) hScrollBar;
m_hScroll = TRUE;
}
if (m_windowStyle & wxVSCROLL)
{
Widget vScrollBar = XtVaCreateManagedWidget ("vsb",
xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
XmNorientation, XmVERTICAL,
NULL);
// XtAddCallback (vScrollBar, XmNvalueChangedCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNdragCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNincrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNdecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNpageIncrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNpageDecrementCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNtoTopCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtAddCallback (vScrollBar, XmNtoBottomCallback, (XtCallbackProc) wxScrollBarCallback, (XtPointer) XmVERTICAL);
XtVaSetValues (vScrollBar,
XmNincrement, 1,
XmNvalue, 0,
NULL);
m_vScrollBar = (WXWidget) vScrollBar;
m_vScroll = TRUE;
}
if (m_hScrollBar || m_vScrollBar)
XmScrolledWindowSetAreas ((Widget) m_scrolledWindow, (Widget) m_hScrollBar, (Widget) m_vScrollBar, (Widget) m_drawingArea);
if (m_hScrollBar)
XtRealizeWidget ((Widget) m_hScrollBar);
if (m_vScrollBar)
XtRealizeWidget ((Widget) m_vScrollBar);
SetSize(pos.x, pos.y, size.x, size.y);
return TRUE;
@@ -540,7 +597,15 @@ void wxWindow::GetPosition(int *x, int *y) const
void wxWindow::ScreenToClient(int *x, int *y) const
{
// TODO
Widget widget = (Widget) GetClientWidget();
Display *display = XtDisplay((Widget) GetMainWidget());
Window rootWindow = RootWindowOfScreen(XtScreen(widget));
Window thisWindow = XtWindow(widget);
Window childWindow;
int xx = *x;
int yy = *y;
XTranslateCoordinates(display, rootWindow, thisWindow, xx, yy, x, y, &childWindow);
}
void wxWindow::ClientToScreen(int *x, int *y) const
@@ -548,15 +613,7 @@ void wxWindow::ClientToScreen(int *x, int *y) const
Widget widget = (Widget) GetClientWidget();
Display *display = XtDisplay(widget);
Window rootWindow = RootWindowOfScreen(XtScreen(widget));
Window thisWindow;
if (this->IsKindOf(CLASSINFO(wxFrame)))
{
wxFrame *fr = (wxFrame *)this;
// TODO
// thisWindow = XtWindow(fr->m_clientArea);
}
else
thisWindow = XtWindow((Widget)widget);
Window thisWindow = XtWindow(widget);
Window childWindow;
int xx = *x;
@@ -569,14 +626,12 @@ void wxWindow::SetCursor(const wxCursor& cursor)
m_windowCursor = cursor;
if (m_windowCursor.Ok())
{
/* TODO when wxCursor implemented
WXDisplay *dpy = GetXDisplay();
Cursor x_cursor = cursor.GetXCursor(dpy);
WXCursor x_cursor = ((wxCursor&)cursor).GetXCursor(dpy);
Widget w = (Widget) GetMainWidget();
Window win = XtWindow(w);
XDefineCursor((Display*) dpy, win, x_cursor);
*/
XDefineCursor((Display*) dpy, win, (Cursor) x_cursor);
}
}
@@ -584,7 +639,7 @@ void wxWindow::SetCursor(const wxCursor& cursor)
// Get size *available for subwindows* i.e. excluding menu bar etc.
void wxWindow::GetClientSize(int *x, int *y) const
{
Widget widget = (Widget) GetTopWidget();
Widget widget = (Widget) GetClientWidget();
Dimension xx, yy;
XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
*x = xx; *y = yy;
@@ -708,24 +763,77 @@ bool wxWindow::IsShown() const
int wxWindow::GetCharHeight() const
{
// TODO
if (!m_windowFont.Ok())
return 0;
WXFontStructPtr pFontStruct = m_windowFont.GetFontStruct(1.0, GetXDisplay());
int direction, ascent, descent;
XCharStruct overall;
XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent,
&descent, &overall);
// return (overall.ascent + overall.descent);
return (ascent + descent);
}
int wxWindow::GetCharWidth() const
{
// TODO
if (!m_windowFont.Ok())
return 0;
WXFontStructPtr pFontStruct = m_windowFont.GetFontStruct(1.0, GetXDisplay());
int direction, ascent, descent;
XCharStruct overall;
XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent,
&descent, &overall);
return overall.width;
}
/* Helper function for 16-bit fonts */
static int str16len(const char *s)
{
int count = 0;
while (s[0] && s[1]) {
count++;
s += 2;
}
return count;
}
void wxWindow::GetTextExtent(const wxString& string, int *x, int *y,
int *descent, int *externalLeading, const wxFont *theFont, bool) const
int *descent, int *externalLeading, const wxFont *theFont, bool use16) const
{
wxFont *fontToUse = (wxFont *)theFont;
if (!fontToUse)
fontToUse = (wxFont *) & m_windowFont;
// TODO
if (!fontToUse->Ok())
return;
WXFontStructPtr pFontStruct = theFont->GetFontStruct(1.0, GetXDisplay());
int direction, ascent, descent2;
XCharStruct overall;
int slen;
if (use16) slen = str16len(string); else slen = strlen(string);
if (use16)
XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *) (char*) (const char*) string, slen, &direction,
&ascent, &descent2, &overall);
else
XTextExtents((XFontStruct*) pFontStruct, (char*) (const char*) string, slen, &direction,
&ascent, &descent2, &overall);
*x = (overall.width);
*y = (ascent + descent2);
if (descent)
*descent = descent2;
if (externalLeading)
*externalLeading = 0;
}
void wxWindow::Refresh(bool eraseBack, const wxRectangle *rect)
@@ -859,21 +967,20 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, in
return;
wxFrame *frame = (wxFrame *)this;
Widget widget = (Widget) frame->GetShellWidget();
/* Uncomment when wxFrame implemented
if (minW > -1)
XtVaSetValues((Widget) frame->m_frameShell, XmNminWidth, minW, NULL);
XtVaSetValues(widget, XmNminWidth, minW, NULL);
if (minH > -1)
XtVaSetValues((Widget) frame->m_frameShell, XmNminHeight, minH, NULL);
XtVaSetValues(widget, XmNminHeight, minH, NULL);
if (maxW > -1)
XtVaSetValues((Widget) frame->m_frameShell, XmNmaxWidth, maxW, NULL);
XtVaSetValues(widget, XmNmaxWidth, maxW, NULL);
if (maxH > -1)
XtVaSetValues((Widget) frame->m_frameShell, XmNmaxHeight, maxH, NULL);
XtVaSetValues(widget, XmNmaxHeight, maxH, NULL);
if (incW > -1)
XtVaSetValues((Widget) frame->m_frameShell, XmNwidthInc, incW, NULL);
XtVaSetValues(widget, XmNwidthInc, incW, NULL);
if (incH > -1)
XtVaSetValues((Widget) frame->m_frameShell, XmNheightInc, incH, NULL);
*/
XtVaSetValues(widget, XmNheightInc, incH, NULL);
}
void wxWindow::Centre(int direction)
@@ -915,49 +1022,252 @@ void wxWindow::OnEraseBackground(wxEraseEvent& event)
int wxWindow::GetScrollPos(int orient) const
{
// TODO
return 0;
if (orient == wxHORIZONTAL)
return m_scrollPosX;
else
return m_scrollPosY;
/*
Widget scrollBar = (Widget) ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar);
if (scrollBar)
{
int pos;
XtVaGetValues(scrollBar,
XmNvalue, &pos, NULL);
return pos;
}
else
return 0;
*/
}
// This now returns the whole range, not just the number
// of positions that we can scroll.
int wxWindow::GetScrollRange(int orient) const
{
// TODO
return 0;
Widget scrollBar = (Widget) ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar);
if (scrollBar)
{
int range;
XtVaGetValues(scrollBar,
XmNmaximum, &range, NULL);
return range;
}
else
return 0;
}
int wxWindow::GetScrollThumb(int orient) const
{
// TODO
return 0;
Widget scrollBar = (Widget) ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar);
if (scrollBar)
{
int thumb;
XtVaGetValues(scrollBar,
XmNsliderSize, &thumb, NULL);
return thumb;
}
else
return 0;
}
void wxWindow::SetScrollPos(int orient, int pos, bool refresh)
void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
{
// TODO
return;
Widget scrollBar = (Widget) ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar);
if (scrollBar)
{
XtVaSetValues (scrollBar,
XmNvalue, pos,
NULL);
}
if (orient == wxHORIZONTAL)
m_scrollPosX = pos;
else
m_scrollPosY = pos;
}
// New function that will replace some of the above.
void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
int range, bool refresh)
int range, bool WXUNUSED(refresh))
{
// TODO
Widget scrollBar = (Widget) ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar );
if (!scrollBar)
return;
if (range == 0)
range = 1;
if (thumbVisible == 0)
thumbVisible = 1;
XtVaSetValues(scrollBar,
XmNvalue, pos,
XmNminimum, 0,
XmNmaximum, range,
XmNsliderSize, thumbVisible,
NULL);
if (orient == wxHORIZONTAL)
m_scrollPosX = pos;
else
m_scrollPosY = pos;
}
// Does a physical scroll
void wxWindow::ScrollWindow(int dx, int dy, const wxRectangle *rect)
{
// TODO
return;
// cerr << "Scrolling. delta = " << dx << ", " << dy << endl;
int x, y, w, h;
if (rect)
{
// Use specified rectangle
x = rect->x; y = rect->y; w = rect->width; h = rect->height;
}
else
{
// Use whole client area
x = 0; y = 0;
GetClientSize(& w, & h);
}
int x1 = (dx >= 0) ? x : x - dx ;
int y1 = (dy >= 0) ? y : y - dy;
int w1 = w - abs(dx);
int h1 = h - abs(dy);
int x2 = (dx >= 0) ? x + dx : x;
int y2 = (dy >= 0) ? y + dy : y;
wxClientDC dc(this);
dc.SetLogicalFunction (wxCOPY);
Widget widget = (Widget) GetMainWidget();
Window window = XtWindow(widget);
Display* display = XtDisplay(widget);
XCopyArea(display, window,
window, (GC) dc.GetGC(),
x1, y1,
w1, h1,
x2, y2);
dc.SetAutoSetting(TRUE);
wxBrush brush(GetBackgroundColour(), wxSOLID);
dc.SetBrush(brush); // ??
// We'll add rectangles to the list of update rectangles
// according to which bits we've exposed.
wxList updateRects;
if (dx > 0)
{
wxRect *rect = new wxRect;
rect->x = x;
rect->y = y;
rect->width = dx;
rect->height = h;
XFillRectangle(display, window,
(GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
rect->x = rect->x;
rect->y = rect->y;
rect->width = rect->width;
rect->height = rect->height;
updateRects.Append((wxObject*) rect);
}
else if (dx < 0)
{
wxRect *rect = new wxRect;
rect->x = x + w + dx;
rect->y = y;
rect->width = -dx;
rect->height = h;
XFillRectangle(display, window,
(GC) dc.GetGC(), rect->x, rect->y, rect->width,
rect->height);
rect->x = rect->x;
rect->y = rect->y;
rect->width = rect->width;
rect->height = rect->height;
updateRects.Append((wxObject*) rect);
}
if (dy > 0)
{
wxRect *rect = new wxRect;
rect->x = x;
rect->y = y;
rect->width = w;
rect->height = dy;
XFillRectangle(display, window,
(GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
rect->x = rect->x;
rect->y = rect->y;
rect->width = rect->width;
rect->height = rect->height;
updateRects.Append((wxObject*) rect);
}
else if (dy < 0)
{
wxRect *rect = new wxRect;
rect->x = x;
rect->y = y + h + dy;
rect->width = w;
rect->height = -dy;
XFillRectangle(display, window,
(GC) dc.GetGC(), rect->x, rect->y, rect->width, rect->height);
rect->x = rect->x;
rect->y = rect->y;
rect->width = rect->width;
rect->height = rect->height;
updateRects.Append((wxObject*) rect);
}
dc.SetBrush(wxNullBrush);
// Now send expose events
wxNode* node = updateRects.First();
while (node)
{
wxRect* rect = (wxRect*) node->Data();
XExposeEvent event;
event.type = Expose;
event.display = display;
event.send_event = True;
event.window = window;
event.x = rect->x;
event.y = rect->y;
event.width = rect->width;
event.height = rect->height;
event.count = 0;
XSendEvent(display, window, False, ExposureMask, (XEvent *)&event);
node = node->Next();
}
}
void wxWindow::SetFont(const wxFont& font)
{
m_windowFont = font;
Widget w = (Widget) GetMainWidget();
Widget w = (Widget) GetLabelWidget(); // Usually the main widget
if (w && m_windowFont.Ok())
{
XtVaSetValues (w,
@@ -985,7 +1295,8 @@ void wxWindow::OnPaint(wxPaintEvent& event)
bool wxWindow::IsEnabled() const
{
// TODO
// TODO. Is this right?
// return XtGetSensitive((Widget) GetMainWidget());
return FALSE;
}
@@ -2420,6 +2731,74 @@ void wxPanelItemEventHandler (Widget wid,
*continueToDispatch = True;
}
void wxScrollBarCallback(Widget scrollbar, XtPointer clientData,
XmScaleCallbackStruct *cbs)
{
Widget scrolledWindow = XtParent (scrollbar);
wxWindow *win = (wxWindow *) wxWidgetHashTable->Get ((long) scrolledWindow);
int orientation = (int) clientData;
wxEventType eventType = wxEVT_NULL;
switch (cbs->reason)
{
case XmCR_INCREMENT:
{
eventType = wxEVT_SCROLL_LINEDOWN;
break;
}
case XmCR_DECREMENT:
{
eventType = wxEVT_SCROLL_LINEUP;
break;
}
case XmCR_DRAG:
{
eventType = wxEVT_SCROLL_THUMBTRACK;
break;
}
case XmCR_VALUE_CHANGED:
{
// TODO: Should this be intercepted too, or will it cause
// duplicate events?
eventType = wxEVT_SCROLL_THUMBTRACK;
break;
}
case XmCR_PAGE_INCREMENT:
{
eventType = wxEVT_SCROLL_PAGEDOWN;
break;
}
case XmCR_PAGE_DECREMENT:
{
eventType = wxEVT_SCROLL_PAGEUP;
break;
}
case XmCR_TO_TOP:
{
eventType = wxEVT_SCROLL_TOP;
break;
}
case XmCR_TO_BOTTOM:
{
eventType = wxEVT_SCROLL_BOTTOM;
break;
}
default:
{
// Should never get here
wxFAIL_MSG("Unknown scroll event.");
break;
}
}
wxScrollEvent event(eventType, win->GetId());
event.SetEventObject(win);
event.SetPosition(cbs->value);
event.SetOrientation( (orientation == XmHORIZONTAL) ? wxHORIZONTAL : wxVERTICAL );
win->GetEventHandler()->ProcessEvent(event);
}
bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, Widget widget, XEvent *xevent)
{
switch (xevent->xany.type)
@@ -2670,10 +3049,12 @@ void wxWindow::ChangeColour(WXWidget widget)
void wxWindow::ChangeFont(WXWidget widget)
{
/* TODO
if (widget && GetFont() && GetFont()->IsOk())
XtVaSetValues ((Widget) widget,
XmNfontList, GetFont()->GetInternalFont (),
if (widget && GetFont() && GetFont()->Ok())
{
XmFontList fontList = (XmFontList) GetFont()->GetFontList(1.0, GetXDisplay());
if (fontList)
XtVaSetValues ((Widget) widget,
XmNfontList, fontList,
NULL);
*/
}
}