X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6a008b33c4943a259f9d953598a82d12bcc04dbf..f42b1601d6a55f3c2b7e7c22894727bda70d8505:/src/gtk/window.cpp?ds=sidebyside diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index a0eff69c74..1cc1b40434 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -132,7 +132,7 @@ extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; extern wxCursor g_globalCursor; static wxWindow *g_captureWindow = (wxWindow*) NULL; -static wxWindow *g_focusWindow = (wxWindow*) NULL; + wxWindow *g_focusWindow = (wxWindow*) NULL; /* hack: we need something to pass to gtk_menu_popup, so we store the time of the last click here */ @@ -812,7 +812,6 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_e ret = (ret || win->GetEventHandler()->ProcessEvent( event2 )); } - /* win is a control: tab can be propagated up */ if ( (!ret) && ((gdk_event->keyval == GDK_Tab) || (gdk_event->keyval == GDK_ISO_Left_Tab)) && @@ -1799,6 +1798,7 @@ void wxWindow::Init() m_insertCallback = (wxInsertChildFunction) NULL; m_isStaticBox = FALSE; + m_isRadioButton = FALSE; m_acceptsFocus = FALSE; } @@ -1820,7 +1820,12 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, long style, const wxString &name ) { - PreCreation( parent, id, pos, size, style, name ); + if (!PreCreation( parent, pos, size ) || + !CreateBase( parent, id, pos, size, style, wxDefaultValidator, name )) + { + wxFAIL_MSG( _T("wxWindow creation failed") ); + return FALSE; + } m_insertCallback = wxInsertChildInWindow; @@ -2001,27 +2006,22 @@ wxWindow::~wxWindow() } } -void wxWindow::PreCreation( wxWindow *parent, - wxWindowID id, - const wxPoint &pos, - const wxSize &size, - long style, - const wxString &name ) +bool wxWindow::PreCreation( wxWindow *parent, const wxPoint &pos, const wxSize &size ) { - wxASSERT_MSG( !m_needParent || parent, _T("Need complete parent.") ); - - if ( !CreateBase(parent, id, pos, size, style, name) ) - { - wxFAIL_MSG(_T("window creation failed")); - } + wxCHECK_MSG( !m_needParent || parent, FALSE, _T("Need complete parent.") ); + /* this turns -1 into 20 so that a minimal window is + visible even although -1,-1 has been given as the + size of the window. the same trick is used in other + ports and should make debugging easier */ m_width = WidthDefault(size.x); m_height = HeightDefault(size.y); m_x = (int)pos.x; m_y = (int)pos.y; - if (!parent) /* some reasonable defaults */ + /* some reasonable defaults */ + if (!parent) { if (m_x == -1) { @@ -2034,6 +2034,8 @@ void wxWindow::PreCreation( wxWindow *parent, if (m_y < 10) m_y = 10; } } + + return TRUE; } void wxWindow::PostCreation() @@ -2213,6 +2215,8 @@ void wxWindow::OnInternalIdle() if (cursor.Ok() && m_currentGdkCursor != cursor) { + m_currentGdkCursor = cursor; + if (m_wxwindow) { GdkWindow *window = m_wxwindow->window; @@ -2232,8 +2236,6 @@ void wxWindow::OnInternalIdle() if (window) gdk_window_set_cursor( window, cursor.GetCursor() ); } - - m_currentGdkCursor = cursor; } UpdateWindowUI(); @@ -2260,17 +2262,20 @@ void wxWindow::DoSetClientSize( int width, int height ) int dw = 0; int dh = 0; - GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget); - GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); - #if (GTK_MINOR_VERSION == 0) - GtkWidget *viewport = scroll_window->viewport; - GtkStyleClass *viewport_class = viewport->style->klass; - if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER)) { - dw += 2 * viewport_class->xthickness; - dh += 2 * viewport_class->ythickness; + if (HasScrolling()) + { + GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget); + GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); + + GtkWidget *viewport = scroll_window->viewport; + GtkStyleClass *viewport_class = viewport->style->klass; + + dw += 2 * viewport_class->xthickness; + dh += 2 * viewport_class->ythickness; + } } #else if (HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER)) @@ -2290,6 +2295,9 @@ void wxWindow::DoSetClientSize( int width, int height ) we use this instead: range.slider_width = 11 + 2*2pts edge */ + GtkScrolledWindow *scroll_window = GTK_SCROLLED_WINDOW(m_widget); + GtkScrolledWindowClass *scroll_class = GTK_SCROLLED_WINDOW_CLASS( GTK_OBJECT(m_widget)->klass ); + if (scroll_window->vscrollbar_visible) { dw += 15; /* dw += vscrollbar->allocation.width; */ @@ -2836,6 +2844,15 @@ void wxWindow::ApplyWidgetStyle() { } +//----------------------------------------------------------------------------- +// Pop-up menu stuff +//----------------------------------------------------------------------------- + +static void gtk_pop_hide_callback( GtkWidget *WXUNUSED(widget), bool* is_waiting ) +{ + *is_waiting = FALSE; +} + static void SetInvokingWindow( wxMenu *menu, wxWindow *win ) { menu->SetInvokingWindow( win ); @@ -2863,7 +2880,7 @@ static void pop_pos_callback( GtkMenu * WXUNUSED(menu), *y = gs_pop_y; } -bool wxWindow::PopupMenu( wxMenu *menu, int x, int y ) +bool wxWindow::DoPopupMenu( wxMenu *menu, int x, int y ) { wxCHECK_MSG( m_widget != NULL, FALSE, _T("invalid window") ); @@ -2876,6 +2893,11 @@ bool wxWindow::PopupMenu( wxMenu *menu, int x, int y ) gs_pop_x = x; gs_pop_y = y; + bool is_waiting = TRUE; + + gtk_signal_connect( GTK_OBJECT(menu->m_menu), "hide", + GTK_SIGNAL_FUNC(gtk_pop_hide_callback), (gpointer)&is_waiting ); + gtk_menu_popup( GTK_MENU(menu->m_menu), (GtkWidget *) NULL, // parent menu shell @@ -2885,6 +2907,13 @@ bool wxWindow::PopupMenu( wxMenu *menu, int x, int y ) 0, // button used to activate it 0 //gs_timeLastClick // the time of activation ); + + while (is_waiting) + { + while (gtk_events_pending()) + gtk_main_iteration(); + } + return TRUE; }