Fixes to wxMotif scrolling and colours (wxTreeCtrl/wxListCtrl now seem to work

well, ta-ra!); fixes to thread.cpp since constants were changed


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1275 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
1998-12-28 21:32:10 +00:00
parent cffee23b4f
commit 88150e6073
14 changed files with 239 additions and 180 deletions

View File

@@ -42,7 +42,7 @@ samples/mfc/make_cw.mcp
samples/minimal/make_cw.mcp samples/minimal/make_cw.mcp
samples/minimal/make_cw.mcp samples/minifram/make_cw.mcp
samples/nativdlg/make_cw.mcp samples/nativdlg/make_cw.mcp

View File

@@ -64,8 +64,8 @@ samples/mfc/MfcVC.dsw
samples/minimal/MinimalVC.dsp samples/minimal/MinimalVC.dsp
samples/minimal/MinimalVC.dsw samples/minimal/MinimalVC.dsw
samples/minimal/MiniframVC.dsp samples/minifram/MiniframVC.dsp
samples/minimal/MiniframVC.dsw samples/minifram/MiniframVC.dsw
samples/nativdlg/NativdlgVC.dsp samples/nativdlg/NativdlgVC.dsp
samples/nativdlg/NativdlgVC.dsw samples/nativdlg/NativdlgVC.dsw

View File

@@ -14,6 +14,7 @@ erase %dest\wx200*.zip
cd %src cd %src
echo Zipping... echo Zipping...
zip32 -@ %dest\wx200gen.zip < %src\distrib\msw\generic.rsp zip32 -@ %dest\wx200gen.zip < %src\distrib\msw\generic.rsp
zip32 -@ %dest\wx200msw.zip < %src\distrib\msw\msw.rsp zip32 -@ %dest\wx200msw.zip < %src\distrib\msw\msw.rsp
zip32 -@ %dest\wx200gtk.zip < %src\distrib\msw\gtk.rsp zip32 -@ %dest\wx200gtk.zip < %src\distrib\msw\gtk.rsp
@@ -28,6 +29,7 @@ zip32 -@ %dest\wx200wrd.zip < %src\distrib\msw\wx_word.rsp
rem VC++ project files rem VC++ project files
zip32 -@ %dest\wx200vc.zip < %src\distrib\msw\vc.rsp zip32 -@ %dest\wx200vc.zip < %src\distrib\msw\vc.rsp
rem CodeWarrior project files rem CodeWarrior project files
zip32 -@ %dest\wx200cw.zip < %src\distrib\msw\cw.rsp zip32 -@ %dest\wx200cw.zip < %src\distrib\msw\cw.rsp

View File

@@ -90,3 +90,13 @@ More recently:
- Controls sample runs, though wxRadioBox doesn't appear and - Controls sample runs, though wxRadioBox doesn't appear and
the notebook flickers for a while. the notebook flickers for a while.
- Cured wxTreeCtrl bug: now works pretty well! - Cured wxTreeCtrl bug: now works pretty well!
28/12/98
--------
- Cured scrolling problem: scrollbars now show/hide themselves
without (permanently) resizing the window.
- Removed some commented-out lines in wxScrolledWindow::AdjustScrollbars
that disabled scrollbar paging.
- Set background colour of drawing area in wxWindow, so e.g. wxListCtrl
colours correctly.

View File

@@ -1,7 +1,7 @@
wxMotif TODO wxMotif TODO
------------ ------------
Updated: 12/11/98 Updated: 28/12/98
-------------------------------o------------------------- -------------------------------o-------------------------
@@ -40,33 +40,10 @@ High Priority
- wxSpinButton - wxSpinButton
- Tidy dialogs such as the colour and font selectors.
- Use generic wxTreeCtrl, wxListCtrl: debug and enhance these.
We're close to having these working: mostly scrolling to work out.
- Find out why modal dialogs give a grab warning.
- wxSystemSettings. Eventually, should have control panel-like utility
to change colours/fonts but meanwhile should maybe read them
from a file.
- wxThread (hopefully, similar to wxGTK)
- wxGrid: scrollbars don't hide; problem with cell selection.
- MDI: seems to be broken for a more complex application I'm testing.
Frame decorations don't draw properly, and a child window doesn't
process events properly. So probably we should have an alternative
implementation that uses tabs, a la wxGTK. The system menu could
be implemented using a pop-up menu that applies to the currently
active window.
- Controls in a wxToolBar don't work. Probably due to form layout
problems; the workaround is to use a separate panel for controls.
- Miscellaneous events. - Miscellaneous events.
- Thread classes (copy wxGTK's).
- Write makefiles for all samples and utilities. - Write makefiles for all samples and utilities.
- Create some samples for testing. - Create some samples for testing.
@@ -75,14 +52,11 @@ Low Priority
------------ ------------
- Better makefile system that can put objects in different dirs. - Better makefile system that can put objects in different dirs.
Use wxGTK config system? It's really complex to debug and
doesn't offer a way of compiling apps outside the wxWin
hierarchy.
- Extra wxBitmap formats: PNG, BMP. Could use old wxWin 1.68 - Extra wxBitmap formats: PNG, BMP. Could use old wxWin 1.68
wxImage code (derived from XV) for BMP/GIF but it's very bloated. However, wxImage code (derived from XV) for BMP/GIF but it's very bloated. However,
when implemented as extra bitmap handlers, the code won't be linked when implemented as extra bitmap handlers, the code won't be linked
unless needed. unless needed. Update: see if wxImage can handle these formats.
- Print/preview framework in print.cpp (see wxGTK). - Print/preview framework in print.cpp (see wxGTK).
@@ -107,10 +81,6 @@ Low Priority
- add the driver code to src/motif/helphtml.cpp (a frame, toolbar, - add the driver code to src/motif/helphtml.cpp (a frame, toolbar,
history list). history list).
- Optimize screen refresh for non-native widgets, e.g. wxWindow
created with Create(), using technique in flicker patch for 1.68
(see JACS for latest patch).
- Copy and paste, drag and drop. Use a standard X drag - Copy and paste, drag and drop. Use a standard X drag
and drop standard - see http://www.cco.caltech.edu/~jafl/xdnd/ and drop standard - see http://www.cco.caltech.edu/~jafl/xdnd/
or use Motif drag and drop as described here: or use Motif drag and drop as described here:
@@ -130,19 +100,11 @@ Low Priority
- Reimplement combobox using Lesstif's widget (avoiding GPL'ed - Reimplement combobox using Lesstif's widget (avoiding GPL'ed
widget currently used). widget currently used).
- Write generic wxDirDialog (directory selector)
- Use native Motif dialogs for wxMessageBox
- Miscellaneous classes e.g. wxJoystick (identical to GTK's one for - Miscellaneous classes e.g. wxJoystick (identical to GTK's one for
Linux) Linux)
- Blit scaling - Blit scaling
- Could eventually alter the MDI widgets to be more Windows-like
-- currently it's half-hearted (menus are on children, whereas
they should replace the main parent frame menu).
- Get ODBC classes and sample working. - Get ODBC classes and sample working.
- Work out why wxTextCtrl doesn't work as a stream buffer under - Work out why wxTextCtrl doesn't work as a stream buffer under

View File

@@ -275,6 +275,10 @@ public:
virtual void SetScrollbar(int orient, int pos, int thumbVisible, virtual void SetScrollbar(int orient, int pos, int thumbVisible,
int range, bool refresh = TRUE); int range, bool refresh = TRUE);
// Helper functions for Motif
void CreateScrollbar(int orientation);
void DestroyScrollbar(int orientation);
virtual void SetScrollPos(int orient, int pos, bool refresh = TRUE); virtual void SetScrollPos(int orient, int pos, bool refresh = TRUE);
virtual int GetScrollPos(int orient) const; virtual int GetScrollPos(int orient) const;
virtual int GetScrollRange(int orient) const; virtual int GetScrollRange(int orient) const;
@@ -686,5 +690,19 @@ wxWindow* WXDLLEXPORT wxGetActiveWindow();
WXDLLEXPORT_DATA(extern wxList) wxTopLevelWindows; WXDLLEXPORT_DATA(extern wxList) wxTopLevelWindows;
// A little class to switch off size optimization while an instance of the object
// exists
class WXDLLEXPORT wxNoOptimize: public wxObject
{
public:
wxNoOptimize();
~wxNoOptimize();
static bool CanOptimize();
protected:
static int m_count;
};
#endif #endif
// _WX_WINDOW_H_ // _WX_WINDOW_H_

View File

@@ -73,6 +73,8 @@
*/ */
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
WXDLLEXPORT_DATA(extern const char*) wxEmptyString;
/// checks whether the passed in pointer is NULL and if the string is empty /// checks whether the passed in pointer is NULL and if the string is empty
inline bool WXDLLEXPORT IsEmpty(const char *p) { return !p || !*p; } inline bool WXDLLEXPORT IsEmpty(const char *p) { return !p || !*p; }

View File

@@ -469,22 +469,13 @@ void wxSocketBase::Discard()
bool wxSocketBase::GetPeer(wxSockAddress& addr_man) const bool wxSocketBase::GetPeer(wxSockAddress& addr_man) const
{ {
struct sockaddr my_addr; struct sockaddr my_addr;
#ifdef __WXMSW__
int len_addr = sizeof(my_addr); int len_addr = sizeof(my_addr);
#else
size_t len_addr = sizeof(my_addr);
#endif
if (m_fd < 0) if (m_fd < 0)
return FALSE; return FALSE;
if (getpeername(m_fd, (struct sockaddr *)&my_addr, if (getpeername(m_fd, (struct sockaddr *)&my_addr,
#ifdef __WXMSW__ &len_addr) < 0)
&len_addr)
#else
(socklen_t *)&len_addr)
#endif
< 0)
return FALSE; return FALSE;
addr_man.Disassemble(&my_addr, len_addr); addr_man.Disassemble(&my_addr, len_addr);
@@ -494,22 +485,13 @@ bool wxSocketBase::GetPeer(wxSockAddress& addr_man) const
bool wxSocketBase::GetLocal(wxSockAddress& addr_man) const bool wxSocketBase::GetLocal(wxSockAddress& addr_man) const
{ {
struct sockaddr my_addr; struct sockaddr my_addr;
#ifdef __WXMSW__
int len_addr = sizeof(my_addr); int len_addr = sizeof(my_addr);
#else
size_t len_addr = sizeof(my_addr);
#endif
if (m_fd < 0) if (m_fd < 0)
return FALSE; return FALSE;
if (getsockname(m_fd, (struct sockaddr *)&my_addr, if (getsockname(m_fd, (struct sockaddr *)&my_addr,
#ifdef __WXMSW__ &len_addr) < 0)
&len_addr)
#else
(socklen_t *)&len_addr)
#endif
< 0)
return FALSE; return FALSE;

View File

@@ -121,7 +121,6 @@ void wxScrolledWindow::OnScroll(wxScrollEvent& event)
int nScrollInc = CalcScrollInc(event); int nScrollInc = CalcScrollInc(event);
if (nScrollInc == 0) return; if (nScrollInc == 0) return;
// TODO: should we store the scroll position here as well as in wxWindow?
if (orient == wxHORIZONTAL) if (orient == wxHORIZONTAL)
{ {
int newPos = m_xScrollPosition + nScrollInc; int newPos = m_xScrollPosition + nScrollInc;
@@ -133,19 +132,6 @@ void wxScrolledWindow::OnScroll(wxScrollEvent& event)
SetScrollPos(wxVERTICAL, newPos, TRUE ); SetScrollPos(wxVERTICAL, newPos, TRUE );
} }
/*
// TODO We need to multiply the ScrollWindow amount by the scaling
// factor, but how do we know what this is in wxWin 2.0???
float scaleX = 1.0;
float scaleY = 1.0;
if ( this->IsKindOf(CLASSINFO(wxCanvas)) )
{
wxDC* dc = ((wxCanvas *)this)->GetDC();
dc->GetUserScale(&scaleX, &scaleY);
}
*/
if (orient == wxHORIZONTAL) if (orient == wxHORIZONTAL)
{ {
m_xScrollPosition += nScrollInc; m_xScrollPosition += nScrollInc;
@@ -234,6 +220,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
break; break;
} }
} }
if (orient == wxHORIZONTAL) if (orient == wxHORIZONTAL)
{ {
if (m_xScrollPixelsPerLine > 0) { if (m_xScrollPixelsPerLine > 0) {
@@ -295,7 +282,8 @@ void wxScrolledWindow::AdjustScrollbars(void)
m_xScrollPosition = wxMax( 0, m_xScrollPosition ); m_xScrollPosition = wxMax( 0, m_xScrollPosition );
SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines); SetScrollbar(wxHORIZONTAL, m_xScrollPosition, noPagePositions, m_xScrollLines);
// SetScrollPageSize(wxHORIZONTAL, noPagePositions); // The amount by which we scroll when paging
SetScrollPageSize(wxHORIZONTAL, noPagePositions);
} }
else else
{ {
@@ -316,7 +304,8 @@ void wxScrolledWindow::AdjustScrollbars(void)
m_yScrollPosition = wxMax( 0, m_yScrollPosition ); m_yScrollPosition = wxMax( 0, m_yScrollPosition );
SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines); SetScrollbar(wxVERTICAL, m_yScrollPosition, noPagePositions, m_yScrollLines);
// SetScrollPageSize(wxVERTICAL, noPagePositions); // The amount by which we scroll when paging
SetScrollPageSize(wxVERTICAL, noPagePositions);
} }
else else
{ {

Binary file not shown.

View File

@@ -515,7 +515,8 @@ void wxDialog::EndModal(int retCode)
SetReturnCode(retCode); SetReturnCode(retCode);
XtRemoveGrab((Widget) m_mainWidget); // Strangely, we don't seem to need this now.
// XtRemoveGrab((Widget) m_mainWidget);
Show(FALSE); Show(FALSE);

View File

@@ -57,14 +57,14 @@ wxMutexError wxMutex::Lock()
{ {
// TODO // TODO
m_locked++; m_locked++;
return MUTEX_NO_ERROR; return wxMUTEX_NO_ERROR;
} }
wxMutexError wxMutex::TryLock() wxMutexError wxMutex::TryLock()
{ {
// TODO // TODO
m_locked++; m_locked++;
return MUTEX_NO_ERROR; return wxMUTEX_NO_ERROR;
} }
wxMutexError wxMutex::Unlock() wxMutexError wxMutex::Unlock()
@@ -73,7 +73,7 @@ wxMutexError wxMutex::Unlock()
m_locked--; m_locked--;
// TODO // TODO
return MUTEX_NO_ERROR; return wxMUTEX_NO_ERROR;
} }
class wxConditionInternal { class wxConditionInternal {
@@ -134,25 +134,25 @@ public:
wxThreadError wxThread::Create() wxThreadError wxThread::Create()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
wxThreadError wxThread::Destroy() wxThreadError wxThread::Destroy()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
wxThreadError wxThread::Pause() wxThreadError wxThread::Pause()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
wxThreadError wxThread::Resume() wxThreadError wxThread::Resume()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
void wxThread::Exit(void *status) void wxThread::Exit(void *status)
@@ -193,11 +193,13 @@ unsigned long wxThread::GetID() const
return 0; return 0;
} }
/*
wxThread *wxThread::GetThreadFromID(unsigned long id) wxThread *wxThread::GetThreadFromID(unsigned long id)
{ {
// TODO // TODO
return NULL; return NULL;
} }
*/
bool wxThread::IsAlive() const bool wxThread::IsAlive() const
{ {

View File

@@ -368,6 +368,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
m_scrolledWindow = (WXWidget) XtVaCreateManagedWidget ("scrolledWindow", m_scrolledWindow = (WXWidget) XtVaCreateManagedWidget ("scrolledWindow",
xmScrolledWindowWidgetClass, m_borderWidget ? (Widget) m_borderWidget : parentWidget, xmScrolledWindowWidgetClass, m_borderWidget ? (Widget) m_borderWidget : parentWidget,
XmNresizePolicy, XmRESIZE_NONE,
XmNspacing, 0, XmNspacing, 0,
XmNscrollingPolicy, XmAPPLICATION_DEFINED, XmNscrollingPolicy, XmAPPLICATION_DEFINED,
// XmNscrollBarDisplayPolicy, XmAS_NEEDED, // XmNscrollBarDisplayPolicy, XmAS_NEEDED,
@@ -420,8 +421,40 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
XtAddEventHandler ((Widget) m_drawingArea, PointerMotionHintMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask, XtAddEventHandler ((Widget) m_drawingArea, PointerMotionHintMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask,
False, (XtEventHandler) wxCanvasEnterLeave, (XtPointer) this); False, (XtEventHandler) wxCanvasEnterLeave, (XtPointer) this);
// 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);
DoChangeBackgroundColour(m_scrolledWindow, backgroundColour, TRUE);
DoChangeBackgroundColour(m_drawingArea, backgroundColour, TRUE);
XmScrolledWindowSetAreas ((Widget) m_scrolledWindow, (Widget) 0, (Widget) 0, (Widget) m_drawingArea);
/*
if (m_hScrollBar)
XtRealizeWidget ((Widget) m_hScrollBar);
if (m_vScrollBar)
XtRealizeWidget ((Widget) m_vScrollBar);
*/
// 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);
return TRUE;
}
// Helper function
void wxWindow::CreateScrollbar(int orientation)
{
if (!m_drawingArea)
return;
XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_NONE, NULL);
// Add scrollbars if required // Add scrollbars if required
if (m_windowStyle & wxHSCROLL) if (orientation == wxHORIZONTAL)
{ {
Widget hScrollBar = XtVaCreateManagedWidget ("hsb", Widget hScrollBar = XtVaCreateManagedWidget ("hsb",
xmScrollBarWidgetClass, (Widget) m_scrolledWindow, xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
@@ -446,9 +479,16 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
DoChangeBackgroundColour(m_hScrollBar, backgroundColour, TRUE); DoChangeBackgroundColour(m_hScrollBar, backgroundColour, TRUE);
XtRealizeWidget(hScrollBar);
XtVaSetValues((Widget) m_scrolledWindow,
XmNhorizontalScrollBar, (Widget) m_hScrollBar,
NULL);
m_hScroll = TRUE; m_hScroll = TRUE;
} }
if (m_windowStyle & wxVSCROLL)
if (orientation == wxVERTICAL)
{ {
Widget vScrollBar = XtVaCreateManagedWidget ("vsb", Widget vScrollBar = XtVaCreateManagedWidget ("vsb",
xmScrollBarWidgetClass, (Widget) m_scrolledWindow, xmScrollBarWidgetClass, (Widget) m_scrolledWindow,
@@ -472,29 +512,54 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE);
DoChangeBackgroundColour(m_vScrollBar, backgroundColour, TRUE); DoChangeBackgroundColour(m_vScrollBar, backgroundColour, TRUE);
XtRealizeWidget(vScrollBar);
XtVaSetValues((Widget) m_scrolledWindow,
XmNverticalScrollBar, (Widget) m_vScrollBar,
NULL);
m_vScroll = TRUE; m_vScroll = TRUE;
} }
// Scrolled widget needs to have its colour changed or we get XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL);
// a little blue square where the scrollbars abutt }
wxColour backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); void wxWindow::DestroyScrollbar(int orientation)
DoChangeBackgroundColour(m_scrolledWindow, backgroundColour, TRUE); {
if (!m_drawingArea)
return;
if (m_hScrollBar || m_vScrollBar) XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_NONE, NULL);
XmScrolledWindowSetAreas ((Widget) m_scrolledWindow, (Widget) m_hScrollBar, (Widget) m_vScrollBar, (Widget) m_drawingArea); // Add scrollbars if required
if (orientation == wxHORIZONTAL)
{
if (m_hScrollBar)
{
XtDestroyWidget((Widget) m_hScrollBar);
}
m_hScrollBar = (WXWidget) 0;
m_hScroll = FALSE;
if (m_hScrollBar) XtVaSetValues((Widget) m_scrolledWindow,
XtRealizeWidget ((Widget) m_hScrollBar); XmNhorizontalScrollBar, (Widget) 0,
if (m_vScrollBar) NULL);
XtRealizeWidget ((Widget) m_vScrollBar);
// 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);
return TRUE; if (orientation == wxVERTICAL)
{
if (m_vScrollBar)
{
XtDestroyWidget((Widget) m_vScrollBar);
}
m_vScrollBar = (WXWidget) 0;
m_vScroll = TRUE;
XtVaSetValues((Widget) m_scrolledWindow,
XmNverticalScrollBar, (Widget) 0,
NULL);
}
XtVaSetValues((Widget) m_scrolledWindow, XmNresizePolicy, XmRESIZE_ANY, NULL);
} }
void wxWindow::SetFocus() void wxWindow::SetFocus()
@@ -693,6 +758,11 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
else if (width == oldW && height == oldH) else if (width == oldW && height == oldH)
useOldSize = TRUE; useOldSize = TRUE;
if (!wxNoOptimize::CanOptimize())
{
useOldSize = FALSE; useOldPos = FALSE;
}
if (useOldPos && useOldSize) if (useOldPos && useOldSize)
return; return;
@@ -1166,9 +1236,8 @@ void wxWindow::SetScrollPos(int orient, int pos, bool WXUNUSED(refresh))
void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible, void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
int range, bool WXUNUSED(refresh)) int range, bool WXUNUSED(refresh))
{ {
Widget scrollBar = (Widget) ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar ); int oldW, oldH;
if (!scrollBar) GetSize(& oldW, & oldH);
return;
if (range == 0) if (range == 0)
range = 1; range = 1;
@@ -1178,7 +1247,49 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
if (thumbVisible > range) if (thumbVisible > range)
thumbVisible = range; thumbVisible = range;
XtVaSetValues(scrollBar, // Save the old state to see if it changed
WXWidget oldScrollBar = ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar );
if (orient == wxHORIZONTAL)
{
if (thumbVisible == range)
{
if (m_hScrollBar)
DestroyScrollbar(wxHORIZONTAL);
}
else
{
if (!m_hScrollBar)
CreateScrollbar(wxHORIZONTAL);
}
}
if (orient == wxVERTICAL)
{
if (thumbVisible == range)
{
if (m_vScrollBar)
DestroyScrollbar(wxVERTICAL);
}
else
{
if (!m_vScrollBar)
CreateScrollbar(wxVERTICAL);
}
}
WXWidget newScrollBar = ((orient == wxHORIZONTAL) ? m_hScrollBar : m_vScrollBar );
if (oldScrollBar != newScrollBar)
{
// This is important! Without it, scrollbars misbehave
// badly.
XtUnrealizeWidget((Widget) m_scrolledWindow);
XmScrolledWindowSetAreas ((Widget) m_scrolledWindow, (Widget) m_hScrollBar, (Widget) m_vScrollBar, (Widget) m_drawingArea);
XtRealizeWidget((Widget) m_scrolledWindow);
XtManageChild((Widget) m_scrolledWindow);
}
if (newScrollBar)
XtVaSetValues((Widget) newScrollBar,
XmNvalue, pos, XmNvalue, pos,
XmNminimum, 0, XmNminimum, 0,
XmNmaximum, range, XmNmaximum, range,
@@ -1190,65 +1301,12 @@ void wxWindow::SetScrollbar(int orient, int pos, int thumbVisible,
else else
m_scrollPosY = pos; m_scrollPosY = pos;
// See notes below. If the scrollbars didn't leave a ghost presence, int newW, newH;
// this would be OK. GetSize(& newW, & newH);
#if 0
if (range == thumbVisible) // Adjusting scrollbars can resize the canvas accidentally
{ if (newW != oldW || newH != oldH)
XtUnmanageChild(scrollBar); SetSize(-1, -1, oldW, oldH);
if (orient == wxHORIZONTAL)
XtVaSetValues((Widget) m_scrolledWindow,
XmNhorizontalScrollBar, (Widget) 0,
NULL);
else
XtVaSetValues((Widget) m_scrolledWindow,
XmNverticalScrollBar, (Widget) 0,
NULL);
}
else
{
XtManageChild(scrollBar);
if (orient == wxHORIZONTAL)
XtVaSetValues((Widget) m_scrolledWindow,
XmNhorizontalScrollBar, (Widget) m_hScrollBar,
NULL);
else
XtVaSetValues((Widget) m_scrolledWindow,
XmNverticalScrollBar, (Widget) m_vScrollBar,
NULL);
}
#else
// Either both scrollbars are on, or they are off,
// otherwise you get a gap where one scrollbar
// isn't shown. TODO: try to eliminate this problem.
if ((GetScrollThumb(wxHORIZONTAL) >= GetScrollRange(wxHORIZONTAL)) &&
(GetScrollThumb(wxVERTICAL) >= GetScrollRange(wxVERTICAL)))
{
if (m_hScrollBar)
XtUnmanageChild((Widget) m_hScrollBar);
if (m_vScrollBar)
XtUnmanageChild((Widget) m_vScrollBar);
XtVaSetValues((Widget) m_scrolledWindow,
XmNhorizontalScrollBar, (Widget) 0,
XmNverticalScrollBar, (Widget) 0,
NULL);
// XmScrolledWindowSetAreas((Widget) m_scrolledWindow,
// (Widget) 0, (Widget) 0, (Widget) m_drawingArea);
}
else
{
if (m_hScrollBar)
XtManageChild((Widget) m_hScrollBar);
if (m_vScrollBar)
XtManageChild((Widget) m_vScrollBar);
XtVaSetValues((Widget) m_scrolledWindow,
XmNhorizontalScrollBar, (Widget) m_hScrollBar,
XmNverticalScrollBar, (Widget) m_vScrollBar,
NULL);
// XmScrolledWindowSetAreas((Widget) m_scrolledWindow,
// (Widget) m_hScrollBar, (Widget) m_vScrollBar, (Widget) m_drawingArea);
}
#endif
} }
// Does a physical scroll // Does a physical scroll
@@ -2644,6 +2702,11 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
else if (w == oldW && h == oldH) else if (w == oldW && h == oldH)
useOldSize = TRUE; useOldSize = TRUE;
if (!wxNoOptimize::CanOptimize())
{
useOldSize = FALSE; useOldPos = FALSE;
}
if (useOldPos && useOldSize) if (useOldPos && useOldSize)
return; return;
@@ -2704,7 +2767,7 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
w -= (spacing + wsbar); w -= (spacing + wsbar);
XtVaSetValues ((Widget) m_drawingArea, XmNwidth, w, NULL); // XtVaSetValues ((Widget) m_drawingArea, XmNwidth, w, NULL);
} }
if (h > -1) if (h > -1)
{ {
@@ -2735,7 +2798,8 @@ void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
h -= (spacing + wsbar); h -= (spacing + wsbar);
XtVaSetValues ((Widget) m_drawingArea, XmNheight, h, NULL); // XtVaSetValues ((Widget) m_drawingArea, XmNheight, h, NULL);
} }
} }
@@ -3202,12 +3266,16 @@ void wxWindow::ChangeBackgroundColour()
{ {
if (GetMainWidget()) if (GetMainWidget())
DoChangeBackgroundColour(GetMainWidget(), m_backgroundColour); DoChangeBackgroundColour(GetMainWidget(), m_backgroundColour);
if (m_scrolledWindow && (GetMainWidget() != m_scrolledWindow))
DoChangeBackgroundColour(m_scrolledWindow, m_backgroundColour);
} }
void wxWindow::ChangeForegroundColour() void wxWindow::ChangeForegroundColour()
{ {
if (GetMainWidget()) if (GetMainWidget())
DoChangeForegroundColour(GetMainWidget(), m_foregroundColour); DoChangeForegroundColour(GetMainWidget(), m_foregroundColour);
if (m_scrolledWindow && (GetMainWidget() != m_scrolledWindow))
DoChangeForegroundColour(m_scrolledWindow, m_foregroundColour);
} }
// Change a widget's foreground and background colours. // Change a widget's foreground and background colours.
@@ -3370,3 +3438,24 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
return FALSE; return FALSE;
} }
/*
* wxNoOptimize: switch off size optimization
*/
int wxNoOptimize::m_count = 0;
wxNoOptimize::wxNoOptimize()
{
m_count ++;
}
wxNoOptimize::~wxNoOptimize()
{
m_count --;
}
bool wxNoOptimize::CanOptimize()
{
return (m_count == 0);
}

View File

@@ -57,14 +57,14 @@ wxMutexError wxMutex::Lock()
{ {
// TODO // TODO
m_locked++; m_locked++;
return MUTEX_NO_ERROR; return wxMUTEX_NO_ERROR;
} }
wxMutexError wxMutex::TryLock() wxMutexError wxMutex::TryLock()
{ {
// TODO // TODO
m_locked++; m_locked++;
return MUTEX_NO_ERROR; return wxMUTEX_NO_ERROR;
} }
wxMutexError wxMutex::Unlock() wxMutexError wxMutex::Unlock()
@@ -73,7 +73,7 @@ wxMutexError wxMutex::Unlock()
m_locked--; m_locked--;
// TODO // TODO
return MUTEX_NO_ERROR; return wxMUTEX_NO_ERROR;
} }
class wxConditionInternal { class wxConditionInternal {
@@ -134,25 +134,25 @@ public:
wxThreadError wxThread::Create() wxThreadError wxThread::Create()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
wxThreadError wxThread::Destroy() wxThreadError wxThread::Destroy()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
wxThreadError wxThread::Pause() wxThreadError wxThread::Pause()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
wxThreadError wxThread::Resume() wxThreadError wxThread::Resume()
{ {
// TODO // TODO
return THREAD_NO_ERROR; return wxTHREAD_NO_ERROR;
} }
void wxThread::Exit(void *status) void wxThread::Exit(void *status)
@@ -193,11 +193,13 @@ unsigned long wxThread::GetID() const
return 0; return 0;
} }
/*
wxThread *wxThread::GetThreadFromID(unsigned long id) wxThread *wxThread::GetThreadFromID(unsigned long id)
{ {
// TODO // TODO
return NULL; return NULL;
} }
*/
bool wxThread::IsAlive() const bool wxThread::IsAlive() const
{ {