Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FancyZones] Set correct corner preference when snapping windows on Windows 11 #16542

Merged

Conversation

hallatore
Copy link
Contributor

@hallatore hallatore commented Feb 23, 2022

Summary of the Pull Request

What is this about:
When snapping a window on Windows 11 the app retains the rounded corners. This does not happen when using native Windows 11 snap.

What is included in the PR:
Working example where apps get square borders when snapped and rounded when un-snapped.

How does someone test / validate:

  • Run Powertoys on Windows 11
  • Open Notepad (notice rounded corners)
  • Snap Notepad to a zone
  • Notepad should now have square corners
  • Unsnap Notepad
  • Notepad should now have rounded corners again

Quality Checklist

@hallatore
Copy link
Contributor Author

Hi @SeraphimaZ

I took a swing at seeing if I could recreate the corner preference behavior native snap has on Windows 11.
The code works! 🎉 But it's probably not up to standards and I might have missed better places to put it.

Feel free to alter this PR or use it as inspiration. I'm not a C++ developer, so my skills here are fairly limited 😅

@Aaron-Junker
Copy link
Collaborator

Aaron-Junker commented Feb 23, 2022

@hallatore I added the in progress labels to the issues.

# Conflicts:
#	src/modules/fancyzones/FancyZonesLib/util.cpp

// Set window corner preference on Windows 11 to "Do not round"
auto preference = 1;
DwmSetWindowAttribute(window, 33, &preference, sizeof(preference));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please change magic number 33 to the enum value?

Comment on lines 22 to 36
// Placeholder enums since dwmapi.h doesn't have these until SDK 22000.
// Note: Remove once SDK targets 22000 or above.
enum DWMWINDOWATTRIBUTE_CUSTOM
{
DWMWA_WINDOW_CORNER_PREFERENCE = 33
};

enum DWM_WINDOW_CORNER_PREFERENCE
{
DWMWCP_DEFAULT = 0,
DWMWCP_DONOTROUND = 1,
DWMWCP_ROUND = 2,
DWMWCP_ROUNDSMALL = 3
};

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added these @SeraphimaZ. Not sure how to best do this since they are not available in the current sdk.

@github-actions
Copy link

github-actions bot commented Feb 28, 2022

@check-spelling-bot Report

🔴 Please review

See the files view or the action log for details.

Unrecognized words (4)

DONOTROUND
DWMWCP
DWMWINDOWATTRIBUTE
ROUNDSMALL

Previously acknowledged words that are now absent abap abcd abcdefgh appcontainer atop autogenerates AZCLI azurecr binskim bios Bools btm buildcommand buildtools cameligo CCB cdpxwin cdxml CEBB CFFDAFADA ChaseKnowlden cjs CleanCodeDeveloper cljs CPPARM CPPx crutkas csx CTLCOLORSTATIC defaultcommand Deuchert dupenv DUSTIN efgh errc errorlevel estdir etcore Firefox FIXME fsscript Gamebar graphql Grayscale gsuberland hmon iccex ICONINFORMATION IMonitor INITCOMMONCONTROLSEX INSTALLLOGATTRIBUTES INSTALLLOGMODE INSTALLUILEVEL Javascript julia Knowlden kotlin ktm kts LASTEXITCODE LEQ ligo linkid litcoffee MAINICON MAKELPARAM Minimizeallwindows mkdir moderncop modulekey msiexec MSIINSTALLER MSIL namings NATIVEFNTCTL neq netlify nocache php phps plx policheck popd powerquery psc psm Pui pushd pyc pyd pyi pyo pyz Qin rda rdata rdeveen rds reportbug rexit robocopy scm SETRANGE SETSTEP SHAREIMAGELISTS sizeg smallbasic spamming spdth sregex STEPIT stx svh SWITCHEND symlink symlinks systemverilog taskkill tbc tcl timezone tlbimp trackpad typeparamref UITo umd uninit unittest UWPUI vbhtml verilog vse vsix WDK wdksetup wdkvsix We'd webclient webpack wifstream WINMSAPP WTL
To accept these unrecognized words as correct (and remove the previously acknowledged and now absent words), run the following commands

... in a clone of the git@github.com:hallatore/PowerToys.git repository
on the dev/hallatore/remove_corners_on_snap branch:

update_files() {
perl -e '
my @expect_files=qw('".github/actions/spell-check/expect.txt"');
@ARGV=@expect_files;
my @stale=qw('"$patch_remove"');
my $re=join "|", @stale;
my $suffix=".".time();
my $previous="";
sub maybe_unlink { unlink($_[0]) if $_[0]; }
while (<>) {
if ($ARGV ne $old_argv) { maybe_unlink($previous); $previous="$ARGV$suffix"; rename($ARGV, $previous); open(ARGV_OUT, ">$ARGV"); select(ARGV_OUT); $old_argv = $ARGV; }
next if /^(?:$re)(?:(?:\r|\n)*$| .*)/; print;
}; maybe_unlink($previous);'
perl -e '
my $new_expect_file=".github/actions/spell-check/expect.txt";
use File::Path qw(make_path);
use File::Basename qw(dirname);
make_path (dirname($new_expect_file));
open FILE, q{<}, $new_expect_file; chomp(my @words = <FILE>); close FILE;
my @add=qw('"$patch_add"');
my %items; @items{@words} = @words x (1); @items{@add} = @add x (1);
@words = sort {lc($a)."-".$a cmp lc($b)."-".$b} keys %items;
open FILE, q{>}, $new_expect_file; for my $word (@words) { print FILE "$word\n" if $word =~ /\w/; };
close FILE;
system("git", "add", $new_expect_file);
'
}

comment_json=$(mktemp)
curl -L -s -S \
-H "Content-Type: application/json" \
"https://api.github.com/repos/microsoft/PowerToys/issues/comments/1054044478" > "$comment_json"
comment_body=$(mktemp)
jq -r ".body // empty" "$comment_json" > $comment_body
rm $comment_json

patch_remove=$(perl -ne 'next unless s{^</summary>(.*)</details>$}{$1}; print' < "$comment_body")

patch_add=$(perl -e '$/=undef; $_=<>; if (m{Unrecognized words[^<]*</summary>\n*```\n*([^<]*)```\n*</details>$}m) { print "$1" } elsif (m{Unrecognized words[^<]*\n\n((?:\w.*\n)+)\n}m) { print "$1" };' < "$comment_body")

update_files
rm $comment_body
git add -u
If the flagged items do not appear to be text

If items relate to a ...

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

  • binary file.

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

@crutkas
Copy link
Member

crutkas commented Mar 2, 2022

Minus spelling adjustments, is there anything else missing here?

@hallatore
Copy link
Contributor Author

I'm unsure if a windows version check is needed. DwmSetWindowAttribute seems to do nothing if it hits a attribute it doesn't recognize? The changes should have no effect on a Windows 10 PC.

Are we fine with these custom enums for now? I guess the alternative is to update the SDK for the whole project?

Anything else missing?

Copy link
Collaborator

@SeraphimaZykova SeraphimaZykova left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested both on Windows10 and Windows11, it does nothing on 10 and works perfectly on 11.
Great work @hallatore and thank you!
One last favor for this PR, please change Note: to TODO: in the comment to make it easier to find it later. After that it's good to go :)

@hallatore hallatore changed the title [WIP][FancyZones] Set correct corner preference when snapping windows on Windows 11 [FancyZones] Set correct corner preference when snapping windows on Windows 11 Mar 4, 2022
@hallatore
Copy link
Contributor Author

@SeraphimaZ Done! :)

@hallatore
Copy link
Contributor Author

Ready for merge 🥳🎉

@Aaron-Junker
Copy link
Collaborator

Ready for merge 🥳🎉

We'll wait with merging until the hotfix is out (probably next monday). Thank you for this awesome PR

@jaimecbernardo
Copy link
Collaborator

Thanks a lot for the contribution!

@jaimecbernardo jaimecbernardo merged commit b20e991 into microsoft:main Mar 7, 2022
@hallatore hallatore deleted the dev/hallatore/remove_corners_on_snap branch March 7, 2022 20:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants