From: Robert Roebling Date: Sat, 30 Mar 2002 11:16:24 +0000 (+0000) Subject: Added code for erasing the small square between scrollbars. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a17a79bac3f7742a351b719a4692c5e6d5641969?ds=inline Added code for erasing the small square between scrollbars. Corrected window size if scrollbars is removed/added. Reduce flicker in scrollbars. Prevent scrollbars from jumping back to original position if the mouse just barely left the scrollbar. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14872 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/univ/scrolbar.cpp b/src/univ/scrolbar.cpp index 464681e645..66d0d7a173 100644 --- a/src/univ/scrolbar.cpp +++ b/src/univ/scrolbar.cpp @@ -42,6 +42,7 @@ #include "wx/univ/renderer.h" #include "wx/univ/inphand.h" #include "wx/univ/theme.h" +#include "wx/log.h" #define WXDEBUG_SCROLLBAR @@ -388,7 +389,7 @@ void wxScrollBar::UpdateThumb() } #endif // WXDEBUG_SCROLLBAR - Refresh(TRUE, &rect); + Refresh(FALSE, &rect); } m_elementsState[n] &= ~wxCONTROL_DIRTY; diff --git a/src/univ/themes/win32.cpp b/src/univ/themes/win32.cpp index 7bb3909034..dae32a197b 100644 --- a/src/univ/themes/win32.cpp +++ b/src/univ/themes/win32.cpp @@ -4145,6 +4145,8 @@ bool wxWin32ScrollBarInputHandler::HandleMouseMove(wxInputConsumer *control, // if we're scrolling the scrollbar because the arrow or the shaft was // pressed, check that the mouse stays on the same scrollbar element +#if 0 + // Always let thumb jump back if we leave the scrollbar if ( event.Moving() ) { ht = m_renderer->HitTestScrollbar(scrollbar, event.GetPosition()); @@ -4153,6 +4155,21 @@ bool wxWin32ScrollBarInputHandler::HandleMouseMove(wxInputConsumer *control, { ht = wxHT_NOWHERE; } +#else + // Jump back only if we get far away from it + wxPoint pos = event.GetPosition(); + if (scrollbar->HasFlag( wxVERTICAL )) + { + if (pos.x > -20 && pos.x < scrollbar->GetSize().x+20) + pos.x = 5; + } + else + { + if (pos.y > -20 && pos.y < scrollbar->GetSize().y+20) + pos.y = 5; + } + ht = m_renderer->HitTestScrollbar(scrollbar, pos ); +#endif // if we're dragging the thumb and the mouse stays in the scrollbar, it // is still ok - we only want to catch the case when the mouse leaves diff --git a/src/univ/winuniv.cpp b/src/univ/winuniv.cpp index be8a2ba4e3..d8ff488e5a 100644 --- a/src/univ/winuniv.cpp +++ b/src/univ/winuniv.cpp @@ -843,8 +843,12 @@ void wxWindow::SetScrollbar(int orient, // give the window a chance to relayout if ( hasClientSizeChanged ) { +#if wxUSE_TWO_WINDOWS + wxWindowNative::SetSize( GetSize() ); +#else wxSizeEvent event(GetSize()); (void)GetEventHandler()->ProcessEvent(event); +#endif } } diff --git a/src/x11/app.cpp b/src/x11/app.cpp index fdbabd8a85..84963e8d2e 100644 --- a/src/x11/app.cpp +++ b/src/x11/app.cpp @@ -734,7 +734,7 @@ bool wxApp::ProcessXEvent(WXEvent* _event) { if (!win->IsEnabled()) return FALSE; - + // Here we check if the top level window is // disabled, which is one aspect of modality. wxWindow *tlw = win; diff --git a/src/x11/window.cpp b/src/x11/window.cpp index 18aad1d212..ce08b9fd81 100644 --- a/src/x11/window.cpp +++ b/src/x11/window.cpp @@ -40,6 +40,7 @@ #include "wx/module.h" #include "wx/menuitem.h" #include "wx/log.h" +#include "wx/univ/renderer.h" #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" @@ -837,15 +838,13 @@ void wxWindowX11::DoSetClientSize(int width, int height) { xwindow = (Window) m_clientWindow; - if (HasFlag( wxSUNKEN_BORDER) || HasFlag( wxRAISED_BORDER)) - { - width -= 4; - height -= 4; - } else - if (HasFlag( wxSIMPLE_BORDER )) + wxWindow *window = (wxWindow*) this; + wxRenderer *renderer = window->GetRenderer(); + if (renderer) { - width -= 2; - height -= 2; + wxRect border = renderer->GetBorderDimensions( (wxBorder)(m_windowStyle & wxBORDER_MASK) ); + width -= border.x + border.width; + height -= border.y + border.height; } XResizeWindow( wxGlobalDisplay(), xwindow, width, height ); @@ -872,26 +871,22 @@ void wxWindowX11::DoMoveWindow(int x, int y, int width, int height) { xwindow = (Window) m_clientWindow; - if (HasFlag( wxSUNKEN_BORDER) || HasFlag( wxRAISED_BORDER)) - { - x = 2; - y = 2; - width -= 4; - height -= 4; - } else - if (HasFlag( wxSIMPLE_BORDER )) + wxWindow *window = (wxWindow*) this; + wxRenderer *renderer = window->GetRenderer(); + if (renderer) { - x = 1; - y = 1; - width -= 2; - height -= 2; - } else + wxRect border = renderer->GetBorderDimensions( (wxBorder)(m_windowStyle & wxBORDER_MASK) ); + x = border.x; + y = border.y; + width -= border.x + border.width; + height -= border.y + border.height; + } + else { x = 0; y = 0; } - wxWindow *window = (wxWindow*) this; wxScrollBar *sb = window->GetScrollbar( wxHORIZONTAL ); if (sb && sb->IsShown()) { @@ -1139,6 +1134,37 @@ void wxWindowX11::SendPaintEvents() void wxWindowX11::SendNcPaintEvents() { + wxWindow *window = (wxWindow*) this; + + // All this for drawing the small square between the scrollbars. + int width = 0; + int height = 0; + int x = 0; + int y = 0; + wxScrollBar *sb = window->GetScrollbar( wxHORIZONTAL ); + if (sb && sb->IsShown()) + { + height = sb->GetSize().y; + y = sb->GetPosition().y; + + sb = window->GetScrollbar( wxVERTICAL ); + if (sb && sb->IsShown()) + { + width = sb->GetSize().x; + x = sb->GetPosition().x; + + Display *xdisplay = wxGlobalDisplay(); + Window xwindow = (Window) GetMainWindow(); + Colormap cm = (Colormap) wxTheApp->GetMainColormap( wxGetDisplay() ); + wxColour colour = wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE); + colour.CalcPixel( (WXColormap) cm ); + + XSetForeground( xdisplay, g_eraseGC, colour.GetPixel() ); + + XFillRectangle( xdisplay, xwindow, g_eraseGC, x, y, width, height ); + } + } + wxNcPaintEvent nc_paint_event( GetId() ); nc_paint_event.SetEventObject( this ); GetEventHandler()->ProcessEvent( nc_paint_event );