libcvd-members
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libcvd-members] gvars3 gvars3/GUI_Motif.h src/GUI_Motif.cc


From: Edward Rosten
Subject: [libcvd-members] gvars3 gvars3/GUI_Motif.h src/GUI_Motif.cc
Date: Wed, 13 May 2009 09:45:41 +0000

CVSROOT:        /cvsroot/libcvd
Module name:    gvars3
Changes by:     Edward Rosten <edrosten>        09/05/13 09:45:41

Modified files:
        gvars3         : GUI_Motif.h 
        src            : GUI_Motif.cc 

Log message:
        Fixed a segfault or two

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gvars3/gvars3/GUI_Motif.h?cvsroot=libcvd&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gvars3/src/GUI_Motif.cc?cvsroot=libcvd&r1=1.5&r2=1.6

Patches:
Index: gvars3/GUI_Motif.h
===================================================================
RCS file: /cvsroot/libcvd/gvars3/gvars3/GUI_Motif.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- gvars3/GUI_Motif.h  12 May 2009 16:37:41 -0000      1.7
+++ gvars3/GUI_Motif.h  13 May 2009 09:45:41 -0000      1.8
@@ -92,15 +92,16 @@
     Widget wRowCol;
     int nWidth;
     int nHeight;
+       bool die;
     std::map<Widget, std::string> PushButtonMap;
     std::map<Widget, monitorMapStruct> MonitorMap;
     std::map<Widget, toggleMapStruct > ToggleButtonMap;
     std::map<Widget, sliderMapStruct > SliderMap;
+    std::map<Widget, std::pair<std::string, std::string> > SpinMap;
   } GUIWindowStruct;
   
   std::map<std::string, GUIWindowStruct> mmWindows;
   std::list<std::string> labels;
-  std::map<Widget, std::pair<std::string, std::string> > SpinMap;
   
 };
 

Index: src/GUI_Motif.cc
===================================================================
RCS file: /cvsroot/libcvd/gvars3/src/GUI_Motif.cc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- src/GUI_Motif.cc    12 May 2009 16:37:41 -0000      1.5
+++ src/GUI_Motif.cc    13 May 2009 09:45:41 -0000      1.6
@@ -104,6 +104,7 @@
        };      
     }
   gws.nHeight = 30;
+  gws.die=0;
   
   pthread_mutex_lock((pthread_mutex_t*)mpMutex);
   
@@ -239,7 +240,7 @@
   mpGUI->UnRegisterCommand(sWindowName + ".AddLabel");
   mpGUI->UnRegisterCommand(sWindowName + ".Destroy");
   XtUnrealizeWidget(mmWindows[sWindowName].wTopLevel);
-  mmWindows.erase(sWindowName);
+  mmWindows[sWindowName].die=1;
   DoMotifEvents();
   
 };
@@ -347,7 +348,7 @@
   
   
   w = XmCreateTextField(mmWindows[sWindowName].wRowCol, szName,al,ac);
-  SpinMap[w] = make_pair(vs[0], string(""));
+  mmWindows[sWindowName].SpinMap[w] = make_pair(vs[0], string(""));
   XtManageChild(w);
 
   XtAddCallback(w, XmNvalueChangedCallback, TextBoxCB, this);
@@ -377,8 +378,10 @@
 // Handles the actual callback work
 void GUI_Motif::TextBox(Widget w, XtPointer xtpCall)
 {
+       for(map<string, GUIWindowStruct>::iterator i=mmWindows.begin(); i != 
mmWindows.end(); i++)
+       {
   
-    if(SpinMap.count(w))
+               if(i->second.SpinMap.count(w))
     {
          char* c;
          XmTextPosition p;
@@ -390,18 +393,19 @@
 
          p=1;
 
-         GV3::set_var(SpinMap[w].first, cs.c_str());
-         string s = GV3::get_var(SpinMap[w].first);
+                       GV3::set_var(i->second.SpinMap[w].first, cs.c_str());
+                       string s = GV3::get_var(i->second.SpinMap[w].first);
 
          if(s != c)
          {
-             SpinMap[w].second = s;
+                               i->second.SpinMap[w].second = s;
              XtRemoveCallback(w, XmNvalueChangedCallback, TextBoxCB, this);
              p = min((int)p, (int)s.size());
              XtVaSetValues(w, XmNvalue, s.c_str(), XmNcursorPosition, p, NULL);
              XtAddCallback(w, XmNvalueChangedCallback, TextBoxCB, this);
          }
     }
+       }
 }
 
 
////////////////////////////////////////////////////////////////////////////////
@@ -826,10 +830,8 @@
          delete pdNewValue;
        };
       
-    };
-  DoMotifEvents();
 
-   for(map<Widget, pair<string, string> >::iterator i=SpinMap.begin(); i != 
SpinMap.end(); i++)
+       for(map<Widget, pair<string, string> >::iterator 
i=w->second.SpinMap.begin(); i != w->second.SpinMap.end(); i++)
    {
        if(i->second.second != GV3::get_var(i->second.first))
        {
@@ -846,6 +848,20 @@
        }
    }
 
+      
+    };
+  DoMotifEvents();
+  
+  //Now kill any windows in need of killing
+  for(map<string,GUIWindowStruct>::iterator tmp, 
w=mmWindows.begin();w!=mmWindows.end();)
+  {
+       tmp = w;
+       w++;
+       if(tmp->second.die)
+               mmWindows.erase(tmp);
+  }
+
+  DoMotifEvents();
 } 
 void* GUI_Motif::GUI_Motif_Thread_CB(void* ptr)
 {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]