// 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
#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())
GdkEvent *WXUNUSED(event),
wxWindow *win )
{
- InFocusHandlerLock flock;
-
DEBUG_MAIN_THREAD
if (g_isIdle)
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();
m_clipPaintRegion = FALSE;
+ m_needsStyleChange = false;
+
m_cursor = *wxSTANDARD_CURSOR;
#ifdef __WXGTK20__
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();
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))
// 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();
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)
{
}
// 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;
}
DoApplyWidgetStyle(style);
gtk_rc_style_unref(style);
}
+
+ // Style change may affect GTK+'s size calculation:
+ InvalidateBestSize();
}
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
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;
gtk_main_iteration();
}
+ gtk_signal_disconnect(GTK_OBJECT(menu->m_menu), handler);
+
return true;
}