X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3bc755fc89fbb7ef10442c6b5216f4c77abf4bd8..c030b70fc6270c2e44a81f83e69fcc91d2b3c768:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 451e4313fd..c376ff0886 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -27,6 +27,7 @@ #include "wx/statusbr.h" #include "wx/intl.h" #include "wx/settings.h" +#include "wx/log.h" #include "gdk/gdkprivate.h" #include "gdk/gdkkeysyms.h" @@ -86,14 +87,14 @@ this is (in most cases) the only GTK widget the class manages. E.g. the wxStatitText class handles only a GtkLabel widget a pointer to which you can find in m_widget (defined in wxWindow) - + When the class has a client area for drawing into and for containing children - it has to handle the client area widget (of the type GtkMyFixed, defined in - win_gtk.c), but there could be any number of widgets, handled by a class - The common rule for all windows is only, that the widget that interacts with - the rest of GTK must be referenced in m_widget and all other widgets must be - children of this widget on the GTK level. The top-most widget, which also - represents the client area, must be in the m_wxwindow field and must be of + it has to handle the client area widget (of the type GtkMyFixed, defined in + win_gtk.c), but there could be any number of widgets, handled by a class + The common rule for all windows is only, that the widget that interacts with + the rest of GTK must be referenced in m_widget and all other widgets must be + children of this widget on the GTK level. The top-most widget, which also + represents the client area, must be in the m_wxwindow field and must be of the type GtkMyFixed. As I said, the window classes that display a GTK native widget only have @@ -109,13 +110,13 @@ */ -//----------------------------------------------------------------------------- -// cond comp -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------- +// conditional compilation +//------------------------------------------------------------------------- #if (GTK_MINOR_VERSION == 1) -#if (GTK_MICRO_VERSION >= 3) -#define NEW_GTK_DND_CODE +#if (GTK_MICRO_VERSION >= 5) +#define NEW_GTK_SCROLL_CODE #endif #endif @@ -126,6 +127,7 @@ extern wxList wxPendingDelete; extern wxList wxTopLevelWindows; extern bool g_blockEventsOnDrag; +extern bool g_blockEventsOnScroll; static bool g_capturing = FALSE; // hack: we need something to pass to gtk_menu_popup, so we store the time of @@ -139,7 +141,6 @@ static guint32 gs_timeLastClick = 0; static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win ) { if (!win->HasVMT()) return; - if (g_blockEventsOnDrag) return; win->m_updateRegion.Union( gdk_event->area.x, gdk_event->area.y, @@ -169,7 +170,6 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp static void gtk_window_draw_callback( GtkWidget *WXUNUSED(widget), GdkRectangle *rect, wxWindow *win ) { if (!win->HasVMT()) return; - if (g_blockEventsOnDrag) return; win->m_updateRegion.Union( rect->x, rect->y, rect->width, rect->height ); @@ -322,6 +322,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE; if (g_blockEventsOnDrag) return TRUE; + if (g_blockEventsOnScroll) return TRUE; if (win->m_wxwindow) { @@ -395,11 +396,12 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton if (!g_capturing) { - wxNode *node = win->GetChildren()->First(); + wxNode *node = win->GetChildren().First(); while (node) { wxWindow *child = (wxWindow*)node->Data(); - if ((child->m_x <= event.m_x) && + if ((child->m_wxwindow == (GtkWidget*) NULL) && + (child->m_x <= event.m_x) && (child->m_y <= event.m_y) && (child->m_x+child->m_width >= event.m_x) && (child->m_y+child->m_height >= event.m_y)) @@ -432,6 +434,7 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE; if (g_blockEventsOnDrag) return TRUE; + if (g_blockEventsOnScroll) return TRUE; if (!win->HasVMT()) return TRUE; @@ -467,11 +470,12 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButto if (!g_capturing) { - wxNode *node = win->GetChildren()->First(); + wxNode *node = win->GetChildren().First(); while (node) { wxWindow *child = (wxWindow*)node->Data(); - if ((child->m_x <= event.m_x) && + if ((child->m_wxwindow == (GtkWidget*) NULL) && + (child->m_x <= event.m_x) && (child->m_y <= event.m_y) && (child->m_x+child->m_width >= event.m_x) && (child->m_y+child->m_height >= event.m_y)) @@ -502,6 +506,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion if (!win->IsOwnGtkWindow( gdk_event->window )) return TRUE; if (g_blockEventsOnDrag) return TRUE; + if (g_blockEventsOnScroll) return TRUE; if (!win->HasVMT()) return TRUE; @@ -510,7 +515,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); -*/ +*/ wxMouseEvent event( wxEVT_MOTION ); event.m_shiftDown = (gdk_event->state & GDK_SHIFT_MASK); @@ -529,11 +534,12 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion if (!g_capturing) { - wxNode *node = win->GetChildren()->First(); + wxNode *node = win->GetChildren().First(); while (node) { wxWindow *child = (wxWindow*)node->Data(); - if ((child->m_x <= event.m_x) && + if ((child->m_wxwindow == (GtkWidget*) NULL) && + (child->m_x <= event.m_x) && (child->m_y <= event.m_y) && (child->m_x+child->m_width >= event.m_x) && (child->m_y+child->m_height >= event.m_y)) @@ -651,7 +657,24 @@ static gint gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_ wxMouseEvent event( wxEVT_ENTER_WINDOW ); event.SetEventObject( win ); - + + int x = 0; + int y = 0; + GdkModifierType state = (GdkModifierType)0; + + gdk_window_get_pointer( widget->window, &x, &y, &state ); + + event.m_shiftDown = (state & GDK_SHIFT_MASK); + event.m_controlDown = (state & GDK_CONTROL_MASK); + event.m_altDown = (state & GDK_MOD1_MASK); + event.m_metaDown = (state & GDK_MOD2_MASK); + event.m_leftDown = (state & GDK_BUTTON1_MASK); + event.m_middleDown = (state & GDK_BUTTON2_MASK); + event.m_rightDown = (state & GDK_BUTTON3_MASK); + + event.m_x = (long)x; + event.m_y = (long)y; + if (win->GetEventHandler()->ProcessEvent( event )) gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" ); @@ -683,6 +706,23 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_ wxMouseEvent event( wxEVT_LEAVE_WINDOW ); event.SetEventObject( win ); + int x = 0; + int y = 0; + GdkModifierType state = (GdkModifierType)0; + + gdk_window_get_pointer( widget->window, &x, &y, &state ); + + event.m_shiftDown = (state & GDK_SHIFT_MASK); + event.m_controlDown = (state & GDK_CONTROL_MASK); + event.m_altDown = (state & GDK_MOD1_MASK); + event.m_metaDown = (state & GDK_MOD2_MASK); + event.m_leftDown = (state & GDK_BUTTON1_MASK); + event.m_middleDown = (state & GDK_BUTTON2_MASK); + event.m_rightDown = (state & GDK_BUTTON3_MASK); + + event.m_x = (long)x; + event.m_y = (long)y; + if (win->GetEventHandler()->ProcessEvent( event )) gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" ); @@ -714,13 +754,20 @@ static void gtk_window_vscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float line_step = win->m_vAdjust->step_increment; float page_step = win->m_vAdjust->page_increment; - if (fabs(win->m_vAdjust->value-win->m_vAdjust->lower) < 0.2) command = wxEVT_SCROLL_BOTTOM; - else if (fabs(win->m_vAdjust->value-win->m_vAdjust->upper) < 0.2) command = wxEVT_SCROLL_TOP; - else if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; - else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; - else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; - else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; - else command = wxEVT_SCROLL_THUMBTRACK; + if (win->m_isScrolling) + { + command = wxEVT_SCROLL_THUMBTRACK; + } + else + { + if (fabs(win->m_vAdjust->value-win->m_vAdjust->lower) < 0.2) command = wxEVT_SCROLL_BOTTOM; + else if (fabs(win->m_vAdjust->value-win->m_vAdjust->upper) < 0.2) command = wxEVT_SCROLL_TOP; + else if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; + else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; + else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; + else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; + else command = wxEVT_SCROLL_THUMBTRACK; + } int value = (int)(win->m_vAdjust->value+0.5); @@ -753,14 +800,21 @@ static void gtk_window_hscroll_callback( GtkWidget *WXUNUSED(widget), wxWindow * float line_step = win->m_hAdjust->step_increment; float page_step = win->m_hAdjust->page_increment; - - if (fabs(win->m_hAdjust->value-win->m_hAdjust->lower) < 0.2) command = wxEVT_SCROLL_BOTTOM; - else if (fabs(win->m_hAdjust->value-win->m_hAdjust->upper) < 0.2) command = wxEVT_SCROLL_TOP; - else if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; - else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; - else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; - else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; - else command = wxEVT_SCROLL_THUMBTRACK; + + if (win->m_isScrolling) + { + command = wxEVT_SCROLL_THUMBTRACK; + } + else + { + if (fabs(win->m_hAdjust->value-win->m_hAdjust->lower) < 0.2) command = wxEVT_SCROLL_BOTTOM; + else if (fabs(win->m_hAdjust->value-win->m_hAdjust->upper) < 0.2) command = wxEVT_SCROLL_TOP; + else if (fabs(diff-line_step) < 0.2) command = wxEVT_SCROLL_LINEDOWN; + else if (fabs(diff+line_step) < 0.2) command = wxEVT_SCROLL_LINEUP; + else if (fabs(diff-page_step) < 0.2) command = wxEVT_SCROLL_PAGEDOWN; + else if (fabs(diff+page_step) < 0.2) command = wxEVT_SCROLL_PAGEUP; + else command = wxEVT_SCROLL_THUMBTRACK; + } int value = (int)(win->m_hAdjust->value+0.5); @@ -823,11 +877,14 @@ static void gtk_window_hscroll_change_callback( GtkWidget *WXUNUSED(widget), wxW // "button_press_event" from scrollbar //----------------------------------------------------------------------------- -static gint gtk_scrollbar_button_press_callback( GtkRange *widget, GdkEventButton *gdk_event, wxWindow *win ) +static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget), + GdkEventButton *WXUNUSED(gdk_event), + wxWindow *win ) { - if (gdk_event->window != widget->slider) return FALSE; +// if (gdk_event->window != widget->slider) return FALSE; win->m_isScrolling = TRUE; + g_blockEventsOnScroll = TRUE; return FALSE; } @@ -836,9 +893,15 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *widget, GdkEventButto // "button_release_event" from scrollbar //----------------------------------------------------------------------------- -static gint gtk_scrollbar_button_release_callback( GtkRange *widget, GdkEventButton *gdk_event, wxWindow *win ) +static gint gtk_scrollbar_button_release_callback( GtkRange *widget, + GdkEventButton *WXUNUSED(gdk_event), + wxWindow *win ) { - if (gdk_event->window != widget->slider) return FALSE; + +// don't test here as we can reelase the mouse while being over +// a different window then the slider +// +// if (gdk_event->window != widget->slider) return FALSE; GtkScrolledWindow *s_window = GTK_SCROLLED_WINDOW(win->m_widget); @@ -848,49 +911,17 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget, GdkEventBut gtk_signal_emit_by_name( GTK_OBJECT(win->m_vAdjust), "value_changed" ); win->m_isScrolling = FALSE; + g_blockEventsOnScroll = FALSE; return FALSE; } - -#ifdef NEW_GTK_DND_CODE - -#else - -//----------------------------------------------------------------------------- -// "drop_data_available_event" -//----------------------------------------------------------------------------- - -static void gtk_window_drop_callback( GtkWidget *widget, GdkEventDropDataAvailable *event, wxWindow *win ) -{ - if (!win->HasVMT()) return; - - if (win->GetDropTarget()) - { - int x = 0; - int y = 0; - gdk_window_get_pointer( widget->window, &x, &y, (GdkModifierType *) NULL ); - - printf( "Drop data is of type %s.\n", event->data_type ); - - win->GetDropTarget()->OnDrop( x, y, (const void*)event->data, (size_t)event->data_numbytes ); - } - -/* - g_free (event->dropdataavailable.data); - g_free (event->dropdataavailable.data_type); -*/ -} - -#endif - // NEW_GTK_DND_CODE - //----------------------------------------------------------------------------- // InsertChild for wxWindow. //----------------------------------------------------------------------------- // Callback for wxWindow. This very strange beast has to be used because -// C++ has no virtual methods in a constructor. We have to emulate a +// C++ has no virtual methods in a constructor. We have to emulate a // virtual function here as wxNotebook requires a different way to insert // a child in it. I had opted for creating a wxNotebookPage window class // which would have made this superflouus (such in the MDI window system), @@ -898,13 +929,13 @@ static void gtk_window_drop_callback( GtkWidget *widget, GdkEventDropDataAvailab static void wxInsertChildInWindow( wxWindow* parent, wxWindow* child ) { - gtk_myfixed_put( GTK_MYFIXED(parent->m_wxwindow), - GTK_WIDGET(child->m_widget), - child->m_x, + gtk_myfixed_put( GTK_MYFIXED(parent->m_wxwindow), + GTK_WIDGET(child->m_widget), + child->m_x, child->m_y ); - gtk_widget_set_usize( GTK_WIDGET(child->m_widget), - child->m_width, + gtk_widget_set_usize( GTK_WIDGET(child->m_widget), + child->m_width, child->m_height ); } @@ -927,7 +958,7 @@ wxWindow::wxWindow() m_wxwindow = (GtkWidget *) NULL; m_parent = (wxWindow *) NULL; m_children.DeleteContents( FALSE ); - + m_x = 0; m_y = 0; m_width = 0; @@ -936,46 +967,46 @@ wxWindow::wxWindow() m_minHeight = -1; m_maxWidth = -1; m_maxHeight = -1; - + m_retCode = 0; - + m_eventHandler = this; m_windowValidator = (wxValidator *) NULL; - + m_windowId = -1; - + m_cursor = (wxCursor *) NULL; m_font = *wxSWISS_FONT; m_windowStyle = 0; m_windowName = "noname"; - + m_constraints = (wxLayoutConstraints *) NULL; m_constraintsInvolvedIn = (wxList *) NULL; m_windowSizer = (wxSizer *) NULL; m_sizerParent = (wxWindow *) NULL; m_autoLayout = FALSE; - + m_sizeSet = FALSE; m_hasVMT = FALSE; m_needParent = TRUE; - + m_hasScrolling = FALSE; m_isScrolling = FALSE; m_hAdjust = (GtkAdjustment*) NULL; m_vAdjust = (GtkAdjustment*) NULL; m_oldHorizontalPos = 0.0; m_oldVerticalPos = 0.0; - + m_isShown = FALSE; m_isEnabled = TRUE; - + m_dropTarget = (wxDropTarget*) NULL; m_resizing = FALSE; m_scrollGC = (GdkGC*) NULL; m_widgetStyle = (GtkStyle*) NULL; - + m_insertCallback = wxInsertChildInWindow; - + m_clientObject = (wxClientData*) NULL; m_clientData = NULL; } @@ -987,7 +1018,7 @@ wxWindow::wxWindow( wxWindow *parent, wxWindowID id, m_insertCallback = wxInsertChildInWindow; Create( parent, id, pos, size, style, name ); } - + bool wxWindow::Create( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) @@ -999,22 +1030,10 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, PreCreation( parent, id, pos, size, style, name ); m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); - m_hasScrolling = TRUE; + GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GtkScrolledWindow *s_window = GTK_SCROLLED_WINDOW(m_widget); - gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_press_event", - (GtkSignalFunc)gtk_scrollbar_button_press_callback, (gpointer) this ); - - gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_press_event", - (GtkSignalFunc)gtk_scrollbar_button_press_callback, (gpointer) this ); - - gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_release_event", - (GtkSignalFunc)gtk_scrollbar_button_release_callback, (gpointer) this ); - - gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_release_event", - (GtkSignalFunc)gtk_scrollbar_button_release_callback, (gpointer) this ); - GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); scroll_class->scrollbar_spacing = 0; @@ -1026,17 +1045,15 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, m_hAdjust = gtk_range_get_adjustment( GTK_RANGE(s_window->hscrollbar) ); m_vAdjust = gtk_range_get_adjustment( GTK_RANGE(s_window->vscrollbar) ); - gtk_signal_connect( GTK_OBJECT(m_hAdjust), "value_changed", - (GtkSignalFunc) gtk_window_hscroll_callback, (gpointer) this ); - gtk_signal_connect( GTK_OBJECT(m_vAdjust), "value_changed", - (GtkSignalFunc) gtk_window_vscroll_callback, (gpointer) this ); - - gtk_signal_connect( GTK_OBJECT(m_hAdjust), "changed", - (GtkSignalFunc) gtk_window_hscroll_change_callback, (gpointer) this ); - gtk_signal_connect(GTK_OBJECT(m_vAdjust), "changed", - (GtkSignalFunc) gtk_window_vscroll_change_callback, (gpointer) this ); + m_wxwindow = gtk_myfixed_new(); +#ifdef NEW_GTK_SCROLL_CODE + gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW(m_widget), m_wxwindow ); + GtkViewport *viewport = GTK_VIEWPORT(s_window->child); +#else + gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow ); GtkViewport *viewport = GTK_VIEWPORT(s_window->viewport); +#endif if (m_windowStyle & wxRAISED_BORDER) { @@ -1051,17 +1068,11 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, gtk_viewport_set_shadow_type( viewport, GTK_SHADOW_NONE ); } - m_wxwindow = gtk_myfixed_new(); - - GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); - if (m_windowStyle & wxTAB_TRAVERSAL == wxTAB_TRAVERSAL) GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); else GTK_WIDGET_SET_FLAGS( m_wxwindow, GTK_CAN_FOCUS ); - gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow ); - // shut the viewport up gtk_viewport_set_hadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) ); gtk_viewport_set_vadjustment( viewport, (GtkAdjustment*) gtk_adjustment_new( 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) ); @@ -1082,14 +1093,44 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, m_hAdjust->page_size = 5.0; gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" ); + // these handlers block mouse events to any window during scrolling + // such as motion events and prevent GTK and wxWindows from fighting + // over where the slider should be + + gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_press_event", + (GtkSignalFunc)gtk_scrollbar_button_press_callback, (gpointer) this ); + + gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_press_event", + (GtkSignalFunc)gtk_scrollbar_button_press_callback, (gpointer) this ); + + gtk_signal_connect( GTK_OBJECT(s_window->vscrollbar), "button_release_event", + (GtkSignalFunc)gtk_scrollbar_button_release_callback, (gpointer) this ); + + gtk_signal_connect( GTK_OBJECT(s_window->hscrollbar), "button_release_event", + (GtkSignalFunc)gtk_scrollbar_button_release_callback, (gpointer) this ); + + // these handers het notified when screen updates are required either when + // scrolling or when the window size (and therefore scrollbar configuration) + // has changed + + gtk_signal_connect( GTK_OBJECT(m_hAdjust), "value_changed", + (GtkSignalFunc) gtk_window_hscroll_callback, (gpointer) this ); + gtk_signal_connect( GTK_OBJECT(m_vAdjust), "value_changed", + (GtkSignalFunc) gtk_window_vscroll_callback, (gpointer) this ); + + gtk_signal_connect( GTK_OBJECT(m_hAdjust), "changed", + (GtkSignalFunc) gtk_window_hscroll_change_callback, (gpointer) this ); + gtk_signal_connect(GTK_OBJECT(m_vAdjust), "changed", + (GtkSignalFunc) gtk_window_vscroll_change_callback, (gpointer) this ); + gtk_widget_show( m_wxwindow ); - + if (m_parent) m_parent->AddChild( this ); (m_parent->m_insertCallback)( m_parent, this ); - + PostCreation(); - + Show( TRUE ); return TRUE; @@ -1107,9 +1148,9 @@ wxWindow::~wxWindow() DestroyChildren(); if (m_widgetStyle) gtk_style_unref( m_widgetStyle ); - + if (m_scrollGC) gdk_gc_unref( m_scrollGC ); - + if (m_wxwindow) gtk_widget_destroy( m_wxwindow ); if (m_widget) gtk_widget_destroy( m_widget ); @@ -1144,7 +1185,7 @@ wxWindow::~wxWindow() wxTopLevelWindows.DeleteObject(this); if (m_windowValidator) delete m_windowValidator; - + if (m_clientObject) delete m_clientObject; } @@ -1152,23 +1193,22 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { - if (m_needParent && (parent == NULL)) - wxFatalError( "Need complete parent.", name ); - + wxASSERT_MSG( (!m_needParent) || (parent), "Need complete parent." ); + m_widget = (GtkWidget*) NULL; m_wxwindow = (GtkWidget*) NULL; m_hasVMT = FALSE; m_parent = parent; m_children.DeleteContents( FALSE ); - + m_width = size.x; if (m_width == -1) m_width = 20; m_height = size.y; if (m_height == -1) m_height = 20; - + m_x = (int)pos.x; m_y = (int)pos.y; - + if (!m_needParent) // some reasonable defaults { if (m_x == -1) @@ -1182,49 +1222,49 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, if (m_y < 10) m_y = 10; } } - + m_minWidth = -1; m_minHeight = -1; m_maxWidth = -1; m_maxHeight = -1; - + m_retCode = 0; - + m_eventHandler = this; - - m_windowId = id; - + + m_windowId = id == -1 ? wxNewId() : id; + m_sizeSet = FALSE; - + m_cursor = new wxCursor( wxCURSOR_ARROW ); m_font = *wxSWISS_FONT; // m_backgroundColour = wxWHITE; // m_foregroundColour = wxBLACK; m_windowStyle = style; m_windowName = name; - + m_constraints = (wxLayoutConstraints *) NULL; m_constraintsInvolvedIn = (wxList *) NULL; m_windowSizer = (wxSizer *) NULL; m_sizerParent = (wxWindow *) NULL; m_autoLayout = FALSE; - + m_hasScrolling = FALSE; m_isScrolling = FALSE; m_hAdjust = (GtkAdjustment *) NULL; m_vAdjust = (GtkAdjustment *) NULL; m_oldHorizontalPos = 0.0; m_oldVerticalPos = 0.0; - + m_isShown = FALSE; m_isEnabled = TRUE; - + m_dropTarget = (wxDropTarget *) NULL; m_resizing = FALSE; m_windowValidator = (wxValidator *) NULL; m_scrollGC = (GdkGC*) NULL; m_widgetStyle = (GtkStyle*) NULL; - + m_clientObject = (wxClientData*)NULL; m_clientData = NULL; } @@ -1305,17 +1345,14 @@ bool wxWindow::Destroy() bool wxWindow::DestroyChildren() { - if (GetChildren()) + wxNode *node; + while ((node = m_children.First()) != (wxNode *)NULL) { - wxNode *node; - while ((node = GetChildren()->First()) != (wxNode *)NULL) + wxWindow *child; + if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) { - wxWindow *child; - if ((child = (wxWindow *)node->Data()) != (wxWindow *)NULL) - { - delete child; - if (GetChildren()->Member(child)) delete node; - } + delete child; + if (m_children.Member(child)) delete node; } } return TRUE; @@ -1336,7 +1373,7 @@ void wxWindow::AdjustForParentClientOrigin( int& x, int& y, int sizeFlags ) if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent()) { wxPoint pt(GetParent()->GetClientAreaOrigin()); - x += pt.x; + x += pt.x; y += pt.y; } } @@ -1345,57 +1382,65 @@ void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); wxASSERT_MSG( (m_parent != NULL), "wxWindow::SetSize requires parent.\n" ); - - // Don't do anything for children of wxNotebook - if (m_parent->m_wxwindow == NULL) return; if (m_resizing) return; // I don't like recursions m_resizing = TRUE; - int old_width = m_width; - int old_height = m_height; - - if ((sizeFlags & wxSIZE_USE_EXISTING) == wxSIZE_USE_EXISTING) - { - if (x != -1) m_x = x; - if (y != -1) m_y = y; - if (width != -1) m_width = width; - if (height != -1) m_height = height; - } - else + if (m_parent->m_wxwindow == NULL) // i.e. wxNotebook { + // don't set the size for children of wxNotebook, just take the values. m_x = x; m_y = y; m_width = width; - m_height = height; + m_height = height; } - - if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) + else { - if (width == -1) m_width = 80; - } + int old_width = m_width; + int old_height = m_height; - if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT) - { - if (height == -1) m_height = 26; + if ((sizeFlags & wxSIZE_USE_EXISTING) == wxSIZE_USE_EXISTING) + { + if (x != -1) m_x = x; + if (y != -1) m_y = y; + if (width != -1) m_width = width; + if (height != -1) m_height = height; + } + else + { + m_x = x; + m_y = y; + m_width = width; + m_height = height; + } + + if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH) + { + if (width == -1) m_width = 80; + } + + if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT) + { + if (height == -1) m_height = 26; + } + + if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; + if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; + if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_minWidth; + if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_minHeight; + + wxPoint pt( m_parent->GetClientAreaOrigin() ); + gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x+pt.x, m_y+pt.y ); + + if ((old_width != m_width) || (old_height != m_height)) + gtk_widget_set_usize( m_widget, m_width, m_height ); } - - if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth; - if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight; - if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_minWidth; - if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_minHeight; - - wxPoint pt( m_parent->GetClientAreaOrigin() ); - gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x+pt.x, m_y+pt.y ); - - if ((old_width != m_width) || (old_height != m_height)) - gtk_widget_set_usize( m_widget, m_width, m_height ); - + m_sizeSet = TRUE; wxSizeEvent event( wxSize(m_width,m_height), GetId() ); event.SetEventObject( this ); - ProcessEvent( event ); + GetEventHandler()->ProcessEvent( event ); m_resizing = FALSE; } @@ -1433,21 +1478,26 @@ void wxWindow::SetClientSize( int width, int height ) if (!m_hasScrolling) { -/* - do we have sunken dialogs ? - GtkStyleClass *window_class = m_wxwindow->style->klass; - dw += 2 * window_class->xthickness; - dh += 2 * window_class->ythickness; -*/ + if ((m_windowStyle & wxRAISED_BORDER) || + (m_windowStyle & wxSUNKEN_BORDER)) + { + dw += 2 * window_class->xthickness; + dh += 2 * window_class->ythickness; + } } else { GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget); GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); +#ifdef NEW_GTK_SCROLL_CODE + GtkWidget *viewport = scroll_window->child; +#else GtkWidget *viewport = scroll_window->viewport; +#endif + GtkStyleClass *viewport_class = viewport->style->klass; GtkWidget *hscrollbar = scroll_window->hscrollbar; @@ -1460,13 +1510,13 @@ void wxWindow::SetClientSize( int width, int height ) dh += 2 * viewport_class->ythickness; } - if (GTK_WIDGET_VISIBLE(vscrollbar)) + if (scroll_window->vscrollbar_visible) { dw += vscrollbar->allocation.width; dw += scroll_class->scrollbar_spacing; } - if (GTK_WIDGET_VISIBLE(hscrollbar)) + if (scroll_window->hscrollbar_visible) { dh += hscrollbar->allocation.height; dw += scroll_class->scrollbar_spacing; @@ -1493,25 +1543,27 @@ void wxWindow::GetClientSize( int *width, int *height ) const if (!m_hasScrolling) { -/* - do we have sunken dialogs ? - GtkStyleClass *window_class = m_wxwindow->style->klass; - dw += 2 * window_class->xthickness; - dh += 2 * window_class->ythickness; -*/ + if ((m_windowStyle & wxRAISED_BORDER) || + (m_windowStyle & wxSUNKEN_BORDER)) + { + dw += 2 * window_class->xthickness; + dh += 2 * window_class->ythickness; + } } else { GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget); GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); +#ifdef NEW_GTK_SCROLL_CODE + GtkWidget *viewport = scroll_window->child; +#else GtkWidget *viewport = scroll_window->viewport; - GtkStyleClass *viewport_class = viewport->style->klass; +#endif - GtkWidget *hscrollbar = scroll_window->hscrollbar; - GtkWidget *vscrollbar = scroll_window->vscrollbar; + GtkStyleClass *viewport_class = viewport->style->klass; if ((m_windowStyle & wxRAISED_BORDER) || (m_windowStyle & wxSUNKEN_BORDER)) @@ -1520,14 +1572,14 @@ void wxWindow::GetClientSize( int *width, int *height ) const dh += 2 * viewport_class->ythickness; } - if (GTK_WIDGET_VISIBLE(vscrollbar)) + if (scroll_window->vscrollbar_visible) { // dw += vscrollbar->allocation.width; dw += 15; // range.slider_width = 11 + 2*2pts edge dw += scroll_class->scrollbar_spacing; } - if (GTK_WIDGET_VISIBLE(hscrollbar)) + if (scroll_window->hscrollbar_visible) { // dh += hscrollbar->allocation.height; dh += 15; @@ -1574,7 +1626,7 @@ void wxWindow::ClientToScreen( int *x, int *y ) wxPoint pt(GetClientAreaOrigin()); org_x += pt.x; org_y += pt.y; - + if (x) *x += org_x; if (y) *y += org_y; } @@ -1605,7 +1657,7 @@ void wxWindow::ScreenToClient( int *x, int *y ) wxPoint pt(GetClientAreaOrigin()); org_x -= pt.x; org_y -= pt.y; - + if (x) *x -= org_x; if (y) *y -= org_y; } @@ -1616,7 +1668,7 @@ void wxWindow::Centre( int direction ) int x = m_x; int y = m_y; - + if (m_parent) { int p_w = 0; @@ -1630,7 +1682,7 @@ void wxWindow::Centre( int direction ) if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (gdk_screen_width () - m_width) / 2; if (direction & wxVERTICAL == wxVERTICAL) y = (gdk_screen_height () - m_height) / 2; } - + Move( x, y ); } @@ -1640,7 +1692,7 @@ void wxWindow::Fit() int maxX = 0; int maxY = 0; - wxNode *node = GetChildren()->First(); + wxNode *node = m_children.First(); while ( node ) { wxWindow *win = (wxWindow *)node->Data(); @@ -1669,7 +1721,7 @@ void wxWindow::SetSizeHints( int minW, int minH, int maxW, int maxH, int WXUNUSE void wxWindow::OnSize( wxSizeEvent &WXUNUSED(event) ) { - //if (GetAutoLayout()) Layout(); +// if (GetAutoLayout()) Layout(); } bool wxWindow::Show( bool show ) @@ -1709,38 +1761,38 @@ int wxWindow::GetCharHeight() const int wxWindow::GetCharWidth() const { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - if (!m_font.Ok()) - { - wxFAIL_MSG( "invalid font" ); - return -1; - } + if (!m_font.Ok()) + { + wxFAIL_MSG( "invalid font" ); + return -1; + } - GdkFont *font = m_font.GetInternalFont( 1.0 ); - return gdk_string_width( font, "H" ); + GdkFont *font = m_font.GetInternalFont( 1.0 ); + return gdk_string_width( font, "H" ); } void wxWindow::GetTextExtent( const wxString& string, int *x, int *y, int *descent, int *externalLeading, const wxFont *theFont, bool WXUNUSED(use16) ) const { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - wxFont fontToUse = m_font; - if (theFont) fontToUse = *theFont; + wxFont fontToUse = m_font; + if (theFont) fontToUse = *theFont; - if (!fontToUse.Ok()) - { - wxFAIL_MSG( "invalid font" ); - return; - } - wxASSERT_MSG( (m_font.Ok()), "invalid font" ); + if (!fontToUse.Ok()) + { + wxFAIL_MSG( "invalid font" ); + return; + } + wxASSERT_MSG( (m_font.Ok()), "invalid font" ); - GdkFont *font = fontToUse.GetInternalFont( 1.0 ); - if (x) (*x) = gdk_string_width( font, string ); - if (y) (*y) = font->ascent + font->descent; - if (descent) (*descent) = font->descent; - if (externalLeading) (*externalLeading) = 0; // ?? + GdkFont *font = fontToUse.GetInternalFont( 1.0 ); + if (x) (*x) = gdk_string_width( font, string ); + if (y) (*y) = font->ascent + font->descent; + if (descent) (*descent) = font->descent; + if (externalLeading) (*externalLeading) = 0; // ?? } void wxWindow::MakeModal( bool modal ) @@ -1763,105 +1815,117 @@ void wxWindow::MakeModal( bool modal ) void wxWindow::SetFocus() { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - GtkWidget *connect_widget = GetConnectWidget(); - if (connect_widget) - { - if (GTK_WIDGET_CAN_FOCUS(connect_widget) && !GTK_WIDGET_HAS_FOCUS (connect_widget) ) + GtkWidget *connect_widget = GetConnectWidget(); + if (connect_widget) { - gtk_widget_grab_focus (connect_widget); + if (GTK_WIDGET_CAN_FOCUS(connect_widget) && !GTK_WIDGET_HAS_FOCUS (connect_widget) ) + { + gtk_widget_grab_focus (connect_widget); + } } - } } bool wxWindow::OnClose() { - return TRUE; + return TRUE; } void wxWindow::AddChild( wxWindow *child ) { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - wxASSERT_MSG( (child != NULL), "invalid child" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (child != NULL), "invalid child" ); - m_children.Append( child ); + m_children.Append( child ); } -wxList *wxWindow::GetChildren() +wxWindow *wxWindow::ReParent( wxWindow *newParent ) { - return (&m_children); + wxWindow *oldParent = GetParent(); + + if (oldParent) oldParent->RemoveChild( this ); + + gtk_widget_unparent( m_widget ); + + if (newParent) + { + newParent->AddChild( this ); + (newParent->m_insertCallback)( newParent, this ); + } + + return oldParent; } void wxWindow::RemoveChild( wxWindow *child ) { - if (GetChildren()) GetChildren()->DeleteObject( child ); - child->m_parent = (wxWindow *) NULL; + m_children.DeleteObject( child ); + child->m_parent = (wxWindow *) NULL; } void wxWindow::SetReturnCode( int retCode ) { - m_retCode = retCode; + m_retCode = retCode; } int wxWindow::GetReturnCode() { - return m_retCode; + return m_retCode; } void wxWindow::Raise() { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - if (m_widget) gdk_window_raise( m_widget->window ); + if (m_widget) gdk_window_raise( m_widget->window ); } void wxWindow::Lower() { - wxASSERT_MSG( (m_widget != NULL), "invalid window" ); + wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - if (m_widget) gdk_window_lower( m_widget->window ); + if (m_widget) gdk_window_lower( m_widget->window ); } -wxEvtHandler *wxWindow::GetEventHandler() +wxEvtHandler *wxWindow::GetEventHandler() const { - return m_eventHandler; + return m_eventHandler; } void wxWindow::SetEventHandler( wxEvtHandler *handler ) { - m_eventHandler = handler; + m_eventHandler = handler; } void wxWindow::PushEventHandler(wxEvtHandler *handler) { - handler->SetNextHandler(GetEventHandler()); - SetEventHandler(handler); + handler->SetNextHandler(GetEventHandler()); + SetEventHandler(handler); } wxEvtHandler *wxWindow::PopEventHandler(bool deleteHandler) { - if (GetEventHandler()) - { - wxEvtHandler *handlerA = GetEventHandler(); - wxEvtHandler *handlerB = handlerA->GetNextHandler(); - handlerA->SetNextHandler((wxEvtHandler *) NULL); - SetEventHandler(handlerB); - if (deleteHandler) + if (GetEventHandler()) { - delete handlerA; - return (wxEvtHandler*) NULL; - } - else - return handlerA; - } - else - return (wxEvtHandler *) NULL; + wxEvtHandler *handlerA = GetEventHandler(); + wxEvtHandler *handlerB = handlerA->GetNextHandler(); + handlerA->SetNextHandler((wxEvtHandler *) NULL); + SetEventHandler(handlerB); + if (deleteHandler) + { + delete handlerA; + return (wxEvtHandler*) NULL; + } + else + return handlerA; + } + else + return (wxEvtHandler *) NULL; } wxValidator *wxWindow::GetValidator() { - return m_windowValidator; + return m_windowValidator; } void wxWindow::SetValidator( const wxValidator& validator ) @@ -1902,7 +1966,7 @@ void wxWindow::SetId( wxWindowID id ) m_windowId = id; } -wxWindowID wxWindow::GetId() +wxWindowID wxWindow::GetId() const { return m_windowId; } @@ -1919,7 +1983,8 @@ void wxWindow::SetCursor( const wxCursor &cursor ) if (cursor.Ok()) { - if (*((wxCursor*)&cursor) == m_cursor) return; + if ( cursor == *m_cursor ) + return; *m_cursor = cursor; } else @@ -2022,13 +2087,13 @@ void wxWindow::SetBackgroundColour( const wxColour &colour ) wxCHECK_RET( m_widget != NULL, "invalid window" ); if (m_backgroundColour == colour) return; - + if (!m_backgroundColour.Ok()) if (wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ) == colour) return; - + m_backgroundColour = colour; if (!m_backgroundColour.Ok()) return; - + if (m_wxwindow) { GdkWindow *window = m_wxwindow->window; @@ -2036,7 +2101,7 @@ void wxWindow::SetBackgroundColour( const wxColour &colour ) gdk_window_set_background( window, m_backgroundColour.GetColor() ); gdk_window_clear( window ); } - + ApplyWidgetStyle(); } @@ -2050,31 +2115,31 @@ void wxWindow::SetForegroundColour( const wxColour &colour ) wxCHECK_RET( m_widget != NULL, "invalid window" ); if (m_foregroundColour == colour) return; - + m_foregroundColour = colour; if (!m_foregroundColour.Ok()) return; - + ApplyWidgetStyle(); } GtkStyle *wxWindow::GetWidgetStyle() { if (m_widgetStyle) gtk_style_unref( m_widgetStyle ); - - m_widgetStyle = - gtk_style_copy( + + m_widgetStyle = + gtk_style_copy( gtk_widget_get_style( m_widget ) ); - + return m_widgetStyle; } void wxWindow::SetWidgetStyle() { GtkStyle *style = GetWidgetStyle(); - + gdk_font_unref( style->font ); style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) ); - + if (m_foregroundColour.Ok()) { m_foregroundColour.CalcPixel( gdk_window_get_colormap( m_widget->window ) ); @@ -2082,7 +2147,7 @@ void wxWindow::SetWidgetStyle() style->fg[GTK_STATE_PRELIGHT] = *m_foregroundColour.GetColor(); style->fg[GTK_STATE_ACTIVE] = *m_foregroundColour.GetColor(); } - + if (m_backgroundColour.Ok()) { m_backgroundColour.CalcPixel( gdk_window_get_colormap( m_widget->window ) ); @@ -2105,7 +2170,7 @@ bool wxWindow::Validate() { wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" ); - wxNode *node = GetChildren()->First(); + wxNode *node = m_children.First(); while (node) { wxWindow *child = (wxWindow *)node->Data(); @@ -2120,7 +2185,7 @@ bool wxWindow::TransferDataToWindow() { wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" ); - wxNode *node = GetChildren()->First(); + wxNode *node = m_children.First(); while (node) { wxWindow *child = (wxWindow *)node->Data(); @@ -2139,7 +2204,7 @@ bool wxWindow::TransferDataFromWindow() { wxASSERT_MSG( (m_widget != NULL), "invalid window" ); - wxNode *node = GetChildren()->First(); + wxNode *node = m_children.First(); while (node) { wxWindow *child = (wxWindow *)node->Data(); @@ -2187,7 +2252,7 @@ bool wxWindow::PopupMenu( wxMenu *menu, int WXUNUSED(x), int WXUNUSED(y) ) wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" ); wxCHECK_MSG( menu != NULL, FALSE, "invalid popup-menu" ); - + SetInvokingWindow( menu, this ); gtk_menu_popup( GTK_MENU(menu->m_menu), @@ -2207,12 +2272,12 @@ void wxWindow::SetDropTarget( wxDropTarget *dropTarget ) GtkWidget *dnd_widget = GetConnectWidget(); - DisconnectDnDWidget( dnd_widget ); + if (m_dropTarget) m_dropTarget->UnregisterWidget( dnd_widget ); if (m_dropTarget) delete m_dropTarget; m_dropTarget = dropTarget; - ConnectDnDWidget( dnd_widget ); + if (m_dropTarget) m_dropTarget->RegisterWidget( dnd_widget ); } wxDropTarget *wxWindow::GetDropTarget() const @@ -2220,40 +2285,6 @@ wxDropTarget *wxWindow::GetDropTarget() const return m_dropTarget; } -void wxWindow::ConnectDnDWidget( GtkWidget *widget ) -{ - if (!m_dropTarget) return; - - m_dropTarget->RegisterWidget( widget ); - -#ifdef NEW_GTK_DND_CODE - -#else - - gtk_signal_connect( GTK_OBJECT(widget), "drop_data_available_event", - GTK_SIGNAL_FUNC(gtk_window_drop_callback), (gpointer)this ); - -#endif - -} - -void wxWindow::DisconnectDnDWidget( GtkWidget *widget ) -{ - if (!m_dropTarget) return; - -#ifdef NEW_GTK_DND_CODE - -#else - - gtk_signal_disconnect_by_func( GTK_OBJECT(widget), - GTK_SIGNAL_FUNC(gtk_window_drop_callback), (gpointer)this ); - - m_dropTarget->UnregisterWidget( widget ); - -#endif - -} - GtkWidget* wxWindow::GetConnectWidget() { GtkWidget *connect_widget = m_widget; @@ -2276,13 +2307,8 @@ void wxWindow::SetFont( const wxFont &font ) m_font = font; else m_font = *wxSWISS_FONT; - - ApplyWidgetStyle(); -} -wxFont *wxWindow::GetFont() -{ - return &m_font; + ApplyWidgetStyle(); } void wxWindow::SetWindowStyleFlag( long flag ) @@ -2395,6 +2421,8 @@ void wxWindow::SetScrollbar( int orient, int pos, int thumbVisible, if (!m_wxwindow) return; + m_hasScrolling = TRUE; + if (orient == wxHORIZONTAL) { float fpos = (float)pos; @@ -2556,13 +2584,13 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) int d_y = 0; if (dx > 0) d_x = dx; if (dy > 0) d_y = dy; - + if (!m_scrollGC) { m_scrollGC = gdk_gc_new( m_wxwindow->window ); gdk_gc_set_exposures( m_scrollGC, TRUE ); } - + gdk_window_copy_area( m_wxwindow->window, m_scrollGC, d_x, d_y, m_wxwindow->window, s_x, s_y, w, h ); @@ -2795,7 +2823,7 @@ bool wxWindow::DoPhase(int phase) { noChanges = 0; noFailures = 0; - wxNode *node = GetChildren()->First(); + wxNode *node = m_children.First(); while (node) { wxWindow *child = (wxWindow *)node->Data(); @@ -2840,7 +2868,7 @@ void wxWindow::ResetConstraints() constr->centreX.SetDone(FALSE); constr->centreY.SetDone(FALSE); } - wxNode *node = GetChildren()->First(); + wxNode *node = m_children.First(); while (node) { wxWindow *win = (wxWindow *)node->Data(); @@ -2882,24 +2910,22 @@ void wxWindow::SetConstraintSizes(bool recurse) wxString winName; if (GetName() == "") - winName = _("unnamed"); + winName = "unnamed"; else winName = GetName(); - wxDebugMsg(_("Constraint(s) not satisfied for window of type %s, name %s:\n"), (const char *)windowClass, (const char *)winName); - if (!constr->left.GetDone()) - wxDebugMsg(_(" unsatisfied 'left' constraint.\n")); - if (!constr->right.GetDone()) - wxDebugMsg(_(" unsatisfied 'right' constraint.\n")); - if (!constr->width.GetDone()) - wxDebugMsg(_(" unsatisfied 'width' constraint.\n")); - if (!constr->height.GetDone()) - wxDebugMsg(_(" unsatisfied 'height' constraint.\n")); - wxDebugMsg(_("Please check constraints: try adding AsIs() constraints.\n")); + wxLogDebug( "Constraint(s) not satisfied for window of type %s, name %s:\n", + (const char *)windowClass, + (const char *)winName); + if (!constr->left.GetDone()) wxLogDebug( " unsatisfied 'left' constraint.\n" ); + if (!constr->right.GetDone()) wxLogDebug( " unsatisfied 'right' constraint.\n" ); + if (!constr->width.GetDone()) wxLogDebug( " unsatisfied 'width' constraint.\n" ); + if (!constr->height.GetDone()) wxLogDebug( " unsatisfied 'height' constraint.\n" ); + wxLogDebug( "Please check constraints: try adding AsIs() constraints.\n" ); } if (recurse) { - wxNode *node = GetChildren()->First(); + wxNode *node = m_children.First(); while (node) { wxWindow *win = (wxWindow *)node->Data();