feat: improve preference to show-apps-with-open-window (closes #4485)

This commit is contained in:
lwouis committed 2025-07-31 12:01:32 +02:00
1 parent f37652942d
commit 67f5098c95
11 files changed
+66 -56

No files matched your search

-8
View File
@@ -14,7 +14,6 @@
1C961111398A3C5361862E49 /* thumbnails_show_status_icons_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C961DA8E2A2EC560CD57DB3 /* thumbnails_show_status_icons_light@2x.jpg */; };
1C96111B8D813931DE26CB43 /* app_icons_show_running_applications_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C961F68C77AAE38E5A2E046 /* app_icons_show_running_applications_light@2x.jpg */; };
1C961184435D18C7DEBC7AD6 /* thumbnails_show_running_applications_windows_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C961139B16ADE6E0B8A33A6 /* thumbnails_show_running_applications_windows_light@2x.jpg */; };
1C96120EFA0571E70E83C36B /* app_icons_hide_windowless_apps_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C961389E736411009044AF9 /* app_icons_hide_windowless_apps_light@2x.jpg */; };
1C9612508530E03B81C1ECD7 /* thumbnails_hide_tabs_as_windows_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C96149CA86A8915BA0576D3 /* thumbnails_hide_tabs_as_windows_light@2x.jpg */; };
1C96126BFFEE8C257EE5CCB8 /* titles_hide_space_number_labels_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C9615FFB4138E542A2CB07F /* titles_hide_space_number_labels_light@2x.jpg */; };
1C9612ABBB15D3B78763BEB9 /* app_icons_hide_app_badges_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C961093FB75180759EC6972 /* app_icons_hide_app_badges_light@2x.jpg */; };
@@ -28,7 +27,6 @@
1C9614DC56AA02BA27707989 /* thumbnails_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C9612E7D08B9831F2A07ECE /* thumbnails_light@2x.jpg */; };
1C9614F589E212F9A768D936 /* titles_show_status_icons_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C9611039BDBE0C84F349BA1 /* titles_show_status_icons_light@2x.jpg */; };
1C96150A9E75C3D69638C481 /* app_icons_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C961359F2A8150F6020197A /* app_icons_light@2x.jpg */; };
1C9615D0A832BA53DC0D6628 /* thumbnails_show_windowless_apps_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C9615B6AF78072B8D78517B /* thumbnails_show_windowless_apps_light@2x.jpg */; };
1C9616BD426675F5E7FC1C97 /* thumbnails_hide_colored_circles_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C9618C8080211CBF882E4E0 /* thumbnails_hide_colored_circles_light@2x.jpg */; };
1C9617255736B51AD964C659 /* titles_show_preview_focused_window_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C961829BF43CE3D35FB6B90 /* titles_show_preview_focused_window_light@2x.jpg */; };
1C961742ED726F25F677772C /* thumbnails_show_running_windows_light@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 1C96153183B72B103867A9E3 /* thumbnails_show_running_windows_light@2x.jpg */; };
@@ -294,14 +292,12 @@
1C9612E7D08B9831F2A07ECE /* thumbnails_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "thumbnails_light@2x.jpg"; sourceTree = "<group>"; };
1C961334F059C39979BEDF19 /* app_icons_show_running_applications_windows_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "app_icons_show_running_applications_windows_light@2x.jpg"; sourceTree = "<group>"; };
1C961359F2A8150F6020197A /* app_icons_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "app_icons_light@2x.jpg"; sourceTree = "<group>"; };
1C961389E736411009044AF9 /* app_icons_hide_windowless_apps_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "app_icons_hide_windowless_apps_light@2x.jpg"; sourceTree = "<group>"; };
1C96142EB71D683D7237C7ED /* app_icons_show_preview_focused_window_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "app_icons_show_preview_focused_window_light@2x.jpg"; sourceTree = "<group>"; };
1C96145685B5DFCD24C58943 /* thumbnails_show_space_number_labels_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "thumbnails_show_space_number_labels_light@2x.jpg"; sourceTree = "<group>"; };
1C961484E5164C1BFF3B78FF /* thumbnails_show_running_applications_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "thumbnails_show_running_applications_light@2x.jpg"; sourceTree = "<group>"; };
1C96149CA86A8915BA0576D3 /* thumbnails_hide_tabs_as_windows_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "thumbnails_hide_tabs_as_windows_light@2x.jpg"; sourceTree = "<group>"; };
1C9614A489E5D3C0D885F71D /* titles_show_space_number_labels_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "titles_show_space_number_labels_light@2x.jpg"; sourceTree = "<group>"; };
1C96153183B72B103867A9E3 /* thumbnails_show_running_windows_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "thumbnails_show_running_windows_light@2x.jpg"; sourceTree = "<group>"; };
1C9615B6AF78072B8D78517B /* thumbnails_show_windowless_apps_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "thumbnails_show_windowless_apps_light@2x.jpg"; sourceTree = "<group>"; };
1C9615FFB4138E542A2CB07F /* titles_hide_space_number_labels_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "titles_hide_space_number_labels_light@2x.jpg"; sourceTree = "<group>"; };
1C96163C9FF348B1EB27DEE6 /* titles_show_tabs_as_windows_light@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "titles_show_tabs_as_windows_light@2x.jpg"; sourceTree = "<group>"; };
1C9616522F4E58860385E090 /* .swiftformat */ = {isa = PBXFileReference; lastKnownFileType = file.swiftformat; path = .swiftformat; sourceTree = "<group>"; };
@@ -711,7 +707,6 @@
1C961093FB75180759EC6972 /* app_icons_hide_app_badges_light@2x.jpg */,
1C961A9B3F8ABA1ECFDF7C9F /* app_icons_hide_preview_focused_window_light@2x.jpg */,
1C961CABD14356E109102D56 /* app_icons_hide_tabs_as_windows_light@2x.jpg */,
1C961389E736411009044AF9 /* app_icons_hide_windowless_apps_light@2x.jpg */,
1C961CA3D80A629DC753DDCC /* app_icons_show_app_badges_light@2x.jpg */,
1C96142EB71D683D7237C7ED /* app_icons_show_preview_focused_window_light@2x.jpg */,
1C961F68C77AAE38E5A2E046 /* app_icons_show_running_applications_light@2x.jpg */,
@@ -738,7 +733,6 @@
1C96145685B5DFCD24C58943 /* thumbnails_show_space_number_labels_light@2x.jpg */,
1C961DA8E2A2EC560CD57DB3 /* thumbnails_show_status_icons_light@2x.jpg */,
1C961F5740647DBFA0540789 /* thumbnails_show_tabs_as_windows_light@2x.jpg */,
1C9615B6AF78072B8D78517B /* thumbnails_show_windowless_apps_light@2x.jpg */,
1C961E051A3A4E4A174BB7C7 /* titles_hide_app_badges_light@2x.jpg */,
1C9616610337AE2361694C63 /* titles_hide_preview_focused_window_light@2x.jpg */,
1C9615FFB4138E542A2CB07F /* titles_hide_space_number_labels_light@2x.jpg */,
@@ -2130,7 +2124,6 @@
1C9612ABBB15D3B78763BEB9 /* app_icons_hide_app_badges_light@2x.jpg in Resources */,
1C961C3245C17EC408B798DE /* app_icons_hide_preview_focused_window_light@2x.jpg in Resources */,
1C96109FD155140CBA709A16 /* app_icons_hide_tabs_as_windows_light@2x.jpg in Resources */,
1C96120EFA0571E70E83C36B /* app_icons_hide_windowless_apps_light@2x.jpg in Resources */,
1C96198D01B0BADB1A7C6B28 /* app_icons_show_app_badges_light@2x.jpg in Resources */,
1C9619A205B40C23EB6E43E6 /* app_icons_show_preview_focused_window_light@2x.jpg in Resources */,
1C96111B8D813931DE26CB43 /* app_icons_show_running_applications_light@2x.jpg in Resources */,
@@ -2157,7 +2150,6 @@
1C96182DB77D780F714B53B1 /* thumbnails_show_space_number_labels_light@2x.jpg in Resources */,
1C961111398A3C5361862E49 /* thumbnails_show_status_icons_light@2x.jpg in Resources */,
1C9619467B05EDC1097EF587 /* thumbnails_show_tabs_as_windows_light@2x.jpg in Resources */,
1C9615D0A832BA53DC0D6628 /* thumbnails_show_windowless_apps_light@2x.jpg in Resources */,
1C9618DF753B19DB0A1255E4 /* titles_hide_app_badges_light@2x.jpg in Resources */,
1C9619E0F49EA38E7DFFAFFC /* titles_hide_preview_focused_window_light@2x.jpg in Resources */,
1C96126BFFEE8C257EE5CCB8 /* titles_hide_space_number_labels_light@2x.jpg in Resources */,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

+3 -3
View File
@@ -211,9 +211,6 @@
/* No comment provided by engineer. */
"Hide app badges" = "Hide app badges";
/* No comment provided by engineer. */
"Hide apps with no open window" = "Hide apps with no open window";
/* No comment provided by engineer. */
"Hide colored circles on mouse hover" = "Hide colored circles on mouse hover";
@@ -427,6 +424,9 @@
/* No comment provided by engineer. */
"Show an item in the switcher for each window, or for each application. Windows will be focused, whereas applications will be activated." = "Show an item in the switcher for each window, or for each application. Windows will be focused, whereas applications will be activated.";
/* No comment provided by engineer. */
"Show apps with no open window" = "Show apps with no open window";
/* No comment provided by engineer. */
"Show at the end" = "Show at the end";
+2 -4
View File
@@ -116,10 +116,8 @@ class Application: NSObject {
}
func addWindowlessWindowIfNeeded() -> Window? {
if !Preferences.hideWindowlessApps &&
runningApplication.activationPolicy == .regular &&
!runningApplication.isTerminated &&
(Windows.list.firstIndex { $0.application.pid == pid }) == nil {
if runningApplication.activationPolicy == .regular && !runningApplication.isTerminated
&& (Windows.list.firstIndex { $0.application.pid == pid }) == nil {
let window = Window(self)
Windows.appendAndUpdateFocus(window)
return window
+13
View File
@@ -343,6 +343,19 @@ enum ShowHowPreference: CaseIterable, MacroPreference {
}
}
// we can't reuse ShowHowPreference because the order of cases matters for serialization
enum ShowHowPreference2: CaseIterable, MacroPreference {
case showAtTheEnd
case hide
var localizedString: LocalizedString {
switch self {
case .showAtTheEnd: return NSLocalizedString("Show at the end", comment: "")
case .hide: return NSLocalizedString("Hide", comment: "")
}
}
}
enum WindowOrderPreference: CaseIterable, MacroPreference {
case recentlyFocused
case recentlyCreated
+5 -2
View File
@@ -36,6 +36,10 @@ class Preferences {
"showFullscreenWindows2": ShowHowPreference.show.indexAsString,
"showFullscreenWindows3": ShowHowPreference.show.indexAsString,
"showFullscreenWindows4": ShowHowPreference.show.indexAsString,
"showWindowlessApps": ShowHowPreference2.showAtTheEnd.indexAsString,
"showWindowlessApps2": ShowHowPreference2.showAtTheEnd.indexAsString,
"showWindowlessApps3": ShowHowPreference2.showAtTheEnd.indexAsString,
"showWindowlessApps4": ShowHowPreference2.showAtTheEnd.indexAsString,
"windowOrder": WindowOrderPreference.recentlyFocused.indexAsString,
"windowOrder2": WindowOrderPreference.recentlyFocused.indexAsString,
"windowOrder3": WindowOrderPreference.recentlyFocused.indexAsString,
@@ -81,7 +85,6 @@ class Preferences {
"shortcutStyle3": ShortcutStylePreference.focusOnRelease.indexAsString,
"shortcutStyle4": ShortcutStylePreference.focusOnRelease.indexAsString,
"hideAppBadges": "false",
"hideWindowlessApps": "false",
"hideThumbnails": "false",
"previewFocusedWindow": "false",
"screenRecordingPermissionSkipped": "false",
@@ -116,7 +119,6 @@ class Preferences {
static var hideSpaceNumberLabels: Bool { CachedUserDefaults.bool("hideSpaceNumberLabels") }
static var hideStatusIcons: Bool { CachedUserDefaults.bool("hideStatusIcons") }
static var hideAppBadges: Bool { CachedUserDefaults.bool("hideAppBadges") }
static var hideWindowlessApps: Bool { CachedUserDefaults.bool("hideWindowlessApps") }
// periphery:ignore
static var startAtLogin: Bool { CachedUserDefaults.bool("startAtLogin") }
static var blacklist: [BlacklistEntry] { CachedUserDefaults.json("blacklist", [BlacklistEntry].self) }
@@ -143,6 +145,7 @@ class Preferences {
static var showMinimizedWindows: [ShowHowPreference] { ["showMinimizedWindows", "showMinimizedWindows2", "showMinimizedWindows3", "showMinimizedWindows4"].map { CachedUserDefaults.macroPref($0, ShowHowPreference.allCases) } }
static var showHiddenWindows: [ShowHowPreference] { ["showHiddenWindows", "showHiddenWindows2", "showHiddenWindows3", "showHiddenWindows4"].map { CachedUserDefaults.macroPref($0, ShowHowPreference.allCases) } }
static var showFullscreenWindows: [ShowHowPreference] { ["showFullscreenWindows", "showFullscreenWindows2", "showFullscreenWindows3", "showFullscreenWindows4"].map { CachedUserDefaults.macroPref($0, ShowHowPreference.allCases) } }
static var showWindowlessApps: [ShowHowPreference2] { ["showWindowlessApps", "showWindowlessApps2", "showWindowlessApps3", "showWindowlessApps4"].map { CachedUserDefaults.macroPref($0, ShowHowPreference2.allCases) } }
static var windowOrder: [WindowOrderPreference] { ["windowOrder", "windowOrder2", "windowOrder3", "windowOrder4"].map { CachedUserDefaults.macroPref($0, WindowOrderPreference.allCases) } }
static var shortcutStyle: [ShortcutStylePreference] { ["shortcutStyle", "shortcutStyle2", "shortcutStyle3", "shortcutStyle4"].map { CachedUserDefaults.macroPref($0, ShortcutStylePreference.allCases) } }
static var menubarIcon: MenubarIconPreference { CachedUserDefaults.macroPref("menubarIcon", MenubarIconPreference.allCases) }
+39 -27
View File
@@ -20,33 +20,36 @@ class PreferencesMigrations {
private static func updateToNewPreferences(_ versionInPlist: String) {
// x.compare(y) is .orderedDescending if x > y
if versionInPlist.compare("7.13.1", options: .numeric) != .orderedDescending {
migrateGestures()
if versionInPlist.compare("7.8.0", options: .numeric) != .orderedDescending {
migrateMenubarIconWithNewShownToggle()
if versionInPlist.compare("7.0.0", options: .numeric) != .orderedDescending {
migratePreferencesIndexes()
if versionInPlist.compare("6.43.0", options: .numeric) != .orderedDescending {
migrateBlacklists()
if versionInPlist.compare("6.28.1", options: .numeric) != .orderedDescending {
migrateMinMaxWindowsWidthInRow()
if versionInPlist.compare("6.27.1", options: .numeric) != .orderedDescending {
// "Start at login" new implem doesn't use Login Items; we remove the entry from previous versions
(PreferencesMigrations.self as AvoidDeprecationWarnings.Type).migrateLoginItem()
if versionInPlist.compare("6.23.0", options: .numeric) != .orderedDescending {
// "Show windows from:" got the "Active Space" option removed
migrateShowWindowsFrom()
if versionInPlist.compare("6.18.1", options: .numeric) != .orderedDescending {
// nextWindowShortcut used to be able to have modifiers already present in holdShortcut; we remove these
migrateNextWindowShortcuts()
// dropdowns preferences used to store English text; now they store indexes
migrateDropdownsFromTextToIndexes()
// the "Hide menubar icon" checkbox was replaced with a dropdown of: icon1, icon2, hidden
migrateMenubarIconFromCheckboxToDropdown()
// "Show minimized/hidden/fullscreen windows" checkboxes were replaced with dropdowns
migrateShowWindowsCheckboxToDropdown()
// "Max size on screen" was split into max width and max height
migrateMaxSizeOnScreenToWidthAndHeight()
if versionInPlist.compare("7.25.0", options: .numeric) != .orderedDescending {
migrateHideWindowlessApps()
if versionInPlist.compare("7.13.1", options: .numeric) != .orderedDescending {
migrateGestures()
if versionInPlist.compare("7.8.0", options: .numeric) != .orderedDescending {
migrateMenubarIconWithNewShownToggle()
if versionInPlist.compare("7.0.0", options: .numeric) != .orderedDescending {
migratePreferencesIndexes()
if versionInPlist.compare("6.43.0", options: .numeric) != .orderedDescending {
migrateBlacklists()
if versionInPlist.compare("6.28.1", options: .numeric) != .orderedDescending {
migrateMinMaxWindowsWidthInRow()
if versionInPlist.compare("6.27.1", options: .numeric) != .orderedDescending {
// "Start at login" new implem doesn't use Login Items; we remove the entry from previous versions
(PreferencesMigrations.self as AvoidDeprecationWarnings.Type).migrateLoginItem()
if versionInPlist.compare("6.23.0", options: .numeric) != .orderedDescending {
// "Show windows from:" got the "Active Space" option removed
migrateShowWindowsFrom()
if versionInPlist.compare("6.18.1", options: .numeric) != .orderedDescending {
// nextWindowShortcut used to be able to have modifiers already present in holdShortcut; we remove these
migrateNextWindowShortcuts()
// dropdowns preferences used to store English text; now they store indexes
migrateDropdownsFromTextToIndexes()
// the "Hide menubar icon" checkbox was replaced with a dropdown of: icon1, icon2, hidden
migrateMenubarIconFromCheckboxToDropdown()
// "Show minimized/hidden/fullscreen windows" checkboxes were replaced with dropdowns
migrateShowWindowsCheckboxToDropdown()
// "Max size on screen" was split into max width and max height
migrateMaxSizeOnScreenToWidthAndHeight()
}
}
}
}
@@ -57,6 +60,15 @@ class PreferencesMigrations {
}
}
// we moved from global to per-shortcut
private static func migrateHideWindowlessApps() {
if let old = UserDefaults.standard.string(forKey: "hideWindowlessApps") {
for index in ["", "2", "3", "4"] {
UserDefaults.standard.set(old == "true" ? 1 : 0, forKey: "showWindowlessApps" + index)
}
}
}
// we split gestures from disabled, 3-finger, 4-finger to: disabled, 3-finger-horizontal, 3-finger-vertical, 4-finger-horizontal, 4-finger-vertical
// no need to map 0 -> 0 (disabled -> disabled)
// no need to map 1 -> 1 (3-finger -> 3-finger-horizontal)
+1 -1
View File
@@ -366,7 +366,7 @@ class Windows {
} ?? false) &&
!(Preferences.appsToShow[App.app.shortcutIndex] == .active && window.application.pid != NSWorkspace.shared.frontmostApplication?.processIdentifier) &&
!(!(Preferences.showHiddenWindows[App.app.shortcutIndex] != .hide) && window.isHidden) &&
((!Preferences.hideWindowlessApps && window.isWindowlessApp) ||
((Preferences.showWindowlessApps[App.app.shortcutIndex] != .hide && window.isWindowlessApp) ||
!window.isWindowlessApp &&
!(!(Preferences.showFullscreenWindows[App.app.shortcutIndex] != .hide) && window.isFullscreen) &&
!(!(Preferences.showMinimizedWindows[App.app.shortcutIndex] != .hide) && window.isMinimized) &&
@@ -187,16 +187,6 @@ class ShowHideIllustratedView {
self.onCheckboxClicked(sender: sender, rowId: hideColoredCircles.rowId)
}))
showHideRows.append(hideColoredCircles)
var hideWindowlessApps = ShowHideRowInfo()
hideWindowlessApps.rowId = "hideWindowlessApps"
hideWindowlessApps.uncheckedImage = "show_windowless_apps"
hideWindowlessApps.checkedImage = "hide_windowless_apps"
hideWindowlessApps.supportedStyles = [.thumbnails, .appIcons, .titles]
hideWindowlessApps.leftViews = [TableGroupView.makeText(NSLocalizedString("Hide apps with no open window", comment: ""))]
hideWindowlessApps.rightViews.append(LabelAndControl.makeSwitch(hideWindowlessApps.rowId, extraAction: { sender in
self.onCheckboxClicked(sender: sender, rowId: hideWindowlessApps.rowId)
}))
showHideRows.append(hideWindowlessApps)
let featureUnavailable = NSLocalizedString("AltTab is currently set to show Applications. This setting is only available when AltTab is set to show Windows.", comment: "")
var showTabsAsWindows = ShowHideRowInfo()
showTabsAsWindows.rowId = "showTabsAsWindows"
@@ -104,7 +104,8 @@ class ControlsTab {
let screensToShow = LabelAndControl.makeDropdown(Preferences.indexToName("screensToShow", index), ScreensToShowPreference.allCases)
let showMinimizedWindows = LabelAndControl.makeDropdown(Preferences.indexToName("showMinimizedWindows", index), ShowHowPreference.allCases)
let showHiddenWindows = LabelAndControl.makeDropdown(Preferences.indexToName("showHiddenWindows", index), ShowHowPreference.allCases)
let showFullscreenWindows = LabelAndControl.makeDropdown(Preferences.indexToName("showFullscreenWindows", index), ShowHowPreference.allCases.filter { $0 != .showAtTheEnd })
let showFullscreenWindows = LabelAndControl.makeDropdown(Preferences.indexToName("showFullscreenWindows", index), ShowHowPreference.allCases.filter { $0 != .showAtTheEnd }) // this filter is ok for serialization because the filtered value is last in the enum
let showWindowlessApps = LabelAndControl.makeDropdown(Preferences.indexToName("showWindowlessApps", index), ShowHowPreference2.allCases)
let windowOrder = LabelAndControl.makeDropdown(Preferences.indexToName("windowOrder", index), WindowOrderPreference.allCases)
let shortcutStyle = LabelAndControl.makeDropdown(Preferences.indexToName("shortcutStyle", index), ShortcutStylePreference.allCases)
let table = TableGroupView(width: PreferencesWindow.width)
@@ -117,6 +118,7 @@ class ControlsTab {
table.addRow(TableGroupView.Row(leftTitle: NSLocalizedString("Show minimized windows", comment: ""), rightViews: [showMinimizedWindows]))
table.addRow(TableGroupView.Row(leftTitle: NSLocalizedString("Show hidden windows", comment: ""), rightViews: [showHiddenWindows]))
table.addRow(TableGroupView.Row(leftTitle: NSLocalizedString("Show fullscreen windows", comment: ""), rightViews: [showFullscreenWindows]))
table.addRow(TableGroupView.Row(leftTitle: NSLocalizedString("Show apps with no open window", comment: ""), rightViews: [showWindowlessApps]))
table.addRow(TableGroupView.Row(leftTitle: NSLocalizedString("Order windows by", comment: ""), rightViews: [windowOrder]))
table.fit()
return table