// position and size of the window
int m_x, m_y;
int m_width, m_height;
- int m_oldClientWidth,m_oldClientHeight;
+ int m_clientWidth, m_clientHeight;
+ // Whether the client size variables above are known to be correct
+ // (because they have been validated by a size-allocate) and should
+ // be used to report client size
+ bool m_useCachedClientSize;
// see the docs in src/gtk/window.cpp
GtkWidget *m_widget; // mostly the widget seen by the rest of GTK
wxFrameBase::DoGetClientSize(width, height);
+ if (m_useCachedClientSize)
+ return;
+
if (height)
{
#if wxUSE_MENUS_NATIVE
wxFrameBase::DetachMenuBar();
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
void wxFrame::AttachMenuBar( wxMenuBar *menuBar )
#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2/!wxUSE_LIBHILDON && !wxUSE_LIBHILDON2
}
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
#endif // wxUSE_MENUS_NATIVE
gtk_widget_set_size_request(toolbar->m_widget, -1, -1);
}
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
#endif // wxUSE_TOOLBAR
gtk_box_set_child_packing(GTK_BOX(m_mainWidget),
statbar->m_widget, false, false, 0, GTK_PACK_END);
// make sure next size_allocate on statusbar causes a size event
- statbar->m_oldClientWidth = 0;
+ statbar->m_useCachedClientSize = false;
+ statbar->m_clientWidth = 0;
int h = -1;
if (statbar->m_wxwindow)
{
gtk_widget_set_size_request(statbar->m_widget, -1, h);
}
// make sure next size_allocate causes a wxSizeEvent
- m_oldClientWidth = 0;
+ m_useCachedClientSize = false;
+ m_clientWidth = 0;
}
#endif // wxUSE_STATUSBAR
{
wxFrame::DoGetClientSize(width, height);
- if (height)
+ if (!m_useCachedClientSize && height)
{
wxMDIChildFrame* active_child_frame = GetActiveChild();
if (active_child_frame)
void wxMiniFrame::DoGetClientSize(int* width, int* height) const
{
wxFrame::DoGetClientSize(width, height);
+
+ if (m_useCachedClientSize)
+ return;
+
if (width)
{
*width -= 2 * m_miniEdge;
static void
size_allocate(GtkWidget*, GtkAllocation* alloc, wxTopLevelWindowGTK* win)
{
- if (win->m_oldClientWidth != alloc->width ||
- win->m_oldClientHeight != alloc->height)
+ win->m_useCachedClientSize = true;
+ if (win->m_clientWidth != alloc->width ||
+ win->m_clientHeight != alloc->height)
{
- win->m_oldClientWidth = alloc->width;
- win->m_oldClientHeight = alloc->height;
+ win->m_clientWidth = alloc->width;
+ win->m_clientHeight = alloc->height;
GtkAllocation a;
gtk_widget_get_allocation(win->m_widget, &a);
// tlw that was "rolled up" with some WMs.
// Queue a resize rather than sending size event directly to allow
// children to be made visible first.
- win->m_oldClientWidth = 0;
+ win->m_useCachedClientSize = false;
+ win->m_clientWidth = 0;
gtk_widget_queue_resize(win->m_wxwindow);
}
// it is possible for m_isShown to be false here, see bug #9909
if (m_width != oldSize.x || m_height != oldSize.y)
{
m_deferShowAllowed = true;
+ m_useCachedClientSize = false;
int w, h;
GTKDoGetSize(&w, &h);
gtk_window_resize(GTK_WINDOW(m_widget), w, h);
- GetClientSize(&m_oldClientWidth, &m_oldClientHeight);
+ DoGetClientSize(&m_clientWidth, &m_clientHeight);
wxSizeEvent event(GetSize(), GetId());
event.SetEventObject(this);
HandleWindowEvent(event);
if ( height )
*height = 0;
}
+ else if (m_useCachedClientSize)
+ base_type::DoGetClientSize(width, height);
else
{
GTKDoGetSize(width, height);
GetCachedDecorSize() = decorSize;
if (m_updateDecorSize && m_decorSize != decorSize)
{
+ m_useCachedClientSize = false;
const wxSize diff = decorSize - m_decorSize;
m_decorSize = decorSize;
bool resized = false;
m_height += diff.y;
if (m_width < 1) m_width = 1;
if (m_height < 1) m_height = 1;
- m_oldClientWidth = 0;
+ m_clientWidth = 0;
gtk_widget_queue_resize(m_wxwindow);
}
}
{
// gtk_widget_show() was deferred, do it now
m_deferShow = false;
- GetClientSize(&m_oldClientWidth, &m_oldClientHeight);
+ DoGetClientSize(&m_clientWidth, &m_clientHeight);
wxSizeEvent sizeEvent(GetSize(), GetId());
sizeEvent.SetEventObject(this);
HandleWindowEvent(sizeEvent);
if (w < 0) w = 0;
if (h < 0) h = 0;
}
- if (win->m_oldClientWidth != w || win->m_oldClientHeight != h)
+ win->m_useCachedClientSize = true;
+ if (win->m_clientWidth != w || win->m_clientHeight != h)
{
- win->m_oldClientWidth = w;
- win->m_oldClientHeight = h;
+ win->m_clientWidth = w;
+ win->m_clientHeight = h;
// this callback can be connected to m_wxwindow,
// so always get size from m_widget->allocation
GtkAllocation a;
static void style_updated(GtkWidget*, GtkStyle*, wxWindow* win)
#endif
{
- if (win->IsTopLevel())
- {
- wxSysColourChangedEvent event;
- event.SetEventObject(win);
- win->GTKProcessEvent(event);
- }
- else
- {
- // Border width could change, which will change client size.
- // Make sure size event occurs for this
- win->m_oldClientWidth = 0;
- }
+ wxSysColourChangedEvent event;
+ event.SetEventObject(win);
+ win->GTKProcessEvent(event);
}
//-----------------------------------------------------------------------------
GTKUpdateCursor(true, false);
- if (m_wxwindow &&
- (IsTopLevel() || HasFlag(wxBORDER_RAISED | wxBORDER_SUNKEN | wxBORDER_THEME)))
+ if (m_wxwindow && IsTopLevel())
{
// attaching to style changed signal after realization avoids initial
// changes we don't care about
if (m_imData)
gtk_im_context_set_client_window(m_imData->context, NULL);
- g_signal_handlers_disconnect_by_func(
- m_wxwindow, (void*)style_updated, this);
+ if (IsTopLevel())
+ {
+ g_signal_handlers_disconnect_by_func(
+ m_wxwindow, (void*)style_updated, this);
+ }
}
}
m_scrollPos[dir] = 0;
}
- m_oldClientWidth =
- m_oldClientHeight = 0;
+ m_clientWidth =
+ m_clientHeight = 0;
+ m_useCachedClientSize = false;
m_clipPaintRegion = false;
height = m_height;
const bool sizeChange = m_width != width || m_height != height;
+
+ if (sizeChange)
+ m_useCachedClientSize = false;
+
if (sizeChange || m_x != x || m_y != y)
{
m_x = x;
{
// update these variables to keep size_allocate handler
// from sending another size event for this change
- GetClientSize( &m_oldClientWidth, &m_oldClientHeight );
+ DoGetClientSize(&m_clientWidth, &m_clientHeight);
wxSizeEvent event( wxSize(m_width,m_height), GetId() );
event.SetEventObject( this );
{
wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
+ if (m_useCachedClientSize)
+ {
+ if (width) *width = m_clientWidth;
+ if (height) *height = m_clientHeight;
+ return;
+ }
+
int w = m_width;
int h = m_height;