From: Václav Slavík <vslavik@fastmail.fm>
Date: Sat, 14 Aug 2004 22:42:23 +0000 (+0000)
Subject: attributes inheritance fix; apply style to both m_wxwindow and m_widget (patch 984858)
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/40bab631d2020265f7d0e5e872a2925757bc92aa

attributes inheritance fix; apply style to both m_wxwindow and m_widget (patch 984858)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28785 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

diff --git a/src/gtk/control.cpp b/src/gtk/control.cpp
index 5adb0823c6..da63b425be 100644
--- a/src/gtk/control.cpp
+++ b/src/gtk/control.cpp
@@ -103,7 +103,6 @@ void wxControl::PostCreation(const wxSize& size)
     //     GetBestSize is called.
     gtk_widget_ensure_style(m_widget);
     
-    InheritAttributes();
     ApplyWidgetStyle();
     SetInitialBestSize(size);
 }
diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp
index f0ad684ed7..14a770ef10 100644
--- a/src/gtk/window.cpp
+++ b/src/gtk/window.cpp
@@ -251,6 +251,16 @@ 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
@@ -1963,6 +1973,8 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
                                           GdkEvent *WXUNUSED(event),
                                           wxWindow *win )
 {
+    InFocusHandlerLock flock;
+
     DEBUG_MAIN_THREAD
 
     if (g_isIdle)
@@ -2057,6 +2069,8 @@ 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();
@@ -2946,6 +2960,8 @@ void wxWindowGTK::PostCreation()
                             (gpointer) this );
     }
 
+    InheritAttributes();
+
     m_hasVMT = TRUE;
 
     // unless the window was created initially hidden (i.e. Hide() had been
@@ -3606,6 +3622,14 @@ void wxWindowGTK::SetFocus()
         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))
@@ -4233,10 +4257,8 @@ void wxWindowGTK::ApplyWidgetStyle(bool forceStyle)
 void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style)
 {
     if (m_wxwindow)
-        // should we also do m_widget in this case?
         gtk_widget_modify_style(m_wxwindow, style);
-    else
-        gtk_widget_modify_style(m_widget, style);
+    gtk_widget_modify_style(m_widget, style);
 }
 
 
diff --git a/src/gtk1/control.cpp b/src/gtk1/control.cpp
index 5adb0823c6..da63b425be 100644
--- a/src/gtk1/control.cpp
+++ b/src/gtk1/control.cpp
@@ -103,7 +103,6 @@ void wxControl::PostCreation(const wxSize& size)
     //     GetBestSize is called.
     gtk_widget_ensure_style(m_widget);
     
-    InheritAttributes();
     ApplyWidgetStyle();
     SetInitialBestSize(size);
 }
diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp
index f0ad684ed7..14a770ef10 100644
--- a/src/gtk1/window.cpp
+++ b/src/gtk1/window.cpp
@@ -251,6 +251,16 @@ 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
@@ -1963,6 +1973,8 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
                                           GdkEvent *WXUNUSED(event),
                                           wxWindow *win )
 {
+    InFocusHandlerLock flock;
+
     DEBUG_MAIN_THREAD
 
     if (g_isIdle)
@@ -2057,6 +2069,8 @@ 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();
@@ -2946,6 +2960,8 @@ void wxWindowGTK::PostCreation()
                             (gpointer) this );
     }
 
+    InheritAttributes();
+
     m_hasVMT = TRUE;
 
     // unless the window was created initially hidden (i.e. Hide() had been
@@ -3606,6 +3622,14 @@ void wxWindowGTK::SetFocus()
         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))
@@ -4233,10 +4257,8 @@ void wxWindowGTK::ApplyWidgetStyle(bool forceStyle)
 void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style)
 {
     if (m_wxwindow)
-        // should we also do m_widget in this case?
         gtk_widget_modify_style(m_wxwindow, style);
-    else
-        gtk_widget_modify_style(m_widget, style);
+    gtk_widget_modify_style(m_widget, style);
 }