Require libinput and udev

Summary:
The main reason for not having it as a mandatory dependency was that BSD
doesn't support it. But as I learned recently it is available on our CI
system. So BSDs have support now.

Even more it showed that the code doesn't compile if the dependency is
missing. And there's one thing I hate: broken build configuration
options.

So let's make UDEV and libinput a required dependency and get rid of the
problems.

Test Plan: Compiles

Reviewers: #kwin, #plasma

Subscribers: plasma-devel, kwin

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D10057
master
Martin Flöser 7 years ago
parent 45bdd8a342
commit bbf00fdd98

@ -176,27 +176,19 @@ set_package_properties(XKB PROPERTIES
)
find_package(Libinput 1.9)
set_package_properties(Libinput PROPERTIES TYPE OPTIONAL PURPOSE "Required for input handling on Wayland.")
set_package_properties(Libinput PROPERTIES TYPE REQUIRED PURPOSE "Required for input handling on Wayland.")
find_package(UDev)
set_package_properties(UDev PROPERTIES URL "http://www.freedesktop.org/software/systemd/libudev/"
DESCRIPTION "Linux device library."
TYPE OPTIONAL
TYPE REQUIRED
PURPOSE "Required for input handling on Wayland."
)
set(HAVE_INPUT FALSE)
if (Libinput_FOUND AND UDEV_FOUND)
set(HAVE_INPUT TRUE)
endif()
set(HAVE_UDEV FALSE)
if (UDEV_FOUND)
set(HAVE_UDEV TRUE)
endif()
find_package(Libdrm 2.4.62)
set_package_properties(Libdrm PROPERTIES TYPE OPTIONAL PURPOSE "Required for drm output on Wayland.")
set(HAVE_DRM FALSE)
if(Libdrm_FOUND AND UDEV_FOUND)
if(Libdrm_FOUND)
set(HAVE_DRM TRUE)
endif()
@ -482,6 +474,12 @@ set(kwin_KDEINIT_SRCS
rootinfo_filter.cpp
orientation_sensor.cpp
idle_inhibition.cpp
libinput/context.cpp
libinput/connection.cpp
libinput/device.cpp
libinput/events.cpp
libinput/libinput_logging.cpp
udev.cpp
)
include(ECMQtDeclareLoggingCategory)
@ -518,28 +516,11 @@ if(KWIN_BUILD_ACTIVITIES)
)
endif()
if(UDEV_FOUND)
set(kwin_KDEINIT_SRCS
${kwin_KDEINIT_SRCS}
udev.cpp
)
endif()
if(HAVE_INPUT)
set(kwin_KDEINIT_SRCS
${kwin_KDEINIT_SRCS}
libinput/context.cpp
libinput/connection.cpp
libinput/device.cpp
libinput/events.cpp
libinput/libinput_logging.cpp
)
if (HAVE_LINUX_VT_H)
set(kwin_KDEINIT_SRCS
${kwin_KDEINIT_SRCS}
virtual_terminal.cpp
)
endif()
if (HAVE_LINUX_VT_H)
set(kwin_KDEINIT_SRCS
${kwin_KDEINIT_SRCS}
virtual_terminal.cpp
)
endif()
kconfig_add_kcfg_files(kwin_KDEINIT_SRCS settings.kcfgc)
@ -634,16 +615,10 @@ set(kwinLibs
${kwin_XLIB_LIBS}
${kwin_XCB_LIBS}
${kwin_WAYLAND_LIBS}
${UDEV_LIBS}
Libinput::Libinput
)
if(UDEV_FOUND)
set(kwinLibs ${kwinLibs} ${UDEV_LIBS})
endif()
if(HAVE_INPUT)
set(kwinLibs ${kwinLibs} Libinput::Libinput)
endif()
add_library(kwin SHARED ${kwin_KDEINIT_SRCS})
set_target_properties(kwin PROPERTIES

@ -3,9 +3,7 @@ remove_definitions(-DQT_USE_QSTRINGBUILDER)
add_subdirectory(libkwineffects)
add_subdirectory(libxrenderutils)
add_subdirectory(integration)
if (HAVE_INPUT)
add_subdirectory(libinput)
endif()
add_subdirectory(libinput)
if (HAVE_DRM)
add_subdirectory(drm)
endif()

@ -9,7 +9,6 @@
#define KWIN_KILLER_BIN "${CMAKE_INSTALL_FULL_LIBEXECDIR}/kwin_killer_helper"
#define KWIN_RULES_DIALOG_BIN "${CMAKE_INSTALL_FULL_LIBEXECDIR}/kwin_rules_dialog"
#define KWIN_XCLIPBOARD_SYNC_BIN "${CMAKE_INSTALL_FULL_LIBEXECDIR}/org_kde_kwin_xclipboard_syncer"
#cmakedefine01 HAVE_INPUT
#cmakedefine01 HAVE_X11_XCB
#cmakedefine01 HAVE_X11_XINPUT
#cmakedefine01 HAVE_DRM
@ -23,7 +22,6 @@
#cmakedefine01 HAVE_PROC_TRACE_CTL
#cmakedefine01 HAVE_SYS_SYSMACROS_H
#cmakedefine01 HAVE_BREEZE_DECO
#cmakedefine01 HAVE_UDEV
#cmakedefine01 HAVE_LIBCAP
#cmakedefine01 HAVE_SCHED_RESET_ON_FORK
#if HAVE_BREEZE_DECO

@ -28,10 +28,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "wayland_server.h"
#include "workspace.h"
#include "keyboard_input.h"
#if HAVE_INPUT
#include "libinput/connection.h"
#include "libinput/device.h"
#endif
#include <kwinglplatform.h>
#include <kwinglutils.h>
@ -143,7 +141,6 @@ static QString buttonToString(Qt::MouseButton button)
}
}
#if HAVE_INPUT
static QString deviceRow(LibInput::Device *device)
{
if (!device) {
@ -151,7 +148,6 @@ static QString deviceRow(LibInput::Device *device)
}
return tableRow(i18n("Input Device"), QStringLiteral("%1 (%2)").arg(device->name()).arg(device->sysName()));
}
#endif
static QString buttonsToString(Qt::MouseButtons buttons)
{
@ -186,9 +182,7 @@ void DebugConsoleFilter::pointerEvent(MouseEvent *event)
switch (event->type()) {
case QEvent::MouseMove: {
text.append(tableHeaderRow(i18nc("A mouse pointer motion event", "Pointer Motion")));
#if HAVE_INPUT
text.append(deviceRow(event->device()));
#endif
text.append(timestamp);
if (event->timestampMicroseconds() != 0) {
text.append(timestampRowUsec(event->timestampMicroseconds()));
@ -206,9 +200,7 @@ void DebugConsoleFilter::pointerEvent(MouseEvent *event)
}
case QEvent::MouseButtonPress:
text.append(tableHeaderRow(i18nc("A mouse pointer button press event", "Pointer Button Press")));
#if HAVE_INPUT
text.append(deviceRow(event->device()));
#endif
text.append(timestamp);
text.append(tableRow(i18nc("A button in a mouse press/release event", "Button"), buttonToString(event->button())));
text.append(tableRow(i18nc("A button in a mouse press/release event", "Native Button code"), event->nativeButton()));
@ -216,9 +208,7 @@ void DebugConsoleFilter::pointerEvent(MouseEvent *event)
break;
case QEvent::MouseButtonRelease:
text.append(tableHeaderRow(i18nc("A mouse pointer button release event", "Pointer Button Release")));
#if HAVE_INPUT
text.append(deviceRow(event->device()));
#endif
text.append(timestamp);
text.append(tableRow(i18nc("A button in a mouse press/release event", "Button"), buttonToString(event->button())));
text.append(tableRow(i18nc("A button in a mouse press/release event", "Native Button code"), event->nativeButton()));
@ -238,9 +228,7 @@ void DebugConsoleFilter::wheelEvent(WheelEvent *event)
QString text = s_hr;
text.append(s_tableStart);
text.append(tableHeaderRow(i18nc("A mouse pointer axis (wheel) event", "Pointer Axis")));
#if HAVE_INPUT
text.append(deviceRow(event->device()));
#endif
text.append(deviceRow(event->device()));
text.append(timestampRow(event->timestamp()));
const Qt::Orientation orientation = event->angleDelta().x() == 0 ? Qt::Vertical : Qt::Horizontal;
text.append(tableRow(i18nc("The orientation of a pointer axis event", "Orientation"),
@ -268,9 +256,7 @@ void DebugConsoleFilter::keyEvent(KeyEvent *event)
default:
break;
}
#if HAVE_INPUT
text.append(deviceRow(event->device()));
#endif
text.append(deviceRow(event->device()));
auto modifiersToString = [event] {
QString ret;
if (event->modifiers().testFlag(Qt::ShiftModifier)) {
@ -468,7 +454,6 @@ void DebugConsoleFilter::switchEvent(SwitchEvent *event)
if (event->timestampMicroseconds() != 0) {
text.append(timestampRowUsec(event->timestampMicroseconds()));
}
#if HAVE_INPUT
text.append(deviceRow(event->device()));
QString switchName;
if (event->device()->isLidSwitch()) {
@ -477,7 +462,6 @@ void DebugConsoleFilter::switchEvent(SwitchEvent *event)
switchName = i18nc("Name of a hardware switch", "Tablet mode");
}
text.append(tableRow(i18nc("A hardware switch", "Switch"), switchName));
#endif
QString switchState;
switch (event->state()) {
case SwitchEvent::State::Off:
@ -505,12 +489,10 @@ DebugConsole::DebugConsole()
m_ui->windowsView->setItemDelegate(new DebugConsoleDelegate(this));
m_ui->windowsView->setModel(new DebugConsoleModel(this));
m_ui->surfacesView->setModel(new SurfaceTreeModel(this));
#if HAVE_INPUT
if (kwinApp()->usesLibinput()) {
m_ui->inputDevicesView->setModel(new InputDeviceModel(this));
m_ui->inputDevicesView->setItemDelegate(new DebugConsoleDelegate(this));
}
#endif
m_ui->quitButton->setIcon(QIcon::fromTheme(QStringLiteral("application-exit")));
m_ui->tabWidget->setTabIcon(0, QIcon::fromTheme(QStringLiteral("view-list-tree")));
m_ui->tabWidget->setTabIcon(1, QIcon::fromTheme(QStringLiteral("view-list-tree")));
@ -1408,7 +1390,6 @@ QVariant SurfaceTreeModel::data(const QModelIndex &index, int role) const
return QVariant();
}
#if HAVE_INPUT
InputDeviceModel::InputDeviceModel(QObject *parent)
: QAbstractItemModel(parent)
, m_devices(LibInput::Connection::self()->devices())
@ -1541,6 +1522,4 @@ void InputDeviceModel::setupDeviceConnections(LibInput::Device *device)
);
}
#endif
}

@ -156,8 +156,6 @@ private:
QTextEdit *m_textEdit;
};
#if HAVE_INPUT
namespace LibInput
{
class Device;
@ -180,7 +178,6 @@ private:
void setupDeviceConnections(LibInput::Device *device);
QVector<LibInput::Device*> m_devices;
};
#endif
}

@ -36,10 +36,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "screenedge.h"
#include "screens.h"
#include "workspace.h"
#if HAVE_INPUT
#include "libinput/connection.h"
#include "libinput/device.h"
#endif
#include "platform.h"
#include "popup_input_filter.h"
#include "shell_client.h"
@ -191,7 +189,6 @@ void InputEventFilter::passToWaylandServer(QKeyEvent *event)
}
}
#if HAVE_INPUT
class VirtualTerminalFilter : public InputEventFilter {
public:
bool keyEvent(QKeyEvent *event) override {
@ -206,7 +203,6 @@ public:
return false;
}
};
#endif
class TerminateServerFilter : public InputEventFilter {
public:
@ -1505,7 +1501,6 @@ InputRedirection::InputRedirection(QObject *parent)
qRegisterMetaType<KWin::InputRedirection::KeyboardKeyState>();
qRegisterMetaType<KWin::InputRedirection::PointerButtonState>();
qRegisterMetaType<KWin::InputRedirection::PointerAxis>();
#if HAVE_INPUT
if (Application::usesLibinput()) {
if (LogindIntegration::self()->hasSessionControl()) {
setupLibInput();
@ -1525,7 +1520,6 @@ InputRedirection::InputRedirection(QObject *parent)
);
}
}
#endif
connect(kwinApp(), &Application::workspaceCreated, this, &InputRedirection::setupWorkspace);
reconfigure();
}
@ -1670,11 +1664,9 @@ void InputRedirection::setupWorkspace()
void InputRedirection::setupInputFilters()
{
#if HAVE_INPUT
if (LogindIntegration::self()->hasSessionControl()) {
installInputEventFilter(new VirtualTerminalFilter);
}
#endif
if (waylandServer()) {
installInputEventFilter(new TerminateServerFilter);
installInputEventFilter(new DragAndDropInputFilter);
@ -1702,7 +1694,6 @@ void InputRedirection::setupInputFilters()
void InputRedirection::reconfigure()
{
#if HAVE_INPUT
if (Application::usesLibinput()) {
auto inputConfig = kwinApp()->inputConfig();
inputConfig->reparseConfiguration();
@ -1713,7 +1704,6 @@ void InputRedirection::reconfigure()
waylandServer()->seat()->setKeyRepeatInfo(enabled ? rate : 0, delay);
}
#endif
}
static KWayland::Server::SeatInterface *findSeat()
@ -1727,7 +1717,6 @@ static KWayland::Server::SeatInterface *findSeat()
void InputRedirection::setupLibInput()
{
#if HAVE_INPUT
if (!Application::usesLibinput()) {
return;
}
@ -1841,7 +1830,6 @@ void InputRedirection::setupLibInput()
);
}
setupTouchpadShortcuts();
#endif
}
void InputRedirection::setupTouchpadShortcuts()
@ -1849,7 +1837,6 @@ void InputRedirection::setupTouchpadShortcuts()
if (!m_libInput) {
return;
}
#if HAVE_INPUT
QAction *touchpadToggleAction = new QAction(this);
QAction *touchpadOnAction = new QAction(this);
QAction *touchpadOffAction = new QAction(this);
@ -1874,16 +1861,13 @@ void InputRedirection::setupTouchpadShortcuts()
connect(touchpadToggleAction, &QAction::triggered, m_libInput, &LibInput::Connection::toggleTouchpads);
connect(touchpadOnAction, &QAction::triggered, m_libInput, &LibInput::Connection::enableTouchpads);
connect(touchpadOffAction, &QAction::triggered, m_libInput, &LibInput::Connection::disableTouchpads);
#endif
}
bool InputRedirection::hasAlphaNumericKeyboard()
{
#if HAVE_INPUT
if (m_libInput) {
return m_libInput->hasAlphaNumericKeyboard();
}
#endif
return true;
}
@ -1899,7 +1883,6 @@ bool InputRedirection::hasTabletModeSwitch()
void InputRedirection::setupLibInputWithScreens()
{
#if HAVE_INPUT
if (!screens() || !m_libInput) {
return;
}
@ -1911,7 +1894,6 @@ void InputRedirection::setupLibInputWithScreens()
}
);
connect(screens(), &Screens::changed, m_libInput, &LibInput::Connection::updateScreens);
#endif
}
void InputRedirection::processPointerMotion(const QPointF &pos, uint32_t time)

@ -440,7 +440,6 @@ void Application::initPlatform(const KPluginMetaData &plugin)
m_platform = qobject_cast<Platform *>(plugin.instantiate());
if (m_platform) {
m_platform->setParent(this);
#if HAVE_INPUT
// check whether it needs libinput
const QJsonObject &metaData = plugin.rawData();
auto it = metaData.find(QStringLiteral("input"));
@ -452,7 +451,6 @@ void Application::initPlatform(const KPluginMetaData &plugin)
}
}
}
#endif
}
}

@ -648,11 +648,9 @@ int main(int argc, char * argv[])
parser.addOption(hwcomposerOption);
}
#endif
#if HAVE_INPUT
QCommandLineOption libinputOption(QStringLiteral("libinput"),
i18n("Enable libinput support for input events processing. Note: never use in a nested session."));
parser.addOption(libinputOption);
#endif
#if HAVE_DRM
QCommandLineOption drmOption(QStringLiteral("drm"), i18n("Render through drm node."));
if (hasDrmOption) {
@ -700,9 +698,7 @@ int main(int argc, char * argv[])
a.setSessionArgument(parser.value(exitWithSessionOption));
}
#if HAVE_INPUT
KWin::Application::setUseLibinput(parser.isSet(libinputOption));
#endif
QString pluginName;
QSize initialWindowSize;

@ -1,13 +1,11 @@
if(HAVE_INPUT)
if(HAVE_DRM)
add_subdirectory(drm)
endif()
if (HAVE_LINUX_FB_H)
add_subdirectory(fbdev)
endif()
if(HAVE_LIBHYBRIS)
add_subdirectory(hwcomposer)
endif()
if(HAVE_DRM)
add_subdirectory(drm)
endif()
if (HAVE_LINUX_FB_H)
add_subdirectory(fbdev)
endif()
if(HAVE_LIBHYBRIS)
add_subdirectory(hwcomposer)
endif()
add_subdirectory(virtual)
add_subdirectory(wayland)

@ -23,9 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "virtual_backend.h"
#include "options.h"
#include "screens.h"
#if HAVE_UDEV
#include "udev.h"
#endif
#include <logging.h>
// kwin libs
#include <kwinglplatform.h>
@ -62,7 +60,6 @@ EglGbmBackend::~EglGbmBackend()
void EglGbmBackend::initGbmDevice()
{
#if HAVE_UDEV
if (m_backend->drmFd() != -1) {
// already initialized
return;
@ -92,7 +89,6 @@ void EglGbmBackend::initGbmDevice()
}
m_backend->setGbmDevice(gbmDevice);
#endif
#endif
}
bool EglGbmBackend::initializeEgl()

@ -24,9 +24,7 @@
#include "input_event.h"
#include "input_event_spy.h"
#if HAVE_INPUT
#include "libinput/device.h"
#endif
#include <QDBusConnection>

@ -18,21 +18,19 @@ if (KF5Wayland_FOUND)
target_link_libraries(waylandclienttest Qt5::Core Qt5::Gui KF5::WaylandClient)
endif()
if (HAVE_INPUT)
set(libinputtest_SRCS
libinputtest.cpp
${KWIN_SOURCE_DIR}/libinput/context.cpp
${KWIN_SOURCE_DIR}/libinput/connection.cpp
${KWIN_SOURCE_DIR}/libinput/device.cpp
${KWIN_SOURCE_DIR}/libinput/events.cpp
${KWIN_SOURCE_DIR}/libinput/libinput_logging.cpp
${KWIN_SOURCE_DIR}/logind.cpp
${KWIN_SOURCE_DIR}/udev.cpp
)
add_executable(libinputtest ${libinputtest_SRCS})
add_definitions(-DKWIN_BUILD_TESTING)
target_link_libraries(libinputtest Qt5::Core Qt5::DBus Libinput::Libinput ${UDEV_LIBS} KF5::ConfigCore KF5::GlobalAccel KF5::WindowSystem)
endif()
set(libinputtest_SRCS
libinputtest.cpp
${KWIN_SOURCE_DIR}/libinput/context.cpp
${KWIN_SOURCE_DIR}/libinput/connection.cpp
${KWIN_SOURCE_DIR}/libinput/device.cpp
${KWIN_SOURCE_DIR}/libinput/events.cpp
${KWIN_SOURCE_DIR}/libinput/libinput_logging.cpp
${KWIN_SOURCE_DIR}/logind.cpp
${KWIN_SOURCE_DIR}/udev.cpp
)
add_executable(libinputtest ${libinputtest_SRCS})
add_definitions(-DKWIN_BUILD_TESTING)
target_link_libraries(libinputtest Qt5::Core Qt5::DBus Libinput::Libinput ${UDEV_LIBS} KF5::ConfigCore KF5::GlobalAccel KF5::WindowSystem)
add_executable(x11shadowreader x11shadowreader.cpp)
target_link_libraries(x11shadowreader XCB::XCB Qt5::Widgets Qt5::X11Extras KF5::ConfigCore KF5::WindowSystem)

@ -1365,12 +1365,6 @@ QString Workspace::supportInformation() const
support.append(yes);
#else
support.append(no);
#endif
support.append(QStringLiteral("HAVE_INPUT: "));
#if HAVE_INPUT
support.append(yes);
#else
support.append(no);
#endif
support.append(QStringLiteral("HAVE_DRM: "));
#if HAVE_DRM

Loading…
Cancel
Save