_change_touch_mode gets called from on_touch_down where you commented, but it also gets called in other places using schedule_once.

The touch is only in parent coordinates while it travels down the on_touch_xxx chain, after that it's back to Window coordinates. So when _change_touch_mode is called from the callback, it's already in window coordinates. That's why when we call _change_touch_mode from within on_touch_xxx we have to set it to Window coordinates beforehand.