mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Implement screen locker monitor on Linux
This commit is contained in:
parent
2ff341b7d3
commit
db60bee7dc
3 changed files with 272 additions and 0 deletions
|
@ -1514,6 +1514,9 @@ else()
|
||||||
desktop-app::external_glibmm
|
desktop-app::external_glibmm
|
||||||
)
|
)
|
||||||
|
|
||||||
|
include(${cmake_helpers_loc}/external/glib/generate_dbus.cmake)
|
||||||
|
generate_dbus(Telegram org.freedesktop.portal. XdpInhibit ${src_loc}/platform/linux/org.freedesktop.portal.Inhibit.xml)
|
||||||
|
|
||||||
if (NOT DESKTOP_APP_DISABLE_X11_INTEGRATION)
|
if (NOT DESKTOP_APP_DISABLE_X11_INTEGRATION)
|
||||||
target_link_libraries(Telegram
|
target_link_libraries(Telegram
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
|
|
@ -8,13 +8,96 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "platform/linux/integration_linux.h"
|
#include "platform/linux/integration_linux.h"
|
||||||
|
|
||||||
#include "platform/platform_integration.h"
|
#include "platform/platform_integration.h"
|
||||||
|
#include "base/platform/linux/base_linux_xdp_utilities.h"
|
||||||
|
#include "core/application.h"
|
||||||
|
#include "base/random.h"
|
||||||
|
|
||||||
|
#include <xdpinhibit/xdpinhibit.hpp>
|
||||||
|
|
||||||
|
using namespace gi::repository;
|
||||||
|
|
||||||
namespace Platform {
|
namespace Platform {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
class LinuxIntegration final : public Integration {
|
class LinuxIntegration final : public Integration {
|
||||||
|
public:
|
||||||
|
LinuxIntegration();
|
||||||
|
|
||||||
|
void init() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
[[nodiscard]] XdpInhibit::Inhibit inhibit() {
|
||||||
|
return *_inhibitProxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
gi::result<XdpInhibit::InhibitProxy> _inhibitProxy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
LinuxIntegration::LinuxIntegration()
|
||||||
|
: _inhibitProxy(
|
||||||
|
XdpInhibit::InhibitProxy::new_for_bus_sync(
|
||||||
|
Gio::BusType::SESSION_,
|
||||||
|
Gio::DBusProxyFlags::DO_NOT_AUTO_START_AT_CONSTRUCTION_,
|
||||||
|
std::string(base::Platform::XDP::kService),
|
||||||
|
std::string(base::Platform::XDP::kObjectPath))) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void LinuxIntegration::init() {
|
||||||
|
if (!_inhibitProxy) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto uniqueName = _inhibitProxy->get_connection().get_unique_name();
|
||||||
|
uniqueName.erase(0, 1);
|
||||||
|
uniqueName.replace(uniqueName.find('.'), 1, 1, '_');
|
||||||
|
|
||||||
|
const auto handleToken = "tdesktop"
|
||||||
|
+ std::to_string(base::RandomValue<uint>());
|
||||||
|
|
||||||
|
const auto sessionHandleToken = "tdesktop"
|
||||||
|
+ std::to_string(base::RandomValue<uint>());
|
||||||
|
|
||||||
|
const auto sessionHandle = "/org/freedesktop/portal/desktop/session/"
|
||||||
|
+ uniqueName
|
||||||
|
+ '/'
|
||||||
|
+ sessionHandleToken;
|
||||||
|
|
||||||
|
inhibit().signal_state_changed().connect([
|
||||||
|
mySessionHandle = sessionHandle
|
||||||
|
](
|
||||||
|
XdpInhibit::Inhibit,
|
||||||
|
const std::string &sessionHandle,
|
||||||
|
GLib::Variant state) {
|
||||||
|
if (sessionHandle != mySessionHandle) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Core::App().setScreenIsLocked(
|
||||||
|
GLib::VariantDict::new_(
|
||||||
|
state
|
||||||
|
).lookup_value(
|
||||||
|
"screensaver-active"
|
||||||
|
).get_boolean()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
auto options = std::array{
|
||||||
|
GLib::Variant::new_dict_entry(
|
||||||
|
GLib::Variant::new_string("handle_token"),
|
||||||
|
GLib::Variant::new_variant(
|
||||||
|
GLib::Variant::new_string(handleToken))),
|
||||||
|
GLib::Variant::new_dict_entry(
|
||||||
|
GLib::Variant::new_string("session_handle_token"),
|
||||||
|
GLib::Variant::new_variant(
|
||||||
|
GLib::Variant::new_string(sessionHandleToken))),
|
||||||
|
};
|
||||||
|
|
||||||
|
inhibit().call_create_monitor(
|
||||||
|
{},
|
||||||
|
GLib::Variant::new_array(options.data(), options.size()),
|
||||||
|
nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
std::unique_ptr<Integration> CreateIntegration() {
|
std::unique_ptr<Integration> CreateIntegration() {
|
||||||
|
|
|
@ -0,0 +1,186 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!--
|
||||||
|
Copyright (C) 2016 Red Hat, Inc.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Author: Matthias Clasen <mclasen@redhat.com>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
|
||||||
|
<!--
|
||||||
|
org.freedesktop.portal.Inhibit:
|
||||||
|
@short_description: Portal for inhibiting session transitions
|
||||||
|
|
||||||
|
This simple interface lets sandboxed applications inhibit the user
|
||||||
|
session from ending, suspending, idling or getting switched away.
|
||||||
|
|
||||||
|
This documentation describes version 3 of this interface.
|
||||||
|
-->
|
||||||
|
<interface name="org.freedesktop.portal.Inhibit">
|
||||||
|
<!--
|
||||||
|
Inhibit:
|
||||||
|
@window: Identifier for the window
|
||||||
|
@flags: Flags identifying what is inhibited
|
||||||
|
@options: Vardict with optional further information
|
||||||
|
@handle: Object path for the #org.freedesktop.portal.Request object representing this call
|
||||||
|
|
||||||
|
Inhibits a session status changes. To remove the inhibition,
|
||||||
|
call org.freedesktop.portal.Request.Close() on the returned
|
||||||
|
handle.
|
||||||
|
|
||||||
|
The flags determine what changes are inhibited:
|
||||||
|
<simplelist>
|
||||||
|
<member>1: Logout</member>
|
||||||
|
<member>2: User Switch</member>
|
||||||
|
<member>4: Suspend</member>
|
||||||
|
<member>8: Idle</member>
|
||||||
|
</simplelist>
|
||||||
|
|
||||||
|
Supported keys in the @options vardict include:
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>handle_token s</term>
|
||||||
|
<listitem><para>
|
||||||
|
A string that will be used as the last element of the @handle. Must be a valid
|
||||||
|
object path element. See the #org.freedesktop.portal.Request documentation for
|
||||||
|
more information about the @handle.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>reason s</term>
|
||||||
|
<listitem><para>User-visible reason for the inhibition.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
-->
|
||||||
|
<method name="Inhibit">
|
||||||
|
<arg type="s" name="window" direction="in"/>
|
||||||
|
<arg type="u" name="flags" direction="in"/>
|
||||||
|
<arg type="a{sv}" name="options" direction="in"/>
|
||||||
|
<arg type="o" name="handle" direction="out"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
CreateMonitor:
|
||||||
|
@window: the parent window
|
||||||
|
@options: Vardict with optional further information
|
||||||
|
@handle: Object path for the #org.freedesktop.portal.Request object representing this call
|
||||||
|
|
||||||
|
Creates a monitoring session. While this session is
|
||||||
|
active, the caller will receive StateChanged signals
|
||||||
|
with updates on the session state.
|
||||||
|
|
||||||
|
A successfully created session can at any time be closed using
|
||||||
|
org.freedesktop.portal.Session::Close, or may at any time be closed
|
||||||
|
by the portal implementation, which will be signalled via
|
||||||
|
#org.freedesktop.portal.Session::Closed.
|
||||||
|
|
||||||
|
Supported keys in the @options vardict include:
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>handle_token s</term>
|
||||||
|
<listitem><para>
|
||||||
|
A string that will be used as the last element of the @handle. Must be a valid
|
||||||
|
object path element. See the #org.freedesktop.portal.Request documentation for
|
||||||
|
more information about the @handle.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>session_handle_token s</term>
|
||||||
|
<listitem><para>
|
||||||
|
A string that will be used as the last element of the session handle. Must be a valid
|
||||||
|
object path element. See the #org.freedesktop.portal.Session documentation for
|
||||||
|
more information about the session handle.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
The following results get returned via the #org.freedesktop.portal.Request::Response signal:
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>session_handle o</term>
|
||||||
|
<listitem><para>
|
||||||
|
The session handle. An object path for the
|
||||||
|
#org.freedesktop.portal.Session object representing the created
|
||||||
|
session.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
This method was added in version 2 of this interface.
|
||||||
|
-->
|
||||||
|
<method name="CreateMonitor">
|
||||||
|
<arg type="s" name="window" direction="in"/>
|
||||||
|
<arg type="a{sv}" name="options" direction="in"/>
|
||||||
|
<arg type="o" name="handle" direction="out"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
StateChanged:
|
||||||
|
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||||
|
@state: Vardict with information about the session state
|
||||||
|
|
||||||
|
The StateChanged signal is sent to active monitoring sessions when
|
||||||
|
the session state changes.
|
||||||
|
|
||||||
|
When the session state changes to 'Query End', clients with active monitoring
|
||||||
|
sessions are expected to respond by calling
|
||||||
|
org.freedesktop.portal.Inhibit.QueryEndResponse() within a second
|
||||||
|
of receiving the StateChanged signal. They may call org.freedesktop.portal.Inhibit.Inhibit()
|
||||||
|
first to inhibit logout, to prevent the session from proceeding to the Ending state.
|
||||||
|
|
||||||
|
The following information may get returned in the @state vardict:
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>screensaver-active b</term>
|
||||||
|
<listitem><para>
|
||||||
|
Whether the screensaver is active.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>session-state u</term>
|
||||||
|
<listitem><para>
|
||||||
|
The state of the session. This member is new in version 3.
|
||||||
|
</para>
|
||||||
|
<simplelist>
|
||||||
|
<member>1: Running</member>
|
||||||
|
<member>2: Query End</member>
|
||||||
|
<member>3: Ending</member>
|
||||||
|
</simplelist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
-->
|
||||||
|
<signal name="StateChanged">
|
||||||
|
<arg type="o" name="session_handle" direction="out"/>
|
||||||
|
<arg type="a{sv}" name="state" direction="out"/>
|
||||||
|
</signal>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
QueryEndResponse:
|
||||||
|
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||||
|
|
||||||
|
Acknowledges that the caller received the #org.freedesktop.portal.Inhibit::StateChanged
|
||||||
|
signal. This method should be called within one second or receiving a StateChanged
|
||||||
|
signal with the 'Query End' state.
|
||||||
|
|
||||||
|
Since version 3.
|
||||||
|
-->
|
||||||
|
<method name="QueryEndResponse">
|
||||||
|
<arg type="o" name="session_handle" direction="in"/>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<property name="version" type="u" access="read"/>
|
||||||
|
</interface>
|
||||||
|
</node>
|
Loading…
Add table
Reference in a new issue