diff --git a/CMakeLists.txt b/CMakeLists.txt index 399fc93..9f3c89c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,17 +7,12 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) include(GenerateExportHeader) -set(SNORE_VERSION_MAJOR 0) -set(SNORE_VERSION_MINOR 1) -set(SNORE_VERSION_PATCH 0) -set(SNORE_VERSION_SUFFIX "alpha") - find_package(ECM 0.0.9 NO_MODULE) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH}) include(KDECompilerSettings) -find_package(LibsnoreQt5 REQUIRED) +find_package(LibsnoreQt5 0.5.91 REQUIRED) diff --git a/src/main.cpp b/src/main.cpp index fc1e044..897a339 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,13 +9,67 @@ #include +#ifdef Q_OS_WIN +#include +#include +#include +#include +#endif + using namespace Snore; +using namespace std; + +void bringToFront(QString pid, Notification noti) +{ + Q_UNUSED(pid) + Q_UNUSED(noti) +#ifdef Q_OS_WIN + auto findWindowForPid = [](ulong pid) + { + // based on http://stackoverflow.com/a/21767578 + pair data = make_pair(pid, (HWND)0); + ::EnumWindows([](HWND handle, LPARAM lParam) -> BOOL{ + auto isMainWindow = [](HWND handle){ + return ::GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle); + }; + pair& data = *(pair*)lParam; + ulong process_id = 0; + ::GetWindowThreadProcessId(handle, &process_id); + if (data.first != process_id || !isMainWindow(handle)) { + return TRUE; + } + data.second = handle; + return FALSE; + }, (LPARAM)&data); + return data.second; + }; + + HWND wid = findWindowForPid(pid.toInt()); + if(wid) { + HWND hwndActiveWin = GetForegroundWindow(); + int idActive = GetWindowThreadProcessId( hwndActiveWin, NULL ); + + if ( AttachThreadInput(GetCurrentThreadId(), idActive, TRUE) ) + { + SetForegroundWindow( wid ); + SetFocus( wid ); + FlashWindow( wid, TRUE ); + AttachThreadInput( GetCurrentThreadId(), idActive, FALSE ); + } else { + // try it anyhow + SetForegroundWindow( wid ); + SetFocus( wid ); + FlashWindow( wid, TRUE ); + } + } +#endif +} int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setApplicationName("snore-send"); - app.setOrganizationName("snore-send"); + app.setOrganizationName("Snorenotify"); app.setApplicationVersion(Snore::Version::version()); QCommandLineParser parser; @@ -41,6 +95,11 @@ int main(int argc, char *argv[]) QCommandLineOption silent(QStringList() << "silent", "Don't print to stdout."); parser.addOption(silent); + QCommandLineOption _bringToFront(QStringList() << "bring-to-front", "Bring process with pid to front if notification is clicked.", "pid"); + parser.addOption(_bringToFront); + + + parser.process(app); if (parser.isSet(title) && parser.isSet(message)) { SnoreCore &core = SnoreCore::instance(); @@ -63,7 +122,10 @@ int main(int argc, char *argv[]) if (!parser.isSet(silent)) { QString reason; QDebug(&reason) << noti.closeReason(); - std::cout << qPrintable(reason) << std::endl; + cout << qPrintable(reason) << endl; + } + if(noti.closeReason() == Notification::CLOSED && parser.isSet(_bringToFront)) { + bringToFront(parser.value(_bringToFront), noti); } returnCode = noti.closeReason(); });