diff --git a/fsl/fsleyes/gl/__init__.py b/fsl/fsleyes/gl/__init__.py
index dffe3c51cb9c945045850fcbb9641f23906871df..3eb4ab3f10c8b3feb47d86165178d827d37e266b 100644
--- a/fsl/fsleyes/gl/__init__.py
+++ b/fsl/fsleyes/gl/__init__.py
@@ -189,10 +189,8 @@ package also contains the following:
 
 
 import logging
-import platform
 import os
 
-import fsl.utils.async    as async
 import fsl.utils.platform as fslplatform
 
 
@@ -625,28 +623,12 @@ class WXGLCanvasTarget(object):
         """
 
         import wx
+        import wx.glcanvas as wxgl
 
         self._glReady = False
-        self.Bind(wx.EVT_PAINT, self._mainDraw)
-
-        # Using the Apple software renderer under OSX,
-        # we need to call refresh on the idle loop,
-        # otherwise refresh of multiple canvases (i.e.
-        # the OrthoPanel). gets all screwed up. Don't
-        # know why.
-        if platform.system() == 'Darwin' and \
-           'software' in fslplatform.glRenderer.lower():
-
-            def refresh(*a):
-                async.idle(self.Refresh)
-
-        # On other platforms/renderers,
-        # we can call Refresh directly
-        else:
-            def refresh(*a):
-                self.Refresh()
 
-        self._refresh = refresh
+        self.__context = wxgl.GLContext(self, other=getWXGLContext()[0])
+        self.Bind(wx.EVT_PAINT, self._mainDraw)
     
 
     def _initGL(self):
@@ -704,15 +686,14 @@ class WXGLCanvasTarget(object):
         log.debug('Setting context target to {} ({})'.format(
             type(self).__name__, id(self)))
         
-        getWXGLContext()[0].SetCurrent(self)
+        self.__context.SetCurrent(self)
         return True
 
         
     def _refresh(self, *a):
-        """Triggers a redraw via the :meth:`_draw` method.
-
-        .. note:: This method is dynamically assigned in :meth:`__init__`.
-        """
+        """Triggers a redraw via the :meth:`_draw` method. """
+        self.Refresh()
+        
         
     def _postDraw(self):
         """Called after the scene has been rendered. Swaps the front/back
diff --git a/fsl/fsleyes/gl/wxglslicecanvas.py b/fsl/fsleyes/gl/wxglslicecanvas.py
index d56f5dd0eccc05283b1b56a60444800a317ab86a..91a0c15b925a28c203c789526331f8750641dec8 100644
--- a/fsl/fsleyes/gl/wxglslicecanvas.py
+++ b/fsl/fsleyes/gl/wxglslicecanvas.py
@@ -37,14 +37,18 @@ class WXGLSliceCanvas(slicecanvas.SliceCanvas,
         slicecanvas.SliceCanvas.__init__(self, overlayList, displayCtx, zax)
         fslgl.WXGLCanvasTarget .__init__(self)
 
-        # When the canvas is resized, we have to update
-        # the display bounds to preserve the aspect ratio
-        def onResize(ev):
-            self._updateDisplayBounds()
-            ev.Skip()
-        self.Bind(wx.EVT_SIZE, onResize)
-
-        
+        self.Bind(wx.EVT_SIZE, self.__onResize)
+
+
+    def __onResize(self, ev):
+        """Called on ``wx.EVT_SIZE`` events, when the canvas is resized. When
+        the canvas is resized, we have to update the display bounds to preserve
+        the aspect ratio.
+        """
+        self._updateDisplayBounds()
+        ev.Skip()
+
+
     def Show(self, show):
         """Overrides ``GLCanvas.Show``. When running over SSH/X11, it doesn't
         seem to be possible to hide a ``GLCanvas`` - the most recent scene