93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
import time
|
|
|
|
from PyQt5.QtCore import QCoreApplication, Qt
|
|
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QProgressBar
|
|
|
|
from keyboard_widget import KeyboardWidget
|
|
from util import tr
|
|
|
|
|
|
class Unlocker(QWidget):
|
|
|
|
def __init__(self, layout_editor):
|
|
super().__init__()
|
|
self.keyboard = None
|
|
|
|
layout = QVBoxLayout()
|
|
|
|
self.progress = QProgressBar()
|
|
|
|
layout.addWidget(QLabel(tr("Unlocker", "In order to proceed, the keyboard must be set into unlocked mode.\n"
|
|
"You should only perform this operation on computers that you trust.")))
|
|
layout.addWidget(QLabel(tr("Unlocker", "To exit this mode, you will need to replug the keyboard.")))
|
|
layout.addWidget(QLabel(tr("Unlocker", "Press and hold the following keys until the progress bar "
|
|
"below fills up:")))
|
|
|
|
self.keyboard_reference = KeyboardWidget(layout_editor)
|
|
self.keyboard_reference.set_enabled(False)
|
|
self.keyboard_reference.set_scale(0.5)
|
|
layout.addWidget(self.keyboard_reference)
|
|
layout.setAlignment(self.keyboard_reference, Qt.AlignHCenter)
|
|
|
|
layout.addWidget(self.progress)
|
|
|
|
self.setLayout(layout)
|
|
self.setWindowFlag(Qt.Dialog)
|
|
|
|
Unlocker.obj = self
|
|
|
|
@classmethod
|
|
def get(cls):
|
|
return cls.obj
|
|
|
|
def update_reference(self, keyboard):
|
|
""" Updates keycap reference image """
|
|
|
|
self.keyboard_reference.set_keys(keyboard.keys, keyboard.encoders)
|
|
|
|
# use "active" background to indicate keys to hold
|
|
lock_keys = keyboard.get_lock_keys()
|
|
for w in self.keyboard_reference.widgets:
|
|
if (w.desc.row, w.desc.col) in lock_keys:
|
|
w.setActive(True)
|
|
|
|
self.keyboard_reference.update_layout()
|
|
self.keyboard_reference.update()
|
|
self.keyboard_reference.updateGeometry()
|
|
|
|
def perform_unlock(self, keyboard):
|
|
# if it's already unlocked, don't need to do anything
|
|
lock = keyboard.get_lock()
|
|
if lock == 0:
|
|
return
|
|
|
|
self.update_reference(keyboard)
|
|
|
|
self.progress.setMaximum(1)
|
|
self.progress.setValue(0)
|
|
|
|
self.show()
|
|
self.keyboard = keyboard
|
|
self.keyboard.unlock_start()
|
|
|
|
while True:
|
|
data = self.keyboard.unlock_poll()
|
|
unlocked = data[0]
|
|
unlock_counter = data[2]
|
|
|
|
self.progress.setMaximum(max(self.progress.maximum(), unlock_counter))
|
|
self.progress.setValue(self.progress.maximum() - unlock_counter)
|
|
|
|
if unlocked == 1:
|
|
break
|
|
|
|
QCoreApplication.processEvents()
|
|
time.sleep(0.2)
|
|
|
|
# ok all done, the keyboard is now set to insecure state
|
|
self.hide()
|
|
|
|
def closeEvent(self, ev):
|
|
ev.ignore()
|