store size of WM decorations separately for each TLW, so changes to one do not affect others

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50165 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2007-11-22 17:07:27 +00:00
parent fb9cc37fa8
commit 0ab0d0e1dc
3 changed files with 30 additions and 22 deletions

View File

@@ -102,6 +102,9 @@ public:
int m_gdkFunc,
m_gdkDecor;
// size of WM decorations
wxSize m_decorSize;
// private gtk_timeout_add result for mimicing wxUSER_ATTENTION_INFO and
// wxUSER_ATTENTION_ERROR difference, -2 for no hint, -1 for ERROR hint, rest for GtkTimeout handle.
int m_urgency_hint;

View File

@@ -354,6 +354,7 @@ bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title
// need to reset default size after changing m_gdkDecor
gtk_window_set_default_size(GTK_WINDOW(m_widget), m_width, m_height);
m_decorSize.Set(0, 0);
// don't allow sizing smaller than decorations
GdkGeometry geom;

View File

@@ -234,14 +234,17 @@ size_allocate(GtkWidget*, GtkAllocation* alloc, wxTopLevelWindowGTK* win)
{
win->m_oldClientWidth = alloc->width;
win->m_oldClientHeight = alloc->height;
wxSize sizeDecor;
wxSize size(win->m_widget->allocation.width,
win->m_widget->allocation.height);
if (!win->IsFullScreen())
sizeDecor = GetDecorSize(win->m_gdkDecor);
win->m_width = win->m_widget->allocation.width + sizeDecor.x;
win->m_height = win->m_widget->allocation.height + sizeDecor.y;
size += win->m_decorSize;
win->m_width = size.x;
win->m_height = size.y;
if (!win->IsIconized())
{
wxSizeEvent event(win->GetSize(), win->GetId());
wxSizeEvent event(size, win->GetId());
event.SetEventObject(win);
win->GetEventHandler()->ProcessEvent(event);
}
@@ -365,14 +368,14 @@ gtk_frame_map_callback( GtkWidget* widget,
gdk_window_get_frame_extents(widget->window, &rect);
int w, h;
gdk_drawable_get_size(widget->window, &w, &h);
wxSize& decorSize = GetDecorSize(win->m_gdkDecor);
const wxSize size = wxSize(rect.width - w, rect.height - h);
if (decorSize.x != size.x || decorSize.y != size.y)
const wxSize decorSize = wxSize(rect.width - w, rect.height - h);
if (win->m_decorSize != decorSize)
{
// Update window size and frame extents cache
win->m_width = rect.width;
win->m_height = rect.height;
decorSize = size;
win->m_decorSize = decorSize;
GetDecorSize(win->m_gdkDecor) = decorSize;
}
}
@@ -438,17 +441,17 @@ static gboolean property_notify_event(
&type, &format, &nitems, &bytes_after, (guchar**)&data);
if (status == Success && data && nitems == 4)
{
wxSize& decorSize = GetDecorSize(win->m_gdkDecor);
const wxSize size =
const wxSize decorSize =
wxSize(int(data[0] + data[1]), int(data[2] + data[3]));
if (decorSize.x != size.x || decorSize.y != size.y)
if (win->m_decorSize != decorSize)
{
// Update window size and frame extents cache
win->m_width += size.x - decorSize.x;
win->m_height += size.y - decorSize.y;
win->m_width += decorSize.x - win->m_decorSize.x;
win->m_height += decorSize.y - win->m_decorSize.y;
if (win->m_width < 0) win->m_width = 0;
if (win->m_height < 0) win->m_height = 0;
decorSize = size;
win->m_decorSize = decorSize;
GetDecorSize(win->m_gdkDecor) = decorSize;
win->m_oldClientWidth = 0;
gtk_widget_queue_resize(win->m_wxwindow);
}
@@ -671,7 +674,9 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
}
}
// m_gdkDecor needs to be set before calling GTKDoGetSize
m_decorSize = GetDecorSize(m_gdkDecor);
// m_sizeDecor needs to be set before calling GTKDoGetSize
int w, h;
GTKDoGetSize(&w, &h);
gtk_window_set_default_size(GTK_WINDOW(m_widget), w, h);
@@ -853,7 +858,7 @@ void wxTopLevelWindowGTK::GTKDoGetSize(int *width, int *height) const
wxSize size(m_width, m_height);
if (!IsFullScreen())
{
size -= GetDecorSize(m_gdkDecor);
size -= m_decorSize;
if (size.x < 0) size.x = 0;
if (size.y < 0) size.y = 0;
}
@@ -936,24 +941,23 @@ void wxTopLevelWindowGTK::DoSetSizeHints( int minW, int minH,
const wxSize maxSize = GetMaxSize();
GdkGeometry hints;
int hints_mask = 0;
const wxSize sizeDecor = GetDecorSize(m_gdkDecor);
if (minSize.x > 0 || minSize.y > 0)
{
hints_mask |= GDK_HINT_MIN_SIZE;
hints.min_width = minSize.x - sizeDecor.x;
hints.min_width = minSize.x - m_decorSize.x;
if (hints.min_width < 0)
hints.min_width = 0;
hints.min_height = minSize.y - sizeDecor.y;
hints.min_height = minSize.y - m_decorSize.y;
if (hints.min_height < 0)
hints.min_height = 0;
}
if (maxSize.x > 0 || maxSize.y > 0)
{
hints_mask |= GDK_HINT_MAX_SIZE;
hints.max_width = maxSize.x - sizeDecor.x;
hints.max_width = maxSize.x - m_decorSize.x;
if (hints.max_width < 0)
hints.max_width = INT_MAX;
hints.max_height = maxSize.y - sizeDecor.y;
hints.max_height = maxSize.y - m_decorSize.y;
if (hints.max_height < 0)
hints.max_height = INT_MAX;
}