@ -0,0 +1,68 @@ |
|||||||
|
h1. lightdm-webkit-theme-antergos |
||||||
|
|
||||||
|
|
||||||
|
h2. Overview |
||||||
|
|
||||||
|
Official LightDM Webkit Greeter Theme of Antergos Linux |
||||||
|
|
||||||
|
h2. Screenshot |
||||||
|
<img src="screenshot.png" alt="screenshot" /> |
||||||
|
|
||||||
|
h2. Prerequisites |
||||||
|
|
||||||
|
Both lightdm and lightdm-webkit-greeter are required. |
||||||
|
antergos-wallpapers used for the background switcher |
||||||
|
|
||||||
|
Enable @ligthdm-webkit-greeter@ by editing @/etc/lightdm/lightdm.conf@ and setting @greeter-session@ property to @lightdm-webkit-greeter@ : |
||||||
|
|
||||||
|
bc. |
||||||
|
[SeatDefaults] |
||||||
|
#greeter-session=lightdm-gtk-greeter |
||||||
|
greeter-session=lightdm-webkit-greeter |
||||||
|
user-session=your-session (gnome,cinnamon,xfce...) |
||||||
|
|
||||||
|
h2. Installation |
||||||
|
|
||||||
|
Arch users can install using their favorite AUR pacman wrapper. Others can install manually: |
||||||
|
|
||||||
|
# Download "Antergos Theme":https://github.com/Antergos/lightdm-webkit-theme-antergos/zipball/master |
||||||
|
# Unzip it. |
||||||
|
# This should create a folder named like @Antergos-lightdm-webkit-theme-antergos-28c4b13@ |
||||||
|
# Rename this folder to @antergos@ (so that the complete path becomes @/usr/share/lightdm-webkit/themes/antergos@) |
||||||
|
# Edit the resource @/etc/lightdm/lightdm-webkit-greeter.conf@ and set @webkit-theme@ property to @antergos@ : |
||||||
|
|
||||||
|
bc. |
||||||
|
theme-name=Adwaita |
||||||
|
#webkit-theme=default |
||||||
|
webkit-theme=antergos |
||||||
|
font-name='Lato' |
||||||
|
xft-antialias=true |
||||||
|
xft-dpi=96 |
||||||
|
xft-hintstyle=medium |
||||||
|
xft-rgba=rgb |
||||||
|
|
||||||
|
Optionally you can install the included font "Lato". |
||||||
|
|
||||||
|
Now if you restart your computer (or at least if you restart lightdm), the antergos greeter theme should be activated. |
||||||
|
|
||||||
|
h1. Uninstallation |
||||||
|
|
||||||
|
To uninstall, simply restore the @greeter-session@ property of the @/etc/lightdm/lightdm.conf@ file and restart your computer (or at least lightdm). |
||||||
|
|
||||||
|
You may also want to : |
||||||
|
# Remove the folder @antergos@ created in @/usr/share/lightdm-webkit/themes/@ |
||||||
|
# Restore the @webkit-theme@ property of the @/etc/lightdm/lightdm-webkit-greeter.conf@ file |
||||||
|
|
||||||
|
h1. User icons management |
||||||
|
|
||||||
|
To change users icons, there are two options : |
||||||
|
|
||||||
|
* Create a @.face@ file in the user's home folder in which you put a @jpg@ or @png@ resource |
||||||
|
|
||||||
|
Or |
||||||
|
|
||||||
|
* Create a resource named with the user's login in @/var/lib/AccountsService/icons/@ |
||||||
|
* Edit @/var/lib/AccountsService/users/<userLogin>@ and add a property @Icon@ targeting the icon resource you just created |
||||||
|
|
||||||
|
This theme works well with 96x96 images. |
||||||
|
|
@ -0,0 +1,30 @@ |
|||||||
|
.com { color: #93a1a1; } |
||||||
|
.lit { color: #195f91; } |
||||||
|
.pun, .opn, .clo { color: #93a1a1; } |
||||||
|
.fun { color: #dc322f; } |
||||||
|
.str, .atv { color: #D14; } |
||||||
|
.kwd, .prettyprint .tag { color: #1e347b; } |
||||||
|
.typ, .atn, .dec, .var { color: teal; } |
||||||
|
.pln { color: #48484c; } |
||||||
|
|
||||||
|
.prettyprint { |
||||||
|
padding: 8px; |
||||||
|
background-color: #f7f7f9; |
||||||
|
border: 1px solid #e1e1e8; |
||||||
|
} |
||||||
|
.prettyprint.linenums { |
||||||
|
-webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; |
||||||
|
-moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; |
||||||
|
box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; |
||||||
|
} |
||||||
|
|
||||||
|
/* Specify class=linenums on a pre to get line numbering */ |
||||||
|
ol.linenums { |
||||||
|
margin: 0 0 0 33px; /* IE indents via margin-left */ |
||||||
|
} |
||||||
|
ol.linenums li { |
||||||
|
padding-left: 12px; |
||||||
|
color: #bebec5; |
||||||
|
line-height: 20px; |
||||||
|
text-shadow: 0 1px 0 #fff; |
||||||
|
} |
@ -0,0 +1,590 @@ |
|||||||
|
/* -------------------------------------------- |
||||||
|
Antergos Greeter Default Theme Stylesheet |
||||||
|
|
||||||
|
Author: Dustin Falgout |
||||||
|
URL: http://antergos.com/ |
||||||
|
Copyright: (c)2013 by Antergos Developers |
||||||
|
License: GPL |
||||||
|
----------------------------------------------- */ |
||||||
|
|
||||||
|
/* Global Styles */ |
||||||
|
|
||||||
|
|
||||||
|
@font-face{ |
||||||
|
font-family: Lato; |
||||||
|
src: url('../../font-awesome/fonts/Lato-Regular.ttf'); |
||||||
|
} |
||||||
|
|
||||||
|
@font-face{ |
||||||
|
font-family: LatoLight; |
||||||
|
src: url('../../font-awesome/fonts/Lato-Light.ttf'); |
||||||
|
} |
||||||
|
|
||||||
|
.hidden { |
||||||
|
opacity: 0; |
||||||
|
} |
||||||
|
|
||||||
|
::-webkit-scrollbar { |
||||||
|
width: 12px; |
||||||
|
} |
||||||
|
::-webkit-scrollbar-track { |
||||||
|
background-color: #eaeaea; |
||||||
|
border-left: 1px solid #ccc; |
||||||
|
} |
||||||
|
::-webkit-scrollbar-thumb { |
||||||
|
background-color: #5d5d5d; |
||||||
|
} |
||||||
|
::-webkit-scrollbar-thumb:hover { |
||||||
|
background-color: #b3b3b3; |
||||||
|
} |
||||||
|
|
||||||
|
.user-wrap2::-webkit-scrollbar { |
||||||
|
width: 4px; |
||||||
|
} |
||||||
|
.user-wrap2::-webkit-scrollbar-track { |
||||||
|
background-color: #eaeaea; |
||||||
|
border-left: 1px solid #ccc; |
||||||
|
} |
||||||
|
.user-wrap2::-webkit-scrollbar-thumb { |
||||||
|
background-color: #5d5d5d; |
||||||
|
} |
||||||
|
.user-wrap2::-webkit-scrollbar-thumb:hover { |
||||||
|
background-color: #b3b3b3; |
||||||
|
} |
||||||
|
.close_wallpapers{ |
||||||
|
padding: 2px 10px !important; |
||||||
|
} |
||||||
|
|
||||||
|
html, |
||||||
|
body { |
||||||
|
height: 100%; |
||||||
|
width: 100%; |
||||||
|
background-color: #000000; |
||||||
|
font-family: "Lato", "Open Sans", sans-serif; |
||||||
|
} |
||||||
|
|
||||||
|
i { |
||||||
|
font-size: 17px; |
||||||
|
} |
||||||
|
|
||||||
|
h3, .panel-heading { |
||||||
|
font-family: "Lato", "Open Sans", sans-serif; |
||||||
|
font-size: 16px; |
||||||
|
text-align: center; |
||||||
|
font-weight: 400; |
||||||
|
} |
||||||
|
|
||||||
|
a { |
||||||
|
text-decoration: none !important; |
||||||
|
} |
||||||
|
|
||||||
|
/* Background Switcher */ |
||||||
|
|
||||||
|
.bg-switch { |
||||||
|
position: relative; |
||||||
|
top: 0; |
||||||
|
right: 0; |
||||||
|
bottom: 0; |
||||||
|
left: 0; |
||||||
|
width: 250px; |
||||||
|
margin: 40px auto auto; |
||||||
|
padding: 0px 53px; |
||||||
|
color: #f5f5f5; |
||||||
|
} |
||||||
|
|
||||||
|
.bg-switch .bgs .bg { |
||||||
|
text-align: center; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
.bg-switch .bgs .bg.active img { |
||||||
|
border-color: #3d73c5; |
||||||
|
} |
||||||
|
|
||||||
|
.bg-switch .bgs .bg img { |
||||||
|
width: 145px; |
||||||
|
height: 95px; |
||||||
|
border: 2px solid #ffffff; |
||||||
|
margin-bottom: 10px; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.hovered { |
||||||
|
text-decoration: none; |
||||||
|
background-color: #ecf0f1; |
||||||
|
} |
||||||
|
|
||||||
|
#user-list2 { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
#user-list2 span { |
||||||
|
font-size: 19px; |
||||||
|
} |
||||||
|
|
||||||
|
#user-list2 img { |
||||||
|
width: 40px; |
||||||
|
margin-right: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
#bg-switch-wrapper { |
||||||
|
margin-right: -250px; |
||||||
|
right: 0; |
||||||
|
width: 250px; |
||||||
|
background: rgba(0, 0, 0, 0.5); |
||||||
|
position: fixed; |
||||||
|
height: 100%; |
||||||
|
overflow-y: auto; |
||||||
|
z-index: 1000; |
||||||
|
transition: all 0.4s ease 0s; |
||||||
|
} |
||||||
|
|
||||||
|
.bg-switch-container { |
||||||
|
position: absolute; |
||||||
|
top: 0; |
||||||
|
width: 250px; |
||||||
|
list-style: none; |
||||||
|
margin: 0; |
||||||
|
padding: 0; |
||||||
|
} |
||||||
|
|
||||||
|
#bg-switch-toggle { |
||||||
|
top: 0; |
||||||
|
right: -2px; |
||||||
|
position: fixed; |
||||||
|
z-index: 1; |
||||||
|
} |
||||||
|
|
||||||
|
#bg-switch-wrapper.active { |
||||||
|
right: 250px; |
||||||
|
width: 250px; |
||||||
|
transition: all 0.4s ease 0s; |
||||||
|
overflow-x: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
.toggle { |
||||||
|
margin: 5px 20px 0 0; |
||||||
|
} |
||||||
|
|
||||||
|
/* Full Page Image Header Area */ |
||||||
|
|
||||||
|
.header { |
||||||
|
display: table; |
||||||
|
height: 100%; |
||||||
|
width: 100%; |
||||||
|
position: relative; |
||||||
|
background-image: url(''); |
||||||
|
background-size: cover !important; |
||||||
|
background-repeat: no-repeat !important; |
||||||
|
background-position: center !important; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#user-target2 i { |
||||||
|
right: -21px; |
||||||
|
color: #2c3e50; |
||||||
|
font-size: 14px; |
||||||
|
} |
||||||
|
#trigger i { |
||||||
|
color: #2c3e50; |
||||||
|
font-size: 14px; |
||||||
|
position: relative; |
||||||
|
top: 9.5px; |
||||||
|
right: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Clock Widget */ |
||||||
|
|
||||||
|
.time { |
||||||
|
font-family: "LatoLight", "Open Sans", sans-serif; |
||||||
|
font-size: 96px; |
||||||
|
line-height: 1em; |
||||||
|
text-decoration: none; |
||||||
|
color: #3d73c5; |
||||||
|
background-color: rgb(252, 247, 247); |
||||||
|
transition: 1s ease-out; |
||||||
|
position: relative; |
||||||
|
top: 10.5px; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
#panelfix { |
||||||
|
height: 170px !important; |
||||||
|
overflow: visible; |
||||||
|
} |
||||||
|
|
||||||
|
.time-panel a { |
||||||
|
display: block; |
||||||
|
-webkit-animation: clkwiggle 10s infinite; |
||||||
|
} |
||||||
|
|
||||||
|
.time:hover { |
||||||
|
cursor: pointer; |
||||||
|
color: #77ADFF; |
||||||
|
/* text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.7); */ |
||||||
|
} |
||||||
|
|
||||||
|
.time-panel { |
||||||
|
background-color: rgb(252, 247, 247) !important; |
||||||
|
border-color: transparent !important; |
||||||
|
} |
||||||
|
|
||||||
|
.time-panel:target { |
||||||
|
-webkit-animation: flip 0.5s ease-out; |
||||||
|
} |
||||||
|
|
||||||
|
.time-panel:target:after { |
||||||
|
visibility: hidden; |
||||||
|
} |
||||||
|
|
||||||
|
/* Login Dialog */ |
||||||
|
|
||||||
|
|
||||||
|
.welcome { |
||||||
|
font-weight:500; |
||||||
|
font-size: 17px; |
||||||
|
position: relative; |
||||||
|
right: 9px; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
.login-wrapper { |
||||||
|
list-style-type: none; |
||||||
|
display: table-row; |
||||||
|
} |
||||||
|
|
||||||
|
.login-cell { |
||||||
|
display: table-cell; |
||||||
|
vertical-align: middle; |
||||||
|
} |
||||||
|
|
||||||
|
.login-box { |
||||||
|
min-height: 250px; |
||||||
|
} |
||||||
|
.panel-shadow { |
||||||
|
box-shadow: none !important; |
||||||
|
border: none !important; |
||||||
|
} |
||||||
|
|
||||||
|
.panel-default { |
||||||
|
background-color: rgb(252, 247, 247); |
||||||
|
} |
||||||
|
|
||||||
|
.badge { |
||||||
|
color: #2c3e50; |
||||||
|
} |
||||||
|
.badge, .badge i { |
||||||
|
font-size: 10px !important; |
||||||
|
display: none; |
||||||
|
} |
||||||
|
.list-group-item.hovered .badge, |
||||||
|
.list-group-item.hovered .badge i { |
||||||
|
display: block; |
||||||
|
|
||||||
|
} |
||||||
|
.panel-heading { |
||||||
|
padding: 10px 20px !important; |
||||||
|
} |
||||||
|
.panel-footer { |
||||||
|
height: 50px; |
||||||
|
} |
||||||
|
|
||||||
|
#sessions, #actionsArea { |
||||||
|
transition: all ease 3s; |
||||||
|
} |
||||||
|
.panel-footer .btn { |
||||||
|
padding-top: 6.5px; |
||||||
|
padding-bottom: 6.5px; |
||||||
|
padding-left: 12px; |
||||||
|
padding-right: 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.panel-body { |
||||||
|
background-color: rgb(252, 247, 247); |
||||||
|
padding: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.panel-footer { |
||||||
|
padding: 5px 15px; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
.panel-flow { |
||||||
|
overflow:visible !important; |
||||||
|
} |
||||||
|
|
||||||
|
.password ul { |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
|
||||||
|
div.password, div.status, div.timer { |
||||||
|
text-align: center; |
||||||
|
position: relative; |
||||||
|
display: none; |
||||||
|
width: 47%; |
||||||
|
margin: 0 auto; |
||||||
|
} |
||||||
|
|
||||||
|
.password { |
||||||
|
font-size: 14px !important; |
||||||
|
padding-top: 5px !important; |
||||||
|
padding-bottom: 5px !important; |
||||||
|
} |
||||||
|
.form-control { |
||||||
|
height: 36px; |
||||||
|
} |
||||||
|
#passwordArea .btn { |
||||||
|
padding-top: 6.5px; |
||||||
|
padding-bottom: 6.5px; |
||||||
|
padding-left: 12px; |
||||||
|
padding-right: 12px; |
||||||
|
} |
||||||
|
#logArea { |
||||||
|
position: absolute; |
||||||
|
top: 25%; |
||||||
|
left: 5%; |
||||||
|
width: 25%; |
||||||
|
height: 50%; |
||||||
|
display: none; |
||||||
|
overflow: auto; |
||||||
|
color: #fff; |
||||||
|
background: rgba(0,0,0,0.6); |
||||||
|
border-radius: 10px; |
||||||
|
font-size: 15px; |
||||||
|
padding: 20px; |
||||||
|
} |
||||||
|
|
||||||
|
/* Animation */ |
||||||
|
|
||||||
|
@-webkit-keyframes bounce { |
||||||
|
0% { |
||||||
|
-webkit-transform: translateY(0); |
||||||
|
} |
||||||
|
100% { |
||||||
|
-webkit-transform: translateY(-20px); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@-webkit-keyframes clkwiggle { |
||||||
|
0% {-webkit-transform: rotate(0deg);} |
||||||
|
1% {-webkit-transform: rotate(-2deg);} |
||||||
|
1.5% {-webkit-transform: rotate(2deg);} |
||||||
|
2% {-webkit-transform: rotate(0deg);} |
||||||
|
2.5% {-webkit-transform: rotate(-2deg);} |
||||||
|
3.5% {-webkit-transform: rotate(2deg);} |
||||||
|
4% {-webkit-transform: rotate(0deg);} |
||||||
|
100% {-webkit-transform: rotate(0deg);} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* User Selection */ |
||||||
|
|
||||||
|
.user-selection { |
||||||
|
|
||||||
|
width: 99%; |
||||||
|
height: 125px; |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
|
||||||
|
.user-selection ul { |
||||||
|
position: relative; |
||||||
|
display: inline-block; |
||||||
|
padding: 0 5px; |
||||||
|
margin: 15px 0 0; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/* User Selection Images */ |
||||||
|
|
||||||
|
.user-selection li { |
||||||
|
display: inline-block; |
||||||
|
position: relative; |
||||||
|
margin: 0 7px 15px; |
||||||
|
vertical-align: baseline; |
||||||
|
} |
||||||
|
|
||||||
|
.user-selection a { |
||||||
|
display: inline-block; |
||||||
|
cursor: pointer; |
||||||
|
outline: none; |
||||||
|
} |
||||||
|
|
||||||
|
.user-selection a i, .time-panel a i { |
||||||
|
font-size: 15px; |
||||||
|
color: #5e5e5e; |
||||||
|
} |
||||||
|
|
||||||
|
.user-toggle { |
||||||
|
position: fixed; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/* Applies the bounce animation to the targeted user image. */ |
||||||
|
.user-selection li:target a { |
||||||
|
-webkit-animation: bounce .3s 6 alternate ease-out; |
||||||
|
} |
||||||
|
|
||||||
|
/* Generates the status indicator. */ |
||||||
|
.user-selection li:after { |
||||||
|
content: " "; |
||||||
|
position: absolute; |
||||||
|
bottom: -5px; |
||||||
|
left: 50%; |
||||||
|
width: 5px; |
||||||
|
height: 5px; |
||||||
|
opacity: 0; |
||||||
|
visibility: hidden; |
||||||
|
background-color: rgba(8, 51, 120, 0.80); |
||||||
|
margin-left: -2px; |
||||||
|
border-radius: 5px; |
||||||
|
box-shadow: inset 0 1px 3px rgba(65, 140, 255, .4), 0 0 4px rgba(65, 140, 255, .5), 0 -1px 7px rgb(65, 140, 255); |
||||||
|
transition: opacity .5s; |
||||||
|
} |
||||||
|
|
||||||
|
/* Displays the status indicator. */ |
||||||
|
.user-selection li:target:after { |
||||||
|
visibility: visible; |
||||||
|
opacity: 1; |
||||||
|
} |
||||||
|
|
||||||
|
/* This is just a wrapper in order to center the actual label horizontally. You |
||||||
|
may need to adjust the width negative margin if you have really long labels. */ |
||||||
|
.user-selection em { |
||||||
|
position: absolute; |
||||||
|
top: -34px; |
||||||
|
left: 50%; |
||||||
|
display: none; |
||||||
|
width: 150px; |
||||||
|
margin-left: -75px; |
||||||
|
text-align: center; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/* Generates the little arrow at the bottom of the label. */ |
||||||
|
.user-selection em:after { |
||||||
|
content: " "; |
||||||
|
position: absolute; |
||||||
|
bottom: -6px; |
||||||
|
left: 50%; |
||||||
|
margin-left: -6px; |
||||||
|
width: 0; |
||||||
|
height: 0; |
||||||
|
border-left: 6px solid transparent; |
||||||
|
border-right: 6px solid transparent; |
||||||
|
border-top: 6px solid rgba(0, 0, 0, .6); |
||||||
|
border-bottom: none; |
||||||
|
z-index: 1000; |
||||||
|
} |
||||||
|
|
||||||
|
/* This is the actual label. */ |
||||||
|
.user-selection em span { |
||||||
|
display: inline-block; |
||||||
|
padding: 5px 12px; |
||||||
|
font-size: 14px; |
||||||
|
font-style: normal; |
||||||
|
color: #FFF; |
||||||
|
background: #000; |
||||||
|
background: rgba(0, 0, 0, .6); |
||||||
|
text-shadow: 1px 1px 1px rgba(0, 0, 0, .9); |
||||||
|
border-radius: 12px; |
||||||
|
z-index: 1000; |
||||||
|
} |
||||||
|
|
||||||
|
.user-selection li:hover em { |
||||||
|
display: block; |
||||||
|
z-index: 1000; |
||||||
|
} |
||||||
|
|
||||||
|
/* Image Hover Effect */ |
||||||
|
/* Sets the face images to a smaller width so they can be enlarged and applies |
||||||
|
transitions for a smooth animation. Make sure to adjust the width so it |
||||||
|
matches your images. */ |
||||||
|
.user-selection img { |
||||||
|
width: 72px; |
||||||
|
height: auto; |
||||||
|
transition: width .2s, height .2s; |
||||||
|
} |
||||||
|
|
||||||
|
.user-selection li:hover img { |
||||||
|
width: 96px; |
||||||
|
} |
||||||
|
|
||||||
|
.user-selection li:active img { |
||||||
|
opacity: .9; |
||||||
|
} |
||||||
|
|
||||||
|
.random { |
||||||
|
background: rgba(111, 111, 111, 0.65); |
||||||
|
text-align: center; |
||||||
|
display: table; |
||||||
|
color: rgba(255, 255, 255, 0.72); |
||||||
|
width: 145px; |
||||||
|
height: 95px; |
||||||
|
border: 2px solid #ffffff; |
||||||
|
margin-bottom: 10px; |
||||||
|
cursor: pointer; |
||||||
|
padding-top: 35px; |
||||||
|
} |
||||||
|
|
||||||
|
.random span { |
||||||
|
font-size: 18px; |
||||||
|
} |
||||||
|
.random:hover { |
||||||
|
color: white; |
||||||
|
background: rgba(111, 111, 111, 0.85); |
||||||
|
} |
||||||
|
.random.active { |
||||||
|
border: 2px solid #3d73c5; |
||||||
|
} |
||||||
|
|
||||||
|
.user-wrap2 { |
||||||
|
max-width: 50%; |
||||||
|
margin: 0 auto; |
||||||
|
display: -webkit-box; |
||||||
|
max-height: 124px; |
||||||
|
overflow: auto; |
||||||
|
} |
||||||
|
|
||||||
|
#list-group { |
||||||
|
padding: 0px; |
||||||
|
overflow: visible; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@media (max-width: 1900px) { |
||||||
|
|
||||||
|
.bg-switch { |
||||||
|
position: relative; |
||||||
|
width: 250px; |
||||||
|
margin: 40px auto auto; |
||||||
|
padding: 0px 74px; |
||||||
|
} |
||||||
|
|
||||||
|
.bg-switch .bgs .bg { |
||||||
|
text-align: center; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
|
||||||
|
.bg-switch .bgs .bg img { |
||||||
|
width: 102px; |
||||||
|
height: 67px; |
||||||
|
margin-bottom: 5px; |
||||||
|
} |
||||||
|
|
||||||
|
h3 { |
||||||
|
margin-top: 10px; |
||||||
|
margin-bottom: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
#logArea { |
||||||
|
top: 24%; |
||||||
|
left: 2%; |
||||||
|
} |
||||||
|
|
||||||
|
.random { |
||||||
|
width: 102px; |
||||||
|
height: 67px; |
||||||
|
margin-bottom: 5px; |
||||||
|
padding-top: 18px; |
||||||
|
} |
||||||
|
} |
After Width: | Height: | Size: 197 KiB |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 5.5 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,349 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
|
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||||
|
<meta name="description" content="The Antergos Default Greeter Theme"> |
||||||
|
<meta name="author" content="Dustin Falgout"> |
||||||
|
|
||||||
|
<title>The Antergos Default Greeter Theme</title> |
||||||
|
|
||||||
|
<!--For testing changes made to theme in any web browser--> |
||||||
|
<script type="text/javascript" src="js/mock.js"></script> |
||||||
|
|
||||||
|
<!-- Bootstrap Core CSS --> |
||||||
|
<link rel="stylesheet" type="text/css" href="css/bootstrap/bootstrap.css" /> |
||||||
|
<link rel="stylesheet" type="text/css" href="css/bootstrap/prettify.css"> |
||||||
|
|
||||||
|
<!-- Custom CSS here --> |
||||||
|
<link rel="stylesheet" type="text/css" href="css/bootstrap/theme.css"> |
||||||
|
<link rel="stylesheet" type="text/css" href="font-awesome/css/font-awesome.css" /> |
||||||
|
|
||||||
|
<!-- The order in which each script appears in document is VERY IMPORTANT --> |
||||||
|
<script src="js/jquery-1.10.2.js"></script> |
||||||
|
<script src="js/bootstrap.js"></script> |
||||||
|
<script src="js/bootstrap-select.js"></script> |
||||||
|
<script type="text/javascript" src="js/greeter.js"></script> |
||||||
|
|
||||||
|
<script type="text/javascript"> |
||||||
|
function randomBG() { |
||||||
|
localStorage.setItem("bgsaved", ''); |
||||||
|
$(".bgs .bg .random").first().addClass('active'); |
||||||
|
var arrayBackground = []; |
||||||
|
$('.bgs .clearfix').each(function(i) { |
||||||
|
if (i > 0) { |
||||||
|
arrayBackground.push($(this).attr('data-img')); |
||||||
|
} |
||||||
|
}); |
||||||
|
var randBG = arrayBackground[Math.floor(Math.random() * arrayBackground.length)]; |
||||||
|
$('.header').fadeTo('slow', 0.3, function() { |
||||||
|
$(".header").css("background", "url('/usr/share/antergos/wallpapers/" + randBG + "')"); |
||||||
|
}).fadeTo('slow', 1); |
||||||
|
} |
||||||
|
|
||||||
|
$(function() { |
||||||
|
// bg switcher |
||||||
|
var $btns = $(".bg-switch .bg"); |
||||||
|
$btns.click(function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
$btns.removeClass("active"); |
||||||
|
$(".bgs .bg .random").first().removeClass('active'); |
||||||
|
$(this).addClass("active"); |
||||||
|
var bg = $(this).data("img"); |
||||||
|
if (bg == 'random') { |
||||||
|
console.log("Sets random background"); |
||||||
|
localStorage.setItem("bgrandom", '1'); |
||||||
|
randomBG(); |
||||||
|
} else { |
||||||
|
console.log("Turn off random"); |
||||||
|
localStorage.setItem("bgrandom", '0'); |
||||||
|
$('.header').fadeTo('slow', 0.3, function() { |
||||||
|
$(".header").css("background", "url('/usr/share/antergos/wallpapers/" + bg + "')"); |
||||||
|
}).fadeTo('slow', 1); |
||||||
|
var bgurl = "url('/usr/share/antergos/wallpapers/" + bg + "')"; |
||||||
|
localStorage.setItem("bgsaved", bgurl) |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
$(document).ready(function() { |
||||||
|
if ((localStorage.getItem("bgsaved") !== null) && (localStorage.getItem("bgrandom") == '0')) { |
||||||
|
$('.header').fadeTo('slow', 0.3, function() { |
||||||
|
$(".header").css("background", localStorage.bgsaved); |
||||||
|
}).fadeTo('slow', 1); |
||||||
|
} |
||||||
|
if (localStorage.getItem("bgrandom") !== '0') { |
||||||
|
console.log("Is random"); |
||||||
|
randomBG(); |
||||||
|
} |
||||||
|
if (localStorage.getItem("bgrandom") == null) { |
||||||
|
localStorage.setItem("bgrandom", "1"); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
function showAlert() { |
||||||
|
$("#login").addClass("in"); |
||||||
|
} |
||||||
|
|
||||||
|
window.setTimeout(function() { |
||||||
|
showAlert(); |
||||||
|
}, 500); |
||||||
|
|
||||||
|
function showLog() { |
||||||
|
$("#logArea").show(); |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
|
||||||
|
<!-- BG Switcher --> |
||||||
|
<a id="bg-switch-toggle" href="#" class="btn btn-primary btn-lg toggle close_wallpapers"> |
||||||
|
<i class="fa fa-bars"></i> |
||||||
|
</a> |
||||||
|
|
||||||
|
<div id="bg-switch-wrapper"> |
||||||
|
<div class="bg-switch-container"> |
||||||
|
<a id="bg-switch-close" href="#" class="btn btn-default btn-lg pull-right toggle close_wallpapers"> |
||||||
|
<i class="fa fa-times"></i> |
||||||
|
</a> |
||||||
|
|
||||||
|
<div class="bg-switch"> |
||||||
|
<h3>Background Options</h3> |
||||||
|
|
||||||
|
<div class="clearfix"></div> |
||||||
|
<div class="bgs"> |
||||||
|
<a href="#" data-img="random" class="bg clearfix"> |
||||||
|
<div class="random"> |
||||||
|
<span>Random</span> |
||||||
|
</div> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="antergos-wallpaper.png" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/antergos-wallpaper.png" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="83II_by_bo0xVn.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/83II_by_bo0xVn.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="as_time_goes_by____by_moskanon-d5dgvt8.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/as_time_goes_by____by_moskanon-d5dgvt8.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="autumn_hike___plant_details_by_aoiban-d5l7y83.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/autumn_hike___plant_details_by_aoiban-d5l7y83.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="blossom_by_snipes2.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/blossom_by_snipes2.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="early_morning_by_kylekc.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/early_morning_by_kylekc.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="extinction_by_signcropstealer-d5j4y84.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/extinction_by_signcropstealer-d5j4y84.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="field_by_stevenfields-d59ap2i.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/field_by_stevenfields-d59ap2i.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="Grass_by_masha_darkelf666.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/Grass_by_masha_darkelf666.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="Grass_Fullscreen.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/Grass_Fullscreen.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="humble_by_splendidofsun-d5g47hb.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/humble_by_splendidofsun-d5g47hb.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="In_the_Grass.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/In_the_Grass.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="morning_light_by_l33tc4k3-d5d2yu0.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/morning_light_by_l33tc4k3-d5d2yu0.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="Nautilus_Fullscreen.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/Nautilus_Fullscreen.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="nikon_d40_test_by_desirefire1-d5fghdc.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/nikon_d40_test_by_desirefire1-d5fghdc.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="solely_by_stevenfields-d5g1c2o.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/solely_by_stevenfields-d5g1c2o.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="the_world_inside_my_lens__by_moskanon-d5fsiqs.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/the_world_inside_my_lens__by_moskanon-d5fsiqs.jpg" /> |
||||||
|
</a> |
||||||
|
<a href="#" data-img="white_line_by_snipes2.jpg" class="bg clearfix"> |
||||||
|
<img src="img/thumbs/white_line_by_snipes2.jpg" /> |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<!-- /BG Switcher Sidebar --> |
||||||
|
|
||||||
|
<!-- Full Page Image Header Area --> |
||||||
|
<div id="top" class="header"> |
||||||
|
<div class="login-wrapper"> |
||||||
|
<div class="login-cell"> |
||||||
|
<div class="container"> |
||||||
|
<div class="row"> |
||||||
|
<div class="col-md-6 col-md-offset-3"> |
||||||
|
<!-- Login Dialog --> |
||||||
|
<div id="login" class="panel panel-default login-box fade"> |
||||||
|
<div class="panel-heading text-center"> |
||||||
|
<span class="pull-left"> |
||||||
|
<img src="img/antergos.png" alt="Antergos" /> |
||||||
|
</span> |
||||||
|
<span class="welcome">Welcome!</span> |
||||||
|
<span id="hostname" class="pull-right"></span> |
||||||
|
</div> |
||||||
|
<div id="panelfix" class="panel-body"> |
||||||
|
<div class="panel-group" id="accordion"> |
||||||
|
<div class="panel panel-default panel-shadow time-panel"> |
||||||
|
|
||||||
|
|
||||||
|
<div id="collapseOne" class="panel-collapse collapse in"> |
||||||
|
<div id="timewrap" class="panel-body panel-shadow time-panel text-center"> |
||||||
|
<a id="trigger" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo"> |
||||||
|
<!-- Clock Widget --> |
||||||
|
<span id="current_time" class="time text-center"></span> |
||||||
|
<i class="fa fa-toggle-up"></i> |
||||||
|
</a> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
<div class="panel panel-default panel-shadow panel-flow"> |
||||||
|
<!-- User Selection Widget --> |
||||||
|
<div id="collapseTwo" class="panel-collapse collapse"> |
||||||
|
<div id="list-group" class="panel-body panel-wrap"> |
||||||
|
|
||||||
|
<div class="user-wrap2"> |
||||||
|
|
||||||
|
<div id="user-list2" class="list-group"> |
||||||
|
</div> |
||||||
|
<a id="user-target2" class="user-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" onclick="cancelAuthentication()"> |
||||||
|
<i class="fa fa-toggle-down" style="position:absolute;"></i> |
||||||
|
</a> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div> |
||||||
|
<!-- Password Input --> |
||||||
|
<div id="passwordArea" class="password"> |
||||||
|
<table border="0" align="center"> |
||||||
|
<tr> |
||||||
|
<td class="input-group"> |
||||||
|
<input id="passwordField" type="password" class="password form-control" /> |
||||||
|
|
||||||
|
<div class="input-group-btn"> |
||||||
|
<button class="btn btn-primary" type="button" onclick="submitPassword()"> |
||||||
|
<i class="fa fa-sign-in"></i> |
||||||
|
</button> |
||||||
|
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"> |
||||||
|
<span class="caret"></span> |
||||||
|
</button> |
||||||
|
<ul class="dropdown-menu pull-right"> |
||||||
|
<li> |
||||||
|
<a href="#" onclick="cancelAuthentication()"> |
||||||
|
<i class="fa fa-times"></i>Cancel</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="#" onclick="showLog()"> |
||||||
|
<i class="fa fa-bug"></i>View Log</a> |
||||||
|
</li> |
||||||
|
<li> |
||||||
|
<a href="#" onclick="$(document.location.reload(true))"> |
||||||
|
<i class="fa fa-refresh"></i>Reset</a> |
||||||
|
</li> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
</td> |
||||||
|
|
||||||
|
|
||||||
|
</tr> |
||||||
|
</table> |
||||||
|
<div id="timerArea" class="timer"> |
||||||
|
<i class="fa fa-spinner fa-spin"></i> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<!-- Status Area --> |
||||||
|
<div id="statusArea" class="status"> |
||||||
|
<table border="0" align="center"> |
||||||
|
<tr> |
||||||
|
<td> |
||||||
|
<div class="alert alert-danger fade in"> |
||||||
|
<button type="button" class="close" onclick="cancelAuthentication()" data-dismiss="alert" aria-hidden="true"> ×</button> |
||||||
|
<span id="showMsg"> |
||||||
|
<strong>Uh Oh!!</strong>Authentication failed. Please try again. |
||||||
|
</span> |
||||||
|
</div> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
</table> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="panel-footer"> |
||||||
|
<div id="session-list" class="btn-group pull-left hidden"> |
||||||
|
<button type="button" class="btn btn-default selected"></button> |
||||||
|
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button> |
||||||
|
<ul id="sessions" class="dropdown-menu"> |
||||||
|
</ul> |
||||||
|
</div> |
||||||
|
<div id="actionsArea" class="btn-group pull-right"></div> |
||||||
|
|
||||||
|
</div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div id="logArea" class="log"></div> |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Custom JavaScript for the BG Switcher & Clock Toggle --> |
||||||
|
<script> |
||||||
|
$("#bg-switch-close").click(function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
$("#bg-switch-wrapper").toggleClass("active"); |
||||||
|
$(this).hide(); |
||||||
|
$("#bg-switch-toggle").show(); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
<script> |
||||||
|
$("#bg-switch-toggle").click(function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
$("#bg-switch-wrapper").toggleClass("active"); |
||||||
|
$(this).hide(); |
||||||
|
$("#bg-switch-close").show(); |
||||||
|
}); |
||||||
|
|
||||||
|
// Show user list when pressed any key |
||||||
|
$(document).keypress(function(e) { |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
</script> |
||||||
|
|
||||||
|
</body> |
||||||
|
|
||||||
|
</html> |
@ -0,0 +1,6 @@ |
|||||||
|
[theme] |
||||||
|
name=Antergos |
||||||
|
description=Antergos Theme |
||||||
|
engine=lightdm-webkit-greeter |
||||||
|
url=index.html |
||||||
|
session=cinnamon |
@ -0,0 +1,735 @@ |
|||||||
|
/*! |
||||||
|
* bootstrap-select v1.3.5 |
||||||
|
* http://silviomoreto.github.io/bootstrap-select/
|
||||||
|
* |
||||||
|
* Copyright 2013 bootstrap-select |
||||||
|
* Licensed under the MIT license |
||||||
|
*/ |
||||||
|
|
||||||
|
!function($) { |
||||||
|
|
||||||
|
"use strict"; |
||||||
|
|
||||||
|
$.expr[":"].icontains = function(obj, index, meta) { |
||||||
|
return $(obj).text().toUpperCase().indexOf(meta[3].toUpperCase()) >= 0; |
||||||
|
}; |
||||||
|
|
||||||
|
var Selectpicker = function(element, options, e) { |
||||||
|
if (e) { |
||||||
|
e.stopPropagation(); |
||||||
|
e.preventDefault(); |
||||||
|
} |
||||||
|
this.$element = $(element); |
||||||
|
this.$newElement = null; |
||||||
|
this.$button = null; |
||||||
|
this.$menu = null; |
||||||
|
|
||||||
|
//Merge defaults, options and data-attributes to make our options
|
||||||
|
this.options = $.extend({}, $.fn.selectpicker.defaults, this.$element.data(), typeof options == 'object' && options); |
||||||
|
|
||||||
|
//If we have no title yet, check the attribute 'title' (this is missed by jq as its not a data-attribute
|
||||||
|
if (this.options.title == null) { |
||||||
|
this.options.title = this.$element.attr('title'); |
||||||
|
} |
||||||
|
|
||||||
|
//Expose public methods
|
||||||
|
this.val = Selectpicker.prototype.val; |
||||||
|
this.render = Selectpicker.prototype.render; |
||||||
|
this.refresh = Selectpicker.prototype.refresh; |
||||||
|
this.setStyle = Selectpicker.prototype.setStyle; |
||||||
|
this.selectAll = Selectpicker.prototype.selectAll; |
||||||
|
this.deselectAll = Selectpicker.prototype.deselectAll; |
||||||
|
this.init(); |
||||||
|
}; |
||||||
|
|
||||||
|
Selectpicker.prototype = { |
||||||
|
|
||||||
|
constructor: Selectpicker, |
||||||
|
|
||||||
|
init: function() { |
||||||
|
this.$element.hide(); |
||||||
|
this.multiple = this.$element.prop('multiple'); |
||||||
|
var id = this.$element.attr('id'); |
||||||
|
this.$newElement = this.createView(); |
||||||
|
this.$element.after(this.$newElement); |
||||||
|
this.$menu = this.$newElement.find('> .dropdown-menu'); |
||||||
|
this.$button = this.$newElement.find('> button'); |
||||||
|
this.$searchbox = this.$newElement.find('input'); |
||||||
|
|
||||||
|
if (id !== undefined) { |
||||||
|
var that = this; |
||||||
|
this.$button.attr('data-id', id); |
||||||
|
$('label[for="' + id + '"]').click(function(e) { |
||||||
|
e.preventDefault(); |
||||||
|
that.$button.focus(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
this.checkDisabled(); |
||||||
|
this.clickListener(); |
||||||
|
this.liveSearchListener(); |
||||||
|
this.render(); |
||||||
|
this.liHeight(); |
||||||
|
this.setStyle(); |
||||||
|
this.setWidth(); |
||||||
|
if (this.options.container) { |
||||||
|
this.selectPosition(); |
||||||
|
} |
||||||
|
this.$menu.data('this', this); |
||||||
|
this.$newElement.data('this', this); |
||||||
|
}, |
||||||
|
|
||||||
|
createDropdown: function() { |
||||||
|
//If we are multiple, then add the show-tick class by default
|
||||||
|
var multiple = this.multiple ? ' show-tick' : ''; |
||||||
|
var header = this.options.header ? '<div class="popover-title"><button type="button" class="close" aria-hidden="true">×</button>' + this.options.header + '</div>' : ''; |
||||||
|
var searchbox = this.options.liveSearch ? '<div class="bootstrap-select-searchbox"><input type="text" class="input-block-level form-control" /></div>' : ''; |
||||||
|
var drop = |
||||||
|
"<div class='btn-group bootstrap-select" + multiple + "'>" + |
||||||
|
"<button type='button' class='btn dropdown-toggle selectpicker' data-toggle='dropdown'>" + |
||||||
|
"<div class='filter-option pull-left'></div> " + |
||||||
|
"<div class='caret'></div>" + |
||||||
|
"</button>" + |
||||||
|
"<div class='dropdown-menu open'>" + |
||||||
|
header + |
||||||
|
searchbox + |
||||||
|
"<ul class='dropdown-menu inner selectpicker' role='menu'>" + |
||||||
|
"</ul>" + |
||||||
|
"</div>" + |
||||||
|
"</div>"; |
||||||
|
|
||||||
|
return $(drop); |
||||||
|
}, |
||||||
|
|
||||||
|
createView: function() { |
||||||
|
var $drop = this.createDropdown(); |
||||||
|
var $li = this.createLi(); |
||||||
|
$drop.find('ul').append($li); |
||||||
|
return $drop; |
||||||
|
}, |
||||||
|
|
||||||
|
reloadLi: function() { |
||||||
|
//Remove all children.
|
||||||
|
this.destroyLi(); |
||||||
|
//Re build
|
||||||
|
var $li = this.createLi(); |
||||||
|
this.$menu.find('ul').append( $li ); |
||||||
|
}, |
||||||
|
|
||||||
|
destroyLi: function() { |
||||||
|
this.$menu.find('li').remove(); |
||||||
|
}, |
||||||
|
|
||||||
|
createLi: function() { |
||||||
|
var that = this, |
||||||
|
_liA = [], |
||||||
|
_liHtml = ''; |
||||||
|
|
||||||
|
this.$element.find('option').each(function() { |
||||||
|
var $this = $(this); |
||||||
|
|
||||||
|
//Get the class and text for the option
|
||||||
|
var optionClass = $this.attr("class") || ''; |
||||||
|
var inline = $this.attr("style") || ''; |
||||||
|
var text = $this.data('content') ? $this.data('content') : $this.html(); |
||||||
|
var subtext = $this.data('subtext') !== undefined ? '<small class="muted text-muted">' + $this.data('subtext') + '</small>' : ''; |
||||||
|
var icon = $this.data('icon') !== undefined ? '<i class="glyphicon '+$this.data('icon')+'"></i> ' : ''; |
||||||
|
if (icon !== '' && ($this.is(':disabled') || $this.parent().is(':disabled'))) { |
||||||
|
icon = '<span>'+icon+'</span>'; |
||||||
|
} |
||||||
|
|
||||||
|
if (!$this.data('content')) { |
||||||
|
//Prepend any icon and append any subtext to the main text.
|
||||||
|
text = icon + '<span class="text">' + text + subtext + '</span>'; |
||||||
|
} |
||||||
|
|
||||||
|
if (that.options.hideDisabled && ($this.is(':disabled') || $this.parent().is(':disabled'))) { |
||||||
|
_liA.push('<a style="min-height: 0; padding: 0"></a>'); |
||||||
|
} else if ($this.parent().is('optgroup') && $this.data('divider') !== true) { |
||||||
|
if ($this.index() == 0) { |
||||||
|
//Get the opt group label
|
||||||
|
var label = $this.parent().attr('label'); |
||||||
|
var labelSubtext = $this.parent().data('subtext') !== undefined ? '<small class="muted text-muted">'+$this.parent().data('subtext')+'</small>' : ''; |
||||||
|
var labelIcon = $this.parent().data('icon') ? '<i class="'+$this.parent().data('icon')+'"></i> ' : ''; |
||||||
|
label = labelIcon + '<span class="text">' + label + labelSubtext + '</span>'; |
||||||
|
|
||||||
|
if ($this[0].index != 0) { |
||||||
|
_liA.push( |
||||||
|
'<div class="div-contain"><div class="divider"></div></div>'+ |
||||||
|
'<dt>'+label+'</dt>'+ |
||||||
|
that.createA(text, "opt " + optionClass, inline ) |
||||||
|
); |
||||||
|
} else { |
||||||
|
_liA.push( |
||||||
|
'<dt>'+label+'</dt>'+ |
||||||
|
that.createA(text, "opt " + optionClass, inline )); |
||||||
|
} |
||||||
|
} else { |
||||||
|
_liA.push(that.createA(text, "opt " + optionClass, inline )); |
||||||
|
} |
||||||
|
} else if ($this.data('divider') === true) { |
||||||
|
_liA.push('<div class="div-contain"><div class="divider"></div></div>'); |
||||||
|
} else if ($(this).data('hidden') === true) { |
||||||
|
_liA.push(''); |
||||||
|
} else { |
||||||
|
_liA.push(that.createA(text, optionClass, inline )); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
$.each(_liA, function(i, item) { |
||||||
|
_liHtml += "<li rel=" + i + ">" + item + "</li>"; |
||||||
|
}); |
||||||
|
|
||||||
|
//If we are not multiple, and we dont have a selected item, and we dont have a title, select the first element so something is set in the button
|
||||||
|
if (!this.multiple && this.$element.find('option:selected').length==0 && !this.options.title) { |
||||||
|
this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected'); |
||||||
|
} |
||||||
|
|
||||||
|
return $(_liHtml); |
||||||
|
}, |
||||||
|
|
||||||
|
createA: function(text, classes, inline) { |
||||||
|
return '<a tabindex="0" class="'+classes+'" style="'+inline+'">' + |
||||||
|
text + |
||||||
|
'<i class="glyphicon glyphicon-ok icon-ok check-mark"></i>' + |
||||||
|
'</a>'; |
||||||
|
}, |
||||||
|
|
||||||
|
render: function() { |
||||||
|
var that = this; |
||||||
|
|
||||||
|
//Update the LI to match the SELECT
|
||||||
|
this.$element.find('option').each(function(index) { |
||||||
|
that.setDisabled(index, $(this).is(':disabled') || $(this).parent().is(':disabled') ); |
||||||
|
that.setSelected(index, $(this).is(':selected') ); |
||||||
|
}); |
||||||
|
|
||||||
|
this.tabIndex(); |
||||||
|
|
||||||
|
var selectedItems = this.$element.find('option:selected').map(function() { |
||||||
|
var $this = $(this); |
||||||
|
var icon = $this.data('icon') && that.options.showIcon ? '<i class="glyphicon ' + $this.data('icon') + '"></i> ' : ''; |
||||||
|
var subtext; |
||||||
|
if (that.options.showSubtext && $this.attr('data-subtext') && !that.multiple) { |
||||||
|
subtext = ' <small class="muted text-muted">'+$this.data('subtext') +'</small>'; |
||||||
|
} else { |
||||||
|
subtext = ''; |
||||||
|
} |
||||||
|
if ($this.data('content') && that.options.showContent) { |
||||||
|
return $this.data('content'); |
||||||
|
} else if ($this.attr('title') != undefined) { |
||||||
|
return $this.attr('title'); |
||||||
|
} else { |
||||||
|
return icon + $this.html() + subtext; |
||||||
|
} |
||||||
|
}).toArray(); |
||||||
|
|
||||||
|
//Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled
|
||||||
|
//Convert all the values into a comma delimited string
|
||||||
|
var title = !this.multiple ? selectedItems[0] : selectedItems.join(", "); |
||||||
|
|
||||||
|
//If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..
|
||||||
|
if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) { |
||||||
|
var max = this.options.selectedTextFormat.split(">"); |
||||||
|
var notDisabled = this.options.hideDisabled ? ':not([disabled])' : ''; |
||||||
|
if ( (max.length>1 && selectedItems.length > max[1]) || (max.length==1 && selectedItems.length>=2)) { |
||||||
|
title = this.options.countSelectedText.replace('{0}', selectedItems.length).replace('{1}', this.$element.find('option:not([data-divider="true"]):not([data-hidden="true"])'+notDisabled).length); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
//If we dont have a title, then use the default, or if nothing is set at all, use the not selected text
|
||||||
|
if (!title) { |
||||||
|
title = this.options.title != undefined ? this.options.title : this.options.noneSelectedText; |
||||||
|
} |
||||||
|
|
||||||
|
this.$newElement.find('.filter-option').html(title); |
||||||
|
}, |
||||||
|
|
||||||
|
setStyle: function(style, status) { |
||||||
|
if (this.$element.attr('class')) { |
||||||
|
this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device/gi, '')); |
||||||
|
} |
||||||
|
|
||||||
|
var buttonClass = style ? style : this.options.style; |
||||||
|
|
||||||
|
if (status == 'add') { |
||||||
|
this.$button.addClass(buttonClass); |
||||||
|
} else if (status == 'remove') { |
||||||
|
this.$button.removeClass(buttonClass); |
||||||
|
} else { |
||||||
|
this.$button.removeClass(this.options.style); |
||||||
|
this.$button.addClass(buttonClass); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
liHeight: function() { |
||||||
|
var selectClone = this.$newElement.clone(); |
||||||
|
selectClone.appendTo('body'); |
||||||
|
var $menuClone = selectClone.addClass('open').find('> .dropdown-menu'); |
||||||
|
var liHeight = $menuClone.find('li > a').outerHeight(); |
||||||
|
var headerHeight = this.options.header ? $menuClone.find('.popover-title').outerHeight() : 0; |
||||||
|
var searchHeight = this.options.liveSearch ? $menuClone.find('.bootstrap-select-searchbox').outerHeight() : 0; |
||||||
|
selectClone.remove(); |
||||||
|
this.$newElement.data('liHeight', liHeight).data('headerHeight', headerHeight).data('searchHeight', searchHeight); |
||||||
|
}, |
||||||
|
|
||||||
|
setSize: function() { |
||||||
|
var that = this, |
||||||
|
menu = this.$menu, |
||||||
|
menuInner = menu.find('.inner'), |
||||||
|
selectHeight = this.$newElement.outerHeight(), |
||||||
|
liHeight = this.$newElement.data('liHeight'), |
||||||
|
headerHeight = this.$newElement.data('headerHeight'), |
||||||
|
searchHeight = this.$newElement.data('searchHeight'), |
||||||
|
divHeight = menu.find('li .divider').outerHeight(true), |
||||||
|
menuPadding = parseInt(menu.css('padding-top')) + |
||||||
|
parseInt(menu.css('padding-bottom')) + |
||||||
|
parseInt(menu.css('border-top-width')) + |
||||||
|
parseInt(menu.css('border-bottom-width')), |
||||||
|
notDisabled = this.options.hideDisabled ? ':not(.disabled)' : '', |
||||||
|
$window = $(window), |
||||||
|
menuExtras = menuPadding + parseInt(menu.css('margin-top')) + parseInt(menu.css('margin-bottom')) + 2, |
||||||
|
menuHeight, |
||||||
|
selectOffsetTop, |
||||||
|
selectOffsetBot, |
||||||
|
posVert = function() { |
||||||
|
selectOffsetTop = that.$newElement.offset().top - $window.scrollTop(); |
||||||
|
selectOffsetBot = $window.height() - selectOffsetTop - selectHeight; |
||||||
|
}; |
||||||
|
posVert(); |
||||||
|
if (this.options.header) menu.css('padding-top', 0); |
||||||
|
|
||||||
|
if (this.options.size == 'auto') { |
||||||
|
var getSize = function() { |
||||||
|
var minHeight; |
||||||
|
posVert(); |
||||||
|
menuHeight = selectOffsetBot - menuExtras; |
||||||
|
that.$newElement.toggleClass('dropup', (selectOffsetTop > selectOffsetBot) && (menuHeight - menuExtras) < menu.height() && that.options.dropupAuto); |
||||||
|
if (that.$newElement.hasClass('dropup')) { |
||||||
|
menuHeight = selectOffsetTop - menuExtras; |
||||||
|
} |
||||||
|
if ((menu.find('li').length + menu.find('dt').length) > 3) { |
||||||
|
minHeight = liHeight*3 + menuExtras - 2; |
||||||
|
} else { |
||||||
|
minHeight = 0; |
||||||
|
} |
||||||
|
menu.css({'max-height' : menuHeight + 'px', 'overflow' : 'hidden', 'min-height' : minHeight + 'px'}); |
||||||
|
menuInner.css({'max-height' : menuHeight - headerHeight - searchHeight- menuPadding + 'px', 'overflow-y' : 'auto', 'min-height' : minHeight - menuPadding + 'px'}); |
||||||
|
}; |
||||||
|
getSize(); |
||||||
|
$(window).resize(getSize); |
||||||
|
$(window).scroll(getSize); |
||||||
|
} else if (this.options.size && this.options.size != 'auto' && menu.find('li'+notDisabled).length > this.options.size) { |
||||||
|
var optIndex = menu.find("li"+notDisabled+" > *").filter(':not(.div-contain)').slice(0,this.options.size).last().parent().index(); |
||||||
|
var divLength = menu.find("li").slice(0,optIndex + 1).find('.div-contain').length; |
||||||
|
menuHeight = liHeight*this.options.size + divLength*divHeight + menuPadding; |
||||||
|
this.$newElement.toggleClass('dropup', (selectOffsetTop > selectOffsetBot) && menuHeight < menu.height() && this.options.dropupAuto); |
||||||
|
menu.css({'max-height' : menuHeight + headerHeight + searchHeight + 'px', 'overflow' : 'hidden'}); |
||||||
|
menuInner.css({'max-height' : menuHeight - menuPadding + 'px', 'overflow-y' : 'auto'}); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
setWidth: function() { |
||||||
|
if (this.options.width == 'auto') { |
||||||
|
this.$menu.css('min-width', '0'); |
||||||
|
|
||||||
|
// Get correct width if element hidden
|
||||||
|
var selectClone = this.$newElement.clone().appendTo('body'); |
||||||
|
var ulWidth = selectClone.find('> .dropdown-menu').css('width'); |
||||||
|
selectClone.remove(); |
||||||
|
|
||||||
|
this.$newElement.css('width', ulWidth); |
||||||
|
} else if (this.options.width == 'fit') { |
||||||
|
// Remove inline min-width so width can be changed from 'auto'
|
||||||
|
this.$menu.css('min-width', ''); |
||||||
|
this.$newElement.css('width', '').addClass('fit-width'); |
||||||
|
} else if (this.options.width) { |
||||||
|
// Remove inline min-width so width can be changed from 'auto'
|
||||||
|
this.$menu.css('min-width', ''); |
||||||
|
this.$newElement.css('width', this.options.width); |
||||||
|
} else { |
||||||
|
// Remove inline min-width/width so width can be changed
|
||||||
|
this.$menu.css('min-width', ''); |
||||||
|
this.$newElement.css('width', ''); |
||||||
|
} |
||||||
|
// Remove fit-width class if width is changed programmatically
|
||||||
|
if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') { |
||||||
|
this.$newElement.removeClass('fit-width'); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
selectPosition: function() { |
||||||
|
var that = this, |
||||||
|
drop = "<div />", |
||||||
|
$drop = $(drop), |
||||||
|
pos, |
||||||
|
actualHeight, |
||||||
|
getPlacement = function($element) { |
||||||
|
$drop.addClass($element.attr('class')).toggleClass('dropup', $element.hasClass('dropup')); |
||||||
|
pos = $element.offset(); |
||||||
|
actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight; |
||||||
|
$drop.css({'top' : pos.top + actualHeight, 'left' : pos.left, 'width' : $element[0].offsetWidth, 'position' : 'absolute'}); |
||||||
|
}; |
||||||
|
this.$newElement.on('click', function() { |
||||||
|
getPlacement($(this)); |
||||||
|
$drop.appendTo(that.options.container); |
||||||
|
$drop.toggleClass('open', !$(this).hasClass('open')); |
||||||
|
$drop.append(that.$menu); |
||||||
|
}); |
||||||
|
$(window).resize(function() { |
||||||
|
getPlacement(that.$newElement); |
||||||
|
}); |
||||||
|
$(window).on('scroll', function() { |
||||||
|
getPlacement(that.$newElement); |
||||||
|
}); |
||||||
|
$('html').on('click', function(e) { |
||||||
|
if ($(e.target).closest(that.$newElement).length < 1) { |
||||||
|
$drop.removeClass('open'); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
mobile: function() { |
||||||
|
this.$element.addClass('mobile-device').appendTo(this.$newElement); |
||||||
|
if (this.options.container) this.$menu.hide(); |
||||||
|
}, |
||||||
|
|
||||||
|
refresh: function() { |
||||||
|
this.reloadLi(); |
||||||
|
this.render(); |
||||||
|
this.setWidth(); |
||||||
|
this.setStyle(); |
||||||
|
this.checkDisabled(); |
||||||
|
this.liHeight(); |
||||||
|
}, |
||||||
|
|
||||||
|
update: function() { |
||||||
|
this.reloadLi(); |
||||||
|
this.setWidth(); |
||||||
|
this.setStyle(); |
||||||
|
this.checkDisabled(); |
||||||
|
this.liHeight(); |
||||||
|
}, |
||||||
|
|
||||||
|
setSelected: function(index, selected) { |
||||||
|
this.$menu.find('li').eq(index).toggleClass('selected', selected); |
||||||
|
}, |
||||||
|
|
||||||
|
setDisabled: function(index, disabled) { |
||||||
|
if (disabled) { |
||||||
|
this.$menu.find('li').eq(index).addClass('disabled').find('a').attr('href','#').attr('tabindex',-1); |
||||||
|
} else { |
||||||
|
this.$menu.find('li').eq(index).removeClass('disabled').find('a').removeAttr('href').attr('tabindex',0); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
isDisabled: function() { |
||||||
|
return this.$element.is(':disabled'); |
||||||
|
}, |
||||||
|
|
||||||
|
checkDisabled: function() { |
||||||
|
var that = this; |
||||||
|
|
||||||
|
if (this.isDisabled()) { |
||||||
|
this.$button.addClass('disabled').attr('tabindex', -1); |
||||||
|
} else { |
||||||
|
if (this.$button.hasClass('disabled')) { |
||||||
|
this.$button.removeClass('disabled'); |
||||||
|
} |
||||||
|
|
||||||
|
if (this.$button.attr('tabindex') == -1) { |
||||||
|
if (!this.$element.data('tabindex')) this.$button.removeAttr('tabindex'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
this.$button.click(function() { |
||||||
|
return !that.isDisabled(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
tabIndex: function() { |
||||||
|
if (this.$element.is('[tabindex]')) { |
||||||
|
this.$element.data('tabindex', this.$element.attr("tabindex")); |
||||||
|
this.$button.attr('tabindex', this.$element.data('tabindex')); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
clickListener: function() { |
||||||
|
var that = this; |
||||||
|
|
||||||
|
$('body').on('touchstart.dropdown', '.dropdown-menu', function(e) { |
||||||
|
e.stopPropagation(); |
||||||
|
}); |
||||||
|
|
||||||
|
this.$newElement.on('click', function() { |
||||||
|
that.setSize(); |
||||||
|
}); |
||||||
|
|
||||||
|
this.$menu.on('click', 'li a', function(e) { |
||||||
|
var clickedIndex = $(this).parent().index(), |
||||||
|
prevValue = that.$element.val(); |
||||||
|
|
||||||
|
//Dont close on multi choice menu
|
||||||
|
if (that.multiple) { |
||||||
|
e.stopPropagation(); |
||||||
|
} |
||||||
|
|
||||||
|
e.preventDefault(); |
||||||
|
|
||||||
|
//Dont run if we have been disabled
|
||||||
|
if (!that.isDisabled() && !$(this).parent().hasClass('disabled')) { |
||||||
|
var $options = that.$element.find('option'); |
||||||
|
var $option = $options.eq(clickedIndex); |
||||||
|
|
||||||
|
//Deselect all others if not multi select box
|
||||||
|
if (!that.multiple) { |
||||||
|
$options.prop('selected', false); |
||||||
|
$option.prop('selected', true); |
||||||
|
} |
||||||
|
//Else toggle the one we have chosen if we are multi select.
|
||||||
|
else { |
||||||
|
var state = $option.prop('selected'); |
||||||
|
|
||||||
|
$option.prop('selected', !state); |
||||||
|
} |
||||||
|
|
||||||
|
that.$button.focus(); |
||||||
|
|
||||||
|
// Trigger select 'change'
|
||||||
|
if (prevValue != that.$element.val()) { |
||||||
|
that.$element.change(); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
this.$menu.on('click', 'li.disabled a, li dt, li .div-contain, h3.popover-title', function(e) { |
||||||
|
if (e.target == this) { |
||||||
|
e.preventDefault(); |
||||||
|
e.stopPropagation(); |
||||||
|
that.$button.focus(); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
this.$searchbox.on('click', function(e) { |
||||||
|
e.stopPropagation(); |
||||||
|
}); |
||||||
|
|
||||||
|
this.$element.change(function() { |
||||||
|
that.render(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
liveSearchListener: function() { |
||||||
|
var that = this; |
||||||
|
|
||||||
|
this.$newElement.on('click.dropdown.data-api', function(){ |
||||||
|
if(that.options.liveSearch) { |
||||||
|
setTimeout(function() { |
||||||
|
that.$searchbox.focus(); |
||||||
|
}, 10); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
this.$searchbox.on('keyup', function(e) { |
||||||
|
if(e.keyCode == 40) { |
||||||
|
// Down-arrow should go to the first visible item.
|
||||||
|
that.$menu.find('li:not(.divider):visible a').first().focus(); |
||||||
|
} |
||||||
|
else if(e.keyCode == 38) { |
||||||
|
// Up-arrow should go to the last visible item.
|
||||||
|
that.$menu.find('li:not(.divider):visible a').last().focus(); |
||||||
|
} |
||||||
|
else if (that.$searchbox.val()) { |
||||||
|
that.$menu.find('li').show().not(':icontains(' + that.$searchbox.val() + ')').hide(); |
||||||
|
} else { |
||||||
|
that.$menu.find('li').show(); |
||||||
|
} |
||||||
|
}).on('keydown', function(e) { |
||||||
|
if(e.keyCode == 13) { |
||||||
|
// Prevent return from submitting any form here (needs to be in keydown instead of keyup).
|
||||||
|
// Closes the dropdown and focuses it.
|
||||||
|
that.$button.click().focus(); |
||||||
|
e.preventDefault(); |
||||||
|
return false; |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
|
||||||
|
val: function(value) { |
||||||
|
|
||||||
|
if (value != undefined) { |
||||||
|
this.$element.val( value ); |
||||||
|
|
||||||
|
this.$element.change(); |
||||||
|
return this.$element; |
||||||
|
} else { |
||||||
|
return this.$element.val(); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
selectAll: function() { |
||||||
|
this.$element.find('option').prop('selected', true).attr('selected', 'selected'); |
||||||
|
this.render(); |
||||||
|
}, |
||||||
|
|
||||||
|
deselectAll: function() { |
||||||
|
this.$element.find('option').prop('selected', false).removeAttr('selected'); |
||||||
|
this.render(); |
||||||
|
}, |
||||||
|
|
||||||
|
keydown: function(e) { |
||||||
|
var that = $(this).parent().data('this'); |
||||||
|
// If the dropdown is closed, open it and move focus to the search box, if there is one.
|
||||||
|
if(that.$searchbox && that.$searchbox.is(':not(:visible)') && e.keyCode >= 48 && e.keyCode <= 90) { |
||||||
|
$(':focus').click(); |
||||||
|
that.$searchbox.focus(); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
keyup: function(e) { |
||||||
|
var $this, |
||||||
|
$items, |
||||||
|
$parent, |
||||||
|
that; |
||||||
|
|
||||||
|
$this = $(this); |
||||||
|
|
||||||
|
$parent = $this.parent(); |
||||||
|
|
||||||
|
that = $parent.data('this'); |
||||||
|
|
||||||
|
if (that.options.container) $parent = that.$menu; |
||||||
|
|
||||||
|
$items = $('[role=menu] li:not(.divider):visible a', $parent); |
||||||
|
|
||||||
|
if (!$items.length) return; |
||||||
|
|
||||||
|
if (/(38|40)/.test(e.keyCode) && that.$searchbox) { |
||||||
|
// Since we bind on keyup, the focus will have already changed here. Keep track of the last focused item and the current,
|
||||||
|
// and if they match (and are at the top or bottom of the list), move the focus to the searchbox.
|
||||||
|
var index = $items.index($(':focus')); |
||||||
|
var last = $this.data('lastIndex'); |
||||||
|
$this.data('lastIndex', index); |
||||||
|
if(index == last) { |
||||||
|
if(index == 0 || index == $items.length - 1) that.$searchbox.focus(); |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
var keyCodeMap = { |
||||||
|
48:"0", 49:"1", 50:"2", 51:"3", 52:"4", 53:"5", 54:"6", 55:"7", 56:"8", 57:"9", 59:";", |
||||||
|
65:"a", 66:"b", 67:"c", 68:"d", 69:"e", 70:"f", 71:"g", 72:"h", 73:"i", 74:"j", 75:"k", 76:"l", |
||||||
|
77:"m", 78:"n", 79:"o", 80:"p", 81:"q", 82:"r", 83:"s", 84:"t", 85:"u", 86:"v", 87:"w", 88:"x", 89:"y", 90:"z", |
||||||
|
96:"0", 97:"1", 98:"2", 99:"3", 100:"4", 101:"5", 102:"6", 103:"7", 104:"8", 105:"9" |
||||||
|
}; |
||||||
|
|
||||||
|
var keyIndex = []; |
||||||
|
|
||||||
|
$items.each(function() { |
||||||
|
if ($(this).parent().is(':not(.disabled)')) { |
||||||
|
if ($.trim($(this).text().toLowerCase()).substring(0,1) == keyCodeMap[e.keyCode]) { |
||||||
|
keyIndex.push($(this).parent().index()); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
var count = $(document).data('keycount'); |
||||||
|
count++; |
||||||
|
$(document).data('keycount',count); |
||||||
|
|
||||||
|
var prevKey = $.trim($(':focus').text().toLowerCase()).substring(0,1); |
||||||
|
|
||||||
|
if (prevKey != keyCodeMap[e.keyCode]) { |
||||||
|
count = 1; |
||||||
|
$(document).data('keycount',count); |
||||||
|
} else if (count >= keyIndex.length) { |
||||||
|
$(document).data('keycount',0); |
||||||
|
} |
||||||
|
|
||||||
|
$items.eq(keyIndex[count - 1]).focus(); |
||||||
|
} |
||||||
|
|
||||||
|
// Select focused option if "Enter", "Spacebar", "Tab" are pressed inside the menu.
|
||||||
|
if (/(13|32|9)/.test(e.keyCode) && $this.is('[role=menu]')) { |
||||||
|
e.preventDefault(); |
||||||
|
$(':focus').click(); |
||||||
|
$(document).data('keycount',0); |
||||||
|
} |
||||||
|
}, |
||||||
|
|
||||||
|
hide: function() { |
||||||
|
this.$newElement.hide(); |
||||||
|
}, |
||||||
|
|
||||||
|
show: function() { |
||||||
|
this.$newElement.show(); |
||||||
|
}, |
||||||
|
|
||||||
|
destroy: function() { |
||||||
|
this.$newElement.remove(); |
||||||
|
this.$element.remove(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
$.fn.selectpicker = function(option, event) { |
||||||
|
//get the args of the outer function..
|
||||||
|
var args = arguments; |
||||||
|
var value; |
||||||
|
var chain = this.each(function() { |
||||||
|
if ($(this).is('select')) { |
||||||
|
var $this = $(this), |
||||||
|
data = $this.data('selectpicker'), |
||||||
|
options = typeof option == 'object' && option; |
||||||
|
|
||||||
|
if (!data) { |
||||||
|
$this.data('selectpicker', (data = new Selectpicker(this, options, event))); |
||||||
|
} else if (options) { |
||||||
|
for(var i in options) { |
||||||
|
data.options[i] = options[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (typeof option == 'string') { |
||||||
|
//Copy the value of option, as once we shift the arguments
|
||||||
|
//it also shifts the value of option.
|
||||||
|
var property = option; |
||||||
|
if (data[property] instanceof Function) { |
||||||
|
[].shift.apply(args); |
||||||
|
value = data[property].apply(data, args); |
||||||
|
} else { |
||||||
|
value = data.options[property]; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
if (value != undefined) { |
||||||
|
return value; |
||||||
|
} else { |
||||||
|
return chain; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
$.fn.selectpicker.defaults = { |
||||||
|
style: 'btn-default', |
||||||
|
size: 'auto', |
||||||
|
title: null, |
||||||
|
selectedTextFormat : 'values', |
||||||
|
noneSelectedText : 'Nothing selected', |
||||||
|
countSelectedText: '{0} of {1} selected', |
||||||
|
width: false, |
||||||
|
container: false, |
||||||
|
hideDisabled: false, |
||||||
|
showSubtext: false, |
||||||
|
showIcon: true, |
||||||
|
showContent: true, |
||||||
|
dropupAuto: true, |
||||||
|
header: false, |
||||||
|
liveSearch: false |
||||||
|
}; |
||||||
|
|
||||||
|
$(document) |
||||||
|
.data('keycount', 0) |
||||||
|
.on('keydown', '.selectpicker[data-toggle=dropdown], .selectpicker[role=menu]' , Selectpicker.prototype.keydown) |
||||||
|
.on('keyup', '.selectpicker[data-toggle=dropdown], .selectpicker[role=menu]' , Selectpicker.prototype.keyup); |
||||||
|
|
||||||
|
}(window.jQuery); |
@ -0,0 +1,321 @@ |
|||||||
|
var DEBUG = true; |
||||||
|
var selectedUser = null; |
||||||
|
var auth_pending = null; |
||||||
|
var users_shown = null; |
||||||
|
|
||||||
|
function buildUserList() { |
||||||
|
// User list building
|
||||||
|
var userList = document.getElementById('user-list2'); |
||||||
|
for (var i in lightdm.users) { |
||||||
|
var user = lightdm.users[i]; |
||||||
|
var tux = 'img/antergos-logo-user.png'; |
||||||
|
var imageSrc = user.image.length > 0 ? user.image : tux; |
||||||
|
var lastSession = localStorage.getItem(user.name); |
||||||
|
if (lastSession == null || lastSession == undefined) { |
||||||
|
localStorage.setItem(user.name, lightdm.default_session); |
||||||
|
lastSession = localStorage.getItem(user.name); |
||||||
|
} |
||||||
|
log('Last Session (' + user.name + '): ' + lastSession); |
||||||
|
var li = '<a href="#' + user.name + '" class="list-group-item ' + user.name + '" onclick="startAuthentication(\'' + user.name + '\')" session="' + lastSession + '">' + |
||||||
|
'<img src="' + imageSrc + '" class="img-square" alt="' + user.display_name + '" onerror="imgNotFound(this)"/> ' + |
||||||
|
'<span>' + user.display_name + '</span>' + |
||||||
|
'<span class="badge"><i class="fa fa-check"></i></span>' + |
||||||
|
'</a>'; |
||||||
|
$(userList).append(li); |
||||||
|
} |
||||||
|
} |
||||||
|
function buildSessionList() { |
||||||
|
// Build Session List
|
||||||
|
for (i in lightdm.sessions) { |
||||||
|
var session = lightdm.sessions[i]; |
||||||
|
var btnGrp = document.getElementById('sessions'); |
||||||
|
var theClass = session.name.replace(/ /g, ''); |
||||||
|
var button = '\n<li><a href="#" id="' + session.key + '" onclick="sessionToggle(this)" class="' + theClass + '">' + session.name + '</a></li>'; |
||||||
|
|
||||||
|
$(btnGrp).append(button); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
function show_users() { |
||||||
|
if ($('#collapseOne').hasClass('in')) { |
||||||
|
$('#trigger').trigger('click'); |
||||||
|
users_shown = true; |
||||||
|
} |
||||||
|
if ($('#user-list2 a').length <= 1) $('#user-list2 a').trigger('click'); |
||||||
|
|
||||||
|
} |
||||||
|
/** |
||||||
|
* UI Initialization. |
||||||
|
*/ |
||||||
|
$(document).ready(function () { |
||||||
|
|
||||||
|
initialize_timer(); |
||||||
|
get_hostname(); |
||||||
|
|
||||||
|
buildUserList(); |
||||||
|
buildSessionList(); |
||||||
|
// Password submit when enter key is pressed
|
||||||
|
|
||||||
|
$(document).keydown(function (e) { |
||||||
|
checkKey(e); |
||||||
|
}); |
||||||
|
// Action buttons
|
||||||
|
addActionLink("shutdown"); |
||||||
|
addActionLink("hibernate"); |
||||||
|
addActionLink("suspend"); |
||||||
|
addActionLink("restart"); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
function get_hostname() { |
||||||
|
var hostname = lightdm.hostname; |
||||||
|
var hostname_span = document.getElementById('hostname'); |
||||||
|
$(hostname_span).append(hostname); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Actions management. |
||||||
|
* |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
function update_time() { |
||||||
|
var time = document.getElementById("current_time"); |
||||||
|
var date = new Date(); |
||||||
|
var twelveHr = [ |
||||||
|
'sq-al', |
||||||
|
'zh-cn', |
||||||
|
'zh-tw', |
||||||
|
'en-au', |
||||||
|
'en-bz', |
||||||
|
'en-ca', |
||||||
|
'en-cb', |
||||||
|
'en-jm', |
||||||
|
'en-ng', |
||||||
|
'en-nz', |
||||||
|
'en-ph', |
||||||
|
'en-us', |
||||||
|
'en-tt', |
||||||
|
'en-zw', |
||||||
|
'es-us', |
||||||
|
'es-mx']; |
||||||
|
var userLang = window.navigator.language; |
||||||
|
var is_twelveHr = twelveHr.indexOf(userLang); |
||||||
|
var hh = date.getHours(); |
||||||
|
var mm = date.getMinutes(); |
||||||
|
var suffix = "AM"; |
||||||
|
if (hh >= 12) { |
||||||
|
suffix = "PM"; |
||||||
|
if (is_twelveHr !== -1 && is_twelveHr !== 12) { |
||||||
|
hh = hh - 12; |
||||||
|
} |
||||||
|
} |
||||||
|
if (mm < 10) { |
||||||
|
mm = "0" + mm; |
||||||
|
} |
||||||
|
if (hh === 0 && is_twelveHr !== -1) { |
||||||
|
hh = 12; |
||||||
|
} |
||||||
|
time.innerHTML = hh + ":" + mm + " " + suffix; |
||||||
|
} |
||||||
|
|
||||||
|
function initialize_timer() { |
||||||
|
var userLang = window.navigator.language; |
||||||
|
log(userLang); |
||||||
|
update_time(); |
||||||
|
setInterval(update_time, 60000); |
||||||
|
} |
||||||
|
|
||||||
|
function checkKey(event){ |
||||||
|
var action; |
||||||
|
switch (event.which) { |
||||||
|
case 13: |
||||||
|
action = auth_pending ? submitPassword() : !users_shown ? show_users() : 0; |
||||||
|
log(action); |
||||||
|
break; |
||||||
|
case 27: |
||||||
|
action = auth_pending ? cancelAuthentication() : 0; |
||||||
|
log(action); |
||||||
|
break; |
||||||
|
case 32: |
||||||
|
action = !users_shown ? show_users() : 0; |
||||||
|
log(action); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function addActionLink(id) { |
||||||
|
if (eval("lightdm.can_" + id)) { |
||||||
|
var label = id.substr(0, 1).toUpperCase() + id.substr(1, id.length - 1); |
||||||
|
var id2; |
||||||
|
if (id == "shutdown") { |
||||||
|
id2 = "power-off" |
||||||
|
} |
||||||
|
if (id == "hibernate") { |
||||||
|
id2 = "asterisk" |
||||||
|
} |
||||||
|
if (id == "suspend") { |
||||||
|
id2 = "arrow-down" |
||||||
|
} |
||||||
|
if (id == "restart") { |
||||||
|
id2 = "refresh" |
||||||
|
} |
||||||
|
$("#actionsArea").append('\n<button type="button" class="btn btn-default ' + id + '" data-toggle="tooltip" data-placement="top" title="' + label + '" data-container="body" onclick="handleAction(\'' + id + '\')"><i class="fa fa-' + id2 + '"></i></button>'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function capitalize(string) { |
||||||
|
return string.charAt(0).toUpperCase() + string.slice(1); |
||||||
|
} |
||||||
|
|
||||||
|
function handleAction(id) { |
||||||
|
log("handleAction(" + id + ")"); |
||||||
|
eval("lightdm." + id + "()"); |
||||||
|
} |
||||||
|
|
||||||
|
function getUserObj(username) { |
||||||
|
var user = null; |
||||||
|
for (var i = 0; i < lightdm.users.length; ++i) { |
||||||
|
if (lightdm.users[i].name == username) { |
||||||
|
user = lightdm.users[i]; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return user; |
||||||
|
} |
||||||
|
|
||||||
|
function getSessionObj(sessionname) { |
||||||
|
var session = null; |
||||||
|
for (var i = 0; i < lightdm.sessions.length; ++i) { |
||||||
|
if (lightdm.sessions[i].name == sessionname) { |
||||||
|
session = lightdm.sessions[i]; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return session; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function startAuthentication(userId) { |
||||||
|
log("startAuthentication(" + userId + ")"); |
||||||
|
|
||||||
|
if (selectedUser !== null) { |
||||||
|
lightdm.cancel_authentication(); |
||||||
|
localStorage.setItem('selUser', null); |
||||||
|
log("authentication cancelled for " + selectedUser); |
||||||
|
} |
||||||
|
localStorage.setItem('selUser', userId); |
||||||
|
selectedUser = '.' + userId; |
||||||
|
$(selectedUser).addClass('hovered'); |
||||||
|
$(selectedUser).siblings().hide(); |
||||||
|
$('.fa-toggle-down').hide(); |
||||||
|
|
||||||
|
|
||||||
|
var usrSession = localStorage.getItem(userId); |
||||||
|
|
||||||
|
log("usrSession: " + usrSession); |
||||||
|
var usrSessionEl = "#" + usrSession; |
||||||
|
var usrSessionName = $(usrSessionEl).html(); |
||||||
|
log("usrSessionName: " + usrSessionName); |
||||||
|
$('.selected').html(usrSessionName); |
||||||
|
$('.selected').attr('id', usrSession); |
||||||
|
$('#session-list').removeClass('hidden'); |
||||||
|
$('#passwordArea').show(); |
||||||
|
auth_pending = true; |
||||||
|
|
||||||
|
lightdm.start_authentication(userId); |
||||||
|
} |
||||||
|
|
||||||
|
function cancelAuthentication() { |
||||||
|
log("cancelAuthentication()"); |
||||||
|
$('#statusArea').hide(); |
||||||
|
$('#timerArea').hide(); |
||||||
|
$('#passwordArea').hide(); |
||||||
|
$('#session-list').hide(); |
||||||
|
if (selectedUser != null) { |
||||||
|
lightdm.cancel_authentication(); |
||||||
|
log("authentication cancelled for " + selectedUser); |
||||||
|
$('.list-group-item.hovered').removeClass('hovered').siblings().show(); |
||||||
|
$('.fa-toggle-down').show(); |
||||||
|
selectedUser = null; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
function submitPassword() { |
||||||
|
log("provideSecret()"); |
||||||
|
lightdm.provide_secret($('#passwordField').val()); |
||||||
|
$('#passwordArea').hide(); |
||||||
|
$('#timerArea').show(); |
||||||
|
log("done"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Image loading management. |
||||||
|
*/ |
||||||
|
|
||||||
|
function imgNotFound(source) { |
||||||
|
source.src = 'img/antergos-logo-user.png'; |
||||||
|
source.onerror = ""; |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
function sessionToggle(el) { |
||||||
|
var selText = $(el).text(); |
||||||
|
var theID = $(el).attr('id'); |
||||||
|
var selUser = localStorage.getItem('selUser'); |
||||||
|
$(el).parents('.btn-group').find('.selected').attr('id', theID); |
||||||
|
$(el).parents('.btn-group').find('.selected').html(selText); |
||||||
|
localStorage.setItem(selUser, theID) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Lightdm Callbacks |
||||||
|
*/ |
||||||
|
function show_prompt(text) { |
||||||
|
log("show_prompt(" + text + ")"); |
||||||
|
$('#passwordField').val(""); |
||||||
|
$('#passwordArea').show(); |
||||||
|
$('#passwordField').focus(); |
||||||
|
} |
||||||
|
|
||||||
|
function authentication_complete() { |
||||||
|
log("authentication_complete()"); |
||||||
|
auth_pending = false; |
||||||
|
$('#timerArea').hide(); |
||||||
|
var selSession = $('.selected').attr('id'); |
||||||
|
if (lightdm.is_authenticated) { |
||||||
|
log("authenticated !"); |
||||||
|
lightdm.login(lightdm.authentication_user, selSession); |
||||||
|
} else { |
||||||
|
log("not authenticated !"); |
||||||
|
$('#statusArea').show(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function show_message(text) { |
||||||
|
msgWrap = document.getElementById('statusArea'); |
||||||
|
showMsg = document.getElementById('showMsg'); |
||||||
|
showMsg.innerHTML = text; |
||||||
|
if (text.length > 0) { |
||||||
|
$('#passwordArea').hide(); |
||||||
|
$(msgWrap).show(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function show_error(text) { |
||||||
|
show_message(text); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Logs. |
||||||
|
*/ |
||||||
|
function log(text) { |
||||||
|
if (DEBUG) { |
||||||
|
$('#logArea').append(text); |
||||||
|
$('#logArea').append('<br/>'); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,129 @@ |
|||||||
|
// mock lighdm for testing
|
||||||
|
if (typeof lightdm == 'undefined') { |
||||||
|
lightdm= {}; |
||||||
|
lightdm.hostname="test-host"; |
||||||
|
lightdm.languages= [{code: "en_US", name: "English(US)", territory: "USA"}, {code: "en_UK", name: "English(UK)", territory: "UK"}]; |
||||||
|
lightdm.default_language= lightdm.languages[0]; |
||||||
|
lightdm.layouts= [{name: "test", short_description: "test description", short_description:"really long epic description"}]; |
||||||
|
lightdm.default_layout= lightdm.layouts[0]; |
||||||
|
lightdm.layout= lightdm.layouts[0]; |
||||||
|
lightdm.sessions=[{key: "key1", name: "gnome", comment: "no comment"}, {key: "key2", name: "cinnamon", comment: "no comment"},{key: "key3", name: "openbox", comment: "no comment"}, {key: "key4", name: "kde", comment: "no comment"}]; |
||||||
|
|
||||||
|
lightdm.default_session=lightdm.sessions[0]; |
||||||
|
lightdm.authentication_user= null; |
||||||
|
lightdm.is_authenticated= false; |
||||||
|
lightdm.can_suspend= true; |
||||||
|
lightdm.can_hibernate= true; |
||||||
|
lightdm.can_restart= true; |
||||||
|
lightdm.can_shutdown= true; |
||||||
|
|
||||||
|
lightdm.users = [ |
||||||
|
{ name: "clarkk", real_name: "Superman", display_name: "Clark Kent", image: "", language: "en_US", layout: null, session: "gnome", logged_in: false }, |
||||||
|
{ name: "brucew", real_name: "Batman", display_name: "Bruce Wayne", image: "", language: "en_US", layout: null, session: "cinnamon", logged_in: false}, |
||||||
|
{ name: "peterp", real_name: "Spiderman", display_name: "Peter Parker", image: "", language: "en_US", layout: null, session: "gnome", logged_in: true}, |
||||||
|
]; |
||||||
|
|
||||||
|
lightdm.num_users= lightdm.users.length; |
||||||
|
lightdm.timed_login_delay= 0; //set to a number higher than 0 for timed login simulation
|
||||||
|
lightdm.timed_login_user= lightdm.timed_login_delay > 0 ? lightdm.users[0] : null; |
||||||
|
|
||||||
|
lightdm.get_string_property= function() {}; |
||||||
|
lightdm.get_integer_property= function() {}; |
||||||
|
lightdm.get_boolean_property= function() {}; |
||||||
|
lightdm.cancel_timed_login= function() { |
||||||
|
_lightdm_mock_check_argument_length(arguments, 0); |
||||||
|
lightdm._timed_login_cancelled= true; |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.provide_secret= function(secret) { |
||||||
|
if (typeof lightdm._username == 'undefined' || !lightdm._username) { |
||||||
|
throw "must call start_authentication first" |
||||||
|
} |
||||||
|
_lightdm_mock_check_argument_length(arguments, 1); |
||||||
|
var user= _lightdm_mock_get_user(lightdm.username); |
||||||
|
|
||||||
|
if (!user && secret == lightdm._username) { |
||||||
|
lightdm.is_authenticated= true; |
||||||
|
lightdm.authentication_user= user; |
||||||
|
} else { |
||||||
|
lightdm.is_authenticated= false; |
||||||
|
lightdm.authentication_user= null; |
||||||
|
lightdm._username= null; |
||||||
|
} |
||||||
|
authentication_complete(); |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.start_authentication= function(username) { |
||||||
|
_lightdm_mock_check_argument_length(arguments, 1); |
||||||
|
if (lightdm._username) { |
||||||
|
throw "Already authenticating!"; |
||||||
|
} |
||||||
|
var user= _lightdm_mock_get_user(username); |
||||||
|
if (!user) { |
||||||
|
show_error(username + " is an invalid user"); |
||||||
|
} |
||||||
|
show_prompt("Password: "); |
||||||
|
lightdm._username= username; |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.cancel_authentication= function() { |
||||||
|
_lightdm_mock_check_argument_length(arguments, 0); |
||||||
|
if (!lightdm._username) { |
||||||
|
throw "we are not authenticating"; |
||||||
|
} |
||||||
|
lightdm._username= null; |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.suspend= function() { |
||||||
|
alert("System Suspended. Bye Bye"); |
||||||
|
document.location.reload(true); |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.hibernate= function() { |
||||||
|
alert("System Hibernated. Bye Bye"); |
||||||
|
document.location.reload(true); |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.restart= function() { |
||||||
|
alert("System restart. Bye Bye"); |
||||||
|
document.location.reload(true); |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.shutdown= function() { |
||||||
|
alert("System Shutdown. Bye Bye"); |
||||||
|
document.location.reload(true); |
||||||
|
}; |
||||||
|
|
||||||
|
lightdm.login= function(user, session) { |
||||||
|
_lightdm_mock_check_argument_length(arguments, 2); |
||||||
|
if (!lightdm.is_authenticated) { |
||||||
|
throw "The system is not authenticated"; |
||||||
|
} |
||||||
|
if (user !== lightdm.authentication_user) { |
||||||
|
throw "this user is not authenticated"; |
||||||
|
} |
||||||
|
alert("logged in successfully!!"); |
||||||
|
document.location.reload(true); |
||||||
|
}; |
||||||
|
|
||||||
|
if (lightdm.timed_login_delay > 0) { |
||||||
|
setTimeout(function() { if (!lightdm._timed_login_cancelled()) timed_login();}, lightdm.timed_login_delay); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function _lightdm_mock_check_argument_length(args, length) { |
||||||
|
if (args.length != length) { |
||||||
|
throw "incorrect number of arguments in function call"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function _lightdm_mock_get_user(username) { |
||||||
|
var user= null; |
||||||
|
for (var i= 0; i < lightdm.users.length; ++i) { |
||||||
|
if (lightdm.users[i].name == username) { |
||||||
|
user= lightdm.users[i]; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return user; |
||||||
|
} |
After Width: | Height: | Size: 369 KiB |