-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/109693/
-----------------------------------------------------------

(Updated Sept. 2, 2015, 1:35 p.m.)


Status
------

This change has been discarded.


Review request for Plasma and Solid.


Bugs: 313123
    http://bugs.kde.org/show_bug.cgi?id=313123


Repository: kde-workspace


Description
-------

Here's an attempt to get the screen lock to fully activate before resume starts.


This is a problem on systems that use systemd/logind to suspend as it suspends 
immediately, so that there's unlikely to be time for the lock process to hide 
the screen before the system suspends. There shouldn't be a problem on systems 
that use upower, as it waits a second before suspending - there's no guarantee 
that the screen locks in time, but it should in practice. But there are reports 
of problems with upower (on ubuntu, at least) - this needs further 
investigation to see if there's something else going on.

It's also not clear why the lock process waits a further ten or so seconds 
after resume before hiding the screen.


* Delay emitting org.freedesktop.ScreenSaver.ActiveChanged and replying to 
org.freedesktop.ScreenSaver.Lock until the lock process is ready. We can't have 
the ksmserver blocking in the .Lock call as this blocks the lock process (as 
QApplication constructs a QSessionManager which attempts to communicate with 
ksmserver over XSMP) so delay replying and complete the transaction when the 
lock process signal its readiness.

- The qml lockscreen still blocks on powerdevil as it queries supported suspend 
methods using the synchronous Solid::PowerManagement API. So disable this for 
now. This is harmless for the plasma desktop but does affect the plasma active 
qml locker.

- The plasma overlay locker seems to be broken. I think this is an unrelated 
breakage on my test system but can't be sure. It should be fine in theory, but 
might have a problem if there are any power-management plasmoids on it.


Other approaches to breaking the powerdevil <-> lock process deadlock are:

* Have SuspendSession::lockScreenAndWait() call face.call(QDBus::BlockWithGui, 
"Lock") to return to the event loop. 
- But does this mean that the entire call-chain to this point would need to be 
re-entrant with respect to the event loop?
* Make powerdevil Actions into transactions that are queued and signal their 
completion (or failure)
- Tricky and fairly wide-ranging. And probably not suitable for 4.10.
* Have the kscreenlocker_greet lock process use asynchronous dbus calls to 
query powerdevil rather than the synchronous API. I'm not sure if there's 
already some prototype asynchronous API (for libsolid2) to cannibalise for this.
* Have ksmserver or the lock process take a delay lock -  
http://www.freedesktop.org/wiki/Software/systemd/inhibit - and return from 
org.freedesktop.ScreenSaver.Lock as soon as the lock process is running, as we 
do now.
- This would solve the problem on systems that use logind to suspend, but do 
nothing on systems that suspend with upower. As mentioned above, it's unclear 
what the cause of the problem is on upower systems.


The patch series is in my clone at 
kde:clones/kde-workspace/oliverhenshaw/kde-workspace in the branch 
review/screenlocker-waitforlock and comprises:


[1/5] Represent lock state with an enum


[2/5] Emit activeChanged() only when lock process ready

* synchronously call desktopResized in the screen locker app
  (this causes the lock process windows to be created)
* signal that the lock process is ready by calling
  org.kde.screensaver.saverLockReady()
* introduce a Waiting LockState
* finish locking in lockProcessReady() when receive notification over
  dbus - start locked timer and emit locked() here rather than earlier

This is based on 62c2c398611b2e6ef6e1e38ed79bc9540fc02ec9 and the old
screensaver implementation (from 4.9 and earlier). But delaying the
lock() qt signal, and thus delaying the activeChanged() dbus signal,
until the lock prcess is ready is new behaviour.


[3/5] Delay reply from dbus calls until screen is locked

This prevents e.g. suspending before the screen is properly locked.

Based on the old screensaver implementation (from 4.9 and earlier).


[4/5] Print when lock process starts and when ready

Useful for timing slow lock process creation


[5/5] Skip blocking Solid::PowerManagement call

Solid::PowerManagement API calls powerdevil synchronously, causing
deadlock until dbus timeout.


Diffs
-----

  ksmserver/screenlocker/greeter/CMakeLists.txt 
11905152321377aa3135424fa2e09bb991878da5 
  ksmserver/screenlocker/greeter/greeterapp.h 
f332bfc5c432b5b48b568c815904a12b4a74bd7a 
  ksmserver/screenlocker/greeter/greeterapp.cpp 
b70c9d6c005aa66d2f85a42ef4f1dcb04ea44667 
  ksmserver/screenlocker/greeter/main.cpp 
180d64d58b069e2d5b8362fb43c63ec2e834fadb 
  ksmserver/screenlocker/interface.h 018464cda6c1ea9511cd4553e615bee62a66949a 
  ksmserver/screenlocker/interface.cpp 32acad1b8afc8f15403d9e7b92dd49c51d355bdc 
  ksmserver/screenlocker/ksldapp.h 3047c00558d664ffac864582a4cb2c4f725a3cf4 
  ksmserver/screenlocker/ksldapp.cpp 7f2e6715f0c12baa1586e41fa8f767707c9f83c5 
  plasma/screensaver/shell/CMakeLists.txt 
5c52da691acf24422efc420be9bdc71eb716b268 
  plasma/screensaver/shell/main.cpp be151aa25dbff449d2e777ace9b43cac3de12f6d 

Diff: https://git.reviewboard.kde.org/r/109693/diff/


Testing
-------

Not enough


Thanks,

Oliver Henshaw

_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel

Reply via email to