We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN 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()``


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `libqtile/widget/windowtabs.py`
Content:
```
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 FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

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):

{"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"}], "after_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\", (\"<b>\", \"</b>\"), \"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"}]}