How to screenshot KScreenLocker?

I see absolutely nothing about it online.

what about setting a delay on Spectacle?

1 Like

@gcarlo_f, is that what you did? I see the greyed overlay, but it fails to:

An error occurred while taking a screenshot.

KWin screenshot request failed:

Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

Potentially relevant information:

  • Method: CaptureScreen

  • Method specific arguments: “DP-1”

@developers, has this already been reported as a bug? I differs to previous errata:

yes, I set a 5 secs delay and lock the screen. But consider I am running kde on kubuntu 24.04 LTS:

$ plasmashell --version
plasmashell 5.27.12

$ kf5-config --version
Qt: 5.15.13
KDE Frameworks: 5.115.0
kf5-config: 1.0

@rokejulianlockhart I tried and have your same Issue with the same exact message.

But if you try to record with Spectacle (with the delay) the full window you’ll have a small video and from there you can do the screenshot.


I choosed to see the cursor but will be better without if you want to do a screenshot from the video. :sweat_smile:

Regards

1 Like

@Krovikan, I’ve been unable to decipher what you mean by this. Are you willing to upload a video demonstrating how you do it to YouTube?

More easy. Steps:

  1. Meta + R and click in desktop (Spectacle records at fullscreen). Make sure that you see the message that Spectacle is recording.
  2. Meta + L (for lock the desktop)
  3. Enter password and stop Spectacle clicking the red circle in taskbar. You have the video for play and take a screenshot of the lock screen. :wink:

Regards

1 Like

@Krovikan, thanks. So you’re saying I should extract a frame from a screencast? Ironically, I just realised that myself, per bugs.kde.org/show_bug.cgi?id=506534.

Yes. Stop de video where you want and magical screenshot with Spectacle. :innocent:

Regards

@rokejulianlockhart why do you want to screenshot the screenlocker?

You probably can screenshot the screenlocker in test mode:
/usr/lib/kscreenlocker_greet --testing

but I am unsure what you are trying to do?

@Duha, /usr/libexec/kscreenlocker_greet --testing [1] merely SIGSEGVs: [2]

Program terminated with signal SIGSEGV, Segmentation fault.
#0  QtWayland::wl_seat::object (this=0x4214) at /usr/include/qt6/QtWaylandClient/6.9.1/QtWaylandClient/private/qwayland-wayland.h:789

warning: Source file is more recent than executable.
789             struct ::wl_seat *object() { return m_wl_seat; }
[Current thread is 1 (Thread 0x7f17deb67e00 (LWP 59334))]
Missing rpms, try: dnf --enablerepo='*debug*' install mesa-va-drivers-freeworld-debuginfo-25.0.7-2.fc42.x86_64
(gdb) bt full
#0  QtWayland::wl_seat::object (this=0x4214) at /usr/include/qt6/QtWaylandClient/6.9.1/QtWaylandClient/private/qwayland-wayland.h:789
No locals.
#1  QtWaylandClient::QWaylandInputDevice::wl_seat (this=0x4204) at /usr/include/qt6/QtWaylandClient/6.9.1/QtWaylandClient/private/qwaylandinputdevice_p.h:96
No locals.
#2  QWaylandXdgActivationV1::requestXdgActivationToken (this=this@entry=0x558f84a5d450, display=0x558f8418f960, surface=<optimized out>, serial=std::optional = {...}, app_id=...)
    at /usr/src/debug/layer-shell-qt-6.4.1-1.fc42.x86_64/src/qwaylandxdgactivationv1.cpp:38
        wl = <optimized out>
        provider = 0x7f17cc01b000
#3  0x00007f17e7904990 in LayerShellQt::QWaylandLayerSurface::requestActivate (this=0x558f84ebf480) at /usr/include/qt6/QtWaylandClient/6.9.1/QtWaylandClient/private/qwaylandwindow_p.h:141
        seat = <optimized out>
        tokenProvider = <optimized out>
        focusWindow = <optimized out>
        wlWindow = 0x558f84a4b160
        activation = 0x558f84a5d450
#4  0x00007f17e515662c in QObject::event (this=<optimized out>, e=<optimized out>) at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/kernel/qobject.cpp:1431
        mce = <optimized out>
        connections = <optimized out>
        sender = {previous = 0x0, receiver = 0x7ffff5e332f0, sender = 0x0, signal = -1}
#5  0x00007f17e50f9f38 in QCoreApplication::notifyInternal2 (receiver=0x7ffff5e332f0, event=0x558f84948140) at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/kernel/qcoreapplication.cpp:1106
        d = <optimized out>
        threadData = 0x558f84187540
        selfRequired = <optimized out>
        result = false
        cbdata = {0x7ffff5e332f0, 0x558f84948140, 0x7ffff5e32b0f}
        scopeLevelCounter = {threadData = 0x558f84187540}
#6  0x00007f17e50fa19d in QCoreApplication::sendEvent (receiver=<optimized out>, event=<optimized out>) at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/kernel/qcoreapplication.cpp:1546
No locals.
#7  0x00007f17e50fdd26 in QCoreApplicationPrivate::sendPostedEvents (receiver=0x0, event_type=0, data=0x558f84187540)
    at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/kernel/qcoreapplication.cpp:1879
        e = 0x558f84948140
        pe = <optimized out>
        r = <optimized out>
        relocker = <optimized out>
        event_deleter = <optimized out>
        locker = {_M_device = 0x558f84187588, _M_owns = false}
        startOffset = 0
        i = <optimized out>
        cleanup = <optimized out>
#8  0x00007f17e541016f in postEventSourceDispatch (s=0x558f8418b6a0) at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/kernel/qeventdispatcher_glib.cpp:246
        source = 0x558f8418b6a0
#9  0x00007f17e32eb880 in g_main_dispatch (context=0x7f17cc000f00) at ../glib/gmain.c:3398
        dispatch = 0x7f17e5410150 <postEventSourceDispatch(GSource*, GSourceFunc, gpointer)>
        prev_source = 0x0
        begin_time_nsec = 15307197157608
        was_in_call = 0
        user_data = 0x0
        callback = 0x0
        cb_funcs = 0x0
        cb_data = 0x0
        need_destroy = <optimized out>
--Type <RET> for more, q to quit, c to continue without paging--c
        source = 0x558f8418b6a0
        current = 0x558f84e85ab0
        i = 0
        __func__ = <optimized out>
#10 g_main_context_dispatch_unlocked (context=0x7f17cc000f00) at ../glib/gmain.c:4249
No locals.
#11 0x00007f17e32f47a8 in g_main_context_iterate_unlocked (context=context@entry=0x7f17cc000f00, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4314
        max_priority = 0
        timeout_usec = 0
        some_ready = 1
        nfds = 7
        allocated_nfds = <optimized out>
        fds = <optimized out>
        begin_time_nsec = <optimized out>
#12 0x00007f17e32f4953 in g_main_context_iteration (context=0x7f17cc000f00, may_block=1) at ../glib/gmain.c:4379
        retval = <optimized out>
#13 0x00007f17e540f9ad in QEventDispatcherGlib::processEvents (this=0x558f8418d400, flags=...) at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/kernel/qeventdispatcher_glib.cpp:399
        d = 0x558f8419ca20
        canWait = <optimized out>
        savedFlags = {<QtPrivate::QFlagsStorageHelper<QEventLoop::ProcessEventsFlag, 4>> = {<QtPrivate::QFlagsStorage<QEventLoop::ProcessEventsFlag>> = {static IntegerSize = 4, 
              i = 0}, <No data fields>}, <No data fields>}
        result = <optimized out>
#14 0x00007f17e5107b03 in QEventLoop::exec (this=this@entry=0x7ffff5e32e70, flags=..., flags@entry=...) at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/global/qflags.h:77
        d = 0x558f84a47020
        threadData = <optimized out>
        locker = {m_mutex = 0x558f84187678, m_isLocked = false}
        ref = <optimized out>
        app = <optimized out>
#15 0x00007f17e5103419 in QCoreApplication::exec () at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/corelib/kernel/qcoreapplication.cpp:1449
        threadData = 0x558f84187540
        eventLoop = {<QObject> = {_vptr.QObject = 0x7f17e56a1c70 <vtable for QEventLoop+16>, static staticMetaObject = {d = {superdata = {direct = 0x0}, 
                stringdata = 0x7f17e551d7f0 <QObject::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN7QObjectE_t>+272>, 
                data = 0x7f17e551d6e0 <QObject::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN7QObjectE_t>>, 
                static_metacall = 0x7f17e51624c0 <QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, 
                metaTypes = 0x7f17e56a3a60 <QObject::qt_staticMetaObjectRelocatingContent<(anonymous namespace)::qt_meta_tag_ZN7QObjectE_t>>, extradata = 0x0}}, d_ptr = {d = 0x558f84a47020}}, 
          static staticMetaObject = {d = {superdata = {direct = 0x7f17e569dc80 <QObject::staticMetaObject>}, 
              stringdata = 0x7f17e551ab0c <QEventLoop::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN10QEventLoopE_t>+236>, 
              data = 0x7f17e551aa20 <QEventLoop::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN10QEventLoopE_t>>, 
              static_metacall = 0x7f17e51076e0 <QEventLoop::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, 
              metaTypes = 0x7f17e56a1d20 <QEventLoop::qt_staticMetaObjectRelocatingContent<(anonymous namespace)::qt_meta_tag_ZN10QEventLoopE_t>>, extradata = 0x0}}}
        returnCode = <optimized out>
#16 0x00007f17e58ddbad in QGuiApplication::exec () at /usr/src/debug/qt6-qtbase-6.9.1-1.fc42.x86_64/src/gui/kernel/qguiapplication.cpp:1986
No locals.
#17 0x0000558f7b7068be in main (argc=<optimized out>, argv=<optimized out>) at /usr/src/debug/kscreenlocker-6.4.1-1.fc42.x86_64/greeter/main.cpp:207
        blockedSignals = {__val = {16896, 139740631330288, 139740497477120, 139740645422276, 14, 94074884890832, 140737318696016, 139740597252771, 94074884805680, 94072668684288, 139736760975360, 0, 
            140737318696224, 40, 94074739810848, 139740610014912}}
        format = {d = 0x558f8415c360}
        app = {<QGuiApplication> = {<QCoreApplication> = {<QObject> = {_vptr.QObject = 0x558f7b7357a8 <vtable for ScreenLocker::UnlockApp+16>, static staticMetaObject = {d = {superdata = {direct = 0x0}, 
                    stringdata = 0x7f17e551d7f0 <QObject::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN7QObjectE_t>+272>, 
                    data = 0x7f17e551d6e0 <QObject::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN7QObjectE_t>>, 
                    static_metacall = 0x7f17e51624c0 <QObject::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, 
                    metaTypes = 0x7f17e56a3a60 <QObject::qt_staticMetaObjectRelocatingContent<(anonymous namespace)::qt_meta_tag_ZN7QObjectE_t>>, extradata = 0x0}}, d_ptr = {d = 0x558f8418c440}}, 
              static staticMetaObject = {d = {superdata = {direct = 0x7f17e569dc80 <QObject::staticMetaObject>}, 
                  stringdata = 0x7f17e55190e8 <QCoreApplication::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN16QCoreApplicationE_t>+392>, 
                  data = 0x7f17e5518f60 <QCoreApplication::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN16QCoreApplicationE_t>>, 
                  static_metacall = 0x7f17e5103c30 <QCoreApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, 
                  metaTypes = 0x7f17e56a1980 <QCoreApplication::qt_staticMetaObjectRelocatingContent<(anonymous namespace)::qt_meta_tag_ZN16QCoreApplicationE_t>>, extradata = 0x0}}, 
              static self = 0x7ffff5e332f0}, static staticMetaObject = {d = {superdata = {direct = 0x7f17e56a1940 <QCoreApplication::staticMetaObject>}, 
                stringdata = 0x7f17e60af910 <QGuiApplication::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN15QGuiApplicationE_t>+752>, 
                data = 0x7f17e60af620 <QGuiApplication::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN15QGuiApplicationE_t>>, 
                static_metacall = 0x7f17e58dec70 <QGuiApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, 
                metaTypes = 0x7f17e61ce640 <QGuiApplication::qt_staticMetaObjectRelocatingContent<(anonymous namespace)::qt_meta_tag_ZN15QGuiApplicationE_t>>, extradata = 0x0}}}, static staticMetaObject = {
            d = {superdata = {direct = 0x558f7b734a40 <QGuiApplication::staticMetaObject>}, 
              stringdata = 0x558f7b72da1c <ScreenLocker::UnlockApp::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN12ScreenLocker9UnlockAppE_t>+412>, 
              data = 0x558f7b72d880 <ScreenLocker::UnlockApp::qt_staticMetaObjectStaticContent<(anonymous namespace)::qt_meta_tag_ZN12ScreenLocker9UnlockAppE_t>>, 
              static_metacall = 0x558f7b710410 <ScreenLocker::UnlockApp::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)>, relatedMetaObjects = 0x0, 
              metaTypes = 0x558f7b7350a0 <ScreenLocker::UnlockApp::qt_staticMetaObjectRelocatingContent<(anonymous namespace)::qt_meta_tag_ZN12ScreenLocker9UnlockAppE_t>>, extradata = 0x0}}, m_packageName = {
            d = {d = 0x0, ptr = 0x558f7b72ae60 u"org.kde.plasma.desktop", size = 22}}, m_mainQmlPath = {d = 0x558f844b3580}, 
          m_views = {<QListSpecialMethods<PlasmaQuick::QuickViewSharedEngine*>> = {<QListSpecialMethodsBase<PlasmaQuick::QuickViewSharedEngine*>> = {<No data fields>}, <No data fields>}, d = {
              d = 0x558f841fe240, ptr = 0x558f841fe250, size = 1}}, m_resetRequestIgnoreTimer = 0x558f845ef390, m_delayedLockTimer = 0x0, m_package = {
            _vptr.Package = 0x7f17e78adfe0 <vtable for KPackage::Package+16>, d = {d = {ptr = 0x558f845d7d40}}}, m_testing = true, m_ignoreRequests = false, m_immediateLock = true, 
          m_runtimeInitialized = false, m_authenticators = 0x558f845d6510, m_graceTime = 0, m_noLock = false, m_defaultToSwitchUser = false, m_canSuspend = false, m_canHibernate = false, m_userName = {d = {
              d = 0x558f84646460, ptr = 0x558f84646470 u"Mr. Roke Julian Lockhart Beedell (RJLB)", size = 39}}, m_userImage = {d = {d = 0x558f84646200, 
              ptr = 0x558f84646210 u"/var/lib/AccountsService/icons/RokeJulianLockhart", size = 49}}, m_display = 0x0, m_ksldInterface = 0x0, m_wallpaperPackage = {
            _vptr.Package = 0x7f17e78adfe0 <vtable for KPackage::Package+16>, d = {d = {ptr = 0x558f845d6bc0}}}, m_shellIntegration = 0x558f841a1ac0}
        disableSessionManagement = <optimized out>
        parser = {d = 0x558f846590c0}
        testingOption = {d = {d = {ptr = 0x558f84654940}}}
        shellOption = {d = {d = {ptr = 0x558f84654c20}}}
        immediateLockOption = {d = {d = {ptr = 0x558f84654dc0}}}
        graceTimeOption = {d = {d = {ptr = 0x558f84654cf0}}}
        nolockOption = {d = {d = {ptr = 0x558f846551e0}}}
        switchUserOption = {d = {d = {ptr = 0x558f846553e0}}}
        waylandFdOption = {d = {d = {ptr = 0x558f846556b0}}}
        ok = true
        graceTime = <optimized out>

If relevant, it prints an error in the CLI:

Locked at 1751566120
file:///usr/share/plasma/shells/org.kde.plasma.desktop/contents/lockscreen/LockOsd.qml:10:1: "../osd": no such directory

My terminal’s integrated LLM suggests a potential solution, which is novel!

We live in the future, indeed.


Screenshot KScreenLocker. Why do you ask: reckon it’s an X/Y problem?


  1. reddit.com/r/kde/comments/h7iq1l/comment/n163hlg ↩︎

  2. bugzilla.redhat.com/show_bug.cgi?id=2375356#c31 ↩︎

Are you on Fedora 42?

Yes. Thats why I am asking. Because of the Fedora Bug? Because you want to screenshot a working screenlocker?

Thats unrelated to the SEGV. I also get those error messages, but I can screenshot the screenlocker in testing mode just fine (on Arch).

2 Likes

Same for me on a Fedora 42 with qt6-qtwayland reverted. The error message appears, there’s no SEGV, and the screenshot is captured correctly.

1 Like

@Duha, I wanted to capture an example of how github.com/luisbocanegra/plasma-smart-video-wallpaper-reborn/releases/tag/v2.3.2 adheres to what kcm_colors exposes via KColorScheme to the QPalette, per the currently-applied .colors when no video has been applied:

I wanted to screenshot this in order to provide a demonstration of why github.com/cvzi/darkmodewallpaper/releases/tag/v1.9.0 should be able to adhere to com.android.settings/.wallpaper.WallpaperSuggestionActivity’s [1] Material You colouration, [2] since the user must currently manually apply the relevant RGB as base-16:

Is this relevant, somehow? I didn’t believe that it was.


Yes. cat /etc/os-release returns:

PRETTY_NAME="Fedora Linux 42 (KDE Plasma Desktop Edition)"

  1. issuetracker.google.com/u/1/issues/423197817 ↩︎

  2. github.com/Mahmud0808/ColorBlendr ↩︎

@Duha, previously, I was using my FW16 (laptop). On my desktop, although the SIGSEGV in QtWayland::wl_seat::object reproduced 1 of the 6 times I invoked /usr/libexec/kscreenlocker_greet --testing, [1] it works otherwise!

Environment

Operating System: Fedora Linux 42
KDE Plasma Version: 6.4.1
KDE Frameworks Version: 6.15.0
Qt Version: 6.9.1
Kernel Version: 6.15.4-200.fc42.x86_64 (64-bit)
Graphics Platform: Wayland
Graphics Processor 1: AMD Radeon RX 5700
Graphics Processor 2: AMD Radeon Graphics
Manufacturer: ASRock
Product Name: X670E Taichi

Output

/usr/libexec/kscreenlocker_greet --testing
org.kde.plasma.libtaskmanager: The PlasmaWindowManagement protocol hasn't activated in time. The client possibly got denied by kwin? Check kwin output.
qt.multimedia.ffmpeg: Using Qt multimedia with FFmpeg version 7.1.1 GPL version 3 or later
Failed to open VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such file or directory
Locked at 1751577742
QProcess: Destroyed while process ("/home/RokeJulianLockhart/.local/share/plasma/wallpapers/luisbocanegra.smart.video.wallpaper.reborn/contents/ui/tools/gdbus_get_signal.sh") is still running.
file:///usr/share/plasma/shells/org.kde.plasma.desktop/contents/lockscreen/LockOsd.qml:10:1: "../osd": no such directory
Unlocked

Heck, with noborderrule=2 imported from a .kwinrules via kcm_kwinrules (on XOrg 11), [2] I can even resize kscreenlocker for a good screenshot:

Unfocused Focused

This was easier to capture, since I don’t have to time it, like I would under Wayland.

Environment

Operating System: openSUSE Tumbleweed 20250701
KDE Plasma Version: 6.4.1
KDE Frameworks Version: 6.15.0
Qt Version: 6.9.1
Kernel Version: 6.15.4-1-default (64-bit)
Graphics Platform: X11
Graphics Processor: llvmpipe
Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)
System Version: pc-i440fx-9.2

Thanks! That’s quite versatile.


  1. bugzilla.redhat.com/show_bug.cgi?id=2375356#c32 ↩︎

  2. bugs.kde.org/show_bug.cgi?id=452240 ↩︎

I’ve since ascertained that invoking it from PowerShell appears to be what causes the cascade of /usr/libexec/kscreenlocker_greet --testing segmentation fault-ing. It’s really inconsistent, though. Perhaps it always requires a POSIX-compliant shell.

At least DBus doesn’t:

  1. busctl --user call org.freedesktop.ScreenSaver /ScreenSaver org.freedesktop.ScreenSaver Lock

  2. qdbus-qt6 org.freedesktop.ScreenSaver /ScreenSaver Lock

Damnned Spectacle doesn’t work when it’s invoked in this manner, though.