X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d013e46a0ac91251f1c2a1495f85d1086f80ffe..74b965198ce3a4257deac901b6f7517e6447ca0f:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 8d8154f246..e1b0b87036 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -281,11 +281,11 @@ wxgtk_window_size_request_callback(GtkWidget * WXUNUSED(widget), extern "C" { static gboolean -gtk_window_expose_callback( GtkWidget* widget, +gtk_window_expose_callback( GtkWidget*, GdkEventExpose *gdk_event, wxWindow *win ) { - if (gdk_event->window == widget->window) + if (gdk_event->window == win->GTKGetDrawingWindow()) { win->GetUpdateRegion() = wxRegion( gdk_event->region ); win->GtkSendPaintEvents(); @@ -304,7 +304,7 @@ extern "C" { static gboolean expose_event_border(GtkWidget* widget, GdkEventExpose* gdk_event, wxWindow* win) { - if (gdk_event->window != widget->window) + if (gdk_event->window != gtk_widget_get_parent_window(win->m_wxwindow)) return false; const GtkAllocation& alloc = win->m_wxwindow->allocation; @@ -1831,7 +1831,7 @@ gtk_window_realized_callback(GtkWidget* widget, wxWindow* win) if (win->m_imData) { gtk_im_context_set_client_window( win->m_imData->context, - widget->window); + win->m_wxwindow ? win->GTKGetDrawingWindow() : widget->window); } // We cannot set colours and fonts before the widget @@ -1949,8 +1949,7 @@ void wxWindowGTK::AddChildGTK(wxWindowGTK* child) gtk_widget_set_size_request( child->m_widget, child->m_width, child->m_height); - gtk_fixed_put( - GTK_FIXED(m_wxwindow), child->m_widget, child->m_x, child->m_y); + pizza->put(child->m_widget, child->m_x, child->m_y); } //----------------------------------------------------------------------------- @@ -2088,7 +2087,7 @@ bool wxWindowGTK::Create( wxWindow *parent, #endif - m_wxwindow = wxPizza::New(m_windowStyle,this); + m_wxwindow = wxPizza::New(m_windowStyle); #ifndef __WXUNIVERSAL__ if (HasFlag(wxPizza::BORDER_STYLES)) { @@ -2211,6 +2210,12 @@ wxWindowGTK::~wxWindowGTK() // delete before the widgets to avoid a crash on solaris delete m_imData; + // avoid problem with GTK+ 2.18 where a frozen window causes the whole + // TLW to be frozen, and if the window is then destroyed, nothing ever + // gets painted again + if (IsFrozen()) + DoThaw(); + if (m_widget) { // Note that gtk_widget_destroy() does not destroy the widget, it just @@ -2572,7 +2577,7 @@ void wxWindowGTK::OnInternalIdle() if (m_wxwindow && (m_wxwindow != m_widget)) { - GdkWindow *window = m_wxwindow->window; + GdkWindow* window = GTKGetDrawingWindow(); if (window) gdk_window_set_cursor( window, cursor.GetCursor() ); @@ -3538,6 +3543,7 @@ void wxWindowGTK::Refresh(bool WXUNUSED(eraseBackground), if (!GTK_WIDGET_MAPPED (w)) return; + GdkWindow* window = GTKGetDrawingWindow(); if (rect) { int x = rect->x; @@ -3548,23 +3554,26 @@ void wxWindowGTK::Refresh(bool WXUNUSED(eraseBackground), r.y = rect->y; r.width = rect->width; r.height = rect->height; - gdk_window_invalidate_rect( m_wxwindow->window, &r, TRUE ); + gdk_window_invalidate_rect(window, &r, true); } else - gdk_window_invalidate_rect( m_wxwindow->window, NULL, TRUE ); + gdk_window_invalidate_rect(window, NULL, true); } } void wxWindowGTK::Update() { - if (m_widget && m_widget->window) + if (m_widget && GTK_WIDGET_MAPPED(m_widget)) { GdkDisplay* display = gtk_widget_get_display(m_widget); // Flush everything out to the server, and wait for it to finish. // This ensures nothing will overwrite the drawing we are about to do. gdk_display_sync(display); - gdk_window_process_updates(m_widget->window, TRUE); + GdkWindow* window = GTKGetDrawingWindow(); + if (window == NULL) + window = m_widget->window; + gdk_window_process_updates(window, true); // Flush again, but no need to wait for it to finish gdk_display_flush(display); @@ -3669,7 +3678,7 @@ void wxWindowGTK::GtkSendPaintEvents() rect.height = upd.GetHeight(); gtk_paint_flat_box( parent->m_widget->style, - m_wxwindow->window, + GTKGetDrawingWindow(), (GtkStateType)GTK_WIDGET_STATE(m_wxwindow), GTK_SHADOW_NONE, &rect, @@ -3918,7 +3927,7 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style) GdkWindow *window; if ( m_wxwindow ) { - window = m_wxwindow->window; + window = GTKGetDrawingWindow(); } else { @@ -3961,23 +3970,6 @@ bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style) #if wxUSE_MENUS_NATIVE -static void SetInvokingWindow( wxMenu *menu, wxWindow* win ) -{ - menu->SetInvokingWindow( win ); - - wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); - while (node) - { - wxMenuItem *menuitem = node->GetData(); - if (menuitem->IsSubMenu()) - { - SetInvokingWindow( menuitem->GetSubMenu(), win ); - } - - node = node->GetNext(); - } -} - extern "C" { static void wxPopupMenuPositionCallback( GtkMenu *menu, @@ -4004,10 +3996,6 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) { wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") ); - wxCHECK_MSG( menu != NULL, false, wxT("invalid popup-menu") ); - - SetInvokingWindow( menu, this ); - menu->UpdateUI(); wxPoint pos; @@ -4084,7 +4072,7 @@ bool wxWindowGTK::GTKIsOwnWindow(GdkWindow *window) const GdkWindow *wxWindowGTK::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const { - return m_wxwindow ? m_wxwindow->window : m_widget->window; + return m_wxwindow ? GTKGetDrawingWindow() : m_widget->window; } bool wxWindowGTK::SetFont( const wxFont &font ) @@ -4107,7 +4095,7 @@ void wxWindowGTK::DoCaptureMouse() GdkWindow *window = NULL; if (m_wxwindow) - window = m_wxwindow->window; + window = GTKGetDrawingWindow(); else window = GetConnectWidget()->window; @@ -4140,7 +4128,7 @@ void wxWindowGTK::DoReleaseMouse() GdkWindow *window = NULL; if (m_wxwindow) - window = m_wxwindow->window; + window = GTKGetDrawingWindow(); else window = GetConnectWidget()->window; @@ -4412,7 +4400,7 @@ GdkWindow* wxWindowGTK::GTKGetDrawingWindow() const { GdkWindow* window = NULL; if (m_wxwindow) - window = m_wxwindow->window; + window = WX_PIZZA(m_wxwindow)->m_draw_window; return window; } @@ -4425,7 +4413,7 @@ extern "C" // this is called if we attempted to freeze unrealized widget when it finally // is realized (and so can be frozen): -static void wx_frozen_widget_realize(GtkWidget* w, void* WXUNUSED(data)) +static void wx_frozen_widget_realize(GtkWidget* w, wxWindowGTK* win) { wxASSERT( w && !GTK_WIDGET_NO_WINDOW(w) ); wxASSERT( GTK_WIDGET_REALIZED(w) ); @@ -4434,10 +4422,13 @@ static void wx_frozen_widget_realize(GtkWidget* w, void* WXUNUSED(data)) ( w, (void*)wx_frozen_widget_realize, - NULL + win ); - gdk_window_freeze_updates(w->window); + GdkWindow* window = w->window; + if (w == win->m_wxwindow) + window = win->GTKGetDrawingWindow(); + gdk_window_freeze_updates(window); } } // extern "C" @@ -4456,12 +4447,15 @@ void wxWindowGTK::GTKFreezeWidget(GtkWidget *w) w, "realize", G_CALLBACK(wx_frozen_widget_realize), - NULL + this ); return; } - gdk_window_freeze_updates(w->window); + GdkWindow* window = w->window; + if (w == m_wxwindow) + window = GTKGetDrawingWindow(); + gdk_window_freeze_updates(window); } void wxWindowGTK::GTKThawWidget(GtkWidget *w) @@ -4476,12 +4470,15 @@ void wxWindowGTK::GTKThawWidget(GtkWidget *w) ( w, (void*)wx_frozen_widget_realize, - NULL + this ); return; } - gdk_window_thaw_updates(w->window); + GdkWindow* window = w->window; + if (w == m_wxwindow) + window = GTKGetDrawingWindow(); + gdk_window_thaw_updates(window); } void wxWindowGTK::DoFreeze()