diff --git a/themes/antergos/index.html b/themes/antergos/index.html
index ab718f8..0fc8a0d 100644
--- a/themes/antergos/index.html
+++ b/themes/antergos/index.html
@@ -50,8 +50,8 @@
-
-
+
+
diff --git a/themes/antergos/js/greeter.js b/themes/antergos/js/greeter.js
index 7948f7b..5033561 100644
--- a/themes/antergos/js/greeter.js
+++ b/themes/antergos/js/greeter.js
@@ -182,36 +182,28 @@ class AntergosThemeUtils {
* Get some values from `lightdm-webkit2-greeter.conf` and save them for later.
*/
init_config_values() {
- var logo, user_image, debug, background_images, background_images_dir;
-
- if ( 'undefined' !== typeof( config ) ) {
-
- logo = config.get_str( 'branding', 'logo' ) || 'img/antergos.png';
- user_image = config.get_str( 'branding', 'user_image' ) || 'img/antergos-logo-user.png';
- background_images_dir = config.get_str( 'branding', 'background_images' ) || '/usr/share/backgrounds';
- debug = config.get_bool( 'greeter', 'debug_mode' ) || false;
+ if ( 'undefined' === typeof( greeter_config ) ) {
+ greeter_config = {branding: {}, greeter: {}};
+ }
- if ( background_images_dir ) {
- background_images = greeterutil.dirlist( background_images_dir ) || [];
- _util.log(background_images);
- }
+ this.logo = greeter_config.branding.logo || 'img/antergos.png';
+ this.user_image = greeter_config.branding.user_image || 'img/antergos-logo-user.png';
+ this.background_images_dir = greeter_config.branding.background_images || '/usr/share/backgrounds';
+ this.debug = greeter_config.greeter.debug_mode || false;
+ this.background_images = [];
- if ( background_images && background_images.length ) {
- background_images = this.find_images( background_images );
- }
+ if ( this.background_images_dir ) {
+ theme_utils.dirlist( this.background_images_dir, true, ( result ) => {
+ this.background_images = result || [];
+ _util.log( this.background_images );
+ } );
}
-
- this.logo = logo;
- this.debug = debug;
- this.user_image = user_image;
- this.background_images = background_images;
- this.background_images_dir = background_images_dir;
}
is_not_empty( value ) {
let empty_values = [null, 'null', undefined, 'undefined'];
- return empty_values.findIndex(v => v === value) === -1;
+ return ! empty_values.includes(value);
}
@@ -219,7 +211,7 @@ class AntergosThemeUtils {
var images = [],
subdirs = [];
- for ( var file of dirlist ) {
+ for ( let file of dirlist ) {
if ( file.match( /(png|PNG)|(jpg|JPEG)|(bmp|BMP)/ ) ) {
images.push( file );
} else if ( ! file.match( /\w+\.\w+/ ) ) {
@@ -227,14 +219,17 @@ class AntergosThemeUtils {
}
}
- if ( subdirs.length && ! images.length && this.recursion < 3 ) {
+ if ( subdirs.length && images.length < 20 && this.recursion < 3 ) {
this.recursion++;
- for ( var dir of subdirs ) {
- var list = greeterutil.dirlist( dir );
- if ( list && list.length ) {
- images.push.apply( images, this.find_images( list ) );
- }
+ for ( let dir of subdirs ) {
+ theme_utils.dirlist( dir, ( result ) => {
+ if ( result && result.length ) {
+ images.push.apply( images, this.find_images( result ) );
+ }
+ } );
+
+
}
}
@@ -896,7 +891,7 @@ class AntergosTheme {
/**
* Initialize the theme once the window has loaded.
*/
-$( window ).on('load', () => {
+$( window ).on( 'GreeterReady', () => {
new AntergosThemeUtils();
new AntergosTheme();
} );
diff --git a/themes/antergos/package.json b/themes/antergos/package.json
index 70e8c60..a0108eb 100644
--- a/themes/antergos/package.json
+++ b/themes/antergos/package.json
@@ -18,7 +18,7 @@
"config": {},
"wg_theme": {
"display_name": "Default",
- "supports": ["2.2", "3"],
+ "supports": ["3"],
"entry_point": "./index.html",
"styles": [
"bootswatch-paper",
diff --git a/web-greeter/bridge/Greeter.py b/web-greeter/bridge/Greeter.py
index 63dd870..2acf1a0 100644
--- a/web-greeter/bridge/Greeter.py
+++ b/web-greeter/bridge/Greeter.py
@@ -53,12 +53,22 @@ LightDMUsers = LightDM.UserList()
class Greeter(BridgeObject):
- authentication_complete = bridge.signal(LightDM.Greeter)
- autologin_timer_expired = bridge.signal(LightDM.Greeter)
- idle = bridge.signal(LightDM.Greeter)
- reset = bridge.signal(LightDM.Greeter)
- show_message = bridge.signal((LightDM.Greeter, str, str), arguments=('text', 'type'))
- show_prompt = bridge.signal((LightDM.Greeter, str, str), arguments=('text', 'type'))
+ authentication_complete = bridge.signal(LightDM.Greeter, name='authentication_complete')
+ autologin_timer_expired = bridge.signal(LightDM.Greeter, name='autologin_timer_expired')
+
+ idle = bridge.signal(LightDM.Greeter, name='idle')
+ reset = bridge.signal(LightDM.Greeter, name='reset')
+
+ show_message = bridge.signal(
+ (LightDM.Greeter, str, LightDM.MessageType),
+ name='show_message',
+ arguments=('text', 'type')
+ )
+ show_prompt = bridge.signal(
+ (LightDM.Greeter, str, LightDM.PromptType),
+ name='show_prompt',
+ arguments=('text', 'type')
+ )
def __init__(self, themes_dir, *args, **kwargs):
super().__init__(name='LightDMGreeter', *args, **kwargs)
@@ -81,8 +91,8 @@ class Greeter(BridgeObject):
LightDMGreeter.connect('autologin-timer-expired', self.authentication_complete.emit)
LightDMGreeter.connect('idle', self.idle.emit)
LightDMGreeter.connect('reset', self.reset.emit)
- LightDMGreeter.connect('show-message', self.reset.emit)
- LightDMGreeter.connect('show-prompt', self.reset.emit)
+ LightDMGreeter.connect('show-message', self.show_message.emit)
+ LightDMGreeter.connect('show-prompt', self.show_prompt.emit)
@bridge.prop(str)
def authentication_user(self):
diff --git a/web-greeter/bridge/ThemeUtils.py b/web-greeter/bridge/ThemeUtils.py
index 0a655e0..9ae43e9 100644
--- a/web-greeter/bridge/ThemeUtils.py
+++ b/web-greeter/bridge/ThemeUtils.py
@@ -28,7 +28,7 @@
# Standard Lib
import os
-import os.path as path
+from glob import glob
# 3rd-Party Libs
from whither.bridge import (
@@ -47,14 +47,14 @@ class ThemeUtils(BridgeObject):
self._user_config = user_config
self._greeter = greeter
- @bridge.method(Variant)
- def dirlist(self, dir_path):
+ @bridge.method(str, bool, name='dirlist', result=Variant)
+ def dirlist(self, dir_path, only_images=True):
if not dir_path or not isinstance(dir_path, str):
return []
- dir_path = path.realpath(path.normpath(dir_path))
+ dir_path = os.path.realpath(os.path.normpath(dir_path))
- if not path.isabs(dir_path) or not path.isdir(dir_path):
+ if not os.path.isabs(dir_path) or not os.path.isdir(dir_path):
return []
allowed = False
@@ -73,7 +73,15 @@ class ThemeUtils(BridgeObject):
if not allowed:
return []
- return (path.join(dir_path, f) for f in os.listdir(dir_path))
-
+ if only_images:
+ file_types = ('jpg', 'jpeg', 'png', 'gif', 'bmp')
+ result = [
+ glob('{0}/**/*.{1}'.format(dir_path, ftype), recursive=True)
+ for ftype in file_types
+ ]
+ result = [image for image_list in result for image in image_list]
+ else:
+ result = [os.path.join(dir_path, f) for f in os.listdir(dir_path)]
+ return result
diff --git a/web-greeter/resources/js/ThemeUtils.js b/web-greeter/resources/js/ThemeUtils.js
index 820ea9b..13e8976 100644
--- a/web-greeter/resources/js/ThemeUtils.js
+++ b/web-greeter/resources/js/ThemeUtils.js
@@ -25,11 +25,6 @@
* along with lightdm-webkit2-greeter; If not, see .
*/
-/*if ( 'undefined' === typeof window.navigator.languages ) {
- window.navigator.languages = [ window.navigator.language ];
-}*/
-
-
let localized_invalid_date = null,
time_language = null,
@@ -109,20 +104,20 @@ class ThemeUtils {
* * Is located within the greeter's shared data directory (`/var/lib/lightdm-data`).
* * Is located in `/tmp`.
*
- * @param {string} path The abs path to desired directory.
- *
- * @returns {string[]} List of abs paths for the files and directories found in `path`.
+ * @param {string} path The abs path to desired directory.
+ * @param {boolean} only_images Include only images in the results. Default `true`.
+ * @param {function(string[])} callback Callback function to be called with the result.
*/
- dirlist( path ) {
+ dirlist( path, only_images = true, callback ) {
let allowed = false;
if ( '' === path || 'string' !== typeof path ) {
console.log('[ERROR] theme_utils.dirlist(): path must be a non-empty string!');
- return [];
+ return callback([]);
} else if ( null !== path.match(/^[^/].+/) ) {
console.log('[ERROR] theme_utils.dirlist(): path must be absolute!');
- return[];
+ return callback([]);
}
if ( null !== path.match(/\/\.+(?=\/)/) ) {
@@ -136,15 +131,15 @@ class ThemeUtils {
if ( ! Object.keys( allowed_dirs ).some( dir => path.startsWith( allowed_dirs[dir] ) ) ) {
console.log(`[ERROR] theme_utils.dirlist(): path is not allowed: ${path}`);
- return [];
+ return callback([]);
}
try {
- return _ThemeUtils.dirlist( path );
+ return _ThemeUtils.dirlist( path, only_images, callback );
} catch( err ) {
console.log( `[ERROR] theme_utils.dirlist(): ${err}` );
- return [];
+ return callback([]);
}
}
diff --git a/web-greeter/resources/js/bootstrap.js b/web-greeter/resources/js/bootstrap.js
index 1d3b909..b5fb702 100644
--- a/web-greeter/resources/js/bootstrap.js
+++ b/web-greeter/resources/js/bootstrap.js
@@ -25,12 +25,12 @@
* along with lightdm-webkit2-greeter; If not, see .
*/
-let _channel;
-const _ready_event = new Event( 'GreeterReady' );
+(() => {
+ let _channel;
+ const _ready_event = new Event( 'GreeterReady' );
-function initialize() {
- new QWebChannel( qt.webChannelTransport, channel => {
+ function channel_ready_cb( channel ) {
_channel = channel;
/**
@@ -75,11 +75,14 @@ function initialize() {
*/
window.greeterutil = window.theme_utils;
- setTimeout(function() {
+ setTimeout( function () {
window.dispatchEvent( _ready_event );
- }, 400);
+ }, 2 );
+ }
+
+ document.addEventListener( 'DOMContentLoaded', ( event ) => {
+ new QWebChannel( qt.webChannelTransport, channel_ready_cb );
});
-}
+})();
-setTimeout( initialize, 50 );
diff --git a/web-greeter/whither.yml b/web-greeter/whither.yml
index 607c14e..ad9e3f2 100644
--- a/web-greeter/whither.yml
+++ b/web-greeter/whither.yml
@@ -28,4 +28,4 @@ WebGreeter:
# App's Config
app:
- themes_dir: /usr/share/lightdm-webkit/themes
+ themes_dir: /home/dustin/github/antergos/lightdm-webkit2-greeter/themes