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 Name |
+ Description |
+
+
+ | Microsoft.PowerToys.LightSwitch_EnableLightSwitch |
+ Triggered when Light Switch is enabled or disabled. |
+
+
+ | Microsoft.PowerToys.LightSwitch_ShortcutInvoked |
+ Occurs when the shortcut for Light Switch is invoked. |
+
+
+ | Microsoft.PowerToys.LightSwitch_ScheduleModeToggled |
+ Occurs when a new schedule mode is selected for Light Switch. |
+
+
+ | Microsoft.PowerToys.LightSwitch_ThemeTargetChanged |
+ Occurs 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;
+ };
+};