[Aptitude-svn-commit] r3760 - in branches/aptitude-0.3/aptitude: . src/vscreen

Daniel Burrows dburrows at costa.debian.org
Mon Aug 8 22:45:32 UTC 2005


Author: dburrows
Date: Mon Aug  8 22:45:29 2005
New Revision: 3760

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc
Log:
Don't crash removing the last widget in a table.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Mon Aug  8 22:45:29 2005
@@ -1,5 +1,10 @@
 2005-08-08  Daniel Burrows  <dburrows at debian.org>
 
+	* src/vscreen/vs_table.cc:
+
+	  Be more careful in handling iterators so that the table routines
+	  don't crash when the last widget is removed.
+
 	* src/vscreen/vs_bin.cc, src/vscreen/vscreen_widget.cc, src/vscreen/vscreen_widget.h, src/vscreen/vs_menubar.cc, src/vscreen/vs_minibuf_win.cc, src/vscreen/vs_multiplex.cc, src/vscreen/vs_stacked.cc, src/vscreen/vs_table.cc:
 
 	  Make sure that all containers destroy their contents in their

Modified: branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/vscreen/vs_table.cc	Mon Aug  8 22:45:29 2005
@@ -238,35 +238,42 @@
 
 void vs_table::rem_widget(const vs_widget_ref &w)
 {
-  for(childlist::iterator i=children.begin(); i!=children.end(); ++i)
-    if(i->w==w)
+  for(childlist::iterator i = children.begin(); i != children.end(); ++i)
+    if(i->w == w)
       {
-	if(i==focus)
+	if(i == focus)
 	  {
 	    if(get_isfocussed())
 	      focus->w->unfocussed();
 
 	    focus++;
 
-	    while(focus!=children.end() && focus->w->focus_me())
+	    while(focus != children.end() && (focus == i ||
+					      focus->w->focus_me()))
 	      focus++;
 
-	    if(focus==children.end())
+	    if(focus == children.end())
 	      {
-		focus=children.begin();
+		focus = children.begin();
 
-		while(focus!=children.end() && focus->w->focus_me())
+		while(focus != children.end() && (focus == i ||
+						  focus->w->focus_me()))
 		  focus++;
 	      }
 
-	    if(focus!=children.end() && get_isfocussed())
-	      focus->w->focussed();
+	    if(focus != children.end() && get_isfocussed())
+	      {
+		assert(focus != i);
+		focus->w->focussed();
+	      }
 	  }
 
 	i->shown_conn.disconnect();
 	i->hidden_conn.disconnect();
 
 	children.erase(i);
+
+
 	vscreen_queuelayout();
 	w->set_owner(NULL);
 



More information about the Aptitude-svn-commit mailing list