simple xdg-open replacement with fallback