Compare commits
	
		
			9 Commits
		
	
	
		
			v0
			...
			efd9e3de04
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| efd9e3de04 | |||
| 358968327d | |||
| b96074afe0 | |||
| e2afd229a6 | |||
| 5b9a369114 | |||
| 43c0b96405 | |||
| 48ff1a671e | |||
| 96497ff89d | |||
| 2d605c85a2 | 
							
								
								
									
										21
									
								
								LICENCE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENCE
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					MIT License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2020 Raatty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above copyright notice and this permission notice shall be included in all
 | 
				
			||||||
 | 
					copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||||
 | 
					SOFTWARE.
 | 
				
			||||||
							
								
								
									
										10
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					PREFIX ?= /usr/local
 | 
				
			||||||
 | 
					BINDIR ?= $(PREFIX)/bin
 | 
				
			||||||
 | 
					DATADIR ?= $(PREFIX)/share
 | 
				
			||||||
 | 
					CONFDIR = /etc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install:
 | 
				
			||||||
 | 
						sed "s#%DATADIR%#$(DATADIR)#" lightdm-mobile-greeter.py > lightdm-mobile-greeter
 | 
				
			||||||
 | 
						install -Dm755 lightdm-mobile-greeter -t $(DESTDIR)$(BINDIR)
 | 
				
			||||||
 | 
						install -Dm644 style.css interface.ui -t $(DESTDIR)$(DATADIR)/lightdm-mobile-greeter
 | 
				
			||||||
 | 
						install -Dm644 lightdm-mobile-greeter.desktop -t $(DESTDIR)$(DATADIR)/xgreeters
 | 
				
			||||||
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					# Lightdm mobile greeter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A simple log in screen for use on touch screens, designed for use on postmarketOS but should work for others too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Installing
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					make install
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					## Configuring
 | 
				
			||||||
 | 
					As of version 3 I will now try to guess the user.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lightdm.conf
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					greeter-session=lightdm-mobile-greeter
 | 
				
			||||||
 | 
					user-session=<THE CHOSEN DE TO LAUNCH AFTER SUCCESSFUL LOGIN>
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										121
									
								
								interface.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								interface.ui
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<interface>
 | 
				
			||||||
 | 
					  <requires lib="gtk+" version="3.20"/>
 | 
				
			||||||
 | 
					  <requires lib="libhandy" version="0.0"/>
 | 
				
			||||||
 | 
					  <object class="GtkWindow" id="greeter_window">
 | 
				
			||||||
 | 
					    <signal name="destroy" handler="on_destry"/>
 | 
				
			||||||
 | 
					    <child>
 | 
				
			||||||
 | 
					      <object class="GtkScrolledWindow">
 | 
				
			||||||
 | 
					        <property name="visible">True</property>
 | 
				
			||||||
 | 
					        <child>
 | 
				
			||||||
 | 
					          <object class="GtkViewport">
 | 
				
			||||||
 | 
					            <property name="visible">True</property>
 | 
				
			||||||
 | 
					            <child>
 | 
				
			||||||
 | 
					              <object class="GtkBox" id="container">
 | 
				
			||||||
 | 
					                <property name="visible">True</property>
 | 
				
			||||||
 | 
					                <property name="can_focus">False</property>
 | 
				
			||||||
 | 
					                <property name="orientation">vertical</property>
 | 
				
			||||||
 | 
					                <property name="halign">center</property>
 | 
				
			||||||
 | 
					                <property name="valign">center</property>
 | 
				
			||||||
 | 
					                <property name="spacing">12</property>
 | 
				
			||||||
 | 
					                <child>
 | 
				
			||||||
 | 
					                  <object class="GtkLabel" id="prompt_label">
 | 
				
			||||||
 | 
					                      <property name="visible">True</property>
 | 
				
			||||||
 | 
					                      <property name="label">prompt label</property>
 | 
				
			||||||
 | 
					                      <style>
 | 
				
			||||||
 | 
					                        <class name="prompt" />
 | 
				
			||||||
 | 
					                      </style>
 | 
				
			||||||
 | 
					                  </object>
 | 
				
			||||||
 | 
					                </child>
 | 
				
			||||||
 | 
					                <child>
 | 
				
			||||||
 | 
					                  <object class="GtkEntry" id="pin_entry">
 | 
				
			||||||
 | 
					                    <property name="visible">True</property>
 | 
				
			||||||
 | 
					                    <property name="can_focus">True</property>
 | 
				
			||||||
 | 
					                    <property name="has_frame">False</property>
 | 
				
			||||||
 | 
					                    <property name="margin_top">12</property>
 | 
				
			||||||
 | 
					                    <property name="margin_bottom">12</property>
 | 
				
			||||||
 | 
					                    <property name="visibility">False</property>
 | 
				
			||||||
 | 
					                    <property name="buffer">entry_buffer</property>
 | 
				
			||||||
 | 
					                    <property name="input_purpose">GTK_INPUT_PURPOSE_PIN</property>
 | 
				
			||||||
 | 
					                    <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
					                    <property name="caps_lock_warning">False</property>
 | 
				
			||||||
 | 
					                    <property name="hexpand">True</property>
 | 
				
			||||||
 | 
					                    <property name="vexpand">True</property>
 | 
				
			||||||
 | 
					                    <style>
 | 
				
			||||||
 | 
					                      <class name="pin" />
 | 
				
			||||||
 | 
					                    </style>
 | 
				
			||||||
 | 
					                  </object>
 | 
				
			||||||
 | 
					                </child>
 | 
				
			||||||
 | 
					                <child>
 | 
				
			||||||
 | 
					                  <object class="HdyKeypad">
 | 
				
			||||||
 | 
					                    <property name="visible">True</property>
 | 
				
			||||||
 | 
					                    <property name="can_focus">False</property>
 | 
				
			||||||
 | 
					                    <property name="halign">fill</property>
 | 
				
			||||||
 | 
					                    <property name="valign">fill</property>
 | 
				
			||||||
 | 
					                    <property name="margin_top">12</property>
 | 
				
			||||||
 | 
					                    <property name="margin_bottom">12</property>
 | 
				
			||||||
 | 
					                    <property name="only_digits">True</property>
 | 
				
			||||||
 | 
					                    <property name="show_symbols">False</property>
 | 
				
			||||||
 | 
					                    <property name="right_action">delete_btn</property>
 | 
				
			||||||
 | 
					                    <property name="left_action">settings_btn</property>
 | 
				
			||||||
 | 
					                    <property name="entry">pin_entry</property>
 | 
				
			||||||
 | 
					                    <style>
 | 
				
			||||||
 | 
					                      <class name="keypad"/>
 | 
				
			||||||
 | 
					                    </style>
 | 
				
			||||||
 | 
					                  </object>
 | 
				
			||||||
 | 
					                </child>
 | 
				
			||||||
 | 
					                <child>
 | 
				
			||||||
 | 
					                  <object class="GtkButton">
 | 
				
			||||||
 | 
					                    <property name="visible">True</property>
 | 
				
			||||||
 | 
					                    <property name="label">Login</property>
 | 
				
			||||||
 | 
					                    <signal name="clicked" handler="login_cb"/>
 | 
				
			||||||
 | 
					                    <style>
 | 
				
			||||||
 | 
					                      <class name="login_btn"/>
 | 
				
			||||||
 | 
					                    </style>
 | 
				
			||||||
 | 
					                  </object>
 | 
				
			||||||
 | 
					                </child>
 | 
				
			||||||
 | 
					                <child>
 | 
				
			||||||
 | 
					                  <object class="GtkLabel" id="message_label">
 | 
				
			||||||
 | 
					                      <property name="visible">True</property>
 | 
				
			||||||
 | 
					                      <property name="label"></property>
 | 
				
			||||||
 | 
					                  </object>
 | 
				
			||||||
 | 
					                </child>
 | 
				
			||||||
 | 
					              </object>
 | 
				
			||||||
 | 
					            </child>
 | 
				
			||||||
 | 
					          </object>
 | 
				
			||||||
 | 
					        </child>
 | 
				
			||||||
 | 
					      </object>
 | 
				
			||||||
 | 
					    </child>
 | 
				
			||||||
 | 
					  </object>
 | 
				
			||||||
 | 
					  <object class="GtkEntryBuffer" id="entry_buffer" />
 | 
				
			||||||
 | 
					  <object class="GtkButton" id="delete_btn">
 | 
				
			||||||
 | 
					    <property name="visible">True</property>
 | 
				
			||||||
 | 
					    <property name="can_focus">True</property>
 | 
				
			||||||
 | 
					    <property name="focus-on-click">False</property>
 | 
				
			||||||
 | 
					    <signal name="clicked" handler="backspace"/>
 | 
				
			||||||
 | 
					    <child>
 | 
				
			||||||
 | 
					      <object class="GtkImage">
 | 
				
			||||||
 | 
					        <property name="visible">True</property>
 | 
				
			||||||
 | 
					        <property name="icon_name">edit-clear-symbolic</property>
 | 
				
			||||||
 | 
					        <property name="icon_size">6</property>
 | 
				
			||||||
 | 
					      </object>
 | 
				
			||||||
 | 
					    </child>
 | 
				
			||||||
 | 
					  </object>
 | 
				
			||||||
 | 
					  <object class="GtkButton" id="settings_btn">
 | 
				
			||||||
 | 
					    <property name="visible">True</property>
 | 
				
			||||||
 | 
					    <property name="can_focus">True</property>
 | 
				
			||||||
 | 
					    <property name="focus-on-click">False</property>
 | 
				
			||||||
 | 
					    <signal name="clicked" handler="de_popover"/>
 | 
				
			||||||
 | 
					    <child>
 | 
				
			||||||
 | 
					      <object class="GtkImage">
 | 
				
			||||||
 | 
					        <property name="visible">True</property>
 | 
				
			||||||
 | 
					        <property name="icon_name">applications-system-symbolic</property>
 | 
				
			||||||
 | 
					        <property name="icon_size">6</property>
 | 
				
			||||||
 | 
					      </object>
 | 
				
			||||||
 | 
					    </child>
 | 
				
			||||||
 | 
					  </object>
 | 
				
			||||||
 | 
					  <object class="GtkPopover" id="de_select">
 | 
				
			||||||
 | 
					    <property name="relative_to">settings_btn</property>
 | 
				
			||||||
 | 
					    <property name="position">GTK_POS_RIGHT</property>
 | 
				
			||||||
 | 
					  </object>
 | 
				
			||||||
 | 
					</interface>
 | 
				
			||||||
@@ -1,128 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/python3
 | 
					 | 
				
			||||||
import gi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gi.require_version("Gtk", "3.0")
 | 
					 | 
				
			||||||
gi.require_version("Handy", "0.0")
 | 
					 | 
				
			||||||
#gi.require_version("LightDM", 0.0)
 | 
					 | 
				
			||||||
from gi.repository import Gtk, Handy, LightDM, Gdk
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# main window
 | 
					 | 
				
			||||||
window = Gtk.Window()
 | 
					 | 
				
			||||||
window.connect("destroy", Gtk.main_quit)
 | 
					 | 
				
			||||||
display = Gdk.Display.get_default()
 | 
					 | 
				
			||||||
monitor = display.get_monitor(0)
 | 
					 | 
				
			||||||
screen_size = monitor.get_geometry()
 | 
					 | 
				
			||||||
window.set_size_request(screen_size.width, screen_size.height)
 | 
					 | 
				
			||||||
# window.set_resizable(False)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# scrollable view
 | 
					 | 
				
			||||||
scroll = Gtk.ScrolledWindow(visible=True)
 | 
					 | 
				
			||||||
window.add(scroll)
 | 
					 | 
				
			||||||
viewport = Gtk.Viewport(visible=True)
 | 
					 | 
				
			||||||
scroll.add(viewport)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# collomn box
 | 
					 | 
				
			||||||
container = Gtk.Box(
 | 
					 | 
				
			||||||
    visible=True,
 | 
					 | 
				
			||||||
    can_focus=False,
 | 
					 | 
				
			||||||
    orientation="vertical",
 | 
					 | 
				
			||||||
    halign="center",
 | 
					 | 
				
			||||||
    valign="center",
 | 
					 | 
				
			||||||
    hexpand=True,
 | 
					 | 
				
			||||||
    vexpand=True,
 | 
					 | 
				
			||||||
    spacing=12
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
container.set_size_request(screen_size.width * 0.9, screen_size.height * 0.9)
 | 
					 | 
				
			||||||
viewport.add(container)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# entry buffer
 | 
					 | 
				
			||||||
entry_buffer = Gtk.EntryBuffer()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# backspace
 | 
					 | 
				
			||||||
def backspace(btn):
 | 
					 | 
				
			||||||
    length = entry_buffer.get_length()
 | 
					 | 
				
			||||||
    if length <= 0:
 | 
					 | 
				
			||||||
        # theres no text left to delete
 | 
					 | 
				
			||||||
        return
 | 
					 | 
				
			||||||
    text = entry_buffer.get_text()
 | 
					 | 
				
			||||||
    print(text)
 | 
					 | 
				
			||||||
    entry_buffer.delete_text(length - 1, 1)
 | 
					 | 
				
			||||||
    text2 = entry_buffer.get_text()
 | 
					 | 
				
			||||||
    print(text2)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
delete_btn = Gtk.Button(visible=True, can_focus=True, focus_on_click=False)
 | 
					 | 
				
			||||||
db_img = Gtk.Image(visible=True, icon_name="edit-clear-symbolic")
 | 
					 | 
				
			||||||
delete_btn.add(db_img)
 | 
					 | 
				
			||||||
delete_btn.connect("clicked", backspace)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# entry
 | 
					 | 
				
			||||||
pin_entry = Gtk.Entry(
 | 
					 | 
				
			||||||
    visible=True,
 | 
					 | 
				
			||||||
    can_focus=False,
 | 
					 | 
				
			||||||
    has_frame=False,
 | 
					 | 
				
			||||||
    margin_top=12,
 | 
					 | 
				
			||||||
    margin_bottom=12,
 | 
					 | 
				
			||||||
    visibility=False,
 | 
					 | 
				
			||||||
    buffer=entry_buffer,
 | 
					 | 
				
			||||||
    input_purpose=Gtk.InputPurpose.PIN,
 | 
					 | 
				
			||||||
    xalign=0.5,
 | 
					 | 
				
			||||||
    caps_lock_warning=False,
 | 
					 | 
				
			||||||
    hexpand=True,
 | 
					 | 
				
			||||||
    vexpand=True,
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
container.add(pin_entry)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# keypad
 | 
					 | 
				
			||||||
keypad = Handy.Keypad(
 | 
					 | 
				
			||||||
    visible=True,
 | 
					 | 
				
			||||||
    can_focus=False,
 | 
					 | 
				
			||||||
    halign="fill",
 | 
					 | 
				
			||||||
    valign="fill",
 | 
					 | 
				
			||||||
    margin_top=12,
 | 
					 | 
				
			||||||
    margin_bottom=12,
 | 
					 | 
				
			||||||
    only_digits=True,
 | 
					 | 
				
			||||||
    show_symbols=False,
 | 
					 | 
				
			||||||
    right_action=delete_btn,
 | 
					 | 
				
			||||||
    entry=pin_entry,
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
container.add(keypad)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# greeter
 | 
					 | 
				
			||||||
greeter = LightDM.Greeter()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def login_clicked(btn):
 | 
					 | 
				
			||||||
#    greeter.authenticate("demo")
 | 
					 | 
				
			||||||
    greeter.respond(pin_entry.get_text())
 | 
					 | 
				
			||||||
    if greeter.get_is_authenticated():
 | 
					 | 
				
			||||||
        greeter.start_session_sync(None)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# login button
 | 
					 | 
				
			||||||
login_btn = Gtk.Button(label="Login", visible=True)
 | 
					 | 
				
			||||||
login_btn.connect("clicked", login_clicked)
 | 
					 | 
				
			||||||
container.add(login_btn)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# prompt label
 | 
					 | 
				
			||||||
prompt_label = Gtk.Label(visible=True)
 | 
					 | 
				
			||||||
container.add(prompt_label)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# message label
 | 
					 | 
				
			||||||
message_label = Gtk.Label(visible=True)
 | 
					 | 
				
			||||||
container.add(message_label)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
greeter.connect(
 | 
					 | 
				
			||||||
    "authentication-complete",
 | 
					 | 
				
			||||||
    lambda g: g.get_is_authenticated() and g.start_session_sync(None),
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
greeter.connect("show-message", lambda g, m, pt: message_label.set_text(m))
 | 
					 | 
				
			||||||
greeter.connect("show-prompt", lambda g, m, t: prompt_label.set_text(m))
 | 
					 | 
				
			||||||
greeter.connect_sync()
 | 
					 | 
				
			||||||
greeter.authenticate("demo")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
window.show()
 | 
					 | 
				
			||||||
window.fullscreen()
 | 
					 | 
				
			||||||
Gtk.main()
 | 
					 | 
				
			||||||
							
								
								
									
										86
									
								
								lightdm-mobile-greeter.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								lightdm-mobile-greeter.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/python3
 | 
				
			||||||
 | 
					import gi
 | 
				
			||||||
 | 
					from gi.repository import Gtk, Gdk, Handy, LightDM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Handler:
 | 
				
			||||||
 | 
					    def __init__(self, builder: Gtk.Builder):
 | 
				
			||||||
 | 
					        self.pin_entry = builder.get_object("entry_buffer")
 | 
				
			||||||
 | 
					        self.greeter = LightDM.Greeter()
 | 
				
			||||||
 | 
					        self.greeter.connect("authentication-complete", self.auth_complete)
 | 
				
			||||||
 | 
					        self.greeter.connect("show-message", self.show_msg)
 | 
				
			||||||
 | 
					        self.greeter.connect("show-prompt", self.show_prompt)
 | 
				
			||||||
 | 
					        self.pmpt_label = builder.get_object("prompt_label")
 | 
				
			||||||
 | 
					        self.msg_label = builder.get_object("message_label")
 | 
				
			||||||
 | 
					        self.de_select = builder.get_object("de_select")
 | 
				
			||||||
 | 
					        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, visible=True)
 | 
				
			||||||
 | 
					        self.de_select.add(vbox)
 | 
				
			||||||
 | 
					        self.greeter.connect_sync()
 | 
				
			||||||
 | 
					        self.user = LightDM.UserList.get_instance().get_users()[0].get_name()
 | 
				
			||||||
 | 
					        self.greeter.authenticate(self.user)
 | 
				
			||||||
 | 
					        self.session = self.greeter.get_default_session_hint()
 | 
				
			||||||
 | 
					        sessions = iter([(s.get_name(), s.get_key()) for s in LightDM.get_sessions()])
 | 
				
			||||||
 | 
					        name, key = sessions.__next__()
 | 
				
			||||||
 | 
					        first = Gtk.RadioButton.new_with_label(None, name)
 | 
				
			||||||
 | 
					        first.connect("toggled", self.session_change, key)
 | 
				
			||||||
 | 
					        vbox.add(first)
 | 
				
			||||||
 | 
					        for name, key in sessions:
 | 
				
			||||||
 | 
					            rb = Gtk.RadioButton.new_with_label_from_widget(first, name)
 | 
				
			||||||
 | 
					            rb.connect("toggled", self.session_change, key)
 | 
				
			||||||
 | 
					            vbox.add(rb)
 | 
				
			||||||
 | 
					            if self.session == key:
 | 
				
			||||||
 | 
					                rb.set_active(True)
 | 
				
			||||||
 | 
					        vbox.show_all()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def session_change(self, rb, key):
 | 
				
			||||||
 | 
					        self.session = key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def on_destry(self, window):
 | 
				
			||||||
 | 
					        Gtk.main_quit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def login_cb(self, login_btn):
 | 
				
			||||||
 | 
					        self.greeter.respond(self.pin_entry.get_text())
 | 
				
			||||||
 | 
					        self.pin_entry.set_text("", 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def backspace(self, del_btn):
 | 
				
			||||||
 | 
					        length = self.pin_entry.get_length()
 | 
				
			||||||
 | 
					        if length <= 0:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        self.pin_entry.delete_text(length - 1, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def auth_complete(self, greeter):
 | 
				
			||||||
 | 
					        if greeter.get_is_authenticated():
 | 
				
			||||||
 | 
					            greeter.start_session_sync(self.session)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            greeter.authenticate(self.user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def show_msg(self, greeter, text, type):
 | 
				
			||||||
 | 
					        self.msg_label.set_text(text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def show_prompt(self, greeter, text, type):
 | 
				
			||||||
 | 
					        self.pmpt_label.set_text(text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def de_popover(self, settings_btn):
 | 
				
			||||||
 | 
					        self.de_select.popup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Handy.Keypad()
 | 
				
			||||||
 | 
					builder: Gtk.Builder = Gtk.Builder.new_from_file(
 | 
				
			||||||
 | 
					    "%DATADIR%/lightdm-mobile-greeter/interface.ui"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					handler = Handler(builder)
 | 
				
			||||||
 | 
					builder.connect_signals(handler)
 | 
				
			||||||
 | 
					window: Gtk.Window = builder.get_object("greeter_window")
 | 
				
			||||||
 | 
					display = Gdk.Display.get_default()
 | 
				
			||||||
 | 
					monitor = display.get_monitor(0)
 | 
				
			||||||
 | 
					screen_size = monitor.get_geometry()
 | 
				
			||||||
 | 
					window.set_size_request(screen_size.width, screen_size.height)
 | 
				
			||||||
 | 
					container = builder.get_object("container")
 | 
				
			||||||
 | 
					container.set_size_request(screen_size.width * 0.8, screen_size.height * 0.8)
 | 
				
			||||||
 | 
					style: Gtk.CssProvider = Gtk.CssProvider()
 | 
				
			||||||
 | 
					style.load_from_path("%DATADIR%/lightdm-mobile-greeter/style.css")
 | 
				
			||||||
 | 
					Gtk.StyleContext.add_provider_for_screen(
 | 
				
			||||||
 | 
					    Gdk.Screen.get_default(), style, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					window.show()
 | 
				
			||||||
 | 
					Gtk.main()
 | 
				
			||||||
							
								
								
									
										53
									
								
								style.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								style.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					window * {
 | 
				
			||||||
 | 
					    background: none;
 | 
				
			||||||
 | 
					    color: greenyellow;
 | 
				
			||||||
 | 
					    box-shadow: none;
 | 
				
			||||||
 | 
					    text-decoration: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button {
 | 
				
			||||||
 | 
					    border: none;
 | 
				
			||||||
 | 
					    border-radius: 20em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					window {
 | 
				
			||||||
 | 
					    background-color: black;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label {
 | 
				
			||||||
 | 
					    font-weight: bold;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button:active {
 | 
				
			||||||
 | 
					    background-color: greenyellow;
 | 
				
			||||||
 | 
					    color: black;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button:active label {
 | 
				
			||||||
 | 
					    color: black;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					hdykeypad > button label{
 | 
				
			||||||
 | 
					   font-size: 5em;
 | 
				
			||||||
 | 
					   font-weight: bold;
 | 
				
			||||||
 | 
					   padding: 10px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.login_btn > label {
 | 
				
			||||||
 | 
					    font-size: 2em;
 | 
				
			||||||
 | 
					    background-clip: padding-box;
 | 
				
			||||||
 | 
					    padding: 0.5em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.pin, .prompt {
 | 
				
			||||||
 | 
					   font-size: 2em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					popover {
 | 
				
			||||||
 | 
					    background-color: black;
 | 
				
			||||||
 | 
					    font-size: 2em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					popover radiobutton {
 | 
				
			||||||
 | 
					    padding: 1em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user