]> git.saurik.com Git - wxWidgets.git/commitdiff
attributes inheritance fix; apply style to both m_wxwindow and m_widget (patch 984858)
authorVáclav Slavík <vslavik@fastmail.fm>
Sat, 14 Aug 2004 22:42:23 +0000 (22:42 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sat, 14 Aug 2004 22:42:23 +0000 (22:42 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28785 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/gtk/control.cpp
src/gtk/window.cpp
src/gtk1/control.cpp
src/gtk1/window.cpp

index 5adb0823c6ce5e15253bf8314300bfa37ebddc26..da63b425be45a95111b1360e7057b9470611a828 100644 (file)
@@ -103,7 +103,6 @@ void wxControl::PostCreation(const wxSize& size)
     //     GetBestSize is called.
     gtk_widget_ensure_style(m_widget);
     
-    InheritAttributes();
     ApplyWidgetStyle();
     SetInitialBestSize(size);
 }
index f0ad684ed777b296cfea7e1a7001a3b50d6b2158..14a770ef1058810523b2c25932a70be046af39d2 100644 (file)
@@ -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);
 }
 
 
index 5adb0823c6ce5e15253bf8314300bfa37ebddc26..da63b425be45a95111b1360e7057b9470611a828 100644 (file)
@@ -103,7 +103,6 @@ void wxControl::PostCreation(const wxSize& size)
     //     GetBestSize is called.
     gtk_widget_ensure_style(m_widget);
     
-    InheritAttributes();
     ApplyWidgetStyle();
     SetInitialBestSize(size);
 }
index f0ad684ed777b296cfea7e1a7001a3b50d6b2158..14a770ef1058810523b2c25932a70be046af39d2 100644 (file)
@@ -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);
 }