def __find_children_under_mouse(self, x, y):
previously_under_mouse = self.__children_under_mouse<EOL>if self.__mouse_grabber is not None:<EOL><INDENT>self.__children_under_mouse = {self.__mouse_grabber}<EOL><DEDENT>else:<EOL><INDENT>self.__children_under_mouse = {<EOL>w for w in self.do_find_children_near_mouse(x, y)<EOL>if w.is_visible and w.is_under_mouse(x, y)<EOL>}<EOL><DEDENT>return Widget.__ChildrenUnderMouse(<EOL>previously_under_mouse, self.__children_under_mouse)<EOL>
Track and return the children that are under the given mouse 
coordinate.

If the mouse is being grabbed by a widget, then only that widget will 
be returned.  Otherwise, all the children will be searched and the ones 
that are under the mouse (and not hidden) will be returned.  The 
returned data structure will also indicate which children were 
previously under the mouse, which is important for propagating 
`on_mouse_enter` and `on_mouse_leave` events.  

You can change the boundaries to any particular widget class by 
reimplementing the `is_under_mouse()` method.  Making widgets that seem 
to be circular is a common reason to do this, for example.  You can 
also change how the children widgets are searched by reimplementing the 
`find_children_near_mouse()` method.  The `Grid` widget does this to 
replace the default linear-time search with a constant-time one that 
takes advantage of the grids predictable geometry.