PowerToys/doc/devdocs
Clint Rutkas 02c08c942d
0.15 update to readme to master (#1408)
* Getting ready for v0.15 update for readme.

* getting ready for 0.15

* spelling tweak

* filled in update section

* fixed spelling mistakes

* updating to what POR is

* Update README.md

* Update README.md

* adding back in MSI

* getting readme ready for 0.15

* tweaks

* adding oss to oss links

* fixing links

* tweaking file names

* Update README.md

* Update README.md

* Update README.md

fixing typo

* Update README.md
2020-03-03 11:14:30 -08:00
..
modules Docs tweaks (#960) 2019-12-17 17:02:45 +01:00
common.md MSIX: implement initial version of notifications library (#1178) 2020-02-04 19:41:00 +03:00
readme.md 0.15 update to readme to master (#1408) 2020-03-03 11:14:30 -08:00
runner.md Devdocs reorganisation (#913) 2019-12-12 12:25:19 +03:00
settings-reference.md Imrpove the settings doc (#958) 2019-12-17 15:18:27 +01:00
settings-web.md Update settings-web.md 2019-12-27 11:12:43 -08:00
settings.md Docs tweaks (#960) 2019-12-17 17:02:45 +01:00
shared-hooks.md Devdocs reorganisation (#913) 2019-12-12 12:25:19 +03:00
style.md Devdocs reorganisation (#913) 2019-12-12 12:25:19 +03:00

Dev Documentation

Rules

  • Follow the pattern of what you already see in the code.
  • Coding style.
  • Try to package new ideas/components into libraries that have nicely defined interfaces.
  • Package new ideas into classes or refactor existing ideas into a class as you extend.
  • When adding new classes/methos/changing existing code: add new unit tests or update the existing tests.

Github Workflow

  • Follow the PR template, in particular make sure there is open issue for the new PR.
  • When the PR is approved, let the owner of the PR merge it.
  • Use the Squash and merge option to merge a PR, if you don't want to squash it because there are logically different commits, use Rebase and merge.
  • We don't close issues automatically when referenced in a PR, so after the OR is merged:
    • mark the issue(s) fixed by the PR with the resolved label.
    • don't close the issue if it's a bug in the current release since users tend to not search for closed issues, we will close the resolved issues when a new released is published.

Repository Overview

General project organization:

The doc folder

Documentation for the project.

The Wiki

The Wiki contains the current specs for the project.

The installer folder

Contains the source code of the PowerToys installer.

The src folder

Contains the source code of the PowerToys runner and of all of the PowerToys modules. This is where the most of the magic happens.

The tools folder

Various tools used by PowerToys. Includes the Visual Studio 2019 project template for new PowerToys.

Building code

Build Prerequisites

  • Windows 10 1803 (build 10.0.17134.0) or above to build and run PowerToys.
  • Visual Studio 2019 Community edition or higher, with the 'Desktop Development with C++' component and the Windows 10 SDK version 10.0.18362.0 or higher.

Building the Code

  • Open powertoys.sln in Visual Studio, in the Solutions Configuration drop-down menu select Release or Debug, from the Build menu choose Build Solution.
  • The PowerToys binaries will be in your repo under x64\Release.
  • If you want to copy the PowerToys.exe binary to a different location, you'll also need to copy the modules and the svgs folders.

Building the .msi Installer

  • From the installer folder open PowerToysSetup.sln in Visual Studio, in the Solutions Configuration drop-down menu select Release or Debug, from the Build menu choose Build Solution.
  • The resulting PowerToysSetup.msi installer will be available in the installer\PowerToysSetup\x64\Release\ folder.

Prerequisites to Build the MSI Installer

Building the MSIX Installer

Please follow the installer instructions which include items such as creating the self-signed cert for testing.

Debugging

The following configuration issue only applies if the user is a member of the Administrators group.

Some PowerToys modules require being run with the highest permission level if the current user is a member of the Administrators group. The highest permission level is required to be able to perform some actions when an elevated application (e.g. Task Manager) is in the foreground or is the target of an action. Without elevated privileges some PowerToys modules will still work but with some limitations:

  • the FancyZones module will be not be able to move an elevated window to a zone.
  • the Shortcut Guide module will not appear if the foreground window belongs to an elevated application.

To run and debug PowerToys from Visual Studio when the user is a member of the Administrators group, Visual Studio has to be started with elevated privileges. If you want to avoid running Visual Studio with elevated privileges and don't mind the limitations described above, you can do the following: open the runner project properties and navigate to the Linker -> Manifest File settings, edit the UAC Execution Level property and change it from highestAvailable (level='highestAvailable') to asInvoker (/level='asInvoker'), save the changes.

How to create new PowerToys

See the instructions on how to install the PowerToys Module project template.
Specifications for the PowerToys settings API.

Implementation details

Runner

The PowerToys Runner contains the project for the PowerToys.exe executable. It's responsible for:

  • Loading the individual PowerToys modules.
  • Passing registered events to the PowerToys.
  • Showing a system tray icon to manage the PowerToys.
  • Bridging between the PowerToys modules and the Settings editor.

Image of the tray icon

Interface

Definition of the interface used by the runner to manage the PowerToys. All PowerToys must implement this interface.

Common

The common lib, as the name suggests, contains code shared by multiple PowerToys components and modules, e.g. json parsing and IPC primitives.

Settings

WebView project for editing the PowerToys settings.

The html portion of the project that is shown in the WebView is contained in settings-html. Instructions on how build a new version and update this project are in the Web project for the Settings UI.

While developing, it's possible to connect the WebView to the development server running in localhost by setting the _DEBUG_WITH_LOCALHOST flag to 1 and following the instructions near it in ./main.cpp.

Settings-web

This project generates the web UI shown in the PowerToys Settings. It's a ReactJS project created using UI Fabric.

Current modules

FancyZones

The FancyZones PowerToy that allows users to create custom zones on the screen, to which the windows will snap when moved.

PowerRename

PowerRename is a Windows Shell Context Menu Extension for advanced bulk renaming using simple search and replace or more powerful regular expression matching.

Shortcut Guide

The Windows Shortcut Guide, displayed when the WinKey is held for some time.

obsolete example_powertoy

An example PowerToy, that demonstrates how to create new ones. Please note, that this is going to become a Visual Studio project template soon.

This PowerToy serves as a sample to show how to implement the PowerToys interface when creating a PowerToy. It also showcases the currently implemented settings.

Options

This module has a setting to serve as an example for each of the currently implemented settings property:

  • BoolToggle property
  • IntSpinner property
  • String property
  • ColorPicker property
  • CustomAction property

Image of the Options