prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  widget.WindowTabs default selected task indicator produces invalid pango markup
  # Issue description
  
  The default _selected task indicator_ (``("<", ">")``) for ``widget.WindowTabs`` produces invalid pango markup and thus the call to ``pango_parse_markup`` fails.
  
  It leads to invalid tag names for single word window names (e.g. ``<terminal>``) or invalid syntax for multiword names (e.g. ``<qtile - Mozilla Firefox>``).
  
  Possible fixes:
  
  - change default to e.g. ``('[', ']')`` or different foreground color
  - default to no markup
  - at least add a note in the documentation, but defaults should be working
  
  If this is wanted, I'm happy to prepare a PR based on the outcome of the discussion here.
  
  # Qtile version
  
  Qtile version ``0.15.1``. Also [latest revision of libqtile/widget/windowtabs.py](https://github.com/qtile/qtile/blob/d47347ad0f37b4a5735faa8b7061f484e8cf81d9/libqtile/widget/windowtabs.py) (d47347a)
  
  # Configuration
  
  Use default ``widget.WindowTabs()``
  
  
  </issue>
  <code>
  [start of libqtile/widget/windowtabs.py]
  1 # Copyright (c) 2012-2013 Craig Barnes
  2 # Copyright (c) 2012 roger
  3 # Copyright (c) 2012, 2014 Tycho Andersen
  4 # Copyright (c) 2014 Sean Vig
  5 # Copyright (c) 2014 Adi Sieker
  6 #
  7 # Permission is hereby granted, free of charge, to any person obtaining a copy
  8 # of this software and associated documentation files (the "Software"), to deal
  9 # in the Software without restriction, including without limitation the rights
  10 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11 # copies of the Software, and to permit persons to whom the Software is
  12 # furnished to do so, subject to the following conditions:
  13 #
  14 # The above copyright notice and this permission notice shall be included in
  15 # all copies or substantial portions of the Software.
  16 #
  17 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23 # SOFTWARE.
  24 
  25 from .. import hook, bar
  26 from . import base
  27 
  28 
  29 class WindowTabs(base._TextBox):
  30     """
  31         Displays the name of each window in the current group.
  32         Contrary to TaskList this is not an interactive widget.
  33         The window that currently has focus is highlighted.
  34     """
  35     orientations = base.ORIENTATION_HORIZONTAL
  36     defaults = [
  37         ("separator", " | ", "Task separator text."),
  38         ("selected", ("<", ">"), "Selected task indicator"),
  39     ]
  40 
  41     def __init__(self, **config):
  42         base._TextBox.__init__(self, width=bar.STRETCH, **config)
  43         self.add_defaults(WindowTabs.defaults)
  44         if not isinstance(self.selected, (tuple, list)):
  45             self.selected = (self.selected, self.selected)
  46 
  47     def _configure(self, qtile, bar):
  48         base._TextBox._configure(self, qtile, bar)
  49         hook.subscribe.client_name_updated(self.update)
  50         hook.subscribe.focus_change(self.update)
  51         hook.subscribe.float_change(self.update)
  52 
  53     def button_press(self, x, y, button):
  54         self.bar.screen.group.cmd_next_window()
  55 
  56     def update(self, *args):
  57         names = []
  58         for w in self.bar.screen.group.windows:
  59             state = ''
  60             if w is None:
  61                 pass
  62             elif w.maximized:
  63                 state = '[] '
  64             elif w.minimized:
  65                 state = '_ '
  66             elif w.floating:
  67                 state = 'V '
  68             task = "%s%s" % (state, w.name if w and w.name else " ")
  69             if w is self.bar.screen.group.current_window:
  70                 task = task.join(self.selected)
  71             names.append(task)
  72         self.text = self.separator.join(names)
  73         self.bar.draw()
  74
  [end of libqtile/widget/windowtabs.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/libqtile/widget/windowtabs.py b/libqtile/widget/windowtabs.py
  --- a/libqtile/widget/windowtabs.py
  +++ b/libqtile/widget/windowtabs.py
  @@ -35,7 +35,7 @@
       orientations = base.ORIENTATION_HORIZONTAL
       defaults = [
           ("separator", " | ", "Task separator text."),
  -        ("selected", ("<", ">"), "Selected task indicator"),
  +        ("selected", ("<b>", "</b>"), "Selected task indicator"),
       ]
   
       def __init__(self, **config):
  
verification_info: {"golden_diff": "diff --git a/libqtile/widget/windowtabs.py b/libqtile/widget/windowtabs.py\n--- a/libqtile/widget/windowtabs.py\n+++ b/libqtile/widget/windowtabs.py\n@@ -35,7 +35,7 @@\n     orientations = base.ORIENTATION_HORIZONTAL\n     defaults = [\n         (\"separator\", \" | \", \"Task separator text.\"),\n-        (\"selected\", (\"<\", \">\"), \"Selected task indicator\"),\n+        (\"selected\", (\"<b>\", \"</b>\"), \"Selected task indicator\"),\n     ]\n \n     def __init__(self, **config):\n", "issue": "widget.WindowTabs default selected task indicator produces invalid pango markup\n# Issue description\r\n\r\nThe default _selected task indicator_ (``(\"<\", \">\")``) for ``widget.WindowTabs`` produces invalid pango markup and thus the call to ``pango_parse_markup`` fails.\r\n\r\nIt leads to invalid tag names for single word window names (e.g. ``<terminal>``) or invalid syntax for multiword names (e.g. ``<qtile - Mozilla Firefox>``).\r\n\r\nPossible fixes:\r\n\r\n- change default to e.g. ``('[', ']')`` or different foreground color\r\n- default to no markup\r\n- at least add a note in the documentation, but defaults should be working\r\n\r\nIf this is wanted, I'm happy to prepare a PR based on the outcome of the discussion here.\r\n\r\n# Qtile version\r\n\r\nQtile version ``0.15.1``. Also [latest revision of libqtile/widget/windowtabs.py](https://github.com/qtile/qtile/blob/d47347ad0f37b4a5735faa8b7061f484e8cf81d9/libqtile/widget/windowtabs.py) (d47347a)\r\n\r\n# Configuration\r\n\r\nUse default ``widget.WindowTabs()``\r\n\n", "before_files": [{"content": "# Copyright (c) 2012-2013 Craig Barnes\n# Copyright (c) 2012 roger\n# Copyright (c) 2012, 2014 Tycho Andersen\n# Copyright (c) 2014 Sean Vig\n# Copyright (c) 2014 Adi Sieker\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nfrom .. import hook, bar\nfrom . import base\n\n\nclass WindowTabs(base._TextBox):\n    \"\"\"\n        Displays the name of each window in the current group.\n        Contrary to TaskList this is not an interactive widget.\n        The window that currently has focus is highlighted.\n    \"\"\"\n    orientations = base.ORIENTATION_HORIZONTAL\n    defaults = [\n        (\"separator\", \" | \", \"Task separator text.\"),\n        (\"selected\", (\"<\", \">\"), \"Selected task indicator\"),\n    ]\n\n    def __init__(self, **config):\n        base._TextBox.__init__(self, width=bar.STRETCH, **config)\n        self.add_defaults(WindowTabs.defaults)\n        if not isinstance(self.selected, (tuple, list)):\n            self.selected = (self.selected, self.selected)\n\n    def _configure(self, qtile, bar):\n        base._TextBox._configure(self, qtile, bar)\n        hook.subscribe.client_name_updated(self.update)\n        hook.subscribe.focus_change(self.update)\n        hook.subscribe.float_change(self.update)\n\n    def button_press(self, x, y, button):\n        self.bar.screen.group.cmd_next_window()\n\n    def update(self, *args):\n        names = []\n        for w in self.bar.screen.group.windows:\n            state = ''\n            if w is None:\n                pass\n            elif w.maximized:\n                state = '[] '\n            elif w.minimized:\n                state = '_ '\n            elif w.floating:\n                state = 'V '\n            task = \"%s%s\" % (state, w.name if w and w.name else \" \")\n            if w is self.bar.screen.group.current_window:\n                task = task.join(self.selected)\n            names.append(task)\n        self.text = self.separator.join(names)\n        self.bar.draw()\n", "path": "libqtile/widget/windowtabs.py"}]}