X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3db7be803691c60b11a583d5be24b9a8a55aa2b3..c030b70fc6270c2e44a81f83e69fcc91d2b3c768:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 8a6093a34f..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 @@ -140,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, @@ -170,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 ); @@ -397,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)) @@ -470,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)) @@ -506,7 +507,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion if (g_blockEventsOnDrag) return TRUE; if (g_blockEventsOnScroll) return TRUE; - + if (!win->HasVMT()) return TRUE; /* @@ -514,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); @@ -533,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)) @@ -655,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" ); @@ -687,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" ); @@ -764,7 +800,7 @@ 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 (win->m_isScrolling) { command = wxEVT_SCROLL_THUMBTRACK; @@ -841,12 +877,12 @@ static void gtk_window_hscroll_change_callback( GtkWidget *WXUNUSED(widget), wxW // "button_press_event" from scrollbar //----------------------------------------------------------------------------- -static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget), - GdkEventButton *WXUNUSED(gdk_event), +static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget), + GdkEventButton *WXUNUSED(gdk_event), wxWindow *win ) { // if (gdk_event->window != widget->slider) return FALSE; - + win->m_isScrolling = TRUE; g_blockEventsOnScroll = TRUE; @@ -857,8 +893,8 @@ static gint gtk_scrollbar_button_press_callback( GtkRange *WXUNUSED(widget), // "button_release_event" from scrollbar //----------------------------------------------------------------------------- -static gint gtk_scrollbar_button_release_callback( GtkRange *widget, - GdkEventButton *WXUNUSED(gdk_event), +static gint gtk_scrollbar_button_release_callback( GtkRange *widget, + GdkEventButton *WXUNUSED(gdk_event), wxWindow *win ) { @@ -885,7 +921,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget, //----------------------------------------------------------------------------- // 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), @@ -893,13 +929,13 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget, 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 ); } @@ -922,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; @@ -931,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; } @@ -982,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 ) @@ -1060,7 +1096,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, // 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 ); @@ -1072,7 +1108,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, 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 @@ -1088,13 +1124,13 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, (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; @@ -1112,13 +1148,13 @@ 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 ); - + if (m_cursor) delete m_cursor; DeleteRelatedConstraints(); @@ -1149,7 +1185,7 @@ wxWindow::~wxWindow() wxTopLevelWindows.DeleteObject(this); if (m_windowValidator) delete m_windowValidator; - + if (m_clientObject) delete m_clientObject; } @@ -1157,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) @@ -1187,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; } @@ -1310,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; @@ -1341,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; } } @@ -1350,7 +1382,7 @@ 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" ); - + if (m_resizing) return; // I don't like recursions m_resizing = TRUE; @@ -1366,7 +1398,7 @@ void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) { int old_width = m_width; int old_height = m_height; - + if ((sizeFlags & wxSIZE_USE_EXISTING) == wxSIZE_USE_EXISTING) { if (x != -1) m_x = x; @@ -1391,7 +1423,7 @@ void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) { 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; @@ -1399,11 +1431,11 @@ void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags ) 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() ); @@ -1446,14 +1478,14 @@ 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 { @@ -1462,7 +1494,7 @@ void wxWindow::SetClientSize( int width, int height ) #ifdef NEW_GTK_SCROLL_CODE GtkWidget *viewport = scroll_window->child; -#else +#else GtkWidget *viewport = scroll_window->viewport; #endif @@ -1511,14 +1543,14 @@ 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 { @@ -1527,15 +1559,12 @@ void wxWindow::GetClientSize( int *width, int *height ) const #ifdef NEW_GTK_SCROLL_CODE GtkWidget *viewport = scroll_window->child; -#else +#else GtkWidget *viewport = scroll_window->viewport; #endif GtkStyleClass *viewport_class = viewport->style->klass; - GtkWidget *hscrollbar = scroll_window->hscrollbar; - GtkWidget *vscrollbar = scroll_window->vscrollbar; - if ((m_windowStyle & wxRAISED_BORDER) || (m_windowStyle & wxSUNKEN_BORDER)) { @@ -1597,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; } @@ -1628,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; } @@ -1639,7 +1668,7 @@ void wxWindow::Centre( int direction ) int x = m_x; int y = m_y; - + if (m_parent) { int p_w = 0; @@ -1653,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 ); } @@ -1663,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(); @@ -1692,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 ) @@ -1732,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 ) @@ -1786,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 ) @@ -1925,7 +1966,7 @@ void wxWindow::SetId( wxWindowID id ) m_windowId = id; } -wxWindowID wxWindow::GetId() +wxWindowID wxWindow::GetId() const { return m_windowId; } @@ -1942,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 @@ -2045,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; @@ -2059,7 +2101,7 @@ void wxWindow::SetBackgroundColour( const wxColour &colour ) gdk_window_set_background( window, m_backgroundColour.GetColor() ); gdk_window_clear( window ); } - + ApplyWidgetStyle(); } @@ -2073,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 ) ); @@ -2105,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 ) ); @@ -2128,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(); @@ -2143,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(); @@ -2162,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(); @@ -2210,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), @@ -2265,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 ) @@ -2383,7 +2420,7 @@ void wxWindow::SetScrollbar( int orient, int pos, int thumbVisible, wxASSERT_MSG( (m_wxwindow != NULL), "window needs client area" ); if (!m_wxwindow) return; - + m_hasScrolling = TRUE; if (orient == wxHORIZONTAL) @@ -2547,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 ); @@ -2786,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(); @@ -2831,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(); @@ -2873,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();