+ GTKApplyWidgetStyle(true);
+ }
+
+ return true;
+}
+
+// ----------------------------------------------------------------------------
+// Pop-up menu stuff
+// ----------------------------------------------------------------------------
+
+#if wxUSE_MENUS_NATIVE
+
+extern "C" {
+static
+void wxPopupMenuPositionCallback( GtkMenu *menu,
+ gint *x, gint *y,
+ gboolean * WXUNUSED(whatever),
+ gpointer user_data )
+{
+ // ensure that the menu appears entirely on screen
+ GtkRequisition req;
+ gtk_widget_get_child_requisition(GTK_WIDGET(menu), &req);
+
+ wxSize sizeScreen = wxGetDisplaySize();
+ wxPoint *pos = (wxPoint*)user_data;
+
+ gint xmax = sizeScreen.x - req.width,
+ ymax = sizeScreen.y - req.height;
+
+ *x = pos->x < xmax ? pos->x : xmax;
+ *y = pos->y < ymax ? pos->y : ymax;
+}
+}
+
+bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y )
+{
+ wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") );
+
+ // For compatibility with other ports, pretend that the window showing the
+ // menu has focus while the menu is shown. This is needed because the popup
+ // menu actually steals the focus from the window it's associated it in
+ // wxGTK unlike, say, wxMSW.
+ wxWindowGTK* const oldPendingFocus = gs_pendingFocus;
+ gs_pendingFocus = this;
+ wxON_BLOCK_EXIT_SET( gs_pendingFocus, oldPendingFocus );
+
+ menu->UpdateUI();
+
+ wxPoint pos;
+ gpointer userdata;
+ GtkMenuPositionFunc posfunc;
+ if ( x == -1 && y == -1 )
+ {
+ // use GTK's default positioning algorithm
+ userdata = NULL;
+ posfunc = NULL;
+ }
+ else
+ {
+ pos = ClientToScreen(wxPoint(x, y));
+ userdata = &pos;
+ posfunc = wxPopupMenuPositionCallback;
+ }
+
+ menu->m_popupShown = true;
+ gtk_menu_popup(
+ GTK_MENU(menu->m_menu),
+ NULL, // parent menu shell
+ NULL, // parent menu item
+ posfunc, // function to position it
+ userdata, // client data
+ 0, // button used to activate it
+ gtk_get_current_event_time()
+ );
+
+ while (menu->m_popupShown)
+ {
+ gtk_main_iteration();