X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/46dc76ba3573649a9ed7c7aff6dc677f533eee11..44a6c8e61808e6197bc78e2344c2e93853943350:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 9e1c673e78..d65fec1d09 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -26,6 +26,8 @@ #include "wx/dnd.h" #include "wx/mdi.h" #include "wx/notebook.h" +#include "wx/statusbr.h" +//#include "wx/treectrl.h" #include "gdk/gdkkeysyms.h" #include #include "wx/gtk/win_gtk.h" @@ -52,7 +54,9 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd if (g_blockEventsOnDrag) return; /* - printf( "OnExpose from " ); + if (IS_KIND_OF(win,wxTreeCtrl)) + { + printf( "OnExpose from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) printf( win->GetClassInfo()->GetClassName() ); printf( ".\n" ); @@ -61,6 +65,7 @@ void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gd printf( "y: %d \n", gdk_event->area.y ); printf( "w: %d \n", gdk_event->area.width ); printf( "h: %d \n", gdk_event->area.height ); +} */ win->m_updateRegion.Union( gdk_event->area.x, @@ -251,7 +256,12 @@ gint gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget), GdkEventKey *gd event.m_x = 0; event.m_y = 0; event.SetEventObject( win ); - return win->ProcessEvent( event ); + + bool ret = win->ProcessEvent( event ); +/* + if (ret) printf( "found.\n") ; +*/ + return ret; }; //----------------------------------------------------------------------------- @@ -259,8 +269,8 @@ gint gtk_window_key_press_callback( GtkWidget *WXUNUSED(widget), GdkEventKey *gd gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxWindow *win ) { - if (widget->window != gdk_event->window) return FALSE; - if (g_blockEventsOnDrag) return FALSE; + if (widget->window != gdk_event->window) return TRUE; + if (g_blockEventsOnDrag) return TRUE; if (win->m_wxwindow) { @@ -278,7 +288,7 @@ gint gtk_window_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_ev }; }; - if (!win->HasVMT()) return FALSE; + if (!win->HasVMT()) return TRUE; /* printf( "OnButtonPress from " ); @@ -342,9 +352,9 @@ gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_ { if (widget->window != gdk_event->window) return TRUE; - if (g_blockEventsOnDrag) return FALSE; + if (g_blockEventsOnDrag) return TRUE; - if (!win->HasVMT()) return FALSE; + if (!win->HasVMT()) return TRUE; /* printf( "OnButtonRelease from " ); @@ -374,7 +384,9 @@ gint gtk_window_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_ event.m_y = (long)gdk_event->y; event.SetEventObject( win ); - return win->ProcessEvent( event ); + win->ProcessEvent( event ); + + return TRUE; }; //----------------------------------------------------------------------------- @@ -384,9 +396,9 @@ gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_e { if (widget->window != gdk_event->window) return TRUE; - if (g_blockEventsOnDrag) return FALSE; + if (g_blockEventsOnDrag) return TRUE; - if (!win->HasVMT()) return FALSE; + if (!win->HasVMT()) return TRUE; /* printf( "OnMotion from " ); @@ -410,7 +422,7 @@ gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_e win->ProcessEvent( event ); - return FALSE; + return TRUE; }; //----------------------------------------------------------------------------- @@ -418,7 +430,7 @@ gint gtk_window_motion_notify_callback( GtkWidget *widget, GdkEventMotion *gdk_e gint gtk_window_focus_in_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxWindow *win ) { - if (g_blockEventsOnDrag) return FALSE; + if (g_blockEventsOnDrag) return TRUE; if (win->m_wxwindow) { if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow)) @@ -433,7 +445,7 @@ gint gtk_window_focus_in_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUS }; }; - if (!win->HasVMT()) return FALSE; + if (!win->HasVMT()) return TRUE; /* printf( "OnSetFocus from " ); @@ -446,7 +458,9 @@ gint gtk_window_focus_in_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUS wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); event.SetEventObject( win ); - return win->ProcessEvent( event ); + win->ProcessEvent( event ); + + return TRUE; }; //----------------------------------------------------------------------------- @@ -454,14 +468,14 @@ gint gtk_window_focus_in_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUS gint gtk_window_focus_out_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxWindow *win ) { - if (g_blockEventsOnDrag) return FALSE; + if (g_blockEventsOnDrag) return TRUE; if (win->m_wxwindow) { if (GTK_WIDGET_CAN_FOCUS(win->m_wxwindow)) GTK_WIDGET_UNSET_FLAGS (win->m_wxwindow, GTK_HAS_FOCUS); }; - if (!win->HasVMT()) return FALSE; + if (!win->HasVMT()) return TRUE; /* printf( "OnKillFocus from " ); @@ -472,7 +486,9 @@ gint gtk_window_focus_out_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNU wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); event.SetEventObject( win ); - return win->ProcessEvent( event ); + win->ProcessEvent( event ); + + return TRUE; }; //----------------------------------------------------------------------------- @@ -616,8 +632,8 @@ void gtk_window_hscroll_change_callback( GtkWidget *WXUNUSED(widget), wxWindow * void gtk_window_drop_callback( GtkWidget *widget, GdkEvent *event, wxWindow *win ) { - printf( "OnDrop.\n" ); - + if (!win->HasVMT()) return; + if (win->GetDropTarget()) { int x = 0; @@ -653,8 +669,8 @@ bool gtk_window_destroy_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSE bool gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win ) { if (widget->window != gdk_event->window) return TRUE; - - if (g_blockEventsOnDrag) return FALSE; + if (g_blockEventsOnDrag) return TRUE; + if (!win->HasVMT()) return TRUE; if (widget->window) gdk_window_set_cursor( widget->window, win->m_cursor->GetCursor() ); @@ -670,8 +686,8 @@ bool gtk_window_enter_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, bool gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_event, wxWindow *win ) { if (widget->window != gdk_event->window) return TRUE; - - if (g_blockEventsOnDrag) return FALSE; + if (!win->HasVMT()) return TRUE; + if (g_blockEventsOnDrag) return TRUE; if (widget->window) gdk_window_set_cursor( widget->window, wxSTANDARD_CURSOR->GetCursor() ); @@ -737,6 +753,7 @@ wxWindow::wxWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { + m_cursor = NULL; Create( parent, id, pos, size, style, name ); }; @@ -795,6 +812,8 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, m_wxwindow = gtk_myfixed_new(); + if (m_wxwindow) 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 @@ -846,7 +865,7 @@ wxWindow::~wxWindow(void) if (m_widget) gtk_widget_destroy( m_widget ); -// delete m_cursor; + wxDELETE(m_cursor); DeleteRelatedConstraints(); if (m_constraints) @@ -900,7 +919,8 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id, m_windowValidator = NULL; m_windowId = id; m_sizeSet = FALSE; - m_cursor = new wxCursor( wxCURSOR_ARROW ); + if (m_cursor == NULL) + m_cursor = new wxCursor( wxCURSOR_ARROW ); m_font = *wxSWISS_FONT; m_backgroundColour = wxWHITE; m_foregroundColour = wxBLACK; @@ -961,9 +981,6 @@ void wxWindow::PostCreation(void) gtk_signal_connect( GTK_OBJECT(connect_widget), "focus_out_event", GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this ); - gtk_signal_connect( GTK_OBJECT(connect_widget), "drop_data_available_event", - GTK_SIGNAL_FUNC(gtk_window_drop_callback), (gpointer)this ); - // Only for cursor handling gtk_signal_connect( GTK_OBJECT(m_widget), "enter_notify_event", @@ -1053,17 +1070,16 @@ void wxWindow::ImplementSetSize(void) void wxWindow::ImplementSetPosition(void) { - if (!m_parent) + if (IS_KIND_OF(this,wxFrame) || IS_KIND_OF(this,wxDialog)) { - if (IsKindOf(CLASSINFO(wxFrame)) || - IsKindOf(CLASSINFO(wxDialog))) - { + if ((m_x != -1) || (m_y != -1)) gtk_widget_set_uposition( m_widget, m_x, m_y ); - } - else - { - printf( "wxWindow::SetSize error.\n" ); - } + return; + } + + if (!m_parent) + { + printf( "wxWindow::SetSize error.\n" ); return; } @@ -1318,14 +1334,11 @@ void wxWindow::ScreenToClient( int *x, int *y ) void wxWindow::Centre( int direction ) { - int x = 0; - int y = 0; - GetPosition( &x, &y ); - if (this->IsKindOf(CLASSINFO(wxDialog)) || this->IsKindOf(CLASSINFO(wxFrame))) + if (IS_KIND_OF(this,wxDialog) || IS_KIND_OF(this,wxFrame)) { - if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (gdk_screen_width () - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) y = (gdk_screen_height () - m_height) / 2; - gtk_widget_set_uposition( m_widget, x, y ); + if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (gdk_screen_width () - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) m_y = (gdk_screen_height () - m_height) / 2; + ImplementSetPosition(); } else { @@ -1334,9 +1347,9 @@ void wxWindow::Centre( int direction ) int p_w = 0; int p_h = 0; m_parent->GetSize( &p_w, &p_h ); - if (direction & wxHORIZONTAL == wxHORIZONTAL) x = (p_w - m_width) / 2; - if (direction & wxVERTICAL == wxVERTICAL) y = (p_h - m_height) / 2; - gtk_widget_set_uposition( m_widget, x, y ); + if (direction & wxHORIZONTAL == wxHORIZONTAL) m_x = (p_w - m_width) / 2; + if (direction & wxVERTICAL == wxVERTICAL) m_y = (p_h - m_height) / 2; + ImplementSetPosition(); }; } }; @@ -1359,7 +1372,7 @@ void wxWindow::Fit(void) node = node->Next(); } - SetClientSize(maxX + 5, maxY + 5); + SetClientSize(maxX + 5, maxY + 10); }; void wxWindow::OnSize( wxSizeEvent &WXUNUSED(event) ) @@ -1432,7 +1445,8 @@ void wxWindow::AddChild( wxWindow *child ) // wxFrame and wxDialog as children aren't placed into the parents - if (child->IsKindOf(CLASSINFO(wxFrame)) || child->IsKindOf(CLASSINFO(wxDialog))) + if (( IS_KIND_OF(child,wxFrame) || IS_KIND_OF(child,wxDialog) ) && + (!IS_KIND_OF(child,wxMDIChildFrame))) { m_children.Append( child ); @@ -1445,9 +1459,9 @@ void wxWindow::AddChild( wxWindow *child ) // In the case of an wxMDIChildFrame descendant, we use the // client windows's AddChild() - if (IsKindOf(CLASSINFO(wxMDIParentFrame))) + if (IS_KIND_OF(this,wxMDIParentFrame)) { - if (child->IsKindOf(CLASSINFO(wxMDIChildFrame))) + if (IS_KIND_OF(child,wxMDIChildFrame)) { wxMDIClientWindow *client = ((wxMDIParentFrame*)this)->GetClientWindow(); if (client) @@ -1460,7 +1474,7 @@ void wxWindow::AddChild( wxWindow *child ) // wxNotebook is very special, so it has a private AddChild() - if (IsKindOf(CLASSINFO(wxNotebook))) + if (IS_KIND_OF(this,wxNotebook)) { wxNotebook *tab = (wxNotebook*)this; tab->AddChild( child ); @@ -1469,7 +1483,7 @@ void wxWindow::AddChild( wxWindow *child ) // wxFrame has a private AddChild - if (IsKindOf(CLASSINFO(wxFrame))) + if (IS_KIND_OF(this,wxFrame) && !IS_KIND_OF(this,wxMDIChildFrame)) { wxFrame *frame = (wxFrame*)this; frame->AddChild( child ); @@ -1479,7 +1493,9 @@ void wxWindow::AddChild( wxWindow *child ) // All the rest m_children.Append( child ); - if (m_wxwindow) gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), child->m_widget, child->m_x, child->m_y ); + if (m_wxwindow) gtk_myfixed_put( GTK_MYFIXED(m_wxwindow), child->m_widget, + child->m_x, child->m_y ); + gtk_widget_set_usize( child->m_widget, child->m_width, child->m_height ); }; @@ -1547,7 +1563,11 @@ wxWindowID wxWindow::GetId(void) void wxWindow::SetCursor( const wxCursor &cursor ) { - if (*m_cursor == cursor) return; + wxASSERT(m_cursor != NULL); + + if (m_cursor != NULL) + if (*m_cursor == cursor) + return; (*m_cursor) = cursor; if (m_widget->window) gdk_window_set_cursor( m_widget->window, m_cursor->GetCursor() ); @@ -1562,9 +1582,9 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) if (rect) gdk_window_clear_area( m_wxwindow->window, rect->x, - rect->y, - rect->width, - rect->height ); + rect->y, + rect->width, + rect->height ); else Clear(); }; @@ -1597,6 +1617,7 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) gdk_rect.y = rect->y; gdk_rect.width = rect->width; gdk_rect.height = rect->height; + if (m_wxwindow) gtk_widget_draw( m_wxwindow, &gdk_rect ); else @@ -1693,17 +1714,23 @@ void wxWindow::InitDialog(void) void wxWindow::SetDropTarget( wxDropTarget *dropTarget ) { - GtkWidget *connect_widget = m_widget; - if (m_wxwindow) connect_widget = m_wxwindow; + GtkWidget *dnd_widget = GetDropTargetWidget(); + if (m_pDropTarget) { - m_pDropTarget->UnregisterWidget( connect_widget ); + gtk_signal_disconnect_by_func( GTK_OBJECT(dnd_widget), + GTK_SIGNAL_FUNC(gtk_window_drop_callback), (gpointer)this ); + + m_pDropTarget->UnregisterWidget( dnd_widget ); delete m_pDropTarget; }; m_pDropTarget = dropTarget; if (m_pDropTarget) { - m_pDropTarget->RegisterWidget( connect_widget ); + m_pDropTarget->RegisterWidget( dnd_widget ); + + gtk_signal_connect( GTK_OBJECT(dnd_widget), "drop_data_available_event", + GTK_SIGNAL_FUNC(gtk_window_drop_callback), (gpointer)this ); }; }; @@ -1712,6 +1739,14 @@ wxDropTarget *wxWindow::GetDropTarget() const return m_pDropTarget; }; +GtkWidget* wxWindow::GetDropTargetWidget(void) +{ + GtkWidget *connect_widget = m_widget; + if (m_wxwindow) connect_widget = m_wxwindow; + + return connect_widget; +} + void wxWindow::SetFont( const wxFont &font ) { m_font = font; @@ -1869,11 +1904,25 @@ void wxWindow::SetScrollbar( int orient, int pos, int thumbVisible, }; if (m_wxwindow->window) - { + { if (orient == wxHORIZONTAL) + { +/* + m_drawingOffsetX = -16000; + + gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); +*/ gtk_signal_emit_by_name( GTK_OBJECT(m_hAdjust), "changed" ); - else + } + else + { +/* + m_drawingOffsetY = -16000; + + gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); +*/ gtk_signal_emit_by_name( GTK_OBJECT(m_vAdjust), "changed" ); + } gtk_widget_set_usize( m_widget, m_width, m_height ); }; @@ -1942,13 +1991,26 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) ) { if (!m_wxwindow) return; - m_drawingOffsetX += dx; - m_drawingOffsetY += dy; + bool refresh = FALSE; + + if ((m_drawingOffsetX == 0) && (m_drawingOffsetY == 0)) + { + m_drawingOffsetX = -16000; + m_drawingOffsetY = -16000; + refresh = TRUE; + } + else + { + m_drawingOffsetX += dx; + m_drawingOffsetY += dy; + } // printf( "X: %d Y: %d \n", (int)m_drawingOffsetX, (int)m_drawingOffsetY ); gtk_myfixed_set_offset( GTK_MYFIXED(m_wxwindow), m_drawingOffsetX, m_drawingOffsetY ); + if (refresh) Refresh(); + /* The code here is very nifty, but it doesn't work with overlapping windows... @@ -2445,7 +2507,7 @@ bool wxWindow::AcceptsFocus() const return IsEnabled() && IsShown(); } -void wxWindow::OnIdle(wxIdleEvent& event) +void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event) ) { UpdateWindowUI(); }