1 /////////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/nativewin.cpp 
   3 // Purpose:     wxNativeWindow implementation 
   4 // Author:      Vadim Zeitlin 
   7 // Copyright:   (c) 2008 Vadim Zeitlin <vadim@wxwindows.org> 
   8 // Licence:     wxWindows licence 
   9 /////////////////////////////////////////////////////////////////////////////// 
  11 // ============================================================================ 
  13 // ============================================================================ 
  15 // ---------------------------------------------------------------------------- 
  17 // ---------------------------------------------------------------------------- 
  19 // for compilers that support precompilation, includes "wx.h". 
  20 #include "wx/wxprec.h" 
  29 #include "wx/nativewin.h" 
  32 #include "wx/gtk/private/gtk2-compat.h" 
  34 #ifdef GDK_WINDOWING_X11 
  38 // ============================================================================ 
  40 // ============================================================================ 
  42 // TODO: we probably need equivalent code for other GDK platforms 
  43 #ifdef GDK_WINDOWING_X11 
  45 extern "C" GdkFilterReturn
 
  46 wxNativeContainerWindowFilter(GdkXEvent 
*gdkxevent
, 
  50     XEvent 
* const xevent 
= static_cast<XEvent 
*>(gdkxevent
); 
  51     if ( xevent
->type 
== DestroyNotify 
) 
  53         // we won't need it any more 
  54         gdk_window_remove_filter(event
->any
.window
, 
  55                                  wxNativeContainerWindowFilter
, data
); 
  57         // the underlying window got destroyed, notify the C++ object 
  58         static_cast<wxNativeContainerWindow 
*>(data
)->OnNativeDestroyed(); 
  61     return GDK_FILTER_CONTINUE
; 
  64 #endif // GDK_WINDOWING_X11 
  66 bool wxNativeContainerWindow::Create(wxNativeContainerWindowHandle win
) 
  68     wxCHECK( win
, false ); 
  70     if ( !wxTopLevelWindow::Create(NULL
, wxID_ANY
, "") ) 
  73     // we need to realize the window first before reparenting it 
  74     gtk_widget_realize(m_widget
); 
  75     gdk_window_reparent(gtk_widget_get_window(m_widget
), win
, 0, 0); 
  77 #ifdef GDK_WINDOWING_X11 
  78     // if the native window is destroyed, our own window will be destroyed too 
  79     // but GTK doesn't expect it and will complain about "unexpectedly 
  80     // destroyed" GdkWindow, so intercept to DestroyNotify ourselves to fix 
  81     // this and also destroy the associated C++ object when its window is 
  83     gdk_window_add_filter(gtk_widget_get_window(m_widget
), wxNativeContainerWindowFilter
, this); 
  84 #endif // GDK_WINDOWING_X11 
  86     // we should be initially visible as we suppose that the native window we 
  87     // wrap is (we could use gdk_window_is_visible() to test for this but this 
  88     // doesn't make much sense unless we also react to visibility changes, so 
  89     // just suppose it's always shown for now) 
  95 bool wxNativeContainerWindow::Create(wxNativeContainerWindowId anid
) 
  99     GdkWindow 
* const win 
= gdk_x11_window_foreign_new_for_display(gdk_display_get_default(), anid
); 
 101     GdkWindow 
* const win 
= gdk_window_foreign_new(anid
); 
 108     else // invalid native window id 
 116 void wxNativeContainerWindow::OnNativeDestroyed() 
 118     // unfortunately we simply can't do anything else than leak memory here: 
 119     // we really need to call _gdk_window_destroy(m_widget->win, TRUE) to 
 120     // indicate that the native window was deleted, but we can't do this 
 121     // because it's a private GDK function and calling normal 
 122     // gdk_window_destroy() results in X errors while nulling just the window 
 123     // pointer and destroying m_widget results in many GTK errors 
 126     // notice that we intentionally don't use Close() nor Delete() here as our 
 127     // window (and the windows of all of our children) is invalid any more and 
 128     // any attempts to use it, as may happen with the delayed destruction, will 
 129     // result in GDK warnings at best and crashes or X errors at worst 
 133 wxNativeContainerWindow::~wxNativeContainerWindow() 
 135     // nothing to do here, either we have a valid m_widget and it will be 
 136     // destroyed as usual (this corresponds to manual destruction of this C++ 
 137     // object) or we are being deleted because the native window was destroyed 
 138     // and in this case our m_widget was set to NULL by OnNativeDestroyed()