+extern "C" {
+static gboolean
+gtk_notebook_key_press_callback( GtkWidget *widget,
+ GdkEventKey *gdk_event,
+ wxNotebook *notebook )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ if (!notebook->m_hasVMT) return FALSE;
+ if (g_blockEventsOnDrag) return FALSE;
+
+ /* win is a control: tab can be propagated up */
+ if ((gdk_event->keyval == GDK_Left) || (gdk_event->keyval == GDK_Right))
+ {
+ int page;
+ int nMax = notebook->GetPageCount();
+ if ( nMax-- ) // decrement it to get the last valid index
+ {
+ int nSel = notebook->GetSelection();
+
+ // change selection wrapping if it becomes invalid
+ page = (gdk_event->keyval != GDK_Left) ? nSel == nMax ? 0
+ : nSel + 1
+ : nSel == 0 ? nMax
+ : nSel - 1;
+ }
+ else // notebook is empty, no next page
+ {
+ return FALSE;
+ }
+
+ // m_selection = page;
+ gtk_notebook_set_current_page( GTK_NOTEBOOK(widget), page );
+
+ g_signal_stop_emission_by_name (widget, "key_press_event");
+ return TRUE;
+ }
+
+ /* win is a control: tab can be propagated up */
+ if ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab))
+ {
+ int sel = notebook->GetSelection();
+ if (sel == -1)
+ return TRUE;
+ wxGtkNotebookPage *nb_page = notebook->GetNotebookPage(sel);
+ wxCHECK_MSG( nb_page, FALSE, _T("invalid selection in wxNotebook") );
+
+ wxNavigationKeyEvent event;
+ event.SetEventObject( notebook );
+ /* GDK reports GDK_ISO_Left_Tab for SHIFT-TAB */
+ event.SetDirection( (gdk_event->keyval == GDK_Tab) );
+ /* CTRL-TAB changes the (parent) window, i.e. switch notebook page */
+ event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) ||
+ (gdk_event->keyval == GDK_Left) || (gdk_event->keyval == GDK_Right) );
+ event.SetCurrentFocus( notebook );
+
+ wxNotebookPage *client = notebook->GetPage(sel);
+ if ( !client->GetEventHandler()->ProcessEvent( event ) )
+ {
+ client->SetFocus();
+ }
+
+ g_signal_stop_emission_by_name (widget, "key_press_event");
+ return TRUE;
+ }
+
+ return FALSE;
+}
+}
+
+//-----------------------------------------------------------------------------
+// InsertChild callback for wxNotebook
+//-----------------------------------------------------------------------------
+
+static void wxInsertChildInNotebook( wxNotebook* parent, wxWindow* child )
+{
+ // Hack Alert! (Part I): This sets the notebook as the parent of the child
+ // widget, and takes care of some details such as updating the state and
+ // style of the child to reflect its new location. We do this early
+ // because without it GetBestSize (which is used to set the initial size
+ // of controls if an explicit size is not given) will often report
+ // incorrect sizes since the widget's style context is not fully known.
+ // See bug #901694 for details
+ // (http://sourceforge.net/tracker/?func=detail&aid=901694&group_id=9863&atid=109863)
+ gtk_widget_set_parent(child->m_widget, parent->m_widget);
+
+ // NOTE: This should be considered a temporary workaround until we can
+ // work out the details and implement delaying the setting of the initial
+ // size of widgets until the size is really needed.