mirror of
https://github.com/keepassxreboot/keepassxc.git
synced 2026-03-11 08:54:48 +00:00
Merge 79fe2635ed into b7ad8b4761
This commit is contained in:
commit
3091d6f291
13 changed files with 884 additions and 20 deletions
|
|
@ -121,11 +121,6 @@ if(NOT WITH_XC_NETWORKING AND WITH_XC_UPDATECHECK)
|
|||
set(WITH_XC_UPDATECHECK OFF)
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT APPLE AND NOT WITH_XC_X11)
|
||||
message(STATUS "Disabling WITH_XC_AUTOTYPE because WITH_XC_X11 is disabled")
|
||||
set(WITH_XC_AUTOTYPE OFF)
|
||||
endif()
|
||||
|
||||
set(KEEPASSXC_VERSION_MAJOR "2")
|
||||
set(KEEPASSXC_VERSION_MINOR "8")
|
||||
set(KEEPASSXC_VERSION_PATCH "0")
|
||||
|
|
|
|||
34
cmake/FindXkbcommon.cmake
Normal file
34
cmake/FindXkbcommon.cmake
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# Copyright (C) 2021 KeePassXC Team <team@keepassxc.org>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 2 or (at your option)
|
||||
# version 3 of the License.
|
||||
#
|
||||
# This program 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 General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# This only works with CMake 3.18 and newer
|
||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.18")
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_check_modules(Xkbcommon xkbcommon)
|
||||
endif()
|
||||
|
||||
if(NOT Xkbcommon_FOUND)
|
||||
find_path(Xkbcommon_INCLUDE_DIRS xkbcommon/xkbcommon.h)
|
||||
find_library(Xkbcommon_LIBRARIES xkbcommon)
|
||||
|
||||
if(Xkbcommon_INCLUDE_DIRS AND Xkbcommon_LIBRARIES)
|
||||
set(Xkbcommon_FOUND TRUE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Xkbcommon DEFAULT_MSG Xkbcommon_LIBRARIES Xkbcommon_INCLUDE_DIRS)
|
||||
|
||||
mark_as_advanced(Xkbcommon_LIBRARIES Xkbcommon_INCLUDE_DIRS)
|
||||
|
|
@ -442,6 +442,15 @@ void AutoType::performGlobalAutoType(const QList<QSharedPointer<Database>>& dbLi
|
|||
return;
|
||||
}
|
||||
|
||||
if (!m_inGlobalAutoTypeDialog.tryLock()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_windowTitleForGlobal.isEmpty() && QApplication::platformName().compare("wayland", Qt::CaseInsensitive) != 0) {
|
||||
m_inGlobalAutoTypeDialog.unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
QList<AutoTypeMatch> matchList;
|
||||
// Generate entry/sequence match list if there is a valid window title
|
||||
if (!m_windowTitleForGlobal.isEmpty()) {
|
||||
|
|
|
|||
|
|
@ -1,14 +1,7 @@
|
|||
if(WITH_XC_AUTOTYPE)
|
||||
if(UNIX AND NOT APPLE AND NOT HAIKU)
|
||||
find_package(X11 REQUIRED COMPONENTS Xi XTest)
|
||||
find_package(Qt5X11Extras 5.2 REQUIRED)
|
||||
if(PRINT_SUMMARY)
|
||||
add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
|
||||
add_feature_info(libXtst X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
|
||||
add_feature_info(Qt5X11Extras Qt5X11Extras_FOUND "The Qt5X11Extras library is required for auto-type")
|
||||
endif()
|
||||
|
||||
add_subdirectory(xcb)
|
||||
add_subdirectory(wayland)
|
||||
elseif(APPLE)
|
||||
add_subdirectory(mac)
|
||||
elseif(WIN32)
|
||||
|
|
|
|||
233
src/autotype/wayland/AutoTypeWayland.cpp
Normal file
233
src/autotype/wayland/AutoTypeWayland.cpp
Normal file
|
|
@ -0,0 +1,233 @@
|
|||
/*
|
||||
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 or (at your option)
|
||||
* version 3 of the License.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "AutoTypeWayland.h"
|
||||
|
||||
#include "autotype/AutoTypeAction.h"
|
||||
#include "core/Tools.h"
|
||||
#include "gui/osutils/nixutils/X11Funcs.h"
|
||||
|
||||
#include <QDBusMessage>
|
||||
#include <QDebug>
|
||||
#include <QRandomGenerator>
|
||||
|
||||
QString generateToken()
|
||||
{
|
||||
static uint next = 0;
|
||||
return QString("keepassxc_%1_%2").arg(next++).arg(QRandomGenerator::system()->generate());
|
||||
}
|
||||
|
||||
AutoTypePlatformWayland::AutoTypePlatformWayland()
|
||||
: m_bus(QDBusConnection::sessionBus())
|
||||
, m_remote_desktop("org.freedesktop.portal.Desktop",
|
||||
"/org/freedesktop/portal/desktop",
|
||||
"org.freedesktop.portal.RemoteDesktop",
|
||||
m_bus,
|
||||
this)
|
||||
{
|
||||
m_bus.connect("org.freedesktop.portal.Desktop",
|
||||
"",
|
||||
"org.freedesktop.portal.Request",
|
||||
"Response",
|
||||
this,
|
||||
SLOT(portalResponse(uint, QVariantMap, QDBusMessage)));
|
||||
|
||||
createSession();
|
||||
}
|
||||
|
||||
void AutoTypePlatformWayland::createSession()
|
||||
{
|
||||
QString requestHandle = generateToken();
|
||||
|
||||
m_handlers.insert(requestHandle,
|
||||
[this](uint _response, QVariantMap _result) { handleCreateSession(_response, _result); });
|
||||
|
||||
m_remote_desktop.call("CreateSession",
|
||||
QVariantMap{{"handle_token", requestHandle}, {"session_handle_token", generateToken()}});
|
||||
}
|
||||
|
||||
void AutoTypePlatformWayland::handleCreateSession(uint response, QVariantMap result)
|
||||
{
|
||||
qDebug() << "Got response and result" << response << result;
|
||||
if (response == 0) {
|
||||
m_session_handle = QDBusObjectPath(result["session_handle"].toString());
|
||||
|
||||
QString selectDevicesRequestHandle = generateToken();
|
||||
m_handlers.insert(selectDevicesRequestHandle,
|
||||
[this](uint _response, QVariantMap _result) { handleSelectDevices(_response, _result); });
|
||||
|
||||
QVariantMap selectDevicesOptions{
|
||||
{"handle_token", selectDevicesRequestHandle},
|
||||
{"types", uint(1)},
|
||||
{"persist_mode", uint(2)},
|
||||
};
|
||||
|
||||
// TODO: Store restore token in database/some other persistent data so the dialog doesn't appear every launch
|
||||
if (!m_restore_token.isEmpty()) {
|
||||
selectDevicesOptions.insert("restore_token", m_restore_token);
|
||||
}
|
||||
|
||||
m_remote_desktop.call("SelectDevices", QVariant::fromValue(m_session_handle), selectDevicesOptions);
|
||||
|
||||
QString startRequestHandle = generateToken();
|
||||
m_handlers.insert(startRequestHandle,
|
||||
[this](uint _response, QVariantMap _result) { handleStart(_response, _result); });
|
||||
|
||||
QVariantMap startOptions{
|
||||
{"handle_token", startRequestHandle},
|
||||
};
|
||||
|
||||
// TODO: Pass window identifier here instead of empty string if we want the dialog to appear on top of the
|
||||
// application window, need to be able to get active window and handle from Wayland
|
||||
m_remote_desktop.call("Start", QVariant::fromValue(m_session_handle), "", startOptions);
|
||||
}
|
||||
}
|
||||
|
||||
void AutoTypePlatformWayland::handleSelectDevices(uint response, QVariantMap result)
|
||||
{
|
||||
Q_UNUSED(result)
|
||||
qDebug() << "Select Devices: " << response << result;
|
||||
}
|
||||
|
||||
void AutoTypePlatformWayland::handleStart(uint response, QVariantMap result)
|
||||
{
|
||||
qDebug() << "Start: " << response << result;
|
||||
if (response == 0) {
|
||||
m_session_started = true;
|
||||
m_restore_token = result["restore_token"].toString();
|
||||
}
|
||||
}
|
||||
|
||||
void AutoTypePlatformWayland::portalResponse(uint response, QVariantMap results, QDBusMessage message)
|
||||
{
|
||||
Q_UNUSED(response)
|
||||
Q_UNUSED(results)
|
||||
qDebug() << "Received message: " << message;
|
||||
auto index = message.path().lastIndexOf("/");
|
||||
auto handle = message.path().right(message.path().length() - index - 1);
|
||||
if (m_handlers.contains(handle)) {
|
||||
m_handlers.take(handle)(response, results);
|
||||
}
|
||||
}
|
||||
|
||||
AutoTypeAction::Result AutoTypePlatformWayland::sendKey(xkb_keysym_t keysym, QVector<xkb_keysym_t> modifiers)
|
||||
{
|
||||
for (auto modifier : modifiers) {
|
||||
m_remote_desktop.call(
|
||||
"NotifyKeyboardKeysym", QVariant::fromValue(m_session_handle), QVariantMap(), int(modifier), uint(1));
|
||||
}
|
||||
|
||||
m_remote_desktop.call(
|
||||
"NotifyKeyboardKeysym", QVariant::fromValue(m_session_handle), QVariantMap(), int(keysym), uint(1));
|
||||
|
||||
m_remote_desktop.call(
|
||||
"NotifyKeyboardKeysym", QVariant::fromValue(m_session_handle), QVariantMap(), int(keysym), uint(0));
|
||||
|
||||
for (auto modifier : modifiers) {
|
||||
m_remote_desktop.call(
|
||||
"NotifyKeyboardKeysym", QVariant::fromValue(m_session_handle), QVariantMap(), int(modifier), uint(0));
|
||||
}
|
||||
return AutoTypeAction::Result::Ok();
|
||||
}
|
||||
|
||||
bool AutoTypePlatformWayland::isAvailable()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void AutoTypePlatformWayland::unload()
|
||||
{
|
||||
}
|
||||
|
||||
QString AutoTypePlatformWayland::activeWindowTitle()
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
WId AutoTypePlatformWayland::activeWindow()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
AutoTypeExecutor* AutoTypePlatformWayland::createExecutor()
|
||||
{
|
||||
return new AutoTypeExecutorWayland(this);
|
||||
}
|
||||
|
||||
bool AutoTypePlatformWayland::raiseWindow(WId window)
|
||||
{
|
||||
Q_UNUSED(window)
|
||||
return false;
|
||||
}
|
||||
|
||||
QStringList AutoTypePlatformWayland::windowTitles()
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
AutoTypeExecutorWayland::AutoTypeExecutorWayland(AutoTypePlatformWayland* platform)
|
||||
: m_platform(platform)
|
||||
{
|
||||
}
|
||||
|
||||
AutoTypeAction::Result AutoTypeExecutorWayland::execBegin(const AutoTypeBegin* action)
|
||||
{
|
||||
Q_UNUSED(action)
|
||||
return AutoTypeAction::Result::Ok();
|
||||
}
|
||||
|
||||
AutoTypeAction::Result AutoTypeExecutorWayland::execType(const AutoTypeKey* action)
|
||||
{
|
||||
Q_UNUSED(action)
|
||||
|
||||
QVector<xkb_keysym_t> modifiers{};
|
||||
|
||||
if (action->modifiers.testFlag(Qt::ShiftModifier)) {
|
||||
modifiers.append(XKB_KEY_Shift_L);
|
||||
}
|
||||
if (action->modifiers.testFlag(Qt::ControlModifier)) {
|
||||
modifiers.append(XKB_KEY_Control_L);
|
||||
}
|
||||
if (action->modifiers.testFlag(Qt::AltModifier)) {
|
||||
modifiers.append(XKB_KEY_Alt_L);
|
||||
}
|
||||
if (action->modifiers.testFlag(Qt::MetaModifier)) {
|
||||
modifiers.append(XKB_KEY_Meta_L);
|
||||
}
|
||||
|
||||
// TODO: Replace these with proper lookups to xkbcommon keysyms instead of just reusing the X11 ones
|
||||
// They're mostly the same for most things, but strictly speaking differ slightly
|
||||
if (action->key != Qt::Key_unknown) {
|
||||
m_platform->sendKey(qtToNativeKeyCode(action->key), modifiers);
|
||||
} else {
|
||||
m_platform->sendKey(qcharToNativeKeyCode(action->character), modifiers);
|
||||
}
|
||||
|
||||
Tools::sleep(execDelayMs);
|
||||
|
||||
return AutoTypeAction::Result::Ok();
|
||||
}
|
||||
|
||||
AutoTypeAction::Result AutoTypeExecutorWayland::execClearField(const AutoTypeClearField* action)
|
||||
{
|
||||
Q_UNUSED(action)
|
||||
execType(new AutoTypeKey(Qt::Key_Home));
|
||||
execType(new AutoTypeKey(Qt::Key_End, Qt::ShiftModifier));
|
||||
execType(new AutoTypeKey(Qt::Key_Backspace));
|
||||
|
||||
return AutoTypeAction::Result::Ok();
|
||||
}
|
||||
73
src/autotype/wayland/AutoTypeWayland.h
Normal file
73
src/autotype/wayland/AutoTypeWayland.h
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* Copyright (C) 2024 KeePassXC Team <team@keepassxc.org>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 or (at your option)
|
||||
* version 3 of the License.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QDBusInterface>
|
||||
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
|
||||
#include "autotype/AutoTypePlatformPlugin.h"
|
||||
|
||||
class AutoTypePlatformWayland : public QObject, public AutoTypePlatformInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.keepassx.AutoTypePlatformWaylnd")
|
||||
Q_INTERFACES(AutoTypePlatformInterface)
|
||||
|
||||
public:
|
||||
AutoTypePlatformWayland();
|
||||
bool isAvailable() override;
|
||||
void unload() override;
|
||||
QStringList windowTitles() override;
|
||||
WId activeWindow() override;
|
||||
QString activeWindowTitle() override;
|
||||
bool raiseWindow(WId window) override;
|
||||
AutoTypeExecutor* createExecutor() override;
|
||||
|
||||
AutoTypeAction::Result sendKey(xkb_keysym_t keysym, QVector<xkb_keysym_t> modifiers = {});
|
||||
void createSession();
|
||||
|
||||
private slots:
|
||||
void portalResponse(uint response, QVariantMap results, QDBusMessage message);
|
||||
|
||||
private:
|
||||
bool m_loaded;
|
||||
QDBusConnection m_bus;
|
||||
QMap<QString, std::function<void(uint, QVariantMap)>> m_handlers;
|
||||
QDBusInterface m_remote_desktop;
|
||||
QDBusObjectPath m_session_handle;
|
||||
QString m_restore_token;
|
||||
bool m_session_started = false;
|
||||
|
||||
void handleCreateSession(uint response, QVariantMap results);
|
||||
void handleSelectDevices(uint response, QVariantMap results);
|
||||
void handleStart(uint response, QVariantMap results);
|
||||
};
|
||||
|
||||
class AutoTypeExecutorWayland : public AutoTypeExecutor
|
||||
{
|
||||
public:
|
||||
explicit AutoTypeExecutorWayland(AutoTypePlatformWayland* platform);
|
||||
|
||||
AutoTypeAction::Result execBegin(const AutoTypeBegin* action) override;
|
||||
AutoTypeAction::Result execType(const AutoTypeKey* action) override;
|
||||
AutoTypeAction::Result execClearField(const AutoTypeClearField* action) override;
|
||||
|
||||
private:
|
||||
AutoTypePlatformWayland* const m_platform;
|
||||
};
|
||||
9
src/autotype/wayland/CMakeLists.txt
Normal file
9
src/autotype/wayland/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
find_package(Xkbcommon REQUIRED)
|
||||
|
||||
set(autotype_WAYLAND_SOURCES AutoTypeWayland.cpp)
|
||||
|
||||
add_library(keepassxc-autotype-wayland MODULE ${autotype_WAYLAND_SOURCES})
|
||||
target_link_libraries(keepassxc-autotype-wayland keepassxc_gui Qt5::Core Qt5::Widgets Qt5::DBus ${Xkbcommon_LIBRARIES})
|
||||
install(TARGETS keepassxc-autotype-wayland
|
||||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
|
||||
493
src/autotype/wayland/org.freedesktop.portal.RemoteDesktop.xml
Normal file
493
src/autotype/wayland/org.freedesktop.portal.RemoteDesktop.xml
Normal file
|
|
@ -0,0 +1,493 @@
|
|||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Copyright (C) 2017-2018 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/>.
|
||||
-->
|
||||
|
||||
<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
|
||||
<!--
|
||||
org.freedesktop.portal.RemoteDesktop:
|
||||
@short_description: Remote desktop portal
|
||||
|
||||
The Remote desktop portal allows to create remote desktop sessions.
|
||||
|
||||
This documentation describes version 2 of this interface.
|
||||
-->
|
||||
<interface name="org.freedesktop.portal.RemoteDesktop">
|
||||
<!--
|
||||
CreateSession:
|
||||
@options: Vardict with optional further information
|
||||
@handle: Object path for the #org.freedesktop.portal.Request object representing this call
|
||||
|
||||
Create a remote desktop session.
|
||||
|
||||
A remote desktop session is used to allow remote controlling a desktop
|
||||
session.
|
||||
|
||||
A remote desktop session may only be started and stopped with this interface,
|
||||
but you can use the #org.freedesktop.portal.Session object created with this
|
||||
method together with certain methods on the #org.freedesktop.portal.ScreenCast and
|
||||
#org.freedesktop.portal.Clipboard interfaces. Specifically, you can call
|
||||
org.freedesktop.portal.ScreenCast.SelectSources() to also get screen content,
|
||||
and org.freedesktop.portal.ScreenCast.OpenPipeWireRemote() to acquire a file
|
||||
descriptor for a PipeWire remote. See #org.freedesktop.portal.ScreenCast for
|
||||
more information on how to use those methods. To capture clipboard content,
|
||||
you can call org.freedesktop.portal.Clipboard.RequestClipboard(). See
|
||||
#org.freedesktop.portal.Clipboard for more information on the clipboard
|
||||
integration.
|
||||
|
||||
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>
|
||||
-->
|
||||
<method name="CreateSession">
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="o" name="handle" direction="out"/>
|
||||
</method>
|
||||
<!--
|
||||
SelectDevices:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@handle: Object path for the #org.freedesktop.portal.Request object representing this call
|
||||
|
||||
Select input devices to remote control.
|
||||
|
||||
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>types u</term>
|
||||
<listitem><para>
|
||||
Bitmask of what device types to request remote controlling of.
|
||||
Default is all.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>restore_token s</term>
|
||||
<listitem><para>
|
||||
The token to restore a previous session.
|
||||
|
||||
If the stored session cannot be restored, this value is ignored
|
||||
and the user will be prompted normally. This may happen when, for
|
||||
example, the session contains a monitor or a window that is not
|
||||
available anymore, or when the stored permissions are withdrawn.
|
||||
|
||||
The restore token is invalidated after using it once. To restore
|
||||
the same session again, use the new restore token sent in response
|
||||
to starting this session.
|
||||
|
||||
This option was added in version 2 of this interface.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>persist_mode u</term>
|
||||
<listitem><para>
|
||||
How this session should persist. Default is 0. Accepted values are:
|
||||
|
||||
<simplelist>
|
||||
<member>0: Do not persist (default)</member>
|
||||
<member>1: Permissions persist as long as the application is running</member>
|
||||
<member>2: Permissions persist until explicitly revoked</member>
|
||||
</simplelist>
|
||||
|
||||
If the permission for the session to persist is granted, a restore token will
|
||||
be returned via the #org.freedesktop.portal.Request::Response signal of the
|
||||
start method used to start the session.
|
||||
|
||||
This option was added in version 2 of this interface.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
For available device types, see the AvailableDeviceTypes property.
|
||||
-->
|
||||
<method name="SelectDevices">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="o" name="handle" direction="out"/>
|
||||
</method>
|
||||
<!--
|
||||
Start:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@parent_window: Identifier for the application window, see <link linkend="parent_window">Common Conventions</link>
|
||||
@options: Vardict with optional further information
|
||||
@handle: Object path for the #org.freedesktop.portal.Request object representing this call
|
||||
|
||||
Start the remote desktop session. This will typically result in the portal
|
||||
presenting a dialog letting the user select what to share, including
|
||||
devices and optionally screen content if screen cast sources was
|
||||
selected.
|
||||
|
||||
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>
|
||||
</variablelist>
|
||||
|
||||
The following results get returned via the
|
||||
#org.freedesktop.portal.Request::Response signal:
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>devices u</term>
|
||||
<listitem><para>
|
||||
A bitmask of the devices selected by the user.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>clipboard_enabled b</term>
|
||||
<listitem><para>
|
||||
A boolean for whether the clipboard was enabled ('true') or not ('false').
|
||||
See the #org.freedesktop.portal.Clipboard documentation for more information.
|
||||
Since version 2.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term>restore_token s</term>
|
||||
<listitem><para>
|
||||
The restore token. This token is a single use token that can later
|
||||
be used to restore a session. See
|
||||
org.freedesktop.portal.RemoteDesktop.SelectDevices() for details.
|
||||
|
||||
This response option was added in version 2 of this interface.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
If a screen cast source was selected, the results of the
|
||||
#org.freedesktop.portal.ScreenCast.Start response signal may be
|
||||
included.
|
||||
-->
|
||||
<method name="Start">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="s" name="parent_window" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="o" name="handle" direction="out"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyPointerMotion:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@dx: Relative movement on the x axis
|
||||
@dy: Relative movement on the y axis
|
||||
|
||||
Notify about a new relative pointer motion event. The (dx, dy) vector
|
||||
represents the new pointer position in the streams logical coordinate
|
||||
space.
|
||||
-->
|
||||
<method name="NotifyPointerMotion">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="d" name="dx" direction="in"/>
|
||||
<arg type="d" name="dy" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyPointerMotionAbsolute:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@stream: The PipeWire stream node the coordinate is relative to
|
||||
@x: Pointer motion x coordinate
|
||||
@y: Pointer motion y coordinate
|
||||
|
||||
Notify about a new absolute pointer motion event. The (x, y) position
|
||||
represents the new pointer position in the streams logical coordinate
|
||||
space (see the logical_size stream property in
|
||||
#org.freedesktop.portal.ScreenCast).
|
||||
-->
|
||||
<method name="NotifyPointerMotionAbsolute">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="u" name="stream" direction="in"/>
|
||||
<arg type="d" name="x" direction="in"/>
|
||||
<arg type="d" name="y" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyPointerButton:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@button: The pointer button was pressed or released
|
||||
@state: The new state of the button
|
||||
|
||||
The pointer button is encoded according to Linux Evdev button codes.
|
||||
|
||||
May only be called if POINTER access was provided after starting the
|
||||
session.
|
||||
|
||||
Available button states:
|
||||
<simplelist>
|
||||
<member>0: Released</member>
|
||||
<member>1: Pressed</member>
|
||||
</simplelist>
|
||||
-->
|
||||
<method name="NotifyPointerButton">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="i" name="button" direction="in"/>
|
||||
<arg type="u" name="state" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyPointerAxis:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@dx: Relative axis movement on the x axis
|
||||
@dy: Relative axis movement on the y axis
|
||||
|
||||
The axis movement from a 'smooth scroll' device, such as a touchpad.
|
||||
When applicable, the size of the motion delta should be equivalent to
|
||||
the motion vector of a pointer motion done using the same advice.
|
||||
|
||||
May only be called if POINTER access was provided after starting the
|
||||
session.
|
||||
|
||||
Supported keys in the @options vardict include:
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>finish b</term>
|
||||
<listitem><para>
|
||||
If set to true, this is the last axis event in a series, for
|
||||
example as a result of the fingers being lifted from a touchpad
|
||||
after a two-finger scroll. Default is false.
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
-->
|
||||
<method name="NotifyPointerAxis">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="d" name="dx" direction="in"/>
|
||||
<arg type="d" name="dy" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyPointerAxisDiscrete:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@axis: The axis that was scrolled
|
||||
@steps: The number of steps scrolled
|
||||
|
||||
May only be called if POINTER access was provided after starting the
|
||||
session.
|
||||
|
||||
Available axes:
|
||||
<simplelist>
|
||||
<member>0: Vertical scroll</member>
|
||||
<member>1: Horizontal scroll</member>
|
||||
</simplelist>
|
||||
-->
|
||||
<method name="NotifyPointerAxisDiscrete">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="u" name="axis" direction="in"/>
|
||||
<arg type="i" name="steps" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyKeyboardKeycode:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@keycode: Keyboard code that was pressed or released
|
||||
@state: New state of keyboard keycode
|
||||
|
||||
May only be called if KEYBOARD access was provided after starting the
|
||||
session.
|
||||
|
||||
Available keyboard keycode states:
|
||||
<simplelist>
|
||||
<member>0: Released</member>
|
||||
<member>1: Pressed</member>
|
||||
</simplelist>
|
||||
-->
|
||||
<method name="NotifyKeyboardKeycode">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="i" name="keycode" direction="in"/>
|
||||
<arg type="u" name="state" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyKeyboardKeysym:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@keysym: Keyboard symbol that was pressed or released
|
||||
@state: New state of keyboard keysym
|
||||
|
||||
May only be called if KEYBOARD access was provided after starting the
|
||||
session.
|
||||
|
||||
Available keyboard keysym states:
|
||||
<simplelist>
|
||||
<member>0: Released</member>
|
||||
<member>1: Pressed</member>
|
||||
</simplelist>
|
||||
-->
|
||||
<method name="NotifyKeyboardKeysym">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="i" name="keysym" direction="in"/>
|
||||
<arg type="u" name="state" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyTouchDown:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@stream: The PipeWire stream node the coordinate is relative to
|
||||
@slot: Touch slot where touch point appeared
|
||||
@x: Touch down x coordinate
|
||||
@y: Touch down y coordinate
|
||||
|
||||
May only be called if TOUCHSCREEN access was provided after starting the
|
||||
session.
|
||||
|
||||
Notify about a new touch down event. The (x, y) position
|
||||
represents the new touch point position in the streams logical
|
||||
coordinate space (see the logical_size stream property in
|
||||
#org.freedesktop.portal.ScreenCast).
|
||||
-->
|
||||
<method name="NotifyTouchDown">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="u" name="stream" direction="in"/>
|
||||
<arg type="u" name="slot" direction="in"/>
|
||||
<arg type="d" name="x" direction="in"/>
|
||||
<arg type="d" name="y" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyTouchMotion:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@stream: The PipeWire stream node the coordinate is relative to
|
||||
@slot: Touch slot where touch point appeared
|
||||
@x: Touch motion x coordinate
|
||||
@y: Touch motion y coordinate
|
||||
|
||||
May only be called if TOUCHSCREEN access was provided after starting the
|
||||
session.
|
||||
|
||||
Notify about a new touch motion event. The (x, y) position
|
||||
represents where the touch point position in the streams logical
|
||||
coordinate space moved (see the logical_size stream property in
|
||||
#org.freedesktop.portal.ScreenCast).
|
||||
-->
|
||||
<method name="NotifyTouchMotion">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="u" name="stream" direction="in"/>
|
||||
<arg type="u" name="slot" direction="in"/>
|
||||
<arg type="d" name="x" direction="in"/>
|
||||
<arg type="d" name="y" direction="in"/>
|
||||
</method>
|
||||
<!--
|
||||
NotifyTouchUp:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@slot: Touch slot where touch point appeared
|
||||
|
||||
May only be called if TOUCHSCREEN access was provided after starting the
|
||||
session.
|
||||
|
||||
Notify about a new touch up event.
|
||||
-->
|
||||
<method name="NotifyTouchUp">
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="u" name="slot" direction="in"/>
|
||||
</method>
|
||||
|
||||
<!--
|
||||
ConnectToEIS:
|
||||
@session_handle: Object path for the #org.freedesktop.portal.Session object
|
||||
@options: Vardict with optional further information
|
||||
@fd: A file descriptor to an EIS implementation that can be passed to a libei sender context
|
||||
|
||||
Request a connection to an EIS implementation. The returned handle can
|
||||
be passed to ei_setup_backend_fd() for a libei sender context to
|
||||
complete the connection. All information about available devices and the
|
||||
event flow is subject to libei. Please see the libei documentation for details.
|
||||
|
||||
This method may only be called once per session, where the EIS
|
||||
implementation disconnects the session should be closed.
|
||||
|
||||
This method must be called after #org.freedesktop.portal.RemoteDesktop.Start()
|
||||
|
||||
Once an EIS connection is established, input events must be sent exclusively via
|
||||
the EIS connection. Any events submitted via NotifyPointerMotion,
|
||||
NotifyKeyboardKeycode and other Notify* methods will return an error.
|
||||
|
||||
To see how to pair a PipeWire stream with a libei device region, see the
|
||||
documentation for the mapping_id stream property in
|
||||
#org.freedesktop.portal.RemoteDesktop.Start().
|
||||
|
||||
This method was added in version 2 of this interface.
|
||||
-->
|
||||
<method name="ConnectToEIS">
|
||||
<annotation name="org.gtk.GDBus.C.Name" value="connect_to_eis"/>
|
||||
<annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
|
||||
<arg type="o" name="session_handle" direction="in"/>
|
||||
<arg type="a{sv}" name="options" direction="in"/>
|
||||
<arg type="h" name="fd" direction="out"/>
|
||||
</method>
|
||||
|
||||
<!--
|
||||
AvailableDeviceTypes:
|
||||
|
||||
A bitmask of available source types. Currently defined types are:
|
||||
|
||||
<simplelist>
|
||||
<member>1: KEYBOARD</member>
|
||||
<member>2: POINTER</member>
|
||||
<member>4: TOUCHSCREEN</member>
|
||||
</simplelist>
|
||||
-->
|
||||
<property name="AvailableDeviceTypes" type="u" access="read"/>
|
||||
<property name="version" type="u" access="read"/>
|
||||
</interface>
|
||||
</node>
|
||||
|
|
@ -1,9 +1,18 @@
|
|||
include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
|
||||
if(WITH_XC_X11)
|
||||
find_package(X11 REQUIRED COMPONENTS Xi XTest)
|
||||
|
||||
if(PRINT_SUMMARY)
|
||||
add_feature_info(libXi X11_Xi_FOUND "The X11 Xi Protocol library is required for auto-type")
|
||||
add_feature_info(libXtst X11_XTest_FOUND "The X11 XTEST Protocol library is required for auto-type")
|
||||
endif()
|
||||
|
||||
set(autotype_XCB_SOURCES AutoTypeXCB.cpp)
|
||||
include_directories(SYSTEM ${X11_X11_INCLUDE_PATH})
|
||||
|
||||
add_library(keepassxc-autotype-xcb MODULE ${autotype_XCB_SOURCES})
|
||||
target_link_libraries(keepassxc-autotype-xcb keepassxc_gui Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
|
||||
install(TARGETS keepassxc-autotype-xcb
|
||||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
|
||||
set(autotype_XCB_SOURCES AutoTypeXCB.cpp)
|
||||
|
||||
add_library(keepassxc-autotype-xcb MODULE ${autotype_XCB_SOURCES})
|
||||
target_link_libraries(keepassxc-autotype-xcb keepassxc_gui Qt5::Core Qt5::Widgets Qt5::X11Extras ${X11_X11_LIB} ${X11_Xi_LIB} ${X11_XTest_LIB})
|
||||
install(TARGETS keepassxc-autotype-xcb
|
||||
BUNDLE DESTINATION . COMPONENT Runtime
|
||||
LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR} COMPONENT Runtime)
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -1978,6 +1978,11 @@ void MainWindow::lockAllDatabases()
|
|||
m_ui->tabWidget->lockDatabases();
|
||||
}
|
||||
|
||||
void MainWindow::requestGlobalAutoType(const QString& search)
|
||||
{
|
||||
emit osUtils->globalShortcutTriggered("autotype", search);
|
||||
}
|
||||
|
||||
void MainWindow::displayDesktopNotification(const QString& msg, QString title, int msTimeoutHint)
|
||||
{
|
||||
if (!m_trayIcon || !QSystemTrayIcon::supportsMessages()) {
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ public slots:
|
|||
void toggleWindow();
|
||||
void bringToFront();
|
||||
void closeAllDatabases();
|
||||
void requestGlobalAutoType(const QString& search = "");
|
||||
void lockAllDatabases();
|
||||
void closeModalWindow();
|
||||
void displayDesktopNotification(const QString& msg, QString title = "", int msTimeoutHint = 10000);
|
||||
|
|
|
|||
|
|
@ -21,6 +21,11 @@
|
|||
<method name="refreshHardwareKeys">
|
||||
<arg name="found" type="b" direction="out"/>
|
||||
</method>
|
||||
<method name="requestGlobalAutoType">
|
||||
</method>
|
||||
<method name="requestGlobalAutoType">
|
||||
<arg name="search" type="s" direction="in"/>
|
||||
</method>
|
||||
<method name="lockAllDatabases">
|
||||
</method>
|
||||
<method name="closeAllDatabases">
|
||||
|
|
|
|||
|
|
@ -54,6 +54,11 @@
|
|||
],
|
||||
"platform": "linux | freebsd"
|
||||
},
|
||||
{
|
||||
"name": "libxkbcommon",
|
||||
"version>=": "1.4.1",
|
||||
"platform": "linux | freebsd"
|
||||
},
|
||||
{
|
||||
"name": "readline",
|
||||
"version>=": "0#5"
|
||||
|
|
|
|||
Loading…
Reference in a new issue