diff --git a/kcms/keyboard/CMakeLists.txt b/kcms/keyboard/CMakeLists.txt index 9427a082a..27add00c7 100644 --- a/kcms/keyboard/CMakeLists.txt +++ b/kcms/keyboard/CMakeLists.txt @@ -1,146 +1,145 @@ add_definitions(-DTRANSLATION_DOMAIN=\"kcmkeyboard\") add_subdirectory(tastenbrett) option(HAVE_XINPUT "X11 XInput" OFF) option(HAVE_UDEV "UDev" OFF) if (X11_Xinput_FOUND) set(HAVE_XINPUT ON) elseif (UDEV_FOUND) set(HAVE_UDEV ON) else() message(STATUS "X11 XInput and UDev is not found, either is required to keep layouts with keyboard hotplugging") endif() ### kded daemon ### set( kded_keyboard_SRCS keyboard_daemon.cpp layout_memory.cpp layout_memory_persister.cpp udev_helper.cpp x11_helper.cpp xinput_helper.cpp xkb_helper.cpp keyboard_config.cpp keyboard_hardware.cpp bindings.cpp # next are temporary for sys tray UI layout_tray_icon.cpp layouts_menu.cpp flags.cpp xkb_rules.cpp ) ecm_qt_declare_logging_category(kded_keyboard_SRCS HEADER debug.h IDENTIFIER KCM_KEYBOARD CATEGORY_NAME org.kde.kcm_keyboard DEFAULT_SEVERITY Warning) include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_library(kded_keyboard MODULE ${kded_keyboard_SRCS}) set_target_properties(kded_keyboard PROPERTIES OUTPUT_NAME keyboard) kcoreaddons_desktop_to_json(kded_keyboard keyboard.desktop SERVICE_TYPES kdedmodule.desktop) target_link_libraries(kded_keyboard Qt5::Concurrent Qt5::Widgets Qt5::X11Extras Qt5::Xml KF5::ConfigCore KF5::CoreAddons KF5::DBusAddons KF5::GlobalAccel KF5::I18n KF5::Notifications - KF5::Service KF5::WindowSystem KF5::Plasma KF5::XmlGui KF5::GuiAddons KF5::IconThemes XCB::XCB XCB::XKB ${X11_LIBRARIES} ${X11_Xkbfile_LIB} ) if (HAVE_XINPUT) target_link_libraries(kded_keyboard ${X11_Xinput_LIB}) endif() if (HAVE_UDEV) target_link_libraries(kded_keyboard ${UDEV_LIBS}) endif() install( TARGETS kded_keyboard DESTINATION ${KDE_INSTALL_PLUGINDIR}/kf5/kded ) ### kcm keyboard ### set(kcm_keyboard_PART_SRCS kcm_keyboard.cpp kcm_keyboard_widget.cpp kcm_view_models.cpp kcm_add_layout_dialog.cpp keyboard_config.cpp x11_helper.cpp xkb_helper.cpp xkb_rules.cpp flags.cpp iso_codes.cpp kcmmisc.cpp bindings.cpp tastenbrett.cpp) ecm_qt_declare_logging_category(kcm_keyboard_PART_SRCS HEADER debug.h IDENTIFIER KCM_KEYBOARD CATEGORY_NAME org.kde.kcm_keyboard DEFAULT_SEVERITY Warning) ki18n_wrap_ui(kcm_keyboard_PART_SRCS kcm_keyboard.ui kcm_add_layout_dialog.ui kcmmiscwidget.ui) add_library(kcm_keyboard MODULE ${kcm_keyboard_PART_SRCS}) target_link_libraries(kcm_keyboard Qt5::Concurrent Qt5::Widgets Qt5::X11Extras Qt5::Xml KF5::KCMUtils KF5::GlobalAccel KF5::I18n KF5::KIOCore KF5::KIOWidgets KF5::WindowSystem KF5::Plasma KF5::XmlGui KF5::GuiAddons KF5::IconThemes XCB::XCB XCB::XKB ${X11_Xkbfile_LIB} ${X11_LIBRARIES} ${text_paint_LIB} ) install(TARGETS kcm_keyboard DESTINATION ${KDE_INSTALL_PLUGINDIR} ) install( FILES kcm_keyboard.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} ) # Images add_subdirectory( pics ) configure_file(config-keyboard.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-keyboard.h) # Unit tests if(BUILD_TESTING) find_package(Qt5Test ${QT_MIN_VERSION} CONFIG REQUIRED) add_subdirectory( tests ) endif() add_dependencies(kcm_keyboard tastenbrett) diff --git a/kcms/keyboard/layouts_menu.cpp b/kcms/keyboard/layouts_menu.cpp index 71666a64b..a9e2aadce 100644 --- a/kcms/keyboard/layouts_menu.cpp +++ b/kcms/keyboard/layouts_menu.cpp @@ -1,140 +1,140 @@ /* * Copyright (C) 2010 Andriy Rysin (rysin@kde.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 of the License, or * (at your option) any later version. * * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "layouts_menu.h" #include "debug.h" -#include #include #include +#include #include "keyboard_config.h" #include "x11_helper.h" #include "xkb_helper.h" #include "flags.h" LayoutsMenu::LayoutsMenu(const KeyboardConfig& keyboardConfig_, const Rules& rules_, Flags& flags_): keyboardConfig(keyboardConfig_), rules(rules_), flags(flags_), actionGroup(nullptr) { } LayoutsMenu::~LayoutsMenu() { delete actionGroup; } const QIcon LayoutsMenu::getFlag(const QString& layout) const { return keyboardConfig.isFlagShown() ? flags.getIcon(layout) : QIcon(); } void LayoutsMenu::actionTriggered(QAction* action) { QString data = action->data().toString(); if( data == QLatin1String("config") ) { QStringList args; args << QStringLiteral("--args=--tab=layouts"); args << QStringLiteral("kcm_keyboard"); - KToolInvocation::kdeinitExec(QStringLiteral("kcmshell5"), args); + QProcess::startDetached(QStringLiteral("kcmshell5"), args); } else { LayoutUnit layoutUnit(LayoutUnit(action->data().toString())); switchToLayout(layoutUnit, keyboardConfig); } } int LayoutsMenu::switchToLayout(const LayoutUnit& layoutUnit, const KeyboardConfig& keyboardConfig) { QList layouts = X11Helper::getCurrentLayouts().layouts; bool res; if( layouts.contains(layoutUnit) ) { res = X11Helper::setLayout(layoutUnit); } else if ( keyboardConfig.layouts.contains(layoutUnit) ) { QList layouts(keyboardConfig.getDefaultLayouts()); layouts.removeLast(); layouts.append(layoutUnit); XkbHelper::initializeKeyboardLayouts(layouts); res = X11Helper::setLayout(layoutUnit); } else { qCWarning(KCM_KEYBOARD) << "switchToLayout with unknown layout" << layoutUnit.toString(); res = -1; } return res; } QAction* LayoutsMenu::createAction(const LayoutUnit& layoutUnit) const { QString menuText = Flags::getFullText(layoutUnit, keyboardConfig, &rules); QAction* action = new QAction(getFlag(layoutUnit.layout()), menuText, actionGroup); action->setData(layoutUnit.toString()); //FIXME: tooltips don't work on dbusmenus??? // if( ! layoutUnit.getShortcut().isEmpty() ) { // action->setToolTip(layoutUnit.getShortcut().toString()); // } return action; } QList LayoutsMenu::contextualActions() { if( actionGroup ) { disconnect(actionGroup, &QActionGroup::triggered, this, &LayoutsMenu::actionTriggered); delete actionGroup; } actionGroup = new QActionGroup(this); X11Helper::getLayoutsList(); //UGLY: seems to be more reliable with extra call QList currentLayouts = X11Helper::getLayoutsList(); foreach(const LayoutUnit& layoutUnit, currentLayouts) { QAction* action = createAction(layoutUnit); actionGroup->addAction(action); } if( keyboardConfig.configureLayouts ) { QList extraLayouts = keyboardConfig.layouts; foreach(const LayoutUnit& layoutUnit, currentLayouts) { extraLayouts.removeOne(layoutUnit); } if( extraLayouts.size() > 0 ) { QAction* separator = new QAction(actionGroup); separator->setSeparator(true); actionGroup->addAction(separator); foreach(const LayoutUnit& layoutUnit, extraLayouts) { QAction* action = createAction(layoutUnit); actionGroup->addAction(action); } } } QAction* separator = new QAction(actionGroup); separator->setSeparator(true); actionGroup->addAction(separator); QAction* configAction = new QAction(QIcon::fromTheme(QStringLiteral("configure")), i18n("Configure Layouts..."), actionGroup); actionGroup->addAction(configAction); configAction->setData("config"); connect(actionGroup, &QActionGroup::triggered, this, &LayoutsMenu::actionTriggered); return actionGroup->actions(); }