diff --git a/.editorconfig b/.editorconfig
index d16d726..5d97ae7 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -20,3 +20,6 @@ max_line_length = 99
continuation_indent_size = 4
indent_brace_style = 1TBS
curly_bracket_next_line = false
+
+[*.py]
+indent_style = space
diff --git a/web-greeter/__init__.py b/web-greeter/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/web-greeter/bridge/Greeter.py b/web-greeter/bridge/Greeter.py
new file mode 100644
index 0000000..161601f
--- /dev/null
+++ b/web-greeter/bridge/Greeter.py
@@ -0,0 +1,159 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# LightDMGreeter.py
+#
+# Copyright © 2017 Antergos
+#
+# This file is part of Web Greeter.
+#
+# Web Greeter is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Web Greeter is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# The following additional terms are in effect as per Section 7 of the license:
+#
+# The preservation of all legal notices and author attributions in
+# the material or in the Appropriate Legal Notices displayed
+# by works containing it is required.
+#
+# You should have received a copy of the GNU General Public License
+# along with Web Greeter; If not, see .
+
+# Standard Lib
+
+# 3rd-Party Libs
+import gi
+gi.require_version('LightDM', '1')
+from gi.repository import LightDM
+from PyQt5.QtCore import QVariant
+from whither.bridge import BridgeObject, prop
+
+# This Application
+from . import (
+ language_to_dict,
+ layout_to_dict,
+ session_to_dict,
+ user_to_dict,
+)
+
+
+LightDMGreeter = LightDM.Greeter()
+LightDMUserList = LightDM.UserList()
+
+
+class Greeter(BridgeObject):
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(name='LightDMGreeter', *args, **kwargs)
+
+ @prop(str)
+ def authentication_user(self):
+ return LightDMGreeter.get_authentication_user() or ''
+
+ @prop(bool)
+ def autologin_guest(self):
+ return LightDMGreeter.get_autologin_guest_hint()
+
+ @prop(int)
+ def autologin_timeout(self):
+ return LightDMGreeter.get_autologin_timeout_hint()
+
+ @prop(str)
+ def autologin_user(self):
+ return LightDMGreeter.get_autologin_user_hint()
+
+ @prop(bool)
+ def can_hibernate(self):
+ return LightDM.get_can_hibernate()
+
+ @prop(bool)
+ def can_restart(self):
+ return LightDM.get_can_restart()
+
+ @prop(bool)
+ def can_shutdown(self):
+ return LightDM.get_can_shutdown()
+
+ @prop(bool)
+ def can_suspend(self):
+ return LightDM.get_can_suspend()
+
+ @prop(str)
+ def default_session(self):
+ return LightDMGreeter.get_default_session_hint()
+
+ @prop(bool)
+ def has_guest_account(self):
+ return LightDMGreeter.get_has_guest_account_hint()
+
+ @prop(bool)
+ def hide_users(self):
+ return LightDMGreeter.get_hide_users_hint()
+
+ @prop(str)
+ def hostname(self):
+ return LightDM.get_hostname()
+
+ @prop(bool)
+ def in_authentication(self):
+ return LightDMGreeter.get_in_authentication()
+
+ @prop(bool)
+ def is_authenticated(self):
+ return LightDMGreeter.get_is_authenticated()
+
+ @prop(QVariant)
+ def language(self):
+ return language_to_dict(LightDM.get_language())
+
+ @prop(list)
+ def languages(self):
+ return [language_to_dict(lang) for lang in LightDM.get_languages()]
+
+ @prop(QVariant)
+ def layout(self):
+ return layout_to_dict(LightDM.get_layout())
+
+ @prop(list)
+ def layouts(self):
+ return [layout_to_dict(layout) for layout in LightDM.get_layouts()]
+
+ @prop(bool)
+ def lock_hint(self):
+ return LightDMGreeter.get_lock_hint()
+
+ @prop(list)
+ def remote_sessions(self):
+ return [session_to_dict(session) for session in LightDM.get_remote_sessions()]
+
+ @prop(bool)
+ def select_guest_hint(self):
+ return LightDMGreeter.get_select_guest_hint()
+
+ @prop(str)
+ def select_user_hint(self):
+ return LightDMGreeter.get_select_user_hint() or ''
+
+ @prop(list)
+ def sessions(self):
+ return [session_to_dict(session) for session in LightDM.get_sessions()]
+
+ @prop(bool)
+ def show_manual_login_hint(self):
+ return LightDMGreeter.get_show_manual_login_hint()
+
+ @prop(bool)
+ def show_remote_login_hint(self):
+ return LightDMGreeter.get_show_remote_login_hint()
+
+ @prop(list)
+ def users(self):
+ return [user_to_dict(user) for user in LightDMUserList.get_users()]
+
diff --git a/web-greeter/bridge/__init__.py b/web-greeter/bridge/__init__.py
new file mode 100644
index 0000000..85c6f2b
--- /dev/null
+++ b/web-greeter/bridge/__init__.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# __init__.py
+#
+# Copyright © 2017 Antergos
+#
+# This file is part of Web Greeter.
+#
+# Web Greeter is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Web Greeter is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# The following additional terms are in effect as per Section 7 of the license:
+#
+# The preservation of all legal notices and author attributions in
+# the material or in the Appropriate Legal Notices displayed
+# by works containing it is required.
+#
+# You should have received a copy of the GNU General Public License
+# along with Web Greeter; If not, see .
+
+
+def language_to_dict(lang):
+ return dict(code=lang.get_code(), name=lang.get_name(), territory=lang.get_territory())
+
+
+def layout_to_dict(layout):
+ return dict(
+ description=layout.get_description(),
+ name=layout.get_name(),
+ short_description=layout.get_short_description()
+ )
+
+
+def session_to_dict(session):
+ return dict(
+ comment=session.get_comment(),
+ key=session.get_key(),
+ name=session.get_name(),
+ type=session.get_session_type(),
+ )
+
+
+def user_to_dict(user):
+ return dict(
+ display_name=user.get_display_name(),
+ home_directory=user.get_home_directory(),
+ image=user.get_image(),
+ language=user.get_language(),
+ layout=user.get_layout(),
+ logged_in=user.get_logged_in(),
+ session=user.get_session(),
+ username=user.get_name(),
+ # ---->>> BEGIN DEPRECATED! <<<----
+ name=user.get_name(),
+ real_name=user.get_real_name(),
+ # ---->>> END DEPRECATED! <<<----
+ )
diff --git a/web-greeter/greeter.py b/web-greeter/greeter.py
new file mode 100644
index 0000000..a5eddd1
--- /dev/null
+++ b/web-greeter/greeter.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# greeter.py
+#
+# Copyright © 2017 Antergos
+#
+# This file is part of Web Greeter.
+#
+# Web Greeter is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# Web Greeter is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# The following additional terms are in effect as per Section 7 of the license:
+#
+# The preservation of all legal notices and author attributions in
+# the material or in the Appropriate Legal Notices displayed
+# by works containing it is required.
+#
+# You should have received a copy of the GNU General Public License
+# along with Web Greeter; If not, see .
+
+# Standard Lib
+import configparser
+import os
+
+# 3rd-Party Libs
+from whither.app import App
+from whither.base.data import AttributeDict
+
+# This Application
+from bridge.Greeter import Greeter
+
+
+BASE_DIR = os.path.dirname(os.path.realpath(__file__))
+CONFIG_FILE = os.path.join(BASE_DIR, 'whither.yml')
+
+
+class WebGreeter(App):
+ _user_config = AttributeDict({})
+ _greeter = None
+
+ def __init__(self, *args, **kwargs):
+ super().__init__('WebGreeter', config_file=CONFIG_FILE, debug=True, *args, **kwargs)
+ self.get_and_save_user_config()
+
+ self._greeter = Greeter()
+ self._web_container.bridge_objects = (self._greeter,)
+
+ self._web_container.initialize_bridge_objects()
+ self.load_theme()
+
+ def get_and_save_user_config(self):
+ config = configparser.ConfigParser()
+
+ config.read('/etc/lightdm/web-greeter.conf')
+
+ for section in config.sections():
+ self._user_config[section] = {}
+
+ for key in config[section]:
+ self._user_config[section][key] = config[section][key]
+
+ def load_theme(self):
+ theme_url = 'file://{0}/{1}/index.html'.format(
+ self.config.themes_dir,
+ self._user_config.greeter.webkit_theme
+ )
+
+ self._web_container.load(theme_url)
+
+
+if __name__ == '__main__':
+ greeter = WebGreeter()
+
+ greeter.run()
diff --git a/web-greeter/whither.yml b/web-greeter/whither.yml
new file mode 100644
index 0000000..607c14e
--- /dev/null
+++ b/web-greeter/whither.yml
@@ -0,0 +1,31 @@
+# Whither (Universal Linux Apps) Configuration
+# The top-level keys in this file should be application names. This makes it possible to
+# install multiple Whither-based apps on a single system, each with their own configuration.
+
+# App Name
+WebGreeter:
+ # Whither's Config
+ whither:
+ # Unique identifier string (dbus-style)
+ app_id: com.antergos.web-greeter
+ toolkit: auto # auto|qt|gtk
+ # A valid URI for an HTML page that will be loaded when the app starts.
+ entry_point:
+ autoload: False
+ url: ''
+ window:
+ width: 1120
+ height: 720
+ initial_state: maximized # normal|maximized|minimized|fullscreen
+ # Whether or not the window should show standard titlebar and action buttons.
+ decorated: False
+ # Whether or not the window should stay on top of all other windows.
+ stays_on_top: False
+ title: Web Greeter for LightDM
+ icon: /usr/share/cnchi/data/icons/48x48/cnchi.png
+ toolbar:
+ enabled: False
+
+ # App's Config
+ app:
+ themes_dir: /usr/share/lightdm-webkit/themes