diff --git a/src/modules/launcher/Wox.Launcher/Wox.Launcher.rc b/src/modules/launcher/Wox.Launcher/Wox.Launcher.rc new file mode 100644 index 0000000000..c85d6bb9ab Binary files /dev/null and b/src/modules/launcher/Wox.Launcher/Wox.Launcher.rc differ diff --git a/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj new file mode 100644 index 0000000000..b1761cf44c --- /dev/null +++ b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {e364f67b-bb12-4e91-b639-355866ebcd8b} + Win32Proj + Wox_Launcher + 10.0 + ModuleTemplate + + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + + + + Use + Level3 + Disabled + true + _DEBUG;EXAMPLEPOWERTOY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + ..\..\common\inc;..\..\common\Telemetry;..\;..\..\;..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories) + MultiThreadedDebug + stdcpplatest + + + Windows + true + $(OutDir)$(TargetName)$(TargetExt) + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;EXAMPLEPOWERTOY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + ..\..\common\inc;..\..\common\Telemetry;..\;..\..\;..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories) + MultiThreaded + stdcpplatest + + + Windows + true + true + true + $(OutDir)$(TargetName)$(TargetExt) + + + + + + + + + + + Create + Create + pch.h + pch.h + + + + + + {74485049-c722-400f-abe5-86ac52d929b3} + + + + + + + + + \ No newline at end of file diff --git a/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj.filters b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj.filters new file mode 100644 index 0000000000..7ab77b0458 --- /dev/null +++ b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj.filters @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/launcher/Wox.Launcher/dllmain.cpp b/src/modules/launcher/Wox.Launcher/dllmain.cpp new file mode 100644 index 0000000000..496a0a4562 --- /dev/null +++ b/src/modules/launcher/Wox.Launcher/dllmain.cpp @@ -0,0 +1,324 @@ +#include "pch.h" +#include +#include +#include +#include +#include "trace.h" + +extern "C" IMAGE_DOS_HEADER __ImageBase; + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { + switch (ul_reason_for_call) { + case DLL_PROCESS_ATTACH: + Trace::RegisterProvider(); + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + Trace::UnregisterProvider(); + break; + } + return TRUE; +} + +// The PowerToy name that will be shown in the settings. +const static wchar_t* MODULE_NAME = L"Wox.Launcher"; +// Add a description that will we shown in the module settings page. +const static wchar_t* MODULE_DESC = L""; + +// These are the properties shown in the Settings page. +struct ModuleSettings { + // Add the PowerToy module properties with default values. + // Currently available types: + // - int + // - bool + // - string + + //bool bool_prop = true; + //int int_prop = 10; + //std::wstring string_prop = L"The quick brown fox jumps over the lazy dog"; + //std::wstring color_prop = L"#1212FF"; + +} g_settings; + +// Implement the PowerToy Module Interface and all the required methods. +class Wox_Launcher : public PowertoyModuleIface { +private: + // The PowerToy state. + bool m_enabled = false; + + // Load initial settings from the persisted values. + void init_settings(); + +public: + // Constructor + Wox_Launcher() { + init_settings(); + }; + + // Destroy the powertoy and free memory + virtual void destroy() override { + delete this; + } + + // Return the display name of the powertoy, this will be cached by the runner + virtual const wchar_t* get_name() override { + return MODULE_NAME; + } + + // Return array of the names of all events that this powertoy listens for, with + // nullptr as the last element of the array. Nullptr can also be retured for empty + // list. + virtual const wchar_t** get_events() override { + static const wchar_t* events[] = { nullptr }; + // Available events: + // - ll_keyboard + // - win_hook_event + // + // static const wchar_t* events[] = { ll_keyboard, + // win_hook_event, + // nullptr }; + + return events; + } + + // Return JSON with the configuration options. + virtual bool get_config(wchar_t* buffer, int* buffer_size) override { + HINSTANCE hinstance = reinterpret_cast(&__ImageBase); + + // Create a Settings object. + PowerToysSettings::Settings settings(hinstance, get_name()); + settings.set_description(MODULE_DESC); + + // Show an overview link in the Settings page + //settings.set_overview_link(L"https://"); + + // Show a video link in the Settings page. + //settings.set_video_link(L"https://"); + + // A bool property with a toggle editor. + /*settings.add_bool_toogle( + L"bool_toggle_1", // property name. + L"This is what a BoolToggle property looks like", // description or resource id of the localized string. + g_settings.bool_prop // property value. + );*/ + + // An integer property with a spinner editor. + /*settings.add_int_spinner( + L"int_spinner_1", // property name + L"This is what a IntSpinner property looks like", // description or resource id of the localized string. + g_settings.int_prop, // property value. + 0, // min value. + 100, // max value. + 10 // incremental step. + );*/ + + // A string property with a textbox editor. + /*settings.add_string( + L"string_text_1", // property name. + L"This is what a String property looks like", // description or resource id of the localized string. + g_settings.string_prop // property value. + );*/ + + // A string property with a color picker editor. + /*settings.add_color_picker( + L"color_picker_1", // property name. + L"This is what a ColorPicker property looks like", // description or resource id of the localized string. + g_settings.color_prop // property value. + );*/ + + // A custom action property. When using this settings type, the "PowertoyModuleIface::call_custom_action()" + // method should be overriden as well. + /*settings.add_custom_action( + L"custom_action_id", // action name. + L"This is what a CustomAction property looks like", // label above the field. + L"Call a custom action", // button text. + L"Press the button to call a custom action." // display values / extended info. + );*/ + + return settings.serialize_to_buffer(buffer, buffer_size); + } + + // Signal from the Settings editor to call a custom action. + // This can be used to spawn more complex editors. + virtual void call_custom_action(const wchar_t* action) override { + static UINT custom_action_num_calls = 0; + try { + // Parse the action values, including name. + PowerToysSettings::CustomActionObject action_object = + PowerToysSettings::CustomActionObject::from_json_string(action); + + /* + if (action_object.get_name() == L"custom_action_id") { + // Execute your custom action + } + */ + } + catch (std::exception ex) { + // Improper JSON. + } + } + + // Called by the runner to pass the updated settings values as a serialized JSON. + virtual void set_config(const wchar_t* config) override { + try { + // Parse the input JSON string. + PowerToysSettings::PowerToyValues values = + PowerToysSettings::PowerToyValues::from_json_string(config); + + // Update a bool property. + /* + if (values.is_bool_value(L"bool_toggle_1")) { + g_settings.bool_prop = values.get_bool_value(L"bool_toggle_1"); + } + */ + + // Update an int property. + /* + if (values.is_int_value(L"int_spinner_1")) { + g_settings.int_prop = values.get_int_value(L"int_spinner_1"); + } + */ + + // Update a string property. + /* + if (values.is_string_value(L"string_text_1")) { + g_settings.string_prop = values.get_string_value(L"string_text_1"); + } + */ + + // Update a color property. + /* + if (values.is_string_value(L"color_picker_1")) { + g_settings.color_prop = values.get_string_value(L"color_picker_1"); + } + */ + + // If you don't need to do any custom processing of the settings, proceed + // to persists the values calling: + values.save_to_settings_file(); + // Otherwise call a custom function to process the settings before saving them to disk: + // save_settings(); + } + catch (std::exception ex) { + // Improper JSON. + } + } + + // Enable the powertoy + virtual void enable() { + m_enabled = true; + } + + // Disable the powertoy + virtual void disable() { + m_enabled = false; + } + + // Returns if the powertoys is enabled + virtual bool is_enabled() override { + return m_enabled; + } + + // Handle incoming event, data is event-specific + virtual intptr_t signal_event(const wchar_t* name, intptr_t data) override { + if (wcscmp(name, ll_keyboard) == 0) { + auto& event = *(reinterpret_cast(data)); + // Return 1 if the keypress is to be suppressed (not forwarded to Windows), + // otherwise return 0. + return 0; + } + else if (wcscmp(name, win_hook_event) == 0) { + auto& event = *(reinterpret_cast(data)); + // Return value is ignored + return 0; + } + return 0; + } +}; + +// Load the settings file. +void Wox_Launcher::init_settings() { + try { + // Load and parse the settings file for this PowerToy. + PowerToysSettings::PowerToyValues settings = + PowerToysSettings::PowerToyValues::load_from_settings_file(get_name()); + + // Load a bool property. + /* + if (settings.is_bool_value(L"bool_toggle_1")) { + g_settings.bool_prop = settings.get_bool_value(L"bool_toggle_1"); + } + */ + + // Load an int property. + /* + if (settings.is_int_value(L"int_spinner_1")) { + g_settings.int_prop = settings.get_int_value(L"int_spinner_1"); + } + */ + + // Load a string property. + /* + if (settings.is_string_value(L"string_text_1")) { + g_settings.string_prop = settings.get_string_value(L"string_text_1"); + } + */ + + // Load a color property. + /* + if (settings.is_string_value(L"color_picker_1")) { + g_settings.color_prop = settings.get_string_value(L"color_picker_1"); + } + */ + } + catch (std::exception ex) { + // Error while loading from the settings file. Let default values stay as they are. + } +} + +// This method of saving the module settings is only required if you need to do any +// custom processing of the settings before saving them to disk. +/* +void Wox.Launcher::save_settings() { + try { + // Create a PowerToyValues object for this PowerToy + PowerToysSettings::PowerToyValues values(get_name()); + + // Save a bool property. + //values.add_property( + // L"bool_toggle_1", // property name + // g_settings.bool_prop // property value + //); + + // Save an int property. + //values.add_property( + // L"int_spinner_1", // property name + // g_settings.int_prop // property value + //); + + // Save a string property. + //values.add_property( + // L"string_text_1", // property name + // g_settings.string_prop // property value + ); + + // Save a color property. + //values.add_property( + // L"color_picker_1", // property name + // g_settings.color_prop // property value + //); + + // Save the PowerToyValues JSON to the power toy settings file. + values.save_to_settings_file(); + } + catch (std::exception ex) { + // Couldn't save the settings. + } +} +*/ + +extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create() { + return new Wox_Launcher(); +} diff --git a/src/modules/launcher/Wox.Launcher/pch.cpp b/src/modules/launcher/Wox.Launcher/pch.cpp new file mode 100644 index 0000000000..a83d3bb2cc --- /dev/null +++ b/src/modules/launcher/Wox.Launcher/pch.cpp @@ -0,0 +1,2 @@ +#include "pch.h" +#pragma comment(lib, "windowsapp") \ No newline at end of file diff --git a/src/modules/launcher/Wox.Launcher/pch.h b/src/modules/launcher/Wox.Launcher/pch.h new file mode 100644 index 0000000000..769a37b377 --- /dev/null +++ b/src/modules/launcher/Wox.Launcher/pch.h @@ -0,0 +1,5 @@ +#pragma once +#define WIN32_LEAN_AND_MEAN +#include +#include +#include \ No newline at end of file diff --git a/src/modules/launcher/Wox.Launcher/resource.h b/src/modules/launcher/Wox.Launcher/resource.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/modules/launcher/Wox.Launcher/trace.cpp b/src/modules/launcher/Wox.Launcher/trace.cpp new file mode 100644 index 0000000000..94ae6d8fd9 --- /dev/null +++ b/src/modules/launcher/Wox.Launcher/trace.cpp @@ -0,0 +1,26 @@ +#include "pch.h" +#include "trace.h" + +TRACELOGGING_DEFINE_PROVIDER( + g_hProvider, + "Microsoft.PowerToys", + // {38e8889b-9731-53f5-e901-e8a7c1753074} + (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74), + TraceLoggingOptionProjectTelemetry()); + +void Trace::RegisterProvider() { + TraceLoggingRegister(g_hProvider); +} + +void Trace::UnregisterProvider() { + TraceLoggingUnregister(g_hProvider); +} + +void Trace::MyEvent() { + TraceLoggingWrite( + g_hProvider, + "PowerToyName::Event::MyEvent", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} diff --git a/src/modules/launcher/Wox.Launcher/trace.h b/src/modules/launcher/Wox.Launcher/trace.h new file mode 100644 index 0000000000..92cef7fc80 --- /dev/null +++ b/src/modules/launcher/Wox.Launcher/trace.h @@ -0,0 +1,8 @@ +#pragma once + +class Trace { +public: + static void RegisterProvider(); + static void UnregisterProvider(); + static void MyEvent(); +};