X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/670f9935630beb2123a5ca62894ae92a3f0efa4f..35524f615e56a566786b7621c4b1d16a9c7dd3c7:/src/gtk1/window.cpp?ds=sidebyside diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 738fdc8086..ba93c71dd9 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -20,17 +20,21 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/app.h" + #include "wx/utils.h" + #include "wx/frame.h" + #include "wx/dcclient.h" + #include "wx/menu.h" + #include "wx/dialog.h" + #include "wx/settings.h" + #include "wx/msgdlg.h" + #include "wx/textctrl.h" + #include "wx/combobox.h" + #include "wx/layout.h" + #include "wx/statusbr.h" + #include "wx/math.h" + #include "wx/module.h" #endif -#include "wx/dcclient.h" -#include "wx/frame.h" -#include "wx/layout.h" -#include "wx/utils.h" -#include "wx/dialog.h" -#include "wx/msgdlg.h" -#include "wx/module.h" -#include "wx/combobox.h" - #if wxUSE_DRAG_AND_DROP #include "wx/dnd.h" #endif @@ -43,20 +47,12 @@ #include "wx/caret.h" #endif // wxUSE_CARET -#if wxUSE_TEXTCTRL - #include "wx/textctrl.h" -#endif - -#include "wx/menu.h" -#include "wx/statusbr.h" -#include "wx/settings.h" #include "wx/fontutil.h" #ifdef __WXDEBUG__ #include "wx/thread.h" #endif -#include "wx/math.h" #include #include "wx/gtk1/private.h" @@ -203,7 +199,6 @@ // data //----------------------------------------------------------------------------- -extern wxList wxPendingDelete; extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; extern wxCursor g_globalCursor; @@ -212,24 +207,29 @@ static GdkGC *g_eraseGC = NULL; // mouse capture state: the window which has it and if the mouse is currently // inside it -static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL; +static wxWindowGTK *g_captureWindow = NULL; static bool g_captureWindowHasMouse = false; -wxWindowGTK *g_focusWindow = (wxWindowGTK*) NULL; +wxWindowGTK *g_focusWindow = NULL; // the last window which had the focus - this is normally never NULL (except // if we never had focus at all) as even when g_focusWindow is NULL it still // keeps its previous value -wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL; +wxWindowGTK *g_focusWindowLast = NULL; // If a window get the focus set but has not been realized // yet, defer setting the focus to idle time. -wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL; +wxWindowGTK *g_delayedFocus = NULL; // hack: we need something to pass to gtk_menu_popup, so we store the time of // the last click here (extern: used from gtk/menu.cpp) guint32 wxGtkTimeLastClick = 0; +// global variables because GTK+ DnD want to have the +// mouse event that caused it +GdkEvent *g_lastMouseEvent = NULL; +int g_lastButtonNumber = 0; + extern bool g_mainThreadLocked; //----------------------------------------------------------------------------- @@ -294,7 +294,7 @@ wxWindow *wxFindFocusedChild(wxWindowGTK *win) { wxWindow *winFocus = wxWindowGTK::FindFocus(); if ( !winFocus ) - return (wxWindow *)NULL; + return NULL; if ( winFocus == win ) return (wxWindow *)win; @@ -308,7 +308,7 @@ wxWindow *wxFindFocusedChild(wxWindowGTK *win) return child; } - return (wxWindow *)NULL; + return NULL; } static void draw_frame( GtkWidget *widget, wxWindowGTK *win ) @@ -371,7 +371,7 @@ static void draw_frame( GtkWidget *widget, wxWindowGTK *win ) return; } - if (win->HasFlag(wxSUNKEN_BORDER)) + if (win->HasFlag(wxSUNKEN_BORDER) || win->HasFlag(wxBORDER_THEME)) { gtk_draw_shadow( widget->style, widget->window, @@ -428,7 +428,7 @@ static void gtk_window_own_draw_callback( GtkWidget *widget, GdkRectangle *WXUNU // make it extern because wxStaticText needs to disconnect this one extern "C" { -void wxgtk_window_size_request_callback(GtkWidget *widget, +void wxgtk_window_size_request_callback(GtkWidget *WXUNUSED(widget), GtkRequisition *requisition, wxWindow *win) { @@ -446,7 +446,7 @@ void wxgtk_window_size_request_callback(GtkWidget *widget, extern "C" { static -void wxgtk_combo_size_request_callback(GtkWidget *widget, +void wxgtk_combo_size_request_callback(GtkWidget *WXUNUSED(widget), GtkRequisition *requisition, wxComboBox *win) { @@ -478,7 +478,7 @@ void wxgtk_combo_size_request_callback(GtkWidget *widget, //----------------------------------------------------------------------------- extern "C" { -static int gtk_window_expose_callback( GtkWidget *widget, +static int gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExpose *gdk_event, wxWindow *win ) { @@ -611,7 +611,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, GdkRectangle child_area; if (gtk_widget_intersect (child->widget, rect, &child_area)) { - gtk_widget_draw (child->widget, &child_area /* (GdkRectangle*) NULL*/ ); + gtk_widget_draw (child->widget, &child_area /* NULL*/ ); } } #endif @@ -830,7 +830,7 @@ static long wxTranslateKeySymToWXKey(KeySym keysym, bool isChar) break; case GDK_KP_Next: // == GDK_KP_Page_Down - key_code = isChar ? WXK_NEXT : WXK_NUMPAD_PAGEDOWN; + key_code = isChar ? WXK_PAGEDOWN : WXK_NUMPAD_PAGEDOWN; break; case GDK_KP_End: @@ -927,7 +927,10 @@ static void wxFillOtherKeyEventFields(wxKeyEvent& event, event.m_rawCode = (wxUint32) gdk_event->keyval; event.m_rawFlags = 0; #if wxUSE_UNICODE - event.m_uniChar = gdk_keyval_to_unicode(gdk_event->keyval); +#if 0 + // this is not gtk1.x + event.m_uniChar = gdk_keyval_to_unicode(gdk_event->keyval); +#endif #endif wxGetMousePosition( &x, &y ); win->ScreenToClient( &x, &y ); @@ -1060,10 +1063,10 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, bool ret = false; bool return_after_IM = false; - if( wxTranslateGTKKeyEventToWx(event, win, gdk_event) == false ) + if ( wxTranslateGTKKeyEventToWx(event, win, gdk_event) ) { // Emit KEY_DOWN event - ret = win->GetEventHandler()->ProcessEvent( event ); + ret = win->HandleWindowEvent( event ); } else { @@ -1119,12 +1122,12 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, if (parent) { event.SetEventType( wxEVT_CHAR_HOOK ); - ret = parent->GetEventHandler()->ProcessEvent( event ); + ret = parent->HandleWindowEvent( event ); } if (!ret) { event.SetEventType(wxEVT_CHAR); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } } return true; @@ -1143,7 +1146,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, if (command != -1) { wxCommandEvent command_event( wxEVT_COMMAND_MENU_SELECTED, command ); - ret = ancestor->GetEventHandler()->ProcessEvent( command_event ); + ret = ancestor->HandleWindowEvent( command_event ); break; } if (ancestor->IsTopLevel()) @@ -1188,13 +1191,13 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, if (parent) { event.SetEventType( wxEVT_CHAR_HOOK ); - ret = parent->GetEventHandler()->ProcessEvent( event ); + ret = parent->HandleWindowEvent( event ); } if (!ret) { event.SetEventType(wxEVT_CHAR); - ret = win->GetEventHandler()->ProcessEvent( event ); + ret = win->HandleWindowEvent( event ); } } } @@ -1224,7 +1227,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, // CTRL-TAB changes the (parent) window, i.e. switch notebook page new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) ); new_event.SetCurrentFocus( win ); - ret = win->GetParent()->GetEventHandler()->ProcessEvent( new_event ); + ret = win->GetParent()->HandleWindowEvent( new_event ); } // generate wxID_CANCEL if has been pressed (typically in dialogs) @@ -1260,7 +1263,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, { wxCommandEvent eventClick(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); eventClick.SetEventObject(btnCancel); - ret = btnCancel->GetEventHandler()->ProcessEvent(eventClick); + ret = btnCancel->HandleWindowEvent(eventClick); } } @@ -1301,7 +1304,7 @@ static gint gtk_window_key_release_callback( GtkWidget *widget, return FALSE; } - if ( !win->GetEventHandler()->ProcessEvent( event ) ) + if ( !win->HandleWindowEvent( event ) ) return FALSE; gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "key_release_event" ); @@ -1352,7 +1355,7 @@ template void InitMouseEvent(wxWindowGTK *win, static void AdjustEventButtonState(wxMouseEvent& event) { // GDK reports the old state of the button for a button press event, but - // for compatibility with MSW and common sense we want m_leftDown be TRUE + // for compatibility with MSW and common sense we want m_leftDown be true // for a LEFT_DOWN event, not FALSE, so we will invert // left/right/middleDown for the corresponding click events @@ -1430,7 +1433,7 @@ wxWindowGTK *FindWindowForMouseEvent(wxWindowGTK *win, wxCoord& x, wxCoord& y) } else { - if ((child->m_wxwindow == (GtkWidget*) NULL) && + if ((child->m_wxwindow == NULL) && (child->m_x <= xx) && (child->m_y <= yy) && (child->m_x+child->m_width >= xx) && @@ -1473,7 +1476,9 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE; - if (win->m_wxwindow && (g_focusWindow != win) && win->AcceptsFocus()) + g_lastButtonNumber = gdk_event->button; + + if (win->m_wxwindow && (g_focusWindow != win) && win->IsFocusable()) { gtk_widget_grab_focus( win->m_wxwindow ); /* @@ -1580,6 +1585,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, return FALSE; } + g_lastMouseEvent = (GdkEvent*) gdk_event; + wxMouseEvent event( event_type ); InitMouseEvent( win, event, gdk_event ); @@ -1609,11 +1616,13 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, } } - if (win->GetEventHandler()->ProcessEvent( event )) + if (win->HandleWindowEvent( event )) { gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_press_event" ); + g_lastMouseEvent = NULL; return TRUE; } + g_lastMouseEvent = NULL; if (event_type == wxEVT_RIGHT_DOWN) { @@ -1629,7 +1638,7 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, win->GetId(), win->ClientToScreen(event.GetPosition())); evtCtx.SetEventObject(win); - return win->GetEventHandler()->ProcessEvent(evtCtx); + return win->HandleWindowEvent(evtCtx); } return FALSE; @@ -1656,6 +1665,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, if (!win->IsOwnGtkWindow( gdk_event->window )) return FALSE; + g_lastButtonNumber = 0; + wxEventType event_type = wxEVT_NULL; switch (gdk_event->button) @@ -1677,6 +1688,8 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, return FALSE; } + g_lastMouseEvent = (GdkEvent*) gdk_event; + wxMouseEvent event( event_type ); InitMouseEvent( win, event, gdk_event ); @@ -1688,7 +1701,7 @@ static gint gtk_window_button_release_callback( GtkWidget *widget, if ( !g_captureWindow ) win = FindWindowForMouseEvent(win, event.m_x, event.m_y); - if (win->GetEventHandler()->ProcessEvent( event )) + if (win->HandleWindowEvent( event )) { gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "button_release_event" ); return TRUE; @@ -1728,6 +1741,8 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, gdk_event->y = y; } + g_lastMouseEvent = (GdkEvent*) gdk_event; + /* printf( "OnMotion from " ); if (win->GetClassInfo() && win->GetClassInfo()->GetClassName()) @@ -1756,7 +1771,7 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, : wxEVT_LEAVE_WINDOW); InitMouseEvent(win, eventM, gdk_event); eventM.SetEventObject(win); - win->GetEventHandler()->ProcessEvent(eventM); + win->HandleWindowEvent(eventM); } } else // no capture @@ -1764,13 +1779,15 @@ static gint gtk_window_motion_notify_callback( GtkWidget *widget, win = FindWindowForMouseEvent(win, event.m_x, event.m_y); } - if (win->GetEventHandler()->ProcessEvent( event )) + bool ret = win->HandleWindowEvent( event ); + g_lastMouseEvent = NULL; + + if ( ret ) { gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "motion_notify_event" ); - return TRUE; } - return FALSE; + return ret ? TRUE : FALSE; } } @@ -1785,12 +1802,12 @@ static bool DoSendFocusEvents(wxWindow *win) // Notify the parent keeping track of focus for the kbd navigation // purposes that we got it. wxChildFocusEvent eventChildFocus(win); - (void)win->GetEventHandler()->ProcessEvent(eventChildFocus); + (void)win->HandleWindowEvent(eventChildFocus); wxFocusEvent eventFocus(wxEVT_SET_FOCUS, win->GetId()); eventFocus.SetEventObject(win); - return win->GetEventHandler()->ProcessEvent(eventFocus); + return win->HandleWindowEvent(eventFocus); } extern "C" { @@ -1845,7 +1862,9 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, //----------------------------------------------------------------------------- extern "C" { -static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk_event, wxWindowGTK *win ) +static gint gtk_window_focus_out_callback( GtkWidget *WXUNUSED(widget), + GdkEventFocus *WXUNUSED(gdk_event), + wxWindowGTK *win ) { DEBUG_MAIN_THREAD @@ -1860,7 +1879,7 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk if ( winFocus ) win = winFocus; - g_focusWindow = (wxWindowGTK *)NULL; + g_focusWindow = NULL; #ifdef HAVE_XIM if (win->m_ic) @@ -1889,7 +1908,7 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk // process it too as otherwise bad things happen, especially in GTK2 // where the text control simply aborts the program if it doesn't get // the matching focus out event - (void)win->GetEventHandler()->ProcessEvent( event ); + (void)win->HandleWindowEvent( event ); } return FALSE; @@ -1931,7 +1950,7 @@ gint gtk_window_enter_callback( GtkWidget *widget, event.m_x = x + pt.x; event.m_y = y + pt.y; - if (win->GetEventHandler()->ProcessEvent( event )) + if (win->HandleWindowEvent( event )) { gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "enter_notify_event" ); return TRUE; @@ -1983,7 +2002,7 @@ static gint gtk_window_leave_callback( GtkWidget *widget, GdkEventCrossing *gdk_ event.m_x = x + pt.x; event.m_y = y + pt.y; - if (win->GetEventHandler()->ProcessEvent( event )) + if (win->HandleWindowEvent( event )) { gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "leave_notify_event" ); return TRUE; @@ -2023,7 +2042,7 @@ static void gtk_window_vscroll_callback( GtkAdjustment *adjust, wxScrollWinEvent event( command, value, wxVERTICAL ); event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } } @@ -2056,7 +2075,7 @@ static void gtk_window_hscroll_callback( GtkAdjustment *adjust, wxScrollWinEvent event( command, value, wxHORIZONTAL ); event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } } @@ -2122,7 +2141,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget, wxScrollWinEvent event( command, value, dir ); event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } win->m_isScrolling = false; @@ -2151,7 +2170,7 @@ wxWindow *wxWindowBase::DoFindFocus() extern "C" { static gint -gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win ) +gtk_window_realized_callback( GtkWidget *WXUNUSED(widget), wxWindow *win ) { DEBUG_MAIN_THREAD @@ -2160,7 +2179,7 @@ gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win ) wxWindowCreateEvent event( win ); event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); return FALSE; } @@ -2194,7 +2213,7 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget), { wxSizeEvent event( win->GetSize(), win->GetId() ); event.SetEventObject( win ); - win->GetEventHandler()->ProcessEvent( event ); + win->HandleWindowEvent( event ); } } } @@ -2211,7 +2230,7 @@ void gtk_window_size_callback( GtkWidget *WXUNUSED(widget), extern "C" { static void gtk_wxwindow_size_callback( GtkWidget* WXUNUSED_UNLESS_XIM(widget), - GtkAllocation* WXUNUSED_UNLESS_XIM(alloc), + GtkAllocation* WXUNUSED(alloc), wxWindowGTK* WXUNUSED_UNLESS_XIM(win) ) { if (g_isIdle) @@ -2405,9 +2424,9 @@ wxMouseState wxGetMouseState() void wxWindowGTK::Init() { // GTK specific - m_widget = (GtkWidget *) NULL; - m_wxwindow = (GtkWidget *) NULL; - m_focusWidget = (GtkWidget *) NULL; + m_widget = NULL; + m_wxwindow = NULL; + m_focusWidget = NULL; // position/size m_x = 0; @@ -2418,7 +2437,6 @@ void wxWindowGTK::Init() m_sizeSet = false; m_hasVMT = false; m_needParent = true; - m_isBeingDeleted = false; m_noExpose = false; m_nativeSizeEvent = false; @@ -2426,8 +2444,8 @@ void wxWindowGTK::Init() m_hasScrolling = false; m_isScrolling = false; - m_hAdjust = (GtkAdjustment*) NULL; - m_vAdjust = (GtkAdjustment*) NULL; + m_hAdjust = NULL; + m_vAdjust = NULL; m_oldHorizontalPos = m_oldVerticalPos = 0.0; m_oldClientWidth = @@ -2447,8 +2465,8 @@ void wxWindowGTK::Init() m_cursor = *wxSTANDARD_CURSOR; #ifdef HAVE_XIM - m_ic = (GdkIC*) NULL; - m_icattr = (GdkICAttr*) NULL; + m_ic = NULL; + m_icattr = NULL; #endif } @@ -2476,6 +2494,11 @@ bool wxWindowGTK::Create( wxWindow *parent, long style, const wxString &name ) { + // Get default border + wxBorder border = GetBorder(style); + style &= ~wxBORDER_MASK; + style |= border; + if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) { @@ -2485,7 +2508,7 @@ bool wxWindowGTK::Create( wxWindow *parent, m_insertCallback = wxInsertChildInWindow; - m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); + m_widget = gtk_scrolled_window_new( NULL, NULL ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GtkScrolledWindow *scrolledWindow = GTK_SCROLLED_WINDOW(m_widget); @@ -2507,7 +2530,7 @@ bool wxWindowGTK::Create( wxWindow *parent, { gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_OUT ); } - else if (HasFlag(wxSUNKEN_BORDER)) + else if (HasFlag(wxSUNKEN_BORDER) || HasFlag(wxBORDER_THEME)) { gtk_pizza_set_shadow_type( pizza, GTK_MYSHADOW_IN ); } @@ -2589,7 +2612,6 @@ wxWindowGTK::~wxWindowGTK() if ( g_delayedFocus == this ) g_delayedFocus = NULL; - m_isBeingDeleted = true; m_hasVMT = false; // destroy children before destroying this window itself @@ -2618,13 +2640,13 @@ wxWindowGTK::~wxWindowGTK() if (m_wxwindow) { gtk_widget_destroy( m_wxwindow ); - m_wxwindow = (GtkWidget*) NULL; + m_wxwindow = NULL; } if (m_widget) { gtk_widget_destroy( m_widget ); - m_widget = (GtkWidget*) NULL; + m_widget = NULL; } } @@ -2893,7 +2915,7 @@ void wxWindowGTK::DoSetSize( int x, int y, int width, int height, int sizeFlags { wxSizeEvent event( wxSize(m_width,m_height), GetId() ); event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( event ); + HandleWindowEvent( event ); } m_resizing = false; @@ -2936,17 +2958,15 @@ void wxWindowGTK::OnInternalIdle() gdk_window_set_cursor( window, cursor.GetCursor() ); } - else + else if ( m_widget ) { - GdkWindow *window = m_widget->window; - if ((window) && !(GTK_WIDGET_NO_WINDOW(m_widget))) + if ( window && !GTK_WIDGET_NO_WINDOW(m_widget) ) gdk_window_set_cursor( window, cursor.GetCursor() ); - } } - if (wxUpdateUIEvent::CanUpdate(this)) + if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen()) UpdateWindowUI(wxUPDATE_UI_FROMIDLE); } @@ -2972,7 +2992,7 @@ void wxWindowGTK::DoSetClientSize( int width, int height ) int dh = 0; #ifndef __WXUNIVERSAL__ - if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER)) + if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxBORDER_THEME)) { /* when using GTK 1.2 we set the shadow border size to 2 */ dw += 2 * 2; @@ -3036,7 +3056,7 @@ void wxWindowGTK::DoGetClientSize( int *width, int *height ) const int dh = 0; #ifndef __WXUNIVERSAL__ - if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER)) + if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxBORDER_THEME)) { /* when using GTK 1.2 we set the shadow border size to 2 */ dw += 2 * 2; @@ -3116,7 +3136,7 @@ void wxWindowGTK::DoClientToScreen( int *x, int *y ) const if (!m_widget->window) return; - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = GTK_PIZZA(m_wxwindow)->bin_window; else @@ -3145,7 +3165,7 @@ void wxWindowGTK::DoScreenToClient( int *x, int *y ) const if (!m_widget->window) return; - GdkWindow *source = (GdkWindow *) NULL; + GdkWindow *source = NULL; if (m_wxwindow) source = GTK_PIZZA(m_wxwindow)->bin_window; else @@ -3186,45 +3206,18 @@ bool wxWindowGTK::Show( bool show ) wxShowEvent eventShow(GetId(), show); eventShow.SetEventObject(this); - GetEventHandler()->ProcessEvent(eventShow); + HandleWindowEvent(eventShow); return true; } -static void wxWindowNotifyEnable(wxWindowGTK* win, bool enable) +void wxWindowGTK::DoEnable( bool enable ) { - win->OnParentEnable(enable); - - // Recurse, so that children have the opportunity to Do The Right Thing - // and reset colours that have been messed up by a parent's (really ancestor's) - // Enable call - for ( wxWindowList::compatibility_iterator node = win->GetChildren().GetFirst(); - node; - node = node->GetNext() ) - { - wxWindow *child = node->GetData(); - if (!child->IsKindOf(CLASSINFO(wxDialog)) && !child->IsKindOf(CLASSINFO(wxFrame))) - wxWindowNotifyEnable(child, enable); - } -} - -bool wxWindowGTK::Enable( bool enable ) -{ - wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") ); - - if (!wxWindowBase::Enable(enable)) - { - // nothing to do - return false; - } + wxCHECK_RET( (m_widget != NULL), wxT("invalid window") ); gtk_widget_set_sensitive( m_widget, enable ); if ( m_wxwindow ) gtk_widget_set_sensitive( m_wxwindow, enable ); - - wxWindowNotifyEnable(this, enable); - - return true; } int wxWindowGTK::GetCharHeight() const @@ -3419,16 +3412,14 @@ bool wxWindowGTK::SetCursor( const wxCursor &cursor ) { wxCHECK_MSG( (m_widget != NULL), false, wxT("invalid window") ); - if (cursor == m_cursor) + if ( cursor.IsSameAs(m_cursor) ) return false; if (g_isIdle) wxapp_install_idle_handler(); - if (cursor == wxNullCursor) - return wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ); - else - return wxWindowBase::SetCursor( cursor ); + return wxWindowBase::SetCursor( cursor.IsOk() ? cursor + : *wxSTANDARD_CURSOR ); } void wxWindowGTK::WarpPointer( int x, int y ) @@ -3438,7 +3429,7 @@ void wxWindowGTK::WarpPointer( int x, int y ) // We provide this function ourselves as it is // missing in GDK (top of this file). - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = GTK_PIZZA(m_wxwindow)->bin_window; else @@ -3512,7 +3503,7 @@ void wxWindowGTK::Refresh( bool eraseBackground, const wxRect *rect ) } else { - gtk_widget_draw( m_widget, (GdkRectangle*) NULL ); + gtk_widget_draw( m_widget, NULL ); } } } @@ -3590,20 +3581,16 @@ void wxWindowGTK::GtkSendPaintEvents() } } } - else - - // if (!m_clearRegion.IsEmpty()) // Always send an erase event under GTK 1.2 + else // Always send an erase event under GTK 1.2 { wxWindowDC dc( (wxWindow*)this ); - if (m_clearRegion.IsEmpty()) - dc.SetClippingRegion( m_updateRegion ); - else - dc.SetClippingRegion( m_clearRegion ); + dc.SetDeviceClippingRegion( m_clearRegion.IsEmpty() ? m_updateRegion + : m_clearRegion ); wxEraseEvent erase_event( GetId(), &dc ); erase_event.SetEventObject( this ); - if (!GetEventHandler()->ProcessEvent(erase_event) && GetBackgroundStyle() != wxBG_STYLE_CUSTOM) + if (!HandleWindowEvent(erase_event) && GetBackgroundStyle() != wxBG_STYLE_CUSTOM) { if (!g_eraseGC) { @@ -3625,11 +3612,11 @@ void wxWindowGTK::GtkSendPaintEvents() wxNcPaintEvent nc_paint_event( GetId() ); nc_paint_event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( nc_paint_event ); + HandleWindowEvent( nc_paint_event ); wxPaintEvent paint_event( GetId() ); paint_event.SetEventObject( this ); - GetEventHandler()->ProcessEvent( paint_event ); + HandleWindowEvent( paint_event ); m_clipPaintRegion = false; @@ -3706,7 +3693,7 @@ void wxWindowGTK::DoSetToolTip( wxToolTip *tip ) void wxWindowGTK::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) { wxString tmp( tip ); - gtk_tooltips_set_tip( tips, GetConnectWidget(), wxGTK_CONV(tmp), (gchar*) NULL ); + gtk_tooltips_set_tip( tips, GetConnectWidget(), wxGTK_CONV(tmp), NULL ); } #endif // wxUSE_TOOLTIPS @@ -3840,7 +3827,7 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style) if (style == wxBG_STYLE_CUSTOM) { - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = GTK_PIZZA(m_wxwindow)->bin_window; else @@ -3924,7 +3911,7 @@ void wxWindowGTK::DoCaptureMouse() { wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = GTK_PIZZA(m_wxwindow)->bin_window; else @@ -3942,7 +3929,7 @@ void wxWindowGTK::DoCaptureMouse() GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_POINTER_MOTION_MASK), - (GdkWindow *) NULL, + NULL, cursor->GetCursor(), (guint32)GDK_CURRENT_TIME ); g_captureWindow = this; @@ -3955,9 +3942,9 @@ void wxWindowGTK::DoReleaseMouse() wxCHECK_RET( g_captureWindow, wxT("can't release mouse - not captured") ); - g_captureWindow = (wxWindowGTK*) NULL; + g_captureWindow = NULL; - GdkWindow *window = (GdkWindow*) NULL; + GdkWindow *window = NULL; if (m_wxwindow) window = GTK_PIZZA(m_wxwindow)->bin_window; else @@ -4236,3 +4223,11 @@ void wxWinModule::OnExit() if (g_eraseGC) gdk_gc_unref( g_eraseGC ); } + +GdkWindow* wxWindowGTK::GTKGetDrawingWindow() const +{ + GdkWindow* window = NULL; + if (m_wxwindow) + window = GTK_PIZZA(m_wxwindow)->bin_window; + return window; +}