#include "wx/utils.h"
#include "wx/frame.h"
#include "wx/dcclient.h"
+ #include "wx/menu.h"
+ #include "wx/dialog.h"
+ #include "wx/settings.h"
+ #include "wx/msgdlg.h"
#endif
#include "wx/layout.h"
-#include "wx/dialog.h"
-#include "wx/msgdlg.h"
#include "wx/module.h"
#include "wx/combobox.h"
+
#if wxUSE_TOOLBAR_NATIVE
-#include "wx/toolbar.h"
+ #include "wx/toolbar.h"
#endif
#if wxUSE_DRAG_AND_DROP
#include "wx/textctrl.h"
#endif
-#include "wx/menu.h"
#include "wx/statusbr.h"
-#include "wx/settings.h"
#include "wx/fontutil.h"
#ifdef __WXDEBUG__
// data
//-----------------------------------------------------------------------------
-extern wxList wxPendingDelete;
extern bool g_blockEventsOnDrag;
extern bool g_blockEventsOnScroll;
extern wxCursor g_globalCursor;
// Convert scroll event type to scrollwin event type
eventType += wxEVT_SCROLLWIN_TOP - wxEVT_SCROLL_TOP;
const int orient = range == win->m_scrollBar[0] ? wxHORIZONTAL : wxVERTICAL;
+ const int i = orient == wxVERTICAL;
wxScrollWinEvent event(eventType, win->GetScrollPos(orient), orient);
event.SetEventObject(win);
+ win->m_blockValueChanged[i] = true;
win->GetEventHandler()->ProcessEvent(event);
+ win->m_blockValueChanged[i] = false;
}
}
}
const int orient = range == win->m_scrollBar[0] ? wxHORIZONTAL : wxVERTICAL;
wxScrollWinEvent event(wxEVT_SCROLLWIN_THUMBRELEASE, win->GetScrollPos(orient), orient);
event.SetEventObject(win);
- win->GetEventHandler()->ProcessEvent(event);
+ // To allow setting scroll position from event handler, sending event must
+ // be deferred until after the GtkRange handler for this signal has run
+ win->GetEventHandler()->AddPendingEvent(event);
}
return false;
m_scrollBar[1] = NULL;
m_scrollPos[0] =
m_scrollPos[1] = 0;
+ m_blockValueChanged[0] =
+ m_blockValueChanged[1] = false;
m_oldClientWidth =
m_oldClientHeight = 0;
G_CALLBACK (wxgtk_combo_size_request_callback),
this);
}
+#ifdef GTK_IS_FILE_CHOOSER_BUTTON
+ else if (GTK_IS_FILE_CHOOSER_BUTTON(m_widget))
+ {
+ // If we connect to the "size_request" signal of a GtkFileChooserButton
+ // then that control won't be sized properly when placed inside sizers
+ // (this can be tested removing this elseif and running XRC or WIDGETS samples)
+ // FIXME: what should be done here ?
+ }
+#endif
else
{
// This is needed if we want to add our windows into native
m_updateRegion.Clear();
}
+void wxWindowGTK::SetDoubleBuffered( bool on )
+{
+ wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
+
+ if ( m_wxwindow )
+ gtk_widget_set_double_buffered( m_wxwindow, on );
+}
+
void wxWindowGTK::ClearBackground()
{
wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
thumbVisible = 1;
}
+ if (pos > range - thumbVisible)
+ pos = range - thumbVisible;
+ if (pos < 0)
+ pos = 0;
const int i = orient == wxVERTICAL;
GtkAdjustment* adj = m_scrollBar[i]->adjustment;
- adj->value = pos;
adj->step_increment = 1;
adj->page_increment =
adj->page_size = thumbVisible;
-
- BlockScrollEvent();
- // automatically clamps value to [0,range-page_size], and emits change events
- gtk_range_set_range(m_scrollBar[i], 0, range);
- UnblockScrollEvent();
- m_scrollPos[i] = adj->value;
+ adj->upper = range;
+ SetScrollPos(orient, pos);
+ gtk_adjustment_changed(adj);
}
void wxWindowGTK::SetScrollPos( int orient, int pos, bool WXUNUSED(refresh) )
if (GetScrollPos(orient) != pos)
{
const int i = orient == wxVERTICAL;
- BlockScrollEvent();
- gtk_range_set_value(m_scrollBar[i], pos);
- UnblockScrollEvent();
- m_scrollPos[i] = m_scrollBar[i]->adjustment->value;
+ GtkAdjustment* adj = m_scrollBar[i]->adjustment;
+ const int max = int(adj->upper - adj->page_size);
+ if (pos > max)
+ pos = max;
+ if (pos < 0)
+ pos = 0;
+ m_scrollPos[i] =
+ adj->value = pos;
+ // If a "value_changed" signal emission is not already in progress
+ if (!m_blockValueChanged[i])
+ {
+ gtk_adjustment_value_changed(adj);
+ }
}
}
return fabs(increment - fabs(x)) < tolerance;
}
-wxEventType wxWindow::GetScrollEventType(GtkRange* range)
+wxEventType wxWindowGTK::GetScrollEventType(GtkRange* range)
{
DEBUG_MAIN_THREAD
// update current position
m_scrollPos[barIndex] = adj->value;
// If event should be ignored, or integral position has not changed
- if (!m_hasVMT || g_blockEventsOnDrag || m_blockScrollEvent || value == int(oldPos + 0.5))
+ if (!m_hasVMT || g_blockEventsOnDrag || value == int(oldPos + 0.5))
{
return wxEVT_NULL;
}