Index: src/Perks/BasicMagPerk.py
===================================================================
--- src/Perks/BasicMagPerk.py	(revision 550)
+++ src/Perks/BasicMagPerk.py	(working copy)
@@ -340,43 +340,57 @@
     if roi is None:
       return (0, 0, 0, 0)
     else:
-      return  roi
+      return roi
   
-  def getDesiredFocalPoint(self, por, x_padding=5):
+  def getDesiredFocalPoint(self, por, track_mouse=True, x_padding=5):
     '''
     Calculates the desired focal point for a specific POR.
     And retuns current focal point, and desired focal point.
 
     @param por: POR that's focal point needs to be determined.
     @type por: L{POR.POR}
+    @param track_mouse: Take the current position of the mouse pointer into
+      acount so that the magnifier doesn't jerk?
+    @type track_mouse: boolean
     @param x_padding: X axis padding
     @type x_padding: integer
     '''
+    # get the extents and position of the target POR
     width, height = self.getAccVisualExtents(por)
     pos_x, pos_y = self.getAccPosition()
+    # get the last known mouse position
     m_x, m_y = self.perk.mousepos
+    # get the focal point within the target POR
     end_x, end_y = self.getAccVisualPoint(por)
     
     # calculate start_pos
+    # get the left, top, right, and bottom coords of the magnifier zoom reg.
     roi_x1, roi_y1, roi_x2, roi_y2 = self.perk.getPos()
+    # compute the width
     roi_width = (roi_x2 - roi_x1)/2
+    # start position is the center point
     start_pos = ((roi_x1 + roi_x2)/2, (roi_y1 + roi_y2)/2)
     
     # calculate end_pos (end_x, end_y)
     x_offset = width/2 - roi_width + x_padding
-    # if mouse is within control
-    if (m_x >= pos_x-self.FUDGE) and (m_x <= (pos_x+width+self.FUDGE)) and \
-             (m_y >= pos_y-self.FUDGE) and (m_y <= (pos_y+height+self.FUDGE)):
+    
+    if (track_mouse and 
+        (m_x >= pos_x-self.FUDGE) and (m_x <= (pos_x+width+self.FUDGE)) and 
+        (m_y >= pos_y-self.FUDGE) and (m_y <= (pos_y+height+self.FUDGE))):
+      # if the mouse pointer is within the control and we want to consider that
+      # make the end position of the jump the mouse pointer position so that
+      # the magnifier doesn't jump to some other location in the control and
+      # then jump back again; the user is likely a mouse user anyways
       end_x = m_x
       end_y = m_y
-    else:
-      if width < roi_x2 - roi_x1:
-        pass
-      elif end_x - x_offset < roi_width:
-        end_x = roi_width
-      else:
-        end_x = end_x - x_offset
-   
+    # @todo: PP: what does this do? ask Eitan
+    #else:
+      #if width < (roi_x2 - roi_x1):
+        #pass
+      #elif (end_x - x_offset) < roi_width:
+        #end_x = roi_width
+      #else:
+        #end_x = end_x - x_offset
     return start_pos, (end_x, end_y)
 
 class HandleFocusChange(Task.FocusTask):
@@ -433,7 +447,6 @@
     
     self.perk.parent_por_select = self.getParentAcc()
       
-    
 class HandleMouseChange(Task.MouseTask):
   '''
   Moves the magnifier to coordinate of mouse
@@ -447,7 +460,6 @@
     self.perk.mousepos = pos
     self.perk.goTo(pos)
    
-
 class PanTimer(Task.TimerTask):
   '''
   Execute on timed intervals. Used to animate pan magnifier movement.
@@ -462,8 +474,9 @@
   Synchronizes the magnified area to the text at the pointer when reviewing.
   '''
   def execute(self, **kwargs):
-    if self.perk.getState().MagReview:
+    if self.getPerkSettingVal('MagReview'):
       result = self.getTempVal('review')
       if result in (AEConstants.REVIEW_OK, AEConstants.REVIEW_WRAP):
-        start_pos, end_pos = self.perk.getDesiredFocalPoint(self.task_por)
+        start_pos, end_pos = self.perk.getDesiredFocalPoint(self.task_por ,\
+                                                            track_mouse=False)
         self.perk.goTo(end_pos, start_pos)
Index: src/Devices/GnomeMagDevice.py
===================================================================
--- src/Devices/GnomeMagDevice.py	(revision 549)
+++ src/Devices/GnomeMagDevice.py	(working copy)
@@ -358,12 +358,12 @@
 
   def _getPos(self, zoom):
     '''
-    Get ROI of zoomer.
+    Get ROI of the zoomer including left, top, right, bottom coordinates.
     
     @param zoom: Zoomer to adjust.
     @type zoom: GNOME.Magnifier.ZoomRegion
-    @return: Position in (x, y)
-    @rtype: tuple
+    @return: Bounds of the zoomer region
+    @rtype: 4-tuple of int
     '''
     try:
       roi = zoom.getROI()
Index: src/Task/Tools/View.py
===================================================================
--- src/Task/Tools/View.py	(revision 549)
+++ src/Task/Tools/View.py	(working copy)
@@ -524,6 +524,7 @@
     except LookupError:
       raise PORError
     except NotImplementedError:
+      print "not implemented for ", por
       return None
    
   def getAccPosition(self, por=None):
Index: src/Adapters/ATSPI/DefaultInfo.py
===================================================================
--- src/Adapters/ATSPI/DefaultInfo.py	(revision 549)
+++ src/Adapters/ATSPI/DefaultInfo.py	(working copy)
@@ -263,9 +263,21 @@
     @raise NotImplementedError: When this accessible does not support the
       Component interface
     '''
-    c = Interfaces.IComponent(self.accessible)
-    bb = c.getExtents(Constants.DESKTOP_COORDS)
-    return bb.x+bb.width/2, bb.y+bb.height/2
+    try:
+      text = Interfaces.IText(self.accessible)
+    except NotImplementedError:
+      text = None
+      
+    if text:
+      # use the character extents to track to the current character
+      off = self.char_offset
+      x, y, w, h = text.getCharacterExtents(off, Constants.DESKTOP_COORDS)
+      return x, y
+    else:
+      # just center on the widget
+      c = Interfaces.IComponent(self.accessible)
+      bb = c.getExtents(Constants.DESKTOP_COORDS)
+      return bb.x+bb.width/2, bb.y+bb.height/2
   
   @pyLinAcc.errorToLookupError
   def getAccPosition(self):
Index: src/Adapters/ATSPI/ContainerAdapter.py
===================================================================
--- src/Adapters/ATSPI/ContainerAdapter.py	(revision 549)
+++ src/Adapters/ATSPI/ContainerAdapter.py	(working copy)
@@ -365,8 +365,10 @@
     try:
       c = self.accessible.getChildAtIndex(self.item_offset)
     except AttributeError:
+      # not a valid child
       raise IndexError
-    return IAccessibleInfo(POR(c)).getAccVisualExtents()
+    # keep the character offset into the child
+    return IAccessibleInfo(POR(c,None,self.char_offset)).getAccVisualExtents()
 
   @pyLinAcc.errorToLookupError
   def getAccVisualPoint(self):
@@ -383,8 +385,10 @@
     try:
       c = self.accessible.getChildAtIndex(self.item_offset)
     except AttributeError:
+      # not a valid child
       raise IndexError
-    return IAccessibleInfo(POR(c)).getAccVisualPoint()
+    # keep the character offset into the child
+    return IAccessibleInfo(POR(c,None,self.char_offset)).getAccVisualPoint() 
   
 class ContainerAccActionAdapter(DefaultAccActionAdapter):
   '''
