[GRASS-dev] [GRASS GIS] #1141: GLWindow.OnPaint() broken on Windows

GRASS GIS trac at osgeo.org
Thu Aug 26 04:11:46 EDT 2010


#1141: GLWindow.OnPaint() broken on Windows
--------------------+-------------------------------------------------------
 Reporter:  glynn   |       Owner:  grass-dev@…              
     Type:  defect  |      Status:  new                      
 Priority:  normal  |   Milestone:  6.4.0                    
Component:  wxGUI   |     Version:  unspecified              
 Keywords:  nviz    |    Platform:  MSWindows XP             
      Cpu:  All     |  
--------------------+-------------------------------------------------------
 GLWindow.!OnPaint() (in nviz_mapdisp.py) calls:
 {{{
         dc = wx.PaintDC(self)
 }}}

 On Windows, wx.PaintDC() can only be called in an EVT_PAINT handler, but
 GLWindow.!OnPaint() is called from at least two other places:
 GLWindow.!OnMouseAction() (nviz_mapdisp.py:226) and
 !MapFrame.!AddToolbar() (mapdisp.py:417). The latter causes an exception
 when switching to "3D View":

 {{{
 Traceback (most recent call last):
   File "C:\msys\1.0\home\glynn\src\grass-7.0\dist.i686-pc-
 mingw32\etc\gui\wxpython\gui_modules\toolbars.py", line 322, in
 OnSelectTool
     self.parent.AddToolbar("nviz")
   File "C:\msys\1.0\home\glynn\src\grass-7.0\dist.i686-pc-
 mingw32\etc\gui\wxpython\gui_modules\mapdisp.py", line 417, in AddToolbar
     self.MapWindow3D.OnPaint(None) # -> LoadData
   File "C:\msys\1.0\home\glynn\src\grass-7.0\dist.i686-pc-
 mingw32\etc\gui\wxpython\gui_modules\nviz_mapdisp.py", line 163, in
 OnPaint
     dc = wx.PaintDC(self)
   File "C:\Program Files\Python26\lib\site-packages\wx-2.8-msw-
 unicode\wx\_gdi.py", line 4804, in __init__
     _gdi_.PaintDC_swiginit(self,_gdi_.new_PaintDC(*args, **kwargs))
 wx._core.PyAssertionError: C++ assertion "wxAssertFailure" failed at
 ..\..\src\msw\dcclient.cpp(219) in wxPaintDC::wxPaintDC(): wxPaintDC may
 be created only in EVT_PAINT handler!
 }}}

 I note that the created DC isn't actually used, so I'm assuming this it's
 being created to keep Windows happy (if you don't create a PaintDC,
 Windows won't "validate" the rectangle and will just keep send PAINT
 messages).

 I'm also assuming that !OnPaint() is being called to ensure that the state
 gets fully initialised. If you just want to force a redraw, you would
 normally do so asynchronously using wx.Window.Refresh(). But that won't
 work if you're counting on !OnPaint() having been called before
 proceeding.

 I think that !OnPaint() should probably be split into e.g. !OnPaint() and
 !DoPaint(), with the latter doing most of the work while the former simply
 creates the PaintDC then calls !DoPaint(). Making this change eliminates
 the above exception, although the wxGUI crashes shortly afterwards (in
 Gs_loadmap_as_short(), AFAICT).

 PS: I set the "component" field to wxGUI; is NVIZ for the !Tcl/Tk NVIZ or
 for either version?

-- 
Ticket URL: <http://trac.osgeo.org/grass/ticket/1141>
GRASS GIS <http://grass.osgeo.org>



More information about the grass-dev mailing list