diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,6 +61,8 @@ WindowSystem DocTools NewStuff + GlobalAccel + XmlGui ) # optional components diff --git a/ExtraDesktop.sh b/ExtraDesktop.sh deleted file mode 100644 --- a/ExtraDesktop.sh +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/sh -#This file outputs in a separate line each file with a .desktop syntax -#that needs to be translated but has a non .desktop extension -find -name \*.khotkeys -print diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt --- a/desktop/CMakeLists.txt +++ b/desktop/CMakeLists.txt @@ -5,17 +5,28 @@ DESTINATION ${XDG_APPS_INSTALL_DIR} ) +install( DIRECTORY DESTINATION "${KDE_INSTALL_FULL_DATAROOTDIR}/kglobalaccel" ) install( - FILES spectacle.notifyrc - DESTINATION ${KNOTIFYRC_INSTALL_DIR} + CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink \"${KDE_INSTALL_FULL_APPDIR}/org.kde.dolphin.desktop\" \"\$ENV{DESTDIR}${KDE_INSTALL_FULL_DATAROOTDIR}/kglobalaccel/org.kde.dolphin.desktop\")" ) install( - FILES spectacle.khotkeys - DESTINATION ${DATA_INSTALL_DIR}/khotkeys + FILES spectacle.notifyrc + DESTINATION ${KNOTIFYRC_INSTALL_DIR} ) install( FILES org.kde.spectacle.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR} ) + +install( + FILES spectacle_shortcuts.upd + DESTINATION ${KDE_INSTALL_KCONFUPDATEDIR} +) +add_executable(spectacle-migrate-shortcuts MigrateShortcuts.cpp) +target_link_libraries(spectacle-migrate-shortcuts Qt5::DBus KF5::GlobalAccel KF5::ConfigCore KF5::XmlGui KF5::I18n) +install( + TARGETS spectacle-migrate-shortcuts + DESTINATION ${KDE_INSTALL_LIBDIR}/kconf_update_bin +) diff --git a/desktop/MigrateShortcuts.cpp b/desktop/MigrateShortcuts.cpp new file mode 100644 --- /dev/null +++ b/desktop/MigrateShortcuts.cpp @@ -0,0 +1,115 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + QCoreApplication app(argc, argv); + QDBusInterface khotkeys(QStringLiteral("org.kde.kded5"), QStringLiteral("/modules/khotkeys"), + QStringLiteral("org.kde.khotkeys")); + KConfig khotkeysrc(QStringLiteral("khotkeysrc"), KConfig::SimpleConfig); + int dataCount = KConfigGroup(&khotkeysrc, "Data").readEntry("DataCount", 0); + bool found_spectacle = false; + int spectacleIndex; + for (int i = 1; i <= dataCount; ++i) { + if( KConfigGroup(&khotkeysrc, QStringLiteral("Data_%1").arg(i)).readEntry("ImportId", QString()) == QStringLiteral("spectacle")) { + found_spectacle = true; + spectacleIndex = i; + break; + } + } + QList launchKey; + QList fullScreenKey; + QList regionKey; + QList activeWindowKey; + QStringList ids; + if (found_spectacle) { + for (int i = 1; i <= 4; ++i) { + QString groupName = QStringLiteral("Data_%1_%2").arg(spectacleIndex).arg(i); + QString method = KConfigGroup(&khotkeysrc, groupName + QStringLiteral("Actions0")).readEntry("Call"); + QString id = KConfigGroup(&khotkeysrc, groupName + QStringLiteral("Triggers0")).readEntry("Uuid"); + QList shortcut = KGlobalAccel::self()->globalShortcut(QStringLiteral("khotkeys"), id); + ids.append(id); + /* Name and Comment field are translated but we can find out which action is which by looking at the called + * D-Bus Method */ + if (method == QStringLiteral("StartAgent")) { + launchKey = shortcut; + } else if (method == QStringLiteral("FullScreen")) { + fullScreenKey = shortcut; + } else if (method == QStringLiteral("ActiveWindow")) { + activeWindowKey = shortcut; + } else if (method == QStringLiteral("RectangularRegion")) { + regionKey = shortcut; + } + // Delete the groups from khotkeysrc + khotkeysrc.deleteGroup(groupName); + khotkeysrc.deleteGroup(groupName + QStringLiteral("Actions")); + khotkeysrc.deleteGroup(groupName + QStringLiteral("Actions0")); + khotkeysrc.deleteGroup(groupName + QStringLiteral("Conditions")); + khotkeysrc.deleteGroup(groupName + QStringLiteral("Triggers")); + khotkeysrc.deleteGroup(groupName + QStringLiteral("Triggers0")); + } + khotkeysrc.deleteGroup(QStringLiteral("Data_%1").arg(spectacleIndex)); + khotkeysrc.deleteGroup(QStringLiteral("Data_%1Conditions").arg(spectacleIndex)); + khotkeysrc.sync(); + } + QDBusInterface kglobalaccel(QStringLiteral("org.kde.kglobalaccel"), QStringLiteral("/kglobalaccel"), + QStringLiteral("org.kde.KGlobalAccel")); + // Unregister the khotkeysActions from globalAccel, removeAll didn't Work, so using D-Bus + for(const QString &action : ids) { + kglobalaccel.call(QStringLiteral("unregister"), QStringLiteral("khotkeys"), action); + } + //Setup the default Shortcuts + KActionCollection shortCutActions(static_cast(nullptr)); + shortCutActions.setComponentName(QStringLiteral("org.kde.spectacle.desktop")); + shortCutActions.setComponentDisplayName(QStringLiteral("Spectacle")); + { + QAction *action = new QAction(i18n("Launch Spectacle")); + action->setObjectName(QStringLiteral("_launch")); + shortCutActions.addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Entire Desktop")); + action->setObjectName(QStringLiteral("FullScreenScreenShot")); + shortCutActions.addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Current Monitor")); + action->setObjectName(QStringLiteral("CurrentMonitorScreenShot")); + shortCutActions.addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Active Window")); + action->setObjectName(QStringLiteral("ActiveWindowScreenShot")); + shortCutActions.addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Rectangular Region")); + action->setObjectName(QStringLiteral("RectangularRegionScreenShot")); + shortCutActions.addAction(action->objectName(), action); + } + QAction* openAction = shortCutActions.action(QStringLiteral("_launch")); + KGlobalAccel::self()->setDefaultShortcut(openAction, {Qt::Key_Print}); + QAction* fullScreenAction = shortCutActions.action(QStringLiteral("FullScreenScreenShot")); + KGlobalAccel::self()->setDefaultShortcut(fullScreenAction, {Qt::SHIFT + Qt::Key_Print}); + QAction* currentScreenAction = shortCutActions.action(QStringLiteral("CurrentMonitorScreenShot")); + QAction* activeWindowAction = shortCutActions.action(QStringLiteral("ActiveWindowScreenShot")); + KGlobalAccel::self()->setDefaultShortcut(activeWindowAction, {Qt::META + Qt::Key_Print}); + QAction* regionAction = shortCutActions.action(QStringLiteral("RectangularRegionScreenShot")); + KGlobalAccel::self()->setDefaultShortcut(regionAction, {Qt::META + Qt::SHIFT + Qt::Key_Print}); + // Finally reinstate the old shortcuts + if (found_spectacle) { + KGlobalAccel::self()->setShortcut(openAction, launchKey, KGlobalAccel::NoAutoloading); + KGlobalAccel::self()->setShortcut(fullScreenAction, fullScreenKey, KGlobalAccel::NoAutoloading); + KGlobalAccel::self()->setShortcut(activeWindowAction, activeWindowKey, KGlobalAccel::NoAutoloading); + KGlobalAccel::self()->setShortcut(regionAction, regionKey, KGlobalAccel::NoAutoloading); + } +} diff --git a/desktop/org.kde.spectacle.desktop b/desktop/org.kde.spectacle.desktop --- a/desktop/org.kde.spectacle.desktop +++ b/desktop/org.kde.spectacle.desktop @@ -121,6 +121,7 @@ Actions=FullScreenScreenShot;CurrentMonitorScreenShot;ActiveWindowScreenShot;RectangularRegionScreenShot; X-DBUS-StartupType=Multi X-DBUS-ServiceName=org.kde.Spectacle +X-KDE-Shortcuts=Print [Desktop Action FullScreenScreenShot] Name=Capture Entire Desktop @@ -163,6 +164,7 @@ Name[zh_CN]=抓取整个桌面 Name[zh_TW]=擷取整個桌面 Exec=qdbus org.kde.Spectacle / FullScreen false +X-KDE-Shortcuts=Shift+Print [Desktop Action CurrentMonitorScreenShot] Name=Capture Current Monitor @@ -206,6 +208,7 @@ Name[zh_TW]=擷取目前螢幕 Exec=qdbus org.kde.Spectacle / CurrentScreen false + [Desktop Action ActiveWindowScreenShot] Name=Capture Active Window Name[ar]=التقط النّافذة النّشطة @@ -247,6 +250,7 @@ Name[zh_CN]=抓取当前活动窗口 Name[zh_TW]=擷取作用中的視窗 Exec=qdbus org.kde.Spectacle / ActiveWindow true false +X-KDE-Shortcuts=Meta+Print [Desktop Action RectangularRegionScreenShot] Name=Capture Rectangular Region @@ -289,3 +293,4 @@ Name[zh_CN]=抓取方形区域 Name[zh_TW]=擷取矩形區域 Exec=qdbus org.kde.Spectacle / RectangularRegion true +X-KDE-Shortcuts=Meta+Shift+Print diff --git a/desktop/spectacle.khotkeys b/desktop/spectacle.khotkeys deleted file mode 100644 --- a/desktop/spectacle.khotkeys +++ /dev/null @@ -1,620 +0,0 @@ -[Main] -ImportId=spectacle -Version=2 - -[Data] -DataCount=1 - -[Data_1] -Comment=Shortcuts for taking screenshots -Comment[ca]=Dreceres per a prendre captures de pantalla -Comment[ca@valencia]=Dreceres per a prendre captures de pantalla -Comment[cs]=Zkratky pro pořizování snímků obrazovky -Comment[da]=Genveje til at tage skærmbilleder -Comment[de]=Kurzbefehle für die Aufnahme von Bildschirmfotos -Comment[el]=Συντομεύσεις για τη λήψη στιγμιοτύπων οθόνης -Comment[en_GB]=Shortcuts for taking screenshots -Comment[es]=Accesos rápidos para realizar capturas de pantalla -Comment[et]=Kiirklahvid ekraanipildi tegemiseks -Comment[eu]=Pantaila-argazkiak hartzeko lasterbideak -Comment[fi]=Kuvakaappausten ottamisen pikanäppäimet -Comment[fr]=Raccourcis pour prendre des captures d'écran -Comment[gl]=Atallos para facer capturas de pantalla. -Comment[he]=קיצור דרך לצילום מסך -Comment[ia]=Vias breve per prender instantaneo de schermo -Comment[id]=Pintasan keyboard untuk mengambil screenshot -Comment[it]=Scorciatoia per acquisire schermate -Comment[ko]=화면 스크린샷 찍기 단축키 -Comment[nl]=Sneltoetsen voor het maken van schermafdrukken -Comment[nn]=Snarvegar for å ta bilete av skjermen -Comment[pl]=Skróty do zrzucania ekranu -Comment[pt]=Atalhos para tirar fotografias -Comment[pt_BR]=Atalhos para capturar imagens da tela -Comment[ru]=Комбинации клавиш для создания снимков экрана -Comment[sk]=Skratky na tvorbu snímok -Comment[sl]=Bližnjice za zajemanje zaslonskih slik -Comment[sr]=Пречице за хватање снимака екрана -Comment[sr@ijekavian]=Пречице за хватање снимака екрана -Comment[sr@ijekavianlatin]=Prečice za hvatanje snimaka ekrana -Comment[sr@latin]=Prečice za hvatanje snimaka ekrana -Comment[sv]=Genvägar för att ta skärmbilder -Comment[tr]=Ekran görüntüsü alabilmek için kısayollar -Comment[uk]=Клавіатурні скорочення для створення знімків -Comment[x-test]=xxShortcuts for taking screenshotsxx -Comment[zh_CN]=截图快捷键 -Comment[zh_TW]=螢幕快照的快捷鍵 -DataCount=4 -Enabled=true -Name=Screenshots -Name[ca]=Captures de pantalla -Name[ca@valencia]=Captures de pantalla -Name[cs]=Snímky obrazovky -Name[da]=Skærmbilleder -Name[de]=Bildschirmfotos -Name[el]=Στιγμιότυπα οθόνης -Name[en_GB]=Screenshots -Name[es]=Capturas de pantalla -Name[et]=Ekraanipildid -Name[eu]=Pantaila-argazkiak -Name[fi]=Kuvakaappaukset -Name[fr]=Captures d'écran -Name[gl]=Capturas de pantalla -Name[he]=צילומי מסך -Name[ia]=Instantaneo de schermo -Name[id]=Screenshot -Name[it]=Schermate -Name[ko]=스크린샷 -Name[nl]=Schermafdrukken -Name[nn]=Skjermbilete -Name[pl]=Zrzuty ekranu -Name[pt]=Fotografias -Name[pt_BR]=Captura de tela -Name[ru]=Снимки экрана -Name[sk]=Zachytené obrazovky -Name[sl]=Zaslonske slike -Name[sr]=Снимци екрана -Name[sr@ijekavian]=Снимци екрана -Name[sr@ijekavianlatin]=Snimci ekrana -Name[sr@latin]=Snimci ekrana -Name[sv]=Skärmbilder -Name[tr]=Ekran görüntüleri -Name[uk]=Знімки екрана -Name[x-test]=xxScreenshotsxx -Name[zh_CN]=截图 -Name[zh_TW]=螢幕快照 -SystemGroup=0 -Type=ACTION_DATA_GROUP - -[Data_1Conditions] -Comment= -ConditionsCount=0 - -[Data_1_1] -Comment=Start the screenshot tool and show the GUI -Comment[ca]=Inicia l'eina de captura de pantalla i mostra la IGU -Comment[ca@valencia]=Inicia l'eina de captura de pantalla i mostra la IGU -Comment[da]=Start skærmbilledeværktøjet og vis den grafiske brugerflade -Comment[de]=Startet das Programm und zeigt die graphische Bedienungsoberfläche an -Comment[el]=Εκκίνηση του εργαλείου στιγμιοτύπων και εμφάνιση του γραφικού περιβάλλοντος -Comment[en_GB]=Start the screenshot tool and show the GUI -Comment[es]=Iniciar la herramienta de captura de pantalla y mostrar su interfaz -Comment[et]=Ekraani pildistamise tööriista käivitamine ja graafilise kasutajaliidese näitamine -Comment[eu]=Abiarazi pantaila-argazki tresna eta erakutsi interfaze grafikoa -Comment[fi]=Käynnistä kuvankaappausohjelma ja näytä käyttöliittymä -Comment[fr]=Démarrer l'outil de capture d'écran et afficher l'interface utilisateur -Comment[gl]=Iniciar a ferramenta de captura de pantalla e mostrar a súa interface. -Comment[he]=הפעל את כלי צילום המסך והראה את הממשק הגרפי -Comment[ia]=Initia le instrumento de instantaneo de schermo e monstra le GUI -Comment[id]=Mulaikan alat screenshot dan tampilkan GUI -Comment[it]=Avvia lo strumento per le schermate e ne mostra l'interfaccia -Comment[ko]=스크린샷 도구를 시작하고 GUI 보이기 -Comment[nl]=Start het hulpmiddel voor schermafdrukken en toon de GUI -Comment[nn]=Start skjermbiletverktøyet og vis grafisk grensesnitt -Comment[pl]=Wywołaj narzędzie zrzutów ekranu i pokaż graficzny interfejs -Comment[pt]=Iniciar a ferramenta de fotografias e mostrar a interface -Comment[pt_BR]=Inicia a ferramenta gráfica para captura de telas -Comment[ru]=Запустить утилиту создания снимков экрана и показать её окно -Comment[sk]=Spustí nástroj na snímky a zobrazí GUI -Comment[sl]=Zaženi orodje za zaslonske slike in prikaži grafični uporabniški vmesnik -Comment[sr]=Покрени алатку за снимке екрана са графичким сучељем -Comment[sr@ijekavian]=Покрени алатку за снимке екрана са графичким сучељем -Comment[sr@ijekavianlatin]=Pokreni alatku za snimke ekrana sa grafičkim sučeljem -Comment[sr@latin]=Pokreni alatku za snimke ekrana sa grafičkim sučeljem -Comment[sv]=Starta skärmbildsverktyget och visa det grafiska användargränssnittet -Comment[tr]=Ekran görüntüsü aracını başlat ve arayüzü göster -Comment[uk]=Запустити інструмент створення знімків і показати графічний інтерфейс -Comment[x-test]=xxStart the screenshot tool and show the GUIxx -Comment[zh_CN]=启动截图工具并显示界面 -Comment[zh_TW]=啟動螢幕快照工具並顯示使用者介面 -Enabled=true -Name=Start Screenshot Tool -Name[ca]=Inicia l'eina de captura de pantalla -Name[ca@valencia]=Inicia l'eina de captura de pantalla -Name[cs]=Spustit nástroj na zachytávání snímků obrazovky -Name[da]=Start skærmebilledeværktøjet -Name[de]=Bildschirmfoto-Programm starten -Name[el]=Εκκίνηση του εργαλείου στιγμιοτύπων -Name[en_GB]=Start Screenshot Tool -Name[es]=Iniciar la herramienta de captura de pantalla -Name[et]=Ekraani pildistamise tööriista käivitamine -Name[eu]=Abiarazi pantaila-argazki tresna -Name[fi]=Käynnistä kuvankaappausohjelma -Name[fr]=Démarrer l'outil de capture d'écran -Name[gl]=Iniciar a ferramenta de captura de pantalla -Name[he]=הפעל את כלי צילום המסך -Name[ia]=Initia le instrumento de instantaneo de schermo -Name[id]=Mulaikan Alat Screenshot -Name[it]=Avvia lo strumento per le schermate -Name[ko]=스크린샷 도구 시작하기 -Name[nl]=Het hulpmiddel voor schermafdrukken starten -Name[nn]=Skjermbiletverktøyet -Name[pl]=Wywołaj narzędzie zrzutów ekranu -Name[pt]=Iniciar a Ferramenta de Fotografias -Name[pt_BR]=Iniciar a ferramenta de captura de tela -Name[ru]=Запустить утилиту создания снимков экрана -Name[sk]=Spustiť nástroj snímok -Name[sl]=Zaženi orodje za zaslonske slike -Name[sr]=Покрени алатку за снимке екрана -Name[sr@ijekavian]=Покрени алатку за снимке екрана -Name[sr@ijekavianlatin]=Pokreni alatku za snimke ekrana -Name[sr@latin]=Pokreni alatku za snimke ekrana -Name[sv]=Starta skärmbildsverktyg -Name[tr]=Ekran Görüntüsü Aracını Başlat -Name[uk]=Запустити інструмент створення знімків -Name[x-test]=xxStart Screenshot Toolxx -Name[zh_CN]=启动截图工具 -Name[zh_TW]=啟動螢幕快照工具 -Type=SIMPLE_ACTION_DATA - -[Data_1_1Actions] -ActionsCount=1 - -[Data_1_1Actions0] -Arguments= -Call=StartAgent -RemoteApp=org.kde.Spectacle -RemoteObj=/ -Type=DBUS - -[Data_1_1Conditions] -Comment= -ConditionsCount=0 - -[Data_1_1Triggers] -Comment=Simple_action -Comment[ca]=Acció_senzilla -Comment[ca@valencia]=Acció_senzilla -Comment[cs]=Jednoduchá činnost -Comment[da]=Simpel_handling -Comment[de]=Einfache Aktion -Comment[el]=Απλή_ενέργεια -Comment[en_GB]=Simple_action -Comment[es]=Acción_sencilla -Comment[et]=Lihtne toiming -Comment[eu]=Ekintza_erraza -Comment[fi]=Yksinkertainen_toiminto -Comment[fr]=Action simple -Comment[gl]=Acción_sinxela -Comment[ia]=Simple_action -Comment[id]=Tindakan_sederhana -Comment[it]=Azione_semplice -Comment[ko]=Simple_action -Comment[nl]=Eenvoudige_handeling -Comment[nn]=Enkel_handling -Comment[pl]=Proste_działanie -Comment[pt]=Acção Simples -Comment[pt_BR]=Ação simples -Comment[ru]=Действие -Comment[sk]=Jednoduchá akcia -Comment[sl]=Preprosto_dejanje -Comment[sr]=Једноставна радња -Comment[sr@ijekavian]=Једноставна радња -Comment[sr@ijekavianlatin]=Jednostavna radnja -Comment[sr@latin]=Jednostavna radnja -Comment[sv]=Enkel-åtgärd -Comment[tr]=Basit_eylem -Comment[uk]=Проста_дія -Comment[x-test]=xxSimple_actionxx -Comment[zh_CN]=简单动作 -Comment[zh_TW]=簡易動作 -TriggersCount=1 - -[Data_1_1Triggers0] -Key=Print -Type=SHORTCUT - -[Data_1_2] -Comment=Take a full screen (all monitors) screenshot and save it -Comment[ca]=Pren una captura de pantalla completa (tots els monitors) i la desa -Comment[ca@valencia]=Pren una captura de pantalla completa (tots els monitors) i la guarda -Comment[da]=Tag skærmbillede af hele skærmen (alle skærme) og gem det -Comment[de]=Bildschirmfoto des ganzen Bildschirms aller Monitore aufnehmen und speichern -Comment[el]=Λήψη ενός πλήρους στιγμιοτύπου οθόνης (όλες οι οθόνες) και αποθήκευσή του -Comment[en_GB]=Take a full screen (all monitors) screenshot and save it -Comment[es]=Hacer una captura de pantalla completa (de todos los monitores) y guardarla -Comment[et]=Täisekraani (kõik monitorid) pildistamine ja salvestamine -Comment[eu]=Hartu pantaila osoko (monitore guztiak) pantaila-argazkia eta gorde -Comment[fi]=Ota koko näytön (kaikkien näyttöjen) kuvakaappaus ja tallenna se -Comment[fr]=Prendre une capture d'écran en plein écran (tous les moniteurs) et l'enregistrer -Comment[gl]=Facer unha captura de pantalla completa (todos os monitores) e gardala. -Comment[ia]=Prende un instantaneo de schermo plen (omne monitors) e salveguarda lo -Comment[id]=Ambil sebuah screenshot layar penuh (semua monitor) dan menyimpannya -Comment[it]=Cattura una schermata a tutto schermo (tutti i monitor) e la salva -Comment[ko]=모든 모니터의 스크린샷을 찍고 저장하기 -Comment[nl]=Een volledige schermafdruk maken (alle monitoren) en deze opslaan -Comment[nn]=Ta eit fullskjermbilete (alle skjermar) og lagra det -Comment[pl]=Wykonaj zrzut całego ekranu (wszystkie monitory) i zapisz go -Comment[pt]=Capturar o ecrã por inteiro (todos os monitores) e gravar a imagem -Comment[pt_BR]=Captura e salva a tela inteira (todos os monitores) -Comment[ru]=Сделать снимок всех экранов и сохранить его -Comment[sk]=Vytvoriť snímku celej obrazovky (všetkých monitorov) a uložiť ju -Comment[sl]=Zajemi celozaslonsko sliko (vsi zasloni) in jo shrani -Comment[sr]=Ухвати снимак целог екрана (сви монитори) и сачувај га -Comment[sr@ijekavian]=Ухвати снимак целог екрана (сви монитори) и сачувај га -Comment[sr@ijekavianlatin]=Uhvati snimak celog ekrana (svi monitori) i sačuvaj ga -Comment[sr@latin]=Uhvati snimak celog ekrana (svi monitori) i sačuvaj ga -Comment[sv]=Ta en skärmbild av hela skärmen (alla bildskärmar) och spara den -Comment[tr]=Tam ekran ekran görüntüsü (tüm ekranlar) al ve kaydet -Comment[uk]=Зробити знімок усього екрана (усіх моніторів) і зберегти його -Comment[x-test]=xxTake a full screen (all monitors) screenshot and save itxx -Comment[zh_CN]=对全屏 (所有显示器) 截图并保存 -Comment[zh_TW]=取得全螢幕(所有螢幕)快照並儲存 -Enabled=true -Name=Take Full Screen Screenshot -Name[ca]=Pren una captura de pantalla completa -Name[ca@valencia]=Pren una captura de pantalla completa -Name[cs]=Zachytit snímek celé obrazovky -Name[da]=Tag skærmbillede af hele skærmen -Name[de]=Bildschirmfoto des ganzen Bildschirms aufnehmen -Name[el]=Λήψη πλήρους στιγμιοτύπου οθόνης -Name[en_GB]=Take Full Screen Screenshot -Name[es]=Hacer una captura de pantalla completa -Name[et]=Täisekraanipildi tegemine -Name[eu]=Hartu pantaila osoko pantaila-argazkia -Name[fi]=Ota koko näytön kuvakaappaus -Name[fr]=Prendre une capture d'écran en plein écran -Name[gl]=Capturar todas as pantallas -Name[ia]=Prende un instantaneo a schermo plen -Name[id]=Ambil Screenshot Layar Penuh -Name[it]=Cattura l'intero schermo -Name[ko]=전체 화면 스크린샷 찍기 -Name[nl]=Schermafdruk van Volledig scherm maken -Name[nn]=Ta fullskjermsbilete -Name[pl]=Wykonaj zrzut całego ekranu -Name[pt]=Tirar uma Imagem do Ecrã Inteiro -Name[pt_BR]=Capturar a tela inteira -Name[ru]=Сделать снимок всех экранов -Name[sk]=Vytvoriť snímku celej obrazovky -Name[sl]=Zajemi celozaslonsko sliko -Name[sr]=Ухвати снимак целог екрана -Name[sr@ijekavian]=Ухвати снимак целог екрана -Name[sr@ijekavianlatin]=Uhvati snimak celog ekrana -Name[sr@latin]=Uhvati snimak celog ekrana -Name[sv]=Ta en skärmbild av hela skärmen -Name[tr]=Tam Ekran Ekran Görüntüsü Al -Name[uk]=Зробити знімок усього екрана -Name[x-test]=xxTake Full Screen Screenshotxx -Name[zh_CN]=对全屏截图 -Name[zh_TW]=取得全螢幕快照 -Type=SIMPLE_ACTION_DATA - -[Data_1_2Actions] -ActionsCount=1 - -[Data_1_2Actions0] -Arguments=false -Call=FullScreen -RemoteApp=org.kde.Spectacle -RemoteObj=/ -Type=DBUS - -[Data_1_2Conditions] -Comment= -ConditionsCount=0 - -[Data_1_2Triggers] -Comment=Simple_action -Comment[ca]=Acció_senzilla -Comment[ca@valencia]=Acció_senzilla -Comment[cs]=Jednoduchá činnost -Comment[da]=Simpel_handling -Comment[de]=Einfache Aktion -Comment[el]=Απλή_ενέργεια -Comment[en_GB]=Simple_action -Comment[es]=Acción_sencilla -Comment[et]=Lihtne toiming -Comment[eu]=Ekintza_erraza -Comment[fi]=Yksinkertainen_toiminto -Comment[fr]=Action simple -Comment[gl]=Acción_sinxela -Comment[ia]=Simple_action -Comment[id]=Tindakan_sederhana -Comment[it]=Azione_semplice -Comment[ko]=Simple_action -Comment[nl]=Eenvoudige_handeling -Comment[nn]=Enkel_handling -Comment[pl]=Proste_działanie -Comment[pt]=Acção Simples -Comment[pt_BR]=Ação simples -Comment[ru]=Действие -Comment[sk]=Jednoduchá akcia -Comment[sl]=Preprosto_dejanje -Comment[sr]=Једноставна радња -Comment[sr@ijekavian]=Једноставна радња -Comment[sr@ijekavianlatin]=Jednostavna radnja -Comment[sr@latin]=Jednostavna radnja -Comment[sv]=Enkel-åtgärd -Comment[tr]=Basit_eylem -Comment[uk]=Проста_дія -Comment[x-test]=xxSimple_actionxx -Comment[zh_CN]=简单动作 -Comment[zh_TW]=簡易動作 -TriggersCount=1 - -[Data_1_2Triggers0] -Key=Shift+Print -Type=SHORTCUT - -[Data_1_3] -Comment=Take a screenshot of the currently active window and save it -Comment[ca]=Pren una captura de pantalla de la finestra activa i la desa -Comment[ca@valencia]=Pren una captura de pantalla de la finestra activa i la guarda -Comment[da]=Tag skærmbillede af det aktuelt aktive vindue og gem det -Comment[de]=Erstellt ein Bildschirmfoto des aktuell aktiven Fensters und speichert es -Comment[el]=Λήψη ενός στιγμιοτύπου του ενεργού παραθύρου και αποθήκευσή του -Comment[en_GB]=Take a screenshot of the currently active window and save it -Comment[es]=Hacer una captura de la ventana activa actualmente y guardarla -Comment[et]=Aktiivse akna pildistamine ja salvestamine -Comment[eu]=Hartu pantaila-argazki bat uneko leiho aktiboarena eta gorde -Comment[fi]=Ota kuvakaappaus aktiivisesta ikkunasta ja tallenna se -Comment[fr]=Prendre une capture d'écran de la fenêtre active et l'enregistrer -Comment[gl]=Capturar a xanela activa e gardar a captura. -Comment[ia]=Prende un instantaneo defenestra currentemente active e salveguarda lo -Comment[id]=Ambil sebuah screenshot pada window yang aktif saat ini dan menyimpannya -Comment[it]=Cattura una schermata della finestra attiva e la salva -Comment[ko]=현재 활성 창 스크린샷을 찍고 저장하기 -Comment[nl]=Een schermafdruk van het huidige actieve venster maken en het opslaan -Comment[nn]=Ta skjermbilete frå det aktive vindauget og lagra det -Comment[pl]=Wykonaj zrzut obecnie aktywnego okna i zapisz go -Comment[pt]=Capturar uma imagem da janela activa de momento e gravá-la -Comment[pt_BR]=Captura e salva a imagem da janela ativa -Comment[ru]=Сделать снимок активного окна и сохранить его -Comment[sk]=Vytvoriť snímku aktuálne aktívneho okna a uložiť ju -Comment[sl]=Zajemi zaslonsko sliko trenutno dejavnega okna in jo shrani -Comment[sr]=Ухвати снимак тренутно активног прозора и сачувај га -Comment[sr@ijekavian]=Ухвати снимак тренутно активног прозора и сачувај га -Comment[sr@ijekavianlatin]=Uhvati snimak trenutno aktivnog prozora i sačuvaj ga -Comment[sr@latin]=Uhvati snimak trenutno aktivnog prozora i sačuvaj ga -Comment[sv]=Ta en skärmbild av nuvarande aktiva fönster och spara den -Comment[tr]=Geçerli pencerenin ekran görüntüsünü al ve kaydet -Comment[uk]=Зробити знімок поточного активного вікна і зберегти його -Comment[x-test]=xxTake a screenshot of the currently active window and save itxx -Comment[zh_CN]=对当前活动窗口截图并保存 -Comment[zh_TW]=取得目前作用中視窗的快照並儲存 -Enabled=true -Name=Take Active Window Screenshot -Name[ca]=Pren una captura de pantalla de la finestra activa -Name[ca@valencia]=Pren una captura de pantalla de la finestra activa -Name[cs]=Zachytit snímek aktivního okna -Name[da]=Tag skærmbillede af det aktive vindue -Name[de]=Bildschirmfoto des aktiven Fensters -Name[el]=Λήψη στιγμιοτύπου ενεργού παραθύρου -Name[en_GB]=Take Active Window Screenshot -Name[es]=Hacer una captura de la ventana activa -Name[et]=Aktiivse akna pildistamine -Name[eu]=Hartu leiho aktiboaren pantaila-argazkia -Name[fi]=Ota kuvakaappaus aktiivisesta ikkunasta -Name[fr]=Prendre une capture d'écran de la fenêtre active -Name[gl]=Capturar a xanela activa -Name[ia]=Prende instantaneo de schermo de fenestra active -Name[id]=Ambil Screenshot Window Aktif -Name[it]=Cattura la finestra attiva -Name[ko]=활성 창 스크린샷 찍기 -Name[nl]=Schermafdruk van actieve venster maken -Name[nn]=Ta skjermbilete av aktivt vindauge -Name[pl]=Wykonaj zrzut obecnie aktywnego okna -Name[pt]=Tirar uma Fotografia da Janela Activa -Name[pt_BR]=Capturar a imagem da janela ativa -Name[ru]=Сделать снимок активного окна -Name[sk]=Zachytiť snímku aktuálneho okna -Name[sl]=Zajemi zaslonsko sliko dejavnega okna -Name[sr]=Ухвати снимак активног прозора -Name[sr@ijekavian]=Ухвати снимак активног прозора -Name[sr@ijekavianlatin]=Uhvati snimak aktivnog prozora -Name[sr@latin]=Uhvati snimak aktivnog prozora -Name[sv]=Ta en skärmbild av aktivt fönster -Name[tr]=Geçerli Pencere Ekran Görüntüsü Al -Name[uk]=Зробити знімок активного вікна -Name[x-test]=xxTake Active Window Screenshotxx -Name[zh_CN]=对活动窗口截图 -Name[zh_TW]=取得目前視窗快照 -Type=SIMPLE_ACTION_DATA - -[Data_1_3Actions] -ActionsCount=1 - -[Data_1_3Actions0] -Arguments=true false -Call=ActiveWindow -RemoteApp=org.kde.Spectacle -RemoteObj=/ -Type=DBUS - -[Data_1_3Conditions] -Comment= -ConditionsCount=0 - -[Data_1_3Triggers] -Comment=Simple_action -Comment[ca]=Acció_senzilla -Comment[ca@valencia]=Acció_senzilla -Comment[cs]=Jednoduchá činnost -Comment[da]=Simpel_handling -Comment[de]=Einfache Aktion -Comment[el]=Απλή_ενέργεια -Comment[en_GB]=Simple_action -Comment[es]=Acción_sencilla -Comment[et]=Lihtne toiming -Comment[eu]=Ekintza_erraza -Comment[fi]=Yksinkertainen_toiminto -Comment[fr]=Action simple -Comment[gl]=Acción_sinxela -Comment[ia]=Simple_action -Comment[id]=Tindakan_sederhana -Comment[it]=Azione_semplice -Comment[ko]=Simple_action -Comment[nl]=Eenvoudige_handeling -Comment[nn]=Enkel_handling -Comment[pl]=Proste_działanie -Comment[pt]=Acção Simples -Comment[pt_BR]=Ação simples -Comment[ru]=Действие -Comment[sk]=Jednoduchá akcia -Comment[sl]=Preprosto_dejanje -Comment[sr]=Једноставна радња -Comment[sr@ijekavian]=Једноставна радња -Comment[sr@ijekavianlatin]=Jednostavna radnja -Comment[sr@latin]=Jednostavna radnja -Comment[sv]=Enkel-åtgärd -Comment[tr]=Basit_eylem -Comment[uk]=Проста_дія -Comment[x-test]=xxSimple_actionxx -Comment[zh_CN]=简单动作 -Comment[zh_TW]=簡易動作 -TriggersCount=1 - -[Data_1_3Triggers0] -Key=Meta+Print -Type=SHORTCUT - -[Data_1_4] -Comment=Take a screenshot of a rectangular region you specify and save it -Comment[ca]=Pren una captura de pantalla d'una regió rectangular i la desa -Comment[ca@valencia]=Pren una captura de pantalla d'una regió rectangular i la guarda -Comment[da]=Tag skærmbillede af et firkantet område som du angiver og gem det -Comment[de]=Erstellt ein Bildschirmfoto eines rechteckigen Bereichs und speichert es -Comment[el]=Λήψη στιγμιοτύπου μιας καθορισμένης ορθογώνιας περιοχής και αποθήκευσή του -Comment[en_GB]=Take a screenshot of a rectangular region you specify and save it -Comment[es]=Hacer una captura de la región rectangular indicada y guardarla -Comment[et]=Määratava ristkülikukujulise ala pildistamine ja salvestamine -Comment[eu]=Hartu pantaila-argazki bat zuk zehatutako eskualde laukizuzenarena eta gorde -Comment[fi]=Ota kuvakaappaus annetusta suorakulmaisesta alueesta ja tallenna se -Comment[fr]=Prendre une capture d'écran d'une région rectangulaire que vous avez spécifié et l'enregistrer -Comment[gl]=Capturar unha rexión rectangular indicada e gardar a captura. -Comment[ia]=Prende un instantaneo del region rectangular que tu specificava e salveguarda lo -Comment[id]=Ambil sebuah screenshot pada bidang persegi yang Anda tetapkan dan menyimpannya -Comment[it]=Cattura una schermata di una regione rettangolare a piacere e la salva -Comment[ko]=지정한 사각형 영역의 스크린샷을 찍고 저장하기 -Comment[nl]=Een schermafdruk van een rechthoekig gebied dat u specificeert maken en het opslaan -Comment[nn]=Ta rektangulært skjermutsnitt og lagra det -Comment[pl]=Wykonaj zrzut podanego przez ciebie prostokątnego obszaru i zapisz go -Comment[pt]=Capturar uma imagem de uma região rectangular à sua escolha e gravá-la -Comment[pt_BR]=Captura e salva a imagem de uma região retangular -Comment[ru]=Сделать снимок прямоугольной области экрана и сохранить его -Comment[sk]=Vytvoriť snímku pravouhlej oblasti, ktorú určíte, a uložiť ju -Comment[sl]=Zajemi zaslonsko sliko pravokotnega območja in jo shrani -Comment[sr]=Ухвати снимак задате правоугаоне зоне и сачувај га -Comment[sr@ijekavian]=Ухвати снимак задате правоугаоне зоне и сачувај га -Comment[sr@ijekavianlatin]=Uhvati snimak zadate pravougaone zone i sačuvaj ga -Comment[sr@latin]=Uhvati snimak zadate pravougaone zone i sačuvaj ga -Comment[sv]=Ta en skärmbild av ett angivet rektangulärt område och spara den -Comment[tr]=Belirtilen diktörtgen bölgenin ekran görüntüsünü al ve kaydet -Comment[uk]=Зробити знімок вказаної прямокутної ділянки і зберегти його -Comment[x-test]=xxTake a screenshot of a rectangular region you specify and save itxx -Comment[zh_CN]=对指定矩形区域截图并保存 -Comment[zh_TW]=取得您指定的矩形區域的快照並儲存 -Enabled=true -Name=Take Rectangular Region Screenshot -Name[ca]=Pren una captura de pantalla d'una regió rectangular -Name[ca@valencia]=Pren una captura de pantalla d'una regió rectangular -Name[cs]=Zachytit snímek obdélníkové oblasti -Name[da]=Tag skærmbillede af et firkantet område -Name[de]=Bildschirmfoto eines rechteckigen Bereichs -Name[el]=Λήψη στιγμιοτύπου ορθογώνιας περιοχής -Name[en_GB]=Take Rectangular Region Screenshot -Name[es]=Hacer una captura de una región rectangular -Name[et]=Ristkülikukujulise ala pildistamine -Name[eu]=Hartu eskualde laukizuzenaren pantaila-argazkia -Name[fi]=Ota kuvakaappaus suorakulmaisesta alueesta -Name[fr]=Prendre une capture d'écran d'une région rectangulaire -Name[gl]=Capturar unha rexión rectangular -Name[ia]=Prende un instantaneo de schermo de region rectangular -Name[id]=Ambil Screenshot Bidang Persegi -Name[it]=Cattura una regione rettangolare -Name[ko]=사각형 영역 스크린샷 찍기 -Name[nl]=Schermafdruk van rechthoekig gebied maken -Name[nn]=Ta rektangulært skjermutsnitt -Name[pl]=Wykonaj zrzut prostokątnego obszaru -Name[pt]=Tirar uma Fotografia de uma Região Rectangular -Name[pt_BR]=Capturar a imagem de uma região retangular -Name[ru]=Сделать снимок прямоугольной области экрана -Name[sk]=Zachytiť snímku pravouhlej oblasti -Name[sl]=Zajemi zaslonsko sliko pravokotnega območja -Name[sr]=Ухвати снимак правоугаоне зоне -Name[sr@ijekavian]=Ухвати снимак правоугаоне зоне -Name[sr@ijekavianlatin]=Uhvati snimak pravougaone zone -Name[sr@latin]=Uhvati snimak pravougaone zone -Name[sv]=Ta en skärmbild av ett rektangulärt område -Name[tr]=Dikdörtgen Bölge Ekran Görüntüsü Al -Name[uk]=Зробити знімок прямокутної ділянки -Name[x-test]=xxTake Rectangular Region Screenshotxx -Name[zh_CN]=对矩形区域截图 -Name[zh_TW]=取得矩形區域快照 -Type=SIMPLE_ACTION_DATA - -[Data_1_4Actions] -ActionsCount=1 - -[Data_1_4Actions0] -Arguments=true -Call=RectangularRegion -RemoteApp=org.kde.Spectacle -RemoteObj=/ -Type=DBUS - -[Data_1_4Conditions] -Comment= -ConditionsCount=0 - -[Data_1_4Triggers] -Comment=Simple_action -Comment[ca]=Acció_senzilla -Comment[ca@valencia]=Acció_senzilla -Comment[cs]=Jednoduchá činnost -Comment[da]=Simpel_handling -Comment[de]=Einfache Aktion -Comment[el]=Απλή_ενέργεια -Comment[en_GB]=Simple_action -Comment[es]=Acción_sencilla -Comment[et]=Lihtne toiming -Comment[eu]=Ekintza_erraza -Comment[fi]=Yksinkertainen_toiminto -Comment[fr]=Action simple -Comment[gl]=Acción_sinxela -Comment[ia]=Simple_action -Comment[id]=Tindakan_sederhana -Comment[it]=Azione_semplice -Comment[ko]=Simple_action -Comment[nl]=Eenvoudige_handeling -Comment[nn]=Enkel_handling -Comment[pl]=Proste_działanie -Comment[pt]=Acção Simples -Comment[pt_BR]=Ação simples -Comment[ru]=Действие -Comment[sk]=Jednoduchá akcia -Comment[sl]=Preprosto_dejanje -Comment[sr]=Једноставна радња -Comment[sr@ijekavian]=Једноставна радња -Comment[sr@ijekavianlatin]=Jednostavna radnja -Comment[sr@latin]=Jednostavna radnja -Comment[sv]=Enkel-åtgärd -Comment[tr]=Basit_eylem -Comment[uk]=Проста_дія -Comment[x-test]=xxSimple_actionxx -Comment[zh_CN]=简单动作 -Comment[zh_TW]=簡易動作 -TriggersCount=1 - -[Data_1_4Triggers0] -Key=Meta+Shift+Print -Type=SHORTCUT diff --git a/desktop/spectacle_shortcuts.upd b/desktop/spectacle_shortcuts.upd new file mode 100644 --- /dev/null +++ b/desktop/spectacle_shortcuts.upd @@ -0,0 +1,4 @@ +Version=5 +Id=spectacle-migrate-shortcuts +File=khotkeysrc +Script=spectacle-migrate-shortcuts diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,6 +38,7 @@ Gui/SettingsDialog/SettingsPage.cpp Gui/SettingsDialog/SaveOptionsPage.cpp Gui/SettingsDialog/GeneralOptionsPage.cpp + Gui/SettingsDialog/ShortcutsOptionsPage.cpp QuickEditor/QuickEditor.cpp ) @@ -80,6 +81,8 @@ KF5::KIOWidgets KF5::WindowSystem KF5::NewStuff + KF5::GlobalAccel + KF5::XmlGui ) if(XCB_FOUND) diff --git a/src/Gui/SettingsDialog/SettingsDialog.cpp b/src/Gui/SettingsDialog/SettingsDialog.cpp --- a/src/Gui/SettingsDialog/SettingsDialog.cpp +++ b/src/Gui/SettingsDialog/SettingsDialog.cpp @@ -21,8 +21,10 @@ #include "GeneralOptionsPage.h" #include "SaveOptionsPage.h" +#include "ShortcutsOptionsPage.h" #include +#include #include #include @@ -53,6 +55,12 @@ addPage(saveOptions); mPages.insert(saveOptions); + KPageWidgetItem *shortcutOptions = new KPageWidgetItem(new ShortcutsOptionsPage(this), i18n("Shortcuts")); + shortcutOptions->setHeader(i18n("Shortcuts")); + shortcutOptions->setIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-keyboard"))); + addPage(shortcutOptions); + mPages.insert(shortcutOptions); + connect(this, &SettingsDialog::currentPageChanged, this, &SettingsDialog::onPageChanged); } diff --git a/src/Gui/SettingsDialog/ShortcutsOptionsPage.h b/src/Gui/SettingsDialog/ShortcutsOptionsPage.h new file mode 100644 --- /dev/null +++ b/src/Gui/SettingsDialog/ShortcutsOptionsPage.h @@ -0,0 +1,31 @@ +#ifndef SHORTCUTSOPTIONSPAGE_H +#define SHORTCUTSOPTIONSPAGE_H + +#include "SettingsPage.h" + +class KShortcutsEditor; + +class ShortcutsOptionsPage : public SettingsPage +{ + Q_OBJECT + + public: + + explicit ShortcutsOptionsPage ( QWidget* parent ); + ~ShortcutsOptionsPage(); + + public Q_SLOTS: + + void saveChanges() override; + void resetChanges() override; + + private Q_SLOTS: + + void markDirty(); + + private: + + KShortcutsEditor* mEditor; +}; + +#endif // SHORTCUTSOPTIONSPAGE_H diff --git a/src/Gui/SettingsDialog/ShortcutsOptionsPage.cpp b/src/Gui/SettingsDialog/ShortcutsOptionsPage.cpp new file mode 100644 --- /dev/null +++ b/src/Gui/SettingsDialog/ShortcutsOptionsPage.cpp @@ -0,0 +1,44 @@ +#include "ShortcutsOptionsPage.h" + +#include "SpectacleConfig.h" + +#include +#include + +#include +#include +#include + +ShortcutsOptionsPage::ShortcutsOptionsPage(QWidget* parent) : SettingsPage(parent) +{ + QVBoxLayout *mainLayout = new QVBoxLayout(this); + setLayout(mainLayout); + + mEditor = new KShortcutsEditor(SpectacleConfig::instance()->shortCutActions, this, KShortcutsEditor::ActionType::GlobalAction); + mainLayout->addWidget(mEditor); + connect(mEditor, &KShortcutsEditor::keyChange, this, &ShortcutsOptionsPage::markDirty); +} + +ShortcutsOptionsPage::~ShortcutsOptionsPage() +{ + mEditor->undoChanges(); +} + + +void ShortcutsOptionsPage::resetChanges() +{ + mEditor->undoChanges(); + mChangesMade = false; +} + +void ShortcutsOptionsPage::saveChanges() +{ + mEditor->commit(); + mChangesMade = false; +} + +void ShortcutsOptionsPage::markDirty() +{ + mChangesMade = true; +} + diff --git a/src/SpectacleConfig.h b/src/SpectacleConfig.h --- a/src/SpectacleConfig.h +++ b/src/SpectacleConfig.h @@ -20,10 +20,12 @@ #ifndef SPECTACLECONFIG_H #define SPECTACLECONFIG_H +#include #include #include #include +#include #include #include @@ -54,6 +56,8 @@ FocusWindow }; + KActionCollection* shortCutActions; + private: explicit SpectacleConfig(QObject *parent = nullptr); diff --git a/src/SpectacleConfig.cpp b/src/SpectacleConfig.cpp --- a/src/SpectacleConfig.cpp +++ b/src/SpectacleConfig.cpp @@ -19,14 +19,55 @@ #include "SpectacleConfig.h" +#include #include +#include + +#include + SpectacleConfig::SpectacleConfig(QObject *parent) : QObject(parent) { mConfig = KSharedConfig::openConfig(QStringLiteral("spectaclerc")); mGeneralConfig = KConfigGroup(mConfig, "General"); mGuiConfig = KConfigGroup(mConfig, "GuiConfig"); + + shortCutActions = new KActionCollection(this); + + //everything here is named to match the jumplist actions in our .desktop file + shortCutActions->setComponentName(QStringLiteral("org.kde.spectacle.desktop")); + //qdbus org.kde.kglobalaccel /component/org_kde_spectacle_desktop org.kde.kglobalaccel.Component.shortcutNames + // ActiveWindowScreenShot + // CurrentMonitorScreenShot + // RectangularRegionScreenShot + // FullScreenScreenShot + // _launch + { + QAction *action = new QAction(i18n("Launch Spectacle")); + action->setObjectName(QStringLiteral("_launch")); + shortCutActions->addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Entire Desktop")); + action->setObjectName(QStringLiteral("FullScreenScreenShot")); + shortCutActions->addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Current Monitor")); + action->setObjectName(QStringLiteral("CurrentMonitorScreenShot")); + shortCutActions->addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Active Window")); + action->setObjectName(QStringLiteral("ActiveWindowScreenShot")); + shortCutActions->addAction(action->objectName(), action); + } + { + QAction *action = new QAction(i18n("Capture Rectangular Region")); + action->setObjectName(QStringLiteral("RectangularRegionScreenShot")); + shortCutActions->addAction(action->objectName(), action); + } } SpectacleConfig::~SpectacleConfig() diff --git a/src/SpectacleCore.h b/src/SpectacleCore.h --- a/src/SpectacleCore.h +++ b/src/SpectacleCore.h @@ -77,8 +77,10 @@ private: + void initGui(bool theIncludePointer, bool theIncludeDecorations); Platform::GrabMode toPlatformGrabMode(Spectacle::CaptureMode theCaptureMode); + void setUpShortcuts(); StartMode mStartMode; bool mNotify; diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp --- a/src/SpectacleCore.cpp +++ b/src/SpectacleCore.cpp @@ -22,6 +22,7 @@ #include "Config.h" +#include #include #include #include @@ -33,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -105,6 +107,24 @@ initGui(lGuiConfig.readEntry("includePointer", true), lGuiConfig.readEntry("includeDecorations", true)); break; } + setUpShortcuts(); +} + +void SpectacleCore::setUpShortcuts() +{ + SpectacleConfig* config = SpectacleConfig::instance(); + + QAction* openAction = config->shortCutActions->action(QStringLiteral("_launch")); + KGlobalAccel::self()->setGlobalShortcut(openAction, Qt::Key_Print); + + QAction* fullScreenAction = config->shortCutActions->action(QStringLiteral("FullScreenScreenShot")); + KGlobalAccel::self()->setGlobalShortcut(fullScreenAction, Qt::SHIFT + Qt::Key_Print); + + QAction* activeWindowAction = config->shortCutActions->action(QStringLiteral("ActiveWindowScreenShot")); + KGlobalAccel::self()->setGlobalShortcut(activeWindowAction, Qt::META + Qt::Key_Print); + + QAction* regionAction = config->shortCutActions->action(QStringLiteral("RectangularRegionScreenShot")); + KGlobalAccel::self()->setGlobalShortcut(regionAction, Qt::META + Qt::SHIFT + Qt::Key_Print); } QString SpectacleCore::filename() const @@ -144,7 +164,10 @@ break; } case Actions::FocusWindow: - KWindowSystem::forceActiveWindow(mMainWindow->winId()); + if (mMainWindow->isMinimized()) { + mMainWindow->setWindowState(mMainWindow->windowState() & ~Qt::WindowMinimized); + } + mMainWindow->activateWindow(); break; case Actions::StartNewInstance: QProcess newInstance; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -5,5 +5,5 @@ ../src/ExportManager.cpp ../src/SpectacleConfig.cpp ../src/Platforms/Platform.cpp TEST_NAME "filename_test" LINK_LIBRARIES Qt5::Test - Qt5::PrintSupport KF5::I18n KF5::ConfigCore KF5::KIOCore KF5::WindowSystem + Qt5::PrintSupport KF5::I18n KF5::ConfigCore KF5::GlobalAccel KF5::KIOCore KF5::WindowSystem KF5::XmlGui )