From 42854634655cee9e6fc863ddcc13f8eeca1af05f Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 14 Jul 2021 10:34:09 -0700 Subject: [PATCH 1/7] Start implementing window.titleBarStyle for windows --- .../Configuration/Feature_Configuration.rei | 2 + .../Configuration/GlobalConfiguration.re | 29 ++++++++++ src/UI/Root.re | 2 +- src/bin_editor/Oni2_editor.re | 57 ++++++++++++------- 4 files changed, 70 insertions(+), 20 deletions(-) diff --git a/src/Feature/Configuration/Feature_Configuration.rei b/src/Feature/Configuration/Feature_Configuration.rei index 772918f92a..9b67e1f914 100644 --- a/src/Feature/Configuration/Feature_Configuration.rei +++ b/src/Feature/Configuration/Feature_Configuration.rei @@ -11,6 +11,8 @@ module ConfigurationLoader: { let none: t; let file: FpExp.t(FpExp.absolute) => t; + + let loadImmediate: t => result(Config.Settings.t, string); }; let initial: diff --git a/src/Feature/Configuration/GlobalConfiguration.re b/src/Feature/Configuration/GlobalConfiguration.re index 7b6355e577..6b7e172137 100644 --- a/src/Feature/Configuration/GlobalConfiguration.re +++ b/src/Feature/Configuration/GlobalConfiguration.re @@ -46,6 +46,15 @@ module Decoders = { ), ), ]); + + let titleBarStyle: decoder([ | `Native | `Custom ]) = string + |> map(String.lowercase_ascii) + |> map( + fun + | "native" => `Native + | "custom" => `Custom + | _ => `Custom + ); }; module Encoders = { @@ -57,6 +66,10 @@ module Encoders = { | `None => string("none") | `Inline => string("inline") }; + + let titleBarStyle: encoder([ | `Native | `Custom ]) = fun + | `Native => string("native") + | `Custom => string("custom"); }; module Codecs = { @@ -292,6 +305,21 @@ module Search = { let followSymlinks = setting("search.followSymlinks", bool, ~default=true); }; +module Window = { + // On Windows, default the titlebar style to native, due to various bugs around the custom-rendered window, like: + // #3730 - Keyboard shortcuts for window movement broken + // #3071 - Window has no shadow on Windows + // #3063 - Part of onivim fullscreen is visible on second monitor + let defaultTitleBarStyle = switch (Revery.Environment.os) { + | Windows(_) => `Native + | _ => `Custom + } + let titleBarStyle = setting("window.titleBarStyle", custom( + ~decode=Decoders.titleBarStyle, + ~encode=Encoders.titleBarStyle, + ), ~default=defaultTitleBarStyle) +} + module Workbench = { let activityBarVisible = setting("workbench.activityBar.visible", bool, ~default=true); @@ -319,6 +347,7 @@ let contributions = [ Editor.snippetSuggestions.spec, Files.exclude.spec, Explorer.autoReveal.spec, + Window.titleBarStyle.spec, Workbench.activityBarVisible.spec, Workbench.editorShowTabs.spec, Workbench.editorEnablePreview.spec, diff --git a/src/UI/Root.re b/src/UI/Root.re index 7ecb3682ec..c7800ee43c 100644 --- a/src/UI/Root.re +++ b/src/UI/Root.re @@ -34,7 +34,7 @@ module Styles = { alignItems(`Stretch), ]); if (Revery.Environment.isWindows && windowDisplayMode == State.Maximized) { - style := [margin(6), ...style^]; + style := [margin(0), ...style^]; }; style^; }; diff --git a/src/bin_editor/Oni2_editor.re b/src/bin_editor/Oni2_editor.re index dc561a64d7..0d83f48d9d 100644 --- a/src/bin_editor/Oni2_editor.re +++ b/src/bin_editor/Oni2_editor.re @@ -162,7 +162,7 @@ switch (eff) { |> Option.map(pos => `Absolute(pos)) |> Option.value(~default=`Centered); - let createWindow = (~forceScaleFactor, ~maybeWorkspace, app) => { + let createWindow = (~configurationLoader, ~forceScaleFactor, ~maybeWorkspace, app) => { let (x, y, width, height, maximized) = { Store.Persistence.Workspace.( maybeWorkspace @@ -204,12 +204,28 @@ switch (eff) { ) ); + let settings = Feature_Configuration.ConfigurationLoader.loadImmediate(configurationLoader) + |> Result.value(~default=Oni_Core.Config.Settings.empty); + + let initialResolver = (~vimSetting as _, settingKey) => { + Oni_Core.Config.({ + Settings.get(settingKey, settings) + |> Option.map(json => Json(json)) + |> Option.value(~default=NotSet) + }) + }; + + let useNativeMenu = Feature_Configuration.GlobalConfiguration.Window.titleBarStyle.get(initialResolver) == `Native; + let decorated = switch (Revery.Environment.os) { - | Windows(_) => false + | Windows(_) when useNativeMenu => true + | Windows(_) when !useNativeMenu => false | _ => true }; + let titlebarStyle = useNativeMenu ? Revery.WindowStyles.System: Revery.WindowStyles.Transparent; + let icon = switch (Revery.Environment.os) { | Mac(_) => @@ -229,7 +245,7 @@ switch (eff) { ~maximized, ~vsync=Vsync.Immediate, ~icon, - ~titlebarStyle=WindowStyles.Transparent, + ~titlebarStyle, ~x, ~y, ~width, @@ -280,9 +296,28 @@ switch (eff) { maybeWorkspace |> Option.map(FpExp.toString) |> Option.value(~default=initialWorkingDirectory); + + let configurationLoader = + Feature_Configuration.( + if (!cliOptions.shouldLoadConfiguration) { + ConfigurationLoader.none; + } else { + Oni_Core.Filesystem.getOrCreateConfigFile("configuration.json") + |> Result.map(ConfigurationLoader.file) + |> Oni_Core.Utility.ResultEx.tapError(msg => + Log.errorf(m => + m("Error initializing configuration file: %s", msg) + ) + ) + |> Result.value(~default=ConfigurationLoader.none); + } + ); + + let window = createWindow( + ~configurationLoader, ~forceScaleFactor=cliOptions.forceScaleFactor, ~maybeWorkspace, app, @@ -339,22 +374,6 @@ switch (eff) { ) |> Result.value(~default=Feature_Input.KeybindingsLoader.none); - let configurationLoader = - Feature_Configuration.( - if (!cliOptions.shouldLoadConfiguration) { - ConfigurationLoader.none; - } else { - Oni_Core.Filesystem.getOrCreateConfigFile("configuration.json") - |> Result.map(ConfigurationLoader.file) - |> Oni_Core.Utility.ResultEx.tapError(msg => - Log.errorf(m => - m("Error initializing configurationj file: %s", msg) - ) - ) - |> Result.value(~default=ConfigurationLoader.none); - } - ); - let currentState = ref( Model.State.initial( From a5051c37eb5caff89c70f0a275103c7a267d8374 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 14 Jul 2021 10:35:38 -0700 Subject: [PATCH 2/7] Add documentation for setting --- docs/docs/configuration/settings.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/docs/configuration/settings.md b/docs/docs/configuration/settings.md index 39e7dcaa6f..429788a50b 100644 --- a/docs/docs/configuration/settings.md +++ b/docs/docs/configuration/settings.md @@ -181,6 +181,8 @@ The configuration file, `configuration.json` is in the Oni2 directory, whose loc - `window.menuBarVisibility` __(_"visible" | "hidden"_ default: `"visible"`)__ - Controls the visibility of the menu bar. +- `window.titleBarStyle` __(_"native" | "custom"_ default: `"native"` on Windows, `"custom"` otherwise)__ - Controls whether the titlebar is custom-rendered. + - `oni.layout.showLayoutTabs` __(_"always"|"smart"|"never"_ default: `"smart"`)__ - Controls the display of layout tabs. `"smart"` will only show the tabs if there's more than one. - `oni.layout.layoutTabPosition` __(_"top"|"bottom"_ default: `"bottom"`)__ - Controls the position of the layout tabs. From 0db9f719588d9866229463e364aa646e2f5dafcf Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 14 Jul 2021 13:25:23 -0700 Subject: [PATCH 3/7] Add CHANGES entry --- CHANGES_CURRENT.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES_CURRENT.md b/CHANGES_CURRENT.md index f993808a44..7d70b33433 100644 --- a/CHANGES_CURRENT.md +++ b/CHANGES_CURRENT.md @@ -8,6 +8,10 @@ - #3718 - Completion: Add `editor.suggest.itemsToShow` setting (fixes #3712) - #3736 - Search: add default keys to go to next / previous search result (fixes #3713) - #3733 - Quick Open: Add bindings to open in splits, not current buffer. +- #3765 - UX: Add `"window.titleBarStyle"` configuration setting + +> __BREAKING:__ On Windows, the default setting is to use the `"native"` title bar. +> Set `"window.titleBarStyle": "custom"` to keep the previous behavior. ### Bug Fixes From 928a702995bea8e3fa3a043e8f4cf2b3c569bff6 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 14 Jul 2021 13:30:53 -0700 Subject: [PATCH 4/7] Fix windows margin --- .../Configuration/GlobalConfiguration.re | 45 ++++++++++--------- src/UI/Root.re | 14 ++++-- src/bin_editor/Oni2_editor.re | 36 +++++++++------ 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/src/Feature/Configuration/GlobalConfiguration.re b/src/Feature/Configuration/GlobalConfiguration.re index 6b7e172137..5b1a978462 100644 --- a/src/Feature/Configuration/GlobalConfiguration.re +++ b/src/Feature/Configuration/GlobalConfiguration.re @@ -47,14 +47,15 @@ module Decoders = { ), ]); - let titleBarStyle: decoder([ | `Native | `Custom ]) = string - |> map(String.lowercase_ascii) - |> map( - fun - | "native" => `Native - | "custom" => `Custom - | _ => `Custom - ); + let titleBarStyle: decoder([ | `Native | `Custom]) = + string + |> map(String.lowercase_ascii) + |> map( + fun + | "native" => `Native + | "custom" => `Custom + | _ => `Custom, + ); }; module Encoders = { @@ -67,9 +68,10 @@ module Encoders = { | `Inline => string("inline") }; - let titleBarStyle: encoder([ | `Native | `Custom ]) = fun - | `Native => string("native") - | `Custom => string("custom"); + let titleBarStyle: encoder([ | `Native | `Custom]) = + fun + | `Native => string("native") + | `Custom => string("custom"); }; module Codecs = { @@ -310,15 +312,18 @@ module Window = { // #3730 - Keyboard shortcuts for window movement broken // #3071 - Window has no shadow on Windows // #3063 - Part of onivim fullscreen is visible on second monitor - let defaultTitleBarStyle = switch (Revery.Environment.os) { - | Windows(_) => `Native - | _ => `Custom - } - let titleBarStyle = setting("window.titleBarStyle", custom( - ~decode=Decoders.titleBarStyle, - ~encode=Encoders.titleBarStyle, - ), ~default=defaultTitleBarStyle) -} + let defaultTitleBarStyle = + switch (Revery.Environment.os) { + | Windows(_) => `Native + | _ => `Custom + }; + let titleBarStyle = + setting( + "window.titleBarStyle", + custom(~decode=Decoders.titleBarStyle, ~encode=Encoders.titleBarStyle), + ~default=defaultTitleBarStyle, + ); +}; module Workbench = { let activityBarVisible = diff --git a/src/UI/Root.re b/src/UI/Root.re index c7800ee43c..09026fa11e 100644 --- a/src/UI/Root.re +++ b/src/UI/Root.re @@ -20,7 +20,7 @@ module Constants = { module Styles = { open Style; - let root = (theme, windowDisplayMode) => { + let root = (~nativeTitleBar, theme, windowDisplayMode) => { let style = ref([ backgroundColor(Colors.Editor.background.from(theme)), @@ -33,8 +33,10 @@ module Styles = { justifyContent(`Center), alignItems(`Stretch), ]); - if (Revery.Environment.isWindows && windowDisplayMode == State.Maximized) { - style := [margin(0), ...style^]; + if (Revery.Environment.isWindows + && windowDisplayMode == State.Maximized + && !nativeTitleBar) { + style := [margin(6), ...style^]; }; style^; }; @@ -252,7 +254,11 @@ let make = (~dispatch, ~state: State.t, ()) => { // Correct for zoom in title bar height let titlebarHeight = state.titlebarHeight /. zoom; - + let nativeTitleBar = + Feature_Configuration.GlobalConfiguration.Window.titleBarStyle.get(config) + == `Native; + + Option.map(pos => `Absolute(pos)) |> Option.value(~default=`Centered); - let createWindow = (~configurationLoader, ~forceScaleFactor, ~maybeWorkspace, app) => { + let createWindow = + (~configurationLoader, ~forceScaleFactor, ~maybeWorkspace, app) => { let (x, y, width, height, maximized) = { Store.Persistence.Workspace.( maybeWorkspace @@ -204,18 +205,27 @@ switch (eff) { ) ); - let settings = Feature_Configuration.ConfigurationLoader.loadImmediate(configurationLoader) - |> Result.value(~default=Oni_Core.Config.Settings.empty); + let settings = + Feature_Configuration.ConfigurationLoader.loadImmediate( + configurationLoader, + ) + |> Result.value(~default=Oni_Core.Config.Settings.empty); let initialResolver = (~vimSetting as _, settingKey) => { - Oni_Core.Config.({ - Settings.get(settingKey, settings) - |> Option.map(json => Json(json)) - |> Option.value(~default=NotSet) - }) + Oni_Core.Config.( + { + Settings.get(settingKey, settings) + |> Option.map(json => Json(json)) + |> Option.value(~default=NotSet); + } + ); }; - let useNativeMenu = Feature_Configuration.GlobalConfiguration.Window.titleBarStyle.get(initialResolver) == `Native; + let useNativeMenu = + Feature_Configuration.GlobalConfiguration.Window.titleBarStyle.get( + initialResolver, + ) + == `Native; let decorated = switch (Revery.Environment.os) { @@ -224,7 +234,9 @@ switch (eff) { | _ => true }; - let titlebarStyle = useNativeMenu ? Revery.WindowStyles.System: Revery.WindowStyles.Transparent; + let titlebarStyle = + useNativeMenu + ? Revery.WindowStyles.System : Revery.WindowStyles.Transparent; let icon = switch (Revery.Environment.os) { @@ -296,7 +308,7 @@ switch (eff) { maybeWorkspace |> Option.map(FpExp.toString) |> Option.value(~default=initialWorkingDirectory); - + let configurationLoader = Feature_Configuration.( if (!cliOptions.shouldLoadConfiguration) { @@ -313,8 +325,6 @@ switch (eff) { } ); - - let window = createWindow( ~configurationLoader, From 3fc35f1b3999899f9435bbfbd38ae943be3649bd Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 21 Jul 2021 13:36:51 -0700 Subject: [PATCH 5/7] Store titlebar value in Feature_Titlebar --- bench/lib/Helpers.re | 1 + .../lib/Oni_IntegrationTestLib.re | 1 + src/Feature/TitleBar/Feature_TitleBar.re | 23 +++++++++++++----- src/Feature/TitleBar/Feature_TitleBar.rei | 11 +++++++-- src/Model/State.re | 3 +++ src/Store/Features.re | 24 +++++++++++-------- src/bin_editor/Oni2_editor.re | 5 ++-- 7 files changed, 48 insertions(+), 20 deletions(-) diff --git a/bench/lib/Helpers.re b/bench/lib/Helpers.re index 68b46ffbbc..5a3a8c5634 100644 --- a/bench/lib/Helpers.re +++ b/bench/lib/Helpers.re @@ -39,6 +39,7 @@ let simpleState = { ~titlebarHeight=0., ~getZoom=() => 1.0, ~setZoom=_zoom => (), + ~useNativeTitleBar=true, ); Reducer.reduce( diff --git a/integration_test/lib/Oni_IntegrationTestLib.re b/integration_test/lib/Oni_IntegrationTestLib.re index 649015d4e7..5ed3fb19d6 100644 --- a/integration_test/lib/Oni_IntegrationTestLib.re +++ b/integration_test/lib/Oni_IntegrationTestLib.re @@ -190,6 +190,7 @@ let runTest = ~titlebarHeight=0., ~setZoom, ~getZoom, + ~useNativeTitleBar=true, ), ); diff --git a/src/Feature/TitleBar/Feature_TitleBar.re b/src/Feature/TitleBar/Feature_TitleBar.re index 051a1157d1..831aadd840 100644 --- a/src/Feature/TitleBar/Feature_TitleBar.re +++ b/src/Feature/TitleBar/Feature_TitleBar.re @@ -15,6 +15,17 @@ type msg = | WindowCloseClicked | TitleDoubleClicked; +type model = { + // We need to store this, as opposed to pulling it + // from config, because we need to respect the value + // used on initialization. + useNativeTitleBar: bool, +}; + +let isNative = ({useNativeTitleBar, _}) => useNativeTitleBar; + +let initial = (~useNativeTitleBar) => {useNativeTitleBar: useNativeTitleBar}; + module Log = (val Log.withNamespace("Oni2.Feature.TitleBar")); module Internal = { @@ -155,7 +166,7 @@ type outmsg = | Nothing | Effect(Isolinear.Effect.t(msg)); -let update = (~maximize, ~minimize, ~restore, ~close, msg) => { +let update = (~maximize, ~minimize, ~restore, ~close, msg, model) => { let internalDoubleClickEffect = Isolinear.Effect.create(~name="window.doubleClick", () => { switch (Internal.getTitleDoubleClickBehavior()) { @@ -174,11 +185,11 @@ let update = (~maximize, ~minimize, ~restore, ~close, msg) => { Isolinear.Effect.create(~name="window.restore", () => restore()); switch (msg) { - | TitleDoubleClicked => Effect(internalDoubleClickEffect) - | WindowCloseClicked => Effect(internalWindowCloseEffect) - | WindowMaximizeClicked => Effect(internalWindowMaximizeEffect) - | WindowRestoreClicked => Effect(internalWindowRestoreEffect) - | WindowMinimizeClicked => Effect(internalWindowMinimizeEffect) + | TitleDoubleClicked => (model, Effect(internalDoubleClickEffect)) + | WindowCloseClicked => (model, Effect(internalWindowCloseEffect)) + | WindowMaximizeClicked => (model, Effect(internalWindowMaximizeEffect)) + | WindowRestoreClicked => (model, Effect(internalWindowRestoreEffect)) + | WindowMinimizeClicked => (model, Effect(internalWindowMinimizeEffect)) }; }; diff --git a/src/Feature/TitleBar/Feature_TitleBar.rei b/src/Feature/TitleBar/Feature_TitleBar.rei index cc9cced964..29c411fa53 100644 --- a/src/Feature/TitleBar/Feature_TitleBar.rei +++ b/src/Feature/TitleBar/Feature_TitleBar.rei @@ -8,6 +8,12 @@ type windowDisplayMode = | Maximized | Fullscreen; +type model; + +let initial: (~useNativeTitleBar: bool) => model; + +let isNative: model => bool; + [@deriving show] type msg; @@ -32,9 +38,10 @@ let update: ~minimize: unit => unit, ~restore: unit => unit, ~close: unit => unit, - msg + msg, + model ) => - outmsg; + (model, outmsg); // VIEW diff --git a/src/Model/State.re b/src/Model/State.re index dd5815aba7..3d3769276c 100644 --- a/src/Model/State.re +++ b/src/Model/State.re @@ -493,6 +493,7 @@ type t = { modal: option(Feature_Modals.model), snippets: Feature_Snippets.model, textContentProviders: list((int, string)), + titleBar: Feature_TitleBar.model, vim: Feature_Vim.model, zoom: Feature_Zoom.model, autoUpdate: Feature_AutoUpdate.model, @@ -516,6 +517,7 @@ let initial = ~titlebarHeight, ~getZoom, ~setZoom, + ~useNativeTitleBar, ) => { let config = Feature_Configuration.initial( @@ -668,6 +670,7 @@ let initial = quickOpen: Feature_QuickOpen.initial, snippets: Feature_Snippets.initial, terminals: Feature_Terminal.initial, + titleBar: Feature_TitleBar.initial(~useNativeTitleBar), textContentProviders: [], vim: Feature_Vim.initial, zoom: Feature_Zoom.initial(~getZoom, ~setZoom), diff --git a/src/Store/Features.re b/src/Store/Features.re index 9f0c5442a4..53f1309106 100644 --- a/src/Store/Features.re +++ b/src/Store/Features.re @@ -2542,21 +2542,25 @@ let update = ); | TitleBar(titleBarMsg) => + let (titleBar', outmsg) = + Feature_TitleBar.update( + ~maximize, + ~minimize, + ~close, + ~restore, + titleBarMsg, + state.titleBar, + ); let eff = - switch ( - Feature_TitleBar.update( - ~maximize, - ~minimize, - ~close, - ~restore, - titleBarMsg, - ) - ) { + switch (outmsg) { | Feature_TitleBar.Effect(effect) => effect | Feature_TitleBar.Nothing => Isolinear.Effect.none }; - (state, eff |> Isolinear.Effect.map(msg => TitleBar(msg))); + ( + {...state, titleBar: titleBar'}, + eff |> Isolinear.Effect.map(msg => TitleBar(msg)), + ); | ExtensionBufferUpdateQueued({triggerKey}) => let maybeBuffer = Selectors.getActiveBuffer(state); diff --git a/src/bin_editor/Oni2_editor.re b/src/bin_editor/Oni2_editor.re index e659d8bf0b..71a580dc5d 100644 --- a/src/bin_editor/Oni2_editor.re +++ b/src/bin_editor/Oni2_editor.re @@ -272,7 +272,7 @@ switch (eff) { Window.setBackgroundColor(window, Colors.black); win := Some(window); - window; + (window, useNativeMenu); }; Log.infof(m => m( @@ -325,7 +325,7 @@ switch (eff) { } ); - let window = + let (window, useNativeMenu) = createWindow( ~configurationLoader, ~forceScaleFactor=cliOptions.forceScaleFactor, @@ -402,6 +402,7 @@ switch (eff) { ~titlebarHeight=Revery.Window.getTitlebarHeight(window), ~setZoom, ~getZoom, + ~useNativeTitleBar=useNativeMenu, ), ); From 5da5653aed77ed49a9f87c1940a6489064de5fa3 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 21 Jul 2021 13:50:21 -0700 Subject: [PATCH 6/7] Use isNative setting --- src/Feature/TitleBar/Feature_TitleBar.re | 2 ++ src/Feature/TitleBar/Feature_TitleBar.rei | 1 + src/UI/Root.re | 5 ++--- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Feature/TitleBar/Feature_TitleBar.re b/src/Feature/TitleBar/Feature_TitleBar.re index 831aadd840..bf578cc529 100644 --- a/src/Feature/TitleBar/Feature_TitleBar.re +++ b/src/Feature/TitleBar/Feature_TitleBar.re @@ -548,6 +548,7 @@ module View = { ~theme, ~font: UiFont.t, ~height, + ~model, (), ) => { let title = @@ -566,6 +567,7 @@ module View = { height majorVersion=major /> + | Windows(_) when isNative(model) => menuBar | Windows(_) => Revery.UI.element; diff --git a/src/UI/Root.re b/src/UI/Root.re index 09026fa11e..69b2030f98 100644 --- a/src/UI/Root.re +++ b/src/UI/Root.re @@ -254,9 +254,7 @@ let make = (~dispatch, ~state: State.t, ()) => { // Correct for zoom in title bar height let titlebarHeight = state.titlebarHeight /. zoom; - let nativeTitleBar = - Feature_Configuration.GlobalConfiguration.Window.titleBarStyle.get(config) - == `Native; + let nativeTitleBar = Feature_TitleBar.isNative(state.titleBar); { dispatch=titleDispatch registrationDispatch height=titlebarHeight + model={state.titleBar} /> From df19914fc268c17af78d1fc10aef4c36a87836e4 Mon Sep 17 00:00:00 2001 From: Bryan Phelps Date: Wed, 21 Jul 2021 13:55:24 -0700 Subject: [PATCH 7/7] Fix statusbar position with native menu on OSX --- src/Feature/TitleBar/Feature_TitleBar.re | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Feature/TitleBar/Feature_TitleBar.re b/src/Feature/TitleBar/Feature_TitleBar.re index bf578cc529..096768ec43 100644 --- a/src/Feature/TitleBar/Feature_TitleBar.re +++ b/src/Feature/TitleBar/Feature_TitleBar.re @@ -554,6 +554,7 @@ module View = { let title = title(~activeBuffer, ~workspaceRoot, ~workspaceDirectory, ~config); switch (Revery.Environment.os) { + | Mac(_) when isNative(model) => React.empty | Mac({major, _}) =>