From fdd3ed7a8f5e43d44fffef5c7f857f6256dcc67a Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 5 May 1999 10:25:38 +0000 Subject: [PATCH] Added scrolling of widgets and sample git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2343 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/radiobox.h | 2 +- include/wx/gtk/win_gtk.h | 21 ++++- include/wx/gtk1/radiobox.h | 2 +- include/wx/gtk1/win_gtk.h | 21 ++++- samples/scroll/.cvsignore | 4 + samples/scroll/Makefile | 1 + samples/scroll/Makefile.in | 26 ++++++ samples/scroll/scroll.cpp | 172 +++++++++++++++++++++++++++++++++++++ src/gtk/combobox.cpp | 4 +- src/gtk/frame.cpp | 52 +++++------ src/gtk/mdi.cpp | 10 ++- src/gtk/minifram.cpp | 5 +- src/gtk/radiobox.cpp | 10 +-- src/gtk/win_gtk.c | 115 ++++++++++++++++++++----- src/gtk/window.cpp | 81 +++++++---------- src/gtk1/combobox.cpp | 4 +- src/gtk1/frame.cpp | 52 +++++------ src/gtk1/mdi.cpp | 10 ++- src/gtk1/minifram.cpp | 5 +- src/gtk1/radiobox.cpp | 10 +-- src/gtk1/win_gtk.c | 115 ++++++++++++++++++++----- src/gtk1/window.cpp | 81 +++++++---------- 22 files changed, 579 insertions(+), 224 deletions(-) create mode 100644 samples/scroll/.cvsignore create mode 100644 samples/scroll/Makefile create mode 100644 samples/scroll/Makefile.in create mode 100644 samples/scroll/scroll.cpp diff --git a/include/wx/gtk/radiobox.h b/include/wx/gtk/radiobox.h index 09b518b732..befbee24d6 100644 --- a/include/wx/gtk/radiobox.h +++ b/include/wx/gtk/radiobox.h @@ -48,7 +48,7 @@ class wxRadioBox: public wxControl inline wxRadioBox( wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int n = 0, const wxString choices[] = (const wxString *) NULL, - int majorDim = 0, long style = wxRA_HORIZONTAL, + int majorDim = 1, long style = wxRA_HORIZONTAL, const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr ) { diff --git a/include/wx/gtk/win_gtk.h b/include/wx/gtk/win_gtk.h index 90afdf4b79..d27296eb13 100644 --- a/include/wx/gtk/win_gtk.h +++ b/include/wx/gtk/win_gtk.h @@ -55,6 +55,8 @@ struct _GtkMyFixedChild GtkWidget *widget; gint16 x; gint16 y; + gint16 width; + gint16 height; }; guint gtk_myfixed_get_type (void); @@ -66,11 +68,26 @@ void gtk_myfixed_set_shadow_type (GtkMyFixed *myfixed, void gtk_myfixed_put (GtkMyFixed *myfixed, GtkWidget *widget, gint16 x, - gint16 y); + gint16 y, + gint16 width, + gint16 height); + void gtk_myfixed_move (GtkMyFixed *myfixed, GtkWidget *widget, gint16 x, - gint16 y); + gint16 y ); + +void gtk_myfixed_resize (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 width, + gint16 height ); + +void gtk_myfixed_set_size (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height); #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/include/wx/gtk1/radiobox.h b/include/wx/gtk1/radiobox.h index 09b518b732..befbee24d6 100644 --- a/include/wx/gtk1/radiobox.h +++ b/include/wx/gtk1/radiobox.h @@ -48,7 +48,7 @@ class wxRadioBox: public wxControl inline wxRadioBox( wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, int n = 0, const wxString choices[] = (const wxString *) NULL, - int majorDim = 0, long style = wxRA_HORIZONTAL, + int majorDim = 1, long style = wxRA_HORIZONTAL, const wxValidator& val = wxDefaultValidator, const wxString& name = wxRadioBoxNameStr ) { diff --git a/include/wx/gtk1/win_gtk.h b/include/wx/gtk1/win_gtk.h index 90afdf4b79..d27296eb13 100644 --- a/include/wx/gtk1/win_gtk.h +++ b/include/wx/gtk1/win_gtk.h @@ -55,6 +55,8 @@ struct _GtkMyFixedChild GtkWidget *widget; gint16 x; gint16 y; + gint16 width; + gint16 height; }; guint gtk_myfixed_get_type (void); @@ -66,11 +68,26 @@ void gtk_myfixed_set_shadow_type (GtkMyFixed *myfixed, void gtk_myfixed_put (GtkMyFixed *myfixed, GtkWidget *widget, gint16 x, - gint16 y); + gint16 y, + gint16 width, + gint16 height); + void gtk_myfixed_move (GtkMyFixed *myfixed, GtkWidget *widget, gint16 x, - gint16 y); + gint16 y ); + +void gtk_myfixed_resize (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 width, + gint16 height ); + +void gtk_myfixed_set_size (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height); #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/samples/scroll/.cvsignore b/samples/scroll/.cvsignore new file mode 100644 index 0000000000..b3b290d5a9 --- /dev/null +++ b/samples/scroll/.cvsignore @@ -0,0 +1,4 @@ +Linux +linux-gnu +linux +test.png diff --git a/samples/scroll/Makefile b/samples/scroll/Makefile new file mode 100644 index 0000000000..bccce53f76 --- /dev/null +++ b/samples/scroll/Makefile @@ -0,0 +1 @@ +include ../../setup/general/makeapp diff --git a/samples/scroll/Makefile.in b/samples/scroll/Makefile.in new file mode 100644 index 0000000000..31f2493478 --- /dev/null +++ b/samples/scroll/Makefile.in @@ -0,0 +1,26 @@ +# WXXT base directory +WXBASEDIR=@WXBASEDIR@ + +# set the OS type for compilation +OS=@OS@ +# compile a library only +RULE=bin + +# define library name +BIN_TARGET=scroll +# define library sources +BIN_SRC=\ +scroll.cpp + +#define library objects +BIN_OBJ=\ +scroll.o + +# additional things needed to link +BIN_LINK= + +# additional things needed to compile +ADD_COMPILE= + +# include the definitions now +include ../../../template.mak diff --git a/samples/scroll/scroll.cpp b/samples/scroll/scroll.cpp new file mode 100644 index 0000000000..677baca7c1 --- /dev/null +++ b/samples/scroll/scroll.cpp @@ -0,0 +1,172 @@ +/* + * Program: scroll + * + * Author: Robert Roebling + * + * Copyright: (C) 1998, Robert Roebling + * + */ + +// For compilers that support precompilation, includes "wx/wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ +#pragma hdrstop +#endif + +#ifndef WX_PRECOMP +#include "wx/wx.h" +#endif + +#include "wx/image.h" + +// derived classes + +class MyFrame; +class MyApp; + +// MyCanvas + +class MyCanvas: public wxScrolledWindow +{ +public: + MyCanvas() {}; + MyCanvas( wxWindow *parent, wxWindowID, const wxPoint &pos, const wxSize &size ); + ~MyCanvas(); + void OnPaint( wxPaintEvent &event ); + + DECLARE_DYNAMIC_CLASS(MyCanvas) + DECLARE_EVENT_TABLE() +}; + +// MyFrame + +class MyFrame: public wxFrame +{ +public: + MyFrame(); + + void OnAbout( wxCommandEvent &event ); + void OnQuit( wxCommandEvent &event ); + + MyCanvas *m_canvas; + + DECLARE_DYNAMIC_CLASS(MyFrame) + DECLARE_EVENT_TABLE() +}; + +// MyApp + +class MyApp: public wxApp +{ +public: + virtual bool OnInit(); +}; + +// main program + +IMPLEMENT_APP(MyApp) + +// MyCanvas + +IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxScrolledWindow) + +BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) + EVT_PAINT(MyCanvas::OnPaint) +END_EVENT_TABLE() + +MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, + const wxPoint &pos, const wxSize &size ) + : wxScrolledWindow( parent, id, pos, size, wxSUNKEN_BORDER ) +{ + (void) new wxButton( this, -1, "wxButton", wxPoint(10,10) ); + + (void) new wxTextCtrl( this, -1, "wxTextCtrl", wxPoint(10,50) ); + + (void) new wxCheckBox( this, -1, "Disable", wxPoint(10,90) ); + + wxString choices[] = + { + "This", + "is one of my", + "really", + "wonderful", + "examples." + }; + + (void) new wxComboBox( this, -1, "This", wxPoint(10,130), wxDefaultSize, 5, choices ); + + (void) new wxRadioBox( this, -1, "This", wxPoint(10,200), wxDefaultSize, 5, choices ); +} + +MyCanvas::~MyCanvas() +{ +} + +void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) +{ + wxPaintDC dc( this ); + PrepareDC( dc ); + + dc.DrawText( "Some text", 10, 10 ); + + dc.DrawRectangle( 50, 30, 200, 200 ); +} + +// MyFrame + +const int ID_QUIT = 108; +const int ID_ABOUT = 109; + +IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ) + +BEGIN_EVENT_TABLE(MyFrame,wxFrame) + EVT_MENU (ID_ABOUT, MyFrame::OnAbout) + EVT_MENU (ID_QUIT, MyFrame::OnQuit) +END_EVENT_TABLE() + +MyFrame::MyFrame() + : wxFrame( (wxFrame *)NULL, -1, "wxScrolledWindow sample", + wxPoint(20,20), wxSize(470,360) ) +{ + wxMenu *file_menu = new wxMenu(); + file_menu->Append( ID_ABOUT, "&About.."); + file_menu->Append( ID_QUIT, "E&xit\tAlt-X"); + + wxMenuBar *menu_bar = new wxMenuBar(); + menu_bar->Append(file_menu, "&File"); + + SetMenuBar( menu_bar ); + + CreateStatusBar(2); + int widths[] = { -1, 100 }; + SetStatusWidths( 2, widths ); + + m_canvas = new MyCanvas( this, -1, wxPoint(0,0), wxSize(10,10) ); + m_canvas->SetScrollbars( 10, 10, 50, 100 ); +} + +void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) +{ + Close( TRUE ); +} + +void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) ) +{ + (void)wxMessageBox( "wxScroll demo\n" + "Robert Roebling (c) 1998", + "About wxScroll Demo", wxICON_INFORMATION | wxOK ); +} + +//----------------------------------------------------------------------------- +// MyApp +//----------------------------------------------------------------------------- + +bool MyApp::OnInit() +{ + wxFrame *frame = new MyFrame(); + frame->Show( TRUE ); + + return TRUE; +} + diff --git a/src/gtk/combobox.cpp b/src/gtk/combobox.cpp index 07bbd6e5d5..349ee758d2 100644 --- a/src/gtk/combobox.cpp +++ b/src/gtk/combobox.cpp @@ -110,7 +110,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, if (newSize.x == -1) newSize.x = 100; if (newSize.y == -1) - newSize.y = 22; + newSize.y = 26; SetSize( newSize.x, newSize.y ); GtkWidget *list = GTK_COMBO(m_widget)->list; @@ -583,6 +583,8 @@ void wxComboBox::OnChar( wxKeyEvent &event ) void wxComboBox::OnSize( wxSizeEvent &event ) { wxControl::OnSize( event ); + + return; int w = 21; gtk_widget_set_usize( GTK_COMBO(m_widget)->entry, m_width-w-1, m_height ); diff --git a/src/gtk/frame.cpp b/src/gtk/frame.cpp index 0e181020ff..fdb231157e 100644 --- a/src/gtk/frame.cpp +++ b/src/gtk/frame.cpp @@ -267,7 +267,9 @@ static void wxInsertChildInFrame( wxWindow* parent, wxWindow* child ) gtk_myfixed_put( GTK_MYFIXED(frame->m_mainWidget), GTK_WIDGET(child->m_widget), child->m_x, - child->m_y ); + child->m_y, + child->m_width, + child->m_height ); /* we connect to these events for recalculating the client area space when the toolbar is floating */ @@ -290,13 +292,11 @@ static void wxInsertChildInFrame( wxWindow* parent, wxWindow* child ) gtk_myfixed_put( GTK_MYFIXED(parent->m_wxwindow), GTK_WIDGET(child->m_widget), child->m_x, - child->m_y ); + child->m_y, + child->m_width, + child->m_height ); } - gtk_widget_set_usize( GTK_WIDGET(child->m_widget), - child->m_width, - child->m_height ); - /* resize on OnInternalIdle */ parent->m_sizeSet = FALSE; } @@ -665,13 +665,9 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_frameMenuBar->m_y = yy; m_frameMenuBar->m_width = ww; m_frameMenuBar->m_height = hh; - - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), m_frameMenuBar->m_widget, xx, yy ); - -// m_frameMenuBar->m_widget->requisition.width = ww; -// m_frameMenuBar->m_widget->requisition.height = hh; - gtk_widget_set_usize( m_frameMenuBar->m_widget, ww, hh ); - + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + m_frameMenuBar->m_widget, + xx, yy, ww, hh ); client_area_y_offset += hh; } @@ -693,21 +689,19 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_frameToolBar->m_y = yy; /* m_frameToolBar->m_height = hh; don't change the toolbar's height */ m_frameToolBar->m_width = ww; - - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), m_frameToolBar->m_widget, xx, yy ); - - gtk_widget_set_usize( m_frameToolBar->m_widget, ww, hh ); - + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + m_frameToolBar->m_widget, + xx, yy, ww, hh ); client_area_y_offset += hh; } int client_x = m_miniEdge; int client_y = client_area_y_offset + m_miniEdge + m_miniTitle; - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), m_wxwindow, client_x, client_y ); - int client_w = m_width - 2*m_miniEdge; int client_h = m_height - client_area_y_offset- 2*m_miniEdge - m_miniTitle; - gtk_widget_set_usize( m_wxwindow, client_w, client_h ); + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + m_wxwindow, + client_x, client_y, client_w, client_h ); } else { @@ -721,17 +715,13 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height int yy = m_height - wxSTATUS_HEIGHT - m_miniEdge - client_area_y_offset; int ww = m_width - 2*m_miniEdge; int hh = wxSTATUS_HEIGHT; - m_frameStatusBar->m_x = xx; m_frameStatusBar->m_y = yy; m_frameStatusBar->m_width = ww; m_frameStatusBar->m_height = hh; - - gtk_myfixed_move( GTK_MYFIXED(m_wxwindow), m_frameStatusBar->m_widget, xx, yy ); - -// m_frameStatusBar->m_widget->requisition.width = ww; -// m_frameStatusBar->m_widget->requisition.height = hh; - gtk_widget_set_usize( m_frameStatusBar->m_widget, ww, hh ); + gtk_myfixed_set_size( GTK_MYFIXED(m_wxwindow), + m_frameStatusBar->m_widget, + xx, yy, ww, hh ); } /* we actually set the size of a frame here and no-where else */ @@ -851,7 +841,11 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar ) { m_frameMenuBar->m_parent = this; gtk_myfixed_put( GTK_MYFIXED(m_mainWidget), - m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); + m_frameMenuBar->m_widget, + m_frameMenuBar->m_x, + m_frameMenuBar->m_y, + m_frameMenuBar->m_width, + m_frameMenuBar->m_height ); if (menuBar->m_windowStyle & wxMB_DOCKABLE) { diff --git a/src/gtk/mdi.cpp b/src/gtk/mdi.cpp index 064376b54c..acd1e36abe 100644 --- a/src/gtk/mdi.cpp +++ b/src/gtk/mdi.cpp @@ -96,8 +96,9 @@ void wxMDIParentFrame::GtkOnSize( int x, int y, int width, int height ) menu_bar->m_y = 0; menu_bar->m_width = m_width; menu_bar->m_height = wxMENU_HEIGHT; - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), menu_bar->m_widget, 0, 0 ); - gtk_widget_set_usize( menu_bar->m_widget, m_width, wxMENU_HEIGHT ); + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + menu_bar->m_widget, + 0, 0, m_width, wxMENU_HEIGHT ); } void wxMDIParentFrame::OnInternalIdle() @@ -297,8 +298,9 @@ void wxMDIChildFrame::SetMenuBar( wxMenuBar *menu_bar ) gtk_widget_hide( m_menuBar->m_widget ); /* insert the invisible menu bar into the _parent_ mdi frame */ - gtk_myfixed_put( GTK_MYFIXED(mdi_frame->m_mainWidget), m_menuBar->m_widget, 0, 0 ); - gtk_widget_set_usize( menu_bar->m_widget, mdi_frame->m_width, wxMENU_HEIGHT ); + gtk_myfixed_put( GTK_MYFIXED(mdi_frame->m_mainWidget), + m_menuBar->m_widget, + 0, 0, mdi_frame->m_width, wxMENU_HEIGHT ); } } diff --git a/src/gtk/minifram.cpp b/src/gtk/minifram.cpp index a2659bc997..8e4bbef3eb 100644 --- a/src/gtk/minifram.cpp +++ b/src/gtk/minifram.cpp @@ -289,8 +289,9 @@ bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title { GtkWidget *close_button = gtk_button_new_with_label( "x" ); - gtk_myfixed_put( GTK_MYFIXED(m_mainWidget), close_button, 4, 4 ); - gtk_widget_set_usize( close_button, 12, 11 ); + gtk_myfixed_put( GTK_MYFIXED(m_mainWidget), + close_button, + 4, 4, 12, 11 ); gtk_widget_show( close_button ); diff --git a/src/gtk/radiobox.cpp b/src/gtk/radiobox.cpp index e9ba1e8c5e..bfe45bdf39 100644 --- a/src/gtk/radiobox.cpp +++ b/src/gtk/radiobox.cpp @@ -108,8 +108,9 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, gtk_signal_connect( GTK_OBJECT(m_radio), "clicked", GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this ); - gtk_myfixed_put( GTK_MYFIXED(m_parent->m_wxwindow), GTK_WIDGET(m_radio), m_x+10, m_y+10+(i*24) ); - + gtk_myfixed_put( GTK_MYFIXED(m_parent->m_wxwindow), + GTK_WIDGET(m_radio), + m_x+10, m_y+10+(i*24), 10, 10 ); } wxSize ls = LayoutItems(); @@ -194,7 +195,7 @@ wxSize wxRadioBox::LayoutItems() { GtkWidget *button = GTK_WIDGET( node->Data() ); - gtk_widget_set_usize( button, max_len, 20 ); + gtk_myfixed_resize( GTK_MYFIXED(m_parent->m_wxwindow), button, max_len, 20 ); node = node->Next(); if (!node) break; @@ -230,9 +231,8 @@ wxSize wxRadioBox::LayoutItems() { GtkWidget *button = GTK_WIDGET( node->Data() ); - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), button, m_x+x, m_y+y ); + gtk_myfixed_set_size( GTK_MYFIXED(m_parent->m_wxwindow), button, m_x+x, m_y+y, max, 20 ); x += max; - gtk_widget_set_usize( button, max, 20 ); node = node->Next(); } diff --git a/src/gtk/win_gtk.c b/src/gtk/win_gtk.c index 0477047b3c..cd9ed0177e 100644 --- a/src/gtk/win_gtk.c +++ b/src/gtk/win_gtk.c @@ -202,9 +202,11 @@ gtk_myfixed_set_shadow_type (GtkMyFixed *myfixed, void gtk_myfixed_put (GtkMyFixed *myfixed, - GtkWidget *widget, - gint16 x, - gint16 y) + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height) { GtkMyFixedChild *child_info; @@ -216,6 +218,8 @@ gtk_myfixed_put (GtkMyFixed *myfixed, child_info->widget = widget; child_info->x = x; child_info->y = y; + child_info->width = width; + child_info->height = height; gtk_widget_set_parent (widget, GTK_WIDGET (myfixed)); @@ -232,10 +236,10 @@ gtk_myfixed_put (GtkMyFixed *myfixed, } void -gtk_myfixed_move (GtkMyFixed *myfixed, - GtkWidget *widget, - gint16 x, - gint16 y) +gtk_myfixed_move (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y) { GtkMyFixedChild *child; GList *children; @@ -244,6 +248,63 @@ gtk_myfixed_move (GtkMyFixed *myfixed, g_return_if_fail (GTK_IS_MYFIXED (myfixed)); g_return_if_fail (widget != NULL); + children = myfixed->children; + while (children) + { + child = children->data; + children = children->next; + + if (child->widget == widget) + { + gtk_myfixed_set_size( myfixed, widget, x, y, child->width, child->height ); + break; + } + } +} + +void +gtk_myfixed_resize (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 width, + gint16 height) +{ + GtkMyFixedChild *child; + GList *children; + + g_return_if_fail (myfixed != NULL); + g_return_if_fail (GTK_IS_MYFIXED (myfixed)); + g_return_if_fail (widget != NULL); + + children = myfixed->children; + while (children) + { + child = children->data; + children = children->next; + + if (child->widget == widget) + { + gtk_myfixed_set_size( myfixed, widget, child->x, child->y, width, height ); + break; + } + } +} + +void +gtk_myfixed_set_size (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height) +{ + GtkMyFixedChild *child; + GList *children; + GtkAllocation child_allocation; + + g_return_if_fail (myfixed != NULL); + g_return_if_fail (GTK_IS_MYFIXED (myfixed)); + g_return_if_fail (widget != NULL); + children = myfixed->children; while (children) { @@ -252,13 +313,31 @@ gtk_myfixed_move (GtkMyFixed *myfixed, if (child->widget == widget) { - if ((child->x == x) && (child->y == y)) return; + if ((child->x == x) && + (child->y == y) && + (child->width == width) && + (child->height == height)) return; child->x = x; child->y = y; + child->width = width; + child->height = height; if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (myfixed)) - gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + { + if ((child->width > 1) && (child->height > 1) && (GTK_WIDGET_REALIZED(widget))) + { + child_allocation.x = child->x; + child_allocation.y = child->y; + child_allocation.width = child->width; + child_allocation.height = child->height; + gtk_widget_size_allocate (widget, &child_allocation); + } + else + { + gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + } + } break; } @@ -385,10 +464,6 @@ gtk_myfixed_size_request (GtkWidget *widget, myfixed = GTK_MYFIXED (widget); -/* - requisition->width = 0; - requisition->height = 0; -*/ requisition->width = widget->requisition.width; requisition->height = widget->requisition.height; @@ -407,7 +482,7 @@ gtk_myfixed_size_request (GtkWidget *widget, static void gtk_myfixed_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) + GtkAllocation *allocation) { GtkMyFixed *myfixed; gint border; @@ -457,8 +532,8 @@ gtk_myfixed_size_allocate (GtkWidget *widget, { child_allocation.x = child->x; child_allocation.y = child->y; - child_allocation.width = child->widget->requisition.width; - child_allocation.height = child->widget->requisition.height; + child_allocation.width = child->width; + child_allocation.height = child->height; gtk_widget_size_allocate (child->widget, &child_allocation); } } @@ -466,7 +541,7 @@ gtk_myfixed_size_allocate (GtkWidget *widget, static void gtk_myfixed_paint (GtkWidget *widget, - GdkRectangle *area) + GdkRectangle *area) { g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_MYFIXED (widget)); @@ -480,7 +555,7 @@ gtk_myfixed_paint (GtkWidget *widget, static void gtk_myfixed_draw (GtkWidget *widget, - GdkRectangle *area) + GdkRectangle *area) { GtkMyFixed *myfixed; GtkMyFixedChild *child; @@ -509,7 +584,7 @@ gtk_myfixed_draw (GtkWidget *widget, static gint gtk_myfixed_expose (GtkWidget *widget, - GdkEventExpose *event) + GdkEventExpose *event) { GtkMyFixed *myfixed; GtkMyFixedChild *child; @@ -550,7 +625,7 @@ gtk_myfixed_add (GtkContainer *container, g_return_if_fail (GTK_IS_MYFIXED (container)); g_return_if_fail (widget != NULL); - gtk_myfixed_put (GTK_MYFIXED (container), widget, 0, 0); + gtk_myfixed_put (GTK_MYFIXED (container), widget, 0, 0, 20, 20 ); } static void diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index de14150665..1f40d20ec1 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1444,11 +1444,9 @@ static void wxInsertChildInWindow( wxWindow* parent, wxWindow* child ) gtk_myfixed_put( GTK_MYFIXED(parent->m_wxwindow), GTK_WIDGET(child->m_widget), child->m_x, - child->m_y ); - - gtk_widget_set_usize( child->m_widget, - child->m_width, - child->m_height ); + child->m_y, + child->m_width, + child->m_height ); if (parent->m_windowStyle & wxTAB_TRAVERSAL) { @@ -2037,55 +2035,42 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth; if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; + int border = 0; + if (GTK_WIDGET_HAS_DEFAULT(m_widget)) { /* the default button has a border around it */ - int border = 5; - - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x-border, m_y-border ); - - gtk_widget_set_usize( m_widget, m_width+2*border, m_height+2*border ); + border = 5; } - else - { - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x, m_y ); - if ((old_width != m_width) || (old_height != m_height)) - { - gtk_widget_set_usize( m_widget, m_width, m_height ); + /* this is the result of hours of debugging: the following code + means that if we have a m_wxwindow and we set the size of + m_widget, m_widget (which is a GtkScrolledWindow) does NOT + automatically propagate its size down to its m_wxwindow, + which is its client area. therefore, we have to tell the + client area directly that it has to resize itself. + this will lead to that m_widget (GtkScrolledWindow) will + calculate how much size it needs for scrollbars etc and + it will then call XXX_size_allocate of its child, which + is m_wxwindow. m_wxwindow in turn will do the same with its + children and so on. problems can arise if this happens + before all the children have been realized as some widgets + stupidy need to be realized during XXX_size_allocate (e.g. + GtkNotebook) and they will segv if called otherwise. this + emergency is tested in gtk_myfixed_size_allocate. Normally + this shouldn't be needed and only gtk_widget_queue_resize() + should be enough to provoke a resize at the next appropriate + moment, but this seems to fail, e.g. when a wxNotebook contains + a wxSplitterWindow: the splitter window's children won't + show up properly resized then. */ + + gtk_myfixed_set_size( GTK_MYFIXED(m_parent->m_wxwindow), + m_widget, + m_x-border, + m_y-border, + m_width+2*border, + m_height+2*border ); - /* this is the result of hours of debugging: the following code - means that if we have a m_wxwindow and we set the size of - m_widget, m_widget (which is a GtkScrolledWindow) does NOT - automatically propagate its size down to its m_wxwindow, - which is its client area. therefore, we have to tell the - client area directly that it has to resize itself. - this will lead to that m_widget (GtkScrolledWindow) will - calculate how much size it needs for scrollbars etc and - it will then call XXX_size_allocate of its child, which - is m_wxwindow. m_wxwindow in turn will do the same with its - children and so on. problems can arise if this happens - before all the children have been realized as some widgets - stupidy need to be realized during XXX_size_allocate (e.g. - GtkNotebook) and they will segv if called otherwise. this - emergency is tested in gtk_myfixed_size_allocate. Normally - this shouldn't be needed and only gtk_widget_queue_resize() - should be enough to provoke a resize at the next appropriate - moment, but this seems to fail, e.g. when a wxNotebook contains - a wxSplitterWindow: the splitter window's children won't - show up properly resized then. */ - - if (m_wxwindow) - { - GtkAllocation alloc; - alloc.x = m_x; - alloc.y = m_y; - alloc.width = m_width; - alloc.height = m_height; - gtk_widget_size_allocate( m_widget, &alloc ); - } - } - } } m_sizeSet = TRUE; diff --git a/src/gtk1/combobox.cpp b/src/gtk1/combobox.cpp index 07bbd6e5d5..349ee758d2 100644 --- a/src/gtk1/combobox.cpp +++ b/src/gtk1/combobox.cpp @@ -110,7 +110,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value, if (newSize.x == -1) newSize.x = 100; if (newSize.y == -1) - newSize.y = 22; + newSize.y = 26; SetSize( newSize.x, newSize.y ); GtkWidget *list = GTK_COMBO(m_widget)->list; @@ -583,6 +583,8 @@ void wxComboBox::OnChar( wxKeyEvent &event ) void wxComboBox::OnSize( wxSizeEvent &event ) { wxControl::OnSize( event ); + + return; int w = 21; gtk_widget_set_usize( GTK_COMBO(m_widget)->entry, m_width-w-1, m_height ); diff --git a/src/gtk1/frame.cpp b/src/gtk1/frame.cpp index 0e181020ff..fdb231157e 100644 --- a/src/gtk1/frame.cpp +++ b/src/gtk1/frame.cpp @@ -267,7 +267,9 @@ static void wxInsertChildInFrame( wxWindow* parent, wxWindow* child ) gtk_myfixed_put( GTK_MYFIXED(frame->m_mainWidget), GTK_WIDGET(child->m_widget), child->m_x, - child->m_y ); + child->m_y, + child->m_width, + child->m_height ); /* we connect to these events for recalculating the client area space when the toolbar is floating */ @@ -290,13 +292,11 @@ static void wxInsertChildInFrame( wxWindow* parent, wxWindow* child ) gtk_myfixed_put( GTK_MYFIXED(parent->m_wxwindow), GTK_WIDGET(child->m_widget), child->m_x, - child->m_y ); + child->m_y, + child->m_width, + child->m_height ); } - gtk_widget_set_usize( GTK_WIDGET(child->m_widget), - child->m_width, - child->m_height ); - /* resize on OnInternalIdle */ parent->m_sizeSet = FALSE; } @@ -665,13 +665,9 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_frameMenuBar->m_y = yy; m_frameMenuBar->m_width = ww; m_frameMenuBar->m_height = hh; - - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), m_frameMenuBar->m_widget, xx, yy ); - -// m_frameMenuBar->m_widget->requisition.width = ww; -// m_frameMenuBar->m_widget->requisition.height = hh; - gtk_widget_set_usize( m_frameMenuBar->m_widget, ww, hh ); - + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + m_frameMenuBar->m_widget, + xx, yy, ww, hh ); client_area_y_offset += hh; } @@ -693,21 +689,19 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height m_frameToolBar->m_y = yy; /* m_frameToolBar->m_height = hh; don't change the toolbar's height */ m_frameToolBar->m_width = ww; - - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), m_frameToolBar->m_widget, xx, yy ); - - gtk_widget_set_usize( m_frameToolBar->m_widget, ww, hh ); - + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + m_frameToolBar->m_widget, + xx, yy, ww, hh ); client_area_y_offset += hh; } int client_x = m_miniEdge; int client_y = client_area_y_offset + m_miniEdge + m_miniTitle; - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), m_wxwindow, client_x, client_y ); - int client_w = m_width - 2*m_miniEdge; int client_h = m_height - client_area_y_offset- 2*m_miniEdge - m_miniTitle; - gtk_widget_set_usize( m_wxwindow, client_w, client_h ); + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + m_wxwindow, + client_x, client_y, client_w, client_h ); } else { @@ -721,17 +715,13 @@ void wxFrame::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height int yy = m_height - wxSTATUS_HEIGHT - m_miniEdge - client_area_y_offset; int ww = m_width - 2*m_miniEdge; int hh = wxSTATUS_HEIGHT; - m_frameStatusBar->m_x = xx; m_frameStatusBar->m_y = yy; m_frameStatusBar->m_width = ww; m_frameStatusBar->m_height = hh; - - gtk_myfixed_move( GTK_MYFIXED(m_wxwindow), m_frameStatusBar->m_widget, xx, yy ); - -// m_frameStatusBar->m_widget->requisition.width = ww; -// m_frameStatusBar->m_widget->requisition.height = hh; - gtk_widget_set_usize( m_frameStatusBar->m_widget, ww, hh ); + gtk_myfixed_set_size( GTK_MYFIXED(m_wxwindow), + m_frameStatusBar->m_widget, + xx, yy, ww, hh ); } /* we actually set the size of a frame here and no-where else */ @@ -851,7 +841,11 @@ void wxFrame::SetMenuBar( wxMenuBar *menuBar ) { m_frameMenuBar->m_parent = this; gtk_myfixed_put( GTK_MYFIXED(m_mainWidget), - m_frameMenuBar->m_widget, m_frameMenuBar->m_x, m_frameMenuBar->m_y ); + m_frameMenuBar->m_widget, + m_frameMenuBar->m_x, + m_frameMenuBar->m_y, + m_frameMenuBar->m_width, + m_frameMenuBar->m_height ); if (menuBar->m_windowStyle & wxMB_DOCKABLE) { diff --git a/src/gtk1/mdi.cpp b/src/gtk1/mdi.cpp index 064376b54c..acd1e36abe 100644 --- a/src/gtk1/mdi.cpp +++ b/src/gtk1/mdi.cpp @@ -96,8 +96,9 @@ void wxMDIParentFrame::GtkOnSize( int x, int y, int width, int height ) menu_bar->m_y = 0; menu_bar->m_width = m_width; menu_bar->m_height = wxMENU_HEIGHT; - gtk_myfixed_move( GTK_MYFIXED(m_mainWidget), menu_bar->m_widget, 0, 0 ); - gtk_widget_set_usize( menu_bar->m_widget, m_width, wxMENU_HEIGHT ); + gtk_myfixed_set_size( GTK_MYFIXED(m_mainWidget), + menu_bar->m_widget, + 0, 0, m_width, wxMENU_HEIGHT ); } void wxMDIParentFrame::OnInternalIdle() @@ -297,8 +298,9 @@ void wxMDIChildFrame::SetMenuBar( wxMenuBar *menu_bar ) gtk_widget_hide( m_menuBar->m_widget ); /* insert the invisible menu bar into the _parent_ mdi frame */ - gtk_myfixed_put( GTK_MYFIXED(mdi_frame->m_mainWidget), m_menuBar->m_widget, 0, 0 ); - gtk_widget_set_usize( menu_bar->m_widget, mdi_frame->m_width, wxMENU_HEIGHT ); + gtk_myfixed_put( GTK_MYFIXED(mdi_frame->m_mainWidget), + m_menuBar->m_widget, + 0, 0, mdi_frame->m_width, wxMENU_HEIGHT ); } } diff --git a/src/gtk1/minifram.cpp b/src/gtk1/minifram.cpp index a2659bc997..8e4bbef3eb 100644 --- a/src/gtk1/minifram.cpp +++ b/src/gtk1/minifram.cpp @@ -289,8 +289,9 @@ bool wxMiniFrame::Create( wxWindow *parent, wxWindowID id, const wxString &title { GtkWidget *close_button = gtk_button_new_with_label( "x" ); - gtk_myfixed_put( GTK_MYFIXED(m_mainWidget), close_button, 4, 4 ); - gtk_widget_set_usize( close_button, 12, 11 ); + gtk_myfixed_put( GTK_MYFIXED(m_mainWidget), + close_button, + 4, 4, 12, 11 ); gtk_widget_show( close_button ); diff --git a/src/gtk1/radiobox.cpp b/src/gtk1/radiobox.cpp index e9ba1e8c5e..bfe45bdf39 100644 --- a/src/gtk1/radiobox.cpp +++ b/src/gtk1/radiobox.cpp @@ -108,8 +108,9 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, gtk_signal_connect( GTK_OBJECT(m_radio), "clicked", GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this ); - gtk_myfixed_put( GTK_MYFIXED(m_parent->m_wxwindow), GTK_WIDGET(m_radio), m_x+10, m_y+10+(i*24) ); - + gtk_myfixed_put( GTK_MYFIXED(m_parent->m_wxwindow), + GTK_WIDGET(m_radio), + m_x+10, m_y+10+(i*24), 10, 10 ); } wxSize ls = LayoutItems(); @@ -194,7 +195,7 @@ wxSize wxRadioBox::LayoutItems() { GtkWidget *button = GTK_WIDGET( node->Data() ); - gtk_widget_set_usize( button, max_len, 20 ); + gtk_myfixed_resize( GTK_MYFIXED(m_parent->m_wxwindow), button, max_len, 20 ); node = node->Next(); if (!node) break; @@ -230,9 +231,8 @@ wxSize wxRadioBox::LayoutItems() { GtkWidget *button = GTK_WIDGET( node->Data() ); - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), button, m_x+x, m_y+y ); + gtk_myfixed_set_size( GTK_MYFIXED(m_parent->m_wxwindow), button, m_x+x, m_y+y, max, 20 ); x += max; - gtk_widget_set_usize( button, max, 20 ); node = node->Next(); } diff --git a/src/gtk1/win_gtk.c b/src/gtk1/win_gtk.c index 0477047b3c..cd9ed0177e 100644 --- a/src/gtk1/win_gtk.c +++ b/src/gtk1/win_gtk.c @@ -202,9 +202,11 @@ gtk_myfixed_set_shadow_type (GtkMyFixed *myfixed, void gtk_myfixed_put (GtkMyFixed *myfixed, - GtkWidget *widget, - gint16 x, - gint16 y) + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height) { GtkMyFixedChild *child_info; @@ -216,6 +218,8 @@ gtk_myfixed_put (GtkMyFixed *myfixed, child_info->widget = widget; child_info->x = x; child_info->y = y; + child_info->width = width; + child_info->height = height; gtk_widget_set_parent (widget, GTK_WIDGET (myfixed)); @@ -232,10 +236,10 @@ gtk_myfixed_put (GtkMyFixed *myfixed, } void -gtk_myfixed_move (GtkMyFixed *myfixed, - GtkWidget *widget, - gint16 x, - gint16 y) +gtk_myfixed_move (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y) { GtkMyFixedChild *child; GList *children; @@ -244,6 +248,63 @@ gtk_myfixed_move (GtkMyFixed *myfixed, g_return_if_fail (GTK_IS_MYFIXED (myfixed)); g_return_if_fail (widget != NULL); + children = myfixed->children; + while (children) + { + child = children->data; + children = children->next; + + if (child->widget == widget) + { + gtk_myfixed_set_size( myfixed, widget, x, y, child->width, child->height ); + break; + } + } +} + +void +gtk_myfixed_resize (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 width, + gint16 height) +{ + GtkMyFixedChild *child; + GList *children; + + g_return_if_fail (myfixed != NULL); + g_return_if_fail (GTK_IS_MYFIXED (myfixed)); + g_return_if_fail (widget != NULL); + + children = myfixed->children; + while (children) + { + child = children->data; + children = children->next; + + if (child->widget == widget) + { + gtk_myfixed_set_size( myfixed, widget, child->x, child->y, width, height ); + break; + } + } +} + +void +gtk_myfixed_set_size (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height) +{ + GtkMyFixedChild *child; + GList *children; + GtkAllocation child_allocation; + + g_return_if_fail (myfixed != NULL); + g_return_if_fail (GTK_IS_MYFIXED (myfixed)); + g_return_if_fail (widget != NULL); + children = myfixed->children; while (children) { @@ -252,13 +313,31 @@ gtk_myfixed_move (GtkMyFixed *myfixed, if (child->widget == widget) { - if ((child->x == x) && (child->y == y)) return; + if ((child->x == x) && + (child->y == y) && + (child->width == width) && + (child->height == height)) return; child->x = x; child->y = y; + child->width = width; + child->height = height; if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (myfixed)) - gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + { + if ((child->width > 1) && (child->height > 1) && (GTK_WIDGET_REALIZED(widget))) + { + child_allocation.x = child->x; + child_allocation.y = child->y; + child_allocation.width = child->width; + child_allocation.height = child->height; + gtk_widget_size_allocate (widget, &child_allocation); + } + else + { + gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + } + } break; } @@ -385,10 +464,6 @@ gtk_myfixed_size_request (GtkWidget *widget, myfixed = GTK_MYFIXED (widget); -/* - requisition->width = 0; - requisition->height = 0; -*/ requisition->width = widget->requisition.width; requisition->height = widget->requisition.height; @@ -407,7 +482,7 @@ gtk_myfixed_size_request (GtkWidget *widget, static void gtk_myfixed_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) + GtkAllocation *allocation) { GtkMyFixed *myfixed; gint border; @@ -457,8 +532,8 @@ gtk_myfixed_size_allocate (GtkWidget *widget, { child_allocation.x = child->x; child_allocation.y = child->y; - child_allocation.width = child->widget->requisition.width; - child_allocation.height = child->widget->requisition.height; + child_allocation.width = child->width; + child_allocation.height = child->height; gtk_widget_size_allocate (child->widget, &child_allocation); } } @@ -466,7 +541,7 @@ gtk_myfixed_size_allocate (GtkWidget *widget, static void gtk_myfixed_paint (GtkWidget *widget, - GdkRectangle *area) + GdkRectangle *area) { g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_MYFIXED (widget)); @@ -480,7 +555,7 @@ gtk_myfixed_paint (GtkWidget *widget, static void gtk_myfixed_draw (GtkWidget *widget, - GdkRectangle *area) + GdkRectangle *area) { GtkMyFixed *myfixed; GtkMyFixedChild *child; @@ -509,7 +584,7 @@ gtk_myfixed_draw (GtkWidget *widget, static gint gtk_myfixed_expose (GtkWidget *widget, - GdkEventExpose *event) + GdkEventExpose *event) { GtkMyFixed *myfixed; GtkMyFixedChild *child; @@ -550,7 +625,7 @@ gtk_myfixed_add (GtkContainer *container, g_return_if_fail (GTK_IS_MYFIXED (container)); g_return_if_fail (widget != NULL); - gtk_myfixed_put (GTK_MYFIXED (container), widget, 0, 0); + gtk_myfixed_put (GTK_MYFIXED (container), widget, 0, 0, 20, 20 ); } static void diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index de14150665..1f40d20ec1 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -1444,11 +1444,9 @@ static void wxInsertChildInWindow( wxWindow* parent, wxWindow* child ) gtk_myfixed_put( GTK_MYFIXED(parent->m_wxwindow), GTK_WIDGET(child->m_widget), child->m_x, - child->m_y ); - - gtk_widget_set_usize( child->m_widget, - child->m_width, - child->m_height ); + child->m_y, + child->m_width, + child->m_height ); if (parent->m_windowStyle & wxTAB_TRAVERSAL) { @@ -2037,55 +2035,42 @@ void wxWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags ) if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth; if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight; + int border = 0; + if (GTK_WIDGET_HAS_DEFAULT(m_widget)) { /* the default button has a border around it */ - int border = 5; - - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x-border, m_y-border ); - - gtk_widget_set_usize( m_widget, m_width+2*border, m_height+2*border ); + border = 5; } - else - { - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x, m_y ); - if ((old_width != m_width) || (old_height != m_height)) - { - gtk_widget_set_usize( m_widget, m_width, m_height ); + /* this is the result of hours of debugging: the following code + means that if we have a m_wxwindow and we set the size of + m_widget, m_widget (which is a GtkScrolledWindow) does NOT + automatically propagate its size down to its m_wxwindow, + which is its client area. therefore, we have to tell the + client area directly that it has to resize itself. + this will lead to that m_widget (GtkScrolledWindow) will + calculate how much size it needs for scrollbars etc and + it will then call XXX_size_allocate of its child, which + is m_wxwindow. m_wxwindow in turn will do the same with its + children and so on. problems can arise if this happens + before all the children have been realized as some widgets + stupidy need to be realized during XXX_size_allocate (e.g. + GtkNotebook) and they will segv if called otherwise. this + emergency is tested in gtk_myfixed_size_allocate. Normally + this shouldn't be needed and only gtk_widget_queue_resize() + should be enough to provoke a resize at the next appropriate + moment, but this seems to fail, e.g. when a wxNotebook contains + a wxSplitterWindow: the splitter window's children won't + show up properly resized then. */ + + gtk_myfixed_set_size( GTK_MYFIXED(m_parent->m_wxwindow), + m_widget, + m_x-border, + m_y-border, + m_width+2*border, + m_height+2*border ); - /* this is the result of hours of debugging: the following code - means that if we have a m_wxwindow and we set the size of - m_widget, m_widget (which is a GtkScrolledWindow) does NOT - automatically propagate its size down to its m_wxwindow, - which is its client area. therefore, we have to tell the - client area directly that it has to resize itself. - this will lead to that m_widget (GtkScrolledWindow) will - calculate how much size it needs for scrollbars etc and - it will then call XXX_size_allocate of its child, which - is m_wxwindow. m_wxwindow in turn will do the same with its - children and so on. problems can arise if this happens - before all the children have been realized as some widgets - stupidy need to be realized during XXX_size_allocate (e.g. - GtkNotebook) and they will segv if called otherwise. this - emergency is tested in gtk_myfixed_size_allocate. Normally - this shouldn't be needed and only gtk_widget_queue_resize() - should be enough to provoke a resize at the next appropriate - moment, but this seems to fail, e.g. when a wxNotebook contains - a wxSplitterWindow: the splitter window's children won't - show up properly resized then. */ - - if (m_wxwindow) - { - GtkAllocation alloc; - alloc.x = m_x; - alloc.y = m_y; - alloc.width = m_width; - alloc.height = m_height; - gtk_widget_size_allocate( m_widget, &alloc ); - } - } - } } m_sizeSet = TRUE; -- 2.45.2