X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1248b41f9f71110347659db8c54c75786eba23c6..460354e939bc52de1b5a749b6d88d6ef21f5827b:/src/motif/window.cpp diff --git a/src/motif/window.cpp b/src/motif/window.cpp index f6fa06cdba..63a644d310 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -54,7 +54,7 @@ // DoSetSizeIntr and DoMoveWindowIntr // PROBLEM: // under Motif composite controls (such as wxCalendarCtrl or generic wxSpinCtrl -// did nott work and/or segfaulted because +// did not 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) @@ -172,7 +172,7 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap) { Widget w = (Widget)widget; if ( !w ) - return FALSE; + return false; // Rationale: a lot of common operations (including but not // limited to moving, resizing and appending items to a listbox) @@ -194,7 +194,7 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap) // XtUnmapWidget(w); } - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -204,12 +204,12 @@ bool wxWindow::MapOrUnmap(WXWidget widget, bool domap) void wxWindow::Init() { // Motif-specific - m_needsRefresh = TRUE; + m_needsRefresh = true; m_mainWidget = (WXWidget) 0; - m_winCaptured = FALSE; + m_winCaptured = false; - m_isShown = TRUE; + m_isShown = true; m_hScrollBar = m_vScrollBar = @@ -238,7 +238,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, long style, const wxString& name) { - wxCHECK_MSG( parent, FALSE, "can't create wxWindow without parent" ); + wxCHECK_MSG( parent, false, "can't create wxWindow without parent" ); CreateBase(parent, id, pos, size, style, wxDefaultValidator, name); @@ -341,8 +341,8 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, // Scrolled widget needs to have its colour changed or we get a little blue // square where the scrollbars abutt wxColour backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); - wxDoChangeBackgroundColour(m_scrolledWindow, backgroundColour, TRUE); - wxDoChangeBackgroundColour(m_drawingArea, backgroundColour, TRUE); + wxDoChangeBackgroundColour(m_scrolledWindow, backgroundColour, true); + wxDoChangeBackgroundColour(m_drawingArea, backgroundColour, true); XmScrolledWindowSetAreas( (Widget)m_scrolledWindow, @@ -353,8 +353,8 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id, // sample). SetCursor(*wxSTANDARD_CURSOR); SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)); - DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, TRUE); - return TRUE; + DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, true); + return true; } // Destructor @@ -363,8 +363,8 @@ wxWindow::~wxWindow() if (g_captureWindow == this) g_captureWindow = NULL; - m_isBeingDeleted = TRUE; - + m_isBeingDeleted = true; + // Motif-specific actions first WXWidget wMain = GetMainWidget(); if ( wMain ) @@ -493,7 +493,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) m_hScrollBar = DoCreateScrollBar( m_scrolledWindow, wxHORIZONTAL, (void (*)())wxScrollBarCallback ); - wxDoChangeBackgroundColour(m_hScrollBar, backgroundColour, TRUE); + wxDoChangeBackgroundColour(m_hScrollBar, backgroundColour, true); XtRealizeWidget( (Widget)m_hScrollBar ); @@ -508,7 +508,7 @@ void wxWindow::CreateScrollbar(wxOrientation orientation) m_vScrollBar = DoCreateScrollBar( m_scrolledWindow, wxVERTICAL, (void (*)())wxScrollBarCallback ); - wxDoChangeBackgroundColour(m_vScrollBar, backgroundColour, TRUE); + wxDoChangeBackgroundColour(m_vScrollBar, backgroundColour, true); XtRealizeWidget((Widget)m_vScrollBar); @@ -564,7 +564,7 @@ void wxWindow::SetFocus() } // Get the window with the focus -wxWindow *wxWindowBase::FindFocus() +wxWindow *wxWindowBase::DoFindFocus() { // TODO Problems: // (1) Can there be multiple focussed widgets in an application? @@ -595,7 +595,7 @@ wxWindow *wxWindowBase::FindFocus() bool wxWindow::Enable(bool enable) { if ( !wxWindowBase::Enable(enable) ) - return FALSE; + return false; Widget wMain = (Widget)GetMainWidget(); if ( wMain ) @@ -604,13 +604,13 @@ bool wxWindow::Enable(bool enable) XmUpdateDisplay(wMain); } - return TRUE; + return true; } bool wxWindow::Show(bool show) { if ( !wxWindowBase::Show(show) ) - return FALSE; + return false; if (m_borderWidget || m_scrolledWindow) { @@ -623,7 +623,7 @@ bool wxWindow::Show(bool show) MapOrUnmap(GetMainWidget(), show); } - return TRUE; + return true; } // Raise the window to the top of the Z order @@ -663,9 +663,9 @@ void wxWindow::DoCaptureMouse() Widget wMain = (Widget)GetMainWidget(); if ( wMain ) - XtAddGrab(wMain, TRUE, FALSE); + XtAddGrab(wMain, True, False); - m_winCaptured = TRUE; + m_winCaptured = true; } void wxWindow::DoReleaseMouse() @@ -678,7 +678,7 @@ void wxWindow::DoReleaseMouse() if ( wMain ) XtRemoveGrab(wMain); - m_winCaptured = FALSE; + m_winCaptured = false; } bool wxWindow::SetFont(const wxFont& font) @@ -686,12 +686,12 @@ bool wxWindow::SetFont(const wxFont& font) if ( !wxWindowBase::SetFont(font) ) { // nothing to do - return FALSE; + return false; } ChangeFont(); - return TRUE; + return true; } bool wxWindow::SetCursor(const wxCursor& cursor) @@ -699,7 +699,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor) if ( !wxWindowBase::SetCursor(cursor) ) { // no change - return FALSE; + return false; } // wxASSERT_MSG( m_cursor.Ok(), @@ -717,7 +717,7 @@ bool wxWindow::SetCursor(const wxCursor& cursor) Window win = XtWindow(w); XDefineCursor((Display*) dpy, win, (Cursor) x_cursor); - return TRUE; + return true; } // Coordinates relative to the window @@ -757,7 +757,9 @@ int wxWindow::GetScrollPos(int orient) const int wxWindow::GetScrollRange(int orient) const { Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); - wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); + // CE scintilla windows don't always have these scrollbars + // and it tends to pile up a whole bunch of asserts + //wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); int range = 0; if (scrollBar) @@ -768,10 +770,11 @@ int wxWindow::GetScrollRange(int orient) const int wxWindow::GetScrollThumb(int orient) const { Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient); - wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); + //wxCHECK_MSG( scrollBar, 0, "no such scrollbar" ); - int thumb; - XtVaGetValues(scrollBar, XmNsliderSize, &thumb, NULL); + int thumb = 0; + if (scrollBar) + XtVaGetValues(scrollBar, XmNsliderSize, &thumb, NULL); return thumb; } @@ -896,7 +899,7 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect) XCopyArea(display, window, window, (GC) dc.GetGC(), x1, y1, w1, h1, x2, y2); - dc.SetAutoSetting(TRUE); + dc.SetAutoSetting(true); wxBrush brush(GetBackgroundColour(), wxSOLID); dc.SetBrush(brush); // FIXME: needed? @@ -1072,6 +1075,12 @@ void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip)) bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) { + if ( x == -1 && y == -1 ) + { + wxPoint mouse = ScreenToClient(wxGetMousePosition()); + x = mouse.x; y = mouse.y; + } + Widget widget = (Widget) GetMainWidget(); /* The menuId field seems to be usused, so we'll use it to @@ -1082,11 +1091,11 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) */ if (menu->GetParent() && (menu->GetId() != -1)) - return FALSE; + return false; if (menu->GetMainWidget()) { - menu->DestroyMenu(TRUE); + menu->DestroyMenu(true); } menu->SetId(1); /* Mark as popped-up */ @@ -1149,7 +1158,7 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) wxDoEventLoopIteration( evtLoop ); } - return TRUE; + return true; } #endif @@ -1160,7 +1169,7 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y) bool wxWindow::PreResize() { - return TRUE; + return true; } // Get total size @@ -1241,7 +1250,7 @@ void wxWindow::DoGetClientSize(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); + DoSetSizeIntr(x, y, width, height, sizeFlags, false); } void wxWindow::DoSetSizeIntr(int x, int y, int width, int height, @@ -1363,13 +1372,6 @@ void wxWindow::DoSetClientSize(int width, int height) XtVaSetValues(widget, XmNheight, height, NULL); } -// For implementation purposes - sometimes decorations make the client area -// smaller -wxPoint wxWindow::GetClientAreaOrigin() const -{ - return wxPoint(0, 0); -} - void wxWindow::DoMoveWindowIntr(int xx, int yy, int w, int h, int flags) { @@ -1434,6 +1436,8 @@ void wxWindow::DoMoveWindowIntr(int xx, int yy, int w, int h, } else { + if( xx < 0 ) xx = 0; + if( yy < 0 ) yy = 0; if( w < 1 ) w = 1; if( h < 1 ) h = 1; @@ -1460,29 +1464,24 @@ int wxWindow::GetCharHeight() const { wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" ); - WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay()); - - int direction, ascent, descent; - XCharStruct overall; - XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent, - &descent, &overall); + int height; + + wxGetTextExtent (GetXDisplay(), m_font, 1.0, + "x", NULL, &height, NULL, NULL); - // return (overall.ascent + overall.descent); - return (ascent + descent); + return height; } int wxWindow::GetCharWidth() const { wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" ); - WXFontStructPtr pFontStruct = m_font.GetFontStruct(1.0, GetXDisplay()); - - int direction, ascent, descent; - XCharStruct overall; - XTextExtents ((XFontStruct*) pFontStruct, "x", 1, &direction, &ascent, - &descent, &overall); + int width; + + wxGetTextExtent (GetXDisplay(), m_font, 1.0, + "x", &width, NULL, NULL, NULL); - return overall.width; + return width; } void wxWindow::GetTextExtent(const wxString& string, @@ -1490,36 +1489,14 @@ void wxWindow::GetTextExtent(const wxString& string, int *descent, int *externalLeading, const wxFont *theFont) const { - wxFont *fontToUse = (wxFont *)theFont; - if (!fontToUse) - fontToUse = (wxFont *) & m_font; + const wxFont *fontToUse = theFont ? theFont : &m_font; wxCHECK_RET( fontToUse->Ok(), "valid window font needed" ); - - WXFontStructPtr pFontStruct = fontToUse->GetFontStruct(1.0, GetXDisplay()); - - int direction, ascent, descent2; - XCharStruct overall; - int slen = string.Len(); - -#if 0 - if (use16) - XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *) (char*) (const char*) string, slen, &direction, - &ascent, &descent2, &overall); -#endif - XTextExtents((XFontStruct*) pFontStruct, string, slen, - &direction, &ascent, &descent2, &overall); - - if ( x ) - *x = (overall.width); - if ( y ) - *y = (ascent + descent2); - if (descent) - *descent = descent2; if (externalLeading) *externalLeading = 0; - + wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0, + string, x, y, NULL, descent); } // ---------------------------------------------------------------------------- @@ -1533,7 +1510,7 @@ void wxWindow::AddUpdateRect(int x, int y, int w, int h) void wxWindow::Refresh(bool eraseBack, const wxRect *rect) { - m_needsRefresh = TRUE; + m_needsRefresh = true; Display *display = XtDisplay((Widget) GetMainWidget()); Window thisWindow = XtWindow((Widget) GetMainWidget()); @@ -1593,7 +1570,7 @@ void wxWindow::DoPaint() // otherwise we don't know how many pixels have been scrolled. We might // solve this in the future by defining virtual wxWindow functions to get // the scroll position in pixels. Or, each kind of scrolled window has to - // implement backing stores itself, using generic wxWindows code. + // implement backing stores itself, using generic wxWidgets code. wxScrolledWindow* scrolledWindow = wxDynamicCast(this, wxScrolledWindow); if ( scrolledWindow ) { @@ -1645,7 +1622,7 @@ void wxWindow::DoPaint() event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); - m_needsRefresh = FALSE; + m_needsRefresh = false; } } @@ -1664,7 +1641,7 @@ void wxWindow::OnSysColourChanged(wxSysColourChangedEvent& event) if ( win->GetParent() ) { wxSysColourChangedEvent event2; - event.m_eventObject = win; + event.SetEventObject(win); win->GetEventHandler()->ProcessEvent(event2); } @@ -1688,7 +1665,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) { #if wxUSE_ACCEL if (!m_acceleratorTable.Ok()) - return FALSE; + return false; int count = m_acceleratorTable.GetCount(); wxAcceleratorEntry* entries = m_acceleratorTable.GetEntries(); @@ -1708,7 +1685,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) parent = parent->GetParent(); if (!parent) - return FALSE; + return false; wxFrame* frame = wxDynamicCast(parent, wxFrame); if ( frame ) @@ -1723,7 +1700,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, entry->GetCommand()); commandEvent.SetEventObject(frame); - // If ProcessEvent returns TRUE (it was handled), then + // If ProcessEvent returns true (it was handled), then // the calling code will skip the event handling. return frame->GetEventHandler()->ProcessEvent(commandEvent); } @@ -1736,7 +1713,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) // No such child if (!child) - return FALSE; + return false; // Now we process those kinds of windows that we can. // For now, only buttons. @@ -1747,13 +1724,13 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) return child->GetEventHandler()->ProcessEvent(commandEvent); } - return FALSE; + return false; } // matches event }// for #endif // We didn't match the key event against an accelerator. - return FALSE; + return false; } // ============================================================================ @@ -1761,7 +1738,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event) // ============================================================================ // ---------------------------------------------------------------------------- -// function which maintain the global hash table mapping Widgets to wxWindows +// function which maintain the global hash table mapping Widgets to wxWidgets // ---------------------------------------------------------------------------- bool wxAddWindowToTable(Widget w, wxWindow *win) @@ -1771,7 +1748,7 @@ bool wxAddWindowToTable(Widget w, wxWindow *win) { wxLogDebug("Widget table clash: new widget is %ld, %s", (long)w, win->GetClassInfo()->GetClassName()); - return FALSE; + return false; } wxWidgetHashTable->Put((long) w, win); @@ -1779,7 +1756,7 @@ bool wxAddWindowToTable(Widget w, wxWindow *win) wxLogTrace("widget", "Widget 0x%p <-> window %p (%s)", (WXWidget)w, win, win->GetClassInfo()->GetClassName()); - return TRUE; + return true; } wxWindow *wxGetWindowFromTable(Widget w) @@ -1822,7 +1799,7 @@ bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget, if (formWidget) { if (!wxAddWindowToTable((Widget) formWidget, this)) - return FALSE; + return false; XtTranslations ptr; XtOverrideTranslations ((Widget) formWidget, @@ -1830,13 +1807,18 @@ bool wxWindow::AttachWidget (wxWindow* WXUNUSED(parent), WXWidget mainWidget, XtFree ((char *) ptr); } - if (x == -1) - x = 0; - if (y == -1) - y = 0; - SetSize (x, y, width, height); + SetInitialBestSize(wxSize(width, height)); + + if (x != -1 || y != -1) + { + if (x == -1) + x = 0; + if (y == -1) + y = 0; + Move(x, y); + } - return TRUE; + return true; } // Remove event handler, remove from hash table @@ -1850,7 +1832,7 @@ bool wxWindow::DetachWidget(WXWidget widget) (XtPointer)this); wxDeleteWindowFromTable((Widget) widget); - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -2103,9 +2085,9 @@ static void wxPanelItemEventHandler(Widget wid, } // TODO: probably the key to allowing default behaviour to happen. Say we - // set a m_doDefault flag to FALSE at the start of this function. Then in + // set a m_doDefault flag to false at the start of this function. Then in // e.g. wxWindow::OnMouseEvent we can call Default() which sets this flag to - // TRUE, indicating that default processing can happen. Thus, behaviour can + // true, indicating that default processing can happen. Thus, behaviour can // appear to be overridden just by adding an event handler and not calling // wxWindow::OnWhatever. ALSO, maybe we can use this instead of the current // way of handling drawing area events, to simplify things. @@ -2315,11 +2297,11 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, eventType = wxEVT_RIGHT_UP; } else - return FALSE; + return false; } else { - return FALSE; + return false; } wxevent.SetEventType(eventType); @@ -2330,7 +2312,7 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, int x2, y2; win->GetPosition(&x2, &y2); - // The button x/y must be translated to wxWindows + // The button x/y must be translated to wxWidgets // window space - the widget might be a label or button, // within a form. int dx = 0; @@ -2362,10 +2344,10 @@ bool wxTranslateMouseEvent(wxMouseEvent& wxevent, wxWindow *win, wxevent.SetId(win->GetId()); wxevent.SetEventObject(win); - return TRUE; + return true; } } - return FALSE; + return false; } bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, @@ -2387,13 +2369,13 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, id = toupper(id); if (xevent->xkey.state & ShiftMask) - wxevent.m_shiftDown = TRUE; + wxevent.m_shiftDown = true; if (xevent->xkey.state & ControlMask) - wxevent.m_controlDown = TRUE; + wxevent.m_controlDown = true; if (xevent->xkey.state & Mod3Mask) - wxevent.m_altDown = TRUE; + wxevent.m_altDown = true; if (xevent->xkey.state & Mod1Mask) - wxevent.m_metaDown = TRUE; + wxevent.m_metaDown = true; wxevent.SetEventObject(win); wxevent.m_keyCode = id; wxevent.SetTimestamp(xevent->xkey.time); @@ -2402,15 +2384,15 @@ bool wxTranslateKeyEvent(wxKeyEvent& wxevent, wxWindow *win, wxevent.m_y = xevent->xbutton.y; if (id > -1) - return TRUE; + return true; else - return FALSE; + return false; break; } default: break; } - return FALSE; + return false; } // ---------------------------------------------------------------------------- @@ -2498,21 +2480,21 @@ void wxWindow::ChangeForegroundColour() bool wxWindow::SetBackgroundColour(const wxColour& col) { if ( !wxWindowBase::SetBackgroundColour(col) ) - return FALSE; + return false; ChangeBackgroundColour(); - return TRUE; + return true; } bool wxWindow::SetForegroundColour(const wxColour& col) { if ( !wxWindowBase::SetForegroundColour(col) ) - return FALSE; + return false; ChangeForegroundColour(); - return TRUE; + return true; } void wxWindow::ChangeFont(bool keepOriginalSize)