prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Fake screens
  [This part of the documentation](https://github.com/qtile/qtile/blob/ed7198a5fb5438110f81a8c6ecc0e6289676c057/libqtile/config.py#L231-L232) mentions "fake screens", and the term is also found [in the code](https://github.com/qtile/qtile/blob/7c2a88fba68bdcf6f25dfb5494a74afc475d674e/libqtile/manager.py#L357-L373).
  
  What are they? How to use them?
  
  We need to document answers to those questions, and then make sure they work correctly.
  
  See #1192 for this last point.
  
  --- 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/confreader.py`
  Content:
  ```
  1 # coding: utf-8
  2 #
  3 # Copyright (c) 2008, Aldo Cortesi <aldo@corte.si>
  4 # Copyright (c) 2011, Andrew Grigorev <andrew@ei-grad.ru>
  5 #
  6 # All rights reserved.
  7 #
  8 # Permission is hereby granted, free of charge, to any person obtaining a copy
  9 # of this software and associated documentation files (the "Software"), to deal
  10 # in the Software without restriction, including without limitation the rights
  11 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12 # copies of the Software, and to permit persons to whom the Software is
  13 # furnished to do so, subject to the following conditions:
  14 #
  15 # The above copyright notice and this permission notice shall be included in
  16 # all copies or substantial portions of the Software.
  17 #
  18 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  24 # SOFTWARE.
  25 import os
  26 import sys
  27 
  28 
  29 class ConfigError(Exception):
  30     pass
  31 
  32 
  33 class Config(object):
  34     settings_keys = [
  35         "keys",
  36         "mouse",
  37         "groups",
  38         "dgroups_key_binder",
  39         "dgroups_app_rules",
  40         "follow_mouse_focus",
  41         "focus_on_window_activation",
  42         "cursor_warp",
  43         "layouts",
  44         "floating_layout",
  45         "screens",
  46         "main",
  47         "auto_fullscreen",
  48         "widget_defaults",
  49         "extension_defaults",
  50         "bring_front_click",
  51         "wmname",
  52     ]
  53 
  54     def __init__(self, **settings):
  55         """Create a Config() object from settings
  56 
  57         Only attributes found in Config.settings_keys will be added to object.
  58         config attribute precedence is 1.) **settings 2.) self 3.) default_config
  59         """
  60         from .resources import default_config
  61         default = vars(default_config)
  62         for key in self.settings_keys:
  63             try:
  64                 value = settings[key]
  65             except KeyError:
  66                 value = getattr(self, key, default[key])
  67             setattr(self, key, value)
  68         self._init_deprecated(**settings)
  69 
  70     def _init_deprecated(self, extensions=None, **settings):
  71         "Initialize deprecated settings."
  72         if extensions:          # Deprecated in v0.10.7
  73             import warnings
  74             warnings.warn("'extentions' is deprecated, use "
  75                           "'extension_defaults'", DeprecationWarning)
  76             self.extension_defaults.update(extensions.get('dmenu', {}))
  77 
  78     @classmethod
  79     def from_file(cls, path):
  80         "Create a Config() object from the python file located at path."
  81         try:
  82             sys.path.insert(0, os.path.dirname(path))
  83             config = __import__(os.path.basename(path)[:-3])
  84         except Exception:
  85             import traceback
  86             from .log_utils import logger
  87             logger.exception('Could not import config file %r', path)
  88             tb = traceback.format_exc()
  89             raise ConfigError(tb)
  90         return cls(**vars(config))
  91
  ```
  --- 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()
  
  ```
  
golden_diff: diff --git a/libqtile/confreader.py b/libqtile/confreader.py
  --- a/libqtile/confreader.py
  +++ b/libqtile/confreader.py
  @@ -66,6 +66,7 @@
                   value = getattr(self, key, default[key])
               setattr(self, key, value)
           self._init_deprecated(**settings)
  +        self._init_fake_screens(**settings)
   
       def _init_deprecated(self, extensions=None, **settings):
           "Initialize deprecated settings."
  @@ -75,6 +76,14 @@
                             "'extension_defaults'", DeprecationWarning)
               self.extension_defaults.update(extensions.get('dmenu', {}))
   
  +    def _init_fake_screens(self, **settings):
  +        " Initiaize fake_screens if they are set."
  +        try:
  +            value = settings['fake_screens']
  +            setattr(self, 'fake_screens', value)
  +        except KeyError:
  +            pass
  +
       @classmethod
       def from_file(cls, path):
           "Create a Config() object from the python file located at path."
  
verification_info: {"golden_diff": "diff --git a/libqtile/confreader.py b/libqtile/confreader.py\n--- a/libqtile/confreader.py\n+++ b/libqtile/confreader.py\n@@ -66,6 +66,7 @@\n                 value = getattr(self, key, default[key])\n             setattr(self, key, value)\n         self._init_deprecated(**settings)\n+        self._init_fake_screens(**settings)\n \n     def _init_deprecated(self, extensions=None, **settings):\n         \"Initialize deprecated settings.\"\n@@ -75,6 +76,14 @@\n                           \"'extension_defaults'\", DeprecationWarning)\n             self.extension_defaults.update(extensions.get('dmenu', {}))\n \n+    def _init_fake_screens(self, **settings):\n+        \" Initiaize fake_screens if they are set.\"\n+        try:\n+            value = settings['fake_screens']\n+            setattr(self, 'fake_screens', value)\n+        except KeyError:\n+            pass\n+\n     @classmethod\n     def from_file(cls, path):\n         \"Create a Config() object from the python file located at path.\"\n", "issue": "Fake screens\n[This part of the documentation](https://github.com/qtile/qtile/blob/ed7198a5fb5438110f81a8c6ecc0e6289676c057/libqtile/config.py#L231-L232) mentions \"fake screens\", and the term is also found [in the code](https://github.com/qtile/qtile/blob/7c2a88fba68bdcf6f25dfb5494a74afc475d674e/libqtile/manager.py#L357-L373).\r\n\r\nWhat are they? How to use them?\r\n\r\nWe need to document answers to those questions, and then make sure they work correctly.\r\n\r\nSee #1192 for this last point.\n", "before_files": [{"content": "# coding: utf-8\n#\n# Copyright (c) 2008, Aldo Cortesi <aldo@corte.si>\n# Copyright (c) 2011, Andrew Grigorev <andrew@ei-grad.ru>\n#\n# All rights reserved.\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.\nimport os\nimport sys\n\n\nclass ConfigError(Exception):\n    pass\n\n\nclass Config(object):\n    settings_keys = [\n        \"keys\",\n        \"mouse\",\n        \"groups\",\n        \"dgroups_key_binder\",\n        \"dgroups_app_rules\",\n        \"follow_mouse_focus\",\n        \"focus_on_window_activation\",\n        \"cursor_warp\",\n        \"layouts\",\n        \"floating_layout\",\n        \"screens\",\n        \"main\",\n        \"auto_fullscreen\",\n        \"widget_defaults\",\n        \"extension_defaults\",\n        \"bring_front_click\",\n        \"wmname\",\n    ]\n\n    def __init__(self, **settings):\n        \"\"\"Create a Config() object from settings\n\n        Only attributes found in Config.settings_keys will be added to object.\n        config attribute precedence is 1.) **settings 2.) self 3.) default_config\n        \"\"\"\n        from .resources import default_config\n        default = vars(default_config)\n        for key in self.settings_keys:\n            try:\n                value = settings[key]\n            except KeyError:\n                value = getattr(self, key, default[key])\n            setattr(self, key, value)\n        self._init_deprecated(**settings)\n\n    def _init_deprecated(self, extensions=None, **settings):\n        \"Initialize deprecated settings.\"\n        if extensions:          # Deprecated in v0.10.7\n            import warnings\n            warnings.warn(\"'extentions' is deprecated, use \"\n                          \"'extension_defaults'\", DeprecationWarning)\n            self.extension_defaults.update(extensions.get('dmenu', {}))\n\n    @classmethod\n    def from_file(cls, path):\n        \"Create a Config() object from the python file located at path.\"\n        try:\n            sys.path.insert(0, os.path.dirname(path))\n            config = __import__(os.path.basename(path)[:-3])\n        except Exception:\n            import traceback\n            from .log_utils import logger\n            logger.exception('Could not import config file %r', path)\n            tb = traceback.format_exc()\n            raise ConfigError(tb)\n        return cls(**vars(config))\n", "path": "libqtile/confreader.py"}], "after_files": [{"content": "# coding: utf-8\n#\n# Copyright (c) 2008, Aldo Cortesi <aldo@corte.si>\n# Copyright (c) 2011, Andrew Grigorev <andrew@ei-grad.ru>\n#\n# All rights reserved.\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.\nimport os\nimport sys\n\n\nclass ConfigError(Exception):\n    pass\n\n\nclass Config(object):\n    settings_keys = [\n        \"keys\",\n        \"mouse\",\n        \"groups\",\n        \"dgroups_key_binder\",\n        \"dgroups_app_rules\",\n        \"follow_mouse_focus\",\n        \"focus_on_window_activation\",\n        \"cursor_warp\",\n        \"layouts\",\n        \"floating_layout\",\n        \"screens\",\n        \"main\",\n        \"auto_fullscreen\",\n        \"widget_defaults\",\n        \"extension_defaults\",\n        \"bring_front_click\",\n        \"wmname\",\n    ]\n\n    def __init__(self, **settings):\n        \"\"\"Create a Config() object from settings\n\n        Only attributes found in Config.settings_keys will be added to object.\n        config attribute precedence is 1.) **settings 2.) self 3.) default_config\n        \"\"\"\n        from .resources import default_config\n        default = vars(default_config)\n        for key in self.settings_keys:\n            try:\n                value = settings[key]\n            except KeyError:\n                value = getattr(self, key, default[key])\n            setattr(self, key, value)\n        self._init_deprecated(**settings)\n        self._init_fake_screens(**settings)\n\n    def _init_deprecated(self, extensions=None, **settings):\n        \"Initialize deprecated settings.\"\n        if extensions:          # Deprecated in v0.10.7\n            import warnings\n            warnings.warn(\"'extentions' is deprecated, use \"\n                          \"'extension_defaults'\", DeprecationWarning)\n            self.extension_defaults.update(extensions.get('dmenu', {}))\n\n    def _init_fake_screens(self, **settings):\n        \" Initiaize fake_screens if they are set.\"\n        try:\n            value = settings['fake_screens']\n            setattr(self, 'fake_screens', value)\n        except KeyError:\n            pass\n\n    @classmethod\n    def from_file(cls, path):\n        \"Create a Config() object from the python file located at path.\"\n        try:\n            sys.path.insert(0, os.path.dirname(path))\n            config = __import__(os.path.basename(path)[:-3])\n        except Exception:\n            import traceback\n            from .log_utils import logger\n            logger.exception('Could not import config file %r', path)\n            tb = traceback.format_exc()\n            raise ConfigError(tb)\n        return cls(**vars(config))\n", "path": "libqtile/confreader.py"}]}