diff --git a/DATA_AND_PRIVACY.md b/DATA_AND_PRIVACY.md index 66a0daa1d8..07089e44c3 100644 --- a/DATA_AND_PRIVACY.md +++ b/DATA_AND_PRIVACY.md @@ -694,6 +694,30 @@ _If you want to find diagnostic data events in the source code, these two links +### Light Switch + + + + + + + + + + + + + + + + + + + + + +
Event NameDescription
Microsoft.PowerToys.LightSwitch_EnableLightSwitchTriggered when Light Switch is enabled or disabled.
Microsoft.PowerToys.LightSwitch_ShortcutInvokedOccurs when the shortcut for Light Switch is invoked.
Microsoft.PowerToys.LightSwitch_ScheduleModeToggledOccurs when a new schedule mode is selected for Light Switch.
Microsoft.PowerToys.LightSwitch_ThemeTargetChangedOccurs when the options for targeting the system or apps is updated.
+ ### Mouse Highlighter diff --git a/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp b/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp index 11cfd412b0..bab4e30797 100644 --- a/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp +++ b/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp @@ -405,6 +405,7 @@ public: { m_enabled = true; Logger::info(L"Enabling Light Switch module..."); + Trace::Enable(true); unsigned long powertoys_pid = GetCurrentProcessId(); std::wstring args = L"--pid " + std::to_wstring(powertoys_pid); @@ -482,7 +483,8 @@ public: CloseHandle(m_process); m_process = nullptr; } - + + Trace::Enable(false); StopToggleListener(); } @@ -539,6 +541,8 @@ public: if (m_enabled) { Logger::trace(L"Light Switch hotkey pressed"); + Trace::ShortcutInvoked(); + if (!is_process_running()) { enable(); diff --git a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp index 57fa1921f7..40fc67e679 100644 --- a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp +++ b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp @@ -19,12 +19,21 @@ void Trace::UnregisterProvider() TraceLoggingUnregister(g_hProvider); } -void Trace::MyEvent() +void Trace::Enable(bool enabled) noexcept { TraceLoggingWrite( g_hProvider, - "PowerToyName_MyEvent", + "LightSwitch_EnableLightSwitch", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), + TraceLoggingBoolean(enabled, "Enabled")); +} + +void Trace::ShortcutInvoked() noexcept +{ + TraceLoggingWrite( + g_hProvider, + "LightSwitch_ShortcutInvoked", ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), - TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); } diff --git a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h index 55cdedb2ee..bfa32062b9 100644 --- a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h +++ b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h @@ -11,5 +11,6 @@ class Trace public: static void RegisterProvider(); static void UnregisterProvider(); - static void MyEvent(); + static void Enable(bool enabled) noexcept; + static void ShortcutInvoked() noexcept; }; diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp index b6684da54e..8919f4274b 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp @@ -14,6 +14,7 @@ #include "LightSwitchStateManager.h" #include #include +#include SERVICE_STATUS g_ServiceStatus = {}; SERVICE_STATUS_HANDLE g_StatusHandle = nullptr; @@ -357,6 +358,8 @@ DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) int APIENTRY wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) { + Trace::LightSwitch::RegisterProvider(); + if (powertoys_gpo::getConfiguredLightSwitchEnabledValue() == powertoys_gpo::gpo_rule_configured_disabled) { wchar_t msg[160]; @@ -364,12 +367,14 @@ int APIENTRY wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) msg, L"Tried to start with a GPO policy setting the utility to always be disabled. Please contact your systems administrator."); Logger::info(msg); + Trace::LightSwitch::UnregisterProvider(); return 0; } - int argc = 0; LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); int rc = _tmain(argc, argv); // reuse your existing logic LocalFree(argv); + + Trace::LightSwitch::UnregisterProvider(); return rc; } \ No newline at end of file diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj index e1c8052de6..b8e51ee489 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj @@ -80,6 +80,7 @@ + @@ -94,6 +95,7 @@ + diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters index 55c7bde39b..a704e87073 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters @@ -39,6 +39,9 @@ Source Files + + Source Files + @@ -68,6 +71,9 @@ Header Files + + Header Files + diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp index 5221a197fe..488142b95b 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp @@ -5,6 +5,7 @@ #include #include #include +#include using namespace std; @@ -151,6 +152,7 @@ void LightSwitchSettings::LoadSettings() if (m_settings.scheduleMode != newMode) { m_settings.scheduleMode = newMode; + Trace::LightSwitch::ScheduleModeToggled(val); NotifyObservers(SettingId::ScheduleMode); } } @@ -220,6 +222,8 @@ void LightSwitchSettings::LoadSettings() } } + bool themeTargetChanged = false; + // ChangeSystem if (const auto jsonVal = values.get_bool_value(L"changeSystem")) { @@ -227,6 +231,7 @@ void LightSwitchSettings::LoadSettings() if (m_settings.changeSystem != val) { m_settings.changeSystem = val; + themeTargetChanged = true; NotifyObservers(SettingId::ChangeSystem); } } @@ -238,9 +243,16 @@ void LightSwitchSettings::LoadSettings() if (m_settings.changeApps != val) { m_settings.changeApps = val; + themeTargetChanged = true; NotifyObservers(SettingId::ChangeApps); } } + + // For ChangeSystem/ChangeApps changes, log telemetry + if (themeTargetChanged) + { + Trace::LightSwitch::ThemeTargetChanged(m_settings.changeApps, m_settings.changeSystem); + } } catch (...) { diff --git a/src/modules/LightSwitch/LightSwitchService/trace.cpp b/src/modules/LightSwitch/LightSwitchService/trace.cpp new file mode 100644 index 0000000000..99afe7a95d --- /dev/null +++ b/src/modules/LightSwitch/LightSwitchService/trace.cpp @@ -0,0 +1,43 @@ +#include "pch.h" +#include "trace.h" + +// Telemetry strings should not be localized. +#define LoggingProviderKey "Microsoft.PowerToys" + +TRACELOGGING_DEFINE_PROVIDER( + g_hProvider, + LoggingProviderKey, + // {38e8889b-9731-53f5-e901-e8a7c1753074} + (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74), + TraceLoggingOptionProjectTelemetry()); + +void Trace::LightSwitch::RegisterProvider() +{ + TraceLoggingRegister(g_hProvider); +} + +void Trace::LightSwitch::UnregisterProvider() +{ + TraceLoggingUnregister(g_hProvider); +} + +void Trace::LightSwitch::ScheduleModeToggled(const std::wstring& newMode) noexcept +{ + TraceLoggingWriteWrapper( + g_hProvider, + "LightSwitch_ScheduleModeToggled", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), + TraceLoggingWideString(newMode.c_str(), "NewMode")); +} + +void Trace::LightSwitch::ThemeTargetChanged(bool changeApps, bool changeSystem) noexcept +{ + TraceLoggingWriteWrapper( + g_hProvider, + "LightSwitch_ThemeTargetChanged", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), + TraceLoggingBoolean(changeApps, "ChangeApps"), + TraceLoggingBoolean(changeSystem, "ChangeSystem")); +} \ No newline at end of file diff --git a/src/modules/LightSwitch/LightSwitchService/trace.h b/src/modules/LightSwitch/LightSwitchService/trace.h new file mode 100644 index 0000000000..a06177075b --- /dev/null +++ b/src/modules/LightSwitch/LightSwitchService/trace.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +class Trace +{ +public: + class LightSwitch : public telemetry::TraceBase + { + public: + static void RegisterProvider(); + static void UnregisterProvider(); + static void ScheduleModeToggled(const std::wstring& newMode) noexcept; + static void ThemeTargetChanged(bool changeApps, bool changeSystem) noexcept; + }; +};