X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/40bab631d2020265f7d0e5e872a2925757bc92aa..db7c5931ed25a56f4eaef1076b158ca5d30b9a37:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 14a770ef10..0b957569d0 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -251,16 +251,6 @@ static bool g_activeFrameLostFocus = FALSE; // yet, defer setting the focus to idle time. wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL; -// When GTK+ focus_in/out signal is being processed, we shouldn't do -// any focus changes -static bool gs_inFocusSignalHandler = false; - -struct InFocusHandlerLock -{ - InFocusHandlerLock() { gs_inFocusSignalHandler = true; } - ~InFocusHandlerLock() { gs_inFocusSignalHandler = false; } -}; - // if we detect that the app has got/lost the focus, we set this variable to // either TRUE or FALSE and an activate event will be sent during the next // OnIdle() call and it is reset to -1: this value means that we shouldn't @@ -642,7 +632,7 @@ static void gtk_window_draw_callback( GtkWidget *widget, #ifndef __WXUNIVERSAL__ GtkPizza *pizza = GTK_PIZZA (widget); - if (win->GetThemeEnabled()) + if (win->GetThemeEnabled() && win->GetBackgroundStyle() == wxBG_STYLE_SYSTEM) { wxWindow *parent = win->GetParent(); while (parent && !parent->IsTopLevel()) @@ -1347,24 +1337,13 @@ static void gtk_wxwindow_commit_cb (GtkIMContext *context, } #if wxUSE_UNICODE - event.m_uniChar = g_utf8_get_char( str ); - - // Backward compatible for ISO-8859 - if (event.m_uniChar < 256) - event.m_keyCode = event.m_uniChar; - wxLogTrace(TRACE_KEYS, _T("IM sent character '%c'"), event.m_uniChar); + const wxWCharBuffer data = wxConvUTF8.cMB2WC( (char*)str ); #else - wchar_t unistr[2]; - unistr[0] = g_utf8_get_char(str); - unistr[1] = 0; - wxCharBuffer ansistr(wxConvLocal.cWC2MB(unistr)); - // We cannot handle characters that cannot be represented in - // current locale's charset in non-Unicode mode: - if (ansistr.data() == NULL) - return; - event.m_keyCode = ansistr[0u]; - wxLogTrace(TRACE_KEYS, _T("IM sent character '%c'"), (wxChar)event.m_keyCode); + const wxWCharBuffer wdata = wxConvUTF8.cMB2WC( (char*)str ); + const wxCharBuffer data = wxConvLocal.cWC2MB( wdata ); #endif // wxUSE_UNICODE + if( !(const wxChar*)data ) + return; bool ret = false; @@ -1372,16 +1351,28 @@ static void gtk_wxwindow_commit_cb (GtkIMContext *context, wxWindow *parent = window; while (parent && !parent->IsTopLevel()) parent = parent->GetParent(); - if (parent) - { - event.SetEventType( wxEVT_CHAR_HOOK ); - ret = parent->GetEventHandler()->ProcessEvent( event ); - } - if (!ret) + for( const wxChar* pstr = data; *pstr; pstr++ ) { - event.SetEventType(wxEVT_CHAR); - ret = window->GetEventHandler()->ProcessEvent( event ); +#if wxUSE_UNICODE + event.m_uniChar = *pstr; + // Backward compatible for ISO-8859 + event.m_keyCode = *pstr < 256 ? event.m_uniChar : 0; + wxLogTrace(TRACE_KEYS, _T("IM sent character '%c'"), event.m_uniChar); +#else + event.m_keyCode = *pstr; +#endif // wxUSE_UNICODE + if (parent) + { + event.SetEventType( wxEVT_CHAR_HOOK ); + ret = parent->GetEventHandler()->ProcessEvent( event ); + } + + if (!ret) + { + event.SetEventType(wxEVT_CHAR); + ret = window->GetEventHandler()->ProcessEvent( event ); + } } } #endif @@ -1973,8 +1964,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) { - InFocusHandlerLock flock; - DEBUG_MAIN_THREAD if (g_isIdle) @@ -2069,8 +2058,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget, static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk_event, wxWindowGTK *win ) { DEBUG_MAIN_THREAD - - InFocusHandlerLock flock; if (g_isIdle) wxapp_install_idle_handler(); @@ -2660,6 +2647,8 @@ void wxWindowGTK::Init() m_clipPaintRegion = FALSE; + m_needsStyleChange = false; + m_cursor = *wxSTANDARD_CURSOR; #ifdef __WXGTK20__ @@ -3133,6 +3122,13 @@ void wxWindowGTK::OnInternalIdle() if ( m_dirtyTabOrder ) RealizeTabOrder(); #endif + // Update style if the window was not yet realized + // and SetBackgroundStyle(wxBG_STYLE_CUSTOM) was called + if (m_needsStyleChange) + { + SetBackgroundStyle(GetBackgroundStyle()); + m_needsStyleChange = false; + } // Update invalidated regions. GtkUpdate(); @@ -3615,21 +3611,12 @@ void wxWindowGTK::GetTextExtent( const wxString& string, void wxWindowGTK::SetFocus() { wxCHECK_RET( m_widget != NULL, wxT("invalid window") ); - if ( m_hasFocus ) { // don't do anything if we already have focus return; } - if (gs_inFocusSignalHandler) - { - wxLogTrace(TRACE_FOCUS, - _T("in focus handler, delaying SetFocus(%p)"), this); - g_delayedFocus = this; - return; - } - if (m_wxwindow) { if (!GTK_WIDGET_HAS_FOCUS (m_wxwindow)) @@ -3957,7 +3944,7 @@ void wxWindowGTK::GtkSendPaintEvents() // widget to draw on GtkPizza *pizza = GTK_PIZZA (m_wxwindow); - if (GetThemeEnabled()) + if (GetThemeEnabled() && GetBackgroundStyle() == wxBG_STYLE_SYSTEM) { // find ancestor from which to steal background wxWindow *parent = GetParent(); @@ -4011,7 +3998,7 @@ void wxWindowGTK::GtkSendPaintEvents() wxEraseEvent erase_event( GetId(), &dc ); erase_event.SetEventObject( this ); - if (!GetEventHandler()->ProcessEvent(erase_event)) + if (!GetEventHandler()->ProcessEvent(erase_event) && GetBackgroundStyle() != wxBG_STYLE_CUSTOM) { if (!g_eraseGC) { @@ -4136,8 +4123,9 @@ bool wxWindowGTK::SetBackgroundColour( const wxColour &colour ) } // apply style change (forceStyle=true so that new style is applied - // even if the bg colour changed from valid to wxNullColour): - ApplyWidgetStyle(true); + // even if the bg colour changed from valid to wxNullColour) + if (GetBackgroundStyle() != wxBG_STYLE_CUSTOM) + ApplyWidgetStyle(true); return true; } @@ -4252,6 +4240,9 @@ void wxWindowGTK::ApplyWidgetStyle(bool forceStyle) DoApplyWidgetStyle(style); gtk_rc_style_unref(style); } + + // Style change may affect GTK+'s size calculation: + InvalidateBestSize(); } void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style) @@ -4261,6 +4252,43 @@ void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style) gtk_widget_modify_style(m_widget, style); } +bool wxWindowGTK::SetBackgroundStyle(wxBackgroundStyle style) +{ + wxWindowBase::SetBackgroundStyle(style); + + if (style == wxBG_STYLE_CUSTOM) + { + GdkWindow *window = (GdkWindow*) NULL; + if (m_wxwindow) + window = GTK_PIZZA(m_wxwindow)->bin_window; + else + window = GetConnectWidget()->window; + + if (window) + { + // Make sure GDK/X11 doesn't refresh the window + // automatically. + gdk_window_set_back_pixmap( window, None, False ); +#ifdef __X__ + Display* display = GDK_WINDOW_DISPLAY(window); + XFlush(display); +#endif + m_needsStyleChange = false; + } + else + // Do in OnIdle, because the window is not yet available + m_needsStyleChange = true; + + // Don't apply widget style, or we get a grey background + } + else + { + // apply style change (forceStyle=true so that new style is applied + // even if the bg colour changed from valid to wxNullColour): + ApplyWidgetStyle(true); + } + return true; +} //----------------------------------------------------------------------------- // Pop-up menu stuff @@ -4323,10 +4351,10 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) bool is_waiting = true; - gtk_signal_connect( GTK_OBJECT(menu->m_menu), - "hide", - GTK_SIGNAL_FUNC(gtk_pop_hide_callback), - (gpointer)&is_waiting ); + gulong handler = gtk_signal_connect( GTK_OBJECT(menu->m_menu), + "hide", + GTK_SIGNAL_FUNC(gtk_pop_hide_callback), + (gpointer)&is_waiting ); wxPoint pos; gpointer userdata; @@ -4363,6 +4391,8 @@ bool wxWindowGTK::DoPopupMenu( wxMenu *menu, int x, int y ) gtk_main_iteration(); } + gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler); + return true; }