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

[v3] Add option for showing the toolbar in fullscreen mode on macOS #3282

Merged

Conversation

fbbdev
Copy link

@fbbdev fbbdev commented Feb 28, 2024

Description

When the MacTitleBar.UseToolbar option is enabled, the system toolbar is shown on macOS windows. Currently, when the windows are switched to fullscreen mode, the toolbar remains visible.

Although this might be desirable sometimes, in most common cases it is not the expected behaviour, as the full-screen toolbar cannot be made transparent and therefore clashes with the look of the application.

This patch introduces a new option in the MacTitleBar struct that when enabled hides the toolbar automatically upon entering fullscreen mode. It also enables the option by default in the predefined titlebar styles.

Type of change

  • New feature (non-breaking change which adds functionality)
  • This change requires a documentation update

How Has This Been Tested?

The new hide-macos-toolbar example creates two windows shocasing the two possible configurations of the new flag.

  • Windows
  • macOS
  • Linux

Test Configuration

Go Version     | go1.22.0                                                                      
Revision       | 12d12a33dec1d31f487b70f87bc31e80252f327c                                      
Modified       | true                                                                          
-buildmode     | exe                                                                           
-compiler      | gc                                                                            
CGO_CFLAGS     |                                                                               
CGO_CPPFLAGS   |                                                                               
CGO_CXXFLAGS   |                                                                               
CGO_ENABLED    | 1                                                                             
CGO_LDFLAGS    |                                                                               
DefaultGODEBUG | httplaxcontentlength=1,httpmuxgo121=1,tls10server=1,tlsrsakex=1,tlsunsafeekm=1
GOAMD64        | v1                                                                            
GOARCH         | amd64                                                                         
GOOS           | darwin                                                                        
vcs            | git                                                                           
vcs.modified   | true                                                                          
vcs.revision   | 12d12a33dec1d31f487b70f87bc31e80252f327c                                      
vcs.time       | 2024-02-21T12:40:32Z                                                          

# System
Name            | MacOS                                   
Version         | 12.6.6                                  
ID              | 21G646                                  
Branding        | Monterey                                
Platform        | darwin                                  
Architecture    | amd64                                   
Apple Silicon   | unknown                                 
CPU             | Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Xcode cli tools | 2395                                    
CPU             | Unknown                                 
GPU             | Unknown                                 
Memory          | Unknown                                 

# Diagnosis
 SUCCESS  Your system is ready for Wails development!

Checklist:

  • I have updated mkdocs-website/docs/en/changelog.md with details of this PR
  • My code follows the general coding style of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes

Copy link
Contributor

coderabbitai bot commented Feb 28, 2024

Important

Auto Review Skipped

Auto reviews are disabled on base/target branches other than the default branch. Please add the base/target branch pattern to the list of additional branches to be reviewed in the settings.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository.

To trigger a single review, invoke the @coderabbitai review command.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share

Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit-tests for this file.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit tests for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository from git and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit tests.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • The JSON schema for the configuration file is available here.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/coderabbit-overrides.v2.json

CodeRabbit Discord Community

Join our Discord Community to get help, request features, and share feedback.

if ( toolbar == nil ) {
return;
}
[window setToolbarStyle:style];
Copy link
Author

Choose a reason for hiding this comment

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

The windowSetToolbarStyle had previously a wrong implementation and was unused. I changed it to the correct implementation and used it to replace the code that was previously at lines 452–457.

@@ -443,30 +443,28 @@ void windowSetHideTitle(void* nsWindow, bool hideTitle) {
}

// Set Window use toolbar
void windowSetUseToolbar(void* nsWindow, bool useToolbar, int toolbarStyle) {
void windowSetUseToolbar(void* nsWindow, bool useToolbar) {
Copy link
Author

Choose a reason for hiding this comment

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

The signature of this method has changed because the style configuration is now done through the windowSetToolbarStyle method, as per the comment at line 467.

@@ -1146,11 +1153,12 @@ func (w *macosWebviewWindow) run() {
C.windowSetHideTitleBar(w.nsWindow, C.bool(titleBarOptions.Hide))
C.windowSetHideTitle(w.nsWindow, C.bool(titleBarOptions.HideTitle))
C.windowSetFullSizeContent(w.nsWindow, C.bool(titleBarOptions.FullSizeContent))
if titleBarOptions.UseToolbar {
Copy link
Author

Choose a reason for hiding this comment

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

This check has been removed as the involved methods work correctly in any case.

@@ -241,6 +241,9 @@ - (void)webView:(nonnull WKWebView *)webView stopURLSchemeTask:(nonnull id<WKURL
}
}
}
- (NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions {
Copy link
Author

Choose a reason for hiding this comment

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

The main change is here: a new property on the delegate interface is used as a flag to either keep the default presentation options, or enable the NSApplicationPresentationAutoHideToolbar option, thus hiding the toolbar.

@leaanthony
Copy link
Member

Thanks for spending time on this and making such a comprehensive PR 🙏 As we currently have no API for adding anything to the toolbar, I'm wondering if this should be default behaviour? If later on, we have APIs to add elements to the toolbar, we could reintroduce this flag, but maybe invert it: ShowToolbarWhenFullscreen? Thoughts?

@fbbdev
Copy link
Author

fbbdev commented Feb 28, 2024

Thank you for taking the time to review the PR!

As regards flipping the flag, I too had thought about it afterwards and completely second the proposal. This way, the original behaviour from v2 becomes the default and the change is completely transparent to the average consumer.

As regards removing the flag altogether, it makes no difference to me as I don't actually need it. However, I'd like to argue briefly in favour of keeping it:

  1. I feel like the general direction of v3 has been to give the developer greater control upon the appearance of the application, and this change would be in line with that trend;
  2. it is essentially zero-cost and transparent, especially in the Show* form;
  3. now that native window handles are available, someone might put them to use by filling the toolbar; after all, the option is called UseToolbar, not InsetTitleBar 😉
  4. and finally, that setting cannot be easily altered from outside through the native API, as it requires changing some logic in the window delegate, thus leaving no other option apart from fragile workarounds.

Let me know what you think about it, and afterwards I can edit the patch.

@leaanthony
Copy link
Member

You make some great points above and on the whole, I agree. Simply changing the Hide to Show might be enough for this PR. If you wanted to take it one step further, how about a method to set the value on the Window interface to allow setting it at runtime? This would also require a change to allow JS to call it. You really don't have to and nobody has asked for it (yet) so I'll leave that with you.

@fbbdev
Copy link
Author

fbbdev commented Mar 2, 2024

Ok, thanks! I am gonna edit the PR.

As regards adding the method, no other title bar parameter is reconfigurable atm, so it feels strange to have a method just for this one option. I won't go for it right now. As I read your message I thought I'd whip up a further PR for titlebar reconfiguration in general, but I keep getting second thoughts about it, as I just can't see the use case...

Should someone ask for it, it should take very little time anyways.

@fbbdev
Copy link
Author

fbbdev commented Mar 2, 2024

Please note that I am gonna force-push here to keep things clean

@fbbdev fbbdev force-pushed the feature/hide_fullscreen_toolbar branch from e33bd91 to 8679461 Compare March 2, 2024 08:44
@fbbdev fbbdev changed the title [v3] Add option for hiding the toolbar in fullscreen mode on macOS [v3] Add option for showing the toolbar in fullscreen mode on macOS Mar 2, 2024
@leaanthony leaanthony merged commit 7e68775 into wailsapp:v3-alpha Mar 2, 2024
4 checks passed
@leaanthony
Copy link
Member

Great stuff! Thanks so much 👍

@fbbdev
Copy link
Author

fbbdev commented Mar 2, 2024

Thank you!!

@fbbdev fbbdev deleted the feature/hide_fullscreen_toolbar branch March 2, 2024 17:52
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.

2 participants