]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/menu.cpp
added and documented wxProcess::Open()
[wxWidgets.git] / src / gtk / menu.cpp
index 9f0f188abe918b26eb599b92b64e1038f300682c..586b2ea0340f6e4a080e6d388fc40865de8f0b74 100644 (file)
@@ -621,21 +621,25 @@ static void gtk_menu_clicked_callback( GtkWidget *widget, wxMenu *menu )
 
     if (item->IsCheckable())
     {
-        bool isReallyChecked = item->IsChecked();
-        if ( item->wxMenuItemBase::IsChecked() == isReallyChecked )
+        bool isReallyChecked = item->IsChecked(),
+             isInternallyChecked = item->wxMenuItemBase::IsChecked();
+
+        // ensure that the internal state is always consistent with what is
+        // shown on the screen
+        item->wxMenuItemBase::Check(isReallyChecked);
+
+        // we must not report the events for the radio button going up nor the
+        // events resulting from the calls to wxMenuItem::Check()
+        if ( (item->GetKind() == wxITEM_RADIO && !isReallyChecked) ||
+             (isInternallyChecked == isReallyChecked) )
         {
-            /* the menu item has been checked by calling wxMenuItem->Check() */
             return;
         }
-        else
-        {
-            /* the user pressed on the menu item -> report and make consistent
-             * again */
-            item->wxMenuItemBase::Check(isReallyChecked);
-        }
+
+        // the user pressed on the menu item: report the event below
     }
 
-    menu->SendEvent(item->GetId(), item->IsCheckable() ? item->IsChecked() : -1);
+    menu->SendEvent(id, item->IsCheckable() ? item->IsChecked() : -1);
 }
 
 //-----------------------------------------------------------------------------
@@ -771,6 +775,14 @@ wxString wxMenuItemBase::GetLabelFromText(const wxString& text)
 
 void wxMenuItem::SetText( const wxString& str )
 {
+    // Some optimization to avoid flicker
+    wxString oldLabel = m_text;
+    oldLabel = wxStripMenuCodes(oldLabel.BeforeFirst('\t'));
+    oldLabel.Replace(wxT("_"), wxT(""));
+    wxString label1 = wxStripMenuCodes(str.BeforeFirst('\t'));
+    if (oldLabel == label1)
+        return;
+    
     DoSetText(str);
 
     if (m_menuItem)